EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
. G& {# Y3 P6 x3 M5 g( {0 K0 v2 s
$ ?, }, r& W4 T0 M4 V本次IRQ研究了如下:: n9 l3 M9 p4 k3 C3 }! j; c& P
VRC2&4(Mapper21,23,25)
  M. `& r+ y' A% aVRC3(Mapper73)
* n$ j6 O. u: M* H' O6 LVRC6(Mapper24 & Mapper26)+ E' c/ E4 J6 j: y9 V8 E3 O6 d
VRC7(Mapper85)
- Y5 X, b$ L% x3 r4 QMMC3(Mapper4)
. c2 x* }. a2 ]  H, T( j  T7 oMMC4(Mapper10)+ X- c9 ~( r2 ^4 _% D5 ~
MMC5(Mapper5); ]& Q$ G* m3 _  _  }  Q3 x
Mapper18
+ O+ g+ K) C/ }- nMapper644 |. t# K; ?5 J. o* R7 R. \# y9 L# J
Namco163(Mapper19)
7 Z/ U: K- C0 h6 o8 ^, |4 o/ p- FSunsoft FME-7(Mapper69); N4 ~0 ]& y5 ]; s
: k. d% T  T1 v  W! ^' L8 F! Z* b
共计11种Mapper的IRQ操作使用例子7 L) `/ g9 L9 {1 D5 L1 R
代码内有详细注释, 希望能帮助到感兴趣的人.
. V" B1 i- L4 ^( W  x# V! d/ [  V- Y+ u, R9 l3 @7 C) ?
: }2 }8 q6 L" S. K; e

( H6 T' z; L8 A7 k, sMapper代码主要逻辑(以MMC3为例):' p7 Z+ ~. y& w$ s( J6 I

  1. / o7 [: Q0 x% ~" D+ O
  2. ;==================================================
    $ A1 V- ~+ E; p7 e7 ?" j: u* a6 g
  3. ;Mapper号6 ~+ f9 A& t9 r5 N. U7 \: b% q
  4. MAPPER_NUMBER           = 04* g( R" y2 _9 ]# }
  5. ;==================================================6 h' `( T& \2 q! {0 ]
  6. ;MMC3 (Mapper 4) 寄存器常量; P- ~- \  Y: X$ d9 A+ z. `$ S* G0 a. D
  7. MAPPER_REG_BANK_CTRL        =   $80004 k, d$ L/ N. K' T( M9 D) u6 y* ?
  8. MAPPER_REG_BANK_DATA        =   $8001
    " a9 M* r2 t% _9 S
  9. MAPPER_REG_MIRRORING        =   $A0007 @8 Q/ U0 l4 v. ^8 m- z* H6 c
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001" ?# A2 [4 O7 @, |" J; Q# \
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    # ~: M; ^$ a4 j, ^( I8 m
  12. MAPPER_REG_IRQ_RELOAD       =   $C001( F6 m6 g3 d3 L
  13. MAPPER_REG_IRQ_DISABLE      =   $E000& _& U, {6 X5 V
  14. MAPPER_REG_IRQ_ENABLE       =   $E001  i, J- J3 G' W3 \7 p, n2 K
  15. ;==================================================! }# v, Q9 C* m. W" \" q
  16. IRQ_SCANLINE_BEGIN          = 135# E7 w( X/ m0 E# C
  17. IRQ_SCANLINE_1              = 8
    ! q; h8 b% S$ A9 C) ~
  18. IRQ_SCANLINE_2              = 54! b% X! ]$ J6 F* e2 y6 [( a9 r
  19. IRQ_SCANLINE_3              = 8" }7 y4 L% `/ w  W% ]! U8 }4 c
  20. ;==================================================
    $ e/ u$ L: Y; A2 K3 b

  21. ; K. W; g/ }: h' @
  22. ;====================================================================================================
    * M0 S4 o8 e  V$ h
  23. ;宏常量
    6 u( d2 H( u8 d- J) I7 e
  24. ;====================================================================================================
    & ]5 |9 `2 A; F0 o: |4 Q
  25. 9 C; H+ P4 s7 b
  26. ;====================================================================================================% x3 r8 ?1 b# a
  27. MACRO_MAPPER_INIT .MACRO
    5 h6 U- n9 W2 Y- }4 B" T
  28. ;禁用IRQ
    $ H  V( Y3 o0 @3 t7 C2 ~+ I
  29. STA MAPPER_REG_IRQ_DISABLE0 f1 [! G' ]6 j% s# f: U

  30. 0 _: k  M; E' x; Z$ a1 V" k
  31. ;水平镜像
    0 M" S" N, o# E. [7 l. _" I7 t
  32. LDA #$01; i& I6 {: {5 S+ D
  33. STA MAPPER_REG_MIRRORING# a& t2 W# b, ~/ b7 D; t6 C

  34. ' k7 A' r5 |% r# N7 y  _
  35. ;初始化图形bank, g) C* E' G* _) r
  36. LDX #$05
    $ C5 y" Z& _! f+ Y9 p2 Q, v1 O8 T: U
  37. .Init_Chr_Bank' `) @. d  T5 i4 b+ p: W
  38. STX MAPPER_REG_BANK_CTRL" w+ E- ~/ ?0 a1 J
  39. LDA .ChrBankData,X
    $ q! O; b3 H. \* F" e
  40. STA MAPPER_REG_BANK_DATA
    7 N( e% o* K# o: A: x
  41. DEX" j$ E& p% ?/ L* }. d9 o3 e9 }. h
  42. BPL .Init_Chr_Bank
    6 Y, K: y# U6 i3 E5 `
  43. JMP .Init_Chr_Bank_End
    2 l- D2 v+ U8 }- O/ H
  44. .ChrBankData
    8 v% B! ^% O2 [' F) H: H( a$ D' S
  45. .DB $00,$02,$04,$05,$06,$07
    " J6 E* c: ~% z% [
  46. .Init_Chr_Bank_End3 Q7 d* [( V% s$ X) P  w1 R: i
  47. * S+ N/ L- j, n* Z
  48. ;启用SRAM" b9 _4 i$ v% X, D/ L" ?9 j
  49. LDA #$80
    7 U* z! E4 c! g
  50. STA MAPPER_REG_PRG_RAM_PROTECT+ j' }+ t( A, ]0 r2 Z( d/ f4 `# _
  51. .ENDM/ d% F8 ~$ M7 Y/ y, T
  52. 0 v! q8 d  s7 Q  Q# \
  53. ;====================================================================================================' ~$ M% _' |. g2 K( g7 H. f
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    4 g. b; D8 ?/ g7 f
  55. .ENDM
    " w; b, ?5 `$ _* v: Q1 v2 d
  56. $ Q7 B3 E9 _) U$ P! N
  57. ;====================================================================================================
    , E* V4 ^3 K% ?! e7 E$ F# s- H) Z+ V
  58. MACRO_SRAM_ENABLE .MACRO
    # ?5 x2 b" l1 @9 B! o1 q
  59. LDA #$80$ u* {, P' w5 i: d& C# ^1 |# Y
  60. STA MAPPER_REG_PRG_RAM_PROTECT" J3 X* H& h: ^1 d; s( T. n+ m
  61. .ENDM
    " o( T/ l- H0 }( o; B9 N

  62. : `+ u# F. I  P3 X! i% h
  63. ;====================================================================================================
    # t: ^" Y5 m+ J+ g% J- h
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    4 @) v* C0 [6 x0 Y9 Y! U
  65. PHA0 m! t, r  T* p- R/ H3 j4 s
  66. LDA #$060 s; ^" X' B+ l2 U* Z: v  b' M
  67. STA MAPPER_REG_BANK_CTRL
    ' A7 ?7 P" c6 _1 ^7 k% w% ~( \+ y
  68. PLA( S; F9 J) i) Y7 D+ K- [4 _' N
  69. STA MAPPER_REG_BANK_DATA8 y1 Z. w3 x* O
  70. .ENDM- I; h7 d9 w" ?# ~

  71. 5 l0 \$ s+ r2 w6 v4 w
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    ; t0 z. g9 }/ s) F9 m- F, Z& d# e
  73. PHA+ q( n7 f  M1 h7 K5 }+ x% [' t
  74. LDA #$072 v. |) v! H$ k1 e6 L- ^
  75. STA MAPPER_REG_BANK_CTRL
    9 r9 _0 x+ ?( l% L2 w; `- f- ]( a, c4 O
  76. PLA
    1 r" E+ \3 q& K0 _1 U+ H- T
  77. STA MAPPER_REG_BANK_DATA
    ! V7 Z* R$ r& B2 ?+ {
  78. .ENDM+ K$ [' D# f3 h0 [4 D! E

  79. $ m* a4 t. W% T0 R3 Q
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    . \" m# {: h. C9 C2 f) V
  81. .ENDM
    2 w) u( q: r8 r; L
  82. ! w! a3 u5 S8 b9 [
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    0 Q; V" b! F& ^: I5 K. R# Q! L
  84. .ENDM4 N' A: c. u% b, A  M1 W" D9 Y
  85. # W! |3 u7 S, p" \) W: K1 O! R* Q  h
  86. ;====================================================================================================: J1 F% x7 |; @8 X% Q; w
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    ! s' ~; I% `9 H% H
  88. LDA #IRQ_SCANLINE_BEGIN + 13 V4 Q- b2 r7 q: g' s8 z
  89. STA MAPPER_REG_IRQ_LATCH
    $ t/ l' b' V  e1 C+ G' G
  90. STA MAPPER_REG_IRQ_RELOAD
    / _9 w3 L3 U& a5 h, o- d" i
  91. STA MAPPER_REG_IRQ_ENABLE; C: C' I# J( R% e6 ?( [1 Y
  92. CLI
    ) s+ J3 c1 Z9 k5 }
  93. .ENDM* X1 E- w* x. Y0 `$ o0 h5 r4 Z% O0 M

  94. 7 P: S& Y, a  B9 u# i) O# D5 G3 O
  95. ;====================================================================================================' _6 u% F/ {4 I, }3 U% h- b
  96. MACRO_ENABLE_IRQ  .MACRO
    0 u% [3 F8 E% u6 L  J- ~( t
  97. STA MAPPER_REG_IRQ_ENABLE
    6 N8 G- y1 J9 G4 z
  98. .ENDM
    , R/ X% D0 M- c$ {9 G6 G) Y0 y  E

  99. ' [" e2 V( e0 |) t
  100. ;====================================================================================================
    2 l$ ^' @! D1 @3 b2 I
  101. MACRO_DISABLE_IRQ  .MACRO
    1 Z6 q* _/ r3 Z% S% A. Z+ e
  102. LDA #$00. c5 F% l! r# v8 q' J
  103. STA MAPPER_REG_IRQ_CTRL
      w  f' P, K( r( I. Z! G! F
  104. STA MAPPER_REG_IRQ_ACK" O8 [9 ~% v1 |5 e* y7 y
  105. .ENDM1 v9 W3 X! ?. Z' n7 {

  106. ( @1 f1 `: s2 w; i* r! j
  107. ;====================================================================================================+ W8 C; c' b! {1 L/ m3 P/ c9 e
  108. MACRO_ACK_IRQ .MACRO& X$ w; K( @9 }2 W! l$ S
  109. STA MAPPER_REG_IRQ_DISABLE/ }1 I6 H+ `2 @' w( n* F
  110. STA MAPPER_REG_IRQ_ENABLE& J, m9 Z: e6 E& f# X
  111. .ENDM
    3 ^* P# K' _0 a  w6 \
  112. ; ^2 I+ ]& p5 F( ]0 D( p/ H
  113. ;====================================================================================================- q3 X2 F. i4 {. j9 X! ^
  114. MACRO_IRQ_OPERATE   .MACRO
    ! v7 q% w2 z' i  h+ o
  115. 0 z# _3 c4 k: q
  116. ;==================================================
    1 N1 g# z7 d; E& _+ r, I: ~
  117. ;IRQ滚动模式常量! I! q4 h9 \2 c4 r) }0 |: `% _* }
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    0 N; _: v8 |* z( X8 n3 O. u3 `: f
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    # r3 Y* |7 f  I6 B. B
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动9 J5 r$ J0 C& c
  121. 1 U; `' m4 C( j. A
  122. ;IRQ扫描线数据
    9 `1 I  R' r( X+ ~0 H
  123. IRQ_Scanline_Data3 R3 U  S4 f  b; E
  124. .DB IRQ_SCANLINE_12 x, m/ s6 \1 z% z) B, ~- ?
  125. .DB IRQ_SCANLINE_23 |/ z- P5 x! \' U: y
  126. .DB IRQ_SCANLINE_3
    2 H5 a7 ]) s6 c' n. E  s
  127. .DW 00 ;关闭IRQ
    $ y- C  u- n, A3 l! B3 w* h

  128. 2 h6 C8 s( N& V8 B0 ?- g0 @3 E
  129. ;IRQ滚动控制模式9 p. {+ W- P" z5 L
  130. IRQ_Scanline_Mode6 P- ]+ Z% P) }
  131. .DB IRQ_SCROLL_MODE_RIGHT' n. C# M! [6 }. j2 I
  132. .DB IRQ_SCROLL_MODE_LEFT
    # ^: P# |5 Z8 k' g$ U
  133. .DB IRQ_SCROLL_MODE_RIGHT, Y) t9 b# ^7 s
  134. .DB IRQ_SCROLL_MODE_LEFT
    & u4 ?/ q4 k! h- t; ^% D# c
  135. - k- Y% p3 b9 E
  136. ;==================================================0 v8 T7 h+ X7 P5 w- s. D
  137. ;;IRQ滚动控制4 y% Y& h( b/ b3 s' _" T% |
  138. IRQ_Set_Scroll
    & r$ Q* [' H) t7 }: L& s9 e! q
  139. LDX IRQ_Process_Index8 ?  u4 @- s9 i4 r: k# d) x& N
  140. LDA IRQ_Scanline_Mode,X# }* e1 V* `( x2 j, O  s: ]
  141. CMP #IRQ_SCROLL_MODE_LEFT; K8 K/ c4 ~; g2 P! E
  142. BEQ IRQ_Set_Scroll_Left
    ( V, _. y1 F, O, o
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    1 n( D7 n, y) _
  144. BEQ IRQ_Set_Scroll_Right. `# k  F- w* l2 S1 G
  145. IRQ_Set_Scroll_Zero;不滚动
    ' ~' J/ {: R  v* O3 W5 z
  146. LDA #$006 k: p4 L. {1 G% B  q0 D5 R5 |0 B
  147. STA PPU_SCROLL
    2 q( z* t- y( n% l0 F
  148. STA PPU_SCROLL
    ; x. c; R8 @( O5 E# L0 l  G% g
  149. RTS
      `/ Q. x4 Y; ^7 M" R
  150. IRQ_Set_Scroll_Left;向左滚动- A8 q4 S" B* q+ @' h, _. f3 n
  151. LDA Scroll_H( A: s4 B9 `0 e! T" n; m0 ]' q! N0 H
  152. STA PPU_SCROLL( d0 O2 Y, J# Y3 c/ {0 u% D2 \
  153. STA PPU_SCROLL& b* z8 y9 Y5 s
  154. RTS
    8 P8 v9 S) w3 `7 G! ^
  155. IRQ_Set_Scroll_Right;向右滚动4 K- q$ J% [1 \
  156. LDA #$00- C! ~; d* w0 O% z! w
  157. SEC
    , f& Z& r0 k) S- ]3 l# l
  158. SBC Scroll_H8 U+ e( k$ M" W4 F/ ]% D& F* O
  159. STA PPU_SCROLL
    0 q& o; C  w! S" ]
  160. STA PPU_SCROLL2 ]2 ~' _' S6 b5 e8 J$ s- z
  161. RTS5 ?1 B2 T6 S# Y& n2 N

  162. - f/ u/ H  C7 X, `; N9 o9 t! F
  163. ;==================================================! `4 J! [( x# P: ~$ W8 H/ l
  164. ;;IRQ滚动控制0 _9 e5 |% r# L0 G
  165. IRQ_Set_Ctrl
    ) m% I) M/ `/ `3 e1 ~* |: F
  166. LDX IRQ_Process_Index
    * X: ^/ j' \. D: z% J; N
  167. LDA IRQ_Scanline_Data,X
    " E; y* w2 p6 W: p5 r
  168. BNE IRQ_Process_Latch
    ; K! ~' X2 M8 O; t- X+ W
  169. IRQ_Process_Disable;禁用IRQ
    0 K2 f; {( R2 ]# {$ L
  170. STA MAPPER_REG_IRQ_DISABLE
    9 o: l- u3 P4 `/ N4 l
  171. STA IRQ_Process_Index* P8 }1 Z; O$ m' L
  172. RTS
    - S# J" W& n0 W1 f1 K( b- Y
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线/ n/ }* k3 u: [# i4 _5 p! B* Q
  174. STA MAPPER_REG_IRQ_LATCH- \/ P0 l6 d. ?5 M
  175. INC IRQ_Process_Index# A5 l# C0 p. p8 e5 S+ Y2 ~2 n
  176. RTS* f8 Q/ [, q$ t) s* b7 g
  177. 9 ^* t) P0 N+ s& N% i
  178. ;==================================================% ?+ W0 F/ W% z$ y
  179. ;IRQ处理
    8 `5 o# P5 U# `0 t' a) o# \) @
  180. IRQ_Process_By_Index
    % H( h# _1 _+ Q+ ~6 _
  181. JSR IRQ_Set_Scroll9 M$ p/ R1 E$ U8 j/ Z) z
  182. JSR IRQ_Set_Ctrl4 Q# B4 J/ W6 b
  183. IRQ_Process_End* s, q% L5 b2 B
  184. RTS
    3 Q/ \6 B7 l0 b( n6 G! h
  185. 7 y* n8 P  x7 c( r& q
  186. .ENDM
    ( |/ M/ C5 j" s3 U' w2 d+ [
  187. * _9 T! n' Q1 s$ W3 S& }
复制代码

2 H" A. p7 }" q3 W! q6 ^4 A5 T2 X$ K$ L0 B* l( s! W) E& c
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-19 00:28 , Processed in 1.068359 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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