|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 % t( v, a! v# n+ [, |
1 T9 ?6 \* S& G% M0 D& T( h
本次IRQ研究了如下:
: j/ m5 l9 |& bVRC2&4(Mapper21,23,25)& {% h5 T* `. a9 o
VRC3(Mapper73)% `* R# m: N3 f
VRC6(Mapper24 & Mapper26)& n$ u$ P, T$ f2 A5 d: s2 e
VRC7(Mapper85)1 U5 T- j! L) u: P i1 i
MMC3(Mapper4)
G1 Z2 k2 z9 kMMC4(Mapper10)+ A, e2 X( e) s# }
MMC5(Mapper5)
3 ^1 y$ P" \4 r( vMapper18, b5 B/ U. ~( Y: \
Mapper64
+ X& X8 p4 c" oNamco163(Mapper19)" ^; G: C7 F% e5 ^/ Q! l
Sunsoft FME-7(Mapper69)5 m: W' m! |/ U1 H: D: x( f8 q
6 R; B. C0 y, p2 Z" V共计11种Mapper的IRQ操作使用例子( u& p4 {( k+ `. x( p5 X- M
代码内有详细注释, 希望能帮助到感兴趣的人.
e9 I4 O) g2 c- S
6 ^" E( h* R; u- \3 e! u  
4 F" x% U4 m' S- o7 s# Z2 A4 f! o1 B
' \7 ^$ j0 Q+ @! e3 K' nMapper代码主要逻辑(以MMC3为例):" g+ f5 M/ P* e, G: K: f6 i+ `# i
& f% g! y! h( L9 [% j- ;==================================================. [9 N" W; d! s; H4 D
- ;Mapper号
% f6 v* O, O% B, m* O' G- g - MAPPER_NUMBER = 04& ^6 v r0 e* m; y
- ;==================================================
4 n' s* I V/ H% e6 x" u- i - ;MMC3 (Mapper 4) 寄存器常量
8 T* U4 n. F- n* d, O+ q6 l) Q - MAPPER_REG_BANK_CTRL = $8000
) |+ e Q0 f0 _' m1 m) S5 d! `# N9 x - MAPPER_REG_BANK_DATA = $8001
9 e3 m! m1 E* ^& Y - MAPPER_REG_MIRRORING = $A000+ D# `% s* X: N: H
- MAPPER_REG_PRG_RAM_PROTECT = $A001
) @" S- O0 X) K) @% } - MAPPER_REG_IRQ_LATCH = $C0009 ]* n. f9 Z" n, q
- MAPPER_REG_IRQ_RELOAD = $C001" W. E& @% R! N3 ~; `9 y$ }& V, J4 D/ G
- MAPPER_REG_IRQ_DISABLE = $E000, N: y8 j0 x3 F. z' z
- MAPPER_REG_IRQ_ENABLE = $E001
7 a/ k* X; `9 G+ q - ;==================================================; w+ @8 b- B+ @& x
- IRQ_SCANLINE_BEGIN = 135
, b( _( o1 z- f* ^2 k- ], d2 C9 B7 E - IRQ_SCANLINE_1 = 8
) {. l. P% r* l! y2 A7 \ - IRQ_SCANLINE_2 = 54+ t. T9 H' W/ t
- IRQ_SCANLINE_3 = 8" y! ~9 ~( Z: s3 ?5 C- j
- ;==================================================
& V; V. X2 o; b# @ - - g) Q& ~ A* r2 L! z0 h
- ;====================================================================================================1 C+ M, L' {# Q$ R
- ;宏常量
& |7 O h @- G, R( A/ _; x3 h - ;====================================================================================================' X- K# S7 K* h# l2 L6 o9 d! @8 J/ N
7 h3 N% b6 [6 f. x5 f& @6 c1 e- ;====================================================================================================
' j& ]# B1 L# { - MACRO_MAPPER_INIT .MACRO# p0 j% ?6 a5 H' M' S
- ;禁用IRQ
$ o& g1 f+ n# A8 S$ P - STA MAPPER_REG_IRQ_DISABLE0 t- v9 m# j7 b& n* s
-
( v. {" e% @9 [/ _: } - ;水平镜像
( |: F4 ?+ O; G5 C - LDA #$01
) ]4 v- w: J6 F0 ]5 N1 o' b* d - STA MAPPER_REG_MIRRORING
* X, C! ~9 B9 o+ I0 J$ ?6 \% x - - M. L" F7 k9 T$ Z& w
- ;初始化图形bank
% f4 b: `5 X8 A+ ?. `. X/ K: w - LDX #$05& j' l Z0 P) \3 {
- .Init_Chr_Bank5 i5 e, T: M$ c9 j* \" t9 v/ T F8 V
- STX MAPPER_REG_BANK_CTRL1 `: |5 ?2 P2 A6 j$ P" `- V
- LDA .ChrBankData,X5 {+ a) ^( ], j% u- W" w
- STA MAPPER_REG_BANK_DATA
( f0 Y3 H% r4 |4 G: [9 i+ k - DEX; Q! e/ g, K* E g- x/ W# I1 A) p
- BPL .Init_Chr_Bank
# ~) R7 g) V/ f2 Q6 f8 t - JMP .Init_Chr_Bank_End: ^0 m+ x7 i: D8 L/ L+ Y. [
- .ChrBankData: ]0 y( n7 z5 N
- .DB $00,$02,$04,$05,$06,$07
$ Z# h8 T! G3 N4 p: A" p t - .Init_Chr_Bank_End% V% g) @/ B M/ ^: r6 Y
- 1 q( }- w' ~$ U4 N( z+ p8 u6 V0 |1 x
- ;启用SRAM1 S: Q6 n3 e; }) x8 q
- LDA #$80
$ r& G/ X1 H0 \' D% v; a, c9 p - STA MAPPER_REG_PRG_RAM_PROTECT
7 {( M1 v3 [% i& n( l/ { - .ENDM
# W+ N; g7 I1 i! H6 ~! @7 f - & _8 f6 q0 U7 n1 x' V9 s
- ;====================================================================================================" a$ w- I5 H; d8 ]7 \9 ~8 n4 Z g
- MACRO_MAPPER_SOUND_CLEAR .MACRO/ W$ F) B! h, R0 z5 v* p, n
- .ENDM
$ M- v7 g, T# ?2 y3 I! w1 S8 r - / W/ M Z+ o/ C( O) z) E% [7 D
- ;====================================================================================================, q0 f& W, W" L
- MACRO_SRAM_ENABLE .MACRO
" N1 i( _1 n1 e% X7 y6 X - LDA #$805 p- q; F9 ^5 z# w* f% s
- STA MAPPER_REG_PRG_RAM_PROTECT
) v/ J7 _1 q9 U- \& [ - .ENDM2 s( _! n0 l Q6 \$ ` i. H
-
. y3 s5 ]! H0 Q* I! {7 ? - ;====================================================================================================2 `- Q( i) ]+ s* t1 K' w- ?
- MACRO_SWITCH_BANK_8000_A .MACRO
% A8 o: a9 N9 J: Z3 l8 o8 e6 d1 \ - PHA
9 }0 m) l6 Z9 q7 D - LDA #$06
7 F/ o' R" \# z) f7 ^/ K - STA MAPPER_REG_BANK_CTRL
- k2 F: ^9 g) r2 |6 I1 R - PLA
$ w, ]5 u' q: u( a* O - STA MAPPER_REG_BANK_DATA
& {5 ~+ j4 |( N6 T7 B0 H7 p; x - .ENDM i5 J* u3 q, x J6 M' [
! `5 _5 p6 ]- c* t0 K& U- MACRO_SWITCH_BANK_A000_A .MACRO
4 f; m" k- I* j - PHA
" r; {/ O) A5 \" H. r. @ - LDA #$07
) ?& |: t% x2 [1 F - STA MAPPER_REG_BANK_CTRL4 ]8 t5 b# ] g
- PLA, q$ |: p- }/ V
- STA MAPPER_REG_BANK_DATA/ s# K9 N7 u; M9 r" U$ N
- .ENDM
& D, [) j- V$ @8 {; Y: Z -
_7 |2 v$ ?, ?8 o9 _3 ~9 N - MACRO_SWITCH_BANK_C000_A .MACRO
8 w2 o7 r* z2 s, G$ d& K, B - .ENDM* c4 F3 }( P. ?- Y- c+ l% v& @1 w
( i, L; D: G2 c6 p- MACRO_SWITCH_BANK_E000_A .MACRO: G! H: W- G6 @) P
- .ENDM) `8 l- s5 C9 w+ h) s4 q
- ; V) ^/ |/ M9 n; |# S4 B6 E) f
- ;====================================================================================================2 {, [# ?$ t8 _
- MACRO_TRIGGER_FIRST_IRQ .MACRO0 [# i& G* A0 Y
- LDA #IRQ_SCANLINE_BEGIN + 11 j, e$ O2 g( D8 z1 I* |2 |1 c
- STA MAPPER_REG_IRQ_LATCH
7 V; X! y1 D; E - STA MAPPER_REG_IRQ_RELOAD
9 J# ^. T% x1 w) [) T8 i$ I( K - STA MAPPER_REG_IRQ_ENABLE
: s9 w* \. l2 {% w) u0 M - CLI$ i9 D( V8 z" x. V
- .ENDM
* L& j3 ]5 |8 n) a$ N4 Z# u% T: d - 6 v2 f" p& ]9 r1 }( F
- ;====================================================================================================3 D7 M; u* S" C5 L3 W3 _
- MACRO_ENABLE_IRQ .MACRO
+ ~# f; p6 Q+ k F - STA MAPPER_REG_IRQ_ENABLE# C. l/ @ _, v
- .ENDM/ T$ A4 v1 I l+ L1 t# j- ^
- * c- X2 N Z3 b: @* D/ Z
- ;====================================================================================================
5 @8 [2 t% `; E7 w$ Y - MACRO_DISABLE_IRQ .MACRO
$ b4 f0 S. x8 _9 X6 s9 C3 ^ - LDA #$00
2 j- q$ A$ @' {: t9 i3 k3 V9 D) d. c - STA MAPPER_REG_IRQ_CTRL- q$ m6 h5 ]5 m4 r7 C1 a& @3 c
- STA MAPPER_REG_IRQ_ACK$ {7 ^2 T: Q1 q
- .ENDM
) @. |: k( |% r - % E! y& i* f8 s
- ;====================================================================================================0 s) U" t7 v; J9 f: p7 ]
- MACRO_ACK_IRQ .MACRO
; u* ]5 ]7 i% W5 n/ n - STA MAPPER_REG_IRQ_DISABLE
) _ D s! P8 X! p. }9 t) B# T - STA MAPPER_REG_IRQ_ENABLE8 i- Z' G3 W! M1 {3 V( x
- .ENDM
, `5 b+ Q$ w4 e7 V; x1 B9 c - $ G8 I' n( N2 n: @
- ;====================================================================================================: i5 F% J0 |% n& ^% x- M% d
- MACRO_IRQ_OPERATE .MACRO
- y/ ^' R L; N$ d4 f C( M( o
, a/ I% ]: B2 |7 Q( q1 r8 B- ;==================================================
5 y* D' i" |& b4 ^) Q0 w - ;IRQ滚动模式常量
5 e9 c3 m/ G' w" ~% C5 a - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
& e! r' \# b' ~) \6 z3 e - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动 a* b, c# k1 A2 V8 o
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动: P1 G8 X9 J6 X5 e% g; }
- ( s" u5 w% t( Y6 u" `$ M
- ;IRQ扫描线数据9 L5 S. @' I# I; D
- IRQ_Scanline_Data0 b9 |& b& |4 E8 q6 t
- .DB IRQ_SCANLINE_1
0 V8 A0 C: b1 T. Q7 \ - .DB IRQ_SCANLINE_2
8 e- G$ C/ b) x - .DB IRQ_SCANLINE_3
6 a* ]; E2 K5 b/ m1 ] - .DW 00 ;关闭IRQ0 C E# q8 t' W* H
7 m. b7 b. L& ^- ;IRQ滚动控制模式
8 z$ o) ?* U& T E. i! [ - IRQ_Scanline_Mode
- r3 ^0 ^: U: l# k+ w - .DB IRQ_SCROLL_MODE_RIGHT2 g! ^! T8 @8 b6 g4 K0 n
- .DB IRQ_SCROLL_MODE_LEFT
& A" r; l# x1 J9 I" `- a1 _ - .DB IRQ_SCROLL_MODE_RIGHT! T5 [# Y) Y+ c2 E
- .DB IRQ_SCROLL_MODE_LEFT
( \8 r \; Q3 @! \
; Y! g7 g# q! i+ p' z- ;==================================================1 j# l8 J9 u5 A9 p& V+ u
- ;;IRQ滚动控制' y% t# l4 }4 o6 T
- IRQ_Set_Scroll6 Z% H; w! y, p8 m) `2 g9 V
- LDX IRQ_Process_Index! B# k* b' [) ^' p
- LDA IRQ_Scanline_Mode,X
; c5 q1 W9 c7 y, b( h - CMP #IRQ_SCROLL_MODE_LEFT; o: _$ b+ M& u& D3 J+ ]# s
- BEQ IRQ_Set_Scroll_Left& G! f2 D) Z P* I
- CMP #IRQ_SCROLL_MODE_RIGHT: R3 k/ M( H! f3 x! t: p
- BEQ IRQ_Set_Scroll_Right: J/ \% e5 t7 W7 Q! n! x
- IRQ_Set_Scroll_Zero;不滚动% I+ H$ F! S' t
- LDA #$00
4 F) r" P4 G- J - STA PPU_SCROLL
- K M' ?1 p: X. C9 }4 h3 `0 c - STA PPU_SCROLL
3 P d4 F6 z' e! [+ ^3 G - RTS
3 U7 p) g+ b' n. E& j( W. O+ c$ ~; D - IRQ_Set_Scroll_Left;向左滚动$ G" m8 W* h; u, |1 n3 K$ Y+ U
- LDA Scroll_H
& O% X0 I# ?1 U6 [) y5 X - STA PPU_SCROLL
( I4 Z! X2 K' v" P: H - STA PPU_SCROLL
# u( k5 x; v) }& T6 q2 x - RTS* d8 k! `& U. S$ m
- IRQ_Set_Scroll_Right;向右滚动
) l8 }5 V% R1 Y5 h# ]) ? - LDA #$00
3 i5 a- q1 h' i9 H( a1 \, l4 I - SEC- L) P- p+ W3 \6 D
- SBC Scroll_H5 t9 I! I5 e1 v( }% ]' j8 P
- STA PPU_SCROLL
9 j8 O$ Y9 e& d- s - STA PPU_SCROLL
c. W2 w0 b9 c. {4 r% { - RTS7 G- p2 h! Q; `9 f
-
9 c( \) N* a$ L6 C4 S - ;==================================================7 `; F* t+ x N! p1 Q
- ;;IRQ滚动控制
+ k$ G8 q6 L2 ^- k3 l/ B - IRQ_Set_Ctrl3 d, O* G' t9 o: ?: f+ @1 z
- LDX IRQ_Process_Index: l5 f5 m+ z r; d: J* \7 h3 I
- LDA IRQ_Scanline_Data,X
. U2 O( s& v# R - BNE IRQ_Process_Latch
& }9 `+ V- ^" i# p! [- ^+ J8 L9 d - IRQ_Process_Disable;禁用IRQ% M& x3 o1 N+ @
- STA MAPPER_REG_IRQ_DISABLE
0 E# G4 O5 w9 @ g% |; K - STA IRQ_Process_Index6 R2 A2 G- R( F! L" h7 K
- RTS
6 K% P$ s3 A9 a, J - IRQ_Process_Latch;设置下次 IRQ 触发扫描线( G: Y/ G* `' K3 P) w1 v5 |" b
- STA MAPPER_REG_IRQ_LATCH3 Q' i/ u0 I4 ]
- INC IRQ_Process_Index" g5 c+ V# i7 N; p
- RTS
7 ?8 L Q/ M9 {' j% O
' C+ Z! \) K+ n- ;==================================================
+ u. @. D, {0 A# n6 } - ;IRQ处理3 A+ m( c6 J) R$ y
- IRQ_Process_By_Index% ~ E, O# `( v J, |2 a2 Z
- JSR IRQ_Set_Scroll
' s7 t6 i9 g2 p1 W6 } - JSR IRQ_Set_Ctrl$ Y/ z' ~* B6 q4 o2 d2 S
- IRQ_Process_End/ B6 V- f' P) t& a4 y4 G7 h
- RTS
' M! `; I$ M, c& o -
% ~ }/ C$ C5 S+ ^( H - .ENDM
& w2 q9 z3 h. |& O$ z- f -
. R( |$ a1 c+ \: ?' c: V4 ~% m. S4 \
复制代码 / j y0 S$ w# V4 z- @
: [/ p- f" N7 p9 `2 W$ p' {; B a. J代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|