|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 . [8 o9 Z) A) Y3 ^6 U
/ S* Z L+ k3 I本次IRQ研究了如下:7 s% L1 P/ O. T8 u7 D
VRC2&4(Mapper21,23,25)
! S; l4 E4 S5 ]" ^' o; jVRC3(Mapper73) A, @6 u; f" {3 m* l' ?3 W8 v
VRC6(Mapper24 & Mapper26)
7 W- E( D8 N# G- B* GVRC7(Mapper85)
, L9 r# E9 }( v9 r& T. `" CMMC3(Mapper4)
; c: X3 Q) e+ \* o1 D% C5 b hMMC4(Mapper10); ~! ?- W$ R# O1 E0 _ i$ }$ m
MMC5(Mapper5)
$ ]/ s7 |4 l$ s: T, I$ \( }- }8 RMapper18& N7 v x3 _+ K7 r6 X `" L5 U( D
Mapper64
; n2 I U% b5 @/ ]/ a3 W! B- z" KNamco163(Mapper19) O6 P6 E3 `9 C9 [( l
Sunsoft FME-7(Mapper69)3 e7 Z3 N- v" N U2 ~
4 v* C. g5 M$ C共计11种Mapper的IRQ操作使用例子
! [: N& @! |. t3 F+ r) P& H代码内有详细注释, 希望能帮助到感兴趣的人.0 g- k3 m9 F/ c! k0 r) F$ @" ]5 ~
1 H1 b) ?; C4 b% G0 o, V
  + s4 l/ Z- z1 C, b, e: W; V! {
" {$ J8 q7 T! P' dMapper代码主要逻辑(以MMC3为例):( Y* P2 M% r) m) L
0 [' s( |! W4 E% R3 F; e, p- ;==================================================" J O: d4 _! u9 I1 x
- ;Mapper号
# Q- Q( ~' y* n* x8 `+ f3 j - MAPPER_NUMBER = 04
1 I; G: j. e; M! F+ X$ ~' S# `# o" r - ;==================================================
/ f& w* B' W( @3 G - ;MMC3 (Mapper 4) 寄存器常量
& h' W2 J; v6 p - MAPPER_REG_BANK_CTRL = $80003 D1 [# ]$ z) A3 g6 i
- MAPPER_REG_BANK_DATA = $8001
, G" B$ @; g* J. v - MAPPER_REG_MIRRORING = $A0007 r. t4 z8 U" q; z$ `& g% e
- MAPPER_REG_PRG_RAM_PROTECT = $A001 \$ o" `+ o, L) F
- MAPPER_REG_IRQ_LATCH = $C000
) ~$ G9 q1 M: Y- j' w - MAPPER_REG_IRQ_RELOAD = $C001
; B/ n( k# j: E7 t2 J - MAPPER_REG_IRQ_DISABLE = $E000
9 F' H4 B" d6 b$ T - MAPPER_REG_IRQ_ENABLE = $E001
+ Z+ b9 W E/ N, b1 c" C - ;==================================================: x- u0 G' y ^
- IRQ_SCANLINE_BEGIN = 135& s' s* R/ d0 s5 \0 I
- IRQ_SCANLINE_1 = 8: R+ d- A/ V; g. b
- IRQ_SCANLINE_2 = 54- \5 K9 G" E' r$ K, J' w
- IRQ_SCANLINE_3 = 8
1 T' t; g7 b. K y9 S$ d/ x( n - ;==================================================
- H _# H7 w4 l. O - _! U' P; o! f/ K9 M4 W3 w: m" _
- ;====================================================================================================
7 v& Z0 h2 A8 z$ c: b0 J+ r - ;宏常量
6 W) c9 \# ]( m) Z [$ ^+ k - ;====================================================================================================
0 r+ k: E6 V4 J4 K3 X5 \- ~$ h. I
2 N; k) u+ C% J J' X7 n& r4 S- ;====================================================================================================
1 ]) X4 T% a4 Z+ ], f! O - MACRO_MAPPER_INIT .MACRO
# B; \- H! G. {4 N4 f5 k - ;禁用IRQ
! z* f: J) w1 i8 C! |/ B4 Y - STA MAPPER_REG_IRQ_DISABLE
2 B7 M( X5 d6 G2 \6 I3 J - 7 S) [: K0 @0 Q! m& p% i
- ;水平镜像' |$ d' U0 R' h. K7 F& p
- LDA #$01
, j2 ]" y. X& k0 R& W - STA MAPPER_REG_MIRRORING
, j$ y+ C4 | J/ t' L% L - 5 y) Y, A% C* s: ?0 n O9 Z
- ;初始化图形bank
. A& ]! d6 _5 z+ |7 b - LDX #$05; z5 `# k) q; O9 Q. N3 B
- .Init_Chr_Bank
; x$ d& `7 Q; U0 S. W% p - STX MAPPER_REG_BANK_CTRL1 o0 L, }9 X5 ^, c8 o! I
- LDA .ChrBankData,X/ ?; ~/ F/ r0 D; V
- STA MAPPER_REG_BANK_DATA; \0 n0 m1 w$ F4 V, W) p7 ^
- DEX6 L7 Z$ Q; ?/ f" l& B; R% [2 G3 b
- BPL .Init_Chr_Bank
/ e0 z o8 @) N - JMP .Init_Chr_Bank_End h1 B2 n" A# [5 f% V
- .ChrBankData
, [. O, ?: b! J9 d2 Z" M- V, A - .DB $00,$02,$04,$05,$06,$07) h1 V5 A s3 P4 V0 `1 A0 S* N
- .Init_Chr_Bank_End
% m, [; P% U$ J -
0 K& S. f' I) q' j6 W, B: B - ;启用SRAM' C5 G) |( A+ B3 j
- LDA #$80' `& v- n# Q+ B9 J+ Z" E7 ]
- STA MAPPER_REG_PRG_RAM_PROTECT G8 R7 ]. K y& Q
- .ENDM
. V+ s6 i3 Q0 |9 O F9 y
$ T) S! q0 Y: I g! W3 ]- ;====================================================================================================" ?/ w: k* n' e* [9 ~) s
- MACRO_MAPPER_SOUND_CLEAR .MACRO
4 |- N1 B1 M0 V - .ENDM
" f$ I' k% v {1 ]6 v( o -
: h3 @. Q" ?' F* v - ;====================================================================================================
/ x2 U5 f/ l2 y$ a% u# i - MACRO_SRAM_ENABLE .MACRO
0 G* X6 h" L/ b4 y5 r - LDA #$80
6 d# Y [2 B0 y' P5 M. ?" P: H# q - STA MAPPER_REG_PRG_RAM_PROTECT
2 i$ |" G$ `9 p9 H0 Y7 O1 B& g6 m# v) @ - .ENDM
+ |2 G8 _' C$ N; x& s% w - - _ y; Z5 }. l% T
- ;====================================================================================================$ j( `* I! z. ]0 \3 L/ \: }
- MACRO_SWITCH_BANK_8000_A .MACRO+ W+ G7 S6 ] j* M( |& }
- PHA
% u3 h* S9 P+ k$ h - LDA #$06$ s1 i4 A! w& I. S& u7 e0 l' E
- STA MAPPER_REG_BANK_CTRL
! `+ p1 h/ @/ g i, u - PLA8 u1 {, q/ G6 l d9 Z) ?
- STA MAPPER_REG_BANK_DATA+ |% Z ]6 {" w9 F3 D7 t- J- [* F
- .ENDM/ ~, F% X# q7 T
- 3 \' W7 e* T) ^6 n
- MACRO_SWITCH_BANK_A000_A .MACRO0 s; A9 O H* F! n( K# p) b
- PHA+ [1 Q. k0 m- h+ M9 _! y
- LDA #$07/ T" q) c, b0 F
- STA MAPPER_REG_BANK_CTRL0 \9 Q2 `, z# x5 W) X
- PLA1 m0 A+ _: ] C4 @3 N9 _9 g) G r
- STA MAPPER_REG_BANK_DATA
( t, ^/ \" r7 l/ [6 y - .ENDM
# \; E. x c1 X6 @4 P -
9 d# e$ |! Y9 \% Z - MACRO_SWITCH_BANK_C000_A .MACRO' n) p7 v, ]/ a' y$ e
- .ENDM. {7 x' a( q7 [5 _' t6 j3 f
h8 r: A) N. s& U$ h- MACRO_SWITCH_BANK_E000_A .MACRO
# N3 M |& U2 {* V4 B( a - .ENDM! ?$ a" x4 `$ u
- - R' i) ]$ o) b5 y6 G
- ;====================================================================================================
+ s3 R$ V9 c+ f8 p- M5 b, t3 Q - MACRO_TRIGGER_FIRST_IRQ .MACRO
* q* M# E' b# O! Y - LDA #IRQ_SCANLINE_BEGIN + 16 h4 C6 b% ^! ]7 i$ f8 x+ I
- STA MAPPER_REG_IRQ_LATCH$ y! K8 } Y" |3 I. k: ^
- STA MAPPER_REG_IRQ_RELOAD
+ o; t9 z3 y% o0 \# w H+ J- o - STA MAPPER_REG_IRQ_ENABLE% {! p: Z5 F0 q7 W& U
- CLI
, {5 ^+ h, g# x, V. r+ s6 A2 Y - .ENDM
# g# D% `# J% N" L5 J& n6 A+ W7 O, R - , k1 e2 W- k% k: U& u( F
- ;====================================================================================================
% ?+ {5 P; ~2 c/ z7 P - MACRO_ENABLE_IRQ .MACRO
2 j" O8 x% W) {% c9 y: n - STA MAPPER_REG_IRQ_ENABLE: f$ J* ~3 x, j( \+ S9 n2 X- y
- .ENDM& ~) B4 l% A: Z) J$ K" G; n% N7 Y
-
6 E/ f( O2 j0 V! _( x9 @+ L8 O - ;====================================================================================================$ o6 Y- L; U8 |, }* j- V) u4 `* g
- MACRO_DISABLE_IRQ .MACRO
9 l! ^) Z: F: J6 e8 u2 ]9 d - LDA #$00% w: y# ]' F+ F9 b( N7 I! H
- STA MAPPER_REG_IRQ_CTRL, A& r# t( i, R$ J1 p+ Z
- STA MAPPER_REG_IRQ_ACK
6 {3 A. y2 B6 x) s! S - .ENDM4 D9 M; l% }6 Y1 \, y
- - i+ u' g7 ?3 q! \8 O: t6 |
- ;====================================================================================================& a- R8 E1 d: ~2 ]. V* b4 n
- MACRO_ACK_IRQ .MACRO, i P4 M7 F' c5 ~. J0 n
- STA MAPPER_REG_IRQ_DISABLE% m7 L8 h* }" T7 D8 ]3 A
- STA MAPPER_REG_IRQ_ENABLE3 u% o( B6 a( f- A g
- .ENDM5 j: i( s# X' c( M( Y$ A
-
: ]/ E p, a( ]: x" z - ;====================================================================================================
* U% O* r/ Q3 d0 d8 D" I - MACRO_IRQ_OPERATE .MACRO% e& l: x2 X( n" j, d( [
- R8 t: { s; Q0 h: ]% o- ;==================================================
! _2 p" `! U6 x - ;IRQ滚动模式常量$ _9 g* y" e4 n, G7 X; {
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
+ B+ ?. S% k; h3 i( j0 O# r - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
6 W7 ^! {' u4 ^3 u+ h - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
U% G8 z5 H" _! ]& @0 H& Q - 2 ~: N5 \( v2 T& I
- ;IRQ扫描线数据
I- X3 l; H, T2 Z - IRQ_Scanline_Data- d# j) I3 R% d+ ?
- .DB IRQ_SCANLINE_1
: l! T2 w- R9 A e4 F+ O9 A" w - .DB IRQ_SCANLINE_2
) X% L: d4 A' k5 B - .DB IRQ_SCANLINE_3
# Q6 J/ c- J* n$ W" A+ C. z - .DW 00 ;关闭IRQ$ M9 \0 n& {( j+ x' H
- : t7 H. d0 f5 C' V! L
- ;IRQ滚动控制模式: ?: u" H& q6 L+ @9 L, G2 s
- IRQ_Scanline_Mode
- `' D, n7 G; o1 U# R - .DB IRQ_SCROLL_MODE_RIGHT1 r/ T+ x& K5 s' S# r
- .DB IRQ_SCROLL_MODE_LEFT
) r6 L: s' R4 a% D/ R/ d/ z - .DB IRQ_SCROLL_MODE_RIGHT
. o5 [; \8 _1 q: e3 v% m2 U - .DB IRQ_SCROLL_MODE_LEFT4 f% T, O( Y, N: y$ Y, n$ Y. f- v; z
- ) K6 O) V1 S# h8 y! R! s, s1 g/ {: P' y
- ;==================================================6 q3 _ {; @* R
- ;;IRQ滚动控制( O5 Y/ B4 ^$ Q v3 e
- IRQ_Set_Scroll0 ?1 ]- q' V1 X1 x$ x
- LDX IRQ_Process_Index* I* ], j) r v& n0 X
- LDA IRQ_Scanline_Mode,X
2 s5 X0 J+ _/ J - CMP #IRQ_SCROLL_MODE_LEFT; g" V" h. u: k0 L
- BEQ IRQ_Set_Scroll_Left; @ ?. ]+ l5 W! d& w* f
- CMP #IRQ_SCROLL_MODE_RIGHT
) O- D0 b$ C, E( L W - BEQ IRQ_Set_Scroll_Right
& ~. j5 ]3 Q' b- B - IRQ_Set_Scroll_Zero;不滚动+ Q- c6 q) D# S! o1 l4 T
- LDA #$00
: f& D1 ?( j7 r% l: g) _ - STA PPU_SCROLL
% L# Y2 I8 e" c9 a3 a& `, ~* Q, R% N - STA PPU_SCROLL
0 {. A8 Q" B+ a- _2 c - RTS
( g2 O5 ]' R/ p$ H - IRQ_Set_Scroll_Left;向左滚动
' B e- r+ _) Q - LDA Scroll_H6 j( {) d' T/ J* z
- STA PPU_SCROLL! K5 F; j1 n ^9 N6 t8 Z& p
- STA PPU_SCROLL9 \. p* u% a& E9 ^9 a1 s* R
- RTS4 q7 a5 n) R# J# h, _- k+ l! y8 o
- IRQ_Set_Scroll_Right;向右滚动
- O# ]9 W$ V( X& A: m) B - LDA #$00) O" l) r4 v& \9 K+ I
- SEC
?7 u/ N$ ^& f - SBC Scroll_H: r* }$ ]8 O/ V: j- Q1 O, p# B. m3 ]
- STA PPU_SCROLL! S) r! N6 b" g) O( n U, b
- STA PPU_SCROLL
3 l& R9 l9 D4 ~' `6 w- D - RTS
) M- g1 I+ J3 q3 {3 O5 P - / ~. }# f+ ?+ }
- ;==================================================: g4 Z' G( Q; m8 `4 L1 }# `
- ;;IRQ滚动控制. b3 N& Y6 e& P+ N* ~' z1 k' N
- IRQ_Set_Ctrl
( I! v' N+ N1 n - LDX IRQ_Process_Index
$ O9 T+ U; L- p. F - LDA IRQ_Scanline_Data,X
5 _2 |: x7 E4 \3 o8 q/ m* n8 @ - BNE IRQ_Process_Latch
( {5 `* s3 {- ~6 f: j5 b H- d - IRQ_Process_Disable;禁用IRQ
6 d9 T& U3 P' j5 a5 v: Y# @8 n( m - STA MAPPER_REG_IRQ_DISABLE% Y- p( [' ~: `' V R0 |* K
- STA IRQ_Process_Index
- s7 S5 u% W" ?- j3 T" P: i0 S4 ? - RTS' K q2 L6 a @
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线; g- v. L! E' M5 p
- STA MAPPER_REG_IRQ_LATCH; z2 K3 F0 V3 O
- INC IRQ_Process_Index' P- C6 N+ |$ N) [
- RTS' |6 a' H1 F5 ~# M w
- & X9 H j: a9 W
- ;==================================================
0 _ B. n# @6 W _$ p - ;IRQ处理
( P4 A2 M1 @* P - IRQ_Process_By_Index
, [% M$ x* t# g; t& G: Z. i# O! M - JSR IRQ_Set_Scroll
7 C6 A8 G5 ^ Z1 g - JSR IRQ_Set_Ctrl& k3 I: O; K k! T
- IRQ_Process_End
3 Y' S+ q, U0 T- ?0 [; z9 w& a - RTS" r4 C- k) N1 l$ R7 D' X7 o
-
+ a6 d2 Y$ Y/ e( [% \# o. F - .ENDM* o) a4 b% P0 s5 c) s
-
+ D) Q7 n, F8 B
复制代码
! @! M" E o0 ?. P }. ~
2 u$ q2 _7 [ }( Y# O7 w. s9 S代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|