|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 $ o* ]2 ~5 x9 n& I- o }
7 b! P+ F( G2 p- R: j+ y本次IRQ研究了如下:
: b, ?; {5 |$ _4 i1 o: |VRC2&4(Mapper21,23,25)
8 l. C' q9 o; n3 `5 D+ r. {, CVRC3(Mapper73): z5 W2 ^! H; z# z2 g: v+ x& R
VRC6(Mapper24 & Mapper26)
0 w& i5 Y! K# T8 ^VRC7(Mapper85)7 @2 p/ R; c! b& |" }/ y, S
MMC3(Mapper4)
( X6 G+ ^$ p( QMMC4(Mapper10)
, h9 L5 k& q ^+ X r: IMMC5(Mapper5)5 s- c! o6 ~; z* N7 [( R+ L
Mapper180 S+ x* y$ b+ u& V, e( X3 |% v
Mapper64
% t, q" ]9 x8 A0 K( H: ]Namco163(Mapper19)- k h, a( X# q* e; r2 m# A
Sunsoft FME-7(Mapper69)3 }# ]% L( |; [! N( f0 R
/ g+ `! ?6 ~- i- |' Y共计11种Mapper的IRQ操作使用例子
" L ]$ ~7 s% ? F X1 z% S) Q代码内有详细注释, 希望能帮助到感兴趣的人.
; y2 w% x$ ], h; m4 Q6 ? M8 N ]
  ' n& b( A9 X5 K& n
2 _, o) {" }' Z5 Z; |4 t& }, M
Mapper代码主要逻辑(以MMC3为例):
/ u/ N e7 K' x; d: q- , _2 f1 \ K3 O8 d8 i& W
- ;==================================================
4 c$ h L W, g/ p - ;Mapper号" S5 ~7 P/ N& Z
- MAPPER_NUMBER = 04. b/ ~ @2 _# u+ e$ w, k6 s
- ;==================================================
, \$ y1 I% {7 {% `8 b7 @4 H - ;MMC3 (Mapper 4) 寄存器常量
5 d' a& G) [ i4 H9 J; j) ^ - MAPPER_REG_BANK_CTRL = $8000
- _& F, `: G& K - MAPPER_REG_BANK_DATA = $8001
4 L8 o4 a+ `! R; @1 ~ - MAPPER_REG_MIRRORING = $A000% p* P/ w# M4 v3 B3 H
- MAPPER_REG_PRG_RAM_PROTECT = $A001 [$ ^5 X. P/ g7 c& S' H6 P- z/ y
- MAPPER_REG_IRQ_LATCH = $C000
8 w1 i- i" O4 v9 r$ M - MAPPER_REG_IRQ_RELOAD = $C001
. f. Z& y8 O; r+ H - MAPPER_REG_IRQ_DISABLE = $E0004 |( H* I5 E7 V5 ]( D: x: }0 W) Z
- MAPPER_REG_IRQ_ENABLE = $E001
. g- |8 o+ @- G - ;==================================================
& v8 @' Z8 D$ M3 y - IRQ_SCANLINE_BEGIN = 135
7 o5 F% z' E2 s3 T: y" I - IRQ_SCANLINE_1 = 8
1 Y$ Z& v6 y" n0 `# y l% c/ q - IRQ_SCANLINE_2 = 54) j. H6 ]5 O6 C- z9 c
- IRQ_SCANLINE_3 = 8$ r! w" w f- K: v* p
- ;==================================================
- j/ z" i# U( D6 x - + ~ I+ V8 l7 f% z( W# p& _2 b
- ;====================================================================================================5 G8 A3 i$ y# U9 L' ]# {
- ;宏常量1 {% [- G7 c; ~% B' M( j8 a
- ;====================================================================================================7 `$ {1 Y0 A: h* b/ o8 C
- 0 r' }% T& }+ c( z* p9 |
- ;====================================================================================================. i/ |* P5 R: Z3 s4 a$ K
- MACRO_MAPPER_INIT .MACRO$ r( u, [5 a- `* ^2 u4 A4 h
- ;禁用IRQ7 f/ _3 o: Y/ p" S9 i q: J' V
- STA MAPPER_REG_IRQ_DISABLE
) K% F( d5 m, G! @1 s8 P -
$ T$ ?0 c0 t: l, j% r/ @( S8 ` - ;水平镜像- h3 l4 o: I* I# I3 {: P
- LDA #$01
\ P0 g6 a: F+ O- A1 l9 Z- u - STA MAPPER_REG_MIRRORING6 g3 B) R0 w* Q# E9 [- G% H
- % e" `' e9 Z# H1 Y' F! m1 @* k/ H& L; T
- ;初始化图形bank
@% C+ F9 r% y6 S- |( l - LDX #$05
- e9 [/ l& t* |, j8 G" F3 k - .Init_Chr_Bank
( g* {! o6 p5 I - STX MAPPER_REG_BANK_CTRL
8 A" @0 @3 s; q9 j: T2 U" N7 F* T5 U8 C - LDA .ChrBankData,X3 L* N- S' i) n+ H$ f- n
- STA MAPPER_REG_BANK_DATA- t j- x6 v1 H% M
- DEX
* ~$ C ?' ?& V+ V8 F - BPL .Init_Chr_Bank7 h4 [. {: v/ n" R" M
- JMP .Init_Chr_Bank_End
. d, u% r4 H! R, e! Y4 F - .ChrBankData
0 d9 q# V2 O0 f T+ a - .DB $00,$02,$04,$05,$06,$070 D5 P) m" ~; v2 l
- .Init_Chr_Bank_End2 @6 s0 v' R6 g6 k( m; C, L
- 1 e7 ?7 r% x3 [, u6 \
- ;启用SRAM# v6 w& |; _; V) h8 j" A5 v
- LDA #$80. r2 j, x4 D p9 H( N. ~ [& L8 ~
- STA MAPPER_REG_PRG_RAM_PROTECT' F* V0 C( D9 |# ?) A
- .ENDM* I0 e8 C3 @2 b% _, i1 O& @
- 8 n9 P* v# {5 _$ a! e
- ;====================================================================================================( H, e$ Q1 M0 W$ G; _9 o" Y) W' Q- S
- MACRO_MAPPER_SOUND_CLEAR .MACRO, x$ }5 s1 ^" n* \5 b. W; O" Z
- .ENDM
% y- ]7 q ^7 p* J* M - J$ ?1 \/ m, M: H7 R. V6 B
- ;====================================================================================================
$ a; \/ t1 X, k" x: o - MACRO_SRAM_ENABLE .MACRO
5 @; z" I, O4 p" b! P- m* T - LDA #$80
/ L0 C3 n4 h4 R$ O i; T. O# h0 b - STA MAPPER_REG_PRG_RAM_PROTECT
& o3 G4 k% M5 Y - .ENDM, u1 k& d- l/ k8 V
- 9 ~% J& x: t7 O5 ^3 ?, d v
- ;====================================================================================================
' [3 K7 _0 C( Z- `& A( o$ r0 j- \) T - MACRO_SWITCH_BANK_8000_A .MACRO7 B& O' q' s0 N! b& Z: Y* ~
- PHA9 [/ S: w- c7 k. J$ X4 {+ D( R
- LDA #$067 F; b4 B8 D7 A( B
- STA MAPPER_REG_BANK_CTRL- r- g/ m$ k# x) m% r1 C
- PLA) N% _6 X2 N6 }( U$ g5 q
- STA MAPPER_REG_BANK_DATA
) `/ q/ C: a% c9 \ - .ENDM
3 V& ^- ~- F, a# j - , \9 U$ L9 `% L, r
- MACRO_SWITCH_BANK_A000_A .MACRO
+ }6 J2 X r& @/ k - PHA* y1 f Z0 h+ o3 w; ^9 S
- LDA #$07
+ {0 R3 d* x( I - STA MAPPER_REG_BANK_CTRL; |( X2 ?2 b8 Z) V0 v& s9 q' F' z
- PLA
' T' g- g, V% ]" Y9 H. h0 N - STA MAPPER_REG_BANK_DATA3 p$ o1 D# [5 T5 X* |
- .ENDM: C8 Q0 L5 v; e1 Q9 f# `
-
. b x" R# r* u2 Y. o - MACRO_SWITCH_BANK_C000_A .MACRO B% @: u I6 z+ J T
- .ENDM7 @6 X, c- u& v
$ `8 Q( A# f3 ]' [4 b* w- MACRO_SWITCH_BANK_E000_A .MACRO
+ k4 Q8 s2 B- u, [- X - .ENDM
" c# R2 f: K* C( U2 `4 L, E; n2 R. m
3 G6 ^( P8 B% s- S: H- F& N! g7 V& b- ;====================================================================================================/ |3 H/ \: ?9 s, x0 T. H& A" I
- MACRO_TRIGGER_FIRST_IRQ .MACRO
/ |2 Y0 P7 K7 |* k9 A - LDA #IRQ_SCANLINE_BEGIN + 1' V( l6 U" l J! r2 }
- STA MAPPER_REG_IRQ_LATCH
% P7 L/ q4 @, \ - STA MAPPER_REG_IRQ_RELOAD6 Z" K" \; ~- G$ J8 Q" d
- STA MAPPER_REG_IRQ_ENABLE
! l& m2 x/ @7 @7 K& h: Y: z: B - CLI# H D9 @8 P# _: g1 y/ o
- .ENDM7 @- i/ i+ r6 R
- ! U/ o. L6 U/ W' K' W9 d$ O
- ;====================================================================================================+ Y# |$ G5 ?4 e+ R2 j3 f- s
- MACRO_ENABLE_IRQ .MACRO6 f8 Z* T# E1 c& v$ a
- STA MAPPER_REG_IRQ_ENABLE
2 B. I, M0 u5 b) j - .ENDM
" Y1 Q6 l' p2 C' j$ h -
- h0 |6 ]/ u5 P, o: Y0 n P' Z* { - ;====================================================================================================1 ^/ I' d7 n2 U5 Y+ F2 p/ v& c
- MACRO_DISABLE_IRQ .MACRO- I3 L! _, R. L% L& ^$ w4 @
- LDA #$00$ d5 i& N* x4 `0 J# j+ Q7 O0 [: T
- STA MAPPER_REG_IRQ_CTRL+ L8 m% e$ U3 z# C
- STA MAPPER_REG_IRQ_ACK
; L' v. b% l7 b6 O7 E4 X5 V - .ENDM- E: t" c- O9 }# D
- # w" u, P( u' I$ w/ c# j
- ;====================================================================================================8 X0 a% |+ Q) j! X
- MACRO_ACK_IRQ .MACRO1 M( F+ I. N# j6 x
- STA MAPPER_REG_IRQ_DISABLE
! y0 e$ Q" a; ^ - STA MAPPER_REG_IRQ_ENABLE+ z! M/ b; h) f5 _& ^( W9 M& ~
- .ENDM% K2 ^# z; n. C
- & p' x1 x y4 v" {
- ;====================================================================================================
+ z* N$ \8 M, N. b/ }6 U" v' F& } - MACRO_IRQ_OPERATE .MACRO
7 Y. i) }2 b$ n& B" {' P T
+ h7 k: f7 Y7 ?. u4 Z- ;==================================================: n& j8 t% o. Q! P5 q- X% L
- ;IRQ滚动模式常量
| M3 u4 c& ^- ?) S - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动: K( W; L6 H* W' n( z. U, p5 ?( U
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
+ m4 ~; e) E& q - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动" ?1 ~! M# m. ~$ C- h# G5 L9 V# I
8 S) H3 ~( e8 c: Y& I- H3 v- ;IRQ扫描线数据+ w1 L2 Q/ B# Y+ R/ I C
- IRQ_Scanline_Data
. V; C4 K% | k3 F6 C - .DB IRQ_SCANLINE_1, ~! s2 a: I: J4 @6 {! ~
- .DB IRQ_SCANLINE_2
5 m0 R H; \ B ^ A2 ?4 t - .DB IRQ_SCANLINE_37 D) Y$ ^! i) [' Z# H/ o
- .DW 00 ;关闭IRQ3 y- w: Z5 Z( W, U) h; O6 E1 S
- 7 K+ T3 }6 Q8 A7 \$ O4 r, b
- ;IRQ滚动控制模式* e8 v' @" f/ m; @( v5 I
- IRQ_Scanline_Mode7 Q2 G3 n7 T+ v- A- E2 P2 C* t
- .DB IRQ_SCROLL_MODE_RIGHT% Y" f# z" }8 z4 M ]9 d& e- t3 l
- .DB IRQ_SCROLL_MODE_LEFT
3 y9 M) @6 R4 C s - .DB IRQ_SCROLL_MODE_RIGHT
. C% ^% @8 y: _9 d - .DB IRQ_SCROLL_MODE_LEFT
+ o0 M0 K8 q! H* D( y5 [& g
9 E9 m* b" y4 Y0 e3 K: \! R7 ]- ;==================================================: D6 Z# N$ D2 W2 m- l' {
- ;;IRQ滚动控制
* |# s$ }3 p q4 \ - IRQ_Set_Scroll' ]+ ^% e: L- _$ N! c. a n/ I; ]
- LDX IRQ_Process_Index, Z! S$ P3 m5 q; q+ d
- LDA IRQ_Scanline_Mode,X; u8 |# K$ T5 L/ V' A; J3 F' s
- CMP #IRQ_SCROLL_MODE_LEFT
0 Z6 B+ J* O6 F5 S - BEQ IRQ_Set_Scroll_Left& r3 W+ \4 E( u; h; w8 v
- CMP #IRQ_SCROLL_MODE_RIGHT$ r7 }/ F! h, [! N: K7 g
- BEQ IRQ_Set_Scroll_Right
# q0 G( D9 y, C n5 j! y0 g" G - IRQ_Set_Scroll_Zero;不滚动
) W+ ?" y$ `+ ?' E" L4 U - LDA #$000 Y+ S' N' j3 n+ L+ y
- STA PPU_SCROLL
" t1 F' ^) G( v' A! T/ Z - STA PPU_SCROLL
& @) w1 X }2 S$ @8 Q: |4 l - RTS# `' _( k/ v7 J. k6 @
- IRQ_Set_Scroll_Left;向左滚动( S" n( K0 q$ O6 _! f" y
- LDA Scroll_H" \" A# d% {) o4 r
- STA PPU_SCROLL
7 e. ]0 Q: B: h- N% R - STA PPU_SCROLL& ?# W5 d& T& t2 `0 m
- RTS
: ^; R" c& R& m6 y. G: ~ - IRQ_Set_Scroll_Right;向右滚动9 C, [: b2 o0 C [" B& K
- LDA #$00/ n: X* m6 O9 N' a2 q
- SEC
$ G( T! _7 ^9 S/ v - SBC Scroll_H
; n. w; a* E. n9 w/ |) Y - STA PPU_SCROLL
9 I) t+ s9 B) e- x; T* b& T$ ` - STA PPU_SCROLL0 X$ u! g; ~" o% I8 Y
- RTS T: O% n, O% G6 d4 {+ k
-
* |" [1 |& q' W2 u4 f" X: G - ;==================================================
/ L$ y4 U B/ R! E - ;;IRQ滚动控制: ^6 |. q0 D% ~) A( j6 G4 l/ I, N. ]( S
- IRQ_Set_Ctrl
! T9 u* s( i' A8 T. Y. E - LDX IRQ_Process_Index8 T* S3 }% `0 R1 F, J) Y
- LDA IRQ_Scanline_Data,X
6 V/ H/ n" n2 Q. i' } - BNE IRQ_Process_Latch
9 b( `- R6 b% U% v( b - IRQ_Process_Disable;禁用IRQ
$ k! N7 }( a8 K2 e1 P( A% C8 ] - STA MAPPER_REG_IRQ_DISABLE
% j% ~5 K" J# m: Y+ w4 K - STA IRQ_Process_Index1 R; Y, w, B+ u$ ~' i/ l( G
- RTS
# h& z" j. S. E$ |( [+ z0 t - IRQ_Process_Latch;设置下次 IRQ 触发扫描线7 R) a$ n: v) Y1 D: g
- STA MAPPER_REG_IRQ_LATCH( u0 P3 p; `3 E* B$ O
- INC IRQ_Process_Index
, v& ]5 Q! M$ N* @- K4 I( K: ^ - RTS
. l9 \4 i2 _2 z4 l - & {( k7 |" ~8 c
- ;==================================================
B/ M) m4 _+ ?) n - ;IRQ处理; G# K+ k+ g8 c& _6 T
- IRQ_Process_By_Index
( r" [7 d4 i. p! ~; V5 [ - JSR IRQ_Set_Scroll ?8 t" x' Q1 \3 a# V
- JSR IRQ_Set_Ctrl
' {0 S# K3 g7 l5 R* P - IRQ_Process_End% j. k$ w, b c; L1 `3 O6 r
- RTS
3 ~, k/ D3 [! [ -
; k2 f+ B, r( V1 d4 z; x. N* d' z - .ENDM
. Z& a, X8 J5 ~2 b+ q: T+ v0 A - ( t% [( Z+ E! H. O" E& j. C$ [
复制代码
* {3 K+ ~0 s) R. X8 [
- z6 e9 N( N# \代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|