|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
, G5 ~( u$ O, ?+ x, X
* I! h0 h, |1 j6 P4 S5 ]9 I本次IRQ研究了如下:
( b, s; I3 t6 D! zVRC2&4(Mapper21,23,25) Z4 G0 h1 `( A2 }' r) ]" a
VRC3(Mapper73)# M2 R! H4 B! m0 \
VRC6(Mapper24 & Mapper26)9 v5 |3 |' Z2 p* s. G5 e( I+ `
VRC7(Mapper85)9 }' G: U) T. [: ]
MMC3(Mapper4)
8 d, [ ~ m) {$ b! z4 QMMC4(Mapper10)2 w( C) I U8 R' p: N- F
MMC5(Mapper5)* T" e9 Z# D5 B
Mapper18
: |8 h0 B: [; w M& j5 hMapper646 u6 {0 {3 ]4 m
Namco163(Mapper19)$ U" _# ^& {) v
Sunsoft FME-7(Mapper69)1 n, s7 h3 v4 f* Z0 {, q0 O9 {
2 Z) d. y4 p" c1 J. X
共计11种Mapper的IRQ操作使用例子* U! `( y7 X* Z/ B) _8 O
代码内有详细注释, 希望能帮助到感兴趣的人.* U2 o f. K9 n$ Y+ G
3 { C( f1 n2 n- e& H1 N. b; i1 `![](http://2006.emu618.org:6180/data/attachment/album/202312/02/173348zkgkz04mmgdno7na.png) ![](http://2006.emu618.org:6180/data/attachment/album/202312/02/173349mimbq1m0mp00mzmo.png) % p% B. c! L8 j4 c( f$ B
. |( }& H' w. SMapper代码主要逻辑(以MMC3为例):; l0 a$ I% f3 v% m0 [8 L
- : w$ n8 ^9 ^# B; H" j
- ;==================================================/ w+ \ n9 v7 _3 }/ e3 p. L! F
- ;Mapper号
3 p+ k G$ f9 Z( U' G9 Q - MAPPER_NUMBER = 04, P2 p$ y. `2 I x* W
- ;==================================================% ~* \( S; i3 l6 u& {# @
- ;MMC3 (Mapper 4) 寄存器常量, P A* Z) c9 z* `
- MAPPER_REG_BANK_CTRL = $8000
$ v( V6 D( V( [+ [' ^/ N O - MAPPER_REG_BANK_DATA = $8001
2 y- \% G( I: e) s - MAPPER_REG_MIRRORING = $A0002 e$ M- w% ^" O( r* _
- MAPPER_REG_PRG_RAM_PROTECT = $A001
5 ^( b& \+ I, f G - MAPPER_REG_IRQ_LATCH = $C000
0 Z0 i) \" m1 ?0 f( x2 s - MAPPER_REG_IRQ_RELOAD = $C001
" a0 I& }# M7 j' f$ \2 ?+ d+ m - MAPPER_REG_IRQ_DISABLE = $E000
/ w7 u" X* h2 @& v( I# ?7 N/ b Q - MAPPER_REG_IRQ_ENABLE = $E001 a$ g" z6 Y5 C! J, T5 A: ?+ x
- ;==================================================
8 w0 U3 Y n; A9 M - IRQ_SCANLINE_BEGIN = 135
. {* z6 I, k, |/ v" J - IRQ_SCANLINE_1 = 85 D# z4 m" @6 ~6 ~/ W
- IRQ_SCANLINE_2 = 54% T4 ] G! ?2 h! X; p
- IRQ_SCANLINE_3 = 8
6 ^4 v' M" w$ A; U - ;==================================================
! f" y4 t" u# J) O7 o
' m: B' w5 D8 a# L; k- ;====================================================================================================
8 N' k* h. k: `8 c# e+ Q - ;宏常量
: [% ~' e+ j& [; q: D& ]: P c5 ] - ;====================================================================================================2 ^' x9 }8 I; I( x" X1 k6 S
- ) H4 I+ E' w0 ]
- ;====================================================================================================
2 t" X7 D" q2 g0 j - MACRO_MAPPER_INIT .MACRO
9 ?8 f/ ^$ u: \9 u - ;禁用IRQ
( y) c. P2 a- `( q - STA MAPPER_REG_IRQ_DISABLE9 d' z7 i8 z/ b) i" a( y; o% u
- $ c: t8 g1 N/ |* C0 \4 E( @
- ;水平镜像
9 J; @4 d1 ?- O5 J% m - LDA #$01
" l+ @0 w3 \$ l) S/ b - STA MAPPER_REG_MIRRORING
8 w' Q, p* S7 Q _8 x9 Y: x/ Y -
6 e2 }" b$ A" ~: B: y( O" { - ;初始化图形bank
s; j$ R! D1 l6 G0 p9 y - LDX #$05' I6 `- _' a0 @
- .Init_Chr_Bank
! h5 f& }2 z, x( d `4 D- g - STX MAPPER_REG_BANK_CTRL: M8 S1 @% r1 Q" T0 P
- LDA .ChrBankData,X" [" R8 a3 w+ j( e! ]& k# v
- STA MAPPER_REG_BANK_DATA
! O9 g: q1 [! ?6 f, I/ P/ d4 A# {2 i' S - DEX" r2 A& @; K+ m! L9 S# s
- BPL .Init_Chr_Bank# P; v& F# |. R* l) Q
- JMP .Init_Chr_Bank_End
K# k3 [1 R8 q3 w0 X# \ - .ChrBankData
# e6 q0 q1 q; h t - .DB $00,$02,$04,$05,$06,$07
) B6 A# s/ z2 ~) }0 j' G - .Init_Chr_Bank_End& o/ C. A2 f7 v' X
-
2 v: l3 b$ O; P8 Z2 d - ;启用SRAM; Y3 Y& x% y7 _
- LDA #$80
3 ?4 v2 p: j: U! Z" p - STA MAPPER_REG_PRG_RAM_PROTECT
4 L8 G2 C8 R6 s0 h, z, V - .ENDM
2 D6 _& \8 M$ y) K2 j( ^ - 2 C# R& `& ?0 m
- ;====================================================================================================
: Z0 D) a9 G4 r$ x* B4 h! k' Y$ a - MACRO_MAPPER_SOUND_CLEAR .MACRO$ Y, _6 j! [5 K9 A2 [- ~4 s
- .ENDM! ]% h- D6 r5 K2 e4 R6 t; P
- h# _6 w: [. @
- ;====================================================================================================; I5 i; }; W* [' v( v% s% G
- MACRO_SRAM_ENABLE .MACRO
+ G1 U9 l; }% @, b0 y - LDA #$80+ p5 K8 i" O8 c' s( Z# V
- STA MAPPER_REG_PRG_RAM_PROTECT
7 W: v0 n7 S, K) F: _5 K - .ENDM
( ~6 k$ n' G3 S# _& j' ~ - ) N7 c/ @# v6 L* ?, R2 v
- ;====================================================================================================% q' V l5 I( o8 Y' _3 ?5 E6 B
- MACRO_SWITCH_BANK_8000_A .MACRO
& j4 |9 ~% ^9 C6 F - PHA
9 `& c, J* V* j7 n+ s, I0 R - LDA #$06; q- N$ T n5 `* i' f; t4 Y, z
- STA MAPPER_REG_BANK_CTRL( a2 P. r$ E, n9 T) X
- PLA( i4 ^2 l! G# O4 I% t
- STA MAPPER_REG_BANK_DATA
9 n5 w& E5 W& R - .ENDM. N' ~3 }' [ `1 w- `% A- s
6 b3 j( O- D9 {8 n$ p- MACRO_SWITCH_BANK_A000_A .MACRO
8 Y* c. N) N b% V# t8 E+ H - PHA4 d H0 n' U. n" `3 w
- LDA #$073 O/ @9 v. Q$ L! P( m/ _7 Y# r
- STA MAPPER_REG_BANK_CTRL3 J/ Q$ D( {, i$ d& h$ \
- PLA
3 X7 a& l3 l0 Q& X3 V" j - STA MAPPER_REG_BANK_DATA
: b! R( L" B4 c, L - .ENDM7 }5 r0 S/ H0 ?7 }
- 1 u6 @7 w( R2 {2 y* D, P+ E4 h% e
- MACRO_SWITCH_BANK_C000_A .MACRO" C6 ?# Y9 n# o
- .ENDM3 O& r1 x9 W: v& h! T+ D1 Y
6 n% K; [9 p- a. @5 K- MACRO_SWITCH_BANK_E000_A .MACRO
" A/ p5 K* @+ d - .ENDM
; J/ K5 L2 q% ]; j' d3 n0 T ?
, G/ ~$ u. V5 M+ E- ;====================================================================================================$ t. h c) c u6 U7 o9 e4 J
- MACRO_TRIGGER_FIRST_IRQ .MACRO
! G' k- y* J1 R. e8 g - LDA #IRQ_SCANLINE_BEGIN + 1
6 s- q9 J) X% {% W! i - STA MAPPER_REG_IRQ_LATCH2 O7 ~ D. W* }/ v- w
- STA MAPPER_REG_IRQ_RELOAD# j* s& w0 I5 O$ I1 f0 C2 Q
- STA MAPPER_REG_IRQ_ENABLE
! s: n0 N0 d$ u$ q# d$ a% D - CLI
* p: y' o3 P# w - .ENDM) w2 S; t, g! Q0 O: p9 J# b- \; P
- , Z! G4 Y1 v: Y; S" ?* M
- ;====================================================================================================) C* R# z6 {( @8 ^
- MACRO_ENABLE_IRQ .MACRO
& C5 B @1 b# T. K) B - STA MAPPER_REG_IRQ_ENABLE
1 m8 c& `* l) \! m6 o |5 W, R - .ENDM
' s- Z5 B' m0 P6 n( U* j -
4 P) k0 i+ W% c3 e: p |% | - ;====================================================================================================
4 m& s' v X0 S - MACRO_DISABLE_IRQ .MACRO
2 H0 B# k( n/ r - LDA #$00) N# ~8 v: b O. s3 |
- STA MAPPER_REG_IRQ_CTRL
I+ g% g; y4 ]7 Q$ @; _ - STA MAPPER_REG_IRQ_ACK
" r% V# `3 S3 p5 T; |) b - .ENDM
6 s m7 v& J8 y6 W/ @9 d -
, P0 _- g9 S# [$ L6 r# h - ;====================================================================================================# k" h7 [! J( t/ {6 V
- MACRO_ACK_IRQ .MACRO$ y0 t( S* D! w4 Y- ]# _, s9 n7 | W5 k
- STA MAPPER_REG_IRQ_DISABLE8 H$ g6 P$ W8 C1 C$ q$ C; H
- STA MAPPER_REG_IRQ_ENABLE$ s+ \+ d' C& ?, s; d& P, N
- .ENDM$ r& F' Y& ~8 X1 V2 ]9 I/ G
- 8 @0 B# s3 I6 m( V5 q: y" o4 S: l
- ;====================================================================================================/ W, O4 {! ]8 E) k* V! Q$ I' [
- MACRO_IRQ_OPERATE .MACRO
: q, N1 [. U4 q7 J$ J0 e7 e
; V' S) t" B- h% E# `- ;==================================================8 l" S, b( g# h9 H( L1 j
- ;IRQ滚动模式常量( q5 {2 [- {4 [6 H5 g( {
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动6 W! Q7 Y0 j6 W/ P% }: ?
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
( R) J* X8 n( ~/ g+ q | - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
C, M$ {. F/ c' _/ |+ u! ~
' |- `1 i" W; z0 s) L- ;IRQ扫描线数据
3 f: n3 i- t/ u& l6 n6 R - IRQ_Scanline_Data
9 J' Z% o; D" C, N( B9 N - .DB IRQ_SCANLINE_13 S* ]9 ?& H2 ~% L' a- U( g4 F
- .DB IRQ_SCANLINE_2" D# p4 Z+ X3 f6 j9 N4 D$ q7 ?
- .DB IRQ_SCANLINE_3
3 Z# x0 b! O. M( H$ N6 m - .DW 00 ;关闭IRQ
0 S$ q7 x- p, \3 _ J# x
2 C" @3 u) r" _# q5 y- ;IRQ滚动控制模式: h% U$ V$ c5 A
- IRQ_Scanline_Mode, w$ p. H' n# J+ m. g
- .DB IRQ_SCROLL_MODE_RIGHT
0 N* u" V) {0 E! T0 H5 D - .DB IRQ_SCROLL_MODE_LEFT
, u$ E: H/ H( R) N; m* _9 ]9 w5 C - .DB IRQ_SCROLL_MODE_RIGHT& T z) \3 Z* W# _& v# t
- .DB IRQ_SCROLL_MODE_LEFT2 i( `1 @1 O: k* r' C
4 r! n) s" W. p& K$ J- ;==================================================
! L) |' [. \5 W% e/ C4 ~. _ - ;;IRQ滚动控制) W6 k9 A# {- P# g/ }+ f
- IRQ_Set_Scroll5 }) l6 R b+ t% @( o
- LDX IRQ_Process_Index
5 T2 a. a( b3 ^ - LDA IRQ_Scanline_Mode,X
% {& @( i" y, u - CMP #IRQ_SCROLL_MODE_LEFT
: u1 ^& ^( |( o9 ] - BEQ IRQ_Set_Scroll_Left# `, Z. d1 z: B% S# k
- CMP #IRQ_SCROLL_MODE_RIGHT+ a& ]- X$ e/ c
- BEQ IRQ_Set_Scroll_Right
, s- A& ^$ o o& J9 B* r* u - IRQ_Set_Scroll_Zero;不滚动
1 k: P$ x( A0 a - LDA #$00
7 Z0 ]2 N8 O1 J/ ~5 V( ^ - STA PPU_SCROLL" Q7 _* C* z. ]1 W' U
- STA PPU_SCROLL
5 }* y. L2 M- d( [8 j - RTS) M6 o- [9 C4 n! _. B" G2 S
- IRQ_Set_Scroll_Left;向左滚动
+ p& _) o0 i2 |; B4 D, q- @2 Q - LDA Scroll_H
0 \2 f |% }* m3 q! r* s - STA PPU_SCROLL
) G1 s! _4 U: v# G5 }1 Q7 c - STA PPU_SCROLL% q+ y9 z! e9 p
- RTS2 d* c7 b; E9 i" Q! l, c" s1 A; z. g
- IRQ_Set_Scroll_Right;向右滚动$ {. Z) i, A' b1 H2 D
- LDA #$00" U- C) E. C* e! q7 W
- SEC
: w2 ?$ k' P* f& Z; K, N - SBC Scroll_H1 l, X1 h: \2 {9 g- C+ T5 l: w
- STA PPU_SCROLL
U# r- W( {( s' Z J - STA PPU_SCROLL
8 `' p% q- \$ @% X - RTS
& R# e! j1 t: T3 S: s -
) Y/ y. h6 [3 d( B. N9 u7 Z. h - ;==================================================8 _/ [9 Y" x8 u" r
- ;;IRQ滚动控制
. [8 {7 Y3 P/ m - IRQ_Set_Ctrl3 K- e# _! _+ q1 E- V
- LDX IRQ_Process_Index
* S, E, L! d1 U% m+ H ^ - LDA IRQ_Scanline_Data,X- ?- M. R& A7 @; i P) X6 l1 x% p
- BNE IRQ_Process_Latch* E6 h/ m9 n6 C. G; c# P
- IRQ_Process_Disable;禁用IRQ
0 D/ A7 I2 u0 ` - STA MAPPER_REG_IRQ_DISABLE
: n. x( H6 o2 u2 Q - STA IRQ_Process_Index" `; T* ]* \" T9 r/ n
- RTS
! @ R2 J E0 v R0 ~ ~6 p% t - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
! k+ d' x7 N8 S7 j# S - STA MAPPER_REG_IRQ_LATCH1 L# J* I0 L/ P3 h" b9 g: V0 W- o- @
- INC IRQ_Process_Index
, H: z1 s7 u- W3 b+ |: [# ?: C - RTS
0 m; ^4 Y. F5 C
- I1 c- h0 p+ `+ T: P- N- ;==================================================1 m/ Q4 K' \: n5 f J$ _
- ;IRQ处理
% i4 K( |& ?( Q% g- c - IRQ_Process_By_Index
- M# f/ C4 s9 o' x - JSR IRQ_Set_Scroll Q! T& i$ W. C+ C
- JSR IRQ_Set_Ctrl: i3 P" h- G# t, I5 d
- IRQ_Process_End
4 p h0 q+ p5 T( S2 E6 y) q - RTS ]. ?/ i- K- q0 W) v
- " m) R" j( z) `* `: d* J7 p
- .ENDM- ?: I- o* }6 n
- 9 [ t. f. T- w4 }# x1 m' F
复制代码
u& h2 r8 h& C- o( D) W9 V2 Y) ]" [+ ?9 F
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|