|
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
$ d/ N- R' D' t5 A# K
2 r6 ?$ M0 i8 Q. _' j本次IRQ研究了如下:
( q0 h0 b* @1 H( i m9 F. U# S' yVRC2&4(Mapper21,23,25)
1 x- _1 G. S$ I8 ~) k. fVRC3(Mapper73)
$ z7 W% O2 ?7 r) B% mVRC6(Mapper24 & Mapper26)
1 p* X: m2 n, ^0 X2 Q: aVRC7(Mapper85)
: g5 v" f4 v7 w7 r1 dMMC3(Mapper4)
' o6 s9 ^3 g# KMMC4(Mapper10)) f3 I! {8 |4 B( T* w' R* J s7 u8 |
MMC5(Mapper5)! o! \4 ?. Y N4 S) t! E
Mapper18
% }& I i9 V0 B8 A9 HMapper64
- x+ y) B" X, p* T8 SNamco163(Mapper19)
! ]8 T0 r# e; v0 E5 S( A( |& X2 MSunsoft FME-7(Mapper69)
& Z, O( h9 j+ {- ^8 {4 c
" G" W. i! [( R- x共计11种Mapper的IRQ操作使用例子) R/ T# g5 i( |! Y& a
代码内有详细注释, 希望能帮助到感兴趣的人.
4 v& F% p4 T) k. O/ j( h) Z5 n
: Z0 f3 W. X4 Z5 L1 s# c  
- E# v7 Y. Z- r T
6 F& o' N( ?! B6 b1 e6 P; W8 eMapper代码主要逻辑(以MMC3为例):+ k6 _9 d/ t# T
3 q) i1 F- s+ i" }- ;==================================================9 s& M* j; x3 W2 ?( }3 a+ ]. o
- ;Mapper号 ?! k8 d. g2 S3 K; \- b5 ~
- MAPPER_NUMBER = 04 X; x& r% A- t4 c& e( c- c
- ;==================================================
2 M1 }- `- ~6 W1 L& o - ;MMC3 (Mapper 4) 寄存器常量' u# ^/ a" E/ Z8 _
- MAPPER_REG_BANK_CTRL = $8000& |+ f& u) V& `, @
- MAPPER_REG_BANK_DATA = $8001
4 v, u. k+ i5 @9 ]3 a - MAPPER_REG_MIRRORING = $A000
; A, h7 w0 K" b7 T) x$ d - MAPPER_REG_PRG_RAM_PROTECT = $A001
+ V: F8 s% S4 ^0 {, k2 c4 Z# B: I - MAPPER_REG_IRQ_LATCH = $C000
$ W( |! X% z6 @4 v# v( x9 [ - MAPPER_REG_IRQ_RELOAD = $C001
5 Z9 L4 E: }/ p, c( p/ x" D6 X) \ - MAPPER_REG_IRQ_DISABLE = $E000
. V' q, l! r8 x6 Y/ r6 O - MAPPER_REG_IRQ_ENABLE = $E001$ R! L# c9 R }9 W2 t
- ;==================================================0 }/ K5 n. v" K3 C
- IRQ_SCANLINE_BEGIN = 135
# Q' k$ M9 P3 x$ ?! f% p! ? - IRQ_SCANLINE_1 = 8
( t s; e( B5 Y - IRQ_SCANLINE_2 = 54& C' r8 K- T! t; |. l( x
- IRQ_SCANLINE_3 = 8% m7 H+ x# d, s0 [0 ?$ X% M
- ;==================================================
( | g3 J9 J) w& m; N
% I& @) k- `. `6 ^6 @- ;====================================================================================================
2 R- L. V( o( V0 Y" `+ j - ;宏常量# v% b5 [- p& ~ j8 n# m
- ;====================================================================================================% B) C+ l' a. Y( M& P
6 a1 u3 H/ ~3 U) }- ;====================================================================================================+ m1 @+ h4 t4 e
- MACRO_MAPPER_INIT .MACRO
; n& [* t4 \- |/ t% C - ;禁用IRQ
) B% X; r; K; L2 N' b- N! ` - STA MAPPER_REG_IRQ_DISABLE8 w6 I T5 h5 K/ O! R
- $ b+ ^ K& [. i( A% w# E. }- [
- ;水平镜像. X# ~# A6 \: b# `+ G9 x
- LDA #$01
; Y% @- m" q+ u/ _ S, U - STA MAPPER_REG_MIRRORING8 W( q3 O0 p5 X8 x
- 0 Q0 t# S4 z9 `0 B6 Z
- ;初始化图形bank
9 z5 N, y* E, G ^ - LDX #$05, n q n" o" u! p7 m
- .Init_Chr_Bank5 u8 p9 i9 n5 c
- STX MAPPER_REG_BANK_CTRL
$ ^; i3 }' h0 a* R( F4 U, T/ c9 R - LDA .ChrBankData,X. d0 d* B* U* K- C
- STA MAPPER_REG_BANK_DATA
% L+ v/ A( U( ]7 I - DEX
+ a6 C" r9 V, M - BPL .Init_Chr_Bank" U1 q( S1 y* F
- JMP .Init_Chr_Bank_End: Y# D' _7 s# r1 v0 c
- .ChrBankData: g6 X6 x! ?" b# l: A
- .DB $00,$02,$04,$05,$06,$07$ T# F' A1 V; _
- .Init_Chr_Bank_End
+ H4 h5 h0 A+ \8 d. @+ P - & o8 m" M6 n9 o
- ;启用SRAM
" u1 N" i4 Z6 f; _, e# v5 v0 ` - LDA #$80
/ v+ X0 |# _$ C+ F - STA MAPPER_REG_PRG_RAM_PROTECT
' i" A- G. y) M. {1 \ - .ENDM0 X2 B; v) y1 L. K `% z7 @
$ b! j! Q, Y, p% b6 L- ;====================================================================================================
' O" f7 m: |' y# Z+ u - MACRO_MAPPER_SOUND_CLEAR .MACRO) Z+ X1 j, s2 r$ P# n& }
- .ENDM" G2 L9 | _1 P0 q- c4 u; B
- % g$ `+ @ d3 c/ x, h
- ;====================================================================================================
. _ U% { A2 v$ | - MACRO_SRAM_ENABLE .MACRO7 R! J8 r+ M+ `4 V- l- L& h
- LDA #$80& A" l4 ?3 Z: ?& ]! |* T3 M, P% Q
- STA MAPPER_REG_PRG_RAM_PROTECT
. t {1 [; b2 t - .ENDM! b. g" T2 A% _9 I) d
-
9 @2 m6 c- q4 D+ Y - ;==================================================================================================== }! C5 k$ @0 H& ~* L+ C% w
- MACRO_SWITCH_BANK_8000_A .MACRO' H' m u3 d# Z! j g' _/ T% d& ^
- PHA6 p' J3 |7 a- O( z* u
- LDA #$06
1 n8 o0 `6 c: B) {; h+ { - STA MAPPER_REG_BANK_CTRL
1 r8 h) q: l/ D1 _& j - PLA' ^: S0 s. }9 h: w# ?
- STA MAPPER_REG_BANK_DATA
2 }1 \) H+ e% n/ o2 X, h' m6 | - .ENDM
- _1 P/ M' R# O+ ?) s/ l7 W
! o3 u5 ]- z2 S' W- MACRO_SWITCH_BANK_A000_A .MACRO3 f% O- B+ K8 }
- PHA' o$ V! b+ z8 ~" b
- LDA #$07
1 H- \! m X1 \3 T" g - STA MAPPER_REG_BANK_CTRL+ @8 U8 E% C `
- PLA4 M5 \; u% }$ ~+ {
- STA MAPPER_REG_BANK_DATA L6 X" w, h* j/ V
- .ENDM
+ l6 l$ j8 Q8 z$ v4 N - : r0 |# J/ Q! Q7 I6 E
- MACRO_SWITCH_BANK_C000_A .MACRO9 I( Y7 m* E u' C2 [
- .ENDM
& V, h; S9 C7 T - + U6 [8 x4 m( f' W. D. _4 f y D
- MACRO_SWITCH_BANK_E000_A .MACRO
, ]# C- z1 E& l9 D - .ENDM6 O4 U- y% w- G+ _" X# `
- : ^0 G3 u- q% Q+ G" Z. k7 R& v
- ;====================================================================================================( \# }$ n1 _9 t: W+ w' X5 O
- MACRO_TRIGGER_FIRST_IRQ .MACRO/ n% W" P/ x+ g8 J' j
- LDA #IRQ_SCANLINE_BEGIN + 1
# V" `4 q# _8 ^' Z& X5 P - STA MAPPER_REG_IRQ_LATCH5 k1 N' E- V6 E7 K. d# W
- STA MAPPER_REG_IRQ_RELOAD5 w' c5 E. G0 u# D6 M1 Q
- STA MAPPER_REG_IRQ_ENABLE
! K, a5 i' Y" B/ x( G - CLI* r' `) q" D) j* B
- .ENDM- T' y# _& C! U/ v a9 J( c
- ) e8 h; R1 x: {9 C$ K6 b% H; [
- ;====================================================================================================/ W' O N. E# R1 N5 c' n& F
- MACRO_ENABLE_IRQ .MACRO$ I+ G" S: Q2 W: ^8 K$ V
- STA MAPPER_REG_IRQ_ENABLE0 T3 Q1 Y% v& I; b5 w
- .ENDM0 G0 S: }% J" d
- 7 R3 h4 F, f4 Z1 I; d0 s
- ;====================================================================================================3 r% j j) E0 L
- MACRO_DISABLE_IRQ .MACRO
5 u0 f; g" N6 R# v* F) \/ O N - LDA #$00. Q$ r; K& K3 x
- STA MAPPER_REG_IRQ_CTRL
8 t6 j( R7 n, E* Z8 e9 F5 c - STA MAPPER_REG_IRQ_ACK1 C7 N, I7 U$ W! m( J) X$ L) ?
- .ENDM
1 A: b/ }* @5 E, K8 k. e# F- p. j -
# \: L$ t* N$ v: P! ~ - ;====================================================================================================
4 I. B# v h4 b( }# @ - MACRO_ACK_IRQ .MACRO2 V" ? e2 g, J) ]1 v/ I
- STA MAPPER_REG_IRQ_DISABLE7 f: j0 z( f# h3 P/ M* d! ^
- STA MAPPER_REG_IRQ_ENABLE8 S8 ?; w \% s# `$ f! \* `5 [
- .ENDM
5 P: B( x( l1 T- _2 d# X1 O V6 Q% ] -
0 D# O. Y# N" ~/ h - ;====================================================================================================- C N: F- j( `7 I/ m
- MACRO_IRQ_OPERATE .MACRO$ M) Y7 V' W! U( ]$ k' g' M$ P
5 u; q) b0 P3 e1 U5 u) f. E- I- ;==================================================
( p7 z G# J. G) _2 q# I - ;IRQ滚动模式常量: N% b b2 e# V9 R) T
- IRQ_SCROLL_MODE_ZERO = 0 ;不滚动8 ]& y m# o1 I, z, ~
- IRQ_SCROLL_MODE_LEFT = 1 ;向左滚动2 L7 o1 }# w" M4 a7 @2 H
- IRQ_SCROLL_MODE_RIGHT = 2 ;向右滚动
% c4 t) e7 U* B1 x1 i - 7 c/ j8 y/ V6 |
- ;IRQ扫描线数据
0 Z2 K/ p' R1 r1 ~1 w% L - IRQ_Scanline_Data
1 j. @" s% s, z5 @ R - .DB IRQ_SCANLINE_1
6 H& J, Z. G, B) `( ?' ?4 _' g - .DB IRQ_SCANLINE_2
- U7 N3 A" J0 A) H& h" `% S - .DB IRQ_SCANLINE_3$ O) Y" c8 H8 ` h0 R3 Z/ H. N
- .DW 00 ;关闭IRQ+ J' l0 m! O1 F8 w* |
2 Q! c- v) G6 p* S- ;IRQ滚动控制模式+ Y& ~& t- n$ [" P
- IRQ_Scanline_Mode
( `" G4 j ]+ _; a6 K# ? - .DB IRQ_SCROLL_MODE_RIGHT
' T& L/ t6 t7 v0 S - .DB IRQ_SCROLL_MODE_LEFT \/ H8 H$ W5 y9 |0 G. U+ Z
- .DB IRQ_SCROLL_MODE_RIGHT/ U3 _. D @' b. i$ V
- .DB IRQ_SCROLL_MODE_LEFT8 \) L4 s. X( J o5 w1 @
- 6 _) n- W: A( ?6 F) {4 V! d
- ;==================================================. o& P4 f# ]/ Z- b5 r. |2 Q* r! i
- ;;IRQ滚动控制: h' t) t' h0 n, O" |. W8 Z1 ^
- IRQ_Set_Scroll
1 x \2 |& Y, l' @, ?" X - LDX IRQ_Process_Index
+ W- a1 J7 s4 I& q4 r" x" s; X, e - LDA IRQ_Scanline_Mode,X
0 x$ D" r8 I: ^$ d% O6 g - CMP #IRQ_SCROLL_MODE_LEFT) I+ B; y( t; y5 e5 u
- BEQ IRQ_Set_Scroll_Left% ?5 P+ g! v2 z
- CMP #IRQ_SCROLL_MODE_RIGHT
% C# C& R$ Y; f: N. B4 A$ U+ D1 d - BEQ IRQ_Set_Scroll_Right
& Y0 v1 i9 b* M* W! i - IRQ_Set_Scroll_Zero;不滚动. {6 a5 L1 E0 @# o
- LDA #$00% ?) {+ V: D. c! n; J6 w
- STA PPU_SCROLL
6 J1 n/ j' ~2 S - STA PPU_SCROLL
* J }( X; p0 v6 j9 O: }3 A4 o - RTS
- M/ g P; ?+ y$ Q" z - IRQ_Set_Scroll_Left;向左滚动
7 x6 f& g& `5 S/ q! d/ C - LDA Scroll_H
% W7 t+ Z- B7 v C6 w - STA PPU_SCROLL
. {( l I, |' r6 q - STA PPU_SCROLL4 z- Q! K4 y. h! J; k% O
- RTS( P# p; h$ k0 l" f+ c& V4 w9 r
- IRQ_Set_Scroll_Right;向右滚动
& J* N O! t( ~' y2 h. G) q% v - LDA #$001 m0 v) w; h' T/ {2 w4 ]
- SEC: |" g9 z1 D! @) ?4 r' R3 C
- SBC Scroll_H
4 L1 Z& @' Q4 t" S2 ?( R2 M) L - STA PPU_SCROLL
: K: T% @& i$ D, E% C! D6 m - STA PPU_SCROLL
( X- L1 r- I+ X& L4 l - RTS) x. T+ B3 m6 z
- ) w! H" u+ j9 n" M- p
- ;==================================================
\+ H) A6 e, L! o9 v" H - ;;IRQ滚动控制' b+ |4 E' r# N
- IRQ_Set_Ctrl
2 L0 k, W$ B1 L. r H3 n - LDX IRQ_Process_Index
4 L8 n. ]) N* f# u f: [ - LDA IRQ_Scanline_Data,X: }. n5 ]2 h0 u* I
- BNE IRQ_Process_Latch3 ?. i$ T2 z8 e. w
- IRQ_Process_Disable;禁用IRQ6 T4 _$ u9 }& Y/ f: P# U3 D: R( m F! M
- STA MAPPER_REG_IRQ_DISABLE: n8 u% d0 v7 F1 Z. D1 G) ~' x
- STA IRQ_Process_Index* m U4 p# D5 R, l
- RTS
2 C8 M5 w/ Q V8 S- [7 B9 f4 F - IRQ_Process_Latch;设置下次 IRQ 触发扫描线
* j: y; W- W6 W' |- K0 n( m - STA MAPPER_REG_IRQ_LATCH0 u4 K# w" s0 G9 r& i" K
- INC IRQ_Process_Index
* }( }& \3 `# i5 k$ \+ p. e - RTS
2 i. L4 H$ S( O: y }( y* B& z - : \. k2 o- i2 {% R" h
- ;================================================== t" I$ D2 f* [1 H( ~* Z" H" K
- ;IRQ处理2 v1 ^/ x/ g& ^, n* d
- IRQ_Process_By_Index7 P6 L3 s; x2 _) f0 B d$ i
- JSR IRQ_Set_Scroll
8 {7 Z, M1 A# `& u( g% I - JSR IRQ_Set_Ctrl% ]) b4 I1 `! R) C7 n& z& Q
- IRQ_Process_End2 q e/ y/ I; @$ j. U; S
- RTS
( @# @( n3 f; @! n# V" Q0 {, Y0 l -
8 n0 _4 I& N) H, ]! Y - .ENDM) D/ L& `( g8 ]0 `) l/ }1 e
-
( w; ^5 M; ^! F: z9 }) ]
复制代码 0 p& h- v3 t$ S; W) b# ^6 B' r1 H. S
3 {( {. Q y: `/ ~' \2 `; P5 I
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |
|