|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
! v% ^5 n5 D/ M. \- L
6 P' \( z: | d& o+ P- j# p; K本次IRQ研究了如下:
. w ?; y8 p R5 ?. i% S. s6 F3 OVRC2&4(Mapper21,23,25)
' |1 q, L7 G- q1 N" JVRC3(Mapper73)$ o# v9 |- w- k& V# k% J8 Z
VRC6(Mapper24 & Mapper26)
% s' I4 a) R' H. ]1 h0 jVRC7(Mapper85)0 l `5 E. y" W8 x3 z
MMC3(Mapper4)
" F2 l4 Q. u8 K$ jMMC4(Mapper10)
' D S) y) o, { b \+ kMMC5(Mapper5)
0 x2 w* l, Z1 }Mapper18- t$ p5 [( J! J/ ^
Mapper64
* Q# s1 S9 Z. w, cNamco163(Mapper19)
/ X% G& @' A8 n; [9 DSunsoft FME-7(Mapper69)3 P% b6 f7 i0 m3 |
3 _% h* P* W, P, {; c
共计11种Mapper的IRQ操作使用例子" M2 `0 f9 I% c& C2 e
代码内有详细注释, 希望能帮助到感兴趣的人.& c. y& @/ L% L
7 T4 c$ J& E3 s/ r) x+ N
7 H6 U+ A0 H6 q [; E9 d' g, E- o' y9 w* N) a1 |( ?) r$ k
Mapper代码主要逻辑(以MMC3为例):
$ w- A# ^# ~. w4 A- Q: Z% u# h P
2 g; y- @4 C' u, ?- ;==================================================
2 ]2 C1 M# o5 F: x3 ~2 i - ;Mapper号* W& @3 P/ t: L, }; y7 }. z
- MAPPER_NUMBER = 04
& b' {5 P. F" e' C8 j - ;==================================================
# j, B$ `1 y- x) w7 ^0 a {% S - ;MMC3 (Mapper 4) 寄存器常量. W- R9 |5 U g' n" V
- MAPPER_REG_BANK_CTRL = $8000
. {9 v+ m* M9 }3 Q, ` - MAPPER_REG_BANK_DATA = $8001. R* W( ^6 A9 W# u
- MAPPER_REG_MIRRORING = $A000; `0 X1 U+ }/ k
- MAPPER_REG_PRG_RAM_PROTECT = $A001! t3 | B5 ?% s" l
- MAPPER_REG_IRQ_LATCH = $C000
; @* f8 h- n: A; q - MAPPER_REG_IRQ_RELOAD = $C0013 i% m' T/ _% {3 G, }9 V
- MAPPER_REG_IRQ_DISABLE = $E000- T8 T8 i8 p) e3 R) p
- MAPPER_REG_IRQ_ENABLE = $E001, f8 k. _2 H5 U% s2 k3 {( p$ k
- ;==================================================
4 P" O+ Z. A* I+ ~ - IRQ_SCANLINE_BEGIN = 135% S0 b. ^) b3 S9 K& @* @+ s
- IRQ_SCANLINE_1 = 89 P1 N- O& _+ b1 S) \4 |3 e3 |; d- Z
- IRQ_SCANLINE_2 = 54: j ^6 u D; a
- IRQ_SCANLINE_3 = 8
1 }4 f0 L# r- Q5 L* F - ;==================================================
5 }* W# N$ S* t. ? - 7 j+ q. I3 B( y& I' ?
- ;====================================================================================================" p# I- y1 w+ p( L
- ;宏常量, w- F; [- N3 Z
- ;====================================================================================================
$ z2 S$ K: F7 ?$ ?" [' z
5 O) l# S1 L; u E* s3 i6 P- ;====================================================================================================" [) {% ?( Y$ P5 U2 K
- MACRO_MAPPER_INIT .MACRO3 M6 ~0 R! x$ c# g/ Y& I
- ;禁用IRQ" S5 E; J! G& T; Q
- STA MAPPER_REG_IRQ_DISABLE& R) d) l0 g' p1 c$ q. Z
-
" s3 H( \9 Z0 V0 y/ S @2 p - ;水平镜像
7 ?! M2 P$ w; ~2 N% ]0 o - LDA #$01
0 a9 S8 U$ v0 R) [% l( n$ Y7 b - STA MAPPER_REG_MIRRORING% d+ e1 [# e6 ~& L
-
6 C& q7 \& P# w/ F& } - ;初始化图形bank
& o$ V1 t1 v: k6 V' D* \# n - LDX #$05" b7 d7 K% q5 Q9 m
- .Init_Chr_Bank
$ q/ }8 p) U: O) l) s& I R' ] - STX MAPPER_REG_BANK_CTRL; B2 `# B9 U/ D. d' Y) l- q
- LDA .ChrBankData,X
& A8 V4 P) x* Z/ m' v1 j( f - STA MAPPER_REG_BANK_DATA. z, _ K# q1 ^2 V" O
- DEX# W4 o4 q0 h3 f& v* v( u* `
- BPL .Init_Chr_Bank1 Z4 Q" ]6 v! L& L
- JMP .Init_Chr_Bank_End& {4 Y# s& [2 c9 H4 ?! O: m
- .ChrBankData- K2 p; Q& I; B5 A6 y- @* s
- .DB $00,$02,$04,$05,$06,$07
- E" A! X! {- r& \3 t! i8 H$ k - .Init_Chr_Bank_End
* d' K1 D4 C2 R( P' _ O -
- b! m a8 Y* h- ~- m7 X, | - ;启用SRAM
9 {; l7 v9 q/ [! [; o/ N2 o- W& ^ - LDA #$80( L2 Y3 n# s* @0 n% f9 y
- STA MAPPER_REG_PRG_RAM_PROTECT' X2 u0 X/ i8 \: p( h2 u; Y# [
- .ENDM
' }- T2 w4 G2 g8 Q# Z1 B4 { - 2 n2 `* W1 B5 Y5 r8 }+ z2 A
- ;====================================================================================================
6 v$ z7 K3 R* x7 g' N# b8 ^. b. e - MACRO_MAPPER_SOUND_CLEAR .MACRO: @" x# Y6 s2 Z: S2 a
- .ENDM2 w1 X9 K9 X$ i1 ]/ c
-
, r# O$ s3 d' c - ;====================================================================================================3 t( X& y5 A0 s- t+ P
- MACRO_SRAM_ENABLE .MACRO! A2 X% i1 b$ i! i) r
- LDA #$80
|9 Z) | C$ T) `, ^ - STA MAPPER_REG_PRG_RAM_PROTECT$ T- |- [5 i0 a
- .ENDM3 Q# L' I2 K3 ~2 {& ]- d
-
8 _5 e) G& m" ?$ v5 O8 G; E - ;====================================================================================================, W4 I4 q8 R d; Q( L6 Y
- MACRO_SWITCH_BANK_8000_A .MACRO
; r; j. _6 b. P5 N6 M; H" u8 n - PHA5 b, P" v( w* R8 `
- LDA #$06
6 x F" }2 }1 _( i N - STA MAPPER_REG_BANK_CTRL% P& l/ b- u; ?, U$ q- j) ^
- PLA+ i# M; ~8 T* g; F' c$ P
- STA MAPPER_REG_BANK_DATA* b8 f; a- b1 H4 ~: D8 Y% @4 S
- .ENDM/ P4 F. c9 H1 R' [( [; k
4 r6 m$ K# ?0 {4 Y' Y6 W' E- MACRO_SWITCH_BANK_A000_A .MACRO# {0 ]& o' b) A1 f5 m2 Q
- PHA
# p! f, ]. L1 H+ ?' h" x Q - LDA #$073 j; C: D' s o$ E2 o8 H0 z
- STA MAPPER_REG_BANK_CTRL
" j8 P! M: q% f1 {$ G8 i - PLA
& k2 s( c# x# z8 t+ U - STA MAPPER_REG_BANK_DATA
& @; x+ F; s0 k% l# ^2 h% _ - .ENDM
9 F. T; F8 y6 |8 P T -
- ]7 e( g! J, r% K - MACRO_SWITCH_BANK_C000_A .MACRO
9 |9 P9 G( t) ?* g! ^" ~ - .ENDM3 _' {" E2 N* ?4 j) G d! F/ `
5 A9 F$ k# d2 h2 K/ _- MACRO_SWITCH_BANK_E000_A .MACRO
' t* Q9 o# J7 {6 [( l - .ENDM- g( ~: ?4 h4 x1 [1 Z% U
) O& `. ~. B, C- H2 n7 M- ;====================================================================================================
# l. e' P* M! G; t* { - MACRO_TRIGGER_FIRST_IRQ .MACRO
9 |+ ]3 I/ {5 F- } - LDA #IRQ_SCANLINE_BEGIN + 1
# r! j c9 j- k& n1 i - STA MAPPER_REG_IRQ_LATCH3 D( k. c# w! G, l- y
- STA MAPPER_REG_IRQ_RELOAD# A' O3 @2 n0 O
- STA MAPPER_REG_IRQ_ENABLE
' c$ l N6 E' ~; \7 s. ?' y - CLI
" o4 h9 c' C3 O4 M' m6 N - .ENDM
5 \5 _1 v: ^6 I. B, z, S* o7 P - ( b7 Y: _! p3 a) A7 T
- ;====================================================================================================
. o8 F0 @% z. P, Y0 G- E - MACRO_ENABLE_IRQ .MACRO6 c# H2 B& o& r0 _0 \
- STA MAPPER_REG_IRQ_ENABLE
# e6 B& i) j2 i/ s* x$ ] - .ENDM) [! A2 c8 h5 T. L7 @
-
0 _: l) a2 V6 G - ;====================================================================================================
. k1 A8 a0 N/ g8 `5 Q9 x+ P2 f# x5 c. L - MACRO_DISABLE_IRQ .MACRO+ p9 _: O. F6 r! ]/ Y- v4 Z( t
- LDA #$002 {+ c0 x& |$ x' ]
- STA MAPPER_REG_IRQ_CTRL( j1 B6 u; U% F$ ~4 e
- STA MAPPER_REG_IRQ_ACK
* A: v8 f! v2 t/ @7 E5 E - .ENDM1 n, ?- v/ d- m5 ~
-
! {+ y, x& h/ S" [) t - ;====================================================================================================0 Q! d% O$ _' J. t
- MACRO_ACK_IRQ .MACRO$ M6 E1 R. P+ f+ |4 M% g; }
- STA MAPPER_REG_IRQ_DISABLE
* _0 g$ @3 j% q" k1 L3 w - STA MAPPER_REG_IRQ_ENABLE% t7 q$ M7 c& W
- .ENDM$ {/ {$ Y" p5 x1 d+ i
- ; d* V0 i0 S6 T9 G
- ;====================================================================================================2 E7 H7 w h- K; _7 t
- MACRO_IRQ_OPERATE .MACRO. S: l5 D) G) t. B2 H2 m) s# m0 F
- / x$ X0 S6 q Q' L- \
- ;==================================================
1 f7 P6 Y& I3 U. ] - ;IRQ滚动模式常量
; @3 t5 x& t; B* N - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动. O5 }. @' l/ s3 e) k
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
a, y4 P; O- D - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
1 h+ u/ b$ g J' K - & E6 O3 { h) ~' I- Q8 }
- ;IRQ扫描线数据
, c! Y# v" A# z1 N% f - IRQ_Scanline_Data
8 r8 O4 E7 I7 L+ G - .DB IRQ_SCANLINE_1/ |: _# Q7 ^4 C5 h' T
- .DB IRQ_SCANLINE_2
5 m8 s% ^8 I0 C7 @$ h9 @6 S - .DB IRQ_SCANLINE_30 `" p% m/ {- T |. U
- .DW 00 ;关闭IRQ( |: u$ j( Y1 Z" Z! q: \, H
) M# p+ r1 ]$ S4 l4 H6 E- ;IRQ滚动控制模式
6 F8 ~" g! i4 z- D - IRQ_Scanline_Mode' Q2 Q) ?5 P0 T) ]
- .DB IRQ_SCROLL_MODE_RIGHT
! o. u- |* `' ~8 R- z' ?$ s: D - .DB IRQ_SCROLL_MODE_LEFT
7 {, a9 R+ \4 f - .DB IRQ_SCROLL_MODE_RIGHT j6 @3 S3 V9 F6 o& G/ F
- .DB IRQ_SCROLL_MODE_LEFT
8 |& K" [* \ p) s - x' [# L4 x; K/ R
- ;==================================================
+ d9 F% X$ V; Z+ ~1 _0 K: J - ;;IRQ滚动控制9 x' N6 ~0 Q2 p1 Z) w6 T+ f
- IRQ_Set_Scroll
& S: R7 V0 R8 z: P K* j - LDX IRQ_Process_Index, o& V$ X/ t, Y. l# V& Y# [
- LDA IRQ_Scanline_Mode,X- s2 ~/ n" M7 U, S$ u
- CMP #IRQ_SCROLL_MODE_LEFT
/ C- f0 o: ?7 q2 L - BEQ IRQ_Set_Scroll_Left0 E3 |6 d: Q/ t8 f
- CMP #IRQ_SCROLL_MODE_RIGHT4 Z4 R g9 C( ]) n8 {" c
- BEQ IRQ_Set_Scroll_Right. K. p% E5 r0 H0 w1 d/ }
- IRQ_Set_Scroll_Zero;不滚动
0 U j) ]5 K3 K7 k; `' B i - LDA #$00/ _- n; s6 v9 z; V0 S1 |
- STA PPU_SCROLL0 {5 k( T& A! \8 t4 `( D: l
- STA PPU_SCROLL. o1 R/ @; _ e$ R- u( A( `$ F/ @. A
- RTS; j0 Z! [& o) X& Q l! ~! [
- IRQ_Set_Scroll_Left;向左滚动
$ G, E) |: I9 N7 W9 x G - LDA Scroll_H! X+ \+ U9 V' q6 |+ h+ p- _
- STA PPU_SCROLL
' T' ]% U6 k, X1 \$ q - STA PPU_SCROLL
4 T/ T# L9 c* M9 K- e/ f - RTS" A' _) _2 i* `: i7 C
- IRQ_Set_Scroll_Right;向右滚动6 E r! I k5 k; {5 q. I
- LDA #$00
- v2 | U( ]' e* u; X( v - SEC9 z7 ~: S3 [0 \" N2 g9 f
- SBC Scroll_H
6 ^7 t) M9 f5 g7 O) R% t - STA PPU_SCROLL6 A+ e/ W, d- i% h
- STA PPU_SCROLL
# }; p% t. _: d- w" r; |; w - RTS+ R6 m! L' O/ B$ T5 y8 p& N$ C
-
) _6 z# C( D$ z! @ - ;==================================================
* q6 P' ~5 t3 l2 N5 p+ o - ;;IRQ滚动控制
- V, u' V$ w& Z% k, y - IRQ_Set_Ctrl6 h' r3 v" `! o; u W
- LDX IRQ_Process_Index# E) S; C* Y1 ^1 V7 X
- LDA IRQ_Scanline_Data,X R, s' Z3 {& U5 n+ s# ~
- BNE IRQ_Process_Latch
; U7 w3 ` p$ }. A! a - IRQ_Process_Disable;禁用IRQ
6 }+ B; g# G1 U& p5 P - STA MAPPER_REG_IRQ_DISABLE5 s; j C1 g- @% y
- STA IRQ_Process_Index
( l5 ]! {* o( w/ T, V - RTS
$ n7 `( B8 q F9 ?" f8 Q - IRQ_Process_Latch;设置下次 IRQ 触发扫描线5 l" J: d! {6 x2 X0 j+ {5 Q
- STA MAPPER_REG_IRQ_LATCH5 n9 _* k- [6 c2 S9 O6 K6 m( J
- INC IRQ_Process_Index
% K' N+ F1 Y3 J7 P t$ @4 w - RTS0 n; H6 ~9 l, \% N" Z" i
- 0 Z; n( ~8 `) x( p: d7 b
- ;==================================================3 A- L: h8 ^4 U, q1 v4 x
- ;IRQ处理
6 \3 R$ H! w+ ]2 I: A! N - IRQ_Process_By_Index
; R3 e: q5 Z4 |* \! }. O. y. H - JSR IRQ_Set_Scroll2 ^0 A. [/ S2 ?0 F0 P5 b
- JSR IRQ_Set_Ctrl
' F5 w& W2 a1 E L5 w" i) A - IRQ_Process_End% C! U5 d5 N: K% f$ F: [& h
- RTS: A O; D! z! B& ]1 \
- ; k7 R, w5 ?/ X7 D! K6 c) m
- .ENDM1 S: w7 i1 H4 I9 L) I+ d' D
-
% V: w# q- I& X" I! J3 @
复制代码 ' q( X8 h" ~" N0 C! W
: o7 U2 d- h9 h1 l4 u# G
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|