|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ( l9 ]6 j8 A7 B% b
# V4 g) \, N7 |本次IRQ研究了如下:
5 N8 Y- l3 a- ]VRC2&4(Mapper21,23,25)
6 Q' l9 D9 f' M# QVRC3(Mapper73)9 w1 V! ?7 w5 I
VRC6(Mapper24 & Mapper26)
p' v) q* d$ R( C- N. eVRC7(Mapper85)
7 E. S0 Y: h! _, GMMC3(Mapper4)
9 L4 o4 g: v6 }MMC4(Mapper10)5 P; C c" v# Q" g
MMC5(Mapper5)
' e% [5 X, X! K. L. I) iMapper18$ {3 N8 v5 h1 v, `- k; o5 y
Mapper646 w$ X. H; ~" _3 T, u
Namco163(Mapper19)$ B4 v f: v+ b7 H6 L; e1 c* w
Sunsoft FME-7(Mapper69)% x9 b4 }6 m0 m5 r
?2 l6 u' Z, Q/ [) M7 Y U
共计11种Mapper的IRQ操作使用例子
4 p' q% ^+ V3 J0 k! x* N代码内有详细注释, 希望能帮助到感兴趣的人./ d+ B4 Z8 n# @) Q
# \1 p' N7 f7 N  ) {! u7 X" S7 `: t
: n7 C! z( {% E% zMapper代码主要逻辑(以MMC3为例):! U( ]1 w0 z, J& O
- # _0 X( U" S+ N4 h$ h/ q
- ;==================================================
L1 K; }" u( U: C) G - ;Mapper号
& d+ g3 R% T/ _ - MAPPER_NUMBER = 04
5 C% T, G! t8 n! ~ - ;==================================================+ c8 J( |+ p3 ]! E7 t! y5 \
- ;MMC3 (Mapper 4) 寄存器常量; i6 S: }' X5 r- o4 D
- MAPPER_REG_BANK_CTRL = $8000
5 h" G) y1 Y3 X) _4 m2 D) Z8 g - MAPPER_REG_BANK_DATA = $80014 M, u' B2 j/ p2 V% Z3 [# u) y) r
- MAPPER_REG_MIRRORING = $A000
7 }# a2 @3 j) |/ n - MAPPER_REG_PRG_RAM_PROTECT = $A001
, s) r! d* s& x! }, B+ T6 D - MAPPER_REG_IRQ_LATCH = $C000* i: H3 H* Y4 A; _
- MAPPER_REG_IRQ_RELOAD = $C0017 H, ~, G8 q8 l: Y, a
- MAPPER_REG_IRQ_DISABLE = $E000" A6 K( d' D, @; l6 G. B
- MAPPER_REG_IRQ_ENABLE = $E001
8 F# F, a: y/ U+ O- w. I. B - ;==================================================
8 k: _* N/ X4 U# [ m9 | - IRQ_SCANLINE_BEGIN = 135
5 U$ M! ~3 Q4 C) b; s2 m - IRQ_SCANLINE_1 = 8, e: P. k7 ^' s6 L& P5 i# k
- IRQ_SCANLINE_2 = 544 m* y; t# w4 e# J
- IRQ_SCANLINE_3 = 8
% m6 E- ~$ C/ w( s) }) m2 s8 S! j - ;==================================================' }. T ]- K( j4 |# _& }2 n2 R
- ) N! S5 k' X, p0 j" k2 X" y
- ;====================================================================================================. r) T% K% P+ T
- ;宏常量
3 ^8 m! i# X7 a$ ]* _ F0 C - ;====================================================================================================# v" c! f. s, o g8 T7 P/ `% t5 Z8 Z
- 8 i' f4 B- {, a
- ;====================================================================================================
8 e! L, @4 o/ z- |& o - MACRO_MAPPER_INIT .MACRO
2 E) G: v4 Z, a% e( C+ Y. k - ;禁用IRQ
) g$ E! [2 S: d. l& ^ - STA MAPPER_REG_IRQ_DISABLE0 \2 n3 z6 L1 M/ F
- ' J6 Y0 b# n: ^) L
- ;水平镜像- u# L/ C. S+ G# n2 ?3 S6 h! ]% w
- LDA #$01
, H/ Z) `; [( @0 R) e1 b, t( g - STA MAPPER_REG_MIRRORING
, c: |4 r( h; s; [ -
, z0 J7 Y$ P6 g5 }! O$ x7 S5 ^5 C - ;初始化图形bank
7 L: F c d0 M$ `/ Y, P - LDX #$05
; t! R2 Q# W+ [7 v+ A - .Init_Chr_Bank
! H) W2 Y: ^4 ?- m S - STX MAPPER_REG_BANK_CTRL; T/ o7 H K' T' i9 h( r
- LDA .ChrBankData,X
& G! ~! m- y. g: I2 I' _+ b - STA MAPPER_REG_BANK_DATA
% q7 C) W6 `9 B, u4 B" H' L3 T - DEX, r2 t$ G) ]% M8 i, y5 K+ d( f
- BPL .Init_Chr_Bank' b6 E7 ~7 A7 ]3 Z" _; z
- JMP .Init_Chr_Bank_End
2 ]4 s7 @5 J3 N# `+ Q - .ChrBankData
B. b9 s" R! K7 `7 U8 i1 k4 w - .DB $00,$02,$04,$05,$06,$070 X! n/ h+ t: i: d9 u+ n+ L. P
- .Init_Chr_Bank_End
: c( ^7 n1 i1 P0 k; \" A ?3 L -
, w$ H$ E. ?) L _, Y+ e8 w - ;启用SRAM
! |3 x$ o0 l1 Z4 B% S - LDA #$80# w! w1 F+ u7 x& I+ j3 I. H
- STA MAPPER_REG_PRG_RAM_PROTECT
. }6 H$ { {/ l* M8 @& z - .ENDM5 D4 W1 v4 E- t" j) w4 w; {# z
# l- g' }1 b1 R. O+ q$ X* h- ;====================================================================================================( d2 `6 e& X k- |. i
- MACRO_MAPPER_SOUND_CLEAR .MACRO* [: v' ^1 e" I5 H) v' C7 p
- .ENDM
2 R) m. I5 Y/ _# y -
6 F- c* }# x9 i. J - ;====================================================================================================
; G3 i# ]. Z* y9 P - MACRO_SRAM_ENABLE .MACRO, R$ x- }/ n2 W$ T5 Q; v
- LDA #$80. A; I; [0 C, o+ K; n
- STA MAPPER_REG_PRG_RAM_PROTECT
# e. S5 t3 ?- |& n9 [8 V - .ENDM
, H0 K% E/ D/ h0 ^ - ( f8 R7 U/ C5 I* Z B+ m
- ;====================================================================================================) K# L4 X, z% F# s" Q9 m p
- MACRO_SWITCH_BANK_8000_A .MACRO
; N4 d& B% `3 U$ p& I4 Q0 Z - PHA
' a( t3 C1 P, l( v+ w - LDA #$06& {# h- g% e* s* E% W
- STA MAPPER_REG_BANK_CTRL
/ D) O+ o+ ?% t+ } _ - PLA
! ?2 o2 @0 B/ G! P& B* ] - STA MAPPER_REG_BANK_DATA
' q: w/ c3 f* L - .ENDM( {3 u1 h5 t: L! E1 z
- * R1 M+ x9 u+ y9 i1 L7 ~4 }
- MACRO_SWITCH_BANK_A000_A .MACRO6 x- x- D v9 e. t+ @
- PHA' u& M: K; v0 h" \
- LDA #$07
& V$ k4 W% l' J+ n' X - STA MAPPER_REG_BANK_CTRL1 A$ |; c( ]# G; u4 P
- PLA
& a( i8 r& T& V' n+ u. Y5 U - STA MAPPER_REG_BANK_DATA
/ k# ?# r$ f, s3 V' e - .ENDM
* i$ @; ^) g# \+ C Y7 p U H - / m: Q A* T X' [4 m! ]9 j
- MACRO_SWITCH_BANK_C000_A .MACRO6 C/ m$ w/ p8 g" \4 w) H$ S+ V3 x
- .ENDM
; ]4 {4 w9 E% `+ y( Q. w& K - 3 J9 m/ Z& R) m b' G
- MACRO_SWITCH_BANK_E000_A .MACRO
* _) @9 x0 o# O6 R1 v; R' A6 u7 ` - .ENDM
5 T. o2 A: \8 T7 o* R
% O1 e3 M3 V5 A% o, A( l' Z- ;====================================================================================================
2 @; _( |. K- Q! l - MACRO_TRIGGER_FIRST_IRQ .MACRO
. M* A: B' K y ~5 f - LDA #IRQ_SCANLINE_BEGIN + 1
. `& I: X! c* j3 G ` - STA MAPPER_REG_IRQ_LATCH
9 J+ X% S, L, f - STA MAPPER_REG_IRQ_RELOAD
+ G6 h4 ]% Y% {( a - STA MAPPER_REG_IRQ_ENABLE8 M/ K9 c t) F3 L" K5 g5 Y( o- y
- CLI
K! v: V) u, K/ H8 [$ `. ` - .ENDM
" u/ Z) Q. ~, |' ~ - 0 C+ B+ o1 w. u+ n4 W% u
- ;====================================================================================================
$ E9 [; m6 B% V( B9 V) _ - MACRO_ENABLE_IRQ .MACRO1 F c$ o1 a* B* l# j, z- U
- STA MAPPER_REG_IRQ_ENABLE
" }( E* S0 ^8 }& q - .ENDM
3 E0 [! e' e2 R# p3 d -
) o f) k, I3 ]' H - ;====================================================================================================
) `+ }) E) V% P) W$ ^ - MACRO_DISABLE_IRQ .MACRO6 z+ W5 _8 V! ^! D+ g [. [' K' z
- LDA #$00 x" O# [( N/ C/ y; M& ]: V; @
- STA MAPPER_REG_IRQ_CTRL
5 M; Q; T6 u2 ~1 k0 a - STA MAPPER_REG_IRQ_ACK
; ~4 |# ]( c" q- s/ X# C i - .ENDM! h+ s+ |9 w4 H' i& ]/ L# r% f
- ' n6 }6 F* I2 Q
- ;====================================================================================================
: J" R3 [# |' l5 ]+ E4 ~ - MACRO_ACK_IRQ .MACRO- @2 G1 r( X9 D& C( O; j
- STA MAPPER_REG_IRQ_DISABLE0 B* }$ O, ^5 m8 | D, Q F/ `6 V! T
- STA MAPPER_REG_IRQ_ENABLE
& `4 y) X3 B, r3 s3 y/ ^ - .ENDM
8 q1 x9 ]6 I' c -
" V0 ^1 ~' W, x2 Y - ;====================================================================================================6 N8 I$ I9 g3 Q+ K- p7 l
- MACRO_IRQ_OPERATE .MACRO
0 w* U* _% D' }7 h! a8 P Q - 9 l& f0 e: U3 E# P8 I
- ;==================================================
8 O# s8 L6 q) h, C - ;IRQ滚动模式常量
* x6 `' q8 _- D# I1 G5 H - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动( n0 d( U$ N2 M( j& }% U
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动( @" B* |* c2 G0 R2 @
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动, b9 j7 U8 F# h. k6 @& _" y' Z/ `$ d
- 7 z0 D( w: ~$ {! U2 T8 i
- ;IRQ扫描线数据# [$ B9 U! g+ r/ E
- IRQ_Scanline_Data
0 ~+ Y9 K/ s( r/ q: ^$ `. D - .DB IRQ_SCANLINE_1) D$ x, a7 m' _ v9 u) @+ W$ t
- .DB IRQ_SCANLINE_2
G) M/ n- Z+ Z- v8 q1 z - .DB IRQ_SCANLINE_3
9 j) G9 E6 o) ?2 F5 H6 I: p - .DW 00 ;关闭IRQ
M* T5 ?! l: n" m |! k - 7 [$ I4 b2 z! T$ ]+ Y( N' Y
- ;IRQ滚动控制模式6 P d/ M' D; y3 ]! X; m. K
- IRQ_Scanline_Mode
0 \$ x c4 D$ ~8 i7 { - .DB IRQ_SCROLL_MODE_RIGHT' z' o4 Z% u" ^! Z# W# G9 W# h
- .DB IRQ_SCROLL_MODE_LEFT
8 q3 ]% A; G7 [) ]- ^ - .DB IRQ_SCROLL_MODE_RIGHT
+ b; l* o% Y8 q& g" k+ ^0 g - .DB IRQ_SCROLL_MODE_LEFT
) b O: C" Y- ] I) m- D - ( Q+ J G% y, [5 o
- ;==================================================+ A2 u0 B9 J' r6 L( f
- ;;IRQ滚动控制
: ?. R2 V: i4 N. w$ A - IRQ_Set_Scroll. ]2 m' k+ U& Y( t% L
- LDX IRQ_Process_Index
2 A3 t" R$ q. h, z0 N - LDA IRQ_Scanline_Mode,X. S; E' L/ a5 C
- CMP #IRQ_SCROLL_MODE_LEFT
: R9 I a& p7 t9 l z- B7 m2 Z, D - BEQ IRQ_Set_Scroll_Left
7 q8 _8 y1 {& {" |3 E2 } - CMP #IRQ_SCROLL_MODE_RIGHT
! w0 X9 ^! z3 _5 N0 J - BEQ IRQ_Set_Scroll_Right5 ?% w+ H2 Y/ B' B* Q1 c; c- L
- IRQ_Set_Scroll_Zero;不滚动
& t" B, x' V' r, c! B' K9 v- @3 |* E - LDA #$00
# U; v: m( |9 q) t+ P# u& @4 d - STA PPU_SCROLL( x; w% ?7 u8 n$ ^( H; j
- STA PPU_SCROLL) K/ i* S& C f2 [) M5 W, E( Y
- RTS
% g9 }: E. p3 R6 U2 [' o, X - IRQ_Set_Scroll_Left;向左滚动! K0 g+ q) H8 f9 z# }! W- i( ?
- LDA Scroll_H
& V1 X1 t! m& z( ?1 j5 f$ m - STA PPU_SCROLL
6 o! {! k9 r+ P - STA PPU_SCROLL4 w/ g/ W% J# Q8 E
- RTS
8 G" |; [* f, p0 X: W0 [7 m; ? - IRQ_Set_Scroll_Right;向右滚动4 u) i. q) g+ }( X2 K: c
- LDA #$004 s; k" {4 ~4 n( l
- SEC6 } U& B4 b" @; s! Y
- SBC Scroll_H" `) z! d2 T+ w# c" R h/ l
- STA PPU_SCROLL
2 o* m8 K* B/ P, z8 k) D; M - STA PPU_SCROLL
( S$ u# \" F* H1 c' u, H - RTS
% o" n, }, o; C* v: J$ N -
% X6 M$ V! q$ ~( a- z - ;==================================================0 d$ s v0 u8 m4 g7 m0 S
- ;;IRQ滚动控制) @7 p7 s9 X5 i" c8 v+ I9 U8 ?
- IRQ_Set_Ctrl
4 M) {1 C1 ?7 I, o3 m - LDX IRQ_Process_Index
0 |6 A. ?" M' W2 @0 { - LDA IRQ_Scanline_Data,X
! i9 f" q4 I* i* g+ a ?( e- w$ Y# j$ W - BNE IRQ_Process_Latch
" q7 t1 h# t. s* y1 n! d - IRQ_Process_Disable;禁用IRQ
. A H) D. \9 ~/ a - STA MAPPER_REG_IRQ_DISABLE! o; a' e( T$ }( |( g* z8 T
- STA IRQ_Process_Index
* M4 r0 h7 z& \: N5 L - RTS
X- N9 {7 R' K# C" i7 i4 B - IRQ_Process_Latch;设置下次 IRQ 触发扫描线1 U+ K5 `" u$ ~$ k3 @4 i
- STA MAPPER_REG_IRQ_LATCH. i6 v1 t& G; B) j% H4 Q& b3 M) X
- INC IRQ_Process_Index
( h9 M# n+ [6 r0 j2 E - RTS; ^1 y: b5 @- ]' _4 `$ _
- 9 e8 J; d1 B/ B' B/ S- }# J$ X
- ;==================================================; d: H% s3 Z2 }2 [
- ;IRQ处理
; A! b" y# ?, [ - IRQ_Process_By_Index- `2 ~: } w ^& D( ^, H0 x
- JSR IRQ_Set_Scroll* t! [, z" \% }; i* a/ O# r
- JSR IRQ_Set_Ctrl
2 m/ @6 y/ M W$ e* y - IRQ_Process_End. _1 x0 c9 I& S L" u
- RTS
1 h& f5 o) I+ Z: E) |5 a - ! v* ~; _) x- Q; }
- .ENDM; I J3 m d' ~' U
-
/ M2 E' u' b5 H; R; [
复制代码 0 Z. B9 k1 n5 n
m( q+ |3 r3 q: r
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|