|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
. B+ P8 a) N. _7 q) W% ^& x% W
本次IRQ研究了如下:
3 r; r m7 z/ [$ \" P% [VRC2&4(Mapper21,23,25)
6 F3 U4 l+ }, ?, S& V, AVRC3(Mapper73)
/ X- r5 ?$ w$ ]6 w6 \# JVRC6(Mapper24 & Mapper26)8 M% t0 x9 W5 K5 j# a2 v
VRC7(Mapper85)
7 f F* M- }0 ~$ lMMC3(Mapper4)" b* f* m( F/ o2 C5 Y5 ]
MMC4(Mapper10)
' \2 Y2 T$ F2 R8 V2 KMMC5(Mapper5)# M6 ~- t) v9 }* ]% n) f; e
Mapper18
' L1 f- f; E! n. X/ r3 b7 X" r* ?7 V& aMapper648 ^# V, c( q. b2 k' w
Namco163(Mapper19)
4 D& n$ t# X6 I2 b0 BSunsoft FME-7(Mapper69)0 C. {0 y, Y) p5 w( d4 h: }4 {
7 N% Y! l( i) _# h共计11种Mapper的IRQ操作使用例子
$ e3 p( f" M7 Z( `8 K代码内有详细注释, 希望能帮助到感兴趣的人.* @+ n) U! E2 I2 w
* r2 H/ g' u7 Q
  
" o/ b5 W+ j1 ~! b5 r
8 a% s K* X$ qMapper代码主要逻辑(以MMC3为例):
4 [4 M6 q8 H! P3 j- " e! b! H# c1 v" C. }1 F
- ;==================================================4 j/ u5 r3 e& j& r$ I4 c! j
- ;Mapper号; M) `' b) ^+ q* a9 D9 F
- MAPPER_NUMBER = 042 h- [* T7 D9 ~; L( O( z' _0 @
- ;==================================================
3 ], S; E3 D2 }' f: W, O/ z - ;MMC3 (Mapper 4) 寄存器常量
% L2 D% g9 [: R* w0 K - MAPPER_REG_BANK_CTRL = $8000
; p) N& Y U3 q - MAPPER_REG_BANK_DATA = $8001, f9 J! d# M- D& z5 N
- MAPPER_REG_MIRRORING = $A000/ @9 Y6 d( g4 U- s
- MAPPER_REG_PRG_RAM_PROTECT = $A001
1 w( M- C2 [) b - MAPPER_REG_IRQ_LATCH = $C000
4 F+ h1 Y6 q$ e) Q& b8 c! _) S - MAPPER_REG_IRQ_RELOAD = $C001
) f6 ~! [; w* Z" Z, r- A - MAPPER_REG_IRQ_DISABLE = $E000
b$ n2 e2 u! Q ? - MAPPER_REG_IRQ_ENABLE = $E001
9 n, c; o( Q* f - ;==================================================
9 ~1 z: ^! h3 X - IRQ_SCANLINE_BEGIN = 135% p: ]# }# {3 e+ m8 g9 r
- IRQ_SCANLINE_1 = 8
& q6 t6 _, i9 ?6 A5 t) ] - IRQ_SCANLINE_2 = 54! b- j0 a. S0 t* W$ w
- IRQ_SCANLINE_3 = 8
& i) |$ F, P# j- w4 ? - ;==================================================
0 Z/ q B6 z$ x) L$ p. U8 S
; U7 m3 Q8 r2 p, ~- ;====================================================================================================7 w0 }; ~& [! t b( ?
- ;宏常量
5 G' ^/ A- B5 F - ;====================================================================================================7 U' H& j: x# K. ?: D9 [' t. L: I
0 s0 ?8 T- ~, V& r- ;====================================================================================================( L8 m# O" l; `0 [9 d
- MACRO_MAPPER_INIT .MACRO% C3 ?( Y2 S1 Q6 F& B6 i
- ;禁用IRQ4 b' W+ g7 o" I1 a& r
- STA MAPPER_REG_IRQ_DISABLE
) }+ c; Y" @+ A -
3 A% J3 C, ]% C0 W, K5 U% n/ t, _ - ;水平镜像
# ]( }$ d. G7 p, g& `- z5 J - LDA #$016 |. k7 G$ E8 @7 d0 q
- STA MAPPER_REG_MIRRORING
! A3 a. ?" r3 q) M( q4 ]1 q3 v -
0 E; q* o7 a: U - ;初始化图形bank
0 h3 t5 L- Y- ^4 e- Z/ N/ o - LDX #$05+ p- l& T, A/ q; k, [7 Z
- .Init_Chr_Bank' u' D# F9 S8 c+ F( U- T' q
- STX MAPPER_REG_BANK_CTRL; C$ f. u5 t8 I* Z) g( i% P
- LDA .ChrBankData,X$ l3 q+ q z q1 r- `
- STA MAPPER_REG_BANK_DATA
) [; E# K" Y3 ?9 ~7 ?: q - DEX
! A% Q7 B( V; m - BPL .Init_Chr_Bank; g8 Q- S2 { s
- JMP .Init_Chr_Bank_End. }" g$ J0 b9 l; n; B
- .ChrBankData
/ D& Y! \ Q/ t" { - .DB $00,$02,$04,$05,$06,$070 g$ {. H3 @4 s" l' d
- .Init_Chr_Bank_End
1 Q$ a/ S5 D3 I J$ R* w0 z -
, T& e I% L) g3 e# h m* _ - ;启用SRAM+ ~3 B, E6 k6 J- o( g9 U* z) z
- LDA #$80% j9 M8 @9 S8 G8 T
- STA MAPPER_REG_PRG_RAM_PROTECT
& {! F6 t) [$ t: b0 b2 y8 T8 p - .ENDM. K+ D( _& j7 C& t
& e5 t; R( i. k- ;====================================================================================================
# S9 [6 Q. z# `' \" p% q - MACRO_MAPPER_SOUND_CLEAR .MACRO! A9 ^* V+ j; i( \0 f# Q' _7 Q4 ?
- .ENDM1 Q$ R, q! k. `2 Z
-
' p; f m+ {! x" O6 W, z - ;====================================================================================================9 x9 d) U0 N2 R
- MACRO_SRAM_ENABLE .MACRO$ ^9 K1 \4 q2 M* W, G' b* q
- LDA #$80
1 |$ V# s# T$ F6 c s4 p/ u6 ? - STA MAPPER_REG_PRG_RAM_PROTECT' @) G. z0 x2 K
- .ENDM# y& d2 L- x7 m
- - [) q0 a, b, R! p9 \; z
- ;====================================================================================================( g, F, a: F$ n/ K+ B, y) F' H
- MACRO_SWITCH_BANK_8000_A .MACRO- N- i7 x; g7 S
- PHA' p# c B8 T; A5 K& a. G% h
- LDA #$06* f+ x! x! Y* ~0 l. h
- STA MAPPER_REG_BANK_CTRL- T" Y0 m% ^1 p- @4 ?5 _
- PLA
1 f& F H! W- X% P8 j - STA MAPPER_REG_BANK_DATA: Z" N2 V% F- r
- .ENDM
. ^ E4 [# ]: U: u
1 l1 \2 J, h! r3 v8 r& i8 p& l2 T& B- MACRO_SWITCH_BANK_A000_A .MACRO# H6 J# E s: j) e: J+ L
- PHA3 R" c! Z* y5 j3 P# z
- LDA #$07( r/ w5 l3 o9 H
- STA MAPPER_REG_BANK_CTRL
* F0 [" g5 } l, T o - PLA9 Q5 i8 O1 c$ }% Z& ?
- STA MAPPER_REG_BANK_DATA% O: g- D/ x* n5 D1 H* @ |& r
- .ENDM! x3 F! G5 I1 {8 t$ N6 ^, ]
- : m9 i( v! I1 f% {0 R4 g7 _4 ` G
- MACRO_SWITCH_BANK_C000_A .MACRO' P1 E% h+ g6 c7 q
- .ENDM
# O F* t4 j" ~% ]! d8 { - % O+ X# `$ g. s4 F
- MACRO_SWITCH_BANK_E000_A .MACRO/ p+ u5 a9 h( r) @
- .ENDM7 d9 @ p6 |& U+ I9 w
9 v; O1 q+ z# W' ~" |( y! y- ;====================================================================================================
# ]' S0 K8 ^1 O- O - MACRO_TRIGGER_FIRST_IRQ .MACRO6 r1 q- Q0 E8 p ?: Q3 a
- LDA #IRQ_SCANLINE_BEGIN + 1
9 L4 x" d) t1 X1 k R1 B - STA MAPPER_REG_IRQ_LATCH
* J4 Y4 Y. F& h" o - STA MAPPER_REG_IRQ_RELOAD
' z! N/ d/ R$ M: S ^- k* R - STA MAPPER_REG_IRQ_ENABLE6 T% n& x T6 I2 ~3 \) d( {
- CLI
/ X+ M6 v9 F1 Q/ `2 |9 F - .ENDM; p2 }! r0 s' @1 d
- & C6 w- ~% P1 K4 Z! g( x
- ;====================================================================================================
* r1 ] O. s: i5 M) g - MACRO_ENABLE_IRQ .MACRO
8 B% O% W% x& U - STA MAPPER_REG_IRQ_ENABLE( n% i7 n0 U3 b3 S2 J5 I7 r
- .ENDM$ K! g# C g) k; u, [- H7 P
- 9 f# C0 L7 {6 v8 g) t+ V3 v( {
- ;====================================================================================================6 R% g2 k x9 N% z9 x' e
- MACRO_DISABLE_IRQ .MACRO
' o2 d0 I9 j+ @+ J% [& Y - LDA #$00/ @, y2 M/ h9 E* D
- STA MAPPER_REG_IRQ_CTRL8 J7 w8 M9 P) i! Z5 E
- STA MAPPER_REG_IRQ_ACK
1 T: A( `' T9 ^ - .ENDM
% ~1 X2 u' O0 h8 J1 l( Q - 1 h6 i4 o+ g7 {
- ;====================================================================================================
3 x: _0 q: }9 }. S. |' y6 a - MACRO_ACK_IRQ .MACRO
. @3 h3 P% P& _, R% v - STA MAPPER_REG_IRQ_DISABLE" I7 C" e+ F- U: a7 l. j
- STA MAPPER_REG_IRQ_ENABLE3 h/ D8 p! m4 x, S- c. R
- .ENDM
0 F2 `; S4 K( [6 i; J7 V - 2 ~( n8 x- m9 w8 l
- ;====================================================================================================
1 l2 l8 S' R+ u! l# z0 | - MACRO_IRQ_OPERATE .MACRO. b+ p4 G" l I1 N
- - y: l; r% v2 X- W/ V# j
- ;==================================================
, q7 m# c, A! K; H - ;IRQ滚动模式常量, C U7 X- G$ _' m! m) I% X
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动2 g, F& k& q3 G$ h+ {
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
3 I. a# R6 I2 R0 K9 k4 p8 A - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动1 G1 O. O$ \7 T: S( T$ x' @- P
- n- Y6 ]* o/ f6 |1 R+ a5 Y- ;IRQ扫描线数据( w# V- o3 b ]: |
- IRQ_Scanline_Data" @4 q9 ?0 I a
- .DB IRQ_SCANLINE_1
/ _- G, C; e+ ~. { D& H8 J5 h' G - .DB IRQ_SCANLINE_2
/ {* s8 V: V \' g1 L! l+ y6 ~ - .DB IRQ_SCANLINE_39 P" s: m5 \8 |5 l( g/ F
- .DW 00 ;关闭IRQ
1 D0 R' A5 [/ a; T& ? - " g, \- `7 u1 m [
- ;IRQ滚动控制模式
2 Z! N4 e4 H$ J/ r! C# Z: F2 ^ - IRQ_Scanline_Mode
; Y1 s2 ]' x, _7 a" b" v - .DB IRQ_SCROLL_MODE_RIGHT
5 U% `% }% o* l+ E% @% X - .DB IRQ_SCROLL_MODE_LEFT) d' p, `, b1 F/ r
- .DB IRQ_SCROLL_MODE_RIGHT9 H9 Y. Q( Y0 v5 u. l3 I) F+ n
- .DB IRQ_SCROLL_MODE_LEFT
) G6 ~. t |& ^# K) n6 H6 m
5 F& ?- z2 L/ H- ?7 u% v* w- ;==================================================+ |0 E1 X3 ^- D# N: K
- ;;IRQ滚动控制* x7 W8 E! W1 D
- IRQ_Set_Scroll0 `0 A( K4 ~# U( E* y0 K; e" @
- LDX IRQ_Process_Index
# T7 U: {) W( G. W - LDA IRQ_Scanline_Mode,X
/ l/ c1 h. i. ^9 u - CMP #IRQ_SCROLL_MODE_LEFT
# W% M" v, Z( V0 z9 F# a. ^ - BEQ IRQ_Set_Scroll_Left
+ w7 } @9 w) b) ` - CMP #IRQ_SCROLL_MODE_RIGHT' H4 A/ t, F0 L: R2 U
- BEQ IRQ_Set_Scroll_Right; D3 X1 N) g) i
- IRQ_Set_Scroll_Zero;不滚动6 S# K: E; W& R# B- {6 C; y
- LDA #$00
+ w" K3 Y# ^9 _" l* V - STA PPU_SCROLL
. d( o! f* Z; U) Y1 c% [. Z" d - STA PPU_SCROLL
& P/ \' u& C: A0 j2 u1 a" _( y - RTS
# E2 K3 K8 {/ m - IRQ_Set_Scroll_Left;向左滚动, W+ E8 |; J2 E% G! A% W: X5 D5 A
- LDA Scroll_H3 B1 \$ z1 V, k+ |
- STA PPU_SCROLL( Q$ V5 Q! ?. n6 {5 w5 A
- STA PPU_SCROLL! k5 R/ \5 H; u, G6 X
- RTS
0 O) s# O/ v& p1 }* w9 Q5 A9 ~ - IRQ_Set_Scroll_Right;向右滚动
7 p f; o& U C% m7 c8 j5 V - LDA #$00
6 w# I6 Z, t) ?6 J - SEC
. k- ~" k! T4 E3 W* M* W - SBC Scroll_H
4 `' v+ N- O5 d8 [; w8 _3 ^ - STA PPU_SCROLL
7 r Q6 d0 V& h3 ]* z9 o. r- K - STA PPU_SCROLL2 w/ { y, K2 j4 @; X& z
- RTS' G8 h/ v/ v4 ~- w0 u
-
- p6 G- y9 a! W7 M$ O: V; J - ;==================================================
5 q3 I' ~: R1 o0 q8 Z/ \0 ~6 f - ;;IRQ滚动控制, _) y2 Y) ]' z& ^7 d9 n# Q
- IRQ_Set_Ctrl
' E* n8 E% T( P x0 D) U; b# _ - LDX IRQ_Process_Index3 V3 r3 q/ a2 p4 d5 W. }
- LDA IRQ_Scanline_Data,X0 Q- c7 Q* I9 m+ O$ x
- BNE IRQ_Process_Latch
" ~6 s4 x- r) n2 a - IRQ_Process_Disable;禁用IRQ G9 l, v6 Q( b' l: D. x2 Z; N; J7 l i
- STA MAPPER_REG_IRQ_DISABLE
. A S' K7 e. R7 {5 \) T# z - STA IRQ_Process_Index2 h) `! r& ]. p! \+ s
- RTS
9 s/ P5 ~' Q: s" p - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
/ q1 {# S- W1 Z - STA MAPPER_REG_IRQ_LATCH
" p5 q2 |6 q2 y2 H$ Y6 Z - INC IRQ_Process_Index
# }" ]) H8 W T+ i - RTS; L w8 V5 s9 ]9 h7 l
. b) Y; i, _2 q D: R: i- ;==================================================
! a; z! w7 d6 ~2 H - ;IRQ处理8 W$ h9 [4 s4 a5 B+ O
- IRQ_Process_By_Index
4 \8 o9 }) a6 t4 r$ x- f - JSR IRQ_Set_Scroll6 N8 E5 }2 n" r8 N# ~# Y* ~
- JSR IRQ_Set_Ctrl
9 X$ T: Z& Z9 M a - IRQ_Process_End& U, C& @) E9 f: c( R( ~- C
- RTS0 f; J8 J. c7 }9 k2 V2 w |
- 1 k% G+ a; s: A* \; x0 [" P3 _
- .ENDM6 \/ Y# J& _- H( X4 h+ o+ e3 C& B7 r
- 0 w* n) J0 C' y" n( U `1 d
复制代码
$ O. ^- q: G2 ]; e; v
4 V! V* e6 _0 G; r) |4 j代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|