|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 3 u' r- `: E) x4 r8 u
7 |7 T, O7 V0 S* ~ N9 C p本次IRQ研究了如下:: B p9 H) B: s) D7 l
VRC2&4(Mapper21,23,25)
3 n. ?! p& ~8 O) ~9 RVRC3(Mapper73)$ b$ Y* {+ c0 i$ e: L( ~; k
VRC6(Mapper24 & Mapper26)
6 F+ q% s' G5 {) o9 k7 I+ j2 pVRC7(Mapper85)
2 [7 Y# `+ ], zMMC3(Mapper4)
- P& H6 g7 C) Z0 D! P, P CMMC4(Mapper10)9 R: I! [* I! O
MMC5(Mapper5)
' y( D# r3 w, `; t' |: sMapper18' r, E* t% A: G: C4 N: |- b) w
Mapper64% ]/ ~/ }- i* u8 w E0 i) P0 s5 { T
Namco163(Mapper19): Q) |" B8 X0 v+ q* L
Sunsoft FME-7(Mapper69)& ^4 p n6 @: \! R1 J
8 \# z7 p" O* y0 \* c+ c; s$ p共计11种Mapper的IRQ操作使用例子
7 Q- G% T* w. a! M代码内有详细注释, 希望能帮助到感兴趣的人.
3 X" B& \, E( d- I! l+ L* P/ F$ T$ `0 X. C& h. s
  + H1 ~# _) P$ P4 O9 V1 d5 X
( V& D* E4 Q/ `Mapper代码主要逻辑(以MMC3为例):
/ H( m# ?0 v! V& b- # f" o' D/ F8 {2 _1 ]3 q
- ;==================================================
S$ b) F6 g c: k8 Z9 t3 E& L - ;Mapper号
4 `. K( y3 M5 l1 ?! }1 J - MAPPER_NUMBER = 04- S! Y! k( Q s; k4 U& \8 K! z4 ]4 d" J
- ;==================================================
$ E; Z* F9 K! y Y. ]- N - ;MMC3 (Mapper 4) 寄存器常量
* E5 ?5 m9 ~" I5 R) \ - MAPPER_REG_BANK_CTRL = $80007 P1 _( z2 \" F
- MAPPER_REG_BANK_DATA = $8001# i9 E8 @% H4 Z' o5 ^
- MAPPER_REG_MIRRORING = $A000; _) i% F$ P5 {5 W
- MAPPER_REG_PRG_RAM_PROTECT = $A0013 _6 R$ M6 \: l z, R; g; u2 M
- MAPPER_REG_IRQ_LATCH = $C000+ z( p' v; p3 ?/ S2 _# S/ k8 f2 u+ Z2 m
- MAPPER_REG_IRQ_RELOAD = $C001% I1 N' k+ G. s( A" C
- MAPPER_REG_IRQ_DISABLE = $E000
; r: p( z0 F _; m, M4 k - MAPPER_REG_IRQ_ENABLE = $E001) x% H! e9 {6 v- }9 c& b
- ;==================================================
' Z, u; r2 M/ V6 A* l: D - IRQ_SCANLINE_BEGIN = 135: p T' Q! I% C; \
- IRQ_SCANLINE_1 = 81 R0 R1 k* L5 [, V& c6 ]5 E4 v3 ?
- IRQ_SCANLINE_2 = 54
) W3 h8 V8 W7 S: |" F5 l - IRQ_SCANLINE_3 = 8! e2 N- }1 e) |$ u& W# i% w
- ;==================================================9 s* R% @4 N7 f, U* d- D( p
- 6 g6 E4 } m# ?
- ;====================================================================================================0 f6 ]- `% J, E$ v3 z- h& d
- ;宏常量
( k; Z, M0 @/ {; C/ c- ]8 W - ;====================================================================================================7 X, C& I. X: [0 ]
: V" I& U; p- J2 P; U ?- ;====================================================================================================
5 [- I/ ]" O/ S/ n; }1 [) e - MACRO_MAPPER_INIT .MACRO
& r/ x7 W1 i. w. v0 `7 o+ i" | - ;禁用IRQ
% Y4 _* T# s; g7 w" C - STA MAPPER_REG_IRQ_DISABLE, K0 K2 |, m% I8 b/ ^' i2 k
-
$ e2 i1 G- z9 Y0 Z/ z, h2 u - ;水平镜像
, ?4 n# g9 A6 p8 a7 y+ u6 v0 \ - LDA #$01
Y2 @. |0 t% {7 v0 B! ^3 Z+ u1 ] - STA MAPPER_REG_MIRRORING
) ^0 C7 {- @; W2 C. z3 g k. B - / X) t1 d4 |3 B2 c* o) @
- ;初始化图形bank$ O/ ~/ R" ~2 s; I
- LDX #$05
8 I9 _- n; I5 L - .Init_Chr_Bank. K0 A3 a0 a$ n* f4 ?9 `
- STX MAPPER_REG_BANK_CTRL t# t1 v4 j% P" ^% X6 u
- LDA .ChrBankData,X
- s2 n: K6 I2 f - STA MAPPER_REG_BANK_DATA
5 H' }3 K) ~" o' C7 F9 o5 T - DEX* o, l& G( _+ \% i, ?
- BPL .Init_Chr_Bank9 J2 y: z$ l: n8 [* D. K( r3 X
- JMP .Init_Chr_Bank_End
: U. @( T: K) l% F7 z* D - .ChrBankData( }( @3 R* V9 K7 R
- .DB $00,$02,$04,$05,$06,$07
; s$ ?9 C; }, n( [# `" G - .Init_Chr_Bank_End
# F9 Z( B4 ` [( {$ P -
" x D+ `- i) }/ l ? f3 g - ;启用SRAM# O$ j+ E( l: g0 E; b+ Q, V7 D# e9 M
- LDA #$80
+ E: T8 i6 [2 T0 T - STA MAPPER_REG_PRG_RAM_PROTECT
/ \! R" d0 e- b/ w - .ENDM
2 F6 x$ j1 x( }2 `+ }' b& ^7 l# r; Z6 u
& \$ I9 d* [+ d# L, r0 z* _; t- ;====================================================================================================
! u: h0 ]$ D: I' u& s2 U - MACRO_MAPPER_SOUND_CLEAR .MACRO
* i/ p+ x9 D' {, U# W - .ENDM# k* N y# G' z6 o1 I
- 0 w! Q3 R( G/ B" M! s( P' T; q
- ;====================================================================================================
. ^ _" S, W. i- c4 g - MACRO_SRAM_ENABLE .MACRO
+ @9 h) e6 N. U7 ^ - LDA #$80
9 A3 x; x* r* B2 v6 q! e: T - STA MAPPER_REG_PRG_RAM_PROTECT
! M6 ?. J/ T# Q7 l! ] - .ENDM) a% d7 v/ ]- Y1 w) {
- 0 p+ ` D. G; D* K& P
- ;====================================================================================================. P2 M4 u% @. q# T: k) m. x5 h9 [
- MACRO_SWITCH_BANK_8000_A .MACRO9 t, C/ Y( S3 t4 M0 g) Y2 E3 x
- PHA7 [5 f7 Y) M% K( ~! I5 h V
- LDA #$06
/ ?+ N2 G4 k# Q0 c, U6 k' v - STA MAPPER_REG_BANK_CTRL
) C& E5 q$ Q7 P8 V8 ?- e+ S - PLA$ o+ t. x& h2 h$ d
- STA MAPPER_REG_BANK_DATA% H* `9 w5 ?6 `! d
- .ENDM
3 I$ C* h+ o& I# Y+ w. _1 @
$ Y6 z& k1 `+ N) Z! D N8 D9 w- MACRO_SWITCH_BANK_A000_A .MACRO# _, c0 j* X* b# E. O5 {/ v
- PHA
" Q8 e$ N& m0 B0 @8 R2 f - LDA #$07
1 N& u8 I7 y/ K0 y" o, K - STA MAPPER_REG_BANK_CTRL3 X% q0 y# K; \# K0 |8 O
- PLA' C) J5 E g n5 U+ u" i
- STA MAPPER_REG_BANK_DATA8 E8 B: N5 r. S2 d# J8 M7 Y
- .ENDM
6 b! y# a6 M4 a' M$ s9 [# _ -
i7 |2 ^4 ^. O" E+ B/ p0 Y - MACRO_SWITCH_BANK_C000_A .MACRO
3 @0 _5 ^$ ]2 n3 `' J - .ENDM
1 B7 s0 x/ k1 ~; X3 ~" P# V
# m S N8 }6 u7 [( `- K$ Y5 u; e- MACRO_SWITCH_BANK_E000_A .MACRO
o) a4 L" z( K2 d8 l4 r/ a$ ^ - .ENDM
! p3 D2 x$ N: r1 D - 0 k1 N2 H- G1 ^
- ;====================================================================================================
- `) g2 d% r7 q) Z1 m% k6 g - MACRO_TRIGGER_FIRST_IRQ .MACRO
5 S+ X/ c0 [ E" M - LDA #IRQ_SCANLINE_BEGIN + 1% I0 x/ D6 u, S" s, m7 ^
- STA MAPPER_REG_IRQ_LATCH
: {. n' L* j6 q - STA MAPPER_REG_IRQ_RELOAD/ _* N7 y' b( g3 y+ b/ a) P, ?
- STA MAPPER_REG_IRQ_ENABLE
) v, w7 U6 J* H7 P9 T( ?- a! D9 o8 g - CLI _1 w4 u( C# F) \6 F! _5 k
- .ENDM3 l1 J+ s: S) m
- " l1 _5 |' i6 V) M: o: B+ S
- ;====================================================================================================3 }" S# e) U$ K: f# | T6 J
- MACRO_ENABLE_IRQ .MACRO0 d6 L( b/ q% B( u3 O
- STA MAPPER_REG_IRQ_ENABLE$ O# m3 k' k7 u. G
- .ENDM& ~ p- f/ m. M- n+ l0 S& t
-
4 v( J; Y) w: n, {6 g8 N - ;====================================================================================================
: R. O0 O" E! b; n0 \$ o2 H0 ^ - MACRO_DISABLE_IRQ .MACRO
5 f3 M4 C0 `, b, C - LDA #$00& n$ k0 M0 r* t3 V- I& M- v
- STA MAPPER_REG_IRQ_CTRL
1 j3 Y$ H3 I5 A - STA MAPPER_REG_IRQ_ACK
~3 w6 B: t+ G - .ENDM d. ?. R/ F9 \! h6 U, }
-
9 a% K, d7 K; ?! ] x - ;====================================================================================================
; A8 e- v5 k; v* |' b6 t) ^ - MACRO_ACK_IRQ .MACRO
/ Y* e7 I' f# D$ d - STA MAPPER_REG_IRQ_DISABLE! _9 N" ~2 V: H4 G; I
- STA MAPPER_REG_IRQ_ENABLE: c+ [ C$ ~" l/ z
- .ENDM
, G1 s0 A0 S$ K - ' l0 a) Y2 I+ L Y* a# O: m, J
- ;====================================================================================================
8 P6 Y X. o. e; F - MACRO_IRQ_OPERATE .MACRO
8 a/ S0 c' V; ~/ U+ ~8 z; j9 j0 e - 5 ?# P$ P+ y. L
- ;==================================================
7 z X& L: H6 Q' ?+ [/ [1 o+ q - ;IRQ滚动模式常量# y' G! k0 L; I
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动6 x' q1 |1 D% t; K p+ s( j
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
. q# p" ?7 d% m9 M' S* S! x - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动 A% F; ~2 {2 _. C
- 4 P- e) f5 q! x3 b+ p2 c) q
- ;IRQ扫描线数据
! r% m- W/ i' q* y - IRQ_Scanline_Data/ T7 S$ M$ u+ z
- .DB IRQ_SCANLINE_1, c/ s5 F& z; t. Q7 P+ [2 P
- .DB IRQ_SCANLINE_2
. E- U: U4 i5 ^3 d - .DB IRQ_SCANLINE_3
/ {1 `8 D6 |, S - .DW 00 ;关闭IRQ
+ _ \" w- v4 V( F& z/ b
6 W. N2 o! ?) |" |5 Z/ `" Y- ;IRQ滚动控制模式
. f4 m( S I/ v% {' H) x# B - IRQ_Scanline_Mode0 y0 B2 `5 M5 I
- .DB IRQ_SCROLL_MODE_RIGHT* p4 |6 e- J/ U5 ]3 I: ^4 g8 m, S
- .DB IRQ_SCROLL_MODE_LEFT
2 x* e: i' I' I# c+ \ - .DB IRQ_SCROLL_MODE_RIGHT" Z1 c& u0 l8 u
- .DB IRQ_SCROLL_MODE_LEFT/ g8 G( W1 v$ F( M t
3 N8 D1 o% @. C# a4 p- ;==================================================
7 w3 \2 V3 D- u - ;;IRQ滚动控制
T! K) p1 o+ X/ B3 t9 m - IRQ_Set_Scroll8 ?: r; X, T6 L
- LDX IRQ_Process_Index0 \+ l, b7 d% z+ ]/ J- V$ ]
- LDA IRQ_Scanline_Mode,X2 F+ p( a; z, j& d8 K8 |
- CMP #IRQ_SCROLL_MODE_LEFT! Z" L# M( w/ Z# _
- BEQ IRQ_Set_Scroll_Left
* X3 M4 k/ d- l - CMP #IRQ_SCROLL_MODE_RIGHT# W5 v, }& a% J+ Y
- BEQ IRQ_Set_Scroll_Right [2 c4 J/ c y, b! }
- IRQ_Set_Scroll_Zero;不滚动! V; A7 X9 L5 }/ Z1 T
- LDA #$007 g% S9 o/ Y# K+ E+ L# u8 j4 {( c
- STA PPU_SCROLL' b% t) z& u, v8 g4 Y! L
- STA PPU_SCROLL" p. p: S& N% J- Q6 `
- RTS! {: g4 n" p' t8 j' b
- IRQ_Set_Scroll_Left;向左滚动
8 H$ @3 s! S0 {9 F P, k& ? L+ b - LDA Scroll_H
1 k1 w' T9 P# }" | - STA PPU_SCROLL
/ s0 t+ o4 z4 } X+ b) h - STA PPU_SCROLL" Z: D8 i# ?2 c# y9 P3 X: _
- RTS
& t* J1 r J- H) O$ O - IRQ_Set_Scroll_Right;向右滚动& ?# I. W; ^' z4 I5 r4 b
- LDA #$00( R- r% L. z7 s9 |- t8 O
- SEC/ M$ x# a/ R& B5 N9 D" v6 M1 w
- SBC Scroll_H
% @) N" ~0 a7 V - STA PPU_SCROLL
2 A) x c3 X7 A0 y. c# L1 m$ o - STA PPU_SCROLL: |7 F. C$ h. X1 i+ g& m
- RTS
5 u3 O$ B! Q' U8 R0 ? - , K0 s" Q. G: @; v+ [, ^6 Q& e
- ;==================================================) p* S, a$ ^% i% B& l
- ;;IRQ滚动控制 l$ L8 w' j: p0 _+ @. G! \
- IRQ_Set_Ctrl! k1 V. C7 p, H+ ]5 ?5 [" e; {
- LDX IRQ_Process_Index4 `4 l: H9 A! i/ t
- LDA IRQ_Scanline_Data,X
! _' ^3 }6 m0 @9 @1 i - BNE IRQ_Process_Latch
# X, J' C6 J9 b; _9 Y - IRQ_Process_Disable;禁用IRQ9 s% W0 n" B6 U% k) ?
- STA MAPPER_REG_IRQ_DISABLE
7 h/ Y. m7 s; L1 I* S4 Z - STA IRQ_Process_Index
( z. E3 q% v5 L% \- H - RTS; |. O4 D! Q$ r# _
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线: Y3 q5 x* Q! e3 P8 Q
- STA MAPPER_REG_IRQ_LATCH7 \% Y4 d8 m b- h; U3 V' F
- INC IRQ_Process_Index/ w/ I. j: b& a, G6 v3 t
- RTS, t$ Y! u, y4 _& t; c
" D# g$ s- j$ h! q5 d" G& F- ;==================================================
1 T W9 Z9 K& f7 n' b( O6 a - ;IRQ处理
/ t2 q# E3 v) C4 P0 Z& r9 y - IRQ_Process_By_Index/ Y3 b6 Z: t% f
- JSR IRQ_Set_Scroll' b5 }: A% r; m$ m3 h% d
- JSR IRQ_Set_Ctrl
# C e$ D* G% R5 n! i - IRQ_Process_End
# ~% ^% y, m; r* ?4 u$ G; S: L, ?2 ` - RTS6 P5 Y. w4 x8 [6 l$ I0 S
-
4 y4 u' b0 v S+ d; q* H$ O: @ - .ENDM5 _4 m; Q) ]5 w7 S" G# y" X
- 3 g$ h( o4 z3 k5 c0 b( U( Z0 `$ U6 P
复制代码 ! T: w o1 z, R' U7 ]
# b* J, r: W+ @6 x8 y
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|