|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
9 z4 c( F4 a4 s- _5 K
) r) @" y; h f4 ]) f本次IRQ研究了如下:0 E( H( g# ^4 y! v1 t# {
VRC2&4(Mapper21,23,25)
- O0 q. Z1 s9 cVRC3(Mapper73)
" |7 G, m2 H8 _& ]# v/ ? `VRC6(Mapper24 & Mapper26)' ]& f/ y' w) P1 k. }0 R
VRC7(Mapper85)
( }4 y- ?9 \& K6 H E e3 }7 B" @MMC3(Mapper4)1 v: b, ?( Y# ~& y8 s7 v- x
MMC4(Mapper10)
3 g) ^, S7 r$ JMMC5(Mapper5)9 {; P3 R) g+ c. R
Mapper18
2 G, p x- H- iMapper64
( I' f$ {+ I: }Namco163(Mapper19)' R) W7 w/ j0 }. Y
Sunsoft FME-7(Mapper69)9 E- P+ H! ?3 _9 W) s3 O
4 O! B) Z9 p( \/ S1 F5 W* [$ H3 l' t
共计11种Mapper的IRQ操作使用例子
; l6 S2 r8 q7 A代码内有详细注释, 希望能帮助到感兴趣的人.
9 p/ R0 n5 f- }5 B- U/ k6 t' M4 z! W3 X |# l r6 @8 b" [
  + r0 P6 N7 |# l
( O+ x6 c) f1 J4 q. Q
Mapper代码主要逻辑(以MMC3为例):$ n$ m/ A2 @: }4 s- W% q
+ Z$ U0 }% k! }2 s( B- ;==================================================
4 a. r4 P. P9 Y6 I5 b9 g7 ~) M+ e - ;Mapper号+ n7 L6 g# R! H# U! J) ]& ?
- MAPPER_NUMBER = 042 O. w- ?" o5 }
- ;==================================================
- a K8 D% u1 S. |! r - ;MMC3 (Mapper 4) 寄存器常量$ o, E+ p8 E; C; M4 l; J; i! p
- MAPPER_REG_BANK_CTRL = $80004 ?" p- X s/ z8 R
- MAPPER_REG_BANK_DATA = $8001
2 ~0 j! W% }2 U1 V' K# s- j - MAPPER_REG_MIRRORING = $A000
' P+ v1 E. C V- U4 ]9 h2 ?* O - MAPPER_REG_PRG_RAM_PROTECT = $A001
) F2 A- W, G o: u5 T$ @- r - MAPPER_REG_IRQ_LATCH = $C000+ t) q7 S3 E3 F/ G- k0 y
- MAPPER_REG_IRQ_RELOAD = $C001- S; w! g% \, T$ O3 @& Z
- MAPPER_REG_IRQ_DISABLE = $E000
6 O9 t9 ^5 o9 P' ? - MAPPER_REG_IRQ_ENABLE = $E001" Z }! y% a8 l
- ;==================================================: d% f0 u% X* s x y! {- R3 @; k
- IRQ_SCANLINE_BEGIN = 135
' k7 d% h, R( r* f5 ]5 P3 t, e - IRQ_SCANLINE_1 = 8
R$ V r; `- ^6 i. q6 u _' k - IRQ_SCANLINE_2 = 54
0 [. \- o1 {) e0 a# T - IRQ_SCANLINE_3 = 8. u9 Y$ i" D' t, T% L% w& @
- ;==================================================/ s y& P1 P4 p$ B
- 8 n6 o) R7 p4 B% E1 @1 \% L6 f
- ;====================================================================================================3 p% [- I7 r) B, D
- ;宏常量: }; x; K7 E. z
- ;====================================================================================================
# g9 p" Z; _( h& u9 i - 7 L% K6 u: v, E; ? @
- ;====================================================================================================
`' t5 z6 h* C" w) Z - MACRO_MAPPER_INIT .MACRO
W+ b* Z' x( n2 A - ;禁用IRQ* m0 ^; f/ A7 e4 I; s) _
- STA MAPPER_REG_IRQ_DISABLE
* b) T( q- a9 K( @4 @, k -
) h6 F O1 e3 |" b+ Z6 d - ;水平镜像. e" z! Q& u/ N1 ]4 U& u
- LDA #$01
: U" _9 ?7 U7 s. |& ^5 D - STA MAPPER_REG_MIRRORING
( r! Z/ n8 B+ l) j' x - r1 o: K) v7 H0 X
- ;初始化图形bank
$ y% {, y; j' Y" b3 z8 S9 m - LDX #$05# t( P7 V5 D5 o( E# R+ v
- .Init_Chr_Bank. r5 D2 \, [, s n) t
- STX MAPPER_REG_BANK_CTRL9 E8 U# c7 s2 S
- LDA .ChrBankData,X: C) S; l0 C; G* y1 v8 B. _
- STA MAPPER_REG_BANK_DATA4 D- w% }) ?% t- A; z
- DEX# n6 v) y; o- ~- O# H! `
- BPL .Init_Chr_Bank
8 _% |; S e3 b& p5 s - JMP .Init_Chr_Bank_End4 b3 o& W8 o0 e
- .ChrBankData
7 e/ ]: u$ g {, J - .DB $00,$02,$04,$05,$06,$075 n2 p+ @7 O1 D7 E; e2 j/ |
- .Init_Chr_Bank_End
5 L4 o( m0 l2 A -
- I7 ~) K0 o% w: N/ C - ;启用SRAM2 Q \1 K6 H: t; m
- LDA #$80
' t5 ~2 f* W$ k% _8 I" e7 v& l6 Z - STA MAPPER_REG_PRG_RAM_PROTECT" w' e" b$ T* f
- .ENDM* Q1 A; i7 J/ O1 u; o4 H
- . `, e' n/ T' h; A/ c( ~0 L# x' o
- ;==================================================================================================== S/ y1 l) q8 i/ v9 i) G& D) j
- MACRO_MAPPER_SOUND_CLEAR .MACRO3 t3 R8 ?! F' c. ^; @
- .ENDM
/ l) k8 F4 E+ L9 w; Q - ' p% i7 c/ h5 C9 U; d, Z' L5 t: I
- ;====================================================================================================
$ ^2 E( u U4 S: ]( w/ r0 k - MACRO_SRAM_ENABLE .MACRO9 F' k M" f5 ^, i4 i: p8 G- p
- LDA #$80! H) U- x* C3 d
- STA MAPPER_REG_PRG_RAM_PROTECT
$ S7 C0 J( a% _: i: h7 `! S: r8 u - .ENDM
/ X7 Z# i1 a! M: Z1 y -
, ^. }& Z$ m ^+ \ - ;====================================================================================================
' C) [# C8 t; u8 o3 S9 s% O - MACRO_SWITCH_BANK_8000_A .MACRO
z Q* X* h F$ k* b: C - PHA
. k, Q; A1 K$ \ - LDA #$06
5 r6 L6 s" ^5 n* v$ E - STA MAPPER_REG_BANK_CTRL
7 \2 T1 t) |8 |; U - PLA% ?. `" q+ Q- F( C7 K6 u
- STA MAPPER_REG_BANK_DATA) Y, Z5 F, Y) V) n$ Z
- .ENDM
8 H6 K3 V4 c& ]' a
! ]; E) x7 v: |7 [' e9 t9 ^- MACRO_SWITCH_BANK_A000_A .MACRO
/ z& l8 R) N3 E! U5 _0 @- d5 j - PHA
; b1 }* B' }( J) l0 c% I3 r - LDA #$07; X4 ~, }& T3 q7 ?5 ~
- STA MAPPER_REG_BANK_CTRL
( l& ?; G# |0 J$ f - PLA
3 o* c6 j3 b7 c - STA MAPPER_REG_BANK_DATA
0 J2 n# E6 S4 i' G" Q# w - .ENDM2 z3 o2 E9 l/ [& c( U* H
- $ ]' N+ L1 J! N4 h! n0 g3 ]
- MACRO_SWITCH_BANK_C000_A .MACRO
+ }# I& E4 B9 @5 w - .ENDM
; w! R5 l5 Q) G' l
9 ]9 a: C/ [9 q3 N- MACRO_SWITCH_BANK_E000_A .MACRO1 e9 ?! S# A. G
- .ENDM
$ n6 C5 c; U: ?& X2 _ - ; @/ ^+ u( C# [/ s$ a0 D
- ;====================================================================================================% m) R j0 c2 t8 P9 `5 @
- MACRO_TRIGGER_FIRST_IRQ .MACRO
. U$ M+ T9 f* j% w/ W - LDA #IRQ_SCANLINE_BEGIN + 1
3 ~1 x' G8 b4 u7 Y2 t' n1 ]* f - STA MAPPER_REG_IRQ_LATCH
2 O# i# ]7 k/ d5 Q% j* F) f - STA MAPPER_REG_IRQ_RELOAD6 m& x4 q2 \% e* i5 J
- STA MAPPER_REG_IRQ_ENABLE
- O# t- D9 q7 K/ ` m7 S - CLI
- V* G5 }$ e) P1 W1 ?( A - .ENDM
- v/ ^+ s6 O# q$ R& h! B - ( b* S+ A `) X& I% T/ f1 K
- ;====================================================================================================4 l4 G% B1 j; V4 W4 ~# n
- MACRO_ENABLE_IRQ .MACRO
! S. O E M3 y* Q0 x0 n - STA MAPPER_REG_IRQ_ENABLE
% H+ M8 Q! |- J - .ENDM
* n: r7 Q0 v O: t5 Q - ' C# a0 L C1 G Z
- ;====================================================================================================4 j. a: X0 N6 J, B8 ?5 J' e
- MACRO_DISABLE_IRQ .MACRO7 h$ {5 ]% |* ?) e5 i9 q" j4 W9 c' D
- LDA #$00
. q1 E& C) H. U7 T; K: B - STA MAPPER_REG_IRQ_CTRL
2 e/ }5 l0 R; m8 M - STA MAPPER_REG_IRQ_ACK
' I ^# e/ v) p9 ~ - .ENDM; h) t; ]0 T5 m& \$ r" T# b
-
8 E! ?. W0 }; M" l8 i% a - ;====================================================================================================
7 @% B. Y& B8 M - MACRO_ACK_IRQ .MACRO
" q6 _' [4 D/ [3 H5 A - STA MAPPER_REG_IRQ_DISABLE
: z8 k/ ]% ^' b3 \4 Q - STA MAPPER_REG_IRQ_ENABLE: E/ m9 @/ W7 y5 N9 t
- .ENDM
3 O M! i6 w/ ~% I - 8 c; L9 V: U1 D9 H! o7 F
- ;====================================================================================================
0 ^# M" B4 Y: x; |) p; @ - MACRO_IRQ_OPERATE .MACRO$ Y7 \- B5 N& v9 z5 b
6 h! f) d. x* Y: f- ;================================================== } M3 j, Y: g5 M, }0 ? k) Q
- ;IRQ滚动模式常量5 s) H+ r; x2 G7 o
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
- h6 }8 o- {9 ?. X - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
+ f% I, l5 I F& L - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
* d1 u- U9 n$ |$ r+ }+ Z! V - ; e4 r/ D" M% a& a: J: w
- ;IRQ扫描线数据& q( M% X8 K/ c$ c) }: ]
- IRQ_Scanline_Data9 A. f* R* u8 k; M) l+ b
- .DB IRQ_SCANLINE_15 _% ^4 B1 h( w
- .DB IRQ_SCANLINE_2
; }. I: t3 D4 l# B5 M$ _ - .DB IRQ_SCANLINE_3. y! t" U8 z8 `1 I9 k
- .DW 00 ;关闭IRQ/ H- |/ b7 p6 p5 H8 s3 Z& a# l
2 A6 H5 q" F8 R# L- ;IRQ滚动控制模式 }5 Q1 o1 O# [$ k5 a4 n3 u! f
- IRQ_Scanline_Mode9 A' w+ m- N- G
- .DB IRQ_SCROLL_MODE_RIGHT
) Z+ p' E. Y3 I7 Q4 S: y - .DB IRQ_SCROLL_MODE_LEFT
4 R# a; Q) U4 ? - .DB IRQ_SCROLL_MODE_RIGHT6 E+ C4 m0 n/ J0 V; J1 I
- .DB IRQ_SCROLL_MODE_LEFT
9 |8 W3 L4 L. b' Y - ; g0 Y6 q [/ r$ D4 ^5 e
- ;==================================================/ Z/ T! ?; ~2 R' S9 y: ^
- ;;IRQ滚动控制
$ i p6 a; a/ X/ O3 ?; _ - IRQ_Set_Scroll
, Z: K) M6 K* E2 {4 O6 {1 I - LDX IRQ_Process_Index! ^) e1 y1 D6 S% m& T
- LDA IRQ_Scanline_Mode,X, v2 p) H0 S& p, D! q( f
- CMP #IRQ_SCROLL_MODE_LEFT
, \5 ?) O b4 W) F7 H+ B+ f - BEQ IRQ_Set_Scroll_Left, r5 s' Z6 {8 B$ l+ A5 m
- CMP #IRQ_SCROLL_MODE_RIGHT \- R5 m* Y Q2 |# ?
- BEQ IRQ_Set_Scroll_Right
7 @. c' ?7 ~0 r8 _$ j - IRQ_Set_Scroll_Zero;不滚动% U" Y- B/ f4 d# L. z
- LDA #$00
* s- ^: }! I, V. W1 h4 v. i; L - STA PPU_SCROLL
& P! q u- q# i9 p) ^- R - STA PPU_SCROLL
/ p8 O0 {; p* I+ ?! ]+ F - RTS
; V; F) d/ } ? ]9 B% E - IRQ_Set_Scroll_Left;向左滚动0 z8 K/ }+ p6 U8 }
- LDA Scroll_H/ O+ J6 V, x$ x5 N7 H$ m# y
- STA PPU_SCROLL$ U+ y# }) P9 D7 \1 V5 _. E
- STA PPU_SCROLL, A3 ?! c9 i* m: Z& k, y
- RTS
3 A4 \8 U3 ^/ R- q; l" E% G - IRQ_Set_Scroll_Right;向右滚动
! Y* [& w; b3 ~" C: ^/ K - LDA #$002 `: X& j+ K' q
- SEC
R8 J% R7 p0 X# ^+ D - SBC Scroll_H
. S( T @" j! Z4 X# ^$ j: t - STA PPU_SCROLL
5 u# W* m5 ]9 q - STA PPU_SCROLL* n/ }+ z; v. b8 w
- RTS
6 G; f# t/ J5 A. L5 j - 0 a/ _/ S4 u) Q
- ;==================================================3 @& R0 o8 _6 J: k
- ;;IRQ滚动控制( E, {% x8 k) o" s6 N! Q/ Z% R
- IRQ_Set_Ctrl
- I8 Z0 D2 a, a# f - LDX IRQ_Process_Index
% D- b3 ?. z4 E, N6 ?- X; V - LDA IRQ_Scanline_Data,X* ?" D8 `8 X! D' b. N2 U
- BNE IRQ_Process_Latch& u% s1 Y2 b6 q2 j9 ^' ]
- IRQ_Process_Disable;禁用IRQ
6 n8 n1 I0 z# L - STA MAPPER_REG_IRQ_DISABLE0 u" Q! N5 O$ w1 I
- STA IRQ_Process_Index
# u7 d8 k/ J& J6 u% f% S5 P - RTS
- T* P" U, ~ T3 g& s - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
6 E) w X( g: o b - STA MAPPER_REG_IRQ_LATCH
0 Z* o2 f9 V. n4 d - INC IRQ_Process_Index: U2 `7 V( w0 y4 I4 i
- RTS
6 k" {/ v* h6 o: l - 0 Q! D! N: i3 @6 E: G
- ;==================================================7 x6 f. p. I9 k4 D
- ;IRQ处理9 l5 P: o* a [, n6 G
- IRQ_Process_By_Index j/ q5 P! A+ H7 y# H" D9 s
- JSR IRQ_Set_Scroll/ `5 F7 E" c; v( i9 }
- JSR IRQ_Set_Ctrl8 s& }$ v3 L! V; m) f/ i
- IRQ_Process_End* _# u* H. {) s( g, X5 T( K
- RTS
6 _/ R+ w5 U i5 T6 c) V -
# n# z/ j9 x: P1 E7 u- q/ e - .ENDM
" p4 d% @' O& g- r0 b -
3 `4 G% H, k/ d( A# a+ Q1 |
复制代码
) b9 I7 O- E( C: K, W# m
) y6 {" ^8 U! C6 i" c, F4 j代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|