|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
4 \/ Q6 B1 C: S) |! _5 d4 a$ S, ]0 d- k# v, j
本次IRQ研究了如下:
0 q6 v* k& t2 `. Y+ MVRC2&4(Mapper21,23,25)
0 O; A2 {5 {. W" q2 L- oVRC3(Mapper73)# x+ b# t6 o. P5 I5 W
VRC6(Mapper24 & Mapper26)
9 B0 I8 [5 }/ ?5 c. b2 Y, sVRC7(Mapper85)' g& M6 ~) i/ Y; }0 H) l
MMC3(Mapper4)
1 J5 f5 s4 Q. k3 ^, J$ g. @7 gMMC4(Mapper10)2 R7 A( {4 ~# \. F
MMC5(Mapper5), }5 v u1 E2 P! }9 h
Mapper18
. u. I$ ]! O, y: [' gMapper64+ T3 K4 j; X# c- E9 o9 `" p9 W: h- c
Namco163(Mapper19)
2 s8 {! Y/ a7 hSunsoft FME-7(Mapper69)
) I- P1 {' O# t) P" d& Z) X3 l0 u- q. ^( c$ E' p4 P/ F, ` R
共计11种Mapper的IRQ操作使用例子
3 ?9 j8 ?* t' N4 \: V, B/ n代码内有详细注释, 希望能帮助到感兴趣的人.
, }/ F( O* y1 S5 \- z; R5 B& w! \8 Q) b( J5 i& i& t* ~3 M* u# B
  G+ l! R: }/ ]5 Y) C; k
4 F+ a, {( ?# g2 f" V) X4 g5 L8 }Mapper代码主要逻辑(以MMC3为例):
" Y3 p9 k, o& M# {, O1 Q- % e0 A0 f* X# u& Q: X( V
- ;==================================================3 B$ a& K5 g0 N+ R' R3 J
- ;Mapper号8 {' H6 R1 y3 i+ I! U" K, X
- MAPPER_NUMBER = 04
; V) R; ^ {. I' }: e1 K' J - ;==================================================
8 Y% C6 m- K2 n9 i/ E - ;MMC3 (Mapper 4) 寄存器常量
8 U8 G" S/ x) u( t+ {# { - MAPPER_REG_BANK_CTRL = $8000
; w% v; Y) X! S. \3 X - MAPPER_REG_BANK_DATA = $8001
1 k- k! c% w! i+ }6 v7 @. O( @9 z - MAPPER_REG_MIRRORING = $A000$ o3 J+ H: [3 F2 J
- MAPPER_REG_PRG_RAM_PROTECT = $A001
* \6 f$ ?1 j+ H! r - MAPPER_REG_IRQ_LATCH = $C000" g# M$ k4 S1 z9 D% d0 ?& a
- MAPPER_REG_IRQ_RELOAD = $C001
\! [* [ u, U+ R6 U5 h* w - MAPPER_REG_IRQ_DISABLE = $E000/ R$ b! k& g$ ^3 V/ }, F8 W
- MAPPER_REG_IRQ_ENABLE = $E001
/ Q* e( i2 M- `8 ?5 Z% e- l - ;==================================================5 s/ @( |) y8 s" q6 R, v4 h- N
- IRQ_SCANLINE_BEGIN = 135- C& Q8 O& I( z: O' m0 D" A
- IRQ_SCANLINE_1 = 8
/ j7 ]" c& Q. T' v3 E( p! f+ F - IRQ_SCANLINE_2 = 54
& t% x/ `' @0 [5 `" a' D, { - IRQ_SCANLINE_3 = 8
% r2 i6 ~2 a1 H0 g! ? - ;==================================================- d$ J& o( w5 r; B0 e" i0 s3 I1 s
- 4 S+ U/ i+ V: J! Q: o# q
- ;====================================================================================================: v/ R W! x! j6 q& `. Z
- ;宏常量
+ n0 b: W4 O: H2 d) d" z6 r0 M - ;====================================================================================================
3 T% q+ ]" g% g2 J5 k2 o4 G! q1 ]$ N* S( S
0 n. P( x7 K1 W- ;====================================================================================================8 F, ?9 F3 V1 `' @% I
- MACRO_MAPPER_INIT .MACRO5 o6 h c6 X: g. I( f# H( k1 H! b
- ;禁用IRQ
3 f, E! `3 p( k9 p; ~2 _ - STA MAPPER_REG_IRQ_DISABLE8 \9 D B) e5 }6 V; ^
- ; m: U" {. V$ @& v- N
- ;水平镜像6 M6 n3 i7 H& u" R
- LDA #$010 ]* O# t" I s( b3 i
- STA MAPPER_REG_MIRRORING
w$ j; u' \5 c7 o3 n' [* x1 z -
: u% K r1 G" p7 G - ;初始化图形bank
7 h* K' W+ |9 p# x7 @. ` - LDX #$05
/ H8 I; |9 _* Z5 {5 t( e }8 l% b - .Init_Chr_Bank
# j6 D Q1 I8 F0 | - STX MAPPER_REG_BANK_CTRL8 _/ ^5 S7 L7 [" `" U
- LDA .ChrBankData,X. I/ n- i/ ?9 g6 C# J6 k3 k
- STA MAPPER_REG_BANK_DATA* `0 u' x8 _+ X8 K: v: m- B$ E) |
- DEX# y* A: T, d4 `5 L2 r K
- BPL .Init_Chr_Bank& ?; `# D6 n" f6 w, ^9 U& e
- JMP .Init_Chr_Bank_End
' I' O. y: w" D6 t# d - .ChrBankData' E5 w/ ]9 W6 r& U; E0 r; Q- G
- .DB $00,$02,$04,$05,$06,$07& w( a7 O+ I: E3 b5 F
- .Init_Chr_Bank_End0 I( @0 `" H) r" [7 D
-
% ~/ r+ N7 S+ a, C$ P, P- D% |" |" N - ;启用SRAM
' s8 e& V2 N/ U' R" L8 @ - LDA #$80! R/ k& p# [1 [+ a2 D
- STA MAPPER_REG_PRG_RAM_PROTECT: |4 F: ~! u/ m7 [
- .ENDM
3 Y; S! I6 ^" ^/ [
( L; F U( j! D- l( G* J) x' V0 R- ;====================================================================================================
6 H ?( d* N1 D. C8 V - MACRO_MAPPER_SOUND_CLEAR .MACRO; b9 u' [6 I* h
- .ENDM- o" y' j# D2 b# o- ~9 ?
- 6 V1 g. `4 X: ?: ?0 a/ G$ ~
- ;====================================================================================================
! R: P: D# w" b p - MACRO_SRAM_ENABLE .MACRO
o ]8 P1 T1 e+ A) I3 q - LDA #$803 T: ^' G. L" @0 d1 O& G
- STA MAPPER_REG_PRG_RAM_PROTECT: t) V, m% J6 [
- .ENDM
" h- E$ W) l& j% D# W - 7 E. `9 b; Y/ w& t1 d! @, N
- ;====================================================================================================
7 ~: ?$ Q K# t9 ~/ f% V- \ - MACRO_SWITCH_BANK_8000_A .MACRO
+ X; ]4 c9 b6 L6 j( F2 u - PHA( Y. P: A- {0 c3 B: \. u! g1 D: d
- LDA #$06
; G2 J" f( x3 K9 d - STA MAPPER_REG_BANK_CTRL
% T2 ]! G8 A4 [! L7 {% B1 v - PLA5 N# k; K6 }0 i3 W, e9 k- n
- STA MAPPER_REG_BANK_DATA
$ }/ [4 n v, t1 `1 p, L - .ENDM& [1 z+ F0 o( m/ o3 O! | T
- ( v, g/ K+ \9 h( w& i6 I# N+ _. P, k
- MACRO_SWITCH_BANK_A000_A .MACRO
6 n; E1 Q2 b. }: ^5 E5 Z - PHA
0 D- h. N1 m' O) W8 [3 P - LDA #$07& s1 ^- `! ? x+ y# {
- STA MAPPER_REG_BANK_CTRL
/ R$ q4 R: ~& v$ H! v1 J4 C- B - PLA% N4 `! y$ I2 c+ S1 B6 x# O
- STA MAPPER_REG_BANK_DATA/ T% Q" C7 k1 s2 V( I
- .ENDM
" S& M' ]; j x8 R -
5 x9 X4 {: e1 N3 `8 R - MACRO_SWITCH_BANK_C000_A .MACRO
* f3 k3 x6 n1 G - .ENDM5 q# i" s) ~- b! {/ f
- ' e# r# T5 w$ F2 L) c9 ~5 @" X
- MACRO_SWITCH_BANK_E000_A .MACRO, k0 I9 Z2 d5 t( `: [4 b/ I
- .ENDM
7 l! |5 f4 m; Z - 7 j0 \8 S* s& T1 m$ L
- ;====================================================================================================
8 A$ \4 o7 f* s( b2 A - MACRO_TRIGGER_FIRST_IRQ .MACRO2 t* A @, O0 V. A; }: q/ ~6 G
- LDA #IRQ_SCANLINE_BEGIN + 1) k7 ]6 K, |' N/ ?6 B$ {
- STA MAPPER_REG_IRQ_LATCH4 S6 Y9 E5 M& R/ G. _/ G
- STA MAPPER_REG_IRQ_RELOAD
) q( l R9 Q6 X: x8 J. o: f - STA MAPPER_REG_IRQ_ENABLE& ^* I) O# ^" K9 M# m0 g8 S
- CLI
: _4 r" j" g7 o" @# f- ]8 p. u - .ENDM
: S9 i* e* O8 W) ^0 V - 4 K1 r8 C" ~0 f
- ;====================================================================================================
0 S( \# Z- \: b1 m1 R: E; M - MACRO_ENABLE_IRQ .MACRO( o2 K3 t2 E! o$ x) Q- P
- STA MAPPER_REG_IRQ_ENABLE
; T& O$ [1 t+ {6 E - .ENDM9 b' g: v0 ?. A- w; T) Y
-
* K P! u0 @9 W7 d) h; v+ \/ W - ;====================================================================================================, q+ D* z) I; N% U* a. o, D
- MACRO_DISABLE_IRQ .MACRO
! I! V' n/ m: V - LDA #$007 ^% q* v# C/ d( M- x
- STA MAPPER_REG_IRQ_CTRL; X' g0 M, }; u3 j8 r
- STA MAPPER_REG_IRQ_ACK/ l! o" R' s0 Z7 e. @+ ?* K
- .ENDM( P- d7 ^$ V1 M
-
1 j2 n* F, s9 W2 h- d& L3 F. q* C - ;====================================================================================================9 r$ J" K& d" v9 K7 U+ W# h( E5 }
- MACRO_ACK_IRQ .MACRO
6 Y# l5 }: ~/ z2 R2 \ - STA MAPPER_REG_IRQ_DISABLE6 ]. c; h" d: o$ \3 ?! u
- STA MAPPER_REG_IRQ_ENABLE
% V" s/ v7 e& r, n$ _0 R/ g - .ENDM% v0 z' o1 c' O {, q" W" P
-
0 l- N8 u( y6 Z* @ - ;====================================================================================================
' e; O7 c5 v$ g2 i6 T - MACRO_IRQ_OPERATE .MACRO, Y" C# G1 Q; O+ e" D. K. u( _, J
- 9 ^" {4 V3 c* h- [9 {
- ;==================================================
. q) t* G0 x# y* O - ;IRQ滚动模式常量. ^5 k- E" e1 v1 M. J" \" L
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
6 [# u5 `# F, R. t: O6 o - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动# A" o( Q. V z9 n8 ?
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动6 U6 R/ x! g) H0 ^, O
- & s0 ~( P5 Y& v' `! L7 u9 @
- ;IRQ扫描线数据- }6 z9 D3 C9 r9 t) H4 E
- IRQ_Scanline_Data9 Z/ @ J# R) e, j8 k
- .DB IRQ_SCANLINE_1& H0 F3 z; o2 E, c$ }
- .DB IRQ_SCANLINE_2* N: e7 x" H* l& Q; C8 D
- .DB IRQ_SCANLINE_3
) D# v3 @$ |! i4 m6 C - .DW 00 ;关闭IRQ0 Z, B9 |8 h0 Y5 m; i _/ b
- * E/ A1 I3 T' W: [4 X# l+ }8 X
- ;IRQ滚动控制模式
* u2 e1 c/ f+ q% e( t- `' A: L - IRQ_Scanline_Mode
1 g, n' l( ]. Y4 i8 U n - .DB IRQ_SCROLL_MODE_RIGHT' Z3 z3 V+ V, U$ u7 p
- .DB IRQ_SCROLL_MODE_LEFT
8 e9 k/ V! z( h$ W" D S% ?' n" ^0 m - .DB IRQ_SCROLL_MODE_RIGHT
+ r' B- z6 M' s/ q% ^8 K - .DB IRQ_SCROLL_MODE_LEFT* p5 O1 f) u" s% V/ S8 x1 i( B$ r
7 V+ f+ [2 ?8 D7 t- ;==================================================
# x( E' S5 c! ~% o: X - ;;IRQ滚动控制
+ D) U7 ^2 m; w4 w - IRQ_Set_Scroll- _4 p! r. r4 a* g. w6 k
- LDX IRQ_Process_Index, P& B m3 ~& Q/ A7 e6 }
- LDA IRQ_Scanline_Mode,X5 g* S, W& \# c. x
- CMP #IRQ_SCROLL_MODE_LEFT
+ d8 ]' |4 M& m9 t p+ ]9 Q) U8 i E - BEQ IRQ_Set_Scroll_Left
7 c( M% K+ B( h, O/ m3 K - CMP #IRQ_SCROLL_MODE_RIGHT
$ `) z6 [2 R4 Q. _ - BEQ IRQ_Set_Scroll_Right
# D1 F, z- n' [1 x5 q& o* u9 k7 q/ e - IRQ_Set_Scroll_Zero;不滚动
, u$ d3 U4 v0 d( f, k7 @% S - LDA #$00
# K! S9 i5 G( x# d - STA PPU_SCROLL
6 n0 ]( b: N" R7 A! I3 u% P4 G( u - STA PPU_SCROLL
& P Z2 ^$ u# N5 D8 \ - RTS4 a* \0 Z1 ^8 V/ J$ t
- IRQ_Set_Scroll_Left;向左滚动+ n8 b' t) f5 Y( p8 s* f5 n
- LDA Scroll_H
+ s2 v' \) I* \+ K$ l2 i' N - STA PPU_SCROLL' S0 X% y4 Q; t; m
- STA PPU_SCROLL
+ |, K& ?( _9 E/ X* o - RTS& [# L' q3 w5 @% j
- IRQ_Set_Scroll_Right;向右滚动5 ^" u! n! q% Y+ }% a
- LDA #$00
I1 Y2 |+ w8 g- {! o+ K i/ Y - SEC
0 E3 @- ]2 i/ f, V& S& @1 g - SBC Scroll_H( O+ e% y* U! k! \0 I) t
- STA PPU_SCROLL
' O$ y7 n; v( @# p- a - STA PPU_SCROLL
; x$ `1 [+ y) i ]% \ - RTS9 G; d0 Z- |' t8 k3 |% r3 [
- . U7 X# z9 E$ o. s' D* F
- ;==================================================
' k6 X! k/ c& U0 v- S - ;;IRQ滚动控制# ]6 w' g* n' q& b$ |% t+ W) E" q
- IRQ_Set_Ctrl
6 W) M- O# M4 W1 |7 b' G W - LDX IRQ_Process_Index4 @$ m. D) c0 P8 _
- LDA IRQ_Scanline_Data,X2 N( V& r5 w, z. j
- BNE IRQ_Process_Latch P# z. h) p* O+ Z/ f5 v
- IRQ_Process_Disable;禁用IRQ2 ^: ~) A5 d, ~& Q; U
- STA MAPPER_REG_IRQ_DISABLE7 F) c: W8 p6 L! c; N" H
- STA IRQ_Process_Index
# _& S4 |' V8 q6 G9 K+ g - RTS. T: |9 b1 P) t9 w: ?! k
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线) F0 Z6 n6 P8 Q% z( s
- STA MAPPER_REG_IRQ_LATCH
0 J! I5 k) V) s, _" f - INC IRQ_Process_Index4 `% b& R% D7 k1 ^( b
- RTS% P0 T2 t' U0 N& y. E9 q
# j" h+ T( t' q( ?# W! R$ a- ;==================================================& K0 x# Q7 _4 A! B3 n
- ;IRQ处理6 Q" b/ A/ j8 Y/ t" D
- IRQ_Process_By_Index
0 N3 j/ a4 j2 ?' ~ - JSR IRQ_Set_Scroll, V1 Q& I q. F0 S
- JSR IRQ_Set_Ctrl
, w" `# }$ H6 s7 b - IRQ_Process_End
# v4 ]6 ^# N" f3 F - RTS9 V& c! u- e* s9 X) |& \: c( O2 [
- % P2 Z; T% M3 X1 Y' B$ c& c$ K) Q
- .ENDM6 e+ a$ H, x8 Y0 P- j
-
' x0 S$ J5 W5 o* _2 V! Q
复制代码 ; {/ A4 f4 y$ i, J* ]
/ g \, H% c j& ?
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|