|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ( y L& c1 l6 l; }5 p
( M* Z8 |; @" g5 J8 i% y本次IRQ研究了如下:" Y1 V; ]6 l8 t, S
VRC2&4(Mapper21,23,25) W* W6 O' g- j/ ?
VRC3(Mapper73)1 B1 r; a2 J& @5 D! r1 _
VRC6(Mapper24 & Mapper26)* U2 H* P0 G5 L3 t- s- ^
VRC7(Mapper85)
) U6 n8 \: `, yMMC3(Mapper4)5 D! i' S/ c3 p: Z6 C F
MMC4(Mapper10), i( N* d9 h2 y. L. m3 x/ U
MMC5(Mapper5)
/ d8 p! Q7 w+ d; g9 cMapper18
' h! ]/ z* a' M* {+ CMapper648 Z/ W y. o% N* F8 A" j3 U2 o6 w
Namco163(Mapper19); o+ w& Z' A) P: V W3 Y% o1 o' {: g
Sunsoft FME-7(Mapper69)! m2 G- ~6 T) Y s" b
% k( j! K- p. r* i' z9 o0 X8 g共计11种Mapper的IRQ操作使用例子3 y% j" X1 H y+ N
代码内有详细注释, 希望能帮助到感兴趣的人.
; a# b9 M8 _ y6 F B3 C$ L5 k7 B6 s# F7 e& v0 l4 h
  ! \2 T+ A$ b) i1 T( ]- m( y
2 i' u& O T$ ?. TMapper代码主要逻辑(以MMC3为例):$ U. k% ]& {; O7 c) _
- , o0 W3 ?$ m& B: t
- ;==================================================8 T& y) b }8 g
- ;Mapper号
0 X: o0 ^% ^" E8 d! j% k - MAPPER_NUMBER = 04. z6 I( s+ i D$ l& }
- ;==================================================+ Z5 t0 v$ F% V" U4 v
- ;MMC3 (Mapper 4) 寄存器常量& c" u; R" g6 f5 A7 t$ D* N( d
- MAPPER_REG_BANK_CTRL = $8000: A& ~ P$ s0 D4 n! j2 ?
- MAPPER_REG_BANK_DATA = $8001! r: V7 g0 b) t ~; |+ J0 s
- MAPPER_REG_MIRRORING = $A000
4 I5 K) g) G0 |; P' n - MAPPER_REG_PRG_RAM_PROTECT = $A001
% D1 {4 J; ^, j; Q - MAPPER_REG_IRQ_LATCH = $C000
3 D# C0 {) [) ?) c - MAPPER_REG_IRQ_RELOAD = $C001# t5 b( S) d# ]- y
- MAPPER_REG_IRQ_DISABLE = $E000
2 M# o3 Q! K- N( V$ E - MAPPER_REG_IRQ_ENABLE = $E001
9 Q# @6 k/ f% [/ s- o- a3 N - ;==================================================0 Z8 Z* h& j7 B/ E
- IRQ_SCANLINE_BEGIN = 135) `. B E$ J. m6 j* ^% R {* ~: n
- IRQ_SCANLINE_1 = 8
! |8 s% L7 `" _1 I* P: X$ B - IRQ_SCANLINE_2 = 54
9 |* d4 r% q) F5 Y - IRQ_SCANLINE_3 = 8" p$ s' q6 v# d4 z' _
- ;==================================================; a- l7 h9 O; u7 [4 H
- ) n7 o) S8 G& G1 F7 X
- ;====================================================================================================
: x6 H& v: s3 p3 h& P+ E2 i - ;宏常量+ e: R2 c6 Y$ ], b0 [5 S
- ;====================================================================================================4 w1 X; V( O3 e+ o- ~# q5 {/ R( V
( c' a2 T% Y6 v! r# B: j* K" ?- ~- ;====================================================================================================- C6 S( W& ^! I! b/ M4 _
- MACRO_MAPPER_INIT .MACRO0 @8 [; I) V, y- ?' `3 ]* q5 m2 h0 {
- ;禁用IRQ/ s6 m6 x% s4 z$ m! _ B* P
- STA MAPPER_REG_IRQ_DISABLE! M( G" p+ N3 g8 }" ~9 [8 x" i/ J: F
-
4 q( {) f5 Z3 x, s8 g' x - ;水平镜像8 u# G6 Y Y# @& U# [( @, `
- LDA #$01
/ D9 ]3 a+ I$ p {% H0 o2 l - STA MAPPER_REG_MIRRORING; d/ i4 n4 I" s7 N% u- y
- & S. |. }. Q' i0 t1 W8 m
- ;初始化图形bank0 Q3 P C& P3 C3 B- o# A7 U3 _! D
- LDX #$05. ^ u& H/ J( T @: }
- .Init_Chr_Bank
/ k4 `/ v* n t9 ~5 h - STX MAPPER_REG_BANK_CTRL
0 U6 j; @ ^" y; g$ g - LDA .ChrBankData,X) D7 z, O7 x- g9 Y& H- S' \% l
- STA MAPPER_REG_BANK_DATA
; A2 l' ?$ i6 X* Q! X; U" \0 g - DEX
1 j8 O& r5 y1 n p; h% A9 S - BPL .Init_Chr_Bank
5 D( f: s9 ^" J; G7 j) s - JMP .Init_Chr_Bank_End6 m4 x; _1 _: P! o2 b# |% O6 X
- .ChrBankData
( ^7 \# z+ I& d' w% s7 Z - .DB $00,$02,$04,$05,$06,$07
" C J7 C4 k2 ]; D5 S - .Init_Chr_Bank_End
: {1 }( ]7 ?0 L3 J- Y$ G. \! J - * Y2 n$ k9 |( I! R1 L5 Y( H! e
- ;启用SRAM8 [9 B7 m2 c& w- i
- LDA #$80
) Y2 N0 J0 Q8 h/ d! A2 @; B8 ` - STA MAPPER_REG_PRG_RAM_PROTECT# h0 A/ @3 }& [" R( u
- .ENDM% i) n0 b' G; i! O5 |
- 4 y8 u" `1 W$ F, V; X" B0 S3 V/ ?
- ;====================================================================================================, b- T2 n* J3 J5 e4 ?
- MACRO_MAPPER_SOUND_CLEAR .MACRO+ V) a8 u$ N8 W9 d
- .ENDM X& H: o. ^/ T* o* t
-
7 a' f( B M4 A8 Y# x - ;====================================================================================================
9 B, P+ J& s5 J8 b y - MACRO_SRAM_ENABLE .MACRO
8 v! {+ g3 L+ g. l G - LDA #$80/ o2 x3 `9 P" _: n( ~2 j" S* H
- STA MAPPER_REG_PRG_RAM_PROTECT a1 c3 L. t6 b8 O
- .ENDM, S: ]# D/ Z; R, U8 d# m1 l
- 0 w' b# s( r- q5 l4 B+ `
- ;====================================================================================================: Q* b" m2 C2 T, \ e0 G
- MACRO_SWITCH_BANK_8000_A .MACRO
! r6 X, c% E& ^% z: c - PHA9 i, b* O) X X4 j+ s
- LDA #$06
% n# i# x7 G0 ?8 E& T - STA MAPPER_REG_BANK_CTRL% e) z$ T G' }# s# F
- PLA
' F& Z- [ X2 V0 ~8 g - STA MAPPER_REG_BANK_DATA
& `# d7 J! ^4 { l7 J- A: \1 G9 q - .ENDM
% X' H3 D8 n2 P
, E K& y) L3 z- MACRO_SWITCH_BANK_A000_A .MACRO
0 ]8 B1 Y7 c+ C# x9 V# Z0 R - PHA
# Q& k6 G$ `) t; y; X; ~ - LDA #$07
' j9 P: T7 d/ u6 Q: o+ ^ - STA MAPPER_REG_BANK_CTRL" j: ~5 t; W8 k. K% m/ K! l- ]
- PLA0 F0 q8 w5 p; \6 O- e! G
- STA MAPPER_REG_BANK_DATA
4 c, f8 j/ K' g; d4 w - .ENDM
- i1 c8 b% n! x7 r0 y7 ? -
! ?1 ~$ Z( U+ e4 ]' ^/ ?: K - MACRO_SWITCH_BANK_C000_A .MACRO9 v6 {, P' i( }& J
- .ENDM% \( N7 v# U7 O* c4 d: B3 C
- # k* C/ n- }! E+ e: }7 ], z" L
- MACRO_SWITCH_BANK_E000_A .MACRO$ M9 F) ~& B& s- ?2 ~/ c
- .ENDM. @7 d3 P5 [# o9 `- W* j& K
- & `/ |0 M( t% I. Y2 U3 [) W
- ;====================================================================================================
. J- `8 z' I' } - MACRO_TRIGGER_FIRST_IRQ .MACRO2 m4 s! k3 m, Q3 A7 Q/ M
- LDA #IRQ_SCANLINE_BEGIN + 1
5 G! g4 V; [/ g, O7 A. |- _4 b - STA MAPPER_REG_IRQ_LATCH
/ ^. I, {" ^2 J - STA MAPPER_REG_IRQ_RELOAD+ K/ `8 H( n% n2 H
- STA MAPPER_REG_IRQ_ENABLE
+ H, m) Q' b5 D+ @ - CLI
" T1 \+ P8 f% [) l; ^ - .ENDM
/ V9 v5 S/ h* s, N. j% Q) K( l" { - , H9 n% W8 l+ U7 C4 k$ f5 E F6 [
- ;====================================================================================================( B8 {5 b; o" N$ s
- MACRO_ENABLE_IRQ .MACRO7 \3 M+ [" z) G& I; j6 ]/ ]
- STA MAPPER_REG_IRQ_ENABLE' l+ L+ S" J/ W9 P4 |
- .ENDM
5 B, M* A2 q5 R# Y& J, V - $ \( X5 V; x& g3 Q, B
- ;====================================================================================================! i, K, Y9 _# k. g
- MACRO_DISABLE_IRQ .MACRO
, }* [ U1 S# T6 Q - LDA #$00" y1 r1 B7 E# x5 Y! s" O
- STA MAPPER_REG_IRQ_CTRL
$ K/ U% O* Z% R- o/ i7 v2 `2 h - STA MAPPER_REG_IRQ_ACK
, s B! j' j3 ^ - .ENDM
' t! d+ ?: O/ q( v -
# o) `" v" b& {# f! _' h S - ;====================================================================================================
1 w. C6 _% g f. m0 _ - MACRO_ACK_IRQ .MACRO
, \8 g7 I) f( `! U, @( S: f4 C - STA MAPPER_REG_IRQ_DISABLE
) n* m$ @; ~4 ]6 s3 S8 S# s! R - STA MAPPER_REG_IRQ_ENABLE1 w: g) K# K& H
- .ENDM3 O6 G7 j1 g- z
-
( n; i6 e3 U4 W4 M5 o - ;====================================================================================================% K. ?- ~- \& L- o$ `
- MACRO_IRQ_OPERATE .MACRO6 p2 P) f$ J' d, [
- : d7 X6 \$ u6 b$ z% D, S; t8 d
- ;==================================================
# N0 l: a! K6 B! e: g. m - ;IRQ滚动模式常量! B/ R4 T/ W+ U/ c
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
% z( c. ?" Z' j8 I - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动8 W/ K y& V- E- Z2 H
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
1 q+ j0 A" |; {, F
3 W6 u# x7 E3 |) U4 v1 U+ z+ N, ]- ;IRQ扫描线数据% N2 p: f) d$ Z7 s
- IRQ_Scanline_Data7 q1 A3 M H9 x9 v9 H/ b
- .DB IRQ_SCANLINE_17 B0 \/ X2 p. X( N
- .DB IRQ_SCANLINE_2+ P3 I3 h# z9 a% k
- .DB IRQ_SCANLINE_3
- f/ K/ a4 Z' A _+ C - .DW 00 ;关闭IRQ
! P& l: x( K3 w. g( u1 C5 r5 Z
e* ]) ` L0 D$ }, U- ;IRQ滚动控制模式* u! i2 S+ v* X3 l( _5 w H/ ~
- IRQ_Scanline_Mode4 k2 Y6 ]8 V5 @. Q; t. C4 ]
- .DB IRQ_SCROLL_MODE_RIGHT. i: d" R: |% K0 i2 V9 |
- .DB IRQ_SCROLL_MODE_LEFT3 N" k! |" a3 [: _! z1 K: H5 o
- .DB IRQ_SCROLL_MODE_RIGHT
; S$ F! w) K6 R6 w& U - .DB IRQ_SCROLL_MODE_LEFT
4 f5 g; W8 K. O0 H - ; X( @; ^7 T: e( ~# ]' N' Y% s
- ;==================================================+ v! f# X$ m% s5 V
- ;;IRQ滚动控制* J# E! ]7 o Q& u* O
- IRQ_Set_Scroll' z$ D: } Q7 R+ {
- LDX IRQ_Process_Index8 o6 k: h$ y6 C( h% k
- LDA IRQ_Scanline_Mode,X( w: s8 C7 v; C- @( x- s: {
- CMP #IRQ_SCROLL_MODE_LEFT; q9 u6 L/ X# O l
- BEQ IRQ_Set_Scroll_Left8 B, ^' f; n/ Y7 P
- CMP #IRQ_SCROLL_MODE_RIGHT
8 e+ L3 ]1 |1 T2 [ - BEQ IRQ_Set_Scroll_Right/ g2 _( j' z' g
- IRQ_Set_Scroll_Zero;不滚动4 O- H2 Y. v! {9 ]& @$ y
- LDA #$00
, |) s* e: W3 E - STA PPU_SCROLL
6 A; `+ E7 `% V! {7 F+ B5 Y; U/ ?1 j0 k - STA PPU_SCROLL
g+ A+ e! Z+ Y7 |( R7 `8 D u1 m. l - RTS* Y. m. g4 ` ~8 g i: z4 H* H' @
- IRQ_Set_Scroll_Left;向左滚动- A, H0 z& @8 K
- LDA Scroll_H
. y7 Q# h7 m' C+ M/ `" y4 P - STA PPU_SCROLL" l: A2 H+ Y. {" }( K
- STA PPU_SCROLL3 x. C1 S; J: D: d
- RTS
0 v1 r+ ]) H8 M# l! D - IRQ_Set_Scroll_Right;向右滚动
) v( o# y7 ^0 ]6 p - LDA #$00& n; B' k; V( `# X
- SEC" L9 ]5 j; }( _: A% i" e( j- F
- SBC Scroll_H
7 m( x1 Q; M' T( [. ]* E - STA PPU_SCROLL
9 W! n7 K$ W$ o+ n - STA PPU_SCROLL
" T! N: [+ p; }% z4 r& l - RTS
! v( A0 P2 q* ^( I' y2 \ -
8 t- w, h A l - ;==================================================0 U6 {8 L! m7 ~9 [0 T- d
- ;;IRQ滚动控制, Q4 D6 E7 a- n$ P" ]* l: z
- IRQ_Set_Ctrl
. L7 h3 V3 w# X* _ Y; q - LDX IRQ_Process_Index; ~# q$ j) B% B- m8 q% m, k2 ?6 x+ m
- LDA IRQ_Scanline_Data,X
+ K* G$ ~2 T7 f: z6 _# T - BNE IRQ_Process_Latch3 L8 s3 o# P/ X6 u2 B
- IRQ_Process_Disable;禁用IRQ
$ H$ e% y! u& N - STA MAPPER_REG_IRQ_DISABLE; }. n# A6 S7 x1 [, c0 H/ D( A
- STA IRQ_Process_Index
9 h4 {' X/ `# A# _, { - RTS! w8 ^1 t" k/ O0 g4 I5 O6 @: [- t* L
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
# C! h! m$ X& n - STA MAPPER_REG_IRQ_LATCH) A- z% ]- ]' F, z" F- m( E6 r% P
- INC IRQ_Process_Index
- a d+ l0 j* J, D9 @( K - RTS
; @1 m8 H) x" V3 j& b - # d! T) M/ s- X' W0 v
- ;==================================================
4 ?, F# s' y( S! _ l0 X' W - ;IRQ处理$ _0 E' } a$ J3 E
- IRQ_Process_By_Index* D5 ?6 ?: l! K' u, z
- JSR IRQ_Set_Scroll! [, s0 ^! ~+ u0 |) t C& [
- JSR IRQ_Set_Ctrl
( q7 {* N$ e, Y8 K - IRQ_Process_End
/ Y9 c' K1 l0 s% }+ p3 w9 V- e - RTS" X0 w$ @0 n3 ], i" R
- 4 j/ w6 G# @" U. Y
- .ENDM
) g, [% J$ b( V0 `/ W0 t - , W9 x9 q3 c$ N7 F" B1 j) v
复制代码 ' B+ a* P5 M6 O: Q- @- U* m1 |
& g$ f) O% G' V( |: ?0 p% s代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|