|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
) S" @. V1 G3 h: E, F5 u' x( F/ z) N+ j2 a. Q* M- N- ^
本次IRQ研究了如下:
: S9 W( h1 P$ f. y) W6 m$ aVRC2&4(Mapper21,23,25)
0 I/ S. n2 W0 @; D I5 E! ?& gVRC3(Mapper73) c* `& x) q( m2 E4 i) r+ `* V
VRC6(Mapper24 & Mapper26); e+ y3 n( s/ y4 n) y1 Q
VRC7(Mapper85)5 ]9 r1 ?( r# V* D
MMC3(Mapper4)1 W" n R* F4 V. T
MMC4(Mapper10)
& N; Q- D' l6 o' l2 PMMC5(Mapper5)
2 n2 `% e7 R9 k P7 R- I) SMapper18& s4 t. k: K6 s6 b
Mapper64+ l" w" N2 i Q% E s7 p# g
Namco163(Mapper19)
( }8 I) ]! }% b5 dSunsoft FME-7(Mapper69)& k1 r5 s( t% q b
1 K' @- J: J# n8 {* n* D* @- X2 u
共计11种Mapper的IRQ操作使用例子
8 [, T z' z3 r. D2 I代码内有详细注释, 希望能帮助到感兴趣的人.9 W2 A6 e8 o% w N) X1 Q" c# J
' Q9 E' V. m$ k5 I: d9 n' P
( x* K) y( k5 D5 ]
$ u! M' E0 I$ p$ F- xMapper代码主要逻辑(以MMC3为例):8 @* [2 X9 b) S& u ]
+ y3 j% I0 N! E w3 D4 x3 n- ;==================================================
# r, M+ B& M/ v - ;Mapper号" ~* r+ ]! }) e7 m- S0 h
- MAPPER_NUMBER = 04! X, }, e8 v) B# P
- ;==================================================, |) i+ o# v$ ^6 g
- ;MMC3 (Mapper 4) 寄存器常量& j* y" {1 ^/ T4 b% w/ O+ N. L$ M
- MAPPER_REG_BANK_CTRL = $8000
) r4 c2 [& }0 E - MAPPER_REG_BANK_DATA = $8001$ D% C! G) B# m. t' Y4 |
- MAPPER_REG_MIRRORING = $A000( [' Z/ v& ], |8 s+ i- U: J
- MAPPER_REG_PRG_RAM_PROTECT = $A001
3 m: ]- d& f5 Q - MAPPER_REG_IRQ_LATCH = $C000, u2 G6 i+ |3 w6 k* Z. F) |; D
- MAPPER_REG_IRQ_RELOAD = $C001; T7 t2 t% v* I# p; M+ s8 J \* l
- MAPPER_REG_IRQ_DISABLE = $E000
" ^- t% v6 G G2 W( P' k - MAPPER_REG_IRQ_ENABLE = $E0019 [! R9 I* G9 I6 E) U* }
- ;==================================================" G# v& {, Z P
- IRQ_SCANLINE_BEGIN = 135
* S) L Y! O" \$ C) m2 t$ X - IRQ_SCANLINE_1 = 8! p1 P! u3 \" Y
- IRQ_SCANLINE_2 = 54
1 B1 |( }9 } F- r- f% A" Q- V - IRQ_SCANLINE_3 = 8
7 v) S# G- |6 U - ;==================================================, m: I" i+ n& }+ [+ V
% G* p2 O. a! @6 J" G% C! @- ;====================================================================================================
; J# w! M* y2 \% q - ;宏常量
: f; p* |7 ]+ s8 }4 ]" | - ;====================================================================================================
- [0 I: r: W6 [5 L - - y: R+ L% N4 N6 @; Z4 `
- ;====================================================================================================1 _8 ~& `- T6 d- G3 P# X
- MACRO_MAPPER_INIT .MACRO
/ y! {7 y5 h7 n% V& H+ C- s - ;禁用IRQ
5 c( p2 N: v6 e - STA MAPPER_REG_IRQ_DISABLE
& k, o- V8 W4 D5 o7 A - 5 N0 z" n+ _9 d* T% I: `
- ;水平镜像
S9 I. `+ K; c6 C& e9 j1 J/ \ - LDA #$01
) s7 Z5 }- o Z; `% N: w9 W* @ - STA MAPPER_REG_MIRRORING
8 h2 u' t' I: B - ! K# ?( l! ]" ]0 B- w
- ;初始化图形bank
1 E1 c! h3 Q% A( p - LDX #$05
& P) o. n8 j8 w0 l) c - .Init_Chr_Bank) a# J- O7 T$ w( z( x% t$ Y
- STX MAPPER_REG_BANK_CTRL
' `8 E2 g% o6 ]1 j - LDA .ChrBankData,X
* ?4 v$ a; e4 j! [8 n* ]. f6 ^7 G - STA MAPPER_REG_BANK_DATA
9 M2 f, Z ?% m" _ - DEX
% T- U2 v6 E3 F4 X1 Y+ ~ - BPL .Init_Chr_Bank
( U4 u# N( J h7 p - JMP .Init_Chr_Bank_End
- a+ M( h/ p: U5 O& {- y. ]2 o - .ChrBankData
0 i5 @( F8 J8 R! |9 X1 I - .DB $00,$02,$04,$05,$06,$07/ w. ]% U! r. i- x |8 r$ j8 F! A
- .Init_Chr_Bank_End$ ?' @5 m% O; P2 h$ ?4 d
- / b) g. Y* y) ^6 _, R- j
- ;启用SRAM @8 Q" ~2 C. T# p
- LDA #$80, x$ j1 }; F3 [. I
- STA MAPPER_REG_PRG_RAM_PROTECT
! I t* ]8 o, R) k0 p/ z - .ENDM
( H* D9 X q9 @
' w9 P4 @# Z5 @5 A! ^4 Y- ;==================================================================================================== v+ y! ]2 h. m, W: F* j/ _( a( }& Y
- MACRO_MAPPER_SOUND_CLEAR .MACRO6 Z% V& h, G+ H9 z$ I# F3 s
- .ENDM* {, J! [1 N- F
-
% ^; L D- l6 u% X - ;====================================================================================================
% }7 @- a5 Z! Q& m' e" g - MACRO_SRAM_ENABLE .MACRO) j; _2 r+ u' _, f
- LDA #$80+ _% ~2 o0 Z+ |* M7 u! w( O/ v
- STA MAPPER_REG_PRG_RAM_PROTECT
! Y) v6 x. z4 S7 y, V. o" q" e - .ENDM
& g8 p5 h: S$ P7 z; ?& R, ~ B$ z - 6 \. r6 ?! m# U; Q
- ;====================================================================================================
# @( r3 n5 o# b5 |( B" D - MACRO_SWITCH_BANK_8000_A .MACRO
! h! R3 }4 X) h' a - PHA
+ H5 n$ e$ ?& D; r; e - LDA #$06; _# s' {: S* J
- STA MAPPER_REG_BANK_CTRL- W, `; s0 g1 \
- PLA A: t7 ^9 Z$ S& H, [
- STA MAPPER_REG_BANK_DATA
` ?) N/ T4 N/ ?8 _1 t - .ENDM
6 ?. [2 y6 t2 X. I. N
8 o# Y- @, d2 I7 F" ?- MACRO_SWITCH_BANK_A000_A .MACRO6 a2 S. x* f# k3 C# y% K( D7 o4 \
- PHA8 m/ d9 }# A' j( C: e) N1 u" l
- LDA #$07
. y4 L) Y6 \0 H8 V K - STA MAPPER_REG_BANK_CTRL9 M% @1 C+ _& Q
- PLA ^* r( Z& y- t, N, L5 m5 Q g
- STA MAPPER_REG_BANK_DATA
7 e! j2 ~+ r; ]0 B5 j - .ENDM
3 [, l0 Q% {7 ]3 z: l- k - & d% q6 M6 Y4 W$ e! C3 X
- MACRO_SWITCH_BANK_C000_A .MACRO* v1 Y8 a p. I. q7 ]
- .ENDM+ h2 Z' R7 s& X" _% U7 V4 Q
6 ?! n3 F) ?, Q. C; z' |0 s- MACRO_SWITCH_BANK_E000_A .MACRO0 D' y% V6 T! N( l+ X
- .ENDM7 H! K6 v- N" \1 r
- 6 A5 Y$ i; i4 B' a& b. J
- ;====================================================================================================
* B5 }) R: b) ~/ L* ?3 q& b: \ - MACRO_TRIGGER_FIRST_IRQ .MACRO
2 L" R1 b* k% _3 W( [ - LDA #IRQ_SCANLINE_BEGIN + 1
; @- [. T( U# \$ i+ R2 O - STA MAPPER_REG_IRQ_LATCH
0 |, v' X# y. G3 [& d8 A9 y( S% H) @ - STA MAPPER_REG_IRQ_RELOAD
4 {5 n5 ?! ` E2 v/ E - STA MAPPER_REG_IRQ_ENABLE
' [1 H3 L7 b+ R% z - CLI: F6 `1 O- J4 l
- .ENDM/ ~0 O) }/ J! w) ]! l
- 4 a/ {- x$ M1 L
- ;====================================================================================================
' P9 A( w3 H$ c' ^ - MACRO_ENABLE_IRQ .MACRO Y, ~. G8 t, [$ x. C- E! `
- STA MAPPER_REG_IRQ_ENABLE
- j' C$ Y! Z) H% F - .ENDM
( T1 w% }/ S6 B- ^2 W2 W2 ^ - 8 K( A+ F. m+ E. o# c$ |
- ;====================================================================================================- c" N3 P- `. Z9 _
- MACRO_DISABLE_IRQ .MACRO4 z% p, {& e" { i
- LDA #$00
$ x$ S6 z5 n' f: F0 @9 g - STA MAPPER_REG_IRQ_CTRL/ |$ a+ X6 I! ], n; C
- STA MAPPER_REG_IRQ_ACK7 Y; H+ S T- o8 D9 p5 j9 r
- .ENDM
# T6 Z% B: f# H9 ^ -
, Z1 B. W8 U1 k+ O5 Z8 k - ;====================================================================================================
8 W. }( P+ h$ [& T - MACRO_ACK_IRQ .MACRO3 q. o4 t7 J) [; s& Z; W7 [* W
- STA MAPPER_REG_IRQ_DISABLE
! W# `* |: ]; Z; z5 u' K$ Y7 V4 E5 r o - STA MAPPER_REG_IRQ_ENABLE
8 R- ~# m" y3 @7 v - .ENDM
6 x9 k: _7 Z) g+ ^4 [; [2 a/ o -
) E5 y, K) i6 t( H; ~ - ;====================================================================================================
" W; }2 g# k7 P, w4 F8 M - MACRO_IRQ_OPERATE .MACRO, C& I2 E+ I( l7 u/ s+ R. k
- 9 V; ?* O5 r5 K# j- r* o
- ;==================================================+ P8 R9 T1 o4 W) T) ?/ O
- ;IRQ滚动模式常量
7 c0 Q, n; e9 Z. t/ P. T: L - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
- P" z8 K: V% V; U2 E1 V - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
8 s( {1 p& |' l# L - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动/ t, R, z6 q7 w# N1 r
; g+ m& p$ [& s$ J+ a- ;IRQ扫描线数据% F) Z/ G, J: O( }* q
- IRQ_Scanline_Data
: B T" U9 _1 }' J7 y* V- y3 U - .DB IRQ_SCANLINE_11 M. X9 D. w8 q+ s- I* Z# ^
- .DB IRQ_SCANLINE_2
% P+ W0 V+ Y J$ m; S) X0 X; h5 ] - .DB IRQ_SCANLINE_3( k/ M0 r. b7 q
- .DW 00 ;关闭IRQ
/ t {" L; m% o2 j - $ g: a7 y& k* Q5 a) S
- ;IRQ滚动控制模式
8 \& x. v( _& d; A+ r& |9 y - IRQ_Scanline_Mode0 f! r. ~. Z8 n
- .DB IRQ_SCROLL_MODE_RIGHT. O: J0 U/ |: \
- .DB IRQ_SCROLL_MODE_LEFT
' u8 H. H3 U2 |+ L3 z - .DB IRQ_SCROLL_MODE_RIGHT
: ]* {( U4 U: I9 S- [ - .DB IRQ_SCROLL_MODE_LEFT3 A& h3 `6 h0 S. k4 l! W' q1 m
+ ?# O- x* O# I4 P- ;==================================================2 B* y+ d) d+ `, D5 g2 x
- ;;IRQ滚动控制
" V( N! r4 U; H4 } - IRQ_Set_Scroll. v6 H( i/ `! |
- LDX IRQ_Process_Index/ R' i$ O0 J$ R' r4 l8 H2 m3 x* C ]; @
- LDA IRQ_Scanline_Mode,X
* I/ e+ W/ W$ O/ d5 z4 l - CMP #IRQ_SCROLL_MODE_LEFT, x2 }9 d1 N9 x; Y4 W1 t
- BEQ IRQ_Set_Scroll_Left$ L. K8 o" Z: s- D9 a' W8 U" D% y
- CMP #IRQ_SCROLL_MODE_RIGHT
, J' X& X$ y! }: n - BEQ IRQ_Set_Scroll_Right
1 x$ E- k( q# a$ d - IRQ_Set_Scroll_Zero;不滚动6 d" ` ?9 {6 X- I/ u {" V; l1 Y
- LDA #$00
. y2 C$ [: F6 c/ `' F! Z - STA PPU_SCROLL
& o1 e6 r, N5 d- t - STA PPU_SCROLL
4 E. S. f& D' O - RTS
4 a4 B2 ?$ T- g; ~0 \6 { - IRQ_Set_Scroll_Left;向左滚动- u4 Y6 V" d( T- Y* W# }
- LDA Scroll_H
5 Q& R0 u; t2 Y3 N - STA PPU_SCROLL
4 s8 _$ R( T# @( i - STA PPU_SCROLL$ `$ {( D" d# |9 G3 F& b$ Q* v
- RTS5 L$ e. ~& B7 c# P1 e# a- F* u
- IRQ_Set_Scroll_Right;向右滚动
# V# D% k! s3 W; ?( l* n* M! v - LDA #$00
2 R( j3 c$ h( \, y& g/ f - SEC
7 c% L7 R$ k9 @% Q0 \' [3 x - SBC Scroll_H" F' U2 ^' `* p' ~
- STA PPU_SCROLL) u4 a3 r9 R7 Y# P2 p
- STA PPU_SCROLL/ {, A: I2 g( Z0 m! y7 G! ?
- RTS
$ \$ {& ]+ l" e; J. q -
. ]& N6 R5 C$ y - ;==================================================$ `3 a0 g% `: b/ h4 x
- ;;IRQ滚动控制
! f* D* I% m" Z0 h: U' Q0 W: l - IRQ_Set_Ctrl# I% {: x6 B0 O, U) R' M9 C) G
- LDX IRQ_Process_Index
- Y+ ~: ]! H2 S3 v% q7 _ - LDA IRQ_Scanline_Data,X, u% Y" B9 G$ c& q; |) e8 p
- BNE IRQ_Process_Latch+ f o$ l0 O4 H6 k
- IRQ_Process_Disable;禁用IRQ P/ v3 c4 c: w
- STA MAPPER_REG_IRQ_DISABLE# d n$ R/ t1 B# F9 u' v- W- s
- STA IRQ_Process_Index
8 ]: R, l) E% N$ E7 ] M* z0 H - RTS
2 @2 M1 G- ^5 X- F* p - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
4 `: I$ ~) o+ h) A! D - STA MAPPER_REG_IRQ_LATCH5 e3 I8 U# L7 J; e
- INC IRQ_Process_Index
. M3 K0 P/ C; P; L - RTS9 |( S+ ~8 X. n; Z: F
- 1 I/ p/ B6 r$ m/ y% N7 \/ L; M) n a
- ;==================================================; A7 g, `6 [7 v+ A: l1 }
- ;IRQ处理
( y) m8 w! e& B: O6 @" N/ K - IRQ_Process_By_Index' j( Y+ Q d% ~; S1 V' p
- JSR IRQ_Set_Scroll
" `7 {4 a# M/ T d - JSR IRQ_Set_Ctrl1 j* g- C: n: K) Q6 k2 b
- IRQ_Process_End. y7 @& ^9 N1 A4 P( u" T7 ?# i
- RTS8 n g; q. C2 D6 T
- ( T9 M; E7 Q; z9 t3 }( K$ }# }
- .ENDM
0 E- C4 w9 ^) d: m. a/ E1 k# V - 9 {6 e3 R6 N1 W& U3 u2 ?3 p5 ^
复制代码
_4 @7 w3 ~, g( }! R
! U" M* z9 ^7 {7 y- t代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|