|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 % z1 q+ @4 P+ U7 {( ?
" X- d: U; p$ w! u$ l1 C
本次IRQ研究了如下:5 m+ t7 P5 Z9 o! [8 n' d( Y
VRC2&4(Mapper21,23,25)
& X2 @/ Q+ J% h* r, }' FVRC3(Mapper73)3 a$ v1 ]8 {/ a2 u v6 Q6 M5 o
VRC6(Mapper24 & Mapper26)
, z3 @" k( ^/ HVRC7(Mapper85)
* o! C# Q' C# x5 SMMC3(Mapper4)+ [2 X) m* L/ Z4 ]3 g- C+ r
MMC4(Mapper10)
$ P+ }6 l% j: A# `; X+ L! E: RMMC5(Mapper5)
! N$ b9 y* @& L- FMapper18
3 B* q* ^ L9 D5 I* u- `/ V1 R3 gMapper64
; P& I; ^/ e% n1 p" s) HNamco163(Mapper19)
6 g* j6 g/ l# h1 H$ MSunsoft FME-7(Mapper69): M9 |3 j7 L$ f; L& r
! O* q( T! Z& t) g+ W. f共计11种Mapper的IRQ操作使用例子" G0 |& c. V% k, C% C
代码内有详细注释, 希望能帮助到感兴趣的人.
: e" N4 u' o! x6 Y
4 K8 e8 G0 j% G4 i  
7 D( q( Y+ y$ O+ e7 r
/ k" k: J+ c9 ^" |. Z9 u3 [& iMapper代码主要逻辑(以MMC3为例):
" @* R. d3 W! h0 x& y" N- 9 [- Y; a- X" z0 x: ]$ W
- ;==================================================, j4 |- [ B% |$ G) r w
- ;Mapper号
2 S, _+ [0 e( ^# d% E5 v; j - MAPPER_NUMBER = 04
3 ^( H0 P, f+ \" r& j - ;==================================================
5 ~* h& I3 I/ z- L7 Y" j - ;MMC3 (Mapper 4) 寄存器常量
, T7 J8 b! j w! {* p* [+ R - MAPPER_REG_BANK_CTRL = $8000
8 r- l& g9 L- |6 G) X - MAPPER_REG_BANK_DATA = $80017 k* J0 N) r5 H, J# z
- MAPPER_REG_MIRRORING = $A000
% S3 I5 E* m5 Y J* l+ k - MAPPER_REG_PRG_RAM_PROTECT = $A001
. j3 n4 b: M7 R# C - MAPPER_REG_IRQ_LATCH = $C0001 T# D; `/ A9 w
- MAPPER_REG_IRQ_RELOAD = $C001+ I5 v3 i0 Z8 H0 U+ u+ p7 e* }
- MAPPER_REG_IRQ_DISABLE = $E000) e' G* o2 v. I' x7 {* s
- MAPPER_REG_IRQ_ENABLE = $E001, l1 ]% K# C# @- G' [/ [1 R
- ;==================================================
* a1 R. D6 |( w- c1 h' c - IRQ_SCANLINE_BEGIN = 135
% Q8 P5 @, j$ k0 V3 U - IRQ_SCANLINE_1 = 8
3 X) @6 z: C+ N& d0 x - IRQ_SCANLINE_2 = 54 u1 T0 [9 C( [5 Y. L, ?) |% O
- IRQ_SCANLINE_3 = 8
% J% [4 i2 S3 C s I ?7 | - ;==================================================
0 {! j* p1 Q e- D! o - 3 P" D9 k9 n* v6 u8 {
- ;====================================================================================================4 u6 U D8 T) P- t S: c
- ;宏常量2 W0 P/ R& `2 f# D, M
- ;====================================================================================================
- r3 W: L+ ~6 g
! ]& S/ ]; S% p8 F0 a; Z9 ~2 y' X0 D- ;====================================================================================================
\! e, d* a: A: T$ K - MACRO_MAPPER_INIT .MACRO& @# O, Y9 k3 j# s0 M- ~5 _. E, i% b
- ;禁用IRQ( B3 l# G( t3 M
- STA MAPPER_REG_IRQ_DISABLE; g' _! `' v/ Y
-
$ q; J. C( n' p - ;水平镜像
$ q) q8 S8 I7 s8 c+ b% ^- Q+ F - LDA #$01. _% x' X. o; d9 P, R" ]
- STA MAPPER_REG_MIRRORING! R. y( C5 L k; E
- * T6 l/ m; y% {( B+ n5 g) S
- ;初始化图形bank h3 [3 C) r, R# k' S
- LDX #$05
+ J I5 g% S( {* ~. p6 x3 F - .Init_Chr_Bank
, G' j# G7 o+ x6 b) Y - STX MAPPER_REG_BANK_CTRL3 M/ r% u" o5 t4 f$ \
- LDA .ChrBankData,X8 @4 ]3 t' |! t# j; E: R
- STA MAPPER_REG_BANK_DATA9 ~5 {# ]( N6 Y$ Y& g% k& M
- DEX3 F0 l* O4 ~; l1 [
- BPL .Init_Chr_Bank
' q: K/ Y( W/ r3 y - JMP .Init_Chr_Bank_End
0 ~' |9 L* z. R- U; h; M - .ChrBankData8 i( y2 w1 r: J: F: J
- .DB $00,$02,$04,$05,$06,$07
3 C! m Z% a6 m7 V, Q. @% h - .Init_Chr_Bank_End- o! j$ ?& A' u( x; }- z/ ^
-
3 \ H8 f9 B4 W; X( x - ;启用SRAM
' b" y' t8 f! A/ \4 r - LDA #$80
3 c1 ]7 G K- H - STA MAPPER_REG_PRG_RAM_PROTECT# n% h+ ~6 C3 F# _; s
- .ENDM
q: H$ `- q3 J$ n - 3 M+ ^7 p i* M+ e) ~, [8 j$ a# w
- ;====================================================================================================
$ ^! C$ M4 z* o* N7 b - MACRO_MAPPER_SOUND_CLEAR .MACRO6 u- M" X9 G3 U' `$ K* _
- .ENDM% S+ G; Y- Z$ n9 I3 K, K$ y# ~* v
-
0 ^- K7 ^6 j3 S3 v; p - ;====================================================================================================" ^& a- N7 y% C/ b
- MACRO_SRAM_ENABLE .MACRO
7 i% W5 E$ P0 l. s9 L: t2 l - LDA #$80+ g# i) ]. G c7 L, v
- STA MAPPER_REG_PRG_RAM_PROTECT( @ P: J' i" H
- .ENDM( h7 y8 t2 S( p$ r4 x, C+ S8 T( \
-
( B0 c& j# y. e( A" e. W9 D - ;====================================================================================================
$ ~3 X! T! e/ P2 A3 W - MACRO_SWITCH_BANK_8000_A .MACRO* y& T& `) ~. o' c6 d
- PHA
: o4 D' {) g/ @- F - LDA #$06, ~4 T8 t S+ t- g
- STA MAPPER_REG_BANK_CTRL# b X/ h' Y" w2 q# c6 R4 L7 @4 r
- PLA
) e) I$ E* B8 B% z8 T - STA MAPPER_REG_BANK_DATA
/ {/ x9 l* o( }+ O - .ENDM" m, c0 K; ]+ |% S' O
: L3 R, ~: w7 p' B* Q( i- MACRO_SWITCH_BANK_A000_A .MACRO
% ?) S& \0 g- L4 {9 J# N" R - PHA
" B4 k2 q. m% t# r2 \ - LDA #$07
3 L1 N' i6 X8 @0 a+ Q4 q - STA MAPPER_REG_BANK_CTRL
; T( R- D2 j# Z' Z7 }0 t& m4 _ - PLA: z$ x' \2 S! Y8 U3 W1 w* ~# [
- STA MAPPER_REG_BANK_DATA" V/ M7 y3 D. `3 x# L$ E2 D
- .ENDM) }2 K. y1 X. F5 x T! ]
- 8 G+ l3 U: Z# f+ X% J
- MACRO_SWITCH_BANK_C000_A .MACRO' ~, o7 ^, {5 r# p4 [! v# ]' q
- .ENDM5 Y8 v0 V5 V* s2 X4 o6 y
3 `1 ^% T, m) i& V# e5 P- MACRO_SWITCH_BANK_E000_A .MACRO
& k/ k1 b: d7 f' N9 |8 y - .ENDM! _) J6 j+ w8 x/ s" b
; p n8 j, N0 z; k# O t0 e( N- ;====================================================================================================
, N7 t, p' g+ O& V - MACRO_TRIGGER_FIRST_IRQ .MACRO4 ~0 i1 g3 m1 I, v# i; c1 N6 u
- LDA #IRQ_SCANLINE_BEGIN + 1* _. H- P3 ~' N
- STA MAPPER_REG_IRQ_LATCH
2 s! A' g' B) m, X- m8 g0 q4 z - STA MAPPER_REG_IRQ_RELOAD
6 M3 l4 A( z1 ]) R; `- B9 _ - STA MAPPER_REG_IRQ_ENABLE
\5 `) U1 r8 w) N - CLI" `6 y7 }+ [- h( @" s; K
- .ENDM
0 ~! m# V( I* d - 3 R$ m$ T0 Z* @8 f2 D
- ;====================================================================================================
# j( D, k" ^1 E D: _% q6 I - MACRO_ENABLE_IRQ .MACRO
/ u! N- g. G9 r" ?7 ] - STA MAPPER_REG_IRQ_ENABLE$ C' O; J7 p6 L. d6 x6 Q
- .ENDM1 }/ k, w0 B, l
-
8 e& \/ c( N' ~# M3 g0 T - ;====================================================================================================
$ [2 o4 {) j8 i9 d - MACRO_DISABLE_IRQ .MACRO
7 j% X& `% l( _+ j7 W, j% | - LDA #$00+ h2 q9 e7 H) C7 t9 f3 `% p
- STA MAPPER_REG_IRQ_CTRL
) `4 z6 I& }% D& `% l& P% R - STA MAPPER_REG_IRQ_ACK
% C* Q/ E1 D* j - .ENDM
S* `' D; ^* p! s8 f( j - - W' m1 ?3 |( |& G* e0 ?6 l
- ;====================================================================================================- Z1 [" `$ N W; u: L1 L
- MACRO_ACK_IRQ .MACRO0 o, t; o7 N" `
- STA MAPPER_REG_IRQ_DISABLE W5 G4 I0 x( n, m8 g5 D3 W4 i' A
- STA MAPPER_REG_IRQ_ENABLE0 ^ Z1 E3 e, S( D9 s3 t+ m
- .ENDM- ~+ ^. u1 [* F1 n
- 0 S/ Q$ w" J& G5 t( I( R p
- ;====================================================================================================
& ]4 q- k! A# l- p/ y" C: N - MACRO_IRQ_OPERATE .MACRO
: H6 Q% n: H' Z& b8 w2 V+ a: Y1 ^
5 G! j( j' F/ Y$ O0 |- ;==================================================
t/ g" M. h2 f# i( Y7 n m - ;IRQ滚动模式常量
) @# ~& W3 O1 v" ` - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动$ y5 ~$ D: G9 C& I' u$ I) v
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
+ S* [+ q5 n# ^5 J) Q, y; O# B - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
& p% q/ T% Y; u+ l9 z - $ t/ m$ g% h3 @
- ;IRQ扫描线数据
1 r( u* t! I, J$ V- B# M - IRQ_Scanline_Data0 b P6 ] |1 _2 _/ K. y D7 N
- .DB IRQ_SCANLINE_1
8 v. G9 `: \- a8 p - .DB IRQ_SCANLINE_2) C9 l/ z" w; l5 U+ k2 ?* i
- .DB IRQ_SCANLINE_3' t" c2 W. D" X3 e4 R$ ]% ^
- .DW 00 ;关闭IRQ
. ~* P6 v: b: ]# F - " X; M* c5 M: ^
- ;IRQ滚动控制模式
! c) a/ ^. g4 Y# X - IRQ_Scanline_Mode# S9 f5 L& I% D5 M2 n8 n$ A, Q
- .DB IRQ_SCROLL_MODE_RIGHT
7 @* p3 U3 z7 S8 n/ E8 t$ t" n/ r - .DB IRQ_SCROLL_MODE_LEFT
* Q5 h% A" T1 S0 O7 F6 P - .DB IRQ_SCROLL_MODE_RIGHT* X( B- w+ j' [ o
- .DB IRQ_SCROLL_MODE_LEFT9 e6 N( h3 P; H: J
- / m7 C% @. W8 h' G: v) C. C- y
- ;==================================================6 T8 C% L- K! T" h% X
- ;;IRQ滚动控制7 e+ V! g( Y$ P, O, r
- IRQ_Set_Scroll0 V) w. L1 |$ f
- LDX IRQ_Process_Index
5 q; C j2 x/ C. q - LDA IRQ_Scanline_Mode,X# ~* V5 M( K e5 u2 E6 ^6 X! I
- CMP #IRQ_SCROLL_MODE_LEFT
5 \7 m! h6 N, @- Q, i* c - BEQ IRQ_Set_Scroll_Left
: Z" Q+ f: [$ N B6 A3 { - CMP #IRQ_SCROLL_MODE_RIGHT
6 D+ d( u" Z* `9 S - BEQ IRQ_Set_Scroll_Right- f& ?9 o* ~! i
- IRQ_Set_Scroll_Zero;不滚动& J: O1 L2 J8 U U+ M x6 `& X8 u
- LDA #$00% W8 J1 Z0 N' S. m; A9 f
- STA PPU_SCROLL
+ \2 k2 q* P+ S0 s' Q& y4 Y# n9 C - STA PPU_SCROLL
4 g2 F$ G7 a+ a% t3 L - RTS
! C% O* [& j& G3 o& B/ \& J; ] - IRQ_Set_Scroll_Left;向左滚动
4 {& }, _& x6 g% S: |# M - LDA Scroll_H/ v6 K6 D: k" }8 f0 w/ l7 U* p
- STA PPU_SCROLL$ [, F# E+ l- N2 g( `4 w
- STA PPU_SCROLL6 ^5 [& m3 W1 d2 k. d2 t( O
- RTS) X8 F& G" {$ H2 A( ~* a, u
- IRQ_Set_Scroll_Right;向右滚动7 o' h# N+ }* S- b
- LDA #$007 X. p* A7 C( B& O R. K
- SEC1 N0 i" c; ^! q+ E
- SBC Scroll_H! ^5 C- h3 t/ t9 \1 v
- STA PPU_SCROLL. C' @6 z5 s4 X. J$ c! R& f
- STA PPU_SCROLL
* `6 q% k% I2 N, j) m5 u$ ` - RTS
0 h( q, u$ [, P -
( C( u' z! R# s$ H8 C - ;==================================================
% _% ~1 A% |# O" l5 l1 L. } - ;;IRQ滚动控制' Z, p) B/ D5 J% c. C
- IRQ_Set_Ctrl1 y- O( I# T* r4 X: [
- LDX IRQ_Process_Index
6 a8 _* D: I( }6 o* y - LDA IRQ_Scanline_Data,X8 ~' `3 B% A+ O% g" u# R1 k s! l
- BNE IRQ_Process_Latch
9 O$ ?' V6 T3 z1 O- a5 I - IRQ_Process_Disable;禁用IRQ
" E6 A6 L, n9 _0 M - STA MAPPER_REG_IRQ_DISABLE8 @9 h0 Y+ o( }0 h0 u3 G
- STA IRQ_Process_Index
$ @9 Y$ ^3 s. N* T3 y4 p! ? - RTS5 l3 v, N& y/ {' \" H9 L
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线. j( L! w4 }$ {1 X
- STA MAPPER_REG_IRQ_LATCH
+ z v9 G6 s9 }: g/ A3 F5 c& V+ ^ - INC IRQ_Process_Index$ t7 Z8 ?3 U) [# w, y; Z
- RTS
6 n7 ^, N5 Z8 t' H5 m" y* J. c - $ } B! N) m. M' i% h
- ;==================================================
" T# O- F. _3 T" [1 u! r a( \ - ;IRQ处理( P: Y) t* ?$ B# e+ v
- IRQ_Process_By_Index
" _7 z2 h9 O1 i( e7 m4 |' Z - JSR IRQ_Set_Scroll0 o% Z% q. w1 h
- JSR IRQ_Set_Ctrl/ P2 J# U% ^: G+ g. e9 |3 f
- IRQ_Process_End
. `8 y! f8 p. X& p/ m* W - RTS
" b$ O3 |% }5 S' Q; ` -
7 Y! `4 t, v! s( @ - .ENDM; C$ w9 h7 B( M4 J M m6 O
-
" z$ U! M% S& y4 b
复制代码 / H( a# b" W) i! l. q: _
3 {+ ^0 S4 t& Q* m+ r代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|