EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
" R7 h3 F4 ?$ s$ e$ y
& K$ ^. v6 R! d8 S& U4 k! H本次IRQ研究了如下:
0 g+ X5 L& p) wVRC2&4(Mapper21,23,25)# F/ h- r* G4 u9 t
VRC3(Mapper73); B9 K" r4 g5 F2 b
VRC6(Mapper24 & Mapper26)
5 A: m& Z" ~# d9 V+ jVRC7(Mapper85)
7 o. O+ F' t- o2 T  F9 E1 O' GMMC3(Mapper4)2 {$ _# N5 c7 C5 L7 s# ^: M1 ?$ i/ a
MMC4(Mapper10)
/ X1 x" X- L/ p2 d2 B$ XMMC5(Mapper5)  w4 g  {4 P2 n. g, ]& \5 f$ j
Mapper18- a* k# H% f. P: }' Y
Mapper645 f" Z, S3 J7 }. u& j! I& B+ }
Namco163(Mapper19)% V; L5 g8 O% y0 F: V& S4 o
Sunsoft FME-7(Mapper69)
& s" k* [- ^) S  q  }+ b" x8 v. y$ k6 y: A( o! ?( G- W6 h) S. Y/ G1 B
共计11种Mapper的IRQ操作使用例子- L4 h6 J7 I- r1 @4 V7 i  `3 \
代码内有详细注释, 希望能帮助到感兴趣的人.! A+ P. ~* Q) `' }% l3 \

1 E  Z9 R. j' ^7 B" t; R5 g0 U0 c, o1 l9 p. T" M9 b: h
& M3 ?4 `2 r* U/ U! u
Mapper代码主要逻辑(以MMC3为例):) p/ J1 K# n9 h( h
  1. % m0 z$ U) Y, \, [9 P
  2. ;==================================================
    1 b. p* {$ Y* i
  3. ;Mapper号2 L8 s* H+ n3 l; t+ M
  4. MAPPER_NUMBER           = 04
    0 K/ G  k- F1 E) m
  5. ;==================================================/ \7 f8 F, A/ f' X& }( K
  6. ;MMC3 (Mapper 4) 寄存器常量2 b: K; w) X- R
  7. MAPPER_REG_BANK_CTRL        =   $8000: E- s2 P6 Q, g: T! h; p  k
  8. MAPPER_REG_BANK_DATA        =   $8001
    , @" r* X3 L" I: R& ?4 L
  9. MAPPER_REG_MIRRORING        =   $A000
    4 I( T/ b* W! |- }* y0 c
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001; T; y$ _2 Y3 B/ w
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    , F2 \( `1 a* s7 A0 W( K
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    / |+ `1 ^7 i! |) W0 v" E
  13. MAPPER_REG_IRQ_DISABLE      =   $E000; O9 D" \9 |" o0 @9 e1 @/ O
  14. MAPPER_REG_IRQ_ENABLE       =   $E001- L# K) y% r. _, ~0 d) w' {' B3 e
  15. ;==================================================
    ) {6 n  i7 |; ?3 L) a" ]
  16. IRQ_SCANLINE_BEGIN          = 135
    # L. ?8 z2 A' v# H5 I# W. O" K
  17. IRQ_SCANLINE_1              = 8
    . ~3 {$ [1 f% \9 s$ _
  18. IRQ_SCANLINE_2              = 54# r2 ~4 k4 I( t9 E
  19. IRQ_SCANLINE_3              = 8
    7 y9 u' ]4 o/ m
  20. ;==================================================
    & n* m5 O, j; e* a& R& [

  21. 4 @6 h$ Y5 L- n( q( [0 n9 X
  22. ;====================================================================================================* A0 K9 B; D. ^
  23. ;宏常量
    - i; i8 s% I) D
  24. ;====================================================================================================  X! }, `8 V1 c! X! V4 E% i# I
  25. ! v; [5 H) P+ H' x4 n2 A6 w( M7 `$ [" P
  26. ;====================================================================================================
    ! A* ~' @# s+ d7 X0 B3 S' N( g
  27. MACRO_MAPPER_INIT .MACRO
    - t0 s! u5 |5 u% ~5 S9 n) D- g; l
  28. ;禁用IRQ) L7 q3 y( C/ N: @! r
  29. STA MAPPER_REG_IRQ_DISABLE7 R- O: M# ^/ j0 K  [+ u
  30. 1 k, p7 }. c. I: t$ b5 p5 }1 T# o
  31. ;水平镜像6 q/ J* p: t& z
  32. LDA #$01) m& K0 r7 h* V
  33. STA MAPPER_REG_MIRRORING
    : e& Q5 d0 J4 z! U  L
  34. / @! \8 R2 s6 _, W( z* ~
  35. ;初始化图形bank
    0 q: @. L2 q' U/ Z
  36. LDX #$05
    4 p1 f- d6 a. Z9 N0 f& C
  37. .Init_Chr_Bank! w& y( g& U. e
  38. STX MAPPER_REG_BANK_CTRL/ [, o( R' [- F- T, A( y  Y
  39. LDA .ChrBankData,X  i% f: n3 c) {4 B; `# X
  40. STA MAPPER_REG_BANK_DATA2 V$ I  p8 Y: q7 W8 x
  41. DEX
    ; ^% e# M& a+ h- E1 ~4 v: x4 K
  42. BPL .Init_Chr_Bank4 `, M3 ^9 T2 {, y  Y" p# Q
  43. JMP .Init_Chr_Bank_End+ H- l( q0 t# {8 J5 Z
  44. .ChrBankData
    + z/ J5 |/ F, ^4 L* U
  45. .DB $00,$02,$04,$05,$06,$07$ ^& S. h  [7 j' n' p9 J
  46. .Init_Chr_Bank_End: J: f3 Z' m: Z9 ^) P3 Q0 u
  47. " }# v: r- i, o1 }
  48. ;启用SRAM
    4 D5 d# j9 e2 r/ C# G! V5 ?/ l
  49. LDA #$80
    2 {3 w* z; d& _
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    . B2 H8 L7 N7 N$ t  M
  51. .ENDM
    4 f+ y. }2 h0 W

  52. * @% S! ?+ B$ O& I9 g/ h
  53. ;====================================================================================================
    6 y! C6 F7 j: \' L+ `& z$ |" a$ C
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    , J: O! z4 l' j- }' \0 F
  55. .ENDM
    % l$ r) g' J1 w& ?+ T

  56. 1 ^# L6 c3 D- J" ^& ?9 y4 W/ h
  57. ;====================================================================================================
    4 o, S# M' I8 `/ {  j, {
  58. MACRO_SRAM_ENABLE .MACRO& F! B, R, R! G  U5 N
  59. LDA #$80
    ! ?# h4 a0 L% v; |: a! ~- O
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    6 i5 o& o# ]- Z9 V! Z, w) B
  61. .ENDM
    / g: E" y+ ^) h- s. L% i/ m
  62. . M! U7 s4 s2 s, m/ ~$ R
  63. ;====================================================================================================. F  s+ d& r! w- l1 U8 L
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    8 `9 m2 H, L& X
  65. PHA
    ; T* c  S. b% Q, {& Z
  66. LDA #$06
    ; G* O+ @4 |/ Q% c* J& p* A3 a: L# c$ F
  67. STA MAPPER_REG_BANK_CTRL5 a# r6 S2 v. r  W9 R6 h* ~
  68. PLA* {+ {4 [8 S9 N. A1 H
  69. STA MAPPER_REG_BANK_DATA
    ) v# r; S5 i  h# ]+ ^4 I
  70. .ENDM
    / t7 \. T8 E& [( A8 [/ _
  71. 7 i* N! }3 |2 j  z* R( z
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    + G3 L2 H3 N9 s7 J$ [/ F
  73. PHA
    6 ^8 E4 U6 K% u! p9 E
  74. LDA #$07
    & S! W: o8 p  D5 Z3 K" M2 I
  75. STA MAPPER_REG_BANK_CTRL
    $ H& w% k6 p# j2 h# c% a
  76. PLA
    : s4 Y/ K' _  J8 k. g
  77. STA MAPPER_REG_BANK_DATA
    . t2 s" p& d7 Y3 S1 Y* O8 t2 Y
  78. .ENDM1 e+ D5 W+ T$ H& ?- z8 {. f8 ~

  79. 8 i- A) {4 \5 S" @
  80. MACRO_SWITCH_BANK_C000_A .MACRO* C; ~2 Q0 R* Y" a1 o) Q' L( W
  81. .ENDM
    - Y! F4 B  J2 j/ O; [: ~
  82. 6 [2 T) ]6 u: p0 c6 w
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    # h' ?* F2 b- I6 t, q; A3 I! w
  84. .ENDM+ e1 S/ O! ?8 O* h7 k

  85. 5 W) C" \1 \6 q- X) a
  86. ;====================================================================================================
      `, |  X6 M6 M8 z
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    - z3 j$ [2 O! ~% n
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    8 J6 A0 ^3 {6 N6 s! ]' \# [
  89. STA MAPPER_REG_IRQ_LATCH4 f; T/ L! P/ E" Y5 f' C
  90. STA MAPPER_REG_IRQ_RELOAD
    ! k6 Y% o" Y. G7 H
  91. STA MAPPER_REG_IRQ_ENABLE& b' _" G- p- G2 g( L% U0 M
  92. CLI
    - D- h+ M& e5 R0 c) M
  93. .ENDM
    # u* X5 O( g! a5 |7 P; I$ n

  94. ( c8 s- Z9 a& T. A6 ]+ p* t
  95. ;====================================================================================================# O1 e5 G2 ]+ C5 u9 A; M* L
  96. MACRO_ENABLE_IRQ  .MACRO
    # h5 i6 ~7 [% r2 E% N+ d2 g& J
  97. STA MAPPER_REG_IRQ_ENABLE* W1 A  p0 k5 u, y1 G% j0 f# n
  98. .ENDM
    5 t0 [" L  K7 V5 I. H8 l8 z
  99. : h1 B* f$ O' f; M" p& @5 ]
  100. ;====================================================================================================! x2 [% |3 Z7 q; L3 n9 [
  101. MACRO_DISABLE_IRQ  .MACRO
    6 V% E+ ~6 {$ K: Z. m0 L- y
  102. LDA #$003 H' C- q0 D: U% i4 B% q& H% k0 j' h- s
  103. STA MAPPER_REG_IRQ_CTRL
    4 S6 a& x2 ?' x; V- ^
  104. STA MAPPER_REG_IRQ_ACK
    . A" z  S, d* E% K& `
  105. .ENDM
    4 }4 U  Z3 ^) f* q0 p3 Z; L  a( Y

  106. , f1 J+ }4 X3 D5 E# F* m! `
  107. ;====================================================================================================
    # l9 V! ~& C+ s1 b- L1 [
  108. MACRO_ACK_IRQ .MACRO
    # H/ t( J6 p. W7 q1 ^8 R5 m& y
  109. STA MAPPER_REG_IRQ_DISABLE
    ! L* D5 Z: D- r! ~( z9 o
  110. STA MAPPER_REG_IRQ_ENABLE* s5 h7 P  c3 G& V
  111. .ENDM
    3 H6 {& p& P& K+ b! V' H
  112. - n, p* `0 w5 f5 I2 b" b$ L
  113. ;====================================================================================================
    5 n% ^: c  \# {: e
  114. MACRO_IRQ_OPERATE   .MACRO
    - w8 V' {$ l# t) Z/ l- x0 L7 }$ Y

  115. 3 p0 V6 Z* Z* S
  116. ;==================================================
    ( d5 N* n5 g' E5 Q" k
  117. ;IRQ滚动模式常量% }, R' W& s2 R
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    6 i0 m& n+ a/ i, P- {8 }
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动1 j& l8 B% |/ F5 [; w
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    1 V! M7 V# F9 e  Q3 J/ B* a
  121. - D! n6 _3 p0 i, j3 \7 ]0 m6 }6 Q* U
  122. ;IRQ扫描线数据  [1 [% k5 v) S! x% W; L" {1 L
  123. IRQ_Scanline_Data
    * A7 u, |0 S/ |. u
  124. .DB IRQ_SCANLINE_14 C. E+ P. Y; _  r" K
  125. .DB IRQ_SCANLINE_2
    3 M, X, _6 i/ f, h( u; f, I7 t
  126. .DB IRQ_SCANLINE_3
      O* ]% J# _! ?/ }3 M6 \
  127. .DW 00 ;关闭IRQ% K5 d/ f0 z/ d+ b& s. z3 R

  128. # b- B8 k# C5 W1 U
  129. ;IRQ滚动控制模式
    - W/ F& j" S( O6 @
  130. IRQ_Scanline_Mode
    2 D: j) X* B) O3 O. M4 D; S
  131. .DB IRQ_SCROLL_MODE_RIGHT
    4 Q# f5 w) Y' ~5 g4 x# ]7 ^
  132. .DB IRQ_SCROLL_MODE_LEFT6 O) ~; s7 e% _6 t8 c
  133. .DB IRQ_SCROLL_MODE_RIGHT' X$ z) N5 [+ U& |
  134. .DB IRQ_SCROLL_MODE_LEFT
    # l# ~% Q; a1 A5 f& R6 ~
  135. # ?% ?! \8 m6 d9 M& F# d
  136. ;==================================================, r0 W7 z4 r- C2 \* O& x
  137. ;;IRQ滚动控制
    0 l/ Z+ F# {. v3 C" ?0 \+ \
  138. IRQ_Set_Scroll
    . x2 v' b4 q, b) l/ z3 V, g5 ?
  139. LDX IRQ_Process_Index! O! s' N* ^3 Y  z) E9 l
  140. LDA IRQ_Scanline_Mode,X! S' p5 l8 ?7 ~; c  L4 h: T
  141. CMP #IRQ_SCROLL_MODE_LEFT
    . f( v* H4 u0 X* a
  142. BEQ IRQ_Set_Scroll_Left
    ' g' ~4 t/ p+ m6 n1 l; q0 ]5 }
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    2 [6 A/ i4 ?9 ]5 u. s6 ?
  144. BEQ IRQ_Set_Scroll_Right' c* Z8 Y8 ~( l  X  A) @
  145. IRQ_Set_Scroll_Zero;不滚动; h. \7 o  m6 G1 l! a) d
  146. LDA #$00
    ' y; z! |' F  U4 }$ L$ z
  147. STA PPU_SCROLL
    ) ^: |, F$ j0 d8 @
  148. STA PPU_SCROLL
    8 i, k' Z& b# g
  149. RTS# I' [  @4 G& j% A9 X6 M9 {
  150. IRQ_Set_Scroll_Left;向左滚动
    " C/ f& @4 v, k! S1 @8 h
  151. LDA Scroll_H$ d0 N8 N! v- W/ G
  152. STA PPU_SCROLL5 f" e6 N# F, \0 Z4 Z% L
  153. STA PPU_SCROLL/ {6 \7 S; d# _1 ?; L5 ?/ I
  154. RTS/ c) b  t4 J  a/ Y- l* }# p
  155. IRQ_Set_Scroll_Right;向右滚动8 _& q) J3 m" Y. c' u
  156. LDA #$00
    / {* p( H, P& w( E; V" W
  157. SEC, n0 L2 L! ]3 `' i# h1 Y6 ]& N4 @
  158. SBC Scroll_H$ w: X* {8 j: T. X! N5 t! W0 ^2 F
  159. STA PPU_SCROLL
    ) c' ?3 ^; g# O! d
  160. STA PPU_SCROLL
    5 X3 \1 l' b$ N6 }1 N: O9 J
  161. RTS
    1 {% A% h0 {4 \( f! p) S! c

  162. + p% D7 T( F8 L! Z$ q: V
  163. ;==================================================/ L1 Z) j. Z3 @4 Z( T6 x
  164. ;;IRQ滚动控制+ l0 `" d0 r4 |
  165. IRQ_Set_Ctrl/ _# }  J9 J  b4 b8 ~
  166. LDX IRQ_Process_Index- @3 J7 _% J$ ?' y
  167. LDA IRQ_Scanline_Data,X
    0 M/ P2 I6 X+ p0 e" ^
  168. BNE IRQ_Process_Latch. @/ q1 z2 d/ T' W( ]
  169. IRQ_Process_Disable;禁用IRQ
    " B9 x9 }* W2 p0 G; ?) O% W
  170. STA MAPPER_REG_IRQ_DISABLE
    6 `$ A8 z7 R& D5 p5 r- F# ]* i
  171. STA IRQ_Process_Index! U' g6 `; F5 U' I! W4 B
  172. RTS5 B5 d: P0 M5 b' E
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    % V& ~# D0 r" g3 r$ n
  174. STA MAPPER_REG_IRQ_LATCH
    . w0 X& [5 `: X* c$ y4 U8 j' d2 M' ^
  175. INC IRQ_Process_Index
    : p& P! w# k9 N6 z7 P: \, a
  176. RTS0 q5 z1 |& s& s* G' I; @) W
  177. 9 z: z7 Z5 V- H. I1 T6 k1 K# [2 a
  178. ;==================================================; C7 i& I# S' w4 |4 W0 {* @& K
  179. ;IRQ处理1 r5 w7 y( {4 E
  180. IRQ_Process_By_Index
    8 v5 t% t' U8 l/ j4 H
  181. JSR IRQ_Set_Scroll
    ; ^7 M+ y7 A5 H3 s/ R8 g
  182. JSR IRQ_Set_Ctrl! Q; s( I2 f* |9 u2 k3 L7 R
  183. IRQ_Process_End2 h% T) g" J/ Y3 q4 H
  184. RTS  g- E; D, d: I% o& Q; h  v% T( Z

  185. " b+ T; D* o7 B" ?: M1 |
  186. .ENDM+ R6 E6 p/ L* T
  187. 6 {  L: d9 R. D) b' R4 g
复制代码

8 v. O$ m: \& T3 Z, [7 y
) r% A# g% Y; s" ]代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-17 14:05 , Processed in 1.080078 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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