| 
 | 
 
 本帖最后由 yandagui 于 2023-12-2 17:37 编辑  
1 A( }2 m5 G, W- V$ E& c& P# `; M9 |2 I 
本次IRQ研究了如下:$ a4 ~% ]- c: g, b; s  F8 U 
VRC2&4(Mapper21,23,25)9 a$ a5 n0 N1 l: B0 n4 Q 
VRC3(Mapper73)' P4 c; H  k- U3 v 
VRC6(Mapper24 & Mapper26) 
' j* H, [: ^7 i- k5 n2 v9 YVRC7(Mapper85) 
4 A. m5 F% W: g* O+ `, MMMC3(Mapper4), y5 ]9 u- _& Z 
MMC4(Mapper10) 
0 W9 x4 v: f" ^$ [% _1 nMMC5(Mapper5), |, X1 m8 b6 P4 S4 A 
Mapper18/ I9 ?3 e3 e% u& v; l7 E/ Z 
Mapper64* X9 W6 @4 Z9 Z7 F3 Z% F 
Namco163(Mapper19) 
, p' o# c) t: o0 ?Sunsoft FME-7(Mapper69) 
4 w' a$ f8 o9 r6 r- q3 J" |+ D: ^; I3 g) s, s5 ~* \6 l 
共计11种Mapper的IRQ操作使用例子) s; S2 M5 B" p1 M6 k" Y! u- Y2 Q 
代码内有详细注释, 希望能帮助到感兴趣的人. 
4 w4 Q" H  S- f; ~) _' y# i0 F7 }/ \  n' G/ S$ R 
    
# X% R- d( c! G- {3 Z* k! ] 
5 ]8 W* q2 u; e7 RMapper代码主要逻辑(以MMC3为例): 
7 r5 k, N! Q5 z9 [+ X 
5 W; v! V/ Z6 H9 ]- v! O1 p5 \/ m- ;==================================================2 X8 n2 h- X- w0 T; O
 
 - ;Mapper号
 
! O4 z% T2 S2 \$ A6 M - MAPPER_NUMBER           = 04
 
! w; V' B' [) Y1 Z2 `. `0 F - ;==================================================# V( m3 B- {, p4 `% h: P" ^
 
 - ;MMC3 (Mapper 4) 寄存器常量% t: j6 Q- g2 M: K8 \+ t
 
 - MAPPER_REG_BANK_CTRL        =   $8000
 
: Q9 Y4 H: O  Y3 \1 t - MAPPER_REG_BANK_DATA        =   $8001
 
( m/ c4 p- f( E* I0 s/ e - MAPPER_REG_MIRRORING        =   $A000
 
6 _5 H% P/ B- q" s( }" M - MAPPER_REG_PRG_RAM_PROTECT  =   $A001
 
5 C- \( d# p- k* g% q - MAPPER_REG_IRQ_LATCH        =   $C0006 F7 {: w' V% ~- e* c% ]" z
 
 - MAPPER_REG_IRQ_RELOAD       =   $C001
 
4 }  o1 S5 d4 q& ?. A - MAPPER_REG_IRQ_DISABLE      =   $E000
 
) k, ~3 V5 S6 z - MAPPER_REG_IRQ_ENABLE       =   $E001
 
7 v! x+ Y4 g5 ? - ;==================================================3 y7 B9 R7 H& |2 F, r+ D
 
 - IRQ_SCANLINE_BEGIN          = 135
 
9 n( D; p8 s" C9 m) c - IRQ_SCANLINE_1              = 8
 
) i: z, J5 ?+ s, M0 Q. M  S - IRQ_SCANLINE_2              = 54
 
& {/ a$ R" Q% L$ {1 Q - IRQ_SCANLINE_3              = 86 [4 f; `. X, q" [) ~, z
 
 - ;==================================================
 
+ |% B9 q& S) G- c9 d* |0 \! ^  
" O8 d/ F  g1 B: ]3 m  e) A7 u- ;====================================================================================================! _+ X2 b$ S0 _
 
 - ;宏常量- s7 |" k( Y  n9 ^1 [* Z$ \' `
 
 - ;====================================================================================================4 o. L: L$ p! p6 W% s( X2 |
 
  
. V* }$ u( b4 G7 v- ;====================================================================================================
 
; |8 A! b4 [0 y* u3 U; w - MACRO_MAPPER_INIT .MACRO& _9 c6 i  s$ W9 l& R1 _4 e2 P# ]$ @
 
 -  ;禁用IRQ
 
4 \, h2 i3 @5 E( e- K7 X" u, h7 U5 a -  STA MAPPER_REG_IRQ_DISABLE
 
$ ~1 P2 Q0 b6 e -  8 A" I  f% l! W/ U2 y$ {( |
 
 -  ;水平镜像
 
3 a; V! D' n) N# Q- ^2 { -  LDA #$01
 
4 Y4 [+ Y! n- Y& r% A6 y; G! r -  STA MAPPER_REG_MIRRORING
 
- j$ }$ r- `7 `( X$ H -  - \& a$ v$ u5 R$ V
 
 -  ;初始化图形bank
 
9 H8 l" \0 d, U+ o2 v! r -  LDX #$052 s& G$ u2 I/ h+ P6 T$ d
 
 - .Init_Chr_Bank) b7 H  Y. U! s4 \$ L5 ]
 
 -  STX MAPPER_REG_BANK_CTRL6 j8 n2 N8 Q- \3 P6 N$ h/ e
 
 -  LDA .ChrBankData,X
 
( x! B$ X0 e3 w/ ^ -  STA MAPPER_REG_BANK_DATA! k6 O! T9 H" C% \% {, x( j
 
 -  DEX5 f, l. i! G9 [0 n* L
 
 -  BPL .Init_Chr_Bank4 u2 u0 e" @( |- a- n
 
 -  JMP .Init_Chr_Bank_End+ i5 _, m/ k' K( k
 
 - .ChrBankData* B+ W, n# Q* ?% k. @# h3 K
 
 -  .DB $00,$02,$04,$05,$06,$07  V  P% f- X8 r  b# Q
 
 - .Init_Chr_Bank_End
 
- G" v8 J1 l! g9 Z# @ -  " g% }# v- Q5 [. \' x3 I" D. [
 
 -  ;启用SRAM" t" G2 E' O6 |6 B
 
 -  LDA #$808 D: d' o) }0 N. ?
 
 -  STA MAPPER_REG_PRG_RAM_PROTECT
 
  f) o0 P2 b+ D; A6 C# T -  .ENDM0 ]- ]7 ~( ^& K5 O: r& Y" F. c0 b
 
 - , \8 a& y: c( ~5 e- A. F8 \
 
 - ;====================================================================================================# X- I- P  m' M  K+ u6 w
 
 - MACRO_MAPPER_SOUND_CLEAR .MACRO
 
9 }, ?5 x9 N% O% g -  .ENDM
 
/ s) |7 v4 w$ a0 u) {# l -  
 
2 q" Y* m; J; G) a. T% @  ]7 ?6 K - ;====================================================================================================1 i8 R9 `. Q( F6 L( I8 M
 
 - MACRO_SRAM_ENABLE .MACRO- Z" Q9 |/ b: W' Q6 q+ f
 
 -  LDA #$806 }: H0 b5 G7 U/ U$ S: m
 
 -  STA MAPPER_REG_PRG_RAM_PROTECT
 
8 _2 b& G4 E, S' ?% D- a# W. b& K -  .ENDM. `% ~, i1 K& G! }  h
 
 -  
 
: C: `7 M) {- K( l! T% ^ - ;====================================================================================================$ E9 x) a; w, z- s2 b) l. X6 e
 
 - MACRO_SWITCH_BANK_8000_A .MACRO7 i) K! @$ a7 B9 f
 
 -  PHA8 W$ z& `$ k/ c
 
 -  LDA #$06, h  F. e( t, C) I+ Q- D* H
 
 -  STA MAPPER_REG_BANK_CTRL; q; X/ t/ W6 `2 i% ?
 
 -  PLA
 
8 X: t) W1 b" q  ]) m4 g5 S -  STA MAPPER_REG_BANK_DATA' X7 m* o! h- [" K; Y7 r% C6 Q# f/ [
 
 -  .ENDM
 
1 [; R, \: {6 U# ]3 ?0 v! w - 5 ]& J1 V* U1 F* V0 T* P$ e
 
 - MACRO_SWITCH_BANK_A000_A .MACRO% @* p: ?8 C- c' B2 l; A8 z$ r
 
 -  PHA' W" x& K; O& N& Q1 q
 
 -  LDA #$070 }# ]; P- N; w3 d
 
 -  STA MAPPER_REG_BANK_CTRL" S7 x4 }6 v8 Y$ N! Z/ T! {: S0 @
 
 -  PLA
 
: D' n4 n7 R" i0 k -  STA MAPPER_REG_BANK_DATA) S+ h6 m% G9 J* |" D
 
 -  .ENDM
 
4 ^/ Q0 o& W9 ~$ K' T8 l; A -  ) t5 ~# a; ^. K$ B" e' c
 
 - MACRO_SWITCH_BANK_C000_A .MACRO
 
, ~9 K- l+ j0 L2 X4 f -  .ENDM
 
( R. G# T- Z) u, J$ {' m - 0 a+ v& J- w/ n
 
 - MACRO_SWITCH_BANK_E000_A .MACRO
 
- d3 V( b/ E/ w+ v: ~6 y -  .ENDM* |+ F: W8 d( R* E2 d0 W
 
 - # [2 s2 M4 b1 ]8 b" U8 R
 
 - ;====================================================================================================
 
4 E; I( _& s3 v8 j, F. Z+ K4 H - MACRO_TRIGGER_FIRST_IRQ .MACRO
 
1 \1 A4 k7 t  b* v! Q8 Y$ c -  LDA #IRQ_SCANLINE_BEGIN + 1
 
0 X( z# }: ]3 D+ h/ b -  STA MAPPER_REG_IRQ_LATCH
 
2 O/ J7 ?1 o! y& k' V) J, z* R" N -  STA MAPPER_REG_IRQ_RELOAD
 
8 b. z( O" c: t& y9 A -  STA MAPPER_REG_IRQ_ENABLE
 
* t7 U! \3 T5 r% S8 |- l! S: q1 r7 t -  CLI
 
' E0 ]  U+ w. m& @) P( ?4 o -  .ENDM
 
( x) w6 v% ?& r1 k0 V -  
 
: z  u0 a9 b7 j& y" i - ;====================================================================================================
 
7 j" i  J3 `5 n, d2 v% t) d - MACRO_ENABLE_IRQ  .MACRO3 A. @  w# O  I% y5 T4 E' Y
 
 -  STA MAPPER_REG_IRQ_ENABLE8 j6 W" G0 n4 t' v
 
 -  .ENDM
 
8 Z/ [4 x- U/ y( J. _) e -  3 @7 h* T) k: d: J: `6 U5 q
 
 - ;====================================================================================================
 
; ]6 u- o5 K# J - MACRO_DISABLE_IRQ  .MACRO9 O8 E6 V: Z2 @/ E1 {5 t! O
 
 -  LDA #$003 F1 f; Z( n6 A7 u4 E; V" ]2 U
 
 -  STA MAPPER_REG_IRQ_CTRL
 
5 w, }; T4 w/ o6 z4 j- D -  STA MAPPER_REG_IRQ_ACK- l( Q1 e; O; [! X4 p3 y  H" c0 v
 
 -  .ENDM; A) l& R7 N) ]0 K2 `- V
 
 -  0 T+ n2 `/ g% [8 N# Y
 
 - ;====================================================================================================
 
. h# l4 }  h) E - MACRO_ACK_IRQ .MACRO% L2 @+ b' ]1 Z2 G
 
 -  STA MAPPER_REG_IRQ_DISABLE$ n# p: S2 f) T. B- ?% b& c
 
 -  STA MAPPER_REG_IRQ_ENABLE
 
$ Z; `# u- m* u' u; J3 s' O0 V -  .ENDM! F4 f+ D* p0 B: Y
 
 -  & |2 n; d4 K1 T1 Y- W0 E) R7 g1 l
 
 - ;====================================================================================================! r$ ~  G! K8 {" ]: S
 
 - MACRO_IRQ_OPERATE   .MACRO7 C5 t/ G9 {" y! E
 
 - ; N3 V4 V) T# F4 i6 ?0 M
 
 - ;==================================================
 
% @: }' x8 s$ ^" C+ n6 `; {% I - ;IRQ滚动模式常量& {8 t' u% P4 ?+ p: P3 Y
 
 - IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
 
. I. U7 g3 s& t9 N- J2 k, [ - IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动* Z/ ^- z( [) W; Z1 K
 
 - IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
 
) p2 z, o+ N4 d8 Y& i - ( q" H0 i! U+ g
 
 - ;IRQ扫描线数据
 
: [* z' r/ }8 B" y/ ]% w( | - IRQ_Scanline_Data% ?5 d1 f& q6 Y$ L4 Q
 
 -  .DB IRQ_SCANLINE_1
 
7 q0 j1 N2 e% Q9 R -  .DB IRQ_SCANLINE_2( H& d; ]/ W( n( J' F
 
 -  .DB IRQ_SCANLINE_3
 
' g% n# Q6 o# k- f) ~. \ -  .DW 00 ;关闭IRQ) K6 n- ^# _2 x4 N; D# `
 
  
4 K2 m7 f: L8 ?5 i/ u  c! m- ;IRQ滚动控制模式( S; U/ R& I: M3 k" g) p
 
 - IRQ_Scanline_Mode: X( N( {1 ~$ [( n( w
 
 -  .DB IRQ_SCROLL_MODE_RIGHT
 
; J% _/ x" @7 T5 ^0 [& r -  .DB IRQ_SCROLL_MODE_LEFT# v% E0 L& J" s2 j
 
 -  .DB IRQ_SCROLL_MODE_RIGHT
 
3 C( ~5 \2 s& g3 x# n8 B! M' w( p1 C -  .DB IRQ_SCROLL_MODE_LEFT
 
& [3 x' F' C* \% X, W7 B -   R2 y$ b% }! z  Z+ f  P7 W4 l
 
 - ;==================================================4 n$ g" ?6 [' ]# h- X, \7 R
 
 - ;;IRQ滚动控制8 ^: A1 R* _* ?/ ^7 ~, m9 u
 
 - IRQ_Set_Scroll
 
5 N) w/ ?; p% K1 L. A- s3 W2 {8 [ -  LDX IRQ_Process_Index
 
8 x0 x" Q  s. X4 }; k1 S2 i -  LDA IRQ_Scanline_Mode,X
 
0 p  s1 ^/ g$ g3 [0 t- p1 i8 @$ q -  CMP #IRQ_SCROLL_MODE_LEFT, s) z8 Y: }  x' h
 
 -  BEQ IRQ_Set_Scroll_Left
 
" Y( u1 z9 q: c5 @6 r -  CMP #IRQ_SCROLL_MODE_RIGHT
 
8 i( x9 ~( v. h5 i* O -  BEQ IRQ_Set_Scroll_Right
 
6 \( O+ |6 v& s" s- V - IRQ_Set_Scroll_Zero;不滚动
 
' l9 \( g' g  p2 E* O -  LDA #$00! v& x, {) C0 [6 a% w. w  p% s/ Q
 
 -  STA PPU_SCROLL
 
( q( m3 O0 Q! ]0 D# d5 n5 z; @0 \4 m -  STA PPU_SCROLL
 
0 G# i5 P1 K1 Y$ ~& |7 e5 | -  RTS
 
7 q7 A! V! r' s& I3 q# _! C - IRQ_Set_Scroll_Left;向左滚动% S1 q" Y- Y3 H
 
 -  LDA Scroll_H
 
& I* a) U$ g& ] -  STA PPU_SCROLL. K3 v& N5 {9 T2 q" P
 
 -  STA PPU_SCROLL# b5 ?9 r8 Z- _) S( @
 
 -  RTS
 
1 w. s- C( ]3 f, \ - IRQ_Set_Scroll_Right;向右滚动  s+ B' _2 K: g' j
 
 -  LDA #$00! p/ K- u$ l- I% u' n
 
 -  SEC
 
+ F# S3 L; f" i2 p! \- M5 U# @ -  SBC Scroll_H
 
5 O2 r/ p% ?/ @: [5 X& a; N -  STA PPU_SCROLL
 
- c2 l9 V" t& T9 R -  STA PPU_SCROLL
 
7 A% s$ V  M1 @5 ~ -  RTS
 
3 r( r  s( b2 s- |4 m4 U! D -  3 c5 a% ]6 d* E8 o$ W& P; W; W+ o
 
 - ;==================================================
 
9 H1 C3 \; s, t  [; ^ - ;;IRQ滚动控制
 
1 _" x- u. |9 C; ]1 j0 a$ }1 t - IRQ_Set_Ctrl
 
! Y, S, H) D1 m) Q. U/ z" u -  LDX IRQ_Process_Index
 
; o7 I7 ~5 I2 w( f* Q) R -  LDA IRQ_Scanline_Data,X7 g7 @( a9 [+ c1 @5 [& i( d& i+ s/ x
 
 -  BNE IRQ_Process_Latch
 
0 `5 w% |$ i  J- [! ~! ^$ M7 ] - IRQ_Process_Disable;禁用IRQ$ M( W( V* d: u; q+ t6 O) \
 
 -  STA MAPPER_REG_IRQ_DISABLE
 
' Q, q6 r& c( b  z -  STA IRQ_Process_Index' L2 W+ @9 o& b  I, E  `
 
 -  RTS: B/ v( u0 w0 T6 f. c4 J- P
 
 - IRQ_Process_Latch;设置下次 IRQ 触发扫描线5 a/ b) w! E/ g, c5 S" D; W* p( e
 
 -  STA MAPPER_REG_IRQ_LATCH; o# ?( H" ~  ^: ?
 
 -  INC IRQ_Process_Index# T" L* q* u' |1 P3 C" f
 
 -  RTS
 
0 Y5 i3 ]8 z% ~  
0 s6 X) P8 p" Y8 E5 z/ ?- ;==================================================
 
, Y! c9 L, m  X& W- x - ;IRQ处理
 
: K1 e# u+ u9 r& K9 T( ` - IRQ_Process_By_Index" i! h* j% H" ]2 D4 m4 P1 i# ~
 
 -  JSR IRQ_Set_Scroll
 
7 {0 [) ]6 B, l. y -  JSR IRQ_Set_Ctrl! T, c( \8 \( X# ~2 K- F6 r
 
 - IRQ_Process_End( f3 p9 x6 ~: o5 L/ ^- x* I
 
 -  RTS
 
' X' m. F1 w8 c" {, X2 c1 F -  
 
  b: H% X8 R/ C. C' \. [* @ -  .ENDM
 
* j6 w" G/ o/ C6 Y5 m' C- T -  4 c( Z! C% F# J# F
 
 
  复制代码 & g1 Y! q7 X1 N, ? 
) T0 c2 l, |, r0 V& h 
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |   
 
 
 
 |