|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 / h! F* t1 w6 K$ e+ ^9 I
6 B8 v D# s3 }4 l- f本次IRQ研究了如下:$ w% Y+ X; B: P# ?6 s! V0 t0 C/ u
VRC2&4(Mapper21,23,25)1 E, ?* y9 i3 E* e0 D7 E
VRC3(Mapper73)
: A+ D X5 W0 f2 hVRC6(Mapper24 & Mapper26)
3 h7 f" m) i3 `; LVRC7(Mapper85)
3 E3 j* L8 W3 N$ w* P8 pMMC3(Mapper4)- R3 i+ u. [' H7 Q
MMC4(Mapper10)
3 }/ m/ Q5 C3 `/ i1 ?& XMMC5(Mapper5)
w P C% X+ u, Y6 U; ]Mapper18
( i1 N: C# s" }* ~/ Q9 u7 u$ \Mapper64" U6 r8 n5 g% F; n- b1 y! a
Namco163(Mapper19)
) B1 M, |" \- N1 b- j- vSunsoft FME-7(Mapper69)
& T1 Q, I5 ?$ z; q8 J3 L/ x- W! @9 m+ ?' J! d
共计11种Mapper的IRQ操作使用例子. y* }1 F- R7 I! u; `
代码内有详细注释, 希望能帮助到感兴趣的人.
' m8 x5 }) E' } \0 y4 T Z; e% G" Y- u! s" i" f
  
& d; F M2 l, ?: r# O1 y) U
: T, f4 ^5 u# C; j6 wMapper代码主要逻辑(以MMC3为例):; }* U5 T! ?1 B3 d1 }
- 1 A2 V; @: W: v. n' g. B! s& O
- ;==================================================2 U" D$ R) ]& n
- ;Mapper号
\; E) j. n# G- L3 r* ?, r* ]4 z8 R - MAPPER_NUMBER = 04
* A" q" t; v; Z! C3 M* L3 c9 t - ;==================================================: W2 T! x# _0 ? P* h5 u! c& b
- ;MMC3 (Mapper 4) 寄存器常量
" N; h$ g1 I. ~# _4 E" S - MAPPER_REG_BANK_CTRL = $8000
' ]0 p7 D& z; H - MAPPER_REG_BANK_DATA = $80012 E% o! I0 L' Z: g
- MAPPER_REG_MIRRORING = $A000 Q8 ] A% t! x% |5 D
- MAPPER_REG_PRG_RAM_PROTECT = $A0017 E" u3 Z: d2 Q6 A3 Q
- MAPPER_REG_IRQ_LATCH = $C000( Z, i4 G' U% q2 I$ x9 q/ @
- MAPPER_REG_IRQ_RELOAD = $C0010 s, c$ {! R/ m7 ~' R
- MAPPER_REG_IRQ_DISABLE = $E0003 n7 i6 \5 I/ x
- MAPPER_REG_IRQ_ENABLE = $E0013 x/ ]5 {2 C( A4 p1 Z8 G" ?
- ;==================================================
; N6 j1 o( Q( d3 m) g! i4 i: h& t - IRQ_SCANLINE_BEGIN = 1351 y) G; ]! P, z/ ^7 F% ?6 @
- IRQ_SCANLINE_1 = 84 R$ _1 t+ g" P, c% F
- IRQ_SCANLINE_2 = 54
4 R# e6 B# M4 [, t G+ V& i' y$ q+ W - IRQ_SCANLINE_3 = 82 O7 u9 t( R0 r* c* l
- ;==================================================9 D$ N. l$ _+ g% E. a
# j* n0 B* R6 J+ f% U6 m- ;====================================================================================================
- l+ H- x- y% u& ? - ;宏常量
& m$ t/ a, g: ?) E, Y - ;====================================================================================================/ w3 x1 @3 U/ b# L3 O, h
- 1 ]; L2 S" e6 U% S7 w* M2 ]4 U
- ;====================================================================================================
9 F, l1 b Z$ J4 G* o - MACRO_MAPPER_INIT .MACRO
+ y& ]: b" S2 B9 B9 {4 Z- B - ;禁用IRQ" @6 Z! R" b( u, R9 |* e+ c
- STA MAPPER_REG_IRQ_DISABLE
! K- {+ v* G1 j+ u - 9 P+ N. `! f* y9 c# J) u
- ;水平镜像, ~7 V' b+ w, L2 I
- LDA #$01
& B! r' |2 }+ r2 D3 Q - STA MAPPER_REG_MIRRORING0 f! Q3 t* l/ k0 L% |2 D$ H8 {! C& F
- " }% }" p. V" i. q+ g, \
- ;初始化图形bank
) L- `# [1 L* j: q0 E$ r - LDX #$055 v5 y) g: e& x* F- S+ _& `6 ^
- .Init_Chr_Bank
8 t* F, O/ E- j# J - STX MAPPER_REG_BANK_CTRL5 p& p4 t! {) K* y x5 r0 Z; Z3 G2 _
- LDA .ChrBankData,X
$ A# t, |( w* G7 Q5 ?( Z5 i$ g: a - STA MAPPER_REG_BANK_DATA7 \. }* E9 e. X" a# w6 F0 R
- DEX
) q/ `5 d: {) }$ i - BPL .Init_Chr_Bank
# V' s; m5 S3 {* Z$ M - JMP .Init_Chr_Bank_End
& ~2 o- o0 ^, f; F! x# t+ k% r - .ChrBankData1 u' i) v; O$ A1 W" q' s! [. E
- .DB $00,$02,$04,$05,$06,$07. Y, s) y& R/ b1 d9 b4 Z4 {
- .Init_Chr_Bank_End
/ E6 G+ L/ `$ @ -
& \* Q6 s, H% d9 d1 D4 P1 q8 U8 `. L - ;启用SRAM
% a1 A9 _) o/ h+ \( q: x( \/ C6 q - LDA #$80
2 y. @ S, J- C - STA MAPPER_REG_PRG_RAM_PROTECT
1 N) g1 v4 c! C P - .ENDM
$ r0 ^4 Z+ `: X; f
8 f; e. o" T5 T5 W1 F- ;====================================================================================================9 t! w c' p% F4 B! D
- MACRO_MAPPER_SOUND_CLEAR .MACRO
( [. D8 {" i2 ?- Y# D9 N: N% Y - .ENDM
/ n2 J* U, j) q3 ? - , s( g: Y& b( z
- ;====================================================================================================- D( b6 V w4 x" C! \3 f' ~
- MACRO_SRAM_ENABLE .MACRO0 K+ C, d- g5 V+ y0 `; R4 \, r
- LDA #$80
3 v8 D# D7 v$ e( r, ] - STA MAPPER_REG_PRG_RAM_PROTECT4 N; F- y: U% [1 s# V1 c$ m- Q' H
- .ENDM
, ^2 p0 l2 \% {9 p. Q' I6 l - ( f% {( v2 ]9 ^) W
- ;====================================================================================================
) }) m7 y( |7 X. p$ _0 s; P - MACRO_SWITCH_BANK_8000_A .MACRO
* s% P* |; J i, X6 Z/ M; Q - PHA
) q* O0 c* \& v& ~. y3 j - LDA #$06! X; B4 L# V* @6 \& u, i
- STA MAPPER_REG_BANK_CTRL0 m! C. e9 r- y
- PLA
' q- ?# ~1 G% K6 C, k% v( @7 J - STA MAPPER_REG_BANK_DATA( i" ~2 @ ~! O- N
- .ENDM& u/ W. Z: g* Z$ w
# U: d2 e6 a( N4 f5 Y, b- MACRO_SWITCH_BANK_A000_A .MACRO
7 i8 z7 l. [) m ?/ G- z) P - PHA' o. t$ A" S! ?1 r" X' N
- LDA #$07( |7 E, \. U' A3 a# g1 ~: f- t r
- STA MAPPER_REG_BANK_CTRL
! e2 U& {6 X, Y0 s2 K) I - PLA
8 z X8 \/ Q) t. v) V% K - STA MAPPER_REG_BANK_DATA
+ ~4 F+ B9 n( I4 A$ H9 N# v - .ENDM
5 r2 ^2 u7 Z% Z" M7 |' c# m -
K8 I) y" l w$ W - MACRO_SWITCH_BANK_C000_A .MACRO
7 w4 f" t4 L t' o f3 d - .ENDM. U6 O- I* I, b7 l+ Q( V# @! c. r
- # `( c% f u; E$ F" F' T
- MACRO_SWITCH_BANK_E000_A .MACRO
* g3 z- z2 r( Z6 V" y$ l) | - .ENDM
! X1 e, ~8 |6 M' ^& S5 r
+ N+ t: e; @% i+ k- ?- ;====================================================================================================% c* \3 i& @& ^3 i
- MACRO_TRIGGER_FIRST_IRQ .MACRO! n2 I& b" p& d1 P* g2 Z- t6 b
- LDA #IRQ_SCANLINE_BEGIN + 1! q. a. O8 Z$ H8 {& W
- STA MAPPER_REG_IRQ_LATCH5 s8 l3 D7 ?( V3 w8 u0 _7 l/ S# E, |
- STA MAPPER_REG_IRQ_RELOAD7 i0 q- }2 j E9 [
- STA MAPPER_REG_IRQ_ENABLE
+ c' ?: }8 o& \4 o* i* c - CLI
1 e: a/ x, X7 O, K# U$ b0 T - .ENDM# [) N. \' r: R n3 ~6 ~
-
. K2 ?# p+ P' ?8 Q& B: a - ;====================================================================================================
& |# A' t( N) C6 c0 {- h+ B - MACRO_ENABLE_IRQ .MACRO g X2 h4 F& J$ \% _
- STA MAPPER_REG_IRQ_ENABLE; y3 |3 n* Y' `
- .ENDM
5 o- ]$ [4 [& p7 J- S/ P4 O -
- ^7 O2 m$ V. Q. [& H1 i# i - ;====================================================================================================
- }+ F$ k: [4 S) ?: N/ g7 B - MACRO_DISABLE_IRQ .MACRO" [- F n; n: [9 t) p
- LDA #$00
* Z1 S$ h* D6 F3 _0 Z, i, @. } - STA MAPPER_REG_IRQ_CTRL
- {; P& L% ]$ y! m2 E! i - STA MAPPER_REG_IRQ_ACK
6 L/ [& E. M. l! z9 f - .ENDM( W" K( s1 Q4 P9 a4 J4 H
- # T: G3 e4 }" n ^ y
- ;====================================================================================================
+ F) T+ ?1 L4 d" @& U - MACRO_ACK_IRQ .MACRO9 [3 p9 F" v2 {2 o
- STA MAPPER_REG_IRQ_DISABLE
0 `6 `$ y+ B; m" q3 i3 m1 u - STA MAPPER_REG_IRQ_ENABLE+ ?5 e7 `' Y8 \% T1 K
- .ENDM" ?5 x4 A2 l" Q5 D/ W0 f
- 9 t( Q4 D# L9 { u$ o9 g
- ;====================================================================================================
7 p) }4 T' ]2 Q$ |8 f* p$ ` - MACRO_IRQ_OPERATE .MACRO( V0 g4 X! o1 y3 z# f
- % Z% H* A7 B/ m8 K, z
- ;==================================================
$ v/ A$ J7 a7 i* c - ;IRQ滚动模式常量- J& w5 b8 q& e9 Z" U, T
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
| w( S+ l1 _( I5 r: ? - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
0 G2 S D5 m; Z. [# F) a- e - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
+ a0 x7 A' Z: [: G* @6 H7 C+ f" J
, A3 x6 k0 e* ?0 _3 K3 L7 z* K+ G- ;IRQ扫描线数据3 P* G. \) I( L3 R. g$ n i
- IRQ_Scanline_Data
6 \* ?" j7 A6 M, z7 j: W( z - .DB IRQ_SCANLINE_1
h3 J6 X2 w# q - .DB IRQ_SCANLINE_2# Y. s( [* B5 y# i
- .DB IRQ_SCANLINE_3
6 ~$ Q5 S! m) f: z3 z. Z ]; X& e - .DW 00 ;关闭IRQ6 k8 W6 \& M! ~1 s/ r' f5 D
- ; [1 `# u3 s% N0 D3 w
- ;IRQ滚动控制模式7 g5 a, b7 [ r. R3 Z
- IRQ_Scanline_Mode
7 \- J+ T4 C) p9 R - .DB IRQ_SCROLL_MODE_RIGHT: G8 }* F/ D3 H9 S
- .DB IRQ_SCROLL_MODE_LEFT. h2 m; L5 ?8 Q
- .DB IRQ_SCROLL_MODE_RIGHT
3 y; m3 Z- k7 f - .DB IRQ_SCROLL_MODE_LEFT
0 k$ ^! u/ A+ q - 5 m1 m2 v0 [5 c% o# B! y
- ;==================================================
9 P7 g: o/ s8 u6 F2 b0 G - ;;IRQ滚动控制
+ C( d+ l/ V/ J, ]5 Y$ T - IRQ_Set_Scroll) F4 K. a1 ]; j8 z9 Z `) J9 Y# Y6 ]8 @9 l
- LDX IRQ_Process_Index
) o% t9 J+ w2 h. A - LDA IRQ_Scanline_Mode,X
1 d: [6 Q! i0 z! E( u( E& ]5 O - CMP #IRQ_SCROLL_MODE_LEFT
7 @5 V+ J* {; d2 Q& i( o+ h" S - BEQ IRQ_Set_Scroll_Left. {3 ?- f% Y7 F5 S
- CMP #IRQ_SCROLL_MODE_RIGHT
$ ~( k( h% w/ ?5 `4 n7 l9 @ - BEQ IRQ_Set_Scroll_Right8 d X8 U1 q/ a2 ^. J
- IRQ_Set_Scroll_Zero;不滚动5 V6 [+ s; ~$ @$ O4 Y5 H' r9 s5 }
- LDA #$00
; d/ ?5 m' D6 h# F3 @$ W. W - STA PPU_SCROLL- W6 E0 w7 e& H l$ k! t
- STA PPU_SCROLL
- c9 `8 v! ~% A0 A" w2 q2 z0 [ - RTS$ {3 s) T3 ^" X; ^
- IRQ_Set_Scroll_Left;向左滚动
! W8 X7 n! d' ^8 ~, ?& G( R/ z - LDA Scroll_H
* J, Z3 u$ J4 M" j5 V- H - STA PPU_SCROLL9 V8 S7 i4 r3 e& `, }# m0 z% x$ t- ]
- STA PPU_SCROLL
2 b7 |9 U9 [) X5 {; k+ C - RTS
9 T' t/ H. G- L3 \1 \ - IRQ_Set_Scroll_Right;向右滚动: h4 L0 P. U- a* y" i2 ]
- LDA #$00
* f6 `7 ~) B; X" B4 ` - SEC
* m/ P+ B4 f. | J. `- ?( o8 d# `+ E - SBC Scroll_H( y3 e$ y( C ]# k) [) }
- STA PPU_SCROLL( F: a3 _4 u, W# F, C0 g9 a
- STA PPU_SCROLL
) @) ~% ^9 v2 T- b1 L - RTS
9 X; g! B+ v) ^& y% W - . E0 m' f% Y" i
- ;==================================================# c v$ Y/ }3 |+ L2 ^5 N, F( r! @3 o
- ;;IRQ滚动控制5 @+ Q( y4 u+ J) U
- IRQ_Set_Ctrl
% T! g! T) V8 [9 n7 M: y! U - LDX IRQ_Process_Index
- X- i0 b4 T$ S. M Y& r - LDA IRQ_Scanline_Data,X
- P. o5 f4 _0 g) S - BNE IRQ_Process_Latch
) @: R% ]) }% @6 l9 @4 s* Q - IRQ_Process_Disable;禁用IRQ
* r% f. O* J7 t: g4 j* y# G - STA MAPPER_REG_IRQ_DISABLE
9 u9 W+ w; I+ Y* v+ r- ` - STA IRQ_Process_Index
- Z. M- X& g9 i: h - RTS# I9 \' z2 V, E A/ v7 S% Q, w
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
0 X! G" [- a1 d w( t! l - STA MAPPER_REG_IRQ_LATCH
' {, X$ A4 v( g2 D- S6 ]0 s - INC IRQ_Process_Index$ N) g+ C' @; b
- RTS
* \( p& M4 f2 K% c; A) c3 \
' q7 J( U1 k3 p0 ?9 C- U- ;==================================================
. b8 ?3 |, `7 }3 v- a2 F) Q - ;IRQ处理
+ l3 I0 F0 K% X8 c2 x - IRQ_Process_By_Index
: J5 _. P4 U+ a+ {! ?5 e" f1 L* O - JSR IRQ_Set_Scroll
1 D5 b1 m1 L _ - JSR IRQ_Set_Ctrl$ o3 }- p+ L4 j
- IRQ_Process_End) V1 `0 x0 G, i( h! u* h
- RTS
5 v* t: Q9 |# t5 s+ M2 _3 \ -
: f( r" D. B5 k1 c7 [0 g& Y; Y* {5 j - .ENDM
% } h7 }2 n& F, {! @9 {+ U0 C) i -
2 h( ?" e1 k: j
复制代码
2 E' A; x* u6 h9 w
4 {8 M: |3 _: C9 L# K8 D代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|