|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
% \0 G. d5 Y1 O
! S' E# q8 q5 ^8 n( d本次IRQ研究了如下:7 u! @9 J8 o8 d6 v2 M$ ]1 e8 d$ L
VRC2&4(Mapper21,23,25)2 C3 E# b+ v( G$ L
VRC3(Mapper73)' L+ }7 X9 M! ?6 J4 n0 r( Z
VRC6(Mapper24 & Mapper26)
8 b5 N* V- t7 B hVRC7(Mapper85)
; O- G4 B# Z6 t+ G7 `$ h- n2 Q: d& yMMC3(Mapper4)
( F' U i) v, Y: i( LMMC4(Mapper10)
; U+ e$ V" e( ^* g& m' Y& H# i5 }MMC5(Mapper5)
2 O: o3 r, l& x2 g: tMapper18* s" z. H0 ~" {8 w6 I9 m; d
Mapper64# b* q3 B, Y- c# c6 }& ?$ ]7 Q# A* F
Namco163(Mapper19)* e2 e6 O, g A, `- i
Sunsoft FME-7(Mapper69) |+ Q% K6 v' W+ v6 i( l1 {6 J
, C' ~0 }1 U) L; p共计11种Mapper的IRQ操作使用例子: D6 t Z4 e& j4 g( ?+ G/ c
代码内有详细注释, 希望能帮助到感兴趣的人.
' \/ Y% w/ P! k- E3 e: Q) a* k: d4 j( Q7 V
  
) j5 W) C# T! G a# q
2 y6 T2 l3 z" MMapper代码主要逻辑(以MMC3为例):
5 P3 A! O" O1 [+ M
# I# E9 u; f* ~8 U- ;==================================================
( r& W P1 K4 @# _% S% \ - ;Mapper号
2 v" b! D! ^% c) w/ Y - MAPPER_NUMBER = 04
: D0 s. i2 ^# n0 u - ;==================================================- P9 G6 i% d8 D) d
- ;MMC3 (Mapper 4) 寄存器常量5 V1 c# V' ^) B9 @! ~+ ~
- MAPPER_REG_BANK_CTRL = $8000: P( c; z4 T2 A6 k1 H! z1 o6 T
- MAPPER_REG_BANK_DATA = $8001( o8 i7 m9 l& g, P) T
- MAPPER_REG_MIRRORING = $A000
. b$ C* A, p0 z8 a ~7 \# B - MAPPER_REG_PRG_RAM_PROTECT = $A001+ d1 M! L6 Z2 \" b- a
- MAPPER_REG_IRQ_LATCH = $C000. q# F# g$ \0 V# x$ ]% r, {
- MAPPER_REG_IRQ_RELOAD = $C001
7 ]# H8 x6 O. _ - MAPPER_REG_IRQ_DISABLE = $E000
5 W M3 u1 ^1 }+ _. A' P; Z1 L - MAPPER_REG_IRQ_ENABLE = $E0013 E0 a7 p) `9 _. p/ o3 l4 l
- ;==================================================2 t) `/ G1 A5 R% h; N! q6 N/ }
- IRQ_SCANLINE_BEGIN = 135+ d3 A( _8 T3 F$ M
- IRQ_SCANLINE_1 = 8
: \) i0 S9 j: N5 i6 l: | - IRQ_SCANLINE_2 = 54
5 \) M$ w% C! t1 \+ k x2 |. ~, ` - IRQ_SCANLINE_3 = 89 k% O+ J! c4 B7 L
- ;==================================================
- m2 P9 G7 x) b6 \. L: f3 M4 Q - 2 P- e% {2 R/ I1 D: i
- ;====================================================================================================
- q2 p" U" D, U* y2 b3 h/ y* z - ;宏常量
" g$ R0 H- N$ V* m; B - ;====================================================================================================
- z$ k- H& X! n: _# n - & ~4 S. N3 r8 a
- ;====================================================================================================( \) U g( I6 R7 I3 U O
- MACRO_MAPPER_INIT .MACRO
' i) O1 p1 `7 W8 Q! f - ;禁用IRQ6 f9 _5 I$ R+ j, _5 M5 U
- STA MAPPER_REG_IRQ_DISABLE7 Y; C2 q" p4 ?* @# Y% w. j
-
, g/ X- w: J/ b- r8 v, u& V5 z/ C - ;水平镜像
# [! c! [& n! D8 _( |: M - LDA #$017 S' J4 W" s. N( u2 ^7 ?
- STA MAPPER_REG_MIRRORING
! x8 C* D) y# o" j! Z; C) n$ }, I -
* `+ M5 g; P7 E/ [ - ;初始化图形bank, X# e F1 F+ d: S& l$ [
- LDX #$05
, A- R: ]* v L' n - .Init_Chr_Bank1 j6 V/ @1 s1 \; c
- STX MAPPER_REG_BANK_CTRL6 C& `0 V# z( ~: B( x1 N* i
- LDA .ChrBankData,X# j. w( O9 ^- ~* Z) A
- STA MAPPER_REG_BANK_DATA: K5 v; ^$ w H
- DEX: J% z: [2 ^ Y1 X. V7 C
- BPL .Init_Chr_Bank
& `4 ^1 L0 b4 ` - JMP .Init_Chr_Bank_End
9 m9 ?" W7 t1 u8 i5 q - .ChrBankData
1 {3 w7 ]7 [ N, ~9 }' _ - .DB $00,$02,$04,$05,$06,$076 ~0 P+ Y6 `! Q' c
- .Init_Chr_Bank_End0 D p# A* p1 z
-
* b$ _1 @9 C8 F$ h2 _% m - ;启用SRAM) E$ V# b& j8 i" V. k8 A2 r: P
- LDA #$80: g2 r7 P7 c0 Y$ e
- STA MAPPER_REG_PRG_RAM_PROTECT. }$ \! u8 [* W6 ?/ T* A& h
- .ENDM
" O! I ?: D S2 F4 p& F, d- I
' n# {; I1 ?' {2 L8 a- ;====================================================================================================6 y, {) a( |) e8 N$ ]
- MACRO_MAPPER_SOUND_CLEAR .MACRO
$ \7 I- n4 k6 R: p9 s' j+ v - .ENDM
3 W2 |8 b, |- b( } - ' f7 b/ _; y4 F& D
- ;====================================================================================================
, d0 p2 a* L& A/ S, x - MACRO_SRAM_ENABLE .MACRO" P0 W0 _" C0 S
- LDA #$80
' U3 S& z+ C% o! W1 W/ f* h* g - STA MAPPER_REG_PRG_RAM_PROTECT
" o6 w4 i4 P- p# E% a/ U - .ENDM" E( \: d; a0 C0 } Q, Q
- $ |2 B5 ~5 L: {* d9 I8 w
- ;====================================================================================================
5 ~6 i9 ]6 `9 ^3 g9 [ - MACRO_SWITCH_BANK_8000_A .MACRO: z: n! {! f! y3 H9 Y
- PHA
6 \1 S. _* u& B6 x. z - LDA #$06
& _& [, U9 x9 b& P# r9 k - STA MAPPER_REG_BANK_CTRL& S9 a) C, ^" V3 B4 r
- PLA; c8 i( x+ G2 C, V( a4 A8 Z F' I1 |
- STA MAPPER_REG_BANK_DATA, M I1 r. j) G% F; k
- .ENDM
; G' V- [" ~6 ]& [: Z
& o+ ?& b: `3 o( c, ~& T- MACRO_SWITCH_BANK_A000_A .MACRO( @# Q( P% X. I c4 \1 o
- PHA: R) q; W- P' |2 P& e2 t
- LDA #$07
; Q% ^9 B9 e( ]9 n( \7 i$ ` - STA MAPPER_REG_BANK_CTRL
4 ^# j) o) V2 E! y4 R - PLA
- ]1 S9 ^1 B1 }: z8 A; q3 C, U$ D - STA MAPPER_REG_BANK_DATA
# d5 m" g" C) { - .ENDM
' h$ j/ g0 y6 Y0 K6 Y - 0 K& t& H/ I/ V: S: G/ z
- MACRO_SWITCH_BANK_C000_A .MACRO; n) Y# ?6 N; g
- .ENDM
+ j' F1 `7 N# x1 s) W) K
" A8 B# k9 X5 t/ v5 U- MACRO_SWITCH_BANK_E000_A .MACRO
0 L- D. f" N9 G - .ENDM6 x/ l+ |+ i5 D2 r+ c9 V7 L. e
) n* ]& D% v( ^, d/ m; k- ;====================================================================================================" V4 Q1 \: O4 \- ~
- MACRO_TRIGGER_FIRST_IRQ .MACRO
! j# n/ E, g" P$ R) M: W0 l) x5 V - LDA #IRQ_SCANLINE_BEGIN + 1
: x$ P9 z% [& [1 S# Y - STA MAPPER_REG_IRQ_LATCH2 V1 |& V) `" o3 C! d4 B/ G
- STA MAPPER_REG_IRQ_RELOAD/ w- Q0 I7 G9 s
- STA MAPPER_REG_IRQ_ENABLE
8 T7 U8 x# o. N - CLI4 V; X2 D$ B* N+ ?$ L1 P. G7 v6 ~
- .ENDM6 k% R2 [" P( [, G0 A0 g; F
-
* g; H1 C4 n2 a) n/ A$ A - ;====================================================================================================7 I0 {) O0 A8 t5 M: v$ u
- MACRO_ENABLE_IRQ .MACRO
6 E% L6 B2 a) j | - STA MAPPER_REG_IRQ_ENABLE7 p6 ^. h5 p L, V+ r
- .ENDM
* O- }: t6 m# t: w2 b/ D* x -
! c" n& {7 d) O( e - ;==================================================================================================== _: F% K. z5 B
- MACRO_DISABLE_IRQ .MACRO1 k& w# H- |$ S. F% y
- LDA #$00
6 e1 f8 q$ N% m: C - STA MAPPER_REG_IRQ_CTRL! Q/ M$ h+ |0 w& p3 e: ]- T0 `0 }
- STA MAPPER_REG_IRQ_ACK, p, |: f! O# g2 J6 D* ?
- .ENDM$ V2 T) Z/ q: s8 e R4 }% L! ?6 {5 ?
- 6 r" [" O& ^" @4 U# }
- ;====================================================================================================( b+ l0 v, R+ t3 q( p4 z" h
- MACRO_ACK_IRQ .MACRO8 V" p. i P# r2 g* V2 f; p9 a
- STA MAPPER_REG_IRQ_DISABLE$ _' Y- p% s% ]4 L9 ^+ b8 d: d0 _
- STA MAPPER_REG_IRQ_ENABLE
- P# {9 I' M4 o* A* u4 P6 Z9 \ - .ENDM
1 Y- {9 b9 ]: S5 D% `' U5 d - ( s% |9 O4 l" F( t
- ;====================================================================================================8 {/ [% d' ^; }. v& \! j4 \- O
- MACRO_IRQ_OPERATE .MACRO
/ p, d) ^( l2 d: v( I6 i8 J( l1 Y - 6 H- Z" ^: m F5 [' O
- ;==================================================! r1 f/ Y) t( [+ {$ k" G
- ;IRQ滚动模式常量! i+ G6 `9 g) A8 {- q2 J0 w) o8 H, S
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动/ X& E z: R2 U8 C$ Z# p& @! z
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动' X/ E) z, u; P( P' G; F# X0 ~% _" G
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动/ ], u# I$ M8 m6 I
" \& C, ^7 v- l+ t" i- ;IRQ扫描线数据: @4 o$ S3 A( j& |) L& ^& J t9 O1 P
- IRQ_Scanline_Data
" }; V/ I' L4 P" D3 v - .DB IRQ_SCANLINE_18 B5 @5 D' d+ }
- .DB IRQ_SCANLINE_2
* w. w& G/ ~ ]# a - .DB IRQ_SCANLINE_3; ]- H8 O3 w! U: V9 J
- .DW 00 ;关闭IRQ
* i! }4 ^$ K% e6 L/ K
/ C& ^, y# L- T# g& q- ;IRQ滚动控制模式& r L1 Z Y) |4 n$ J& Y1 ]+ I% t1 f# H
- IRQ_Scanline_Mode
" y* o6 X* @6 F- ~ - .DB IRQ_SCROLL_MODE_RIGHT
/ |4 U- \/ A* G# U/ i9 U p - .DB IRQ_SCROLL_MODE_LEFT
2 o6 R- r D) J8 \, t/ U - .DB IRQ_SCROLL_MODE_RIGHT1 `/ [* y4 c. D8 t. x1 \8 g, _
- .DB IRQ_SCROLL_MODE_LEFT
6 G% b3 k1 Q$ _' j0 p$ H f
3 ], \! h( Y; x, T- ;==================================================
" V ]/ n: w) l3 ~ - ;;IRQ滚动控制
\- M( D& q d0 J) m - IRQ_Set_Scroll9 ]1 d9 m' N8 `( a* k
- LDX IRQ_Process_Index
- L2 l3 C" v1 R6 k - LDA IRQ_Scanline_Mode,X
* d4 E( k7 I/ Z4 A7 i6 d) s - CMP #IRQ_SCROLL_MODE_LEFT
6 [2 C: o+ M2 g0 O. B - BEQ IRQ_Set_Scroll_Left
7 t( j+ a" _5 m% E - CMP #IRQ_SCROLL_MODE_RIGHT/ L. T) [9 F3 ^+ q( p
- BEQ IRQ_Set_Scroll_Right
! A0 ^2 j: m$ c" R; ? - IRQ_Set_Scroll_Zero;不滚动6 k5 D* s/ x+ r; ?+ l
- LDA #$00
( ?% s& ~- w; _- e+ u' I - STA PPU_SCROLL
+ O& E) G& g V - STA PPU_SCROLL5 h# V; h& j9 R! r, F- }
- RTS
+ |7 ]" c: g" I4 ]% X - IRQ_Set_Scroll_Left;向左滚动) l$ }/ _9 H8 L7 l* \
- LDA Scroll_H
/ [: \) ^& X9 l. R - STA PPU_SCROLL
! z$ v& G1 B4 j - STA PPU_SCROLL
! E, L0 Y; O1 B/ L2 o - RTS
+ U" _' I% `( H5 A4 q - IRQ_Set_Scroll_Right;向右滚动
9 R/ r- y0 J; _" r$ }9 O; O' V# u - LDA #$00
; T0 O5 ?0 l5 }9 _. P% v, o - SEC6 x3 m% `; A- u' e
- SBC Scroll_H6 [$ k% z+ d' p2 [. x4 j, Z
- STA PPU_SCROLL5 d+ k9 S# e/ V
- STA PPU_SCROLL* f/ [+ w* R/ u, f$ x
- RTS
' T: g D- }6 R; J - : x/ ` ]! E' K2 W' N# p- ?
- ;==================================================% i/ j0 U7 K9 x! m! f! }+ m0 c5 v
- ;;IRQ滚动控制
0 t2 Q2 H3 R1 L _ _! K" U* ? - IRQ_Set_Ctrl
$ F3 y2 m. B7 V3 q! h* Q - LDX IRQ_Process_Index6 I. I9 y# }4 C2 p W
- LDA IRQ_Scanline_Data,X
1 G6 K$ @1 A) z& X* h - BNE IRQ_Process_Latch
, k. ?7 i& a. G" d' _3 B - IRQ_Process_Disable;禁用IRQ& x1 `. V6 F! u
- STA MAPPER_REG_IRQ_DISABLE; w* u: m- O: ?
- STA IRQ_Process_Index
: }# H: J5 K. n8 f4 B+ X - RTS
Y7 ^+ B- O# v' G/ n E - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
$ {% t, U9 K4 g5 M& y - STA MAPPER_REG_IRQ_LATCH4 A3 y; O+ o1 N, f
- INC IRQ_Process_Index# ?) @0 Z% x$ V5 W# v+ n
- RTS
1 F5 Y" N6 Y" V: [( g! n9 [1 F - / n0 w( x2 Y- h
- ;==================================================
8 R1 a4 a: l l! y - ;IRQ处理; i# ?$ A9 o+ I
- IRQ_Process_By_Index. a7 H* n1 |% o& W% F
- JSR IRQ_Set_Scroll8 i& c( R. Q$ A1 \
- JSR IRQ_Set_Ctrl
& p4 N4 ?# o4 S) x4 m! H - IRQ_Process_End
' K9 n9 p+ y: [. {. \$ @ - RTS
3 @' D8 W6 _0 ] - * s, y7 H7 q* _8 }
- .ENDM! e5 V) n- |' b6 g' ^9 M
-
6 z, `0 I, s6 G9 X
复制代码 & R' ^+ L& X! M! W7 K0 z
( C$ I& U7 O' L* f# z2 n代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|