|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
+ S; |0 K( K" k$ }5 Y& ]; F7 E
% a2 L) T% n2 H* C: S本次IRQ研究了如下:
4 d9 b) w' e! U3 _$ Y2 m+ W2 _1 xVRC2&4(Mapper21,23,25)
* R$ I1 W7 F% \' l- EVRC3(Mapper73)! t, Y4 i& i3 h/ Q& l) ?9 G e
VRC6(Mapper24 & Mapper26)7 g" N2 N: D. ]# W5 \- g0 a/ L* S
VRC7(Mapper85)
7 P9 B6 o2 `) d" U* zMMC3(Mapper4)
4 N' y/ {! ?$ H+ J0 T# ~7 uMMC4(Mapper10)& x" O8 G8 B" t$ @- j/ m* u
MMC5(Mapper5)- u% o' g: P( K: i0 L# d" q. M
Mapper18- }3 u6 ]* ?" p5 [
Mapper64
, l: Q0 e6 p7 i) k" i1 r1 R) YNamco163(Mapper19)
0 j2 ~$ `/ F. ]9 _Sunsoft FME-7(Mapper69)
1 W# b. w5 J6 V
0 F" g% i3 e1 k1 _# J$ O8 i) J: y共计11种Mapper的IRQ操作使用例子/ u1 D# t; Q; x9 t& u: T0 L
代码内有详细注释, 希望能帮助到感兴趣的人.4 ~# q; N1 M& k& @
5 ? H- ^1 c1 N7 B2 @7 J
  
5 V: ^2 {0 J1 w ?; q9 S0 O6 a; m
8 K* O. E, Q7 `, e3 C* p0 Q; QMapper代码主要逻辑(以MMC3为例):4 M; A: c8 {" B: B) l
- 9 \3 c, @ q, m; S
- ;==================================================
& C! z/ d' H0 g2 X5 y+ N" | - ;Mapper号 a2 l. j8 G: |, @* b
- MAPPER_NUMBER = 04( m6 q6 L7 C9 P5 w4 |7 E
- ;==================================================* S8 l8 x2 M4 e: S
- ;MMC3 (Mapper 4) 寄存器常量7 S" ]& h. e* k9 i, {5 [
- MAPPER_REG_BANK_CTRL = $80007 X9 L7 Q1 M9 H6 s: C
- MAPPER_REG_BANK_DATA = $8001
9 F5 X- e6 }: g. S1 @: x - MAPPER_REG_MIRRORING = $A000+ p1 ]' ~& [; U& I5 B
- MAPPER_REG_PRG_RAM_PROTECT = $A0018 n* D0 D+ b* c( \
- MAPPER_REG_IRQ_LATCH = $C000' n) m! v* d! W
- MAPPER_REG_IRQ_RELOAD = $C001& c Q1 e! `3 H" Z! g4 i% z( Y
- MAPPER_REG_IRQ_DISABLE = $E000
# w+ _3 I1 }( t) ?; o7 \ ?+ J - MAPPER_REG_IRQ_ENABLE = $E001
0 l: }3 z6 [6 t - ;==================================================
0 S8 H+ F8 d+ V/ W+ z% v0 z. `( k$ ~ - IRQ_SCANLINE_BEGIN = 135
, O7 s x% x" o5 C0 w6 B5 D - IRQ_SCANLINE_1 = 8* s2 s0 u& O+ G a$ o
- IRQ_SCANLINE_2 = 54/ ]" z9 H, L( f: V; A) B4 h
- IRQ_SCANLINE_3 = 8
$ G- w9 v* }( ?4 e3 w - ;==================================================
8 `2 J. ]( d- i v, Q$ W' W
3 {# B, t* ^. S1 `4 F- ;====================================================================================================
" f( H% f' _4 R; d - ;宏常量
5 y+ v# g& G# t( V" p - ;====================================================================================================) T- n0 ^3 E3 g- i' `/ D1 W) Q* I
- 7 Q# {- b/ H+ C7 q! X
- ;====================================================================================================
6 f( M" g9 @: ?2 a - MACRO_MAPPER_INIT .MACRO
7 b- U2 \5 d6 i$ X9 m7 x - ;禁用IRQ @: p% I z$ T4 R5 u" W& t, Y" ~, [
- STA MAPPER_REG_IRQ_DISABLE
4 r: m; h+ h$ e+ o2 Y7 z0 _ - ( c+ f6 d" D' `8 ^$ b/ a" o/ d
- ;水平镜像
; t/ b! n* {6 O& U- _% x3 Q - LDA #$01
% K4 O$ b+ T# H! {7 l - STA MAPPER_REG_MIRRORING
. l+ Q7 _: E9 Z7 e& Z& |+ p$ } -
" l- T0 I- R, j7 u% I+ s - ;初始化图形bank
, h% d5 q6 O) O4 c7 f - LDX #$053 T2 {9 X& V* T
- .Init_Chr_Bank
7 I) z" h" D8 G. o! s& m2 m - STX MAPPER_REG_BANK_CTRL- ~0 T/ K |( `+ V! J
- LDA .ChrBankData,X
& a- [+ G' g) j2 Q: r - STA MAPPER_REG_BANK_DATA \5 \& I& y# b
- DEX
3 E6 i& M) d) l, |: Q - BPL .Init_Chr_Bank
1 N( `/ D7 C" p" e2 X8 S - JMP .Init_Chr_Bank_End
& f" O- h3 H" W* p - .ChrBankData3 C1 m- t% O. D8 E' a
- .DB $00,$02,$04,$05,$06,$07
: r' l5 b+ X8 K0 }1 z. Q - .Init_Chr_Bank_End
+ \9 h6 T+ U5 K3 Z* ~* U5 k! d -
. [" U+ V; a/ Z% N2 p3 ` - ;启用SRAM2 g% I- a4 s: ?5 q) s# \
- LDA #$80
2 c% b3 A. ]( n4 |. y% c - STA MAPPER_REG_PRG_RAM_PROTECT
" Z8 D8 L2 [" n - .ENDM
: ?+ c! x$ C1 C& o9 D& f+ p - " T! p6 o1 |# l
- ;====================================================================================================
D& S q e6 G$ x3 Q: s$ l- I1 V( G - MACRO_MAPPER_SOUND_CLEAR .MACRO; u+ z" n! j" [* J! _
- .ENDM6 ]. X' s* \1 n, D
-
9 n6 x; B- ~2 E - ;====================================================================================================; d# z: G1 k" J) Q) S
- MACRO_SRAM_ENABLE .MACRO! c! u9 x8 X9 q1 b$ a w
- LDA #$80
+ i$ U. @+ H4 p" I) T/ l2 d/ s) Z - STA MAPPER_REG_PRG_RAM_PROTECT8 J, H# p4 w1 b0 p' G# C
- .ENDM' p6 ]+ k7 I. `5 `' u9 |
- : l/ B) F3 G# Y$ n) i5 @& a2 c
- ;====================================================================================================
9 N# A3 |, [: P! B9 B - MACRO_SWITCH_BANK_8000_A .MACRO. @% x5 f! D9 H" L3 s) G- |
- PHA
: H1 X1 u) I' C# B* | - LDA #$06: W3 i, \$ O% y# M4 g( q
- STA MAPPER_REG_BANK_CTRL
0 d% c1 l; Z: X, `, G; f+ n - PLA0 O% a) C6 S; P8 K# s4 b
- STA MAPPER_REG_BANK_DATA/ ]3 d& E5 T7 T# C3 q% o: @2 U
- .ENDM
+ |- k+ a* M! ]) S( e
: {0 C' M, z H& x- MACRO_SWITCH_BANK_A000_A .MACRO
) o1 e. g1 u$ J! N) _# d" x% g - PHA
# ^9 h1 l/ P+ M! i2 i g& z - LDA #$07
# b+ C# E. {" N) o# I - STA MAPPER_REG_BANK_CTRL
3 o: E) c. [5 y: w' V M - PLA0 y, u) V8 f, ^3 ~0 h
- STA MAPPER_REG_BANK_DATA
- o3 `0 `6 K8 c9 b9 J0 q5 Q6 B - .ENDM
, t, M* ] M2 [! d. W2 J -
7 M0 y0 T7 Q+ i$ t7 c6 K - MACRO_SWITCH_BANK_C000_A .MACRO& c( I! z" j/ W/ D. C/ T. f+ H8 Z
- .ENDM: z* e: r7 U7 U6 j' x6 G& h5 i
- ) L" T/ w2 C: {7 `+ Y% }5 q
- MACRO_SWITCH_BANK_E000_A .MACRO
/ z4 p4 d. j2 o/ Z: s - .ENDM# O1 v: F f# P# m k9 a% a) Z
- 1 }" e; v) H* T* u) a0 @* A
- ;====================================================================================================8 h4 R7 W; P7 C' m4 W- C
- MACRO_TRIGGER_FIRST_IRQ .MACRO2 ]% ]* ?" v( |! _% G! N9 q7 {
- LDA #IRQ_SCANLINE_BEGIN + 16 X+ u9 _. p3 E \; @4 Z
- STA MAPPER_REG_IRQ_LATCH' d- C1 ^) }' X% D P, E; U
- STA MAPPER_REG_IRQ_RELOAD8 K4 v4 ]6 U% }
- STA MAPPER_REG_IRQ_ENABLE
4 C5 ]# q/ P* M4 f9 @- Z - CLI& s0 o5 [! r/ G' T$ G
- .ENDM
( H9 @# ]7 R& P! v( x - * V( p/ d e; _: O" G
- ;====================================================================================================$ z, Q1 {5 }1 l- {* K
- MACRO_ENABLE_IRQ .MACRO
: c# R4 v" o u9 k1 u4 J - STA MAPPER_REG_IRQ_ENABLE1 S- {: ]$ _( Y/ s6 L3 B
- .ENDM
+ d* L/ f' H1 r -
; \4 z. f. }% t [6 y2 c& V0 L; J - ;====================================================================================================
0 [- u& e% n' U- E - MACRO_DISABLE_IRQ .MACRO, W$ y6 H6 m3 a6 ` _- ?' M- D
- LDA #$00
* X6 K3 K: h* }# U6 O - STA MAPPER_REG_IRQ_CTRL0 b8 N. W, b C3 m& m: C5 R: L
- STA MAPPER_REG_IRQ_ACK/ Q8 b5 }8 H; ]: f6 y
- .ENDM
4 w( Q" T' q6 t! `. v) M -
. S8 s1 X2 D* _$ |7 q - ;====================================================================================================, i) h. W9 s" N* A; y
- MACRO_ACK_IRQ .MACRO
( I+ A9 T+ `: a+ L - STA MAPPER_REG_IRQ_DISABLE5 @/ r* W+ S( u
- STA MAPPER_REG_IRQ_ENABLE
2 L( N5 ^* R- j3 [ - .ENDM- j7 u4 k3 b( X4 f5 x8 ^
- g2 V7 g X9 M2 h9 w- s8 B
- ;====================================================================================================
% C8 I( H1 Y& h6 i3 q - MACRO_IRQ_OPERATE .MACRO0 |: ]5 t$ e8 }5 d
/ s3 m+ p3 k% e& r# P; K5 C0 i+ m- ;==================================================' D* d3 {- L9 p+ n
- ;IRQ滚动模式常量
9 Y. N! f9 X$ T/ Q% i- X - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
( e9 C: N' C' Z- ~# e! q - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
0 z: C3 X" P7 m - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动! s f* Y$ c) z. O) B
- ( i; Y6 z* y5 P& O+ b
- ;IRQ扫描线数据: _6 W) A v( t7 Q2 ~
- IRQ_Scanline_Data" M( N$ ]2 c j0 }
- .DB IRQ_SCANLINE_1
( ?/ M- M' ]" v ? ]. D - .DB IRQ_SCANLINE_2
! g( R. |/ \* i - .DB IRQ_SCANLINE_3
6 U7 u' g' Y! S" o+ z - .DW 00 ;关闭IRQ/ j% C5 j$ U" {+ A* f" a
, ]5 o+ w- v4 ~& _+ b) u. H- ;IRQ滚动控制模式
) I0 K7 s3 d7 @+ I+ b- t - IRQ_Scanline_Mode
+ ], D. o6 ?/ v6 { - .DB IRQ_SCROLL_MODE_RIGHT
+ ?# u, K5 k; Y2 |5 Z - .DB IRQ_SCROLL_MODE_LEFT
/ D0 ?# @# b1 Y - .DB IRQ_SCROLL_MODE_RIGHT. L2 _- B# o9 \2 s9 r
- .DB IRQ_SCROLL_MODE_LEFT1 e n8 k0 s M' b' w8 y1 E# ~
. ]. Y: _6 Z; c' r- ;==================================================
! w& T4 V! X/ L: F( O - ;;IRQ滚动控制6 A! s; f2 j5 `( B. j' U( E+ t3 \
- IRQ_Set_Scroll' `+ _* R# W) Q( _ Q# d3 _
- LDX IRQ_Process_Index
E7 N% x) i0 Z& P! ^ - LDA IRQ_Scanline_Mode,X+ W+ e! r4 ~9 z T4 J
- CMP #IRQ_SCROLL_MODE_LEFT
" ?& q8 ^5 k# P" M9 _3 v5 s - BEQ IRQ_Set_Scroll_Left; d2 P- t* M" {
- CMP #IRQ_SCROLL_MODE_RIGHT
( ^$ Q5 z- J7 ~8 l - BEQ IRQ_Set_Scroll_Right+ e. C C2 e# H) L; o$ Q
- IRQ_Set_Scroll_Zero;不滚动" B7 C3 u! C% q" K$ G* y
- LDA #$00
/ |% N- J" D* D1 _7 M - STA PPU_SCROLL
7 \( ~! h6 J9 ? - STA PPU_SCROLL
; i+ k1 i' ^# j# Z - RTS. B7 F8 Z. J, u: ~5 P2 _
- IRQ_Set_Scroll_Left;向左滚动 Q# N( `: p( V6 d: r
- LDA Scroll_H
/ i1 R$ @7 s: Q- s4 n, Y6 U - STA PPU_SCROLL5 k8 J6 o8 Y l0 G# G3 f
- STA PPU_SCROLL
8 }% w/ j F8 n: B2 V% E9 R6 S& o* j - RTS
J; c8 Z3 X2 `: S - IRQ_Set_Scroll_Right;向右滚动
$ I! V. U2 b$ D& u - LDA #$00: R8 K( A0 A* s& m; b
- SEC# v0 E; g/ U# D% a. L( P" Q
- SBC Scroll_H
9 u- G2 d6 A+ N9 Z H8 O6 q% C4 L - STA PPU_SCROLL3 p# F/ i& e4 E9 ~: u( V3 d8 m
- STA PPU_SCROLL; e* t6 z& Z/ R9 s6 \
- RTS* X7 v7 J1 [* i5 `( F8 q
- 3 R0 p! |, x& I& d6 ?6 A
- ;==================================================5 o# J/ V0 V- p3 G. i& p" K) X
- ;;IRQ滚动控制
8 x" K1 p8 i( e6 j - IRQ_Set_Ctrl& r6 Q3 g. B* n3 a+ ~
- LDX IRQ_Process_Index( }& d! Y) |) J; }9 d
- LDA IRQ_Scanline_Data,X
# m2 k) g3 T/ F/ F - BNE IRQ_Process_Latch
% U. p1 P2 U, P+ _ f+ |2 `+ _ - IRQ_Process_Disable;禁用IRQ
. a( X% h6 ~0 v+ \; T/ t' j, J - STA MAPPER_REG_IRQ_DISABLE
1 P! j8 Q7 M" _ - STA IRQ_Process_Index0 K# q! ^$ i- b' Y0 u
- RTS- E$ _- J2 Z, o5 k0 v5 a; e3 t& ]
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线
2 a3 E; i' d8 _0 n - STA MAPPER_REG_IRQ_LATCH
" a8 i: W/ B6 ^3 p: f: M& R - INC IRQ_Process_Index2 b. l& F0 p. `" a* D9 X; Z
- RTS
. {, O& S7 I! S) `
4 Y* M- u' \# v' k( O- ;==================================================9 E( q9 \$ d b+ _6 |5 h6 I- D% X
- ;IRQ处理; ~/ M( ]0 e" E1 x7 D2 l
- IRQ_Process_By_Index( J0 a/ D& k& Q4 R, u
- JSR IRQ_Set_Scroll8 U7 { f# ?6 l
- JSR IRQ_Set_Ctrl# E3 y& T' C) j4 _; ^5 k
- IRQ_Process_End
$ |$ M& j. e" U) j( X( C- ^0 e; v; N - RTS
8 `3 W1 Z) C* p -
1 V* b+ t9 {& x" ^3 ^2 n - .ENDM1 y( f( b8 ~3 ?7 U7 v
-
- q& Y' h" y+ Y' [2 s: o) f4 X& c( x
复制代码 6 s6 H8 C) L- j4 l
. Y& z& p0 I% v代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|