|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 - l# a7 x. J {$ i
+ R( p+ j8 {# I( Y# `1 c% b. b
本次IRQ研究了如下:: ~" s' T' Q1 K3 W
VRC2&4(Mapper21,23,25)9 H! i8 ]$ U3 c# D1 j! w4 E; O, s) A" x
VRC3(Mapper73)1 m$ E3 R( N) B* d; P
VRC6(Mapper24 & Mapper26)0 a4 u' l: C4 C- ]4 `
VRC7(Mapper85)& C7 W% h$ R5 a
MMC3(Mapper4)
I$ ^9 A! d; M" TMMC4(Mapper10)# T' U, O" f" |$ L* y( e( t
MMC5(Mapper5). @7 ?0 R- s$ d3 G7 O
Mapper18
) T L* B9 F: k0 X5 MMapper64- r/ s0 {) j' A) C; s
Namco163(Mapper19)
- X8 S! \. x1 _; DSunsoft FME-7(Mapper69)- J& ]0 `9 y! o7 l
" K) m$ Z" a3 O0 t; o0 K共计11种Mapper的IRQ操作使用例子0 w9 P4 X+ E2 S7 r& `* @
代码内有详细注释, 希望能帮助到感兴趣的人.( [8 X I9 C# H& K
5 o0 P& n Q, f: h1 q  
8 y1 e1 T4 ]- U1 J* [$ {$ F- A* w H O. F& M
Mapper代码主要逻辑(以MMC3为例):
( @1 B( x/ v: a" x' M" T J
! j% N5 r) N& N. X' T2 _- ;==================================================
8 q7 M5 \1 ]2 L; m) \ - ;Mapper号
- U, b& E6 T/ I4 r - MAPPER_NUMBER = 04! F- g \3 a0 ]( W/ X/ P* V
- ;==================================================
6 x+ Y8 N- N. l2 @$ V3 q4 G - ;MMC3 (Mapper 4) 寄存器常量
$ F7 T7 w( W" u% T4 N - MAPPER_REG_BANK_CTRL = $80007 O5 N' ~& @+ @
- MAPPER_REG_BANK_DATA = $8001$ l4 a s) `8 P! T0 x
- MAPPER_REG_MIRRORING = $A000& F) q" y! _8 N, _. T' @1 r* r! B" F! `
- MAPPER_REG_PRG_RAM_PROTECT = $A001
- R8 c5 K! x9 S0 a5 u! _ - MAPPER_REG_IRQ_LATCH = $C000
/ r2 ]$ `- i1 r) c# W! ` - MAPPER_REG_IRQ_RELOAD = $C001
( B1 E: l% a. \& y8 ~ - MAPPER_REG_IRQ_DISABLE = $E000
( A- h( R+ N# W: P$ Y/ e' O0 f - MAPPER_REG_IRQ_ENABLE = $E001
+ \6 M; \. }* T) U: L - ;==================================================
3 d1 f; |3 y8 a - IRQ_SCANLINE_BEGIN = 135
9 j- z6 c+ v3 R. x& w' b - IRQ_SCANLINE_1 = 82 G( i$ `* N$ z" O+ u
- IRQ_SCANLINE_2 = 54/ r" J" X- I Q2 I& s* g t% ^. I
- IRQ_SCANLINE_3 = 8& B& z* @# k4 E+ e: b/ j' _
- ;==================================================- Y$ `3 N" O7 `9 D' E
- 5 }; H- V5 G4 ]. r& H( V% h9 c
- ;====================================================================================================
9 d3 |* @( X* X9 ^# h# p' i - ;宏常量* Z6 T3 l9 d. e' D5 C
- ;====================================================================================================9 H6 [! E' Z% k
6 a* s! h6 M' R% l' i+ H7 {+ i1 r- ;====================================================================================================2 S2 |' p6 B% A6 L" z" C& ^
- MACRO_MAPPER_INIT .MACRO, F; h# Z0 C% w* W
- ;禁用IRQ9 {. J* U# [0 o( p& U8 J
- STA MAPPER_REG_IRQ_DISABLE
4 Y% d" t9 I( f' @' c3 Y! f% r; P" v - & F4 V# r: ^, {/ g4 R
- ;水平镜像
& v+ t) r+ K1 _ g; k4 v; a - LDA #$01
6 z3 K0 y: x/ K N8 G - STA MAPPER_REG_MIRRORING
6 h; X$ n' J3 _3 b3 a" V( S' l. s/ U - ' k5 S9 ^7 z6 f( p; K" ~% E
- ;初始化图形bank
: N6 ^/ v/ W! K: t2 M - LDX #$05
* p8 Y& v+ |7 Z$ o' r - .Init_Chr_Bank- C# e% e8 K0 t: U) l
- STX MAPPER_REG_BANK_CTRL
6 A* u$ I) }& o4 \+ U - LDA .ChrBankData,X0 X+ ?4 T& Z# v
- STA MAPPER_REG_BANK_DATA
* h- _, c! |; L2 i6 O @ - DEX8 D) n" F8 I$ ?2 p& T. E' ]; V
- BPL .Init_Chr_Bank
S0 N: c- p: R' P$ o - JMP .Init_Chr_Bank_End" W" M1 X' c4 g1 D1 e
- .ChrBankData5 w) S: M# T" D, z
- .DB $00,$02,$04,$05,$06,$07- V# I* F" U2 ?, m1 f- v
- .Init_Chr_Bank_End: H, l b" h: K5 k
-
& L" @8 k- { I% c - ;启用SRAM
) m) }$ P. _. ?( F6 |$ I1 e - LDA #$80: N1 n3 x5 O7 u. U& |$ m, ^
- STA MAPPER_REG_PRG_RAM_PROTECT( p7 Y: N* s' {, f; |$ S6 r' m
- .ENDM
, _; `4 q- Z0 y( a - / L3 @. E& {$ e. m/ `
- ;====================================================================================================& T) }! ^" ]# W
- MACRO_MAPPER_SOUND_CLEAR .MACRO
) U- \9 m- ?- _ - .ENDM
7 h5 K' h9 t: {2 x7 p* e$ G -
! m3 E% q M: v8 _' f6 X$ P6 e - ;====================================================================================================
& k; E; ^. g* K4 z3 E2 C - MACRO_SRAM_ENABLE .MACRO9 X) b2 m8 `6 B* r% K5 U' k; |
- LDA #$80
. A* n. ^) S. q' c2 ?3 z - STA MAPPER_REG_PRG_RAM_PROTECT
, Y( i7 d. r* X0 ]) \ - .ENDM# C: J& ~% y7 ~
-
g/ O2 }' n1 X1 r - ;====================================================================================================
0 s$ _+ a. Z2 s - MACRO_SWITCH_BANK_8000_A .MACRO ?9 L# r! x( ^6 j# L5 |7 W
- PHA
/ @# h! ^2 a+ q; d0 ~" \* ? - LDA #$06. R8 r) O' }9 v5 G* r e
- STA MAPPER_REG_BANK_CTRL9 }7 S# f( y1 T% K) _, {! Y) J" U$ b
- PLA
6 n c" O+ C/ h F7 o% \0 _/ v - STA MAPPER_REG_BANK_DATA
( e4 J% ~. ^/ j6 [" P - .ENDM D L) K, S. q& i' X1 z5 C
- ( I5 S" H$ z* i- L& m2 }" S
- MACRO_SWITCH_BANK_A000_A .MACRO1 W" n, G7 n' }& F6 D7 v; S+ \
- PHA
% d7 H7 D0 u4 {" {- K - LDA #$07" M3 E/ D/ u! C3 I+ N F
- STA MAPPER_REG_BANK_CTRL
' m8 ^& |8 _0 |. t6 z - PLA. Z$ q1 f( d& g! C# t
- STA MAPPER_REG_BANK_DATA1 L+ F' v+ ?9 n1 F
- .ENDM
, L3 f2 O- x: w6 { v/ l - 6 p3 L, T2 z8 J
- MACRO_SWITCH_BANK_C000_A .MACRO
3 _, z" x& m; e; G- w - .ENDM; z# @& [9 J5 B
5 [ p+ `+ Q- h5 q. Q- MACRO_SWITCH_BANK_E000_A .MACRO. h3 L6 P' @7 i. ^. L" D1 T
- .ENDM1 M) z f9 h$ n C
4 c+ r' T9 y0 ^- ;====================================================================================================
% s* N' U; v4 a8 Z" S8 ` - MACRO_TRIGGER_FIRST_IRQ .MACRO0 B5 i% v, N; V+ t
- LDA #IRQ_SCANLINE_BEGIN + 1
) j3 p+ S+ U& Q/ O5 m( [* ~ - STA MAPPER_REG_IRQ_LATCH
" K: X5 O: b6 d+ d" ~& a5 z, Y - STA MAPPER_REG_IRQ_RELOAD
0 g" [; [# c$ x# _2 i - STA MAPPER_REG_IRQ_ENABLE P3 b# }6 ~+ M% \" K. y9 R
- CLI' E6 Q$ H2 j1 y. J- B) A& E% N
- .ENDM2 S5 c6 z* X/ A8 C$ |9 m
- . y9 Y; P) o2 l! {* {; [6 w5 S7 W! I; W
- ;====================================================================================================/ ^0 v3 g7 ~4 w: j! d) o
- MACRO_ENABLE_IRQ .MACRO3 ]7 @% E% {: k! Q3 ~+ a. _/ C) i
- STA MAPPER_REG_IRQ_ENABLE
: o0 u- x( V- D. i - .ENDM0 g8 }' k" ^) P9 y
- & H H& j# t8 Y
- ;====================================================================================================
% |) I* g3 D" T0 D* m: v - MACRO_DISABLE_IRQ .MACRO
5 F& s- a$ L. Y; F8 S - LDA #$00
: R* \0 Y! {( s# c' G( M( M - STA MAPPER_REG_IRQ_CTRL( o8 v' {4 M0 i
- STA MAPPER_REG_IRQ_ACK
% I) z% l4 A( h - .ENDM, o% Z6 @% m9 u8 A6 f0 x1 F8 t+ _# o
- 0 _$ j9 \! v/ R! Y+ ]' ^. c
- ;====================================================================================================
$ X; Z% }7 q a! }* w/ t F( i+ [ - MACRO_ACK_IRQ .MACRO
) H3 K! y2 Y9 J" k% @+ \ - STA MAPPER_REG_IRQ_DISABLE
5 z& i2 Y6 v2 P9 ]" y7 m9 { - STA MAPPER_REG_IRQ_ENABLE; m t5 k4 e# I+ E% w2 v9 J1 |; c
- .ENDM7 T m) D/ Y1 V% L
- 8 c2 H. H6 y5 C/ P5 E9 [
- ;====================================================================================================
F. q' V. k; f7 S& I8 o5 }4 ^5 V' V - MACRO_IRQ_OPERATE .MACRO
/ @& I" c) v/ A& W. Z: w4 ?
$ C, T% B- w, u: m2 U! J% S- ;==================================================7 t- g* j9 A8 {# c9 X& V# P
- ;IRQ滚动模式常量
) h- v$ F" E2 V; W; H$ i0 Z. n+ N - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
, f- S6 }# u; ^' B4 s4 Y, n) z - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动3 t$ t6 p) y& D) W- c9 P
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
^$ u* y. N8 V& r
- M* [% F" Z' E; Q6 p- ;IRQ扫描线数据$ `2 X: I7 q2 m% J! Z3 u \5 d
- IRQ_Scanline_Data
/ f& k6 E- {2 f: u& w - .DB IRQ_SCANLINE_1
U) V' ^- y9 E8 q" r, I - .DB IRQ_SCANLINE_2
) t5 I% t, o# f- G - .DB IRQ_SCANLINE_3
$ [2 C% C' O. ~5 B4 G9 A - .DW 00 ;关闭IRQ
1 }* Y- L( q6 S! a - k5 S6 m1 G( l# p3 G* t
- ;IRQ滚动控制模式
: M6 J' S& N. s9 J$ T+ U- T - IRQ_Scanline_Mode' T* z" K5 |- _; `: m
- .DB IRQ_SCROLL_MODE_RIGHT1 ^. M, q" U3 g4 G- c5 u
- .DB IRQ_SCROLL_MODE_LEFT
1 K8 j* z3 h2 A7 T2 j$ w! \/ C - .DB IRQ_SCROLL_MODE_RIGHT" I+ W. p: T" H$ [8 H, b# B, B
- .DB IRQ_SCROLL_MODE_LEFT& u' {& |* e- S; H7 p. m3 ~
- ! Q7 _1 [8 M5 I$ ^. v) r6 X
- ;==================================================
) ]# ^ \0 {6 {1 I - ;;IRQ滚动控制# {2 u# ~! T4 R
- IRQ_Set_Scroll
+ b- O; o2 [6 {- Q% _: p - LDX IRQ_Process_Index
5 s- ^6 ~; \$ B5 i: S$ P0 i - LDA IRQ_Scanline_Mode,X
, L7 T; U' z6 j; l/ B; q9 i - CMP #IRQ_SCROLL_MODE_LEFT- e1 u. f9 }9 }6 D6 l; B
- BEQ IRQ_Set_Scroll_Left* u, Q+ d& ~' w3 K
- CMP #IRQ_SCROLL_MODE_RIGHT" L) o2 t, r7 l
- BEQ IRQ_Set_Scroll_Right! o3 [# V: k, B V! c
- IRQ_Set_Scroll_Zero;不滚动
$ U j* N- R( B! q - LDA #$00# r" o7 Q* \. A# S, g0 o/ m, E
- STA PPU_SCROLL* k5 D ~( ^2 y5 w$ ~, s. v
- STA PPU_SCROLL
* J( e3 a6 p6 j - RTS3 Q/ P/ `* K/ f3 ^% B
- IRQ_Set_Scroll_Left;向左滚动* N& x1 v) E7 x# B
- LDA Scroll_H
6 P0 U, `/ A# o& u0 _: n- U) l* L - STA PPU_SCROLL
- Y1 n5 G0 `: u- d - STA PPU_SCROLL9 f$ @2 s' l1 K' X0 G: @8 g& L/ A& z
- RTS |' |! t. E4 J2 H. T8 V
- IRQ_Set_Scroll_Right;向右滚动
& ]( k% u/ G! }+ B8 c; w) S - LDA #$00. ~& c+ f* K0 p, Z
- SEC4 h) v( i3 T$ h/ g. E9 G
- SBC Scroll_H8 {, m* V' W0 F. `7 ^
- STA PPU_SCROLL
- _. H0 F* _! `' f8 b8 W - STA PPU_SCROLL
$ L$ ?; r* Q N. X& W" L0 \% T - RTS3 e$ P) y7 H& K) l8 l2 o( t
-
- @ m+ _6 G2 q$ A - ;==================================================) `) V, Z, l$ b7 z0 X- W
- ;;IRQ滚动控制
1 x) m8 G3 M( ~: K8 Y8 i$ f - IRQ_Set_Ctrl' v) t0 h$ U' m4 @! {, S/ P
- LDX IRQ_Process_Index
& |' u$ A9 W0 t4 T3 v8 }+ V - LDA IRQ_Scanline_Data,X
( b" c$ b8 z- h; K" t: |* Y$ B - BNE IRQ_Process_Latch
' \2 c% }# m9 t& U) n - IRQ_Process_Disable;禁用IRQ; \6 j; B9 l+ x
- STA MAPPER_REG_IRQ_DISABLE; p( i) t+ E0 A8 z* J; |
- STA IRQ_Process_Index+ @. k7 b+ v7 e+ N% F3 J. d$ Z/ h
- RTS
H+ J9 M$ O8 e; k6 `' N - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
/ }4 ]) ~5 ~" {+ Z) y- ?1 a - STA MAPPER_REG_IRQ_LATCH: s8 |* t" D1 \* D
- INC IRQ_Process_Index" P- i5 z' q4 H$ S. ~! C/ Y
- RTS
3 V \$ S4 v P. X+ \/ s6 K7 W% a
2 P% a2 w, F8 u4 B1 I y( b3 v- ;==================================================
1 {1 j& ]1 K O( c4 \( S0 B! j - ;IRQ处理5 S0 t$ h7 ^" o# t0 i
- IRQ_Process_By_Index9 _! u) v0 N7 A+ J* ?4 v4 d
- JSR IRQ_Set_Scroll9 J! x# Y: n1 E1 z6 [/ I- a- x
- JSR IRQ_Set_Ctrl
* Y1 a L9 u+ N y6 G2 j6 k - IRQ_Process_End
$ i. y. x. I( R7 r6 v - RTS& |8 a: W( r _) }& P
-
) }! \1 u. e' f8 ^' x, t5 A) X8 c - .ENDM
: \- w* @$ ?- v m; R - 7 a# A4 F4 R" v6 z1 q |+ q4 v
复制代码
; W: ?7 m) y* E/ }( `
. {6 X4 E. b$ |/ R代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|