EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 / h! F* t1 w6 K$ e+ ^9 I

6 B8 v  D# s3 }4 l- f本次IRQ研究了如下:$ w% Y+ X; B: P# ?6 s! V0 t0 C/ u
VRC2&4(Mapper21,23,25)1 E, ?* y9 i3 E* e0 D7 E
VRC3(Mapper73)
: A+ D  X5 W0 f2 hVRC6(Mapper24 & Mapper26)
3 h7 f" m) i3 `; LVRC7(Mapper85)
3 E3 j* L8 W3 N$ w* P8 pMMC3(Mapper4)- R3 i+ u. [' H7 Q
MMC4(Mapper10)
3 }/ m/ Q5 C3 `/ i1 ?& XMMC5(Mapper5)
  w  P  C% X+ u, Y6 U; ]Mapper18
( i1 N: C# s" }* ~/ Q9 u7 u$ \Mapper64" U6 r8 n5 g% F; n- b1 y! a
Namco163(Mapper19)
) B1 M, |" \- N1 b- j- vSunsoft FME-7(Mapper69)
& T1 Q, I5 ?$ z; q8 J3 L/ x- W! @9 m+ ?' J! d
共计11种Mapper的IRQ操作使用例子. y* }1 F- R7 I! u; `
代码内有详细注释, 希望能帮助到感兴趣的人.
' m8 x5 }) E' }  \0 y4 T  Z; e% G" Y- u! s" i" f

& d; F  M2 l, ?: r# O1 y) U
: T, f4 ^5 u# C; j6 wMapper代码主要逻辑(以MMC3为例):; }* U5 T! ?1 B3 d1 }
  1. 1 A2 V; @: W: v. n' g. B! s& O
  2. ;==================================================2 U" D$ R) ]& n
  3. ;Mapper号
      \; E) j. n# G- L3 r* ?, r* ]4 z8 R
  4. MAPPER_NUMBER           = 04
    * A" q" t; v; Z! C3 M* L3 c9 t
  5. ;==================================================: W2 T! x# _0 ?  P* h5 u! c& b
  6. ;MMC3 (Mapper 4) 寄存器常量
    " N; h$ g1 I. ~# _4 E" S
  7. MAPPER_REG_BANK_CTRL        =   $8000
    ' ]0 p7 D& z; H
  8. MAPPER_REG_BANK_DATA        =   $80012 E% o! I0 L' Z: g
  9. MAPPER_REG_MIRRORING        =   $A000  Q8 ]  A% t! x% |5 D
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0017 E" u3 Z: d2 Q6 A3 Q
  11. MAPPER_REG_IRQ_LATCH        =   $C000( Z, i4 G' U% q2 I$ x9 q/ @
  12. MAPPER_REG_IRQ_RELOAD       =   $C0010 s, c$ {! R/ m7 ~' R
  13. MAPPER_REG_IRQ_DISABLE      =   $E0003 n7 i6 \5 I/ x
  14. MAPPER_REG_IRQ_ENABLE       =   $E0013 x/ ]5 {2 C( A4 p1 Z8 G" ?
  15. ;==================================================
    ; N6 j1 o( Q( d3 m) g! i4 i: h& t
  16. IRQ_SCANLINE_BEGIN          = 1351 y) G; ]! P, z/ ^7 F% ?6 @
  17. IRQ_SCANLINE_1              = 84 R$ _1 t+ g" P, c% F
  18. IRQ_SCANLINE_2              = 54
    4 R# e6 B# M4 [, t  G+ V& i' y$ q+ W
  19. IRQ_SCANLINE_3              = 82 O7 u9 t( R0 r* c* l
  20. ;==================================================9 D$ N. l$ _+ g% E. a

  21. # j* n0 B* R6 J+ f% U6 m
  22. ;====================================================================================================
    - l+ H- x- y% u& ?
  23. ;宏常量
    & m$ t/ a, g: ?) E, Y
  24. ;====================================================================================================/ w3 x1 @3 U/ b# L3 O, h
  25. 1 ]; L2 S" e6 U% S7 w* M2 ]4 U
  26. ;====================================================================================================
    9 F, l1 b  Z$ J4 G* o
  27. MACRO_MAPPER_INIT .MACRO
    + y& ]: b" S2 B9 B9 {4 Z- B
  28. ;禁用IRQ" @6 Z! R" b( u, R9 |* e+ c
  29. STA MAPPER_REG_IRQ_DISABLE
    ! K- {+ v* G1 j+ u
  30. 9 P+ N. `! f* y9 c# J) u
  31. ;水平镜像, ~7 V' b+ w, L2 I
  32. LDA #$01
    & B! r' |2 }+ r2 D3 Q
  33. STA MAPPER_REG_MIRRORING0 f! Q3 t* l/ k0 L% |2 D$ H8 {! C& F
  34. " }% }" p. V" i. q+ g, \
  35. ;初始化图形bank
    ) L- `# [1 L* j: q0 E$ r
  36. LDX #$055 v5 y) g: e& x* F- S+ _& `6 ^
  37. .Init_Chr_Bank
    8 t* F, O/ E- j# J
  38. STX MAPPER_REG_BANK_CTRL5 p& p4 t! {) K* y  x5 r0 Z; Z3 G2 _
  39. LDA .ChrBankData,X
    $ A# t, |( w* G7 Q5 ?( Z5 i$ g: a
  40. STA MAPPER_REG_BANK_DATA7 \. }* E9 e. X" a# w6 F0 R
  41. DEX
    ) q/ `5 d: {) }$ i
  42. BPL .Init_Chr_Bank
    # V' s; m5 S3 {* Z$ M
  43. JMP .Init_Chr_Bank_End
    & ~2 o- o0 ^, f; F! x# t+ k% r
  44. .ChrBankData1 u' i) v; O$ A1 W" q' s! [. E
  45. .DB $00,$02,$04,$05,$06,$07. Y, s) y& R/ b1 d9 b4 Z4 {
  46. .Init_Chr_Bank_End
    / E6 G+ L/ `$ @

  47. & \* Q6 s, H% d9 d1 D4 P1 q8 U8 `. L
  48. ;启用SRAM
    % a1 A9 _) o/ h+ \( q: x( \/ C6 q
  49. LDA #$80
    2 y. @  S, J- C
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    1 N) g1 v4 c! C  P
  51. .ENDM
    $ r0 ^4 Z+ `: X; f

  52. 8 f; e. o" T5 T5 W1 F
  53. ;====================================================================================================9 t! w  c' p% F4 B! D
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    ( [. D8 {" i2 ?- Y# D9 N: N% Y
  55. .ENDM
    / n2 J* U, j) q3 ?
  56. , s( g: Y& b( z
  57. ;====================================================================================================- D( b6 V  w4 x" C! \3 f' ~
  58. MACRO_SRAM_ENABLE .MACRO0 K+ C, d- g5 V+ y0 `; R4 \, r
  59. LDA #$80
    3 v8 D# D7 v$ e( r, ]
  60. STA MAPPER_REG_PRG_RAM_PROTECT4 N; F- y: U% [1 s# V1 c$ m- Q' H
  61. .ENDM
    , ^2 p0 l2 \% {9 p. Q' I6 l
  62. ( f% {( v2 ]9 ^) W
  63. ;====================================================================================================
    ) }) m7 y( |7 X. p$ _0 s; P
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    * s% P* |; J  i, X6 Z/ M; Q
  65. PHA
    ) q* O0 c* \& v& ~. y3 j
  66. LDA #$06! X; B4 L# V* @6 \& u, i
  67. STA MAPPER_REG_BANK_CTRL0 m! C. e9 r- y
  68. PLA
    ' q- ?# ~1 G% K6 C, k% v( @7 J
  69. STA MAPPER_REG_BANK_DATA( i" ~2 @  ~! O- N
  70. .ENDM& u/ W. Z: g* Z$ w

  71. # U: d2 e6 a( N4 f5 Y, b
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    7 i8 z7 l. [) m  ?/ G- z) P
  73. PHA' o. t$ A" S! ?1 r" X' N
  74. LDA #$07( |7 E, \. U' A3 a# g1 ~: f- t  r
  75. STA MAPPER_REG_BANK_CTRL
    ! e2 U& {6 X, Y0 s2 K) I
  76. PLA
    8 z  X8 \/ Q) t. v) V% K
  77. STA MAPPER_REG_BANK_DATA
    + ~4 F+ B9 n( I4 A$ H9 N# v
  78. .ENDM
    5 r2 ^2 u7 Z% Z" M7 |' c# m

  79.   K8 I) y" l  w$ W
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    7 w4 f" t4 L  t' o  f3 d
  81. .ENDM. U6 O- I* I, b7 l+ Q( V# @! c. r
  82. # `( c% f  u; E$ F" F' T
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    * g3 z- z2 r( Z6 V" y$ l) |
  84. .ENDM
    ! X1 e, ~8 |6 M' ^& S5 r

  85. + N+ t: e; @% i+ k- ?
  86. ;====================================================================================================% c* \3 i& @& ^3 i
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO! n2 I& b" p& d1 P* g2 Z- t6 b
  88. LDA #IRQ_SCANLINE_BEGIN + 1! q. a. O8 Z$ H8 {& W
  89. STA MAPPER_REG_IRQ_LATCH5 s8 l3 D7 ?( V3 w8 u0 _7 l/ S# E, |
  90. STA MAPPER_REG_IRQ_RELOAD7 i0 q- }2 j  E9 [
  91. STA MAPPER_REG_IRQ_ENABLE
    + c' ?: }8 o& \4 o* i* c
  92. CLI
    1 e: a/ x, X7 O, K# U$ b0 T
  93. .ENDM# [) N. \' r: R  n3 ~6 ~

  94. . K2 ?# p+ P' ?8 Q& B: a
  95. ;====================================================================================================
    & |# A' t( N) C6 c0 {- h+ B
  96. MACRO_ENABLE_IRQ  .MACRO  g  X2 h4 F& J$ \% _
  97. STA MAPPER_REG_IRQ_ENABLE; y3 |3 n* Y' `
  98. .ENDM
    5 o- ]$ [4 [& p7 J- S/ P4 O

  99. - ^7 O2 m$ V. Q. [& H1 i# i
  100. ;====================================================================================================
    - }+ F$ k: [4 S) ?: N/ g7 B
  101. MACRO_DISABLE_IRQ  .MACRO" [- F  n; n: [9 t) p
  102. LDA #$00
    * Z1 S$ h* D6 F3 _0 Z, i, @. }
  103. STA MAPPER_REG_IRQ_CTRL
    - {; P& L% ]$ y! m2 E! i
  104. STA MAPPER_REG_IRQ_ACK
    6 L/ [& E. M. l! z9 f
  105. .ENDM( W" K( s1 Q4 P9 a4 J4 H
  106. # T: G3 e4 }" n  ^  y
  107. ;====================================================================================================
    + F) T+ ?1 L4 d" @& U
  108. MACRO_ACK_IRQ .MACRO9 [3 p9 F" v2 {2 o
  109. STA MAPPER_REG_IRQ_DISABLE
    0 `6 `$ y+ B; m" q3 i3 m1 u
  110. STA MAPPER_REG_IRQ_ENABLE+ ?5 e7 `' Y8 \% T1 K
  111. .ENDM" ?5 x4 A2 l" Q5 D/ W0 f
  112. 9 t( Q4 D# L9 {  u$ o9 g
  113. ;====================================================================================================
    7 p) }4 T' ]2 Q$ |8 f* p$ `
  114. MACRO_IRQ_OPERATE   .MACRO( V0 g4 X! o1 y3 z# f
  115. % Z% H* A7 B/ m8 K, z
  116. ;==================================================
    $ v/ A$ J7 a7 i* c
  117. ;IRQ滚动模式常量- J& w5 b8 q& e9 Z" U, T
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
      |  w( S+ l1 _( I5 r: ?
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    0 G2 S  D5 m; Z. [# F) a- e
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    + a0 x7 A' Z: [: G* @6 H7 C+ f" J

  121. , A3 x6 k0 e* ?0 _3 K3 L7 z* K+ G
  122. ;IRQ扫描线数据3 P* G. \) I( L3 R. g$ n  i
  123. IRQ_Scanline_Data
    6 \* ?" j7 A6 M, z7 j: W( z
  124. .DB IRQ_SCANLINE_1
      h3 J6 X2 w# q
  125. .DB IRQ_SCANLINE_2# Y. s( [* B5 y# i
  126. .DB IRQ_SCANLINE_3
    6 ~$ Q5 S! m) f: z3 z. Z  ]; X& e
  127. .DW 00 ;关闭IRQ6 k8 W6 \& M! ~1 s/ r' f5 D
  128. ; [1 `# u3 s% N0 D3 w
  129. ;IRQ滚动控制模式7 g5 a, b7 [  r. R3 Z
  130. IRQ_Scanline_Mode
    7 \- J+ T4 C) p9 R
  131. .DB IRQ_SCROLL_MODE_RIGHT: G8 }* F/ D3 H9 S
  132. .DB IRQ_SCROLL_MODE_LEFT. h2 m; L5 ?8 Q
  133. .DB IRQ_SCROLL_MODE_RIGHT
    3 y; m3 Z- k7 f
  134. .DB IRQ_SCROLL_MODE_LEFT
    0 k$ ^! u/ A+ q
  135. 5 m1 m2 v0 [5 c% o# B! y
  136. ;==================================================
    9 P7 g: o/ s8 u6 F2 b0 G
  137. ;;IRQ滚动控制
    + C( d+ l/ V/ J, ]5 Y$ T
  138. IRQ_Set_Scroll) F4 K. a1 ]; j8 z9 Z  `) J9 Y# Y6 ]8 @9 l
  139. LDX IRQ_Process_Index
    ) o% t9 J+ w2 h. A
  140. LDA IRQ_Scanline_Mode,X
    1 d: [6 Q! i0 z! E( u( E& ]5 O
  141. CMP #IRQ_SCROLL_MODE_LEFT
    7 @5 V+ J* {; d2 Q& i( o+ h" S
  142. BEQ IRQ_Set_Scroll_Left. {3 ?- f% Y7 F5 S
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    $ ~( k( h% w/ ?5 `4 n7 l9 @
  144. BEQ IRQ_Set_Scroll_Right8 d  X8 U1 q/ a2 ^. J
  145. IRQ_Set_Scroll_Zero;不滚动5 V6 [+ s; ~$ @$ O4 Y5 H' r9 s5 }
  146. LDA #$00
    ; d/ ?5 m' D6 h# F3 @$ W. W
  147. STA PPU_SCROLL- W6 E0 w7 e& H  l$ k! t
  148. STA PPU_SCROLL
    - c9 `8 v! ~% A0 A" w2 q2 z0 [
  149. RTS$ {3 s) T3 ^" X; ^
  150. IRQ_Set_Scroll_Left;向左滚动
    ! W8 X7 n! d' ^8 ~, ?& G( R/ z
  151. LDA Scroll_H
    * J, Z3 u$ J4 M" j5 V- H
  152. STA PPU_SCROLL9 V8 S7 i4 r3 e& `, }# m0 z% x$ t- ]
  153. STA PPU_SCROLL
    2 b7 |9 U9 [) X5 {; k+ C
  154. RTS
    9 T' t/ H. G- L3 \1 \
  155. IRQ_Set_Scroll_Right;向右滚动: h4 L0 P. U- a* y" i2 ]
  156. LDA #$00
    * f6 `7 ~) B; X" B4 `
  157. SEC
    * m/ P+ B4 f. |  J. `- ?( o8 d# `+ E
  158. SBC Scroll_H( y3 e$ y( C  ]# k) [) }
  159. STA PPU_SCROLL( F: a3 _4 u, W# F, C0 g9 a
  160. STA PPU_SCROLL
    ) @) ~% ^9 v2 T- b1 L
  161. RTS
    9 X; g! B+ v) ^& y% W
  162. . E0 m' f% Y" i
  163. ;==================================================# c  v$ Y/ }3 |+ L2 ^5 N, F( r! @3 o
  164. ;;IRQ滚动控制5 @+ Q( y4 u+ J) U
  165. IRQ_Set_Ctrl
    % T! g! T) V8 [9 n7 M: y! U
  166. LDX IRQ_Process_Index
    - X- i0 b4 T$ S. M  Y& r
  167. LDA IRQ_Scanline_Data,X
    - P. o5 f4 _0 g) S
  168. BNE IRQ_Process_Latch
    ) @: R% ]) }% @6 l9 @4 s* Q
  169. IRQ_Process_Disable;禁用IRQ
    * r% f. O* J7 t: g4 j* y# G
  170. STA MAPPER_REG_IRQ_DISABLE
    9 u9 W+ w; I+ Y* v+ r- `
  171. STA IRQ_Process_Index
    - Z. M- X& g9 i: h
  172. RTS# I9 \' z2 V, E  A/ v7 S% Q, w
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    0 X! G" [- a1 d  w( t! l
  174. STA MAPPER_REG_IRQ_LATCH
    ' {, X$ A4 v( g2 D- S6 ]0 s
  175. INC IRQ_Process_Index$ N) g+ C' @; b
  176. RTS
    * \( p& M4 f2 K% c; A) c3 \

  177. ' q7 J( U1 k3 p0 ?9 C- U
  178. ;==================================================
    . b8 ?3 |, `7 }3 v- a2 F) Q
  179. ;IRQ处理
    + l3 I0 F0 K% X8 c2 x
  180. IRQ_Process_By_Index
    : J5 _. P4 U+ a+ {! ?5 e" f1 L* O
  181. JSR IRQ_Set_Scroll
    1 D5 b1 m1 L  _
  182. JSR IRQ_Set_Ctrl$ o3 }- p+ L4 j
  183. IRQ_Process_End) V1 `0 x0 G, i( h! u* h
  184. RTS
    5 v* t: Q9 |# t5 s+ M2 _3 \

  185. : f( r" D. B5 k1 c7 [0 g& Y; Y* {5 j
  186. .ENDM
    % }  h7 }2 n& F, {! @9 {+ U0 C) i

  187. 2 h( ?" e1 k: j
复制代码

2 E' A; x* u6 h9 w
4 {8 M: |3 _: C9 L# K8 D代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 10:15 , Processed in 1.095703 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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