|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
6 v7 {5 D! K0 J7 ?" B/ ?
7 u; [4 A( s) T" v. n4 E本次IRQ研究了如下:
- X4 T. Q) H) I( j: a# yVRC2&4(Mapper21,23,25)6 h/ t; F* q3 Q0 h2 p, M2 b6 [7 }7 ~
VRC3(Mapper73)9 u! ]$ A5 @. D3 F7 t4 Z7 v' t
VRC6(Mapper24 & Mapper26)
. Z i2 ]9 s. n; Z- W2 p$ jVRC7(Mapper85)
4 d1 Y! q% s7 c& x AMMC3(Mapper4), x |/ V a& ^+ V( m5 S
MMC4(Mapper10)
v4 H; m5 T( \! C% C, R' MMMC5(Mapper5)
+ q& Y7 t' Q# b: X: KMapper18
7 y& }4 s# q( r4 t- w) iMapper64
) o& {$ {/ C: ?) G4 \5 ~Namco163(Mapper19)8 R. F- p+ a* b
Sunsoft FME-7(Mapper69)# T0 F4 e* m) B' x. D1 P
3 S' z! g9 P$ r7 v1 t1 k `
共计11种Mapper的IRQ操作使用例子
8 Q, k Y* a `0 C8 Z* t1 @: C) g代码内有详细注释, 希望能帮助到感兴趣的人.
0 k- I2 M# B; Y7 o$ v
& a' b; g% I) y3 v# ~  : r2 j. ?5 X) g* P
; \8 V, d5 u5 g1 x/ ^: gMapper代码主要逻辑(以MMC3为例):' `" I7 |5 v+ l2 t I( T
# u4 H$ t& ?2 t& L1 b% a- ;==================================================
: j( j, N; l/ @( }* h - ;Mapper号
9 v2 ]" w. q( Y9 E - MAPPER_NUMBER = 04
/ `! l% d- x! s( w7 E/ d6 e - ;==================================================
7 R3 C8 F0 V) e5 S! Z2 ] }. l3 A - ;MMC3 (Mapper 4) 寄存器常量
2 i$ q2 j l0 x# ]8 d( J. e, O - MAPPER_REG_BANK_CTRL = $8000
' l7 |! T7 U) H8 n7 h0 s+ G - MAPPER_REG_BANK_DATA = $8001- J5 v- e& B+ N% Z' f$ Q
- MAPPER_REG_MIRRORING = $A000 O7 ?) O+ ^2 r- k/ i/ Z
- MAPPER_REG_PRG_RAM_PROTECT = $A001; ^2 _& w- U8 ~8 `6 h* G) y: I3 P
- MAPPER_REG_IRQ_LATCH = $C000) }% F) A. V* \; g3 i5 s0 G
- MAPPER_REG_IRQ_RELOAD = $C001
( i9 Z1 M5 X- K6 x - MAPPER_REG_IRQ_DISABLE = $E000
/ u# y) G0 A k) X/ Y0 q - MAPPER_REG_IRQ_ENABLE = $E001
4 o1 b8 \3 K% S: @$ i - ;==================================================+ w2 [- z- e& A' j& M$ C6 |$ f
- IRQ_SCANLINE_BEGIN = 1355 n: o+ {' W' X3 }, i) m
- IRQ_SCANLINE_1 = 8
! T, y* D# s$ |4 H1 D! M - IRQ_SCANLINE_2 = 54
8 H4 }$ P" D/ {4 ^( C - IRQ_SCANLINE_3 = 8( W# f4 Q0 {/ K, y) v
- ;==================================================# {# J( p6 b5 }' P6 O* ]# p
- 8 K. f: {4 Z" e5 H% F
- ;====================================================================================================8 m7 O6 J* G; N- h6 W; V% a& {5 b+ L
- ;宏常量) P& A" y7 A l' B/ W
- ;====================================================================================================; n1 g9 R, F( Z5 u- g6 I- p
- 8 k% J2 y; P* w$ }) w7 C( Q
- ;====================================================================================================4 ?/ I% b" k' J4 K) y
- MACRO_MAPPER_INIT .MACRO* T7 A7 K/ M/ I0 m6 h2 E& F* z
- ;禁用IRQ/ O" \* e3 K8 j+ d9 f
- STA MAPPER_REG_IRQ_DISABLE
! u9 C: L% Z3 ^) G - # L l" x& R2 P5 i) F; a& v6 J$ M
- ;水平镜像% q. c2 [: l8 E6 z! T& Q
- LDA #$01
: I, Y- \ {8 h1 }- {% ] - STA MAPPER_REG_MIRRORING0 |7 ^& k5 p* H! u9 R# r
- ' K0 f; K) v: l; j; \ A+ A
- ;初始化图形bank
& B: N* q) n* ]4 K7 Q- z2 r - LDX #$05
4 c/ `; O% f( U9 z- c - .Init_Chr_Bank
' `' m3 d' Z1 D# j( H- k# | - STX MAPPER_REG_BANK_CTRL7 Y5 N# i& d3 i" ~4 V
- LDA .ChrBankData,X4 B5 b9 A/ V4 Q8 Y6 P
- STA MAPPER_REG_BANK_DATA
0 H: {9 j7 r" W. _8 e; N7 r - DEX
4 H, n& a7 u+ ?2 g) S8 Y - BPL .Init_Chr_Bank
: u8 H2 s1 I4 ]+ k - JMP .Init_Chr_Bank_End7 m! z" [6 Z- G( p" ]
- .ChrBankData2 s- p- e7 _$ M. a8 e
- .DB $00,$02,$04,$05,$06,$07- x& G! M/ Q$ Q+ x5 \7 B
- .Init_Chr_Bank_End
/ W8 A+ Z- U& l; d4 v - ! k; |" a* w& X
- ;启用SRAM3 ~# U# ]6 v- V6 M
- LDA #$80$ a' T2 e( o$ H
- STA MAPPER_REG_PRG_RAM_PROTECT
) s$ |2 L9 a3 U - .ENDM4 S4 \5 s$ A4 t* g) C M3 B+ B
- - m1 U2 g8 r2 O; A
- ;====================================================================================================# w! Z% H# L( Q9 q% ~5 D
- MACRO_MAPPER_SOUND_CLEAR .MACRO3 Y+ o# R. Y# D3 G0 L @8 I
- .ENDM
" W0 z" u' j4 K. ~8 D$ ` - 2 {9 n" {5 x: J0 z5 U
- ;==================================================================================================== Q( t5 H; y; `/ I
- MACRO_SRAM_ENABLE .MACRO
" V; r6 Z% M0 b$ x7 y+ C3 \ - LDA #$808 Q {! O6 z: W8 B, c
- STA MAPPER_REG_PRG_RAM_PROTECT
4 p0 F ~" a7 J1 e8 b D - .ENDM
2 i2 Q, y& I' O! ^ -
5 x, M- p% r5 q, P+ s - ;====================================================================================================! A2 X* Q! G, G M! x
- MACRO_SWITCH_BANK_8000_A .MACRO# }' v- n" Z: c& H7 T1 F3 w
- PHA
, C2 u% k* R" B d0 ^ - LDA #$06& }) x0 H; \/ i: B
- STA MAPPER_REG_BANK_CTRL
$ {+ _8 b- R) k - PLA) V# |+ b# G( o7 X/ A, r7 x
- STA MAPPER_REG_BANK_DATA
1 }1 P t- }. |3 \* N - .ENDM
* w+ \' @; Q" u4 J! N; D. g9 B' A
/ h) Y2 M! \. R) ^4 |- MACRO_SWITCH_BANK_A000_A .MACRO$ {! j# X; _6 q8 ]% d
- PHA k7 t9 {" [/ l8 q0 O0 U9 i
- LDA #$07
7 M9 i5 X8 n: z9 O/ a1 i& L1 [, [ - STA MAPPER_REG_BANK_CTRL
" t$ A/ z4 a. `* u% z - PLA
: Y* y, h* z* Y$ A - STA MAPPER_REG_BANK_DATA( I2 D: j- S) z* P# N# ~4 j$ r
- .ENDM
2 z7 {+ H, @9 L0 t8 h# ] - 2 m6 a* R: y& s7 X* Z$ m& X2 l5 S
- MACRO_SWITCH_BANK_C000_A .MACRO
$ y# _9 Z* C$ P6 _+ u* x& q, H" V - .ENDM# M6 h! i( c9 c
- _4 K8 j6 p) ]7 K5 c. b- MACRO_SWITCH_BANK_E000_A .MACRO
P! r* Y" i. j6 e$ ? - .ENDM
5 n, Y0 j# [' P/ s( g9 {
7 W' J& e$ g/ t8 v3 e8 ]& m) R- ;====================================================================================================
6 _2 @8 O# ^8 s, r! ~, M - MACRO_TRIGGER_FIRST_IRQ .MACRO
2 h* M& s% o* o' V- j+ i" E - LDA #IRQ_SCANLINE_BEGIN + 1# y2 s7 S% }8 {- M7 k
- STA MAPPER_REG_IRQ_LATCH R @" ]! R6 L
- STA MAPPER_REG_IRQ_RELOAD
% T, C k* A* \6 D. {/ \) j - STA MAPPER_REG_IRQ_ENABLE: E8 @+ B# i9 T% p$ N9 z
- CLI Z+ d0 P9 ^. _3 r6 c' ?
- .ENDM/ {* J2 W; s0 D! X; Z8 b
-
5 g" u m' T6 | - ;====================================================================================================
: \1 Y( Q4 i2 O7 t, ?$ e - MACRO_ENABLE_IRQ .MACRO2 s) C3 C X) m) ?4 q8 n
- STA MAPPER_REG_IRQ_ENABLE
* V* y! j6 b. {6 P - .ENDM+ Z" ~2 D' o/ A3 p
- : o* Y# R& W% k
- ;====================================================================================================: W# Q" p1 A2 q9 a
- MACRO_DISABLE_IRQ .MACRO5 p0 w/ L4 U7 o/ r8 z
- LDA #$008 ]1 V; L7 W+ M& H4 Z* e
- STA MAPPER_REG_IRQ_CTRL+ d9 E1 u/ A/ }1 P {( e
- STA MAPPER_REG_IRQ_ACK
/ [ V) l) u* J2 b2 o$ \ - .ENDM
2 D- ~- H, P* J1 [4 @ - 2 Z% a5 m3 H3 y, E! v
- ;====================================================================================================% \9 |0 P" f" D* f6 g' Y4 l
- MACRO_ACK_IRQ .MACRO" A' z' @$ N# o7 I* \% m
- STA MAPPER_REG_IRQ_DISABLE: c7 E. m1 c+ {4 y4 K
- STA MAPPER_REG_IRQ_ENABLE
+ C3 m0 c/ X$ z - .ENDM2 c/ C% F- p4 M1 Y) g* C
-
% i5 n: r ~% y$ A3 A - ;====================================================================================================5 U/ K" y; {" g( L
- MACRO_IRQ_OPERATE .MACRO8 D/ i6 ?% ]: Q5 X: C* l0 m
# O. k. T" x- L+ P5 ~ h- ;==================================================- ~, i( y3 M z% c+ D; F
- ;IRQ滚动模式常量2 d( F9 i; U! ]$ t1 z
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
R- H& ]! R/ c! y A3 v( N& n - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动# [7 v& P, \" X& F" `' E; o9 t! W7 L
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动# O! c+ X6 g' j) c. }6 N
; d d9 U+ R5 A! k1 j! _2 W. {( }3 i- ;IRQ扫描线数据" _7 _+ D: _$ J
- IRQ_Scanline_Data& o) ^0 f& M% F" F
- .DB IRQ_SCANLINE_1
! K$ G1 i, I, m' J0 ^8 B$ v - .DB IRQ_SCANLINE_2
( g, [! H! G! X# t I+ a - .DB IRQ_SCANLINE_3* ]2 L+ U; g: D5 q: o, F, l
- .DW 00 ;关闭IRQ
9 h# ^1 s4 D9 V( [ - , M- V$ T& n+ E. m
- ;IRQ滚动控制模式
% r; U8 @% x; K# Y/ K( D - IRQ_Scanline_Mode" r3 n. K( G) u( g7 C
- .DB IRQ_SCROLL_MODE_RIGHT
7 H8 B( a% y# W( ?, r' }) O8 [2 K - .DB IRQ_SCROLL_MODE_LEFT7 J4 P8 z) N4 b+ c% V
- .DB IRQ_SCROLL_MODE_RIGHT
& ^) i" p( D/ P) u- | - .DB IRQ_SCROLL_MODE_LEFT
+ R" A, p, m) g
) v, Z$ m* J& v, I+ m- ;==================================================
% Q& H; h6 K& Q$ E( o0 @ - ;;IRQ滚动控制
, T/ |& r2 [0 J6 a - IRQ_Set_Scroll% S! T! O; _: K3 J- M+ U* A
- LDX IRQ_Process_Index
% I% l, g+ N1 ~ - LDA IRQ_Scanline_Mode,X
) g5 J! ^5 x1 Q1 K - CMP #IRQ_SCROLL_MODE_LEFT
; q* f9 { ~% c9 Y3 t - BEQ IRQ_Set_Scroll_Left3 j X2 {% ^0 ~1 d' f* P3 o
- CMP #IRQ_SCROLL_MODE_RIGHT
6 _5 Q v) o3 `: C6 u u7 m* z! f - BEQ IRQ_Set_Scroll_Right; v" j5 Y6 V+ Q5 M% t$ R5 p
- IRQ_Set_Scroll_Zero;不滚动# j; i. z. V9 X* {
- LDA #$00
/ {2 g8 \1 H, I0 s - STA PPU_SCROLL' B& j$ [) w1 R) x7 B# Q
- STA PPU_SCROLL' G0 l& H: x5 ]: y, r( C
- RTS
9 }7 n9 {1 e+ l6 b1 {2 x - IRQ_Set_Scroll_Left;向左滚动
/ r- W q ~ O% l8 w+ h8 \ - LDA Scroll_H
# J0 Q/ }1 l+ v( b9 v - STA PPU_SCROLL' _' r4 a' l9 m9 s
- STA PPU_SCROLL& O) y9 _) N' X: T3 K5 Y
- RTS! k; k, E" _5 i' l$ d
- IRQ_Set_Scroll_Right;向右滚动
5 ]9 B; }: h/ e' U4 _0 j" V/ s8 ? - LDA #$00& Z1 i9 b; Z! L/ c, N( J
- SEC$ Y$ }( d( c9 p. f, ^" l
- SBC Scroll_H) ~! B# D% o8 b! P+ u% _' k. d
- STA PPU_SCROLL- I2 P$ x" F& G- {4 h4 Y, h
- STA PPU_SCROLL
; C6 h1 } J6 c7 n - RTS/ n- N! x& X- s) {9 h
- : c9 V G9 u P+ k9 b& T# P
- ;==================================================
: M" K, q; J3 Z3 R! f; w8 Q - ;;IRQ滚动控制1 k" o' Q( m7 ]
- IRQ_Set_Ctrl
5 b, ^, Z+ c' V v3 C/ ]5 M; M$ Q - LDX IRQ_Process_Index9 h; c$ d% C3 f- ?, E0 k
- LDA IRQ_Scanline_Data,X
3 w' c0 i6 W! Y' F9 C1 p2 f - BNE IRQ_Process_Latch- @) ?. j( k# k( Z
- IRQ_Process_Disable;禁用IRQ- c* Y; O7 c6 |0 N
- STA MAPPER_REG_IRQ_DISABLE
; | T3 F; \& M$ f* y - STA IRQ_Process_Index
; {. e* H8 U6 i$ r - RTS2 |; v# f: G; l i4 w
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
7 T( p& y* x2 t3 r5 t* T6 k: P( h - STA MAPPER_REG_IRQ_LATCH
1 l7 U. K1 n) c# w, B5 r, q! s - INC IRQ_Process_Index
4 n' q: b" e: E( { ~- L - RTS& @; m6 w" K) j( N/ M
- % j* ?1 W( D# F3 H. r
- ;==================================================
) Q0 `4 G; C$ p- b! c7 d8 r; s+ o - ;IRQ处理* S& E3 X1 o2 R( b9 y/ [7 A
- IRQ_Process_By_Index
. `! d% l6 S$ Q - JSR IRQ_Set_Scroll
* L# O8 z+ B$ {$ c4 v - JSR IRQ_Set_Ctrl
* Q( @$ J! X# H" b* d% C - IRQ_Process_End
$ @) \0 I) b# Q. K* `, r9 h - RTS
( G: [4 x2 m; @ -
/ Q2 [+ v# b1 m* N - .ENDM
9 A) ]0 c1 r3 {% V' B' g7 v2 } - * V9 e( Y& {7 U1 C6 `
复制代码 ; |$ t! Z# l- K5 A1 p4 S
3 C" v" @9 d+ m9 C
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|