|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
" R7 h3 F4 ?$ s$ e$ y
& K$ ^. v6 R! d8 S& U4 k! H本次IRQ研究了如下:
0 g+ X5 L& p) wVRC2&4(Mapper21,23,25)# F/ h- r* G4 u9 t
VRC3(Mapper73); B9 K" r4 g5 F2 b
VRC6(Mapper24 & Mapper26)
5 A: m& Z" ~# d9 V+ jVRC7(Mapper85)
7 o. O+ F' t- o2 T F9 E1 O' GMMC3(Mapper4)2 {$ _# N5 c7 C5 L7 s# ^: M1 ?$ i/ a
MMC4(Mapper10)
/ X1 x" X- L/ p2 d2 B$ XMMC5(Mapper5) w4 g {4 P2 n. g, ]& \5 f$ j
Mapper18- a* k# H% f. P: }' Y
Mapper645 f" Z, S3 J7 }. u& j! I& B+ }
Namco163(Mapper19)% V; L5 g8 O% y0 F: V& S4 o
Sunsoft FME-7(Mapper69)
& s" k* [- ^) S q }+ b" x8 v. y$ k6 y: A( o! ?( G- W6 h) S. Y/ G1 B
共计11种Mapper的IRQ操作使用例子- L4 h6 J7 I- r1 @4 V7 i `3 \
代码内有详细注释, 希望能帮助到感兴趣的人.! A+ P. ~* Q) `' }% l3 \
1 E Z9 R. j' ^7 B" t; R5 g  0 U0 c, o1 l9 p. T" M9 b: h
& M3 ?4 `2 r* U/ U! u
Mapper代码主要逻辑(以MMC3为例):) p/ J1 K# n9 h( h
- % m0 z$ U) Y, \, [9 P
- ;==================================================
1 b. p* {$ Y* i - ;Mapper号2 L8 s* H+ n3 l; t+ M
- MAPPER_NUMBER = 04
0 K/ G k- F1 E) m - ;==================================================/ \7 f8 F, A/ f' X& }( K
- ;MMC3 (Mapper 4) 寄存器常量2 b: K; w) X- R
- MAPPER_REG_BANK_CTRL = $8000: E- s2 P6 Q, g: T! h; p k
- MAPPER_REG_BANK_DATA = $8001
, @" r* X3 L" I: R& ?4 L - MAPPER_REG_MIRRORING = $A000
4 I( T/ b* W! |- }* y0 c - MAPPER_REG_PRG_RAM_PROTECT = $A001; T; y$ _2 Y3 B/ w
- MAPPER_REG_IRQ_LATCH = $C000
, F2 \( `1 a* s7 A0 W( K - MAPPER_REG_IRQ_RELOAD = $C001
/ |+ `1 ^7 i! |) W0 v" E - MAPPER_REG_IRQ_DISABLE = $E000; O9 D" \9 |" o0 @9 e1 @/ O
- MAPPER_REG_IRQ_ENABLE = $E001- L# K) y% r. _, ~0 d) w' {' B3 e
- ;==================================================
) {6 n i7 |; ?3 L) a" ] - IRQ_SCANLINE_BEGIN = 135
# L. ?8 z2 A' v# H5 I# W. O" K - IRQ_SCANLINE_1 = 8
. ~3 {$ [1 f% \9 s$ _ - IRQ_SCANLINE_2 = 54# r2 ~4 k4 I( t9 E
- IRQ_SCANLINE_3 = 8
7 y9 u' ]4 o/ m - ;==================================================
& n* m5 O, j; e* a& R& [
4 @6 h$ Y5 L- n( q( [0 n9 X- ;====================================================================================================* A0 K9 B; D. ^
- ;宏常量
- i; i8 s% I) D - ;==================================================================================================== X! }, `8 V1 c! X! V4 E% i# I
- ! v; [5 H) P+ H' x4 n2 A6 w( M7 `$ [" P
- ;====================================================================================================
! A* ~' @# s+ d7 X0 B3 S' N( g - MACRO_MAPPER_INIT .MACRO
- t0 s! u5 |5 u% ~5 S9 n) D- g; l - ;禁用IRQ) L7 q3 y( C/ N: @! r
- STA MAPPER_REG_IRQ_DISABLE7 R- O: M# ^/ j0 K [+ u
- 1 k, p7 }. c. I: t$ b5 p5 }1 T# o
- ;水平镜像6 q/ J* p: t& z
- LDA #$01) m& K0 r7 h* V
- STA MAPPER_REG_MIRRORING
: e& Q5 d0 J4 z! U L - / @! \8 R2 s6 _, W( z* ~
- ;初始化图形bank
0 q: @. L2 q' U/ Z - LDX #$05
4 p1 f- d6 a. Z9 N0 f& C - .Init_Chr_Bank! w& y( g& U. e
- STX MAPPER_REG_BANK_CTRL/ [, o( R' [- F- T, A( y Y
- LDA .ChrBankData,X i% f: n3 c) {4 B; `# X
- STA MAPPER_REG_BANK_DATA2 V$ I p8 Y: q7 W8 x
- DEX
; ^% e# M& a+ h- E1 ~4 v: x4 K - BPL .Init_Chr_Bank4 `, M3 ^9 T2 {, y Y" p# Q
- JMP .Init_Chr_Bank_End+ H- l( q0 t# {8 J5 Z
- .ChrBankData
+ z/ J5 |/ F, ^4 L* U - .DB $00,$02,$04,$05,$06,$07$ ^& S. h [7 j' n' p9 J
- .Init_Chr_Bank_End: J: f3 Z' m: Z9 ^) P3 Q0 u
- " }# v: r- i, o1 }
- ;启用SRAM
4 D5 d# j9 e2 r/ C# G! V5 ?/ l - LDA #$80
2 {3 w* z; d& _ - STA MAPPER_REG_PRG_RAM_PROTECT
. B2 H8 L7 N7 N$ t M - .ENDM
4 f+ y. }2 h0 W
* @% S! ?+ B$ O& I9 g/ h- ;====================================================================================================
6 y! C6 F7 j: \' L+ `& z$ |" a$ C - MACRO_MAPPER_SOUND_CLEAR .MACRO
, J: O! z4 l' j- }' \0 F - .ENDM
% l$ r) g' J1 w& ?+ T -
1 ^# L6 c3 D- J" ^& ?9 y4 W/ h - ;====================================================================================================
4 o, S# M' I8 `/ { j, { - MACRO_SRAM_ENABLE .MACRO& F! B, R, R! G U5 N
- LDA #$80
! ?# h4 a0 L% v; |: a! ~- O - STA MAPPER_REG_PRG_RAM_PROTECT
6 i5 o& o# ]- Z9 V! Z, w) B - .ENDM
/ g: E" y+ ^) h- s. L% i/ m - . M! U7 s4 s2 s, m/ ~$ R
- ;====================================================================================================. F s+ d& r! w- l1 U8 L
- MACRO_SWITCH_BANK_8000_A .MACRO
8 `9 m2 H, L& X - PHA
; T* c S. b% Q, {& Z - LDA #$06
; G* O+ @4 |/ Q% c* J& p* A3 a: L# c$ F - STA MAPPER_REG_BANK_CTRL5 a# r6 S2 v. r W9 R6 h* ~
- PLA* {+ {4 [8 S9 N. A1 H
- STA MAPPER_REG_BANK_DATA
) v# r; S5 i h# ]+ ^4 I - .ENDM
/ t7 \. T8 E& [( A8 [/ _ - 7 i* N! }3 |2 j z* R( z
- MACRO_SWITCH_BANK_A000_A .MACRO
+ G3 L2 H3 N9 s7 J$ [/ F - PHA
6 ^8 E4 U6 K% u! p9 E - LDA #$07
& S! W: o8 p D5 Z3 K" M2 I - STA MAPPER_REG_BANK_CTRL
$ H& w% k6 p# j2 h# c% a - PLA
: s4 Y/ K' _ J8 k. g - STA MAPPER_REG_BANK_DATA
. t2 s" p& d7 Y3 S1 Y* O8 t2 Y - .ENDM1 e+ D5 W+ T$ H& ?- z8 {. f8 ~
-
8 i- A) {4 \5 S" @ - MACRO_SWITCH_BANK_C000_A .MACRO* C; ~2 Q0 R* Y" a1 o) Q' L( W
- .ENDM
- Y! F4 B J2 j/ O; [: ~ - 6 [2 T) ]6 u: p0 c6 w
- MACRO_SWITCH_BANK_E000_A .MACRO
# h' ?* F2 b- I6 t, q; A3 I! w - .ENDM+ e1 S/ O! ?8 O* h7 k
5 W) C" \1 \6 q- X) a- ;====================================================================================================
`, | X6 M6 M8 z - MACRO_TRIGGER_FIRST_IRQ .MACRO
- z3 j$ [2 O! ~% n - LDA #IRQ_SCANLINE_BEGIN + 1
8 J6 A0 ^3 {6 N6 s! ]' \# [ - STA MAPPER_REG_IRQ_LATCH4 f; T/ L! P/ E" Y5 f' C
- STA MAPPER_REG_IRQ_RELOAD
! k6 Y% o" Y. G7 H - STA MAPPER_REG_IRQ_ENABLE& b' _" G- p- G2 g( L% U0 M
- CLI
- D- h+ M& e5 R0 c) M - .ENDM
# u* X5 O( g! a5 |7 P; I$ n -
( c8 s- Z9 a& T. A6 ]+ p* t - ;====================================================================================================# O1 e5 G2 ]+ C5 u9 A; M* L
- MACRO_ENABLE_IRQ .MACRO
# h5 i6 ~7 [% r2 E% N+ d2 g& J - STA MAPPER_REG_IRQ_ENABLE* W1 A p0 k5 u, y1 G% j0 f# n
- .ENDM
5 t0 [" L K7 V5 I. H8 l8 z - : h1 B* f$ O' f; M" p& @5 ]
- ;====================================================================================================! x2 [% |3 Z7 q; L3 n9 [
- MACRO_DISABLE_IRQ .MACRO
6 V% E+ ~6 {$ K: Z. m0 L- y - LDA #$003 H' C- q0 D: U% i4 B% q& H% k0 j' h- s
- STA MAPPER_REG_IRQ_CTRL
4 S6 a& x2 ?' x; V- ^ - STA MAPPER_REG_IRQ_ACK
. A" z S, d* E% K& ` - .ENDM
4 }4 U Z3 ^) f* q0 p3 Z; L a( Y -
, f1 J+ }4 X3 D5 E# F* m! ` - ;====================================================================================================
# l9 V! ~& C+ s1 b- L1 [ - MACRO_ACK_IRQ .MACRO
# H/ t( J6 p. W7 q1 ^8 R5 m& y - STA MAPPER_REG_IRQ_DISABLE
! L* D5 Z: D- r! ~( z9 o - STA MAPPER_REG_IRQ_ENABLE* s5 h7 P c3 G& V
- .ENDM
3 H6 {& p& P& K+ b! V' H - - n, p* `0 w5 f5 I2 b" b$ L
- ;====================================================================================================
5 n% ^: c \# {: e - MACRO_IRQ_OPERATE .MACRO
- w8 V' {$ l# t) Z/ l- x0 L7 }$ Y
3 p0 V6 Z* Z* S- ;==================================================
( d5 N* n5 g' E5 Q" k - ;IRQ滚动模式常量% }, R' W& s2 R
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
6 i0 m& n+ a/ i, P- {8 } - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动1 j& l8 B% |/ F5 [; w
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
1 V! M7 V# F9 e Q3 J/ B* a - - D! n6 _3 p0 i, j3 \7 ]0 m6 }6 Q* U
- ;IRQ扫描线数据 [1 [% k5 v) S! x% W; L" {1 L
- IRQ_Scanline_Data
* A7 u, |0 S/ |. u - .DB IRQ_SCANLINE_14 C. E+ P. Y; _ r" K
- .DB IRQ_SCANLINE_2
3 M, X, _6 i/ f, h( u; f, I7 t - .DB IRQ_SCANLINE_3
O* ]% J# _! ?/ }3 M6 \ - .DW 00 ;关闭IRQ% K5 d/ f0 z/ d+ b& s. z3 R
# b- B8 k# C5 W1 U- ;IRQ滚动控制模式
- W/ F& j" S( O6 @ - IRQ_Scanline_Mode
2 D: j) X* B) O3 O. M4 D; S - .DB IRQ_SCROLL_MODE_RIGHT
4 Q# f5 w) Y' ~5 g4 x# ]7 ^ - .DB IRQ_SCROLL_MODE_LEFT6 O) ~; s7 e% _6 t8 c
- .DB IRQ_SCROLL_MODE_RIGHT' X$ z) N5 [+ U& |
- .DB IRQ_SCROLL_MODE_LEFT
# l# ~% Q; a1 A5 f& R6 ~ - # ?% ?! \8 m6 d9 M& F# d
- ;==================================================, r0 W7 z4 r- C2 \* O& x
- ;;IRQ滚动控制
0 l/ Z+ F# {. v3 C" ?0 \+ \ - IRQ_Set_Scroll
. x2 v' b4 q, b) l/ z3 V, g5 ? - LDX IRQ_Process_Index! O! s' N* ^3 Y z) E9 l
- LDA IRQ_Scanline_Mode,X! S' p5 l8 ?7 ~; c L4 h: T
- CMP #IRQ_SCROLL_MODE_LEFT
. f( v* H4 u0 X* a - BEQ IRQ_Set_Scroll_Left
' g' ~4 t/ p+ m6 n1 l; q0 ]5 } - CMP #IRQ_SCROLL_MODE_RIGHT
2 [6 A/ i4 ?9 ]5 u. s6 ? - BEQ IRQ_Set_Scroll_Right' c* Z8 Y8 ~( l X A) @
- IRQ_Set_Scroll_Zero;不滚动; h. \7 o m6 G1 l! a) d
- LDA #$00
' y; z! |' F U4 }$ L$ z - STA PPU_SCROLL
) ^: |, F$ j0 d8 @ - STA PPU_SCROLL
8 i, k' Z& b# g - RTS# I' [ @4 G& j% A9 X6 M9 {
- IRQ_Set_Scroll_Left;向左滚动
" C/ f& @4 v, k! S1 @8 h - LDA Scroll_H$ d0 N8 N! v- W/ G
- STA PPU_SCROLL5 f" e6 N# F, \0 Z4 Z% L
- STA PPU_SCROLL/ {6 \7 S; d# _1 ?; L5 ?/ I
- RTS/ c) b t4 J a/ Y- l* }# p
- IRQ_Set_Scroll_Right;向右滚动8 _& q) J3 m" Y. c' u
- LDA #$00
/ {* p( H, P& w( E; V" W - SEC, n0 L2 L! ]3 `' i# h1 Y6 ]& N4 @
- SBC Scroll_H$ w: X* {8 j: T. X! N5 t! W0 ^2 F
- STA PPU_SCROLL
) c' ?3 ^; g# O! d - STA PPU_SCROLL
5 X3 \1 l' b$ N6 }1 N: O9 J - RTS
1 {% A% h0 {4 \( f! p) S! c -
+ p% D7 T( F8 L! Z$ q: V - ;==================================================/ L1 Z) j. Z3 @4 Z( T6 x
- ;;IRQ滚动控制+ l0 `" d0 r4 |
- IRQ_Set_Ctrl/ _# } J9 J b4 b8 ~
- LDX IRQ_Process_Index- @3 J7 _% J$ ?' y
- LDA IRQ_Scanline_Data,X
0 M/ P2 I6 X+ p0 e" ^ - BNE IRQ_Process_Latch. @/ q1 z2 d/ T' W( ]
- IRQ_Process_Disable;禁用IRQ
" B9 x9 }* W2 p0 G; ?) O% W - STA MAPPER_REG_IRQ_DISABLE
6 `$ A8 z7 R& D5 p5 r- F# ]* i - STA IRQ_Process_Index! U' g6 `; F5 U' I! W4 B
- RTS5 B5 d: P0 M5 b' E
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
% V& ~# D0 r" g3 r$ n - STA MAPPER_REG_IRQ_LATCH
. w0 X& [5 `: X* c$ y4 U8 j' d2 M' ^ - INC IRQ_Process_Index
: p& P! w# k9 N6 z7 P: \, a - RTS0 q5 z1 |& s& s* G' I; @) W
- 9 z: z7 Z5 V- H. I1 T6 k1 K# [2 a
- ;==================================================; C7 i& I# S' w4 |4 W0 {* @& K
- ;IRQ处理1 r5 w7 y( {4 E
- IRQ_Process_By_Index
8 v5 t% t' U8 l/ j4 H - JSR IRQ_Set_Scroll
; ^7 M+ y7 A5 H3 s/ R8 g - JSR IRQ_Set_Ctrl! Q; s( I2 f* |9 u2 k3 L7 R
- IRQ_Process_End2 h% T) g" J/ Y3 q4 H
- RTS g- E; D, d: I% o& Q; h v% T( Z
-
" b+ T; D* o7 B" ?: M1 | - .ENDM+ R6 E6 p/ L* T
- 6 { L: d9 R. D) b' R4 g
复制代码
8 v. O$ m: \& T3 Z, [7 y
) r% A# g% Y; s" ]代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|