|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ! Q; k8 V& a% j- h/ }0 Q
; |* Y) ]( ]2 X0 _* A本次IRQ研究了如下:- G4 `( R+ C/ \
VRC2&4(Mapper21,23,25)4 k. J9 k. s9 `8 @4 N
VRC3(Mapper73)
2 `; H% s4 h( P# O; V: @' I ~! ?VRC6(Mapper24 & Mapper26)
. t3 ^+ a: u' ^4 O* \% j OVRC7(Mapper85)
/ M, U8 O1 F3 }/ a( Q- p8 ?MMC3(Mapper4)- E: @( R) T* A
MMC4(Mapper10)
2 h! d3 \! k* Y3 X! RMMC5(Mapper5)! ^+ X- d+ |' N# {) _, o! c! H L
Mapper18( L- P, | G. H" h: @8 c# {
Mapper646 o; `3 y1 \( k9 N. N2 q) u* C
Namco163(Mapper19)( ]/ _+ y' m i8 S7 l/ n
Sunsoft FME-7(Mapper69)
- q. X) K, _9 E+ A+ v6 m- f0 ?% M$ V
5 ]7 T- a' k; M+ |% @4 K$ h( R共计11种Mapper的IRQ操作使用例子
( J$ g9 G. h( G+ W代码内有详细注释, 希望能帮助到感兴趣的人.
; J* ]3 j9 c( ~: F7 G$ B
Y. y2 t% g) [4 S1 ]  7 h% K# T5 G, b u
4 z4 G4 m/ C B1 d. n. Q, @3 }/ Q5 R
Mapper代码主要逻辑(以MMC3为例):9 V: @8 [! }8 S7 I1 {, Z# C; y
9 [3 V' X* ?% g) a- ;==================================================9 x8 i/ j% m" R! ] ?
- ;Mapper号4 `) b3 {: W( Y+ V
- MAPPER_NUMBER = 04
0 _1 E k$ m* K9 v. } - ;==================================================
1 c' q* o/ Z; F8 ?: t/ \ - ;MMC3 (Mapper 4) 寄存器常量
0 t$ g6 a* L5 `' ~2 g0 b% ^. M7 V: m) F - MAPPER_REG_BANK_CTRL = $8000
+ q7 i5 \( Q# b: `5 S1 v - MAPPER_REG_BANK_DATA = $8001
( Y) A- o1 j! [. x9 s - MAPPER_REG_MIRRORING = $A000& V$ J2 G. [1 `
- MAPPER_REG_PRG_RAM_PROTECT = $A001, i9 |/ C% c2 B
- MAPPER_REG_IRQ_LATCH = $C000' R' S- E/ v& r8 {0 B
- MAPPER_REG_IRQ_RELOAD = $C001
7 x5 a, Y$ h9 B6 x, q3 }# Q5 @ - MAPPER_REG_IRQ_DISABLE = $E000
: K' ^* ^6 j: d6 J' Q( m ^7 \ - MAPPER_REG_IRQ_ENABLE = $E001
, s/ C; D: D4 ]' i9 A( x - ;==================================================$ ?# `1 \7 S* X9 {
- IRQ_SCANLINE_BEGIN = 135
7 p) q& v$ |; a6 b+ D - IRQ_SCANLINE_1 = 8
X4 ^* _9 v- R6 Y - IRQ_SCANLINE_2 = 54, q0 g9 @5 c2 Z7 \8 L
- IRQ_SCANLINE_3 = 86 v* Z3 q8 o, r& y
- ;==================================================; q+ o6 a" N2 G/ R4 }3 ?
- 4 v" [3 q) c, t h/ o* l7 Y
- ;====================================================================================================
9 L; s! k; P$ L9 P - ;宏常量! B! h2 M* O7 b" k
- ;====================================================================================================
7 k( m7 e% `: L) n. F4 N! \
+ \/ z1 @- \3 ]& b- C$ I$ b( Y- ;====================================================================================================
& ]& t a: l! h; M' m) q/ f5 ]5 n - MACRO_MAPPER_INIT .MACRO
$ D6 p2 E1 r. a+ Q - ;禁用IRQ8 q: D& U# t, I- Q2 R( r
- STA MAPPER_REG_IRQ_DISABLE$ ]2 x8 F9 o) c& v6 A6 S
-
& `7 g) T0 ~" ?" k: |& v& f - ;水平镜像% N. ?8 u9 v" H0 s
- LDA #$01, \, C, e) y2 [2 z$ Q4 W2 M
- STA MAPPER_REG_MIRRORING
; D) r. U" F6 s4 y -
0 ^/ r' M* ?" j; c2 ?! E0 _" i - ;初始化图形bank
9 u L' n; A: A9 F - LDX #$05
9 X, ~; {# D6 o8 {5 k! e - .Init_Chr_Bank1 y9 X, I: w0 W9 l `( ?
- STX MAPPER_REG_BANK_CTRL( f; m, [9 X6 j
- LDA .ChrBankData,X! z5 K4 Q& V% |
- STA MAPPER_REG_BANK_DATA
9 \6 j; Z" n _% q! k* ?! Q - DEX" m n" G; |% Z: X, x" \
- BPL .Init_Chr_Bank
! `. O! E! l2 D' x6 H+ @9 R - JMP .Init_Chr_Bank_End
6 O; R0 }0 Q5 w# }4 c8 k1 p( i - .ChrBankData
' z" s4 |; g! u9 e4 g0 r7 Z& w - .DB $00,$02,$04,$05,$06,$07$ b2 o, u! D k3 U, D
- .Init_Chr_Bank_End
; p8 L: F' W8 w. M( g' F, A' t -
2 @+ E1 u$ I/ a+ j. I - ;启用SRAM
7 J, e. f2 v: d9 ]& z/ @$ y - LDA #$80
8 c' V' x1 C0 l- F6 m# T - STA MAPPER_REG_PRG_RAM_PROTECT
' ]( l, L9 @1 ~3 ?- a- z - .ENDM" w( e5 o$ ^7 M& }) Q; i4 P1 t
! N/ f, m. [ |$ o( Z- ;====================================================================================================7 P% X# ^9 g6 {- s9 t2 e3 [' w
- MACRO_MAPPER_SOUND_CLEAR .MACRO- \5 @ N& d5 J2 H
- .ENDM
' Z' |* K* ~0 v7 G8 r# ~7 | -
: W n, q: ^8 G& {% `; Y' l - ;====================================================================================================
& d6 R7 f; \: H - MACRO_SRAM_ENABLE .MACRO3 H4 Y6 a4 ?6 W" q
- LDA #$80
2 s5 Z& s, X! j: ~ - STA MAPPER_REG_PRG_RAM_PROTECT5 I1 ]! o d1 b7 R* E
- .ENDM
+ O# y( L- z$ L - ( ~& P* a( V G/ m7 o
- ;====================================================================================================* O: N% s1 P! f1 n5 j% J
- MACRO_SWITCH_BANK_8000_A .MACRO
' m" P- R3 i# y( p8 r, }! j1 z - PHA4 F1 L& G, H% h: E
- LDA #$06; O$ c+ m1 k6 A2 Z+ L
- STA MAPPER_REG_BANK_CTRL( y& ^' y+ [3 ^9 e! Y
- PLA
/ I" F4 I& _; F# y. A( C, y6 x - STA MAPPER_REG_BANK_DATA+ C0 m! y, Z# V$ _. H
- .ENDM+ O* y3 n, Z: v- N6 M9 g( b
- - r+ S- i9 r) ]
- MACRO_SWITCH_BANK_A000_A .MACRO
8 |; Z8 v' M4 N* c- N, o' J; b - PHA4 h( J" ]0 W; P
- LDA #$07$ U2 }4 N) m/ k$ _* q$ F
- STA MAPPER_REG_BANK_CTRL- p! r# ~; V5 G5 }+ x
- PLA
& d' l( x- l- E& S9 Z/ Q8 p - STA MAPPER_REG_BANK_DATA$ |2 _# k9 S! q/ x8 H
- .ENDM8 \! O& e$ [% G. T, @
- 5 ^% ?) V- J; O# u% z
- MACRO_SWITCH_BANK_C000_A .MACRO; a' o- ~& ^( A ]
- .ENDM+ i$ t3 X9 E3 J2 \" k8 Y
! }7 s: h: j+ g5 L- MACRO_SWITCH_BANK_E000_A .MACRO0 {' Q/ Y' z7 h0 b4 c& i8 S* r: I
- .ENDM
8 c: C" c( a; t - 9 s y( K! H* b! j7 U
- ;====================================================================================================
( D7 I/ y7 k5 M) a# X c - MACRO_TRIGGER_FIRST_IRQ .MACRO
- y2 D5 d8 S& L% C$ l3 D - LDA #IRQ_SCANLINE_BEGIN + 1
8 J7 ?5 \/ P' m" n) v0 I - STA MAPPER_REG_IRQ_LATCH3 t, Z" d( F0 l1 b$ K" D8 g1 ^) I
- STA MAPPER_REG_IRQ_RELOAD
% f% b4 l' ^; M4 l6 {0 m$ `9 y) p3 \ - STA MAPPER_REG_IRQ_ENABLE
% ?' E- r) q3 |; S8 ~* c - CLI) v9 j) A" Q& l5 o7 {+ C
- .ENDM
( D/ X! X4 K) ]4 u+ r( H3 { -
& F$ Q8 w8 u8 S+ X8 n. j. O; Z - ;====================================================================================================
- m0 D* |; R% A ?/ W1 Q+ d2 _ - MACRO_ENABLE_IRQ .MACRO
, S" ]. k3 |* i' _4 P - STA MAPPER_REG_IRQ_ENABLE: I7 U8 S. y. ?
- .ENDM
0 s6 R" Y' o. U+ D -
* v3 G2 `4 ~( { - ;====================================================================================================
3 t" N m# q9 B# U9 @! r1 U j - MACRO_DISABLE_IRQ .MACRO1 Z2 I) T5 z+ ?4 W
- LDA #$008 d) e6 Z: Z/ z3 V) l4 L
- STA MAPPER_REG_IRQ_CTRL) p9 m) i4 T8 x- H4 s9 r
- STA MAPPER_REG_IRQ_ACK+ v! r4 t% b" x0 T$ N. p0 f3 i6 V# [
- .ENDM
1 G/ g$ a) A! e/ }/ j& { -
3 D9 n g7 k. n0 S# s1 ^ - ;====================================================================================================
6 \3 L3 T. ^. F% K - MACRO_ACK_IRQ .MACRO
; e5 ]+ {+ d3 e, g) L - STA MAPPER_REG_IRQ_DISABLE w" T- s6 e4 }( U& B( `+ z
- STA MAPPER_REG_IRQ_ENABLE
6 B) s: X% f7 ~$ f - .ENDM, b8 h& \4 b J# b( s2 W8 c X
-
5 E% y- Q8 n2 M0 e: _ - ;====================================================================================================
: q# G# D; [+ F z) D1 b! W/ F - MACRO_IRQ_OPERATE .MACRO8 s% |4 \9 b; k' K3 f" N$ g' L3 S# |
- ; B! w4 l' T u3 r7 p
- ;==================================================
# B- B, L s4 ] C( [) Y - ;IRQ滚动模式常量
6 N4 ~ Y: f) Q - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
1 @- F: K6 R) j5 A) g/ M - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动: }6 C3 X3 e2 L( i
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
: J1 N& Y) ?# E9 G- i( l - * @6 c! ~2 h J. Z
- ;IRQ扫描线数据
! ^* X3 m# L8 i* B } - IRQ_Scanline_Data
6 @ T W& M$ A - .DB IRQ_SCANLINE_1
5 U4 @$ I+ p: A) d, Q' a7 M - .DB IRQ_SCANLINE_2
; [8 O( U0 J5 `( w% g, T& F - .DB IRQ_SCANLINE_3. ]' f" x l) \+ N* M
- .DW 00 ;关闭IRQ
. _* C/ _( d" K, \6 R& F
8 M' ~3 j2 `" ]5 ~ k- ;IRQ滚动控制模式) K7 i' \6 f0 Z
- IRQ_Scanline_Mode
% I5 Y( o+ |6 W+ H4 b, S* x( v8 K' i - .DB IRQ_SCROLL_MODE_RIGHT3 c& t6 h" u+ B& B. ?/ a$ A7 {4 G
- .DB IRQ_SCROLL_MODE_LEFT
# S* Z7 _/ J/ [7 Y: t% r - .DB IRQ_SCROLL_MODE_RIGHT2 z5 ~) M& P/ k. k5 b5 O5 D
- .DB IRQ_SCROLL_MODE_LEFT) g" B+ c; `6 i- V
" x2 c8 X/ _ ]: i7 j& s! Z- ;==================================================
# z; D- j. d G4 r2 @# a" r: e - ;;IRQ滚动控制; l1 j5 K( ~9 F A4 a! j* W7 F
- IRQ_Set_Scroll
( n8 W- b7 ]4 y8 w+ [2 g1 y- @9 S. f - LDX IRQ_Process_Index3 R- F6 Q8 y6 x2 Z% e
- LDA IRQ_Scanline_Mode,X; M5 E3 y8 P: s2 P" j# @
- CMP #IRQ_SCROLL_MODE_LEFT
1 I' C7 C: ^# q6 R - BEQ IRQ_Set_Scroll_Left
1 @$ _# m: H* n) }" u - CMP #IRQ_SCROLL_MODE_RIGHT
5 O# a+ n" v! ]) m - BEQ IRQ_Set_Scroll_Right
" B3 s2 b% F- N - IRQ_Set_Scroll_Zero;不滚动
7 g, _- ?" |: }4 { - LDA #$00
& k/ }/ M# k. W6 R# d% ] - STA PPU_SCROLL. K, f* ^, ]: \3 Q. _5 j0 A
- STA PPU_SCROLL
- C% u n6 k5 ?' g9 e' ] - RTS2 E: Z4 y8 x9 ~" e
- IRQ_Set_Scroll_Left;向左滚动
. W+ F4 _% @2 y: H c - LDA Scroll_H5 Q0 Z7 E8 X+ ?3 L* ~# K) d
- STA PPU_SCROLL( W: |. t' N, z; _$ K
- STA PPU_SCROLL( z4 r! v- @: E! U" e* E! b
- RTS6 z$ y3 f& _ p, x+ `: s4 ~" c6 j# K
- IRQ_Set_Scroll_Right;向右滚动
0 J. k9 c& _ j; ^' n# u- z - LDA #$00. t0 h/ N, f2 o7 n
- SEC4 i4 m. C5 @+ d7 Q% B+ E
- SBC Scroll_H5 _0 f2 F1 a( ^% @& F( O) V
- STA PPU_SCROLL
' s; J6 k9 n5 K+ t- Q2 p - STA PPU_SCROLL
$ {+ F& y1 z1 `% o - RTS
6 d1 _0 S8 C" C+ c, X- V1 p -
* K# f7 Q+ L9 b3 p& z# h - ;==================================================! b b$ [/ q6 O) t" A! P! Q w' x
- ;;IRQ滚动控制
. `0 x8 i0 y8 g8 G) R4 A - IRQ_Set_Ctrl4 {# {7 b5 D3 y1 k" t1 e! n
- LDX IRQ_Process_Index
6 o1 u; j3 L2 }/ [8 [8 D( {6 v, [- m - LDA IRQ_Scanline_Data,X
& g$ ?$ u/ v' e6 m1 H0 F0 D - BNE IRQ_Process_Latch s( L( Q! n/ f; x. v1 W3 M
- IRQ_Process_Disable;禁用IRQ( ]! y4 p' Z! e1 t2 B
- STA MAPPER_REG_IRQ_DISABLE2 K) X7 {2 j$ h# m/ r6 g
- STA IRQ_Process_Index
n$ _$ u( l: O- X f - RTS/ R- [4 M! E0 a9 j* s. @7 \
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线! L' r# g9 s2 s
- STA MAPPER_REG_IRQ_LATCH+ W( ]" b. u% L* N
- INC IRQ_Process_Index+ Z5 e) M3 w4 y2 F$ L' h5 x
- RTS
. U* l' v$ o3 s9 q+ n7 w
. W3 M, l* F, t& W' u1 s- @, s/ \- h- ;==================================================
. V2 N" A' }0 G) H0 d8 Q* | - ;IRQ处理- _: K( J6 e. B, M$ X& h: H
- IRQ_Process_By_Index
/ R* i& c3 g# R - JSR IRQ_Set_Scroll
3 z. Z7 J% h2 W2 r - JSR IRQ_Set_Ctrl" a& C+ V- Y% l4 \- l
- IRQ_Process_End' B9 p, I) f5 M, e4 V5 w! v7 \0 C
- RTS
. w5 q( `) K) h8 B1 X -
3 p7 c0 w2 q- a& h8 V - .ENDM
; ^/ n4 }1 L; r5 N* z# Q - W' M9 y/ x. v. n% Z
复制代码
0 ?' Z: Y/ j8 h& J3 I& K$ V; c0 o4 }1 P D" C0 O
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|