|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
% J: s6 F' A+ { r( \, h* F0 S$ h8 u
# Q+ a1 N8 v. i- W, K7 z) ^本次IRQ研究了如下:
0 Q" |& i% \9 s3 |2 e' CVRC2&4(Mapper21,23,25): u# Y% l4 n, {. }2 v
VRC3(Mapper73)
( n. r; x3 R& k( k/ L$ ^) c7 mVRC6(Mapper24 & Mapper26); Y& L, |: I' u8 [" A. l4 y
VRC7(Mapper85)6 T- j# ~* d s V; T
MMC3(Mapper4)
% z r% x" P, Z! h" U7 @MMC4(Mapper10)
% a5 X3 `3 x1 d ^) ^1 ~MMC5(Mapper5) f: i% s4 @3 }% g* ]2 `& o
Mapper18* I0 V! C$ c% ^- S$ g% h
Mapper64
1 }2 x* n# e. H8 t- W+ p6 ENamco163(Mapper19)
: ~4 {8 W5 ]* d* Z: ASunsoft FME-7(Mapper69)
# F/ Q& G' l0 p. S2 f& W7 y4 v+ e ^" j( D. Z' k- F7 j
共计11种Mapper的IRQ操作使用例子 j# L: Y+ ]1 D! _) }
代码内有详细注释, 希望能帮助到感兴趣的人.3 `1 n$ F, ]$ S4 Z
! l2 p" H( L% r2 g! C; p
  8 n' J: K3 ~* ~$ M/ f+ E
! s2 `: a& W0 \6 x1 w8 A- D+ u
Mapper代码主要逻辑(以MMC3为例):6 t( f/ C9 T0 P. u" H4 B6 Z7 E, R
- ' v7 Y3 e P3 }! O9 L
- ;==================================================
( T* V8 k3 c; i0 }+ E - ;Mapper号
! ?' F+ }# U4 P+ Y" i - MAPPER_NUMBER = 04! x8 o1 ]: T+ f
- ;==================================================
$ \& K. @' x( O - ;MMC3 (Mapper 4) 寄存器常量
6 r% d4 f W1 H$ j! z2 k8 o - MAPPER_REG_BANK_CTRL = $8000
6 Y4 I2 [) U$ D0 s, Z - MAPPER_REG_BANK_DATA = $8001: @, C S# E3 c1 m( B8 m7 ?6 X
- MAPPER_REG_MIRRORING = $A000
% {. I# r6 o- q1 `6 U - MAPPER_REG_PRG_RAM_PROTECT = $A0017 K3 |# T; A! Z4 F
- MAPPER_REG_IRQ_LATCH = $C0006 V/ I: H+ u) M! q5 n
- MAPPER_REG_IRQ_RELOAD = $C001
" R6 b6 q: s% _ - MAPPER_REG_IRQ_DISABLE = $E000
) E5 M3 D2 y/ r! N - MAPPER_REG_IRQ_ENABLE = $E001* b# J) m5 R: n% _7 Q, A! G
- ;==================================================
: b7 Z* C. [( {% N' G) M+ F, @ - IRQ_SCANLINE_BEGIN = 1351 u9 h1 F3 t% h | r( I
- IRQ_SCANLINE_1 = 8
' e) ^; J9 X4 A - IRQ_SCANLINE_2 = 54
- F- ~, D, }9 C- J) E% N - IRQ_SCANLINE_3 = 8/ M6 C0 O, ^9 q# n
- ;==================================================! E# s* B: V. B) H0 \# I. c
9 u9 v+ v- f0 ?, J$ R- {- ;====================================================================================================
5 s) p2 Q! z& \$ H1 Q; B# | - ;宏常量) P4 v* U/ E4 q o8 G0 h5 y
- ;====================================================================================================
0 D- k6 F- s4 V; P" U p2 f - : m& |! P! o# R2 J
- ;====================================================================================================, @: v$ \. ]& R
- MACRO_MAPPER_INIT .MACRO
" _* p( e; G1 @4 Z0 r) t - ;禁用IRQ
" U* |; _+ V& }7 ]! Z, r( o$ C) A - STA MAPPER_REG_IRQ_DISABLE
0 o: k0 i3 J4 |2 }' O3 I$ [; ] - 5 a1 G- P2 Q* w2 V+ l0 ?
- ;水平镜像- U# C3 j6 C% o1 o# D
- LDA #$01
4 s" y, ^8 i# o# r7 Y% E - STA MAPPER_REG_MIRRORING
* s; g$ u- O3 A. a: l% G7 A - , F4 P1 Q4 {1 y) ?" b
- ;初始化图形bank
4 _0 c" u0 l8 h2 A - LDX #$058 h. q) W7 L8 h9 T
- .Init_Chr_Bank
1 ?! I0 A2 R5 Z3 W8 d4 `9 `# w3 z - STX MAPPER_REG_BANK_CTRL* r/ y) E, y, O0 D/ ]
- LDA .ChrBankData,X
9 J9 I6 U, M2 C0 E) R - STA MAPPER_REG_BANK_DATA
! l( E3 y; \4 S- K4 A$ N - DEX" w9 B) e& {2 U* e7 c( P# c
- BPL .Init_Chr_Bank: }2 |: u$ H1 ?9 L, a
- JMP .Init_Chr_Bank_End% Y7 Y/ \& l; N
- .ChrBankData
5 o$ _; D# b& ]* u; U - .DB $00,$02,$04,$05,$06,$07
8 v' ~: R5 h5 C: f - .Init_Chr_Bank_End: M* ?7 w9 S# A
- & S" b2 |, J( L- @0 U2 F9 D' l* @
- ;启用SRAM
6 `6 ^6 w$ n! ^' ` - LDA #$802 \% X. r, ~: e! Y" z- f' N, C& s
- STA MAPPER_REG_PRG_RAM_PROTECT
3 h/ f! f$ C$ D2 d1 e - .ENDM
0 R& Q- ]) W9 F* K; s w
, E+ ^' A1 Q* X( Q6 O; `- ;====================================================================================================( E, W' e2 Q' g$ l, {
- MACRO_MAPPER_SOUND_CLEAR .MACRO9 f9 b7 k. s, f- ]6 G3 J
- .ENDM% t7 S9 f1 h. B9 [ ?& n
-
* h+ H$ Z z. J# T - ;====================================================================================================
, Y' K, K0 a( s8 Y" f - MACRO_SRAM_ENABLE .MACRO1 E5 s' j+ l! E$ k/ J- t! a/ ?
- LDA #$80
2 x% W- Q# X+ b8 M7 }: M- S2 G - STA MAPPER_REG_PRG_RAM_PROTECT
, \9 `; E% m; ^) f! b4 u( P - .ENDM
5 L& s, ^6 d2 S. k' ^' a -
, f7 M% u; w0 V0 C; B - ;====================================================================================================
( j$ |5 g2 X2 c( Z Q, L - MACRO_SWITCH_BANK_8000_A .MACRO0 ]+ I9 A* T) V0 E
- PHA
* s: G; E2 \7 h; g2 z+ n( y4 q7 } - LDA #$06
8 e( Q+ w' h; {' E8 E- z, x0 { - STA MAPPER_REG_BANK_CTRL
- f' }6 f6 W$ @, }9 I% P' G/ P; U: U ? - PLA7 b1 _6 S" |7 Y: \( @; L
- STA MAPPER_REG_BANK_DATA% j' ?# k% V+ S, j/ Z
- .ENDM6 F& g; p& S8 J- `" B! g1 Q. u; v
9 x% `8 H. @6 e* j. g/ Q- MACRO_SWITCH_BANK_A000_A .MACRO. @: p( G+ R6 ?
- PHA4 c9 h6 e5 t+ I, U
- LDA #$07
1 v e, c T, Q7 l$ K! z5 w' @0 E9 y - STA MAPPER_REG_BANK_CTRL
6 Z0 I; M$ t; ~9 q' j# @6 `5 [ - PLA
: }6 o( t4 g" n3 g# I; ^' l) z - STA MAPPER_REG_BANK_DATA
6 J& h, A2 O" z* a5 R - .ENDM
; d1 c1 p3 Q: r# T. [9 v$ ? - . D3 o$ V6 ?9 c/ p5 r& H9 L9 Q
- MACRO_SWITCH_BANK_C000_A .MACRO1 d; G* G9 d" d
- .ENDM. J# S* q5 a( d5 y& p, g7 n
- # J& _: `7 ^- b# E/ h" a# W6 `
- MACRO_SWITCH_BANK_E000_A .MACRO& \2 W# p" q- |$ r2 B
- .ENDM( ^" y+ i* ^$ l" ?
- . ~" K- b3 x5 }
- ;====================================================================================================
1 @) |( Z3 [( l9 k - MACRO_TRIGGER_FIRST_IRQ .MACRO
( c' C: }; b! o6 O1 \! a5 i ` - LDA #IRQ_SCANLINE_BEGIN + 1- `) G8 x I; m) b
- STA MAPPER_REG_IRQ_LATCH- N+ j6 R+ ?8 s# W" _
- STA MAPPER_REG_IRQ_RELOAD
( b1 W0 [* W" Z! [4 s0 j - STA MAPPER_REG_IRQ_ENABLE' H8 {6 S; ]" _% \% \. p
- CLI
, G% a6 o; B5 k' [6 J - .ENDM
0 y+ u$ } e o6 ?8 b8 s/ O1 [; b -
: H) e) m2 t9 k6 U - ;====================================================================================================
/ o# Z7 U, X0 p5 _ - MACRO_ENABLE_IRQ .MACRO& c* H( n6 P+ k$ b# h7 |
- STA MAPPER_REG_IRQ_ENABLE- g0 N8 M- w! A0 Q7 w" A
- .ENDM* u+ ?5 C! B Q* I
- + y0 N% Z1 S( b4 _- y
- ;====================================================================================================9 b' [/ i; d( V* J0 A3 m* W
- MACRO_DISABLE_IRQ .MACRO
7 O& i; n" z2 i! n/ z - LDA #$00
1 S- V1 I: P+ O; G - STA MAPPER_REG_IRQ_CTRL
) r# p- J+ F7 |9 i - STA MAPPER_REG_IRQ_ACK( O6 F0 Q9 q" r% I; [$ Y
- .ENDM/ O4 e* U- e3 ]/ A1 c
- 8 w! [8 j+ b/ W f4 P4 I" R% \
- ;====================================================================================================
& v. P* ?9 U% u5 S - MACRO_ACK_IRQ .MACRO- M( v7 D- {: y4 Q8 z. O
- STA MAPPER_REG_IRQ_DISABLE
! t. V+ p. z. K0 q- @! l4 v, O/ i - STA MAPPER_REG_IRQ_ENABLE" e, E& O" B2 h& s0 t/ f: O$ m
- .ENDM" ?# h$ A% v) {8 G6 K/ z! D
-
( B) ?) x1 S% W; Q# |1 A - ;====================================================================================================! C, g# R- a, ?. x
- MACRO_IRQ_OPERATE .MACRO3 H }- B+ N8 e; b/ D
! b' l; P7 O$ R, b% g& ~7 p1 B4 ]- ;==================================================
) ~- J; F3 D/ U5 N5 x - ;IRQ滚动模式常量" ~6 p' o2 t7 T/ r9 Z( V
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动8 R9 j, ~& W; y; V+ k. ~" B" A
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
* W5 m+ }; u+ X2 ?: [ - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
; }! I6 ~/ D+ }1 Z, h7 w! g+ E- J
% [) o1 q. t2 d! E- ;IRQ扫描线数据& k: y8 @, x, K
- IRQ_Scanline_Data% n/ ^ j$ L) L \0 l1 V( b
- .DB IRQ_SCANLINE_1( U6 j% Y! a0 {# @1 u
- .DB IRQ_SCANLINE_2
( Q8 x7 Y; ^9 |- I3 u5 Q - .DB IRQ_SCANLINE_3+ [/ c t% Z# i- `
- .DW 00 ;关闭IRQ3 h' n$ t, `9 d( v" d i1 @* Z, A
- / M# F& F8 d6 E4 @
- ;IRQ滚动控制模式
9 u0 d1 u/ l0 c# b1 p9 X4 ^ - IRQ_Scanline_Mode
# r1 T; ]2 j+ M i- Y0 O3 {# M - .DB IRQ_SCROLL_MODE_RIGHT, v# Y( D; Q2 X3 J8 w
- .DB IRQ_SCROLL_MODE_LEFT
4 J1 Z2 K6 Z% O3 V1 E - .DB IRQ_SCROLL_MODE_RIGHT- h* t) {# L" y7 ~" Q- j) E: W
- .DB IRQ_SCROLL_MODE_LEFT: Z1 c# Q+ }. l0 _) ~: G
- & y7 J; X( G* Y' j: w- g. {: F& t
- ;==================================================% @: ]8 S4 P% C/ q& |3 m; v
- ;;IRQ滚动控制8 q# y5 y& Y7 H( p5 I1 n& T( [
- IRQ_Set_Scroll: ]" {2 `* q6 x- V8 u
- LDX IRQ_Process_Index
: A$ Z, @; K3 t z- _ - LDA IRQ_Scanline_Mode,X5 X& R4 e: \: f8 H
- CMP #IRQ_SCROLL_MODE_LEFT8 @; p5 u: Y6 r3 g# k! L. P
- BEQ IRQ_Set_Scroll_Left
& D5 U- u; F9 r: J" x7 Z - CMP #IRQ_SCROLL_MODE_RIGHT
; b- I1 r* C0 P# W5 Z$ e" y0 q - BEQ IRQ_Set_Scroll_Right
; B/ W6 U0 P" _" H2 X7 E - IRQ_Set_Scroll_Zero;不滚动
/ f- G" w j% F1 l4 Q H% V4 a - LDA #$004 f% ~( b0 M& ~& t: f
- STA PPU_SCROLL5 Q3 O% R; {+ M" p$ D$ I
- STA PPU_SCROLL
" o4 p% r% ~! S" c - RTS" w8 {2 L8 S& X; l) u; k, [
- IRQ_Set_Scroll_Left;向左滚动
0 b u7 p& [; j - LDA Scroll_H; N! S5 \3 S7 x" M8 T% L; _
- STA PPU_SCROLL" n9 g/ Z( B3 Z
- STA PPU_SCROLL
/ q: w6 G7 K, L4 N6 V( g - RTS
( o7 }* r0 M9 U# |2 C; ]2 Z8 u - IRQ_Set_Scroll_Right;向右滚动
) K9 X& r& [5 e# Y8 Q, a - LDA #$006 i6 T# [. r& I: r ]7 D0 ]
- SEC7 G. _6 |/ N+ u4 U) w8 F8 w4 ^
- SBC Scroll_H5 w* @7 R8 r6 w" I3 E
- STA PPU_SCROLL( {( H, S6 |# L8 F7 {
- STA PPU_SCROLL# l5 E3 m0 f) N$ R- Z
- RTS' ]1 c" t# N! d7 U
-
% U( [' R# S9 \2 o5 K - ;==================================================) K: W8 T+ K6 D9 n# L7 I6 s
- ;;IRQ滚动控制
1 C$ n& k3 A4 G" N) ~( y; ^; o' ] - IRQ_Set_Ctrl7 F+ P9 _3 p( V+ r' r
- LDX IRQ_Process_Index: }6 ^5 ], Z @* y% i2 E- Q( ~
- LDA IRQ_Scanline_Data,X
0 ?, |/ L z# g }& l: ~8 @. T - BNE IRQ_Process_Latch, g% t+ a k8 f7 p% Y7 l8 l
- IRQ_Process_Disable;禁用IRQ- T/ ]1 k5 X% E( V
- STA MAPPER_REG_IRQ_DISABLE# a+ Q' M' V9 u" V _* t
- STA IRQ_Process_Index
1 ^, |8 `; a1 Y - RTS
4 @/ N. P0 o! f: t# e$ P - IRQ_Process_Latch;设置下次 IRQ 触发扫描线! ~: {5 u$ S6 N: K6 A- B4 a& {
- STA MAPPER_REG_IRQ_LATCH
6 z* x1 [0 @6 p! g" L/ ]7 [0 \% C - INC IRQ_Process_Index- ^& J K- f. y- e% g
- RTS
/ b0 W j1 Q0 e& X3 p* b/ s - : D" q0 H9 S7 ?2 a( U
- ;==================================================( Q) v4 a; d* l6 o8 G
- ;IRQ处理
5 o: D! i1 [" | j- s - IRQ_Process_By_Index
6 ?- o7 y' A% D9 i" p - JSR IRQ_Set_Scroll
- N; v! _) X7 K8 k - JSR IRQ_Set_Ctrl) e3 E2 Y6 n3 `7 ^4 [
- IRQ_Process_End
1 L6 S Q# z3 K5 C - RTS
, y, b% K1 P; e6 r. V -
8 O" r0 X+ A7 E' [* A - .ENDM
! h0 W T' N$ ^. U- G - 6 M3 V4 _& y; V% q6 }: b4 c
复制代码
4 x" N3 ~" [- ~/ ]$ k& ?9 E
; E! r2 N- U! f2 G* J+ c) {代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|