|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 {$ J4 E: p; P6 ]1 u
+ }2 ~+ V9 G3 {2 e3 g6 {7 R6 P本次IRQ研究了如下:
u) R; d0 `3 A5 w; }" W- IVRC2&4(Mapper21,23,25)
' |: O0 m( o0 B- b, M6 c- g2 JVRC3(Mapper73)
7 P5 J; @' K/ |VRC6(Mapper24 & Mapper26)
% H% Y C" ]' [3 |VRC7(Mapper85)+ r3 t# N. g+ j5 B. H' d/ K
MMC3(Mapper4)/ T/ O8 R) I4 T4 A) E# o
MMC4(Mapper10)+ J% v% y! y% z
MMC5(Mapper5): C2 \0 [5 y( r% _
Mapper18
* L# S4 I/ g, |9 aMapper64
+ F/ D4 K9 p% f; Y; x: `: zNamco163(Mapper19)& G. x& J t+ A7 g
Sunsoft FME-7(Mapper69)
" M' b5 b/ T" ~$ B j' | U; p' t* r' e" I2 w J% I" r
共计11种Mapper的IRQ操作使用例子# \6 U& h; a9 S
代码内有详细注释, 希望能帮助到感兴趣的人.6 f" Z, n; m. x- S4 W
v% C% O6 k0 ]: r: C. z; |1 @7 }% A r2 b, }: Z$ ~, U8 V
, K) i3 r8 I! K q. q! x4 ]* c; e' Q nMapper代码主要逻辑(以MMC3为例):# [$ I, |) Z6 G
- 0 H1 p8 p5 S( P+ B& [; B* T# J
- ;==================================================! L5 |9 z. l, s- Z! a* u }- |
- ;Mapper号" U3 W: i% @# I* o
- MAPPER_NUMBER = 04
/ [# [# p; w* X. X* _# J) u" A - ;==================================================+ N; `! d9 b! Y, a
- ;MMC3 (Mapper 4) 寄存器常量* X0 o1 R# @, k) N: h& }
- MAPPER_REG_BANK_CTRL = $8000
4 O( Y0 n% m, \1 d& T - MAPPER_REG_BANK_DATA = $8001, X( \* _ c+ _+ E# _
- MAPPER_REG_MIRRORING = $A0001 }! I8 I: e& `- K- x
- MAPPER_REG_PRG_RAM_PROTECT = $A0015 Y t" z8 W& B0 j1 i/ O. b
- MAPPER_REG_IRQ_LATCH = $C000! P* z+ A$ F( Z6 ?, ^( ^
- MAPPER_REG_IRQ_RELOAD = $C0018 n5 w0 M& g. E3 I; A. C
- MAPPER_REG_IRQ_DISABLE = $E000+ P" G! w' g7 v8 W7 R5 G4 P
- MAPPER_REG_IRQ_ENABLE = $E0017 o/ g% Y4 B# {+ R+ M/ `% B
- ;==================================================5 j7 g5 t7 P* h# T: n1 L+ {/ R
- IRQ_SCANLINE_BEGIN = 135
8 T" d" v( q9 G" j' @+ e - IRQ_SCANLINE_1 = 89 Y9 s" C0 E- }. I
- IRQ_SCANLINE_2 = 54# x+ R% h1 Y' Z
- IRQ_SCANLINE_3 = 8) { B5 @* H7 \; ?
- ;==================================================
9 Y; y ?0 y |. j+ i& v
Q" |- Y: ~$ O! |- ;====================================================================================================8 Q! F9 A6 ^' r2 p5 {6 `/ S
- ;宏常量7 ^" J* K- X6 S1 }
- ;====================================================================================================
+ ?6 t) @# Q/ r. l# }. c! e- C
$ T2 Y: V+ x' l1 F6 h- ;====================================================================================================
* r$ E( F. v6 ]2 p0 x" Q - MACRO_MAPPER_INIT .MACRO
. Y! h5 K, H. k - ;禁用IRQ, p0 e" K2 U; J1 M2 p0 ]9 r9 ^
- STA MAPPER_REG_IRQ_DISABLE9 a# d2 C n5 R; j: r
-
: e7 x% {. U0 u/ y2 t" k! s - ;水平镜像: F8 u! v a% m! j5 ]
- LDA #$01( O$ i; _8 i5 G9 O2 ^# ^
- STA MAPPER_REG_MIRRORING
; \% q5 U4 X. U' d6 ]# c7 A R -
S1 v. d) m" \0 S* u - ;初始化图形bank
9 x* {4 W! }0 H7 l - LDX #$05
# ^; n6 ]/ U/ O+ }5 m! C6 x - .Init_Chr_Bank6 {" s+ k" E) n9 i
- STX MAPPER_REG_BANK_CTRL5 {5 O( G5 W* J# W n
- LDA .ChrBankData,X+ C3 B0 N8 N1 a3 S# _" ^
- STA MAPPER_REG_BANK_DATA
& I( @. \ k* ]9 q3 \ - DEX
1 O' s- M3 Y' e7 m6 ] - BPL .Init_Chr_Bank
) Z+ Q! U+ L \2 [ - JMP .Init_Chr_Bank_End
9 e& J0 x9 X( ^" z - .ChrBankData. i+ n! r+ E$ C- r! m+ S) ]
- .DB $00,$02,$04,$05,$06,$07* J% d3 h5 o9 f# ^4 X
- .Init_Chr_Bank_End1 [$ i0 M1 ^$ H3 J# J/ J# ]" k
-
1 U" z8 w9 A& O6 _( E6 o - ;启用SRAM: F" |1 v2 Z7 y& i: _$ C
- LDA #$80
7 p6 f& Q( s: `1 o! _ - STA MAPPER_REG_PRG_RAM_PROTECT) a# W, P8 M9 t) m) W! V
- .ENDM
8 ^( Y! k3 ^" k - 9 e' i1 _$ g7 a6 ^% v( [
- ;====================================================================================================
! Y% u1 z9 I- u - MACRO_MAPPER_SOUND_CLEAR .MACRO
$ A9 N; U" Q6 s2 y: `, H+ Y - .ENDM% `1 L3 M: X+ W9 n8 _
-
2 Z0 b6 G: S, p& H6 C2 b - ;====================================================================================================
) m: }0 l) R- D# _$ K - MACRO_SRAM_ENABLE .MACRO* _: W; _7 P7 o) a% s+ I/ D. u
- LDA #$80
$ V& y) s3 B4 a4 X. T W - STA MAPPER_REG_PRG_RAM_PROTECT
9 f5 V }- }. Z l i" n - .ENDM) ?8 x& u7 ~ l8 t
- 9 k7 q7 q6 W. t& ]
- ;====================================================================================================
( p1 ^8 g0 d4 W) n; q - MACRO_SWITCH_BANK_8000_A .MACRO! j# g, [8 w9 l' h+ }/ e" {1 b& y
- PHA4 U$ V, ^. a$ F" G9 R# n$ N7 p! t
- LDA #$06
# m1 a. ?/ @6 a$ _' P+ k - STA MAPPER_REG_BANK_CTRL" c0 v2 t3 e4 }9 H5 T5 `2 b
- PLA
% q4 E9 _7 o3 i, r- Q+ s - STA MAPPER_REG_BANK_DATA( d% x% F& q( \/ a
- .ENDM
/ Q' B1 o& J# y - $ z% H: h6 |1 M/ J& X2 D4 n
- MACRO_SWITCH_BANK_A000_A .MACRO2 [* \! c/ w6 }9 h/ G6 ^
- PHA8 d9 J! J. O5 {
- LDA #$07* D( ?) I' `, M2 }8 t& z! D
- STA MAPPER_REG_BANK_CTRL
& a2 j3 j0 [" @* u6 H3 R9 {& X1 { - PLA! P5 X/ [+ q/ x" |; O7 ^
- STA MAPPER_REG_BANK_DATA
3 a: P/ P7 S6 h3 U w - .ENDM
. e# B8 ]; `$ N7 s1 m - , x, J& d- P- ~# ^/ _# M
- MACRO_SWITCH_BANK_C000_A .MACRO7 X+ |) h0 e/ p- L, w
- .ENDM
& _" [3 }0 z; J, S8 O5 P" L
9 F/ D( Q5 t- g$ W- G9 [9 M% R- MACRO_SWITCH_BANK_E000_A .MACRO7 w+ C2 g4 a4 f' ?- |7 m! ?* p
- .ENDM
/ _ K$ L- s2 I# S - 0 N+ I4 c, ]# q' |! U7 K% Q: i+ B
- ;====================================================================================================
; F1 _6 Q' m; G) C/ \4 W2 } - MACRO_TRIGGER_FIRST_IRQ .MACRO( y/ d7 r1 Y& x4 \9 j# L. d
- LDA #IRQ_SCANLINE_BEGIN + 1
0 F0 X' h' T/ H5 Y4 c3 L - STA MAPPER_REG_IRQ_LATCH
& }) k/ o+ r2 s' ~# n) f - STA MAPPER_REG_IRQ_RELOAD
5 R4 X( f4 m5 S4 c$ H! m0 M* p - STA MAPPER_REG_IRQ_ENABLE
0 ]3 J" @4 G, Z! ?% p - CLI. @5 j }- a* S ? O2 w# l" Q7 n
- .ENDM
" v/ J8 w2 I; X$ o! r' Y; J+ V -
, Q. v) Y1 C( Z7 s7 C - ;==================================================================================================== n6 A+ I; V& d2 R! V
- MACRO_ENABLE_IRQ .MACRO1 K* M# u4 l6 k& t, Q
- STA MAPPER_REG_IRQ_ENABLE
8 G7 Z/ i3 U0 z y% [/ G/ Q - .ENDM
; v2 P H& b3 Q5 Y3 L - + I) K4 s4 u4 G0 d6 @7 H2 C
- ;====================================================================================================
0 H. k6 Y- w/ J- Q) {/ q - MACRO_DISABLE_IRQ .MACRO
1 u |* y* T8 b$ h3 l9 A9 y j - LDA #$00: r% {- M2 R/ o- D k0 w- [* W8 f
- STA MAPPER_REG_IRQ_CTRL" J U" Y8 F7 `$ O; }& e( ~" \! w
- STA MAPPER_REG_IRQ_ACK
6 |- {6 h# O# z5 J* i - .ENDM# k6 U0 d. A; y$ K- ?, \
- + c2 \! Q/ e3 r) N9 T
- ;====================================================================================================2 d3 m% ~# x7 j. K8 T) j% w
- MACRO_ACK_IRQ .MACRO( d J3 W( r. M, S
- STA MAPPER_REG_IRQ_DISABLE. V8 f5 t! S, |8 w
- STA MAPPER_REG_IRQ_ENABLE
) p" N$ v p' A4 B( X- W - .ENDM
+ `6 ~/ T& t2 G, n6 o -
0 c# I6 r4 P) R# } a* u4 A - ;====================================================================================================- M6 W7 D% k+ b5 m- O7 D2 @
- MACRO_IRQ_OPERATE .MACRO
# r7 Y# g, ~4 i0 r( f* N1 l
7 `( [! L+ T0 G( f3 ?- ;==================================================
6 X" ^# j" ?/ M! Z! C7 k9 _. s - ;IRQ滚动模式常量
* N/ D2 m' ]! q$ N8 |5 G/ x: e - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
9 ^! Z- H0 z, a6 w! N' x - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动) X8 C% F6 I, M, F5 x0 u
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动$ B& r& K2 Z1 `
4 t" C y8 ~% h. W8 F- ;IRQ扫描线数据
! S' L# \9 O- m. k# ` - IRQ_Scanline_Data
) z4 E" M' B- z+ i$ k: b - .DB IRQ_SCANLINE_1
* t) X, X& q* C( @: [* L! ~* a1 u - .DB IRQ_SCANLINE_2, W- A9 P; p) F6 o( i. Z
- .DB IRQ_SCANLINE_3# P$ o# y7 J) t5 Y- z: X
- .DW 00 ;关闭IRQ5 C) D& e5 H; K
6 @7 \1 w# Q1 e1 v2 A# I1 X/ K6 C- ;IRQ滚动控制模式3 P. U( W" | Q4 z$ G5 G c
- IRQ_Scanline_Mode
3 M5 O& d* e. j3 M, L+ @ - .DB IRQ_SCROLL_MODE_RIGHT0 a/ P# E2 N& W" {1 `$ F5 o
- .DB IRQ_SCROLL_MODE_LEFT) C# Q9 w+ ?, _$ a% {+ t' U2 J
- .DB IRQ_SCROLL_MODE_RIGHT) ?: Z1 M2 z8 v* S
- .DB IRQ_SCROLL_MODE_LEFT" C- Z6 }# X" _% v. T. X0 f# N- d
- 9 v- {: b' o( J5 f) N8 U
- ;==================================================: L( V& k; b: D% @# j
- ;;IRQ滚动控制- ~! u6 L3 L8 X
- IRQ_Set_Scroll
$ _& f- W( A6 ^4 d' s - LDX IRQ_Process_Index7 Z( ?* _5 o! T0 w/ }
- LDA IRQ_Scanline_Mode,X
* b5 a8 K% W" U! M7 ~3 { D - CMP #IRQ_SCROLL_MODE_LEFT
$ i6 B9 X6 ^$ j) v - BEQ IRQ_Set_Scroll_Left: F* f" F1 _- n5 [$ u& S6 }+ C
- CMP #IRQ_SCROLL_MODE_RIGHT2 w% r+ G% b+ {. \: }1 G
- BEQ IRQ_Set_Scroll_Right5 Z' l7 X Y2 w4 R/ v& r
- IRQ_Set_Scroll_Zero;不滚动
: I7 L% v' e3 Z' F! o+ h7 s - LDA #$00- T! L% Z5 A' u8 `( }' ^( j9 t
- STA PPU_SCROLL4 B8 t; R# m& H( M
- STA PPU_SCROLL
$ v A! _4 Z# U7 C4 y' G' `3 M - RTS
' E& [ `$ j# G' W - IRQ_Set_Scroll_Left;向左滚动
) P. e( j- Q6 Z9 M ~! l& s - LDA Scroll_H
4 l9 T ~3 g0 v4 b - STA PPU_SCROLL
: X. c# I! l- A - STA PPU_SCROLL
, Q; C9 j1 Z* v2 G( n4 h: A - RTS7 g* A! V0 i3 {7 F* \
- IRQ_Set_Scroll_Right;向右滚动
* G* q2 q0 I8 M g" D - LDA #$007 z0 ?' c1 N. B* L2 w
- SEC
1 F: @/ W0 u5 U( I8 y+ n5 @ - SBC Scroll_H
/ S6 Q) r- Q b: C/ i0 }' ~ - STA PPU_SCROLL$ ^# s! T. z6 J0 o. B: D
- STA PPU_SCROLL& W. y8 f. ~6 a' w- a
- RTS
7 _& j1 I& c$ o6 f -
7 @+ o. R: ]7 v3 q3 d2 r - ;==================================================
4 e5 k6 N! C; q" i( y - ;;IRQ滚动控制/ d8 K: K- M$ M$ P
- IRQ_Set_Ctrl
9 h4 c- W; d3 E8 ?" D - LDX IRQ_Process_Index
. W1 e& g# W- }* G - LDA IRQ_Scanline_Data,X
7 o; Y5 x, q I0 m s, h Q4 R - BNE IRQ_Process_Latch
$ n3 S4 B0 f7 |$ |! Q' E9 L - IRQ_Process_Disable;禁用IRQ0 S* V- @8 U# {
- STA MAPPER_REG_IRQ_DISABLE
1 K) \& \6 v; ~' J& A - STA IRQ_Process_Index
$ N! t1 E5 B0 V' q9 u - RTS$ |/ }( f! H5 E' c
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
# @3 \. k. O n! i7 M6 G6 M, I - STA MAPPER_REG_IRQ_LATCH7 \$ h7 c8 F: O. o+ o D
- INC IRQ_Process_Index- _% F/ P" Q0 O* x; Y; N, E
- RTS
/ E0 ?- } h# S) @ - " Y ? y0 J: u. C
- ;==================================================
; a. J# u, a! r/ c - ;IRQ处理
. ^3 c/ [2 i' y. B - IRQ_Process_By_Index
- ~, ~8 U }- a) g - JSR IRQ_Set_Scroll0 k* T9 q/ y& j. Q/ N3 N4 h6 w
- JSR IRQ_Set_Ctrl
; j3 V+ }9 K1 |5 U& i3 V+ I - IRQ_Process_End
, p2 S# f) L0 b8 A - RTS" \$ P; z& r& G; R$ ^
-
) f" l3 I% `; k1 I3 |& k - .ENDM! u) A- n. i" L0 Y
-
' Q. o- H3 {/ c! w. C U
复制代码
+ C A w( R: J, |: C/ z+ K, Q" r2 h0 P4 A: b
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|