|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 . W" G/ K2 w8 f1 ~6 ^
" y& p3 e$ H$ G" P* k本次IRQ研究了如下:! Z! n6 _/ j" j5 ?! g l
VRC2&4(Mapper21,23,25)
! h- I3 o# P. O5 [2 b: g zVRC3(Mapper73)) B! i$ W; }) g2 [6 R
VRC6(Mapper24 & Mapper26)& m& ~8 P- M" N( o1 s! P" p6 m
VRC7(Mapper85)( o6 L7 Q5 Z8 S6 {- V; S! q
MMC3(Mapper4)
+ y" g) P& T) i- bMMC4(Mapper10)" s9 J$ s" W2 {( h8 z" Z
MMC5(Mapper5)6 x& N$ _+ M7 O5 P1 p( T. I2 ~" w
Mapper18
+ q$ n' r6 M! S8 c! x, I/ g; [Mapper648 C$ G( K! `1 z5 a. s+ p$ r
Namco163(Mapper19)$ y h$ [/ N( s. ^, H
Sunsoft FME-7(Mapper69)$ o$ [7 Y0 v# l( W: r# C
5 A0 g5 u, y7 |" R/ u: H) o& e共计11种Mapper的IRQ操作使用例子% N& P/ ~% ~* i$ B: B
代码内有详细注释, 希望能帮助到感兴趣的人., s% z* _- l" w% x- p% R8 f6 c) b; P
+ o8 K7 c! F" n/ l) C- e: N/ K
  9 f' g1 ]$ ^- z" }4 r( g
& U9 n& M3 |- s3 e' @$ i: h+ A8 r
Mapper代码主要逻辑(以MMC3为例):
- d! W; i5 q# v
* J ]" Q8 Q* L$ p9 w- _- ;==================================================5 t3 c* B- H- L/ G# L( T7 I4 H: x
- ;Mapper号
# b6 h7 G$ k" Z( H - MAPPER_NUMBER = 04
- c4 P* H# n8 y! I- Y% p y - ;==================================================9 V3 P+ n: A) Q, M a
- ;MMC3 (Mapper 4) 寄存器常量, U' n( u& M$ S4 O" l7 Z$ o6 m0 C
- MAPPER_REG_BANK_CTRL = $8000, N3 x' z/ g, k8 ]
- MAPPER_REG_BANK_DATA = $8001
& J3 D4 O" J& [) ?8 ] - MAPPER_REG_MIRRORING = $A0008 o5 @1 W/ }1 G$ u; J5 {
- MAPPER_REG_PRG_RAM_PROTECT = $A001, P: e: M! W$ l* z
- MAPPER_REG_IRQ_LATCH = $C000: H8 B9 e# f, p+ e! r# X. o1 t
- MAPPER_REG_IRQ_RELOAD = $C0018 I4 `- G* I! o6 U; W
- MAPPER_REG_IRQ_DISABLE = $E000: B; Y4 v$ [% i- @) b9 S
- MAPPER_REG_IRQ_ENABLE = $E0017 C, z" z, Y5 P9 X# N9 N# T% i+ G3 B7 X0 g
- ;==================================================
" a1 G7 [. V- y! x1 F! C' Z - IRQ_SCANLINE_BEGIN = 135
; K2 d5 P _7 O( s4 v - IRQ_SCANLINE_1 = 88 E4 c" H0 ~& s) s) j
- IRQ_SCANLINE_2 = 54
8 l3 L0 x8 g1 s - IRQ_SCANLINE_3 = 8
& M1 }, a' x$ n8 V - ;==================================================
, E/ b9 F( U$ R) R' Q
0 Y) d; p, [& S3 w) }- ;==================================================================================================== _0 J: {' V4 N1 h. w; [
- ;宏常量, Y, B$ G: D* v! c0 [; c
- ;====================================================================================================
5 p' Y4 n2 s- o' u7 D/ W
+ a8 S! S) J4 `( k. m- ;====================================================================================================. V4 f: M% S' D: @2 D4 j
- MACRO_MAPPER_INIT .MACRO4 L/ F$ _6 Z( x
- ;禁用IRQ
0 O' D" n/ a' m8 ^2 Z8 {' i - STA MAPPER_REG_IRQ_DISABLE
+ s) L; d0 N, F0 C) n - 9 m% e: ]7 X- i* p# w; s2 _1 T4 _
- ;水平镜像8 D) D( ?, _0 O, M4 h/ u+ y
- LDA #$01& ]/ a9 t8 F: p/ v
- STA MAPPER_REG_MIRRORING" ~( e- [5 L* w6 |; K9 a D
- - B N/ X6 j3 g# N1 R# v; t5 ?. R/ _
- ;初始化图形bank2 K4 P8 y }) T( I: k6 B3 S+ V
- LDX #$05
- Y9 n% e5 F- A6 x# T# H - .Init_Chr_Bank8 q) ~# s4 u0 K$ P' d: f
- STX MAPPER_REG_BANK_CTRL1 h# C i0 o' n2 O+ k& `5 b
- LDA .ChrBankData,X
; _- C& z9 e8 V5 f- M# [ - STA MAPPER_REG_BANK_DATA
+ i0 G5 C$ G6 \ - DEX' o4 g* B9 S, I# @6 T9 E
- BPL .Init_Chr_Bank, w/ v! Q# L# ^8 Z' z4 K: |$ d
- JMP .Init_Chr_Bank_End( J" K& p$ E. I' u
- .ChrBankData
# r Q1 V9 U3 t' ~2 G) P7 C - .DB $00,$02,$04,$05,$06,$07
. f2 p' K: N: U/ @9 a h7 p ] - .Init_Chr_Bank_End' n& A4 q u& F( H5 q2 A( T
-
! |! Y4 g- e! `( r* H4 U - ;启用SRAM
+ g: m H. o; m" d* Q - LDA #$80
# H4 I' {% W) ]3 @% B - STA MAPPER_REG_PRG_RAM_PROTECT
# N- V, P: a; x# q2 c! A: }0 l) | - .ENDM4 g" C6 K" K- e/ f1 P
, ]" s' @; m& v. r- ;====================================================================================================1 k3 A8 K. B5 K8 h/ E. N
- MACRO_MAPPER_SOUND_CLEAR .MACRO
! H) d& e6 u+ X+ e - .ENDM
6 \1 P2 R7 I/ k! O! z% z -
9 ^) |" i3 \1 i* b" w2 @ - ;====================================================================================================
' @5 ^+ C2 {+ t0 P% K, q - MACRO_SRAM_ENABLE .MACRO* R- i7 \2 _. l" O! C- E2 P
- LDA #$80
& A8 R0 R. c. h$ G. L - STA MAPPER_REG_PRG_RAM_PROTECT
+ x9 i. D0 M! q% l+ E - .ENDM
( `1 b6 _3 a4 ]; `# Y. l- w/ ` -
4 J1 G% V4 I$ M - ;====================================================================================================# r, p9 x1 w# H$ w
- MACRO_SWITCH_BANK_8000_A .MACRO7 \. N( \( j N; ` C+ {2 P9 ]9 m6 U/ i
- PHA7 @3 w, P5 j0 i7 Q% V+ R& n
- LDA #$063 O2 [1 p1 e2 K6 P0 ~: ~
- STA MAPPER_REG_BANK_CTRL
' ~8 W, y. d8 ]- B$ V+ [ - PLA8 m2 r3 b- n) U3 b9 Z* w" y
- STA MAPPER_REG_BANK_DATA
. k8 C7 ^( W: P' y/ m" s: B' } - .ENDM
: A# h( M: T( g9 Y( |# N - f# w7 Q' T- j- `$ g* T1 T
- MACRO_SWITCH_BANK_A000_A .MACRO
! ~* c; H, S7 Y+ {& d - PHA
+ C$ f3 X2 H. E. ^$ F( M7 z - LDA #$07
7 e* b6 m/ C. z5 {2 \# [ - STA MAPPER_REG_BANK_CTRL0 R! M! G- e% B% [8 X# \
- PLA1 N7 s# d E! r+ q8 U! l
- STA MAPPER_REG_BANK_DATA
. D' `3 q+ u3 J/ z - .ENDM- O" f/ K. C) a- P6 Z8 E
- - J4 f$ @: U Z
- MACRO_SWITCH_BANK_C000_A .MACRO/ [' {3 H9 n/ |, Y" b/ F& i$ W
- .ENDM5 ~' M; t5 d5 \2 N
7 J l) V- V, f- MACRO_SWITCH_BANK_E000_A .MACRO; u& A" M) {* z
- .ENDM
) B" K5 p% Z/ |7 W9 P - . q. m6 `, O) s2 B; g2 L* R) ^
- ;====================================================================================================# _& D" t$ N1 c! U' x {
- MACRO_TRIGGER_FIRST_IRQ .MACRO. `7 v0 O! g- V3 K& m) M; z
- LDA #IRQ_SCANLINE_BEGIN + 1
/ ?% G3 G& J S# t: d, w - STA MAPPER_REG_IRQ_LATCH s: I9 a& C) L- |. |- F
- STA MAPPER_REG_IRQ_RELOAD( v, k7 N% F( D8 s% h2 m; V' M
- STA MAPPER_REG_IRQ_ENABLE
6 E, k8 R8 \: Y+ l2 f M3 Y4 m2 h - CLI# X+ b3 z$ B! q! i0 _* [
- .ENDM+ f. v2 G/ L1 f: u# Y
-
0 o* U9 V9 r& O" p7 K - ;====================================================================================================
$ K6 o; C% @+ ~: F, S0 Q- U5 Z - MACRO_ENABLE_IRQ .MACRO
8 C* _! Q/ N: O7 H5 J- p - STA MAPPER_REG_IRQ_ENABLE
9 x5 s) S1 w+ H: N1 } - .ENDM
* Q. q \8 U! Y3 h -
; M0 r/ [- T1 \2 t; i8 T `+ O- z - ;====================================================================================================
, i( f* n& P$ W - MACRO_DISABLE_IRQ .MACRO
0 b6 i9 C( {* ?# Z2 N$ j8 m - LDA #$00
* B: K c/ c) Y6 ]: k - STA MAPPER_REG_IRQ_CTRL, l4 u0 R# j3 \( K( W/ C% u
- STA MAPPER_REG_IRQ_ACK
; B k# }" Y4 A. ` - .ENDM
x: X- ]" Q1 H5 g* t/ R/ d -
, `' A( Z7 y1 F$ ?; b - ;====================================================================================================" f% M. G/ _# r8 b. ?5 V
- MACRO_ACK_IRQ .MACRO
' ]9 l) @! m* x# ~/ g) y - STA MAPPER_REG_IRQ_DISABLE/ E! L5 t5 t8 M3 j Y' H* |5 u
- STA MAPPER_REG_IRQ_ENABLE8 N1 `; `$ F% d
- .ENDM: E5 f8 X- D* u) r, a( M: [% W! t
-
. f1 v! ?9 G2 X# ~, W - ;====================================================================================================
, H6 D' R' N+ E# B' i0 ? - MACRO_IRQ_OPERATE .MACRO
" k* v4 b3 k5 {* z* ]
. S4 ]0 G* R- ~' v- b/ B- ;==================================================# d4 O- l7 o: e# M( a9 w) V
- ;IRQ滚动模式常量$ _2 j/ D! u- v x- o6 m+ N( t
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动6 A0 Y0 n" O) ]
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动2 O: T' k" t/ j9 G/ G& V. s* S
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
) L2 \3 O/ {( }5 R$ A& G
3 X& n4 |0 G3 l' B- ;IRQ扫描线数据. m& f3 F9 A6 t* P, h7 y4 J
- IRQ_Scanline_Data
. N; T8 }2 o) x/ ]6 F1 n6 X - .DB IRQ_SCANLINE_1* K$ H& g# |/ K8 A5 t' S/ j# s( _
- .DB IRQ_SCANLINE_20 k( B7 _1 t9 T$ t8 \- Z! M
- .DB IRQ_SCANLINE_3
- c2 e2 j4 ^8 x* g - .DW 00 ;关闭IRQ
( o+ E) _' Z2 \
3 y! _5 j/ n" u; c0 i7 ?& }! a- ;IRQ滚动控制模式$ W' o1 Z; d- r- N/ B$ E
- IRQ_Scanline_Mode
: {8 j/ h0 m: M - .DB IRQ_SCROLL_MODE_RIGHT" F0 A* s- B6 r+ Q( ^5 g
- .DB IRQ_SCROLL_MODE_LEFT/ R7 I& j& x7 k2 @2 B: G9 M( v
- .DB IRQ_SCROLL_MODE_RIGHT
0 S% C( k! N5 A. ?5 q - .DB IRQ_SCROLL_MODE_LEFT3 q' P7 R; M" T% e( M
- " ~& _2 M% T! T3 i
- ;==================================================' S3 p6 }1 ^2 f% [& a, \
- ;;IRQ滚动控制 ~1 z9 ]/ I% _. |
- IRQ_Set_Scroll# t' J& P. S/ ` l
- LDX IRQ_Process_Index
/ Y+ \% u) @6 w+ R/ |6 @9 x* q" _. R( T - LDA IRQ_Scanline_Mode,X8 H" |% h: o% c4 A3 G) J+ G
- CMP #IRQ_SCROLL_MODE_LEFT+ a$ S7 g' W9 T4 n' ?0 I2 ~
- BEQ IRQ_Set_Scroll_Left- z1 C) O4 A9 ^1 p" a2 `+ ^$ f( H
- CMP #IRQ_SCROLL_MODE_RIGHT
/ ~9 s6 ~5 }" a, L1 I9 z) n - BEQ IRQ_Set_Scroll_Right
; X) U7 H {- S - IRQ_Set_Scroll_Zero;不滚动3 u7 ]% l l5 K7 C2 k. j7 j) l
- LDA #$00- a5 H$ f* `9 `- u! J6 D; P) C
- STA PPU_SCROLL% X% S+ A5 F& B z x" c
- STA PPU_SCROLL
0 U& r# H7 H9 E - RTS
5 q0 m9 `+ l4 `4 l6 r- g C& P* V - IRQ_Set_Scroll_Left;向左滚动* g- }2 ?* E q8 q R' B) c6 |
- LDA Scroll_H
' z2 m6 _/ U, z0 W- N - STA PPU_SCROLL( e0 X1 o. h9 E' y/ |
- STA PPU_SCROLL
5 [) ?0 h- y! P4 t9 K {1 w7 i7 [. E - RTS, ?5 Z6 N' J1 }% x6 m
- IRQ_Set_Scroll_Right;向右滚动( |' i' Q: K, u3 d# a( k3 L/ ?# D& e( h1 V8 z
- LDA #$00
% T& u' q, J7 v& A/ m# j - SEC( P2 `* C! d! p
- SBC Scroll_H
! X- W# r' ?4 j9 F. O/ ?, z; j* j - STA PPU_SCROLL2 M! }) G& j3 }6 a
- STA PPU_SCROLL/ U+ y! N1 v) R) }3 s d8 }4 q% v+ {
- RTS
- Q4 P' v' }: k9 j -
5 r% \ c' ?3 y* M) k5 r! i - ;==================================================3 ~/ E4 C' S% @1 t
- ;;IRQ滚动控制 \) N9 b3 m1 ]& b `
- IRQ_Set_Ctrl
7 t8 ~! d7 t1 K+ k - LDX IRQ_Process_Index1 I% I( r, |. p5 K$ y
- LDA IRQ_Scanline_Data,X( v3 e1 ]% I# s4 J# J
- BNE IRQ_Process_Latch8 B, k% n& R5 ]- z
- IRQ_Process_Disable;禁用IRQ/ C" G& Y0 e5 l4 t3 @& x
- STA MAPPER_REG_IRQ_DISABLE
2 S% q; Z. S* v0 d/ s1 k# Z( P W7 R - STA IRQ_Process_Index
' f/ P8 A8 b8 h% {; B/ U - RTS
3 O& I, @/ U- z1 r8 i - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
6 J; |) U1 B! `6 W9 I+ x% B - STA MAPPER_REG_IRQ_LATCH8 ^% [1 B6 O0 c" m( I x4 ~( J
- INC IRQ_Process_Index8 |( u% U$ ?, p6 t* A4 F0 O$ D
- RTS0 Q: k; P+ R B: q4 }) v5 h8 z3 ?
- / o |0 h' k: l
- ;==================================================3 ]) B; C, y$ U5 |& s# @7 y& N' s
- ;IRQ处理
& W2 [: D/ q V% k# ^4 U - IRQ_Process_By_Index
1 N+ t7 J# y$ D0 a - JSR IRQ_Set_Scroll7 P; G' p6 @1 g0 ~ b! x& n
- JSR IRQ_Set_Ctrl6 [, g w2 E8 n: O U6 Z5 I
- IRQ_Process_End- L1 M& a5 w9 ]
- RTS4 }3 N6 v0 W. B# A" `5 I& T [3 s0 d3 q
-
' T; l% d3 L# e4 u$ ?& V1 d+ n - .ENDM) Q7 X' }4 }3 F
- ! J: |$ {6 x! B4 N% L9 n7 r6 k0 _
复制代码 i+ d2 P3 u' I/ ? ~! q- C
5 f$ E2 e$ A5 I代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|