|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ; @; Z2 ?9 K! @
" u) P' P. I% ~/ A; s本次IRQ研究了如下:$ x) }& ?$ F f# i- V4 M! V
VRC2&4(Mapper21,23,25)
" `( H0 s2 ~7 b/ q! {VRC3(Mapper73)
: t9 F3 L* p/ e4 w3 SVRC6(Mapper24 & Mapper26)4 Q( }( d, [0 q
VRC7(Mapper85)
7 m# P: L7 w, {# BMMC3(Mapper4)* u' v+ w. w: A( {: v0 |* W; t
MMC4(Mapper10). k' y1 \! D2 u, v3 M- T& K
MMC5(Mapper5)
8 ~ h* w1 t( o, Q9 qMapper18) C! c0 q! Y8 J7 y# p" ~7 r( s7 r: ^
Mapper64( N0 ], _; p, T& m
Namco163(Mapper19)
; k+ O2 t* e- y$ eSunsoft FME-7(Mapper69)
3 q! O z9 w6 ^# A) m4 s3 B0 {- v8 w- L; d' g
共计11种Mapper的IRQ操作使用例子
8 P" K( I: N. Z2 U代码内有详细注释, 希望能帮助到感兴趣的人.
2 K4 M2 x# D! i, m9 j8 R' D; ^6 h. K: v& f. _
  
; r. Y# |6 w% @$ M$ I. H9 R0 e5 R/ e# ~
Mapper代码主要逻辑(以MMC3为例):
: `" k: `! _$ W1 A. e, g. J0 A Y- X: c2 B- 6 t) e3 t+ ?, c5 h% O- [( X
- ;==================================================
$ A0 i& S' |3 A$ Y- h - ;Mapper号% E, S# E" v) k0 \$ C: A5 c2 b4 z) ?
- MAPPER_NUMBER = 04
" x1 E" M3 _$ j4 x# P - ;==================================================
' [, u# t9 |% _5 r S - ;MMC3 (Mapper 4) 寄存器常量
$ p3 y e4 z z( J7 ? o2 D - MAPPER_REG_BANK_CTRL = $8000
7 y- h3 n0 ~# R5 W - MAPPER_REG_BANK_DATA = $8001
$ M( X1 Z0 e6 o - MAPPER_REG_MIRRORING = $A000: U" `8 A3 h+ o$ z6 o( Y* V
- MAPPER_REG_PRG_RAM_PROTECT = $A001
) d3 N6 [- ?) K% _2 m% U - MAPPER_REG_IRQ_LATCH = $C0008 @5 T [7 U, J* ^
- MAPPER_REG_IRQ_RELOAD = $C001$ G' V+ H6 m; b6 M
- MAPPER_REG_IRQ_DISABLE = $E000; d3 I) O6 x, z ~0 T. l. e
- MAPPER_REG_IRQ_ENABLE = $E001
3 j; b3 K* \; H+ q - ;==================================================7 k8 q- E6 Z3 M/ l
- IRQ_SCANLINE_BEGIN = 135) V% z5 K2 |1 x6 ?# w& j( k7 H
- IRQ_SCANLINE_1 = 8
4 T1 o0 s9 d" E; X2 G* k - IRQ_SCANLINE_2 = 54
# ~2 |7 V( R! M' \5 M0 O9 h$ F z - IRQ_SCANLINE_3 = 8
: C h5 H6 z! L! l4 B8 W7 l$ X - ;==================================================; \. _/ M ^" Z- b2 H7 o& b$ B/ a2 \
- 7 G0 {! y. M0 J6 _! S. Y( S
- ;====================================================================================================
1 w: ]: |( }1 A* t" `2 J9 G, G - ;宏常量
, O4 s- j0 i' S. g: o3 ^ - ;====================================================================================================) [# ]8 ^* n. X: t8 |2 O3 _) x
) P! C1 x# k5 ^; ] O M9 P- ;====================================================================================================
) `5 q7 h# ~" v( P& \# F5 T, j - MACRO_MAPPER_INIT .MACRO/ D a& z' W, `" G
- ;禁用IRQ+ Y8 c2 ?* ]5 w! a$ }9 Q* I
- STA MAPPER_REG_IRQ_DISABLE% K. Q) f' ?; r' T" H a
- x9 ~& \" ?* G+ L: l+ {! W1 W
- ;水平镜像7 a$ l: D1 i( [1 a k5 r) M) X+ J
- LDA #$01
$ E0 c) C" v5 V& a7 c' |5 ^ - STA MAPPER_REG_MIRRORING
- z% e) T8 x7 S3 E q, L) k - 4 r- o* O+ _! j% ] Q3 |
- ;初始化图形bank4 x; W1 j1 B4 a. \8 }; j# e
- LDX #$05
+ r# T: V6 e& m0 Y - .Init_Chr_Bank
) K' f" _, E* O6 c; C) d2 _: j1 r - STX MAPPER_REG_BANK_CTRL
, C2 C8 H8 v; e( O. j - LDA .ChrBankData,X
4 A( J8 M- ^, F5 ` - STA MAPPER_REG_BANK_DATA' J6 ]1 W* J: w4 r8 f5 t" `
- DEX5 V% Y7 @! ~! d+ s# |
- BPL .Init_Chr_Bank6 s, O8 ]" j* m5 V
- JMP .Init_Chr_Bank_End% g2 U# c7 u3 C. g
- .ChrBankData; x9 V" m: u/ Y' t( b. M: _
- .DB $00,$02,$04,$05,$06,$07
' u5 f7 ]: ?0 b: T1 s - .Init_Chr_Bank_End
/ A9 _3 q9 D! d" Y% Y - 6 g2 C* j; y3 i1 p. `1 A
- ;启用SRAM% ~& D1 H$ C9 ^) r0 V
- LDA #$80
8 Q" c0 U# v) e% W' I, y - STA MAPPER_REG_PRG_RAM_PROTECT& D3 ]/ f5 I& A! }. B: j6 E( o
- .ENDM5 T+ t7 m, t3 r$ O4 _* X
- ; Z4 P; K! ~& A9 T$ U
- ;====================================================================================================7 R; g) u4 T5 ^" l' Q: ]8 x. S
- MACRO_MAPPER_SOUND_CLEAR .MACRO6 U7 m4 s" t# d
- .ENDM1 n+ Z/ k; @# l R4 e
-
6 a s) u. J5 O - ;====================================================================================================
% X' G, U( _9 k( Z2 k6 o* h - MACRO_SRAM_ENABLE .MACRO
3 m8 T5 L8 Z/ b% G - LDA #$800 y7 q7 m& ~9 o" X9 Z' o1 r5 G
- STA MAPPER_REG_PRG_RAM_PROTECT
) ^0 @0 w% u1 O: v - .ENDM
$ ~# V8 o5 ?2 x- k: | - ' m+ f- [% |3 [6 I# A9 @4 e
- ;====================================================================================================% }8 v; h) P6 _: _+ m
- MACRO_SWITCH_BANK_8000_A .MACRO* i- R5 k: W2 I* s
- PHA
5 `* D6 t" {/ Y - LDA #$06
6 K1 O( D2 j: b0 O& B# y - STA MAPPER_REG_BANK_CTRL6 l2 _! p; p5 e- T- ]. V% X- s1 `
- PLA6 n) k/ i& ?0 ?% \1 v
- STA MAPPER_REG_BANK_DATA
0 {9 [8 K( S; i% a+ i2 q e. } - .ENDM
: G G' E3 }4 L6 v0 f$ d
- v0 ]- _0 n; [1 m- MACRO_SWITCH_BANK_A000_A .MACRO
: e7 M% \% e% t- w2 d5 o - PHA! X. C* R9 s3 N! T4 W; s
- LDA #$07+ N9 M7 s( w- k! r5 u
- STA MAPPER_REG_BANK_CTRL Q" Y7 e9 X6 p U3 O/ s( Y* x
- PLA+ G0 U7 H, z1 k% O! F
- STA MAPPER_REG_BANK_DATA2 B* b# M; C/ @( P8 s2 Q- Z: t* X3 u
- .ENDM( Y" G( C$ G: c% J' w7 t/ ^
-
: M( J2 r$ T3 D! U a - MACRO_SWITCH_BANK_C000_A .MACRO
0 E3 q# O- W) k' I. n$ y$ } - .ENDM2 b. ?) G& k' `4 p5 B* D. r
- 8 b' N7 L' `0 b3 |( R
- MACRO_SWITCH_BANK_E000_A .MACRO+ Q. d e; p. A9 I9 q6 ~, z
- .ENDM% c* j+ K! L# ]4 @' |9 Z
- ' |. A3 N& l$ `6 ^) e( S& E
- ;====================================================================================================
8 j+ }5 @# ~; y: ~0 K - MACRO_TRIGGER_FIRST_IRQ .MACRO
8 M) q; x9 [; g9 P - LDA #IRQ_SCANLINE_BEGIN + 1/ k! q7 g6 @! |4 |
- STA MAPPER_REG_IRQ_LATCH/ u( S' m& h: z% f4 v
- STA MAPPER_REG_IRQ_RELOAD
5 ?8 ^; K$ ?% _6 ?/ h' w y; t - STA MAPPER_REG_IRQ_ENABLE2 S7 } J8 ?/ i1 g" j
- CLI
: a1 M/ H( q% c1 Z; A9 V1 w' r - .ENDM
. H/ ~. \, |0 I; `4 E. }; h$ N+ ]6 u - + h! W" y6 i& e$ ]2 b& @( p
- ;====================================================================================================7 Z* k6 W+ |, N+ q) h- F- P
- MACRO_ENABLE_IRQ .MACRO8 @* q# F$ @" M: `; F; u8 l8 u
- STA MAPPER_REG_IRQ_ENABLE
+ y* h" ^+ x3 N - .ENDM7 s7 X/ Q- e9 O9 U: S2 N; \
-
0 w2 E2 P3 R1 P+ z0 q. e - ;====================================================================================================
- B' g6 s: e9 K+ A( P& ~ - MACRO_DISABLE_IRQ .MACRO" M$ a0 _; w W/ M
- LDA #$005 I, }: l* l5 E( @3 I. M$ p% l" V3 d% k
- STA MAPPER_REG_IRQ_CTRL n% O$ z# r' j) K2 ]! G) S
- STA MAPPER_REG_IRQ_ACK
" H! L6 X) g# b5 ~ - .ENDM
* @" L8 B! O" a( g/ Q% G0 Q9 } R8 N - ' ?! w/ W" b4 X1 E6 Y' f; K3 Q
- ;====================================================================================================- Z% h7 v2 T! m# E. z& Y
- MACRO_ACK_IRQ .MACRO
4 @1 h9 s) z/ y! g - STA MAPPER_REG_IRQ_DISABLE
, @2 `; d' q% C - STA MAPPER_REG_IRQ_ENABLE: ]/ d) o W$ o K" Y
- .ENDM
) W: `9 O. c) L3 }( F: ` - 9 R+ k4 m7 t3 e! {# a* {6 L
- ;====================================================================================================( X+ {6 j/ T+ ?' O9 W" d
- MACRO_IRQ_OPERATE .MACRO
, h' i' V3 W' ?0 y3 I
; D; z$ a+ m* b6 `: x5 b- ;==================================================
/ C8 ]7 k" N. V1 N8 A/ \8 a - ;IRQ滚动模式常量2 D* h" x: j1 b* U
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
3 ~+ I5 D# P" E/ x2 w - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动; z% S7 \2 j' `4 m, y( D
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
$ T" v, q8 l- i3 s# \) [1 L- o - . v" C5 r( h' @6 K, @% m
- ;IRQ扫描线数据
4 z( Z i: n: P$ ^ - IRQ_Scanline_Data
1 r/ y# t5 t0 ?) M+ ] - .DB IRQ_SCANLINE_1; ~6 q& C) j# ]6 L
- .DB IRQ_SCANLINE_2
8 Q% {! N4 H, V& y; E0 x - .DB IRQ_SCANLINE_3 s5 C. Y! b# @8 V/ y1 H
- .DW 00 ;关闭IRQ" ?, f; I2 a! k: F) o f+ a# t
- 1 D0 q0 A+ f! w4 y2 t& l
- ;IRQ滚动控制模式
% P5 n1 ?4 o$ u& ]# x7 m - IRQ_Scanline_Mode
9 U0 S4 {# V: x# k; G- w+ K& ] - .DB IRQ_SCROLL_MODE_RIGHT
y# ?+ O+ u: s& W8 d2 P - .DB IRQ_SCROLL_MODE_LEFT/ K' q2 v [- c; w0 t
- .DB IRQ_SCROLL_MODE_RIGHT
8 g* c5 M5 S3 k2 a) o8 t9 I( X0 {1 O4 p/ S - .DB IRQ_SCROLL_MODE_LEFT/ I' f1 q' H2 U/ @1 Q, h
- 5 B2 i! W x' k" h4 p: M/ J) w
- ;==================================================
& x. f" T8 O# T# F - ;;IRQ滚动控制6 V4 k6 n6 i3 e* [: \# [: c5 H A
- IRQ_Set_Scroll: t, I" s: A3 C
- LDX IRQ_Process_Index
) B+ ?; D; @; d$ d - LDA IRQ_Scanline_Mode,X5 {+ x( _2 x% j& M' q- [
- CMP #IRQ_SCROLL_MODE_LEFT6 Y- |9 z6 w- O3 N4 Y4 @4 K1 p
- BEQ IRQ_Set_Scroll_Left
# Q5 J$ m/ p- q - CMP #IRQ_SCROLL_MODE_RIGHT# Z+ w2 B7 P: e
- BEQ IRQ_Set_Scroll_Right+ j0 u! c5 J( @* y+ D
- IRQ_Set_Scroll_Zero;不滚动. A* \& [' J; x6 G
- LDA #$00
1 l4 j$ l- h: o) c6 _ - STA PPU_SCROLL
: ?, s& s. q! z2 Y/ C! u - STA PPU_SCROLL) N5 v* Y+ A2 D5 D/ ~5 |& ?& b
- RTS8 [3 W8 g: {, V! x5 A0 O
- IRQ_Set_Scroll_Left;向左滚动6 X* c( z9 P0 o9 m
- LDA Scroll_H
6 S& d# K& f" K; O: C - STA PPU_SCROLL
( _2 E/ Z8 [. q; b: B. O/ V8 d+ u - STA PPU_SCROLL" R7 a8 ~% p; M" l; V% b6 l! z
- RTS; h C& ~* f) r
- IRQ_Set_Scroll_Right;向右滚动+ o' g @$ s1 }6 U) o' N
- LDA #$00
4 q3 M( [/ n1 y/ l9 u, w - SEC
, [; q$ D2 b6 i - SBC Scroll_H
! Q E/ [; Q7 ^$ B' i4 f$ J4 z - STA PPU_SCROLL g+ p0 N$ I3 g* c% z
- STA PPU_SCROLL2 k: |; f9 e' Y8 P6 B
- RTS
9 b; u4 S3 u; n( ]0 _8 P$ h; Z5 G - 4 M9 m2 i: J) k; n( Y! x7 a
- ;==================================================+ Z" x4 t- O+ k% n# I- K$ Y; i
- ;;IRQ滚动控制
^2 q8 Z7 |1 u" k - IRQ_Set_Ctrl
1 _6 K* q9 Q$ ]! x5 d - LDX IRQ_Process_Index
2 K" L( |# F: ~3 W$ f! E - LDA IRQ_Scanline_Data,X( v* {$ E9 m4 ` T$ s8 @7 \5 U
- BNE IRQ_Process_Latch, `3 q9 Q/ y7 R( `$ m- R
- IRQ_Process_Disable;禁用IRQ
, h. T. U; ]0 `6 d4 D+ c0 i - STA MAPPER_REG_IRQ_DISABLE& g1 x. s! m% G; d# O' ]
- STA IRQ_Process_Index/ f* ` K7 ^0 o* g& V
- RTS
, {$ N" E, u+ q - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
: k# H& ?! n F: X3 h - STA MAPPER_REG_IRQ_LATCH- A, }# f: W$ n
- INC IRQ_Process_Index
; F" x+ u z5 N/ ?1 j \$ E - RTS* | ]# e4 z: h& J6 A% }! `( z0 @
- 7 D* C0 P, v2 l R" F- R2 Z
- ;==================================================
% K" [ V$ n( x* l - ;IRQ处理
0 M7 L4 c9 h4 C3 w, E; _- j) i( F" ~ - IRQ_Process_By_Index5 X0 d5 I6 V1 ~( C
- JSR IRQ_Set_Scroll
- E: [; m7 y9 V) \ - JSR IRQ_Set_Ctrl- c C# ?) K/ d; }! _* Q
- IRQ_Process_End+ y8 N+ J/ q0 E' N2 K8 |
- RTS
& I4 F" F \! d - ' H; n2 v$ L8 W
- .ENDM5 O1 N6 I# |8 Z! m8 f6 A9 f# e9 _
- ; Z, C4 ~# K3 _3 W( q
复制代码 & o& Q5 s; p5 w& d" w
; P) k/ y7 k' z8 o$ r2 M- r
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|