EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 3 y- a4 }2 M2 b1 O

; }3 A7 J) ]3 ~. g( s本次IRQ研究了如下:8 D, \+ ]4 l3 A5 o8 Z( H- T- J! [0 U
VRC2&4(Mapper21,23,25)
3 ]$ W. ~. l1 p3 c' z. l& r( UVRC3(Mapper73)
8 V' s# }. N2 @! n2 }6 ^1 `VRC6(Mapper24 & Mapper26)
! P- f  ]8 O+ i) R6 L5 |) ~VRC7(Mapper85)
8 a3 a9 \* v- U& {; wMMC3(Mapper4)( K9 B& Y: u0 y. W$ Z% w
MMC4(Mapper10)" {& K$ U( ~9 D1 m/ D6 e; P
MMC5(Mapper5)  x' R$ l! c) |, j
Mapper18$ n3 g8 c6 s: ^" J
Mapper644 D  \! G0 U, Q' h% m! I
Namco163(Mapper19)
& [( y8 ]1 L7 lSunsoft FME-7(Mapper69)* f, K) c5 d! J* M3 }& ^: E* g% j

3 ~9 R- O! ~/ F6 r3 r共计11种Mapper的IRQ操作使用例子
% C0 c7 y0 n2 t! W3 Z1 ?5 ]代码内有详细注释, 希望能帮助到感兴趣的人.& O. X8 q# l, V, O

& f( ~5 x( G( S3 t
) L! \4 v+ |( Y: h7 v' D$ z% H' s# _1 o$ b
Mapper代码主要逻辑(以MMC3为例):
/ p  j+ P9 o# a2 C" s

  1. 7 S3 L+ v4 k' R6 S0 I" q
  2. ;==================================================
    7 e* ?& [9 C8 N0 v, R' Y- H! e$ m
  3. ;Mapper号1 j8 `$ J3 [1 z8 p7 _
  4. MAPPER_NUMBER           = 04
    ( X6 ?8 W8 K# G4 b
  5. ;==================================================
    1 S! ]( N, x8 Q: o2 g9 @
  6. ;MMC3 (Mapper 4) 寄存器常量' q$ n+ {+ R+ b! P4 g
  7. MAPPER_REG_BANK_CTRL        =   $80007 ^& q' O3 A6 Z
  8. MAPPER_REG_BANK_DATA        =   $8001
    7 U" J4 a% g) i! y9 p+ `1 @$ X
  9. MAPPER_REG_MIRRORING        =   $A000
    5 |* c% ~1 D- v4 O, e; }3 R* y
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001' m0 O. Q* a; B" v4 J- q) x
  11. MAPPER_REG_IRQ_LATCH        =   $C000% U/ `2 y7 B7 e
  12. MAPPER_REG_IRQ_RELOAD       =   $C0018 H9 |3 \) x; w5 x' c  T& l
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    , O! b& u4 U, x& d
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    4 e7 {9 X, w5 m# G
  15. ;==================================================
    * i+ R3 R4 ^0 n0 K) q) G
  16. IRQ_SCANLINE_BEGIN          = 135* i- A" u& v0 M+ M
  17. IRQ_SCANLINE_1              = 8
    ' t( I8 g, E! C+ Q) B
  18. IRQ_SCANLINE_2              = 54& u: X9 _/ s2 [* Z  ^' o8 @# U
  19. IRQ_SCANLINE_3              = 8! ?4 O+ z* M% w0 Y5 L2 B
  20. ;==================================================2 J! |' _; X. L6 d: @2 U$ l) `7 s, W( ~2 ~
  21. ) G0 v' Z. e% Z* n" s
  22. ;====================================================================================================6 K9 m$ L% H) V& ]% c& }) w$ h
  23. ;宏常量% R% ^& i0 k3 l# B# T! K' {( e
  24. ;====================================================================================================
    + `& f& Y. c: @8 o
  25. + N$ n! b, ]" H3 D
  26. ;====================================================================================================7 P% k! Z( M( d% U$ n
  27. MACRO_MAPPER_INIT .MACRO8 h: j( p4 g, Z. H
  28. ;禁用IRQ
    7 |# b) ^! }! ~9 e
  29. STA MAPPER_REG_IRQ_DISABLE. A! a) k! B- @

  30. ; n% D7 f, v0 b9 k$ @9 r& G
  31. ;水平镜像
    / ^/ l! [, {2 ~& Y  _& y5 [% L2 w
  32. LDA #$01, a6 t/ R- ?: Z& I
  33. STA MAPPER_REG_MIRRORING5 R& C' g4 t& l, ?1 Q
  34. % P! S1 A! M/ ?+ c% g8 z9 a$ z
  35. ;初始化图形bank
    2 U. G' r& ^* `! ^
  36. LDX #$05
    5 P" q. i) `; d9 w, j9 ^
  37. .Init_Chr_Bank5 e$ G% j& N+ O& P% Z
  38. STX MAPPER_REG_BANK_CTRL4 f& {( o+ w) f3 G4 M3 S
  39. LDA .ChrBankData,X8 l3 K1 @) \' E, `% E/ Y8 w) w
  40. STA MAPPER_REG_BANK_DATA
    3 b' V8 C, e9 v8 |0 X
  41. DEX2 U& d4 B- @' x  z1 {4 f) S
  42. BPL .Init_Chr_Bank) |( s+ T  q% ^
  43. JMP .Init_Chr_Bank_End. ]9 i8 N9 \" g
  44. .ChrBankData. ^0 T0 ?& W0 M/ q
  45. .DB $00,$02,$04,$05,$06,$07+ ^  V& z9 @  w' h
  46. .Init_Chr_Bank_End% ^$ W  J, f+ I0 K+ h

  47. 6 _7 Y% o. i4 w
  48. ;启用SRAM2 o8 x4 @: q. |  B, A$ J, i
  49. LDA #$809 P, @0 i, C3 g: w% C4 M! S, J5 p
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    4 m6 E1 s! y8 z$ g# N
  51. .ENDM2 u1 `) t; v/ s# J: R

  52. ; l/ Z# u, s! w# D
  53. ;====================================================================================================- M% f) X1 g( a! s# p# C+ b
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    & X+ g, K( L& R0 M" ^6 L( K: {
  55. .ENDM
    1 Z% Q/ ?, N0 F4 ^1 ^- S; ~
  56. ) N4 |, L* Y1 d. D4 w3 _
  57. ;====================================================================================================
    5 l3 ?* a2 ~1 Z  L
  58. MACRO_SRAM_ENABLE .MACRO
    5 J+ Z& m; Z6 T. ~
  59. LDA #$80
    4 T. a7 a/ n, ]5 m( n
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    5 d6 k% f3 g. h" }
  61. .ENDM+ k. o  z. M' _+ _( U% p' n
  62. 8 _) s( D( {' T, j2 x6 }2 P
  63. ;====================================================================================================
    1 u9 w6 q9 x: S4 j
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    5 z' o" D' R2 c
  65. PHA
    ) f% X  ]: [8 T. b: {
  66. LDA #$06  V" v$ D5 ?& e1 J: z- S
  67. STA MAPPER_REG_BANK_CTRL7 U" ?! F! h9 V+ y
  68. PLA" {9 c4 L) t, H# |/ O
  69. STA MAPPER_REG_BANK_DATA
    9 H: x0 o5 W4 r) `" W8 M9 T6 T
  70. .ENDM( S1 U& D0 p2 Y' k7 X
  71. " A7 S, d& C  {  O4 a* K
  72. MACRO_SWITCH_BANK_A000_A .MACRO( {6 j) e# P( F: R, V5 Y' \0 M  Z) o
  73. PHA
    $ T2 K) _& U; `7 q& E# ?
  74. LDA #$07
    4 f6 T" }. z2 k* ^! G& l
  75. STA MAPPER_REG_BANK_CTRL
    - L- g+ R: B! g. R6 J/ C
  76. PLA8 J3 k, q3 [: t
  77. STA MAPPER_REG_BANK_DATA8 d/ x3 j" R7 I/ ?# p
  78. .ENDM; v8 [$ v  D; r0 b3 b/ E

  79. * Q  W4 H, p7 L0 u
  80. MACRO_SWITCH_BANK_C000_A .MACRO; {2 Z' }8 v: B3 B2 O$ `% ?
  81. .ENDM3 q2 I4 \; _9 J& `( r" m
  82. : h3 _; |- f1 c$ ?0 [# d
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    8 z$ C- ~6 {0 d* A8 A* z7 `  ~
  84. .ENDM
    2 Z: e, f1 l% |( ^! D$ x
  85. / U$ M4 k6 Q: ?0 g7 K3 R# H
  86. ;====================================================================================================' N6 O( G# Y* R
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    % F0 w$ ~$ F3 `( f0 w0 T  |" O" }
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    % k6 Y: ?+ j0 V
  89. STA MAPPER_REG_IRQ_LATCH
    0 _$ [) l) X2 M7 h2 t, q
  90. STA MAPPER_REG_IRQ_RELOAD, ?& B1 c) d- [; S% r
  91. STA MAPPER_REG_IRQ_ENABLE2 c9 D: @$ B' h3 _$ W
  92. CLI
    ) W4 f0 }& D4 v; W9 j$ s
  93. .ENDM
    1 G& X: W+ M" f/ a& W9 r3 l- l

  94. - r( h+ s& w0 {# X/ \
  95. ;====================================================================================================
    : {4 K8 X; j  y& S/ M
  96. MACRO_ENABLE_IRQ  .MACRO
    2 [1 x! x6 V5 d* O$ C  m  m
  97. STA MAPPER_REG_IRQ_ENABLE, t+ I2 p3 L/ e' a; r9 @4 m  q5 t
  98. .ENDM- t5 `: j2 t$ f9 T9 c- m

  99. " n+ l6 b& b4 M: K5 D7 e* g' r
  100. ;====================================================================================================5 C6 X: f% z0 j0 C' ?4 U
  101. MACRO_DISABLE_IRQ  .MACRO$ A3 L- N3 S9 O) C9 H
  102. LDA #$00; y8 q4 o% ^0 |- N! \8 [
  103. STA MAPPER_REG_IRQ_CTRL0 B$ s0 a  A4 q! q
  104. STA MAPPER_REG_IRQ_ACK8 @% k% M8 o5 E5 v6 k
  105. .ENDM
    2 e+ ^% r8 C* R. {4 l5 k

  106. 4 F, m- P& F& k3 [+ h9 M& J/ F
  107. ;====================================================================================================' f& W/ I. y  ]
  108. MACRO_ACK_IRQ .MACRO
    ) r( U* _+ ]( _6 ?
  109. STA MAPPER_REG_IRQ_DISABLE( u2 o3 c7 I( F9 U: m
  110. STA MAPPER_REG_IRQ_ENABLE
    : `. t# W4 L( R) R9 `
  111. .ENDM0 v, _8 w/ ~$ T- Q( |
  112. 7 S1 y6 Y/ n/ [- O1 O0 ^
  113. ;====================================================================================================! p: x+ Z8 X* a1 D  k& Q: A
  114. MACRO_IRQ_OPERATE   .MACRO% K! H/ o& D5 g" b0 N; d+ X

  115. % v! y; r7 K. a9 |
  116. ;==================================================$ q/ g4 F' b8 L6 V* p
  117. ;IRQ滚动模式常量
    + v: P- T9 I- m
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    * C% ~3 M. P* Z
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    + t) S1 L2 B+ p5 y2 j" Y* P7 G% ~& H
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动9 d  ]0 |" |1 t$ v. k# N% a
  121. # C: ^( y" B+ {. a' E/ Y# v
  122. ;IRQ扫描线数据6 q( e# o5 |* |- ^
  123. IRQ_Scanline_Data% i6 A$ b1 T6 N1 z& X! W) W
  124. .DB IRQ_SCANLINE_1* U+ j  P( v2 X8 r$ @% j2 ]
  125. .DB IRQ_SCANLINE_2) M2 c$ e4 l6 I: ?# }- B! A
  126. .DB IRQ_SCANLINE_3
    ) j0 J. ^3 K8 d
  127. .DW 00 ;关闭IRQ5 y* M$ b- ]* ]1 _

  128.   e; X* A) a$ U! m* H( G
  129. ;IRQ滚动控制模式
    - Q  ^' c6 c. w6 T; c9 a" V1 Y
  130. IRQ_Scanline_Mode
    & Y( M* R1 y5 y
  131. .DB IRQ_SCROLL_MODE_RIGHT
    0 D5 j* V  d3 |: s* T  l8 V, W" t$ i, T
  132. .DB IRQ_SCROLL_MODE_LEFT
    ( m- K- N! I6 c
  133. .DB IRQ_SCROLL_MODE_RIGHT$ ]  W' }4 r9 H# d  Q
  134. .DB IRQ_SCROLL_MODE_LEFT
    9 `$ Z' b7 W" v4 ?, k, u1 @
  135. ( l" X$ \, K8 E8 k# d7 p: ~
  136. ;==================================================! |; S& m4 O, p% A) k/ ?
  137. ;;IRQ滚动控制
      a: o$ H6 ~9 j8 m0 a. X
  138. IRQ_Set_Scroll
    ) ?+ p% D& r5 v3 d& |% \5 b; o: f
  139. LDX IRQ_Process_Index
    8 V7 h6 O' }. U- w3 V( K/ A
  140. LDA IRQ_Scanline_Mode,X! _+ K7 b. |5 g" g
  141. CMP #IRQ_SCROLL_MODE_LEFT8 ?3 U( w  a3 X
  142. BEQ IRQ_Set_Scroll_Left
    9 t8 r3 _% L2 E& S8 X7 {2 g# I
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    " i) e- V1 U4 M) B1 v( _. a
  144. BEQ IRQ_Set_Scroll_Right0 F) D2 v2 Y  g( Q8 n6 \$ c
  145. IRQ_Set_Scroll_Zero;不滚动
    8 R- {' k3 V+ _. `& d5 C6 w
  146. LDA #$00
    $ H" J, [9 }+ }2 m' t. l: g
  147. STA PPU_SCROLL: E1 f. X; i% A7 }" i2 `8 \
  148. STA PPU_SCROLL5 [  B" I1 g0 r
  149. RTS, p9 Z  X0 ]$ Y7 I0 d8 E  o
  150. IRQ_Set_Scroll_Left;向左滚动8 T; S- f8 x% j# S8 I: f+ `
  151. LDA Scroll_H
    ( N* j, O" B  X  @
  152. STA PPU_SCROLL" H0 R% y$ @" w6 }4 l. q
  153. STA PPU_SCROLL
    " ?/ D) r5 C; X+ K4 n) E* f/ N
  154. RTS% f( b7 p. M" L3 G
  155. IRQ_Set_Scroll_Right;向右滚动2 R5 V' v1 D" Q! N( A- M
  156. LDA #$00
    ! {* ?/ n* @# g* p6 P
  157. SEC2 I& ]  P+ I7 x( B! m; f1 t
  158. SBC Scroll_H
    7 Q6 Z% y% r: _6 A
  159. STA PPU_SCROLL
    % z, v. P/ L' x; N
  160. STA PPU_SCROLL
    ! ?8 Y, @/ k& I, b% Y; n  o; J; m6 }; q5 @
  161. RTS% W4 k9 ^. \9 o" G! E# x
  162. 3 h! i) c* l/ z$ t2 ]8 f
  163. ;==================================================6 w8 w) m0 [/ ^6 h4 B4 U% h$ U2 ]( K
  164. ;;IRQ滚动控制" ]( v  C- B6 y& J
  165. IRQ_Set_Ctrl/ x! }# \3 ^1 W# E1 f4 N
  166. LDX IRQ_Process_Index" h, `1 [) ?/ ~* P
  167. LDA IRQ_Scanline_Data,X* \1 v2 ?) P1 y& z
  168. BNE IRQ_Process_Latch- T' A* [8 I* Q& s5 d
  169. IRQ_Process_Disable;禁用IRQ# |  _9 h$ k' p4 B& Z/ l
  170. STA MAPPER_REG_IRQ_DISABLE& x# q5 e. Q  D9 m9 F3 E5 K. q
  171. STA IRQ_Process_Index
    . J9 s& |0 K0 H- ~& T/ c% @
  172. RTS
    7 l& E2 }4 B  A7 t) L0 p
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线, b. D* v8 d' D/ f
  174. STA MAPPER_REG_IRQ_LATCH
    ) Y  m4 ~$ t9 V! Y0 {% ?0 S
  175. INC IRQ_Process_Index
    4 P' V- Z5 I1 P
  176. RTS
    3 |% t3 L# J& g3 g% p* T9 z& d

  177. * y8 D$ V$ _4 [4 H- l
  178. ;==================================================9 T' N, E  Z! w/ v3 s5 S9 b2 H
  179. ;IRQ处理! u9 x% S( R% x, T
  180. IRQ_Process_By_Index8 B% t" K, L  v. l% P+ A- o
  181. JSR IRQ_Set_Scroll6 ?0 [& O7 @* F
  182. JSR IRQ_Set_Ctrl! F" r+ Q$ U( y
  183. IRQ_Process_End
    8 G) c( {1 Q$ k# ~" [8 D
  184. RTS
    9 P0 c0 k3 ]: M0 h# P+ {
  185. 5 e7 l% r6 F8 P" G
  186. .ENDM+ T4 k4 S  n5 ^& Y+ J+ h6 O" S

  187. 7 ^% }4 p5 \% D$ Q& `$ U
复制代码

! m4 L, d, ~  M% a- ]6 }0 ^  {' P6 ~
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-12 06:00 , Processed in 1.161133 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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