|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 M7 f1 _4 K8 G+ E: g
. I0 v/ [5 @, X+ N' B7 x
本次IRQ研究了如下:/ m( d0 t6 ~: A2 W2 p5 W
VRC2&4(Mapper21,23,25)/ U: _+ v# N; _ ~4 y' q) r
VRC3(Mapper73)
5 f( l: d$ u5 {' T: {5 e6 X6 @VRC6(Mapper24 & Mapper26)
) n8 y4 j/ `5 ~: N0 M$ ?+ uVRC7(Mapper85)( b# T6 f0 @* I% S
MMC3(Mapper4)& n' R* \5 R! v: s$ U4 z5 a. }
MMC4(Mapper10)1 m* {4 D0 N4 u, g, p) ^
MMC5(Mapper5)
7 R: _+ n4 S T3 X6 xMapper183 g( U6 T9 K% D. U# W [: l
Mapper64" d% ~' Z( o7 j4 x/ I$ J! m* J
Namco163(Mapper19)
% l7 P& d$ z& ^# b3 c6 W5 PSunsoft FME-7(Mapper69)5 Z: ?* n. f! L% {8 ?! T
( E7 ?' S1 Y+ F& S
共计11种Mapper的IRQ操作使用例子' I* b! t& I9 E2 e$ H9 G" {# S
代码内有详细注释, 希望能帮助到感兴趣的人." {" j3 s( _* z7 b& c
5 f1 ]$ d6 H, x/ N C+ X/ i0 _" @1 B5 v; P: \
+ U+ p$ s( F9 E" V7 |* w' L: kMapper代码主要逻辑(以MMC3为例):
7 D% [! N: `8 u2 z$ c" \
) p5 l9 A3 S% s9 @* G- ;==================================================
& K3 z$ |/ k; h; j - ;Mapper号
5 { m9 d$ X% `" @! s - MAPPER_NUMBER = 04
0 f: v1 Q, Z& q; X; L( V - ;==================================================( F3 H& c+ x) v; G
- ;MMC3 (Mapper 4) 寄存器常量
9 j* W+ j' D+ K. R - MAPPER_REG_BANK_CTRL = $80009 p( T v4 c, n; O
- MAPPER_REG_BANK_DATA = $8001
$ g) r6 f7 {) ~5 i - MAPPER_REG_MIRRORING = $A000
) p4 L6 |; Y- c# v, S1 P - MAPPER_REG_PRG_RAM_PROTECT = $A001 R( {) n6 K7 f4 T, x
- MAPPER_REG_IRQ_LATCH = $C000
# D8 o9 H) k) q5 T0 a V2 r - MAPPER_REG_IRQ_RELOAD = $C001- x! c# {( j, v0 b
- MAPPER_REG_IRQ_DISABLE = $E000# m) L- O; Y4 E* C
- MAPPER_REG_IRQ_ENABLE = $E0017 r5 t+ u6 N) j$ I
- ;==================================================' u7 z( `4 ]/ ~: ^
- IRQ_SCANLINE_BEGIN = 1352 T- q; X0 i9 f9 r. l( L! e8 X
- IRQ_SCANLINE_1 = 8
4 l& _9 G3 `* a$ w - IRQ_SCANLINE_2 = 54+ C1 e3 w. s6 H( ^+ M3 V) X* L) o, w+ |* D
- IRQ_SCANLINE_3 = 8( O) c6 F! L: |0 Q k! e' r
- ;==================================================
& ]( C( Q, m* v, ~+ Y
, t9 l5 r# V: [! y- ;====================================================================================================: F/ l8 u+ F2 v0 t- {; U
- ;宏常量( M8 s: N1 y( ]! k" g* o! f; ^ {+ @
- ;====================================================================================================9 |* x7 M% C4 s7 b" T, b
+ J$ f( L" @/ L. L x" f) U0 K/ d- ;====================================================================================================8 y1 i$ L/ T$ y) f5 I
- MACRO_MAPPER_INIT .MACRO
9 w4 o+ g; n5 J( z6 R$ S& C F - ;禁用IRQ
" D# i- R$ _* [7 O" O8 U% v - STA MAPPER_REG_IRQ_DISABLE
& q' t# }, ^4 F7 v! u* k. s& L; d -
1 p" M4 R- x" H - ;水平镜像
" G8 W0 u! V9 _. K - LDA #$01& Y" ]. C' L7 c( T6 ?
- STA MAPPER_REG_MIRRORING# A' N4 _" L2 e
-
3 I# h w1 K: A6 u5 x& t - ;初始化图形bank
/ }% J- j( g! [ - LDX #$05
% K( W9 E9 D' W; n - .Init_Chr_Bank
5 r7 L* A- N J( k5 [2 G5 f0 U - STX MAPPER_REG_BANK_CTRL
. I% U2 C- j. u: W ?* D) x - LDA .ChrBankData,X
0 d. L# E \7 ]& k - STA MAPPER_REG_BANK_DATA
) @: p5 u3 }) I8 } R8 C - DEX
$ ]# L) i8 U _# q: T2 S8 ` - BPL .Init_Chr_Bank2 X/ p F* Q+ U, X( V0 L
- JMP .Init_Chr_Bank_End1 ^$ K! }6 P9 {8 a8 m) H! r
- .ChrBankData8 f( S/ p. c) q8 X2 E5 [. q5 B
- .DB $00,$02,$04,$05,$06,$07- ]1 W7 R! c/ z4 c% b1 ^0 {
- .Init_Chr_Bank_End
4 s9 o) j/ p! Z% R5 d - 6 K1 K9 g- v3 u2 r
- ;启用SRAM7 e/ U) B5 p- ]3 H
- LDA #$80
& W6 f3 R9 T. Z: } - STA MAPPER_REG_PRG_RAM_PROTECT0 }4 }8 Q# ]1 i9 X- l9 G! \
- .ENDM6 s* r+ F1 U7 o( p/ K, z2 r1 u
- a: _! T0 y- V- ;====================================================================================================
5 Q1 N% |+ k6 P6 W - MACRO_MAPPER_SOUND_CLEAR .MACRO8 U0 I2 \6 A {4 A2 z8 \
- .ENDM
6 J3 y! {& O( B& r: p - . c/ ~: A4 ^' `* |" i# f4 X
- ;====================================================================================================4 t& {' V' D; I- b6 h3 n: j
- MACRO_SRAM_ENABLE .MACRO4 \7 Z+ J) \1 X5 F9 H, m
- LDA #$80
$ H: g8 z2 O: w; i6 \, c - STA MAPPER_REG_PRG_RAM_PROTECT
) E" M1 s( Z6 i2 S* p, |" Q" e - .ENDM" {. O. X* R& }6 p/ P' D( s( a
- ! |9 d5 ^1 C( [5 |0 P+ f8 Q
- ;====================================================================================================
8 J& V' O+ J6 n: |( a( q - MACRO_SWITCH_BANK_8000_A .MACRO: D: T) [- c+ N2 l) ^( G% v$ _
- PHA+ y# |8 p4 r! f" x$ s
- LDA #$06/ `7 d3 L; n1 `. x6 g, e# w
- STA MAPPER_REG_BANK_CTRL
& X8 L* [3 K* O2 I - PLA
5 e) W' |! Y/ ?/ H - STA MAPPER_REG_BANK_DATA
& @6 F" K: R6 Y( u - .ENDM+ L w% Y; F+ x* Z2 }! G# d: m
- ' l2 \+ n) O$ F+ l' |
- MACRO_SWITCH_BANK_A000_A .MACRO3 |: Z! H( L: A1 d7 k
- PHA+ {( a; q$ f! L( U& C# B7 s
- LDA #$07
( g/ q! m) S+ z! `) N2 {$ j - STA MAPPER_REG_BANK_CTRL- d3 N8 O9 u0 h. }
- PLA
4 m4 p, c1 U2 }$ [3 e - STA MAPPER_REG_BANK_DATA
, x9 ]5 Y: W% Z, w - .ENDM
) \0 L1 D% X" z" A% j -
' Q$ M7 T, `0 P! N3 y) c' Q - MACRO_SWITCH_BANK_C000_A .MACRO2 |. c3 f9 X3 K2 W* k1 B0 i
- .ENDM
8 S8 M- J/ v7 x( U) U" l - 1 @/ L- X0 e% p( ?! Z {9 ~2 }
- MACRO_SWITCH_BANK_E000_A .MACRO) m1 r- ^* x% y9 G3 @
- .ENDM1 ^0 q. Q. O) m+ A8 G6 ]' I/ Y8 u
- 5 c0 j0 P4 d$ L
- ;====================================================================================================5 Y' {. `3 g7 G' t$ U
- MACRO_TRIGGER_FIRST_IRQ .MACRO6 m, O6 b' O: H! Q2 B0 Z9 A/ d
- LDA #IRQ_SCANLINE_BEGIN + 1
5 x" e0 [ z% |) ` - STA MAPPER_REG_IRQ_LATCH
0 r( ~% A; W- ]4 i - STA MAPPER_REG_IRQ_RELOAD8 U. R; P5 ~2 \) K1 s" s5 Y
- STA MAPPER_REG_IRQ_ENABLE
3 l$ j2 }' \7 s$ c- C - CLI; z2 t# j' N6 q
- .ENDM- d7 \2 K# r7 j
- ( E0 W+ T- M% G3 p- t7 L1 W
- ;====================================================================================================
; h$ z; h/ e0 n0 A# K. n+ a - MACRO_ENABLE_IRQ .MACRO
' H! V7 r8 z# K+ G - STA MAPPER_REG_IRQ_ENABLE
5 `% }0 Q$ d, |8 G7 W0 V, N. k1 n; i - .ENDM
1 B/ S6 x$ N( M& r4 j+ z& F c -
' W6 E, T3 o4 h0 z" n, { - ;====================================================================================================) K7 u1 A5 O! l1 j
- MACRO_DISABLE_IRQ .MACRO
5 V2 I9 l! p l8 Y - LDA #$007 O- h3 Z2 X, T) @
- STA MAPPER_REG_IRQ_CTRL
0 w! v i* \; I2 ~! ?3 u8 Y - STA MAPPER_REG_IRQ_ACK u5 r. A- ?/ J! ^: @
- .ENDM! k5 G u1 A/ @1 U
- ; k( G/ W3 w1 {. K
- ;====================================================================================================; T1 i# T8 e7 I5 T9 p& X7 I
- MACRO_ACK_IRQ .MACRO" ^8 M7 ]; p' O5 I, _4 q
- STA MAPPER_REG_IRQ_DISABLE& A2 N o; a% P- f" {
- STA MAPPER_REG_IRQ_ENABLE0 c# n. Y4 p; H+ n, i! L
- .ENDM$ \( a% r, s$ i; r8 {" F5 U% g0 z
-
: I, S' j2 E1 Y& ?+ v% Q" D - ;====================================================================================================% [" {. i4 i0 w J- b
- MACRO_IRQ_OPERATE .MACRO
" j( t6 ~1 e) p4 A" q4 ] - ) I/ W; k( O; P- h2 p- o$ Q2 y# F
- ;==================================================) c! \3 M& n/ I" w6 B0 @* o
- ;IRQ滚动模式常量
; P a3 q; _+ d. n2 p - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动) Z& s' e% L: H3 X! ]. k& Y
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动. O. }& n# R1 `+ Z1 t
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
/ R: W( p) F6 a2 `& z - - |" c1 D) T1 M+ v+ N/ R
- ;IRQ扫描线数据
% |( K: M: g9 G! P6 J6 Q - IRQ_Scanline_Data
$ v& m! e; J' W# G# v - .DB IRQ_SCANLINE_1
& W; n* ~: i. \ - .DB IRQ_SCANLINE_2
8 \) F) j3 @. v" v - .DB IRQ_SCANLINE_3' K( {0 y0 [! B$ {! |* e j
- .DW 00 ;关闭IRQ8 i& H! k/ m' u& f' _; t
q/ {3 G; ]3 Z/ n/ t- ;IRQ滚动控制模式
4 D' Y6 h5 K( Z7 R9 A - IRQ_Scanline_Mode
. l9 I6 h% [. ?! L - .DB IRQ_SCROLL_MODE_RIGHT
! M. D0 L$ H; N - .DB IRQ_SCROLL_MODE_LEFT
! z7 l/ p& I! d+ H8 S [ - .DB IRQ_SCROLL_MODE_RIGHT
9 `/ B* H2 u* h: ^+ [, h d - .DB IRQ_SCROLL_MODE_LEFT
; m2 }9 ~, @( v8 ]5 g0 @3 ` - - ?$ Y, V2 q; J. ^- I" ~
- ;==================================================4 T% o$ U- u$ f
- ;;IRQ滚动控制
: }: [7 Q1 i3 \3 R- e+ M& h7 b - IRQ_Set_Scroll# n$ C3 ~6 {4 o" ^& [% r
- LDX IRQ_Process_Index
/ P) R" Q' r& X - LDA IRQ_Scanline_Mode,X
0 S- Q: b- N- H6 m! z: F - CMP #IRQ_SCROLL_MODE_LEFT7 f" a" l; `/ o( K
- BEQ IRQ_Set_Scroll_Left- ]* o |' X* u5 U. M3 s H) z
- CMP #IRQ_SCROLL_MODE_RIGHT
) d3 Y8 B: j7 X) }* e: s) y - BEQ IRQ_Set_Scroll_Right
j) r/ K$ }: c* Y! q8 _) I - IRQ_Set_Scroll_Zero;不滚动
" `2 I- r: {/ d2 r9 b - LDA #$000 ?( ^: }. k% H% s; ~
- STA PPU_SCROLL
9 S- ?* a! S9 {! g& f - STA PPU_SCROLL, G3 a! x0 e% I# l3 `
- RTS
7 x0 B# p7 X6 U - IRQ_Set_Scroll_Left;向左滚动 @0 a. {9 t4 M9 U
- LDA Scroll_H
( Z+ l4 _/ z9 j# D! _/ G. j - STA PPU_SCROLL" S: c0 | L4 W
- STA PPU_SCROLL& `( ]. I9 V$ X. |6 O) n+ l/ K j
- RTS1 g( K2 x! i4 m s& i; x. K
- IRQ_Set_Scroll_Right;向右滚动
1 {! Q3 a# K8 l2 B S4 V- ~8 o. d8 W2 V - LDA #$00
. y8 n% Z! Y N- Y - SEC6 W1 }0 L/ K' k. f! u7 v: v
- SBC Scroll_H" j! N: I* P/ k0 J) [- [
- STA PPU_SCROLL: f% h$ w9 G, m* V- T
- STA PPU_SCROLL
# H9 U/ {$ `: r, Q0 @ - RTS, b' `6 r6 h( Z0 B, ~, U
- 7 h4 Z* i2 |# H) o
- ;==================================================
# A( a7 Y$ z* h' S2 V" ]# @ - ;;IRQ滚动控制
( j! f; M+ {' p" R, ?5 s# P - IRQ_Set_Ctrl
$ O: \0 h: Z0 ?2 a! [$ W! i, Y - LDX IRQ_Process_Index
: X: B" n8 u$ o1 l4 t i - LDA IRQ_Scanline_Data,X4 N9 ~+ d7 l* J% e2 ]9 \
- BNE IRQ_Process_Latch
, Q L5 F9 P* Q( V; c) W$ r4 ?" d: |" b - IRQ_Process_Disable;禁用IRQ
) l. Q- L% f+ _, h/ d n& K; l6 P - STA MAPPER_REG_IRQ_DISABLE
9 G' h% P/ c* o; X( a - STA IRQ_Process_Index
0 k% l O/ K% t) ^) P, D( V/ ? - RTS
; M8 k+ w) M/ [1 f) c$ c - IRQ_Process_Latch;设置下次 IRQ 触发扫描线& p9 r2 r' x/ I6 r+ b
- STA MAPPER_REG_IRQ_LATCH
2 B+ {1 ~4 C/ V4 l/ C! y4 H+ ~! B - INC IRQ_Process_Index x( w4 F0 \6 z t9 U$ o' n+ S
- RTS; A2 X) `3 s2 D; `
t+ x# w& y% b1 ~8 C4 G" |- ;==================================================( j* U0 z6 j% h% I2 m; T4 ^
- ;IRQ处理6 T: s! q& R* Y/ ^9 F
- IRQ_Process_By_Index
9 S- k0 p) D0 ?- [7 ]/ B - JSR IRQ_Set_Scroll
# G+ d7 j8 @, k6 u7 C: D: U - JSR IRQ_Set_Ctrl
% P1 }2 o& Q* M) q! h - IRQ_Process_End
0 J: `& o# f; g+ D8 v2 t" G' g - RTS" z% K/ \! I2 ?% B& h
-
( E. [- k2 Z4 f. l. { - .ENDM
+ d- j! b/ F/ V( n1 I& M - " S! \9 s3 p1 z2 F; |$ r; G: a
复制代码 ) p7 r4 L* F# q! G- R
) A' z+ B2 i% x* Q
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|