|
|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
0 a* K: M( u# n R7 y! z( J
) [5 x" {& f. K; b& F/ o本次IRQ研究了如下:
/ C/ U2 w# @' x& GVRC2&4(Mapper21,23,25)3 E! a+ M# \; W) f- c
VRC3(Mapper73)9 O/ g" z% ~% N$ |; E; {
VRC6(Mapper24 & Mapper26) o0 l' @) G; [9 M
VRC7(Mapper85), Z; L' g# `0 k4 b' e' P. c; c5 O% a
MMC3(Mapper4)
/ E$ e: f. W* aMMC4(Mapper10)$ V' U" p% Z7 u! B
MMC5(Mapper5)- Q9 ?8 Q4 m x( B, p
Mapper18
' |# ]5 @. e7 vMapper64
; l" W& M) m+ X8 G( l/ S7 HNamco163(Mapper19)3 D# j$ \/ [8 x! {
Sunsoft FME-7(Mapper69)
% j% a2 K/ ~2 w. i# S: k- l
3 D" s; \4 S: Y/ g" z c4 }共计11种Mapper的IRQ操作使用例子
& j) R# ]% D& I: P$ I+ |/ f& q代码内有详细注释, 希望能帮助到感兴趣的人.
[0 g7 O8 A# X1 }, q5 h% t; _0 l$ j+ F# D; G8 R- m$ }# h
  }' a F% e# [+ E# z/ T, ]
4 r2 Y) Y' K* N7 \' X$ Y# PMapper代码主要逻辑(以MMC3为例):- p3 u; ~4 e/ g4 J' k9 F& f
- 9 A4 l: j/ m: `
- ;==================================================
/ ]+ ]9 J2 E8 C/ L* @9 v9 P# X - ;Mapper号# w, B7 h0 I# \) W9 f
- MAPPER_NUMBER = 04
. y# |; [8 e5 u3 k& ~ - ;==================================================
0 Y6 G5 G' w; c# Z - ;MMC3 (Mapper 4) 寄存器常量4 }% u9 v) R8 }4 I5 x
- MAPPER_REG_BANK_CTRL = $80002 ^ V3 }$ n$ `8 o, Q s! _
- MAPPER_REG_BANK_DATA = $8001; l2 _/ \) k! F& C3 [- l0 ~- p
- MAPPER_REG_MIRRORING = $A000
) ]" r# e( j8 ]7 k - MAPPER_REG_PRG_RAM_PROTECT = $A001! [& W3 m& T m9 {. n
- MAPPER_REG_IRQ_LATCH = $C000
6 V, O3 w0 [ O - MAPPER_REG_IRQ_RELOAD = $C001
. } Q* n C7 H2 A. T# i9 d - MAPPER_REG_IRQ_DISABLE = $E000
/ [3 p, c8 `0 T3 ~% w: p. l - MAPPER_REG_IRQ_ENABLE = $E001. Z6 u- }/ x( x8 q
- ;==================================================: i" o8 X9 v3 i7 e1 I
- IRQ_SCANLINE_BEGIN = 135
3 w/ a3 ?1 f* | _" l! x6 q - IRQ_SCANLINE_1 = 8. \7 k; K; k8 Q5 {
- IRQ_SCANLINE_2 = 54
9 y$ l5 e v( \3 V - IRQ_SCANLINE_3 = 8
" q( Y! K4 |8 T+ [& o" ~" c8 M - ;==================================================
/ {, j$ X! j8 `6 i - ! @4 J; t1 A2 F- Y& T
- ;====================================================================================================
2 [. y5 |9 A9 w - ;宏常量( S3 N# M/ E0 ]4 d
- ;====================================================================================================
" L' O* Z" b8 a/ b8 _8 I) p - & g( f4 G. m O3 U8 C
- ;====================================================================================================. [0 h3 ~. r3 g. Q+ D" H8 ^
- MACRO_MAPPER_INIT .MACRO
- O5 c8 |7 y5 C4 \2 Q - ;禁用IRQ
( ^2 y/ s7 h: i5 f1 N+ L& N - STA MAPPER_REG_IRQ_DISABLE- Z% _4 `+ z& V9 x# ?
- 7 ]! V. R/ M, I. U, ~: K
- ;水平镜像& S3 F1 y- j: \+ ?4 b+ ~
- LDA #$01 I* g J3 G1 x# n8 Y
- STA MAPPER_REG_MIRRORING& |7 `* Q) x5 u2 Z% Q% y; r
- $ d1 w- M% n) L1 p6 X
- ;初始化图形bank: U( @. v* O6 J2 Z ?/ D8 N4 Y
- LDX #$05- j6 \6 g8 B9 t5 ?
- .Init_Chr_Bank
0 `0 `- a0 k+ M0 p3 Z- K7 S. F* R - STX MAPPER_REG_BANK_CTRL
# g+ M! z5 c' b - LDA .ChrBankData,X* |) o% m. l! _8 m% ` P# f8 C {$ o+ }
- STA MAPPER_REG_BANK_DATA
+ R$ Y' K# X2 ?" _: D9 j - DEX2 h( w' q- r' M6 K! L# z2 L
- BPL .Init_Chr_Bank
: @6 }4 ]2 H, k6 E2 X - JMP .Init_Chr_Bank_End
. w, l/ |+ p" b; [' _' i - .ChrBankData
- p5 m, }/ i h - .DB $00,$02,$04,$05,$06,$07& T" z, k/ [# d' |, ?$ v
- .Init_Chr_Bank_End
4 {5 R8 `+ y! ~- N) c - 5 B/ y! f& Z X
- ;启用SRAM; Z& j4 b1 {) O7 ~
- LDA #$80! O4 V8 e- z0 o3 @! U- o5 L! m
- STA MAPPER_REG_PRG_RAM_PROTECT
7 r9 G5 k, z8 n% J! D& l - .ENDM U6 p5 F; E3 ?3 @' c f+ R
- % T7 M- J7 X- h$ e% V* Q
- ;====================================================================================================
# F' i, `# y( C& u5 D4 i - MACRO_MAPPER_SOUND_CLEAR .MACRO
2 t* K0 t( Y6 I x) w" x# E6 j* ? - .ENDM3 R& \* q. ?) B5 J% d7 _
-
' B# P/ o/ s6 f C/ C8 ~ - ;==================================================================================================== p! ]: q- a, \$ p, Y) M; G
- MACRO_SRAM_ENABLE .MACRO
' ?! i t* F0 s; w3 j& ] - LDA #$80! }9 _: O: A3 }$ h
- STA MAPPER_REG_PRG_RAM_PROTECT! a) B! C5 f& `2 A2 A9 U6 J
- .ENDM: l- b1 ^& u# E
-
5 D" R6 F! e1 } - ;====================================================================================================
4 ?. g. V. d8 E - MACRO_SWITCH_BANK_8000_A .MACRO
: d9 `' d5 u4 y+ S% Z" e1 E2 T - PHA. ?# t, m; `6 v* J; P
- LDA #$06
% n5 `0 C7 x2 W2 q - STA MAPPER_REG_BANK_CTRL
: [6 z. O( c( Z6 Z; O - PLA) V C1 k: h2 O1 G* t0 c
- STA MAPPER_REG_BANK_DATA( e1 F) E- n8 f" ~, `2 t
- .ENDM
! c; m% P5 b. s
! M0 O' l0 I7 }5 [* S$ W- MACRO_SWITCH_BANK_A000_A .MACRO1 @/ N6 O& J1 E# @: p! m
- PHA
4 D5 F/ L6 j* } - LDA #$07
& w2 Y; g6 H+ A; _ - STA MAPPER_REG_BANK_CTRL
# @* k* ?! \& f- V - PLA: S1 }2 S3 } @
- STA MAPPER_REG_BANK_DATA) v7 \# e, v+ r9 | `6 D+ {
- .ENDM
- R4 t# e) J! b( h5 e! y - % x, }$ }2 i; S- z4 N0 M2 Q
- MACRO_SWITCH_BANK_C000_A .MACRO6 o k4 \ I2 W" d% R8 D
- .ENDM( k/ c1 M' Y' H$ {
- * D. q4 k5 Z! P5 E a* ^
- MACRO_SWITCH_BANK_E000_A .MACRO* j( b- x1 q7 Q2 ?) p5 }/ W
- .ENDM
+ P( C9 d* S7 [4 H - ) ?( U$ N# Z/ E3 O$ H
- ;====================================================================================================
( B' C( v$ q5 D }( h/ w4 U - MACRO_TRIGGER_FIRST_IRQ .MACRO- z+ `2 m6 h6 u
- LDA #IRQ_SCANLINE_BEGIN + 19 I7 ]. d j. O% B
- STA MAPPER_REG_IRQ_LATCH
6 H9 }6 k; [6 Q8 w# ]* M - STA MAPPER_REG_IRQ_RELOAD% d: E. i4 w0 ~, S. W/ \3 H% C
- STA MAPPER_REG_IRQ_ENABLE* t" l+ {2 `. s T# J
- CLI
6 ^" i8 u8 }! J9 ~0 | - .ENDM: B7 m# y g! q: L
- 3 ^& g# c, ~: D. w: C
- ;====================================================================================================" P6 T$ }# X: f/ D% H2 K
- MACRO_ENABLE_IRQ .MACRO0 F F$ ?9 [2 A f3 \' H
- STA MAPPER_REG_IRQ_ENABLE
3 P$ e. ~. G) x) w' x, q - .ENDM
5 Y5 A( q# t" z8 { -
& w+ U& t( ]" Y( }7 v - ;====================================================================================================
- h3 t |9 l4 I% b" {* K- E) y - MACRO_DISABLE_IRQ .MACRO
y/ W* n G' d - LDA #$00
/ J3 C5 E3 B, |8 c( X - STA MAPPER_REG_IRQ_CTRL
! A7 o2 D& y( T. s4 W7 c0 k: g - STA MAPPER_REG_IRQ_ACK. N1 |6 l; ?) d+ {! l# G
- .ENDM
0 K* u/ D* N1 J; J3 n' x6 { - ' Q3 ?) y8 F, h+ n+ m+ B
- ;====================================================================================================$ w- W% }- p- H/ r$ W7 K
- MACRO_ACK_IRQ .MACRO5 Y7 k" i. X6 U' t4 `( {
- STA MAPPER_REG_IRQ_DISABLE( i! V# Q, p% J. H, ?
- STA MAPPER_REG_IRQ_ENABLE
- p; D* G- l9 |% Q. v& D o - .ENDM# b) C, U0 ]0 z: y3 H) h
-
, W; d0 e9 w/ c8 A5 z! f7 i - ;====================================================================================================% {3 t1 {8 w+ Q% W# Q
- MACRO_IRQ_OPERATE .MACRO
. z5 m/ B/ @/ m% u* J" G. k
1 m& z' }, S4 N* Z1 H- ;==================================================
: h7 L' S* t/ M9 c- ] - ;IRQ滚动模式常量
6 T; b$ q r" n - IRQ_SCROLL_MODE_ZERO = 0 ;不滚动
8 {8 b2 [4 H7 _ - IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动( }; o7 `% M' ?
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
^# Z7 z9 b- k- R! \) W - 9 T1 \, \/ i5 S
- ;IRQ扫描线数据
' E7 B& Q) Z. Z3 _, v4 N$ D v5 X- B) l' b - IRQ_Scanline_Data3 m/ i" _3 ]! V6 ]" t
- .DB IRQ_SCANLINE_1- s" H6 B/ P9 B* H( t0 ^7 b# E
- .DB IRQ_SCANLINE_2, }# E0 d/ P/ }. e# [2 ]. ^
- .DB IRQ_SCANLINE_3" K' W. G* M! b8 F9 s! F
- .DW 00 ;关闭IRQ
0 ]8 { z) f5 W! h0 g - , w1 V2 O# ~5 N x1 t, O
- ;IRQ滚动控制模式
. d; j" S7 F6 @1 c4 C - IRQ_Scanline_Mode/ q% K" c1 y. w- N
- .DB IRQ_SCROLL_MODE_RIGHT* p' w/ [: l3 \2 t& t) J$ E/ L8 i
- .DB IRQ_SCROLL_MODE_LEFT1 m! y7 Y; Y! X1 D3 b
- .DB IRQ_SCROLL_MODE_RIGHT( A* p- E \' \3 E
- .DB IRQ_SCROLL_MODE_LEFT
+ a. Y. Z7 q, B# v6 q - # S$ r3 `0 Q+ m4 o9 }& e# ~8 k, f
- ;==================================================
% _, d; D$ S1 p, R - ;;IRQ滚动控制
& |) {$ }. v9 b& X9 O8 [& L - IRQ_Set_Scroll
6 y# @( Q G5 j3 C, o% C! t - LDX IRQ_Process_Index
; D6 Z& I+ Y+ T, w) A2 @ - LDA IRQ_Scanline_Mode,X
+ @9 Z: a9 i. f. k0 q) u) h3 [+ Z9 m - CMP #IRQ_SCROLL_MODE_LEFT5 [! Y1 }# l* \. `
- BEQ IRQ_Set_Scroll_Left6 ~4 d$ W) Z+ M( n
- CMP #IRQ_SCROLL_MODE_RIGHT# `; X/ c7 c1 ^9 ?/ Y
- BEQ IRQ_Set_Scroll_Right D s& x0 f7 j% i
- IRQ_Set_Scroll_Zero;不滚动( W f+ C' t! H: K% ?
- LDA #$004 t7 h6 q( E& C5 k# [0 C
- STA PPU_SCROLL7 r" B1 i! `! p6 r; g# X2 }( z
- STA PPU_SCROLL
0 q9 Y% }- n( g, i" U - RTS
; {/ s/ `7 ~- h9 j - IRQ_Set_Scroll_Left;向左滚动
" T9 N+ G2 S3 A0 j; S - LDA Scroll_H
+ A2 U$ M# q8 O, ?* @ - STA PPU_SCROLL o2 ~8 E0 h" `6 \4 P0 W
- STA PPU_SCROLL! o: K6 c D, U7 |$ A4 h' f0 X
- RTS2 z2 y: }% b R$ s- o. s$ ]: A! B
- IRQ_Set_Scroll_Right;向右滚动3 u. k6 {' x) i/ |) _ d! ^1 C+ x
- LDA #$00
$ G$ S- C/ R# x! g( b2 g/ S0 y - SEC
( I) E& _+ w \/ o - SBC Scroll_H
/ R5 `: J6 F5 I8 a U - STA PPU_SCROLL; t4 A* x% u7 I+ h2 C" A' H
- STA PPU_SCROLL9 \% `0 a( s7 S" J1 e
- RTS
) h- x5 N% P* V3 ? - . {3 I+ W, H. l2 J0 U' \$ v
- ;==================================================
! y+ I1 h- Q9 D- U- T - ;;IRQ滚动控制
$ |3 C9 ?: H; a* P) }% E9 c% l - IRQ_Set_Ctrl% T$ x0 u1 m7 H5 I% \5 d8 h9 y
- LDX IRQ_Process_Index$ Y8 D& t: v. A1 i* ^. J, \
- LDA IRQ_Scanline_Data,X
- k: d4 p8 U, a+ Z, T - BNE IRQ_Process_Latch
8 |0 A' \4 u1 r: k) j* Q! x - IRQ_Process_Disable;禁用IRQ
" ~) k' w1 p4 g2 F4 j g7 U - STA MAPPER_REG_IRQ_DISABLE" r0 g1 |: [, T* Z
- STA IRQ_Process_Index9 Z- S+ |( t+ z# a/ h9 ~2 p
- RTS; t( j7 O) J* J" r- @
- IRQ_Process_Latch;设置下次 IRQ 触发扫描线/ ^5 K4 k$ j+ C8 u4 B7 W
- STA MAPPER_REG_IRQ_LATCH2 S- _& ]5 W. S1 X0 a
- INC IRQ_Process_Index
% g& d: q8 H: g1 r2 g9 ?; [ - RTS
0 N2 H& z6 K( {- W - ; Y6 W4 J$ z5 O
- ;==================================================/ a* M* C3 t' T9 L) |" l2 m
- ;IRQ处理5 C- Q- h( U0 v3 H/ ~
- IRQ_Process_By_Index
2 {" N1 y/ M, i+ V# N, \8 y5 i' h - JSR IRQ_Set_Scroll' T, }' Q# L( Y9 V5 ^6 |
- JSR IRQ_Set_Ctrl. M. T+ G7 T" ] g+ p5 P( V
- IRQ_Process_End9 M) |8 c4 ~* Y( u
- RTS
. K: p$ H" m" v -
& W( d) w6 ~7 P; q& c - .ENDM- X0 l+ F) i. s
- , y8 I5 l. U4 b3 e5 C1 i
复制代码 ' C+ G2 }2 R r
1 c" q# a( }; ?
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|