|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 , e6 u: {9 p0 C
0 \% n4 ]6 V) n, D2 C1 P: A本次IRQ研究了如下:7 [, E: C) J! @/ C! A
VRC2&4(Mapper21,23,25)/ I" r! N" Z3 u
VRC3(Mapper73)
4 G( l. {6 E3 m2 k" ?! p! V) NVRC6(Mapper24 & Mapper26)
" A* k. @1 b, OVRC7(Mapper85)* G# S q& `# ~8 }+ ?; F; Y
MMC3(Mapper4)* f& B9 o' U% F, T, ]% w
MMC4(Mapper10)
7 H/ ]" G* z: J$ BMMC5(Mapper5)7 e# z* n$ d i* S9 V
Mapper180 E( L4 C0 _+ w5 G* P( t' M5 j( O
Mapper642 o& V& b9 v7 P D% h
Namco163(Mapper19)
2 m) \. Q) G6 a8 GSunsoft FME-7(Mapper69)
$ g% V0 S% q3 J& C3 k1 q, e! z3 f8 }# k
共计11种Mapper的IRQ操作使用例子
; f% V) o% v2 I# B1 J代码内有详细注释, 希望能帮助到感兴趣的人." L5 h E, ^- i3 A
$ w; c4 y9 Q. M4 w+ W3 m; a7 o
  
/ w" s+ ]( y$ g" c9 n1 O
( f ~$ [" G* ^( g S$ DMapper代码主要逻辑(以MMC3为例):
/ ]# v" j# t& C- \5 W4 S+ `
8 R s2 b N4 I2 K- ;==================================================0 Q: c5 G x' u' w1 L
- ;Mapper号
% ?1 U: U8 T/ d1 x, ? - MAPPER_NUMBER = 04
0 N2 C5 N% Y) R v! R - ;==================================================1 t! x) A; _1 {5 j4 o
- ;MMC3 (Mapper 4) 寄存器常量6 L2 O/ A% i4 I6 R( ~9 b- G( g' t
- MAPPER_REG_BANK_CTRL = $8000$ e6 V$ s5 y |( x; ~
- MAPPER_REG_BANK_DATA = $8001; U3 O5 K& u) }$ m& o7 C
- MAPPER_REG_MIRRORING = $A000
. M- m3 m% p# W$ | c7 y L - MAPPER_REG_PRG_RAM_PROTECT = $A001
; f1 A& c/ q0 E - MAPPER_REG_IRQ_LATCH = $C0008 O& P3 K$ f8 J; F" ]" h
- MAPPER_REG_IRQ_RELOAD = $C001
2 ~0 |6 K1 w; g - MAPPER_REG_IRQ_DISABLE = $E000
; b8 f0 y& L) o+ b' s* d) A$ W+ C - MAPPER_REG_IRQ_ENABLE = $E001# y. G# t2 `* d0 h' U% R! l) B
- ;==================================================3 P' p% {( ?( T2 _: ^0 X- F
- IRQ_SCANLINE_BEGIN = 135
3 c% H5 b4 F8 { - IRQ_SCANLINE_1 = 8, B5 \9 S- [, e6 k- i4 h8 N( I( x K
- IRQ_SCANLINE_2 = 54
# S( K! J: G, T/ ]0 v) b/ D2 \ - IRQ_SCANLINE_3 = 8
' @6 H3 S0 m- z9 l& F: Y - ;==================================================
* N3 L, y9 S [% I7 s, y# a5 Q5 n - 4 v8 b1 C2 C, U2 ` t
- ;====================================================================================================
|+ {/ y4 `( |" t( { - ;宏常量
; \1 P2 x' V! b6 p a - ;====================================================================================================2 k1 L; M- U, A. ?3 c$ Y3 ^
6 Z3 O) M. f% X4 u! I2 f. w- ;====================================================================================================
8 u1 _! k7 ?5 U3 A9 g, |# J7 [ - MACRO_MAPPER_INIT .MACRO% m9 V/ Z$ D/ o9 `
- ;禁用IRQ& D/ R5 R" z% w! s$ x% |: H; q9 s8 r
- STA MAPPER_REG_IRQ_DISABLE
; f5 w$ ~4 U0 ]5 n - 6 I7 H, p7 q9 x+ U3 a
- ;水平镜像9 L* P! y( K; P3 P! m
- LDA #$012 J/ z9 g6 |8 `: W9 G
- STA MAPPER_REG_MIRRORING' T- l- y3 u! Y! F$ \$ ?
- 9 l: _# r; s/ {
- ;初始化图形bank
, g* G6 H0 S" |, ]" D) g# n - LDX #$05
0 `1 T6 _: \6 Q9 `5 B - .Init_Chr_Bank
$ b* C I$ i3 T, ` - STX MAPPER_REG_BANK_CTRL
8 v% M& v& d. \# P - LDA .ChrBankData,X
; s' Y* q. W1 T/ O - STA MAPPER_REG_BANK_DATA) I, Q9 @) r) T
- DEX6 Z4 o& A3 J) r& b7 x
- BPL .Init_Chr_Bank
0 K* h, j! j- S# S- e: y - JMP .Init_Chr_Bank_End
5 T- ^2 @ v: ~; ? - .ChrBankData6 k% ~0 @6 p2 r
- .DB $00,$02,$04,$05,$06,$07
" d Z) ^3 m4 u6 m/ C/ a, H2 B - .Init_Chr_Bank_End
" R7 p. w0 ?( s" e2 q: y0 ? - ( d- m% ]2 _7 E3 S g' V
- ;启用SRAM7 s" K& \9 T6 a& e0 l+ R7 a
- LDA #$80& ? v2 y' v0 U
- STA MAPPER_REG_PRG_RAM_PROTECT
) I* h" `) H4 f; y - .ENDM# M3 a& s0 R' E# L. N+ Z x
# v( d6 D$ j; U# v, J9 E- ;====================================================================================================
4 W3 ]2 {7 D: o! b( G$ Z: i - MACRO_MAPPER_SOUND_CLEAR .MACRO |* T8 Q9 @. e# W& V
- .ENDM6 P+ _* U0 t9 A5 w. \' h: W
- & l; ?6 K& b! Q8 a0 t4 E
- ;====================================================================================================7 P$ w8 Y/ K7 x6 N2 K5 @4 E" W
- MACRO_SRAM_ENABLE .MACRO `8 o/ ^2 z/ E* j6 h
- LDA #$80) a7 |, i) l1 p4 g; {0 [: {
- STA MAPPER_REG_PRG_RAM_PROTECT0 ^4 e6 h, j: j! T5 v5 R% d5 I& |- ~: u
- .ENDM' V$ T# d) B/ Y
-
! A8 k, W, m y& B - ;====================================================================================================# I8 d7 M+ q- T7 m$ F- f+ \
- MACRO_SWITCH_BANK_8000_A .MACRO
, O5 Q2 O. g0 u1 z, F1 b - PHA* c5 R' L( R2 K/ r3 N* |& Z
- LDA #$06
, D/ x/ V& S4 y l- H& e9 A: Z8 t - STA MAPPER_REG_BANK_CTRL* p0 H m8 X$ a$ F: Y
- PLA
2 b3 O; _/ B$ M - STA MAPPER_REG_BANK_DATA1 Y' M* `6 Z u/ ~9 L# j' G
- .ENDM$ V* |+ J4 _$ s+ `, S$ D& d
- " r* ~; q6 Y0 f: \' X2 W
- MACRO_SWITCH_BANK_A000_A .MACRO) n" \: k+ A7 Z( J3 Z; F$ }
- PHA
& p* h, Q" J+ z - LDA #$07& B1 f$ `: d- G, ]; e
- STA MAPPER_REG_BANK_CTRL' Q; z2 [& y. }8 B
- PLA! f. `- B$ A! o# c- s3 T P
- STA MAPPER_REG_BANK_DATA
) E; y7 C$ `9 q: ]. m - .ENDM
. Z) q8 [5 m& L5 A -
$ ~2 R7 q7 ^/ y: d0 E" C. y - MACRO_SWITCH_BANK_C000_A .MACRO
+ Z c% e. b: S% |! o' p! P1 Y - .ENDM
2 S6 y7 O+ Q4 w- ^ - * B/ ?; O( {" @( p: V7 Q
- MACRO_SWITCH_BANK_E000_A .MACRO/ x1 C# { | J5 P
- .ENDM7 a5 O2 A* p* T: [2 m( |
N# |, }( K, O! L* _- ;====================================================================================================
# \' w6 ]& \9 h' X: M% q% t - MACRO_TRIGGER_FIRST_IRQ .MACRO9 U& ^* S/ {, w( D! ]1 O4 f$ [
- LDA #IRQ_SCANLINE_BEGIN + 1
g- R, I5 C1 V |& x; a5 O - STA MAPPER_REG_IRQ_LATCH
& @& I4 a8 A" W+ o! K - STA MAPPER_REG_IRQ_RELOAD/ M' A5 z6 o) l8 m0 g0 [* L
- STA MAPPER_REG_IRQ_ENABLE3 `! l; ?- w; _ E2 A
- CLI
/ U* X- \7 w- {$ d% ?+ Q) T - .ENDM
( S2 Y9 d; G# B -
4 k, d3 U0 L( \& n% L8 f - ;====================================================================================================# G/ U' k! I, O# T! k
- MACRO_ENABLE_IRQ .MACRO
; y$ e; S+ j! K6 E3 v$ E - STA MAPPER_REG_IRQ_ENABLE
0 J+ ~. S. v/ r5 E3 e - .ENDM" Q( T, K+ |# d- a/ i
-
/ u0 V2 b% e6 K* y2 C" | - ;====================================================================================================+ c+ R$ c6 F+ ] g
- MACRO_DISABLE_IRQ .MACRO
1 Z8 S! H1 `: H. |9 p* D - LDA #$00
& o3 Y8 x9 z7 |5 ?3 G3 _ - STA MAPPER_REG_IRQ_CTRL7 b, g6 E% |1 ~7 C; Y ^
- STA MAPPER_REG_IRQ_ACK
3 q- U" z& j! c o5 ?. y - .ENDM
+ ~6 Q! }; y7 U: P - 7 n6 \+ k% r5 K/ r
- ;====================================================================================================- H: z* n) n7 p( @! x2 C+ w
- MACRO_ACK_IRQ .MACRO5 ]- j* W5 r1 b5 M: Q5 d! j: X
- STA MAPPER_REG_IRQ_DISABLE4 E3 J" {8 s& N0 c* }; q w. K
- STA MAPPER_REG_IRQ_ENABLE
) N# U; k; a+ j- C7 y$ d! w3 A; a - .ENDM2 h9 n1 D% I8 p$ p7 m d+ X
- 2 O3 w3 k* h0 w: O
- ;====================================================================================================! y. E; L/ P T& H5 h5 N9 R- K. t/ m/ i
- MACRO_IRQ_OPERATE .MACRO: s! j# _. T8 \$ h# F& f! v
' g: ? }) ]1 E- ;==================================================* Y7 e% O) ?4 m( S: I
- ;IRQ滚动模式常量
; l7 V/ I" s" p/ F* M - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动4 w1 K5 V, B0 D9 I% P5 Z1 i
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
# ?0 D" U/ `8 g - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
: C! B$ X3 ~' ^5 q - ' g. y7 l J- c1 [# _
- ;IRQ扫描线数据
# \* R$ T+ N! ~; q/ i( X2 u+ N - IRQ_Scanline_Data% P. O' R6 }' a& L# F7 w, m& t
- .DB IRQ_SCANLINE_1
?$ k* e& ~3 h" B, C - .DB IRQ_SCANLINE_2
9 e* R$ N" R% P, J8 e8 {& p" ` - .DB IRQ_SCANLINE_3$ B/ b5 H0 D c3 q4 Z
- .DW 00 ;关闭IRQ! J: j, v B& ]4 R( B
8 A6 w3 S9 q* z, P- ;IRQ滚动控制模式
{' Y0 e5 l6 k% {" G8 [; S - IRQ_Scanline_Mode
2 L+ t4 u- R( V) J# w! D* W7 P( j - .DB IRQ_SCROLL_MODE_RIGHT. A9 |" U, F' C' C2 z( f$ _+ |
- .DB IRQ_SCROLL_MODE_LEFT
o5 l+ [/ Y% P& k" N* h, P* L - .DB IRQ_SCROLL_MODE_RIGHT% Y6 R8 `. P* C+ `
- .DB IRQ_SCROLL_MODE_LEFT! R4 o2 t" |/ i. k- l
- ( r! q. S z3 o
- ;==================================================
0 S( A' }# B: p( T. D5 O - ;;IRQ滚动控制8 c H0 g& O8 ~
- IRQ_Set_Scroll
% } W: _/ o" s% Y1 ^ - LDX IRQ_Process_Index
6 h8 \/ q, |8 v$ ]8 M* d" P - LDA IRQ_Scanline_Mode,X
x: \4 T6 `0 w" d' H - CMP #IRQ_SCROLL_MODE_LEFT( x/ n( V9 B6 a+ r+ C( a+ p
- BEQ IRQ_Set_Scroll_Left0 u g- } ^. e! [4 q) g0 G5 P
- CMP #IRQ_SCROLL_MODE_RIGHT
2 U# [7 R5 n# r$ Z* c7 q4 b - BEQ IRQ_Set_Scroll_Right
6 u3 Y+ {" \3 i+ P3 ^ - IRQ_Set_Scroll_Zero;不滚动
) K/ l* C' o3 C' t# Q - LDA #$00
: J2 c9 n; w1 |) J; m - STA PPU_SCROLL% b( \* X) S0 m. J9 E. q; E
- STA PPU_SCROLL
1 w/ A/ u% y" H: j0 P2 C: {: E9 O* V - RTS" G% ?9 [$ o( ^( P
- IRQ_Set_Scroll_Left;向左滚动
# o7 `7 a3 F8 X! | - LDA Scroll_H( S. U4 q' H1 T* v9 j0 a
- STA PPU_SCROLL" g5 v# G! p) T" T" O
- STA PPU_SCROLL
% A$ y2 A5 I' u* Q+ |& c' V - RTS# e( g5 w: W! q
- IRQ_Set_Scroll_Right;向右滚动
) K2 K: q0 r" b3 z - LDA #$00
: ]& R4 l! A& O' K - SEC& d4 r6 D) v" u4 l! @2 ], l
- SBC Scroll_H
' |# I0 A- I! X% K j: {2 w; ] - STA PPU_SCROLL- q: z9 Z- d% a6 n! |0 F
- STA PPU_SCROLL
* _" _6 u9 D4 v: ]6 g - RTS
m4 \4 Z( S9 b O* o; q6 O. _9 w -
5 C7 h$ L# p% m1 V - ;==================================================
( y8 @, e8 N) t* [, ` - ;;IRQ滚动控制) o% N' m7 u l" M* w4 M3 _* W- E
- IRQ_Set_Ctrl
, e- K4 i" r) O1 P( f+ R" d6 G7 r - LDX IRQ_Process_Index V+ v* N' ~3 z! X
- LDA IRQ_Scanline_Data,X0 U1 Q/ S4 r3 Y& g' x
- BNE IRQ_Process_Latch/ B8 T" F1 i3 i, i# s! E" s& j! s
- IRQ_Process_Disable;禁用IRQ
6 C _9 d# j C$ p - STA MAPPER_REG_IRQ_DISABLE
% @* E3 G; z/ E) b5 Z$ d) ~, \ - STA IRQ_Process_Index
# o$ l/ x v) M - RTS- s' ^1 I6 I& U7 a$ g2 ~5 f
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
1 h# G6 B& H0 N# S! e+ H) j ] - STA MAPPER_REG_IRQ_LATCH3 L5 W5 c* b: c/ Y4 H
- INC IRQ_Process_Index- J5 @. S' N5 \' @
- RTS
; ]5 F0 c: r; G5 r- Z; N - - W# O3 h* M0 Z7 f0 L
- ;==================================================
* w- Y9 s1 {1 u - ;IRQ处理: o$ R0 E6 S3 w* Y. }, D; u* l- L$ I
- IRQ_Process_By_Index6 `* q1 o {; l# s( ?6 o7 q/ M6 M
- JSR IRQ_Set_Scroll0 x/ i, n: L5 Y& Q6 ^
- JSR IRQ_Set_Ctrl
5 j: D- o$ a$ [, E5 c; l5 G - IRQ_Process_End5 s+ u4 w* }5 f8 R' V4 S$ y) V- G
- RTS
6 H; H! f/ M/ a U" H - 2 W: w! `4 g. B' r; c1 k) P
- .ENDM
8 j1 ?% v! b; C: q9 B- D! ~ -
- @- G: a( T' k& S9 {8 L! t
复制代码
! M( h) M$ J" d I# E3 E# s( q% z7 M. a6 D" Y
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|