EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
! v% ^5 n5 D/ M. \- L
6 P' \( z: |  d& o+ P- j# p; K本次IRQ研究了如下:
. w  ?; y8 p  R5 ?. i% S. s6 F3 OVRC2&4(Mapper21,23,25)
' |1 q, L7 G- q1 N" JVRC3(Mapper73)$ o# v9 |- w- k& V# k% J8 Z
VRC6(Mapper24 & Mapper26)
% s' I4 a) R' H. ]1 h0 jVRC7(Mapper85)0 l  `5 E. y" W8 x3 z
MMC3(Mapper4)
" F2 l4 Q. u8 K$ jMMC4(Mapper10)
' D  S) y) o, {  b  \+ kMMC5(Mapper5)
0 x2 w* l, Z1 }Mapper18- t$ p5 [( J! J/ ^
Mapper64
* Q# s1 S9 Z. w, cNamco163(Mapper19)
/ X% G& @' A8 n; [9 DSunsoft FME-7(Mapper69)3 P% b6 f7 i0 m3 |
3 _% h* P* W, P, {; c
共计11种Mapper的IRQ操作使用例子" M2 `0 f9 I% c& C2 e
代码内有详细注释, 希望能帮助到感兴趣的人.& c. y& @/ L% L

7 T4 c$ J& E3 s/ r) x+ N
7 H6 U+ A0 H6 q  [; E9 d' g, E- o' y9 w* N) a1 |( ?) r$ k
Mapper代码主要逻辑(以MMC3为例):
$ w- A# ^# ~. w4 A- Q: Z% u# h  P

  1. 2 g; y- @4 C' u, ?
  2. ;==================================================
    2 ]2 C1 M# o5 F: x3 ~2 i
  3. ;Mapper号* W& @3 P/ t: L, }; y7 }. z
  4. MAPPER_NUMBER           = 04
    & b' {5 P. F" e' C8 j
  5. ;==================================================
    # j, B$ `1 y- x) w7 ^0 a  {% S
  6. ;MMC3 (Mapper 4) 寄存器常量. W- R9 |5 U  g' n" V
  7. MAPPER_REG_BANK_CTRL        =   $8000
    . {9 v+ m* M9 }3 Q, `
  8. MAPPER_REG_BANK_DATA        =   $8001. R* W( ^6 A9 W# u
  9. MAPPER_REG_MIRRORING        =   $A000; `0 X1 U+ }/ k
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001! t3 |  B5 ?% s" l
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    ; @* f8 h- n: A; q
  12. MAPPER_REG_IRQ_RELOAD       =   $C0013 i% m' T/ _% {3 G, }9 V
  13. MAPPER_REG_IRQ_DISABLE      =   $E000- T8 T8 i8 p) e3 R) p
  14. MAPPER_REG_IRQ_ENABLE       =   $E001, f8 k. _2 H5 U% s2 k3 {( p$ k
  15. ;==================================================
    4 P" O+ Z. A* I+ ~
  16. IRQ_SCANLINE_BEGIN          = 135% S0 b. ^) b3 S9 K& @* @+ s
  17. IRQ_SCANLINE_1              = 89 P1 N- O& _+ b1 S) \4 |3 e3 |; d- Z
  18. IRQ_SCANLINE_2              = 54: j  ^6 u  D; a
  19. IRQ_SCANLINE_3              = 8
    1 }4 f0 L# r- Q5 L* F
  20. ;==================================================
    5 }* W# N$ S* t. ?
  21. 7 j+ q. I3 B( y& I' ?
  22. ;====================================================================================================" p# I- y1 w+ p( L
  23. ;宏常量, w- F; [- N3 Z
  24. ;====================================================================================================
    $ z2 S$ K: F7 ?$ ?" [' z

  25. 5 O) l# S1 L; u  E* s3 i6 P
  26. ;====================================================================================================" [) {% ?( Y$ P5 U2 K
  27. MACRO_MAPPER_INIT .MACRO3 M6 ~0 R! x$ c# g/ Y& I
  28. ;禁用IRQ" S5 E; J! G& T; Q
  29. STA MAPPER_REG_IRQ_DISABLE& R) d) l0 g' p1 c$ q. Z

  30. " s3 H( \9 Z0 V0 y/ S  @2 p
  31. ;水平镜像
    7 ?! M2 P$ w; ~2 N% ]0 o
  32. LDA #$01
    0 a9 S8 U$ v0 R) [% l( n$ Y7 b
  33. STA MAPPER_REG_MIRRORING% d+ e1 [# e6 ~& L

  34. 6 C& q7 \& P# w/ F& }
  35. ;初始化图形bank
    & o$ V1 t1 v: k6 V' D* \# n
  36. LDX #$05" b7 d7 K% q5 Q9 m
  37. .Init_Chr_Bank
    $ q/ }8 p) U: O) l) s& I  R' ]
  38. STX MAPPER_REG_BANK_CTRL; B2 `# B9 U/ D. d' Y) l- q
  39. LDA .ChrBankData,X
    & A8 V4 P) x* Z/ m' v1 j( f
  40. STA MAPPER_REG_BANK_DATA. z, _  K# q1 ^2 V" O
  41. DEX# W4 o4 q0 h3 f& v* v( u* `
  42. BPL .Init_Chr_Bank1 Z4 Q" ]6 v! L& L
  43. JMP .Init_Chr_Bank_End& {4 Y# s& [2 c9 H4 ?! O: m
  44. .ChrBankData- K2 p; Q& I; B5 A6 y- @* s
  45. .DB $00,$02,$04,$05,$06,$07
    - E" A! X! {- r& \3 t! i8 H$ k
  46. .Init_Chr_Bank_End
    * d' K1 D4 C2 R( P' _  O

  47. - b! m  a8 Y* h- ~- m7 X, |
  48. ;启用SRAM
    9 {; l7 v9 q/ [! [; o/ N2 o- W& ^
  49. LDA #$80( L2 Y3 n# s* @0 n% f9 y
  50. STA MAPPER_REG_PRG_RAM_PROTECT' X2 u0 X/ i8 \: p( h2 u; Y# [
  51. .ENDM
    ' }- T2 w4 G2 g8 Q# Z1 B4 {
  52. 2 n2 `* W1 B5 Y5 r8 }+ z2 A
  53. ;====================================================================================================
    6 v$ z7 K3 R* x7 g' N# b8 ^. b. e
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO: @" x# Y6 s2 Z: S2 a
  55. .ENDM2 w1 X9 K9 X$ i1 ]/ c

  56. , r# O$ s3 d' c
  57. ;====================================================================================================3 t( X& y5 A0 s- t+ P
  58. MACRO_SRAM_ENABLE .MACRO! A2 X% i1 b$ i! i) r
  59. LDA #$80
      |9 Z) |  C$ T) `, ^
  60. STA MAPPER_REG_PRG_RAM_PROTECT$ T- |- [5 i0 a
  61. .ENDM3 Q# L' I2 K3 ~2 {& ]- d

  62. 8 _5 e) G& m" ?$ v5 O8 G; E
  63. ;====================================================================================================, W4 I4 q8 R  d; Q( L6 Y
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ; r; j. _6 b. P5 N6 M; H" u8 n
  65. PHA5 b, P" v( w* R8 `
  66. LDA #$06
    6 x  F" }2 }1 _( i  N
  67. STA MAPPER_REG_BANK_CTRL% P& l/ b- u; ?, U$ q- j) ^
  68. PLA+ i# M; ~8 T* g; F' c$ P
  69. STA MAPPER_REG_BANK_DATA* b8 f; a- b1 H4 ~: D8 Y% @4 S
  70. .ENDM/ P4 F. c9 H1 R' [( [; k

  71. 4 r6 m$ K# ?0 {4 Y' Y6 W' E
  72. MACRO_SWITCH_BANK_A000_A .MACRO# {0 ]& o' b) A1 f5 m2 Q
  73. PHA
    # p! f, ]. L1 H+ ?' h" x  Q
  74. LDA #$073 j; C: D' s  o$ E2 o8 H0 z
  75. STA MAPPER_REG_BANK_CTRL
    " j8 P! M: q% f1 {$ G8 i
  76. PLA
    & k2 s( c# x# z8 t+ U
  77. STA MAPPER_REG_BANK_DATA
    & @; x+ F; s0 k% l# ^2 h% _
  78. .ENDM
    9 F. T; F8 y6 |8 P  T

  79. - ]7 e( g! J, r% K
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    9 |9 P9 G( t) ?* g! ^" ~
  81. .ENDM3 _' {" E2 N* ?4 j) G  d! F/ `

  82. 5 A9 F$ k# d2 h2 K/ _
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    ' t* Q9 o# J7 {6 [( l
  84. .ENDM- g( ~: ?4 h4 x1 [1 Z% U

  85. ) O& `. ~. B, C- H2 n7 M
  86. ;====================================================================================================
    # l. e' P* M! G; t* {
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    9 |+ ]3 I/ {5 F- }
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    # r! j  c9 j- k& n1 i
  89. STA MAPPER_REG_IRQ_LATCH3 D( k. c# w! G, l- y
  90. STA MAPPER_REG_IRQ_RELOAD# A' O3 @2 n0 O
  91. STA MAPPER_REG_IRQ_ENABLE
    ' c$ l  N6 E' ~; \7 s. ?' y
  92. CLI
    " o4 h9 c' C3 O4 M' m6 N
  93. .ENDM
    5 \5 _1 v: ^6 I. B, z, S* o7 P
  94. ( b7 Y: _! p3 a) A7 T
  95. ;====================================================================================================
    . o8 F0 @% z. P, Y0 G- E
  96. MACRO_ENABLE_IRQ  .MACRO6 c# H2 B& o& r0 _0 \
  97. STA MAPPER_REG_IRQ_ENABLE
    # e6 B& i) j2 i/ s* x$ ]
  98. .ENDM) [! A2 c8 h5 T. L7 @

  99. 0 _: l) a2 V6 G
  100. ;====================================================================================================
    . k1 A8 a0 N/ g8 `5 Q9 x+ P2 f# x5 c. L
  101. MACRO_DISABLE_IRQ  .MACRO+ p9 _: O. F6 r! ]/ Y- v4 Z( t
  102. LDA #$002 {+ c0 x& |$ x' ]
  103. STA MAPPER_REG_IRQ_CTRL( j1 B6 u; U% F$ ~4 e
  104. STA MAPPER_REG_IRQ_ACK
    * A: v8 f! v2 t/ @7 E5 E
  105. .ENDM1 n, ?- v/ d- m5 ~

  106. ! {+ y, x& h/ S" [) t
  107. ;====================================================================================================0 Q! d% O$ _' J. t
  108. MACRO_ACK_IRQ .MACRO$ M6 E1 R. P+ f+ |4 M% g; }
  109. STA MAPPER_REG_IRQ_DISABLE
    * _0 g$ @3 j% q" k1 L3 w
  110. STA MAPPER_REG_IRQ_ENABLE% t7 q$ M7 c& W
  111. .ENDM$ {/ {$ Y" p5 x1 d+ i
  112. ; d* V0 i0 S6 T9 G
  113. ;====================================================================================================2 E7 H7 w  h- K; _7 t
  114. MACRO_IRQ_OPERATE   .MACRO. S: l5 D) G) t. B2 H2 m) s# m0 F
  115. / x$ X0 S6 q  Q' L- \
  116. ;==================================================
    1 f7 P6 Y& I3 U. ]
  117. ;IRQ滚动模式常量
    ; @3 t5 x& t; B* N
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动. O5 }. @' l/ s3 e) k
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
      a, y4 P; O- D
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    1 h+ u/ b$ g  J' K
  121. & E6 O3 {  h) ~' I- Q8 }
  122. ;IRQ扫描线数据
    , c! Y# v" A# z1 N% f
  123. IRQ_Scanline_Data
    8 r8 O4 E7 I7 L+ G
  124. .DB IRQ_SCANLINE_1/ |: _# Q7 ^4 C5 h' T
  125. .DB IRQ_SCANLINE_2
    5 m8 s% ^8 I0 C7 @$ h9 @6 S
  126. .DB IRQ_SCANLINE_30 `" p% m/ {- T  |. U
  127. .DW 00 ;关闭IRQ( |: u$ j( Y1 Z" Z! q: \, H

  128. ) M# p+ r1 ]$ S4 l4 H6 E
  129. ;IRQ滚动控制模式
    6 F8 ~" g! i4 z- D
  130. IRQ_Scanline_Mode' Q2 Q) ?5 P0 T) ]
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ! o. u- |* `' ~8 R- z' ?$ s: D
  132. .DB IRQ_SCROLL_MODE_LEFT
    7 {, a9 R+ \4 f
  133. .DB IRQ_SCROLL_MODE_RIGHT  j6 @3 S3 V9 F6 o& G/ F
  134. .DB IRQ_SCROLL_MODE_LEFT
    8 |& K" [* \  p) s
  135.   x' [# L4 x; K/ R
  136. ;==================================================
    + d9 F% X$ V; Z+ ~1 _0 K: J
  137. ;;IRQ滚动控制9 x' N6 ~0 Q2 p1 Z) w6 T+ f
  138. IRQ_Set_Scroll
    & S: R7 V0 R8 z: P  K* j
  139. LDX IRQ_Process_Index, o& V$ X/ t, Y. l# V& Y# [
  140. LDA IRQ_Scanline_Mode,X- s2 ~/ n" M7 U, S$ u
  141. CMP #IRQ_SCROLL_MODE_LEFT
    / C- f0 o: ?7 q2 L
  142. BEQ IRQ_Set_Scroll_Left0 E3 |6 d: Q/ t8 f
  143. CMP #IRQ_SCROLL_MODE_RIGHT4 Z4 R  g9 C( ]) n8 {" c
  144. BEQ IRQ_Set_Scroll_Right. K. p% E5 r0 H0 w1 d/ }
  145. IRQ_Set_Scroll_Zero;不滚动
    0 U  j) ]5 K3 K7 k; `' B  i
  146. LDA #$00/ _- n; s6 v9 z; V0 S1 |
  147. STA PPU_SCROLL0 {5 k( T& A! \8 t4 `( D: l
  148. STA PPU_SCROLL. o1 R/ @; _  e$ R- u( A( `$ F/ @. A
  149. RTS; j0 Z! [& o) X& Q  l! ~! [
  150. IRQ_Set_Scroll_Left;向左滚动
    $ G, E) |: I9 N7 W9 x  G
  151. LDA Scroll_H! X+ \+ U9 V' q6 |+ h+ p- _
  152. STA PPU_SCROLL
    ' T' ]% U6 k, X1 \$ q
  153. STA PPU_SCROLL
    4 T/ T# L9 c* M9 K- e/ f
  154. RTS" A' _) _2 i* `: i7 C
  155. IRQ_Set_Scroll_Right;向右滚动6 E  r! I  k5 k; {5 q. I
  156. LDA #$00
    - v2 |  U( ]' e* u; X( v
  157. SEC9 z7 ~: S3 [0 \" N2 g9 f
  158. SBC Scroll_H
    6 ^7 t) M9 f5 g7 O) R% t
  159. STA PPU_SCROLL6 A+ e/ W, d- i% h
  160. STA PPU_SCROLL
    # }; p% t. _: d- w" r; |; w
  161. RTS+ R6 m! L' O/ B$ T5 y8 p& N$ C

  162. ) _6 z# C( D$ z! @
  163. ;==================================================
    * q6 P' ~5 t3 l2 N5 p+ o
  164. ;;IRQ滚动控制
    - V, u' V$ w& Z% k, y
  165. IRQ_Set_Ctrl6 h' r3 v" `! o; u  W
  166. LDX IRQ_Process_Index# E) S; C* Y1 ^1 V7 X
  167. LDA IRQ_Scanline_Data,X  R, s' Z3 {& U5 n+ s# ~
  168. BNE IRQ_Process_Latch
    ; U7 w3 `  p$ }. A! a
  169. IRQ_Process_Disable;禁用IRQ
    6 }+ B; g# G1 U& p5 P
  170. STA MAPPER_REG_IRQ_DISABLE5 s; j  C1 g- @% y
  171. STA IRQ_Process_Index
    ( l5 ]! {* o( w/ T, V
  172. RTS
    $ n7 `( B8 q  F9 ?" f8 Q
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线5 l" J: d! {6 x2 X0 j+ {5 Q
  174. STA MAPPER_REG_IRQ_LATCH5 n9 _* k- [6 c2 S9 O6 K6 m( J
  175. INC IRQ_Process_Index
    % K' N+ F1 Y3 J7 P  t$ @4 w
  176. RTS0 n; H6 ~9 l, \% N" Z" i
  177. 0 Z; n( ~8 `) x( p: d7 b
  178. ;==================================================3 A- L: h8 ^4 U, q1 v4 x
  179. ;IRQ处理
    6 \3 R$ H! w+ ]2 I: A! N
  180. IRQ_Process_By_Index
    ; R3 e: q5 Z4 |* \! }. O. y. H
  181. JSR IRQ_Set_Scroll2 ^0 A. [/ S2 ?0 F0 P5 b
  182. JSR IRQ_Set_Ctrl
    ' F5 w& W2 a1 E  L5 w" i) A
  183. IRQ_Process_End% C! U5 d5 N: K% f$ F: [& h
  184. RTS: A  O; D! z! B& ]1 \
  185. ; k7 R, w5 ?/ X7 D! K6 c) m
  186. .ENDM1 S: w7 i1 H4 I9 L) I+ d' D

  187. % V: w# q- I& X" I! J3 @
复制代码
' q( X8 h" ~" N0 C! W
: o7 U2 d- h9 h1 l4 u# G
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-18 12:17 , Processed in 1.062500 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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