|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 + B; A: j1 E8 z' N
6 B2 X, `* t+ N6 x1 p, b7 m
本次IRQ研究了如下:
7 m$ [' w1 b6 h h- aVRC2&4(Mapper21,23,25)
7 [8 @; X6 P0 |5 E: B5 q; r" e5 sVRC3(Mapper73)$ ~$ B2 F, E# a$ C
VRC6(Mapper24 & Mapper26)
$ ]3 }$ U' h$ |4 q, o' XVRC7(Mapper85)# y4 C. a. {0 K- V% l% s
MMC3(Mapper4)
6 A) l$ M; M3 ZMMC4(Mapper10)7 F3 e/ p ?6 _1 p! s2 @: d3 f. x" ^
MMC5(Mapper5)
7 H* ~* W/ u, O$ C. ^. q/ m. cMapper182 i2 D) x( E! i; T, `
Mapper64
1 B* u8 ]- c) S7 m2 HNamco163(Mapper19)
! B: _, t0 V @& O3 `% Z8 q* iSunsoft FME-7(Mapper69)
/ c) a- q/ N/ P. ^ @8 p- m) Y; g) o9 c) m
共计11种Mapper的IRQ操作使用例子( o- T5 O7 f- {% t4 u& V) ]( d& O
代码内有详细注释, 希望能帮助到感兴趣的人., H( P Y( i1 ?% J: W
4 v* Z' s0 `8 K, U$ Q4 W) P' _; _  
$ M$ @7 o* Q( |# b- V5 `. q6 a3 W! m, I [
Mapper代码主要逻辑(以MMC3为例):
& g1 B9 z4 {" L; d
* y' i: ^( Q& O+ |7 `) k& u5 r- ;==================================================
& z; ~( j( }" d1 G# Q - ;Mapper号3 Q5 \3 \' r3 q6 S0 `
- MAPPER_NUMBER = 04
) G/ g0 x1 k! Q: m" H/ Q. t - ;==================================================
) S6 m x, b5 C+ e+ Y4 f3 y - ;MMC3 (Mapper 4) 寄存器常量
! a; m$ @7 I1 ?9 Y, ]3 b" y - MAPPER_REG_BANK_CTRL = $8000+ ^3 z, x3 l9 c; _' f
- MAPPER_REG_BANK_DATA = $8001! q+ i& c4 `/ {/ L* j& ~( R
- MAPPER_REG_MIRRORING = $A000
: m" y E* _: L! ?3 ^ - MAPPER_REG_PRG_RAM_PROTECT = $A0010 D, D! s8 w4 H* g& r
- MAPPER_REG_IRQ_LATCH = $C000' Q1 v& `4 J0 c( q" T5 L
- MAPPER_REG_IRQ_RELOAD = $C001
7 W5 ]! ?# V' l" H0 W - MAPPER_REG_IRQ_DISABLE = $E000
8 C a$ H, D$ W+ u - MAPPER_REG_IRQ_ENABLE = $E001* {8 I8 O3 C$ N
- ;==================================================7 c) y$ h# y. s' K
- IRQ_SCANLINE_BEGIN = 135+ d. V* c4 [( i. Q0 v
- IRQ_SCANLINE_1 = 8 [2 [% U" `& ^/ `
- IRQ_SCANLINE_2 = 54
% q% I9 b7 c8 X8 r6 M c - IRQ_SCANLINE_3 = 8
9 S; W; w1 ?9 f/ Y j - ;==================================================
( u, L7 ^( t- ?( g8 y) p! U, ?
8 X$ s4 h- b! l& [- ;==================================================================================================== T' A4 Z; Q/ N3 ^
- ;宏常量
& u5 h0 |( L( n5 w - ;====================================================================================================$ E( M: `* O2 i( ]9 A# D
- 8 Z; } X1 {- e$ h, l
- ;====================================================================================================/ i. L. J2 o5 _# {
- MACRO_MAPPER_INIT .MACRO
5 _" l- V! j% j5 u" \& a/ B - ;禁用IRQ& }' h& d' o7 f9 ~% H9 `- a
- STA MAPPER_REG_IRQ_DISABLE
m3 c2 l" {' _* E* s6 L% H - j/ r- v# j/ Q. n7 f
- ;水平镜像) e6 C2 m8 H9 `4 M
- LDA #$01* r. q" n+ |# }
- STA MAPPER_REG_MIRRORING" Z, C4 x: n# M8 X' d
- 5 c/ Y7 V$ S/ _3 v
- ;初始化图形bank
! T# I2 C" ^$ K - LDX #$05 q) ], {0 h0 ~7 G: a
- .Init_Chr_Bank
' @& @$ j7 E; P, b& g - STX MAPPER_REG_BANK_CTRL, w& V' n2 l* R' J
- LDA .ChrBankData,X
, ?) s9 X6 F9 t' S - STA MAPPER_REG_BANK_DATA; Q/ T7 U7 I6 C9 o+ r8 k9 u
- DEX
3 f; W' O( U8 u& N5 z8 R' }5 s - BPL .Init_Chr_Bank0 M& D/ ~7 A* n+ u8 A/ I, q. w
- JMP .Init_Chr_Bank_End; r) Q8 Z. F. P9 x7 a. P
- .ChrBankData, B+ F: h& v) k* h# h4 @- f
- .DB $00,$02,$04,$05,$06,$07
5 s- v, d/ V* j) h4 F - .Init_Chr_Bank_End
/ J6 K5 Y. V3 b/ B I -
9 N! X. y: A! T9 b! S - ;启用SRAM
/ g! W2 h; `% M: V1 p' k& T6 f, M+ a - LDA #$80
5 d: m e9 H! a+ S, w" V) b! ] - STA MAPPER_REG_PRG_RAM_PROTECT
K, Z/ q. [: m8 [# Y; C0 E( q - .ENDM
% O @' _2 Y `# z- K - 6 ?1 \3 E# }6 d e8 K
- ;====================================================================================================
* E; g* ~" `9 ?0 p" o" T; q J - MACRO_MAPPER_SOUND_CLEAR .MACRO9 y. l8 C( @8 f8 B( y) f2 R
- .ENDM
; u& w2 M# o8 B7 v% { - : v1 ?# p4 Y# @$ {/ ]9 a1 S
- ;====================================================================================================( Q5 `. k( A7 w! f5 Z- k& K
- MACRO_SRAM_ENABLE .MACRO
\9 V0 @6 Q- x - LDA #$80
" ~3 g& w) u6 [; F$ W2 F3 Y - STA MAPPER_REG_PRG_RAM_PROTECT
: i! Q$ _* o: ~' y - .ENDM7 a5 n+ X5 e! H R$ _
-
( x, k* j1 F6 `7 a( Q. j7 B) ] - ;====================================================================================================1 E; H1 Y$ t( [3 o
- MACRO_SWITCH_BANK_8000_A .MACRO! @& g/ P$ Z' O3 z9 c P( S
- PHA4 J6 p4 h+ J6 N- [6 K# }+ s
- LDA #$06
& V2 b+ ]9 ~! [2 n( Y# D; Y+ a - STA MAPPER_REG_BANK_CTRL+ z" \& |, T5 c& g- L; U# t
- PLA
* o$ l) k: C& O- n. r2 T; R0 T - STA MAPPER_REG_BANK_DATA" L9 Z5 [4 X& I) g1 E
- .ENDM0 i1 T+ ]* W9 X6 w
1 O( F0 \: L; n4 L- MACRO_SWITCH_BANK_A000_A .MACRO
. k! ]5 H: q; k W9 e8 p& ]; d - PHA7 T$ j3 N( D9 s W. ]
- LDA #$07
* o- j$ a) f& X3 Z% E# L3 f - STA MAPPER_REG_BANK_CTRL6 e) e6 u; Y+ y @$ J8 R% F) Y( _
- PLA) C3 h% ~, s: O% X/ V, i! Z6 M
- STA MAPPER_REG_BANK_DATA8 z, Q8 A8 p2 G" r* }# m
- .ENDM
: S7 f2 u) n' {/ Z+ t9 p4 O -
5 F+ g5 u7 i" V% K0 r6 ~ - MACRO_SWITCH_BANK_C000_A .MACRO/ G1 ^! j; W$ m: Y; Z6 F
- .ENDM- t; [6 n4 T0 _3 n3 b6 ^
- 1 c- L8 Q- x4 r# G$ X1 {/ @1 _
- MACRO_SWITCH_BANK_E000_A .MACRO
" L- T* I/ |6 h2 J* l8 w; u - .ENDM7 V; [/ z# w9 K( G7 r
- ' a4 u5 o- e, ?6 H( A$ F, G! v
- ;====================================================================================================! y1 O0 t7 N0 v& b
- MACRO_TRIGGER_FIRST_IRQ .MACRO" J, i/ R8 y* G
- LDA #IRQ_SCANLINE_BEGIN + 1
8 i# ~9 ? ]+ v! w- k - STA MAPPER_REG_IRQ_LATCH
) p# E' s4 G8 A& Y; r# l3 B - STA MAPPER_REG_IRQ_RELOAD' E. }$ y, I0 T- o( `2 ]( f
- STA MAPPER_REG_IRQ_ENABLE
6 L9 F+ S4 ~3 a - CLI
2 M: p: V+ o6 e: \* l" t$ B - .ENDM4 c3 u6 ]4 R& ^
- ; V1 h; k+ r$ @. k& V
- ;====================================================================================================5 N) x- f* I3 Q9 O! h* N9 @
- MACRO_ENABLE_IRQ .MACRO
7 ?1 N- r' }" o/ U* R* z - STA MAPPER_REG_IRQ_ENABLE3 }3 v" q; f4 L
- .ENDM! G2 U( `1 j" p" c
-
. Q/ i. V c7 ^ - ;====================================================================================================& l5 _+ S5 j& H, j5 F6 C0 K
- MACRO_DISABLE_IRQ .MACRO
2 W% E. e+ Z5 W- A# ~& c - LDA #$00+ t7 b; c. F# f% ^5 p, D; c' \
- STA MAPPER_REG_IRQ_CTRL
1 E$ G+ V4 v5 N, P, ^ - STA MAPPER_REG_IRQ_ACK
4 S0 V; r8 r4 r1 E" k - .ENDM3 ]8 p7 [, s0 m S, ~
- : _! k6 M9 t; r7 j! j1 Z2 y
- ;====================================================================================================
9 E$ H' I' A- v! A8 c& f( q - MACRO_ACK_IRQ .MACRO
/ a/ ]3 U2 A; T - STA MAPPER_REG_IRQ_DISABLE
- _" F [* L# x+ o* b/ a - STA MAPPER_REG_IRQ_ENABLE5 v3 H! z/ E# X# h+ M" o( f
- .ENDM8 H6 ?1 L3 K, A% I; x% K9 O
-
z8 S: t: K6 l0 |( F4 S) q8 t: T - ;====================================================================================================- S. _1 H" K7 Y
- MACRO_IRQ_OPERATE .MACRO+ b q# t: C# T
* B$ h8 h" m- F: S) r9 q- ;==================================================
1 ^$ J3 d6 M3 i2 H9 O - ;IRQ滚动模式常量
! D. U3 {2 E1 I' d8 j - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动! `3 |- ^9 z" d( G6 W. n$ H. `
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动: i: m' B d& C/ g
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
, m0 f" h0 S! ^- A! K* i- {% n" D4 ]
. r M& a) \. s( J) W- ;IRQ扫描线数据: }; _1 Z+ |7 X& l. m1 o0 q$ O
- IRQ_Scanline_Data
, X& X3 G! N E4 @$ j8 F% G+ p - .DB IRQ_SCANLINE_13 l6 W0 R' q- n6 Q( h
- .DB IRQ_SCANLINE_2' k5 d( A! R+ B/ I$ z# p
- .DB IRQ_SCANLINE_3
3 ^) {+ ~' l) h9 Z4 F - .DW 00 ;关闭IRQ7 a( U& f" h, ]4 d& U+ |
- + Z9 ^7 S% W/ n# X
- ;IRQ滚动控制模式
' s5 [5 N! V1 m4 I7 a: \+ v - IRQ_Scanline_Mode
% M( e D+ O* y! U2 R - .DB IRQ_SCROLL_MODE_RIGHT
6 C( U% |9 g; S1 c7 N3 P - .DB IRQ_SCROLL_MODE_LEFT
( u7 U: l$ R$ p1 H5 T1 m6 m. p, m - .DB IRQ_SCROLL_MODE_RIGHT
) R4 Z2 e! Z6 V- ~6 t- H1 l9 @: @ - .DB IRQ_SCROLL_MODE_LEFT1 D$ w; ~) A* d6 ?- `' W, r
2 x2 G1 N! f- `9 ~2 @0 e2 `- ;==================================================
8 i+ ^6 `' E9 ~- d6 w/ _ - ;;IRQ滚动控制
, [' O U2 E# v& G- d4 V - IRQ_Set_Scroll
+ H, n) N- m1 A/ b6 F0 n& t - LDX IRQ_Process_Index
' s* M' x3 {* f& S# [( Q - LDA IRQ_Scanline_Mode,X' g7 K- M3 ^- K; }
- CMP #IRQ_SCROLL_MODE_LEFT
+ ~) s7 C8 J+ z F/ Z - BEQ IRQ_Set_Scroll_Left
4 X4 y, l, h) y - CMP #IRQ_SCROLL_MODE_RIGHT
$ h# J/ b: _2 h; ` - BEQ IRQ_Set_Scroll_Right1 K1 h* ^7 B0 c; A
- IRQ_Set_Scroll_Zero;不滚动
9 U5 X! F6 e+ n, j6 o" S2 M* z - LDA #$00
5 B: M( n, n5 A - STA PPU_SCROLL
4 L) X8 B8 }0 c) R) N - STA PPU_SCROLL
* `( Q7 n# f# ?% [ - RTS( D3 R, N! M/ c$ u. m
- IRQ_Set_Scroll_Left;向左滚动( J# X( t6 b& M C6 ^& {- f. h
- LDA Scroll_H
5 h M2 e/ D0 g/ R - STA PPU_SCROLL
/ @( o& W$ ?, D - STA PPU_SCROLL F( m8 x+ |& @& M8 h
- RTS+ B/ V* u# h+ `
- IRQ_Set_Scroll_Right;向右滚动
2 R! p% z1 t# u, @8 n/ n" a, C - LDA #$00! R% ]+ R; |% k$ z
- SEC
K+ p4 ?9 T/ @7 X5 o; D( M - SBC Scroll_H
5 w3 s- ^" p l4 J. `1 J - STA PPU_SCROLL ]" z. B5 {0 f5 a5 Y h
- STA PPU_SCROLL
" n l: W( Y* K$ t+ ?" }2 g - RTS
4 e) Z. ?1 [: j# D, \6 ^ - 3 F$ G3 w4 y- n' L8 N3 `. i6 i
- ;==================================================( G. }# ~* w, e" D& `
- ;;IRQ滚动控制; {) U: {. a [% \( P
- IRQ_Set_Ctrl4 c2 H0 `+ U) s! v
- LDX IRQ_Process_Index: f. h4 M9 G) ?9 p& l0 w% G
- LDA IRQ_Scanline_Data,X
: m; V+ q5 S( @' Q; n+ ^ - BNE IRQ_Process_Latch: ^6 e4 C# a. u. p; N* l
- IRQ_Process_Disable;禁用IRQ
4 [8 s" b: T! A. m$ s- @. }. Y - STA MAPPER_REG_IRQ_DISABLE+ P. R4 l% `9 J0 b8 B1 B3 v
- STA IRQ_Process_Index! E, S2 t! v" O. C% \ }# T! b
- RTS# {2 ?7 Y8 s* x* `
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
, G+ C. A4 N7 M& M - STA MAPPER_REG_IRQ_LATCH
. @, s0 Z8 Q; {. S8 |* [8 [! [ - INC IRQ_Process_Index- f6 w* h! }+ m, t$ M+ a1 S9 b2 Q
- RTS
% ~6 V4 Q1 B. o* x) }: a
# k6 c: @# L7 H* A+ n2 H- ;==================================================0 d* L6 ^" x4 W
- ;IRQ处理0 J# C$ g8 u2 V5 j* g2 P
- IRQ_Process_By_Index' L. F2 [0 x% W
- JSR IRQ_Set_Scroll8 L8 G N# [( x8 S8 {3 H3 G
- JSR IRQ_Set_Ctrl# A" c% p9 d6 j1 ~1 y
- IRQ_Process_End
% e* r$ S- |% Y - RTS* v6 P) M5 O2 Y. K9 [% @0 s, `
- 0 r- G2 B$ g8 M! H! c
- .ENDM
+ Y* J: _0 ]; Z1 o; O7 b -
( ?3 a, a) m" m- }7 A
复制代码 2 N* H& j5 e2 U4 ^9 S3 @% I
4 _* T' y/ h* H/ K( s7 q
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|