|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
5 Z3 {7 d V: X5 q5 d/ T4 S" A' l6 p6 Y# z1 e
本次IRQ研究了如下:3 M+ o; D- m4 \) O/ H
VRC2&4(Mapper21,23,25)2 s5 f3 Z$ D. P3 B c5 \ s" _
VRC3(Mapper73)
/ Y f7 {- Q, o7 s; [, W# t8 CVRC6(Mapper24 & Mapper26)
; c4 C9 X, q. \5 h' EVRC7(Mapper85)0 y I$ Y) H2 j& u
MMC3(Mapper4)# U% O1 w6 y, z% c" w
MMC4(Mapper10)
# }8 e! k Y- s" N2 z# I/ GMMC5(Mapper5)$ `: I8 h; C$ X# P/ `
Mapper18
/ k' M" Q# ]6 J2 f r: L9 a1 C8 t/ `Mapper64
, h2 h) J# a) V: L0 I" Q/ V I( NNamco163(Mapper19)- Z% t7 s' j; w. S( n
Sunsoft FME-7(Mapper69)
1 D) v, I$ t T( B0 L- |+ t5 I7 D+ N6 Y5 X
共计11种Mapper的IRQ操作使用例子. {) }, }/ u% V$ W
代码内有详细注释, 希望能帮助到感兴趣的人.
) q4 |0 V" p+ ~5 F0 f! S, F9 \2 J- n K
: L8 w. p# R4 g' x: b  * f* V% O. v! { j; Y
3 w: T j) g: {8 _( ]$ n% \
Mapper代码主要逻辑(以MMC3为例):
/ b2 Q% y- N' d9 G* U, N- - I8 J, {2 X# J1 L& @# ]9 [/ b) a1 I
- ;==================================================
q6 Q& y- u9 T( y8 A: f) r3 w( y - ;Mapper号+ O$ R6 Q2 ` S w& \9 U
- MAPPER_NUMBER = 044 H. ?( E% m8 n
- ;==================================================0 G7 s( i# k& X7 g$ z
- ;MMC3 (Mapper 4) 寄存器常量+ w* O' u! V' Q4 Z" r# p- Y
- MAPPER_REG_BANK_CTRL = $8000
9 x# p1 L0 U3 e+ I1 m/ r9 ^0 O& @ - MAPPER_REG_BANK_DATA = $8001" @; U# n6 L& h, x; s
- MAPPER_REG_MIRRORING = $A000
, X; b N9 W* P/ e4 _ - MAPPER_REG_PRG_RAM_PROTECT = $A0014 i9 z/ @3 \) d; ]3 L0 C: O+ Y
- MAPPER_REG_IRQ_LATCH = $C000
; ~" a, ^( \5 u. ]; G0 a - MAPPER_REG_IRQ_RELOAD = $C001( X& u5 F( w7 a# G& q& Q- q
- MAPPER_REG_IRQ_DISABLE = $E000
- Z, Z5 D4 z) Q9 r# n6 R - MAPPER_REG_IRQ_ENABLE = $E001
9 z2 N2 |5 ^: a3 W# N) J6 R - ;==================================================
. q% A+ D" @/ W" S - IRQ_SCANLINE_BEGIN = 135
: F5 g0 b6 K2 B% D) F/ Q0 o - IRQ_SCANLINE_1 = 87 C' Z, M/ H1 }5 @) H& D3 r
- IRQ_SCANLINE_2 = 54
* w; c7 m; l M) `$ X - IRQ_SCANLINE_3 = 8# t# O: f0 `3 g
- ;==================================================# b" g; \$ y, h" B
- 2 D3 k6 M) \5 i1 L# t- l/ l5 }! c
- ;====================================================================================================
' Q# _8 \% x+ w b( L$ O7 ?* \5 b - ;宏常量- ?7 K, I# {! N1 x5 w) d, x, h
- ;====================================================================================================
* O9 ^4 f' B) `+ B0 ]5 h - $ R# s! X% x, L. N
- ;====================================================================================================
5 j# } d5 V' X' a [. F5 T: P - MACRO_MAPPER_INIT .MACRO P* l! `& k' z7 j, ^/ ?6 ], w. d$ ?* }
- ;禁用IRQ$ `/ L- {1 C) u+ M' `9 \
- STA MAPPER_REG_IRQ_DISABLE
4 V) m" z7 L9 w1 c+ q2 b5 z: ~ - V6 Y6 P6 k; p7 V* V
- ;水平镜像6 e. l3 Y4 h* M; M
- LDA #$01
3 l, @$ [' a$ h- n( p - STA MAPPER_REG_MIRRORING
$ v; H* {% Z6 b( g6 h+ i# ~ - 2 @) f5 D% i: v9 \7 o7 t# _
- ;初始化图形bank/ [! _' v7 M K& m5 @2 u& d6 v+ p
- LDX #$05
1 h! b% D( K( s" S. F, t - .Init_Chr_Bank2 T: d# X7 p" w6 T! |
- STX MAPPER_REG_BANK_CTRL& K- w: J% l' k1 _# ~2 w! M5 q2 J
- LDA .ChrBankData,X6 E1 w$ k% K4 p2 Y, e
- STA MAPPER_REG_BANK_DATA
4 a: O( H6 k" \# P' U - DEX) n- U( x4 m4 P* v7 L8 x3 i9 |
- BPL .Init_Chr_Bank" Y t3 X; h' O/ d& Q' S, ?
- JMP .Init_Chr_Bank_End
6 [# ^9 R, T. C - .ChrBankData K. S1 n% _) G& p& ~# m4 ^
- .DB $00,$02,$04,$05,$06,$073 Y6 R( e; w9 p. f6 V& N
- .Init_Chr_Bank_End
9 @- f* m: p& y- E$ @4 t( O -
( W7 |& N7 W6 ~! Q$ }/ q, Y - ;启用SRAM
" N9 h7 x( }" ?+ r! z* a3 L - LDA #$803 P9 X6 I& Q! `% o( _7 M
- STA MAPPER_REG_PRG_RAM_PROTECT; `( g* Q% j' [) w
- .ENDM
$ @& @4 ]+ q1 w
( I* {; n- T; l1 N$ _4 u4 j- ;====================================================================================================! f5 L: ~+ |9 r
- MACRO_MAPPER_SOUND_CLEAR .MACRO+ x( V* X7 P" ?6 I3 j
- .ENDM$ o" N0 F2 Q. h( z H
-
) n; Y7 T) M' ?9 Q7 h - ;====================================================================================================( h i" } k. ^5 }3 x9 [( j% ~
- MACRO_SRAM_ENABLE .MACRO( V, m) ]5 g; I# |4 w
- LDA #$805 t. _! @& b% V+ N. r4 K5 {
- STA MAPPER_REG_PRG_RAM_PROTECT; j( B5 A6 ]3 k; I6 }: M2 r
- .ENDM0 b1 b: P1 o5 a# h
-
/ x9 |7 \, C5 r. z - ;====================================================================================================
4 x4 `6 u3 _# h! C' t" I1 K - MACRO_SWITCH_BANK_8000_A .MACRO
/ o7 P1 N3 V" D1 B4 ]" K - PHA
4 w8 S3 ?8 h* P1 d - LDA #$06
9 K( t. O9 A( b, b d. D - STA MAPPER_REG_BANK_CTRL
2 K3 u4 P. t4 Y+ a- J/ A ~ - PLA/ h. C5 N" A2 ?' Z7 N
- STA MAPPER_REG_BANK_DATA, G9 K- Q, O: _: j# l
- .ENDM# l9 X, |& J2 p- C8 q n* H
. {4 k" i! N5 e& [/ S# x3 _" T- MACRO_SWITCH_BANK_A000_A .MACRO
6 t0 v: \/ a7 Z. z$ ~ - PHA4 O. ^! w3 D" G# I
- LDA #$07
0 s' b/ g2 O! G - STA MAPPER_REG_BANK_CTRL
0 [/ q: H7 w. s2 u - PLA
* k. j; u: G+ E8 |3 @ - STA MAPPER_REG_BANK_DATA
: z& i6 o5 L) J' U! A - .ENDM
1 h$ O# U5 ?- m7 [2 g - # }5 I0 y+ W" ]0 i6 `+ g
- MACRO_SWITCH_BANK_C000_A .MACRO
, T* f! T# ~+ w- @ P - .ENDM# w* g$ v2 }, C$ l% n$ Z
* h1 X: s1 _% u# n9 k. z- MACRO_SWITCH_BANK_E000_A .MACRO
7 O+ N3 P5 `8 q6 g5 A - .ENDM1 q& Q' x6 s3 S3 q5 p3 g
0 Y( @9 f* T+ B- ;====================================================================================================
Q v1 ^) ~+ z2 n6 y2 c - MACRO_TRIGGER_FIRST_IRQ .MACRO3 [- T& S; X. c! g& ]
- LDA #IRQ_SCANLINE_BEGIN + 1
5 t3 O- A% E& t- L - STA MAPPER_REG_IRQ_LATCH
/ N+ j- ^8 O( K - STA MAPPER_REG_IRQ_RELOAD
4 I3 f2 Z6 g/ h1 R - STA MAPPER_REG_IRQ_ENABLE
4 y5 h2 w/ O5 B+ B9 r* J- z2 s - CLI4 X; E/ ?- x% r5 O ]! Q1 f; e
- .ENDM/ w/ \6 {1 R! e/ F$ u, h
-
0 S6 s3 u- ]4 B, F; b7 Y - ;====================================================================================================( P( t, {% V( n8 A
- MACRO_ENABLE_IRQ .MACRO4 Z) p0 y/ M" d& c$ A$ H" J* J& M
- STA MAPPER_REG_IRQ_ENABLE
! i w7 m$ U |" Z - .ENDM
% N& ` U+ o7 t X( g; o - " t# C. D2 z; H9 l* X
- ;====================================================================================================
" t6 E) W3 `- W - MACRO_DISABLE_IRQ .MACRO
1 g4 y# [7 |* W& U+ H1 s - LDA #$00
7 S7 y9 E2 ^. _/ Y+ \% x - STA MAPPER_REG_IRQ_CTRL: v" F/ Y% a' _
- STA MAPPER_REG_IRQ_ACK2 e" o `' U1 S8 g( m u& m0 C
- .ENDM) l \ B z7 H8 K
- 0 K9 c; B% L0 M8 S, k% \' O9 z
- ;====================================================================================================2 |" Q0 @- h9 r5 [0 k4 t
- MACRO_ACK_IRQ .MACRO0 |6 v% q& K; F. c( U4 l
- STA MAPPER_REG_IRQ_DISABLE
3 x+ m" \+ t4 f% k - STA MAPPER_REG_IRQ_ENABLE% T; F8 E8 Z1 {) i. U
- .ENDM
5 q, ~1 u& g+ M" z2 \ - 8 J- q1 G5 o+ |9 C, Z( ]
- ;====================================================================================================. c2 p' n/ {3 v [9 M# \
- MACRO_IRQ_OPERATE .MACRO
0 O, P9 A O) J+ W - 7 ]* d; _1 E4 \( z, q6 B
- ;==================================================/ x0 H; [9 N4 K
- ;IRQ滚动模式常量$ O$ |. [1 n+ d+ q' v2 p) F6 N
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动5 g; ?+ y/ Z. J* Y8 K
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动& r4 ?: t- w; p) C4 `/ u7 k4 n
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
% D2 w' L7 U K7 n! S7 C - 2 L* U4 L4 P: I* y1 J# w
- ;IRQ扫描线数据
0 I$ d, Z4 v7 h" b! ~) w - IRQ_Scanline_Data
, v& m; f+ ?0 T* u: T- U; s* j - .DB IRQ_SCANLINE_1+ r/ e/ U M# H1 V
- .DB IRQ_SCANLINE_2& G9 V _/ u0 c0 b( |' J
- .DB IRQ_SCANLINE_3
1 T/ Q; g' E% Q" I% o( U3 b - .DW 00 ;关闭IRQ
& D9 R4 H( \2 S- u# q9 j# I - ! I( u: N" `( [
- ;IRQ滚动控制模式. w! V. g2 @' F+ |" {
- IRQ_Scanline_Mode7 y! v- x. f% F/ k5 B6 x% r2 S
- .DB IRQ_SCROLL_MODE_RIGHT/ s- ^* J/ c* y; I+ {1 i
- .DB IRQ_SCROLL_MODE_LEFT
0 l$ z9 Z5 R4 [! D' ?- @ - .DB IRQ_SCROLL_MODE_RIGHT
N+ P/ h7 J1 N - .DB IRQ_SCROLL_MODE_LEFT" F# | f/ f/ Z; x, u
$ q& \3 k( S# m2 J- ;==================================================
5 o+ r5 P* Y* i6 s* f - ;;IRQ滚动控制
/ s, `3 X4 q2 i- u/ U" v - IRQ_Set_Scroll
9 Z% P) | V8 J$ l4 z, h! f - LDX IRQ_Process_Index& {" }7 q+ @, Q1 o
- LDA IRQ_Scanline_Mode,X& i& G# I; Y+ Y% A
- CMP #IRQ_SCROLL_MODE_LEFT
! m+ X" h! j- ?, c - BEQ IRQ_Set_Scroll_Left* t+ R9 |: g5 {+ y
- CMP #IRQ_SCROLL_MODE_RIGHT
6 s% J$ E, X* p - BEQ IRQ_Set_Scroll_Right
" M1 U* t: ?3 |+ W, g; e - IRQ_Set_Scroll_Zero;不滚动3 l# B7 t/ W/ F% c: F/ p- {
- LDA #$00
$ U5 z7 x! S) M, ?$ b5 Q" K$ o. A - STA PPU_SCROLL* r: y. ~ U; X( K$ S- l7 ^
- STA PPU_SCROLL
q; q( B- s, f* b6 s7 s. h - RTS# R4 g( w8 c+ g4 c* Z. c/ v' M
- IRQ_Set_Scroll_Left;向左滚动
' y# u0 A8 }! _$ U& T" p; Z - LDA Scroll_H
. j4 `2 {' {& t+ r$ G' d - STA PPU_SCROLL* P7 S9 A |4 E1 p$ A" T
- STA PPU_SCROLL
* o5 m* g7 Z2 Y+ ]# o" M) h/ B9 U - RTS* |# S& y c/ ~; C
- IRQ_Set_Scroll_Right;向右滚动
T% r8 o2 [* u1 m8 i% }6 N7 O! t - LDA #$005 @2 L2 ^1 l" q3 z
- SEC
/ U5 q8 R3 u' r/ r" w6 O+ y2 E+ p - SBC Scroll_H! B7 Y3 A/ h$ t9 _1 E H
- STA PPU_SCROLL
+ B6 A/ a9 p9 E* N - STA PPU_SCROLL
/ e/ ?8 G9 v; A2 t M - RTS
2 V/ \1 A5 _+ r# x& |# B - ' \* L( Z1 x9 k( a
- ;==================================================
5 Y- W+ C/ {5 S/ i0 k - ;;IRQ滚动控制
8 C" Z# x( W" Q - IRQ_Set_Ctrl
8 a5 C+ V3 ~3 C, j3 I# A - LDX IRQ_Process_Index$ j3 E- g8 q% v5 P6 s- @+ Y E
- LDA IRQ_Scanline_Data,X/ j3 F6 S% W. m
- BNE IRQ_Process_Latch/ W% e0 e5 u- ]0 I
- IRQ_Process_Disable;禁用IRQ+ N- N9 J+ f# c$ r
- STA MAPPER_REG_IRQ_DISABLE
V0 o' Z2 o5 z6 a$ L) m/ c - STA IRQ_Process_Index
- @+ h6 z* G) u+ _ - RTS
6 w2 [ h( n; `3 w( K6 n - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
2 Z5 A5 C& Z) t9 g& c - STA MAPPER_REG_IRQ_LATCH
$ n8 { G8 o) ]/ y. k - INC IRQ_Process_Index
7 i, \( G0 h8 J: g1 c/ l3 i. p - RTS0 c3 D! K% t2 O( q
- 7 h1 U: \& f3 k/ x0 I" y
- ;==================================================
2 A% R. c* N6 y. p7 y - ;IRQ处理3 l$ O5 @/ ?6 a/ f4 G+ K2 a
- IRQ_Process_By_Index" |9 _; B# e5 K4 y0 I
- JSR IRQ_Set_Scroll; Y4 ~+ x" ?! a1 M# z
- JSR IRQ_Set_Ctrl
- z" `! f3 W1 z, R# b0 i - IRQ_Process_End
' T" }9 C/ z5 u6 x) `- R$ M - RTS
4 f/ ` e$ q W1 O* C4 \ - ! z6 ~0 d) M2 ~% I. }, K
- .ENDM
, ~6 z+ G( ^1 k! k, o" b1 O - ( B( q+ p- J9 Z' t: {% u# z7 c
复制代码 % r' v# p& r' g( v. Z; |" h
2 {% h l% Z- Y$ b% D
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|