|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
: C3 L* |' w* D$ s5 H1 K2 a
& q, S* u3 U' i本次IRQ研究了如下:
v7 J( Q9 E! o& k: {5 a8 \VRC2&4(Mapper21,23,25)+ r/ T( B) V M0 r- z' H
VRC3(Mapper73)2 {4 {4 W7 a& T& M0 h H5 B7 F3 Q" ?
VRC6(Mapper24 & Mapper26)/ C) l3 G$ p1 [9 d* t$ |6 l) e
VRC7(Mapper85)
5 J$ @9 C3 W2 D. D. Q$ y: gMMC3(Mapper4)
, A. D( d1 \' S3 a4 X) OMMC4(Mapper10)6 ~$ k' R! s4 D$ m7 b
MMC5(Mapper5)
& @ e& V: _2 \: Y) a( jMapper18: \* w5 M+ D- U/ B+ ?; G
Mapper64
& z# Q0 d( c4 D( |. cNamco163(Mapper19)
, @8 Z& Y# C% v9 ^Sunsoft FME-7(Mapper69)
, o4 r8 |" x( X8 S4 x, W4 ^: X/ E, _
. @' A' i8 Z, {- K0 ]4 y共计11种Mapper的IRQ操作使用例子
\: Z* u- R+ ~代码内有详细注释, 希望能帮助到感兴趣的人.; H7 S* E# `4 H1 I7 b% k+ m& K
. i2 L0 c1 }8 @5 q% V6 |7 m5 j
  
* C, r- }" ]5 A5 W* ]( D! C: P! b1 s; P" d% m6 G- i6 V
Mapper代码主要逻辑(以MMC3为例):+ [0 W) r2 Q Q4 W
* A' x4 L7 q7 y- Y) }9 ]' I; o- ;==================================================# z2 D6 J+ G0 o9 F4 M' M
- ;Mapper号4 k1 w% I1 Y1 D3 ^$ H( p2 X
- MAPPER_NUMBER = 047 L6 p: _3 L4 |/ Y% j
- ;==================================================- C3 ?! u/ b9 m$ J
- ;MMC3 (Mapper 4) 寄存器常量$ F5 }5 ~5 ~) e% w0 K2 I
- MAPPER_REG_BANK_CTRL = $8000
O3 o! g4 G {, \ - MAPPER_REG_BANK_DATA = $8001* d2 r) @. s4 d& u
- MAPPER_REG_MIRRORING = $A000
1 \8 L; Z! ?$ k- [2 F - MAPPER_REG_PRG_RAM_PROTECT = $A0012 k9 U5 f; S+ r$ |3 X1 ~$ p
- MAPPER_REG_IRQ_LATCH = $C000
+ ^3 H5 @3 n$ @ - MAPPER_REG_IRQ_RELOAD = $C001
5 d* G6 I: _* V/ d - MAPPER_REG_IRQ_DISABLE = $E000
" N% B0 k' J- [4 p" m( e: G! ]8 a - MAPPER_REG_IRQ_ENABLE = $E001) E# g; H9 e ^* `3 L& _1 i) K
- ;==================================================- {! [, L, J( H
- IRQ_SCANLINE_BEGIN = 135
% p/ B) d X% |/ p% s5 ?$ {/ P - IRQ_SCANLINE_1 = 8
4 M" `6 b6 t- m5 |7 v7 K' n - IRQ_SCANLINE_2 = 54$ R- p4 ?" r3 v; }9 M/ L2 s' `4 i% q: f
- IRQ_SCANLINE_3 = 8
/ h8 r2 w: M) U5 ?: v) T - ;==================================================
( S+ S: _ F; p& s
* C4 {# K6 |9 O1 Z, R! d- J% ~- ;====================================================================================================; s' h. ?! ~4 ~. |8 b6 E2 n& r
- ;宏常量# k9 F. J( U0 c1 X5 Y
- ;====================================================================================================
* X( S7 U; O" C$ a; s2 c0 x
* i7 O; g" c; t" k4 z- x- ;====================================================================================================
5 q7 t5 a+ z% e0 `7 V - MACRO_MAPPER_INIT .MACRO
7 r* X3 g/ d: j& _" u+ o/ `7 J - ;禁用IRQ7 w7 \% m/ }3 X0 L3 m6 s
- STA MAPPER_REG_IRQ_DISABLE
/ G6 E* d! Q4 `% D -
& E8 y( i# A, B1 n8 O$ W - ;水平镜像
$ k( |9 c9 E" @0 I - LDA #$01
/ `( _% t( f% f$ ~ - STA MAPPER_REG_MIRRORING
. t4 S2 N' _( t6 @3 U) n( I3 l - & X" ]/ t# Q$ i# I6 \0 U( _/ O, L
- ;初始化图形bank2 n# g4 M% F" Y3 e( R
- LDX #$05; B1 G% F! ^5 [' j o
- .Init_Chr_Bank) i" e( u; e; e j6 @: K
- STX MAPPER_REG_BANK_CTRL. c% `5 W; y# `' V, |
- LDA .ChrBankData,X E( q. F# x" k; Q$ }1 g2 |# y& b9 L
- STA MAPPER_REG_BANK_DATA
8 F/ y i J& `& j8 M - DEX
8 Q) N# ?0 e7 o3 r/ i - BPL .Init_Chr_Bank4 a; \$ m) M7 d
- JMP .Init_Chr_Bank_End
3 K# f) c. E$ I - .ChrBankData
5 h- K- Q: G3 @% G - .DB $00,$02,$04,$05,$06,$07
/ e4 g- o2 m( x! j - .Init_Chr_Bank_End
1 I( D$ m, \! o$ w+ a+ { - 4 l9 S+ F4 \2 ?7 n
- ;启用SRAM: l& u3 D' s& o; B
- LDA #$80$ w3 f: \0 N: M3 w% l1 p
- STA MAPPER_REG_PRG_RAM_PROTECT
. t6 A' |; }% ~) a# z/ a - .ENDM
5 G3 _( S) F/ ~9 y4 l
- [% p6 z! y8 j, |+ d- u, ?- ;====================================================================================================# e3 v4 p- J# F' |" M, i& I
- MACRO_MAPPER_SOUND_CLEAR .MACRO
' e) a% a8 B- u' w% S - .ENDM6 x4 ^- G) O6 q) o$ ~: n5 Z1 ~
-
& T' }. F% L b+ M, O* n) @8 b& M - ;====================================================================================================5 W; u3 ^5 Y1 d9 g3 ^( h
- MACRO_SRAM_ENABLE .MACRO
$ m1 T' O0 O U! D& H* ` - LDA #$801 f9 r& S0 K4 k) R: k
- STA MAPPER_REG_PRG_RAM_PROTECT m. m ~! L3 T
- .ENDM! w( A* P" ^7 _3 b5 a# F5 [
- ( K) n" a! W2 N- `* [
- ;====================================================================================================* f T" R: ~' J; p: W' v
- MACRO_SWITCH_BANK_8000_A .MACRO$ q/ a5 Y0 ]+ j* e% U S; Z
- PHA
% b$ Z) w; W* [; |7 F8 s% n0 a* t3 } - LDA #$065 y6 L4 f" M7 } A
- STA MAPPER_REG_BANK_CTRL- I& m2 {5 h) U# r3 n
- PLA4 H W( y4 o6 b! q R# h6 ?
- STA MAPPER_REG_BANK_DATA; \- N1 Q+ i% K/ r9 F: F
- .ENDM6 q7 u9 S" I3 r& N4 q+ Z
& H7 w5 Z5 o: Q; V0 p& P- MACRO_SWITCH_BANK_A000_A .MACRO. X* P% b3 S: O3 Y- `+ P& \% ~
- PHA0 R2 e1 Q* D# L& Z
- LDA #$077 f! @8 ^* [: o7 h
- STA MAPPER_REG_BANK_CTRL/ y5 n3 C r p
- PLA
4 [! j7 ]( R7 ?7 p' a. I, C- [7 T - STA MAPPER_REG_BANK_DATA
1 Z) o1 B; ?3 U! W, i - .ENDM
% q" k( O& y% E6 K2 G -
! d/ V f4 Y4 ]5 a6 R - MACRO_SWITCH_BANK_C000_A .MACRO
5 \$ }; B; M; a* B! j. r3 s - .ENDM
6 D% c6 m6 G* d9 C7 B1 h
8 `* `& n7 U- T8 q' x% ?4 }- MACRO_SWITCH_BANK_E000_A .MACRO
' V1 K( M F3 V6 B ~$ x3 r0 O - .ENDM J6 s ]* r; @2 \3 B
- 4 K" R' L# p6 }7 z+ [
- ;====================================================================================================
3 b9 O; q; a1 N - MACRO_TRIGGER_FIRST_IRQ .MACRO& d& m, \" D) d% _# D
- LDA #IRQ_SCANLINE_BEGIN + 18 \! v/ ^2 k p/ S: j0 \0 A
- STA MAPPER_REG_IRQ_LATCH
3 a+ b- i1 r, |* y - STA MAPPER_REG_IRQ_RELOAD8 b5 w2 ]# m+ K- u
- STA MAPPER_REG_IRQ_ENABLE
9 h" K. a9 a3 k$ M5 A - CLI$ Z- o0 x- v0 I% ?7 t- }. {
- .ENDM; o) L8 B# R2 r% D5 q5 }; L
-
+ E& p" k" C1 h; I; G1 h# T - ;====================================================================================================
5 J' V5 d3 `. Q - MACRO_ENABLE_IRQ .MACRO
$ w' ]% o$ R% k6 `9 M+ x - STA MAPPER_REG_IRQ_ENABLE
) `' B' J0 l) i9 \ - .ENDM* X" m7 H# \% e; N# T
- ! D. M, c! @6 I6 A) |
- ;====================================================================================================
. I! t" O8 I$ L8 `; U' Y! C - MACRO_DISABLE_IRQ .MACRO" {5 r( ~' G2 p0 M
- LDA #$00
- t9 z8 _" F5 \' b - STA MAPPER_REG_IRQ_CTRL
# T# z9 e3 e9 _$ T$ S. G2 y - STA MAPPER_REG_IRQ_ACK) G1 t6 ^5 `+ ?, I% Y
- .ENDM
3 {; [! W1 j3 N; y) R, K } - 5 e/ K# T, D) c8 c4 Y$ @' H
- ;====================================================================================================
2 D* f1 s. w. ~, D7 |& m - MACRO_ACK_IRQ .MACRO
! Q+ M! k+ B+ i2 g* C7 ]& m - STA MAPPER_REG_IRQ_DISABLE
* E' H8 I; I- {" T/ a' v% T$ J& { - STA MAPPER_REG_IRQ_ENABLE1 k" V: Y+ O$ o" F5 q
- .ENDM) V/ F* d# {; z( J: Y
-
+ T1 v9 F5 t: a- f+ |: h - ;====================================================================================================
F1 A* a$ V3 N8 ^, z. D - MACRO_IRQ_OPERATE .MACRO
9 U; Q* V. H0 @( k* X0 N5 q0 W' ^ - 8 T+ ?1 G/ F$ }# b
- ;==================================================
7 M d1 \9 B ?, h0 ~) t0 c - ;IRQ滚动模式常量% v4 V& d$ D$ y5 b
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动! h# n3 `/ y: C1 F
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动
8 m) J# u. s3 b) k' z# n - IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
% j- u& V4 |5 _. a% R/ B: q1 c. ^ - & K% b% Q# y, P1 c$ k9 b
- ;IRQ扫描线数据
+ S2 N6 y6 W- @! y8 _7 C - IRQ_Scanline_Data
$ H/ b& w+ i7 d' @$ w V - .DB IRQ_SCANLINE_16 h" {' v8 G' B( o
- .DB IRQ_SCANLINE_20 `( V* r$ g% O. @1 y9 g' r0 c: B% |
- .DB IRQ_SCANLINE_3
) l, H) L+ o M4 W K) s) g - .DW 00 ;关闭IRQ
+ H' F! X# R/ b& ?( H - ' a, H7 F: o# |* M- h
- ;IRQ滚动控制模式3 I, }) s/ M& |# h8 @
- IRQ_Scanline_Mode7 ]4 O4 \ f4 C
- .DB IRQ_SCROLL_MODE_RIGHT$ q4 O9 R `9 U1 d$ E/ L
- .DB IRQ_SCROLL_MODE_LEFT* E* L* L# E; z2 `% E
- .DB IRQ_SCROLL_MODE_RIGHT
! \ ] J) O, \ - .DB IRQ_SCROLL_MODE_LEFT; m9 i ?0 u! N
- 5 u$ y4 s+ z5 n9 H; x9 t! g3 ^
- ;==================================================: s/ s; a" r, v" E' A7 a
- ;;IRQ滚动控制5 }3 U" j- @/ C2 f* I6 Q
- IRQ_Set_Scroll8 q y1 N+ {# d7 L
- LDX IRQ_Process_Index- C0 b; D6 d, O! ^, \. n( J
- LDA IRQ_Scanline_Mode,X
4 e x: m: U8 j1 | - CMP #IRQ_SCROLL_MODE_LEFT
1 J/ F. M N% t# w" v - BEQ IRQ_Set_Scroll_Left" P# V) F7 ?& j5 _( G; H
- CMP #IRQ_SCROLL_MODE_RIGHT
; W- P/ b! m' |8 N" v - BEQ IRQ_Set_Scroll_Right5 K$ S9 K; x1 ?; i! l
- IRQ_Set_Scroll_Zero;不滚动8 W3 ^& b) }! o1 [0 q1 @
- LDA #$00* Q9 F8 _, C+ m g% j, K7 e
- STA PPU_SCROLL
: Q" t% D5 m1 N g o! F - STA PPU_SCROLL
: |* Z F% Z0 ^4 e5 v& A: S X - RTS! e' L, M/ d% }7 A
- IRQ_Set_Scroll_Left;向左滚动$ Q3 d+ {( B3 [3 W* P
- LDA Scroll_H- F2 a* m) e( x
- STA PPU_SCROLL
+ ]2 S" r- J3 t8 X% c+ s8 D, v$ E" Q - STA PPU_SCROLL
: `$ l7 x1 a7 y: @4 Y - RTS
1 w) a! h; Z9 u' T - IRQ_Set_Scroll_Right;向右滚动
! Q) q1 }% o8 z' g - LDA #$00
2 t3 z; g' j& R. Y# V - SEC
2 Y/ {$ [& D" O2 d- G - SBC Scroll_H1 W# ^" r8 p8 L# v$ E
- STA PPU_SCROLL, [, Q' O. p* {
- STA PPU_SCROLL3 Q. g5 X" y. G& ^1 l8 O
- RTS( f% D% E4 G, R% m! j* [- _3 }
-
# o* a1 b" G" i9 c& S2 T5 F5 O - ;==================================================' a- R) W# ]* ?( x5 j# [3 Y _
- ;;IRQ滚动控制
: G3 _! a* B0 @) T8 W3 w - IRQ_Set_Ctrl/ U( m/ e, z, R% V2 y0 k8 `8 |, y
- LDX IRQ_Process_Index, j+ `2 `& H3 y* G6 }
- LDA IRQ_Scanline_Data,X
' F5 S7 N. `9 t$ g# n. W# w - BNE IRQ_Process_Latch
- H' C. E# y, _3 [4 r* b; `& c( c# g - IRQ_Process_Disable;禁用IRQ
3 e% U, z, |! I- F. d% k - STA MAPPER_REG_IRQ_DISABLE6 F1 f9 \* X: F: _" A, Q; y( D+ x
- STA IRQ_Process_Index
" L9 K0 F2 X9 `3 E - RTS" c( I& U; u3 B: [# T
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线0 }! g5 \3 T, `! j* ^5 n
- STA MAPPER_REG_IRQ_LATCH
& ? |5 p. c/ c' b- O5 b* j - INC IRQ_Process_Index
$ H$ @. d: k" y' t$ F& e - RTS/ ~( Y* H9 q7 V d8 D( i
- ) l3 S4 E* a1 k; T" J
- ;==================================================
9 Q+ a3 I* {3 j A! W. b" C - ;IRQ处理
9 }5 Q" t2 v* x; E/ D - IRQ_Process_By_Index! J* V& q6 w* Z+ }3 Z) v
- JSR IRQ_Set_Scroll4 u! }- n2 t: P6 g5 U# Y+ V
- JSR IRQ_Set_Ctrl
( W8 Y4 }+ [/ v( t7 n - IRQ_Process_End2 @1 e, Q5 G4 M
- RTS
" K% s" ]$ \) x+ H - ) q* D( J2 h+ r
- .ENDM1 J, d5 U/ x8 ~+ i5 b8 p! W& u
- % N+ t! _ S( v& _0 V! {% Y
复制代码
3 ?1 E0 s$ S" P3 Z# h
5 s3 {* L" w4 h; ~4 [代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|