|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
2 d- ?5 d/ {. w, A8 `% x5 s0 |8 P: {- R7 w* n) ]" C) l
本次IRQ研究了如下:% e0 f0 a% c4 Z- H
VRC2&4(Mapper21,23,25)
1 f; B1 ^1 O4 { w. _$ hVRC3(Mapper73)
; ^7 f. i7 ^/ w. v# q" J+ lVRC6(Mapper24 & Mapper26)* B8 x7 h8 C O* A9 |% M( u
VRC7(Mapper85)8 W" X+ v9 o+ a& v- H
MMC3(Mapper4)% @# B9 M o) |* D T( a; K* @
MMC4(Mapper10)1 V; R8 Y. w4 d! X! E% V" q8 I! f
MMC5(Mapper5)9 E5 I# ?2 C3 o5 T, f- P& N2 z
Mapper18. x5 H3 P1 f+ c8 k+ Q% A, I, n% v
Mapper64 G6 R: y* H) P' N A
Namco163(Mapper19) u8 w& O9 e9 R% @0 }! ?- t
Sunsoft FME-7(Mapper69)
8 T6 U* p6 r7 E8 C8 v
0 @9 l" p7 n/ x0 }; X共计11种Mapper的IRQ操作使用例子
* \. j2 r( L% o代码内有详细注释, 希望能帮助到感兴趣的人.
: n/ j! C* M3 u0 s( p3 v `. b% O8 X# j- `4 q1 m0 _
: c8 q6 x0 v. j* A" Y6 ?
0 y) B' Q, T: T# J6 _! C7 g
Mapper代码主要逻辑(以MMC3为例):
) h4 x* l8 r }8 l
s B/ ?" Z2 z: @+ Z7 q7 i1 ~- ;==================================================
) d7 k, p# t4 w' \ - ;Mapper号! r. F% Z9 m1 V6 r2 I Q
- MAPPER_NUMBER = 04
& Q) ~; b/ ]0 j3 E5 |/ s - ;==================================================
. L/ X" q2 [+ q' Y8 T y - ;MMC3 (Mapper 4) 寄存器常量
2 s+ X+ J8 J' V s9 g/ U; Q" N- Y! h - MAPPER_REG_BANK_CTRL = $8000
3 L T% N% b) q; K; h$ f4 L - MAPPER_REG_BANK_DATA = $8001
+ Q" e; j' M+ E! T& @+ e6 J, y5 b - MAPPER_REG_MIRRORING = $A0005 ^$ O8 Z/ W, y ?5 O
- MAPPER_REG_PRG_RAM_PROTECT = $A001- i9 z% H# _4 g+ h
- MAPPER_REG_IRQ_LATCH = $C000
/ Z2 a& d' ^( v) u$ H+ E* {/ E - MAPPER_REG_IRQ_RELOAD = $C0018 }1 s: `$ j; m7 |9 H& L
- MAPPER_REG_IRQ_DISABLE = $E0008 i! M: U7 ]4 i, y& R5 w/ U0 x- L$ ?
- MAPPER_REG_IRQ_ENABLE = $E001
1 d+ h5 y5 A# I/ p; g - ;==================================================1 ^7 S- ]4 u2 ]" x5 c
- IRQ_SCANLINE_BEGIN = 135
5 B8 H! L( W9 I. d4 h' O - IRQ_SCANLINE_1 = 8' |+ t3 D5 D+ P- M; j3 L8 q% Y
- IRQ_SCANLINE_2 = 54
9 b% h5 M; @# M, P - IRQ_SCANLINE_3 = 84 M7 z; P9 J" E+ E1 `( p, U$ e
- ;==================================================9 N4 Y/ j; q3 \% ]2 K X
- ( `0 V: V. W& |8 F7 P' `
- ;====================================================================================================& h. i8 T3 ]: w( T8 x
- ;宏常量
- F6 X0 Z# Y7 ~# E - ;====================================================================================================' J( y2 a4 K A: n4 W' ~, P
: a. r2 m' V1 l: ^5 |" A4 r6 I5 ^+ s1 M- ;====================================================================================================% Z$ ~+ t) H* @; O
- MACRO_MAPPER_INIT .MACRO' @" ?8 o5 l" {6 O( r3 `
- ;禁用IRQ
- p2 X5 y+ F$ ] - STA MAPPER_REG_IRQ_DISABLE
. m# a+ d0 i. U- W) w. V - $ S3 Y) h9 K. s$ f% b6 Y
- ;水平镜像6 ^" N8 y- \$ [, W9 d2 G5 ]
- LDA #$01
: D$ I$ e) M) c" V+ Y - STA MAPPER_REG_MIRRORING! I1 }( |8 [; T
- ) U' a6 _7 }0 H. I0 z& z% U q
- ;初始化图形bank" {0 z8 e% @: l
- LDX #$05
8 {) g0 l* l- F2 ^2 H5 b& p9 b - .Init_Chr_Bank
: j7 H6 {/ f: }5 Z8 q$ j - STX MAPPER_REG_BANK_CTRL
- E( @! l/ I' |- J - LDA .ChrBankData,X' n5 u* U9 P A7 j0 h, L6 s
- STA MAPPER_REG_BANK_DATA
; n/ D" f* b& z1 p6 L* x - DEX
6 M: \3 L8 M; K - BPL .Init_Chr_Bank
) q8 t" O ]: o2 z! @ - JMP .Init_Chr_Bank_End. O# s$ Q" r) Q
- .ChrBankData2 c1 B3 p& b$ a; F' c
- .DB $00,$02,$04,$05,$06,$07
- F! S0 z. u+ o+ [# t% d - .Init_Chr_Bank_End
e+ C$ R1 n: t -
! Q& S1 \8 F9 W5 ~# ] - ;启用SRAM
, i' L; U5 a6 G - LDA #$80
4 d; K/ b% w; b - STA MAPPER_REG_PRG_RAM_PROTECT
1 Y- H0 v1 W; w# \ - .ENDM
; r- A4 Z7 M- n4 h2 |" }. G- { - ; x. `- x$ ~( j, y8 b
- ;====================================================================================================
( s8 m% o- ]! n$ A& Q$ C$ t - MACRO_MAPPER_SOUND_CLEAR .MACRO% m# Z) C8 s9 {* @
- .ENDM! [! U5 ~- N, b0 N
- 9 ^+ C' E: a" v; i
- ;====================================================================================================1 `& [+ Z1 g5 w! f+ l. X! s0 T0 t
- MACRO_SRAM_ENABLE .MACRO
1 {- }7 x0 x3 Y% ?, h4 m - LDA #$80
+ |9 ]$ P' u6 W! z( G6 f - STA MAPPER_REG_PRG_RAM_PROTECT3 \; `" R( x" r
- .ENDM; b0 r* U* u- T" P4 c8 y$ K) o+ G
- # A( `% P: D, f
- ;====================================================================================================( a7 ]# |- d2 Y. J" i2 U/ Q3 n
- MACRO_SWITCH_BANK_8000_A .MACRO
% C9 E3 g: g2 _1 C - PHA
- S+ j/ U! B1 ^, N( i - LDA #$06
' O7 Z1 g8 b/ E8 J# ]% ^+ |* ? Y" p+ }3 D - STA MAPPER_REG_BANK_CTRL+ Z* d/ X; |- \' E- c6 r8 D" h
- PLA
1 t; X* i5 @; h5 ~) U/ }% \ - STA MAPPER_REG_BANK_DATA% D/ `, Q" B1 d9 A& n1 f5 o
- .ENDM
, N y. y( Y; t, x8 ]( y
6 J, l8 n! w7 }- P7 F- MACRO_SWITCH_BANK_A000_A .MACRO/ Q# h8 |, C! U X
- PHA
) W. i: E$ s$ K( I( ?4 t - LDA #$07+ }, V# H5 H1 ]/ K( G8 ^8 G
- STA MAPPER_REG_BANK_CTRL
" p/ o$ _: W8 T8 O - PLA
# c2 o' @$ h6 E$ F7 |/ ` - STA MAPPER_REG_BANK_DATA
1 s2 W ]4 [% A" {# W# ]6 \' ` - .ENDM0 q3 D- ?. E9 Z! l
- $ |, P. E8 \) [7 S) I
- MACRO_SWITCH_BANK_C000_A .MACRO
& S x% e! X5 d" a) n4 T - .ENDM3 g. z" O0 E8 G6 I
- . W3 }" s) J, k4 A+ Q
- MACRO_SWITCH_BANK_E000_A .MACRO4 f5 E; A' q9 j) M. p
- .ENDM" N6 c# F- s% e) ]( g
- 9 p- b3 ?; N, w" J
- ;====================================================================================================3 L, Y- e! i5 |6 L1 ]! R
- MACRO_TRIGGER_FIRST_IRQ .MACRO; k' d3 Z4 J9 o8 }
- LDA #IRQ_SCANLINE_BEGIN + 1" Z' a3 c) D* {5 o& G
- STA MAPPER_REG_IRQ_LATCH$ u- C; F1 h/ j8 Z1 I7 @4 b
- STA MAPPER_REG_IRQ_RELOAD
2 o3 q# w/ }" B! v% u# D - STA MAPPER_REG_IRQ_ENABLE! r& e$ g" Z8 \# u7 { o5 T6 n
- CLI
( j( ], G: ^1 U+ k! U b - .ENDM
- K" C. |+ f5 p) G& U( c - 3 t' z! Q4 z2 a( @( O
- ;====================================================================================================9 Y' s A* U8 }0 p' M
- MACRO_ENABLE_IRQ .MACRO
' p6 X2 { [3 L5 z - STA MAPPER_REG_IRQ_ENABLE/ d# E0 _! A. @2 t1 |4 \3 K
- .ENDM
/ Z1 R4 P8 }0 G: p0 j/ J -
+ J8 o& E$ {( H/ k, ?; G - ;====================================================================================================* N( |. E% D" _3 m: q) o/ M) t5 X
- MACRO_DISABLE_IRQ .MACRO
" `) Q$ k0 ?& `/ F6 b7 }4 ~$ j# e) h - LDA #$00
$ M! p; c- E) o6 X% L6 ~ - STA MAPPER_REG_IRQ_CTRL! i$ h. d8 c3 s" G6 O, Z; |
- STA MAPPER_REG_IRQ_ACK
1 q9 U0 W/ t6 `8 u7 B - .ENDM
8 l. |+ I' C3 b1 U -
, v3 ~& D) F8 q# ]7 ]; ]& y - ;====================================================================================================
7 @! C3 i! U8 \: e1 Q: }7 F+ x - MACRO_ACK_IRQ .MACRO
) f3 E5 b* P7 B - STA MAPPER_REG_IRQ_DISABLE
1 {$ j! L4 R. n! m; Z ^0 W' r I& N - STA MAPPER_REG_IRQ_ENABLE
( W* S% m/ h; ^ - .ENDM4 a# [% @. @4 S% |( b5 {9 \: C
- 7 O& @. ?, @: a6 o9 \- F" y2 u
- ;====================================================================================================
. i& e. A$ \/ @' r - MACRO_IRQ_OPERATE .MACRO) F2 Q# ~- K6 v4 q% a* l. B3 H% ~% v
+ n8 f$ s0 x- b. ]/ R$ S! j1 b- ;==================================================% X1 L1 C! c+ Z" e
- ;IRQ滚动模式常量
) N0 a7 F0 i# k - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动2 ~' O" c- x9 R+ m6 L9 G' ]0 P4 Y
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动" H+ }/ p8 U8 c0 u
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动, T) \; E2 X1 ?! f: c
- 5 c: y8 _' \" I t9 L
- ;IRQ扫描线数据
) F( B1 A: o. X) B }# v' { - IRQ_Scanline_Data
# W: I5 l H- C# F: z; e* h - .DB IRQ_SCANLINE_1
. x- G8 W5 k) H* V4 r - .DB IRQ_SCANLINE_2- G: C8 _, ]! ^* n2 A: s
- .DB IRQ_SCANLINE_3
8 n+ f0 d- L* k$ Y - .DW 00 ;关闭IRQ2 f3 m$ C, a# k" A G4 u, v
+ A; g/ c, t. s" v# Y5 \, N- ;IRQ滚动控制模式
! L d8 D4 Y8 B0 t - IRQ_Scanline_Mode2 u i5 |4 P Z5 m
- .DB IRQ_SCROLL_MODE_RIGHT
0 m8 Z$ H6 m2 n+ w9 p- Z4 l$ i - .DB IRQ_SCROLL_MODE_LEFT( u5 H2 ?( ~; D; G
- .DB IRQ_SCROLL_MODE_RIGHT
7 z9 n) N+ u2 u. p7 O) }5 K - .DB IRQ_SCROLL_MODE_LEFT
* i" Z; e1 M3 I/ k8 m Y. s - k( H8 h3 A% _) R" Q, u9 W6 M+ z6 b
- ;==================================================
# e2 C4 e* V; f$ L - ;;IRQ滚动控制% j) ~# f/ R/ z+ f) W; K* |
- IRQ_Set_Scroll
8 }/ u- C$ ?% e( U2 ^ - LDX IRQ_Process_Index9 w- [4 T; f8 ~& v+ f: L
- LDA IRQ_Scanline_Mode,X
) o, i6 e! \ I - CMP #IRQ_SCROLL_MODE_LEFT2 f9 v& o* X) `& ~
- BEQ IRQ_Set_Scroll_Left( q" `+ l4 X! ^0 D$ v m
- CMP #IRQ_SCROLL_MODE_RIGHT3 O- j3 [7 k& T8 W+ W
- BEQ IRQ_Set_Scroll_Right/ W; f, e: n, I- B
- IRQ_Set_Scroll_Zero;不滚动# m! W" R7 h$ y8 ~$ b- q
- LDA #$00/ I& r2 m" K) k. O
- STA PPU_SCROLL
' x( J! N0 d6 K3 V0 R8 ` - STA PPU_SCROLL
A0 {) }6 \0 { - RTS- H& G: X2 `$ ]% z! K2 h7 \
- IRQ_Set_Scroll_Left;向左滚动/ n# L. b' f9 j. b2 l8 e3 R
- LDA Scroll_H
8 `9 C9 a( Q7 E2 A( @: L$ z - STA PPU_SCROLL5 |/ K$ }! E+ `# V
- STA PPU_SCROLL
3 d- L9 B. b" ?% h' [ - RTS
z8 s* K( m! U5 _2 i/ ]) l$ n4 N; h - IRQ_Set_Scroll_Right;向右滚动
* m9 ]3 |) u+ {8 o - LDA #$00
! [' \( P) T. q( L0 ` - SEC
6 Q' I* a' X5 { - SBC Scroll_H
* s) W' S3 S# a+ s - STA PPU_SCROLL- C5 J* T% t0 K0 f S3 ]: J
- STA PPU_SCROLL: B9 p; V' j# K$ I a, @8 z1 t
- RTS
: \* Z- ~, Z( m, ` - ; J- b$ o/ q( m5 k- `- B
- ;==================================================
5 W" y5 o* l' K- b7 ^ - ;;IRQ滚动控制
9 ]0 Z7 S6 |0 L C% V5 r. B1 B - IRQ_Set_Ctrl
8 M1 L9 d% x! s A! d/ X - LDX IRQ_Process_Index
/ |% A- l' U/ e7 f - LDA IRQ_Scanline_Data,X0 M# Q. p- c Q% h* o, z
- BNE IRQ_Process_Latch5 N! Z* E7 ~8 M- j. T9 b. ~2 c
- IRQ_Process_Disable;禁用IRQ9 X$ p4 D) e" M$ x
- STA MAPPER_REG_IRQ_DISABLE
8 [4 _, v) r7 ]3 e4 |% H - STA IRQ_Process_Index
) _/ M; a8 l$ \, `3 [' o( K. N# | - RTS
" f. T0 M, I2 Y; j - IRQ_Process_Latch;设置下次 IRQ 触发扫描线* ]' a; e8 @, {2 _% t0 y1 k
- STA MAPPER_REG_IRQ_LATCH
; i- z N$ R7 L7 Z. ^9 J - INC IRQ_Process_Index2 ] d7 Q9 k- W; h. ^7 X: D
- RTS
8 J+ N0 m1 s' U/ W - ( _' t5 ?0 \! a8 U- B: w' X8 j
- ;==================================================6 ^. L1 W& K! r$ q8 c$ t6 m0 i
- ;IRQ处理
. d5 I; g9 a& P4 |- w/ p - IRQ_Process_By_Index
! \' A9 K9 X+ l - JSR IRQ_Set_Scroll w0 k) y. x6 N1 q
- JSR IRQ_Set_Ctrl3 G) l5 @! u- }6 U1 i3 Q' N8 `6 g
- IRQ_Process_End8 ^3 X) v1 K* d% b
- RTS7 |: S N8 O% A. T" A3 X \
-
, R5 U" V3 `% _( c* \1 g - .ENDM! d& S. Y4 N( z
- 7 D1 V9 } s- T7 }
复制代码
" ~/ X% J5 N/ |2 `( b( S* {7 G* k
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|