| 
 | 
 
 本帖最后由 yandagui 于 2023-12-2 17:37 编辑 & ?) c# a# H, X/ e 
1 |+ [0 P5 s% O5 H* \  ]/ f 
本次IRQ研究了如下:2 F5 @; g* U4 S- F  S& o0 a  ?; m 
VRC2&4(Mapper21,23,25) 
* Y7 I$ o$ d7 F9 }+ s* ~; u, rVRC3(Mapper73)( A( m3 ~: T: F2 t  w 
VRC6(Mapper24 & Mapper26)) b( k# B( O: K( ~% o" @! ^  _ 
VRC7(Mapper85) 
% u# X2 R7 N# l0 e: f9 D  I) z6 yMMC3(Mapper4) 
% k- U9 w& n! g, fMMC4(Mapper10) 
! M% P4 {1 Q5 r$ FMMC5(Mapper5) 
6 v2 _. y1 w6 g. m* eMapper18 
/ B: o3 c" a. f3 V5 `( oMapper641 f5 \8 H1 B& O7 |7 ^ 
Namco163(Mapper19) 
+ C; c( P+ H% U! d6 iSunsoft FME-7(Mapper69) 
  \8 P/ u2 B# Q( z( J" C  h 
9 _5 L) s; K: P共计11种Mapper的IRQ操作使用例子; e3 K0 M3 c9 H8 g7 b1 n# t( R 
代码内有详细注释, 希望能帮助到感兴趣的人. 
( \2 u( r" X/ s+ A 
( M* `7 O8 \8 ^# d) F   6 K5 o: S7 ?; F+ M2 [ 
 
2 {) ^2 U( f$ N) Z+ BMapper代码主要逻辑(以MMC3为例): 
4 i8 [; u! d* b' k5 E4 z3 X- * z8 o$ J4 V- |
 
 - ;==================================================
 
( B! g2 ^# F6 D' P1 s% ^" C/ R - ;Mapper号. i- d5 d( \& |3 o7 u" e7 K
 
 - MAPPER_NUMBER           = 04( H+ Z7 }6 L& b: S" l/ |4 F% y7 J
 
 - ;==================================================7 y; k- j% {7 Y" q, K
 
 - ;MMC3 (Mapper 4) 寄存器常量
 
: \/ ?. P5 \+ b- O - MAPPER_REG_BANK_CTRL        =   $8000- h$ T3 u3 U( R' V
 
 - MAPPER_REG_BANK_DATA        =   $8001
 
- ^* a. K/ H: v2 e; f- v7 N - MAPPER_REG_MIRRORING        =   $A0007 W/ `3 c3 f8 _" T3 T* Z
 
 - MAPPER_REG_PRG_RAM_PROTECT  =   $A001
 
3 @! a& U' [; H& U - MAPPER_REG_IRQ_LATCH        =   $C0003 b! S4 Y& V  f# U/ a2 n( I
 
 - MAPPER_REG_IRQ_RELOAD       =   $C001
 
- N) V* h4 t' }/ j+ I; ~% E6 {; x - MAPPER_REG_IRQ_DISABLE      =   $E000& R, M1 p4 R- M3 ?$ L  w0 K
 
 - MAPPER_REG_IRQ_ENABLE       =   $E001! i$ ]3 }: V5 P* J- Q: d  y1 C5 [
 
 - ;==================================================' g4 M+ F8 a& E2 ^" M9 }4 n
 
 - IRQ_SCANLINE_BEGIN          = 135
 
  t- H) j8 v. c/ `% }( V6 t - IRQ_SCANLINE_1              = 8& E4 r, a! Z- K( S: E5 e& Q0 O6 n5 p
 
 - IRQ_SCANLINE_2              = 54
 
7 ~) x2 @0 K1 u( o' O. K; a - IRQ_SCANLINE_3              = 8( r. `3 |2 J! n2 V. F- Z' P
 
 - ;==================================================8 J1 e+ b- N2 L* Q1 h
 
 - 4 l3 G0 a' A% H: g' o7 s
 
 - ;====================================================================================================) D0 T. ~' V, c# T' g  ~3 l
 
 - ;宏常量
 
9 ]  i% }. }) D- N - ;====================================================================================================
 
5 u- D1 Z8 U/ ]3 M0 W8 \. Y1 B5 d9 n  
; F# _1 T: E1 e+ E- ;====================================================================================================
 
* |' S$ I9 _  h1 J+ M - MACRO_MAPPER_INIT .MACRO! H' R' M2 @+ C
 
 -  ;禁用IRQ" C4 v6 T$ p1 {5 {" |% L
 
 -  STA MAPPER_REG_IRQ_DISABLE  m& `- I+ S3 C' I) X! x2 B
 
 -  3 b! m- }* z( `  H
 
 -  ;水平镜像+ b8 \: T$ p! B3 ^. h- s6 E6 d3 y
 
 -  LDA #$01
 
0 v  e0 O( _- ~+ U, P# T! }! b -  STA MAPPER_REG_MIRRORING
 
6 {9 F/ D9 t: j( g  _ -  
 
, J- x& J$ S2 Q2 `! ?- m; r4 | -  ;初始化图形bank
 
. B/ H; [' i& S1 g! r8 H! y+ Y -  LDX #$05( S8 {' n6 \' _2 h6 B
 
 - .Init_Chr_Bank* A  P) a( N$ z/ {
 
 -  STX MAPPER_REG_BANK_CTRL5 @8 q1 S- y: Z$ g3 Y6 V
 
 -  LDA .ChrBankData,X/ u, L$ N2 m* j+ [  v" s, {1 n
 
 -  STA MAPPER_REG_BANK_DATA$ V; H$ u. h+ I( l
 
 -  DEX
 
/ d3 H2 i7 K. E -  BPL .Init_Chr_Bank
 
  s6 G  l# [- a8 G+ ~8 M -  JMP .Init_Chr_Bank_End1 s* E, D  `! o( s4 V) C5 ?+ X" ~
 
 - .ChrBankData* `1 F9 M% T6 M- Z, y/ C! E/ d
 
 -  .DB $00,$02,$04,$05,$06,$07
 
; N  N0 O. L! W4 w. |! y - .Init_Chr_Bank_End/ A* e' c3 t2 l% a% H1 Z: X
 
 -  + S; I2 k5 ~9 g8 h& l$ T
 
 -  ;启用SRAM0 z0 B+ l! E1 a& f9 y
 
 -  LDA #$80. a1 }+ s8 z! \# X* Q/ s
 
 -  STA MAPPER_REG_PRG_RAM_PROTECT5 ~6 f6 c5 S2 v/ _; ^: k
 
 -  .ENDM$ s0 c1 o! y2 _1 I
 
 - # w2 [) w  @/ y- L1 r! t
 
 - ;====================================================================================================
 
. _4 F9 _' q/ F& D8 l - MACRO_MAPPER_SOUND_CLEAR .MACRO% |- N1 R, x+ W
 
 -  .ENDM
 
+ _0 j  T7 U+ _ -  % Z' i4 m7 K. D2 N) j
 
 - ;====================================================================================================- F5 q$ v# J) D! i- \+ L
 
 - MACRO_SRAM_ENABLE .MACRO; S" D: _/ D1 Y- i
 
 -  LDA #$809 F3 ~8 C! L# D3 D$ d+ Y/ l
 
 -  STA MAPPER_REG_PRG_RAM_PROTECT
 
3 i! y* X1 g4 P+ P, N/ F -  .ENDM
 
% k. H( Q5 A: d! M# i5 k  T -  ( ]0 y6 ]. m9 A' j- c5 R
 
 - ;====================================================================================================3 U( ~% |% X- k% }+ z3 f
 
 - MACRO_SWITCH_BANK_8000_A .MACRO
 
( N9 m- d  b  o5 u; o$ i' r6 r2 r -  PHA
 
7 S; ~9 ^7 _" \; F" j- u7 z% c -  LDA #$06
 
1 h- a4 s) B/ R7 Z -  STA MAPPER_REG_BANK_CTRL  g1 i" @2 T& i9 H, g% M
 
 -  PLA
 
/ i2 k# ]4 [9 o- I. [% a -  STA MAPPER_REG_BANK_DATA
 
- P# u. B( j5 C% F! M -  .ENDM# r  p5 o: i8 K! n6 d
 
  
: O2 c- n: u: a! l! \1 W: A- MACRO_SWITCH_BANK_A000_A .MACRO
 
) v' ~7 J' V  P0 `2 i% e+ X. k -  PHA
 
! y: V! ]' @- ~. v! N' A -  LDA #$071 j6 X* P( g; N! j. Q/ Z
 
 -  STA MAPPER_REG_BANK_CTRL0 x5 e0 g( r$ U: J
 
 -  PLA$ b- H( o5 n7 }) L! P
 
 -  STA MAPPER_REG_BANK_DATA% y# m7 J+ S# F6 x0 ^7 B
 
 -  .ENDM3 _! s, R4 Z2 T' }: d
 
 -  5 k1 f0 _5 ]) Z; e# o$ u
 
 - MACRO_SWITCH_BANK_C000_A .MACRO
 
7 V, H& t5 N% p3 W, Y3 k -  .ENDM
 
  m* ]- P4 q* p  t/ D! t3 O - " C! I' F6 Q) `" o* K
 
 - MACRO_SWITCH_BANK_E000_A .MACRO9 N. q- `, u4 [: l$ P& I" h4 ^
 
 -  .ENDM
 
" t3 i5 n, F: ? - 7 b3 ~$ `1 X5 w- a! e0 U6 J6 O
 
 - ;====================================================================================================
 
: o9 h( j5 k/ R+ [ - MACRO_TRIGGER_FIRST_IRQ .MACRO
 
, u6 u# \7 S' {' O6 c -  LDA #IRQ_SCANLINE_BEGIN + 1
 
! W4 M& z/ h7 W& G% q3 k! k -  STA MAPPER_REG_IRQ_LATCH* S# X& o: E9 H6 k. v
 
 -  STA MAPPER_REG_IRQ_RELOAD
 
' |+ A; \% ^& r -  STA MAPPER_REG_IRQ_ENABLE+ k/ e; w. N4 v4 _' x; J0 C
 
 -  CLI
 
1 w9 X/ O; V: t8 P -  .ENDM$ r# v: F0 A' Y9 [# Q9 q5 p5 I' m9 g
 
 -  
 
+ E/ S& K! x5 y, a% E4 q3 X* E0 T - ;====================================================================================================7 |) u2 R! M8 _
 
 - MACRO_ENABLE_IRQ  .MACRO
 
& i2 [( @" F( k6 A -  STA MAPPER_REG_IRQ_ENABLE- B6 B& k  R' G4 \
 
 -  .ENDM
 
" A5 ~: r8 O) \  Y! ^4 _ -  & u, j) b8 J7 K* ^! X' E- ~' M6 r
 
 - ;====================================================================================================
 
+ v% K5 U7 b' X2 \# o - MACRO_DISABLE_IRQ  .MACRO
 
2 h/ N5 M% \3 W4 l" z( l3 _5 S) o -  LDA #$00. p( v7 l7 V% s9 y8 W
 
 -  STA MAPPER_REG_IRQ_CTRL
 
; T0 M5 W. e( W6 H8 O -  STA MAPPER_REG_IRQ_ACK7 O7 m( C2 t/ K4 c) A& ]2 s8 o
 
 -  .ENDM
 
9 K5 T) v5 z0 P5 u" A9 h5 K$ m -  
 
  a/ U! _2 _3 j! a) A% z& O9 b) d - ;====================================================================================================# [" k. ^3 j" w  k( U
 
 - MACRO_ACK_IRQ .MACRO
 
, d2 z# f6 s5 X3 Z7 g -  STA MAPPER_REG_IRQ_DISABLE
 
( V) ]9 ?, R& b1 I -  STA MAPPER_REG_IRQ_ENABLE
 
% v! W% D) t- v3 d% n# [, q -  .ENDM1 U8 }" _0 |9 C9 ~; x
 
 -  
 
0 U  J+ X, [( E- Z; p - ;====================================================================================================
 
- c/ v; O$ F- z# _/ E2 q/ S - MACRO_IRQ_OPERATE   .MACRO
 
7 D5 F8 V0 _9 {  
) i( s" b! p- ?- T9 y- ;==================================================
 
" Q7 Y& h8 ]7 H - ;IRQ滚动模式常量
 
9 x; Q4 Z" o8 ^3 y& s% o - IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动5 h( J$ o" c% v' l
 
 - IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
 
3 e3 y+ D$ h4 [6 n$ o - IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
 
3 D& n  a7 \/ g: c- U0 `; F( V - & p4 `& e3 {* @8 O# Y; z" J
 
 - ;IRQ扫描线数据! z9 {5 P, c7 m0 H" ?
 
 - IRQ_Scanline_Data
 
3 g( H3 a6 \3 n, m -  .DB IRQ_SCANLINE_1$ S5 y  a) M+ C' F$ m4 A9 i; ^$ a
 
 -  .DB IRQ_SCANLINE_2- f4 I& u* d1 W- U3 `0 a
 
 -  .DB IRQ_SCANLINE_33 X) c' K9 W" ~! _
 
 -  .DW 00 ;关闭IRQ5 J7 Q8 @6 Z4 s; O  w& w8 L; n; p- _
 
  
7 Q! L4 k8 D! m' V3 l- ;IRQ滚动控制模式
 
9 v% I1 A# P# y9 G - IRQ_Scanline_Mode
 
6 r* j2 t3 w3 w  k! Z! o; R7 }. W6 U -  .DB IRQ_SCROLL_MODE_RIGHT
 
& @. m; B0 y( V- S1 f3 \ -  .DB IRQ_SCROLL_MODE_LEFT/ U& {- m9 w: I% n
 
 -  .DB IRQ_SCROLL_MODE_RIGHT" \9 r1 L% x, ?' B; b- R
 
 -  .DB IRQ_SCROLL_MODE_LEFT' j7 S# X* d9 D& h# Y/ J
 
 - $ ~# Q6 a! f3 l: |
 
 - ;==================================================9 U' ^8 O* [: W, v8 i/ a
 
 - ;;IRQ滚动控制0 l! N8 o7 B6 q3 s2 e4 v
 
 - IRQ_Set_Scroll
 
/ e: ^4 d8 G9 R% d5 d1 I5 K -  LDX IRQ_Process_Index9 B" g3 s+ V2 d% I
 
 -  LDA IRQ_Scanline_Mode,X: r$ T# W$ o- D
 
 -  CMP #IRQ_SCROLL_MODE_LEFT
 
  Y4 F2 u3 T+ v: ?  N- J" u -  BEQ IRQ_Set_Scroll_Left8 Y- ?& Y! A& f* n5 U( M
 
 -  CMP #IRQ_SCROLL_MODE_RIGHT) [* J/ A0 y7 W+ c' [: f) Z2 g
 
 -  BEQ IRQ_Set_Scroll_Right
 
* q( ^4 X! w; n5 K, ~& N3 C( r0 m0 R - IRQ_Set_Scroll_Zero;不滚动+ {$ Y3 k, I4 {" Q# M, r- g
 
 -  LDA #$006 _9 o, j/ G- k1 y& U1 c. b; ^
 
 -  STA PPU_SCROLL5 ~. ~9 Y* [" G% r6 u, v
 
 -  STA PPU_SCROLL# ^  q" w+ B/ U' [/ j. S2 {" @
 
 -  RTS
 
) {; w: _& V" c: m7 K6 A& X - IRQ_Set_Scroll_Left;向左滚动9 q7 F. l, I" B8 ]& Z8 T4 x' ~: \
 
 -  LDA Scroll_H0 I' }5 Z  m# x
 
 -  STA PPU_SCROLL
 
7 Z! U8 r; b5 V1 X' A -  STA PPU_SCROLL2 V' a3 X6 N6 B; S) N  n% o
 
 -  RTS" ~( ]7 M4 Q6 `) H, j8 |
 
 - IRQ_Set_Scroll_Right;向右滚动, ]. U: I" v( l% p
 
 -  LDA #$009 T3 A' N# b/ O
 
 -  SEC+ x: H: X  d: {# k3 e  o( v
 
 -  SBC Scroll_H
 
6 S; n& l1 N3 U5 Z -  STA PPU_SCROLL( [* c. j$ i! Y  Y: V) _1 \
 
 -  STA PPU_SCROLL( h7 U7 q9 L) R7 w+ ^- r
 
 -  RTS, W" w7 \$ _; q7 v8 a7 }! r
 
 -  
 
# _6 a( }) d# R( }' K6 @ - ;==================================================
 
0 S1 R* Z/ O4 K - ;;IRQ滚动控制( g0 z9 X( M  f% k2 V+ e. N
 
 - IRQ_Set_Ctrl
 
5 o, w' K( _* x; `8 j# ?  d0 V- j -  LDX IRQ_Process_Index" C1 B0 G; l! z0 R% r8 Z6 @# p/ p8 U( Q
 
 -  LDA IRQ_Scanline_Data,X
 
3 t! `) X5 ]$ _" Z -  BNE IRQ_Process_Latch* u& I' D) k' K* j, Z- V" d0 n
 
 - IRQ_Process_Disable;禁用IRQ
 
  e* K4 R+ L% M  t -  STA MAPPER_REG_IRQ_DISABLE
 
& e4 Z; n* c' l# w -  STA IRQ_Process_Index5 ]/ e2 K* f  r  l" t( T
 
 -  RTS
 
1 w9 V' R* J8 p - IRQ_Process_Latch;设置下次 IRQ 触发扫描线* B# e' i1 t6 Z% |
 
 -  STA MAPPER_REG_IRQ_LATCH
 
! [2 }9 m6 b6 d- }5 \/ J) H -  INC IRQ_Process_Index
 
, z" o/ `8 I! m# k8 [ -  RTS
 
' g7 s3 g6 Y0 D1 u - + [4 F8 x# S  A' n( Y
 
 - ;==================================================
 
2 m; n# o1 k: A - ;IRQ处理
 
& i6 ]) b$ k% U7 V - IRQ_Process_By_Index
 
+ _) R5 C+ E' x4 k -  JSR IRQ_Set_Scroll
 
# P& U3 ]7 L* a -  JSR IRQ_Set_Ctrl
 
. e+ H6 |, V0 E% z3 s& T" z - IRQ_Process_End! y* N& V4 A1 Y& r! Y
 
 -  RTS1 |: _) H0 C% o: D8 B  e
 
 -  . J7 b6 X& ~" L5 f* {" ~
 
 -  .ENDM1 O3 i* j+ B% |1 U- V8 e, o
 
 -  ( ]' T$ ~) y7 K0 y, h5 s
 
 
  复制代码 
  i' d5 ~7 d: v  x, O9 {2 G$ u( y 
& ^9 H1 M: O5 C代码仓库地址: https://gitee.com/flame_cyclone/fc-irq |   
 
 
 
 |