设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
% \0 G. d5 Y1 O
! S' E# q8 q5 ^8 n( d本次IRQ研究了如下:7 u! @9 J8 o8 d6 v2 M$ ]1 e8 d$ L
VRC2&4(Mapper21,23,25)2 C3 E# b+ v( G$ L
VRC3(Mapper73)' L+ }7 X9 M! ?6 J4 n0 r( Z
VRC6(Mapper24 & Mapper26)
8 b5 N* V- t7 B  hVRC7(Mapper85)
; O- G4 B# Z6 t+ G7 `$ h- n2 Q: d& yMMC3(Mapper4)
( F' U  i) v, Y: i( LMMC4(Mapper10)
; U+ e$ V" e( ^* g& m' Y& H# i5 }MMC5(Mapper5)
2 O: o3 r, l& x2 g: tMapper18* s" z. H0 ~" {8 w6 I9 m; d
Mapper64# b* q3 B, Y- c# c6 }& ?$ ]7 Q# A* F
Namco163(Mapper19)* e2 e6 O, g  A, `- i
Sunsoft FME-7(Mapper69)  |+ Q% K6 v' W+ v6 i( l1 {6 J

, C' ~0 }1 U) L; p共计11种Mapper的IRQ操作使用例子: D6 t  Z4 e& j4 g( ?+ G/ c
代码内有详细注释, 希望能帮助到感兴趣的人.
' \/ Y% w/ P! k- E3 e: Q) a* k: d4 j( Q7 V

) j5 W) C# T! G  a# q
2 y6 T2 l3 z" MMapper代码主要逻辑(以MMC3为例):
5 P3 A! O" O1 [+ M

  1. # I# E9 u; f* ~8 U
  2. ;==================================================
    ( r& W  P1 K4 @# _% S% \
  3. ;Mapper号
    2 v" b! D! ^% c) w/ Y
  4. MAPPER_NUMBER           = 04
    : D0 s. i2 ^# n0 u
  5. ;==================================================- P9 G6 i% d8 D) d
  6. ;MMC3 (Mapper 4) 寄存器常量5 V1 c# V' ^) B9 @! ~+ ~
  7. MAPPER_REG_BANK_CTRL        =   $8000: P( c; z4 T2 A6 k1 H! z1 o6 T
  8. MAPPER_REG_BANK_DATA        =   $8001( o8 i7 m9 l& g, P) T
  9. MAPPER_REG_MIRRORING        =   $A000
    . b$ C* A, p0 z8 a  ~7 \# B
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001+ d1 M! L6 Z2 \" b- a
  11. MAPPER_REG_IRQ_LATCH        =   $C000. q# F# g$ \0 V# x$ ]% r, {
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    7 ]# H8 x6 O. _
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    5 W  M3 u1 ^1 }+ _. A' P; Z1 L
  14. MAPPER_REG_IRQ_ENABLE       =   $E0013 E0 a7 p) `9 _. p/ o3 l4 l
  15. ;==================================================2 t) `/ G1 A5 R% h; N! q6 N/ }
  16. IRQ_SCANLINE_BEGIN          = 135+ d3 A( _8 T3 F$ M
  17. IRQ_SCANLINE_1              = 8
    : \) i0 S9 j: N5 i6 l: |
  18. IRQ_SCANLINE_2              = 54
    5 \) M$ w% C! t1 \+ k  x2 |. ~, `
  19. IRQ_SCANLINE_3              = 89 k% O+ J! c4 B7 L
  20. ;==================================================
    - m2 P9 G7 x) b6 \. L: f3 M4 Q
  21. 2 P- e% {2 R/ I1 D: i
  22. ;====================================================================================================
    - q2 p" U" D, U* y2 b3 h/ y* z
  23. ;宏常量
    " g$ R0 H- N$ V* m; B
  24. ;====================================================================================================
    - z$ k- H& X! n: _# n
  25. & ~4 S. N3 r8 a
  26. ;====================================================================================================( \) U  g( I6 R7 I3 U  O
  27. MACRO_MAPPER_INIT .MACRO
    ' i) O1 p1 `7 W8 Q! f
  28. ;禁用IRQ6 f9 _5 I$ R+ j, _5 M5 U
  29. STA MAPPER_REG_IRQ_DISABLE7 Y; C2 q" p4 ?* @# Y% w. j

  30. , g/ X- w: J/ b- r8 v, u& V5 z/ C
  31. ;水平镜像
    # [! c! [& n! D8 _( |: M
  32. LDA #$017 S' J4 W" s. N( u2 ^7 ?
  33. STA MAPPER_REG_MIRRORING
    ! x8 C* D) y# o" j! Z; C) n$ }, I

  34. * `+ M5 g; P7 E/ [
  35. ;初始化图形bank, X# e  F1 F+ d: S& l$ [
  36. LDX #$05
    , A- R: ]* v  L' n
  37. .Init_Chr_Bank1 j6 V/ @1 s1 \; c
  38. STX MAPPER_REG_BANK_CTRL6 C& `0 V# z( ~: B( x1 N* i
  39. LDA .ChrBankData,X# j. w( O9 ^- ~* Z) A
  40. STA MAPPER_REG_BANK_DATA: K5 v; ^$ w  H
  41. DEX: J% z: [2 ^  Y1 X. V7 C
  42. BPL .Init_Chr_Bank
    & `4 ^1 L0 b4 `
  43. JMP .Init_Chr_Bank_End
    9 m9 ?" W7 t1 u8 i5 q
  44. .ChrBankData
    1 {3 w7 ]7 [  N, ~9 }' _
  45. .DB $00,$02,$04,$05,$06,$076 ~0 P+ Y6 `! Q' c
  46. .Init_Chr_Bank_End0 D  p# A* p1 z

  47. * b$ _1 @9 C8 F$ h2 _% m
  48. ;启用SRAM) E$ V# b& j8 i" V. k8 A2 r: P
  49. LDA #$80: g2 r7 P7 c0 Y$ e
  50. STA MAPPER_REG_PRG_RAM_PROTECT. }$ \! u8 [* W6 ?/ T* A& h
  51. .ENDM
    " O! I  ?: D  S2 F4 p& F, d- I

  52. ' n# {; I1 ?' {2 L8 a
  53. ;====================================================================================================6 y, {) a( |) e8 N$ ]
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    $ \7 I- n4 k6 R: p9 s' j+ v
  55. .ENDM
    3 W2 |8 b, |- b( }
  56. ' f7 b/ _; y4 F& D
  57. ;====================================================================================================
    , d0 p2 a* L& A/ S, x
  58. MACRO_SRAM_ENABLE .MACRO" P0 W0 _" C0 S
  59. LDA #$80
    ' U3 S& z+ C% o! W1 W/ f* h* g
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    " o6 w4 i4 P- p# E% a/ U
  61. .ENDM" E( \: d; a0 C0 }  Q, Q
  62. $ |2 B5 ~5 L: {* d9 I8 w
  63. ;====================================================================================================
    5 ~6 i9 ]6 `9 ^3 g9 [
  64. MACRO_SWITCH_BANK_8000_A .MACRO: z: n! {! f! y3 H9 Y
  65. PHA
    6 \1 S. _* u& B6 x. z
  66. LDA #$06
    & _& [, U9 x9 b& P# r9 k
  67. STA MAPPER_REG_BANK_CTRL& S9 a) C, ^" V3 B4 r
  68. PLA; c8 i( x+ G2 C, V( a4 A8 Z  F' I1 |
  69. STA MAPPER_REG_BANK_DATA, M  I1 r. j) G% F; k
  70. .ENDM
    ; G' V- [" ~6 ]& [: Z

  71. & o+ ?& b: `3 o( c, ~& T
  72. MACRO_SWITCH_BANK_A000_A .MACRO( @# Q( P% X. I  c4 \1 o
  73. PHA: R) q; W- P' |2 P& e2 t
  74. LDA #$07
    ; Q% ^9 B9 e( ]9 n( \7 i$ `
  75. STA MAPPER_REG_BANK_CTRL
    4 ^# j) o) V2 E! y4 R
  76. PLA
    - ]1 S9 ^1 B1 }: z8 A; q3 C, U$ D
  77. STA MAPPER_REG_BANK_DATA
    # d5 m" g" C) {
  78. .ENDM
    ' h$ j/ g0 y6 Y0 K6 Y
  79. 0 K& t& H/ I/ V: S: G/ z
  80. MACRO_SWITCH_BANK_C000_A .MACRO; n) Y# ?6 N; g
  81. .ENDM
    + j' F1 `7 N# x1 s) W) K

  82. " A8 B# k9 X5 t/ v5 U
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    0 L- D. f" N9 G
  84. .ENDM6 x/ l+ |+ i5 D2 r+ c9 V7 L. e

  85. ) n* ]& D% v( ^, d/ m; k
  86. ;====================================================================================================" V4 Q1 \: O4 \- ~
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    ! j# n/ E, g" P$ R) M: W0 l) x5 V
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    : x$ P9 z% [& [1 S# Y
  89. STA MAPPER_REG_IRQ_LATCH2 V1 |& V) `" o3 C! d4 B/ G
  90. STA MAPPER_REG_IRQ_RELOAD/ w- Q0 I7 G9 s
  91. STA MAPPER_REG_IRQ_ENABLE
    8 T7 U8 x# o. N
  92. CLI4 V; X2 D$ B* N+ ?$ L1 P. G7 v6 ~
  93. .ENDM6 k% R2 [" P( [, G0 A0 g; F

  94. * g; H1 C4 n2 a) n/ A$ A
  95. ;====================================================================================================7 I0 {) O0 A8 t5 M: v$ u
  96. MACRO_ENABLE_IRQ  .MACRO
    6 E% L6 B2 a) j  |
  97. STA MAPPER_REG_IRQ_ENABLE7 p6 ^. h5 p  L, V+ r
  98. .ENDM
    * O- }: t6 m# t: w2 b/ D* x

  99. ! c" n& {7 d) O( e
  100. ;====================================================================================================  _: F% K. z5 B
  101. MACRO_DISABLE_IRQ  .MACRO1 k& w# H- |$ S. F% y
  102. LDA #$00
    6 e1 f8 q$ N% m: C
  103. STA MAPPER_REG_IRQ_CTRL! Q/ M$ h+ |0 w& p3 e: ]- T0 `0 }
  104. STA MAPPER_REG_IRQ_ACK, p, |: f! O# g2 J6 D* ?
  105. .ENDM$ V2 T) Z/ q: s8 e  R4 }% L! ?6 {5 ?
  106. 6 r" [" O& ^" @4 U# }
  107. ;====================================================================================================( b+ l0 v, R+ t3 q( p4 z" h
  108. MACRO_ACK_IRQ .MACRO8 V" p. i  P# r2 g* V2 f; p9 a
  109. STA MAPPER_REG_IRQ_DISABLE$ _' Y- p% s% ]4 L9 ^+ b8 d: d0 _
  110. STA MAPPER_REG_IRQ_ENABLE
    - P# {9 I' M4 o* A* u4 P6 Z9 \
  111. .ENDM
    1 Y- {9 b9 ]: S5 D% `' U5 d
  112. ( s% |9 O4 l" F( t
  113. ;====================================================================================================8 {/ [% d' ^; }. v& \! j4 \- O
  114. MACRO_IRQ_OPERATE   .MACRO
    / p, d) ^( l2 d: v( I6 i8 J( l1 Y
  115. 6 H- Z" ^: m  F5 [' O
  116. ;==================================================! r1 f/ Y) t( [+ {$ k" G
  117. ;IRQ滚动模式常量! i+ G6 `9 g) A8 {- q2 J0 w) o8 H, S
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动/ X& E  z: R2 U8 C$ Z# p& @! z
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动' X/ E) z, u; P( P' G; F# X0 ~% _" G
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动/ ], u# I$ M8 m6 I

  121. " \& C, ^7 v- l+ t" i
  122. ;IRQ扫描线数据: @4 o$ S3 A( j& |) L& ^& J  t9 O1 P
  123. IRQ_Scanline_Data
    " }; V/ I' L4 P" D3 v
  124. .DB IRQ_SCANLINE_18 B5 @5 D' d+ }
  125. .DB IRQ_SCANLINE_2
    * w. w& G/ ~  ]# a
  126. .DB IRQ_SCANLINE_3; ]- H8 O3 w! U: V9 J
  127. .DW 00 ;关闭IRQ
    * i! }4 ^$ K% e6 L/ K

  128. / C& ^, y# L- T# g& q
  129. ;IRQ滚动控制模式& r  L1 Z  Y) |4 n$ J& Y1 ]+ I% t1 f# H
  130. IRQ_Scanline_Mode
    " y* o6 X* @6 F- ~
  131. .DB IRQ_SCROLL_MODE_RIGHT
    / |4 U- \/ A* G# U/ i9 U  p
  132. .DB IRQ_SCROLL_MODE_LEFT
    2 o6 R- r  D) J8 \, t/ U
  133. .DB IRQ_SCROLL_MODE_RIGHT1 `/ [* y4 c. D8 t. x1 \8 g, _
  134. .DB IRQ_SCROLL_MODE_LEFT
    6 G% b3 k1 Q$ _' j0 p$ H  f

  135. 3 ], \! h( Y; x, T
  136. ;==================================================
    " V  ]/ n: w) l3 ~
  137. ;;IRQ滚动控制
      \- M( D& q  d0 J) m
  138. IRQ_Set_Scroll9 ]1 d9 m' N8 `( a* k
  139. LDX IRQ_Process_Index
    - L2 l3 C" v1 R6 k
  140. LDA IRQ_Scanline_Mode,X
    * d4 E( k7 I/ Z4 A7 i6 d) s
  141. CMP #IRQ_SCROLL_MODE_LEFT
    6 [2 C: o+ M2 g0 O. B
  142. BEQ IRQ_Set_Scroll_Left
    7 t( j+ a" _5 m% E
  143. CMP #IRQ_SCROLL_MODE_RIGHT/ L. T) [9 F3 ^+ q( p
  144. BEQ IRQ_Set_Scroll_Right
    ! A0 ^2 j: m$ c" R; ?
  145. IRQ_Set_Scroll_Zero;不滚动6 k5 D* s/ x+ r; ?+ l
  146. LDA #$00
    ( ?% s& ~- w; _- e+ u' I
  147. STA PPU_SCROLL
    + O& E) G& g  V
  148. STA PPU_SCROLL5 h# V; h& j9 R! r, F- }
  149. RTS
    + |7 ]" c: g" I4 ]% X
  150. IRQ_Set_Scroll_Left;向左滚动) l$ }/ _9 H8 L7 l* \
  151. LDA Scroll_H
    / [: \) ^& X9 l. R
  152. STA PPU_SCROLL
    ! z$ v& G1 B4 j
  153. STA PPU_SCROLL
    ! E, L0 Y; O1 B/ L2 o
  154. RTS
    + U" _' I% `( H5 A4 q
  155. IRQ_Set_Scroll_Right;向右滚动
    9 R/ r- y0 J; _" r$ }9 O; O' V# u
  156. LDA #$00
    ; T0 O5 ?0 l5 }9 _. P% v, o
  157. SEC6 x3 m% `; A- u' e
  158. SBC Scroll_H6 [$ k% z+ d' p2 [. x4 j, Z
  159. STA PPU_SCROLL5 d+ k9 S# e/ V
  160. STA PPU_SCROLL* f/ [+ w* R/ u, f$ x
  161. RTS
    ' T: g  D- }6 R; J
  162. : x/ `  ]! E' K2 W' N# p- ?
  163. ;==================================================% i/ j0 U7 K9 x! m! f! }+ m0 c5 v
  164. ;;IRQ滚动控制
    0 t2 Q2 H3 R1 L  _  _! K" U* ?
  165. IRQ_Set_Ctrl
    $ F3 y2 m. B7 V3 q! h* Q
  166. LDX IRQ_Process_Index6 I. I9 y# }4 C2 p  W
  167. LDA IRQ_Scanline_Data,X
    1 G6 K$ @1 A) z& X* h
  168. BNE IRQ_Process_Latch
    , k. ?7 i& a. G" d' _3 B
  169. IRQ_Process_Disable;禁用IRQ& x1 `. V6 F! u
  170. STA MAPPER_REG_IRQ_DISABLE; w* u: m- O: ?
  171. STA IRQ_Process_Index
    : }# H: J5 K. n8 f4 B+ X
  172. RTS
      Y7 ^+ B- O# v' G/ n  E
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    $ {% t, U9 K4 g5 M& y
  174. STA MAPPER_REG_IRQ_LATCH4 A3 y; O+ o1 N, f
  175. INC IRQ_Process_Index# ?) @0 Z% x$ V5 W# v+ n
  176. RTS
    1 F5 Y" N6 Y" V: [( g! n9 [1 F
  177. / n0 w( x2 Y- h
  178. ;==================================================
    8 R1 a4 a: l  l! y
  179. ;IRQ处理; i# ?$ A9 o+ I
  180. IRQ_Process_By_Index. a7 H* n1 |% o& W% F
  181. JSR IRQ_Set_Scroll8 i& c( R. Q$ A1 \
  182. JSR IRQ_Set_Ctrl
    & p4 N4 ?# o4 S) x4 m! H
  183. IRQ_Process_End
    ' K9 n9 p+ y: [. {. \$ @
  184. RTS
    3 @' D8 W6 _0 ]
  185. * s, y7 H7 q* _8 }
  186. .ENDM! e5 V) n- |' b6 g' ^9 M

  187. 6 z, `0 I, s6 G9 X
复制代码
& R' ^+ L& X! M! W7 K0 z

( C$ I& U7 O' L* f# z2 n代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-5-18 08:30

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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