|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 O. r1 V5 [7 O
( W% H8 B1 X( _% V; Q# s
本次IRQ研究了如下: ], B! k3 N- T O1 o6 Z
VRC2&4(Mapper21,23,25)3 ~1 T# }* U/ r3 F6 }1 E2 m
VRC3(Mapper73)$ M+ X5 Y2 J7 D- e2 n
VRC6(Mapper24 & Mapper26)0 }) u4 @- ^ L4 @* v1 e, G" F: | r
VRC7(Mapper85), V, M+ `1 B5 }+ ~2 z+ s2 O2 x3 h
MMC3(Mapper4)& B, j& j1 g( b
MMC4(Mapper10); l( J" Z# T" q
MMC5(Mapper5)" T- f- w% _7 ]/ o
Mapper18) C D% V o" D& X9 \
Mapper647 I9 t/ G3 p( W4 X H! N; Q
Namco163(Mapper19)
2 ^) C4 Z5 }; u! {7 @/ H7 CSunsoft FME-7(Mapper69)+ ~4 H' Z+ W! X* E/ p
) x, [: U& ], `) K, @
共计11种Mapper的IRQ操作使用例子* w5 P2 `5 p, K8 [! O
代码内有详细注释, 希望能帮助到感兴趣的人.
& L5 x) H$ p* m' w9 B
) N2 S+ s! o: q- q3 Y& d' H: G! h9 m8 |/ m' I
' @8 a3 a- I# u" ^0 oMapper代码主要逻辑(以MMC3为例):, F, o f+ I+ `
- 0 W% n, u+ Y4 j! O4 Q) _' `
- ;==================================================% K# ` M! q# ~. J) X
- ;Mapper号! [# S' E6 O( ?% R: q0 N% q. }
- MAPPER_NUMBER = 043 H7 Y. O& L0 p! d3 y2 z
- ;==================================================
8 z8 \! `& ^/ y5 c& e6 e! c - ;MMC3 (Mapper 4) 寄存器常量( W- U* S( s! U0 O+ u
- MAPPER_REG_BANK_CTRL = $8000; d1 T( Y$ d! A6 }/ h& T$ r f) f
- MAPPER_REG_BANK_DATA = $8001/ t2 e1 `5 g0 J! D z
- MAPPER_REG_MIRRORING = $A000
( E1 X& N) T: I2 H( R - MAPPER_REG_PRG_RAM_PROTECT = $A0016 y( ]. ^$ E* K7 r! m' w
- MAPPER_REG_IRQ_LATCH = $C0002 Q# Y( I9 O; R/ y
- MAPPER_REG_IRQ_RELOAD = $C001
0 t" g0 d; h% t$ N1 ?- \2 I: v - MAPPER_REG_IRQ_DISABLE = $E000
3 C. @5 _* y B" h. q: m9 j% ^ - MAPPER_REG_IRQ_ENABLE = $E001
( i' N9 \0 e1 ? - ;==================================================
" X1 t: \( l# D7 V4 N - IRQ_SCANLINE_BEGIN = 135
/ j- y/ k( x# e8 n2 Q j/ e - IRQ_SCANLINE_1 = 8) y" l# H: s$ g" Q: j+ w6 k
- IRQ_SCANLINE_2 = 54: m" {; y2 r' j" Z
- IRQ_SCANLINE_3 = 8
8 g2 s7 s5 a# U- G - ;==================================================
! |# S( u$ u$ C: e( y8 C% F
* O2 S5 I8 K4 G- T9 `- ;====================================================================================================
1 }1 f8 g0 S0 h3 `7 B" F - ;宏常量
! I) w1 f; N. |1 I9 s2 m% Q - ;====================================================================================================8 E, V* {% t; R( j9 Z9 x
" o* Y* @5 o6 i; l3 q- ;====================================================================================================! H, n/ S" Q% P7 U- @
- MACRO_MAPPER_INIT .MACRO8 E5 k& H' E' Q: N
- ;禁用IRQ/ Z& G7 a L- Q4 f* c
- STA MAPPER_REG_IRQ_DISABLE7 g. S* f% R2 L
- 0 o& V+ p1 h3 `2 S, J. d3 w
- ;水平镜像& F) \. C/ {& T
- LDA #$01
+ O; d6 q* ]% n3 C - STA MAPPER_REG_MIRRORING) [3 ^& B) X1 Y
- 7 q% B6 R% {* i$ _: g1 S" z6 }* r7 \
- ;初始化图形bank
6 s e$ v+ A" i) b - LDX #$05$ P7 i) b+ A/ s0 j1 ~8 S6 X3 [" E
- .Init_Chr_Bank5 m+ _; Z! W9 R. o
- STX MAPPER_REG_BANK_CTRL
6 g' T! ?5 V/ N9 ^& _: o6 A% b - LDA .ChrBankData,X! P6 l3 Z3 z! |. n! D. e) ~# W
- STA MAPPER_REG_BANK_DATA
[7 A& A7 u" p) d( R - DEX* q9 S$ z. N9 A4 P4 {7 Z
- BPL .Init_Chr_Bank
7 l" L$ X( U9 n: k( W6 {: M2 f - JMP .Init_Chr_Bank_End
8 W6 z1 p9 j$ n9 c' D- Y8 K - .ChrBankData
' a8 t I! o6 H* _+ r9 c - .DB $00,$02,$04,$05,$06,$07, X# I+ Q9 R* w& [6 {
- .Init_Chr_Bank_End! _% S/ ~3 t) m" Y
-
* _- V9 X: B- b3 C4 O; a - ;启用SRAM6 u* s* q: P8 V
- LDA #$80/ _" N% A8 K4 ?7 N( i3 j" |
- STA MAPPER_REG_PRG_RAM_PROTECT1 N1 _6 K9 R; d- [2 _
- .ENDM" O$ n) ?. H* E$ ~9 d& N
- ) X. A+ n( |- z! N' x) i, Z
- ;====================================================================================================
1 _, L: D7 s& ~% B/ E4 X: B y - MACRO_MAPPER_SOUND_CLEAR .MACRO
* L7 h0 W9 y( h0 \8 O/ L4 D6 ?: n - .ENDM
- C4 s3 t$ ?& `9 E6 [ - # I% F. {2 X& J1 u1 }
- ;==================================================================================================== ^, `+ l$ y6 |( {' c! z
- MACRO_SRAM_ENABLE .MACRO
; f- s. ^7 ^7 t0 E - LDA #$80$ U0 a2 s" K! ^4 w3 Q- s# K
- STA MAPPER_REG_PRG_RAM_PROTECT. w7 m; A8 _* m
- .ENDM: U7 R# V" l% ]0 m; y
- ; m# t5 o3 e1 j s( H+ \6 C% ?
- ;====================================================================================================' G5 H$ W3 _' R! ~; E3 B
- MACRO_SWITCH_BANK_8000_A .MACRO6 U2 s% h( O2 |
- PHA, v/ N: z( [7 D) E; z
- LDA #$065 l& X0 @* F: g% b9 N6 n
- STA MAPPER_REG_BANK_CTRL; e0 {/ t% Z: e1 J/ H* n" }
- PLA, n" c, a9 e. V1 G
- STA MAPPER_REG_BANK_DATA
6 F8 ?0 I0 l; n8 g$ Z3 F - .ENDM3 @' e# f, C1 \3 I4 }
, y6 A3 X/ o* U) H1 E! |; p, u- J' L- MACRO_SWITCH_BANK_A000_A .MACRO6 G5 h3 }6 l& Z8 X: ~' f
- PHA
! Z$ i+ ? e$ F1 i - LDA #$07) n, w. Z! d8 B# O. T# Z
- STA MAPPER_REG_BANK_CTRL( g+ q9 i* W' c+ B1 b
- PLA8 l- @( t" B1 e
- STA MAPPER_REG_BANK_DATA# ?6 [0 y4 Z$ V
- .ENDM3 O- @: z% A1 x6 {& O4 T0 G* |
-
, p3 o! i$ x6 ?2 [, `' o - MACRO_SWITCH_BANK_C000_A .MACRO$ S( u0 l4 m7 t, C' S
- .ENDM' P- f h6 c* J9 D- q" b7 A8 ]! J
+ s$ b( z0 n1 w- MACRO_SWITCH_BANK_E000_A .MACRO
8 G/ ^7 L+ `& ?. i - .ENDM
1 m/ @+ U" N9 t8 [6 L. z+ x
$ K/ J* K- T$ y& }: y; m5 o k9 d- ;====================================================================================================
4 d& i" S z6 K# l - MACRO_TRIGGER_FIRST_IRQ .MACRO: L' X2 P" i; V
- LDA #IRQ_SCANLINE_BEGIN + 15 k9 Z B6 d, B4 Q
- STA MAPPER_REG_IRQ_LATCH
7 D; @9 X7 J1 | - STA MAPPER_REG_IRQ_RELOAD) N+ @" b, w: [- W
- STA MAPPER_REG_IRQ_ENABLE
, D' k) g/ l; t S* s; l4 `2 o" z - CLI4 d( `. [% C; G
- .ENDM
( ?1 C( _$ K6 i. K - 2 s% J" H% m) Y9 Q: V1 [
- ;====================================================================================================
; Y& s5 m1 ~' o" t5 X - MACRO_ENABLE_IRQ .MACRO
# E8 V/ h4 Z& G3 |, ~2 u) y9 r - STA MAPPER_REG_IRQ_ENABLE- E8 a" f3 E6 ?+ j
- .ENDM
7 \+ d' l+ t* Y3 |( V+ R - 3 H3 Y l3 Q9 j* K$ n
- ;====================================================================================================! w& P4 l1 \3 V6 s
- MACRO_DISABLE_IRQ .MACRO
1 ]0 B; w/ p! D1 A) U# S - LDA #$00
|+ r: y/ t7 E; N% q# e' q - STA MAPPER_REG_IRQ_CTRL
8 H8 \: k7 L/ F - STA MAPPER_REG_IRQ_ACK
7 ]& J3 P% H; u$ A - .ENDM
" e3 i) u) K1 E: a9 L - ' e/ |5 |4 T4 A
- ;====================================================================================================/ g S! c5 L2 W' X
- MACRO_ACK_IRQ .MACRO
& @1 y" |/ g; c$ X' s( d3 }1 P2 h6 A - STA MAPPER_REG_IRQ_DISABLE
% {- U* g/ F9 ~' Z+ Z; b9 J - STA MAPPER_REG_IRQ_ENABLE
. Y1 G% t3 ^/ f2 | - .ENDM: Y. x I1 x# S) N
- + x, c) }! U: H; o, x8 Y% A
- ;====================================================================================================
- C! D6 T, U$ J+ p) Y) [" d) a - MACRO_IRQ_OPERATE .MACRO, h. K6 T. h7 S; _4 f- K! o
& E0 b$ Y Y) K3 I- ;==================================================
* A) D5 h5 {' V1 x0 W' `4 p' e - ;IRQ滚动模式常量
( C4 C) R1 W; |% [ K8 U - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动! [$ U" E( z3 _. q) `4 `( M: L( p
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
0 _1 M; m0 m2 E O8 _+ g! `9 j - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
- w! ~& z+ T, M
1 L8 O. x% E( P3 Y. H! m- ;IRQ扫描线数据. A+ b+ t4 h N' k) ]
- IRQ_Scanline_Data
( j1 g9 {6 a( O4 ?% ~7 ^$ a C. s - .DB IRQ_SCANLINE_1
K% N! o. b+ E - .DB IRQ_SCANLINE_2/ S% B1 @" b# M2 ~1 F6 |
- .DB IRQ_SCANLINE_3
7 G) Z3 r3 a0 r- B: F3 j7 w; [ - .DW 00 ;关闭IRQ# p' a1 O" D- ~
3 F" O! H$ M$ {4 o) h- ;IRQ滚动控制模式
) K1 t& Q6 L8 S. i7 W C' D$ Z - IRQ_Scanline_Mode
# `5 G9 @1 c7 ?+ ~4 K% K0 W5 D - .DB IRQ_SCROLL_MODE_RIGHT( |% E2 m( k$ m3 [
- .DB IRQ_SCROLL_MODE_LEFT' Z- L% M* V2 b/ w) i
- .DB IRQ_SCROLL_MODE_RIGHT+ X* y) @2 O S1 T/ ]
- .DB IRQ_SCROLL_MODE_LEFT4 S$ @! ~" U) W4 e
- 8 L/ ~ N2 L, @2 R
- ;==================================================
3 P S- \% r2 \: A: ?+ J - ;;IRQ滚动控制
3 \ |& B0 e/ x" c - IRQ_Set_Scroll
- }& b$ b7 }' e8 Y' X3 Q! g - LDX IRQ_Process_Index8 I& ]2 x' I4 p3 }5 a+ v$ g: a
- LDA IRQ_Scanline_Mode,X+ b5 f: z0 ~' S# i" y: O( M
- CMP #IRQ_SCROLL_MODE_LEFT
! i3 V6 C- |: T5 W* p - BEQ IRQ_Set_Scroll_Left6 b9 j7 Z' p: x
- CMP #IRQ_SCROLL_MODE_RIGHT
; `' T- C* Y5 {" S+ ? g! J - BEQ IRQ_Set_Scroll_Right6 ]2 K0 b0 w ] I8 E" U) B
- IRQ_Set_Scroll_Zero;不滚动
) ^( l" q1 D. ? - LDA #$00
. m, x# b+ A9 ~& Y/ S4 b - STA PPU_SCROLL- ^1 k! Q+ r) j' t4 j0 E% M% h
- STA PPU_SCROLL% u- P3 n- x/ c& s
- RTS
O2 \, V# U$ v& C - IRQ_Set_Scroll_Left;向左滚动
7 t1 K" L- p8 W1 D, k - LDA Scroll_H3 M7 l% q# T. I5 c( m# e+ A y- ~
- STA PPU_SCROLL
7 `0 R% V) a0 K) } - STA PPU_SCROLL, z0 y5 {' b" d+ g" W; `/ O/ }. c0 N
- RTS5 ^" p5 z! C& N
- IRQ_Set_Scroll_Right;向右滚动
; x2 ~ \) N8 y- ^2 s5 d5 N - LDA #$001 l+ n; K# M, p. x
- SEC t. ]" @/ e I+ r4 G
- SBC Scroll_H
. a; Z/ x' A$ {, ]+ \ - STA PPU_SCROLL
4 z/ Y" Q3 i5 D4 G - STA PPU_SCROLL) t: s5 p$ l( M) [
- RTS" S, {2 h( O6 S1 d& w7 J
-
0 {, d; s3 Y! L. E - ;==================================================7 f+ {9 I8 C2 v% g+ E( q5 S1 ^
- ;;IRQ滚动控制: f$ C2 L5 D i- P6 x) q& W5 C# b1 [
- IRQ_Set_Ctrl
1 A+ v9 X, V0 X - LDX IRQ_Process_Index
! Y k/ W& b2 s# b$ n# G% K, ^ - LDA IRQ_Scanline_Data,X
- @, Q8 W$ B M0 B9 c3 X - BNE IRQ_Process_Latch' `2 Q9 t9 j. U6 d8 | W+ z" a* ?
- IRQ_Process_Disable;禁用IRQ
3 ]' b6 K* ~3 u - STA MAPPER_REG_IRQ_DISABLE+ y- `3 n7 P7 @/ n: h
- STA IRQ_Process_Index' e4 o- M3 F% B! J% I
- RTS6 i$ W7 d. u, o2 |* ^3 U5 T- ?
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线+ \- E3 {/ K# t ^
- STA MAPPER_REG_IRQ_LATCH: _+ T: r; Z7 q( B" Z/ m
- INC IRQ_Process_Index
7 W- i) u1 a: y/ Y% P2 z1 k - RTS
% _; f: }" |+ ]
- p* N# C' G3 X/ H0 X- ?- U7 V- ;==================================================
7 B9 ]) D3 s) L1 E$ B9 S+ R - ;IRQ处理
9 R! b7 h+ J7 a* c% O9 i - IRQ_Process_By_Index9 b& D. Y) r; d/ Q3 }
- JSR IRQ_Set_Scroll
# F8 ^, ]5 \; b3 t$ n0 | - JSR IRQ_Set_Ctrl4 I' ?* c* H# z
- IRQ_Process_End
0 C* ^7 T% K( u) C3 [! N2 w: s4 b - RTS- Q% v% F; T% G% k6 }, |
- 9 i$ V2 Y7 Y2 K( O; N- p }
- .ENDM
. C; O# O- Y2 K3 {6 t -
3 s) w8 g. K) \( V C; D9 D2 r
复制代码 8 u* G( W/ d- g* g" C# L2 r
9 d, u9 h9 y; r代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|