|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 + s' S; G; c% w% b" e( X
* \$ U! S9 V' V* G/ C! e; H8 @' I
本次IRQ研究了如下:
- H- l& g" S6 Y8 X3 i/ M( q, @VRC2&4(Mapper21,23,25)& D9 A: N/ W9 W& g
VRC3(Mapper73)
4 `0 l! J) g4 H# o6 C* uVRC6(Mapper24 & Mapper26)2 U( L9 R; ?: j3 Y( G2 K
VRC7(Mapper85)1 Q. y2 @, U- r$ U
MMC3(Mapper4)
3 H% r7 I F! X8 {# ?- R7 FMMC4(Mapper10)
5 l8 L J3 q q' D! C9 YMMC5(Mapper5)
- f0 t3 E3 `# N6 `2 m6 hMapper18
* {+ g* [* {* @8 \- Y- jMapper64" v" D7 s1 K4 P. \
Namco163(Mapper19)3 C2 [0 O$ e! Z3 |9 n, m0 w# z
Sunsoft FME-7(Mapper69)
3 W( V3 {0 A+ E) m
) O0 N9 d4 e" O( P( u* S6 q! R共计11种Mapper的IRQ操作使用例子$ n, l2 k. Y* u; Q- m
代码内有详细注释, 希望能帮助到感兴趣的人.
0 l# F: X6 M2 H- `( S, ]
! t7 x/ _4 i j# V9 s7 c7 Q) p  
$ i5 _/ o* j0 |/ y1 m$ Q' d: g& |6 S# x. `8 h! ]4 Z) M
Mapper代码主要逻辑(以MMC3为例):
( }! ]5 b7 i$ b- ( o' S/ K# _8 d! A3 Q
- ;==================================================8 v& a% T+ D' f8 _
- ;Mapper号# o& S, o7 b3 B/ X* j/ f1 y- \6 p
- MAPPER_NUMBER = 04
3 w8 ]/ e3 c. V0 b* m - ;==================================================
: c$ Q% j! V1 s% G - ;MMC3 (Mapper 4) 寄存器常量3 V/ ~5 X9 J! B
- MAPPER_REG_BANK_CTRL = $80007 Q# E% P) ^$ ^2 T; D! y2 J+ m
- MAPPER_REG_BANK_DATA = $80015 r4 m) w; f1 Q. |+ m
- MAPPER_REG_MIRRORING = $A000
5 @5 r7 }' i7 W$ a+ p2 J8 I - MAPPER_REG_PRG_RAM_PROTECT = $A001
7 z' w2 Q% Y+ F+ L4 H2 C - MAPPER_REG_IRQ_LATCH = $C0003 t2 r; I7 m2 U
- MAPPER_REG_IRQ_RELOAD = $C001
( S1 ~) |1 Z* x: k - MAPPER_REG_IRQ_DISABLE = $E000 \( j$ n, u* P7 Y
- MAPPER_REG_IRQ_ENABLE = $E0015 }* y4 z$ b8 z
- ;==================================================" I6 ?' w/ s- g- ]8 @
- IRQ_SCANLINE_BEGIN = 1354 `/ Y+ }6 Y) F) S6 k4 B }
- IRQ_SCANLINE_1 = 8( Y( m) z. d# {' y
- IRQ_SCANLINE_2 = 542 R" F c. {8 f, w1 ~' c
- IRQ_SCANLINE_3 = 8
; ~ t+ U9 J+ j- W, Q - ;==================================================
7 f" j: C5 C2 I" p% o3 u - ' M5 U P4 O8 P
- ;====================================================================================================7 ]$ [. d6 B' F/ u M
- ;宏常量: v7 p0 z( k, w
- ;====================================================================================================' [, w) w7 f d
- ; K( \! u& b! ]) s3 I- V9 W$ @
- ;====================================================================================================, v5 {) [8 K( h
- MACRO_MAPPER_INIT .MACRO6 k" a- d* {+ u0 {. E
- ;禁用IRQ# |& C' ^, o o* { r6 x/ a, T
- STA MAPPER_REG_IRQ_DISABLE
; Z/ ]8 C* v0 t# m! w -
7 O5 u/ Z5 k+ j, P - ;水平镜像
8 ~& _# o1 z/ T h+ g& p: P$ a, q - LDA #$01; g! b+ T- I' M, s: {) `
- STA MAPPER_REG_MIRRORING7 n, K' l8 a i# C
-
- i* \! b# Q! i2 R4 v: t. y1 m) U - ;初始化图形bank! w6 c& t0 [% H: ]8 x. n, Y
- LDX #$05
8 i, X* D+ K5 ` - .Init_Chr_Bank
5 h _$ c3 ]( l& w7 M - STX MAPPER_REG_BANK_CTRL/ @$ a. p/ t6 P; m
- LDA .ChrBankData,X
5 ?! H: Q4 z* n/ c5 f - STA MAPPER_REG_BANK_DATA' E, k" A: Y- q; y& p5 @& S
- DEX
9 }: p @* q9 H5 ~" H6 A) z: E - BPL .Init_Chr_Bank2 M4 P+ Y6 m6 u$ w- U/ L
- JMP .Init_Chr_Bank_End1 }5 a7 n* q& n
- .ChrBankData
' t2 p+ `, z8 |( T) V8 s - .DB $00,$02,$04,$05,$06,$07
$ S6 a. {: o: F$ N, W - .Init_Chr_Bank_End6 p( c$ _* y c# Z* N: a' y' Z
- $ S5 v5 j; i/ U8 u
- ;启用SRAM
* l0 \9 k, c7 J+ ]9 x' [ - LDA #$802 D9 d: m) G, Y2 [; t- G
- STA MAPPER_REG_PRG_RAM_PROTECT% `# H- A" s3 j+ D% k& ^
- .ENDM
3 h8 R! ?1 p; t# t4 w/ I - 0 k5 A8 G8 I) Z! [8 n/ W, }' k
- ;====================================================================================================# J4 \% o7 O" @
- MACRO_MAPPER_SOUND_CLEAR .MACRO$ M' C" i* U+ f: P% e- C& P7 m! T
- .ENDM
8 h4 E: h; I- F$ q U% U$ q' f -
3 A: b) E! k' S" a) O. B - ;====================================================================================================
9 [9 x# y3 i- K+ B! e - MACRO_SRAM_ENABLE .MACRO
8 m' A, u/ n0 L8 ~ - LDA #$80
4 h; v& u3 i" L; O& D) ? - STA MAPPER_REG_PRG_RAM_PROTECT: R) a3 P0 J2 i+ q' J) N! e7 o
- .ENDM2 l7 U! F; c j1 n3 _
- $ a3 Q; E. ?" h8 {6 X5 \
- ;====================================================================================================# b0 j8 w0 i, O6 n
- MACRO_SWITCH_BANK_8000_A .MACRO
, u# X* X' [/ j% R' Z7 b - PHA
4 C( Q, R" m _7 }2 G1 } - LDA #$06
: Y- d2 i2 |1 _& m; f - STA MAPPER_REG_BANK_CTRL4 ~! f" J; ^8 B7 r$ a! @
- PLA: K9 g3 x' v0 I' h6 X
- STA MAPPER_REG_BANK_DATA' R3 E! v: L* \& |% D+ e
- .ENDM
% L' k& E+ ~ W# P" K# K! P
9 m1 u: s" b" D: \: c4 O/ Q l- MACRO_SWITCH_BANK_A000_A .MACRO
% P: G( x: W+ S' S# n$ l2 l8 C - PHA6 \1 z: a! r3 N% _2 E6 N
- LDA #$07
: N+ N1 O+ _+ v1 j - STA MAPPER_REG_BANK_CTRL0 W! V# ]/ H5 A; J5 @
- PLA
, R! l: b, n: T, a5 r - STA MAPPER_REG_BANK_DATA* G& y7 }. ]$ U g. [
- .ENDM$ L7 X) V* E6 U! I$ i4 u% d( W
-
% ?/ p6 F2 @1 O) B, V - MACRO_SWITCH_BANK_C000_A .MACRO* H; K+ L# {. } q
- .ENDM4 o8 @2 E3 [2 J- A
- ) M! E) \% n0 p3 u8 A& V# W
- MACRO_SWITCH_BANK_E000_A .MACRO
6 P& ~- m1 T5 k: y - .ENDM
# g+ O" M) K# p3 L" o7 O - ' c% Q9 n7 ^( O+ [! m, ]2 b
- ;====================================================================================================0 n0 c) U' |0 @* D: S
- MACRO_TRIGGER_FIRST_IRQ .MACRO1 g9 l+ |+ h x! f$ f
- LDA #IRQ_SCANLINE_BEGIN + 1
# Z% n) c0 \8 N8 E; g - STA MAPPER_REG_IRQ_LATCH1 K; s! K# a! r: g- |
- STA MAPPER_REG_IRQ_RELOAD o% s( ^( c0 P0 t1 n% [. R
- STA MAPPER_REG_IRQ_ENABLE
" o2 a7 [( f! x) B - CLI& l3 c6 t6 c1 Q, B$ e0 N
- .ENDM! P2 p! B8 q! V$ T2 N2 D! f
- 3 u# u! X1 @' D$ P
- ;====================================================================================================: j* [6 s- \9 ?4 z: d. \7 A- X# J
- MACRO_ENABLE_IRQ .MACRO# Q+ T9 \: F3 [1 |3 s5 L1 L
- STA MAPPER_REG_IRQ_ENABLE
1 G' Z8 x" z8 m8 C: t. }, m5 i - .ENDM
8 s1 I' K6 {7 p' ~9 Z% p. T: J - ' J- k- H/ O+ h6 p8 `7 K. `
- ;====================================================================================================
% _1 u; m. i2 j; p - MACRO_DISABLE_IRQ .MACRO
% [. }$ r7 f d+ ~ - LDA #$00
& g2 |/ P& I R# a - STA MAPPER_REG_IRQ_CTRL3 T; g3 T5 z# A% h6 ?. a
- STA MAPPER_REG_IRQ_ACK, x" \3 p- ~/ V0 j% \/ {9 [" ?! @
- .ENDM% W. L4 i1 ^: e: w8 g# w* q
-
$ P+ k& L4 W2 s! V+ O/ {1 y% d& }% l - ;====================================================================================================
# g! y* `. H7 h& { l5 s. ]* j - MACRO_ACK_IRQ .MACRO
: G( u, u5 [% S& j2 i - STA MAPPER_REG_IRQ_DISABLE, t4 q1 p0 P2 L4 r$ Q
- STA MAPPER_REG_IRQ_ENABLE
. [& r. t9 |9 |) g5 l: R - .ENDM6 z0 v/ p3 P6 ]* t) n/ M `, C$ F6 t
- 8 M% [7 A. n. f% C; G/ b
- ;====================================================================================================
+ ^/ ~6 g: R& ~) W/ b5 u - MACRO_IRQ_OPERATE .MACRO$ z; b- r9 |! J! ?* l
- 8 W7 Z1 ?, Z2 T
- ;==================================================0 `/ ^2 D# ]6 L- r7 N" f
- ;IRQ滚动模式常量
: T' N6 E( A9 e9 \0 b - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
7 j. ?* C$ C8 f6 r - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动8 h$ t4 [" Z' ~/ t% }
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
3 g" z# W: {0 o$ ~) n
- r, U. O$ Y# K* \1 D, D- ;IRQ扫描线数据
7 G6 [3 X7 F" S5 o - IRQ_Scanline_Data
$ ^2 a1 }) _# A8 Q - .DB IRQ_SCANLINE_1& B* X% w6 h2 U/ q
- .DB IRQ_SCANLINE_2
( M5 U( p; v* Z3 g3 n: G; k - .DB IRQ_SCANLINE_3
8 b0 u" W8 q* C X/ a( s - .DW 00 ;关闭IRQ
/ C# `: U0 e' P6 y7 }/ N9 F - + r! Y* X; N9 \( O* x
- ;IRQ滚动控制模式2 r0 `# W" t/ o9 y: [# H% [7 l- Z( W
- IRQ_Scanline_Mode3 j9 U }* T) k4 Z# \ P h
- .DB IRQ_SCROLL_MODE_RIGHT
0 W a9 Z% n; Q/ {/ ^ - .DB IRQ_SCROLL_MODE_LEFT
( r5 t& z/ s3 [. P - .DB IRQ_SCROLL_MODE_RIGHT# c, E( D/ X3 @) x% { u* D. H
- .DB IRQ_SCROLL_MODE_LEFT
& U* s+ `4 K2 x- n - 4 m( |1 c, x9 }( h5 O: V
- ;==================================================
4 U6 J3 {3 b* @' i& S - ;;IRQ滚动控制$ Y' y: X7 r$ Q' A) b. {# D& i! f
- IRQ_Set_Scroll1 f: m; E: c( m L3 l; c1 z
- LDX IRQ_Process_Index
$ \( l8 q+ @" D* U2 B - LDA IRQ_Scanline_Mode,X* p' \! W4 t: I/ q4 F+ g
- CMP #IRQ_SCROLL_MODE_LEFT6 T) q- t* k4 A, |8 {
- BEQ IRQ_Set_Scroll_Left2 V; ?) b; ] M: q
- CMP #IRQ_SCROLL_MODE_RIGHT
$ P1 r9 U$ ?1 { - BEQ IRQ_Set_Scroll_Right
) B. n+ i5 g- i; U. Y - IRQ_Set_Scroll_Zero;不滚动5 g1 M; s0 t; B
- LDA #$00
! P( }, j5 j) | - STA PPU_SCROLL6 r# j" x# _8 X% V+ ?: y9 Z: t
- STA PPU_SCROLL
% G3 {# r; y5 u - RTS- H2 J* O+ j ]) S/ G# S
- IRQ_Set_Scroll_Left;向左滚动
5 I" X: M: q) I2 `/ S - LDA Scroll_H
. M! F' U; ^' x: H+ k, @ - STA PPU_SCROLL, {9 E6 q- {4 P2 P& q% n' l$ L; u
- STA PPU_SCROLL
1 }4 [% `" b' h- J5 T2 }& l - RTS
! Z7 x! N* R) y' |! D5 L% Y8 G - IRQ_Set_Scroll_Right;向右滚动2 W* B' u- g* R* J4 a9 J% Q
- LDA #$00
" Z- O. `/ P( ~) H( ^ k8 g7 F- k - SEC. f- y" @- m) }4 S. [
- SBC Scroll_H$ s' r8 D! Z+ ]
- STA PPU_SCROLL
6 J+ t/ i& c( i8 f1 R - STA PPU_SCROLL
) |8 q; w( |* w+ y - RTS
2 @/ K' s! Y- U% ]5 n, ? - 5 t9 L' p- @8 w( V; {
- ;==================================================
6 p, f) e, j" s; c& n( X - ;;IRQ滚动控制
9 ?6 R& K0 N6 O2 f2 Y/ p6 ? - IRQ_Set_Ctrl
3 V% `# x& e! a3 ]( l4 \. ] - LDX IRQ_Process_Index
0 b+ j: J& k* g5 q" s - LDA IRQ_Scanline_Data,X
0 @) W2 N; N6 r j$ N - BNE IRQ_Process_Latch/ e6 z% v/ h% _; ?
- IRQ_Process_Disable;禁用IRQ0 H0 g7 h' I3 D) A9 B# x. b* H1 ]
- STA MAPPER_REG_IRQ_DISABLE
; V$ b3 u9 _6 K1 V2 G - STA IRQ_Process_Index5 ]: D( @% e7 s: ^1 v( i' W
- RTS8 `5 ~! F% J0 e! ^7 {' e
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线4 O: f7 i! T; K& J9 B; s
- STA MAPPER_REG_IRQ_LATCH- D$ q! J) R. G3 _6 `
- INC IRQ_Process_Index, ]6 D( ]7 U1 `) P6 \9 {
- RTS/ {# t, X+ k0 a4 h' w \
- . n/ c" h w9 L2 \3 m7 G' N
- ;==================================================
/ X2 ]6 E( b0 F8 F( [$ A - ;IRQ处理
1 r# t, ]3 P! h: j5 F' N - IRQ_Process_By_Index
# D5 F% D; }2 t) t( h - JSR IRQ_Set_Scroll& N, A) W/ X; F2 }7 L4 m
- JSR IRQ_Set_Ctrl
?( N8 E) W i/ M1 d5 k - IRQ_Process_End, m- F% j6 Y$ U: D) R, S
- RTS1 J4 s6 x0 a$ H4 Z
-
* S' _1 x* p6 I6 t - .ENDM1 ]$ d6 ~8 d. K3 w: }% m" x
-
7 }- |8 p1 h0 A5 ?0 n( w6 Q! _
复制代码
- ^7 k4 G( x3 S" U5 I
5 m @7 X* R! {* F' S+ `代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|