|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 3 v9 r8 r# E- V( }6 [
" y, {$ l! B$ h; e6 {本次IRQ研究了如下:$ r6 D3 [. }" L$ d
VRC2&4(Mapper21,23,25)4 q# y; C/ ?) L/ a) o- x
VRC3(Mapper73). a" L4 U3 n; k0 a
VRC6(Mapper24 & Mapper26)3 b) r7 B4 J# Y8 W o- x7 g. k
VRC7(Mapper85)3 w& M: Z* d$ Q. B' ^3 h3 S# K; W
MMC3(Mapper4)
" I! v$ d- y4 c' t3 [1 q# W# }MMC4(Mapper10)3 X1 K# B: q% {, C4 C, Z
MMC5(Mapper5)6 R R0 E2 H% z# v
Mapper18$ N$ ], z/ r# G( j7 E
Mapper64
, I; e. F8 {! l, INamco163(Mapper19)
1 X2 j6 X5 Q+ {, bSunsoft FME-7(Mapper69)8 ?2 J5 j. I1 m# n
( p) [$ y8 q4 _共计11种Mapper的IRQ操作使用例子# v9 N5 G$ b, Y$ Y: h2 @: J1 E
代码内有详细注释, 希望能帮助到感兴趣的人.$ c0 m4 ?# Q6 {. \
! S2 i) f: r0 f7 K% v
  
4 }9 i1 y! V! Y8 h% y: d: H& ?
" S/ x1 }4 s% X& j7 t/ ? G; [* FMapper代码主要逻辑(以MMC3为例):4 J+ Y8 A! G1 Q9 p2 w; p
- 3 S; _! U! T1 J1 A- b2 V- D
- ;==================================================/ L: v) b! y) b, w
- ;Mapper号
5 J/ R' g# ~9 J8 I, y3 d - MAPPER_NUMBER = 04
5 d" A6 }3 m+ z3 R* C3 u3 o# ], u - ;==================================================
. g0 t- n2 N( u4 N, X, e. N - ;MMC3 (Mapper 4) 寄存器常量" I W# L# L! N
- MAPPER_REG_BANK_CTRL = $8000% J7 w. \! X( V M' K. C1 m
- MAPPER_REG_BANK_DATA = $8001
0 B; R# r4 U0 V2 E( i( A* A* \1 } - MAPPER_REG_MIRRORING = $A0000 m' L- j( _" G2 Q# ~$ Q9 }# M7 x$ G
- MAPPER_REG_PRG_RAM_PROTECT = $A001 j9 j7 v! u" v) F) c
- MAPPER_REG_IRQ_LATCH = $C000
1 v0 p7 }. b0 m Y" Z- o+ { - MAPPER_REG_IRQ_RELOAD = $C001
' Q4 @: \# a( O* F# s8 T4 A- ^. \ - MAPPER_REG_IRQ_DISABLE = $E000
: x% Q' d& s1 E( i - MAPPER_REG_IRQ_ENABLE = $E0014 W3 v' i: e( ?( V: V
- ;==================================================$ V, {4 I% e3 ~ Z( n9 m+ H8 E; n: N& D
- IRQ_SCANLINE_BEGIN = 135
1 x: Y# A- v4 @ n6 c - IRQ_SCANLINE_1 = 85 D4 P9 ~) S" }0 H& s% t! N, H, d4 {; Z
- IRQ_SCANLINE_2 = 546 d" w; A$ e) g
- IRQ_SCANLINE_3 = 80 ~% z, A5 @3 K7 Y
- ;==================================================
3 v* e2 a2 }# y! q7 w - 5 S# ~% X d* P7 L/ ~8 B8 J# j
- ;====================================================================================================
X. _% \ L/ D- W, f1 G: U- ~& e - ;宏常量
" T! M. E& B2 ]( u) ^: {# b5 H @8 T - ;====================================================================================================
y A- c8 V* | j
. C; S) h0 w" p" x% {% A$ W- ;====================================================================================================+ K9 ^& G' Y5 G4 X* U: o
- MACRO_MAPPER_INIT .MACRO
2 m* b2 q1 T6 h/ W1 } - ;禁用IRQ% n! ]1 v0 R, g% G6 `3 |( C' @0 m; g
- STA MAPPER_REG_IRQ_DISABLE _8 j8 ?- {5 h! b
- $ k/ y, P( A6 w) G& e, J/ U
- ;水平镜像) e& K( s$ l, y* U
- LDA #$01
9 Q8 F* P$ V6 [/ T R) w% w - STA MAPPER_REG_MIRRORING1 m9 h0 D* ~% w S: ?
- " }2 p: c* K6 M% d7 o
- ;初始化图形bank: j) v6 b. a! s9 a; V: t
- LDX #$05
$ F$ p$ [2 s4 h5 b - .Init_Chr_Bank
: v+ X8 t4 m/ s( d - STX MAPPER_REG_BANK_CTRL5 s; f2 K$ B- R! m0 p* l `
- LDA .ChrBankData,X
d8 P0 |, S7 p- G8 n. N( s; R - STA MAPPER_REG_BANK_DATA1 ^9 g- ` m5 [, ~5 ^" N7 b
- DEX! Y; S; q* V$ U1 X
- BPL .Init_Chr_Bank+ Q* {6 d1 o6 q# G+ p, ~ A
- JMP .Init_Chr_Bank_End D( i- W* _ i' B
- .ChrBankData
. Q1 l N' D. |) ~2 G% }- \ - .DB $00,$02,$04,$05,$06,$07# A4 R7 F" o7 E9 \* m" N
- .Init_Chr_Bank_End
/ O4 q) u5 [ H, C - 6 S4 A% {1 P" b* h6 |
- ;启用SRAM1 e; H. i7 H$ s2 p) O; e" ^
- LDA #$80& _" o$ T* O2 N
- STA MAPPER_REG_PRG_RAM_PROTECT
6 U0 k+ |3 ?/ V$ `. N( m - .ENDM
: n( J( t5 I, E$ c: z - ( c( F% H7 d( I* f# h
- ;====================================================================================================; x- q6 \( r% n; d! z0 n8 Q
- MACRO_MAPPER_SOUND_CLEAR .MACRO
- l" @' [: L: m* T6 v2 k$ A% z - .ENDM) d d! g* V. C4 y0 `2 z
- ( N/ f3 u; V! d% N7 \; z
- ;====================================================================================================
- i m6 u/ B+ Q/ p l - MACRO_SRAM_ENABLE .MACRO+ R# P8 ~, i% J' D/ P8 v
- LDA #$80
S/ }% Y. w. V1 g - STA MAPPER_REG_PRG_RAM_PROTECT
* g/ _9 k/ k9 P' K, B, V | - .ENDM& d! y& `, ^) D* z1 _
- 3 y8 q: v2 P9 d) E8 y
- ;====================================================================================================* ?" K2 |) T2 e5 A/ v' |0 I; n4 D
- MACRO_SWITCH_BANK_8000_A .MACRO N( Q" x4 a! N
- PHA
0 |" u: q2 O2 k Q* Q9 L) K - LDA #$06: _, @+ {% G$ B6 X/ y$ F
- STA MAPPER_REG_BANK_CTRL- M) J- @) l- ]6 ]$ w- E
- PLA
2 j5 E7 L0 B u - STA MAPPER_REG_BANK_DATA
; ^7 J1 F1 l' a& X& V4 v - .ENDM
6 t* I/ S. o! y w3 o - * I+ K# a8 W4 u4 C3 l; X
- MACRO_SWITCH_BANK_A000_A .MACRO
3 B# F' h2 i: g" L3 @ - PHA
3 ^+ d: h9 l X& d - LDA #$07% @/ K/ v, R0 Y1 _' _8 x; B3 L
- STA MAPPER_REG_BANK_CTRL
8 N L+ c) f$ |( V+ y: o - PLA
( l5 c0 ]' I& E+ g - STA MAPPER_REG_BANK_DATA
. @1 W( i3 s# M0 X" k4 N - .ENDM" [/ z5 _8 s) {: F* R5 C9 {
- - M& r6 b3 |/ h Q: s8 E
- MACRO_SWITCH_BANK_C000_A .MACRO/ K" t) H( I3 N* i& L. |* }, _
- .ENDM. c1 M6 I+ d7 E3 k, _8 h" [
- ; f. F0 E( m- x9 S1 q! j
- MACRO_SWITCH_BANK_E000_A .MACRO# }3 [/ p! x+ I% \% n6 Z% r
- .ENDM
7 g: B5 r5 u2 ^- J/ r7 ^) z# y
9 m4 I1 Z" @4 T! i- ;====================================================================================================2 l) V Z( n9 K, v0 O4 i) f+ M
- MACRO_TRIGGER_FIRST_IRQ .MACRO
1 ^1 t) a0 w# }/ n! G7 ?. g9 v - LDA #IRQ_SCANLINE_BEGIN + 1
$ T2 i- A( R$ ]$ W" w7 E/ o* { - STA MAPPER_REG_IRQ_LATCH% p; n/ N5 n0 R) z% r d9 o
- STA MAPPER_REG_IRQ_RELOAD
: b( X4 L9 J" p, s8 } - STA MAPPER_REG_IRQ_ENABLE+ a8 g) i: t1 Q
- CLI
/ V' ]4 p( z) z; j& L0 m - .ENDM+ u u* b. q; L
- 1 |+ C- L0 k+ [6 q9 o% ?( J
- ;====================================================================================================
: R/ u# T0 |& u, H* ] - MACRO_ENABLE_IRQ .MACRO
6 k3 r! y) s0 s1 T3 M! x. b9 T - STA MAPPER_REG_IRQ_ENABLE
& W' V# m: [1 x9 C6 _9 C8 X: X9 W! `1 b - .ENDM5 W; q- s- B$ I3 ?+ m
- , i$ s3 I: ~! S
- ;====================================================================================================. r5 |1 R: ?; [# p# u
- MACRO_DISABLE_IRQ .MACRO4 p t* ]4 J$ T u, d) e
- LDA #$00
4 [" G. I6 @" ~2 {# K$ j - STA MAPPER_REG_IRQ_CTRL8 M: `/ a3 t$ Z+ j& I
- STA MAPPER_REG_IRQ_ACK
& k9 o$ b5 V8 m/ x7 h3 g - .ENDM
0 V, E' n6 }3 E7 n+ z. T -
4 U" p& a1 ]+ a4 U+ ?) r/ T - ;====================================================================================================/ ]3 q( f; w7 d( r" N4 ~$ O
- MACRO_ACK_IRQ .MACRO% `+ Z) r& m w6 {. A1 V
- STA MAPPER_REG_IRQ_DISABLE! C* E; X) Z- Q
- STA MAPPER_REG_IRQ_ENABLE
: l* L+ O; Q& U& Q0 J* Q6 ] b - .ENDM4 T& _$ z! J" X) C
-
2 ^) L* s$ [5 Z! @- F - ;====================================================================================================1 I9 J( ]$ x$ W2 I
- MACRO_IRQ_OPERATE .MACRO
I6 D' t8 r9 @$ b1 V
3 K, J( {2 Q3 u, t$ n+ w- ;==================================================
, `* P# E+ S/ b* u* X - ;IRQ滚动模式常量5 {7 c4 n; E+ _/ b, V4 J
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
; @2 k* p0 T# o2 t' S - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
' N, g6 k% `, `6 J' J2 E$ J - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
1 L- \+ k: ~5 W# ?* O( @ - . u; f d6 _6 h! o4 N- k8 F5 w+ f
- ;IRQ扫描线数据" U+ U7 k/ X+ x1 V
- IRQ_Scanline_Data( {; l# M- ^: O9 n
- .DB IRQ_SCANLINE_11 _8 u0 l4 Z9 T" H* m* p3 Q
- .DB IRQ_SCANLINE_24 S1 V5 X0 ]9 P9 N! ^( z
- .DB IRQ_SCANLINE_30 U+ }" I6 G: n! U* M$ K9 r t3 ^
- .DW 00 ;关闭IRQ* G3 i# o5 M S5 |
+ l4 k' n9 M& O0 T- ;IRQ滚动控制模式1 N3 f. `- Q/ K# F
- IRQ_Scanline_Mode
3 I( d7 _2 I( a - .DB IRQ_SCROLL_MODE_RIGHT1 n4 R) \0 ~7 f0 x8 m
- .DB IRQ_SCROLL_MODE_LEFT
( `! a+ f: g4 L, f* L - .DB IRQ_SCROLL_MODE_RIGHT L0 q2 a2 n6 L3 h4 N. z a+ P
- .DB IRQ_SCROLL_MODE_LEFT
( ^" C! V6 d$ n1 l" b - + j/ V2 L/ ~1 `, {* T/ u
- ;==================================================
+ d1 [$ [5 |8 Z; C - ;;IRQ滚动控制
9 a: b; F: G2 k+ a# b8 `4 S, M - IRQ_Set_Scroll
" ?$ W" G/ ^7 a! M# G" ]% m - LDX IRQ_Process_Index
, @: B* D( Z1 c9 A8 U% I - LDA IRQ_Scanline_Mode,X
9 K- ?# P% F# o c9 U& G5 [0 B - CMP #IRQ_SCROLL_MODE_LEFT
; V: {! c0 u% O1 @' w - BEQ IRQ_Set_Scroll_Left
3 B! D+ ]1 b8 R" R - CMP #IRQ_SCROLL_MODE_RIGHT
# N+ ~5 B g( z! p& p# L - BEQ IRQ_Set_Scroll_Right
5 A% M0 c" |2 n* X8 q2 C$ a - IRQ_Set_Scroll_Zero;不滚动8 `3 J/ z- J5 c) ~( x0 a( t, @" Q
- LDA #$00/ `- n- J: T) \2 U3 `% H. n
- STA PPU_SCROLL3 T9 ^) E: @* Y
- STA PPU_SCROLL1 a. K% V$ e& a) o) m- o$ x
- RTS7 t8 }& D5 q, k6 e
- IRQ_Set_Scroll_Left;向左滚动
0 K; c- e* l$ B+ {0 F W" Q - LDA Scroll_H
. z0 r- K+ S g* g( }% q - STA PPU_SCROLL
5 [9 `. i+ {. j+ g/ s - STA PPU_SCROLL, B8 f* c) D f6 r( T
- RTS
* j6 j) ?3 \5 r3 m- J - IRQ_Set_Scroll_Right;向右滚动
/ N Q0 W0 l2 i. {8 N* @2 s9 M3 G5 b8 Z - LDA #$00: L/ s: |4 P4 Z/ {
- SEC _+ x& ?6 ?3 ]0 f/ I* U; F! r
- SBC Scroll_H3 F) l j; w4 k9 F7 \7 h6 j) [
- STA PPU_SCROLL$ h$ m2 Z* [. ?/ \
- STA PPU_SCROLL
! e5 R8 M# Y& M; \- ^( N: G - RTS
8 v* G5 m0 j9 k, m - / m! \3 C' k( ~' U* i+ Q* T4 D
- ;==================================================2 N; M$ k x# G8 j
- ;;IRQ滚动控制8 Y7 V% M" x4 a1 [4 H) e
- IRQ_Set_Ctrl
: d/ [! W: Q* I' S' l - LDX IRQ_Process_Index1 Y/ [% L$ z$ F0 z* P: d
- LDA IRQ_Scanline_Data,X
" L8 ]. g8 _9 _0 D0 ^( z2 n2 s - BNE IRQ_Process_Latch* h2 R! s, l( C) H
- IRQ_Process_Disable;禁用IRQ+ T; B# N# Y; d' }/ T# K, M2 K
- STA MAPPER_REG_IRQ_DISABLE9 t" b. w( H4 B6 e3 u5 U1 D ^
- STA IRQ_Process_Index
/ r6 m. F, c" M$ B - RTS% ^! \# H) O0 p k8 W4 w
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线% P8 n! K/ ]3 G: o2 s
- STA MAPPER_REG_IRQ_LATCH/ [2 B& k0 D2 K3 J0 g/ e+ A
- INC IRQ_Process_Index
5 O* R- L* W% O' w% V2 a, F - RTS$ N9 _0 w. b+ \ Q: c- I0 _: W5 T, ~
- E: Y: T& a; i- \# |- ;==================================================
4 ^ P& ?. K# X" l% Q" d" q* q, Z - ;IRQ处理
) d, _( ]8 a- w" x0 Z8 s8 g& } - IRQ_Process_By_Index
7 _6 g- D& j3 q6 S% x# R& ~; S - JSR IRQ_Set_Scroll
. K$ T& K9 B! [! F1 z! {' J$ l - JSR IRQ_Set_Ctrl
$ o3 ]4 k4 F& Q% F' Q) d+ P - IRQ_Process_End7 R" P+ ~/ k1 n$ P1 N6 z
- RTS! _# g8 q, d# A, A9 S& W
-
# u A9 j2 u, T. o0 S6 U - .ENDM
; z$ @0 V* z8 H -
) z( S( Z# W6 X! B- f0 j
复制代码 ( s4 X+ _, E, l) j5 `; |3 K
}2 \( n2 }* k/ W4 A/ f代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|