|
|
欢迎注册EMU618社区论坛
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ! K& F3 h0 ` X" G4 H7 @
/ o# I( m1 n! ?0 P9 ~! g
本次IRQ研究了如下:
: m# x- J d; l) J8 q0 g% IVRC2&4(Mapper21,23,25)% ^0 P" i5 ^* W/ o% w. y) N% u8 Z
VRC3(Mapper73)& L7 ~7 {+ Q" I J# V
VRC6(Mapper24 & Mapper26)1 ~; l3 R# J* x- i
VRC7(Mapper85)" w3 A# q* ~$ c( F8 A& `3 N0 u
MMC3(Mapper4), L1 A. w* x5 ], B; m
MMC4(Mapper10)
6 S9 I N1 n# Q2 dMMC5(Mapper5)8 h7 q! B+ g8 t& l( A
Mapper18. j7 z' j% ?( b- F m
Mapper64) t% p* y8 w) X) @" `
Namco163(Mapper19)2 ^, T. z) p! b5 T( @
Sunsoft FME-7(Mapper69)9 V M' w$ a0 C |+ Z) d- \. h
0 z% p( z+ u3 ^1 ]$ Z: i# Y" o
共计11种Mapper的IRQ操作使用例子$ x; a; k; V4 f8 V N/ E- }6 d$ y
代码内有详细注释, 希望能帮助到感兴趣的人.
; g" k6 n. O% D/ l. Z2 U- ~7 k% U8 Y7 Q1 x- Q5 { ~5 m( ~, W
  
; W9 E/ o) V$ w
) V5 R9 O% A' C; ~ e0 T1 ^Mapper代码主要逻辑(以MMC3为例):' s+ H9 L6 Y: R
- % X3 n2 T, O0 P6 I, y
- ;==================================================
; }# y4 u, p8 y7 z9 v. z, Y - ;Mapper号+ h4 H; T! v% ^4 D2 K! X
- MAPPER_NUMBER = 04
4 i8 i+ n9 i2 [% c - ;==================================================
2 V r! u' ^1 Q - ;MMC3 (Mapper 4) 寄存器常量& f8 X& d! b3 O" f" \; b* u; R. r
- MAPPER_REG_BANK_CTRL = $80008 e: _6 H# s/ d
- MAPPER_REG_BANK_DATA = $80016 F; V1 W+ h( A5 b8 [" J& p g
- MAPPER_REG_MIRRORING = $A000
7 {9 t9 e! M4 e! B: m/ X2 e - MAPPER_REG_PRG_RAM_PROTECT = $A001
" D8 q a" S5 S1 L9 ^. {* \; N: b7 o - MAPPER_REG_IRQ_LATCH = $C000# j) P- X2 @* R) z, @, A/ _
- MAPPER_REG_IRQ_RELOAD = $C001
, g' {' P1 ] J+ A" K E9 F - MAPPER_REG_IRQ_DISABLE = $E000 ^/ Z2 [; [/ V' [. q5 B2 e
- MAPPER_REG_IRQ_ENABLE = $E001
) X0 w2 G7 N' k$ N4 B; U' e9 m - ;==================================================: ^9 o1 { ?! z6 q: C
- IRQ_SCANLINE_BEGIN = 135; y" B8 X5 g/ s0 _/ i! r1 p; w; D
- IRQ_SCANLINE_1 = 8
/ y% q- I" i+ m0 _" h - IRQ_SCANLINE_2 = 54- b3 Q2 f# m$ E' b, I
- IRQ_SCANLINE_3 = 89 a+ s: |$ T; {+ s1 \
- ;==================================================
" ?8 D7 I- z1 U9 O5 _1 c" g1 M* q! n6 P
2 ?- ^% v! R8 Y- ;====================================================================================================
( q$ y, L& b2 A t( g/ g1 k) t) c7 P - ;宏常量
p+ H: {6 k! j0 Y* N - ;====================================================================================================0 j0 c' D* x5 G# w7 B+ }# }
2 D3 S6 P& }5 O- m7 v/ |- ;====================================================================================================
9 @) r0 Z7 l" o/ ]+ Y& T - MACRO_MAPPER_INIT .MACRO
c* H( K: x+ \2 [+ @* V4 U! G - ;禁用IRQ0 T( h( k- d" B5 U6 v6 Y0 h0 m
- STA MAPPER_REG_IRQ_DISABLE
* C6 O0 c& e' I5 }; | - 5 T C+ r$ v- ^9 a/ b( D* p4 Q
- ;水平镜像6 r; d8 W" g0 D6 s) U$ U* M
- LDA #$01" V% m) u+ b& f, A" h" X4 [
- STA MAPPER_REG_MIRRORING% Z) P- u6 C9 L& \% R9 m$ P1 F7 E
-
9 l, ]! Q6 z! v' B" o: t - ;初始化图形bank/ w b, m$ U' Q
- LDX #$05) T3 c. ~3 t3 G1 [0 O( M6 v, `
- .Init_Chr_Bank
) @1 c, w+ o* y" v - STX MAPPER_REG_BANK_CTRL
1 ~* N/ O5 s c - LDA .ChrBankData,X
/ Z8 n" ?' @; q5 h+ N4 y - STA MAPPER_REG_BANK_DATA
0 H8 w6 F/ H5 \2 e - DEX) v, x; A% ~2 O$ O1 }# _; B& D
- BPL .Init_Chr_Bank
" T* ]5 |4 Q# y, F U - JMP .Init_Chr_Bank_End
: P3 i: p1 `# ~' |$ Y - .ChrBankData
+ d5 n9 o& @9 G* g W - .DB $00,$02,$04,$05,$06,$07
/ r/ O9 |$ \& i: g - .Init_Chr_Bank_End
9 C4 c9 h4 U U' ~ - 0 P2 f9 S+ h) Y! X( F
- ;启用SRAM
. O _5 W7 g3 D. z6 m - LDA #$80% K% E( L' A; E& q* N9 Z0 G: D
- STA MAPPER_REG_PRG_RAM_PROTECT% E* e; t: V* f% k, J% j
- .ENDM+ q% S/ l- c5 h; O4 J9 H
* l8 Q; m% S3 E* L1 W* t- ;====================================================================================================
& Q' h* O" W9 Q/ P; v - MACRO_MAPPER_SOUND_CLEAR .MACRO
8 D: ~3 E4 E7 j- J+ d2 E - .ENDM
) P3 p% O: [! M6 d+ |3 |7 s - % v" T/ b( X* X* w0 \5 _0 [0 }7 o
- ;====================================================================================================
`+ T1 Z4 q8 } - MACRO_SRAM_ENABLE .MACRO: W2 T- P& c4 G8 ^) { S, n
- LDA #$80
7 j& T0 W4 W% V( x% [ - STA MAPPER_REG_PRG_RAM_PROTECT" u- F: ~+ K: g
- .ENDM* h/ U/ l4 {: r
- 4 j A; z* J$ ]4 x! n) X# P
- ;====================================================================================================/ ?$ m0 s/ ]6 O/ w: i: Y) l
- MACRO_SWITCH_BANK_8000_A .MACRO& b" }' m* s. Q, b. F
- PHA* p# ?5 s! q* W4 K! A
- LDA #$06
* _# ?1 ~4 q. q# n9 M+ E$ z - STA MAPPER_REG_BANK_CTRL
) a d* a1 F0 j - PLA5 L" n1 {$ c' M/ ?9 @
- STA MAPPER_REG_BANK_DATA# ?8 c4 ] _1 d, _/ |8 w
- .ENDM* V- U6 W- J2 |5 C! }/ d
- " L% F4 U) M- l/ h
- MACRO_SWITCH_BANK_A000_A .MACRO3 h$ Y/ S2 ]* d. D0 B* i
- PHA
2 U3 y1 \/ ^3 o. h# @% k" ^. n4 V - LDA #$07: ^$ I( |- ?$ H. E+ r! p/ q
- STA MAPPER_REG_BANK_CTRL
6 A1 V# G9 O/ S+ H8 Z6 L" { - PLA
, b, N+ t4 ?0 K! Y$ R# o - STA MAPPER_REG_BANK_DATA h- o! R, S. p8 W1 b: V" b
- .ENDM
# _. i% k# C0 ? - 1 E( q/ m3 L) _' H) b
- MACRO_SWITCH_BANK_C000_A .MACRO3 ^% L6 ]% Z5 Z
- .ENDM1 I, A% ?( R* [# g" s
- 3 ?+ b) @$ |: a
- MACRO_SWITCH_BANK_E000_A .MACRO8 X: t6 D0 `; @! f+ w& U' L; W
- .ENDM
% F, ?% C( g8 T5 R) ?( C2 Q - 0 e5 V5 c$ u9 h. D& A- W ]
- ;====================================================================================================
) p, s% X. L& X1 s! r7 h" b. g5 c8 g - MACRO_TRIGGER_FIRST_IRQ .MACRO
H- d" a# n d8 b4 Y5 x2 i - LDA #IRQ_SCANLINE_BEGIN + 1' H* S# P' Z8 x6 X' O; r
- STA MAPPER_REG_IRQ_LATCH, Q. G7 o6 e' t4 C6 n- X/ J
- STA MAPPER_REG_IRQ_RELOAD
) `6 J6 U+ U9 k! t4 }( _. t - STA MAPPER_REG_IRQ_ENABLE# `' c7 S- l8 @ L- X
- CLI/ l) S1 P7 p8 M# P/ W$ d9 f
- .ENDM
8 p$ z6 f, z7 b9 [1 j# _- o - / a5 [' Y" w0 R6 p! l0 s
- ;====================================================================================================
. J' x& b7 F/ ^9 l - MACRO_ENABLE_IRQ .MACRO$ J% L' W1 Z0 O
- STA MAPPER_REG_IRQ_ENABLE I+ H& o4 X( G5 { t
- .ENDM% b6 e# |- G* s6 A
-
, Q( ]- g; F* F+ k& R. M9 u - ;====================================================================================================
4 n! s) d& S/ Q/ ]( T - MACRO_DISABLE_IRQ .MACRO
- R/ O: Q" x$ Z1 ^& c2 e - LDA #$00
" v5 w8 ~0 P# w2 T/ d% ]% k - STA MAPPER_REG_IRQ_CTRL" [! D4 O7 V+ l. u5 y" S# \
- STA MAPPER_REG_IRQ_ACK
. y3 T8 O' l/ [ - .ENDM6 S: f9 [! n0 \- ^: z' U# p& P
-
2 Q: _: G0 p5 Q* W7 T% h& V - ;====================================================================================================* K7 f+ C w2 x! b0 A% V$ g1 o* |7 O
- MACRO_ACK_IRQ .MACRO4 S3 R6 D( d& T$ ]$ p% L
- STA MAPPER_REG_IRQ_DISABLE r K" X/ c, ]; i9 ~6 |' q1 g
- STA MAPPER_REG_IRQ_ENABLE
- b( c0 w6 U1 ]8 T! Y - .ENDM4 z0 E. @9 T% ?$ K& f
- ' [- X9 e4 r+ R0 R/ U' Z: m8 l
- ;====================================================================================================$ u! l" i, Z# Q+ R; c% Z
- MACRO_IRQ_OPERATE .MACRO, J: {$ A- W% v4 ^/ g. T
% U6 N( I3 a$ B1 M$ B- ;==================================================
! d6 \* I7 x$ R. U- D- T5 U% s - ;IRQ滚动模式常量8 [. q9 r# j3 C7 b
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
' t! V- L8 c/ r/ k - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
6 e8 R* z4 X% |+ `9 J2 a' ^ - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
4 }' b7 X+ \+ v6 c4 @( c
" \; ]' b4 I7 G# J2 Z- ;IRQ扫描线数据# a( y$ b; Y3 g% b7 k' r5 [
- IRQ_Scanline_Data
+ X" _; L& m, x4 h - .DB IRQ_SCANLINE_1) W1 H: Z3 g4 G4 P
- .DB IRQ_SCANLINE_2
9 h& t: I3 n0 j - .DB IRQ_SCANLINE_3 c) d0 e! a% r0 F9 r
- .DW 00 ;关闭IRQ/ B4 z w1 w4 }/ p/ C7 G/ }! |5 i
2 O4 V9 I5 u, P$ C [3 t% ^- ;IRQ滚动控制模式
h+ q$ _* p" N( h1 M& b( f - IRQ_Scanline_Mode
; W) O( b$ C% E0 Q - .DB IRQ_SCROLL_MODE_RIGHT
7 I: j1 [! r( k - .DB IRQ_SCROLL_MODE_LEFT
( J/ p& h. g) T - .DB IRQ_SCROLL_MODE_RIGHT
X$ L9 m3 K" W, @ - .DB IRQ_SCROLL_MODE_LEFT! M, V7 g8 t4 X/ E( Z
+ J. H- O/ c7 \: A: X- ;==================================================
- `" X* ~8 t/ H6 W6 M3 p& _ - ;;IRQ滚动控制* j ]: f, ? F* F# q( [
- IRQ_Set_Scroll% w3 R- ? Y2 [" q
- LDX IRQ_Process_Index! \) T: G' y* i) z- [
- LDA IRQ_Scanline_Mode,X5 V; i' [+ `8 e3 R, l
- CMP #IRQ_SCROLL_MODE_LEFT- A9 t* T* d' v" D' p
- BEQ IRQ_Set_Scroll_Left4 d' Q! J& K$ T1 u) X
- CMP #IRQ_SCROLL_MODE_RIGHT( @* n' T5 M: y5 J
- BEQ IRQ_Set_Scroll_Right: _- G" L) Y( }: q! Q
- IRQ_Set_Scroll_Zero;不滚动
/ q" T$ p- G3 i9 x' Z( F - LDA #$00
7 ?1 N1 Q* G% ], w" P - STA PPU_SCROLL6 D) n& [; A% c( p9 ~5 g5 _
- STA PPU_SCROLL
2 l7 V: r: A2 U$ W - RTS; ]2 A! U# b# [
- IRQ_Set_Scroll_Left;向左滚动% x+ Y: r- S1 c# F
- LDA Scroll_H
0 @$ i- s! e% B - STA PPU_SCROLL
9 J, t# F( }2 f, {, k - STA PPU_SCROLL
) D( X0 [! Q' `. d% B - RTS' @1 J. o6 w' q/ V
- IRQ_Set_Scroll_Right;向右滚动
+ I0 u9 P1 Y8 n U: F - LDA #$00
3 |+ S9 l2 O. l* N( v, G* C& z" [ - SEC
2 w$ s- m( S9 k" B - SBC Scroll_H
- t( ^- k) G* X, ~% m - STA PPU_SCROLL9 ^. ^$ `) p9 S2 C
- STA PPU_SCROLL
3 h; r( H0 @! m8 d/ c- @ - RTS
8 ~4 c2 n" R* z9 ~! R$ l2 n4 S -
, y g) Q3 }" t5 v5 J - ;==================================================
# e8 d; t) w6 J7 q7 D$ c# H - ;;IRQ滚动控制
4 Q3 W3 r' X$ | - IRQ_Set_Ctrl6 b' ~, X2 d( G$ i
- LDX IRQ_Process_Index7 i) K8 Z0 }; T- [8 w
- LDA IRQ_Scanline_Data,X% G% w. [- b: Z5 w& ~* \+ h
- BNE IRQ_Process_Latch# s! w& b; f% }
- IRQ_Process_Disable;禁用IRQ
$ F* h! N4 W( @; A - STA MAPPER_REG_IRQ_DISABLE, D- ^9 D; ~0 m, [2 A0 V/ ?4 q3 N
- STA IRQ_Process_Index! v3 ~. b% ^) Y8 @( G4 m- T! E
- RTS
. V1 H- L* f# V! S - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
6 [, q1 o3 Z0 B5 @ z/ r5 |3 G - STA MAPPER_REG_IRQ_LATCH
: L8 C9 N8 N7 E6 \ - INC IRQ_Process_Index" }% S' B9 b1 ^/ K
- RTS
7 F5 S+ \0 J$ z' w3 c# X - 1 W! \9 D: T- M
- ;==================================================
2 D$ W* K n3 |4 }/ S' E - ;IRQ处理. G' R! G/ D' \
- IRQ_Process_By_Index
8 L2 X+ c4 Q1 y$ q) ^% j& W, C - JSR IRQ_Set_Scroll0 i; f) p: I/ C: r& K/ H4 f
- JSR IRQ_Set_Ctrl
) h* S M' _: Y0 }$ f. f: q) D5 V" g - IRQ_Process_End
$ W8 y; n! o7 {* N" \ - RTS0 Q$ o- v I0 z1 J! d
-
+ q* u' z5 ?# l8 q. I+ A3 `* F( R& Y' } - .ENDM8 T) p j' y6 Z( N
-
% J5 @2 z& ^+ q
复制代码
K6 d* i7 `2 |/ d9 j5 u2 x) x0 m- ^: l; C+ N
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|