|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 1 Q/ j6 _/ t, N! u+ k2 Q
- ^# c2 G# T6 ~* n# Z* n# W本次IRQ研究了如下:- s; c1 \& ]0 h. Q5 I- @" q
VRC2&4(Mapper21,23,25)
7 i6 v& `4 e& I ^, V6 K3 DVRC3(Mapper73)- s, V8 b) ?! n. s/ i6 q1 P
VRC6(Mapper24 & Mapper26). y9 w( i2 d8 l0 {* g0 Q- ^$ m
VRC7(Mapper85) ]/ b) u+ S1 {+ R3 v, J
MMC3(Mapper4)
& ^ Z+ p1 |6 IMMC4(Mapper10)
" n. Q4 ]" u; |- l, o9 f( M0 ?0 c: LMMC5(Mapper5)
0 {9 G0 \2 G( Z3 d1 I) yMapper18
] C8 X4 a% n2 _& V. \) ]Mapper64# T* D$ ~* r% c3 ^2 ^$ N% y1 N0 h
Namco163(Mapper19)2 V0 x) N8 ]: g/ _3 `5 ]$ b B
Sunsoft FME-7(Mapper69)8 U6 S. C4 n% e! Z0 ]- ]/ q1 B$ X
; A5 M0 ^% w9 L" K) C) W共计11种Mapper的IRQ操作使用例子
( l! a2 Y: @. W, p' Y- o, t代码内有详细注释, 希望能帮助到感兴趣的人.
( f& l8 G; o/ A/ g( m4 M5 V i, t
- }( [/ }6 S' d* ^% T3 k- Y M5 ]  $ ~$ h, S1 Q+ @$ u
" i% d3 T8 W' B& F8 |7 s7 B4 S
Mapper代码主要逻辑(以MMC3为例):. x0 R4 Q5 Y! O" X; J5 y! L# t
- 8 R) A, l$ }( o* e# C2 `
- ;==================================================: j0 O; l( ]# i1 u4 q
- ;Mapper号
2 o' ~1 N6 A' e! T- m S - MAPPER_NUMBER = 04
& o! V1 m# F9 T |* ] - ;==================================================
5 [. E" _1 E3 e% { }# t5 F - ;MMC3 (Mapper 4) 寄存器常量
5 t u: z; x# y E. S4 @ - MAPPER_REG_BANK_CTRL = $8000
8 H% @4 U' I1 u7 v! J - MAPPER_REG_BANK_DATA = $8001
! t. h" `2 O+ M% F8 A" D - MAPPER_REG_MIRRORING = $A000
. Y2 i- ] n( w - MAPPER_REG_PRG_RAM_PROTECT = $A001
/ \8 y9 X& \ a6 x/ N4 R u! ]+ Q" `9 j - MAPPER_REG_IRQ_LATCH = $C000; l _- b& X$ X G4 t5 J) b& V
- MAPPER_REG_IRQ_RELOAD = $C0011 u7 i, k2 [/ P8 F- D$ c
- MAPPER_REG_IRQ_DISABLE = $E000
! g W6 E! P' u" V - MAPPER_REG_IRQ_ENABLE = $E001
' t6 k8 ^+ p/ `3 h5 U% i+ K - ;==================================================+ z" j9 a" s; o \$ u0 U/ k% p2 C
- IRQ_SCANLINE_BEGIN = 135: ]" B. z e) v- z8 r
- IRQ_SCANLINE_1 = 8& H) X1 W) n. \* l- Q
- IRQ_SCANLINE_2 = 54
) O3 @1 y& g: s/ _8 R1 U- t" a5 n' P - IRQ_SCANLINE_3 = 86 U M! f( t/ v3 S; x
- ;==================================================/ y3 F& Z( ~7 V
- 1 i' n/ ^2 F0 y
- ;====================================================================================================
% s, ]; J3 K( C, `0 W - ;宏常量
! f9 N( P. }6 \7 K6 v - ;====================================================================================================0 \1 x* I C; i1 T6 \
- 5 L) P2 _8 }# { \3 w8 l! @
- ;====================================================================================================
& G& E" |' R" T! j0 |) Z: f - MACRO_MAPPER_INIT .MACRO
' H- _% [/ B( Q5 O; I1 Y3 ]1 D6 p5 q6 ? - ;禁用IRQ, i& H; g+ X. l. g6 N) G; H- C
- STA MAPPER_REG_IRQ_DISABLE B" h3 {1 K7 M5 x% g( U1 h
- Z" ` D9 F' r4 H
- ;水平镜像0 o3 I) z# \, S7 b* e
- LDA #$01
$ B* |/ x- t: h* z7 a3 E3 @ - STA MAPPER_REG_MIRRORING; A" u3 N* v( H; k% N: t
- % }+ L% B) w9 w/ D0 P2 i
- ;初始化图形bank. E2 D: H' s2 H( V
- LDX #$05& Q5 z' B! b# @+ y! z; P3 l
- .Init_Chr_Bank! D& X! u( `4 i2 F/ U2 n! y0 W( j
- STX MAPPER_REG_BANK_CTRL
4 Z+ X: I: z+ J4 |. X$ l8 y' M - LDA .ChrBankData,X
: @, O2 ^& ?6 } h9 _" Z - STA MAPPER_REG_BANK_DATA }* ^. r5 X/ { Q0 @
- DEX
' _" ]. A4 s" R1 r* }$ C - BPL .Init_Chr_Bank* L8 U+ [6 X" c- P, |
- JMP .Init_Chr_Bank_End. T8 |" m( O. f
- .ChrBankData
I! {) ^$ s2 j& Z# d* x - .DB $00,$02,$04,$05,$06,$07
+ a# t- F3 u8 N d: T/ L3 U3 e - .Init_Chr_Bank_End
, D3 r: }3 u" k! M) A$ { - # }$ Q" e) s) z. ]) m) s" V
- ;启用SRAM3 }9 D+ A% p/ q- v# p; B1 a
- LDA #$80, _3 k& t9 q7 d0 }9 j% w
- STA MAPPER_REG_PRG_RAM_PROTECT9 D& O5 W6 U- P' [ }
- .ENDM
* j" g. H! D3 ]4 h" b8 |
6 K% O$ k- d6 s5 C$ ]9 s- ;====================================================================================================
% i$ e; P* [! x6 S6 F - MACRO_MAPPER_SOUND_CLEAR .MACRO
+ d' f; V4 t( |8 W. h) A - .ENDM7 x& N, n C l5 L% j! ?
-
0 |- j- ~8 Q. c( N - ;====================================================================================================' [- Z# r& z, O; s/ g3 {. J }2 O
- MACRO_SRAM_ENABLE .MACRO
; k- O s! I, s - LDA #$80
8 ^1 m$ j5 w3 j6 k Q0 M8 }3 K - STA MAPPER_REG_PRG_RAM_PROTECT7 _+ g7 k4 Z4 ]" A X
- .ENDM
9 }; ~3 H- R, @& J; Q3 ?- x1 C -
0 X1 i2 @; @& c! J% A" @ - ;====================================================================================================# r- o$ {/ s' S0 t0 p. E
- MACRO_SWITCH_BANK_8000_A .MACRO
) U2 n" F' N8 z7 s, A$ h - PHA
( l0 y+ c* T# \7 M - LDA #$06
8 h5 F; ^. ~1 n' k: P - STA MAPPER_REG_BANK_CTRL- J8 ?( f0 }3 ]
- PLA( m4 j- s) \ i& H. B. X
- STA MAPPER_REG_BANK_DATA: p3 r0 q7 ^6 I9 p
- .ENDM
- U& y- [' }: a- t% M
4 m; I; r1 @7 J2 M% f. y- MACRO_SWITCH_BANK_A000_A .MACRO
" d/ \ n! O( G( | - PHA: c* I# Q! P. j' P/ G
- LDA #$07
* ^1 J; s) X3 z/ }5 | - STA MAPPER_REG_BANK_CTRL) A: p0 d( W9 q8 L
- PLA& B. J: s% R+ n" @& J4 Q' D
- STA MAPPER_REG_BANK_DATA. t6 ?, i& Q+ _' D
- .ENDM
. d# `$ z) @7 C9 t1 m - , C p& r6 K# B5 k4 d( U
- MACRO_SWITCH_BANK_C000_A .MACRO$ Y7 r6 B& E6 t+ w7 g ^: v3 U
- .ENDM$ ]- r$ ~; Z, q9 N, [
! l* D* R; i% R* L- MACRO_SWITCH_BANK_E000_A .MACRO
# P, c* s6 F! n4 i - .ENDM
+ W. d& k! ^& u; o
8 T9 j! a6 y3 m4 |6 K" N- ;====================================================================================================
( ~0 W- e9 y* z9 p* Y - MACRO_TRIGGER_FIRST_IRQ .MACRO
# _6 g# `" v; p9 S9 j - LDA #IRQ_SCANLINE_BEGIN + 1
8 f7 ~- D! A, d7 N - STA MAPPER_REG_IRQ_LATCH5 z+ H: `. p/ D2 z8 ]4 a- }
- STA MAPPER_REG_IRQ_RELOAD! P( h- Q+ t5 y% J
- STA MAPPER_REG_IRQ_ENABLE- b7 P' ^8 A" I7 c
- CLI
1 u) C& B0 I" d6 Z; C; S - .ENDM' O4 @2 g; v, j
-
6 ] o- ^* {2 d0 f( r v; v - ;====================================================================================================
: G2 `* L& g) b! [1 u - MACRO_ENABLE_IRQ .MACRO2 p5 v; }6 l% H: V( c; u. p G, d
- STA MAPPER_REG_IRQ_ENABLE
: k9 P2 L! ~1 }+ o - .ENDM6 U+ Z# r( F; d3 n
-
" z0 \5 A4 F S" U1 k7 t5 z0 r* j - ;====================================================================================================
( O. r3 Z- V4 t9 E - MACRO_DISABLE_IRQ .MACRO
" l6 M {$ U" R# j4 t0 |: x - LDA #$00( N- O+ V' B( ~9 F4 O9 {
- STA MAPPER_REG_IRQ_CTRL! X+ u" ?& R4 M+ M# |
- STA MAPPER_REG_IRQ_ACK* f- z4 O$ y6 W: h$ i- ~ d
- .ENDM; `: Z8 E* H8 [) v: y4 v
-
' A' T0 y, X1 A |8 b - ;====================================================================================================
: V7 P7 K2 X; F; c - MACRO_ACK_IRQ .MACRO1 Q- G3 q; v( N% d6 t5 o% } z
- STA MAPPER_REG_IRQ_DISABLE
$ ?& ~3 V5 w9 T- g q2 H Z - STA MAPPER_REG_IRQ_ENABLE' n7 w) |* F# S Z
- .ENDM
) F; H' @2 p! e5 v8 k -
; M# C' H9 H# A0 m- F }& _4 K - ;====================================================================================================
7 ~& I6 E( W: n* `4 Z7 ? - MACRO_IRQ_OPERATE .MACRO
. |. h2 {; h+ z8 l7 x) v - . w$ ?7 l9 ~6 `9 B* O0 d( B
- ;==================================================
$ r; Q; `; u6 [$ B; `) g - ;IRQ滚动模式常量, S; V* ~$ O z- `" q) d" o
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
% ]: K0 M. X4 G - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动 G) A, c$ e- @% e9 }4 f( i
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
8 M5 L# M" R) v1 n5 j _4 a+ L& c7 \ - ; e$ o$ w: O# C' @/ J
- ;IRQ扫描线数据
" K [4 v) j4 ]# t+ |* V! J - IRQ_Scanline_Data, v. S( P0 `1 ]0 p9 j
- .DB IRQ_SCANLINE_1# _2 t; `! R! n+ O- ^9 z
- .DB IRQ_SCANLINE_2
, G$ Y- E S, C8 M - .DB IRQ_SCANLINE_3
" G& L, @: h$ c3 M1 h - .DW 00 ;关闭IRQ0 Q$ K& T9 d0 h
- a# F) a. u- P: c
- ;IRQ滚动控制模式$ y! G. ?; T& s. j: `4 T. B: ?/ o8 `
- IRQ_Scanline_Mode
# E' P/ E5 U+ i5 _ w - .DB IRQ_SCROLL_MODE_RIGHT; a& P4 Q9 |' ?5 X ^
- .DB IRQ_SCROLL_MODE_LEFT) P) E7 |3 c; H1 h$ z9 S
- .DB IRQ_SCROLL_MODE_RIGHT3 m0 k3 T+ j. g1 D9 H- O+ A8 b) \
- .DB IRQ_SCROLL_MODE_LEFT* P: x( V& B4 i
- 1 d. m2 `; d( g3 u3 ~
- ;==================================================
9 l2 W. P4 s% ]$ n - ;;IRQ滚动控制" F( o. d2 K9 Z1 D! f" l$ ~2 g( y
- IRQ_Set_Scroll
) g; `2 o" c+ j3 ~# t* \2 V - LDX IRQ_Process_Index
/ U8 R) p0 C. e5 l7 u1 ]( y+ t - LDA IRQ_Scanline_Mode,X7 j7 h0 E7 P: ~% S2 d% z) x
- CMP #IRQ_SCROLL_MODE_LEFT
% a5 v, ^0 j" K9 c. e4 B - BEQ IRQ_Set_Scroll_Left2 O! T- w+ ]: |: S
- CMP #IRQ_SCROLL_MODE_RIGHT
% @; a8 y3 W! S" s - BEQ IRQ_Set_Scroll_Right* Z# e4 u" Y+ C D- c5 i
- IRQ_Set_Scroll_Zero;不滚动# L7 p# T O- }8 m
- LDA #$00
- W8 G3 K4 _0 W& M% ~% J - STA PPU_SCROLL0 P$ S, P& r4 ]8 M
- STA PPU_SCROLL
* ]( c, k4 V/ v6 i& }/ g, r* e - RTS5 e0 I, k0 [# p
- IRQ_Set_Scroll_Left;向左滚动
* b( A$ L, }1 D - LDA Scroll_H; o3 ^, c+ R4 U" q4 W
- STA PPU_SCROLL
: c" T& Q, B: i z - STA PPU_SCROLL( e- m, ~9 G7 z3 c' ]
- RTS
/ G2 c, K) d3 V2 G; q2 k - IRQ_Set_Scroll_Right;向右滚动& z( v6 v, x5 |+ O/ ^
- LDA #$00, q0 F4 W* y @# K! q3 G- Y$ o
- SEC$ V! j. b" T8 O9 ]+ o. k; L3 ~, Z
- SBC Scroll_H
7 ~; n5 N8 q3 m& J6 b1 z% { - STA PPU_SCROLL6 t; I8 N" Q2 [3 l, P. g- I$ T. r
- STA PPU_SCROLL2 ^3 L% [9 D+ C3 b
- RTS
S [% g* X7 \2 c -
# n; l* z E" J$ a' J; B - ;==================================================' W! Q$ B1 j# c5 d& k7 X/ X- [
- ;;IRQ滚动控制. v# [% F8 C+ d. q+ H3 l
- IRQ_Set_Ctrl0 t. W, b$ c" ~9 o% ~0 G' @
- LDX IRQ_Process_Index
$ `' \) F+ ?5 u+ K- f - LDA IRQ_Scanline_Data,X
4 C! x+ T. i2 K5 r' _ - BNE IRQ_Process_Latch
1 b1 m/ J- `$ {7 Y! W& R - IRQ_Process_Disable;禁用IRQ5 J7 s% m) b( c/ x. o! F
- STA MAPPER_REG_IRQ_DISABLE
% F/ R6 ~9 M- T& W) o5 Z+ D - STA IRQ_Process_Index
8 c: V* x9 T( }, \ - RTS1 f9 n% n$ [& i% M* g1 I# f
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
( B# n- M3 @+ _- v7 J# q - STA MAPPER_REG_IRQ_LATCH6 R5 R# F+ @7 |, a2 E1 l; h7 U
- INC IRQ_Process_Index/ J# e# ]9 H4 ~5 t% |
- RTS7 K" k4 V% a H5 Y
: m8 K0 G% E8 k1 f- ;==================================================
4 a! X- @( T( v, F7 I) ?( n1 r - ;IRQ处理
% i6 I+ B9 Y3 t - IRQ_Process_By_Index
- p' ]/ p& g6 A - JSR IRQ_Set_Scroll
+ `7 o9 _ t8 q - JSR IRQ_Set_Ctrl
# ^$ S6 d' e3 E) O6 w ?) F+ u; B - IRQ_Process_End
& L: f2 K& A: T! y1 B7 d8 t) M0 ~! ? - RTS% G5 `0 e. \$ v1 S# W
- 8 k$ H" X$ J5 U+ w0 X7 w/ g: o1 f# @
- .ENDM
7 u4 l) i9 K, ]7 Q - ( X! V" C7 _9 M, A+ R0 r; D& E
复制代码 6 d* S& ^5 Q5 @4 m5 \* _
2 e; ? |8 v C
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|