|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
- }/ Z- z1 }9 V- C$ z+ |1 D9 y/ F/ q" R
本次IRQ研究了如下:
3 G& ]- C: Q4 R3 lVRC2&4(Mapper21,23,25). |0 I z* P0 \$ L8 b
VRC3(Mapper73) w ~9 l8 Z: F; \7 Z% @9 m
VRC6(Mapper24 & Mapper26)6 J8 }# j6 p; \) ~( s" d; X
VRC7(Mapper85)- g, ]+ m* H4 n' `# d4 N7 Q+ H; x
MMC3(Mapper4)8 U+ A+ S5 L( ^6 D* \6 g
MMC4(Mapper10)
3 G: _( s6 H: S4 ~MMC5(Mapper5)
$ g. t9 G0 |/ t! s, tMapper18- x' c8 \& K! M7 p
Mapper64
4 d; c G7 }: ^Namco163(Mapper19)
8 g. [3 f) U) Q; NSunsoft FME-7(Mapper69)
* e8 y0 r& R4 p) q/ |* e1 O& |
$ u4 Q$ r& \$ s( j% Z共计11种Mapper的IRQ操作使用例子
( W& q1 N* P; }; G- Q8 t# \代码内有详细注释, 希望能帮助到感兴趣的人.
+ g8 D: z5 P* c+ r8 x6 X% l; U9 y
: _" G1 c2 M. U" o/ ]' h# P  3 I; m1 x5 \7 e A
! ~; ^/ N- |& Y0 g# qMapper代码主要逻辑(以MMC3为例):/ A* ?+ w. q; {7 g# i
/ _% g8 X d E& N. P- ;==================================================
; h1 q( f0 m; z - ;Mapper号
$ I0 e7 C9 x3 @7 H; i/ D - MAPPER_NUMBER = 04
6 E9 B$ |3 H* t6 U6 j( h- B( ?9 o8 ~ - ;==================================================
6 _/ `$ k9 u, c1 ^ - ;MMC3 (Mapper 4) 寄存器常量3 |7 k% C: k. [2 P9 ?% A7 E4 n
- MAPPER_REG_BANK_CTRL = $8000
9 g( @1 g- d1 ?5 u8 }; o1 T1 q - MAPPER_REG_BANK_DATA = $8001# k3 c) q3 m/ z6 J' f
- MAPPER_REG_MIRRORING = $A0008 B( o7 V% k7 F3 b4 B
- MAPPER_REG_PRG_RAM_PROTECT = $A001( h' b8 H" V% `' J: C: {
- MAPPER_REG_IRQ_LATCH = $C000: d6 f* E* Y: m2 O: _
- MAPPER_REG_IRQ_RELOAD = $C001
$ V( a7 @( k. n7 t - MAPPER_REG_IRQ_DISABLE = $E0004 K1 [+ i& B1 Q3 s
- MAPPER_REG_IRQ_ENABLE = $E001
' Z3 [& E [& t9 ]( Q+ b2 n. B. |0 O$ ] - ;==================================================
- O0 ^1 I5 _' Q+ v9 T+ b2 S5 O6 B - IRQ_SCANLINE_BEGIN = 135; ]% I; `- t' @! O" j' g
- IRQ_SCANLINE_1 = 8
6 n" e" F, X+ F8 R/ @ - IRQ_SCANLINE_2 = 54
7 t6 h( e& u9 E6 x/ Q2 d5 ^ - IRQ_SCANLINE_3 = 8
9 J" X5 c. j: }7 b - ;==================================================
4 m' z4 Z, F4 a3 `6 |
5 I9 V% Q+ e8 j+ P- ;====================================================================================================9 `4 x& k* c7 i* ~
- ;宏常量
2 b- P9 b% M% L, B' t9 g - ;====================================================================================================
3 n# }4 |4 j6 T+ X - ( e+ C R6 J q" s, m) T
- ;====================================================================================================7 |" Y c' R- D; Y0 ?2 f1 U5 D
- MACRO_MAPPER_INIT .MACRO0 `4 E, K# D N1 ~ t
- ;禁用IRQ
/ q" L* p; ~+ R - STA MAPPER_REG_IRQ_DISABLE
6 I7 c Z/ M, z5 E - . S. W0 O4 f$ X4 `2 q! I+ r
- ;水平镜像1 G$ l) s- p# I6 `/ i' [
- LDA #$014 M, ]7 E4 I/ n- ?
- STA MAPPER_REG_MIRRORING
0 f( N3 Q& N/ ~ - 9 W, T# {! ?. y9 e* D4 }
- ;初始化图形bank
/ c( K, f3 t* Z7 w# } - LDX #$05
, x# C. p. W' J& t" ?- I - .Init_Chr_Bank
8 p0 i8 S0 L/ Q2 Y8 H; S - STX MAPPER_REG_BANK_CTRL
: X: h: d8 H! t9 v - LDA .ChrBankData,X
d: w; e) m o( O4 r2 x - STA MAPPER_REG_BANK_DATA
! R/ I+ ~9 Z2 s& l - DEX
1 _6 k0 I+ F: O9 ^! x9 x - BPL .Init_Chr_Bank
) s( k, X3 T+ d# h9 D X% P% p! l- G - JMP .Init_Chr_Bank_End
# f! p; ?6 p6 M5 b. w# d0 i7 ? - .ChrBankData
& v3 b5 {: v; w - .DB $00,$02,$04,$05,$06,$073 n1 Q& m9 }7 ~* T
- .Init_Chr_Bank_End
# W H& D& a( N% B: o5 U - : s3 c- _: Z. [
- ;启用SRAM
0 z* r; s- d# K% v5 {, Q - LDA #$803 f# O$ ~2 c" }' }
- STA MAPPER_REG_PRG_RAM_PROTECT' T/ R6 E' k! y' S
- .ENDM4 c/ B! q" y u6 ~9 j
4 w: Y% z+ U8 V3 d7 A# {, W( U- ;====================================================================================================" x! T( g6 u1 d% b! L; S! ]) k
- MACRO_MAPPER_SOUND_CLEAR .MACRO1 ^$ c1 K, x9 a+ z N- w8 h
- .ENDM
; s' ?, J) A9 c/ t5 h5 ` -
" z+ l8 W9 J {+ `8 \: P* D - ;====================================================================================================9 r: V5 T- ]: q5 k) p; P# J8 M9 b( y
- MACRO_SRAM_ENABLE .MACRO e( f, f" R5 T1 M8 U
- LDA #$80
6 g8 a+ \6 o* f/ S1 U3 j W) s - STA MAPPER_REG_PRG_RAM_PROTECT
( {0 @6 S6 _/ G1 D& h O0 D - .ENDM! S! R0 W5 a5 a+ f; S! A6 x
-
/ ~ M( L J/ \/ v! X6 y) |6 H$ _ - ;====================================================================================================
, P& H' b6 v) {7 P0 m2 G4 X+ t - MACRO_SWITCH_BANK_8000_A .MACRO
/ l7 C9 ~5 b+ q3 t+ m5 }, n - PHA
, X: E" L2 p4 P+ E5 a' D2 n0 V - LDA #$06
3 t+ a+ c3 C9 D% ]. w - STA MAPPER_REG_BANK_CTRL% r; k& S- w7 ]
- PLA
# h9 k7 R, b$ P* z* Z - STA MAPPER_REG_BANK_DATA
' b' H1 e/ T, j/ W - .ENDM/ L8 L! a/ v" I4 f* h+ v) B, n
- d1 G( D/ g+ _- MACRO_SWITCH_BANK_A000_A .MACRO
/ B& [( l! d) N$ L$ t5 E - PHA. _; p" A- a- w( S) F4 W& `
- LDA #$07
6 x. f# ~7 q0 p! e# T5 I - STA MAPPER_REG_BANK_CTRL' V* Z6 |9 m: P0 x, l/ _' W
- PLA
: `. u5 u7 _2 S/ B - STA MAPPER_REG_BANK_DATA4 }. Y, b. l' ?( \' h, _3 v
- .ENDM* n m' }% m |( j* [0 h
-
* n* y) n( X; x5 G4 m! t# m - MACRO_SWITCH_BANK_C000_A .MACRO5 [' x! z' j0 K/ j- o: `# p( Y
- .ENDM
7 Q/ T ]# N6 Q7 V$ V - $ H7 Z- r/ X8 l- V
- MACRO_SWITCH_BANK_E000_A .MACRO3 j g2 f3 v# a0 C& V1 C1 v7 M2 M
- .ENDM8 G7 e( r3 N, ?4 S2 @& D/ D) n
- & E# l5 G( ]* E
- ;====================================================================================================! @- \! Z6 p& U
- MACRO_TRIGGER_FIRST_IRQ .MACRO* G1 O0 q, G1 G/ |- c
- LDA #IRQ_SCANLINE_BEGIN + 1
* @) Z# m# @2 p7 v4 V - STA MAPPER_REG_IRQ_LATCH2 d/ R4 _+ |. h" H8 Z
- STA MAPPER_REG_IRQ_RELOAD8 h; t5 D# X* t/ {% O3 U' K
- STA MAPPER_REG_IRQ_ENABLE' u% W- T. k# N" `. t
- CLI
% U/ Z( n* j- U; g - .ENDM
* K0 {! ]5 f' E B1 j" L - ( {6 m- j- n ^1 O1 D
- ;====================================================================================================1 b( \* s) w1 m' J
- MACRO_ENABLE_IRQ .MACRO
, \; r# L2 Q3 Y8 u. } - STA MAPPER_REG_IRQ_ENABLE$ `' U! |- v! G
- .ENDM
+ `8 N$ b% C- x5 ]; n - 3 Q9 m5 H, G; D! C. p1 b
- ;====================================================================================================
6 l1 q# ]* [- M. z4 ~ - MACRO_DISABLE_IRQ .MACRO
+ U* ?% w; u$ g' u- O$ q* o/ e) ` - LDA #$00% i* M+ ` I U3 \
- STA MAPPER_REG_IRQ_CTRL. A2 Q, r. Z4 N5 J/ ~
- STA MAPPER_REG_IRQ_ACK
0 c' z0 v) l& {7 O% p+ D6 F - .ENDM2 c7 u2 R- B/ A( d! Z( j
- # C, |' H0 [ e
- ;====================================================================================================
& P2 H$ S- O1 p; l' f+ W - MACRO_ACK_IRQ .MACRO
5 E& H% ~2 h: G& y - STA MAPPER_REG_IRQ_DISABLE
& ?2 e0 m) S5 G4 K, c( t+ N. X7 p( j - STA MAPPER_REG_IRQ_ENABLE4 x! C: }' c l. _" ^; x6 i
- .ENDM
( M# M* l+ L: I) `% ^ -
) A( L4 r$ g, P - ;====================================================================================================
5 t- `" c2 D: J2 c5 {0 i - MACRO_IRQ_OPERATE .MACRO
( `) Y/ A; J% n D3 d- B& t& ?
+ s; a& H( L3 f1 d- ;==================================================* x$ K/ d; u2 ]/ g% a
- ;IRQ滚动模式常量
3 i5 Z, d+ O9 A: u1 c2 X9 x - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动/ j; g( ?9 z* ]) ^% x
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动, f9 F. b# H3 t) `
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
9 D9 C8 w! M5 `/ _* e$ H7 r
4 F% A/ S9 M1 f5 j3 D- ;IRQ扫描线数据7 A8 f; C, z w% j _4 c$ }1 h1 i
- IRQ_Scanline_Data
- _' ]- K0 o) a/ x, a - .DB IRQ_SCANLINE_1. F& [( G7 a$ J* K
- .DB IRQ_SCANLINE_2
+ M4 W; B% f& M3 c0 @ - .DB IRQ_SCANLINE_3
- W" U }; a5 `" F - .DW 00 ;关闭IRQ6 b3 h3 _8 E, F
- 4 w. s, J" f5 N9 P! a% j8 u7 X
- ;IRQ滚动控制模式( h8 O& Y9 I8 g9 W
- IRQ_Scanline_Mode
) ~, @# u4 V( d$ U1 N5 R - .DB IRQ_SCROLL_MODE_RIGHT
; M, `" S/ X2 I6 B# ~8 ] - .DB IRQ_SCROLL_MODE_LEFT, x4 o7 f, s7 [) z
- .DB IRQ_SCROLL_MODE_RIGHT& E3 z) _5 G7 _+ O: f
- .DB IRQ_SCROLL_MODE_LEFT
. \- V) x f( K" [
}5 A% t/ H$ [0 O0 q3 Y+ Q/ E- ;==================================================
- E0 K/ O. V; v2 g$ R - ;;IRQ滚动控制: @0 m5 V2 B% R( J, D7 G4 ^
- IRQ_Set_Scroll
, S" P9 q1 O, D" H - LDX IRQ_Process_Index) i* m- b( A$ \' x
- LDA IRQ_Scanline_Mode,X
, U- Q2 O' T5 o3 F1 A - CMP #IRQ_SCROLL_MODE_LEFT
/ T. ~+ ]) Q y: D/ Z" T$ G6 W - BEQ IRQ_Set_Scroll_Left7 @& Q! D7 M3 a1 E5 S
- CMP #IRQ_SCROLL_MODE_RIGHT
' l: N. l5 r6 \. Y8 d( h$ B, b - BEQ IRQ_Set_Scroll_Right
% F+ \; C6 t; k: z - IRQ_Set_Scroll_Zero;不滚动/ j# w' a$ n# T9 L7 c$ q
- LDA #$00
; x5 w- o9 [ ^, C! G - STA PPU_SCROLL
) a8 h3 K1 y ] - STA PPU_SCROLL
1 \4 t1 x6 W" j- P1 W0 K - RTS
$ n3 u0 i6 R! d' Y3 B9 x( m) J - IRQ_Set_Scroll_Left;向左滚动* ?% f, R6 }8 X8 s
- LDA Scroll_H- s! W5 j" J5 X% y) |
- STA PPU_SCROLL
4 L2 f+ a1 G! v8 m2 V - STA PPU_SCROLL) _0 [+ U% p4 @ q+ O" l' }
- RTS! m/ M8 N& M- Q- m5 h5 ^/ t4 B
- IRQ_Set_Scroll_Right;向右滚动
4 K2 I/ B, B( @ - LDA #$003 `# K; P4 C& F/ \
- SEC: a4 ~0 Z( y/ f
- SBC Scroll_H
/ U: Y6 i2 T- e# w$ `! p. s - STA PPU_SCROLL
% F" L; z% c( G/ d8 `4 Y# t% t - STA PPU_SCROLL9 v) z0 i2 [9 V/ c3 A" }
- RTS( Z. ]: p: F6 \
-
. H" B2 ^! z# C- n) q% T - ;==================================================
5 f, }$ p" b' d0 @/ K - ;;IRQ滚动控制: m- Z8 {3 z! c7 ^' s
- IRQ_Set_Ctrl
& x: E& ^5 z. U - LDX IRQ_Process_Index; Y+ R3 i/ Z5 }, Z! B/ O$ B
- LDA IRQ_Scanline_Data,X
5 T! Z Z0 C/ s/ ~: d - BNE IRQ_Process_Latch
: b! s9 k8 I( E- t1 b1 H- S9 t v - IRQ_Process_Disable;禁用IRQ
) X% y+ m1 Q$ H8 u/ D# V& Y - STA MAPPER_REG_IRQ_DISABLE, m% V( N1 I, y% v E# S/ `
- STA IRQ_Process_Index
. R3 E6 {. Z1 Z" b- Q4 N( o. ^1 D - RTS
& |0 Y5 H9 v7 ?. U8 b* T; D - IRQ_Process_Latch;设置下次 IRQ 触发扫描线2 @9 L0 T& K( N5 ^
- STA MAPPER_REG_IRQ_LATCH
9 r4 z' D. S( F" B3 {# D - INC IRQ_Process_Index3 j+ ^' S' G, r; n
- RTS- x1 ^# t: t: X5 Z3 I P2 ?" r, T
: y: p2 ?5 f" J- ;==================================================$ A% u$ n& b6 ^$ |' ?0 L& o
- ;IRQ处理
* f6 f" U% v# }3 o - IRQ_Process_By_Index
; [7 E" p$ J; I3 N - JSR IRQ_Set_Scroll) e1 l5 N$ W2 i
- JSR IRQ_Set_Ctrl* Z3 `4 `/ q% X- g( k/ m
- IRQ_Process_End n4 B2 \. m( O* F8 F
- RTS
1 A) ^- }% w/ l5 z i* ]% N -
8 I% L$ ^& V7 k3 _7 k* z5 U - .ENDM
- G) V; E2 i% y( w* v& A -
, v$ p. ~ j6 a
复制代码 1 a! O0 @& W9 l
E. Y3 e2 V# |) f2 O- k! R
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|