|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 7 }6 E5 \+ G1 `
/ q# z- {7 W% [) q: w7 _; H- P
本次IRQ研究了如下:* v0 `/ ]/ a1 i& ~' x$ p: T8 c
VRC2&4(Mapper21,23,25)4 L2 ~% g( L- b, X
VRC3(Mapper73)
# t, G& @. H( C& AVRC6(Mapper24 & Mapper26)
% M- o5 o3 p& k N4 K/ kVRC7(Mapper85)$ e- y9 k x- S5 e0 ?
MMC3(Mapper4)
8 N, i2 j6 }( L0 h2 aMMC4(Mapper10)
' k5 _- v5 Z: K3 g3 u7 w& R# BMMC5(Mapper5)1 b! n! m8 N" _6 U; P* \
Mapper18
% A# P+ x1 G- y( P8 |- GMapper64' L X& I; M8 W- X/ o( ]
Namco163(Mapper19)2 Q: x; S* k8 H5 w- E
Sunsoft FME-7(Mapper69)7 }1 r8 P% Q+ ~5 G$ Z! b& I" {8 l- G8 r
" l3 M; ^+ f& y- x8 v* J共计11种Mapper的IRQ操作使用例子
, [% y( z' T- m/ w, S代码内有详细注释, 希望能帮助到感兴趣的人.7 l) X* o0 z7 O+ F5 z
3 e+ V+ o" D8 B v( v
  " }8 \( V' h3 m& r, M% r5 C
0 _4 G& W, U/ A1 f( ~: D0 ]7 B
Mapper代码主要逻辑(以MMC3为例):
" H0 x. B+ K# j/ C Y4 _2 R
/ P% s: _# F7 `- ;==================================================
" x+ n- f. w8 _5 l9 W r2 H% h6 G - ;Mapper号
$ ^2 H' B5 ]+ z9 x* j. r! z - MAPPER_NUMBER = 04* Y4 y' d: i3 M$ M
- ;==================================================6 |$ h) E* t/ c0 y8 \. g) z% Z
- ;MMC3 (Mapper 4) 寄存器常量8 G. d$ v: ?* A
- MAPPER_REG_BANK_CTRL = $80007 [% |3 B- i' g2 y* i4 C; ~
- MAPPER_REG_BANK_DATA = $8001
T, [% i. W4 Q/ P - MAPPER_REG_MIRRORING = $A000
) R1 ~: q; r8 S$ g& L V2 Z2 }5 E, e - MAPPER_REG_PRG_RAM_PROTECT = $A001
" ~; K" q$ `2 Z& Z8 v5 S - MAPPER_REG_IRQ_LATCH = $C000- I- c( h, v) K
- MAPPER_REG_IRQ_RELOAD = $C001
3 k# G O* N2 _8 p7 }/ n1 l - MAPPER_REG_IRQ_DISABLE = $E000$ y3 n# P# M t9 G2 A+ J
- MAPPER_REG_IRQ_ENABLE = $E001
; l1 g7 T) R5 A% I9 S - ;==================================================
. y7 i/ G! O# ` - IRQ_SCANLINE_BEGIN = 1359 A' k8 G! n' G
- IRQ_SCANLINE_1 = 8
( \: A. i: r: {# o; a4 ] - IRQ_SCANLINE_2 = 547 h ^* T! y, {5 V
- IRQ_SCANLINE_3 = 8
/ D; V6 k& [" Z- U - ;==================================================
7 A' x; I! T% ~' z/ {) {2 d% ^
) _6 P @0 p1 u" |0 t- o/ L5 h- ;====================================================================================================) _1 g8 Z& z; x0 Q5 s
- ;宏常量
, a! z& ^. e. R) }2 C - ;====================================================================================================
. U2 L$ ~+ L* F7 E2 v! J
4 G v+ [- z- b- ;====================================================================================================
3 Y4 z& ]3 i" ?. N7 k0 M6 M J+ { - MACRO_MAPPER_INIT .MACRO+ C) X% q3 F' H7 W) W5 _& W% D0 s
- ;禁用IRQ
) n6 \- x* @- |3 I - STA MAPPER_REG_IRQ_DISABLE
x" J, E* @% u- `' W8 s5 w! T9 K+ b -
: w/ z( o5 ]+ w$ N - ;水平镜像) a) Z1 [5 E8 D. p: L( b4 F2 ]; h
- LDA #$014 A: A" c3 c3 y% i5 D% g, `: l
- STA MAPPER_REG_MIRRORING' \# j: G( d( |
- & ^# Y' N8 m' M6 f; g9 t2 @
- ;初始化图形bank3 A) l# ^5 |% V) Z- \* p; |
- LDX #$057 B8 z5 W7 E. C( T4 T% O
- .Init_Chr_Bank
, i; \! r) o3 w: g+ g! D% E, T8 g* | - STX MAPPER_REG_BANK_CTRL M$ n3 b7 h1 U
- LDA .ChrBankData,X
& M1 D; G3 ~) R4 o ^" j' B - STA MAPPER_REG_BANK_DATA% q) p I' I( s& [: M E
- DEX
, M. l' M2 F0 E9 P; F! ?* b! t7 Q - BPL .Init_Chr_Bank
& F" {) z; R) H& O. r3 m. K - JMP .Init_Chr_Bank_End
1 G! S7 S; J2 U3 x5 _ - .ChrBankData
6 W0 T' l! q6 \2 I) {1 V$ B, K O# ^/ o - .DB $00,$02,$04,$05,$06,$07( ?- F! h X+ t/ ]
- .Init_Chr_Bank_End
' G4 e5 G4 A# u -
. z7 f6 d' x1 x6 \& Y3 V N - ;启用SRAM
2 t6 [0 o4 s# o7 P' _( O - LDA #$80
; z! v$ w1 J) x1 N) `( G - STA MAPPER_REG_PRG_RAM_PROTECT( l0 N9 m( C/ L9 V
- .ENDM- }0 J; G+ W& [' z( m& U9 l$ F- a. t
- ; Y( t9 u% M# |1 s- e2 T$ T
- ;====================================================================================================
" i* X( T! j5 ~ o* X6 x5 U9 D5 i* @ - MACRO_MAPPER_SOUND_CLEAR .MACRO& W: C6 n$ T7 B8 J* F
- .ENDM
) S/ n1 U* i8 K, a- \8 F0 u6 b - ! t. z% o/ \7 s& B3 H$ k
- ;====================================================================================================3 b* C6 v: |4 `; ?8 n% Y
- MACRO_SRAM_ENABLE .MACRO
$ a7 M% I% k: R6 @' K - LDA #$80
" p% x$ g- F% }2 K6 c - STA MAPPER_REG_PRG_RAM_PROTECT
3 f. c, a3 k9 M" F - .ENDM q0 Q0 Y& W; \- b) J5 W/ h
-
/ r( H% e- U0 Y9 w/ i/ M7 J: r - ;====================================================================================================
. q" k( W; H2 r9 f - MACRO_SWITCH_BANK_8000_A .MACRO) V, Z" e, P9 f% V7 c
- PHA
: T( G+ G2 x' K8 K' x - LDA #$06 R6 q: c! K( k
- STA MAPPER_REG_BANK_CTRL
I+ M M% _9 R - PLA E! J8 Q/ L% p: }5 s7 [) o( H
- STA MAPPER_REG_BANK_DATA
: g) i a! q0 `: U - .ENDM
5 U/ C$ \- q6 T* e' _; G - 3 i* M! H3 A+ p
- MACRO_SWITCH_BANK_A000_A .MACRO9 b3 j+ I" X% P4 q" x( ^
- PHA" `* m0 [) x% b/ f n( L* H
- LDA #$07. ^& Y. E. R! G2 K# g
- STA MAPPER_REG_BANK_CTRL$ }2 f+ L' P' ?0 }: P
- PLA& G$ j9 b* F6 T, ]" [) k$ e
- STA MAPPER_REG_BANK_DATA
4 d+ S5 E4 J7 J" q/ k6 d" Z* Z - .ENDM+ Y* Q: ?. h1 O$ c7 r$ D
- # I' C# I- b' u: E
- MACRO_SWITCH_BANK_C000_A .MACRO7 ^% L% w5 [: h' Y% X8 b. m
- .ENDM
; g2 f( ~1 ~8 `( R - 7 U0 `6 j0 W6 H4 z" M4 T8 i
- MACRO_SWITCH_BANK_E000_A .MACRO
3 ^& _7 t: J% @1 {0 Q- `6 p - .ENDM' K' v/ H+ S* [! k
- / E# R) U" ?1 [- ^) v+ ]: _! T
- ;====================================================================================================
L( Y4 m7 H5 d ]. W0 n+ z - MACRO_TRIGGER_FIRST_IRQ .MACRO1 F8 m* H) s; S
- LDA #IRQ_SCANLINE_BEGIN + 1
1 i9 g/ f, |9 w' `" m" g - STA MAPPER_REG_IRQ_LATCH) l# z' M3 K) g" V! _- D
- STA MAPPER_REG_IRQ_RELOAD
5 [) D5 O; F1 L: | - STA MAPPER_REG_IRQ_ENABLE
. O8 M* _( w- ~5 j% |5 j' s: k - CLI' b# g* n2 c+ e2 ^
- .ENDM/ C7 o! _9 d6 w0 _5 W1 ^+ S
-
3 b0 `% \9 l# V/ S& {* [ |( S9 w6 l8 c - ;====================================================================================================
# A6 D% t' O% _- u - MACRO_ENABLE_IRQ .MACRO
# b1 R) X) M$ x! F - STA MAPPER_REG_IRQ_ENABLE+ Z: K# A' m( ^( Z' m! [0 I
- .ENDM
% |$ z6 _' F3 @9 k# g/ w - 3 x+ ?6 S f( V5 Y# z1 v
- ;====================================================================================================
) K( @ a' l6 L8 Z8 _ - MACRO_DISABLE_IRQ .MACRO3 [2 o% j' ~# Q5 y
- LDA #$00
+ K% x9 \; m# U) X2 r; \ - STA MAPPER_REG_IRQ_CTRL
7 n& V4 L' S" L& V* C6 K' z - STA MAPPER_REG_IRQ_ACK" q$ c# N' _% ]+ L1 h3 H1 @, l
- .ENDM
% Z7 z+ K6 n* d6 ` -
8 e y3 i9 G3 T/ Z+ g - ;====================================================================================================
" N3 f v n, Q+ Y) t - MACRO_ACK_IRQ .MACRO4 t- |0 @5 K: O$ s9 L
- STA MAPPER_REG_IRQ_DISABLE
+ U; _3 T# R/ W Q$ [ - STA MAPPER_REG_IRQ_ENABLE# q' d# g5 m4 t0 Q* u9 R7 D* t
- .ENDM
( G9 m& x: E8 |. i5 D - : `/ w+ {4 v8 B
- ;====================================================================================================
- d2 g( m- \2 B1 X - MACRO_IRQ_OPERATE .MACRO2 O8 M4 A$ K/ b" k+ O3 `. N
3 r9 T- m3 s1 ~/ k7 V- ;==================================================
. L& ^5 \8 |- `. o - ;IRQ滚动模式常量
( U2 X9 p' M7 Q& c8 _1 t( R - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动4 m: |4 p5 q& u
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
/ K7 B: G0 V( E1 w; g - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动+ G* r' x( V) y( ]9 \: _6 j
- ' o) U; [) n/ `
- ;IRQ扫描线数据
# o8 p1 w; v7 F! U2 e- s- F - IRQ_Scanline_Data8 }# w' B5 l* m( _6 h
- .DB IRQ_SCANLINE_1
; A& C. U! q3 T/ M- M R& n - .DB IRQ_SCANLINE_2: a4 g& ] T L; v
- .DB IRQ_SCANLINE_3: J, x! [# P( l1 {$ m4 d; x3 n
- .DW 00 ;关闭IRQ4 y, U& R" W4 u* F& T
0 @- `6 Z% x% h. p2 g- ;IRQ滚动控制模式
% z' o: q/ e8 |3 \% Y" c - IRQ_Scanline_Mode
6 J; t' n4 l9 D- y X) Y$ M" z J - .DB IRQ_SCROLL_MODE_RIGHT
0 T" U& N% H. S7 N! a C# d0 i - .DB IRQ_SCROLL_MODE_LEFT3 f8 g9 L& X$ Y) ~4 l7 k/ g
- .DB IRQ_SCROLL_MODE_RIGHT
' A" L0 N2 S5 k - .DB IRQ_SCROLL_MODE_LEFT
9 o+ G1 y# Z* f! f - 4 s+ u7 p7 W# \4 U
- ;==================================================
6 W" i# T i6 K( u5 c: r - ;;IRQ滚动控制
: Q$ q$ ~3 F6 R+ x - IRQ_Set_Scroll2 m/ b5 G/ P- s, P
- LDX IRQ_Process_Index2 D, K) i6 G" O7 O* f7 _$ s
- LDA IRQ_Scanline_Mode,X
1 u2 \' |, {& Q6 {9 ? - CMP #IRQ_SCROLL_MODE_LEFT
0 D v t, J# b- a! t0 O, B Q- r, b - BEQ IRQ_Set_Scroll_Left
( z9 o$ M$ Z* W8 { - CMP #IRQ_SCROLL_MODE_RIGHT
5 B- l& `8 ~& g3 ^. y - BEQ IRQ_Set_Scroll_Right
9 u& t8 \$ [8 A; c - IRQ_Set_Scroll_Zero;不滚动
% m1 Y+ |4 w1 E+ i& L - LDA #$00! I2 z( \7 S* r$ A: V: c4 b; K
- STA PPU_SCROLL; N! Y+ J' G) ?. A8 n# x. U
- STA PPU_SCROLL2 y$ d" W r2 |
- RTS# _6 J; Z( e* u) ?" V, T4 y6 u& L3 n8 O
- IRQ_Set_Scroll_Left;向左滚动
/ w. }. o* G+ q) ~ - LDA Scroll_H
7 z1 O' _ y' f: J" b - STA PPU_SCROLL; y, k5 N; ?0 P0 B5 f
- STA PPU_SCROLL
( }* v( ?. _, a. l* L - RTS! C9 C4 r6 o' |. z" m1 N
- IRQ_Set_Scroll_Right;向右滚动1 x) u; }1 Y. `3 w6 Q. `: }
- LDA #$00
( [ b2 r5 q, V9 F - SEC( j& _, ?6 [9 C- d0 t
- SBC Scroll_H, Z. J' b% s) m
- STA PPU_SCROLL
# Z9 R/ `) N8 X2 W/ h - STA PPU_SCROLL) R; a3 _, _1 z
- RTS( ]5 i8 l4 T) c" U
- 4 L+ X/ L2 I6 d! h. w, b' |* ^
- ;==================================================
7 o v4 o8 R, W7 a/ m - ;;IRQ滚动控制
8 K1 ^/ f( j! Z1 J. r, d$ C7 c - IRQ_Set_Ctrl
8 v6 L+ k( u- j - LDX IRQ_Process_Index- |9 R3 j$ C! E! D
- LDA IRQ_Scanline_Data,X+ v# D% r6 ^ @4 L1 }
- BNE IRQ_Process_Latch
- k( z4 a) T8 _ - IRQ_Process_Disable;禁用IRQ
/ F9 D8 h5 {/ j+ k. F - STA MAPPER_REG_IRQ_DISABLE
' e, s- I& l. Z* r$ w/ \ - STA IRQ_Process_Index; c u& i% k* Q* `9 {. l
- RTS( ^" k' A6 m, w, V& `4 a: t
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线+ |$ n! K: z! q) `( f
- STA MAPPER_REG_IRQ_LATCH
9 w7 d) j! @& I1 @ T) ?& Z - INC IRQ_Process_Index
) Q* V, Q# w3 A' D" Y* \ - RTS9 Q# Q/ U4 L% P% C% P
9 P8 p. ~" c, k$ D( U% s- ;==================================================
" V" [# r+ c5 q6 R/ n* @. g5 R - ;IRQ处理/ f/ Z7 k5 R1 l, {( W$ z% |4 X0 u4 V
- IRQ_Process_By_Index
) A W" P6 e# z8 D6 Y! t - JSR IRQ_Set_Scroll- X0 x8 w' g! y4 T" X/ t
- JSR IRQ_Set_Ctrl$ N2 k& T# n( [5 F
- IRQ_Process_End
/ D$ p! i& e, X; ?9 O - RTS' D4 K. L! F8 M- k, c- A
-
9 q$ T8 m+ b" R4 ?4 H- R$ z - .ENDM" u8 ]1 |/ m1 W+ U4 g4 A7 ]
-
% e: l. b. d' }
复制代码 3 x$ d" ]7 N, r. C5 y
3 s/ l' h+ ]" t6 p6 ?) s* [! V代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|