|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 9 F5 a+ |. Y' w4 w) l h7 r
7 {; @) f* ?- _: }" F
本次IRQ研究了如下:
2 I, u" O* ^5 v' h5 }3 F: k5 sVRC2&4(Mapper21,23,25)
3 V6 ^' V+ a( w8 d3 ZVRC3(Mapper73)
1 n( a. Z5 u+ b9 V+ O3 B3 PVRC6(Mapper24 & Mapper26)( ^. x; j4 F3 S; M5 D: x
VRC7(Mapper85)1 o/ ]0 ?' x2 Q. U8 `
MMC3(Mapper4)
6 u+ H+ T% C! o, dMMC4(Mapper10)
" E- W, P( H H# b3 eMMC5(Mapper5)
; ?) h1 a/ l3 X! MMapper18
: G2 d1 _0 _# O z. t! r; NMapper649 o8 a4 z9 |+ ^# X
Namco163(Mapper19)3 I8 }3 g5 m0 s7 j7 V! S7 L' M
Sunsoft FME-7(Mapper69)
/ n' o" w E/ S Y s8 v6 e1 T) J7 @' T) z
共计11种Mapper的IRQ操作使用例子
' q% Y: z* w8 |& N8 E3 I代码内有详细注释, 希望能帮助到感兴趣的人.9 Q1 Z: C2 R# I, {6 G4 C, F' h
& N: r) K/ f* G6 J9 y: Z9 y  ! a! H) |/ ]) F# B; I4 }3 {
) y7 j8 y1 t1 g; I3 V
Mapper代码主要逻辑(以MMC3为例):* _: R- k; k! P, s
/ S* z4 G3 I2 }6 L$ y: R- ;==================================================
' v4 @3 o: j$ u& f - ;Mapper号
2 V: L8 A5 X$ K7 @ - MAPPER_NUMBER = 04
$ _: U9 M6 n$ o' ]% P/ r - ;==================================================
% |$ p, u: ^0 ~( k$ f - ;MMC3 (Mapper 4) 寄存器常量
4 T7 }) Z3 y7 D4 X* k - MAPPER_REG_BANK_CTRL = $80004 h% ^ }5 q/ \8 C0 u; }
- MAPPER_REG_BANK_DATA = $8001
) G# q% b' W" l8 i/ { - MAPPER_REG_MIRRORING = $A0008 _ \; ?- P6 V7 k
- MAPPER_REG_PRG_RAM_PROTECT = $A001% h+ T" G, @. f G& _+ u6 |7 _& z' d' O
- MAPPER_REG_IRQ_LATCH = $C000
* ^; [$ s' Z2 ^( `' } - MAPPER_REG_IRQ_RELOAD = $C001
0 r8 q U; v8 i8 Y2 ]( u+ [6 _ - MAPPER_REG_IRQ_DISABLE = $E0005 E& F8 j7 K& T7 ?9 }
- MAPPER_REG_IRQ_ENABLE = $E001! Y2 E' U: R: A
- ;================================================== Y2 p6 K2 M0 |# l/ ^4 R0 B
- IRQ_SCANLINE_BEGIN = 1352 D3 \- D' @0 u* K1 \
- IRQ_SCANLINE_1 = 8) a" t. s" D7 \% X6 _) Q
- IRQ_SCANLINE_2 = 54
, E0 y2 \1 Z6 i' J/ u3 u( \ - IRQ_SCANLINE_3 = 8& w/ E9 M; v7 |9 ~, u
- ;==================================================0 w' E) W" n- I0 `1 ^1 {
% p$ ?# L1 l* ?1 n7 V, k6 z q$ r- ;====================================================================================================" L' g% y+ B1 ]! Y
- ;宏常量1 c* q, \( E& c# U2 b* t7 t: b
- ;====================================================================================================% q4 T6 q* J5 A4 G
- ; k8 j1 ]6 e! c) T
- ;====================================================================================================/ _2 H. W8 G1 C0 r4 d
- MACRO_MAPPER_INIT .MACRO
& H m# b+ N# f- U8 _% N. n - ;禁用IRQ
& p& ~& r1 f9 @; [ - STA MAPPER_REG_IRQ_DISABLE
# k, H9 u0 n% x9 H- r3 P -
8 v+ Z1 b) [! J4 d2 H - ;水平镜像
/ M. I5 C. F" x4 r' c2 T, C& X - LDA #$01
8 _7 g; U" J$ |& ? - STA MAPPER_REG_MIRRORING
" G/ S+ }4 Y8 m! b& [& _. h -
( t" _' t/ {6 |6 X/ u+ A - ;初始化图形bank3 a4 x6 F9 i8 z8 o% C5 N
- LDX #$05
1 ~8 p* m l1 n7 c4 t - .Init_Chr_Bank: x# x/ \* v1 j' x$ w- V }( t
- STX MAPPER_REG_BANK_CTRL S' y2 e/ x0 V7 o5 \ S7 C
- LDA .ChrBankData,X3 j& r5 S8 Y/ D' }! Z# F
- STA MAPPER_REG_BANK_DATA
0 k5 U0 Y' f- j( e* N - DEX+ {$ ~- n0 e' V* n
- BPL .Init_Chr_Bank" X: m6 A9 C2 k- \. K
- JMP .Init_Chr_Bank_End5 p" }# c$ _; ]$ m, e
- .ChrBankData
2 m0 n; C/ k' M/ U - .DB $00,$02,$04,$05,$06,$07, z1 s0 i3 W' |. O
- .Init_Chr_Bank_End
5 D; B5 n+ o4 L: \( K -
. T& y" S* s$ A7 q+ I- O - ;启用SRAM
, I1 [2 N& M( x* z& y - LDA #$80
. K' L; q6 l4 k, c - STA MAPPER_REG_PRG_RAM_PROTECT1 r) Y1 b+ D0 i% t8 l5 c
- .ENDM2 }0 v6 |0 m6 {* P* J
9 J# y/ G6 e0 A- ;====================================================================================================
+ Y9 O/ q/ f! b( g/ D - MACRO_MAPPER_SOUND_CLEAR .MACRO
8 K8 l# J9 c0 b$ W8 ^ - .ENDM7 H4 a: }. U @4 Y: x
- ; c5 a% S/ X1 a; p1 s
- ;====================================================================================================
+ C* N. D6 f1 C* L8 l$ {4 [7 n - MACRO_SRAM_ENABLE .MACRO# Y: o; E7 a/ C" j* k; @
- LDA #$80
2 i! y4 ]) d- `3 P) w* y3 X# ` - STA MAPPER_REG_PRG_RAM_PROTECT, @2 e% S6 I2 t1 K" N$ h9 N
- .ENDM) N5 W' y$ f( d U$ t: g
-
% o1 l! C& w" i6 a# L8 q - ;====================================================================================================( ?' R! g: m% ^! u4 h0 b
- MACRO_SWITCH_BANK_8000_A .MACRO& |. L7 w$ f" `) v
- PHA5 x& ^% K9 P# V
- LDA #$06
5 G3 p* [, A& j7 L - STA MAPPER_REG_BANK_CTRL9 |- Z {3 |3 p+ I- v3 @, T2 S C
- PLA7 f* h5 k; h. J% [6 b
- STA MAPPER_REG_BANK_DATA
$ M! e) x% o8 b% j1 ~ - .ENDM
/ D9 O x2 I6 ?# F - [( E0 }5 G% @% E
- MACRO_SWITCH_BANK_A000_A .MACRO
" u& w6 S' w2 V) D - PHA" t9 I( u) M" [" c6 s9 E7 S
- LDA #$07
6 m& l% @1 }" y3 V; @% L - STA MAPPER_REG_BANK_CTRL
5 b; @8 w" x8 o9 o5 [( O - PLA
, ^+ E- B/ h$ P2 l. j- F1 k4 } - STA MAPPER_REG_BANK_DATA7 m% V+ b% a) R2 Y
- .ENDM( G1 y" h+ B7 }, o* g1 S" ~9 w9 y
- # l$ ]! D8 S0 z- b. j
- MACRO_SWITCH_BANK_C000_A .MACRO1 X" H) E* P* l9 o0 F$ u
- .ENDM
$ P* Y- P# R) c4 x+ X' F - 5 l( u2 |- S( {/ h) k2 ]8 p
- MACRO_SWITCH_BANK_E000_A .MACRO1 K4 [, D5 G9 `0 Y1 M* j0 Z# v" h
- .ENDM
( ]6 ?5 r. t. y8 Z( j! k# m - 2 V+ b4 h) p. C$ Z, d
- ;====================================================================================================+ `5 n: ~! j4 V6 n
- MACRO_TRIGGER_FIRST_IRQ .MACRO4 [; R8 K2 o& V
- LDA #IRQ_SCANLINE_BEGIN + 1 D! }# m4 Z" {/ F' T
- STA MAPPER_REG_IRQ_LATCH
% X1 i$ d1 b& `; T( i+ o! w! U - STA MAPPER_REG_IRQ_RELOAD
) x! s9 K" P) e3 h `# @) B - STA MAPPER_REG_IRQ_ENABLE
% ^5 ~8 L1 I% ^ - CLI5 I: Y1 D4 ^$ A k9 k8 U
- .ENDM
1 ]3 T; N7 N+ H$ s; n9 H9 k - ; ~- J2 x( P$ _$ L- b" j
- ;====================================================================================================
8 N" n# W- v( B9 R - MACRO_ENABLE_IRQ .MACRO
/ b3 m X7 \) n- p - STA MAPPER_REG_IRQ_ENABLE- o% ], H0 f7 @/ F
- .ENDM
% D& u8 ^2 p1 x2 X - * P+ m4 R% q5 `2 o
- ;====================================================================================================/ `6 U( N& ?8 m( h3 s
- MACRO_DISABLE_IRQ .MACRO$ f! a0 E5 v" S2 |: m3 o
- LDA #$00
( U% o. c' J3 u' E9 j - STA MAPPER_REG_IRQ_CTRL
9 w" d) F9 v ^' { - STA MAPPER_REG_IRQ_ACK
" C2 W; N: j0 B4 M/ c - .ENDM( k x1 K. j/ u) D! v! @3 K8 O
- - J" r4 J0 P$ H9 g
- ;====================================================================================================% H( v. y( u6 J. E6 K) m+ b& e z
- MACRO_ACK_IRQ .MACRO1 `% ?" g$ c) J$ r+ ]; p
- STA MAPPER_REG_IRQ_DISABLE
; d9 O8 ~( p! y2 e# T - STA MAPPER_REG_IRQ_ENABLE$ R8 x9 n& I( _
- .ENDM
& D5 ]. [1 z1 U# |' N& c4 D9 F - 9 ^" @9 a4 {3 ^5 `& J6 p" f& k
- ;====================================================================================================+ P* y. g5 r. z8 G' k3 J; z
- MACRO_IRQ_OPERATE .MACRO" i9 H: V5 G1 _$ T
- 5 ~1 x F/ }/ n; n2 @& G/ @
- ;==================================================# H) ]3 l$ ?( L1 ?( |
- ;IRQ滚动模式常量* c2 B# H7 u* t: h- w
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动# f3 y2 n$ ?! x& I: C
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
0 L v; @' {- F7 j; X - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动, i. N7 ^% ~- L0 i J: _$ @
- ) b6 R" n% V3 ]- x$ k
- ;IRQ扫描线数据* d( W0 d' D @( I2 D& a
- IRQ_Scanline_Data& G1 b- d0 y( ~: i- w9 Q! z
- .DB IRQ_SCANLINE_1
, Y. k) t# A$ @0 V - .DB IRQ_SCANLINE_2; R! o# ]3 `+ A* S
- .DB IRQ_SCANLINE_39 M+ Q/ c0 j# Z: K0 n! E! {0 N
- .DW 00 ;关闭IRQ
1 i( S [; V4 c" Z( ] - 6 U7 M8 w) i2 j4 t
- ;IRQ滚动控制模式
! X$ o& M4 P- B% D$ c - IRQ_Scanline_Mode6 J% i* N, y$ V' ] h& @" i
- .DB IRQ_SCROLL_MODE_RIGHT$ x; }, i7 S m
- .DB IRQ_SCROLL_MODE_LEFT3 h' w; k0 N' m7 X* Z, y9 F2 X8 i
- .DB IRQ_SCROLL_MODE_RIGHT& u* ^& Q3 V- O
- .DB IRQ_SCROLL_MODE_LEFT, n1 O, U2 K6 d4 {2 l
& q8 ]$ @! p1 Y1 j- ;==================================================& ~9 c+ T* s7 Z3 {% O& [/ Z- a# `
- ;;IRQ滚动控制# _/ }" o: r; Y, `
- IRQ_Set_Scroll
# E: { w. m8 b7 G0 u - LDX IRQ_Process_Index" w' [- h9 }5 Q, d( a( r
- LDA IRQ_Scanline_Mode,X
& c: ~1 Q( C+ C1 ?" t. T - CMP #IRQ_SCROLL_MODE_LEFT
& p P% S8 h1 {, s! C0 p( W! c - BEQ IRQ_Set_Scroll_Left
/ @9 I# [2 d0 X6 B: z; i - CMP #IRQ_SCROLL_MODE_RIGHT! a# ^# J! z A ~5 j/ S8 z* a3 q
- BEQ IRQ_Set_Scroll_Right0 Q% H: C2 h" l
- IRQ_Set_Scroll_Zero;不滚动7 R; R/ Y9 }5 q! M
- LDA #$00. V: m+ ]1 z; s, y$ l& D R8 b
- STA PPU_SCROLL ]3 P/ ?& C! _' w6 a; |2 H
- STA PPU_SCROLL' Z( |1 N4 ^* v' M$ ^5 L0 \
- RTS+ z- G5 {* \3 A
- IRQ_Set_Scroll_Left;向左滚动4 [* ^ g: p; W9 R
- LDA Scroll_H
. ~1 c! b0 P# I# E3 W - STA PPU_SCROLL
1 R6 c: t2 @" ?. k9 J; W - STA PPU_SCROLL6 L7 G+ r( g- z' R" @0 e
- RTS, ^6 g4 X2 u% F8 ^4 ~
- IRQ_Set_Scroll_Right;向右滚动
5 Y2 u0 R) G# J% R1 d | - LDA #$00
1 r) N `5 k r# p - SEC( o9 J6 e4 K" c. F1 D
- SBC Scroll_H% z0 r5 _0 h; c
- STA PPU_SCROLL
+ ]& T7 ~- U j! i# Q - STA PPU_SCROLL
( [# m5 K4 b. d% N! \1 D! @ - RTS& N% D1 a Z/ e
-
7 A7 d# t% s3 T, {+ Z - ;==================================================3 \9 X0 m9 W" v% d
- ;;IRQ滚动控制
5 P' \$ D+ F; E, ]" i: k. X! \ - IRQ_Set_Ctrl+ Q# l0 I8 b4 L- [: G+ j
- LDX IRQ_Process_Index) l# U* m/ G9 r8 h: W! `
- LDA IRQ_Scanline_Data,X
3 i% Y5 G1 t. N) j& c$ ^1 R% a - BNE IRQ_Process_Latch
5 v7 D7 P2 }- O; ~7 o6 P' _6 m - IRQ_Process_Disable;禁用IRQ
# }- a/ `" S' |- y9 }8 ~ - STA MAPPER_REG_IRQ_DISABLE
2 G" Q7 P4 u* w6 l4 b6 K8 v - STA IRQ_Process_Index
+ E* i G4 ]5 Z& |$ A - RTS
9 q' E- G0 H% ]1 I- d - IRQ_Process_Latch;设置下次 IRQ 触发扫描线; t& K9 g: J/ A1 h
- STA MAPPER_REG_IRQ_LATCH
8 Q* Y( M( \2 j6 p/ ?5 | - INC IRQ_Process_Index
- F6 B- ?9 M8 I2 k - RTS: ^# x+ g: t# e8 r- v
- 2 F$ x: }: Z( _) F; x, w
- ;==================================================% f3 t. ^! J) v$ f
- ;IRQ处理- ]5 M9 V) t. u! a! ~+ g( i6 w# W
- IRQ_Process_By_Index
2 L6 \6 p$ D. t2 P - JSR IRQ_Set_Scroll
, K( U) j4 ~: b, g6 Z a - JSR IRQ_Set_Ctrl
6 E2 v% Q" E- |& [ - IRQ_Process_End: q' S# @# F( M% }% a
- RTS
& F, V2 C: g2 X+ M8 u4 v5 j -
4 J4 I" f' l: O - .ENDM
/ x. k7 \) D1 j4 I -
" J( C# ~% G% T! d4 d
复制代码
8 y9 M& T U! Q Q% H7 a8 F3 }) N8 v# ^% [+ t
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|