|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 6 g- W7 |' f- g4 i9 }. X
* K/ O4 r; w3 ~本次IRQ研究了如下:
5 r w8 Y' O) K6 x1 ]" P* R ]VRC2&4(Mapper21,23,25)
& q% l8 n+ {2 o/ }/ ?) t& Z* zVRC3(Mapper73)
! c3 ]7 H! M' j# T* `8 ~VRC6(Mapper24 & Mapper26)
! k" C0 W% t* y! h/ b7 @; E2 ZVRC7(Mapper85)' ~- p7 \; H. X
MMC3(Mapper4)# @( Z$ r8 f& \. f9 |8 H! P
MMC4(Mapper10)2 U" G' z! a& X8 t8 i$ B1 W
MMC5(Mapper5)
5 B+ |* ]( K- ~' f9 o2 MMapper18. N6 v' z# @1 l9 m2 ]
Mapper64
9 P; I [6 O5 U( u" Y6 W. z* B, ZNamco163(Mapper19)
9 S9 q- a! [ G# B7 p3 fSunsoft FME-7(Mapper69)
, X* N/ e1 d0 I
9 @' h. q9 {0 u4 X共计11种Mapper的IRQ操作使用例子9 v" {+ h! d z0 S4 ]! f% b# p
代码内有详细注释, 希望能帮助到感兴趣的人.
! M) u/ y! b, \/ V6 p, e7 p; i8 a( f S) ?4 \7 u1 }6 `. c
  " b- V& q2 c, G R# Q# U2 z( x
7 [2 F% _! m& j+ m) q/ `6 h/ b4 v, BMapper代码主要逻辑(以MMC3为例):- Q: |8 k: b3 ?8 B
0 s7 ^- q& Y2 w4 j+ a& K- ;==================================================- o- V0 ?- S* z4 h" n' r
- ;Mapper号9 D. ?" X/ j+ B/ n6 ]1 v9 i9 h
- MAPPER_NUMBER = 04
+ Q+ R/ n w9 S+ _. W. @2 [ - ;==================================================
+ O! z' ?! q6 t0 }) A - ;MMC3 (Mapper 4) 寄存器常量0 e) M0 Y( I9 ^8 m
- MAPPER_REG_BANK_CTRL = $8000
+ _) K% C' e$ n2 Y. h - MAPPER_REG_BANK_DATA = $8001
3 Q, Y0 q0 \( _# E% x j - MAPPER_REG_MIRRORING = $A000- X! t! p8 O A5 T; C G4 G
- MAPPER_REG_PRG_RAM_PROTECT = $A001* V8 k8 o8 l7 y6 k: [
- MAPPER_REG_IRQ_LATCH = $C000# Y2 w1 Y6 v7 `5 ~3 ?
- MAPPER_REG_IRQ_RELOAD = $C001
' y3 F8 t, x, @/ y( h/ N! S - MAPPER_REG_IRQ_DISABLE = $E000
6 \3 n i2 r2 d. C$ x% `$ R - MAPPER_REG_IRQ_ENABLE = $E001. K5 z+ G4 _ \4 c% w7 v; n
- ;==================================================
9 d1 Q: z1 A3 l. J3 N - IRQ_SCANLINE_BEGIN = 135
+ U( u$ ~. i$ v, M2 R% M - IRQ_SCANLINE_1 = 87 p0 F6 u4 C5 F9 M9 N
- IRQ_SCANLINE_2 = 54. o' _! ^( r% _3 u; |& t% P
- IRQ_SCANLINE_3 = 8
0 a) k* c/ v- N0 ?+ |9 ~1 o - ;==================================================; V3 ^' C2 G+ A. {. E/ M
- , z: h1 c8 \$ g0 n& y
- ;====================================================================================================
' |) N5 _& c* \, x2 P" l& l - ;宏常量
- `' g, R+ n9 V0 ]0 \" s - ;====================================================================================================9 q2 I r+ `, [0 ~- c
) z3 |. `3 I+ `8 \8 M$ a- ;====================================================================================================* x7 P/ o; x" L; \
- MACRO_MAPPER_INIT .MACRO+ B* b. E* ^0 z3 ? d" @; P
- ;禁用IRQ. f G' k' Y3 u& `( y
- STA MAPPER_REG_IRQ_DISABLE
, \ V! G: C+ G# [- x - - I3 m8 |2 g3 A" f$ b' C; }6 G
- ;水平镜像
$ m& d; b' X* t% Z) p0 Z - LDA #$01
; ?% W& i6 x2 n7 Y# P - STA MAPPER_REG_MIRRORING
, q; ?( c q, K0 a7 ]' s -
( Q! l: Q. A. T1 B: z5 b - ;初始化图形bank
' i" p9 I4 ]2 D8 u& g - LDX #$05: k5 Z8 ?8 ^- y( Z5 K5 n1 u
- .Init_Chr_Bank3 e, ~$ \1 i: L' B" i
- STX MAPPER_REG_BANK_CTRL, ]. S' h3 D: o: z1 O
- LDA .ChrBankData,X
, R3 f$ N" h6 m, ^ - STA MAPPER_REG_BANK_DATA4 F' L e5 ~3 ?$ r0 I$ s! {
- DEX
: w% _/ c. y8 }) i - BPL .Init_Chr_Bank
6 p; A2 M5 q4 B: x - JMP .Init_Chr_Bank_End
( K$ N* Z! X) \. y' w - .ChrBankData
0 j, B' `0 L1 s; J - .DB $00,$02,$04,$05,$06,$07
' M- F. k4 c! {+ h1 ^; w - .Init_Chr_Bank_End' F4 j6 U% @+ e$ O- Q
- , P: K: L& _3 ]' k
- ;启用SRAM! F1 i& H. k+ |4 ~7 I' K! \3 I
- LDA #$80- b- J( [3 g. b! g: S: `
- STA MAPPER_REG_PRG_RAM_PROTECT
H% L! Y( [, J- Y& ~ N; y - .ENDM. e. @! l5 b* j8 I( m* @
- 9 i2 L8 e7 t5 k; x! Y- P
- ;====================================================================================================+ R6 f! [2 p0 \+ E9 ]5 }2 c) Z5 s
- MACRO_MAPPER_SOUND_CLEAR .MACRO8 R3 F$ O/ G O% k/ M, y
- .ENDM! }) F* s' |4 b0 r, s
-
7 J! S8 O, X% |" l v - ;====================================================================================================
: u7 B" U* _1 o5 \ - MACRO_SRAM_ENABLE .MACRO
% P; d& H. Q! G1 _ a% t2 R - LDA #$80
" J+ f* A) F, p& O3 ?# U5 c7 n& n - STA MAPPER_REG_PRG_RAM_PROTECT0 H( s% T0 N$ _+ {
- .ENDM) D5 O$ _% q1 H+ R- Z6 ?
-
2 l; ^, `- a/ J9 R - ;====================================================================================================" ^* n: V; H8 l- d
- MACRO_SWITCH_BANK_8000_A .MACRO
. D; t% b6 {! w5 @, k# Z - PHA
" H' r+ |2 v9 d7 L$ N. t - LDA #$06, T; H" V. w, y3 _* m' }4 S
- STA MAPPER_REG_BANK_CTRL
; @3 F+ l- C, C" k$ g3 m$ U - PLA$ ^; @7 P" ?( J
- STA MAPPER_REG_BANK_DATA
# L. V) z' x% t* C3 X( }6 `4 ^ - .ENDM) P1 c% y5 d3 P/ {3 m
9 ]5 a( n& w/ c& ]1 }' {; P- MACRO_SWITCH_BANK_A000_A .MACRO, U/ R( L3 _: E
- PHA! C- O; X f2 {& G7 f4 |# H
- LDA #$07
, H! s" [" V, g- \ - STA MAPPER_REG_BANK_CTRL9 c: o& h* v% J" |1 s- m
- PLA
+ O' q" X/ s; ]% B* M - STA MAPPER_REG_BANK_DATA
3 Y* U* a1 x% _$ i* x: F - .ENDM
; ]; i" [* r/ c; M& `5 V; R - : V0 G1 F8 z, T2 U7 H3 @: g6 ]
- MACRO_SWITCH_BANK_C000_A .MACRO/ w5 r/ Z- U. ?$ x9 C/ p+ `
- .ENDM
" g2 [: y4 Q/ a, c5 t0 P - 5 C/ D2 Z/ V- a/ T6 [
- MACRO_SWITCH_BANK_E000_A .MACRO
' r, L" F) S" ? - .ENDM5 @ b0 X6 r+ E3 }4 y7 x
- % v0 ]' b& U6 L+ \4 x
- ;====================================================================================================
1 e7 f8 w. y& M% l/ I' G* Z9 O9 h$ k - MACRO_TRIGGER_FIRST_IRQ .MACRO a4 L! i y$ s; j7 i
- LDA #IRQ_SCANLINE_BEGIN + 1
. P5 |) B% t4 d( _2 t - STA MAPPER_REG_IRQ_LATCH
/ o3 P8 q5 t( W) G - STA MAPPER_REG_IRQ_RELOAD2 j) o8 S5 |$ v
- STA MAPPER_REG_IRQ_ENABLE; }6 O7 B# `$ u0 G- J4 e5 I3 `
- CLI. G. I7 |% l. @! A
- .ENDM
4 @; j# m0 X) j C8 B - ; Q: @2 Q+ u# ^: U& ?. K. m2 c
- ;==================================================================================================== T7 v, v3 W+ S; S( E
- MACRO_ENABLE_IRQ .MACRO9 F6 k7 Y9 _6 H0 _+ k! P' P8 l( [
- STA MAPPER_REG_IRQ_ENABLE9 [. |' S3 U( [+ s
- .ENDM5 d4 Q) `8 g6 i/ ^
- ; m9 W+ Q& t" C2 Q. C
- ;==================================================================================================== E/ X% F' A0 Z5 c# q% H6 i
- MACRO_DISABLE_IRQ .MACRO
5 |2 [. ?0 Z: d/ T% ^5 I - LDA #$00% H% d: X0 {+ G6 T; Q/ w6 s
- STA MAPPER_REG_IRQ_CTRL! I' i! x4 Y) V* ^' q( u
- STA MAPPER_REG_IRQ_ACK
: l5 K4 e) P8 D, N, _8 e3 a6 C% m/ { - .ENDM
7 v( D" W5 g" W: y1 S6 S* n -
) \7 f- p g4 p" B - ;====================================================================================================8 f) R9 |. O) f0 ^ a
- MACRO_ACK_IRQ .MACRO" e% _1 o" E+ V1 c0 y% S% r9 _% L
- STA MAPPER_REG_IRQ_DISABLE2 y. F' g. t+ [7 R4 r
- STA MAPPER_REG_IRQ_ENABLE
* C* H* \4 X# i* t) N - .ENDM
# u8 m& P1 q& T# A$ ? -
/ E/ ^* A; F% Z* m1 i* a - ;====================================================================================================5 F/ z( M' g! F0 i
- MACRO_IRQ_OPERATE .MACRO
6 Q& Z0 P. [7 c& z& b& Y, }3 Z
! N" x7 J3 U1 f- ;==================================================& W$ U3 [4 [1 _" o4 g
- ;IRQ滚动模式常量
" S( T) c' Z0 Q( i - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
6 h6 H4 P. B7 M8 t9 ? W$ }* E7 { - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
5 A" D6 B# [7 f$ M" Q: W - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
# w& g# {& y% J6 o
n6 j, Z" ]0 |$ l9 i/ q; x- ;IRQ扫描线数据
, M* g: {5 K9 W( L& b3 y5 A2 T - IRQ_Scanline_Data
8 U( _4 m: Z6 z - .DB IRQ_SCANLINE_1+ {+ O5 \* C, } }6 E, w
- .DB IRQ_SCANLINE_2
1 }' T& k6 u9 p y! s8 m, Q- A: e - .DB IRQ_SCANLINE_3 D" q+ R: H, ^" N
- .DW 00 ;关闭IRQ
" E0 Y1 ]% W# V X3 ^# t$ B4 K9 r - / E. E2 I/ q6 {- a# G" f) l# {
- ;IRQ滚动控制模式3 P8 O4 Q4 Y1 ]
- IRQ_Scanline_Mode
9 s0 r0 @$ ?+ s - .DB IRQ_SCROLL_MODE_RIGHT
" _& s! S- \9 G- d0 I1 U7 a - .DB IRQ_SCROLL_MODE_LEFT5 j. Q6 G, w) r5 Y" v! E
- .DB IRQ_SCROLL_MODE_RIGHT9 P. b$ J2 b. E9 c5 \; L, E
- .DB IRQ_SCROLL_MODE_LEFT/ w) K- d" h! @. W9 f6 X
- , L/ [& s) U) {: E) ]
- ;==================================================
4 J0 j' g! h) }: D& e0 {" q9 k - ;;IRQ滚动控制+ f6 h- W; i- M' }5 E
- IRQ_Set_Scroll6 C# c/ P8 g6 ?/ n! c9 J
- LDX IRQ_Process_Index
9 `, H4 X$ T- v2 M/ E$ Q$ t' ^ - LDA IRQ_Scanline_Mode,X
) H! L) u3 X) [1 j$ q - CMP #IRQ_SCROLL_MODE_LEFT: x- U, W% @1 R% k4 `! [
- BEQ IRQ_Set_Scroll_Left
0 N7 J5 l, a% g3 [3 W' Y - CMP #IRQ_SCROLL_MODE_RIGHT
/ f8 r& ?2 u) r2 G$ o3 ~$ f - BEQ IRQ_Set_Scroll_Right
2 Y, W5 I: g" j' d7 E: ?- R7 c - IRQ_Set_Scroll_Zero;不滚动
0 y5 z9 p' A& k# K6 X - LDA #$00
9 [, j+ g, X9 \. ^% y& h - STA PPU_SCROLL. x: O: L7 P/ c# E% V
- STA PPU_SCROLL$ v, w; T! O5 S4 Q" e1 W& a8 m1 O. c
- RTS& n ~7 [$ W& N1 [) X9 T+ b! u
- IRQ_Set_Scroll_Left;向左滚动
' W8 n9 X! b& Y/ n* N - LDA Scroll_H$ X1 M2 @0 z Y1 r3 T
- STA PPU_SCROLL
" g0 n/ |/ p2 P+ I& d# j3 X C - STA PPU_SCROLL7 P3 X5 N$ f3 Y$ ?+ V) k, I% J: B4 c
- RTS
. d8 \2 ~3 N l, z6 N0 I8 Z0 L - IRQ_Set_Scroll_Right;向右滚动% i; l$ P! Z: X& |; }
- LDA #$00
% V* Z# ]: @( z. {4 ~# M - SEC
+ Q; L9 _5 D8 S4 \' U1 B8 ?9 b8 r - SBC Scroll_H' l& v. G1 O6 I/ Y
- STA PPU_SCROLL
+ U# \1 t5 f w+ V - STA PPU_SCROLL
6 G* w$ q7 S L) j - RTS [) P) E* h4 ?' O! g; s* d" P
- 6 c/ d) E# n: H8 _. k+ z4 f
- ;==================================================$ p" }; h H' O6 M$ [
- ;;IRQ滚动控制
/ h9 Y7 Y9 O) T y. a4 Y - IRQ_Set_Ctrl
. c+ T9 q# B: } | - LDX IRQ_Process_Index
6 K% Q2 w" e/ D. d2 U1 F - LDA IRQ_Scanline_Data,X
7 {1 f% s" Y* F0 X0 }) _. B - BNE IRQ_Process_Latch
. }6 U. D* Y! H& ]. l - IRQ_Process_Disable;禁用IRQ0 X2 j X' [2 a, I9 l! P
- STA MAPPER_REG_IRQ_DISABLE: _2 q c. _3 Q, ^0 d
- STA IRQ_Process_Index
2 X) K% U. o! I A8 ^3 w) A# g - RTS
! S6 n0 T+ w0 q9 h; u# } - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
8 n6 l, t( u. x; n8 g' S - STA MAPPER_REG_IRQ_LATCH
/ G1 F( x. r8 l" \% W X* B - INC IRQ_Process_Index
; |" n8 c& S5 q - RTS# }- @+ V8 L! |, X' [
N. \) ?& B% W# p; [- ;==================================================
5 l- Y7 D1 y6 H2 b) W - ;IRQ处理6 ^5 ~/ H/ J! v" \: }
- IRQ_Process_By_Index; c9 a$ O( b: I2 X7 v; g
- JSR IRQ_Set_Scroll7 X' ]( U% z- d: ?
- JSR IRQ_Set_Ctrl* N2 ~4 E- B0 I- _2 y
- IRQ_Process_End
/ N8 p& b+ `8 o5 U2 X; Z4 r - RTS
8 s/ y" p6 p" @ - ! y2 g- J, H' y# D7 G
- .ENDM
& f+ ]3 h `. Z, [ -
4 n5 [& f- k" w0 m
复制代码
+ B8 x7 y6 w7 w/ X% Y; e
+ y- M% p; \, u0 B6 {9 Q5 Z代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|