|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
+ G2 l! a9 _7 K) f$ h
1 G3 s5 @: V6 K" ^本次IRQ研究了如下:
6 o" P% K% M- z, b, h' oVRC2&4(Mapper21,23,25)1 { b9 T# r) e( {
VRC3(Mapper73)
! f6 ], F+ s# x/ OVRC6(Mapper24 & Mapper26)' h7 o% n* n1 Q! E
VRC7(Mapper85)( K$ ^) D, y! \) l4 r
MMC3(Mapper4)" j& B1 D* D* p# B$ ^9 N4 Q
MMC4(Mapper10) Z( w I0 t/ `( F+ O9 i# X
MMC5(Mapper5)
8 f5 W. W% F. {0 Z2 P1 E: A6 i+ q; VMapper185 y9 U4 |% g, T" u
Mapper64
8 l/ i' `% j9 ?1 v9 u1 H) P6 `Namco163(Mapper19)" D6 g& x1 u, `5 n M
Sunsoft FME-7(Mapper69)' \; H& X- ~1 v
) c% e2 S: Y6 r/ ]2 T5 A
共计11种Mapper的IRQ操作使用例子
, o; b1 m, b8 h1 r代码内有详细注释, 希望能帮助到感兴趣的人.
# C- R% m# V# I
; y# y' e+ G1 g: p- O: _6 \  
9 V# z$ v5 |) L' B3 A( U" b
; U3 a. R+ E9 B3 V6 i3 bMapper代码主要逻辑(以MMC3为例):
9 }) M. M. Q) e! m8 u- ( X+ x+ K% i3 k3 z
- ;==================================================
t. Q9 |6 u0 U( U; {1 M/ y" | - ;Mapper号
( X4 p: V2 ~/ I8 B - MAPPER_NUMBER = 047 u+ c! ?( F0 l: ^, }% U5 s3 c t
- ;==================================================. u9 e/ ^8 h7 ~7 z% D
- ;MMC3 (Mapper 4) 寄存器常量
$ y8 f! ?3 e% ]7 h& V5 K$ N - MAPPER_REG_BANK_CTRL = $8000- @2 X, ?" |5 j) K
- MAPPER_REG_BANK_DATA = $8001
4 |+ g% [" X! h! K - MAPPER_REG_MIRRORING = $A000/ m/ @; e. @# y& o: v$ w! y9 ]9 c5 R: Y
- MAPPER_REG_PRG_RAM_PROTECT = $A0013 Z1 w0 b$ }/ }3 s
- MAPPER_REG_IRQ_LATCH = $C000
% ?# f* K- T2 L5 L5 T1 D8 { - MAPPER_REG_IRQ_RELOAD = $C001( F. n# r: u8 `' z& Y5 G
- MAPPER_REG_IRQ_DISABLE = $E000
7 N% d8 [) n, p; Z# D! t7 X - MAPPER_REG_IRQ_ENABLE = $E001% t; B' n/ w% j
- ;==================================================1 C8 w9 `. l% q C( Q. G' q7 d
- IRQ_SCANLINE_BEGIN = 135
. G0 p7 H8 f. R5 x4 M - IRQ_SCANLINE_1 = 8
8 S4 U9 [+ p" \9 P* t) h0 S3 O - IRQ_SCANLINE_2 = 543 N4 F1 f: u: D: W/ O
- IRQ_SCANLINE_3 = 8
( D# a4 s4 O, Y4 ?/ E- g" b( z) k - ;==================================================
3 v1 O4 m: p+ f7 b) ^" }
: Z! F. f+ D5 ~/ N8 ~% Q5 t: N- ;====================================================================================================% {/ m0 D" L" L6 a6 h2 X
- ;宏常量
+ t$ L i8 V! ]3 U' S4 x( ?: A - ;====================================================================================================
& p, M1 F1 u7 ^! h a* h! B* f
R$ O2 |6 V, h5 a9 j- ;====================================================================================================
1 |1 x; J- O, g+ t* } - MACRO_MAPPER_INIT .MACRO
, M6 N! Z. O6 W) X& y r - ;禁用IRQ* G* b" P* R- [& Z; Y
- STA MAPPER_REG_IRQ_DISABLE" S$ }" [$ J4 B% |* x6 B% h d
-
. g+ l. C, x3 K$ f" s - ;水平镜像2 D+ N+ Z% j x3 b6 s7 p/ j; Y( K5 M" X! s
- LDA #$01' A+ M/ A# P, ]- ^! a! k4 F _
- STA MAPPER_REG_MIRRORING+ K, b2 V7 ?' n; q+ o' y$ ^# h
- ( M; t6 o1 V1 ~- A
- ;初始化图形bank
7 X6 L% ~. v! ` - LDX #$05
9 v, }: B/ `$ K# o( e - .Init_Chr_Bank
( w2 a/ v- N) A/ ?. k7 k0 M* Q! A. I - STX MAPPER_REG_BANK_CTRL
" U( d! p; W# A/ S7 b M0 A - LDA .ChrBankData,X1 E' z8 U \: h
- STA MAPPER_REG_BANK_DATA
% n, l- p/ m( G! V D - DEX
i# P ~1 d0 _ - BPL .Init_Chr_Bank9 Z6 I0 \0 i0 b2 \5 w" K+ S
- JMP .Init_Chr_Bank_End% k4 i: x9 D1 N' E3 C' s3 O
- .ChrBankData
, o$ }" L, @2 V) T: J - .DB $00,$02,$04,$05,$06,$070 r/ ^4 }$ G C) z1 p: \$ D
- .Init_Chr_Bank_End
; ~1 F6 W$ L7 h* \+ `' I; G, H - ' j$ |4 s5 ?, y) I3 O4 J% G
- ;启用SRAM4 B k$ b1 i3 Y. r
- LDA #$80
- W5 e+ }6 H9 l7 b& {6 T, M - STA MAPPER_REG_PRG_RAM_PROTECT* X1 K! R- p( d2 @
- .ENDM
& E2 c( N& q* P7 l2 ?5 R2 ]/ f - , r% [9 k4 W8 u" N
- ;====================================================================================================
: I5 J h; c$ L3 a4 O" z( v9 r$ @ - MACRO_MAPPER_SOUND_CLEAR .MACRO r, Y: r! R S$ I7 `2 ^
- .ENDM+ x' f& [& l Z* M0 A# k
-
# O: I& h& K. [) h/ ?8 x - ;====================================================================================================
l1 I7 `* L, m. c - MACRO_SRAM_ENABLE .MACRO. F y8 E/ \, u# b
- LDA #$804 c. j) ^3 b7 l0 f8 \% `
- STA MAPPER_REG_PRG_RAM_PROTECT
0 Q' {: q0 Z* }* L1 `# ]# J - .ENDM# T9 E8 T/ O8 x- u4 @9 ?& o' L, X
- . ]" y9 q, p3 E8 L, n# s
- ;====================================================================================================
6 O8 B! C4 U& R; y' ~ - MACRO_SWITCH_BANK_8000_A .MACRO/ K3 k4 q4 s5 d! ?. y
- PHA8 M0 r' T! V. }
- LDA #$06 h9 Z* O2 a' R9 v* W2 Y% b
- STA MAPPER_REG_BANK_CTRL
( U& e A0 W& {6 E( T" o" H2 X - PLA
; Z% q1 N; | L. q' ?8 l5 c* t - STA MAPPER_REG_BANK_DATA* g; @; x( C: J3 G6 _1 Y
- .ENDM. p( r4 H; F1 C5 y/ ?# I
- ( J# P7 A% }: M5 D f2 P4 I5 H
- MACRO_SWITCH_BANK_A000_A .MACRO
! \+ W4 b6 I) F4 g/ ^& [5 P - PHA8 `/ G( [7 K, D: X7 t: Z
- LDA #$07
8 l% t" E7 E% G# `1 H2 p) m - STA MAPPER_REG_BANK_CTRL
5 V1 D6 m/ \7 u5 C - PLA
) |& g i; x7 O, u - STA MAPPER_REG_BANK_DATA' }# P# M2 F$ k4 b! H
- .ENDM% b/ _) `0 [9 l& `3 K1 R _
- + q P& e0 y5 D6 B- @# C% d& S
- MACRO_SWITCH_BANK_C000_A .MACRO* D* N3 E; Q$ g9 W* z1 ~7 b
- .ENDM
0 U- c) W6 D0 Y7 W1 ^# ^% v8 U% h- o - 5 |6 s: x8 b# z# k
- MACRO_SWITCH_BANK_E000_A .MACRO8 x1 s/ N& ]' b6 i$ G) F! y" ^
- .ENDM
6 x* p8 b2 a5 b8 O - . A) w5 h5 ]" g, I0 \) c( _
- ;====================================================================================================
6 X. V; [( F. l# Q7 A& |2 V - MACRO_TRIGGER_FIRST_IRQ .MACRO9 \9 F4 i. C$ ^; S
- LDA #IRQ_SCANLINE_BEGIN + 19 C% b. W+ X* G. w
- STA MAPPER_REG_IRQ_LATCH
' P6 b H/ v7 Z* z6 h6 r - STA MAPPER_REG_IRQ_RELOAD( j+ ?0 ~( h3 K4 f/ o
- STA MAPPER_REG_IRQ_ENABLE
8 w/ J1 q3 X& ?/ U" f - CLI4 b- Y- J8 v" u: M- g
- .ENDM
, q% ]6 @: O6 U0 g: g: ` -
+ Q/ Y* a( J, U8 c( v" z3 _* V - ;====================================================================================================
" _1 `+ x+ v g" M& a - MACRO_ENABLE_IRQ .MACRO
. F- S5 r1 l: h& K- B - STA MAPPER_REG_IRQ_ENABLE
/ E* z" \( g: A# x! W! y - .ENDM$ f7 t- z/ a$ E/ g8 j
- 8 N9 U8 v3 p7 E
- ;====================================================================================================
% ~; l; M; X6 ~! _6 V! v - MACRO_DISABLE_IRQ .MACRO3 f& D& ?- k: B
- LDA #$00- p) }9 ?+ o7 Q
- STA MAPPER_REG_IRQ_CTRL
- l# {/ G! H2 `& a, K2 `4 `1 l - STA MAPPER_REG_IRQ_ACK
4 ~8 L* H: T+ u - .ENDM
1 J0 G2 }3 F/ r2 U - 6 Y" f6 |8 Y8 s* a0 Z }
- ;====================================================================================================, v& _1 Q1 W+ U. [
- MACRO_ACK_IRQ .MACRO# u A _* \8 u: T* H8 Y# j
- STA MAPPER_REG_IRQ_DISABLE
6 v, m$ v+ f! s9 c8 c7 v - STA MAPPER_REG_IRQ_ENABLE
7 B1 x* O2 p, f/ ]* B g$ l - .ENDM
/ c5 R+ e5 ?+ E' x$ D -
& Q9 k' y+ |4 B- K - ;====================================================================================================3 G! P4 x# {2 X$ f2 ~% I
- MACRO_IRQ_OPERATE .MACRO
4 p: _% `9 g3 }5 `5 l4 i- i
+ ~& h: k* `( U5 Y$ q- ;==================================================/ B9 y4 G2 | f5 S
- ;IRQ滚动模式常量
z3 U& H! C7 P9 j - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动, t3 e5 M3 y t0 ?/ D8 j
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动# ~1 x" r4 p1 {! u& R' ^8 Y& A
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动7 O0 n# a; b" t6 O L$ N8 ?
- $ o/ j# ]- a9 b( ?9 y. K
- ;IRQ扫描线数据
0 J$ p- s8 S! ? - IRQ_Scanline_Data
& X1 [6 I' [) W/ S$ K) ` - .DB IRQ_SCANLINE_1
( x: c! C5 S9 U, e - .DB IRQ_SCANLINE_2
/ A; Z9 F+ _% } b3 \) I0 e; ` - .DB IRQ_SCANLINE_3
" I; [! x$ Z+ d0 V5 T - .DW 00 ;关闭IRQ( d$ ^! m9 D! |9 f1 h$ I1 ^; f
* v. N, h \: L. S7 k- ;IRQ滚动控制模式( s- q) b+ X! }* U- ?
- IRQ_Scanline_Mode
" D- ?9 `4 I/ j* k- Y - .DB IRQ_SCROLL_MODE_RIGHT
8 L" d6 B; f' ?% s& n3 c, l/ V - .DB IRQ_SCROLL_MODE_LEFT" A% Y4 u+ s( h0 ^* ^9 E
- .DB IRQ_SCROLL_MODE_RIGHT
1 z' P" E. w6 G - .DB IRQ_SCROLL_MODE_LEFT8 S8 F9 Y! a- M8 ^
- . c) U1 l# a; |8 A3 f3 Z' F& C
- ;==================================================
& r& P/ B9 e" g6 {. S2 ` - ;;IRQ滚动控制
. T$ G5 x) m& _# U2 B - IRQ_Set_Scroll$ E! ~6 l" |3 I |7 ~: N# _
- LDX IRQ_Process_Index; E1 e1 X7 i) c; ?
- LDA IRQ_Scanline_Mode,X! x* J- e- L" V' i8 d
- CMP #IRQ_SCROLL_MODE_LEFT
# ~. i; u4 Q; {9 \: _$ ]- o - BEQ IRQ_Set_Scroll_Left1 g, E1 e4 b# [
- CMP #IRQ_SCROLL_MODE_RIGHT
( f$ U5 x/ W5 d1 @" B) B! k5 \ - BEQ IRQ_Set_Scroll_Right
# Y4 x% e. B7 _) i* k- N4 X5 P: m - IRQ_Set_Scroll_Zero;不滚动
' j6 C. U) L" }" V - LDA #$00! [4 h; k# Q, v) u0 k) N. Q5 F; K
- STA PPU_SCROLL
" D+ {" e5 ^& D - STA PPU_SCROLL
) }3 F+ m: v, Q - RTS
& |& c6 B1 Q! M - IRQ_Set_Scroll_Left;向左滚动, }2 D. S h2 `2 M& i. y2 k
- LDA Scroll_H2 H) E1 o6 p% t r+ d7 B
- STA PPU_SCROLL: X5 n% t8 T3 }
- STA PPU_SCROLL8 e8 n0 Q" s6 Q6 y; e: a/ u' n/ A% D
- RTS7 |6 T% d5 A& J5 s( e/ _# x$ o" A. m6 Z
- IRQ_Set_Scroll_Right;向右滚动
! h. R- z' o+ s& L2 k2 } - LDA #$00, _4 T% X9 w& ` e. V
- SEC7 N! b/ g' I: F
- SBC Scroll_H
9 \( ^% a- h4 S7 i - STA PPU_SCROLL
6 g) ]' a: N- w- N) @ - STA PPU_SCROLL% q+ `& O( h0 D8 R
- RTS
: g2 w" u: \) {) [8 `: E- r -
1 n3 q A/ _/ {: {/ a7 |9 m2 O - ;==================================================! H) b/ m5 q! q, m+ f9 u" ^7 H
- ;;IRQ滚动控制3 N; A$ ^0 k4 O% L) k5 W' M% b
- IRQ_Set_Ctrl
- i% I+ B/ p8 w$ D/ ]. q - LDX IRQ_Process_Index2 I' ^% ]) ?$ _- f) p$ X
- LDA IRQ_Scanline_Data,X
) l: b% |6 r8 [5 D, f1 C: v# o# [ - BNE IRQ_Process_Latch6 y3 g$ x) h0 C2 I* \! t
- IRQ_Process_Disable;禁用IRQ
. ~ f6 g1 I. j# _: m" p8 U7 y - STA MAPPER_REG_IRQ_DISABLE
$ {, L& n# x; k2 Q - STA IRQ_Process_Index
. y" U! s8 o. G9 K) R& ^ - RTS- }1 q0 h- N* |0 _/ {
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线- D, G5 }* E# \
- STA MAPPER_REG_IRQ_LATCH
0 x5 E# D( k! w4 M# w1 |6 y - INC IRQ_Process_Index$ F2 e \, y" X/ q9 Q
- RTS
8 \ p- s! D& _" h6 a
. I0 p, |+ f/ K5 J- ;==================================================
" b& n: P" N1 K5 r. W( R8 d) ] - ;IRQ处理
; G( v ?; ?9 ?; I, n - IRQ_Process_By_Index
7 B! m1 e, @8 O! d - JSR IRQ_Set_Scroll
( F ~- D/ B3 A Q7 D( Y. H3 l - JSR IRQ_Set_Ctrl* Y5 D; j# g! j
- IRQ_Process_End
5 w" U8 d ?: {6 E0 ?3 R$ T$ H - RTS
4 B9 I3 L3 _3 ?: S' g( L -
1 O2 x! m4 |, L! o - .ENDM
, N4 O/ J \8 Q' j% z! P' c -
/ P3 g" V" `3 |; \
复制代码 * ?: {' _0 d: R6 K5 U: A) O! O7 _
" r! J& v4 M& p代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|