EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
- }/ Z- z1 }9 V- C$ z+ |1 D9 y/ F/ q" R
本次IRQ研究了如下:
3 G& ]- C: Q4 R3 lVRC2&4(Mapper21,23,25). |0 I  z* P0 \$ L8 b
VRC3(Mapper73)  w  ~9 l8 Z: F; \7 Z% @9 m
VRC6(Mapper24 & Mapper26)6 J8 }# j6 p; \) ~( s" d; X
VRC7(Mapper85)- g, ]+ m* H4 n' `# d4 N7 Q+ H; x
MMC3(Mapper4)8 U+ A+ S5 L( ^6 D* \6 g
MMC4(Mapper10)
3 G: _( s6 H: S4 ~MMC5(Mapper5)
$ g. t9 G0 |/ t! s, tMapper18- x' c8 \& K! M7 p
Mapper64
4 d; c  G7 }: ^Namco163(Mapper19)
8 g. [3 f) U) Q; NSunsoft FME-7(Mapper69)
* e8 y0 r& R4 p) q/ |* e1 O& |
$ u4 Q$ r& \$ s( j% Z共计11种Mapper的IRQ操作使用例子
( W& q1 N* P; }; G- Q8 t# \代码内有详细注释, 希望能帮助到感兴趣的人.
+ g8 D: z5 P* c+ r8 x6 X% l; U9 y
: _" G1 c2 M. U" o/ ]' h# P3 I; m1 x5 \7 e  A

! ~; ^/ N- |& Y0 g# qMapper代码主要逻辑(以MMC3为例):/ A* ?+ w. q; {7 g# i

  1. / _% g8 X  d  E& N. P
  2. ;==================================================
    ; h1 q( f0 m; z
  3. ;Mapper号
    $ I0 e7 C9 x3 @7 H; i/ D
  4. MAPPER_NUMBER           = 04
    6 E9 B$ |3 H* t6 U6 j( h- B( ?9 o8 ~
  5. ;==================================================
    6 _/ `$ k9 u, c1 ^
  6. ;MMC3 (Mapper 4) 寄存器常量3 |7 k% C: k. [2 P9 ?% A7 E4 n
  7. MAPPER_REG_BANK_CTRL        =   $8000
    9 g( @1 g- d1 ?5 u8 }; o1 T1 q
  8. MAPPER_REG_BANK_DATA        =   $8001# k3 c) q3 m/ z6 J' f
  9. MAPPER_REG_MIRRORING        =   $A0008 B( o7 V% k7 F3 b4 B
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001( h' b8 H" V% `' J: C: {
  11. MAPPER_REG_IRQ_LATCH        =   $C000: d6 f* E* Y: m2 O: _
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    $ V( a7 @( k. n7 t
  13. MAPPER_REG_IRQ_DISABLE      =   $E0004 K1 [+ i& B1 Q3 s
  14. MAPPER_REG_IRQ_ENABLE       =   $E001
    ' Z3 [& E  [& t9 ]( Q+ b2 n. B. |0 O$ ]
  15. ;==================================================
    - O0 ^1 I5 _' Q+ v9 T+ b2 S5 O6 B
  16. IRQ_SCANLINE_BEGIN          = 135; ]% I; `- t' @! O" j' g
  17. IRQ_SCANLINE_1              = 8
    6 n" e" F, X+ F8 R/ @
  18. IRQ_SCANLINE_2              = 54
    7 t6 h( e& u9 E6 x/ Q2 d5 ^
  19. IRQ_SCANLINE_3              = 8
    9 J" X5 c. j: }7 b
  20. ;==================================================
    4 m' z4 Z, F4 a3 `6 |

  21. 5 I9 V% Q+ e8 j+ P
  22. ;====================================================================================================9 `4 x& k* c7 i* ~
  23. ;宏常量
    2 b- P9 b% M% L, B' t9 g
  24. ;====================================================================================================
    3 n# }4 |4 j6 T+ X
  25. ( e+ C  R6 J  q" s, m) T
  26. ;====================================================================================================7 |" Y  c' R- D; Y0 ?2 f1 U5 D
  27. MACRO_MAPPER_INIT .MACRO0 `4 E, K# D  N1 ~  t
  28. ;禁用IRQ
    / q" L* p; ~+ R
  29. STA MAPPER_REG_IRQ_DISABLE
    6 I7 c  Z/ M, z5 E
  30. . S. W0 O4 f$ X4 `2 q! I+ r
  31. ;水平镜像1 G$ l) s- p# I6 `/ i' [
  32. LDA #$014 M, ]7 E4 I/ n- ?
  33. STA MAPPER_REG_MIRRORING
    0 f( N3 Q& N/ ~
  34. 9 W, T# {! ?. y9 e* D4 }
  35. ;初始化图形bank
    / c( K, f3 t* Z7 w# }
  36. LDX #$05
    , x# C. p. W' J& t" ?- I
  37. .Init_Chr_Bank
    8 p0 i8 S0 L/ Q2 Y8 H; S
  38. STX MAPPER_REG_BANK_CTRL
    : X: h: d8 H! t9 v
  39. LDA .ChrBankData,X
      d: w; e) m  o( O4 r2 x
  40. STA MAPPER_REG_BANK_DATA
    ! R/ I+ ~9 Z2 s& l
  41. DEX
    1 _6 k0 I+ F: O9 ^! x9 x
  42. BPL .Init_Chr_Bank
    ) s( k, X3 T+ d# h9 D  X% P% p! l- G
  43. JMP .Init_Chr_Bank_End
    # f! p; ?6 p6 M5 b. w# d0 i7 ?
  44. .ChrBankData
    & v3 b5 {: v; w
  45. .DB $00,$02,$04,$05,$06,$073 n1 Q& m9 }7 ~* T
  46. .Init_Chr_Bank_End
    # W  H& D& a( N% B: o5 U
  47. : s3 c- _: Z. [
  48. ;启用SRAM
    0 z* r; s- d# K% v5 {, Q
  49. LDA #$803 f# O$ ~2 c" }' }
  50. STA MAPPER_REG_PRG_RAM_PROTECT' T/ R6 E' k! y' S
  51. .ENDM4 c/ B! q" y  u6 ~9 j

  52. 4 w: Y% z+ U8 V3 d7 A# {, W( U
  53. ;====================================================================================================" x! T( g6 u1 d% b! L; S! ]) k
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO1 ^$ c1 K, x9 a+ z  N- w8 h
  55. .ENDM
    ; s' ?, J) A9 c/ t5 h5 `

  56. " z+ l8 W9 J  {+ `8 \: P* D
  57. ;====================================================================================================9 r: V5 T- ]: q5 k) p; P# J8 M9 b( y
  58. MACRO_SRAM_ENABLE .MACRO  e( f, f" R5 T1 M8 U
  59. LDA #$80
    6 g8 a+ \6 o* f/ S1 U3 j  W) s
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    ( {0 @6 S6 _/ G1 D& h  O0 D
  61. .ENDM! S! R0 W5 a5 a+ f; S! A6 x

  62. / ~  M( L  J/ \/ v! X6 y) |6 H$ _
  63. ;====================================================================================================
    , P& H' b6 v) {7 P0 m2 G4 X+ t
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    / l7 C9 ~5 b+ q3 t+ m5 }, n
  65. PHA
    , X: E" L2 p4 P+ E5 a' D2 n0 V
  66. LDA #$06
    3 t+ a+ c3 C9 D% ]. w
  67. STA MAPPER_REG_BANK_CTRL% r; k& S- w7 ]
  68. PLA
    # h9 k7 R, b$ P* z* Z
  69. STA MAPPER_REG_BANK_DATA
    ' b' H1 e/ T, j/ W
  70. .ENDM/ L8 L! a/ v" I4 f* h+ v) B, n

  71. - d1 G( D/ g+ _
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    / B& [( l! d) N$ L$ t5 E
  73. PHA. _; p" A- a- w( S) F4 W& `
  74. LDA #$07
    6 x. f# ~7 q0 p! e# T5 I
  75. STA MAPPER_REG_BANK_CTRL' V* Z6 |9 m: P0 x, l/ _' W
  76. PLA
    : `. u5 u7 _2 S/ B
  77. STA MAPPER_REG_BANK_DATA4 }. Y, b. l' ?( \' h, _3 v
  78. .ENDM* n  m' }% m  |( j* [0 h

  79. * n* y) n( X; x5 G4 m! t# m
  80. MACRO_SWITCH_BANK_C000_A .MACRO5 [' x! z' j0 K/ j- o: `# p( Y
  81. .ENDM
    7 Q/ T  ]# N6 Q7 V$ V
  82. $ H7 Z- r/ X8 l- V
  83. MACRO_SWITCH_BANK_E000_A .MACRO3 j  g2 f3 v# a0 C& V1 C1 v7 M2 M
  84. .ENDM8 G7 e( r3 N, ?4 S2 @& D/ D) n
  85. & E# l5 G( ]* E
  86. ;====================================================================================================! @- \! Z6 p& U
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO* G1 O0 q, G1 G/ |- c
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    * @) Z# m# @2 p7 v4 V
  89. STA MAPPER_REG_IRQ_LATCH2 d/ R4 _+ |. h" H8 Z
  90. STA MAPPER_REG_IRQ_RELOAD8 h; t5 D# X* t/ {% O3 U' K
  91. STA MAPPER_REG_IRQ_ENABLE' u% W- T. k# N" `. t
  92. CLI
    % U/ Z( n* j- U; g
  93. .ENDM
    * K0 {! ]5 f' E  B1 j" L
  94. ( {6 m- j- n  ^1 O1 D
  95. ;====================================================================================================1 b( \* s) w1 m' J
  96. MACRO_ENABLE_IRQ  .MACRO
    , \; r# L2 Q3 Y8 u. }
  97. STA MAPPER_REG_IRQ_ENABLE$ `' U! |- v! G
  98. .ENDM
    + `8 N$ b% C- x5 ]; n
  99. 3 Q9 m5 H, G; D! C. p1 b
  100. ;====================================================================================================
    6 l1 q# ]* [- M. z4 ~
  101. MACRO_DISABLE_IRQ  .MACRO
    + U* ?% w; u$ g' u- O$ q* o/ e) `
  102. LDA #$00% i* M+ `  I  U3 \
  103. STA MAPPER_REG_IRQ_CTRL. A2 Q, r. Z4 N5 J/ ~
  104. STA MAPPER_REG_IRQ_ACK
    0 c' z0 v) l& {7 O% p+ D6 F
  105. .ENDM2 c7 u2 R- B/ A( d! Z( j
  106. # C, |' H0 [  e
  107. ;====================================================================================================
    & P2 H$ S- O1 p; l' f+ W
  108. MACRO_ACK_IRQ .MACRO
    5 E& H% ~2 h: G& y
  109. STA MAPPER_REG_IRQ_DISABLE
    & ?2 e0 m) S5 G4 K, c( t+ N. X7 p( j
  110. STA MAPPER_REG_IRQ_ENABLE4 x! C: }' c  l. _" ^; x6 i
  111. .ENDM
    ( M# M* l+ L: I) `% ^

  112. ) A( L4 r$ g, P
  113. ;====================================================================================================
    5 t- `" c2 D: J2 c5 {0 i
  114. MACRO_IRQ_OPERATE   .MACRO
    ( `) Y/ A; J% n  D3 d- B& t& ?

  115. + s; a& H( L3 f1 d
  116. ;==================================================* x$ K/ d; u2 ]/ g% a
  117. ;IRQ滚动模式常量
    3 i5 Z, d+ O9 A: u1 c2 X9 x
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动/ j; g( ?9 z* ]) ^% x
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动, f9 F. b# H3 t) `
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    9 D9 C8 w! M5 `/ _* e$ H7 r

  121. 4 F% A/ S9 M1 f5 j3 D
  122. ;IRQ扫描线数据7 A8 f; C, z  w% j  _4 c$ }1 h1 i
  123. IRQ_Scanline_Data
    - _' ]- K0 o) a/ x, a
  124. .DB IRQ_SCANLINE_1. F& [( G7 a$ J* K
  125. .DB IRQ_SCANLINE_2
    + M4 W; B% f& M3 c0 @
  126. .DB IRQ_SCANLINE_3
    - W" U  }; a5 `" F
  127. .DW 00 ;关闭IRQ6 b3 h3 _8 E, F
  128. 4 w. s, J" f5 N9 P! a% j8 u7 X
  129. ;IRQ滚动控制模式( h8 O& Y9 I8 g9 W
  130. IRQ_Scanline_Mode
    ) ~, @# u4 V( d$ U1 N5 R
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ; M, `" S/ X2 I6 B# ~8 ]
  132. .DB IRQ_SCROLL_MODE_LEFT, x4 o7 f, s7 [) z
  133. .DB IRQ_SCROLL_MODE_RIGHT& E3 z) _5 G7 _+ O: f
  134. .DB IRQ_SCROLL_MODE_LEFT
    . \- V) x  f( K" [

  135.   }5 A% t/ H$ [0 O0 q3 Y+ Q/ E
  136. ;==================================================
    - E0 K/ O. V; v2 g$ R
  137. ;;IRQ滚动控制: @0 m5 V2 B% R( J, D7 G4 ^
  138. IRQ_Set_Scroll
    , S" P9 q1 O, D" H
  139. LDX IRQ_Process_Index) i* m- b( A$ \' x
  140. LDA IRQ_Scanline_Mode,X
    , U- Q2 O' T5 o3 F1 A
  141. CMP #IRQ_SCROLL_MODE_LEFT
    / T. ~+ ]) Q  y: D/ Z" T$ G6 W
  142. BEQ IRQ_Set_Scroll_Left7 @& Q! D7 M3 a1 E5 S
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ' l: N. l5 r6 \. Y8 d( h$ B, b
  144. BEQ IRQ_Set_Scroll_Right
    % F+ \; C6 t; k: z
  145. IRQ_Set_Scroll_Zero;不滚动/ j# w' a$ n# T9 L7 c$ q
  146. LDA #$00
    ; x5 w- o9 [  ^, C! G
  147. STA PPU_SCROLL
    ) a8 h3 K1 y  ]
  148. STA PPU_SCROLL
    1 \4 t1 x6 W" j- P1 W0 K
  149. RTS
    $ n3 u0 i6 R! d' Y3 B9 x( m) J
  150. IRQ_Set_Scroll_Left;向左滚动* ?% f, R6 }8 X8 s
  151. LDA Scroll_H- s! W5 j" J5 X% y) |
  152. STA PPU_SCROLL
    4 L2 f+ a1 G! v8 m2 V
  153. STA PPU_SCROLL) _0 [+ U% p4 @  q+ O" l' }
  154. RTS! m/ M8 N& M- Q- m5 h5 ^/ t4 B
  155. IRQ_Set_Scroll_Right;向右滚动
    4 K2 I/ B, B( @
  156. LDA #$003 `# K; P4 C& F/ \
  157. SEC: a4 ~0 Z( y/ f
  158. SBC Scroll_H
    / U: Y6 i2 T- e# w$ `! p. s
  159. STA PPU_SCROLL
    % F" L; z% c( G/ d8 `4 Y# t% t
  160. STA PPU_SCROLL9 v) z0 i2 [9 V/ c3 A" }
  161. RTS( Z. ]: p: F6 \

  162. . H" B2 ^! z# C- n) q% T
  163. ;==================================================
    5 f, }$ p" b' d0 @/ K
  164. ;;IRQ滚动控制: m- Z8 {3 z! c7 ^' s
  165. IRQ_Set_Ctrl
    & x: E& ^5 z. U
  166. LDX IRQ_Process_Index; Y+ R3 i/ Z5 }, Z! B/ O$ B
  167. LDA IRQ_Scanline_Data,X
    5 T! Z  Z0 C/ s/ ~: d
  168. BNE IRQ_Process_Latch
    : b! s9 k8 I( E- t1 b1 H- S9 t  v
  169. IRQ_Process_Disable;禁用IRQ
    ) X% y+ m1 Q$ H8 u/ D# V& Y
  170. STA MAPPER_REG_IRQ_DISABLE, m% V( N1 I, y% v  E# S/ `
  171. STA IRQ_Process_Index
    . R3 E6 {. Z1 Z" b- Q4 N( o. ^1 D
  172. RTS
    & |0 Y5 H9 v7 ?. U8 b* T; D
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线2 @9 L0 T& K( N5 ^
  174. STA MAPPER_REG_IRQ_LATCH
    9 r4 z' D. S( F" B3 {# D
  175. INC IRQ_Process_Index3 j+ ^' S' G, r; n
  176. RTS- x1 ^# t: t: X5 Z3 I  P2 ?" r, T

  177. : y: p2 ?5 f" J
  178. ;==================================================$ A% u$ n& b6 ^$ |' ?0 L& o
  179. ;IRQ处理
    * f6 f" U% v# }3 o
  180. IRQ_Process_By_Index
    ; [7 E" p$ J; I3 N
  181. JSR IRQ_Set_Scroll) e1 l5 N$ W2 i
  182. JSR IRQ_Set_Ctrl* Z3 `4 `/ q% X- g( k/ m
  183. IRQ_Process_End  n4 B2 \. m( O* F8 F
  184. RTS
    1 A) ^- }% w/ l5 z  i* ]% N

  185. 8 I% L$ ^& V7 k3 _7 k* z5 U
  186. .ENDM
    - G) V; E2 i% y( w* v& A

  187. , v$ p. ~  j6 a
复制代码
1 a! O0 @& W9 l
  E. Y3 e2 V# |) f2 O- k! R
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-18 19:19 , Processed in 1.080078 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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