EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
0 a* K: M( u# n  R7 y! z( J
) [5 x" {& f. K; b& F/ o本次IRQ研究了如下:
/ C/ U2 w# @' x& GVRC2&4(Mapper21,23,25)3 E! a+ M# \; W) f- c
VRC3(Mapper73)9 O/ g" z% ~% N$ |; E; {
VRC6(Mapper24 & Mapper26)  o0 l' @) G; [9 M
VRC7(Mapper85), Z; L' g# `0 k4 b' e' P. c; c5 O% a
MMC3(Mapper4)
/ E$ e: f. W* aMMC4(Mapper10)$ V' U" p% Z7 u! B
MMC5(Mapper5)- Q9 ?8 Q4 m  x( B, p
Mapper18
' |# ]5 @. e7 vMapper64
; l" W& M) m+ X8 G( l/ S7 HNamco163(Mapper19)3 D# j$ \/ [8 x! {
Sunsoft FME-7(Mapper69)
% j% a2 K/ ~2 w. i# S: k- l
3 D" s; \4 S: Y/ g" z  c4 }共计11种Mapper的IRQ操作使用例子
& j) R# ]% D& I: P$ I+ |/ f& q代码内有详细注释, 希望能帮助到感兴趣的人.
  [0 g7 O8 A# X1 }, q5 h% t; _0 l$ j+ F# D; G8 R- m$ }# h
  }' a  F% e# [+ E# z/ T, ]

4 r2 Y) Y' K* N7 \' X$ Y# PMapper代码主要逻辑(以MMC3为例):- p3 u; ~4 e/ g4 J' k9 F& f
  1. 9 A4 l: j/ m: `
  2. ;==================================================
    / ]+ ]9 J2 E8 C/ L* @9 v9 P# X
  3. ;Mapper号# w, B7 h0 I# \) W9 f
  4. MAPPER_NUMBER           = 04
    . y# |; [8 e5 u3 k& ~
  5. ;==================================================
    0 Y6 G5 G' w; c# Z
  6. ;MMC3 (Mapper 4) 寄存器常量4 }% u9 v) R8 }4 I5 x
  7. MAPPER_REG_BANK_CTRL        =   $80002 ^  V3 }$ n$ `8 o, Q  s! _
  8. MAPPER_REG_BANK_DATA        =   $8001; l2 _/ \) k! F& C3 [- l0 ~- p
  9. MAPPER_REG_MIRRORING        =   $A000
    ) ]" r# e( j8 ]7 k
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001! [& W3 m& T  m9 {. n
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    6 V, O3 w0 [  O
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    . }  Q* n  C7 H2 A. T# i9 d
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    / [3 p, c8 `0 T3 ~% w: p. l
  14. MAPPER_REG_IRQ_ENABLE       =   $E001. Z6 u- }/ x( x8 q
  15. ;==================================================: i" o8 X9 v3 i7 e1 I
  16. IRQ_SCANLINE_BEGIN          = 135
    3 w/ a3 ?1 f* |  _" l! x6 q
  17. IRQ_SCANLINE_1              = 8. \7 k; K; k8 Q5 {
  18. IRQ_SCANLINE_2              = 54
    9 y$ l5 e  v( \3 V
  19. IRQ_SCANLINE_3              = 8
    " q( Y! K4 |8 T+ [& o" ~" c8 M
  20. ;==================================================
    / {, j$ X! j8 `6 i
  21. ! @4 J; t1 A2 F- Y& T
  22. ;====================================================================================================
    2 [. y5 |9 A9 w
  23. ;宏常量( S3 N# M/ E0 ]4 d
  24. ;====================================================================================================
    " L' O* Z" b8 a/ b8 _8 I) p
  25. & g( f4 G. m  O3 U8 C
  26. ;====================================================================================================. [0 h3 ~. r3 g. Q+ D" H8 ^
  27. MACRO_MAPPER_INIT .MACRO
    - O5 c8 |7 y5 C4 \2 Q
  28. ;禁用IRQ
    ( ^2 y/ s7 h: i5 f1 N+ L& N
  29. STA MAPPER_REG_IRQ_DISABLE- Z% _4 `+ z& V9 x# ?
  30. 7 ]! V. R/ M, I. U, ~: K
  31. ;水平镜像& S3 F1 y- j: \+ ?4 b+ ~
  32. LDA #$01  I* g  J3 G1 x# n8 Y
  33. STA MAPPER_REG_MIRRORING& |7 `* Q) x5 u2 Z% Q% y; r
  34. $ d1 w- M% n) L1 p6 X
  35. ;初始化图形bank: U( @. v* O6 J2 Z  ?/ D8 N4 Y
  36. LDX #$05- j6 \6 g8 B9 t5 ?
  37. .Init_Chr_Bank
    0 `0 `- a0 k+ M0 p3 Z- K7 S. F* R
  38. STX MAPPER_REG_BANK_CTRL
    # g+ M! z5 c' b
  39. LDA .ChrBankData,X* |) o% m. l! _8 m% `  P# f8 C  {$ o+ }
  40. STA MAPPER_REG_BANK_DATA
    + R$ Y' K# X2 ?" _: D9 j
  41. DEX2 h( w' q- r' M6 K! L# z2 L
  42. BPL .Init_Chr_Bank
    : @6 }4 ]2 H, k6 E2 X
  43. JMP .Init_Chr_Bank_End
    . w, l/ |+ p" b; [' _' i
  44. .ChrBankData
    - p5 m, }/ i  h
  45. .DB $00,$02,$04,$05,$06,$07& T" z, k/ [# d' |, ?$ v
  46. .Init_Chr_Bank_End
    4 {5 R8 `+ y! ~- N) c
  47. 5 B/ y! f& Z  X
  48. ;启用SRAM; Z& j4 b1 {) O7 ~
  49. LDA #$80! O4 V8 e- z0 o3 @! U- o5 L! m
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    7 r9 G5 k, z8 n% J! D& l
  51. .ENDM  U6 p5 F; E3 ?3 @' c  f+ R
  52. % T7 M- J7 X- h$ e% V* Q
  53. ;====================================================================================================
    # F' i, `# y( C& u5 D4 i
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    2 t* K0 t( Y6 I  x) w" x# E6 j* ?
  55. .ENDM3 R& \* q. ?) B5 J% d7 _

  56. ' B# P/ o/ s6 f  C/ C8 ~
  57. ;====================================================================================================  p! ]: q- a, \$ p, Y) M; G
  58. MACRO_SRAM_ENABLE .MACRO
    ' ?! i  t* F0 s; w3 j& ]
  59. LDA #$80! }9 _: O: A3 }$ h
  60. STA MAPPER_REG_PRG_RAM_PROTECT! a) B! C5 f& `2 A2 A9 U6 J
  61. .ENDM: l- b1 ^& u# E

  62. 5 D" R6 F! e1 }
  63. ;====================================================================================================
    4 ?. g. V. d8 E
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    : d9 `' d5 u4 y+ S% Z" e1 E2 T
  65. PHA. ?# t, m; `6 v* J; P
  66. LDA #$06
    % n5 `0 C7 x2 W2 q
  67. STA MAPPER_REG_BANK_CTRL
    : [6 z. O( c( Z6 Z; O
  68. PLA) V  C1 k: h2 O1 G* t0 c
  69. STA MAPPER_REG_BANK_DATA( e1 F) E- n8 f" ~, `2 t
  70. .ENDM
    ! c; m% P5 b. s

  71. ! M0 O' l0 I7 }5 [* S$ W
  72. MACRO_SWITCH_BANK_A000_A .MACRO1 @/ N6 O& J1 E# @: p! m
  73. PHA
    4 D5 F/ L6 j* }
  74. LDA #$07
    & w2 Y; g6 H+ A; _
  75. STA MAPPER_REG_BANK_CTRL
    # @* k* ?! \& f- V
  76. PLA: S1 }2 S3 }  @
  77. STA MAPPER_REG_BANK_DATA) v7 \# e, v+ r9 |  `6 D+ {
  78. .ENDM
    - R4 t# e) J! b( h5 e! y
  79. % x, }$ }2 i; S- z4 N0 M2 Q
  80. MACRO_SWITCH_BANK_C000_A .MACRO6 o  k4 \  I2 W" d% R8 D
  81. .ENDM( k/ c1 M' Y' H$ {
  82. * D. q4 k5 Z! P5 E  a* ^
  83. MACRO_SWITCH_BANK_E000_A .MACRO* j( b- x1 q7 Q2 ?) p5 }/ W
  84. .ENDM
    + P( C9 d* S7 [4 H
  85. ) ?( U$ N# Z/ E3 O$ H
  86. ;====================================================================================================
    ( B' C( v$ q5 D  }( h/ w4 U
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO- z+ `2 m6 h6 u
  88. LDA #IRQ_SCANLINE_BEGIN + 19 I7 ]. d  j. O% B
  89. STA MAPPER_REG_IRQ_LATCH
    6 H9 }6 k; [6 Q8 w# ]* M
  90. STA MAPPER_REG_IRQ_RELOAD% d: E. i4 w0 ~, S. W/ \3 H% C
  91. STA MAPPER_REG_IRQ_ENABLE* t" l+ {2 `. s  T# J
  92. CLI
    6 ^" i8 u8 }! J9 ~0 |
  93. .ENDM: B7 m# y  g! q: L
  94. 3 ^& g# c, ~: D. w: C
  95. ;====================================================================================================" P6 T$ }# X: f/ D% H2 K
  96. MACRO_ENABLE_IRQ  .MACRO0 F  F$ ?9 [2 A  f3 \' H
  97. STA MAPPER_REG_IRQ_ENABLE
    3 P$ e. ~. G) x) w' x, q
  98. .ENDM
    5 Y5 A( q# t" z8 {

  99. & w+ U& t( ]" Y( }7 v
  100. ;====================================================================================================
    - h3 t  |9 l4 I% b" {* K- E) y
  101. MACRO_DISABLE_IRQ  .MACRO
      y/ W* n  G' d
  102. LDA #$00
    / J3 C5 E3 B, |8 c( X
  103. STA MAPPER_REG_IRQ_CTRL
    ! A7 o2 D& y( T. s4 W7 c0 k: g
  104. STA MAPPER_REG_IRQ_ACK. N1 |6 l; ?) d+ {! l# G
  105. .ENDM
    0 K* u/ D* N1 J; J3 n' x6 {
  106. ' Q3 ?) y8 F, h+ n+ m+ B
  107. ;====================================================================================================$ w- W% }- p- H/ r$ W7 K
  108. MACRO_ACK_IRQ .MACRO5 Y7 k" i. X6 U' t4 `( {
  109. STA MAPPER_REG_IRQ_DISABLE( i! V# Q, p% J. H, ?
  110. STA MAPPER_REG_IRQ_ENABLE
    - p; D* G- l9 |% Q. v& D  o
  111. .ENDM# b) C, U0 ]0 z: y3 H) h

  112. , W; d0 e9 w/ c8 A5 z! f7 i
  113. ;====================================================================================================% {3 t1 {8 w+ Q% W# Q
  114. MACRO_IRQ_OPERATE   .MACRO
    . z5 m/ B/ @/ m% u* J" G. k

  115. 1 m& z' }, S4 N* Z1 H
  116. ;==================================================
    : h7 L' S* t/ M9 c- ]
  117. ;IRQ滚动模式常量
    6 T; b$ q  r" n
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    8 {8 b2 [4 H7 _
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动( }; o7 `% M' ?
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
      ^# Z7 z9 b- k- R! \) W
  121. 9 T1 \, \/ i5 S
  122. ;IRQ扫描线数据
    ' E7 B& Q) Z. Z3 _, v4 N$ D  v5 X- B) l' b
  123. IRQ_Scanline_Data3 m/ i" _3 ]! V6 ]" t
  124. .DB IRQ_SCANLINE_1- s" H6 B/ P9 B* H( t0 ^7 b# E
  125. .DB IRQ_SCANLINE_2, }# E0 d/ P/ }. e# [2 ]. ^
  126. .DB IRQ_SCANLINE_3" K' W. G* M! b8 F9 s! F
  127. .DW 00 ;关闭IRQ
    0 ]8 {  z) f5 W! h0 g
  128. , w1 V2 O# ~5 N  x1 t, O
  129. ;IRQ滚动控制模式
    . d; j" S7 F6 @1 c4 C
  130. IRQ_Scanline_Mode/ q% K" c1 y. w- N
  131. .DB IRQ_SCROLL_MODE_RIGHT* p' w/ [: l3 \2 t& t) J$ E/ L8 i
  132. .DB IRQ_SCROLL_MODE_LEFT1 m! y7 Y; Y! X1 D3 b
  133. .DB IRQ_SCROLL_MODE_RIGHT( A* p- E  \' \3 E
  134. .DB IRQ_SCROLL_MODE_LEFT
    + a. Y. Z7 q, B# v6 q
  135. # S$ r3 `0 Q+ m4 o9 }& e# ~8 k, f
  136. ;==================================================
    % _, d; D$ S1 p, R
  137. ;;IRQ滚动控制
    & |) {$ }. v9 b& X9 O8 [& L
  138. IRQ_Set_Scroll
    6 y# @( Q  G5 j3 C, o% C! t
  139. LDX IRQ_Process_Index
    ; D6 Z& I+ Y+ T, w) A2 @
  140. LDA IRQ_Scanline_Mode,X
    + @9 Z: a9 i. f. k0 q) u) h3 [+ Z9 m
  141. CMP #IRQ_SCROLL_MODE_LEFT5 [! Y1 }# l* \. `
  142. BEQ IRQ_Set_Scroll_Left6 ~4 d$ W) Z+ M( n
  143. CMP #IRQ_SCROLL_MODE_RIGHT# `; X/ c7 c1 ^9 ?/ Y
  144. BEQ IRQ_Set_Scroll_Right  D  s& x0 f7 j% i
  145. IRQ_Set_Scroll_Zero;不滚动( W  f+ C' t! H: K% ?
  146. LDA #$004 t7 h6 q( E& C5 k# [0 C
  147. STA PPU_SCROLL7 r" B1 i! `! p6 r; g# X2 }( z
  148. STA PPU_SCROLL
    0 q9 Y% }- n( g, i" U
  149. RTS
    ; {/ s/ `7 ~- h9 j
  150. IRQ_Set_Scroll_Left;向左滚动
    " T9 N+ G2 S3 A0 j; S
  151. LDA Scroll_H
    + A2 U$ M# q8 O, ?* @
  152. STA PPU_SCROLL  o2 ~8 E0 h" `6 \4 P0 W
  153. STA PPU_SCROLL! o: K6 c  D, U7 |$ A4 h' f0 X
  154. RTS2 z2 y: }% b  R$ s- o. s$ ]: A! B
  155. IRQ_Set_Scroll_Right;向右滚动3 u. k6 {' x) i/ |) _  d! ^1 C+ x
  156. LDA #$00
    $ G$ S- C/ R# x! g( b2 g/ S0 y
  157. SEC
    ( I) E& _+ w  \/ o
  158. SBC Scroll_H
    / R5 `: J6 F5 I8 a  U
  159. STA PPU_SCROLL; t4 A* x% u7 I+ h2 C" A' H
  160. STA PPU_SCROLL9 \% `0 a( s7 S" J1 e
  161. RTS
    ) h- x5 N% P* V3 ?
  162. . {3 I+ W, H. l2 J0 U' \$ v
  163. ;==================================================
    ! y+ I1 h- Q9 D- U- T
  164. ;;IRQ滚动控制
    $ |3 C9 ?: H; a* P) }% E9 c% l
  165. IRQ_Set_Ctrl% T$ x0 u1 m7 H5 I% \5 d8 h9 y
  166. LDX IRQ_Process_Index$ Y8 D& t: v. A1 i* ^. J, \
  167. LDA IRQ_Scanline_Data,X
    - k: d4 p8 U, a+ Z, T
  168. BNE IRQ_Process_Latch
    8 |0 A' \4 u1 r: k) j* Q! x
  169. IRQ_Process_Disable;禁用IRQ
    " ~) k' w1 p4 g2 F4 j  g7 U
  170. STA MAPPER_REG_IRQ_DISABLE" r0 g1 |: [, T* Z
  171. STA IRQ_Process_Index9 Z- S+ |( t+ z# a/ h9 ~2 p
  172. RTS; t( j7 O) J* J" r- @
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线/ ^5 K4 k$ j+ C8 u4 B7 W
  174. STA MAPPER_REG_IRQ_LATCH2 S- _& ]5 W. S1 X0 a
  175. INC IRQ_Process_Index
    % g& d: q8 H: g1 r2 g9 ?; [
  176. RTS
    0 N2 H& z6 K( {- W
  177. ; Y6 W4 J$ z5 O
  178. ;==================================================/ a* M* C3 t' T9 L) |" l2 m
  179. ;IRQ处理5 C- Q- h( U0 v3 H/ ~
  180. IRQ_Process_By_Index
    2 {" N1 y/ M, i+ V# N, \8 y5 i' h
  181. JSR IRQ_Set_Scroll' T, }' Q# L( Y9 V5 ^6 |
  182. JSR IRQ_Set_Ctrl. M. T+ G7 T" ]  g+ p5 P( V
  183. IRQ_Process_End9 M) |8 c4 ~* Y( u
  184. RTS
    . K: p$ H" m" v

  185. & W( d) w6 ~7 P; q& c
  186. .ENDM- X0 l+ F) i. s
  187. , y8 I5 l. U4 b3 e5 C1 i
复制代码
' C+ G2 }2 R  r
1 c" q# a( }; ?
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-2-17 09:34 , Processed in 0.093750 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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