|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 9 F: r0 Q) @: T9 N& `$ u
& r- O l% u" D/ Y4 i1 R% Q. S本次IRQ研究了如下:& F, S# E& E4 n! m# [7 R4 M
VRC2&4(Mapper21,23,25)3 \( ^; @! g2 y* ^7 i3 M5 G
VRC3(Mapper73)7 C% F! V) U9 I @: ~4 H
VRC6(Mapper24 & Mapper26)
v* R/ M1 ]) HVRC7(Mapper85)
% o/ P+ C- Y [# s7 T" R' C/ tMMC3(Mapper4)* q1 o" S; m2 [
MMC4(Mapper10)
* ^' L9 e0 a' `# G% qMMC5(Mapper5)
" H m6 z9 Y: } G& PMapper18
2 e" N/ W7 h$ c) @Mapper64
; q* @2 y9 m9 S3 kNamco163(Mapper19)
0 O: M" y7 ]+ [9 ?0 y/ i6 sSunsoft FME-7(Mapper69)* h+ A# F3 f) Z+ x0 f7 p
) S+ p' n. y0 I5 U b
共计11种Mapper的IRQ操作使用例子
$ I' v: S/ f' w1 N" ~& l& x代码内有详细注释, 希望能帮助到感兴趣的人.5 K: E! G- |5 `6 A
. x y8 R/ k/ h" _
  
: m q! ]) j$ H
O# ^& v+ h; P: W! J9 iMapper代码主要逻辑(以MMC3为例):
( `' z" ~8 ^$ O. z! j% N0 s- + s; {) s+ l' K1 V! k& b2 Z
- ;==================================================
, h# @, o& q7 v - ;Mapper号
4 c8 H3 x( F) c; s0 }& Z - MAPPER_NUMBER = 047 |2 G$ ^/ `. C* I/ u5 |+ s
- ;==================================================
0 @# p) @7 ]1 c+ }# w; ^ - ;MMC3 (Mapper 4) 寄存器常量
$ h, ?/ C( o3 e J6 x: i3 a" ]7 Y# ? - MAPPER_REG_BANK_CTRL = $8000
- a/ }+ e/ K7 z, `1 B/ C2 | - MAPPER_REG_BANK_DATA = $8001
2 d/ B0 J, R/ t4 c" x2 j$ \0 R - MAPPER_REG_MIRRORING = $A000
' K0 p1 _+ W3 m/ j+ R" B - MAPPER_REG_PRG_RAM_PROTECT = $A001
& N$ v- y) R, a% d/ F+ P$ F* J# }8 q- T - MAPPER_REG_IRQ_LATCH = $C000
/ x, Y, Z$ G2 u2 V! a, c/ t( Z - MAPPER_REG_IRQ_RELOAD = $C001
7 z3 v O( }# k0 T) t! q+ Y - MAPPER_REG_IRQ_DISABLE = $E000" ]# [+ g, e0 R9 b! L2 U8 h4 V
- MAPPER_REG_IRQ_ENABLE = $E001% g: T# c5 U- o/ S- D( m! u8 l
- ;==================================================7 s$ w5 [1 ]8 Q' \* Q
- IRQ_SCANLINE_BEGIN = 135
0 |4 F' n9 w& a, N8 A& `( Y4 e5 I - IRQ_SCANLINE_1 = 80 U" G* N* `$ B+ I% O$ ~ o) b$ X
- IRQ_SCANLINE_2 = 540 d/ \8 P: |- {6 o
- IRQ_SCANLINE_3 = 8# s' f! A X0 u
- ;==================================================! x! p4 O$ o0 \& ^! }
p3 R' R: L# M( C- ;====================================================================================================/ T/ c) Y- l3 V/ T+ ]: P( J9 @0 n, B
- ;宏常量
4 c- X+ k/ N$ V! ?2 |( H' O - ;====================================================================================================/ D1 P; T' K1 F0 d
) I' \6 w7 X" w" o1 B8 S0 x- ;====================================================================================================2 S; Q5 c( S+ r- c1 [% ?4 G3 ~+ |& `
- MACRO_MAPPER_INIT .MACRO3 ^% W f4 w3 N/ _& N
- ;禁用IRQ' T' a6 v: x( i* `2 D
- STA MAPPER_REG_IRQ_DISABLE. q1 d. |0 n! O7 E9 J
- ) ~; z$ @- w& ?9 x; ~, a! m
- ;水平镜像7 t8 s4 p0 K7 d1 c$ A' m% m
- LDA #$01
, N0 s" ^& b3 P. X. y - STA MAPPER_REG_MIRRORING3 V- \2 Q1 O5 I$ I# l
- ( r0 \% h8 G9 S% S, b' F
- ;初始化图形bank! j9 a5 B5 ]0 {3 [! h
- LDX #$05
5 a. M% R& w3 Y0 }# ~ - .Init_Chr_Bank0 l- S# T6 |9 w. ]# V0 r- [' b
- STX MAPPER_REG_BANK_CTRL. u/ K5 m; s' A8 s* O- ?
- LDA .ChrBankData,X3 N# w6 W2 j: o# W2 b, e
- STA MAPPER_REG_BANK_DATA
7 B T+ [7 m8 V( x" Q - DEX
& T1 S$ k8 e6 ?# ^ - BPL .Init_Chr_Bank4 E w$ ]7 r8 o
- JMP .Init_Chr_Bank_End5 `; u' X" w3 h% s
- .ChrBankData
) M( e4 K7 j$ W4 v! x% B - .DB $00,$02,$04,$05,$06,$07, S6 X: N* M+ `+ ^. q. J/ k
- .Init_Chr_Bank_End0 ^' b+ z$ Y* Y* p; Q
-
. x8 b P3 G8 n% a" d - ;启用SRAM
2 d2 E, O. v; W% Y( h) Y3 { - LDA #$80
$ J6 H2 ~9 A: k" f1 f! E! r% C - STA MAPPER_REG_PRG_RAM_PROTECT9 A2 T4 J/ S4 u3 S: j
- .ENDM
9 f6 G- r! h( [ - % h0 ?: c) w' ^% |
- ;====================================================================================================+ J0 C- ]" l; G$ I+ E6 s2 Y
- MACRO_MAPPER_SOUND_CLEAR .MACRO
) n# `: ~- _; J/ ?4 D- P - .ENDM2 @0 s* Z- r+ H- A6 X8 y6 {# x, G$ u
-
' B. y0 S/ H, |7 H) ?4 t; E' H& } - ;====================================================================================================0 _; C' c1 b$ J6 i/ T$ x. }
- MACRO_SRAM_ENABLE .MACRO
' F" N/ L# i, c3 O - LDA #$80; {% {/ s! T0 p- l0 H
- STA MAPPER_REG_PRG_RAM_PROTECT
7 o6 g7 g7 a. v$ w" {6 s - .ENDM
# B" f/ F; ?& y7 D. K - $ t7 b* U% s4 |9 C0 P' B( \2 d0 J
- ;====================================================================================================! \( [8 [% e# Y
- MACRO_SWITCH_BANK_8000_A .MACRO
) f. N+ ~% ?$ F - PHA
1 n1 I( N9 z' F6 D - LDA #$06! c: O9 V" Y% Q' i4 `: H
- STA MAPPER_REG_BANK_CTRL
# E+ n$ J5 w4 E7 I0 f& | - PLA
3 ^* \4 g2 B% `% K" ] - STA MAPPER_REG_BANK_DATA
( {" z* t1 n" Q4 G8 J' E. E - .ENDM
! m6 O; z1 f1 g& g. g* p8 r+ g0 ^ - ( E9 \- o. v0 c" x9 H. K0 J- D; B
- MACRO_SWITCH_BANK_A000_A .MACRO8 o, j5 }1 B+ d! @
- PHA
( H( D, M" e- K! g) p2 f5 O* W - LDA #$07/ y+ C- m8 ?5 y* D+ t. Z( V. \% Z
- STA MAPPER_REG_BANK_CTRL6 C- O3 H' i$ U. B+ ^
- PLA1 @& t: X: u; }/ ?9 g
- STA MAPPER_REG_BANK_DATA2 l9 t" @: r! W
- .ENDM
5 X7 `$ C' a* F8 _' V9 p - # Y" O+ r+ I# j& | x6 x& l
- MACRO_SWITCH_BANK_C000_A .MACRO3 O/ d7 \+ {! C1 V" e7 t! f
- .ENDM, P$ ~# |& e) n/ ~; ?
- 8 k1 E" O- r, y* f- X
- MACRO_SWITCH_BANK_E000_A .MACRO
( v& f/ W. _. x% ^ - .ENDM
9 T r* k3 L+ k1 i
/ N$ k7 V5 O# k2 L, k( h& T* C- ;====================================================================================================
S# r8 x* Q5 ]' w - MACRO_TRIGGER_FIRST_IRQ .MACRO
4 v' C2 W5 p q+ v- P5 ` - LDA #IRQ_SCANLINE_BEGIN + 1/ I, \( b9 Y) L _6 V$ I
- STA MAPPER_REG_IRQ_LATCH
: _- O, X- J9 f+ q- ` - STA MAPPER_REG_IRQ_RELOAD
( Q# J& U/ T; Q2 }+ E1 A - STA MAPPER_REG_IRQ_ENABLE
3 O t" `7 c6 ] U5 {% t& G - CLI1 ~ X5 t/ B* C- i
- .ENDM
! X( y8 n; Y+ M2 d6 F: G: [, T -
, S5 b/ I, y9 h9 L - ;====================================================================================================# T0 E6 y, L8 i- U( @7 \/ l
- MACRO_ENABLE_IRQ .MACRO0 |6 N( Z3 x! `: Y: u- t- W% R
- STA MAPPER_REG_IRQ_ENABLE
! A& }2 a4 z. J - .ENDM0 B6 A# H# I2 X8 ~6 h3 e0 A9 @
- : ~0 I: h6 Y8 s4 C" r0 f
- ;====================================================================================================
1 _4 @7 A1 N! R6 K( o - MACRO_DISABLE_IRQ .MACRO
, R3 L, a- b2 \" }& A - LDA #$00
0 _& R& K1 t4 T9 S% u - STA MAPPER_REG_IRQ_CTRL/ b% m* l5 K' I0 r
- STA MAPPER_REG_IRQ_ACK$ n" c$ Z( @; o$ r0 n
- .ENDM" P- F9 p" q4 X4 `8 T# Z6 W
- ' R" M( j b: X9 m3 W& z$ ]
- ;====================================================================================================& `0 S0 c8 n0 ~
- MACRO_ACK_IRQ .MACRO
" q, e/ `, E9 E" l& @- e8 ? - STA MAPPER_REG_IRQ_DISABLE# @/ |' f ?7 m4 r( u5 x
- STA MAPPER_REG_IRQ_ENABLE
: s5 F, {$ m7 c: b - .ENDM4 b; e9 Y. L3 j( n. j; p
-
2 z/ }& |' ]) R/ s4 p8 q - ;====================================================================================================- M1 j0 U! r1 y: m1 ^2 D+ t
- MACRO_IRQ_OPERATE .MACRO) T1 h( f E: C: @, \ z c. V+ M6 W
- ' V1 u" M. _+ m9 ?
- ;==================================================( f- z2 O& X% T
- ;IRQ滚动模式常量
. g* |( D0 B+ ~3 ^ - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
4 z6 m3 G6 _4 P; w# }: f - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动. u- [# | X8 l7 k% ~- d( S. H
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动7 I$ Z. K) K# u- W0 i
- 8 Z- V/ j6 s& o% u
- ;IRQ扫描线数据
. R, v! C& x2 p# Q: W3 g - IRQ_Scanline_Data
" S7 Q( [# ~; A8 K6 g( p - .DB IRQ_SCANLINE_1
, c% @! z1 O2 o% C5 |; ? - .DB IRQ_SCANLINE_2* B5 r' l2 M; G5 N! `& p4 n9 ?9 m
- .DB IRQ_SCANLINE_3
6 _: |8 A3 _ U - .DW 00 ;关闭IRQ0 Z; y3 h; |, R) E2 m
- u5 d& S) j# j8 b4 K/ Q
- ;IRQ滚动控制模式
4 d1 A! R2 n: W) |( O# Y( ?2 M% c; | - IRQ_Scanline_Mode
/ [4 n4 u: f6 L/ U/ s - .DB IRQ_SCROLL_MODE_RIGHT
) h$ l1 O3 D$ p* k - .DB IRQ_SCROLL_MODE_LEFT
# z( W! s8 S4 h* c/ a - .DB IRQ_SCROLL_MODE_RIGHT1 ]0 u, Y! V& f
- .DB IRQ_SCROLL_MODE_LEFT
# ~3 K, N+ p: |. R9 r: d - : s1 M, X( {6 ]" C9 q
- ;==================================================
1 V/ x2 z# i) N( s - ;;IRQ滚动控制
$ C5 _0 U0 q7 m' P; y/ {" V+ ~ - IRQ_Set_Scroll
: f0 |7 h) F9 q9 { - LDX IRQ_Process_Index- f$ Q9 C2 G2 Y/ C
- LDA IRQ_Scanline_Mode,X
( A* T2 @& J6 _$ u* {, p) q. [, g b+ k - CMP #IRQ_SCROLL_MODE_LEFT- V+ p5 j" D2 H" n [. J
- BEQ IRQ_Set_Scroll_Left
: `, f5 A. S" L8 ? P' H - CMP #IRQ_SCROLL_MODE_RIGHT2 n2 p# O# @; F3 _
- BEQ IRQ_Set_Scroll_Right
- ~# W+ L6 ?' \( L% x n, u - IRQ_Set_Scroll_Zero;不滚动
: y7 x0 V7 g% ~1 y - LDA #$00; z! L" @" d% |/ T* y8 z
- STA PPU_SCROLL* i* J* e% G3 @6 y( `
- STA PPU_SCROLL
6 Z: U d0 O/ ? e5 Y3 t/ L# I - RTS
# E8 C* g) N8 K( r: d/ c! A: J - IRQ_Set_Scroll_Left;向左滚动
5 B/ n' A/ p; O - LDA Scroll_H. o! G" N0 f: e3 N7 N$ e
- STA PPU_SCROLL. v( j; q# }, @& v- Y
- STA PPU_SCROLL
. m. z3 y4 L* N- ?: F - RTS
1 ?. r3 \5 z9 _8 z6 t3 A - IRQ_Set_Scroll_Right;向右滚动
# b S( ?* i$ |$ u - LDA #$00
, L/ }5 C' s. \5 N& ?1 Z! @/ Y - SEC
0 M2 p* o: O! w& r3 | - SBC Scroll_H6 a# Q$ z& u" T# t0 r+ i
- STA PPU_SCROLL
$ R* t7 n" P( K, }& M# A8 M l - STA PPU_SCROLL
7 N# {9 z5 z, O8 W: P0 e# O - RTS" ^* E0 o6 i, J5 d6 C7 u
-
9 o" [ J: M# b+ h+ c - ;==================================================: E; o0 C# H2 U. |
- ;;IRQ滚动控制2 Q9 E5 y0 z! V4 A- S5 @7 O0 R
- IRQ_Set_Ctrl, Y5 m$ d0 x2 ?6 u
- LDX IRQ_Process_Index
; ~2 q! C3 J) C1 Q8 x6 F - LDA IRQ_Scanline_Data,X: ]. _; J' c H" G5 z+ S8 H3 [
- BNE IRQ_Process_Latch
4 X* R. T1 ?" S* Y+ [$ N - IRQ_Process_Disable;禁用IRQ0 r4 L1 U# Q" E: A
- STA MAPPER_REG_IRQ_DISABLE& G1 a9 Y1 @. t0 e9 ^
- STA IRQ_Process_Index
- e }' V J1 {# ~# w - RTS
5 `$ |6 R$ T% W# c5 @* v& y, O - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
0 T; l. C0 ^( u* l - STA MAPPER_REG_IRQ_LATCH; j w* U, x* k* l7 v9 A$ q$ m
- INC IRQ_Process_Index# W) D5 m0 G% I d6 B' f$ z
- RTS5 I) g! g7 ]; N E7 _! ]( x
) o9 x* y: S3 [$ {' V& l1 A- ;==================================================" M5 g" @ i' L* v- t
- ;IRQ处理! g: X( @' v% V) }* f* u
- IRQ_Process_By_Index& i' H' g, M2 V7 d( Z- G+ a
- JSR IRQ_Set_Scroll$ v/ f2 l: T, e* W4 v" K$ _8 M
- JSR IRQ_Set_Ctrl
) P& J* I- c( `) W. _$ P) o' u2 b$ L - IRQ_Process_End
; l% V6 e! y7 g9 s1 P3 ~$ Q8 ^ - RTS' m& S( W H# {# O+ @5 I0 [
- 9 i+ `5 w8 M4 `" i' G
- .ENDM1 w( [, Q9 I: H0 h; X" o5 @
- " h R: a6 d2 @) ^3 e) v
复制代码 % Y1 V; s1 I7 d
1 [- |- l7 v7 Z" \5 w C代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|