EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
3 A0 z( K9 q- S
# o( L3 J7 Z+ O' O# p+ A本次IRQ研究了如下:
0 P) k! W7 x! KVRC2&4(Mapper21,23,25)
! u+ _5 x, \) e: LVRC3(Mapper73)
; V) B1 f6 v# u& c% [" ]VRC6(Mapper24 & Mapper26)
- e  b" \; L2 X: m% VVRC7(Mapper85)5 N7 `% h! n! M' f7 d  f. \$ s. B0 ?
MMC3(Mapper4)
0 Y% P' w$ `& Z2 V( L- g" rMMC4(Mapper10)+ _( ~$ L: ~) w# W  _; O9 `
MMC5(Mapper5)
+ x8 q! T! V+ p& h2 jMapper18+ A' O0 {3 O" d
Mapper64
1 V+ f' n, R5 a% N9 N5 m8 C8 o; jNamco163(Mapper19)
" v% G8 k$ j! WSunsoft FME-7(Mapper69)+ G" P( V5 N. {" m0 \" ]; M- D
/ i* V* ?$ A5 T; g- J
共计11种Mapper的IRQ操作使用例子
% ]6 d' s: y& v* R) H! M代码内有详细注释, 希望能帮助到感兴趣的人.  w3 D0 ?0 r* K

1 l% Y2 h2 A/ C% [3 C2 p2 }) Q6 G3 e) ], P! v" I

! P3 E3 V# w# u* _+ ]% W3 eMapper代码主要逻辑(以MMC3为例):9 @& c( J: A8 w/ R2 @
  1. % \9 j, w7 I. X" k' e. o+ n
  2. ;==================================================
    ( j) }  |3 |& Y8 A
  3. ;Mapper号
    6 T- V/ L4 U+ [9 N' i  n! g
  4. MAPPER_NUMBER           = 04
    8 n0 `" \# B7 k0 F
  5. ;==================================================2 C0 t0 c6 n& N+ x$ I  M: i
  6. ;MMC3 (Mapper 4) 寄存器常量
    7 |' n+ a3 e8 q
  7. MAPPER_REG_BANK_CTRL        =   $80007 c& p6 H' Q, R0 a3 I# R1 q
  8. MAPPER_REG_BANK_DATA        =   $80018 V+ _" ?) w, _6 P9 u9 T9 C: S
  9. MAPPER_REG_MIRRORING        =   $A000/ ]) `7 e' e4 I5 y9 `5 V! d; v$ q
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001+ ~' A% Z+ P2 R0 L; Y
  11. MAPPER_REG_IRQ_LATCH        =   $C000! {5 H$ d; w4 e: W/ v5 ~
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ' o- C+ z' k$ q0 o( b2 `
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
      @: o) W0 b' u
  14. MAPPER_REG_IRQ_ENABLE       =   $E001/ R! S, b0 Q& F
  15. ;==================================================/ l" _! g5 |9 F+ `8 j
  16. IRQ_SCANLINE_BEGIN          = 135
    ' x+ l6 l" D* v9 C1 Q* q# ^
  17. IRQ_SCANLINE_1              = 8/ v' {8 ]# V. Q! S, M: V8 Q
  18. IRQ_SCANLINE_2              = 54% \" G& Y1 m1 M
  19. IRQ_SCANLINE_3              = 8) f3 e. Q5 R! |' x
  20. ;==================================================
    ' k) S9 c# ]! ?% a* J# r' G

  21. 9 A4 N4 Z7 C, Z' {- I5 A( X& i/ s8 x
  22. ;====================================================================================================- O" n! w& C6 Y3 ?+ C# F1 T
  23. ;宏常量
    # d: A+ z5 B. f; G) k
  24. ;====================================================================================================
    ! n/ H$ I5 ]. t, g  K) e
  25. 2 H5 @, s$ y2 J
  26. ;====================================================================================================
    $ f9 X, E" |' h$ C0 \1 y# w# v
  27. MACRO_MAPPER_INIT .MACRO) D5 Y) _  q9 x8 P* b+ z  ?# J
  28. ;禁用IRQ8 Z; ^) W$ r# {. W6 u/ e% ?! v+ c
  29. STA MAPPER_REG_IRQ_DISABLE
    : \5 }) j8 H* E8 r0 s! J  r
  30. ' I: h4 z. S1 `' I' ^, M5 [
  31. ;水平镜像9 Q; ^: n. H4 A
  32. LDA #$01
    ' F9 P2 Y! D6 P+ L% p
  33. STA MAPPER_REG_MIRRORING1 ^: G" U% H1 S2 n

  34. ! `9 C; B& N5 }" r
  35. ;初始化图形bank! C) [6 _1 Y0 W' f; C% j1 K2 u
  36. LDX #$05, p/ p& W, t+ N+ a/ r) w
  37. .Init_Chr_Bank
      O* `3 t# g' d" ~% ^4 _, N
  38. STX MAPPER_REG_BANK_CTRL$ ]0 ^# R+ {. R
  39. LDA .ChrBankData,X3 \  b/ n  _9 c, H+ M- p: K8 L2 Z/ K
  40. STA MAPPER_REG_BANK_DATA8 V9 g3 b2 r- v5 C8 F; ?
  41. DEX0 o( b& u/ Y% H3 i3 V$ n9 w
  42. BPL .Init_Chr_Bank
    ! h$ J$ y2 g  b0 M7 m% n
  43. JMP .Init_Chr_Bank_End
    4 z7 o( Q1 h9 u: ~. d% o# B4 C6 U! N
  44. .ChrBankData+ L- Z; ~6 _* O8 f: o9 y; X
  45. .DB $00,$02,$04,$05,$06,$070 R1 H5 _% s: \) ?. }& [
  46. .Init_Chr_Bank_End
    $ D" v% i9 [% j0 ^: l
  47. & y$ d2 @  Q/ s. A% @" F& z. a
  48. ;启用SRAM
    : D  X0 v: P9 a% L! F% @8 s
  49. LDA #$806 b* t7 ]; f9 M* F' ?  h
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    % S6 w8 r: \6 w2 ~1 {: G( ]
  51. .ENDM
    ) Z$ r$ S2 ]" X# `
  52. % Q  k" ]; e8 m$ I' m
  53. ;====================================================================================================
    0 ]/ v. o1 W( X
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO/ L5 G0 ?# `) p( T
  55. .ENDM
    ; c5 K/ X7 V/ G% z

  56. * @: i7 O+ }+ o+ W: H9 m( T
  57. ;====================================================================================================
    ; h5 g) C6 e. Z. g3 `% V
  58. MACRO_SRAM_ENABLE .MACRO
    ) {2 z/ r; M0 E( ]7 X  d
  59. LDA #$80
    : c- l6 y* C- \0 w. W; d$ Y
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    " p* S5 H& Y+ _  V+ W6 F
  61. .ENDM) p0 @/ C7 I2 }/ I! Q. S6 l/ v4 D

  62. 6 @# L' Y8 W# _3 j7 X& M
  63. ;====================================================================================================# z9 ~% [5 v/ H" X: Z
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    & X% j% J$ f& f( h: P
  65. PHA
    1 y$ ?$ h) D- s8 `) c! b7 p
  66. LDA #$06
    ; z' |: c7 u' n4 [4 V/ B0 ]
  67. STA MAPPER_REG_BANK_CTRL
      K+ ~' r. c; c5 f' @. i! J0 u
  68. PLA0 F' |7 h; F. V" }  [
  69. STA MAPPER_REG_BANK_DATA
    ) P* _+ |$ v" J( m# f) @& B
  70. .ENDM. K3 |5 n' ~: E& b' z
  71. & a- g/ e7 ^0 R* ^
  72. MACRO_SWITCH_BANK_A000_A .MACRO, y4 B8 Z. U; z7 j
  73. PHA
      P8 R* j& H* M, Y
  74. LDA #$07
    * O; F. T+ M! V
  75. STA MAPPER_REG_BANK_CTRL
    + M7 z( W1 h# h) t* ?3 ^, O
  76. PLA
    ' N) M0 }% Z9 v& o6 i8 H
  77. STA MAPPER_REG_BANK_DATA
    ( v% o6 c0 f: S. t, |$ e) O
  78. .ENDM' N! q+ w- m/ B' l$ P

  79. . Z1 d. W9 I) P5 {' D
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    7 ~& N+ i, U' S' z! E3 T) D# g5 N
  81. .ENDM$ I- a, N# m4 ~- E9 g: J9 z

  82. 5 D1 R& o; g  s' Z3 G
  83. MACRO_SWITCH_BANK_E000_A .MACRO# X3 w1 t& ~$ Y- |# U
  84. .ENDM6 s6 {9 x! x1 w/ Y' u7 M

  85.   e) R7 [0 Q8 C; l' e; o" n- ?
  86. ;====================================================================================================
    9 U( u7 u; G! w& W! O
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    - z. T" v4 R6 {1 ^( w9 }' {, Z6 d
  88. LDA #IRQ_SCANLINE_BEGIN + 14 n+ X' O9 b1 P6 g2 b2 B
  89. STA MAPPER_REG_IRQ_LATCH+ ?# O  k  d( N5 i
  90. STA MAPPER_REG_IRQ_RELOAD
    , f% w0 X6 _: Z0 ]: K
  91. STA MAPPER_REG_IRQ_ENABLE$ m4 T, t/ N8 }: L9 d( G7 n
  92. CLI1 J5 \0 }1 r! y# Y
  93. .ENDM* L1 ]* R+ U+ F: y& i" v+ U& j8 w* q
  94. # S* _8 {' Z, L9 j* T0 R3 i  N
  95. ;====================================================================================================
    # [$ V' R7 h# J6 O, e
  96. MACRO_ENABLE_IRQ  .MACRO' Y0 _6 y, F! A- w% k
  97. STA MAPPER_REG_IRQ_ENABLE
    ' q; |' v; R2 p2 U# ?/ l6 z
  98. .ENDM
    ; ^" m  ~8 R5 ^
  99. 1 Y' X5 o: U$ u+ a0 j+ U: i4 l& H; U
  100. ;====================================================================================================
    * O7 G) @/ E0 D+ |* x. K
  101. MACRO_DISABLE_IRQ  .MACRO
    # J3 S1 \' |7 Y$ \+ o" Q9 t
  102. LDA #$00; z! c3 i& ^" ?3 _/ f
  103. STA MAPPER_REG_IRQ_CTRL
    / c! u- Z0 B4 b0 B+ c# y' s" K
  104. STA MAPPER_REG_IRQ_ACK0 `/ H7 Q: @1 J# S7 g/ m  p/ F
  105. .ENDM
    6 A8 j0 g! }# z" d! C5 g  ~
  106. ' B( M& K7 s( i1 T8 G* t1 g1 j
  107. ;====================================================================================================& {# G/ B! w+ J0 y9 J9 K5 l
  108. MACRO_ACK_IRQ .MACRO
    - g/ J5 b, k0 e$ q8 F* d1 Q- i4 [
  109. STA MAPPER_REG_IRQ_DISABLE
    9 |2 F9 J9 v; K' d  L! Z  s4 t
  110. STA MAPPER_REG_IRQ_ENABLE
    ) ^' A, y8 u: {4 l3 t# }" _* D
  111. .ENDM
    . X6 j7 O( Y7 f- ~7 B8 X7 P1 Z
  112. " y( `8 N+ ]$ Y- u7 b4 m+ |6 h
  113. ;====================================================================================================
      C( D( V& M! f  V  ~5 ~
  114. MACRO_IRQ_OPERATE   .MACRO# v& u" K" K3 M, i: o+ {3 e) S

  115. . }+ n9 g; ?2 t, d: X
  116. ;==================================================. C- S) ^# K& a$ d0 a* q
  117. ;IRQ滚动模式常量
    # n; }6 z1 H8 }4 x
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    6 k; U& T$ w: x' Y: S& N
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    2 R& K1 k: N) `+ @/ x9 t/ B7 M
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    8 R  m0 K. q9 W1 k& `
  121. 7 A7 }# C/ Y8 V9 \  C2 w
  122. ;IRQ扫描线数据
    $ @6 {  N& J" Z2 l% k* I+ u3 v) ]& c
  123. IRQ_Scanline_Data! S/ U+ P' k! j/ I4 Q9 U5 E) `
  124. .DB IRQ_SCANLINE_15 }' b  l% E: y& V" Q6 P
  125. .DB IRQ_SCANLINE_2! i7 X: \! s$ y5 A  V/ N( p
  126. .DB IRQ_SCANLINE_3
    $ j  e! @$ f" u+ z2 i1 c: G  Z9 l
  127. .DW 00 ;关闭IRQ
    5 E8 y- J9 G0 l  j, T7 o: v

  128. 0 P) B% x; A! H  x  O5 ]$ B4 h
  129. ;IRQ滚动控制模式' D* ?" Y( d+ X0 b$ I( ]- w! C) V
  130. IRQ_Scanline_Mode9 i, Y& X0 }! J( l5 K2 q! }# y
  131. .DB IRQ_SCROLL_MODE_RIGHT0 H9 R5 p0 B/ T- U0 V5 {
  132. .DB IRQ_SCROLL_MODE_LEFT
    ; O  c2 ~' }% u& P
  133. .DB IRQ_SCROLL_MODE_RIGHT
    5 T) u) e: M2 J+ P
  134. .DB IRQ_SCROLL_MODE_LEFT
    . }% M5 Z# Z" C( Y$ n

  135. & m( z1 o7 m2 k) m6 |! [1 V$ h
  136. ;==================================================
    ) V: P* L( i. C
  137. ;;IRQ滚动控制" S: a, u0 O6 X4 s
  138. IRQ_Set_Scroll* z- c% t) H$ T
  139. LDX IRQ_Process_Index( f6 {8 z1 i+ J& E5 {
  140. LDA IRQ_Scanline_Mode,X
    # \3 h6 P( Z  C+ g
  141. CMP #IRQ_SCROLL_MODE_LEFT$ `' \* g; V4 Y  |; m
  142. BEQ IRQ_Set_Scroll_Left
      [, r( e: X6 `( z  k2 q  e$ I
  143. CMP #IRQ_SCROLL_MODE_RIGHT' s6 s' R0 {+ u; @' k% p9 v9 b
  144. BEQ IRQ_Set_Scroll_Right, G9 J+ Y! Z  }# Y7 t' J
  145. IRQ_Set_Scroll_Zero;不滚动  o1 U$ P2 `  ^. ]. {% ^' X- l
  146. LDA #$00
    ' u! C4 i  y9 C, G
  147. STA PPU_SCROLL
    ) Q1 g" `3 f0 J2 f  n6 w
  148. STA PPU_SCROLL
      G- q3 E. C/ G7 K
  149. RTS
      z% O% ]& a0 B* _/ `5 |7 _) ]3 M+ f
  150. IRQ_Set_Scroll_Left;向左滚动
    ' _0 P1 M; a6 {* i+ J3 q& D
  151. LDA Scroll_H' i* L5 C- x3 P: T" B4 L
  152. STA PPU_SCROLL
    4 Q3 j4 V& }4 O+ l0 C! w4 q+ d
  153. STA PPU_SCROLL
    : b7 y) A9 X7 Q9 l( ]6 U
  154. RTS5 J" _5 f) l$ _  o2 v
  155. IRQ_Set_Scroll_Right;向右滚动& G1 J( c$ X- q$ ^( z
  156. LDA #$00) ^1 H  _) F3 y5 c# R( a9 H
  157. SEC
    * t7 K/ S0 W- k& O6 W( V  x
  158. SBC Scroll_H
    . o7 r. d# t6 e# M5 Z
  159. STA PPU_SCROLL& M& t+ e% W9 \# [* X$ V  k6 r* L) }
  160. STA PPU_SCROLL
    % _" o. Q1 n: P2 T
  161. RTS- u$ x% Q) z. F) f+ S
  162. + J1 g+ Y' W6 i4 ]
  163. ;==================================================
    ( w; s# |# e3 C. A* [4 k
  164. ;;IRQ滚动控制2 G3 ~  v& `6 R4 Q) @
  165. IRQ_Set_Ctrl
    7 ]! K" P( C1 {) E) u  e1 s/ e
  166. LDX IRQ_Process_Index
    9 d' {+ Z2 c1 ?6 C. I8 @
  167. LDA IRQ_Scanline_Data,X- ^; W+ m) W  w* v
  168. BNE IRQ_Process_Latch( U& x' U1 @4 U" b8 x
  169. IRQ_Process_Disable;禁用IRQ* |: Y' O4 }1 d& E/ o! J
  170. STA MAPPER_REG_IRQ_DISABLE5 d9 c7 f4 G) k- Q1 ^0 a9 u
  171. STA IRQ_Process_Index7 v2 h+ I0 l. @" l
  172. RTS
    ( v8 g( R0 P0 `0 O2 |# x- e
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    & X- m9 n# l0 p6 h4 F2 y$ E5 }
  174. STA MAPPER_REG_IRQ_LATCH$ e1 {1 g% n* K; ]' ^
  175. INC IRQ_Process_Index7 Q" s  x" b1 g7 |
  176. RTS- m: D4 d% Q' |& g3 a9 o; r
  177. ( `7 F( @) v& g) O+ ?& t$ b5 D
  178. ;==================================================
    ; P2 U+ L7 G, M7 C( ]+ `
  179. ;IRQ处理; P' [+ {- O' Q$ A( m  g7 H4 o5 M
  180. IRQ_Process_By_Index
    7 a5 W5 R  S" h8 m, w7 o% @, r
  181. JSR IRQ_Set_Scroll
    5 R% {: Y6 [3 J% h& F: @3 m3 e
  182. JSR IRQ_Set_Ctrl8 `3 J1 a; B8 {- c" @
  183. IRQ_Process_End# y, U3 \: P9 ?0 D$ B& U2 o
  184. RTS$ K, i4 D* j' i* _$ k. y' I

  185.   f2 V4 h. s4 i  `% X
  186. .ENDM  T( N7 ]# |; K4 y

  187.   ]4 F+ R& H7 Y" w: D
复制代码

( L* P1 T" `# N5 \
' l" R  Q: ~) V0 S" d代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-27 10:23 , Processed in 1.074218 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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