EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 ! Q; k8 V& a% j- h/ }0 Q

; |* Y) ]( ]2 X0 _* A本次IRQ研究了如下:- G4 `( R+ C/ \
VRC2&4(Mapper21,23,25)4 k. J9 k. s9 `8 @4 N
VRC3(Mapper73)
2 `; H% s4 h( P# O; V: @' I  ~! ?VRC6(Mapper24 & Mapper26)
. t3 ^+ a: u' ^4 O* \% j  OVRC7(Mapper85)
/ M, U8 O1 F3 }/ a( Q- p8 ?MMC3(Mapper4)- E: @( R) T* A
MMC4(Mapper10)
2 h! d3 \! k* Y3 X! RMMC5(Mapper5)! ^+ X- d+ |' N# {) _, o! c! H  L
Mapper18( L- P, |  G. H" h: @8 c# {
Mapper646 o; `3 y1 \( k9 N. N2 q) u* C
Namco163(Mapper19)( ]/ _+ y' m  i8 S7 l/ n
Sunsoft FME-7(Mapper69)
- q. X) K, _9 E+ A+ v6 m- f0 ?% M$ V
5 ]7 T- a' k; M+ |% @4 K$ h( R共计11种Mapper的IRQ操作使用例子
( J$ g9 G. h( G+ W代码内有详细注释, 希望能帮助到感兴趣的人.
; J* ]3 j9 c( ~: F7 G$ B
  Y. y2 t% g) [4 S1 ]7 h% K# T5 G, b  u
4 z4 G4 m/ C  B1 d. n. Q, @3 }/ Q5 R
Mapper代码主要逻辑(以MMC3为例):9 V: @8 [! }8 S7 I1 {, Z# C; y

  1. 9 [3 V' X* ?% g) a
  2. ;==================================================9 x8 i/ j% m" R! ]  ?
  3. ;Mapper号4 `) b3 {: W( Y+ V
  4. MAPPER_NUMBER           = 04
    0 _1 E  k$ m* K9 v. }
  5. ;==================================================
    1 c' q* o/ Z; F8 ?: t/ \
  6. ;MMC3 (Mapper 4) 寄存器常量
    0 t$ g6 a* L5 `' ~2 g0 b% ^. M7 V: m) F
  7. MAPPER_REG_BANK_CTRL        =   $8000
    + q7 i5 \( Q# b: `5 S1 v
  8. MAPPER_REG_BANK_DATA        =   $8001
    ( Y) A- o1 j! [. x9 s
  9. MAPPER_REG_MIRRORING        =   $A000& V$ J2 G. [1 `
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001, i9 |/ C% c2 B
  11. MAPPER_REG_IRQ_LATCH        =   $C000' R' S- E/ v& r8 {0 B
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    7 x5 a, Y$ h9 B6 x, q3 }# Q5 @
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    : K' ^* ^6 j: d6 J' Q( m  ^7 \
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    , s/ C; D: D4 ]' i9 A( x
  15. ;==================================================$ ?# `1 \7 S* X9 {
  16. IRQ_SCANLINE_BEGIN          = 135
    7 p) q& v$ |; a6 b+ D
  17. IRQ_SCANLINE_1              = 8
      X4 ^* _9 v- R6 Y
  18. IRQ_SCANLINE_2              = 54, q0 g9 @5 c2 Z7 \8 L
  19. IRQ_SCANLINE_3              = 86 v* Z3 q8 o, r& y
  20. ;==================================================; q+ o6 a" N2 G/ R4 }3 ?
  21. 4 v" [3 q) c, t  h/ o* l7 Y
  22. ;====================================================================================================
    9 L; s! k; P$ L9 P
  23. ;宏常量! B! h2 M* O7 b" k
  24. ;====================================================================================================
    7 k( m7 e% `: L) n. F4 N! \

  25. + \/ z1 @- \3 ]& b- C$ I$ b( Y
  26. ;====================================================================================================
    & ]& t  a: l! h; M' m) q/ f5 ]5 n
  27. MACRO_MAPPER_INIT .MACRO
    $ D6 p2 E1 r. a+ Q
  28. ;禁用IRQ8 q: D& U# t, I- Q2 R( r
  29. STA MAPPER_REG_IRQ_DISABLE$ ]2 x8 F9 o) c& v6 A6 S

  30. & `7 g) T0 ~" ?" k: |& v& f
  31. ;水平镜像% N. ?8 u9 v" H0 s
  32. LDA #$01, \, C, e) y2 [2 z$ Q4 W2 M
  33. STA MAPPER_REG_MIRRORING
    ; D) r. U" F6 s4 y

  34. 0 ^/ r' M* ?" j; c2 ?! E0 _" i
  35. ;初始化图形bank
    9 u  L' n; A: A9 F
  36. LDX #$05
    9 X, ~; {# D6 o8 {5 k! e
  37. .Init_Chr_Bank1 y9 X, I: w0 W9 l  `( ?
  38. STX MAPPER_REG_BANK_CTRL( f; m, [9 X6 j
  39. LDA .ChrBankData,X! z5 K4 Q& V% |
  40. STA MAPPER_REG_BANK_DATA
    9 \6 j; Z" n  _% q! k* ?! Q
  41. DEX" m  n" G; |% Z: X, x" \
  42. BPL .Init_Chr_Bank
    ! `. O! E! l2 D' x6 H+ @9 R
  43. JMP .Init_Chr_Bank_End
    6 O; R0 }0 Q5 w# }4 c8 k1 p( i
  44. .ChrBankData
    ' z" s4 |; g! u9 e4 g0 r7 Z& w
  45. .DB $00,$02,$04,$05,$06,$07$ b2 o, u! D  k3 U, D
  46. .Init_Chr_Bank_End
    ; p8 L: F' W8 w. M( g' F, A' t

  47. 2 @+ E1 u$ I/ a+ j. I
  48. ;启用SRAM
    7 J, e. f2 v: d9 ]& z/ @$ y
  49. LDA #$80
    8 c' V' x1 C0 l- F6 m# T
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    ' ]( l, L9 @1 ~3 ?- a- z
  51. .ENDM" w( e5 o$ ^7 M& }) Q; i4 P1 t

  52. ! N/ f, m. [  |$ o( Z
  53. ;====================================================================================================7 P% X# ^9 g6 {- s9 t2 e3 [' w
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO- \5 @  N& d5 J2 H
  55. .ENDM
    ' Z' |* K* ~0 v7 G8 r# ~7 |

  56. : W  n, q: ^8 G& {% `; Y' l
  57. ;====================================================================================================
    & d6 R7 f; \: H
  58. MACRO_SRAM_ENABLE .MACRO3 H4 Y6 a4 ?6 W" q
  59. LDA #$80
    2 s5 Z& s, X! j: ~
  60. STA MAPPER_REG_PRG_RAM_PROTECT5 I1 ]! o  d1 b7 R* E
  61. .ENDM
    + O# y( L- z$ L
  62. ( ~& P* a( V  G/ m7 o
  63. ;====================================================================================================* O: N% s1 P! f1 n5 j% J
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ' m" P- R3 i# y( p8 r, }! j1 z
  65. PHA4 F1 L& G, H% h: E
  66. LDA #$06; O$ c+ m1 k6 A2 Z+ L
  67. STA MAPPER_REG_BANK_CTRL( y& ^' y+ [3 ^9 e! Y
  68. PLA
    / I" F4 I& _; F# y. A( C, y6 x
  69. STA MAPPER_REG_BANK_DATA+ C0 m! y, Z# V$ _. H
  70. .ENDM+ O* y3 n, Z: v- N6 M9 g( b
  71. - r+ S- i9 r) ]
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    8 |; Z8 v' M4 N* c- N, o' J; b
  73. PHA4 h( J" ]0 W; P
  74. LDA #$07$ U2 }4 N) m/ k$ _* q$ F
  75. STA MAPPER_REG_BANK_CTRL- p! r# ~; V5 G5 }+ x
  76. PLA
    & d' l( x- l- E& S9 Z/ Q8 p
  77. STA MAPPER_REG_BANK_DATA$ |2 _# k9 S! q/ x8 H
  78. .ENDM8 \! O& e$ [% G. T, @
  79. 5 ^% ?) V- J; O# u% z
  80. MACRO_SWITCH_BANK_C000_A .MACRO; a' o- ~& ^( A  ]
  81. .ENDM+ i$ t3 X9 E3 J2 \" k8 Y

  82. ! }7 s: h: j+ g5 L
  83. MACRO_SWITCH_BANK_E000_A .MACRO0 {' Q/ Y' z7 h0 b4 c& i8 S* r: I
  84. .ENDM
    8 c: C" c( a; t
  85. 9 s  y( K! H* b! j7 U
  86. ;====================================================================================================
    ( D7 I/ y7 k5 M) a# X  c
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    - y2 D5 d8 S& L% C$ l3 D
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    8 J7 ?5 \/ P' m" n) v0 I
  89. STA MAPPER_REG_IRQ_LATCH3 t, Z" d( F0 l1 b$ K" D8 g1 ^) I
  90. STA MAPPER_REG_IRQ_RELOAD
    % f% b4 l' ^; M4 l6 {0 m$ `9 y) p3 \
  91. STA MAPPER_REG_IRQ_ENABLE
    % ?' E- r) q3 |; S8 ~* c
  92. CLI) v9 j) A" Q& l5 o7 {+ C
  93. .ENDM
    ( D/ X! X4 K) ]4 u+ r( H3 {

  94. & F$ Q8 w8 u8 S+ X8 n. j. O; Z
  95. ;====================================================================================================
    - m0 D* |; R% A  ?/ W1 Q+ d2 _
  96. MACRO_ENABLE_IRQ  .MACRO
    , S" ]. k3 |* i' _4 P
  97. STA MAPPER_REG_IRQ_ENABLE: I7 U8 S. y. ?
  98. .ENDM
    0 s6 R" Y' o. U+ D

  99. * v3 G2 `4 ~( {
  100. ;====================================================================================================
    3 t" N  m# q9 B# U9 @! r1 U  j
  101. MACRO_DISABLE_IRQ  .MACRO1 Z2 I) T5 z+ ?4 W
  102. LDA #$008 d) e6 Z: Z/ z3 V) l4 L
  103. STA MAPPER_REG_IRQ_CTRL) p9 m) i4 T8 x- H4 s9 r
  104. STA MAPPER_REG_IRQ_ACK+ v! r4 t% b" x0 T$ N. p0 f3 i6 V# [
  105. .ENDM
    1 G/ g$ a) A! e/ }/ j& {

  106. 3 D9 n  g7 k. n0 S# s1 ^
  107. ;====================================================================================================
    6 \3 L3 T. ^. F% K
  108. MACRO_ACK_IRQ .MACRO
    ; e5 ]+ {+ d3 e, g) L
  109. STA MAPPER_REG_IRQ_DISABLE  w" T- s6 e4 }( U& B( `+ z
  110. STA MAPPER_REG_IRQ_ENABLE
    6 B) s: X% f7 ~$ f
  111. .ENDM, b8 h& \4 b  J# b( s2 W8 c  X

  112. 5 E% y- Q8 n2 M0 e: _
  113. ;====================================================================================================
    : q# G# D; [+ F  z) D1 b! W/ F
  114. MACRO_IRQ_OPERATE   .MACRO8 s% |4 \9 b; k' K3 f" N$ g' L3 S# |
  115. ; B! w4 l' T  u3 r7 p
  116. ;==================================================
    # B- B, L  s4 ]  C( [) Y
  117. ;IRQ滚动模式常量
    6 N4 ~  Y: f) Q
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    1 @- F: K6 R) j5 A) g/ M
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动: }6 C3 X3 e2 L( i
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    : J1 N& Y) ?# E9 G- i( l
  121. * @6 c! ~2 h  J. Z
  122. ;IRQ扫描线数据
    ! ^* X3 m# L8 i* B  }
  123. IRQ_Scanline_Data
    6 @  T  W& M$ A
  124. .DB IRQ_SCANLINE_1
    5 U4 @$ I+ p: A) d, Q' a7 M
  125. .DB IRQ_SCANLINE_2
    ; [8 O( U0 J5 `( w% g, T& F
  126. .DB IRQ_SCANLINE_3. ]' f" x  l) \+ N* M
  127. .DW 00 ;关闭IRQ
    . _* C/ _( d" K, \6 R& F

  128. 8 M' ~3 j2 `" ]5 ~  k
  129. ;IRQ滚动控制模式) K7 i' \6 f0 Z
  130. IRQ_Scanline_Mode
    % I5 Y( o+ |6 W+ H4 b, S* x( v8 K' i
  131. .DB IRQ_SCROLL_MODE_RIGHT3 c& t6 h" u+ B& B. ?/ a$ A7 {4 G
  132. .DB IRQ_SCROLL_MODE_LEFT
    # S* Z7 _/ J/ [7 Y: t% r
  133. .DB IRQ_SCROLL_MODE_RIGHT2 z5 ~) M& P/ k. k5 b5 O5 D
  134. .DB IRQ_SCROLL_MODE_LEFT) g" B+ c; `6 i- V

  135. " x2 c8 X/ _  ]: i7 j& s! Z
  136. ;==================================================
    # z; D- j. d  G4 r2 @# a" r: e
  137. ;;IRQ滚动控制; l1 j5 K( ~9 F  A4 a! j* W7 F
  138. IRQ_Set_Scroll
    ( n8 W- b7 ]4 y8 w+ [2 g1 y- @9 S. f
  139. LDX IRQ_Process_Index3 R- F6 Q8 y6 x2 Z% e
  140. LDA IRQ_Scanline_Mode,X; M5 E3 y8 P: s2 P" j# @
  141. CMP #IRQ_SCROLL_MODE_LEFT
    1 I' C7 C: ^# q6 R
  142. BEQ IRQ_Set_Scroll_Left
    1 @$ _# m: H* n) }" u
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    5 O# a+ n" v! ]) m
  144. BEQ IRQ_Set_Scroll_Right
    " B3 s2 b% F- N
  145. IRQ_Set_Scroll_Zero;不滚动
    7 g, _- ?" |: }4 {
  146. LDA #$00
    & k/ }/ M# k. W6 R# d% ]
  147. STA PPU_SCROLL. K, f* ^, ]: \3 Q. _5 j0 A
  148. STA PPU_SCROLL
    - C% u  n6 k5 ?' g9 e' ]
  149. RTS2 E: Z4 y8 x9 ~" e
  150. IRQ_Set_Scroll_Left;向左滚动
    . W+ F4 _% @2 y: H  c
  151. LDA Scroll_H5 Q0 Z7 E8 X+ ?3 L* ~# K) d
  152. STA PPU_SCROLL( W: |. t' N, z; _$ K
  153. STA PPU_SCROLL( z4 r! v- @: E! U" e* E! b
  154. RTS6 z$ y3 f& _  p, x+ `: s4 ~" c6 j# K
  155. IRQ_Set_Scroll_Right;向右滚动
    0 J. k9 c& _  j; ^' n# u- z
  156. LDA #$00. t0 h/ N, f2 o7 n
  157. SEC4 i4 m. C5 @+ d7 Q% B+ E
  158. SBC Scroll_H5 _0 f2 F1 a( ^% @& F( O) V
  159. STA PPU_SCROLL
    ' s; J6 k9 n5 K+ t- Q2 p
  160. STA PPU_SCROLL
    $ {+ F& y1 z1 `% o
  161. RTS
    6 d1 _0 S8 C" C+ c, X- V1 p

  162. * K# f7 Q+ L9 b3 p& z# h
  163. ;==================================================! b  b$ [/ q6 O) t" A! P! Q  w' x
  164. ;;IRQ滚动控制
    . `0 x8 i0 y8 g8 G) R4 A
  165. IRQ_Set_Ctrl4 {# {7 b5 D3 y1 k" t1 e! n
  166. LDX IRQ_Process_Index
    6 o1 u; j3 L2 }/ [8 [8 D( {6 v, [- m
  167. LDA IRQ_Scanline_Data,X
    & g$ ?$ u/ v' e6 m1 H0 F0 D
  168. BNE IRQ_Process_Latch  s( L( Q! n/ f; x. v1 W3 M
  169. IRQ_Process_Disable;禁用IRQ( ]! y4 p' Z! e1 t2 B
  170. STA MAPPER_REG_IRQ_DISABLE2 K) X7 {2 j$ h# m/ r6 g
  171. STA IRQ_Process_Index
      n$ _$ u( l: O- X  f
  172. RTS/ R- [4 M! E0 a9 j* s. @7 \
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线! L' r# g9 s2 s
  174. STA MAPPER_REG_IRQ_LATCH+ W( ]" b. u% L* N
  175. INC IRQ_Process_Index+ Z5 e) M3 w4 y2 F$ L' h5 x
  176. RTS
    . U* l' v$ o3 s9 q+ n7 w

  177. . W3 M, l* F, t& W' u1 s- @, s/ \- h
  178. ;==================================================
    . V2 N" A' }0 G) H0 d8 Q* |
  179. ;IRQ处理- _: K( J6 e. B, M$ X& h: H
  180. IRQ_Process_By_Index
    / R* i& c3 g# R
  181. JSR IRQ_Set_Scroll
    3 z. Z7 J% h2 W2 r
  182. JSR IRQ_Set_Ctrl" a& C+ V- Y% l4 \- l
  183. IRQ_Process_End' B9 p, I) f5 M, e4 V5 w! v7 \0 C
  184. RTS
    . w5 q( `) K) h8 B1 X

  185. 3 p7 c0 w2 q- a& h8 V
  186. .ENDM
    ; ^/ n4 }1 L; r5 N* z# Q
  187.   W' M9 y/ x. v. n% Z
复制代码

0 ?' Z: Y/ j8 h& J3 I& K$ V; c0 o4 }1 P  D" C0 O
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-19 06:42 , Processed in 1.076172 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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