|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
3 A0 z( K9 q- S
# o( L3 J7 Z+ O' O# p+ A本次IRQ研究了如下:
0 P) k! W7 x! KVRC2&4(Mapper21,23,25)
! u+ _5 x, \) e: LVRC3(Mapper73)
; V) B1 f6 v# u& c% [" ]VRC6(Mapper24 & Mapper26)
- e b" \; L2 X: m% VVRC7(Mapper85)5 N7 `% h! n! M' f7 d f. \$ s. B0 ?
MMC3(Mapper4)
0 Y% P' w$ `& Z2 V( L- g" rMMC4(Mapper10)+ _( ~$ L: ~) w# W _; O9 `
MMC5(Mapper5)
+ x8 q! T! V+ p& h2 jMapper18+ A' O0 {3 O" d
Mapper64
1 V+ f' n, R5 a% N9 N5 m8 C8 o; jNamco163(Mapper19)
" v% G8 k$ j! WSunsoft FME-7(Mapper69)+ G" P( V5 N. {" m0 \" ]; M- D
/ i* V* ?$ A5 T; g- J
共计11种Mapper的IRQ操作使用例子
% ]6 d' s: y& v* R) H! M代码内有详细注释, 希望能帮助到感兴趣的人. w3 D0 ?0 r* K
1 l% Y2 h2 A/ C% [3 C  2 p2 }) Q6 G3 e) ], P! v" I
! P3 E3 V# w# u* _+ ]% W3 eMapper代码主要逻辑(以MMC3为例):9 @& c( J: A8 w/ R2 @
- % \9 j, w7 I. X" k' e. o+ n
- ;==================================================
( j) } |3 |& Y8 A - ;Mapper号
6 T- V/ L4 U+ [9 N' i n! g - MAPPER_NUMBER = 04
8 n0 `" \# B7 k0 F - ;==================================================2 C0 t0 c6 n& N+ x$ I M: i
- ;MMC3 (Mapper 4) 寄存器常量
7 |' n+ a3 e8 q - MAPPER_REG_BANK_CTRL = $80007 c& p6 H' Q, R0 a3 I# R1 q
- MAPPER_REG_BANK_DATA = $80018 V+ _" ?) w, _6 P9 u9 T9 C: S
- MAPPER_REG_MIRRORING = $A000/ ]) `7 e' e4 I5 y9 `5 V! d; v$ q
- MAPPER_REG_PRG_RAM_PROTECT = $A001+ ~' A% Z+ P2 R0 L; Y
- MAPPER_REG_IRQ_LATCH = $C000! {5 H$ d; w4 e: W/ v5 ~
- MAPPER_REG_IRQ_RELOAD = $C001
' o- C+ z' k$ q0 o( b2 ` - MAPPER_REG_IRQ_DISABLE = $E000
@: o) W0 b' u - MAPPER_REG_IRQ_ENABLE = $E001/ R! S, b0 Q& F
- ;==================================================/ l" _! g5 |9 F+ `8 j
- IRQ_SCANLINE_BEGIN = 135
' x+ l6 l" D* v9 C1 Q* q# ^ - IRQ_SCANLINE_1 = 8/ v' {8 ]# V. Q! S, M: V8 Q
- IRQ_SCANLINE_2 = 54% \" G& Y1 m1 M
- IRQ_SCANLINE_3 = 8) f3 e. Q5 R! |' x
- ;==================================================
' k) S9 c# ]! ?% a* J# r' G
9 A4 N4 Z7 C, Z' {- I5 A( X& i/ s8 x- ;====================================================================================================- O" n! w& C6 Y3 ?+ C# F1 T
- ;宏常量
# d: A+ z5 B. f; G) k - ;====================================================================================================
! n/ H$ I5 ]. t, g K) e - 2 H5 @, s$ y2 J
- ;====================================================================================================
$ f9 X, E" |' h$ C0 \1 y# w# v - MACRO_MAPPER_INIT .MACRO) D5 Y) _ q9 x8 P* b+ z ?# J
- ;禁用IRQ8 Z; ^) W$ r# {. W6 u/ e% ?! v+ c
- STA MAPPER_REG_IRQ_DISABLE
: \5 }) j8 H* E8 r0 s! J r - ' I: h4 z. S1 `' I' ^, M5 [
- ;水平镜像9 Q; ^: n. H4 A
- LDA #$01
' F9 P2 Y! D6 P+ L% p - STA MAPPER_REG_MIRRORING1 ^: G" U% H1 S2 n
-
! `9 C; B& N5 }" r - ;初始化图形bank! C) [6 _1 Y0 W' f; C% j1 K2 u
- LDX #$05, p/ p& W, t+ N+ a/ r) w
- .Init_Chr_Bank
O* `3 t# g' d" ~% ^4 _, N - STX MAPPER_REG_BANK_CTRL$ ]0 ^# R+ {. R
- LDA .ChrBankData,X3 \ b/ n _9 c, H+ M- p: K8 L2 Z/ K
- STA MAPPER_REG_BANK_DATA8 V9 g3 b2 r- v5 C8 F; ?
- DEX0 o( b& u/ Y% H3 i3 V$ n9 w
- BPL .Init_Chr_Bank
! h$ J$ y2 g b0 M7 m% n - JMP .Init_Chr_Bank_End
4 z7 o( Q1 h9 u: ~. d% o# B4 C6 U! N - .ChrBankData+ L- Z; ~6 _* O8 f: o9 y; X
- .DB $00,$02,$04,$05,$06,$070 R1 H5 _% s: \) ?. }& [
- .Init_Chr_Bank_End
$ D" v% i9 [% j0 ^: l - & y$ d2 @ Q/ s. A% @" F& z. a
- ;启用SRAM
: D X0 v: P9 a% L! F% @8 s - LDA #$806 b* t7 ]; f9 M* F' ? h
- STA MAPPER_REG_PRG_RAM_PROTECT
% S6 w8 r: \6 w2 ~1 {: G( ] - .ENDM
) Z$ r$ S2 ]" X# ` - % Q k" ]; e8 m$ I' m
- ;====================================================================================================
0 ]/ v. o1 W( X - MACRO_MAPPER_SOUND_CLEAR .MACRO/ L5 G0 ?# `) p( T
- .ENDM
; c5 K/ X7 V/ G% z -
* @: i7 O+ }+ o+ W: H9 m( T - ;====================================================================================================
; h5 g) C6 e. Z. g3 `% V - MACRO_SRAM_ENABLE .MACRO
) {2 z/ r; M0 E( ]7 X d - LDA #$80
: c- l6 y* C- \0 w. W; d$ Y - STA MAPPER_REG_PRG_RAM_PROTECT
" p* S5 H& Y+ _ V+ W6 F - .ENDM) p0 @/ C7 I2 }/ I! Q. S6 l/ v4 D
-
6 @# L' Y8 W# _3 j7 X& M - ;====================================================================================================# z9 ~% [5 v/ H" X: Z
- MACRO_SWITCH_BANK_8000_A .MACRO
& X% j% J$ f& f( h: P - PHA
1 y$ ?$ h) D- s8 `) c! b7 p - LDA #$06
; z' |: c7 u' n4 [4 V/ B0 ] - STA MAPPER_REG_BANK_CTRL
K+ ~' r. c; c5 f' @. i! J0 u - PLA0 F' |7 h; F. V" } [
- STA MAPPER_REG_BANK_DATA
) P* _+ |$ v" J( m# f) @& B - .ENDM. K3 |5 n' ~: E& b' z
- & a- g/ e7 ^0 R* ^
- MACRO_SWITCH_BANK_A000_A .MACRO, y4 B8 Z. U; z7 j
- PHA
P8 R* j& H* M, Y - LDA #$07
* O; F. T+ M! V - STA MAPPER_REG_BANK_CTRL
+ M7 z( W1 h# h) t* ?3 ^, O - PLA
' N) M0 }% Z9 v& o6 i8 H - STA MAPPER_REG_BANK_DATA
( v% o6 c0 f: S. t, |$ e) O - .ENDM' N! q+ w- m/ B' l$ P
-
. Z1 d. W9 I) P5 {' D - MACRO_SWITCH_BANK_C000_A .MACRO
7 ~& N+ i, U' S' z! E3 T) D# g5 N - .ENDM$ I- a, N# m4 ~- E9 g: J9 z
5 D1 R& o; g s' Z3 G- MACRO_SWITCH_BANK_E000_A .MACRO# X3 w1 t& ~$ Y- |# U
- .ENDM6 s6 {9 x! x1 w/ Y' u7 M
e) R7 [0 Q8 C; l' e; o" n- ?- ;====================================================================================================
9 U( u7 u; G! w& W! O - MACRO_TRIGGER_FIRST_IRQ .MACRO
- z. T" v4 R6 {1 ^( w9 }' {, Z6 d - LDA #IRQ_SCANLINE_BEGIN + 14 n+ X' O9 b1 P6 g2 b2 B
- STA MAPPER_REG_IRQ_LATCH+ ?# O k d( N5 i
- STA MAPPER_REG_IRQ_RELOAD
, f% w0 X6 _: Z0 ]: K - STA MAPPER_REG_IRQ_ENABLE$ m4 T, t/ N8 }: L9 d( G7 n
- CLI1 J5 \0 }1 r! y# Y
- .ENDM* L1 ]* R+ U+ F: y& i" v+ U& j8 w* q
- # S* _8 {' Z, L9 j* T0 R3 i N
- ;====================================================================================================
# [$ V' R7 h# J6 O, e - MACRO_ENABLE_IRQ .MACRO' Y0 _6 y, F! A- w% k
- STA MAPPER_REG_IRQ_ENABLE
' q; |' v; R2 p2 U# ?/ l6 z - .ENDM
; ^" m ~8 R5 ^ - 1 Y' X5 o: U$ u+ a0 j+ U: i4 l& H; U
- ;====================================================================================================
* O7 G) @/ E0 D+ |* x. K - MACRO_DISABLE_IRQ .MACRO
# J3 S1 \' |7 Y$ \+ o" Q9 t - LDA #$00; z! c3 i& ^" ?3 _/ f
- STA MAPPER_REG_IRQ_CTRL
/ c! u- Z0 B4 b0 B+ c# y' s" K - STA MAPPER_REG_IRQ_ACK0 `/ H7 Q: @1 J# S7 g/ m p/ F
- .ENDM
6 A8 j0 g! }# z" d! C5 g ~ - ' B( M& K7 s( i1 T8 G* t1 g1 j
- ;====================================================================================================& {# G/ B! w+ J0 y9 J9 K5 l
- MACRO_ACK_IRQ .MACRO
- g/ J5 b, k0 e$ q8 F* d1 Q- i4 [ - STA MAPPER_REG_IRQ_DISABLE
9 |2 F9 J9 v; K' d L! Z s4 t - STA MAPPER_REG_IRQ_ENABLE
) ^' A, y8 u: {4 l3 t# }" _* D - .ENDM
. X6 j7 O( Y7 f- ~7 B8 X7 P1 Z - " y( `8 N+ ]$ Y- u7 b4 m+ |6 h
- ;====================================================================================================
C( D( V& M! f V ~5 ~ - MACRO_IRQ_OPERATE .MACRO# v& u" K" K3 M, i: o+ {3 e) S
. }+ n9 g; ?2 t, d: X- ;==================================================. C- S) ^# K& a$ d0 a* q
- ;IRQ滚动模式常量
# n; }6 z1 H8 }4 x - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
6 k; U& T$ w: x' Y: S& N - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
2 R& K1 k: N) `+ @/ x9 t/ B7 M - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
8 R m0 K. q9 W1 k& ` - 7 A7 }# C/ Y8 V9 \ C2 w
- ;IRQ扫描线数据
$ @6 { N& J" Z2 l% k* I+ u3 v) ]& c - IRQ_Scanline_Data! S/ U+ P' k! j/ I4 Q9 U5 E) `
- .DB IRQ_SCANLINE_15 }' b l% E: y& V" Q6 P
- .DB IRQ_SCANLINE_2! i7 X: \! s$ y5 A V/ N( p
- .DB IRQ_SCANLINE_3
$ j e! @$ f" u+ z2 i1 c: G Z9 l - .DW 00 ;关闭IRQ
5 E8 y- J9 G0 l j, T7 o: v
0 P) B% x; A! H x O5 ]$ B4 h- ;IRQ滚动控制模式' D* ?" Y( d+ X0 b$ I( ]- w! C) V
- IRQ_Scanline_Mode9 i, Y& X0 }! J( l5 K2 q! }# y
- .DB IRQ_SCROLL_MODE_RIGHT0 H9 R5 p0 B/ T- U0 V5 {
- .DB IRQ_SCROLL_MODE_LEFT
; O c2 ~' }% u& P - .DB IRQ_SCROLL_MODE_RIGHT
5 T) u) e: M2 J+ P - .DB IRQ_SCROLL_MODE_LEFT
. }% M5 Z# Z" C( Y$ n
& m( z1 o7 m2 k) m6 |! [1 V$ h- ;==================================================
) V: P* L( i. C - ;;IRQ滚动控制" S: a, u0 O6 X4 s
- IRQ_Set_Scroll* z- c% t) H$ T
- LDX IRQ_Process_Index( f6 {8 z1 i+ J& E5 {
- LDA IRQ_Scanline_Mode,X
# \3 h6 P( Z C+ g - CMP #IRQ_SCROLL_MODE_LEFT$ `' \* g; V4 Y |; m
- BEQ IRQ_Set_Scroll_Left
[, r( e: X6 `( z k2 q e$ I - CMP #IRQ_SCROLL_MODE_RIGHT' s6 s' R0 {+ u; @' k% p9 v9 b
- BEQ IRQ_Set_Scroll_Right, G9 J+ Y! Z }# Y7 t' J
- IRQ_Set_Scroll_Zero;不滚动 o1 U$ P2 ` ^. ]. {% ^' X- l
- LDA #$00
' u! C4 i y9 C, G - STA PPU_SCROLL
) Q1 g" `3 f0 J2 f n6 w - STA PPU_SCROLL
G- q3 E. C/ G7 K - RTS
z% O% ]& a0 B* _/ `5 |7 _) ]3 M+ f - IRQ_Set_Scroll_Left;向左滚动
' _0 P1 M; a6 {* i+ J3 q& D - LDA Scroll_H' i* L5 C- x3 P: T" B4 L
- STA PPU_SCROLL
4 Q3 j4 V& }4 O+ l0 C! w4 q+ d - STA PPU_SCROLL
: b7 y) A9 X7 Q9 l( ]6 U - RTS5 J" _5 f) l$ _ o2 v
- IRQ_Set_Scroll_Right;向右滚动& G1 J( c$ X- q$ ^( z
- LDA #$00) ^1 H _) F3 y5 c# R( a9 H
- SEC
* t7 K/ S0 W- k& O6 W( V x - SBC Scroll_H
. o7 r. d# t6 e# M5 Z - STA PPU_SCROLL& M& t+ e% W9 \# [* X$ V k6 r* L) }
- STA PPU_SCROLL
% _" o. Q1 n: P2 T - RTS- u$ x% Q) z. F) f+ S
- + J1 g+ Y' W6 i4 ]
- ;==================================================
( w; s# |# e3 C. A* [4 k - ;;IRQ滚动控制2 G3 ~ v& `6 R4 Q) @
- IRQ_Set_Ctrl
7 ]! K" P( C1 {) E) u e1 s/ e - LDX IRQ_Process_Index
9 d' {+ Z2 c1 ?6 C. I8 @ - LDA IRQ_Scanline_Data,X- ^; W+ m) W w* v
- BNE IRQ_Process_Latch( U& x' U1 @4 U" b8 x
- IRQ_Process_Disable;禁用IRQ* |: Y' O4 }1 d& E/ o! J
- STA MAPPER_REG_IRQ_DISABLE5 d9 c7 f4 G) k- Q1 ^0 a9 u
- STA IRQ_Process_Index7 v2 h+ I0 l. @" l
- RTS
( v8 g( R0 P0 `0 O2 |# x- e - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
& X- m9 n# l0 p6 h4 F2 y$ E5 } - STA MAPPER_REG_IRQ_LATCH$ e1 {1 g% n* K; ]' ^
- INC IRQ_Process_Index7 Q" s x" b1 g7 |
- RTS- m: D4 d% Q' |& g3 a9 o; r
- ( `7 F( @) v& g) O+ ?& t$ b5 D
- ;==================================================
; P2 U+ L7 G, M7 C( ]+ ` - ;IRQ处理; P' [+ {- O' Q$ A( m g7 H4 o5 M
- IRQ_Process_By_Index
7 a5 W5 R S" h8 m, w7 o% @, r - JSR IRQ_Set_Scroll
5 R% {: Y6 [3 J% h& F: @3 m3 e - JSR IRQ_Set_Ctrl8 `3 J1 a; B8 {- c" @
- IRQ_Process_End# y, U3 \: P9 ?0 D$ B& U2 o
- RTS$ K, i4 D* j' i* _$ k. y' I
-
f2 V4 h. s4 i `% X - .ENDM T( N7 ]# |; K4 y
-
]4 F+ R& H7 Y" w: D
复制代码
( L* P1 T" `# N5 \
' l" R Q: ~) V0 S" d代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|