EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ( l9 ]6 j8 A7 B% b

# V4 g) \, N7 |本次IRQ研究了如下:
5 N8 Y- l3 a- ]VRC2&4(Mapper21,23,25)
6 Q' l9 D9 f' M# QVRC3(Mapper73)9 w1 V! ?7 w5 I
VRC6(Mapper24 & Mapper26)
  p' v) q* d$ R( C- N. eVRC7(Mapper85)
7 E. S0 Y: h! _, GMMC3(Mapper4)
9 L4 o4 g: v6 }MMC4(Mapper10)5 P; C  c" v# Q" g
MMC5(Mapper5)
' e% [5 X, X! K. L. I) iMapper18$ {3 N8 v5 h1 v, `- k; o5 y
Mapper646 w$ X. H; ~" _3 T, u
Namco163(Mapper19)$ B4 v  f: v+ b7 H6 L; e1 c* w
Sunsoft FME-7(Mapper69)% x9 b4 }6 m0 m5 r
  ?2 l6 u' Z, Q/ [) M7 Y  U
共计11种Mapper的IRQ操作使用例子
4 p' q% ^+ V3 J0 k! x* N代码内有详细注释, 希望能帮助到感兴趣的人./ d+ B4 Z8 n# @) Q

# \1 p' N7 f7 N) {! u7 X" S7 `: t

: n7 C! z( {% E% zMapper代码主要逻辑(以MMC3为例):! U( ]1 w0 z, J& O
  1. # _0 X( U" S+ N4 h$ h/ q
  2. ;==================================================
      L1 K; }" u( U: C) G
  3. ;Mapper号
    & d+ g3 R% T/ _
  4. MAPPER_NUMBER           = 04
    5 C% T, G! t8 n! ~
  5. ;==================================================+ c8 J( |+ p3 ]! E7 t! y5 \
  6. ;MMC3 (Mapper 4) 寄存器常量; i6 S: }' X5 r- o4 D
  7. MAPPER_REG_BANK_CTRL        =   $8000
    5 h" G) y1 Y3 X) _4 m2 D) Z8 g
  8. MAPPER_REG_BANK_DATA        =   $80014 M, u' B2 j/ p2 V% Z3 [# u) y) r
  9. MAPPER_REG_MIRRORING        =   $A000
    7 }# a2 @3 j) |/ n
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    , s) r! d* s& x! }, B+ T6 D
  11. MAPPER_REG_IRQ_LATCH        =   $C000* i: H3 H* Y4 A; _
  12. MAPPER_REG_IRQ_RELOAD       =   $C0017 H, ~, G8 q8 l: Y, a
  13. MAPPER_REG_IRQ_DISABLE      =   $E000" A6 K( d' D, @; l6 G. B
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    8 F# F, a: y/ U+ O- w. I. B
  15. ;==================================================
    8 k: _* N/ X4 U# [  m9 |
  16. IRQ_SCANLINE_BEGIN          = 135
    5 U$ M! ~3 Q4 C) b; s2 m
  17. IRQ_SCANLINE_1              = 8, e: P. k7 ^' s6 L& P5 i# k
  18. IRQ_SCANLINE_2              = 544 m* y; t# w4 e# J
  19. IRQ_SCANLINE_3              = 8
    % m6 E- ~$ C/ w( s) }) m2 s8 S! j
  20. ;==================================================' }. T  ]- K( j4 |# _& }2 n2 R
  21. ) N! S5 k' X, p0 j" k2 X" y
  22. ;====================================================================================================. r) T% K% P+ T
  23. ;宏常量
    3 ^8 m! i# X7 a$ ]* _  F0 C
  24. ;====================================================================================================# v" c! f. s, o  g8 T7 P/ `% t5 Z8 Z
  25. 8 i' f4 B- {, a
  26. ;====================================================================================================
    8 e! L, @4 o/ z- |& o
  27. MACRO_MAPPER_INIT .MACRO
    2 E) G: v4 Z, a% e( C+ Y. k
  28. ;禁用IRQ
    ) g$ E! [2 S: d. l& ^
  29. STA MAPPER_REG_IRQ_DISABLE0 \2 n3 z6 L1 M/ F
  30. ' J6 Y0 b# n: ^) L
  31. ;水平镜像- u# L/ C. S+ G# n2 ?3 S6 h! ]% w
  32. LDA #$01
    , H/ Z) `; [( @0 R) e1 b, t( g
  33. STA MAPPER_REG_MIRRORING
    , c: |4 r( h; s; [

  34. , z0 J7 Y$ P6 g5 }! O$ x7 S5 ^5 C
  35. ;初始化图形bank
    7 L: F  c  d0 M$ `/ Y, P
  36. LDX #$05
    ; t! R2 Q# W+ [7 v+ A
  37. .Init_Chr_Bank
    ! H) W2 Y: ^4 ?- m  S
  38. STX MAPPER_REG_BANK_CTRL; T/ o7 H  K' T' i9 h( r
  39. LDA .ChrBankData,X
    & G! ~! m- y. g: I2 I' _+ b
  40. STA MAPPER_REG_BANK_DATA
    % q7 C) W6 `9 B, u4 B" H' L3 T
  41. DEX, r2 t$ G) ]% M8 i, y5 K+ d( f
  42. BPL .Init_Chr_Bank' b6 E7 ~7 A7 ]3 Z" _; z
  43. JMP .Init_Chr_Bank_End
    2 ]4 s7 @5 J3 N# `+ Q
  44. .ChrBankData
      B. b9 s" R! K7 `7 U8 i1 k4 w
  45. .DB $00,$02,$04,$05,$06,$070 X! n/ h+ t: i: d9 u+ n+ L. P
  46. .Init_Chr_Bank_End
    : c( ^7 n1 i1 P0 k; \" A  ?3 L

  47. , w$ H$ E. ?) L  _, Y+ e8 w
  48. ;启用SRAM
    ! |3 x$ o0 l1 Z4 B% S
  49. LDA #$80# w! w1 F+ u7 x& I+ j3 I. H
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    . }6 H$ {  {/ l* M8 @& z
  51. .ENDM5 D4 W1 v4 E- t" j) w4 w; {# z

  52. # l- g' }1 b1 R. O+ q$ X* h
  53. ;====================================================================================================( d2 `6 e& X  k- |. i
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO* [: v' ^1 e" I5 H) v' C7 p
  55. .ENDM
    2 R) m. I5 Y/ _# y

  56. 6 F- c* }# x9 i. J
  57. ;====================================================================================================
    ; G3 i# ]. Z* y9 P
  58. MACRO_SRAM_ENABLE .MACRO, R$ x- }/ n2 W$ T5 Q; v
  59. LDA #$80. A; I; [0 C, o+ K; n
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    # e. S5 t3 ?- |& n9 [8 V
  61. .ENDM
    , H0 K% E/ D/ h0 ^
  62. ( f8 R7 U/ C5 I* Z  B+ m
  63. ;====================================================================================================) K# L4 X, z% F# s" Q9 m  p
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ; N4 d& B% `3 U$ p& I4 Q0 Z
  65. PHA
    ' a( t3 C1 P, l( v+ w
  66. LDA #$06& {# h- g% e* s* E% W
  67. STA MAPPER_REG_BANK_CTRL
    / D) O+ o+ ?% t+ }  _
  68. PLA
    ! ?2 o2 @0 B/ G! P& B* ]
  69. STA MAPPER_REG_BANK_DATA
    ' q: w/ c3 f* L
  70. .ENDM( {3 u1 h5 t: L! E1 z
  71. * R1 M+ x9 u+ y9 i1 L7 ~4 }
  72. MACRO_SWITCH_BANK_A000_A .MACRO6 x- x- D  v9 e. t+ @
  73. PHA' u& M: K; v0 h" \
  74. LDA #$07
    & V$ k4 W% l' J+ n' X
  75. STA MAPPER_REG_BANK_CTRL1 A$ |; c( ]# G; u4 P
  76. PLA
    & a( i8 r& T& V' n+ u. Y5 U
  77. STA MAPPER_REG_BANK_DATA
    / k# ?# r$ f, s3 V' e
  78. .ENDM
    * i$ @; ^) g# \+ C  Y7 p  U  H
  79. / m: Q  A* T  X' [4 m! ]9 j
  80. MACRO_SWITCH_BANK_C000_A .MACRO6 C/ m$ w/ p8 g" \4 w) H$ S+ V3 x
  81. .ENDM
    ; ]4 {4 w9 E% `+ y( Q. w& K
  82. 3 J9 m/ Z& R) m  b' G
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    * _) @9 x0 o# O6 R1 v; R' A6 u7 `
  84. .ENDM
    5 T. o2 A: \8 T7 o* R

  85. % O1 e3 M3 V5 A% o, A( l' Z
  86. ;====================================================================================================
    2 @; _( |. K- Q! l
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    . M* A: B' K  y  ~5 f
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    . `& I: X! c* j3 G  `
  89. STA MAPPER_REG_IRQ_LATCH
    9 J+ X% S, L, f
  90. STA MAPPER_REG_IRQ_RELOAD
    + G6 h4 ]% Y% {( a
  91. STA MAPPER_REG_IRQ_ENABLE8 M/ K9 c  t) F3 L" K5 g5 Y( o- y
  92. CLI
      K! v: V) u, K/ H8 [$ `. `
  93. .ENDM
    " u/ Z) Q. ~, |' ~
  94. 0 C+ B+ o1 w. u+ n4 W% u
  95. ;====================================================================================================
    $ E9 [; m6 B% V( B9 V) _
  96. MACRO_ENABLE_IRQ  .MACRO1 F  c$ o1 a* B* l# j, z- U
  97. STA MAPPER_REG_IRQ_ENABLE
    " }( E* S0 ^8 }& q
  98. .ENDM
    3 E0 [! e' e2 R# p3 d

  99. ) o  f) k, I3 ]' H
  100. ;====================================================================================================
    ) `+ }) E) V% P) W$ ^
  101. MACRO_DISABLE_IRQ  .MACRO6 z+ W5 _8 V! ^! D+ g  [. [' K' z
  102. LDA #$00  x" O# [( N/ C/ y; M& ]: V; @
  103. STA MAPPER_REG_IRQ_CTRL
    5 M; Q; T6 u2 ~1 k0 a
  104. STA MAPPER_REG_IRQ_ACK
    ; ~4 |# ]( c" q- s/ X# C  i
  105. .ENDM! h+ s+ |9 w4 H' i& ]/ L# r% f
  106. ' n6 }6 F* I2 Q
  107. ;====================================================================================================
    : J" R3 [# |' l5 ]+ E4 ~
  108. MACRO_ACK_IRQ .MACRO- @2 G1 r( X9 D& C( O; j
  109. STA MAPPER_REG_IRQ_DISABLE0 B* }$ O, ^5 m8 |  D, Q  F/ `6 V! T
  110. STA MAPPER_REG_IRQ_ENABLE
    & `4 y) X3 B, r3 s3 y/ ^
  111. .ENDM
    8 q1 x9 ]6 I' c

  112. " V0 ^1 ~' W, x2 Y
  113. ;====================================================================================================6 N8 I$ I9 g3 Q+ K- p7 l
  114. MACRO_IRQ_OPERATE   .MACRO
    0 w* U* _% D' }7 h! a8 P  Q
  115. 9 l& f0 e: U3 E# P8 I
  116. ;==================================================
    8 O# s8 L6 q) h, C
  117. ;IRQ滚动模式常量
    * x6 `' q8 _- D# I1 G5 H
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动( n0 d( U$ N2 M( j& }% U
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动( @" B* |* c2 G0 R2 @
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动, b9 j7 U8 F# h. k6 @& _" y' Z/ `$ d
  121. 7 z0 D( w: ~$ {! U2 T8 i
  122. ;IRQ扫描线数据# [$ B9 U! g+ r/ E
  123. IRQ_Scanline_Data
    0 ~+ Y9 K/ s( r/ q: ^$ `. D
  124. .DB IRQ_SCANLINE_1) D$ x, a7 m' _  v9 u) @+ W$ t
  125. .DB IRQ_SCANLINE_2
      G) M/ n- Z+ Z- v8 q1 z
  126. .DB IRQ_SCANLINE_3
    9 j) G9 E6 o) ?2 F5 H6 I: p
  127. .DW 00 ;关闭IRQ
      M* T5 ?! l: n" m  |! k
  128. 7 [$ I4 b2 z! T$ ]+ Y( N' Y
  129. ;IRQ滚动控制模式6 P  d/ M' D; y3 ]! X; m. K
  130. IRQ_Scanline_Mode
    0 \$ x  c4 D$ ~8 i7 {
  131. .DB IRQ_SCROLL_MODE_RIGHT' z' o4 Z% u" ^! Z# W# G9 W# h
  132. .DB IRQ_SCROLL_MODE_LEFT
    8 q3 ]% A; G7 [) ]- ^
  133. .DB IRQ_SCROLL_MODE_RIGHT
    + b; l* o% Y8 q& g" k+ ^0 g
  134. .DB IRQ_SCROLL_MODE_LEFT
    ) b  O: C" Y- ]  I) m- D
  135. ( Q+ J  G% y, [5 o
  136. ;==================================================+ A2 u0 B9 J' r6 L( f
  137. ;;IRQ滚动控制
    : ?. R2 V: i4 N. w$ A
  138. IRQ_Set_Scroll. ]2 m' k+ U& Y( t% L
  139. LDX IRQ_Process_Index
    2 A3 t" R$ q. h, z0 N
  140. LDA IRQ_Scanline_Mode,X. S; E' L/ a5 C
  141. CMP #IRQ_SCROLL_MODE_LEFT
    : R9 I  a& p7 t9 l  z- B7 m2 Z, D
  142. BEQ IRQ_Set_Scroll_Left
    7 q8 _8 y1 {& {" |3 E2 }
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ! w0 X9 ^! z3 _5 N0 J
  144. BEQ IRQ_Set_Scroll_Right5 ?% w+ H2 Y/ B' B* Q1 c; c- L
  145. IRQ_Set_Scroll_Zero;不滚动
    & t" B, x' V' r, c! B' K9 v- @3 |* E
  146. LDA #$00
    # U; v: m( |9 q) t+ P# u& @4 d
  147. STA PPU_SCROLL( x; w% ?7 u8 n$ ^( H; j
  148. STA PPU_SCROLL) K/ i* S& C  f2 [) M5 W, E( Y
  149. RTS
    % g9 }: E. p3 R6 U2 [' o, X
  150. IRQ_Set_Scroll_Left;向左滚动! K0 g+ q) H8 f9 z# }! W- i( ?
  151. LDA Scroll_H
    & V1 X1 t! m& z( ?1 j5 f$ m
  152. STA PPU_SCROLL
    6 o! {! k9 r+ P
  153. STA PPU_SCROLL4 w/ g/ W% J# Q8 E
  154. RTS
    8 G" |; [* f, p0 X: W0 [7 m; ?
  155. IRQ_Set_Scroll_Right;向右滚动4 u) i. q) g+ }( X2 K: c
  156. LDA #$004 s; k" {4 ~4 n( l
  157. SEC6 }  U& B4 b" @; s! Y
  158. SBC Scroll_H" `) z! d2 T+ w# c" R  h/ l
  159. STA PPU_SCROLL
    2 o* m8 K* B/ P, z8 k) D; M
  160. STA PPU_SCROLL
    ( S$ u# \" F* H1 c' u, H
  161. RTS
    % o" n, }, o; C* v: J$ N

  162. % X6 M$ V! q$ ~( a- z
  163. ;==================================================0 d$ s  v0 u8 m4 g7 m0 S
  164. ;;IRQ滚动控制) @7 p7 s9 X5 i" c8 v+ I9 U8 ?
  165. IRQ_Set_Ctrl
    4 M) {1 C1 ?7 I, o3 m
  166. LDX IRQ_Process_Index
    0 |6 A. ?" M' W2 @0 {
  167. LDA IRQ_Scanline_Data,X
    ! i9 f" q4 I* i* g+ a  ?( e- w$ Y# j$ W
  168. BNE IRQ_Process_Latch
    " q7 t1 h# t. s* y1 n! d
  169. IRQ_Process_Disable;禁用IRQ
    . A  H) D. \9 ~/ a
  170. STA MAPPER_REG_IRQ_DISABLE! o; a' e( T$ }( |( g* z8 T
  171. STA IRQ_Process_Index
    * M4 r0 h7 z& \: N5 L
  172. RTS
      X- N9 {7 R' K# C" i7 i4 B
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线1 U+ K5 `" u$ ~$ k3 @4 i
  174. STA MAPPER_REG_IRQ_LATCH. i6 v1 t& G; B) j% H4 Q& b3 M) X
  175. INC IRQ_Process_Index
    ( h9 M# n+ [6 r0 j2 E
  176. RTS; ^1 y: b5 @- ]' _4 `$ _
  177. 9 e8 J; d1 B/ B' B/ S- }# J$ X
  178. ;==================================================; d: H% s3 Z2 }2 [
  179. ;IRQ处理
    ; A! b" y# ?, [
  180. IRQ_Process_By_Index- `2 ~: }  w  ^& D( ^, H0 x
  181. JSR IRQ_Set_Scroll* t! [, z" \% }; i* a/ O# r
  182. JSR IRQ_Set_Ctrl
    2 m/ @6 y/ M  W$ e* y
  183. IRQ_Process_End. _1 x0 c9 I& S  L" u
  184. RTS
    1 h& f5 o) I+ Z: E) |5 a
  185. ! v* ~; _) x- Q; }
  186. .ENDM; I  J3 m  d' ~' U

  187. / M2 E' u' b5 H; R; [
复制代码
0 Z. B9 k1 n5 n
  m( q+ |3 r3 q: r
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-19 10:39 , Processed in 1.083985 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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