|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 3 y- a4 }2 M2 b1 O
; }3 A7 J) ]3 ~. g( s本次IRQ研究了如下:8 D, \+ ]4 l3 A5 o8 Z( H- T- J! [0 U
VRC2&4(Mapper21,23,25)
3 ]$ W. ~. l1 p3 c' z. l& r( UVRC3(Mapper73)
8 V' s# }. N2 @! n2 }6 ^1 `VRC6(Mapper24 & Mapper26)
! P- f ]8 O+ i) R6 L5 |) ~VRC7(Mapper85)
8 a3 a9 \* v- U& {; wMMC3(Mapper4)( K9 B& Y: u0 y. W$ Z% w
MMC4(Mapper10)" {& K$ U( ~9 D1 m/ D6 e; P
MMC5(Mapper5) x' R$ l! c) |, j
Mapper18$ n3 g8 c6 s: ^" J
Mapper644 D \! G0 U, Q' h% m! I
Namco163(Mapper19)
& [( y8 ]1 L7 lSunsoft FME-7(Mapper69)* f, K) c5 d! J* M3 }& ^: E* g% j
3 ~9 R- O! ~/ F6 r3 r共计11种Mapper的IRQ操作使用例子
% C0 c7 y0 n2 t! W3 Z1 ?5 ]代码内有详细注释, 希望能帮助到感兴趣的人.& O. X8 q# l, V, O
& f( ~5 x( G( S3 t  
) L! \4 v+ |( Y: h7 v' D$ z% H' s# _1 o$ b
Mapper代码主要逻辑(以MMC3为例):
/ p j+ P9 o# a2 C" s
7 S3 L+ v4 k' R6 S0 I" q- ;==================================================
7 e* ?& [9 C8 N0 v, R' Y- H! e$ m - ;Mapper号1 j8 `$ J3 [1 z8 p7 _
- MAPPER_NUMBER = 04
( X6 ?8 W8 K# G4 b - ;==================================================
1 S! ]( N, x8 Q: o2 g9 @ - ;MMC3 (Mapper 4) 寄存器常量' q$ n+ {+ R+ b! P4 g
- MAPPER_REG_BANK_CTRL = $80007 ^& q' O3 A6 Z
- MAPPER_REG_BANK_DATA = $8001
7 U" J4 a% g) i! y9 p+ `1 @$ X - MAPPER_REG_MIRRORING = $A000
5 |* c% ~1 D- v4 O, e; }3 R* y - MAPPER_REG_PRG_RAM_PROTECT = $A001' m0 O. Q* a; B" v4 J- q) x
- MAPPER_REG_IRQ_LATCH = $C000% U/ `2 y7 B7 e
- MAPPER_REG_IRQ_RELOAD = $C0018 H9 |3 \) x; w5 x' c T& l
- MAPPER_REG_IRQ_DISABLE = $E000
, O! b& u4 U, x& d - MAPPER_REG_IRQ_ENABLE = $E001
4 e7 {9 X, w5 m# G - ;==================================================
* i+ R3 R4 ^0 n0 K) q) G - IRQ_SCANLINE_BEGIN = 135* i- A" u& v0 M+ M
- IRQ_SCANLINE_1 = 8
' t( I8 g, E! C+ Q) B - IRQ_SCANLINE_2 = 54& u: X9 _/ s2 [* Z ^' o8 @# U
- IRQ_SCANLINE_3 = 8! ?4 O+ z* M% w0 Y5 L2 B
- ;==================================================2 J! |' _; X. L6 d: @2 U$ l) `7 s, W( ~2 ~
- ) G0 v' Z. e% Z* n" s
- ;====================================================================================================6 K9 m$ L% H) V& ]% c& }) w$ h
- ;宏常量% R% ^& i0 k3 l# B# T! K' {( e
- ;====================================================================================================
+ `& f& Y. c: @8 o - + N$ n! b, ]" H3 D
- ;====================================================================================================7 P% k! Z( M( d% U$ n
- MACRO_MAPPER_INIT .MACRO8 h: j( p4 g, Z. H
- ;禁用IRQ
7 |# b) ^! }! ~9 e - STA MAPPER_REG_IRQ_DISABLE. A! a) k! B- @
-
; n% D7 f, v0 b9 k$ @9 r& G - ;水平镜像
/ ^/ l! [, {2 ~& Y _& y5 [% L2 w - LDA #$01, a6 t/ R- ?: Z& I
- STA MAPPER_REG_MIRRORING5 R& C' g4 t& l, ?1 Q
- % P! S1 A! M/ ?+ c% g8 z9 a$ z
- ;初始化图形bank
2 U. G' r& ^* `! ^ - LDX #$05
5 P" q. i) `; d9 w, j9 ^ - .Init_Chr_Bank5 e$ G% j& N+ O& P% Z
- STX MAPPER_REG_BANK_CTRL4 f& {( o+ w) f3 G4 M3 S
- LDA .ChrBankData,X8 l3 K1 @) \' E, `% E/ Y8 w) w
- STA MAPPER_REG_BANK_DATA
3 b' V8 C, e9 v8 |0 X - DEX2 U& d4 B- @' x z1 {4 f) S
- BPL .Init_Chr_Bank) |( s+ T q% ^
- JMP .Init_Chr_Bank_End. ]9 i8 N9 \" g
- .ChrBankData. ^0 T0 ?& W0 M/ q
- .DB $00,$02,$04,$05,$06,$07+ ^ V& z9 @ w' h
- .Init_Chr_Bank_End% ^$ W J, f+ I0 K+ h
-
6 _7 Y% o. i4 w - ;启用SRAM2 o8 x4 @: q. | B, A$ J, i
- LDA #$809 P, @0 i, C3 g: w% C4 M! S, J5 p
- STA MAPPER_REG_PRG_RAM_PROTECT
4 m6 E1 s! y8 z$ g# N - .ENDM2 u1 `) t; v/ s# J: R
; l/ Z# u, s! w# D- ;====================================================================================================- M% f) X1 g( a! s# p# C+ b
- MACRO_MAPPER_SOUND_CLEAR .MACRO
& X+ g, K( L& R0 M" ^6 L( K: { - .ENDM
1 Z% Q/ ?, N0 F4 ^1 ^- S; ~ - ) N4 |, L* Y1 d. D4 w3 _
- ;====================================================================================================
5 l3 ?* a2 ~1 Z L - MACRO_SRAM_ENABLE .MACRO
5 J+ Z& m; Z6 T. ~ - LDA #$80
4 T. a7 a/ n, ]5 m( n - STA MAPPER_REG_PRG_RAM_PROTECT
5 d6 k% f3 g. h" } - .ENDM+ k. o z. M' _+ _( U% p' n
- 8 _) s( D( {' T, j2 x6 }2 P
- ;====================================================================================================
1 u9 w6 q9 x: S4 j - MACRO_SWITCH_BANK_8000_A .MACRO
5 z' o" D' R2 c - PHA
) f% X ]: [8 T. b: { - LDA #$06 V" v$ D5 ?& e1 J: z- S
- STA MAPPER_REG_BANK_CTRL7 U" ?! F! h9 V+ y
- PLA" {9 c4 L) t, H# |/ O
- STA MAPPER_REG_BANK_DATA
9 H: x0 o5 W4 r) `" W8 M9 T6 T - .ENDM( S1 U& D0 p2 Y' k7 X
- " A7 S, d& C { O4 a* K
- MACRO_SWITCH_BANK_A000_A .MACRO( {6 j) e# P( F: R, V5 Y' \0 M Z) o
- PHA
$ T2 K) _& U; `7 q& E# ? - LDA #$07
4 f6 T" }. z2 k* ^! G& l - STA MAPPER_REG_BANK_CTRL
- L- g+ R: B! g. R6 J/ C - PLA8 J3 k, q3 [: t
- STA MAPPER_REG_BANK_DATA8 d/ x3 j" R7 I/ ?# p
- .ENDM; v8 [$ v D; r0 b3 b/ E
-
* Q W4 H, p7 L0 u - MACRO_SWITCH_BANK_C000_A .MACRO; {2 Z' }8 v: B3 B2 O$ `% ?
- .ENDM3 q2 I4 \; _9 J& `( r" m
- : h3 _; |- f1 c$ ?0 [# d
- MACRO_SWITCH_BANK_E000_A .MACRO
8 z$ C- ~6 {0 d* A8 A* z7 ` ~ - .ENDM
2 Z: e, f1 l% |( ^! D$ x - / U$ M4 k6 Q: ?0 g7 K3 R# H
- ;====================================================================================================' N6 O( G# Y* R
- MACRO_TRIGGER_FIRST_IRQ .MACRO
% F0 w$ ~$ F3 `( f0 w0 T |" O" } - LDA #IRQ_SCANLINE_BEGIN + 1
% k6 Y: ?+ j0 V - STA MAPPER_REG_IRQ_LATCH
0 _$ [) l) X2 M7 h2 t, q - STA MAPPER_REG_IRQ_RELOAD, ?& B1 c) d- [; S% r
- STA MAPPER_REG_IRQ_ENABLE2 c9 D: @$ B' h3 _$ W
- CLI
) W4 f0 }& D4 v; W9 j$ s - .ENDM
1 G& X: W+ M" f/ a& W9 r3 l- l -
- r( h+ s& w0 {# X/ \ - ;====================================================================================================
: {4 K8 X; j y& S/ M - MACRO_ENABLE_IRQ .MACRO
2 [1 x! x6 V5 d* O$ C m m - STA MAPPER_REG_IRQ_ENABLE, t+ I2 p3 L/ e' a; r9 @4 m q5 t
- .ENDM- t5 `: j2 t$ f9 T9 c- m
-
" n+ l6 b& b4 M: K5 D7 e* g' r - ;====================================================================================================5 C6 X: f% z0 j0 C' ?4 U
- MACRO_DISABLE_IRQ .MACRO$ A3 L- N3 S9 O) C9 H
- LDA #$00; y8 q4 o% ^0 |- N! \8 [
- STA MAPPER_REG_IRQ_CTRL0 B$ s0 a A4 q! q
- STA MAPPER_REG_IRQ_ACK8 @% k% M8 o5 E5 v6 k
- .ENDM
2 e+ ^% r8 C* R. {4 l5 k -
4 F, m- P& F& k3 [+ h9 M& J/ F - ;====================================================================================================' f& W/ I. y ]
- MACRO_ACK_IRQ .MACRO
) r( U* _+ ]( _6 ? - STA MAPPER_REG_IRQ_DISABLE( u2 o3 c7 I( F9 U: m
- STA MAPPER_REG_IRQ_ENABLE
: `. t# W4 L( R) R9 ` - .ENDM0 v, _8 w/ ~$ T- Q( |
- 7 S1 y6 Y/ n/ [- O1 O0 ^
- ;====================================================================================================! p: x+ Z8 X* a1 D k& Q: A
- MACRO_IRQ_OPERATE .MACRO% K! H/ o& D5 g" b0 N; d+ X
% v! y; r7 K. a9 |- ;==================================================$ q/ g4 F' b8 L6 V* p
- ;IRQ滚动模式常量
+ v: P- T9 I- m - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
* C% ~3 M. P* Z - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
+ t) S1 L2 B+ p5 y2 j" Y* P7 G% ~& H - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动9 d ]0 |" |1 t$ v. k# N% a
- # C: ^( y" B+ {. a' E/ Y# v
- ;IRQ扫描线数据6 q( e# o5 |* |- ^
- IRQ_Scanline_Data% i6 A$ b1 T6 N1 z& X! W) W
- .DB IRQ_SCANLINE_1* U+ j P( v2 X8 r$ @% j2 ]
- .DB IRQ_SCANLINE_2) M2 c$ e4 l6 I: ?# }- B! A
- .DB IRQ_SCANLINE_3
) j0 J. ^3 K8 d - .DW 00 ;关闭IRQ5 y* M$ b- ]* ]1 _
e; X* A) a$ U! m* H( G- ;IRQ滚动控制模式
- Q ^' c6 c. w6 T; c9 a" V1 Y - IRQ_Scanline_Mode
& Y( M* R1 y5 y - .DB IRQ_SCROLL_MODE_RIGHT
0 D5 j* V d3 |: s* T l8 V, W" t$ i, T - .DB IRQ_SCROLL_MODE_LEFT
( m- K- N! I6 c - .DB IRQ_SCROLL_MODE_RIGHT$ ] W' }4 r9 H# d Q
- .DB IRQ_SCROLL_MODE_LEFT
9 `$ Z' b7 W" v4 ?, k, u1 @ - ( l" X$ \, K8 E8 k# d7 p: ~
- ;==================================================! |; S& m4 O, p% A) k/ ?
- ;;IRQ滚动控制
a: o$ H6 ~9 j8 m0 a. X - IRQ_Set_Scroll
) ?+ p% D& r5 v3 d& |% \5 b; o: f - LDX IRQ_Process_Index
8 V7 h6 O' }. U- w3 V( K/ A - LDA IRQ_Scanline_Mode,X! _+ K7 b. |5 g" g
- CMP #IRQ_SCROLL_MODE_LEFT8 ?3 U( w a3 X
- BEQ IRQ_Set_Scroll_Left
9 t8 r3 _% L2 E& S8 X7 {2 g# I - CMP #IRQ_SCROLL_MODE_RIGHT
" i) e- V1 U4 M) B1 v( _. a - BEQ IRQ_Set_Scroll_Right0 F) D2 v2 Y g( Q8 n6 \$ c
- IRQ_Set_Scroll_Zero;不滚动
8 R- {' k3 V+ _. `& d5 C6 w - LDA #$00
$ H" J, [9 }+ }2 m' t. l: g - STA PPU_SCROLL: E1 f. X; i% A7 }" i2 `8 \
- STA PPU_SCROLL5 [ B" I1 g0 r
- RTS, p9 Z X0 ]$ Y7 I0 d8 E o
- IRQ_Set_Scroll_Left;向左滚动8 T; S- f8 x% j# S8 I: f+ `
- LDA Scroll_H
( N* j, O" B X @ - STA PPU_SCROLL" H0 R% y$ @" w6 }4 l. q
- STA PPU_SCROLL
" ?/ D) r5 C; X+ K4 n) E* f/ N - RTS% f( b7 p. M" L3 G
- IRQ_Set_Scroll_Right;向右滚动2 R5 V' v1 D" Q! N( A- M
- LDA #$00
! {* ?/ n* @# g* p6 P - SEC2 I& ] P+ I7 x( B! m; f1 t
- SBC Scroll_H
7 Q6 Z% y% r: _6 A - STA PPU_SCROLL
% z, v. P/ L' x; N - STA PPU_SCROLL
! ?8 Y, @/ k& I, b% Y; n o; J; m6 }; q5 @ - RTS% W4 k9 ^. \9 o" G! E# x
- 3 h! i) c* l/ z$ t2 ]8 f
- ;==================================================6 w8 w) m0 [/ ^6 h4 B4 U% h$ U2 ]( K
- ;;IRQ滚动控制" ]( v C- B6 y& J
- IRQ_Set_Ctrl/ x! }# \3 ^1 W# E1 f4 N
- LDX IRQ_Process_Index" h, `1 [) ?/ ~* P
- LDA IRQ_Scanline_Data,X* \1 v2 ?) P1 y& z
- BNE IRQ_Process_Latch- T' A* [8 I* Q& s5 d
- IRQ_Process_Disable;禁用IRQ# | _9 h$ k' p4 B& Z/ l
- STA MAPPER_REG_IRQ_DISABLE& x# q5 e. Q D9 m9 F3 E5 K. q
- STA IRQ_Process_Index
. J9 s& |0 K0 H- ~& T/ c% @ - RTS
7 l& E2 }4 B A7 t) L0 p - IRQ_Process_Latch;设置下次 IRQ 触发扫描线, b. D* v8 d' D/ f
- STA MAPPER_REG_IRQ_LATCH
) Y m4 ~$ t9 V! Y0 {% ?0 S - INC IRQ_Process_Index
4 P' V- Z5 I1 P - RTS
3 |% t3 L# J& g3 g% p* T9 z& d
* y8 D$ V$ _4 [4 H- l- ;==================================================9 T' N, E Z! w/ v3 s5 S9 b2 H
- ;IRQ处理! u9 x% S( R% x, T
- IRQ_Process_By_Index8 B% t" K, L v. l% P+ A- o
- JSR IRQ_Set_Scroll6 ?0 [& O7 @* F
- JSR IRQ_Set_Ctrl! F" r+ Q$ U( y
- IRQ_Process_End
8 G) c( {1 Q$ k# ~" [8 D - RTS
9 P0 c0 k3 ]: M0 h# P+ { - 5 e7 l% r6 F8 P" G
- .ENDM+ T4 k4 S n5 ^& Y+ J+ h6 O" S
-
7 ^% }4 p5 \% D$ Q& `$ U
复制代码
! m4 L, d, ~ M% a- ]6 }0 ^ {' P6 ~
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|