|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
4 a5 { K# Z; X* u& N6 G! g9 y
2 L3 r+ S, H+ ~本次IRQ研究了如下:/ u! i8 r4 _. k! M# A
VRC2&4(Mapper21,23,25)
. v, C4 V4 ^* A' yVRC3(Mapper73): F* p' V* _! J, C
VRC6(Mapper24 & Mapper26)
' E3 S; S2 l$ j1 s* Y3 V/ f5 h, \/ xVRC7(Mapper85)
* }) Z2 L/ g. r fMMC3(Mapper4)7 }0 P* [( u; I# J
MMC4(Mapper10)) @1 s7 ~3 ?4 `: |/ p; {
MMC5(Mapper5)
$ H1 c1 y5 S( DMapper18& y! t+ J) C" D7 `, r
Mapper64
6 W0 ^; n9 d% \7 qNamco163(Mapper19)
, K8 W, K+ ~! ESunsoft FME-7(Mapper69)
. l" b) D9 a. ]
2 Q$ |" w& K& g; A h$ [: Y+ N共计11种Mapper的IRQ操作使用例子
, N. }/ R- l& L9 e3 o代码内有详细注释, 希望能帮助到感兴趣的人.
0 V3 S6 B- R( J* U: c0 W9 \5 P( ?" y) ?$ S# A o3 Y
' T) v( `! K k
1 ]" H% p" E2 U2 d- e5 Q8 `Mapper代码主要逻辑(以MMC3为例):- y) @& N U3 K: ^; y. U$ t E
- - R+ v! a6 T+ _5 p" o
- ;==================================================
8 m5 h. F9 s. A - ;Mapper号, Q# P: v0 f* y) j
- MAPPER_NUMBER = 04( E; s8 ?% a$ |) W: M% L: l
- ;==================================================- I6 Y' V5 S7 _( H( y
- ;MMC3 (Mapper 4) 寄存器常量5 v3 y. t" o0 L! V& e' C
- MAPPER_REG_BANK_CTRL = $8000% T- a. b. R" n: t9 G$ W
- MAPPER_REG_BANK_DATA = $8001
- v; o+ \5 ~6 J2 R' }0 Z4 o0 v - MAPPER_REG_MIRRORING = $A0007 ]; e; j% E- N
- MAPPER_REG_PRG_RAM_PROTECT = $A001
: `! l5 @1 [# Q4 ~ - MAPPER_REG_IRQ_LATCH = $C000
" y7 a2 W* e6 g1 s. u! C - MAPPER_REG_IRQ_RELOAD = $C001- E0 }; {" U) ~: W
- MAPPER_REG_IRQ_DISABLE = $E000
3 t" Y0 `; {# t/ J F - MAPPER_REG_IRQ_ENABLE = $E001
- W( B. [, Q3 G6 _2 k - ;==================================================/ E& P1 M6 K3 Q. d+ O
- IRQ_SCANLINE_BEGIN = 135
1 x( B* `6 q# ^' W! N9 F/ U - IRQ_SCANLINE_1 = 8
% r' p& ?/ A; _: h7 a. q& I- p; u - IRQ_SCANLINE_2 = 54
/ J" w3 s' S* X+ c - IRQ_SCANLINE_3 = 8
) b+ y1 W5 O9 R3 V; k2 j - ;==================================================' v. a- c; @! f9 n
2 E% z9 f- U; a" f, q& W7 u0 c- ;====================================================================================================% p+ E/ w. f2 N
- ;宏常量( `2 c$ c& V [/ ]5 z
- ;====================================================================================================
* i: G6 z( G4 o8 I6 g3 Z; G) T* H
& P0 f3 q# ?9 O- ;==================================================================================================== ^4 K/ M/ z' _$ e H
- MACRO_MAPPER_INIT .MACRO0 Y9 S" G! S8 n$ G5 V8 H( C' h1 w
- ;禁用IRQ& O9 y/ O8 F, d) V t% l
- STA MAPPER_REG_IRQ_DISABLE) Q9 _- `/ I0 h; i7 Q, `. G- [
- 4 |5 {8 c: p) n) ^+ ~% n, z& r
- ;水平镜像8 K2 O* S2 F- h0 h; c8 m
- LDA #$01
0 a$ H' ]( F$ `8 C9 [6 P! [ - STA MAPPER_REG_MIRRORING( m% c7 ?, [ q+ Y
-
% s& s: `) c1 z( U; p0 Y) e+ `! O( P9 m1 U - ;初始化图形bank5 D0 k7 z; @5 q
- LDX #$05 M0 C# J) h+ Q! O! p
- .Init_Chr_Bank
5 f- J% o X+ s3 n5 {4 R - STX MAPPER_REG_BANK_CTRL2 Q5 L, Y. \* ?( q3 q! L, E
- LDA .ChrBankData,X1 l! R# L( _& V1 R; A3 f- |% ^
- STA MAPPER_REG_BANK_DATA
, b( s; B9 L5 ]6 r# O; B - DEX9 H0 R& l' F0 c" E( T- L
- BPL .Init_Chr_Bank$ N+ a+ n! p# Z W) W3 ?
- JMP .Init_Chr_Bank_End3 C- M- h5 q; j$ w5 {) m* R
- .ChrBankData ~$ F# F9 k5 L- [1 M d/ z8 C
- .DB $00,$02,$04,$05,$06,$077 y" Y, t5 x5 Z/ K
- .Init_Chr_Bank_End
, j) j0 `2 u& h0 e( H! _$ N -
0 ?: b; h$ S5 D" }% J( Z' z - ;启用SRAM
2 K" h: ^& Y1 M; m3 R7 w& E1 l - LDA #$80
, b& R4 y+ E$ m6 N - STA MAPPER_REG_PRG_RAM_PROTECT
1 M) N3 `# e" M. }3 \+ l - .ENDM, U1 H/ u" [& [: G7 {3 N( r
- : @9 j/ N% W- R
- ;====================================================================================================
; y/ {2 M0 Q' C# S6 A6 M0 o - MACRO_MAPPER_SOUND_CLEAR .MACRO( x0 ^- G7 V5 R* \, s0 ?
- .ENDM! v8 u3 T- j" G# _1 n' Q h1 A- d
-
9 t5 w+ t4 a& C* { - ;====================================================================================================
* r9 Z0 d3 g& k& v) p- T - MACRO_SRAM_ENABLE .MACRO" b: i( ]% |" u/ [7 ?7 w
- LDA #$80
, m* L7 Q- Q' k - STA MAPPER_REG_PRG_RAM_PROTECT
8 J9 V7 k5 o C B4 ~ - .ENDM) P7 ^4 ~; J4 g9 p1 O
-
' [2 M; m1 P; k1 m" q6 I8 J/ Q( S - ;====================================================================================================7 Q" p! u% a6 L0 v H1 D' v+ p2 c# L
- MACRO_SWITCH_BANK_8000_A .MACRO
$ S7 @+ T( r$ J4 a2 h8 G# N - PHA$ l# u/ A4 f. ]0 }4 k/ P2 {% |
- LDA #$06
7 Z: B; a) S" ~. ~ - STA MAPPER_REG_BANK_CTRL
4 d! A( T% r4 V( f/ l, p! q+ H6 e - PLA
3 n9 e; r" L) n8 b3 z - STA MAPPER_REG_BANK_DATA9 p& k& ^2 j0 l4 Y; Q/ E8 Y( [
- .ENDM! j0 D* H4 }! N9 Q
6 }; \7 N: p3 `( m1 }1 f- Q- MACRO_SWITCH_BANK_A000_A .MACRO
# T- [$ @2 D7 s; U+ k/ j - PHA/ b9 w7 N4 X5 z/ ]7 q' t- y- f
- LDA #$07
2 @) R/ g4 | N$ k - STA MAPPER_REG_BANK_CTRL
* E8 X( t' ]2 z+ ~ - PLA
$ r" c! y* a* V% B" I8 @0 W - STA MAPPER_REG_BANK_DATA
0 K- i, r5 y9 ~/ L" I- [; X. n - .ENDM0 P B' {6 L' i8 R- b/ S% r
- 1 Z, ^$ R' {: W& `5 p1 k$ j
- MACRO_SWITCH_BANK_C000_A .MACRO% K) h) ~ Q$ B" q9 z
- .ENDM
2 `8 a! k, z Z" G* k9 L% R5 W3 p - 8 F9 o8 v9 w- |/ F: k$ D
- MACRO_SWITCH_BANK_E000_A .MACRO) m1 a# _& S) w8 I- C; W" g$ b
- .ENDM# G& D+ B l4 F
- & q2 x: X' U0 O8 ~9 Q
- ;====================================================================================================8 F) g# P7 s/ Y( u% X
- MACRO_TRIGGER_FIRST_IRQ .MACRO" U$ y. i9 u) k2 O0 a
- LDA #IRQ_SCANLINE_BEGIN + 1) O- s( \) s6 U# i% P/ l0 x/ `! v$ D. q
- STA MAPPER_REG_IRQ_LATCH
0 c) N& @; j7 Q9 h8 R- l" @$ D - STA MAPPER_REG_IRQ_RELOAD7 K5 {# z5 Q- r* c, g4 Z
- STA MAPPER_REG_IRQ_ENABLE9 v: I$ R, Y0 [5 ^3 M2 S
- CLI
" ^' v$ T0 N5 J+ b2 I% u, {, ? - .ENDM
! Y! a( L# a) T. B - 9 {! }! w4 u: z1 c
- ;====================================================================================================
/ T# q1 |# Q( l/ Z5 {$ W3 S - MACRO_ENABLE_IRQ .MACRO& l: G$ ^/ R0 A
- STA MAPPER_REG_IRQ_ENABLE' \2 [# B7 b1 i. u5 t
- .ENDM/ q5 @0 z, e0 N. c6 D: R9 s1 j4 Z
- * N5 c+ V$ U- Q: B6 `3 e$ U3 N
- ;====================================================================================================
( ~3 M u2 w. ?1 P - MACRO_DISABLE_IRQ .MACRO& M7 S$ ]; B2 p0 b/ B7 }7 a
- LDA #$002 w5 w# w& A# i- w3 \
- STA MAPPER_REG_IRQ_CTRL
9 C+ K4 [# ^/ Z" F - STA MAPPER_REG_IRQ_ACK
/ `/ q: e H* z. X - .ENDM# R: ~5 F- z% f. {$ h3 M( r
-
$ O, u$ S+ S* M% n, Q/ r - ;====================================================================================================0 I. o9 R/ @7 x) m+ |. a
- MACRO_ACK_IRQ .MACRO6 E) ? ^) s& R
- STA MAPPER_REG_IRQ_DISABLE$ H) [0 ~1 i. y- a* E
- STA MAPPER_REG_IRQ_ENABLE
/ J6 z% s2 c* h - .ENDM2 \' A/ w/ S A9 s5 u
-
: r- R* a5 g" [- [8 W - ;====================================================================================================
3 W( P; f3 w5 O, S" y( D+ ~ - MACRO_IRQ_OPERATE .MACRO
9 J7 p: Z' W" b# J% v) P: w# S - ( |& t- i( S8 I9 W. r, u V
- ;==================================================( Q" e9 G' c1 W8 E, X e
- ;IRQ滚动模式常量
; C2 G7 l/ O7 k5 c) M0 a* i& I1 _ - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
( O1 ?& K& A& J" V" P9 D; v - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
$ z& J0 e: k$ \2 V* b& ? - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
) M- M# v4 T9 M6 F* x
% G h; Z$ S( _* ~- K- ;IRQ扫描线数据1 x5 ~0 x& D% @& e. g9 B
- IRQ_Scanline_Data
! L- {- E$ P& j - .DB IRQ_SCANLINE_1
5 i+ a! a% ^' h( @, V - .DB IRQ_SCANLINE_2
- J- @" V5 J1 T) I; G - .DB IRQ_SCANLINE_3
% l" s- I+ Q9 {7 k' ~' g - .DW 00 ;关闭IRQ
+ I# r( T% O6 Y3 r
( @8 ], T' o7 K3 Z- U: X- [- ;IRQ滚动控制模式
6 C+ H ]2 |, G* g% r7 [ - IRQ_Scanline_Mode6 U, Q) l) q; N: [+ N# L
- .DB IRQ_SCROLL_MODE_RIGHT
4 C, r$ a% K' U - .DB IRQ_SCROLL_MODE_LEFT w. ]8 z: K2 _* d$ a3 h
- .DB IRQ_SCROLL_MODE_RIGHT
2 v b5 d9 V9 Z& ~1 f$ C/ F - .DB IRQ_SCROLL_MODE_LEFT2 P' S9 Q! O6 d
- - P' Z5 G0 T. h
- ;==================================================
6 ]* c% V$ y. M; \" x+ ]4 Z - ;;IRQ滚动控制
+ O1 b8 B& Q) G2 l; L - IRQ_Set_Scroll0 O9 u2 E; D; @" o
- LDX IRQ_Process_Index
" y' Q0 z! C$ z+ q - LDA IRQ_Scanline_Mode,X
! T+ ^% C4 \5 [) r. a - CMP #IRQ_SCROLL_MODE_LEFT) [2 u g/ O# T# B3 i
- BEQ IRQ_Set_Scroll_Left- f% b; K/ k* O8 r8 X
- CMP #IRQ_SCROLL_MODE_RIGHT
' e U9 @2 {. \% y8 j6 m. U - BEQ IRQ_Set_Scroll_Right
5 a6 l) ^ c0 n+ v/ Y7 e - IRQ_Set_Scroll_Zero;不滚动" T& d( ]$ S S/ R
- LDA #$00
0 |% _" t. `- C4 v - STA PPU_SCROLL! s& `% ?- V9 M8 C: A
- STA PPU_SCROLL
W; }$ R5 k9 E0 X - RTS
! v0 K( Y4 h C5 @) B8 [+ U# f - IRQ_Set_Scroll_Left;向左滚动0 p, r6 T) u0 Q! e* S0 B. n
- LDA Scroll_H. k) x( T. o( K5 b+ D4 m
- STA PPU_SCROLL3 v2 ?. _5 m6 e* d" {+ W$ ]
- STA PPU_SCROLL
- j, t% X# z1 Q$ Q- W. x' T - RTS
- ~% l) R1 W2 K6 R - IRQ_Set_Scroll_Right;向右滚动( K1 }( d. H$ J' d# @. Z6 B# v
- LDA #$00
# N& l, }- ~3 u+ V- e$ ~ - SEC
0 d/ S" e7 s; V m# A9 Z! t- }9 Q - SBC Scroll_H
?1 j# p9 u/ s - STA PPU_SCROLL
' T' I$ p X+ o2 ^$ |% h) L k - STA PPU_SCROLL6 W. M* T3 c: r1 K* c" S
- RTS7 Q9 L7 s/ R% N7 V, W& y2 V/ g
- + W; T" f: c! {/ C; O; z
- ;==================================================
9 |( O! c( o* V" W, O - ;;IRQ滚动控制
9 W4 }% v/ E0 B( S+ K! e - IRQ_Set_Ctrl& N+ A# _, B3 q1 ]# ~9 n
- LDX IRQ_Process_Index" t: f% L& c4 A1 O5 M, t5 r
- LDA IRQ_Scanline_Data,X
/ t4 R, e+ z' F' R; x. m/ k - BNE IRQ_Process_Latch' [8 D( T8 K1 p0 y/ F& ?
- IRQ_Process_Disable;禁用IRQ) K/ G* K8 Q. a7 {
- STA MAPPER_REG_IRQ_DISABLE- F. o3 T+ \+ R- R& Y# E+ O- S
- STA IRQ_Process_Index
+ p% P \5 T+ s. Y( ~) { - RTS% I& B1 U, K4 U$ z
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
3 h9 Y( h; y' M6 T - STA MAPPER_REG_IRQ_LATCH/ S0 s" Y% Y# G1 c
- INC IRQ_Process_Index0 f2 W+ f% ^2 m. O4 w
- RTS
5 a5 S0 c2 l- [
+ r5 D. ^9 R! m' E. _- ;==================================================
2 J0 Q& C+ L' _ - ;IRQ处理
* I# h: l( B) N) B% B( `+ o - IRQ_Process_By_Index
" u; p1 l4 S7 D) ] - JSR IRQ_Set_Scroll2 R) q7 p+ Z9 p$ {; v
- JSR IRQ_Set_Ctrl2 o, x# I% W! h6 Q! q& F! f
- IRQ_Process_End
3 @3 T7 `! |! ?7 i - RTS
( @; I& Z1 J$ s. a9 _7 W& i -
2 B" G2 [7 f: [9 x1 _2 m+ k - .ENDM
& I. K- }! X3 W y - - e# t* W- ] o2 P2 c
复制代码 + Q9 |' d% p; F- u
; G# _2 k3 G* O" i$ A! m代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|