设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 349|回复: 0

[原创] [FC][常见Mapper IRQ研究]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 9 F: r0 Q) @: T9 N& `$ u

& r- O  l% u" D/ Y4 i1 R% Q. S本次IRQ研究了如下:& F, S# E& E4 n! m# [7 R4 M
VRC2&4(Mapper21,23,25)3 \( ^; @! g2 y* ^7 i3 M5 G
VRC3(Mapper73)7 C% F! V) U9 I  @: ~4 H
VRC6(Mapper24 & Mapper26)
  v* R/ M1 ]) HVRC7(Mapper85)
% o/ P+ C- Y  [# s7 T" R' C/ tMMC3(Mapper4)* q1 o" S; m2 [
MMC4(Mapper10)
* ^' L9 e0 a' `# G% qMMC5(Mapper5)
" H  m6 z9 Y: }  G& PMapper18
2 e" N/ W7 h$ c) @Mapper64
; q* @2 y9 m9 S3 kNamco163(Mapper19)
0 O: M" y7 ]+ [9 ?0 y/ i6 sSunsoft FME-7(Mapper69)* h+ A# F3 f) Z+ x0 f7 p
) S+ p' n. y0 I5 U  b
共计11种Mapper的IRQ操作使用例子
$ I' v: S/ f' w1 N" ~& l& x代码内有详细注释, 希望能帮助到感兴趣的人.5 K: E! G- |5 `6 A
. x  y8 R/ k/ h" _

: m  q! ]) j$ H
  O# ^& v+ h; P: W! J9 iMapper代码主要逻辑(以MMC3为例):
( `' z" ~8 ^$ O. z! j% N0 s
  1. + s; {) s+ l' K1 V! k& b2 Z
  2. ;==================================================
    , h# @, o& q7 v
  3. ;Mapper号
    4 c8 H3 x( F) c; s0 }& Z
  4. MAPPER_NUMBER           = 047 |2 G$ ^/ `. C* I/ u5 |+ s
  5. ;==================================================
    0 @# p) @7 ]1 c+ }# w; ^
  6. ;MMC3 (Mapper 4) 寄存器常量
    $ h, ?/ C( o3 e  J6 x: i3 a" ]7 Y# ?
  7. MAPPER_REG_BANK_CTRL        =   $8000
    - a/ }+ e/ K7 z, `1 B/ C2 |
  8. MAPPER_REG_BANK_DATA        =   $8001
    2 d/ B0 J, R/ t4 c" x2 j$ \0 R
  9. MAPPER_REG_MIRRORING        =   $A000
    ' K0 p1 _+ W3 m/ j+ R" B
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    & N$ v- y) R, a% d/ F+ P$ F* J# }8 q- T
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    / x, Y, Z$ G2 u2 V! a, c/ t( Z
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    7 z3 v  O( }# k0 T) t! q+ Y
  13. MAPPER_REG_IRQ_DISABLE      =   $E000" ]# [+ g, e0 R9 b! L2 U8 h4 V
  14. MAPPER_REG_IRQ_ENABLE       =   $E001% g: T# c5 U- o/ S- D( m! u8 l
  15. ;==================================================7 s$ w5 [1 ]8 Q' \* Q
  16. IRQ_SCANLINE_BEGIN          = 135
    0 |4 F' n9 w& a, N8 A& `( Y4 e5 I
  17. IRQ_SCANLINE_1              = 80 U" G* N* `$ B+ I% O$ ~  o) b$ X
  18. IRQ_SCANLINE_2              = 540 d/ \8 P: |- {6 o
  19. IRQ_SCANLINE_3              = 8# s' f! A  X0 u
  20. ;==================================================! x! p4 O$ o0 \& ^! }

  21.   p3 R' R: L# M( C
  22. ;====================================================================================================/ T/ c) Y- l3 V/ T+ ]: P( J9 @0 n, B
  23. ;宏常量
    4 c- X+ k/ N$ V! ?2 |( H' O
  24. ;====================================================================================================/ D1 P; T' K1 F0 d

  25. ) I' \6 w7 X" w" o1 B8 S0 x
  26. ;====================================================================================================2 S; Q5 c( S+ r- c1 [% ?4 G3 ~+ |& `
  27. MACRO_MAPPER_INIT .MACRO3 ^% W  f4 w3 N/ _& N
  28. ;禁用IRQ' T' a6 v: x( i* `2 D
  29. STA MAPPER_REG_IRQ_DISABLE. q1 d. |0 n! O7 E9 J
  30. ) ~; z$ @- w& ?9 x; ~, a! m
  31. ;水平镜像7 t8 s4 p0 K7 d1 c$ A' m% m
  32. LDA #$01
    , N0 s" ^& b3 P. X. y
  33. STA MAPPER_REG_MIRRORING3 V- \2 Q1 O5 I$ I# l
  34. ( r0 \% h8 G9 S% S, b' F
  35. ;初始化图形bank! j9 a5 B5 ]0 {3 [! h
  36. LDX #$05
    5 a. M% R& w3 Y0 }# ~
  37. .Init_Chr_Bank0 l- S# T6 |9 w. ]# V0 r- [' b
  38. STX MAPPER_REG_BANK_CTRL. u/ K5 m; s' A8 s* O- ?
  39. LDA .ChrBankData,X3 N# w6 W2 j: o# W2 b, e
  40. STA MAPPER_REG_BANK_DATA
    7 B  T+ [7 m8 V( x" Q
  41. DEX
    & T1 S$ k8 e6 ?# ^
  42. BPL .Init_Chr_Bank4 E  w$ ]7 r8 o
  43. JMP .Init_Chr_Bank_End5 `; u' X" w3 h% s
  44. .ChrBankData
    ) M( e4 K7 j$ W4 v! x% B
  45. .DB $00,$02,$04,$05,$06,$07, S6 X: N* M+ `+ ^. q. J/ k
  46. .Init_Chr_Bank_End0 ^' b+ z$ Y* Y* p; Q

  47. . x8 b  P3 G8 n% a" d
  48. ;启用SRAM
    2 d2 E, O. v; W% Y( h) Y3 {
  49. LDA #$80
    $ J6 H2 ~9 A: k" f1 f! E! r% C
  50. STA MAPPER_REG_PRG_RAM_PROTECT9 A2 T4 J/ S4 u3 S: j
  51. .ENDM
    9 f6 G- r! h( [
  52. % h0 ?: c) w' ^% |
  53. ;====================================================================================================+ J0 C- ]" l; G$ I+ E6 s2 Y
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    ) n# `: ~- _; J/ ?4 D- P
  55. .ENDM2 @0 s* Z- r+ H- A6 X8 y6 {# x, G$ u

  56. ' B. y0 S/ H, |7 H) ?4 t; E' H& }
  57. ;====================================================================================================0 _; C' c1 b$ J6 i/ T$ x. }
  58. MACRO_SRAM_ENABLE .MACRO
    ' F" N/ L# i, c3 O
  59. LDA #$80; {% {/ s! T0 p- l0 H
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    7 o6 g7 g7 a. v$ w" {6 s
  61. .ENDM
    # B" f/ F; ?& y7 D. K
  62. $ t7 b* U% s4 |9 C0 P' B( \2 d0 J
  63. ;====================================================================================================! \( [8 [% e# Y
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ) f. N+ ~% ?$ F
  65. PHA
    1 n1 I( N9 z' F6 D
  66. LDA #$06! c: O9 V" Y% Q' i4 `: H
  67. STA MAPPER_REG_BANK_CTRL
    # E+ n$ J5 w4 E7 I0 f& |
  68. PLA
    3 ^* \4 g2 B% `% K" ]
  69. STA MAPPER_REG_BANK_DATA
    ( {" z* t1 n" Q4 G8 J' E. E
  70. .ENDM
    ! m6 O; z1 f1 g& g. g* p8 r+ g0 ^
  71. ( E9 \- o. v0 c" x9 H. K0 J- D; B
  72. MACRO_SWITCH_BANK_A000_A .MACRO8 o, j5 }1 B+ d! @
  73. PHA
    ( H( D, M" e- K! g) p2 f5 O* W
  74. LDA #$07/ y+ C- m8 ?5 y* D+ t. Z( V. \% Z
  75. STA MAPPER_REG_BANK_CTRL6 C- O3 H' i$ U. B+ ^
  76. PLA1 @& t: X: u; }/ ?9 g
  77. STA MAPPER_REG_BANK_DATA2 l9 t" @: r! W
  78. .ENDM
    5 X7 `$ C' a* F8 _' V9 p
  79. # Y" O+ r+ I# j& |  x6 x& l
  80. MACRO_SWITCH_BANK_C000_A .MACRO3 O/ d7 \+ {! C1 V" e7 t! f
  81. .ENDM, P$ ~# |& e) n/ ~; ?
  82. 8 k1 E" O- r, y* f- X
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    ( v& f/ W. _. x% ^
  84. .ENDM
    9 T  r* k3 L+ k1 i

  85. / N$ k7 V5 O# k2 L, k( h& T* C
  86. ;====================================================================================================
      S# r8 x* Q5 ]' w
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    4 v' C2 W5 p  q+ v- P5 `
  88. LDA #IRQ_SCANLINE_BEGIN + 1/ I, \( b9 Y) L  _6 V$ I
  89. STA MAPPER_REG_IRQ_LATCH
    : _- O, X- J9 f+ q- `
  90. STA MAPPER_REG_IRQ_RELOAD
    ( Q# J& U/ T; Q2 }+ E1 A
  91. STA MAPPER_REG_IRQ_ENABLE
    3 O  t" `7 c6 ]  U5 {% t& G
  92. CLI1 ~  X5 t/ B* C- i
  93. .ENDM
    ! X( y8 n; Y+ M2 d6 F: G: [, T

  94. , S5 b/ I, y9 h9 L
  95. ;====================================================================================================# T0 E6 y, L8 i- U( @7 \/ l
  96. MACRO_ENABLE_IRQ  .MACRO0 |6 N( Z3 x! `: Y: u- t- W% R
  97. STA MAPPER_REG_IRQ_ENABLE
    ! A& }2 a4 z. J
  98. .ENDM0 B6 A# H# I2 X8 ~6 h3 e0 A9 @
  99. : ~0 I: h6 Y8 s4 C" r0 f
  100. ;====================================================================================================
    1 _4 @7 A1 N! R6 K( o
  101. MACRO_DISABLE_IRQ  .MACRO
    , R3 L, a- b2 \" }& A
  102. LDA #$00
    0 _& R& K1 t4 T9 S% u
  103. STA MAPPER_REG_IRQ_CTRL/ b% m* l5 K' I0 r
  104. STA MAPPER_REG_IRQ_ACK$ n" c$ Z( @; o$ r0 n
  105. .ENDM" P- F9 p" q4 X4 `8 T# Z6 W
  106. ' R" M( j  b: X9 m3 W& z$ ]
  107. ;====================================================================================================& `0 S0 c8 n0 ~
  108. MACRO_ACK_IRQ .MACRO
    " q, e/ `, E9 E" l& @- e8 ?
  109. STA MAPPER_REG_IRQ_DISABLE# @/ |' f  ?7 m4 r( u5 x
  110. STA MAPPER_REG_IRQ_ENABLE
    : s5 F, {$ m7 c: b
  111. .ENDM4 b; e9 Y. L3 j( n. j; p

  112. 2 z/ }& |' ]) R/ s4 p8 q
  113. ;====================================================================================================- M1 j0 U! r1 y: m1 ^2 D+ t
  114. MACRO_IRQ_OPERATE   .MACRO) T1 h( f  E: C: @, \  z  c. V+ M6 W
  115. ' V1 u" M. _+ m9 ?
  116. ;==================================================( f- z2 O& X% T
  117. ;IRQ滚动模式常量
    . g* |( D0 B+ ~3 ^
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    4 z6 m3 G6 _4 P; w# }: f
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动. u- [# |  X8 l7 k% ~- d( S. H
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动7 I$ Z. K) K# u- W0 i
  121. 8 Z- V/ j6 s& o% u
  122. ;IRQ扫描线数据
    . R, v! C& x2 p# Q: W3 g
  123. IRQ_Scanline_Data
    " S7 Q( [# ~; A8 K6 g( p
  124. .DB IRQ_SCANLINE_1
    , c% @! z1 O2 o% C5 |; ?
  125. .DB IRQ_SCANLINE_2* B5 r' l2 M; G5 N! `& p4 n9 ?9 m
  126. .DB IRQ_SCANLINE_3
    6 _: |8 A3 _  U
  127. .DW 00 ;关闭IRQ0 Z; y3 h; |, R) E2 m
  128.   u5 d& S) j# j8 b4 K/ Q
  129. ;IRQ滚动控制模式
    4 d1 A! R2 n: W) |( O# Y( ?2 M% c; |
  130. IRQ_Scanline_Mode
    / [4 n4 u: f6 L/ U/ s
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ) h$ l1 O3 D$ p* k
  132. .DB IRQ_SCROLL_MODE_LEFT
    # z( W! s8 S4 h* c/ a
  133. .DB IRQ_SCROLL_MODE_RIGHT1 ]0 u, Y! V& f
  134. .DB IRQ_SCROLL_MODE_LEFT
    # ~3 K, N+ p: |. R9 r: d
  135. : s1 M, X( {6 ]" C9 q
  136. ;==================================================
    1 V/ x2 z# i) N( s
  137. ;;IRQ滚动控制
    $ C5 _0 U0 q7 m' P; y/ {" V+ ~
  138. IRQ_Set_Scroll
    : f0 |7 h) F9 q9 {
  139. LDX IRQ_Process_Index- f$ Q9 C2 G2 Y/ C
  140. LDA IRQ_Scanline_Mode,X
    ( A* T2 @& J6 _$ u* {, p) q. [, g  b+ k
  141. CMP #IRQ_SCROLL_MODE_LEFT- V+ p5 j" D2 H" n  [. J
  142. BEQ IRQ_Set_Scroll_Left
    : `, f5 A. S" L8 ?  P' H
  143. CMP #IRQ_SCROLL_MODE_RIGHT2 n2 p# O# @; F3 _
  144. BEQ IRQ_Set_Scroll_Right
    - ~# W+ L6 ?' \( L% x  n, u
  145. IRQ_Set_Scroll_Zero;不滚动
    : y7 x0 V7 g% ~1 y
  146. LDA #$00; z! L" @" d% |/ T* y8 z
  147. STA PPU_SCROLL* i* J* e% G3 @6 y( `
  148. STA PPU_SCROLL
    6 Z: U  d0 O/ ?  e5 Y3 t/ L# I
  149. RTS
    # E8 C* g) N8 K( r: d/ c! A: J
  150. IRQ_Set_Scroll_Left;向左滚动
    5 B/ n' A/ p; O
  151. LDA Scroll_H. o! G" N0 f: e3 N7 N$ e
  152. STA PPU_SCROLL. v( j; q# }, @& v- Y
  153. STA PPU_SCROLL
    . m. z3 y4 L* N- ?: F
  154. RTS
    1 ?. r3 \5 z9 _8 z6 t3 A
  155. IRQ_Set_Scroll_Right;向右滚动
    # b  S( ?* i$ |$ u
  156. LDA #$00
    , L/ }5 C' s. \5 N& ?1 Z! @/ Y
  157. SEC
    0 M2 p* o: O! w& r3 |
  158. SBC Scroll_H6 a# Q$ z& u" T# t0 r+ i
  159. STA PPU_SCROLL
    $ R* t7 n" P( K, }& M# A8 M  l
  160. STA PPU_SCROLL
    7 N# {9 z5 z, O8 W: P0 e# O
  161. RTS" ^* E0 o6 i, J5 d6 C7 u

  162. 9 o" [  J: M# b+ h+ c
  163. ;==================================================: E; o0 C# H2 U. |
  164. ;;IRQ滚动控制2 Q9 E5 y0 z! V4 A- S5 @7 O0 R
  165. IRQ_Set_Ctrl, Y5 m$ d0 x2 ?6 u
  166. LDX IRQ_Process_Index
    ; ~2 q! C3 J) C1 Q8 x6 F
  167. LDA IRQ_Scanline_Data,X: ]. _; J' c  H" G5 z+ S8 H3 [
  168. BNE IRQ_Process_Latch
    4 X* R. T1 ?" S* Y+ [$ N
  169. IRQ_Process_Disable;禁用IRQ0 r4 L1 U# Q" E: A
  170. STA MAPPER_REG_IRQ_DISABLE& G1 a9 Y1 @. t0 e9 ^
  171. STA IRQ_Process_Index
    - e  }' V  J1 {# ~# w
  172. RTS
    5 `$ |6 R$ T% W# c5 @* v& y, O
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    0 T; l. C0 ^( u* l
  174. STA MAPPER_REG_IRQ_LATCH; j  w* U, x* k* l7 v9 A$ q$ m
  175. INC IRQ_Process_Index# W) D5 m0 G% I  d6 B' f$ z
  176. RTS5 I) g! g7 ]; N  E7 _! ]( x

  177. ) o9 x* y: S3 [$ {' V& l1 A
  178. ;==================================================" M5 g" @  i' L* v- t
  179. ;IRQ处理! g: X( @' v% V) }* f* u
  180. IRQ_Process_By_Index& i' H' g, M2 V7 d( Z- G+ a
  181. JSR IRQ_Set_Scroll$ v/ f2 l: T, e* W4 v" K$ _8 M
  182. JSR IRQ_Set_Ctrl
    ) P& J* I- c( `) W. _$ P) o' u2 b$ L
  183. IRQ_Process_End
    ; l% V6 e! y7 g9 s1 P3 ~$ Q8 ^
  184. RTS' m& S( W  H# {# O+ @5 I0 [
  185. 9 i+ `5 w8 M4 `" i' G
  186. .ENDM1 w( [, Q9 I: H0 h; X" o5 @
  187. " h  R: a6 d2 @) ^3 e) v
复制代码
% Y1 V; s1 I7 d

1 [- |- l7 v7 Z" \5 w  C代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2026-4-6 08:26

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表