|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
! l# ?+ I; a$ `2 Q# d2 u, L& F: D6 B& v O: T) q1 i; s: {1 v$ X8 v
本次IRQ研究了如下:6 N) n2 o; E1 x3 J+ `
VRC2&4(Mapper21,23,25)9 y3 Q" \% g t1 V3 _, L! B
VRC3(Mapper73)
2 Q& k: ^/ _; }$ \9 HVRC6(Mapper24 & Mapper26). V) {5 C* q/ [
VRC7(Mapper85)
! t% d# l/ ~- j' J6 Q/ v3 |6 w# jMMC3(Mapper4)
/ ^- F/ g- d% |' k0 MMMC4(Mapper10)7 C/ f! p2 D5 J8 _
MMC5(Mapper5)
}. s6 }+ E5 N& |/ HMapper18
" g& p* \% q' [( _, Z4 K" ~Mapper64
# N" V6 n. w8 FNamco163(Mapper19)
, K. ?& U8 Q* _$ }Sunsoft FME-7(Mapper69)* J( v* h% e* m3 u
: A3 D: l0 N; [6 Q5 b. `4 |! }
共计11种Mapper的IRQ操作使用例子
* d3 {) E7 w8 l) U代码内有详细注释, 希望能帮助到感兴趣的人.
9 k, l" l, d+ i/ F$ u, N1 p2 g* H8 C3 X4 q" o$ _
  : E3 e+ S4 K+ _7 l0 \
! {9 R! d8 E: v1 z3 t& V6 ?
Mapper代码主要逻辑(以MMC3为例):' V' B% |. V v, o
- ; W( w; r; ?! p( ?
- ;==================================================1 ]6 M2 H/ n) q, r% i/ e
- ;Mapper号
! L* X. R+ _& P5 G5 w- p+ M - MAPPER_NUMBER = 04% m) }( s! v( m0 ~, e5 r/ h
- ;==================================================
5 b7 k3 U, v- U" n2 W, m - ;MMC3 (Mapper 4) 寄存器常量8 V; T2 S( s3 G4 [
- MAPPER_REG_BANK_CTRL = $8000* R2 P Q) j( N b2 t( o
- MAPPER_REG_BANK_DATA = $8001* Y3 p$ s! e# e) k2 B
- MAPPER_REG_MIRRORING = $A000! b4 Q8 d) l8 i, l9 M2 u; t
- MAPPER_REG_PRG_RAM_PROTECT = $A001
6 U. B b" ?1 ]5 f2 L; f - MAPPER_REG_IRQ_LATCH = $C000
3 q+ N7 T, n- `' h/ R - MAPPER_REG_IRQ_RELOAD = $C001! R$ m, x: F4 o/ ~+ j- h# s7 F/ v
- MAPPER_REG_IRQ_DISABLE = $E000
$ [, W1 h' }+ p5 x: D1 e: f - MAPPER_REG_IRQ_ENABLE = $E001
$ c; a( I3 Y, B: Q$ A' a - ;==================================================% ]& e5 B _" v+ D
- IRQ_SCANLINE_BEGIN = 135
& T$ H) x, F3 L9 A - IRQ_SCANLINE_1 = 8, i4 h& u& T" M# Q& Z0 q, x: t
- IRQ_SCANLINE_2 = 54
3 p9 o9 [% _6 b4 }/ h$ a5 L" u - IRQ_SCANLINE_3 = 83 ]! P. D, p' v( r
- ;==================================================
, g* r! Q% K1 w1 Z - V6 u, D% Z! O5 N) O4 n
- ;====================================================================================================! W4 e& `' l: b: o }
- ;宏常量
9 O0 v- h! w! f2 ]9 F9 A/ k& ~ - ;====================================================================================================4 g2 {" g3 t# P
/ d" j( T/ j/ w% F- ;====================================================================================================
" I/ F1 L' G2 a8 C* o) n! p) G - MACRO_MAPPER_INIT .MACRO
+ K/ C, |: n+ h0 d - ;禁用IRQ
: v6 K3 {' i4 v' a: b7 D/ V - STA MAPPER_REG_IRQ_DISABLE
% Y. Z- n3 [: ?/ P, L -
6 U0 S k/ R0 x5 h5 f: o" T - ;水平镜像
& @+ n& T; M7 I* \' w9 L - LDA #$01
5 |* D/ }4 `0 z. O+ a# v5 |" J2 B - STA MAPPER_REG_MIRRORING h( ?$ r& H! ]4 _6 m! |
- 2 a8 p; n) z# F& f3 u/ N
- ;初始化图形bank
5 v" S0 a u( n; `( \5 n0 Y! g. ^+ ~ - LDX #$05! S7 m) }2 c1 c$ ~6 L
- .Init_Chr_Bank! j' |; R$ q& H( V) S- Z
- STX MAPPER_REG_BANK_CTRL
/ c5 |2 {% {* I8 L8 n - LDA .ChrBankData,X$ Z/ ?9 k5 S W: J3 q
- STA MAPPER_REG_BANK_DATA
$ g4 l; \: L1 a3 o! e - DEX
, o) p$ b% z/ L9 J1 h - BPL .Init_Chr_Bank
2 ]: O, _' R y4 e6 v# ^( T - JMP .Init_Chr_Bank_End) z$ s& k8 W; g9 R9 z
- .ChrBankData
4 Q) z* U0 i, T( L; b( Y+ g' U* d* P - .DB $00,$02,$04,$05,$06,$07
# V6 D) N1 m7 L, u4 V. d- Q - .Init_Chr_Bank_End1 m ^9 ^9 K: X( d7 K- Z
-
2 j% Z$ M% z" R& c& G8 w& \ - ;启用SRAM$ l4 @& b S9 n& H& K
- LDA #$80
/ M: n" F9 R, \) ~; V' Y; g! y4 a% W - STA MAPPER_REG_PRG_RAM_PROTECT. A& s1 [# x. ]& Z' L0 x% v
- .ENDM
' o" N% P; N2 s2 d$ S - : E" l; Z' H5 _
- ;====================================================================================================+ U/ m- C: C' C1 S- y$ ~
- MACRO_MAPPER_SOUND_CLEAR .MACRO
n) v3 H% B: ~) r - .ENDM4 p" N$ b, y( x7 ]
- C6 o7 e/ a5 Z3 K& Y
- ;====================================================================================================
; ~/ Y: N8 @! H - MACRO_SRAM_ENABLE .MACRO
+ F1 w/ B* C, N+ i* n1 _. U - LDA #$80
) \. j/ p& w: a; t - STA MAPPER_REG_PRG_RAM_PROTECT
* } [$ N; L4 M- v - .ENDM
; ^' d. h( ~' m' ~* j- [ -
, l) H8 }: w2 o' _; { - ;====================================================================================================
4 V- F8 x d" k( i7 I |9 w9 w0 `9 j - MACRO_SWITCH_BANK_8000_A .MACRO8 J; b" s# [# h: G) R. K( l _4 C2 T
- PHA
7 j2 F# s8 @4 ]$ {: i - LDA #$06
7 ~+ V9 g E# A8 a. m - STA MAPPER_REG_BANK_CTRL
5 t% L8 X- l8 q - PLA) Y9 e& ~4 H9 i7 J! Q+ R
- STA MAPPER_REG_BANK_DATA
6 @- |$ N8 b4 { D' ]- L3 z - .ENDM
6 U# L# a/ j' c6 v: O, Y
& {2 R/ A0 h2 c: l( B+ Q& z- MACRO_SWITCH_BANK_A000_A .MACRO
5 t. j1 z7 ]& s) F2 G$ a - PHA
8 W5 X, e8 Y7 v; ` - LDA #$07' P% \8 M8 I) W6 \ n# W& J) n/ `
- STA MAPPER_REG_BANK_CTRL
7 q6 |! T V! p0 A0 \: ^( ~, u3 y - PLA& B2 g1 ` o2 m* t* j) M* E- l
- STA MAPPER_REG_BANK_DATA3 d" X% S* \9 `. f7 l1 m8 M
- .ENDM
- B. z k/ K! u2 X - + d" ~- w" O s6 f- e
- MACRO_SWITCH_BANK_C000_A .MACRO
& _+ l# J5 c9 H0 y# R; B - .ENDM
5 s' h$ r: T. m) I1 q
+ l4 E9 D \ r- MACRO_SWITCH_BANK_E000_A .MACRO
& c7 {4 u1 k. M' C. p - .ENDM9 I- }8 R' Q8 `, W8 B, P3 y. U
- , f* V( j! O1 t- h- i, G& \
- ;====================================================================================================8 m4 [* D/ o- O* z4 y E7 C' a
- MACRO_TRIGGER_FIRST_IRQ .MACRO1 E' z; E3 C# W2 ]
- LDA #IRQ_SCANLINE_BEGIN + 1+ G$ ~ n9 J C, n5 j
- STA MAPPER_REG_IRQ_LATCH) {/ e% J9 @% x4 U$ \5 B9 [
- STA MAPPER_REG_IRQ_RELOAD
Z) D: |- r: i& e) g6 ]" ?* _ - STA MAPPER_REG_IRQ_ENABLE
) b2 C1 {$ C) j5 @) p - CLI6 A" H& {7 z3 q0 i( ?, Y
- .ENDM
% K6 H: S/ g5 Y! ~7 s; S5 Y - 3 _4 j8 M- I3 Q: V% X% j
- ;====================================================================================================
. _: N+ P+ B5 _& {6 F' ] - MACRO_ENABLE_IRQ .MACRO8 G% R. i" N4 i1 Z- S
- STA MAPPER_REG_IRQ_ENABLE
# z8 ]1 C" w9 G7 \ - .ENDM
* f4 Z! j- o7 {3 }/ H& m) G/ q* G - 0 z! A- Z; M& P. H
- ;====================================================================================================( `' x( F# }8 n* C. G0 J/ `
- MACRO_DISABLE_IRQ .MACRO
- Y- ` U$ ]* X, t - LDA #$00. Y# f8 n4 N0 J* m$ F% L
- STA MAPPER_REG_IRQ_CTRL' q! F" \0 K" _, `+ e
- STA MAPPER_REG_IRQ_ACK; ~- x0 Y/ l' _; A( X$ B$ v% n
- .ENDM
: `, [9 {4 `: I -
! H. l9 ~0 W* _' D6 c* H, S ~ - ;====================================================================================================
5 v: ^ z8 T' h2 u$ R - MACRO_ACK_IRQ .MACRO$ n# W& P) l6 H5 j% B1 o
- STA MAPPER_REG_IRQ_DISABLE4 [3 c% w# g# m4 x* w1 \% i
- STA MAPPER_REG_IRQ_ENABLE- u# j6 P) I9 _# j) j" b$ }/ D
- .ENDM
& I6 w1 }1 x% t. n - 5 b3 C( r$ G% g
- ;====================================================================================================1 k+ u( W0 L. G
- MACRO_IRQ_OPERATE .MACRO! f- z( D& f) ]6 r. p" o
- 9 m9 z" B0 u% P. m
- ;==================================================
$ {1 h7 L9 m: ^: j - ;IRQ滚动模式常量
; i1 p3 B1 x/ f - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
% n0 G% L3 s& g \: r8 @ - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动: r1 Q$ X& S7 D7 d
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动. P9 b" U4 @0 X( ^2 k! \, T
- , t4 m0 d5 D" K8 Y* x
- ;IRQ扫描线数据% \9 D1 ~; h1 {; i
- IRQ_Scanline_Data
1 }6 E. Y- t# c# r; \9 p5 I - .DB IRQ_SCANLINE_15 a, n6 ^6 ~& z9 v- d$ e
- .DB IRQ_SCANLINE_2
" w& Y( `& ^1 {1 e - .DB IRQ_SCANLINE_31 B4 W( t( y' z
- .DW 00 ;关闭IRQ/ H$ J) a. y6 N; N' m+ b' [" S: Z
- 8 o+ j+ m$ V( ?4 U- p" t8 D
- ;IRQ滚动控制模式9 y/ c7 \5 f& n8 a- Y/ j1 L" p
- IRQ_Scanline_Mode; h/ \& g* _4 T" I5 @2 A
- .DB IRQ_SCROLL_MODE_RIGHT
( |3 L2 t. W7 T5 G" z f, Z - .DB IRQ_SCROLL_MODE_LEFT2 E: {- U# b3 t. K3 ~
- .DB IRQ_SCROLL_MODE_RIGHT
' @/ | q: n1 O$ o% Z: `; M$ G - .DB IRQ_SCROLL_MODE_LEFT
! x1 ^( \2 |2 [9 {; X7 h7 f; Q
2 V1 F: n8 N# J* v D; A0 p- ;==================================================$ f% n# e' v( y3 h
- ;;IRQ滚动控制$ V( k! W( S( x% y
- IRQ_Set_Scroll+ x( \% q5 l$ r0 F. Y8 \" f
- LDX IRQ_Process_Index" y4 q3 |2 [5 w: ?2 K$ J% o
- LDA IRQ_Scanline_Mode,X% q1 }! }2 W" X( `+ u
- CMP #IRQ_SCROLL_MODE_LEFT1 i4 L( v6 h& t, i4 e
- BEQ IRQ_Set_Scroll_Left
* l& X* U. M Y8 X+ a; W - CMP #IRQ_SCROLL_MODE_RIGHT9 K: B. ~6 x2 R C
- BEQ IRQ_Set_Scroll_Right3 f0 M: _+ J1 z3 ^! X
- IRQ_Set_Scroll_Zero;不滚动: z' t! P+ k5 E" u0 t
- LDA #$00
* Q. N9 ^5 k( E3 R# d+ w - STA PPU_SCROLL
* o9 j( j- p6 Z; T, e - STA PPU_SCROLL" k3 E# N4 ?/ O7 l: Y; f
- RTS
, W9 i0 e# b! C6 a. }; a - IRQ_Set_Scroll_Left;向左滚动: _2 Z: h+ c4 U
- LDA Scroll_H* n) K3 o+ z9 \) N
- STA PPU_SCROLL
: q/ `' n- k$ F6 r - STA PPU_SCROLL( }# P' r/ n. h% ]
- RTS
4 T: E2 Z+ Q4 w! b: \4 e - IRQ_Set_Scroll_Right;向右滚动
6 x4 h( r7 O# k9 O0 O$ M - LDA #$00
: J* d2 [+ \: Q - SEC2 f$ _+ e% X9 V* O: S
- SBC Scroll_H
( G3 s& d3 {: l: c - STA PPU_SCROLL
0 t8 Y3 M& l7 }3 _ - STA PPU_SCROLL* K' D2 `! Z) |5 L
- RTS- a% A. }! R9 X
- * m6 z" |+ z' Y. k. Z
- ;==================================================5 z8 b0 S- L: r; c: m( q
- ;;IRQ滚动控制! o4 o! x5 X! D u. D% H1 A
- IRQ_Set_Ctrl
& Y! f# K Z4 c/ { - LDX IRQ_Process_Index
$ J0 C/ r9 k3 [% }1 A! D( X - LDA IRQ_Scanline_Data,X
+ M% W# g$ D/ |4 r3 @1 P - BNE IRQ_Process_Latch% G( Z$ a" ~7 |9 _4 t
- IRQ_Process_Disable;禁用IRQ
$ G7 r7 q; Q" W, Z! @: M - STA MAPPER_REG_IRQ_DISABLE
- ^- ?. I* N! m: ` - STA IRQ_Process_Index
% w% d7 g+ E, l - RTS$ R% T. | s* j0 x) M; W
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线) Y) F) B# S0 T' y6 K! z# D4 d
- STA MAPPER_REG_IRQ_LATCH) \' W1 \& @1 L. w- D3 [
- INC IRQ_Process_Index8 q- ]3 F, o# P
- RTS
$ ^1 a% u3 D. K+ ]
5 c- G! q6 K& w- ;==================================================
8 F1 ?2 W* M, R - ;IRQ处理
% U$ X; H- _9 a7 V. R4 x9 o2 p1 h - IRQ_Process_By_Index. Z6 Z5 I5 U: |! l$ O3 h$ |/ `' Z
- JSR IRQ_Set_Scroll
0 q" e& S7 Z8 F6 z; `) w5 q3 o - JSR IRQ_Set_Ctrl
6 y6 n" D6 b6 N1 [$ @: N. S - IRQ_Process_End: }2 e$ [/ }7 A# t% T8 F
- RTS1 `- e. H9 W$ |0 S& Z2 L
-
7 B5 B! E3 f6 o- U3 P b - .ENDM! z) |1 u; d" V& @5 o4 S/ _$ U
- 7 g* B0 M. n0 d% h7 n& q
复制代码 : T7 F$ K$ @7 b& t
2 M6 i# b# m+ T3 Y5 B9 I" L; r0 O# }代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|