|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
. G& {# Y3 P6 x3 M5 g( {0 K0 v2 s
$ ?, }, r& W4 T0 M4 V本次IRQ研究了如下:: n9 l3 M9 p4 k3 C3 }! j; c& P
VRC2&4(Mapper21,23,25)
M. `& r+ y' A% aVRC3(Mapper73)
* n$ j6 O. u: M* H' O6 LVRC6(Mapper24 & Mapper26)+ E' c/ E4 J6 j: y9 V8 E3 O6 d
VRC7(Mapper85)
- Y5 X, b$ L% x3 r4 QMMC3(Mapper4)
. c2 x* }. a2 ] H, T( j T7 oMMC4(Mapper10)+ X- c9 ~( r2 ^4 _% D5 ~
MMC5(Mapper5); ]& Q$ G* m3 _ _ } Q3 x
Mapper18
+ O+ g+ K) C/ }- nMapper644 |. t# K; ?5 J. o* R7 R. \# y9 L# J
Namco163(Mapper19)
7 Z/ U: K- C0 h6 o8 ^, |4 o/ p- FSunsoft FME-7(Mapper69); N4 ~0 ]& y5 ]; s
: k. d% T T1 v W! ^' L8 F! Z* b
共计11种Mapper的IRQ操作使用例子7 L) `/ g9 L9 {1 D5 L1 R
代码内有详细注释, 希望能帮助到感兴趣的人.
. V" B1 i- L4 ^( W x# V! d/ [ V- Y+ u, R9 l3 @7 C) ?
  : }2 }8 q6 L" S. K; e
( H6 T' z; L8 A7 k, sMapper代码主要逻辑(以MMC3为例):' p7 Z+ ~. y& w$ s( J6 I
/ o7 [: Q0 x% ~" D+ O- ;==================================================
$ A1 V- ~+ E; p7 e7 ?" j: u* a6 g - ;Mapper号6 ~+ f9 A& t9 r5 N. U7 \: b% q
- MAPPER_NUMBER = 04* g( R" y2 _9 ]# }
- ;==================================================6 h' `( T& \2 q! {0 ]
- ;MMC3 (Mapper 4) 寄存器常量; P- ~- \ Y: X$ d9 A+ z. `$ S* G0 a. D
- MAPPER_REG_BANK_CTRL = $80004 k, d$ L/ N. K' T( M9 D) u6 y* ?
- MAPPER_REG_BANK_DATA = $8001
" a9 M* r2 t% _9 S - MAPPER_REG_MIRRORING = $A0007 @8 Q/ U0 l4 v. ^8 m- z* H6 c
- MAPPER_REG_PRG_RAM_PROTECT = $A001" ?# A2 [4 O7 @, |" J; Q# \
- MAPPER_REG_IRQ_LATCH = $C000
# ~: M; ^$ a4 j, ^( I8 m - MAPPER_REG_IRQ_RELOAD = $C001( F6 m6 g3 d3 L
- MAPPER_REG_IRQ_DISABLE = $E000& _& U, {6 X5 V
- MAPPER_REG_IRQ_ENABLE = $E001 i, J- J3 G' W3 \7 p, n2 K
- ;==================================================! }# v, Q9 C* m. W" \" q
- IRQ_SCANLINE_BEGIN = 135# E7 w( X/ m0 E# C
- IRQ_SCANLINE_1 = 8
! q; h8 b% S$ A9 C) ~ - IRQ_SCANLINE_2 = 54! b% X! ]$ J6 F* e2 y6 [( a9 r
- IRQ_SCANLINE_3 = 8" }7 y4 L% `/ w W% ]! U8 }4 c
- ;==================================================
$ e/ u$ L: Y; A2 K3 b
; K. W; g/ }: h' @- ;====================================================================================================
* M0 S4 o8 e V$ h - ;宏常量
6 u( d2 H( u8 d- J) I7 e - ;====================================================================================================
& ]5 |9 `2 A; F0 o: |4 Q - 9 C; H+ P4 s7 b
- ;====================================================================================================% x3 r8 ?1 b# a
- MACRO_MAPPER_INIT .MACRO
5 h6 U- n9 W2 Y- }4 B" T - ;禁用IRQ
$ H V( Y3 o0 @3 t7 C2 ~+ I - STA MAPPER_REG_IRQ_DISABLE0 f1 [! G' ]6 j% s# f: U
-
0 _: k M; E' x; Z$ a1 V" k - ;水平镜像
0 M" S" N, o# E. [7 l. _" I7 t - LDA #$01; i& I6 {: {5 S+ D
- STA MAPPER_REG_MIRRORING# a& t2 W# b, ~/ b7 D; t6 C
-
' k7 A' r5 |% r# N7 y _ - ;初始化图形bank, g) C* E' G* _) r
- LDX #$05
$ C5 y" Z& _! f+ Y9 p2 Q, v1 O8 T: U - .Init_Chr_Bank' `) @. d T5 i4 b+ p: W
- STX MAPPER_REG_BANK_CTRL" w+ E- ~/ ?0 a1 J
- LDA .ChrBankData,X
$ q! O; b3 H. \* F" e - STA MAPPER_REG_BANK_DATA
7 N( e% o* K# o: A: x - DEX" j$ E& p% ?/ L* }. d9 o3 e9 }. h
- BPL .Init_Chr_Bank
6 Y, K: y# U6 i3 E5 ` - JMP .Init_Chr_Bank_End
2 l- D2 v+ U8 }- O/ H - .ChrBankData
8 v% B! ^% O2 [' F) H: H( a$ D' S - .DB $00,$02,$04,$05,$06,$07
" J6 E* c: ~% z% [ - .Init_Chr_Bank_End3 Q7 d* [( V% s$ X) P w1 R: i
- * S+ N/ L- j, n* Z
- ;启用SRAM" b9 _4 i$ v% X, D/ L" ?9 j
- LDA #$80
7 U* z! E4 c! g - STA MAPPER_REG_PRG_RAM_PROTECT+ j' }+ t( A, ]0 r2 Z( d/ f4 `# _
- .ENDM/ d% F8 ~$ M7 Y/ y, T
- 0 v! q8 d s7 Q Q# \
- ;====================================================================================================' ~$ M% _' |. g2 K( g7 H. f
- MACRO_MAPPER_SOUND_CLEAR .MACRO
4 g. b; D8 ?/ g7 f - .ENDM
" w; b, ?5 `$ _* v: Q1 v2 d - $ Q7 B3 E9 _) U$ P! N
- ;====================================================================================================
, E* V4 ^3 K% ?! e7 E$ F# s- H) Z+ V - MACRO_SRAM_ENABLE .MACRO
# ?5 x2 b" l1 @9 B! o1 q - LDA #$80$ u* {, P' w5 i: d& C# ^1 |# Y
- STA MAPPER_REG_PRG_RAM_PROTECT" J3 X* H& h: ^1 d; s( T. n+ m
- .ENDM
" o( T/ l- H0 }( o; B9 N -
: `+ u# F. I P3 X! i% h - ;====================================================================================================
# t: ^" Y5 m+ J+ g% J- h - MACRO_SWITCH_BANK_8000_A .MACRO
4 @) v* C0 [6 x0 Y9 Y! U - PHA0 m! t, r T* p- R/ H3 j4 s
- LDA #$060 s; ^" X' B+ l2 U* Z: v b' M
- STA MAPPER_REG_BANK_CTRL
' A7 ?7 P" c6 _1 ^7 k% w% ~( \+ y - PLA( S; F9 J) i) Y7 D+ K- [4 _' N
- STA MAPPER_REG_BANK_DATA8 y1 Z. w3 x* O
- .ENDM- I; h7 d9 w" ?# ~
5 l0 \$ s+ r2 w6 v4 w- MACRO_SWITCH_BANK_A000_A .MACRO
; t0 z. g9 }/ s) F9 m- F, Z& d# e - PHA+ q( n7 f M1 h7 K5 }+ x% [' t
- LDA #$072 v. |) v! H$ k1 e6 L- ^
- STA MAPPER_REG_BANK_CTRL
9 r9 _0 x+ ?( l% L2 w; `- f- ]( a, c4 O - PLA
1 r" E+ \3 q& K0 _1 U+ H- T - STA MAPPER_REG_BANK_DATA
! V7 Z* R$ r& B2 ?+ { - .ENDM+ K$ [' D# f3 h0 [4 D! E
-
$ m* a4 t. W% T0 R3 Q - MACRO_SWITCH_BANK_C000_A .MACRO
. \" m# {: h. C9 C2 f) V - .ENDM
2 w) u( q: r8 r; L - ! w! a3 u5 S8 b9 [
- MACRO_SWITCH_BANK_E000_A .MACRO
0 Q; V" b! F& ^: I5 K. R# Q! L - .ENDM4 N' A: c. u% b, A M1 W" D9 Y
- # W! |3 u7 S, p" \) W: K1 O! R* Q h
- ;====================================================================================================: J1 F% x7 |; @8 X% Q; w
- MACRO_TRIGGER_FIRST_IRQ .MACRO
! s' ~; I% `9 H% H - LDA #IRQ_SCANLINE_BEGIN + 13 V4 Q- b2 r7 q: g' s8 z
- STA MAPPER_REG_IRQ_LATCH
$ t/ l' b' V e1 C+ G' G - STA MAPPER_REG_IRQ_RELOAD
/ _9 w3 L3 U& a5 h, o- d" i - STA MAPPER_REG_IRQ_ENABLE; C: C' I# J( R% e6 ?( [1 Y
- CLI
) s+ J3 c1 Z9 k5 } - .ENDM* X1 E- w* x. Y0 `$ o0 h5 r4 Z% O0 M
-
7 P: S& Y, a B9 u# i) O# D5 G3 O - ;====================================================================================================' _6 u% F/ {4 I, }3 U% h- b
- MACRO_ENABLE_IRQ .MACRO
0 u% [3 F8 E% u6 L J- ~( t - STA MAPPER_REG_IRQ_ENABLE
6 N8 G- y1 J9 G4 z - .ENDM
, R/ X% D0 M- c$ {9 G6 G) Y0 y E -
' [" e2 V( e0 |) t - ;====================================================================================================
2 l$ ^' @! D1 @3 b2 I - MACRO_DISABLE_IRQ .MACRO
1 Z6 q* _/ r3 Z% S% A. Z+ e - LDA #$00. c5 F% l! r# v8 q' J
- STA MAPPER_REG_IRQ_CTRL
w f' P, K( r( I. Z! G! F - STA MAPPER_REG_IRQ_ACK" O8 [9 ~% v1 |5 e* y7 y
- .ENDM1 v9 W3 X! ?. Z' n7 {
-
( @1 f1 `: s2 w; i* r! j - ;====================================================================================================+ W8 C; c' b! {1 L/ m3 P/ c9 e
- MACRO_ACK_IRQ .MACRO& X$ w; K( @9 }2 W! l$ S
- STA MAPPER_REG_IRQ_DISABLE/ }1 I6 H+ `2 @' w( n* F
- STA MAPPER_REG_IRQ_ENABLE& J, m9 Z: e6 E& f# X
- .ENDM
3 ^* P# K' _0 a w6 \ - ; ^2 I+ ]& p5 F( ]0 D( p/ H
- ;====================================================================================================- q3 X2 F. i4 {. j9 X! ^
- MACRO_IRQ_OPERATE .MACRO
! v7 q% w2 z' i h+ o - 0 z# _3 c4 k: q
- ;==================================================
1 N1 g# z7 d; E& _+ r, I: ~ - ;IRQ滚动模式常量! I! q4 h9 \2 c4 r) }0 |: `% _* }
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
0 N; _: v8 |* z( X8 n3 O. u3 `: f - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
# r3 Y* |7 f I6 B. B - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动9 J5 r$ J0 C& c
- 1 U; `' m4 C( j. A
- ;IRQ扫描线数据
9 `1 I R' r( X+ ~0 H - IRQ_Scanline_Data3 R3 U S4 f b; E
- .DB IRQ_SCANLINE_12 x, m/ s6 \1 z% z) B, ~- ?
- .DB IRQ_SCANLINE_23 |/ z- P5 x! \' U: y
- .DB IRQ_SCANLINE_3
2 H5 a7 ]) s6 c' n. E s - .DW 00 ;关闭IRQ
$ y- C u- n, A3 l! B3 w* h
2 h6 C8 s( N& V8 B0 ?- g0 @3 E- ;IRQ滚动控制模式9 p. {+ W- P" z5 L
- IRQ_Scanline_Mode6 P- ]+ Z% P) }
- .DB IRQ_SCROLL_MODE_RIGHT' n. C# M! [6 }. j2 I
- .DB IRQ_SCROLL_MODE_LEFT
# ^: P# |5 Z8 k' g$ U - .DB IRQ_SCROLL_MODE_RIGHT, Y) t9 b# ^7 s
- .DB IRQ_SCROLL_MODE_LEFT
& u4 ?/ q4 k! h- t; ^% D# c - - k- Y% p3 b9 E
- ;==================================================0 v8 T7 h+ X7 P5 w- s. D
- ;;IRQ滚动控制4 y% Y& h( b/ b3 s' _" T% |
- IRQ_Set_Scroll
& r$ Q* [' H) t7 }: L& s9 e! q - LDX IRQ_Process_Index8 ? u4 @- s9 i4 r: k# d) x& N
- LDA IRQ_Scanline_Mode,X# }* e1 V* `( x2 j, O s: ]
- CMP #IRQ_SCROLL_MODE_LEFT; K8 K/ c4 ~; g2 P! E
- BEQ IRQ_Set_Scroll_Left
( V, _. y1 F, O, o - CMP #IRQ_SCROLL_MODE_RIGHT
1 n( D7 n, y) _ - BEQ IRQ_Set_Scroll_Right. `# k F- w* l2 S1 G
- IRQ_Set_Scroll_Zero;不滚动
' ~' J/ {: R v* O3 W5 z - LDA #$006 k: p4 L. {1 G% B q0 D5 R5 |0 B
- STA PPU_SCROLL
2 q( z* t- y( n% l0 F - STA PPU_SCROLL
; x. c; R8 @( O5 E# L0 l G% g - RTS
`/ Q. x4 Y; ^7 M" R - IRQ_Set_Scroll_Left;向左滚动- A8 q4 S" B* q+ @' h, _. f3 n
- LDA Scroll_H( A: s4 B9 `0 e! T" n; m0 ]' q! N0 H
- STA PPU_SCROLL( d0 O2 Y, J# Y3 c/ {0 u% D2 \
- STA PPU_SCROLL& b* z8 y9 Y5 s
- RTS
8 P8 v9 S) w3 `7 G! ^ - IRQ_Set_Scroll_Right;向右滚动4 K- q$ J% [1 \
- LDA #$00- C! ~; d* w0 O% z! w
- SEC
, f& Z& r0 k) S- ]3 l# l - SBC Scroll_H8 U+ e( k$ M" W4 F/ ]% D& F* O
- STA PPU_SCROLL
0 q& o; C w! S" ] - STA PPU_SCROLL2 ]2 ~' _' S6 b5 e8 J$ s- z
- RTS5 ?1 B2 T6 S# Y& n2 N
-
- f/ u/ H C7 X, `; N9 o9 t! F - ;==================================================! `4 J! [( x# P: ~$ W8 H/ l
- ;;IRQ滚动控制0 _9 e5 |% r# L0 G
- IRQ_Set_Ctrl
) m% I) M/ `/ `3 e1 ~* |: F - LDX IRQ_Process_Index
* X: ^/ j' \. D: z% J; N - LDA IRQ_Scanline_Data,X
" E; y* w2 p6 W: p5 r - BNE IRQ_Process_Latch
; K! ~' X2 M8 O; t- X+ W - IRQ_Process_Disable;禁用IRQ
0 K2 f; {( R2 ]# {$ L - STA MAPPER_REG_IRQ_DISABLE
9 o: l- u3 P4 `/ N4 l - STA IRQ_Process_Index* P8 }1 Z; O$ m' L
- RTS
- S# J" W& n0 W1 f1 K( b- Y - IRQ_Process_Latch;设置下次 IRQ 触发扫描线/ n/ }* k3 u: [# i4 _5 p! B* Q
- STA MAPPER_REG_IRQ_LATCH- \/ P0 l6 d. ?5 M
- INC IRQ_Process_Index# A5 l# C0 p. p8 e5 S+ Y2 ~2 n
- RTS* f8 Q/ [, q$ t) s* b7 g
- 9 ^* t) P0 N+ s& N% i
- ;==================================================% ?+ W0 F/ W% z$ y
- ;IRQ处理
8 `5 o# P5 U# `0 t' a) o# \) @ - IRQ_Process_By_Index
% H( h# _1 _+ Q+ ~6 _ - JSR IRQ_Set_Scroll9 M$ p/ R1 E$ U8 j/ Z) z
- JSR IRQ_Set_Ctrl4 Q# B4 J/ W6 b
- IRQ_Process_End* s, q% L5 b2 B
- RTS
3 Q/ \6 B7 l0 b( n6 G! h - 7 y* n8 P x7 c( r& q
- .ENDM
( |/ M/ C5 j" s3 U' w2 d+ [ - * _9 T! n' Q1 s$ W3 S& }
复制代码
2 H" A. p7 }" q3 W! q6 ^4 A5 T2 X$ K$ L0 B* l( s! W) E& c
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|