|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
- q- E& j8 }' @7 D: V# ^2 ]. w& c; @: s$ S
本次IRQ研究了如下:2 y# `; h; s$ @. K' v0 B: B
VRC2&4(Mapper21,23,25)
) `( ~7 i3 S- JVRC3(Mapper73) J2 k) G/ x( a2 N) O& C" X
VRC6(Mapper24 & Mapper26)& n, k" Z; b, P. p1 J
VRC7(Mapper85)" V, R. y" G0 k" |& c# T9 L0 T q
MMC3(Mapper4)
I; h" E7 s4 g4 `7 [" \MMC4(Mapper10)! h( e9 `: d. y' _, z+ T4 }3 L5 n
MMC5(Mapper5)! s T; I1 G5 Z- J7 V
Mapper180 W R. n6 O6 q3 Z* C) a4 z
Mapper64
+ U$ T/ H. W F# J$ z. p+ p' e/ QNamco163(Mapper19)
* `( e8 O- p U% w5 e+ t: u2 ESunsoft FME-7(Mapper69)
. R1 L( R) E0 W/ v
0 @1 W2 I- S) @" ~" b4 a共计11种Mapper的IRQ操作使用例子$ O7 O$ i e X9 H4 u6 b
代码内有详细注释, 希望能帮助到感兴趣的人. w6 _& q" Q$ o7 T: H
( r8 }$ f) o) N5 A! q1 f
  
* v9 \0 f$ N7 j9 o5 m- w/ C: ]8 u$ z: D
Mapper代码主要逻辑(以MMC3为例):
% {9 f) J% |; Y2 w" D7 U, Q- : O# p& B( M& P
- ;==================================================
2 B8 l0 ^$ @# [5 Y# s" r - ;Mapper号
k; _6 q9 L3 _" p4 ? - MAPPER_NUMBER = 04
# v1 U- J. k$ u$ e - ;==================================================* f9 v3 s! ]1 J. }0 Q5 h
- ;MMC3 (Mapper 4) 寄存器常量 T& M; T- i: k: `. d* x
- MAPPER_REG_BANK_CTRL = $8000- T) ^% `+ ~! j5 O
- MAPPER_REG_BANK_DATA = $8001
/ L3 n( E+ S8 _: V4 m* j - MAPPER_REG_MIRRORING = $A0005 K, `& J' Y- w) Q. [4 H
- MAPPER_REG_PRG_RAM_PROTECT = $A001
6 Y R. k4 W8 K - MAPPER_REG_IRQ_LATCH = $C000# Y7 L; [! c K" Q* r+ h
- MAPPER_REG_IRQ_RELOAD = $C001
- @! W8 v1 J1 M% o! Q8 u - MAPPER_REG_IRQ_DISABLE = $E000
1 p! s# V" r; A/ v - MAPPER_REG_IRQ_ENABLE = $E001) O% c2 \8 G8 j5 _- {6 Y
- ;==================================================( n0 o; r9 o+ W, G2 D1 w3 r2 s
- IRQ_SCANLINE_BEGIN = 135
C v2 A' _7 s; u f - IRQ_SCANLINE_1 = 8
9 I+ l" `' W! a. z \ - IRQ_SCANLINE_2 = 54
5 k* a* _- E! `( b' n - IRQ_SCANLINE_3 = 8
# T" s4 b. j* Z2 R8 W - ;==================================================3 t5 @2 v1 `$ P3 H& X
- ; q( [( X; f/ R. D2 q
- ;====================================================================================================1 o. Z1 p( |" r+ Y2 C# v2 m
- ;宏常量
! Q# j0 \2 [: ~0 d& V - ;====================================================================================================* Y4 Y* |5 C' A
- ; J% I% |+ j; j2 E' ^. a
- ;====================================================================================================
" E5 h5 D( {3 o' A( S, x4 e - MACRO_MAPPER_INIT .MACRO
1 Q* k6 C& g& U4 f) G - ;禁用IRQ
) Y% b- ]5 P+ ]5 @9 T( j( d5 [. p - STA MAPPER_REG_IRQ_DISABLE
: k- P+ B% E3 j" b5 X% t -
1 y( V7 R6 [' G8 p* f4 W% |- [0 \, f - ;水平镜像
, s0 I3 G0 p" g) ` - LDA #$01
1 H; d6 @) q2 `' P5 I - STA MAPPER_REG_MIRRORING1 R- z) E8 v" \
- ! f4 E% L# X. M; W6 Q# z- t& w! L
- ;初始化图形bank7 {8 ?2 x, x1 F: @9 @
- LDX #$05- G3 I- Y3 L) c/ f% Q
- .Init_Chr_Bank2 p; `; v. u" n) H" M0 g! `
- STX MAPPER_REG_BANK_CTRL
- p) g7 t" a& `* \ - LDA .ChrBankData,X
% A" I: |6 N! s5 W - STA MAPPER_REG_BANK_DATA
" Z% A2 h1 B3 w6 x0 q/ o - DEX' q. Y$ ?. E- f1 G
- BPL .Init_Chr_Bank
: x- Y0 }) w l1 r' H. ]% D& A - JMP .Init_Chr_Bank_End7 K4 t% l9 L3 t7 ~. s! l
- .ChrBankData7 M1 C. ~( i! d
- .DB $00,$02,$04,$05,$06,$07$ f4 X8 B$ j7 H0 V# r; p
- .Init_Chr_Bank_End
2 q8 D# f6 P T4 v8 { a -
7 m) G2 ~1 j8 u" E, c - ;启用SRAM
$ B2 v3 W2 ^/ h - LDA #$80- v' x- a7 A+ C) _
- STA MAPPER_REG_PRG_RAM_PROTECT
; w* a) A: ^9 r1 P/ m% D - .ENDM2 G) i( _4 ^. g, M5 b
- & n7 F7 ? |9 s7 s: Z$ r
- ;====================================================================================================9 \/ n) r0 p9 N
- MACRO_MAPPER_SOUND_CLEAR .MACRO
0 {$ h9 O( B+ r9 w - .ENDM( q: F% V7 x* z
-
2 z7 _ h1 h9 T - ;====================================================================================================
, Q* r$ L6 {' S: c2 j! D0 O' B* w' n, ~ - MACRO_SRAM_ENABLE .MACRO
; V8 I: h' G8 c+ c+ [5 ^ - LDA #$80: a0 p, M, l- F: K. H6 Y
- STA MAPPER_REG_PRG_RAM_PROTECT
h: b5 y- u; P* r& G - .ENDM0 ^; r( C ~8 v% @/ \( Q( j& U, i! r1 w
- - g/ o7 ]& k$ [ H9 s2 \
- ;====================================================================================================7 _/ _7 Y2 b5 ^/ |& a+ @
- MACRO_SWITCH_BANK_8000_A .MACRO
# e- V$ C/ s! Y1 g j - PHA
# X. S0 n4 a4 Y - LDA #$06
. L' a5 |. `1 A5 e - STA MAPPER_REG_BANK_CTRL
. E f& v2 I1 }( o% t - PLA
6 J* z# `5 b5 Y# d( X8 m - STA MAPPER_REG_BANK_DATA$ [$ h; \; ~9 Y! a+ [0 Y& O
- .ENDM
1 [- J$ Q v5 m3 `6 D$ H - ; y p0 Y% C; B5 c4 z# E
- MACRO_SWITCH_BANK_A000_A .MACRO" R2 Q J& M2 U
- PHA
2 q0 p! w; ?3 ~ @& v) m9 U4 v - LDA #$07
$ b$ o- S! O0 J4 M - STA MAPPER_REG_BANK_CTRL5 N2 I$ ?* m/ v h X, X7 @8 ?
- PLA
( R- W- F5 z/ u+ `' l0 q - STA MAPPER_REG_BANK_DATA3 m# e5 t, V. `+ E
- .ENDM+ @; |* t! L% r6 H( R4 d* b0 B
-
# A$ L) x2 o% ~2 d2 ^# Z0 ] - MACRO_SWITCH_BANK_C000_A .MACRO5 Y/ _1 s7 w+ S5 v
- .ENDM. w1 i, Q2 J# i/ N% x5 h( z
- " l5 ]( \5 T( V8 {) R) n. c
- MACRO_SWITCH_BANK_E000_A .MACRO
/ a4 d }, ]9 T% U( V4 o5 D3 b - .ENDM# s, ~! V3 H5 D7 e1 [& f2 t
4 A8 w( Q3 ]# r3 U! r7 L' Q$ V- ;====================================================================================================# ]* A) h7 X, }: i
- MACRO_TRIGGER_FIRST_IRQ .MACRO
2 {/ Y3 c2 o; O5 j! G- p - LDA #IRQ_SCANLINE_BEGIN + 1% o7 h; ]; A: v+ }* Z. C0 j3 \
- STA MAPPER_REG_IRQ_LATCH
0 m5 p% V H- b$ H$ b% q - STA MAPPER_REG_IRQ_RELOAD; e. v# G) m2 \
- STA MAPPER_REG_IRQ_ENABLE
$ i5 C6 }" B5 ?, C' y9 A - CLI
6 U' x( Z8 E! P: u - .ENDM& X+ y. E9 G3 i& u
-
' Q3 f/ Y1 I. O% S' ` - ;====================================================================================================
" S* Q! g+ r1 W5 P% E - MACRO_ENABLE_IRQ .MACRO9 L' W5 R- {# T" n$ [, }) x) D
- STA MAPPER_REG_IRQ_ENABLE. I" \" o9 Z) Z, b8 ?
- .ENDM) J3 T3 j- s4 p& U8 Q0 g& {
- 0 m7 ^' w* a8 U! }
- ;====================================================================================================
# w$ @- h& }; z) H6 d; C/ T, I M - MACRO_DISABLE_IRQ .MACRO
& P7 L' I$ }. l: X! t3 O - LDA #$00
5 A5 t3 e7 U% @ - STA MAPPER_REG_IRQ_CTRL
7 c, n" u7 r/ w7 ` `8 s: ] - STA MAPPER_REG_IRQ_ACK! S% P( X e- @* a+ S" e
- .ENDM8 v% }3 J. D) \
-
/ L1 A. i# X0 k# y/ Z& c - ;====================================================================================================
h3 b. [! W& i8 b2 j( {8 @ - MACRO_ACK_IRQ .MACRO- c. G7 t D0 v {, i7 m
- STA MAPPER_REG_IRQ_DISABLE: W: y' L) v# Q) _4 x- n% L1 Z6 @/ g
- STA MAPPER_REG_IRQ_ENABLE
[: `) K4 ?) }: m - .ENDM; X c7 e6 i# f- j1 \' b, j
-
, h$ P; l! O5 c7 h( M - ;====================================================================================================( Q9 ~; |% t/ |! q" Z
- MACRO_IRQ_OPERATE .MACRO
1 x1 q5 q* K7 R$ B+ O9 b9 u - 7 Q2 E* t9 K' S, j4 d( b2 R+ j# f/ [
- ;==================================================0 ^' C$ a' H5 I3 z& y# ^
- ;IRQ滚动模式常量5 |/ {2 K, Q1 f. h( ^8 i3 Y
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动- ]3 M7 ^) D2 `* U# `$ l; C* z
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动% q; x$ c' g& T
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动6 N+ F& U+ z8 u6 Y5 v! k) Q( y
- - v: L5 K- L; ]2 n
- ;IRQ扫描线数据
" f. H% m: ?8 \6 _, R9 f; { - IRQ_Scanline_Data
' d: }# ]+ L7 F8 S* ` - .DB IRQ_SCANLINE_12 i9 V% f, ]5 h' l- n
- .DB IRQ_SCANLINE_26 O: ~: e, P4 k1 j3 c
- .DB IRQ_SCANLINE_35 H! x# f! m. Z* l6 }
- .DW 00 ;关闭IRQ
% ^: }, H$ j1 u- c; Q: Z4 e - 9 T2 T8 ]0 i! |! g
- ;IRQ滚动控制模式' D/ M8 h4 H" Z, P
- IRQ_Scanline_Mode
% c" i. A* t. F; K' V) K - .DB IRQ_SCROLL_MODE_RIGHT7 o8 D! l' _% r8 P! i
- .DB IRQ_SCROLL_MODE_LEFT) [5 Y4 Q- h. ~2 g' @2 I1 ]' `
- .DB IRQ_SCROLL_MODE_RIGHT
) C! @: J9 w1 Y, X - .DB IRQ_SCROLL_MODE_LEFT2 ?( k% T( W) s @
! ~0 ]6 }) k2 ^ P- T5 \- ;==================================================6 D" i( \3 p+ o" m9 c3 Y
- ;;IRQ滚动控制/ v% {1 V2 [+ r
- IRQ_Set_Scroll+ H% j& H% G+ p. A M
- LDX IRQ_Process_Index/ H- W5 `/ |! k7 M; S6 L7 s
- LDA IRQ_Scanline_Mode,X
# p% R" d) J) e) \8 G8 W - CMP #IRQ_SCROLL_MODE_LEFT7 H7 S" a9 ^- M7 M
- BEQ IRQ_Set_Scroll_Left2 Z& R7 d/ r9 x: t2 U6 _) G/ b+ c
- CMP #IRQ_SCROLL_MODE_RIGHT
0 ?* a5 U0 l! S; v N% _( i) n5 x - BEQ IRQ_Set_Scroll_Right
* O# i: }& s- M( R& [- a - IRQ_Set_Scroll_Zero;不滚动 k% y; a( T& f8 S5 W s
- LDA #$000 v; k$ i4 K7 B6 S+ M: c
- STA PPU_SCROLL
( z2 c# h% h6 Y/ G1 j2 Y7 C5 ~ - STA PPU_SCROLL
! n* X7 _9 j+ n m3 w$ D - RTS
$ e( [9 z, M! O; X+ b2 O" O0 I: E - IRQ_Set_Scroll_Left;向左滚动
. U; y K- f- S - LDA Scroll_H
1 D4 y: s( f. V+ F! y& K$ u - STA PPU_SCROLL' }' G8 g, \( n" z9 M- s
- STA PPU_SCROLL
. w" r$ v; k. X b& J3 W. C; q - RTS
0 B2 T [$ y7 N1 Y1 ~3 R. {5 a j - IRQ_Set_Scroll_Right;向右滚动
" m7 ~1 ?) O. n2 q! J - LDA #$00
- m+ U' V& d9 I1 w- o& B: A - SEC2 g4 y% B" ^+ n) p0 E8 b9 ` ?
- SBC Scroll_H1 e$ u+ E/ H7 J, ^- ~2 i
- STA PPU_SCROLL
& P* g1 Z. l% f4 n! H6 { - STA PPU_SCROLL( l1 B% _9 R( H' K0 d1 h% L0 x
- RTS) m6 C: u1 h& A/ k1 q( B
-
/ \% @% Z9 _0 i, `+ _ H - ;==================================================8 [/ c0 K# Z, V8 `9 v
- ;;IRQ滚动控制: U* e: U3 H0 g/ p3 Y
- IRQ_Set_Ctrl
4 C8 b( l7 z0 O: E* w6 s9 o - LDX IRQ_Process_Index D1 }( k. V+ @. t t6 R: w3 ^! g
- LDA IRQ_Scanline_Data,X6 v6 S' M$ D. |; l& [2 i
- BNE IRQ_Process_Latch
) q# v5 D* g( Z8 O5 Z - IRQ_Process_Disable;禁用IRQ3 j0 B, n. k/ v( ]/ w. N
- STA MAPPER_REG_IRQ_DISABLE* a+ a+ I" Y: S, J8 b+ f
- STA IRQ_Process_Index3 ^3 }5 D. J, c) k
- RTS: e+ c) v$ ^. T- [$ e7 _' d2 |
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线) A+ _7 F1 \" N) t5 W2 T
- STA MAPPER_REG_IRQ_LATCH) v; H4 J0 S. h; b
- INC IRQ_Process_Index
+ D- Q/ q( S# i ]' I6 a. W - RTS
: s; d& B! t: L# Y - 3 Y0 ~6 B7 s& M8 z/ N: E
- ;==================================================
" P7 O/ p2 C; V2 M2 \ - ;IRQ处理: h. v' M/ s ?3 R' `
- IRQ_Process_By_Index' w" c1 H. I( t" y
- JSR IRQ_Set_Scroll
6 @3 a8 f4 J9 B- M1 g - JSR IRQ_Set_Ctrl+ o4 o. ~* ]3 ^, T
- IRQ_Process_End* j2 P% u H ?4 p; H3 V
- RTS" V _, B/ Q5 h3 B2 v- ~( Q, a
- 9 a8 W0 M& _" w* p
- .ENDM
" J2 Q" q" d8 `9 D -
: L, \& ^% Q5 |1 B' E# B9 t- i
复制代码 + x& U: D4 q. E3 a8 H7 X
' `$ ?! y) z0 I' s1 H7 ~
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|