|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 # `1 `- ^3 R, I1 o3 d
; C9 }( U+ h) n9 |3 C% K- }5 i本次IRQ研究了如下:
/ _3 P3 }0 {6 L9 A4 SVRC2&4(Mapper21,23,25)
. Y4 ` U& G! l1 ]4 W1 u% I& KVRC3(Mapper73)( D$ U5 `; N) {1 \ j+ a
VRC6(Mapper24 & Mapper26)# h% |3 D: y7 ]: @2 A H1 y+ j
VRC7(Mapper85)4 ?3 d: X7 R+ B: n
MMC3(Mapper4)
. |+ I& a0 r. {( ?MMC4(Mapper10)
" ?) G4 B2 d9 o2 GMMC5(Mapper5)
6 E# |$ q" i3 v( g! w0 sMapper18
& o, X0 N" R7 NMapper64
! J: V2 l( x5 D+ y8 uNamco163(Mapper19)
; p: {2 c1 x: nSunsoft FME-7(Mapper69)2 L6 U( g0 W; T5 e+ U
* x$ Q i& k, l) C- ?
共计11种Mapper的IRQ操作使用例子
$ M; k8 `: y* M代码内有详细注释, 希望能帮助到感兴趣的人.
; V4 l+ e- g2 w# M1 I1 v- O6 Y% b
' d# S" m/ X* \3 k: _ p3 V3 T: a' H' `- L' W
Mapper代码主要逻辑(以MMC3为例):; Y" Y. O* C. A3 @: x$ d9 i2 N- C0 E
, ^- {" A& @% x0 J% @( K- ;==================================================- S* N: q Z: E
- ;Mapper号' ^6 i$ Q k$ q5 @5 C1 [% t1 f0 c& r
- MAPPER_NUMBER = 04* v3 V9 C. Q/ [; ]4 @1 L& Z
- ;==================================================8 H4 b9 @4 F0 T
- ;MMC3 (Mapper 4) 寄存器常量
' \, o- w1 h, V+ c P, t/ ]3 j - MAPPER_REG_BANK_CTRL = $8000* n* }: F S5 [6 N
- MAPPER_REG_BANK_DATA = $8001
5 |! C4 e7 d0 D" r - MAPPER_REG_MIRRORING = $A000- q5 h+ ^: N$ @4 ?. t8 b
- MAPPER_REG_PRG_RAM_PROTECT = $A001
4 f- X/ v+ M. n" \: V - MAPPER_REG_IRQ_LATCH = $C0000 j) S9 h; h; l. P2 I d( i
- MAPPER_REG_IRQ_RELOAD = $C0018 `" T( k- K5 T3 a, v$ l
- MAPPER_REG_IRQ_DISABLE = $E000; n4 d& N2 ~! F! x3 `8 g
- MAPPER_REG_IRQ_ENABLE = $E001
; L8 }( Q% m/ y# m6 t - ;==================================================
. {: {7 R! Q6 H+ ?- X0 R& o - IRQ_SCANLINE_BEGIN = 135) T/ V8 y9 r7 E* V/ E$ m+ ~2 Z
- IRQ_SCANLINE_1 = 8
/ W: y! s* p1 r) H - IRQ_SCANLINE_2 = 547 r' B7 n. g9 P5 z& H7 s5 z
- IRQ_SCANLINE_3 = 8
4 @0 h/ Y5 ~. g3 h0 \" G( a% l" q - ;==================================================
9 d+ ^+ k. s7 w# U g - - z! w a, K* @$ U* ]5 D5 \
- ;====================================================================================================2 c1 A3 O. k8 i5 l, H8 O8 }
- ;宏常量
. j- a( c) F4 d. a/ f3 {' l - ;====================================================================================================7 M! r' z% B0 I8 Q4 r
- * H* K9 a+ A9 b0 V2 @
- ;====================================================================================================4 z) e) f# m# n7 H1 O" S
- MACRO_MAPPER_INIT .MACRO# Z9 d/ R* P B' T
- ;禁用IRQ- n% T1 N8 h+ g- N0 e
- STA MAPPER_REG_IRQ_DISABLE! I. p; L6 ]2 O U. q) N% K7 k
- 0 o9 w% e4 M9 ?5 x. A' M4 }; B
- ;水平镜像
. I" M2 d* c) ^! p( E - LDA #$01
9 `) D- K# b5 ]9 J+ F - STA MAPPER_REG_MIRRORING* x& k/ p7 _, q9 l( A7 ]) z& d' A
-
C* i+ g# b4 X$ ~. I - ;初始化图形bank
9 C0 F8 t, \* a2 \/ t( e/ M - LDX #$05
0 _! ]& W/ S% p2 ]. H% R - .Init_Chr_Bank
9 N" z6 }) O2 E8 ^ - STX MAPPER_REG_BANK_CTRL! `$ ^. i% G# E b4 o. Y
- LDA .ChrBankData,X9 O- v0 R# M- D- o0 ]! |% W
- STA MAPPER_REG_BANK_DATA( D) }$ N+ x2 p7 X( s4 |% L- K& ^1 l
- DEX
' f! o+ L5 A) \0 L7 L J - BPL .Init_Chr_Bank; I( D9 O* l0 o- h. {
- JMP .Init_Chr_Bank_End6 ^7 Q" y8 A. `# L! e# {8 ~
- .ChrBankData
& U. j, p: w7 Y# R. j5 v - .DB $00,$02,$04,$05,$06,$077 B- K! X- n3 Q3 n/ I7 j8 c
- .Init_Chr_Bank_End% z3 t- [5 K. B5 @
-
& |" k, ~3 w! K; M! Q$ R - ;启用SRAM
3 V) _2 a1 n; ?: L - LDA #$80' o4 u3 l/ ^) k$ [6 c k, u d: Z
- STA MAPPER_REG_PRG_RAM_PROTECT
! X/ O C% Q; E& o& h - .ENDM: U5 e$ T/ }8 P$ Y, v/ H* N
- ! m1 `/ }( t* t4 S
- ;====================================================================================================
2 a, T0 f1 ~2 B" d- A - MACRO_MAPPER_SOUND_CLEAR .MACRO
! [- X) e& T# J9 T" R* h0 P5 i - .ENDM5 g+ G; ?( K( `
- ; I0 }- W9 a9 d6 ?
- ;====================================================================================================: }4 Z8 u r7 Z* X4 L
- MACRO_SRAM_ENABLE .MACRO
1 e# @! Y& V5 t. d7 W - LDA #$80
- @& b; v6 v7 t8 B: L6 q. p - STA MAPPER_REG_PRG_RAM_PROTECT9 o) s& ` F( f3 f8 e% v) O% X6 w
- .ENDM
! a M; {" y/ r9 T- Q( l( M -
! W" S x3 R( |/ Z - ;====================================================================================================8 G1 O/ G- S0 X( h
- MACRO_SWITCH_BANK_8000_A .MACRO" p6 e: Y! @6 @
- PHA: e6 c& y! B G! T6 F
- LDA #$06% W5 j7 A' b) q1 A& J
- STA MAPPER_REG_BANK_CTRL
/ ]% P9 W( B: B: S; k" Y - PLA
! n4 w- j7 l8 H! a) _0 j - STA MAPPER_REG_BANK_DATA
8 f7 q6 @* f$ `$ r2 a - .ENDM/ K8 A' E6 N$ t' A! \
+ V& I" w+ |- a9 E0 ~- MACRO_SWITCH_BANK_A000_A .MACRO6 W/ u9 ? x0 h" Q9 ?/ M- Q9 ^$ U
- PHA- y8 f% R# r F ~
- LDA #$07! k, ?* e* @% o& v$ A7 Q0 D
- STA MAPPER_REG_BANK_CTRL% q( e% |$ U2 p4 I/ e$ g. ~
- PLA
6 O2 ?4 x: U0 Q& j4 k7 N- M - STA MAPPER_REG_BANK_DATA
- y% K0 B* a" u3 E9 S( m6 L - .ENDM
, R' ~1 h* b7 k5 ` - - {: S% T Y* h" n! S. j( Y+ s
- MACRO_SWITCH_BANK_C000_A .MACRO7 P: @" C" G5 r/ p/ B% {5 y. l I
- .ENDM+ P5 ~5 e) t) u4 G3 D" L
& x. Y) D9 l0 j( M- MACRO_SWITCH_BANK_E000_A .MACRO
8 }+ J* _. |8 a4 k! f - .ENDM
+ F0 ?8 @ E/ z - 2 |7 i7 g `+ c2 `4 |& x
- ;====================================================================================================
1 |/ e7 @9 D5 J) E; | - MACRO_TRIGGER_FIRST_IRQ .MACRO$ D$ a+ S2 g& s
- LDA #IRQ_SCANLINE_BEGIN + 1
, H, H# j7 j1 e - STA MAPPER_REG_IRQ_LATCH
" x5 T5 I- O( A6 p( f0 G - STA MAPPER_REG_IRQ_RELOAD
5 e, z. M1 t9 ? - STA MAPPER_REG_IRQ_ENABLE3 ] ~, U+ p) M/ f! X) Y6 d
- CLI
. b" T* s6 Q2 B# d. K3 [- ] - .ENDM8 T$ C5 n& k# E; ^8 u, ]
-
/ e' C0 u0 S. G" a' J0 l, j - ;====================================================================================================
. o+ J5 s6 G& F1 G/ Y. | - MACRO_ENABLE_IRQ .MACRO2 ]3 X) J7 [2 [$ E- J
- STA MAPPER_REG_IRQ_ENABLE% B0 |7 l' T+ y
- .ENDM/ L* v I' W1 Z& @& h
- ' O3 F: v' c2 I. A
- ;====================================================================================================
! K# _8 M/ M, b& c b, [2 x: S - MACRO_DISABLE_IRQ .MACRO
& F, }! u7 ^( k; O {) s! D - LDA #$00 |4 m9 o: l- `0 P0 X6 M
- STA MAPPER_REG_IRQ_CTRL
0 _+ H. |& `7 U3 { - STA MAPPER_REG_IRQ_ACK) \& A+ m! P2 f7 x7 q
- .ENDM
1 s4 ^2 J; M9 z; p6 ~ -
, b( A6 v% }3 B, x( G0 P% K - ;====================================================================================================
8 k/ P' W. Y; ^7 x3 I - MACRO_ACK_IRQ .MACRO
+ [. \2 t7 e! ?; U, B9 e r+ i5 @ - STA MAPPER_REG_IRQ_DISABLE
8 P$ R' @( }! I' i3 m8 @ Z. J5 Y3 } - STA MAPPER_REG_IRQ_ENABLE+ W$ U' ~8 J7 }- V
- .ENDM
p7 H4 D7 e: i# x - . @ U% S- U) @3 _
- ;====================================================================================================
$ z# v' g+ b5 k - MACRO_IRQ_OPERATE .MACRO; c1 k. v# @/ n# ?+ ^
# F! h: V7 t; O- l- ;==================================================" N' i0 \- t" U) b# S; T3 f
- ;IRQ滚动模式常量: O0 T$ x1 U4 x( B6 p/ F8 O' W: g
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动2 V8 k3 E3 j* i# \* a K, n
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
, ?0 ^$ S0 t3 ]: E" M2 S9 k - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动+ N* ~% Q* ^) o: V8 Z& o3 d
- $ N0 m. j& F. |! r4 r2 i# U
- ;IRQ扫描线数据
8 J% L) v/ Y, `6 f: g7 m; y: W. h - IRQ_Scanline_Data
1 }, O$ o7 o% q& Q - .DB IRQ_SCANLINE_12 l. E1 o# D: o5 }* P
- .DB IRQ_SCANLINE_2
- F: [: C! m6 J+ |; ^, o4 H2 [ - .DB IRQ_SCANLINE_3
/ [, @8 U8 D5 Y% C: | - .DW 00 ;关闭IRQ
: V5 E. |& j1 ]$ ~ - $ S3 d5 [ O1 l m
- ;IRQ滚动控制模式: p: x ?% b( y4 {4 C/ O$ {
- IRQ_Scanline_Mode$ {9 z4 E4 s. H: {. l( a
- .DB IRQ_SCROLL_MODE_RIGHT
4 r2 U2 z5 H3 s! ^& m" y, K - .DB IRQ_SCROLL_MODE_LEFT
9 A0 t- g* b: r' X - .DB IRQ_SCROLL_MODE_RIGHT( O1 X+ A. f w v4 ~; Y
- .DB IRQ_SCROLL_MODE_LEFT* _/ p# S) J8 @# S/ I4 N! g
$ ^& I R( x. c! B s) Y- ;==================================================" v5 ]) o: ]1 o7 f( |
- ;;IRQ滚动控制
2 b M. ?7 T4 X8 ~ - IRQ_Set_Scroll
: c0 a* A6 ?' ?/ M7 u - LDX IRQ_Process_Index) J) ?. |( \3 E
- LDA IRQ_Scanline_Mode,X3 o# ?6 I7 Z0 `( H& ^. \# D
- CMP #IRQ_SCROLL_MODE_LEFT9 m ^/ r/ O# B- P
- BEQ IRQ_Set_Scroll_Left
% }" L: B3 P- u - CMP #IRQ_SCROLL_MODE_RIGHT
, _! W% {: W, D- o, S' k& m' X - BEQ IRQ_Set_Scroll_Right
j2 Q" @( w7 o% f - IRQ_Set_Scroll_Zero;不滚动
" c+ T7 R9 k: S) u$ Y - LDA #$00
# L0 ~. \3 ?! Z" q4 _! Q - STA PPU_SCROLL
3 Y, S8 {; u% n; Y2 D2 Y4 A - STA PPU_SCROLL
Y+ v$ R* e: v5 ~ - RTS5 B) S! r; Z0 a8 E6 W# A4 G
- IRQ_Set_Scroll_Left;向左滚动
9 o1 C+ n) P5 y, i: W - LDA Scroll_H+ Z; [6 e/ r' x% W8 w
- STA PPU_SCROLL
" k6 {! i8 [1 x - STA PPU_SCROLL1 q. A6 q8 X5 T, E5 Y: n | z
- RTS8 U8 V# D2 Z0 p
- IRQ_Set_Scroll_Right;向右滚动" h, a' Q' a! u6 @
- LDA #$00( H7 M1 }2 P6 Y* p4 `
- SEC3 J+ x7 ` K4 E# O: g
- SBC Scroll_H
8 h. O. O: ^. w3 \* L - STA PPU_SCROLL7 A9 I) W7 M- r. X) {: B' H) h
- STA PPU_SCROLL9 ]6 h0 z7 p1 `
- RTS8 ]% O: M$ l; W0 ]7 W6 E
-
' a, E( V1 P# W1 l+ U) b. b; j - ;==================================================
! v7 Z! x9 ^2 ?1 g - ;;IRQ滚动控制" a% u8 D/ J; o- w% E! B
- IRQ_Set_Ctrl
7 w: s8 ?6 c; |8 c3 A - LDX IRQ_Process_Index$ m( k" [- A/ p
- LDA IRQ_Scanline_Data,X' {6 L& ^1 x( x' D4 ~& X, f9 c
- BNE IRQ_Process_Latch, R1 y; ~3 |7 }5 a+ Y: C; N+ b
- IRQ_Process_Disable;禁用IRQ1 x8 N/ q, |+ h* f! [; Y3 g
- STA MAPPER_REG_IRQ_DISABLE) b- I2 O- \- c/ k
- STA IRQ_Process_Index3 i' b+ m8 i1 Z* x6 _
- RTS6 f. V1 e/ N% q2 u* V- |6 r+ Z
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线: z: H3 M* `' N6 v6 _) X& c
- STA MAPPER_REG_IRQ_LATCH
+ K! Q. x, S7 w7 G* X - INC IRQ_Process_Index- e2 o( g' X0 B
- RTS
% A: ^' m# B2 x1 f0 b1 y. [; m
. O" y1 a# @- x8 Y) {+ M- ;==================================================
& F7 o' P7 V# G! t - ;IRQ处理
/ ^4 I( t$ B8 B: x - IRQ_Process_By_Index
6 P' Y( s) b, Z1 u! v' [$ P - JSR IRQ_Set_Scroll
* P4 w5 A2 a9 K& v( z - JSR IRQ_Set_Ctrl
8 A5 y& Q+ X, D# B2 C - IRQ_Process_End" F4 A- i5 ^$ O n4 G6 e* p
- RTS
" |! n: K9 n% w! S( {6 d0 \6 @ -
( |$ g/ q; ~6 J - .ENDM
' D4 D( |$ r5 W - 3 U7 p+ z1 K2 R7 E- ~
复制代码 ; D; |4 b' h# A8 m. C3 f! F
, q5 I" _( z3 z! h: i" ?4 r代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|