EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
9 z4 c( F4 a4 s- _5 K
) r) @" y; h  f4 ]) f本次IRQ研究了如下:0 E( H( g# ^4 y! v1 t# {
VRC2&4(Mapper21,23,25)
- O0 q. Z1 s9 cVRC3(Mapper73)
" |7 G, m2 H8 _& ]# v/ ?  `VRC6(Mapper24 & Mapper26)' ]& f/ y' w) P1 k. }0 R
VRC7(Mapper85)
( }4 y- ?9 \& K6 H  E  e3 }7 B" @MMC3(Mapper4)1 v: b, ?( Y# ~& y8 s7 v- x
MMC4(Mapper10)
3 g) ^, S7 r$ JMMC5(Mapper5)9 {; P3 R) g+ c. R
Mapper18
2 G, p  x- H- iMapper64
( I' f$ {+ I: }Namco163(Mapper19)' R) W7 w/ j0 }. Y
Sunsoft FME-7(Mapper69)9 E- P+ H! ?3 _9 W) s3 O
4 O! B) Z9 p( \/ S1 F5 W* [$ H3 l' t
共计11种Mapper的IRQ操作使用例子
; l6 S2 r8 q7 A代码内有详细注释, 希望能帮助到感兴趣的人.
9 p/ R0 n5 f- }5 B- U/ k6 t' M4 z! W3 X  |# l  r6 @8 b" [
+ r0 P6 N7 |# l
( O+ x6 c) f1 J4 q. Q
Mapper代码主要逻辑(以MMC3为例):$ n$ m/ A2 @: }4 s- W% q

  1. + Z$ U0 }% k! }2 s( B
  2. ;==================================================
    4 a. r4 P. P9 Y6 I5 b9 g7 ~) M+ e
  3. ;Mapper号+ n7 L6 g# R! H# U! J) ]& ?
  4. MAPPER_NUMBER           = 042 O. w- ?" o5 }
  5. ;==================================================
    - a  K8 D% u1 S. |! r
  6. ;MMC3 (Mapper 4) 寄存器常量$ o, E+ p8 E; C; M4 l; J; i! p
  7. MAPPER_REG_BANK_CTRL        =   $80004 ?" p- X  s/ z8 R
  8. MAPPER_REG_BANK_DATA        =   $8001
    2 ~0 j! W% }2 U1 V' K# s- j
  9. MAPPER_REG_MIRRORING        =   $A000
    ' P+ v1 E. C  V- U4 ]9 h2 ?* O
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    ) F2 A- W, G  o: u5 T$ @- r
  11. MAPPER_REG_IRQ_LATCH        =   $C000+ t) q7 S3 E3 F/ G- k0 y
  12. MAPPER_REG_IRQ_RELOAD       =   $C001- S; w! g% \, T$ O3 @& Z
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    6 O9 t9 ^5 o9 P' ?
  14. MAPPER_REG_IRQ_ENABLE       =   $E001" Z  }! y% a8 l
  15. ;==================================================: d% f0 u% X* s  x  y! {- R3 @; k
  16. IRQ_SCANLINE_BEGIN          = 135
    ' k7 d% h, R( r* f5 ]5 P3 t, e
  17. IRQ_SCANLINE_1              = 8
      R$ V  r; `- ^6 i. q6 u  _' k
  18. IRQ_SCANLINE_2              = 54
    0 [. \- o1 {) e0 a# T
  19. IRQ_SCANLINE_3              = 8. u9 Y$ i" D' t, T% L% w& @
  20. ;==================================================/ s  y& P1 P4 p$ B
  21. 8 n6 o) R7 p4 B% E1 @1 \% L6 f
  22. ;====================================================================================================3 p% [- I7 r) B, D
  23. ;宏常量: }; x; K7 E. z
  24. ;====================================================================================================
    # g9 p" Z; _( h& u9 i
  25. 7 L% K6 u: v, E; ?  @
  26. ;====================================================================================================
      `' t5 z6 h* C" w) Z
  27. MACRO_MAPPER_INIT .MACRO
      W+ b* Z' x( n2 A
  28. ;禁用IRQ* m0 ^; f/ A7 e4 I; s) _
  29. STA MAPPER_REG_IRQ_DISABLE
    * b) T( q- a9 K( @4 @, k

  30. ) h6 F  O1 e3 |" b+ Z6 d
  31. ;水平镜像. e" z! Q& u/ N1 ]4 U& u
  32. LDA #$01
    : U" _9 ?7 U7 s. |& ^5 D
  33. STA MAPPER_REG_MIRRORING
    ( r! Z/ n8 B+ l) j' x
  34.   r1 o: K) v7 H0 X
  35. ;初始化图形bank
    $ y% {, y; j' Y" b3 z8 S9 m
  36. LDX #$05# t( P7 V5 D5 o( E# R+ v
  37. .Init_Chr_Bank. r5 D2 \, [, s  n) t
  38. STX MAPPER_REG_BANK_CTRL9 E8 U# c7 s2 S
  39. LDA .ChrBankData,X: C) S; l0 C; G* y1 v8 B. _
  40. STA MAPPER_REG_BANK_DATA4 D- w% }) ?% t- A; z
  41. DEX# n6 v) y; o- ~- O# H! `
  42. BPL .Init_Chr_Bank
    8 _% |; S  e3 b& p5 s
  43. JMP .Init_Chr_Bank_End4 b3 o& W8 o0 e
  44. .ChrBankData
    7 e/ ]: u$ g  {, J
  45. .DB $00,$02,$04,$05,$06,$075 n2 p+ @7 O1 D7 E; e2 j/ |
  46. .Init_Chr_Bank_End
    5 L4 o( m0 l2 A

  47. - I7 ~) K0 o% w: N/ C
  48. ;启用SRAM2 Q  \1 K6 H: t; m
  49. LDA #$80
    ' t5 ~2 f* W$ k% _8 I" e7 v& l6 Z
  50. STA MAPPER_REG_PRG_RAM_PROTECT" w' e" b$ T* f
  51. .ENDM* Q1 A; i7 J/ O1 u; o4 H
  52. . `, e' n/ T' h; A/ c( ~0 L# x' o
  53. ;====================================================================================================  S/ y1 l) q8 i/ v9 i) G& D) j
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO3 t3 R8 ?! F' c. ^; @
  55. .ENDM
    / l) k8 F4 E+ L9 w; Q
  56. ' p% i7 c/ h5 C9 U; d, Z' L5 t: I
  57. ;====================================================================================================
    $ ^2 E( u  U4 S: ]( w/ r0 k
  58. MACRO_SRAM_ENABLE .MACRO9 F' k  M" f5 ^, i4 i: p8 G- p
  59. LDA #$80! H) U- x* C3 d
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    $ S7 C0 J( a% _: i: h7 `! S: r8 u
  61. .ENDM
    / X7 Z# i1 a! M: Z1 y

  62. , ^. }& Z$ m  ^+ \
  63. ;====================================================================================================
    ' C) [# C8 t; u8 o3 S9 s% O
  64. MACRO_SWITCH_BANK_8000_A .MACRO
      z  Q* X* h  F$ k* b: C
  65. PHA
    . k, Q; A1 K$ \
  66. LDA #$06
    5 r6 L6 s" ^5 n* v$ E
  67. STA MAPPER_REG_BANK_CTRL
    7 \2 T1 t) |8 |; U
  68. PLA% ?. `" q+ Q- F( C7 K6 u
  69. STA MAPPER_REG_BANK_DATA) Y, Z5 F, Y) V) n$ Z
  70. .ENDM
    8 H6 K3 V4 c& ]' a

  71. ! ]; E) x7 v: |7 [' e9 t9 ^
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    / z& l8 R) N3 E! U5 _0 @- d5 j
  73. PHA
    ; b1 }* B' }( J) l0 c% I3 r
  74. LDA #$07; X4 ~, }& T3 q7 ?5 ~
  75. STA MAPPER_REG_BANK_CTRL
    ( l& ?; G# |0 J$ f
  76. PLA
    3 o* c6 j3 b7 c
  77. STA MAPPER_REG_BANK_DATA
    0 J2 n# E6 S4 i' G" Q# w
  78. .ENDM2 z3 o2 E9 l/ [& c( U* H
  79. $ ]' N+ L1 J! N4 h! n0 g3 ]
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    + }# I& E4 B9 @5 w
  81. .ENDM
    ; w! R5 l5 Q) G' l

  82. 9 ]9 a: C/ [9 q3 N
  83. MACRO_SWITCH_BANK_E000_A .MACRO1 e9 ?! S# A. G
  84. .ENDM
    $ n6 C5 c; U: ?& X2 _
  85. ; @/ ^+ u( C# [/ s$ a0 D
  86. ;====================================================================================================% m) R  j0 c2 t8 P9 `5 @
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    . U$ M+ T9 f* j% w/ W
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    3 ~1 x' G8 b4 u7 Y2 t' n1 ]* f
  89. STA MAPPER_REG_IRQ_LATCH
    2 O# i# ]7 k/ d5 Q% j* F) f
  90. STA MAPPER_REG_IRQ_RELOAD6 m& x4 q2 \% e* i5 J
  91. STA MAPPER_REG_IRQ_ENABLE
    - O# t- D9 q7 K/ `  m7 S
  92. CLI
    - V* G5 }$ e) P1 W1 ?( A
  93. .ENDM
    - v/ ^+ s6 O# q$ R& h! B
  94. ( b* S+ A  `) X& I% T/ f1 K
  95. ;====================================================================================================4 l4 G% B1 j; V4 W4 ~# n
  96. MACRO_ENABLE_IRQ  .MACRO
    ! S. O  E  M3 y* Q0 x0 n
  97. STA MAPPER_REG_IRQ_ENABLE
    % H+ M8 Q! |- J
  98. .ENDM
    * n: r7 Q0 v  O: t5 Q
  99. ' C# a0 L  C1 G  Z
  100. ;====================================================================================================4 j. a: X0 N6 J, B8 ?5 J' e
  101. MACRO_DISABLE_IRQ  .MACRO7 h$ {5 ]% |* ?) e5 i9 q" j4 W9 c' D
  102. LDA #$00
    . q1 E& C) H. U7 T; K: B
  103. STA MAPPER_REG_IRQ_CTRL
    2 e/ }5 l0 R; m8 M
  104. STA MAPPER_REG_IRQ_ACK
    ' I  ^# e/ v) p9 ~
  105. .ENDM; h) t; ]0 T5 m& \$ r" T# b

  106. 8 E! ?. W0 }; M" l8 i% a
  107. ;====================================================================================================
    7 @% B. Y& B8 M
  108. MACRO_ACK_IRQ .MACRO
    " q6 _' [4 D/ [3 H5 A
  109. STA MAPPER_REG_IRQ_DISABLE
    : z8 k/ ]% ^' b3 \4 Q
  110. STA MAPPER_REG_IRQ_ENABLE: E/ m9 @/ W7 y5 N9 t
  111. .ENDM
    3 O  M! i6 w/ ~% I
  112. 8 c; L9 V: U1 D9 H! o7 F
  113. ;====================================================================================================
    0 ^# M" B4 Y: x; |) p; @
  114. MACRO_IRQ_OPERATE   .MACRO$ Y7 \- B5 N& v9 z5 b

  115. 6 h! f) d. x* Y: f
  116. ;==================================================  }  M3 j, Y: g5 M, }0 ?  k) Q
  117. ;IRQ滚动模式常量5 s) H+ r; x2 G7 o
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    - h6 }8 o- {9 ?. X
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    + f% I, l5 I  F& L
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    * d1 u- U9 n$ |$ r+ }+ Z! V
  121. ; e4 r/ D" M% a& a: J: w
  122. ;IRQ扫描线数据& q( M% X8 K/ c$ c) }: ]
  123. IRQ_Scanline_Data9 A. f* R* u8 k; M) l+ b
  124. .DB IRQ_SCANLINE_15 _% ^4 B1 h( w
  125. .DB IRQ_SCANLINE_2
    ; }. I: t3 D4 l# B5 M$ _
  126. .DB IRQ_SCANLINE_3. y! t" U8 z8 `1 I9 k
  127. .DW 00 ;关闭IRQ/ H- |/ b7 p6 p5 H8 s3 Z& a# l

  128. 2 A6 H5 q" F8 R# L
  129. ;IRQ滚动控制模式  }5 Q1 o1 O# [$ k5 a4 n3 u! f
  130. IRQ_Scanline_Mode9 A' w+ m- N- G
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ) Z+ p' E. Y3 I7 Q4 S: y
  132. .DB IRQ_SCROLL_MODE_LEFT
    4 R# a; Q) U4 ?
  133. .DB IRQ_SCROLL_MODE_RIGHT6 E+ C4 m0 n/ J0 V; J1 I
  134. .DB IRQ_SCROLL_MODE_LEFT
    9 |8 W3 L4 L. b' Y
  135. ; g0 Y6 q  [/ r$ D4 ^5 e
  136. ;==================================================/ Z/ T! ?; ~2 R' S9 y: ^
  137. ;;IRQ滚动控制
    $ i  p6 a; a/ X/ O3 ?; _
  138. IRQ_Set_Scroll
    , Z: K) M6 K* E2 {4 O6 {1 I
  139. LDX IRQ_Process_Index! ^) e1 y1 D6 S% m& T
  140. LDA IRQ_Scanline_Mode,X, v2 p) H0 S& p, D! q( f
  141. CMP #IRQ_SCROLL_MODE_LEFT
    , \5 ?) O  b4 W) F7 H+ B+ f
  142. BEQ IRQ_Set_Scroll_Left, r5 s' Z6 {8 B$ l+ A5 m
  143. CMP #IRQ_SCROLL_MODE_RIGHT  \- R5 m* Y  Q2 |# ?
  144. BEQ IRQ_Set_Scroll_Right
    7 @. c' ?7 ~0 r8 _$ j
  145. IRQ_Set_Scroll_Zero;不滚动% U" Y- B/ f4 d# L. z
  146. LDA #$00
    * s- ^: }! I, V. W1 h4 v. i; L
  147. STA PPU_SCROLL
    & P! q  u- q# i9 p) ^- R
  148. STA PPU_SCROLL
    / p8 O0 {; p* I+ ?! ]+ F
  149. RTS
    ; V; F) d/ }  ?  ]9 B% E
  150. IRQ_Set_Scroll_Left;向左滚动0 z8 K/ }+ p6 U8 }
  151. LDA Scroll_H/ O+ J6 V, x$ x5 N7 H$ m# y
  152. STA PPU_SCROLL$ U+ y# }) P9 D7 \1 V5 _. E
  153. STA PPU_SCROLL, A3 ?! c9 i* m: Z& k, y
  154. RTS
    3 A4 \8 U3 ^/ R- q; l" E% G
  155. IRQ_Set_Scroll_Right;向右滚动
    ! Y* [& w; b3 ~" C: ^/ K
  156. LDA #$002 `: X& j+ K' q
  157. SEC
      R8 J% R7 p0 X# ^+ D
  158. SBC Scroll_H
    . S( T  @" j! Z4 X# ^$ j: t
  159. STA PPU_SCROLL
    5 u# W* m5 ]9 q
  160. STA PPU_SCROLL* n/ }+ z; v. b8 w
  161. RTS
    6 G; f# t/ J5 A. L5 j
  162. 0 a/ _/ S4 u) Q
  163. ;==================================================3 @& R0 o8 _6 J: k
  164. ;;IRQ滚动控制( E, {% x8 k) o" s6 N! Q/ Z% R
  165. IRQ_Set_Ctrl
    - I8 Z0 D2 a, a# f
  166. LDX IRQ_Process_Index
    % D- b3 ?. z4 E, N6 ?- X; V
  167. LDA IRQ_Scanline_Data,X* ?" D8 `8 X! D' b. N2 U
  168. BNE IRQ_Process_Latch& u% s1 Y2 b6 q2 j9 ^' ]
  169. IRQ_Process_Disable;禁用IRQ
    6 n8 n1 I0 z# L
  170. STA MAPPER_REG_IRQ_DISABLE0 u" Q! N5 O$ w1 I
  171. STA IRQ_Process_Index
    # u7 d8 k/ J& J6 u% f% S5 P
  172. RTS
    - T* P" U, ~  T3 g& s
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    6 E) w  X( g: o  b
  174. STA MAPPER_REG_IRQ_LATCH
    0 Z* o2 f9 V. n4 d
  175. INC IRQ_Process_Index: U2 `7 V( w0 y4 I4 i
  176. RTS
    6 k" {/ v* h6 o: l
  177. 0 Q! D! N: i3 @6 E: G
  178. ;==================================================7 x6 f. p. I9 k4 D
  179. ;IRQ处理9 l5 P: o* a  [, n6 G
  180. IRQ_Process_By_Index  j/ q5 P! A+ H7 y# H" D9 s
  181. JSR IRQ_Set_Scroll/ `5 F7 E" c; v( i9 }
  182. JSR IRQ_Set_Ctrl8 s& }$ v3 L! V; m) f/ i
  183. IRQ_Process_End* _# u* H. {) s( g, X5 T( K
  184. RTS
    6 _/ R+ w5 U  i5 T6 c) V

  185. # n# z/ j9 x: P1 E7 u- q/ e
  186. .ENDM
    " p4 d% @' O& g- r0 b

  187. 3 `4 G% H, k/ d( A# a+ Q1 |
复制代码

) b9 I7 O- E( C: K, W# m
) y6 {" ^8 U! C6 i" c, F4 j代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-10 04:05 , Processed in 1.095703 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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