|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ! E/ B$ h3 W6 I* A: W) u
, k4 K: i$ C0 _, A" s3 W3 s% l
本次IRQ研究了如下:7 m/ U& m+ \/ t; l
VRC2&4(Mapper21,23,25)& i9 J3 A; h) D8 ]# d& K
VRC3(Mapper73)8 Y% w2 y2 P: L- j6 w7 t
VRC6(Mapper24 & Mapper26)3 O: X+ v6 C" x. K' `: E
VRC7(Mapper85)) r; o6 a: ?* n7 q- X
MMC3(Mapper4); y% C$ k- j6 q, x! E# K
MMC4(Mapper10)
1 T2 X: r, B+ X b1 I# E6 }, ]$ P9 WMMC5(Mapper5)
2 W/ }# Y7 b* P- S' V2 `Mapper180 e+ y6 h% E7 K& l) |& ]6 l0 _
Mapper64
" w8 g- z% h5 ~! p' p0 x. u. `Namco163(Mapper19)
% P: p/ W; f- Y& S' w8 w L: S( RSunsoft FME-7(Mapper69)9 s3 b8 f$ d( b
1 x/ W, t9 p! g* ?( U4 b共计11种Mapper的IRQ操作使用例子
- }8 f. s+ i" J- k7 S代码内有详细注释, 希望能帮助到感兴趣的人.% L# m8 B# g: T7 I0 H0 j
7 a* Y4 M7 e! w: C
  7 G% J" ]1 `9 i2 E9 w
# i3 o& N: R0 ]$ B- N
Mapper代码主要逻辑(以MMC3为例):
$ k' F" a8 H3 u" p- }5 \5 C- ?4 q8 _! T# R
- ;==================================================
: f b8 Y4 J& d6 M4 B" [3 U5 |5 P. F - ;Mapper号4 C9 J) ^- ]+ D5 m* B
- MAPPER_NUMBER = 04
+ G) o/ h0 o' V; E! t& Z" a# P# ` - ;==================================================0 D5 y9 e d+ A- J# q" F6 X$ _
- ;MMC3 (Mapper 4) 寄存器常量
( E x1 T4 ~& H% y. t! t9 u+ N/ B - MAPPER_REG_BANK_CTRL = $8000: |" B ~0 {5 B' ^2 J
- MAPPER_REG_BANK_DATA = $8001" ^8 H4 k! d0 }2 f* _
- MAPPER_REG_MIRRORING = $A000
' J- j+ U' x: w- m - MAPPER_REG_PRG_RAM_PROTECT = $A001' j8 ^" }. A( \3 U6 L; ], E" o
- MAPPER_REG_IRQ_LATCH = $C000
0 M; a2 s8 p+ Z. N; z - MAPPER_REG_IRQ_RELOAD = $C001
' H1 A- L2 W9 p1 g6 y) y - MAPPER_REG_IRQ_DISABLE = $E000
) B' T) ~! F& X3 U, ?2 } - MAPPER_REG_IRQ_ENABLE = $E0011 g3 @+ L- T5 t0 ?# F- T
- ;==================================================9 ~8 K, o9 K( |0 ~, L
- IRQ_SCANLINE_BEGIN = 135$ g3 N' V& j' j
- IRQ_SCANLINE_1 = 8" n* M3 [3 f6 a* u% r f
- IRQ_SCANLINE_2 = 549 K" `8 y( a' M" ^- ?5 M9 H$ o
- IRQ_SCANLINE_3 = 8
7 r3 e l; i6 {+ Z p* e$ U - ;==================================================: ]) J/ N! Q8 H% A7 c* T
; ?) Q9 @" d1 Y% C* g2 U- ;====================================================================================================; P/ h' Z4 r6 k$ {1 j4 y
- ;宏常量. c9 Y C- t. o" J
- ;====================================================================================================
7 |" j% h6 K9 H; J/ l$ |0 v: m
0 s% Q0 F1 J! V% x' h4 c6 b; y- ;====================================================================================================: N) v9 b! W5 G0 e) k
- MACRO_MAPPER_INIT .MACRO
+ C! s: T% `& X, A/ X/ i - ;禁用IRQ
7 A- E& k! n+ H - STA MAPPER_REG_IRQ_DISABLE
$ x+ ~4 R7 w1 {0 j1 h% Q# o0 x - " G; [' k/ h2 L/ i' z. Q
- ;水平镜像
( e9 Z+ L" f3 `* H - LDA #$01: f% @( s3 |, B4 j9 J, v
- STA MAPPER_REG_MIRRORING4 e- V5 [' u* p# a& D5 A2 B
- 3 o$ }! |# ]( |3 W9 y
- ;初始化图形bank
' q) i) q. P( n) r - LDX #$052 ^! c' C$ x5 t) P0 t# b, T2 f
- .Init_Chr_Bank/ l, X5 r9 L9 Z4 p$ F( G
- STX MAPPER_REG_BANK_CTRL
/ [, l. g7 |& P( f6 A4 V - LDA .ChrBankData,X' {* n( P w0 @& q; Z7 Y1 J
- STA MAPPER_REG_BANK_DATA n9 W/ v, e$ s: x
- DEX3 G* y9 I, N1 Y. j
- BPL .Init_Chr_Bank
& G! ]" A5 ~) I! I: @3 O# O - JMP .Init_Chr_Bank_End
7 f# N' i5 B, z - .ChrBankData
6 O, P" ?* D: `5 T& t - .DB $00,$02,$04,$05,$06,$07
, t1 \8 T+ a7 h- E - .Init_Chr_Bank_End
" o% f, F. y3 x9 w; u, L7 R; U - 2 D2 G6 x0 d8 x5 U, s& l$ Y/ z
- ;启用SRAM, F* v' X- l1 ]5 v& b5 X) T+ ^# N* A
- LDA #$80
7 u4 X/ G: E9 r4 f/ _/ g - STA MAPPER_REG_PRG_RAM_PROTECT
+ f; j% V+ z4 t$ |" h, f" p" L# { - .ENDM
7 Z% u1 u2 O# p" O8 J+ v - ) G$ y+ ]$ g5 y: Y( ?) ?+ n* j$ N
- ;====================================================================================================# Q; n" M$ H! g3 g; w$ J
- MACRO_MAPPER_SOUND_CLEAR .MACRO
, Z8 {! O9 z% R9 e' v( P - .ENDM
# i$ N$ h- o) F" C n -
8 N1 y- e" g- a1 I - ;====================================================================================================
- P' F" g% x5 y/ y; x6 ~ - MACRO_SRAM_ENABLE .MACRO
* C+ p" f' x' M - LDA #$80 H/ x+ I# _4 }+ X& a
- STA MAPPER_REG_PRG_RAM_PROTECT* p. `6 e$ P2 A3 G' L' q5 f
- .ENDM: w& ]: D7 \3 |: M8 k# j6 Z) t
-
, ~0 E0 ]+ o, n. [+ t- W' Z5 I - ;====================================================================================================
! q4 {5 o3 t$ g6 `: \# W - MACRO_SWITCH_BANK_8000_A .MACRO
5 X9 Q5 o: }8 k% k5 Z+ n - PHA9 R* I4 E4 ]! m! W
- LDA #$06
1 [! E! ?! i0 \; I1 J - STA MAPPER_REG_BANK_CTRL' d6 T- D* h3 `6 q; K' K
- PLA
9 c. w4 G" X: w3 N$ T0 Y |6 R - STA MAPPER_REG_BANK_DATA+ W& {0 g# r8 |! H; P
- .ENDM8 U3 K; ?* y) y: U j+ J: `0 N) W; ?
- 9 U3 f, j7 e- ~6 d9 g
- MACRO_SWITCH_BANK_A000_A .MACRO
( y4 a* @/ t8 ?1 f) g% K! x - PHA; N7 R% r$ e! _, q5 u
- LDA #$07
: j, n+ \0 v. t6 s- c: D/ P* @7 P; _9 J - STA MAPPER_REG_BANK_CTRL
! L9 y! A* K; w) N5 t - PLA2 U% _8 F$ V3 ^: e
- STA MAPPER_REG_BANK_DATA
- Q( r4 j1 X2 Y5 d% T6 O/ | - .ENDM
0 a! ]! L8 S. { C+ L - $ Y) a& C( U; M
- MACRO_SWITCH_BANK_C000_A .MACRO) ]* M$ H# |, P. M. s
- .ENDM/ R. `5 P C" n8 p$ ?
- , a! b" C+ u: G- N; @$ I
- MACRO_SWITCH_BANK_E000_A .MACRO3 P$ f T* v: A! H( `5 U1 N, z6 z
- .ENDM" i" m: N$ y7 q) V& l# K
- ) O$ r( V0 K0 G
- ;====================================================================================================; |% a0 Y0 N- r/ e7 d( ] w5 V
- MACRO_TRIGGER_FIRST_IRQ .MACRO
# A [3 @' |1 [: E+ ^( Q - LDA #IRQ_SCANLINE_BEGIN + 16 T, U% Z+ J! K
- STA MAPPER_REG_IRQ_LATCH# V& f4 r7 J( g j
- STA MAPPER_REG_IRQ_RELOAD7 q$ ~# m# H) d8 L* o7 l5 Z
- STA MAPPER_REG_IRQ_ENABLE- s' M8 f! m8 m7 U- r0 `8 X0 u
- CLI" a) p+ T5 G" g) _
- .ENDM* \4 r( q; L0 u- }& T
-
+ s6 ^, x, K' U - ;====================================================================================================
, ]) _/ i4 Y7 h- L - MACRO_ENABLE_IRQ .MACRO3 b q3 b/ o, ~" w( k6 s
- STA MAPPER_REG_IRQ_ENABLE( ^% ~ y' I R2 o4 `8 \
- .ENDM
& r& v/ M- C! y! q -
" Q; c8 k2 G! x- u( z5 t - ;====================================================================================================
, s6 @! h2 N* d( }+ J5 H& f. L/ |- a$ T - MACRO_DISABLE_IRQ .MACRO8 g. i& A1 e3 b; C! ]
- LDA #$00" e; ]1 R, V5 S+ g* {1 k1 [
- STA MAPPER_REG_IRQ_CTRL- W* W' j1 N6 _2 ?
- STA MAPPER_REG_IRQ_ACK
3 C( I6 C) q8 u% E) { - .ENDM
8 d( G$ A' ?: S9 `8 T; y -
3 e, e' F! F( L: X+ l; _0 j/ q - ;==================================================================================================== ^2 ?. q$ b4 ~& v9 Z! ~/ y$ J3 z
- MACRO_ACK_IRQ .MACRO1 B! g7 U( k/ [7 U
- STA MAPPER_REG_IRQ_DISABLE
5 F: a# G# w, b+ V' q - STA MAPPER_REG_IRQ_ENABLE
3 ?, C4 Y8 \$ Y - .ENDM1 w" u# s+ Q7 w7 F3 ^5 ~" q
-
7 i7 B7 j/ n3 z! I# } m' { - ;====================================================================================================
" a# T! U+ p! H( j9 d- Z1 X - MACRO_IRQ_OPERATE .MACRO
( K j$ i% F! F# D) x. s3 L+ t- S
0 `. w! e: Y; z, s9 U' G- s0 F- ;==================================================% s9 s1 f3 N1 ]* O$ S* `$ \, K; k
- ;IRQ滚动模式常量
; u/ R5 x) h% D% f - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动: P+ r6 U! ~* \ u( O
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动1 w# g3 v! G: a' H
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
( D- w B1 A' Z% c* B
& M# j' C# }* F. l) O- ;IRQ扫描线数据7 q5 y* w- N7 P+ m# `/ q
- IRQ_Scanline_Data
. x5 G( d# l3 H$ `* `" A; y - .DB IRQ_SCANLINE_1
/ k6 b. ` i( z! H0 N: N! A - .DB IRQ_SCANLINE_2! I6 \ n$ S; i0 f
- .DB IRQ_SCANLINE_38 Z6 F. j( T; S5 L0 ~
- .DW 00 ;关闭IRQ, F8 M3 |$ ~8 t8 B1 f) i
- 1 b6 S, N2 X( p/ A
- ;IRQ滚动控制模式
/ q% M# T* l+ g1 t - IRQ_Scanline_Mode
( F/ I( y4 B/ m# G1 t - .DB IRQ_SCROLL_MODE_RIGHT" V( f$ ^$ x7 }1 c
- .DB IRQ_SCROLL_MODE_LEFT# S! g/ w* l7 c- K: c: h
- .DB IRQ_SCROLL_MODE_RIGHT
2 F0 b; s' f. e8 E( V3 C% h L5 M - .DB IRQ_SCROLL_MODE_LEFT. v9 H+ Q3 I9 e. i
- . l j% ~3 L/ e" `& W' ]+ u
- ;==================================================" e, p1 k) o/ A7 }
- ;;IRQ滚动控制
5 Z ?% G" u, G. B! _' | - IRQ_Set_Scroll7 z/ W/ }9 _, L* T2 i n
- LDX IRQ_Process_Index/ J* w0 W2 D$ X' u& C, l8 n; v1 e6 e" J
- LDA IRQ_Scanline_Mode,X
5 u6 q# K$ i( W) x2 p6 q+ S) S - CMP #IRQ_SCROLL_MODE_LEFT* P! `$ h2 \6 X# h: ^
- BEQ IRQ_Set_Scroll_Left/ Q! B4 E$ [- C5 s V8 A! H
- CMP #IRQ_SCROLL_MODE_RIGHT- d1 _4 ^ D, h" l9 t
- BEQ IRQ_Set_Scroll_Right- I( |# H. S% t$ U- s5 K( [$ u) V+ A
- IRQ_Set_Scroll_Zero;不滚动# Q" Y6 \* Z9 j
- LDA #$004 R) c# Z( C o+ y; d
- STA PPU_SCROLL, {: d6 i+ {: Y" Z. F/ x) i8 o' d
- STA PPU_SCROLL- e" K0 l% Z s5 N! V; }
- RTS
# c$ I1 s" N& C) v - IRQ_Set_Scroll_Left;向左滚动4 v5 f) r1 ]+ E$ P# u7 X8 @2 L. T
- LDA Scroll_H* H- v$ M( O; Y C3 C
- STA PPU_SCROLL
4 S. n; g r; o7 v - STA PPU_SCROLL
7 X6 T2 Z1 _. F( z - RTS. O) \8 U! Y, a
- IRQ_Set_Scroll_Right;向右滚动
! o6 J3 g2 Y' ^ a3 q) m - LDA #$00/ d6 v- w# F8 j1 d8 q
- SEC' P9 L% v: K. e' Y, v
- SBC Scroll_H. _7 m$ V0 g9 U& q |7 u9 ^
- STA PPU_SCROLL- D6 z1 c" V( M( G& P8 [
- STA PPU_SCROLL7 T0 @. u- J9 p# h% t
- RTS7 M2 N9 Z9 X5 `- V o; C
- 8 m P- X2 f' C
- ;==================================================
. `7 m6 V$ T) B) J2 o' \+ c - ;;IRQ滚动控制
" s' u" Y# M2 _+ W% ~ - IRQ_Set_Ctrl
- a$ G+ z1 K; L5 @7 u6 s - LDX IRQ_Process_Index
6 [; z# j* w+ i3 g7 K% z: N - LDA IRQ_Scanline_Data,X! u% v1 G. I& C( p) S- L
- BNE IRQ_Process_Latch/ Y! T$ T7 v3 T5 T+ p) {( J
- IRQ_Process_Disable;禁用IRQ
- p" x; o! D: W% W, F1 F& y - STA MAPPER_REG_IRQ_DISABLE! e$ R) F6 P# h* h
- STA IRQ_Process_Index+ @4 X4 Z7 g2 F3 w1 m& T
- RTS
9 G9 Y6 t* d+ j/ F! ` - IRQ_Process_Latch;设置下次 IRQ 触发扫描线$ E. M& g2 G. F$ W# M) Y# ]6 l7 O! A
- STA MAPPER_REG_IRQ_LATCH3 I6 C/ C9 L! k2 n
- INC IRQ_Process_Index
6 d6 f+ ~0 H7 O. x - RTS
* J, |9 F" U N, W& c8 f7 R) g
* m- n! S# d0 i/ L- ;==================================================
5 V, H5 Q, S8 |, x4 g& L - ;IRQ处理
+ I# {; N8 Q* ` Z1 c - IRQ_Process_By_Index
: E% `2 J( }- s* u0 k1 ^+ o, o9 q# U - JSR IRQ_Set_Scroll* S2 w6 I+ Q/ L; ^* e+ S
- JSR IRQ_Set_Ctrl- D8 @' x2 F1 S
- IRQ_Process_End4 X2 V9 {3 i9 R# q9 v; i, `
- RTS
/ e& \5 z. ?* g R - ; O4 M" _# n7 A! L) b; v6 D7 d* a
- .ENDM
& ~, [, O0 e' c8 v' V' Z - ) _% V2 p8 g/ M1 [
复制代码
0 n4 t- Z, L0 k) p3 x. x) l! ~$ C) G9 }' ^- ?% N- l, F$ j0 v* C) }" n
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|