|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
1 I! k8 i9 S1 L# |5 o
8 [* D& j$ w4 @4 I4 U8 ]7 ]本次IRQ研究了如下:. b1 N1 S( S, Z( o& F! [* y
VRC2&4(Mapper21,23,25)7 {( ~/ N; u( s: T
VRC3(Mapper73)
: Z, V1 p2 Z8 p, d, eVRC6(Mapper24 & Mapper26)
" u# V5 s; F3 P- s1 jVRC7(Mapper85)& b2 F" ]* t$ ]' @ m. I: v Y
MMC3(Mapper4)
4 K @' P7 q& M7 |7 [! f+ r/ y6 i! t3 oMMC4(Mapper10)! ]/ b$ K( N1 i7 G
MMC5(Mapper5)4 c) x ?. L: Y, {
Mapper183 k6 w! ]9 Q. l
Mapper641 Y/ k6 u$ L) f0 a( u
Namco163(Mapper19)/ v7 W: o! {7 Q
Sunsoft FME-7(Mapper69)/ J4 E0 F5 D# H- p
% X0 y. X- r1 K4 U& f共计11种Mapper的IRQ操作使用例子* @. n* f7 |6 B( w7 ]
代码内有详细注释, 希望能帮助到感兴趣的人.4 X Y; T, M) y7 l% x! I2 Q8 F& B/ \
C4 ^9 u5 z# F. a7 |  
; f0 U5 P U- i" E: D& {8 V6 K3 D0 _; @) R
Mapper代码主要逻辑(以MMC3为例):, J6 A# L8 B/ w2 d4 c3 c
- . R5 d% r. z# Q) ~" C
- ;==================================================
7 Y% Q, n5 i) W- l6 w- j9 l - ;Mapper号
: V$ K1 h+ q+ K+ c - MAPPER_NUMBER = 04
! P, V/ Z& C; Z4 N G: g1 s - ;==================================================7 Q* m6 b' u0 C+ e3 ~
- ;MMC3 (Mapper 4) 寄存器常量) j$ [) Z, o/ B9 s) W' r
- MAPPER_REG_BANK_CTRL = $8000% Q% O7 \0 R! e. J1 `
- MAPPER_REG_BANK_DATA = $8001
% f* p- K6 u' [, Y - MAPPER_REG_MIRRORING = $A000, D$ N) ]' P4 h2 q
- MAPPER_REG_PRG_RAM_PROTECT = $A001
2 e3 y; a- Z( H1 x$ r# N - MAPPER_REG_IRQ_LATCH = $C000
( o- y7 ?1 m* s8 \, H2 L - MAPPER_REG_IRQ_RELOAD = $C001; I9 {9 m; O3 `# B: n
- MAPPER_REG_IRQ_DISABLE = $E000+ e8 d6 C; z/ O$ ]) T# R) m2 g
- MAPPER_REG_IRQ_ENABLE = $E001% b4 @. a8 f( D) B* C5 Y
- ;==================================================
% p1 _- Q( l; B - IRQ_SCANLINE_BEGIN = 135; J& _) I( k) J* z1 @/ w4 e
- IRQ_SCANLINE_1 = 87 R/ ?! d& S/ c3 I0 }7 O& p
- IRQ_SCANLINE_2 = 54
* Y$ S0 v6 C/ q+ U) Z - IRQ_SCANLINE_3 = 8
2 y* ~+ Q [/ E5 t - ;==================================================
- y3 A9 I y5 ?5 W2 x e* X! r4 e% ?
# G7 H$ h3 a9 t+ F; a* w. y- ;====================================================================================================4 T9 N& K6 s2 o' B6 c) C5 H
- ;宏常量3 }' a$ e6 v4 s
- ;==================================================================================================== h: L; F- O; v7 |
: `, r, q- q! q' `7 Q9 ~. l7 X- ;====================================================================================================
& c( K( b2 [0 U n/ Z1 g# u% f - MACRO_MAPPER_INIT .MACRO7 ]1 j! a4 d! ~- w' D" J V* K
- ;禁用IRQ$ ?5 p; }& m I# D+ u; r! t& w: k/ }6 r
- STA MAPPER_REG_IRQ_DISABLE
$ E; ~# t8 }9 o# R - & T+ B: t& `, C1 f9 a, N
- ;水平镜像2 M- L" W& @2 U
- LDA #$01
# t; c7 T; [: y9 y - STA MAPPER_REG_MIRRORING' p: ~9 ]( P: [) U4 n# T; S( B: M
- 7 F1 q6 Y3 N3 a; A" g& l
- ;初始化图形bank
. ~9 j7 i2 Z1 v6 A. p - LDX #$05# r1 G* t! F2 F: R/ v! u
- .Init_Chr_Bank! Q: F! C% @. {
- STX MAPPER_REG_BANK_CTRL. B, u' Y- g c7 Q/ \) T7 _
- LDA .ChrBankData,X
$ |) x* s3 M/ @# Z* }5 T$ k - STA MAPPER_REG_BANK_DATA0 M6 o$ z; U3 k: C& g
- DEX2 }7 P, |- M1 t) }0 ?1 y. T
- BPL .Init_Chr_Bank i' i1 j7 y; O4 ~4 |- {+ C! [8 ^
- JMP .Init_Chr_Bank_End
' u, [# ?7 f" a/ Q( g+ \& P9 p; | - .ChrBankData
' u/ D3 ^. D4 E5 J+ P$ d' M; n - .DB $00,$02,$04,$05,$06,$07! w$ Y& ?; T$ Q: r* h
- .Init_Chr_Bank_End
( I8 M! f5 p/ s9 _ -
0 H1 p g) V6 ~ w2 d) l - ;启用SRAM S5 u: O7 L9 F% ~, u' ]9 }- ?
- LDA #$804 d- P; M u. H/ H) E
- STA MAPPER_REG_PRG_RAM_PROTECT* x7 j- \- x4 c6 G3 P
- .ENDM
+ t" P# G. B- G5 x) Y4 ^% n1 a$ `
. ]4 y9 A. b+ W) v& S- ;====================================================================================================% {7 k' R/ p0 u) N8 J% z
- MACRO_MAPPER_SOUND_CLEAR .MACRO
$ u: w" r# u9 f6 h - .ENDM- f3 P4 R/ P0 ` A) q0 x t: y" ~: y
-
$ w4 x% a" Y/ R' ?# V( @ - ;====================================================================================================6 @! L8 w# k) y* S! A
- MACRO_SRAM_ENABLE .MACRO
/ C2 O: C$ A7 O, X( t" `' U% Z5 d/ T - LDA #$80
) B' x! K" i/ [8 S, \: P' G2 S4 ? - STA MAPPER_REG_PRG_RAM_PROTECT0 F* f5 q, c ~8 \ Q7 C) i0 b
- .ENDM j. d: B' ?4 u7 E0 L
-
: u; L6 O- v8 e4 L$ B - ;====================================================================================================
6 Q% C$ ~6 e3 a& ~7 s/ I - MACRO_SWITCH_BANK_8000_A .MACRO
$ |: P. i: y( w/ d% O2 k - PHA |$ N+ Z8 L) b+ J
- LDA #$06
; N$ a! z- Y& O8 S3 a - STA MAPPER_REG_BANK_CTRL8 N' t2 A6 j+ V7 Z
- PLA
8 [5 p' `/ F4 @ - STA MAPPER_REG_BANK_DATA
2 v, [3 I) d) x4 m0 n - .ENDM
! r3 x. g% b/ S$ P6 K - # N" p2 h3 \2 @% N% D9 c4 R
- MACRO_SWITCH_BANK_A000_A .MACRO3 E( n* w# Z a9 ]2 j
- PHA
0 a' N/ l. V) I7 d/ ^; m - LDA #$07- t! D) {7 G( O! i: l- t2 |1 q0 c; G
- STA MAPPER_REG_BANK_CTRL5 B' B& T3 O% h$ P/ J' l! R. `
- PLA# a7 {8 S9 E O
- STA MAPPER_REG_BANK_DATA. z4 X n* O+ E! }4 N# s9 w& G
- .ENDM
9 L, X& e1 e) t& U. Q y* H! n -
0 r4 `( X$ a! Z4 _+ p& H - MACRO_SWITCH_BANK_C000_A .MACRO; c! Z, g& b$ P: G6 m1 `
- .ENDM
; e2 f6 z; U, p$ N3 p - / h/ r8 V* y6 X# `" r: M% w; _
- MACRO_SWITCH_BANK_E000_A .MACRO
& P- o/ L9 k) c! m% W5 P$ B5 ]( C - .ENDM
5 Y$ o g/ D, ^; m - & a, o3 d2 o( y' w6 s
- ;====================================================================================================! G2 C6 ^) p: E" P2 P! b2 m6 T7 C; X
- MACRO_TRIGGER_FIRST_IRQ .MACRO
. q2 N, ^( Q$ l2 H) g5 x - LDA #IRQ_SCANLINE_BEGIN + 1( E* w9 h8 I1 f. {
- STA MAPPER_REG_IRQ_LATCH
) {4 h5 m5 e8 ~* l - STA MAPPER_REG_IRQ_RELOAD
! I4 \+ r( Y; Z - STA MAPPER_REG_IRQ_ENABLE d" t ] x* D" N9 k; x* L
- CLI" L- `8 j7 i- t! s. Z5 {
- .ENDM2 g) n, s8 G: J) E: l# l( G7 e: _
- - M% u$ q3 M1 b* c
- ;==================================================================================================== P. B) z9 F% D2 g2 K, Q$ l, ~6 B
- MACRO_ENABLE_IRQ .MACRO* s* K$ ]3 h( [* j% v, R3 ^
- STA MAPPER_REG_IRQ_ENABLE
M( `* k+ G% W( m; | - .ENDM& E2 ?: a& u" b4 l$ i! g3 |) E- W
-
* s( [: _7 v* Q6 n# B5 k! c/ l6 N - ;====================================================================================================* D5 x; Y g: a4 W
- MACRO_DISABLE_IRQ .MACRO/ U( O2 _3 {1 m# F. m7 x$ O$ ?3 C
- LDA #$00/ X8 X* o1 q9 c( ^; ^) Z! J L6 e
- STA MAPPER_REG_IRQ_CTRL
' A2 p/ ` y) C8 t - STA MAPPER_REG_IRQ_ACK& g5 s; n, L, ]# m4 m
- .ENDM
! W: Y7 h. G* s2 J' C6 ? - ! {0 u5 s1 T! Y, T6 p; m8 I6 [
- ;====================================================================================================
0 x- k2 W2 u6 S$ ~$ ` - MACRO_ACK_IRQ .MACRO
- r$ ~0 a4 H9 G& `6 B* `) U - STA MAPPER_REG_IRQ_DISABLE
- n4 M( P/ ~% d - STA MAPPER_REG_IRQ_ENABLE
; q8 ?7 Z" m, }+ A0 ? a/ q6 ]" l8 q% @ - .ENDM
+ n+ _- L& i% W! m3 ?0 d -
4 X0 b; e# ]) s4 X- [% Z: C L; T, \ - ;====================================================================================================. D* E' n" Q0 g* r, F9 I3 s
- MACRO_IRQ_OPERATE .MACRO& K4 v8 X9 x( U8 V: T0 N
- , [7 @* N# S! [% A6 @' P4 n4 i
- ;==================================================" g6 o$ b! O5 m$ q* i* }1 |
- ;IRQ滚动模式常量) J: I7 R! ~4 L5 y4 n
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动! a K3 i! e* t9 }* d9 f3 d
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动& G( p* s9 z ]& N8 F% u
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
/ \0 J0 W! T6 H: K* X - : ?- J3 }7 d9 n
- ;IRQ扫描线数据/ ?+ R/ N2 ?& d+ u* }
- IRQ_Scanline_Data3 ]9 T# Z- T' Q: |
- .DB IRQ_SCANLINE_1" k# S& M( b' v! f9 n6 |
- .DB IRQ_SCANLINE_2
. a; _6 Y+ K2 R5 E u - .DB IRQ_SCANLINE_35 t9 ]& f4 W) K5 D* h' j# r, _
- .DW 00 ;关闭IRQ2 @' L. H. i1 P* Q
8 h) r& y! w6 o4 B! @3 U3 p4 E2 x- ;IRQ滚动控制模式
3 W' Y1 X$ U9 @$ s/ R2 D" j - IRQ_Scanline_Mode5 F$ Y# G5 T0 \( h
- .DB IRQ_SCROLL_MODE_RIGHT) ~) L G/ \5 q
- .DB IRQ_SCROLL_MODE_LEFT
/ c: b: P( S. u/ g# x9 F8 f5 H - .DB IRQ_SCROLL_MODE_RIGHT0 k. b8 @% ~! ^. U8 H6 V- U
- .DB IRQ_SCROLL_MODE_LEFT
$ Y: x% G3 {% {' i6 p J4 } - 3 \8 Z2 \: l/ q
- ;==================================================' _" C i+ z( K a* `& C/ B
- ;;IRQ滚动控制
4 A& A2 ?! P8 _, z1 r) D1 j - IRQ_Set_Scroll7 S9 {8 z. Y0 P+ T2 y N
- LDX IRQ_Process_Index9 w) [* h# H; b$ e) `: \
- LDA IRQ_Scanline_Mode,X
! h l: Q& `# k+ y% g0 ^1 n - CMP #IRQ_SCROLL_MODE_LEFT5 H/ {; ] W9 `' H
- BEQ IRQ_Set_Scroll_Left
2 w5 v) I5 q! k - CMP #IRQ_SCROLL_MODE_RIGHT
- U1 T; Y5 V* ]( d( n - BEQ IRQ_Set_Scroll_Right, T; A! t% O$ r- q
- IRQ_Set_Scroll_Zero;不滚动
; x2 s1 ^6 i+ K* N - LDA #$00
* m: {, |" K5 L9 J: ~ G f4 q - STA PPU_SCROLL/ w0 r5 V! K) g
- STA PPU_SCROLL' n/ { _3 l5 h( P
- RTS C# ?" z7 a5 f: u
- IRQ_Set_Scroll_Left;向左滚动7 B6 e" D4 o, a; t: J8 _$ c1 T
- LDA Scroll_H" ?% a. L u9 w; r; {' n
- STA PPU_SCROLL4 n5 b: y3 i5 O# L% L* }
- STA PPU_SCROLL
4 C. J, l7 r2 o$ X - RTS& h9 P2 y6 T8 [- J6 ]8 o
- IRQ_Set_Scroll_Right;向右滚动; M) @1 H/ K1 s# X9 X- y$ q
- LDA #$009 c! w4 }7 J/ e( C$ J# V
- SEC! S; i& I# ^0 {1 q6 `% e
- SBC Scroll_H, ^' e7 N$ p! D# Q/ u
- STA PPU_SCROLL0 m2 m* ~( i" v
- STA PPU_SCROLL
+ [' y3 @4 p. D/ y D/ r% p- D - RTS
* N1 @- @3 _) ~0 `# S# y -
' J6 T% Y: ]" h% D+ |; F' x - ;==================================================9 ]9 S8 e! G- i( J: f0 L0 h3 x! T5 y; G
- ;;IRQ滚动控制$ f7 ^! y! ~9 T
- IRQ_Set_Ctrl4 Q. U% I% A1 a. @/ f0 F
- LDX IRQ_Process_Index
8 ]0 T: l2 y3 t$ f# o3 G - LDA IRQ_Scanline_Data,X$ B# a8 T! M' U- S! G6 A
- BNE IRQ_Process_Latch6 J+ q1 p! T# B( ^; ]$ h( I3 C8 m
- IRQ_Process_Disable;禁用IRQ
* Q* t2 u- H' M) N - STA MAPPER_REG_IRQ_DISABLE' t5 V: M4 f. ~6 m+ @1 ]8 m7 z# y& Z
- STA IRQ_Process_Index
, H3 s1 C7 j7 Y7 q# X; A8 s" T - RTS& m5 k9 I! \$ w; n) X i
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
' D" I+ W# g1 Z/ B) w - STA MAPPER_REG_IRQ_LATCH
. R) d$ s/ \5 f- b+ n; K' _ - INC IRQ_Process_Index/ `8 d) i4 j" b* `+ J
- RTS
% G5 Q+ \( R% N' z; ^
4 K1 e: t1 A- e/ r) v- ;==================================================* O a& ^1 V$ t# i
- ;IRQ处理0 n: E7 R* Y( @5 m9 L
- IRQ_Process_By_Index
, y+ D$ C' K, x% y5 W/ ? - JSR IRQ_Set_Scroll
* L' M3 D6 p0 Q% w% f - JSR IRQ_Set_Ctrl4 ~+ Z. W$ ~# ?/ o7 \$ H
- IRQ_Process_End
4 ?1 g6 T* u. [2 W" ]. I9 v9 u - RTS3 ]1 k' p+ `8 ~
-
4 w( B" y: c0 C# F8 G: I - .ENDM
4 q: _0 b8 O- `& u; z -
6 ]/ _, q& C% N
复制代码 # K. O' | B; E) N' A
. r- ?+ {: {4 l代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|