|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
, |" i+ T3 U; T J ]5 v
& R" S9 I9 E" o9 K8 p; w+ i0 t本次IRQ研究了如下:
# U8 b$ p- L6 _) ]0 G3 ^VRC2&4(Mapper21,23,25)9 X( y" W; o3 f
VRC3(Mapper73)# ~5 J' }, R3 k# I
VRC6(Mapper24 & Mapper26)* d: ]; L" A4 a9 q! H8 t6 ?
VRC7(Mapper85)+ k; e( a8 R: h( V
MMC3(Mapper4) \7 I8 O. Q( B% d# q
MMC4(Mapper10)" ]) [8 M! v; z9 b' n/ |
MMC5(Mapper5)' M8 s, n5 e- E: l( W
Mapper18$ M7 G v: M: v6 ^4 H
Mapper645 a- ^ b2 J; x( M+ t6 C
Namco163(Mapper19)
+ j7 N* k" E, R4 A# _/ m) z& ISunsoft FME-7(Mapper69)
8 Z+ m9 x, D+ e% D* j. w& [8 [, b6 g5 l/ E- c
共计11种Mapper的IRQ操作使用例子& S* ~; c% }) ?0 S# @
代码内有详细注释, 希望能帮助到感兴趣的人.
/ l" P9 A, R- i' o+ U" _% E3 S# @! l' u. f6 {4 N# m) t
  5 x; ^, \5 A" N7 v
) }9 b$ }8 q1 FMapper代码主要逻辑(以MMC3为例):) P3 p- W* P# W+ n, N+ ~$ D! h7 { k
- 1 U% _9 v# T+ s! e+ B
- ;==================================================
* s9 b: f& f# E! ]+ k2 _6 B$ y - ;Mapper号
% B9 k m6 a- E: d. y3 { - MAPPER_NUMBER = 04
+ J" U, M1 E& A - ;==================================================; E+ q4 @$ `3 g; Z
- ;MMC3 (Mapper 4) 寄存器常量, x: t6 M( d4 X
- MAPPER_REG_BANK_CTRL = $8000
. x2 {/ u9 h0 \ - MAPPER_REG_BANK_DATA = $8001
) u0 h1 x$ d+ r: R' a: ~# T2 { - MAPPER_REG_MIRRORING = $A000
9 i# D/ {! ?& p, ^6 N& f - MAPPER_REG_PRG_RAM_PROTECT = $A001
+ t, f9 p. L, f$ ?( n - MAPPER_REG_IRQ_LATCH = $C0007 C- G$ I) @8 t/ `, ` C& z
- MAPPER_REG_IRQ_RELOAD = $C001$ `+ v; ]5 N: A7 u
- MAPPER_REG_IRQ_DISABLE = $E000# f2 o, q6 ~ L- m) V, d+ c# \( m
- MAPPER_REG_IRQ_ENABLE = $E001
+ K- C+ g- b7 `! F* T. f - ;==================================================' W4 R) ]+ u6 a: @5 v
- IRQ_SCANLINE_BEGIN = 135) R4 g. ], F: ?4 l: Q1 F
- IRQ_SCANLINE_1 = 8" \* L1 [1 _; B$ v& x
- IRQ_SCANLINE_2 = 54! K' v' i N G
- IRQ_SCANLINE_3 = 86 D; f9 \+ {# K* v* p
- ;==================================================
4 D- U: L$ ~3 u) G
" K; E( _# S% A- B( u _" H+ {) u- ;====================================================================================================. s0 D& P2 H$ Z# C. s
- ;宏常量. R+ `* Y8 Q. i3 o& x; h5 m9 W! |
- ;====================================================================================================- V- ?- Q! G& Q+ \
- 8 {5 I+ Y! q" i- u) Z% A: _
- ;====================================================================================================
L% y K0 E& I% n& X0 } - MACRO_MAPPER_INIT .MACRO& D* k0 [6 R' A0 E% m7 y1 h; M
- ;禁用IRQ# u# z9 [$ B9 _
- STA MAPPER_REG_IRQ_DISABLE
\' E1 i7 C. X1 @) M. f4 ^$ J8 O -
0 {' q0 a9 J. T& H) O+ M0 a - ;水平镜像( F+ H, `+ b# ^3 ~9 {- E
- LDA #$01
7 }1 A0 l. K5 }7 G/ ?4 `: w3 C - STA MAPPER_REG_MIRRORING7 L7 \# Q9 ?% U4 w2 U% p4 ], p
- , {$ t c* Z4 u8 z" ~9 B
- ;初始化图形bank
4 D+ m2 m% H! L' t' B; D4 u& \2 D - LDX #$05% B- ~/ v' `9 o1 V
- .Init_Chr_Bank
' N j) X3 x Y1 D; I - STX MAPPER_REG_BANK_CTRL
: G/ j1 C/ |8 m& y3 h - LDA .ChrBankData,X5 X- o% b* \$ t9 ]7 h, A& s2 U
- STA MAPPER_REG_BANK_DATA
1 K4 U+ v+ Y, _0 X - DEX
; B6 J; v! z$ d% }) C: @ - BPL .Init_Chr_Bank
1 y: a( z% P( Y& D$ w6 q. V8 f- w! z7 U - JMP .Init_Chr_Bank_End
# f( T( M" c4 H& X5 W - .ChrBankData- p5 b' n* G( g4 m/ @
- .DB $00,$02,$04,$05,$06,$074 l) @& k3 d' @5 f7 I
- .Init_Chr_Bank_End7 @* K5 s& j, H, h7 ~
-
5 Z* s3 O p$ [2 Q- ~2 d2 D - ;启用SRAM5 i% d& R7 O1 ^5 C9 F9 y5 P" W: a0 i& g
- LDA #$80$ G a0 g% {2 h6 I7 j
- STA MAPPER_REG_PRG_RAM_PROTECT
7 l: ?0 q" \! F* v4 z+ k o3 s - .ENDM! N; Y. o1 \4 c( F% p# a; I% n" w, Q) j' L
- - U8 y* a% ^% j! Y3 j
- ;====================================================================================================
1 f# r8 O: D6 D5 h& e - MACRO_MAPPER_SOUND_CLEAR .MACRO
% r; d; k3 ^, x9 }4 E - .ENDM
" q" Z) {5 h1 Y/ D$ J1 s- Y -
1 C$ A7 j) O( i# M; d - ;====================================================================================================' ?3 c. z2 V$ p% u/ _
- MACRO_SRAM_ENABLE .MACRO( A3 E) o5 P" p; O- n# S
- LDA #$80! g6 u9 ]5 U' r% R
- STA MAPPER_REG_PRG_RAM_PROTECT! M# c2 K, f' s5 c
- .ENDM
) R' _& ?8 n1 M; R1 B" h - 5 l1 ?) b% c/ p ~
- ;====================================================================================================3 i* U6 J, ?. l" N( O
- MACRO_SWITCH_BANK_8000_A .MACRO- e* r0 s# U1 E; S
- PHA
8 w3 Y. O% ^" F/ n. t - LDA #$069 K8 k7 @% G* F
- STA MAPPER_REG_BANK_CTRL
/ d1 v" N" y7 Z1 K% \0 c) Z* ] - PLA( k% C. n% c# n
- STA MAPPER_REG_BANK_DATA7 E* E+ X3 J1 `5 v0 U
- .ENDM. V$ H. y& r$ x! ~. N/ i
5 F, [$ _; w" [- MACRO_SWITCH_BANK_A000_A .MACRO
& m4 W2 j) N! ?+ @ - PHA; p% X% m7 [) P; u0 R" F
- LDA #$073 k& w9 @: A/ t: u( C9 \4 ?
- STA MAPPER_REG_BANK_CTRL
, {0 h7 g0 i. C$ H - PLA
$ [/ |1 Q7 I1 C! n - STA MAPPER_REG_BANK_DATA# u& M7 v1 P. y% j' l- o
- .ENDM) U' r& E- v% @' T! \
-
9 x+ g; N/ @) W U - MACRO_SWITCH_BANK_C000_A .MACRO
' ^3 p$ k2 p ? - .ENDM
6 T: r- s1 Y8 V* Z% \4 u* ] - % r' @3 r3 M+ |( F/ }' D
- MACRO_SWITCH_BANK_E000_A .MACRO' N2 _/ E0 f% y q; X7 l, p
- .ENDM' e! a& c' p# _9 o5 f, V0 q
- 5 T7 ~! T( P8 e
- ;====================================================================================================
! i; @( K; N6 F- s - MACRO_TRIGGER_FIRST_IRQ .MACRO
! u5 j. K1 b" U - LDA #IRQ_SCANLINE_BEGIN + 1
& @7 k3 c- r6 D6 ?8 [0 W* b - STA MAPPER_REG_IRQ_LATCH
5 z* O$ f+ Y: x+ P6 T k - STA MAPPER_REG_IRQ_RELOAD! F7 p& Q+ v) Y" R3 k7 }
- STA MAPPER_REG_IRQ_ENABLE, D" T: J# ]8 T1 T2 @
- CLI& t4 y. H! j+ F. g) k
- .ENDM
4 \; ?; o; l3 u0 U. D+ S - $ H6 q+ o9 c+ I( N0 L* K
- ;==================================================================================================== Y! q g" n- P2 o+ i6 i
- MACRO_ENABLE_IRQ .MACRO( U' T$ [1 B1 Q! F9 C9 q o, G
- STA MAPPER_REG_IRQ_ENABLE) Z4 V* @" S1 y2 B. g0 A2 p
- .ENDM
5 i, S4 i+ Q7 A V- y% e - 5 T! H+ s3 E; F$ i7 n: P
- ;====================================================================================================
. K# E# \0 L. n5 P9 N' ^' I - MACRO_DISABLE_IRQ .MACRO
* Y3 H) [$ V' [+ ~ f - LDA #$00: }3 I/ I" a7 s) K/ v; d. C( ^
- STA MAPPER_REG_IRQ_CTRL/ }* K6 i. ~" Y
- STA MAPPER_REG_IRQ_ACK
4 R# S+ U9 N A! [- R, L/ D- z' X4 \ - .ENDM
# t; q4 o, d$ J1 u - ; q& [* _; M5 q4 ~9 r' L* E
- ;====================================================================================================$ Q5 q# r; Q7 D1 ?" F9 u/ Y
- MACRO_ACK_IRQ .MACRO
: N& W2 ?/ D+ s7 h - STA MAPPER_REG_IRQ_DISABLE: x% R2 f5 D& N; ~7 A; s4 G# e
- STA MAPPER_REG_IRQ_ENABLE
: n# C. Q F5 c% Z, w4 D - .ENDM* u# ~. H5 V1 _* E( u. ?
-
' z1 |' V! n8 V5 w" k* |! m. t - ;====================================================================================================
) }0 @' N& Z0 o; Q( f+ E0 } - MACRO_IRQ_OPERATE .MACRO* J! R: s& e- P' Q0 x
+ C; N* |3 [! c& X- ;==================================================
# z- M9 c; M- X& b, ^# o' T - ;IRQ滚动模式常量
$ j$ i9 Q6 l( r% ~0 G6 S, V, L - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动8 ^. c- F1 s; H V) V. _
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动3 F/ n1 U7 ?0 o1 `0 }1 w
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动! R' ]. b4 X- _ u7 ]+ D$ I: I- T) _
- 1 o0 N. }# P) L) C" Q' s/ P
- ;IRQ扫描线数据; y' r! c1 `3 b+ j a) A5 |0 a
- IRQ_Scanline_Data
3 A" X, G O/ M# c - .DB IRQ_SCANLINE_19 U9 M/ W' B" R/ N+ i9 Z
- .DB IRQ_SCANLINE_2
7 N/ \7 K, {, | - .DB IRQ_SCANLINE_3& f1 G% A( ?- f1 X9 u
- .DW 00 ;关闭IRQ
! w& e3 O5 T* j0 A' {/ t2 C9 c" E - $ O- @& G. Q$ q/ n
- ;IRQ滚动控制模式
0 G. H. G! K6 ^4 d - IRQ_Scanline_Mode
6 m9 \9 o& }: y6 r5 s - .DB IRQ_SCROLL_MODE_RIGHT
5 A& _+ ]( F i7 u2 v4 O2 R2 t6 i - .DB IRQ_SCROLL_MODE_LEFT" K8 M) T$ n1 `5 L
- .DB IRQ_SCROLL_MODE_RIGHT
/ X9 D I9 e3 Z* T - .DB IRQ_SCROLL_MODE_LEFT
4 \1 \$ k x3 [7 h; z! a - 8 @8 J4 w. X; u' [
- ;==================================================
! N' a* M% q1 E: A. w - ;;IRQ滚动控制: b- B) h4 e( P5 ]
- IRQ_Set_Scroll
& x0 z5 ? J9 ]0 \0 V! F0 n - LDX IRQ_Process_Index
6 n I8 Q, A* H4 U, G7 \/ i1 v - LDA IRQ_Scanline_Mode,X
+ x, c# e7 @' W1 C- W - CMP #IRQ_SCROLL_MODE_LEFT
+ N: j8 U4 K& C1 r: q* F - BEQ IRQ_Set_Scroll_Left+ Z- Q4 ~8 O# j1 ~. x* l
- CMP #IRQ_SCROLL_MODE_RIGHT" V! i$ S, T1 T8 ^" G- H
- BEQ IRQ_Set_Scroll_Right) t* B5 W, |3 d, k
- IRQ_Set_Scroll_Zero;不滚动4 V, g4 G/ m& v! D+ ?/ r( T
- LDA #$00
- u9 ]9 E# G' C, F! C - STA PPU_SCROLL$ ?1 f) E7 ^3 d5 ~6 ~0 {
- STA PPU_SCROLL7 h' [' t$ `- r+ l
- RTS
6 U/ K+ Y0 u [% _9 c- ^% z0 @( R - IRQ_Set_Scroll_Left;向左滚动8 A1 O3 C9 f0 O. u! `
- LDA Scroll_H- ^* K1 G; C( Q# `% k5 ^
- STA PPU_SCROLL i( W; s/ B% }7 _
- STA PPU_SCROLL
. L0 N7 }& q6 x- P. G - RTS
) h! a. ~6 Q3 V" |* e, ]# A9 | - IRQ_Set_Scroll_Right;向右滚动
# r- o+ S# p4 y1 d: H& U - LDA #$00
- x# w) @# x- m- B8 F0 { - SEC2 C5 j( j5 e" R- }
- SBC Scroll_H4 y0 N: c: i# _+ P, S! r6 W- `7 e7 j
- STA PPU_SCROLL, p0 ?# S* y, A1 ?3 N- N% j
- STA PPU_SCROLL& P3 O% v, W; m
- RTS" T4 n8 e& s% J" y. K' d
-
# S& `9 t% x2 C: p - ;==================================================" B2 l1 }( @5 S, _) I
- ;;IRQ滚动控制
& H7 `; C- x Z7 P o - IRQ_Set_Ctrl
) }5 D' w# k* K, I; \# S - LDX IRQ_Process_Index
( }7 Z& l- a9 q$ T* T# J) O& Z; d - LDA IRQ_Scanline_Data,X8 U9 x6 M! v3 N+ K4 f
- BNE IRQ_Process_Latch$ H0 Z) L' x) q# \
- IRQ_Process_Disable;禁用IRQ' v- R) O1 } P/ \: }1 B
- STA MAPPER_REG_IRQ_DISABLE
% g8 t$ ?7 f/ }4 v2 L* V$ r - STA IRQ_Process_Index
# m- M3 K6 f- |2 r. N - RTS
" y+ v9 h7 g8 X9 l: F+ Q- `5 Z6 ^, |- _9 q - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
) q5 M/ t" P" I6 g% ]9 m - STA MAPPER_REG_IRQ_LATCH
$ Z- w$ o" s* j) p - INC IRQ_Process_Index
; ?9 }8 e; P$ ^2 G" d' \ - RTS& ?# H' Q" f" e4 d
- $ A- t. d+ N" S2 n# {$ ?1 A
- ;==================================================. i& [2 X. p" @2 ^* D
- ;IRQ处理
5 n1 E+ g. D7 B2 n+ y2 `% W" h - IRQ_Process_By_Index8 k- f1 b1 T% S$ z
- JSR IRQ_Set_Scroll
; C7 E8 ~; ^6 I7 C: F9 J7 o: o - JSR IRQ_Set_Ctrl" k1 x+ }1 c$ A$ J8 ?2 j2 k u5 \
- IRQ_Process_End
1 x/ f! N+ j9 f5 E - RTS: K+ g, s2 n ~/ C! \5 M# h. q2 }' Q* N
- % {% ?2 N4 y; U! G
- .ENDM
S4 O! W o9 w; a+ V/ {' e m* V -
; U s) ^; C, q
复制代码
0 o2 j+ N5 ^' k& ]" g1 S- t9 r$ E+ e/ E" `. e
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|