EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 3 u' r- `: E) x4 r8 u

7 |7 T, O7 V0 S* ~  N9 C  p本次IRQ研究了如下:: B  p9 H) B: s) D7 l
VRC2&4(Mapper21,23,25)
3 n. ?! p& ~8 O) ~9 RVRC3(Mapper73)$ b$ Y* {+ c0 i$ e: L( ~; k
VRC6(Mapper24 & Mapper26)
6 F+ q% s' G5 {) o9 k7 I+ j2 pVRC7(Mapper85)
2 [7 Y# `+ ], zMMC3(Mapper4)
- P& H6 g7 C) Z0 D! P, P  CMMC4(Mapper10)9 R: I! [* I! O
MMC5(Mapper5)
' y( D# r3 w, `; t' |: sMapper18' r, E* t% A: G: C4 N: |- b) w
Mapper64% ]/ ~/ }- i* u8 w  E0 i) P0 s5 {  T
Namco163(Mapper19): Q) |" B8 X0 v+ q* L
Sunsoft FME-7(Mapper69)& ^4 p  n6 @: \! R1 J

8 \# z7 p" O* y0 \* c+ c; s$ p共计11种Mapper的IRQ操作使用例子
7 Q- G% T* w. a! M代码内有详细注释, 希望能帮助到感兴趣的人.
3 X" B& \, E( d- I! l+ L* P/ F$ T$ `0 X. C& h. s
+ H1 ~# _) P$ P4 O9 V1 d5 X

( V& D* E4 Q/ `Mapper代码主要逻辑(以MMC3为例):
/ H( m# ?0 v! V& b
  1. # f" o' D/ F8 {2 _1 ]3 q
  2. ;==================================================
      S$ b) F6 g  c: k8 Z9 t3 E& L
  3. ;Mapper号
    4 `. K( y3 M5 l1 ?! }1 J
  4. MAPPER_NUMBER           = 04- S! Y! k( Q  s; k4 U& \8 K! z4 ]4 d" J
  5. ;==================================================
    $ E; Z* F9 K! y  Y. ]- N
  6. ;MMC3 (Mapper 4) 寄存器常量
    * E5 ?5 m9 ~" I5 R) \
  7. MAPPER_REG_BANK_CTRL        =   $80007 P1 _( z2 \" F
  8. MAPPER_REG_BANK_DATA        =   $8001# i9 E8 @% H4 Z' o5 ^
  9. MAPPER_REG_MIRRORING        =   $A000; _) i% F$ P5 {5 W
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0013 _6 R$ M6 \: l  z, R; g; u2 M
  11. MAPPER_REG_IRQ_LATCH        =   $C000+ z( p' v; p3 ?/ S2 _# S/ k8 f2 u+ Z2 m
  12. MAPPER_REG_IRQ_RELOAD       =   $C001% I1 N' k+ G. s( A" C
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    ; r: p( z0 F  _; m, M4 k
  14. MAPPER_REG_IRQ_ENABLE       =   $E001) x% H! e9 {6 v- }9 c& b
  15. ;==================================================
    ' Z, u; r2 M/ V6 A* l: D
  16. IRQ_SCANLINE_BEGIN          = 135: p  T' Q! I% C; \
  17. IRQ_SCANLINE_1              = 81 R0 R1 k* L5 [, V& c6 ]5 E4 v3 ?
  18. IRQ_SCANLINE_2              = 54
    ) W3 h8 V8 W7 S: |" F5 l
  19. IRQ_SCANLINE_3              = 8! e2 N- }1 e) |$ u& W# i% w
  20. ;==================================================9 s* R% @4 N7 f, U* d- D( p
  21. 6 g6 E4 }  m# ?
  22. ;====================================================================================================0 f6 ]- `% J, E$ v3 z- h& d
  23. ;宏常量
    ( k; Z, M0 @/ {; C/ c- ]8 W
  24. ;====================================================================================================7 X, C& I. X: [0 ]

  25. : V" I& U; p- J2 P; U  ?
  26. ;====================================================================================================
    5 [- I/ ]" O/ S/ n; }1 [) e
  27. MACRO_MAPPER_INIT .MACRO
    & r/ x7 W1 i. w. v0 `7 o+ i" |
  28. ;禁用IRQ
    % Y4 _* T# s; g7 w" C
  29. STA MAPPER_REG_IRQ_DISABLE, K0 K2 |, m% I8 b/ ^' i2 k

  30. $ e2 i1 G- z9 Y0 Z/ z, h2 u
  31. ;水平镜像
    , ?4 n# g9 A6 p8 a7 y+ u6 v0 \
  32. LDA #$01
      Y2 @. |0 t% {7 v0 B! ^3 Z+ u1 ]
  33. STA MAPPER_REG_MIRRORING
    ) ^0 C7 {- @; W2 C. z3 g  k. B
  34. / X) t1 d4 |3 B2 c* o) @
  35. ;初始化图形bank$ O/ ~/ R" ~2 s; I
  36. LDX #$05
    8 I9 _- n; I5 L
  37. .Init_Chr_Bank. K0 A3 a0 a$ n* f4 ?9 `
  38. STX MAPPER_REG_BANK_CTRL  t# t1 v4 j% P" ^% X6 u
  39. LDA .ChrBankData,X
    - s2 n: K6 I2 f
  40. STA MAPPER_REG_BANK_DATA
    5 H' }3 K) ~" o' C7 F9 o5 T
  41. DEX* o, l& G( _+ \% i, ?
  42. BPL .Init_Chr_Bank9 J2 y: z$ l: n8 [* D. K( r3 X
  43. JMP .Init_Chr_Bank_End
    : U. @( T: K) l% F7 z* D
  44. .ChrBankData( }( @3 R* V9 K7 R
  45. .DB $00,$02,$04,$05,$06,$07
    ; s$ ?9 C; }, n( [# `" G
  46. .Init_Chr_Bank_End
    # F9 Z( B4 `  [( {$ P

  47. " x  D+ `- i) }/ l  ?  f3 g
  48. ;启用SRAM# O$ j+ E( l: g0 E; b+ Q, V7 D# e9 M
  49. LDA #$80
    + E: T8 i6 [2 T0 T
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    / \! R" d0 e- b/ w
  51. .ENDM
    2 F6 x$ j1 x( }2 `+ }' b& ^7 l# r; Z6 u

  52. & \$ I9 d* [+ d# L, r0 z* _; t
  53. ;====================================================================================================
    ! u: h0 ]$ D: I' u& s2 U
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    * i/ p+ x9 D' {, U# W
  55. .ENDM# k* N  y# G' z6 o1 I
  56. 0 w! Q3 R( G/ B" M! s( P' T; q
  57. ;====================================================================================================
    . ^  _" S, W. i- c4 g
  58. MACRO_SRAM_ENABLE .MACRO
    + @9 h) e6 N. U7 ^
  59. LDA #$80
    9 A3 x; x* r* B2 v6 q! e: T
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    ! M6 ?. J/ T# Q7 l! ]
  61. .ENDM) a% d7 v/ ]- Y1 w) {
  62. 0 p+ `  D. G; D* K& P
  63. ;====================================================================================================. P2 M4 u% @. q# T: k) m. x5 h9 [
  64. MACRO_SWITCH_BANK_8000_A .MACRO9 t, C/ Y( S3 t4 M0 g) Y2 E3 x
  65. PHA7 [5 f7 Y) M% K( ~! I5 h  V
  66. LDA #$06
    / ?+ N2 G4 k# Q0 c, U6 k' v
  67. STA MAPPER_REG_BANK_CTRL
    ) C& E5 q$ Q7 P8 V8 ?- e+ S
  68. PLA$ o+ t. x& h2 h$ d
  69. STA MAPPER_REG_BANK_DATA% H* `9 w5 ?6 `! d
  70. .ENDM
    3 I$ C* h+ o& I# Y+ w. _1 @

  71. $ Y6 z& k1 `+ N) Z! D  N8 D9 w
  72. MACRO_SWITCH_BANK_A000_A .MACRO# _, c0 j* X* b# E. O5 {/ v
  73. PHA
    " Q8 e$ N& m0 B0 @8 R2 f
  74. LDA #$07
    1 N& u8 I7 y/ K0 y" o, K
  75. STA MAPPER_REG_BANK_CTRL3 X% q0 y# K; \# K0 |8 O
  76. PLA' C) J5 E  g  n5 U+ u" i
  77. STA MAPPER_REG_BANK_DATA8 E8 B: N5 r. S2 d# J8 M7 Y
  78. .ENDM
    6 b! y# a6 M4 a' M$ s9 [# _

  79.   i7 |2 ^4 ^. O" E+ B/ p0 Y
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    3 @0 _5 ^$ ]2 n3 `' J
  81. .ENDM
    1 B7 s0 x/ k1 ~; X3 ~" P# V

  82. # m  S  N8 }6 u7 [( `- K$ Y5 u; e
  83. MACRO_SWITCH_BANK_E000_A .MACRO
      o) a4 L" z( K2 d8 l4 r/ a$ ^
  84. .ENDM
    ! p3 D2 x$ N: r1 D
  85. 0 k1 N2 H- G1 ^
  86. ;====================================================================================================
    - `) g2 d% r7 q) Z1 m% k6 g
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    5 S+ X/ c0 [  E" M
  88. LDA #IRQ_SCANLINE_BEGIN + 1% I0 x/ D6 u, S" s, m7 ^
  89. STA MAPPER_REG_IRQ_LATCH
    : {. n' L* j6 q
  90. STA MAPPER_REG_IRQ_RELOAD/ _* N7 y' b( g3 y+ b/ a) P, ?
  91. STA MAPPER_REG_IRQ_ENABLE
    ) v, w7 U6 J* H7 P9 T( ?- a! D9 o8 g
  92. CLI  _1 w4 u( C# F) \6 F! _5 k
  93. .ENDM3 l1 J+ s: S) m
  94. " l1 _5 |' i6 V) M: o: B+ S
  95. ;====================================================================================================3 }" S# e) U$ K: f# |  T6 J
  96. MACRO_ENABLE_IRQ  .MACRO0 d6 L( b/ q% B( u3 O
  97. STA MAPPER_REG_IRQ_ENABLE$ O# m3 k' k7 u. G
  98. .ENDM& ~  p- f/ m. M- n+ l0 S& t

  99. 4 v( J; Y) w: n, {6 g8 N
  100. ;====================================================================================================
    : R. O0 O" E! b; n0 \$ o2 H0 ^
  101. MACRO_DISABLE_IRQ  .MACRO
    5 f3 M4 C0 `, b, C
  102. LDA #$00& n$ k0 M0 r* t3 V- I& M- v
  103. STA MAPPER_REG_IRQ_CTRL
    1 j3 Y$ H3 I5 A
  104. STA MAPPER_REG_IRQ_ACK
      ~3 w6 B: t+ G
  105. .ENDM  d. ?. R/ F9 \! h6 U, }

  106. 9 a% K, d7 K; ?! ]  x
  107. ;====================================================================================================
    ; A8 e- v5 k; v* |' b6 t) ^
  108. MACRO_ACK_IRQ .MACRO
    / Y* e7 I' f# D$ d
  109. STA MAPPER_REG_IRQ_DISABLE! _9 N" ~2 V: H4 G; I
  110. STA MAPPER_REG_IRQ_ENABLE: c+ [  C$ ~" l/ z
  111. .ENDM
    , G1 s0 A0 S$ K
  112. ' l0 a) Y2 I+ L  Y* a# O: m, J
  113. ;====================================================================================================
    8 P6 Y  X. o. e; F
  114. MACRO_IRQ_OPERATE   .MACRO
    8 a/ S0 c' V; ~/ U+ ~8 z; j9 j0 e
  115. 5 ?# P$ P+ y. L
  116. ;==================================================
    7 z  X& L: H6 Q' ?+ [/ [1 o+ q
  117. ;IRQ滚动模式常量# y' G! k0 L; I
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动6 x' q1 |1 D% t; K  p+ s( j
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    . q# p" ?7 d% m9 M' S* S! x
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动  A% F; ~2 {2 _. C
  121. 4 P- e) f5 q! x3 b+ p2 c) q
  122. ;IRQ扫描线数据
    ! r% m- W/ i' q* y
  123. IRQ_Scanline_Data/ T7 S$ M$ u+ z
  124. .DB IRQ_SCANLINE_1, c/ s5 F& z; t. Q7 P+ [2 P
  125. .DB IRQ_SCANLINE_2
    . E- U: U4 i5 ^3 d
  126. .DB IRQ_SCANLINE_3
    / {1 `8 D6 |, S
  127. .DW 00 ;关闭IRQ
    + _  \" w- v4 V( F& z/ b

  128. 6 W. N2 o! ?) |" |5 Z/ `" Y
  129. ;IRQ滚动控制模式
    . f4 m( S  I/ v% {' H) x# B
  130. IRQ_Scanline_Mode0 y0 B2 `5 M5 I
  131. .DB IRQ_SCROLL_MODE_RIGHT* p4 |6 e- J/ U5 ]3 I: ^4 g8 m, S
  132. .DB IRQ_SCROLL_MODE_LEFT
    2 x* e: i' I' I# c+ \
  133. .DB IRQ_SCROLL_MODE_RIGHT" Z1 c& u0 l8 u
  134. .DB IRQ_SCROLL_MODE_LEFT/ g8 G( W1 v$ F( M  t

  135. 3 N8 D1 o% @. C# a4 p
  136. ;==================================================
    7 w3 \2 V3 D- u
  137. ;;IRQ滚动控制
      T! K) p1 o+ X/ B3 t9 m
  138. IRQ_Set_Scroll8 ?: r; X, T6 L
  139. LDX IRQ_Process_Index0 \+ l, b7 d% z+ ]/ J- V$ ]
  140. LDA IRQ_Scanline_Mode,X2 F+ p( a; z, j& d8 K8 |
  141. CMP #IRQ_SCROLL_MODE_LEFT! Z" L# M( w/ Z# _
  142. BEQ IRQ_Set_Scroll_Left
    * X3 M4 k/ d- l
  143. CMP #IRQ_SCROLL_MODE_RIGHT# W5 v, }& a% J+ Y
  144. BEQ IRQ_Set_Scroll_Right  [2 c4 J/ c  y, b! }
  145. IRQ_Set_Scroll_Zero;不滚动! V; A7 X9 L5 }/ Z1 T
  146. LDA #$007 g% S9 o/ Y# K+ E+ L# u8 j4 {( c
  147. STA PPU_SCROLL' b% t) z& u, v8 g4 Y! L
  148. STA PPU_SCROLL" p. p: S& N% J- Q6 `
  149. RTS! {: g4 n" p' t8 j' b
  150. IRQ_Set_Scroll_Left;向左滚动
    8 H$ @3 s! S0 {9 F  P, k& ?  L+ b
  151. LDA Scroll_H
    1 k1 w' T9 P# }" |
  152. STA PPU_SCROLL
    / s0 t+ o4 z4 }  X+ b) h
  153. STA PPU_SCROLL" Z: D8 i# ?2 c# y9 P3 X: _
  154. RTS
    & t* J1 r  J- H) O$ O
  155. IRQ_Set_Scroll_Right;向右滚动& ?# I. W; ^' z4 I5 r4 b
  156. LDA #$00( R- r% L. z7 s9 |- t8 O
  157. SEC/ M$ x# a/ R& B5 N9 D" v6 M1 w
  158. SBC Scroll_H
    % @) N" ~0 a7 V
  159. STA PPU_SCROLL
    2 A) x  c3 X7 A0 y. c# L1 m$ o
  160. STA PPU_SCROLL: |7 F. C$ h. X1 i+ g& m
  161. RTS
    5 u3 O$ B! Q' U8 R0 ?
  162. , K0 s" Q. G: @; v+ [, ^6 Q& e
  163. ;==================================================) p* S, a$ ^% i% B& l
  164. ;;IRQ滚动控制  l$ L8 w' j: p0 _+ @. G! \
  165. IRQ_Set_Ctrl! k1 V. C7 p, H+ ]5 ?5 [" e; {
  166. LDX IRQ_Process_Index4 `4 l: H9 A! i/ t
  167. LDA IRQ_Scanline_Data,X
    ! _' ^3 }6 m0 @9 @1 i
  168. BNE IRQ_Process_Latch
    # X, J' C6 J9 b; _9 Y
  169. IRQ_Process_Disable;禁用IRQ9 s% W0 n" B6 U% k) ?
  170. STA MAPPER_REG_IRQ_DISABLE
    7 h/ Y. m7 s; L1 I* S4 Z
  171. STA IRQ_Process_Index
    ( z. E3 q% v5 L% \- H
  172. RTS; |. O4 D! Q$ r# _
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线: Y3 q5 x* Q! e3 P8 Q
  174. STA MAPPER_REG_IRQ_LATCH7 \% Y4 d8 m  b- h; U3 V' F
  175. INC IRQ_Process_Index/ w/ I. j: b& a, G6 v3 t
  176. RTS, t$ Y! u, y4 _& t; c

  177. " D# g$ s- j$ h! q5 d" G& F
  178. ;==================================================
    1 T  W9 Z9 K& f7 n' b( O6 a
  179. ;IRQ处理
    / t2 q# E3 v) C4 P0 Z& r9 y
  180. IRQ_Process_By_Index/ Y3 b6 Z: t% f
  181. JSR IRQ_Set_Scroll' b5 }: A% r; m$ m3 h% d
  182. JSR IRQ_Set_Ctrl
    # C  e$ D* G% R5 n! i
  183. IRQ_Process_End
    # ~% ^% y, m; r* ?4 u$ G; S: L, ?2 `
  184. RTS6 P5 Y. w4 x8 [6 l$ I0 S

  185. 4 y4 u' b0 v  S+ d; q* H$ O: @
  186. .ENDM5 _4 m; Q) ]5 w7 S" G# y" X
  187. 3 g$ h( o4 z3 k5 c0 b( U( Z0 `$ U6 P
复制代码
! T: w  o1 z, R' U7 ]
# b* J, r: W+ @6 x8 y
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-10 13:51 , Processed in 1.117188 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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