EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
2 d- ?5 d/ {. w, A8 `% x5 s0 |8 P: {- R7 w* n) ]" C) l
本次IRQ研究了如下:% e0 f0 a% c4 Z- H
VRC2&4(Mapper21,23,25)
1 f; B1 ^1 O4 {  w. _$ hVRC3(Mapper73)
; ^7 f. i7 ^/ w. v# q" J+ lVRC6(Mapper24 & Mapper26)* B8 x7 h8 C  O* A9 |% M( u
VRC7(Mapper85)8 W" X+ v9 o+ a& v- H
MMC3(Mapper4)% @# B9 M  o) |* D  T( a; K* @
MMC4(Mapper10)1 V; R8 Y. w4 d! X! E% V" q8 I! f
MMC5(Mapper5)9 E5 I# ?2 C3 o5 T, f- P& N2 z
Mapper18. x5 H3 P1 f+ c8 k+ Q% A, I, n% v
Mapper64  G6 R: y* H) P' N  A
Namco163(Mapper19)  u8 w& O9 e9 R% @0 }! ?- t
Sunsoft FME-7(Mapper69)
8 T6 U* p6 r7 E8 C8 v
0 @9 l" p7 n/ x0 }; X共计11种Mapper的IRQ操作使用例子
* \. j2 r( L% o代码内有详细注释, 希望能帮助到感兴趣的人.
: n/ j! C* M3 u0 s( p3 v  `. b% O8 X# j- `4 q1 m0 _
: c8 q6 x0 v. j* A" Y6 ?
0 y) B' Q, T: T# J6 _! C7 g
Mapper代码主要逻辑(以MMC3为例):
) h4 x* l8 r  }8 l

  1.   s  B/ ?" Z2 z: @+ Z7 q7 i1 ~
  2. ;==================================================
    ) d7 k, p# t4 w' \
  3. ;Mapper号! r. F% Z9 m1 V6 r2 I  Q
  4. MAPPER_NUMBER           = 04
    & Q) ~; b/ ]0 j3 E5 |/ s
  5. ;==================================================
    . L/ X" q2 [+ q' Y8 T  y
  6. ;MMC3 (Mapper 4) 寄存器常量
    2 s+ X+ J8 J' V  s9 g/ U; Q" N- Y! h
  7. MAPPER_REG_BANK_CTRL        =   $8000
    3 L  T% N% b) q; K; h$ f4 L
  8. MAPPER_REG_BANK_DATA        =   $8001
    + Q" e; j' M+ E! T& @+ e6 J, y5 b
  9. MAPPER_REG_MIRRORING        =   $A0005 ^$ O8 Z/ W, y  ?5 O
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001- i9 z% H# _4 g+ h
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    / Z2 a& d' ^( v) u$ H+ E* {/ E
  12. MAPPER_REG_IRQ_RELOAD       =   $C0018 }1 s: `$ j; m7 |9 H& L
  13. MAPPER_REG_IRQ_DISABLE      =   $E0008 i! M: U7 ]4 i, y& R5 w/ U0 x- L$ ?
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    1 d+ h5 y5 A# I/ p; g
  15. ;==================================================1 ^7 S- ]4 u2 ]" x5 c
  16. IRQ_SCANLINE_BEGIN          = 135
    5 B8 H! L( W9 I. d4 h' O
  17. IRQ_SCANLINE_1              = 8' |+ t3 D5 D+ P- M; j3 L8 q% Y
  18. IRQ_SCANLINE_2              = 54
    9 b% h5 M; @# M, P
  19. IRQ_SCANLINE_3              = 84 M7 z; P9 J" E+ E1 `( p, U$ e
  20. ;==================================================9 N4 Y/ j; q3 \% ]2 K  X
  21. ( `0 V: V. W& |8 F7 P' `
  22. ;====================================================================================================& h. i8 T3 ]: w( T8 x
  23. ;宏常量
    - F6 X0 Z# Y7 ~# E
  24. ;====================================================================================================' J( y2 a4 K  A: n4 W' ~, P

  25. : a. r2 m' V1 l: ^5 |" A4 r6 I5 ^+ s1 M
  26. ;====================================================================================================% Z$ ~+ t) H* @; O
  27. MACRO_MAPPER_INIT .MACRO' @" ?8 o5 l" {6 O( r3 `
  28. ;禁用IRQ
    - p2 X5 y+ F$ ]
  29. STA MAPPER_REG_IRQ_DISABLE
    . m# a+ d0 i. U- W) w. V
  30. $ S3 Y) h9 K. s$ f% b6 Y
  31. ;水平镜像6 ^" N8 y- \$ [, W9 d2 G5 ]
  32. LDA #$01
    : D$ I$ e) M) c" V+ Y
  33. STA MAPPER_REG_MIRRORING! I1 }( |8 [; T
  34. ) U' a6 _7 }0 H. I0 z& z% U  q
  35. ;初始化图形bank" {0 z8 e% @: l
  36. LDX #$05
    8 {) g0 l* l- F2 ^2 H5 b& p9 b
  37. .Init_Chr_Bank
    : j7 H6 {/ f: }5 Z8 q$ j
  38. STX MAPPER_REG_BANK_CTRL
    - E( @! l/ I' |- J
  39. LDA .ChrBankData,X' n5 u* U9 P  A7 j0 h, L6 s
  40. STA MAPPER_REG_BANK_DATA
    ; n/ D" f* b& z1 p6 L* x
  41. DEX
    6 M: \3 L8 M; K
  42. BPL .Init_Chr_Bank
    ) q8 t" O  ]: o2 z! @
  43. JMP .Init_Chr_Bank_End. O# s$ Q" r) Q
  44. .ChrBankData2 c1 B3 p& b$ a; F' c
  45. .DB $00,$02,$04,$05,$06,$07
    - F! S0 z. u+ o+ [# t% d
  46. .Init_Chr_Bank_End
      e+ C$ R1 n: t

  47. ! Q& S1 \8 F9 W5 ~# ]
  48. ;启用SRAM
    , i' L; U5 a6 G
  49. LDA #$80
    4 d; K/ b% w; b
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    1 Y- H0 v1 W; w# \
  51. .ENDM
    ; r- A4 Z7 M- n4 h2 |" }. G- {
  52. ; x. `- x$ ~( j, y8 b
  53. ;====================================================================================================
    ( s8 m% o- ]! n$ A& Q$ C$ t
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO% m# Z) C8 s9 {* @
  55. .ENDM! [! U5 ~- N, b0 N
  56. 9 ^+ C' E: a" v; i
  57. ;====================================================================================================1 `& [+ Z1 g5 w! f+ l. X! s0 T0 t
  58. MACRO_SRAM_ENABLE .MACRO
    1 {- }7 x0 x3 Y% ?, h4 m
  59. LDA #$80
    + |9 ]$ P' u6 W! z( G6 f
  60. STA MAPPER_REG_PRG_RAM_PROTECT3 \; `" R( x" r
  61. .ENDM; b0 r* U* u- T" P4 c8 y$ K) o+ G
  62. # A( `% P: D, f
  63. ;====================================================================================================( a7 ]# |- d2 Y. J" i2 U/ Q3 n
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    % C9 E3 g: g2 _1 C
  65. PHA
    - S+ j/ U! B1 ^, N( i
  66. LDA #$06
    ' O7 Z1 g8 b/ E8 J# ]% ^+ |* ?  Y" p+ }3 D
  67. STA MAPPER_REG_BANK_CTRL+ Z* d/ X; |- \' E- c6 r8 D" h
  68. PLA
    1 t; X* i5 @; h5 ~) U/ }% \
  69. STA MAPPER_REG_BANK_DATA% D/ `, Q" B1 d9 A& n1 f5 o
  70. .ENDM
    , N  y. y( Y; t, x8 ]( y

  71. 6 J, l8 n! w7 }- P7 F
  72. MACRO_SWITCH_BANK_A000_A .MACRO/ Q# h8 |, C! U  X
  73. PHA
    ) W. i: E$ s$ K( I( ?4 t
  74. LDA #$07+ }, V# H5 H1 ]/ K( G8 ^8 G
  75. STA MAPPER_REG_BANK_CTRL
    " p/ o$ _: W8 T8 O
  76. PLA
    # c2 o' @$ h6 E$ F7 |/ `
  77. STA MAPPER_REG_BANK_DATA
    1 s2 W  ]4 [% A" {# W# ]6 \' `
  78. .ENDM0 q3 D- ?. E9 Z! l
  79. $ |, P. E8 \) [7 S) I
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    & S  x% e! X5 d" a) n4 T
  81. .ENDM3 g. z" O0 E8 G6 I
  82. . W3 }" s) J, k4 A+ Q
  83. MACRO_SWITCH_BANK_E000_A .MACRO4 f5 E; A' q9 j) M. p
  84. .ENDM" N6 c# F- s% e) ]( g
  85. 9 p- b3 ?; N, w" J
  86. ;====================================================================================================3 L, Y- e! i5 |6 L1 ]! R
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO; k' d3 Z4 J9 o8 }
  88. LDA #IRQ_SCANLINE_BEGIN + 1" Z' a3 c) D* {5 o& G
  89. STA MAPPER_REG_IRQ_LATCH$ u- C; F1 h/ j8 Z1 I7 @4 b
  90. STA MAPPER_REG_IRQ_RELOAD
    2 o3 q# w/ }" B! v% u# D
  91. STA MAPPER_REG_IRQ_ENABLE! r& e$ g" Z8 \# u7 {  o5 T6 n
  92. CLI
    ( j( ], G: ^1 U+ k! U  b
  93. .ENDM
    - K" C. |+ f5 p) G& U( c
  94. 3 t' z! Q4 z2 a( @( O
  95. ;====================================================================================================9 Y' s  A* U8 }0 p' M
  96. MACRO_ENABLE_IRQ  .MACRO
    ' p6 X2 {  [3 L5 z
  97. STA MAPPER_REG_IRQ_ENABLE/ d# E0 _! A. @2 t1 |4 \3 K
  98. .ENDM
    / Z1 R4 P8 }0 G: p0 j/ J

  99. + J8 o& E$ {( H/ k, ?; G
  100. ;====================================================================================================* N( |. E% D" _3 m: q) o/ M) t5 X
  101. MACRO_DISABLE_IRQ  .MACRO
    " `) Q$ k0 ?& `/ F6 b7 }4 ~$ j# e) h
  102. LDA #$00
    $ M! p; c- E) o6 X% L6 ~
  103. STA MAPPER_REG_IRQ_CTRL! i$ h. d8 c3 s" G6 O, Z; |
  104. STA MAPPER_REG_IRQ_ACK
    1 q9 U0 W/ t6 `8 u7 B
  105. .ENDM
    8 l. |+ I' C3 b1 U

  106. , v3 ~& D) F8 q# ]7 ]; ]& y
  107. ;====================================================================================================
    7 @! C3 i! U8 \: e1 Q: }7 F+ x
  108. MACRO_ACK_IRQ .MACRO
    ) f3 E5 b* P7 B
  109. STA MAPPER_REG_IRQ_DISABLE
    1 {$ j! L4 R. n! m; Z  ^0 W' r  I& N
  110. STA MAPPER_REG_IRQ_ENABLE
    ( W* S% m/ h; ^
  111. .ENDM4 a# [% @. @4 S% |( b5 {9 \: C
  112. 7 O& @. ?, @: a6 o9 \- F" y2 u
  113. ;====================================================================================================
    . i& e. A$ \/ @' r
  114. MACRO_IRQ_OPERATE   .MACRO) F2 Q# ~- K6 v4 q% a* l. B3 H% ~% v

  115. + n8 f$ s0 x- b. ]/ R$ S! j1 b
  116. ;==================================================% X1 L1 C! c+ Z" e
  117. ;IRQ滚动模式常量
    ) N0 a7 F0 i# k
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动2 ~' O" c- x9 R+ m6 L9 G' ]0 P4 Y
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动" H+ }/ p8 U8 c0 u
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动, T) \; E2 X1 ?! f: c
  121. 5 c: y8 _' \" I  t9 L
  122. ;IRQ扫描线数据
    ) F( B1 A: o. X) B  }# v' {
  123. IRQ_Scanline_Data
    # W: I5 l  H- C# F: z; e* h
  124. .DB IRQ_SCANLINE_1
    . x- G8 W5 k) H* V4 r
  125. .DB IRQ_SCANLINE_2- G: C8 _, ]! ^* n2 A: s
  126. .DB IRQ_SCANLINE_3
    8 n+ f0 d- L* k$ Y
  127. .DW 00 ;关闭IRQ2 f3 m$ C, a# k" A  G4 u, v

  128. + A; g/ c, t. s" v# Y5 \, N
  129. ;IRQ滚动控制模式
    ! L  d8 D4 Y8 B0 t
  130. IRQ_Scanline_Mode2 u  i5 |4 P  Z5 m
  131. .DB IRQ_SCROLL_MODE_RIGHT
    0 m8 Z$ H6 m2 n+ w9 p- Z4 l$ i
  132. .DB IRQ_SCROLL_MODE_LEFT( u5 H2 ?( ~; D; G
  133. .DB IRQ_SCROLL_MODE_RIGHT
    7 z9 n) N+ u2 u. p7 O) }5 K
  134. .DB IRQ_SCROLL_MODE_LEFT
    * i" Z; e1 M3 I/ k8 m  Y. s
  135.   k( H8 h3 A% _) R" Q, u9 W6 M+ z6 b
  136. ;==================================================
    # e2 C4 e* V; f$ L
  137. ;;IRQ滚动控制% j) ~# f/ R/ z+ f) W; K* |
  138. IRQ_Set_Scroll
    8 }/ u- C$ ?% e( U2 ^
  139. LDX IRQ_Process_Index9 w- [4 T; f8 ~& v+ f: L
  140. LDA IRQ_Scanline_Mode,X
    ) o, i6 e! \  I
  141. CMP #IRQ_SCROLL_MODE_LEFT2 f9 v& o* X) `& ~
  142. BEQ IRQ_Set_Scroll_Left( q" `+ l4 X! ^0 D$ v  m
  143. CMP #IRQ_SCROLL_MODE_RIGHT3 O- j3 [7 k& T8 W+ W
  144. BEQ IRQ_Set_Scroll_Right/ W; f, e: n, I- B
  145. IRQ_Set_Scroll_Zero;不滚动# m! W" R7 h$ y8 ~$ b- q
  146. LDA #$00/ I& r2 m" K) k. O
  147. STA PPU_SCROLL
    ' x( J! N0 d6 K3 V0 R8 `
  148. STA PPU_SCROLL
      A0 {) }6 \0 {
  149. RTS- H& G: X2 `$ ]% z! K2 h7 \
  150. IRQ_Set_Scroll_Left;向左滚动/ n# L. b' f9 j. b2 l8 e3 R
  151. LDA Scroll_H
    8 `9 C9 a( Q7 E2 A( @: L$ z
  152. STA PPU_SCROLL5 |/ K$ }! E+ `# V
  153. STA PPU_SCROLL
    3 d- L9 B. b" ?% h' [
  154. RTS
      z8 s* K( m! U5 _2 i/ ]) l$ n4 N; h
  155. IRQ_Set_Scroll_Right;向右滚动
    * m9 ]3 |) u+ {8 o
  156. LDA #$00
    ! [' \( P) T. q( L0 `
  157. SEC
    6 Q' I* a' X5 {
  158. SBC Scroll_H
    * s) W' S3 S# a+ s
  159. STA PPU_SCROLL- C5 J* T% t0 K0 f  S3 ]: J
  160. STA PPU_SCROLL: B9 p; V' j# K$ I  a, @8 z1 t
  161. RTS
    : \* Z- ~, Z( m, `
  162. ; J- b$ o/ q( m5 k- `- B
  163. ;==================================================
    5 W" y5 o* l' K- b7 ^
  164. ;;IRQ滚动控制
    9 ]0 Z7 S6 |0 L  C% V5 r. B1 B
  165. IRQ_Set_Ctrl
    8 M1 L9 d% x! s  A! d/ X
  166. LDX IRQ_Process_Index
    / |% A- l' U/ e7 f
  167. LDA IRQ_Scanline_Data,X0 M# Q. p- c  Q% h* o, z
  168. BNE IRQ_Process_Latch5 N! Z* E7 ~8 M- j. T9 b. ~2 c
  169. IRQ_Process_Disable;禁用IRQ9 X$ p4 D) e" M$ x
  170. STA MAPPER_REG_IRQ_DISABLE
    8 [4 _, v) r7 ]3 e4 |% H
  171. STA IRQ_Process_Index
    ) _/ M; a8 l$ \, `3 [' o( K. N# |
  172. RTS
    " f. T0 M, I2 Y; j
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线* ]' a; e8 @, {2 _% t0 y1 k
  174. STA MAPPER_REG_IRQ_LATCH
    ; i- z  N$ R7 L7 Z. ^9 J
  175. INC IRQ_Process_Index2 ]  d7 Q9 k- W; h. ^7 X: D
  176. RTS
    8 J+ N0 m1 s' U/ W
  177. ( _' t5 ?0 \! a8 U- B: w' X8 j
  178. ;==================================================6 ^. L1 W& K! r$ q8 c$ t6 m0 i
  179. ;IRQ处理
    . d5 I; g9 a& P4 |- w/ p
  180. IRQ_Process_By_Index
    ! \' A9 K9 X+ l
  181. JSR IRQ_Set_Scroll  w0 k) y. x6 N1 q
  182. JSR IRQ_Set_Ctrl3 G) l5 @! u- }6 U1 i3 Q' N8 `6 g
  183. IRQ_Process_End8 ^3 X) v1 K* d% b
  184. RTS7 |: S  N8 O% A. T" A3 X  \

  185. , R5 U" V3 `% _( c* \1 g
  186. .ENDM! d& S. Y4 N( z
  187. 7 D1 V9 }  s- T7 }
复制代码

" ~/ X% J5 N/ |2 `( b( S* {7 G* k
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-11 03:00 , Processed in 1.109375 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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