EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
- q- E& j8 }' @7 D: V# ^2 ]. w& c; @: s$ S
本次IRQ研究了如下:2 y# `; h; s$ @. K' v0 B: B
VRC2&4(Mapper21,23,25)
) `( ~7 i3 S- JVRC3(Mapper73)  J2 k) G/ x( a2 N) O& C" X
VRC6(Mapper24 & Mapper26)& n, k" Z; b, P. p1 J
VRC7(Mapper85)" V, R. y" G0 k" |& c# T9 L0 T  q
MMC3(Mapper4)
  I; h" E7 s4 g4 `7 [" \MMC4(Mapper10)! h( e9 `: d. y' _, z+ T4 }3 L5 n
MMC5(Mapper5)! s  T; I1 G5 Z- J7 V
Mapper180 W  R. n6 O6 q3 Z* C) a4 z
Mapper64
+ U$ T/ H. W  F# J$ z. p+ p' e/ QNamco163(Mapper19)
* `( e8 O- p  U% w5 e+ t: u2 ESunsoft FME-7(Mapper69)
. R1 L( R) E0 W/ v
0 @1 W2 I- S) @" ~" b4 a共计11种Mapper的IRQ操作使用例子$ O7 O$ i  e  X9 H4 u6 b
代码内有详细注释, 希望能帮助到感兴趣的人.  w6 _& q" Q$ o7 T: H
( r8 }$ f) o) N5 A! q1 f

* v9 \0 f$ N7 j9 o5 m- w/ C: ]8 u$ z: D
Mapper代码主要逻辑(以MMC3为例):
% {9 f) J% |; Y2 w" D7 U, Q
  1. : O# p& B( M& P
  2. ;==================================================
    2 B8 l0 ^$ @# [5 Y# s" r
  3. ;Mapper号
      k; _6 q9 L3 _" p4 ?
  4. MAPPER_NUMBER           = 04
    # v1 U- J. k$ u$ e
  5. ;==================================================* f9 v3 s! ]1 J. }0 Q5 h
  6. ;MMC3 (Mapper 4) 寄存器常量  T& M; T- i: k: `. d* x
  7. MAPPER_REG_BANK_CTRL        =   $8000- T) ^% `+ ~! j5 O
  8. MAPPER_REG_BANK_DATA        =   $8001
    / L3 n( E+ S8 _: V4 m* j
  9. MAPPER_REG_MIRRORING        =   $A0005 K, `& J' Y- w) Q. [4 H
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    6 Y  R. k4 W8 K
  11. MAPPER_REG_IRQ_LATCH        =   $C000# Y7 L; [! c  K" Q* r+ h
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    - @! W8 v1 J1 M% o! Q8 u
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    1 p! s# V" r; A/ v
  14. MAPPER_REG_IRQ_ENABLE       =   $E001) O% c2 \8 G8 j5 _- {6 Y
  15. ;==================================================( n0 o; r9 o+ W, G2 D1 w3 r2 s
  16. IRQ_SCANLINE_BEGIN          = 135
      C  v2 A' _7 s; u  f
  17. IRQ_SCANLINE_1              = 8
    9 I+ l" `' W! a. z  \
  18. IRQ_SCANLINE_2              = 54
    5 k* a* _- E! `( b' n
  19. IRQ_SCANLINE_3              = 8
    # T" s4 b. j* Z2 R8 W
  20. ;==================================================3 t5 @2 v1 `$ P3 H& X
  21. ; q( [( X; f/ R. D2 q
  22. ;====================================================================================================1 o. Z1 p( |" r+ Y2 C# v2 m
  23. ;宏常量
    ! Q# j0 \2 [: ~0 d& V
  24. ;====================================================================================================* Y4 Y* |5 C' A
  25. ; J% I% |+ j; j2 E' ^. a
  26. ;====================================================================================================
    " E5 h5 D( {3 o' A( S, x4 e
  27. MACRO_MAPPER_INIT .MACRO
    1 Q* k6 C& g& U4 f) G
  28. ;禁用IRQ
    ) Y% b- ]5 P+ ]5 @9 T( j( d5 [. p
  29. STA MAPPER_REG_IRQ_DISABLE
    : k- P+ B% E3 j" b5 X% t

  30. 1 y( V7 R6 [' G8 p* f4 W% |- [0 \, f
  31. ;水平镜像
    , s0 I3 G0 p" g) `
  32. LDA #$01
    1 H; d6 @) q2 `' P5 I
  33. STA MAPPER_REG_MIRRORING1 R- z) E8 v" \
  34. ! f4 E% L# X. M; W6 Q# z- t& w! L
  35. ;初始化图形bank7 {8 ?2 x, x1 F: @9 @
  36. LDX #$05- G3 I- Y3 L) c/ f% Q
  37. .Init_Chr_Bank2 p; `; v. u" n) H" M0 g! `
  38. STX MAPPER_REG_BANK_CTRL
    - p) g7 t" a& `* \
  39. LDA .ChrBankData,X
    % A" I: |6 N! s5 W
  40. STA MAPPER_REG_BANK_DATA
    " Z% A2 h1 B3 w6 x0 q/ o
  41. DEX' q. Y$ ?. E- f1 G
  42. BPL .Init_Chr_Bank
    : x- Y0 }) w  l1 r' H. ]% D& A
  43. JMP .Init_Chr_Bank_End7 K4 t% l9 L3 t7 ~. s! l
  44. .ChrBankData7 M1 C. ~( i! d
  45. .DB $00,$02,$04,$05,$06,$07$ f4 X8 B$ j7 H0 V# r; p
  46. .Init_Chr_Bank_End
    2 q8 D# f6 P  T4 v8 {  a

  47. 7 m) G2 ~1 j8 u" E, c
  48. ;启用SRAM
    $ B2 v3 W2 ^/ h
  49. LDA #$80- v' x- a7 A+ C) _
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    ; w* a) A: ^9 r1 P/ m% D
  51. .ENDM2 G) i( _4 ^. g, M5 b
  52. & n7 F7 ?  |9 s7 s: Z$ r
  53. ;====================================================================================================9 \/ n) r0 p9 N
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    0 {$ h9 O( B+ r9 w
  55. .ENDM( q: F% V7 x* z

  56. 2 z7 _  h1 h9 T
  57. ;====================================================================================================
    , Q* r$ L6 {' S: c2 j! D0 O' B* w' n, ~
  58. MACRO_SRAM_ENABLE .MACRO
    ; V8 I: h' G8 c+ c+ [5 ^
  59. LDA #$80: a0 p, M, l- F: K. H6 Y
  60. STA MAPPER_REG_PRG_RAM_PROTECT
      h: b5 y- u; P* r& G
  61. .ENDM0 ^; r( C  ~8 v% @/ \( Q( j& U, i! r1 w
  62. - g/ o7 ]& k$ [  H9 s2 \
  63. ;====================================================================================================7 _/ _7 Y2 b5 ^/ |& a+ @
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    # e- V$ C/ s! Y1 g  j
  65. PHA
    # X. S0 n4 a4 Y
  66. LDA #$06
    . L' a5 |. `1 A5 e
  67. STA MAPPER_REG_BANK_CTRL
    . E  f& v2 I1 }( o% t
  68. PLA
    6 J* z# `5 b5 Y# d( X8 m
  69. STA MAPPER_REG_BANK_DATA$ [$ h; \; ~9 Y! a+ [0 Y& O
  70. .ENDM
    1 [- J$ Q  v5 m3 `6 D$ H
  71. ; y  p0 Y% C; B5 c4 z# E
  72. MACRO_SWITCH_BANK_A000_A .MACRO" R2 Q  J& M2 U
  73. PHA
    2 q0 p! w; ?3 ~  @& v) m9 U4 v
  74. LDA #$07
    $ b$ o- S! O0 J4 M
  75. STA MAPPER_REG_BANK_CTRL5 N2 I$ ?* m/ v  h  X, X7 @8 ?
  76. PLA
    ( R- W- F5 z/ u+ `' l0 q
  77. STA MAPPER_REG_BANK_DATA3 m# e5 t, V. `+ E
  78. .ENDM+ @; |* t! L% r6 H( R4 d* b0 B

  79. # A$ L) x2 o% ~2 d2 ^# Z0 ]
  80. MACRO_SWITCH_BANK_C000_A .MACRO5 Y/ _1 s7 w+ S5 v
  81. .ENDM. w1 i, Q2 J# i/ N% x5 h( z
  82. " l5 ]( \5 T( V8 {) R) n. c
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    / a4 d  }, ]9 T% U( V4 o5 D3 b
  84. .ENDM# s, ~! V3 H5 D7 e1 [& f2 t

  85. 4 A8 w( Q3 ]# r3 U! r7 L' Q$ V
  86. ;====================================================================================================# ]* A) h7 X, }: i
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    2 {/ Y3 c2 o; O5 j! G- p
  88. LDA #IRQ_SCANLINE_BEGIN + 1% o7 h; ]; A: v+ }* Z. C0 j3 \
  89. STA MAPPER_REG_IRQ_LATCH
    0 m5 p% V  H- b$ H$ b% q
  90. STA MAPPER_REG_IRQ_RELOAD; e. v# G) m2 \
  91. STA MAPPER_REG_IRQ_ENABLE
    $ i5 C6 }" B5 ?, C' y9 A
  92. CLI
    6 U' x( Z8 E! P: u
  93. .ENDM& X+ y. E9 G3 i& u

  94. ' Q3 f/ Y1 I. O% S' `
  95. ;====================================================================================================
    " S* Q! g+ r1 W5 P% E
  96. MACRO_ENABLE_IRQ  .MACRO9 L' W5 R- {# T" n$ [, }) x) D
  97. STA MAPPER_REG_IRQ_ENABLE. I" \" o9 Z) Z, b8 ?
  98. .ENDM) J3 T3 j- s4 p& U8 Q0 g& {
  99. 0 m7 ^' w* a8 U! }
  100. ;====================================================================================================
    # w$ @- h& }; z) H6 d; C/ T, I  M
  101. MACRO_DISABLE_IRQ  .MACRO
    & P7 L' I$ }. l: X! t3 O
  102. LDA #$00
    5 A5 t3 e7 U% @
  103. STA MAPPER_REG_IRQ_CTRL
    7 c, n" u7 r/ w7 `  `8 s: ]
  104. STA MAPPER_REG_IRQ_ACK! S% P( X  e- @* a+ S" e
  105. .ENDM8 v% }3 J. D) \

  106. / L1 A. i# X0 k# y/ Z& c
  107. ;====================================================================================================
      h3 b. [! W& i8 b2 j( {8 @
  108. MACRO_ACK_IRQ .MACRO- c. G7 t  D0 v  {, i7 m
  109. STA MAPPER_REG_IRQ_DISABLE: W: y' L) v# Q) _4 x- n% L1 Z6 @/ g
  110. STA MAPPER_REG_IRQ_ENABLE
      [: `) K4 ?) }: m
  111. .ENDM; X  c7 e6 i# f- j1 \' b, j

  112. , h$ P; l! O5 c7 h( M
  113. ;====================================================================================================( Q9 ~; |% t/ |! q" Z
  114. MACRO_IRQ_OPERATE   .MACRO
    1 x1 q5 q* K7 R$ B+ O9 b9 u
  115. 7 Q2 E* t9 K' S, j4 d( b2 R+ j# f/ [
  116. ;==================================================0 ^' C$ a' H5 I3 z& y# ^
  117. ;IRQ滚动模式常量5 |/ {2 K, Q1 f. h( ^8 i3 Y
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动- ]3 M7 ^) D2 `* U# `$ l; C* z
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动% q; x$ c' g& T
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动6 N+ F& U+ z8 u6 Y5 v! k) Q( y
  121. - v: L5 K- L; ]2 n
  122. ;IRQ扫描线数据
    " f. H% m: ?8 \6 _, R9 f; {
  123. IRQ_Scanline_Data
    ' d: }# ]+ L7 F8 S* `
  124. .DB IRQ_SCANLINE_12 i9 V% f, ]5 h' l- n
  125. .DB IRQ_SCANLINE_26 O: ~: e, P4 k1 j3 c
  126. .DB IRQ_SCANLINE_35 H! x# f! m. Z* l6 }
  127. .DW 00 ;关闭IRQ
    % ^: }, H$ j1 u- c; Q: Z4 e
  128. 9 T2 T8 ]0 i! |! g
  129. ;IRQ滚动控制模式' D/ M8 h4 H" Z, P
  130. IRQ_Scanline_Mode
    % c" i. A* t. F; K' V) K
  131. .DB IRQ_SCROLL_MODE_RIGHT7 o8 D! l' _% r8 P! i
  132. .DB IRQ_SCROLL_MODE_LEFT) [5 Y4 Q- h. ~2 g' @2 I1 ]' `
  133. .DB IRQ_SCROLL_MODE_RIGHT
    ) C! @: J9 w1 Y, X
  134. .DB IRQ_SCROLL_MODE_LEFT2 ?( k% T( W) s  @

  135. ! ~0 ]6 }) k2 ^  P- T5 \
  136. ;==================================================6 D" i( \3 p+ o" m9 c3 Y
  137. ;;IRQ滚动控制/ v% {1 V2 [+ r
  138. IRQ_Set_Scroll+ H% j& H% G+ p. A  M
  139. LDX IRQ_Process_Index/ H- W5 `/ |! k7 M; S6 L7 s
  140. LDA IRQ_Scanline_Mode,X
    # p% R" d) J) e) \8 G8 W
  141. CMP #IRQ_SCROLL_MODE_LEFT7 H7 S" a9 ^- M7 M
  142. BEQ IRQ_Set_Scroll_Left2 Z& R7 d/ r9 x: t2 U6 _) G/ b+ c
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    0 ?* a5 U0 l! S; v  N% _( i) n5 x
  144. BEQ IRQ_Set_Scroll_Right
    * O# i: }& s- M( R& [- a
  145. IRQ_Set_Scroll_Zero;不滚动  k% y; a( T& f8 S5 W  s
  146. LDA #$000 v; k$ i4 K7 B6 S+ M: c
  147. STA PPU_SCROLL
    ( z2 c# h% h6 Y/ G1 j2 Y7 C5 ~
  148. STA PPU_SCROLL
    ! n* X7 _9 j+ n  m3 w$ D
  149. RTS
    $ e( [9 z, M! O; X+ b2 O" O0 I: E
  150. IRQ_Set_Scroll_Left;向左滚动
    . U; y  K- f- S
  151. LDA Scroll_H
    1 D4 y: s( f. V+ F! y& K$ u
  152. STA PPU_SCROLL' }' G8 g, \( n" z9 M- s
  153. STA PPU_SCROLL
    . w" r$ v; k. X  b& J3 W. C; q
  154. RTS
    0 B2 T  [$ y7 N1 Y1 ~3 R. {5 a  j
  155. IRQ_Set_Scroll_Right;向右滚动
    " m7 ~1 ?) O. n2 q! J
  156. LDA #$00
    - m+ U' V& d9 I1 w- o& B: A
  157. SEC2 g4 y% B" ^+ n) p0 E8 b9 `  ?
  158. SBC Scroll_H1 e$ u+ E/ H7 J, ^- ~2 i
  159. STA PPU_SCROLL
    & P* g1 Z. l% f4 n! H6 {
  160. STA PPU_SCROLL( l1 B% _9 R( H' K0 d1 h% L0 x
  161. RTS) m6 C: u1 h& A/ k1 q( B

  162. / \% @% Z9 _0 i, `+ _  H
  163. ;==================================================8 [/ c0 K# Z, V8 `9 v
  164. ;;IRQ滚动控制: U* e: U3 H0 g/ p3 Y
  165. IRQ_Set_Ctrl
    4 C8 b( l7 z0 O: E* w6 s9 o
  166. LDX IRQ_Process_Index  D1 }( k. V+ @. t  t6 R: w3 ^! g
  167. LDA IRQ_Scanline_Data,X6 v6 S' M$ D. |; l& [2 i
  168. BNE IRQ_Process_Latch
    ) q# v5 D* g( Z8 O5 Z
  169. IRQ_Process_Disable;禁用IRQ3 j0 B, n. k/ v( ]/ w. N
  170. STA MAPPER_REG_IRQ_DISABLE* a+ a+ I" Y: S, J8 b+ f
  171. STA IRQ_Process_Index3 ^3 }5 D. J, c) k
  172. RTS: e+ c) v$ ^. T- [$ e7 _' d2 |
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线) A+ _7 F1 \" N) t5 W2 T
  174. STA MAPPER_REG_IRQ_LATCH) v; H4 J0 S. h; b
  175. INC IRQ_Process_Index
    + D- Q/ q( S# i  ]' I6 a. W
  176. RTS
    : s; d& B! t: L# Y
  177. 3 Y0 ~6 B7 s& M8 z/ N: E
  178. ;==================================================
    " P7 O/ p2 C; V2 M2 \
  179. ;IRQ处理: h. v' M/ s  ?3 R' `
  180. IRQ_Process_By_Index' w" c1 H. I( t" y
  181. JSR IRQ_Set_Scroll
    6 @3 a8 f4 J9 B- M1 g
  182. JSR IRQ_Set_Ctrl+ o4 o. ~* ]3 ^, T
  183. IRQ_Process_End* j2 P% u  H  ?4 p; H3 V
  184. RTS" V  _, B/ Q5 h3 B2 v- ~( Q, a
  185. 9 a8 W0 M& _" w* p
  186. .ENDM
    " J2 Q" q" d8 `9 D

  187. : L, \& ^% Q5 |1 B' E# B9 t- i
复制代码
+ x& U: D4 q. E3 a8 H7 X
' `$ ?! y) z0 I' s1 H7 ~
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-2-17 08:09 , Processed in 0.062500 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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