EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
$ d/ N- R' D' t5 A# K
2 r6 ?$ M0 i8 Q. _' j本次IRQ研究了如下:
( q0 h0 b* @1 H( i  m9 F. U# S' yVRC2&4(Mapper21,23,25)
1 x- _1 G. S$ I8 ~) k. fVRC3(Mapper73)
$ z7 W% O2 ?7 r) B% mVRC6(Mapper24 & Mapper26)
1 p* X: m2 n, ^0 X2 Q: aVRC7(Mapper85)
: g5 v" f4 v7 w7 r1 dMMC3(Mapper4)
' o6 s9 ^3 g# KMMC4(Mapper10)) f3 I! {8 |4 B( T* w' R* J  s7 u8 |
MMC5(Mapper5)! o! \4 ?. Y  N4 S) t! E
Mapper18
% }& I  i9 V0 B8 A9 HMapper64
- x+ y) B" X, p* T8 SNamco163(Mapper19)
! ]8 T0 r# e; v0 E5 S( A( |& X2 MSunsoft FME-7(Mapper69)
& Z, O( h9 j+ {- ^8 {4 c
" G" W. i! [( R- x共计11种Mapper的IRQ操作使用例子) R/ T# g5 i( |! Y& a
代码内有详细注释, 希望能帮助到感兴趣的人.
4 v& F% p4 T) k. O/ j( h) Z5 n
: Z0 f3 W. X4 Z5 L1 s# c
- E# v7 Y. Z- r  T
6 F& o' N( ?! B6 b1 e6 P; W8 eMapper代码主要逻辑(以MMC3为例):+ k6 _9 d/ t# T

  1. 3 q) i1 F- s+ i" }
  2. ;==================================================9 s& M* j; x3 W2 ?( }3 a+ ]. o
  3. ;Mapper号  ?! k8 d. g2 S3 K; \- b5 ~
  4. MAPPER_NUMBER           = 04  X; x& r% A- t4 c& e( c- c
  5. ;==================================================
    2 M1 }- `- ~6 W1 L& o
  6. ;MMC3 (Mapper 4) 寄存器常量' u# ^/ a" E/ Z8 _
  7. MAPPER_REG_BANK_CTRL        =   $8000& |+ f& u) V& `, @
  8. MAPPER_REG_BANK_DATA        =   $8001
    4 v, u. k+ i5 @9 ]3 a
  9. MAPPER_REG_MIRRORING        =   $A000
    ; A, h7 w0 K" b7 T) x$ d
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    + V: F8 s% S4 ^0 {, k2 c4 Z# B: I
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    $ W( |! X% z6 @4 v# v( x9 [
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    5 Z9 L4 E: }/ p, c( p/ x" D6 X) \
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    . V' q, l! r8 x6 Y/ r6 O
  14. MAPPER_REG_IRQ_ENABLE       =   $E001$ R! L# c9 R  }9 W2 t
  15. ;==================================================0 }/ K5 n. v" K3 C
  16. IRQ_SCANLINE_BEGIN          = 135
    # Q' k$ M9 P3 x$ ?! f% p! ?
  17. IRQ_SCANLINE_1              = 8
    ( t  s; e( B5 Y
  18. IRQ_SCANLINE_2              = 54& C' r8 K- T! t; |. l( x
  19. IRQ_SCANLINE_3              = 8% m7 H+ x# d, s0 [0 ?$ X% M
  20. ;==================================================
    ( |  g3 J9 J) w& m; N

  21. % I& @) k- `. `6 ^6 @
  22. ;====================================================================================================
    2 R- L. V( o( V0 Y" `+ j
  23. ;宏常量# v% b5 [- p& ~  j8 n# m
  24. ;====================================================================================================% B) C+ l' a. Y( M& P

  25. 6 a1 u3 H/ ~3 U) }
  26. ;====================================================================================================+ m1 @+ h4 t4 e
  27. MACRO_MAPPER_INIT .MACRO
    ; n& [* t4 \- |/ t% C
  28. ;禁用IRQ
    ) B% X; r; K; L2 N' b- N! `
  29. STA MAPPER_REG_IRQ_DISABLE8 w6 I  T5 h5 K/ O! R
  30. $ b+ ^  K& [. i( A% w# E. }- [
  31. ;水平镜像. X# ~# A6 \: b# `+ G9 x
  32. LDA #$01
    ; Y% @- m" q+ u/ _  S, U
  33. STA MAPPER_REG_MIRRORING8 W( q3 O0 p5 X8 x
  34. 0 Q0 t# S4 z9 `0 B6 Z
  35. ;初始化图形bank
    9 z5 N, y* E, G  ^
  36. LDX #$05, n  q  n" o" u! p7 m
  37. .Init_Chr_Bank5 u8 p9 i9 n5 c
  38. STX MAPPER_REG_BANK_CTRL
    $ ^; i3 }' h0 a* R( F4 U, T/ c9 R
  39. LDA .ChrBankData,X. d0 d* B* U* K- C
  40. STA MAPPER_REG_BANK_DATA
    % L+ v/ A( U( ]7 I
  41. DEX
    + a6 C" r9 V, M
  42. BPL .Init_Chr_Bank" U1 q( S1 y* F
  43. JMP .Init_Chr_Bank_End: Y# D' _7 s# r1 v0 c
  44. .ChrBankData: g6 X6 x! ?" b# l: A
  45. .DB $00,$02,$04,$05,$06,$07$ T# F' A1 V; _
  46. .Init_Chr_Bank_End
    + H4 h5 h0 A+ \8 d. @+ P
  47. & o8 m" M6 n9 o
  48. ;启用SRAM
    " u1 N" i4 Z6 f; _, e# v5 v0 `
  49. LDA #$80
    / v+ X0 |# _$ C+ F
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    ' i" A- G. y) M. {1 \
  51. .ENDM0 X2 B; v) y1 L. K  `% z7 @

  52. $ b! j! Q, Y, p% b6 L
  53. ;====================================================================================================
    ' O" f7 m: |' y# Z+ u
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO) Z+ X1 j, s2 r$ P# n& }
  55. .ENDM" G2 L9 |  _1 P0 q- c4 u; B
  56. % g$ `+ @  d3 c/ x, h
  57. ;====================================================================================================
    . _  U% {  A2 v$ |
  58. MACRO_SRAM_ENABLE .MACRO7 R! J8 r+ M+ `4 V- l- L& h
  59. LDA #$80& A" l4 ?3 Z: ?& ]! |* T3 M, P% Q
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    . t  {1 [; b2 t
  61. .ENDM! b. g" T2 A% _9 I) d

  62. 9 @2 m6 c- q4 D+ Y
  63. ;====================================================================================================  }! C5 k$ @0 H& ~* L+ C% w
  64. MACRO_SWITCH_BANK_8000_A .MACRO' H' m  u3 d# Z! j  g' _/ T% d& ^
  65. PHA6 p' J3 |7 a- O( z* u
  66. LDA #$06
    1 n8 o0 `6 c: B) {; h+ {
  67. STA MAPPER_REG_BANK_CTRL
    1 r8 h) q: l/ D1 _& j
  68. PLA' ^: S0 s. }9 h: w# ?
  69. STA MAPPER_REG_BANK_DATA
    2 }1 \) H+ e% n/ o2 X, h' m6 |
  70. .ENDM
    - _1 P/ M' R# O+ ?) s/ l7 W

  71. ! o3 u5 ]- z2 S' W
  72. MACRO_SWITCH_BANK_A000_A .MACRO3 f% O- B+ K8 }
  73. PHA' o$ V! b+ z8 ~" b
  74. LDA #$07
    1 H- \! m  X1 \3 T" g
  75. STA MAPPER_REG_BANK_CTRL+ @8 U8 E% C  `
  76. PLA4 M5 \; u% }$ ~+ {
  77. STA MAPPER_REG_BANK_DATA  L6 X" w, h* j/ V
  78. .ENDM
    + l6 l$ j8 Q8 z$ v4 N
  79. : r0 |# J/ Q! Q7 I6 E
  80. MACRO_SWITCH_BANK_C000_A .MACRO9 I( Y7 m* E  u' C2 [
  81. .ENDM
    & V, h; S9 C7 T
  82. + U6 [8 x4 m( f' W. D. _4 f  y  D
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    , ]# C- z1 E& l9 D
  84. .ENDM6 O4 U- y% w- G+ _" X# `
  85. : ^0 G3 u- q% Q+ G" Z. k7 R& v
  86. ;====================================================================================================( \# }$ n1 _9 t: W+ w' X5 O
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO/ n% W" P/ x+ g8 J' j
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    # V" `4 q# _8 ^' Z& X5 P
  89. STA MAPPER_REG_IRQ_LATCH5 k1 N' E- V6 E7 K. d# W
  90. STA MAPPER_REG_IRQ_RELOAD5 w' c5 E. G0 u# D6 M1 Q
  91. STA MAPPER_REG_IRQ_ENABLE
    ! K, a5 i' Y" B/ x( G
  92. CLI* r' `) q" D) j* B
  93. .ENDM- T' y# _& C! U/ v  a9 J( c
  94. ) e8 h; R1 x: {9 C$ K6 b% H; [
  95. ;====================================================================================================/ W' O  N. E# R1 N5 c' n& F
  96. MACRO_ENABLE_IRQ  .MACRO$ I+ G" S: Q2 W: ^8 K$ V
  97. STA MAPPER_REG_IRQ_ENABLE0 T3 Q1 Y% v& I; b5 w
  98. .ENDM0 G0 S: }% J" d
  99. 7 R3 h4 F, f4 Z1 I; d0 s
  100. ;====================================================================================================3 r% j  j) E0 L
  101. MACRO_DISABLE_IRQ  .MACRO
    5 u0 f; g" N6 R# v* F) \/ O  N
  102. LDA #$00. Q$ r; K& K3 x
  103. STA MAPPER_REG_IRQ_CTRL
    8 t6 j( R7 n, E* Z8 e9 F5 c
  104. STA MAPPER_REG_IRQ_ACK1 C7 N, I7 U$ W! m( J) X$ L) ?
  105. .ENDM
    1 A: b/ }* @5 E, K8 k. e# F- p. j

  106. # \: L$ t* N$ v: P! ~
  107. ;====================================================================================================
    4 I. B# v  h4 b( }# @
  108. MACRO_ACK_IRQ .MACRO2 V" ?  e2 g, J) ]1 v/ I
  109. STA MAPPER_REG_IRQ_DISABLE7 f: j0 z( f# h3 P/ M* d! ^
  110. STA MAPPER_REG_IRQ_ENABLE8 S8 ?; w  \% s# `$ f! \* `5 [
  111. .ENDM
    5 P: B( x( l1 T- _2 d# X1 O  V6 Q% ]

  112. 0 D# O. Y# N" ~/ h
  113. ;====================================================================================================- C  N: F- j( `7 I/ m
  114. MACRO_IRQ_OPERATE   .MACRO$ M) Y7 V' W! U( ]$ k' g' M$ P

  115. 5 u; q) b0 P3 e1 U5 u) f. E- I
  116. ;==================================================
    ( p7 z  G# J. G) _2 q# I
  117. ;IRQ滚动模式常量: N% b  b2 e# V9 R) T
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动8 ]& y  m# o1 I, z, ~
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动2 L7 o1 }# w" M4 a7 @2 H
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    % c4 t) e7 U* B1 x1 i
  121. 7 c/ j8 y/ V6 |
  122. ;IRQ扫描线数据
    0 Z2 K/ p' R1 r1 ~1 w% L
  123. IRQ_Scanline_Data
    1 j. @" s% s, z5 @  R
  124. .DB IRQ_SCANLINE_1
    6 H& J, Z. G, B) `( ?' ?4 _' g
  125. .DB IRQ_SCANLINE_2
    - U7 N3 A" J0 A) H& h" `% S
  126. .DB IRQ_SCANLINE_3$ O) Y" c8 H8 `  h0 R3 Z/ H. N
  127. .DW 00 ;关闭IRQ+ J' l0 m! O1 F8 w* |

  128. 2 Q! c- v) G6 p* S
  129. ;IRQ滚动控制模式+ Y& ~& t- n$ [" P
  130. IRQ_Scanline_Mode
    ( `" G4 j  ]+ _; a6 K# ?
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ' T& L/ t6 t7 v0 S
  132. .DB IRQ_SCROLL_MODE_LEFT  \/ H8 H$ W5 y9 |0 G. U+ Z
  133. .DB IRQ_SCROLL_MODE_RIGHT/ U3 _. D  @' b. i$ V
  134. .DB IRQ_SCROLL_MODE_LEFT8 \) L4 s. X( J  o5 w1 @
  135. 6 _) n- W: A( ?6 F) {4 V! d
  136. ;==================================================. o& P4 f# ]/ Z- b5 r. |2 Q* r! i
  137. ;;IRQ滚动控制: h' t) t' h0 n, O" |. W8 Z1 ^
  138. IRQ_Set_Scroll
    1 x  \2 |& Y, l' @, ?" X
  139. LDX IRQ_Process_Index
    + W- a1 J7 s4 I& q4 r" x" s; X, e
  140. LDA IRQ_Scanline_Mode,X
    0 x$ D" r8 I: ^$ d% O6 g
  141. CMP #IRQ_SCROLL_MODE_LEFT) I+ B; y( t; y5 e5 u
  142. BEQ IRQ_Set_Scroll_Left% ?5 P+ g! v2 z
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    % C# C& R$ Y; f: N. B4 A$ U+ D1 d
  144. BEQ IRQ_Set_Scroll_Right
    & Y0 v1 i9 b* M* W! i
  145. IRQ_Set_Scroll_Zero;不滚动. {6 a5 L1 E0 @# o
  146. LDA #$00% ?) {+ V: D. c! n; J6 w
  147. STA PPU_SCROLL
    6 J1 n/ j' ~2 S
  148. STA PPU_SCROLL
    * J  }( X; p0 v6 j9 O: }3 A4 o
  149. RTS
    - M/ g  P; ?+ y$ Q" z
  150. IRQ_Set_Scroll_Left;向左滚动
    7 x6 f& g& `5 S/ q! d/ C
  151. LDA Scroll_H
    % W7 t+ Z- B7 v  C6 w
  152. STA PPU_SCROLL
    . {( l  I, |' r6 q
  153. STA PPU_SCROLL4 z- Q! K4 y. h! J; k% O
  154. RTS( P# p; h$ k0 l" f+ c& V4 w9 r
  155. IRQ_Set_Scroll_Right;向右滚动
    & J* N  O! t( ~' y2 h. G) q% v
  156. LDA #$001 m0 v) w; h' T/ {2 w4 ]
  157. SEC: |" g9 z1 D! @) ?4 r' R3 C
  158. SBC Scroll_H
    4 L1 Z& @' Q4 t" S2 ?( R2 M) L
  159. STA PPU_SCROLL
    : K: T% @& i$ D, E% C! D6 m
  160. STA PPU_SCROLL
    ( X- L1 r- I+ X& L4 l
  161. RTS) x. T+ B3 m6 z
  162. ) w! H" u+ j9 n" M- p
  163. ;==================================================
      \+ H) A6 e, L! o9 v" H
  164. ;;IRQ滚动控制' b+ |4 E' r# N
  165. IRQ_Set_Ctrl
    2 L0 k, W$ B1 L. r  H3 n
  166. LDX IRQ_Process_Index
    4 L8 n. ]) N* f# u  f: [
  167. LDA IRQ_Scanline_Data,X: }. n5 ]2 h0 u* I
  168. BNE IRQ_Process_Latch3 ?. i$ T2 z8 e. w
  169. IRQ_Process_Disable;禁用IRQ6 T4 _$ u9 }& Y/ f: P# U3 D: R( m  F! M
  170. STA MAPPER_REG_IRQ_DISABLE: n8 u% d0 v7 F1 Z. D1 G) ~' x
  171. STA IRQ_Process_Index* m  U4 p# D5 R, l
  172. RTS
    2 C8 M5 w/ Q  V8 S- [7 B9 f4 F
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    * j: y; W- W6 W' |- K0 n( m
  174. STA MAPPER_REG_IRQ_LATCH0 u4 K# w" s0 G9 r& i" K
  175. INC IRQ_Process_Index
    * }( }& \3 `# i5 k$ \+ p. e
  176. RTS
    2 i. L4 H$ S( O: y  }( y* B& z
  177. : \. k2 o- i2 {% R" h
  178. ;==================================================  t" I$ D2 f* [1 H( ~* Z" H" K
  179. ;IRQ处理2 v1 ^/ x/ g& ^, n* d
  180. IRQ_Process_By_Index7 P6 L3 s; x2 _) f0 B  d$ i
  181. JSR IRQ_Set_Scroll
    8 {7 Z, M1 A# `& u( g% I
  182. JSR IRQ_Set_Ctrl% ]) b4 I1 `! R) C7 n& z& Q
  183. IRQ_Process_End2 q  e/ y/ I; @$ j. U; S
  184. RTS
    ( @# @( n3 f; @! n# V" Q0 {, Y0 l

  185. 8 n0 _4 I& N) H, ]! Y
  186. .ENDM) D/ L& `( g8 ]0 `) l/ }1 e

  187. ( w; ^5 M; ^! F: z9 }) ]
复制代码
0 p& h- v3 t$ S; W) b# ^6 B' r1 H. S
3 {( {. Q  y: `/ ~' \2 `; P5 I
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-19 06:19 , Processed in 1.091797 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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