EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
4 a5 {  K# Z; X* u& N6 G! g9 y
2 L3 r+ S, H+ ~本次IRQ研究了如下:/ u! i8 r4 _. k! M# A
VRC2&4(Mapper21,23,25)
. v, C4 V4 ^* A' yVRC3(Mapper73): F* p' V* _! J, C
VRC6(Mapper24 & Mapper26)
' E3 S; S2 l$ j1 s* Y3 V/ f5 h, \/ xVRC7(Mapper85)
* }) Z2 L/ g. r  fMMC3(Mapper4)7 }0 P* [( u; I# J
MMC4(Mapper10)) @1 s7 ~3 ?4 `: |/ p; {
MMC5(Mapper5)
$ H1 c1 y5 S( DMapper18& y! t+ J) C" D7 `, r
Mapper64
6 W0 ^; n9 d% \7 qNamco163(Mapper19)
, K8 W, K+ ~! ESunsoft FME-7(Mapper69)
. l" b) D9 a. ]
2 Q$ |" w& K& g; A  h$ [: Y+ N共计11种Mapper的IRQ操作使用例子
, N. }/ R- l& L9 e3 o代码内有详细注释, 希望能帮助到感兴趣的人.
0 V3 S6 B- R( J* U: c0 W9 \5 P( ?" y) ?$ S# A  o3 Y

' T) v( `! K  k
1 ]" H% p" E2 U2 d- e5 Q8 `Mapper代码主要逻辑(以MMC3为例):- y) @& N  U3 K: ^; y. U$ t  E
  1. - R+ v! a6 T+ _5 p" o
  2. ;==================================================
    8 m5 h. F9 s. A
  3. ;Mapper号, Q# P: v0 f* y) j
  4. MAPPER_NUMBER           = 04( E; s8 ?% a$ |) W: M% L: l
  5. ;==================================================- I6 Y' V5 S7 _( H( y
  6. ;MMC3 (Mapper 4) 寄存器常量5 v3 y. t" o0 L! V& e' C
  7. MAPPER_REG_BANK_CTRL        =   $8000% T- a. b. R" n: t9 G$ W
  8. MAPPER_REG_BANK_DATA        =   $8001
    - v; o+ \5 ~6 J2 R' }0 Z4 o0 v
  9. MAPPER_REG_MIRRORING        =   $A0007 ]; e; j% E- N
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    : `! l5 @1 [# Q4 ~
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    " y7 a2 W* e6 g1 s. u! C
  12. MAPPER_REG_IRQ_RELOAD       =   $C001- E0 }; {" U) ~: W
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    3 t" Y0 `; {# t/ J  F
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    - W( B. [, Q3 G6 _2 k
  15. ;==================================================/ E& P1 M6 K3 Q. d+ O
  16. IRQ_SCANLINE_BEGIN          = 135
    1 x( B* `6 q# ^' W! N9 F/ U
  17. IRQ_SCANLINE_1              = 8
    % r' p& ?/ A; _: h7 a. q& I- p; u
  18. IRQ_SCANLINE_2              = 54
    / J" w3 s' S* X+ c
  19. IRQ_SCANLINE_3              = 8
    ) b+ y1 W5 O9 R3 V; k2 j
  20. ;==================================================' v. a- c; @! f9 n

  21. 2 E% z9 f- U; a" f, q& W7 u0 c
  22. ;====================================================================================================% p+ E/ w. f2 N
  23. ;宏常量( `2 c$ c& V  [/ ]5 z
  24. ;====================================================================================================
    * i: G6 z( G4 o8 I6 g3 Z; G) T* H

  25. & P0 f3 q# ?9 O
  26. ;====================================================================================================  ^4 K/ M/ z' _$ e  H
  27. MACRO_MAPPER_INIT .MACRO0 Y9 S" G! S8 n$ G5 V8 H( C' h1 w
  28. ;禁用IRQ& O9 y/ O8 F, d) V  t% l
  29. STA MAPPER_REG_IRQ_DISABLE) Q9 _- `/ I0 h; i7 Q, `. G- [
  30. 4 |5 {8 c: p) n) ^+ ~% n, z& r
  31. ;水平镜像8 K2 O* S2 F- h0 h; c8 m
  32. LDA #$01
    0 a$ H' ]( F$ `8 C9 [6 P! [
  33. STA MAPPER_REG_MIRRORING( m% c7 ?, [  q+ Y

  34. % s& s: `) c1 z( U; p0 Y) e+ `! O( P9 m1 U
  35. ;初始化图形bank5 D0 k7 z; @5 q
  36. LDX #$05  M0 C# J) h+ Q! O! p
  37. .Init_Chr_Bank
    5 f- J% o  X+ s3 n5 {4 R
  38. STX MAPPER_REG_BANK_CTRL2 Q5 L, Y. \* ?( q3 q! L, E
  39. LDA .ChrBankData,X1 l! R# L( _& V1 R; A3 f- |% ^
  40. STA MAPPER_REG_BANK_DATA
    , b( s; B9 L5 ]6 r# O; B
  41. DEX9 H0 R& l' F0 c" E( T- L
  42. BPL .Init_Chr_Bank$ N+ a+ n! p# Z  W) W3 ?
  43. JMP .Init_Chr_Bank_End3 C- M- h5 q; j$ w5 {) m* R
  44. .ChrBankData  ~$ F# F9 k5 L- [1 M  d/ z8 C
  45. .DB $00,$02,$04,$05,$06,$077 y" Y, t5 x5 Z/ K
  46. .Init_Chr_Bank_End
    , j) j0 `2 u& h0 e( H! _$ N

  47. 0 ?: b; h$ S5 D" }% J( Z' z
  48. ;启用SRAM
    2 K" h: ^& Y1 M; m3 R7 w& E1 l
  49. LDA #$80
    , b& R4 y+ E$ m6 N
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    1 M) N3 `# e" M. }3 \+ l
  51. .ENDM, U1 H/ u" [& [: G7 {3 N( r
  52. : @9 j/ N% W- R
  53. ;====================================================================================================
    ; y/ {2 M0 Q' C# S6 A6 M0 o
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO( x0 ^- G7 V5 R* \, s0 ?
  55. .ENDM! v8 u3 T- j" G# _1 n' Q  h1 A- d

  56. 9 t5 w+ t4 a& C* {
  57. ;====================================================================================================
    * r9 Z0 d3 g& k& v) p- T
  58. MACRO_SRAM_ENABLE .MACRO" b: i( ]% |" u/ [7 ?7 w
  59. LDA #$80
    , m* L7 Q- Q' k
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    8 J9 V7 k5 o  C  B4 ~
  61. .ENDM) P7 ^4 ~; J4 g9 p1 O

  62. ' [2 M; m1 P; k1 m" q6 I8 J/ Q( S
  63. ;====================================================================================================7 Q" p! u% a6 L0 v  H1 D' v+ p2 c# L
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    $ S7 @+ T( r$ J4 a2 h8 G# N
  65. PHA$ l# u/ A4 f. ]0 }4 k/ P2 {% |
  66. LDA #$06
    7 Z: B; a) S" ~. ~
  67. STA MAPPER_REG_BANK_CTRL
    4 d! A( T% r4 V( f/ l, p! q+ H6 e
  68. PLA
    3 n9 e; r" L) n8 b3 z
  69. STA MAPPER_REG_BANK_DATA9 p& k& ^2 j0 l4 Y; Q/ E8 Y( [
  70. .ENDM! j0 D* H4 }! N9 Q

  71. 6 }; \7 N: p3 `( m1 }1 f- Q
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    # T- [$ @2 D7 s; U+ k/ j
  73. PHA/ b9 w7 N4 X5 z/ ]7 q' t- y- f
  74. LDA #$07
    2 @) R/ g4 |  N$ k
  75. STA MAPPER_REG_BANK_CTRL
    * E8 X( t' ]2 z+ ~
  76. PLA
    $ r" c! y* a* V% B" I8 @0 W
  77. STA MAPPER_REG_BANK_DATA
    0 K- i, r5 y9 ~/ L" I- [; X. n
  78. .ENDM0 P  B' {6 L' i8 R- b/ S% r
  79. 1 Z, ^$ R' {: W& `5 p1 k$ j
  80. MACRO_SWITCH_BANK_C000_A .MACRO% K) h) ~  Q$ B" q9 z
  81. .ENDM
    2 `8 a! k, z  Z" G* k9 L% R5 W3 p
  82. 8 F9 o8 v9 w- |/ F: k$ D
  83. MACRO_SWITCH_BANK_E000_A .MACRO) m1 a# _& S) w8 I- C; W" g$ b
  84. .ENDM# G& D+ B  l4 F
  85. & q2 x: X' U0 O8 ~9 Q
  86. ;====================================================================================================8 F) g# P7 s/ Y( u% X
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO" U$ y. i9 u) k2 O0 a
  88. LDA #IRQ_SCANLINE_BEGIN + 1) O- s( \) s6 U# i% P/ l0 x/ `! v$ D. q
  89. STA MAPPER_REG_IRQ_LATCH
    0 c) N& @; j7 Q9 h8 R- l" @$ D
  90. STA MAPPER_REG_IRQ_RELOAD7 K5 {# z5 Q- r* c, g4 Z
  91. STA MAPPER_REG_IRQ_ENABLE9 v: I$ R, Y0 [5 ^3 M2 S
  92. CLI
    " ^' v$ T0 N5 J+ b2 I% u, {, ?
  93. .ENDM
    ! Y! a( L# a) T. B
  94. 9 {! }! w4 u: z1 c
  95. ;====================================================================================================
    / T# q1 |# Q( l/ Z5 {$ W3 S
  96. MACRO_ENABLE_IRQ  .MACRO& l: G$ ^/ R0 A
  97. STA MAPPER_REG_IRQ_ENABLE' \2 [# B7 b1 i. u5 t
  98. .ENDM/ q5 @0 z, e0 N. c6 D: R9 s1 j4 Z
  99. * N5 c+ V$ U- Q: B6 `3 e$ U3 N
  100. ;====================================================================================================
    ( ~3 M  u2 w. ?1 P
  101. MACRO_DISABLE_IRQ  .MACRO& M7 S$ ]; B2 p0 b/ B7 }7 a
  102. LDA #$002 w5 w# w& A# i- w3 \
  103. STA MAPPER_REG_IRQ_CTRL
    9 C+ K4 [# ^/ Z" F
  104. STA MAPPER_REG_IRQ_ACK
    / `/ q: e  H* z. X
  105. .ENDM# R: ~5 F- z% f. {$ h3 M( r

  106. $ O, u$ S+ S* M% n, Q/ r
  107. ;====================================================================================================0 I. o9 R/ @7 x) m+ |. a
  108. MACRO_ACK_IRQ .MACRO6 E) ?  ^) s& R
  109. STA MAPPER_REG_IRQ_DISABLE$ H) [0 ~1 i. y- a* E
  110. STA MAPPER_REG_IRQ_ENABLE
    / J6 z% s2 c* h
  111. .ENDM2 \' A/ w/ S  A9 s5 u

  112. : r- R* a5 g" [- [8 W
  113. ;====================================================================================================
    3 W( P; f3 w5 O, S" y( D+ ~
  114. MACRO_IRQ_OPERATE   .MACRO
    9 J7 p: Z' W" b# J% v) P: w# S
  115. ( |& t- i( S8 I9 W. r, u  V
  116. ;==================================================( Q" e9 G' c1 W8 E, X  e
  117. ;IRQ滚动模式常量
    ; C2 G7 l/ O7 k5 c) M0 a* i& I1 _
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    ( O1 ?& K& A& J" V" P9 D; v
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    $ z& J0 e: k$ \2 V* b& ?
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    ) M- M# v4 T9 M6 F* x

  121. % G  h; Z$ S( _* ~- K
  122. ;IRQ扫描线数据1 x5 ~0 x& D% @& e. g9 B
  123. IRQ_Scanline_Data
    ! L- {- E$ P& j
  124. .DB IRQ_SCANLINE_1
    5 i+ a! a% ^' h( @, V
  125. .DB IRQ_SCANLINE_2
    - J- @" V5 J1 T) I; G
  126. .DB IRQ_SCANLINE_3
    % l" s- I+ Q9 {7 k' ~' g
  127. .DW 00 ;关闭IRQ
    + I# r( T% O6 Y3 r

  128. ( @8 ], T' o7 K3 Z- U: X- [
  129. ;IRQ滚动控制模式
    6 C+ H  ]2 |, G* g% r7 [
  130. IRQ_Scanline_Mode6 U, Q) l) q; N: [+ N# L
  131. .DB IRQ_SCROLL_MODE_RIGHT
    4 C, r$ a% K' U
  132. .DB IRQ_SCROLL_MODE_LEFT  w. ]8 z: K2 _* d$ a3 h
  133. .DB IRQ_SCROLL_MODE_RIGHT
    2 v  b5 d9 V9 Z& ~1 f$ C/ F
  134. .DB IRQ_SCROLL_MODE_LEFT2 P' S9 Q! O6 d
  135. - P' Z5 G0 T. h
  136. ;==================================================
    6 ]* c% V$ y. M; \" x+ ]4 Z
  137. ;;IRQ滚动控制
    + O1 b8 B& Q) G2 l; L
  138. IRQ_Set_Scroll0 O9 u2 E; D; @" o
  139. LDX IRQ_Process_Index
    " y' Q0 z! C$ z+ q
  140. LDA IRQ_Scanline_Mode,X
    ! T+ ^% C4 \5 [) r. a
  141. CMP #IRQ_SCROLL_MODE_LEFT) [2 u  g/ O# T# B3 i
  142. BEQ IRQ_Set_Scroll_Left- f% b; K/ k* O8 r8 X
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ' e  U9 @2 {. \% y8 j6 m. U
  144. BEQ IRQ_Set_Scroll_Right
    5 a6 l) ^  c0 n+ v/ Y7 e
  145. IRQ_Set_Scroll_Zero;不滚动" T& d( ]$ S  S/ R
  146. LDA #$00
    0 |% _" t. `- C4 v
  147. STA PPU_SCROLL! s& `% ?- V9 M8 C: A
  148. STA PPU_SCROLL
      W; }$ R5 k9 E0 X
  149. RTS
    ! v0 K( Y4 h  C5 @) B8 [+ U# f
  150. IRQ_Set_Scroll_Left;向左滚动0 p, r6 T) u0 Q! e* S0 B. n
  151. LDA Scroll_H. k) x( T. o( K5 b+ D4 m
  152. STA PPU_SCROLL3 v2 ?. _5 m6 e* d" {+ W$ ]
  153. STA PPU_SCROLL
    - j, t% X# z1 Q$ Q- W. x' T
  154. RTS
    - ~% l) R1 W2 K6 R
  155. IRQ_Set_Scroll_Right;向右滚动( K1 }( d. H$ J' d# @. Z6 B# v
  156. LDA #$00
    # N& l, }- ~3 u+ V- e$ ~
  157. SEC
    0 d/ S" e7 s; V  m# A9 Z! t- }9 Q
  158. SBC Scroll_H
      ?1 j# p9 u/ s
  159. STA PPU_SCROLL
    ' T' I$ p  X+ o2 ^$ |% h) L  k
  160. STA PPU_SCROLL6 W. M* T3 c: r1 K* c" S
  161. RTS7 Q9 L7 s/ R% N7 V, W& y2 V/ g
  162. + W; T" f: c! {/ C; O; z
  163. ;==================================================
    9 |( O! c( o* V" W, O
  164. ;;IRQ滚动控制
    9 W4 }% v/ E0 B( S+ K! e
  165. IRQ_Set_Ctrl& N+ A# _, B3 q1 ]# ~9 n
  166. LDX IRQ_Process_Index" t: f% L& c4 A1 O5 M, t5 r
  167. LDA IRQ_Scanline_Data,X
    / t4 R, e+ z' F' R; x. m/ k
  168. BNE IRQ_Process_Latch' [8 D( T8 K1 p0 y/ F& ?
  169. IRQ_Process_Disable;禁用IRQ) K/ G* K8 Q. a7 {
  170. STA MAPPER_REG_IRQ_DISABLE- F. o3 T+ \+ R- R& Y# E+ O- S
  171. STA IRQ_Process_Index
    + p% P  \5 T+ s. Y( ~) {
  172. RTS% I& B1 U, K4 U$ z
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    3 h9 Y( h; y' M6 T
  174. STA MAPPER_REG_IRQ_LATCH/ S0 s" Y% Y# G1 c
  175. INC IRQ_Process_Index0 f2 W+ f% ^2 m. O4 w
  176. RTS
    5 a5 S0 c2 l- [

  177. + r5 D. ^9 R! m' E. _
  178. ;==================================================
    2 J0 Q& C+ L' _
  179. ;IRQ处理
    * I# h: l( B) N) B% B( `+ o
  180. IRQ_Process_By_Index
    " u; p1 l4 S7 D) ]
  181. JSR IRQ_Set_Scroll2 R) q7 p+ Z9 p$ {; v
  182. JSR IRQ_Set_Ctrl2 o, x# I% W! h6 Q! q& F! f
  183. IRQ_Process_End
    3 @3 T7 `! |! ?7 i
  184. RTS
    ( @; I& Z1 J$ s. a9 _7 W& i

  185. 2 B" G2 [7 f: [9 x1 _2 m+ k
  186. .ENDM
    & I. K- }! X3 W  y
  187. - e# t* W- ]  o2 P2 c
复制代码
+ Q9 |' d% p; F- u

; G# _2 k3 G* O" i$ A! m代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-20 03:02 , Processed in 1.070313 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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