EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 6 g- W7 |' f- g4 i9 }. X

* K/ O4 r; w3 ~本次IRQ研究了如下:
5 r  w8 Y' O) K6 x1 ]" P* R  ]VRC2&4(Mapper21,23,25)
& q% l8 n+ {2 o/ }/ ?) t& Z* zVRC3(Mapper73)
! c3 ]7 H! M' j# T* `8 ~VRC6(Mapper24 & Mapper26)
! k" C0 W% t* y! h/ b7 @; E2 ZVRC7(Mapper85)' ~- p7 \; H. X
MMC3(Mapper4)# @( Z$ r8 f& \. f9 |8 H! P
MMC4(Mapper10)2 U" G' z! a& X8 t8 i$ B1 W
MMC5(Mapper5)
5 B+ |* ]( K- ~' f9 o2 MMapper18. N6 v' z# @1 l9 m2 ]
Mapper64
9 P; I  [6 O5 U( u" Y6 W. z* B, ZNamco163(Mapper19)
9 S9 q- a! [  G# B7 p3 fSunsoft FME-7(Mapper69)
, X* N/ e1 d0 I
9 @' h. q9 {0 u4 X共计11种Mapper的IRQ操作使用例子9 v" {+ h! d  z0 S4 ]! f% b# p
代码内有详细注释, 希望能帮助到感兴趣的人.
! M) u/ y! b, \/ V6 p, e7 p; i8 a( f  S) ?4 \7 u1 }6 `. c
" b- V& q2 c, G  R# Q# U2 z( x

7 [2 F% _! m& j+ m) q/ `6 h/ b4 v, BMapper代码主要逻辑(以MMC3为例):- Q: |8 k: b3 ?8 B

  1. 0 s7 ^- q& Y2 w4 j+ a& K
  2. ;==================================================- o- V0 ?- S* z4 h" n' r
  3. ;Mapper号9 D. ?" X/ j+ B/ n6 ]1 v9 i9 h
  4. MAPPER_NUMBER           = 04
    + Q+ R/ n  w9 S+ _. W. @2 [
  5. ;==================================================
    + O! z' ?! q6 t0 }) A
  6. ;MMC3 (Mapper 4) 寄存器常量0 e) M0 Y( I9 ^8 m
  7. MAPPER_REG_BANK_CTRL        =   $8000
    + _) K% C' e$ n2 Y. h
  8. MAPPER_REG_BANK_DATA        =   $8001
    3 Q, Y0 q0 \( _# E% x  j
  9. MAPPER_REG_MIRRORING        =   $A000- X! t! p8 O  A5 T; C  G4 G
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001* V8 k8 o8 l7 y6 k: [
  11. MAPPER_REG_IRQ_LATCH        =   $C000# Y2 w1 Y6 v7 `5 ~3 ?
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    ' y3 F8 t, x, @/ y( h/ N! S
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    6 \3 n  i2 r2 d. C$ x% `$ R
  14. MAPPER_REG_IRQ_ENABLE       =   $E001. K5 z+ G4 _  \4 c% w7 v; n
  15. ;==================================================
    9 d1 Q: z1 A3 l. J3 N
  16. IRQ_SCANLINE_BEGIN          = 135
    + U( u$ ~. i$ v, M2 R% M
  17. IRQ_SCANLINE_1              = 87 p0 F6 u4 C5 F9 M9 N
  18. IRQ_SCANLINE_2              = 54. o' _! ^( r% _3 u; |& t% P
  19. IRQ_SCANLINE_3              = 8
    0 a) k* c/ v- N0 ?+ |9 ~1 o
  20. ;==================================================; V3 ^' C2 G+ A. {. E/ M
  21. , z: h1 c8 \$ g0 n& y
  22. ;====================================================================================================
    ' |) N5 _& c* \, x2 P" l& l
  23. ;宏常量
    - `' g, R+ n9 V0 ]0 \" s
  24. ;====================================================================================================9 q2 I  r+ `, [0 ~- c

  25. ) z3 |. `3 I+ `8 \8 M$ a
  26. ;====================================================================================================* x7 P/ o; x" L; \
  27. MACRO_MAPPER_INIT .MACRO+ B* b. E* ^0 z3 ?  d" @; P
  28. ;禁用IRQ. f  G' k' Y3 u& `( y
  29. STA MAPPER_REG_IRQ_DISABLE
    , \  V! G: C+ G# [- x
  30. - I3 m8 |2 g3 A" f$ b' C; }6 G
  31. ;水平镜像
    $ m& d; b' X* t% Z) p0 Z
  32. LDA #$01
    ; ?% W& i6 x2 n7 Y# P
  33. STA MAPPER_REG_MIRRORING
    , q; ?( c  q, K0 a7 ]' s

  34. ( Q! l: Q. A. T1 B: z5 b
  35. ;初始化图形bank
    ' i" p9 I4 ]2 D8 u& g
  36. LDX #$05: k5 Z8 ?8 ^- y( Z5 K5 n1 u
  37. .Init_Chr_Bank3 e, ~$ \1 i: L' B" i
  38. STX MAPPER_REG_BANK_CTRL, ]. S' h3 D: o: z1 O
  39. LDA .ChrBankData,X
    , R3 f$ N" h6 m, ^
  40. STA MAPPER_REG_BANK_DATA4 F' L  e5 ~3 ?$ r0 I$ s! {
  41. DEX
    : w% _/ c. y8 }) i
  42. BPL .Init_Chr_Bank
    6 p; A2 M5 q4 B: x
  43. JMP .Init_Chr_Bank_End
    ( K$ N* Z! X) \. y' w
  44. .ChrBankData
    0 j, B' `0 L1 s; J
  45. .DB $00,$02,$04,$05,$06,$07
    ' M- F. k4 c! {+ h1 ^; w
  46. .Init_Chr_Bank_End' F4 j6 U% @+ e$ O- Q
  47. , P: K: L& _3 ]' k
  48. ;启用SRAM! F1 i& H. k+ |4 ~7 I' K! \3 I
  49. LDA #$80- b- J( [3 g. b! g: S: `
  50. STA MAPPER_REG_PRG_RAM_PROTECT
      H% L! Y( [, J- Y& ~  N; y
  51. .ENDM. e. @! l5 b* j8 I( m* @
  52. 9 i2 L8 e7 t5 k; x! Y- P
  53. ;====================================================================================================+ R6 f! [2 p0 \+ E9 ]5 }2 c) Z5 s
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO8 R3 F$ O/ G  O% k/ M, y
  55. .ENDM! }) F* s' |4 b0 r, s

  56. 7 J! S8 O, X% |" l  v
  57. ;====================================================================================================
    : u7 B" U* _1 o5 \
  58. MACRO_SRAM_ENABLE .MACRO
    % P; d& H. Q! G1 _  a% t2 R
  59. LDA #$80
    " J+ f* A) F, p& O3 ?# U5 c7 n& n
  60. STA MAPPER_REG_PRG_RAM_PROTECT0 H( s% T0 N$ _+ {
  61. .ENDM) D5 O$ _% q1 H+ R- Z6 ?

  62. 2 l; ^, `- a/ J9 R
  63. ;====================================================================================================" ^* n: V; H8 l- d
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    . D; t% b6 {! w5 @, k# Z
  65. PHA
    " H' r+ |2 v9 d7 L$ N. t
  66. LDA #$06, T; H" V. w, y3 _* m' }4 S
  67. STA MAPPER_REG_BANK_CTRL
    ; @3 F+ l- C, C" k$ g3 m$ U
  68. PLA$ ^; @7 P" ?( J
  69. STA MAPPER_REG_BANK_DATA
    # L. V) z' x% t* C3 X( }6 `4 ^
  70. .ENDM) P1 c% y5 d3 P/ {3 m

  71. 9 ]5 a( n& w/ c& ]1 }' {; P
  72. MACRO_SWITCH_BANK_A000_A .MACRO, U/ R( L3 _: E
  73. PHA! C- O; X  f2 {& G7 f4 |# H
  74. LDA #$07
    , H! s" [" V, g- \
  75. STA MAPPER_REG_BANK_CTRL9 c: o& h* v% J" |1 s- m
  76. PLA
    + O' q" X/ s; ]% B* M
  77. STA MAPPER_REG_BANK_DATA
    3 Y* U* a1 x% _$ i* x: F
  78. .ENDM
    ; ]; i" [* r/ c; M& `5 V; R
  79. : V0 G1 F8 z, T2 U7 H3 @: g6 ]
  80. MACRO_SWITCH_BANK_C000_A .MACRO/ w5 r/ Z- U. ?$ x9 C/ p+ `
  81. .ENDM
    " g2 [: y4 Q/ a, c5 t0 P
  82. 5 C/ D2 Z/ V- a/ T6 [
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    ' r, L" F) S" ?
  84. .ENDM5 @  b0 X6 r+ E3 }4 y7 x
  85. % v0 ]' b& U6 L+ \4 x
  86. ;====================================================================================================
    1 e7 f8 w. y& M% l/ I' G* Z9 O9 h$ k
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO  a4 L! i  y$ s; j7 i
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    . P5 |) B% t4 d( _2 t
  89. STA MAPPER_REG_IRQ_LATCH
    / o3 P8 q5 t( W) G
  90. STA MAPPER_REG_IRQ_RELOAD2 j) o8 S5 |$ v
  91. STA MAPPER_REG_IRQ_ENABLE; }6 O7 B# `$ u0 G- J4 e5 I3 `
  92. CLI. G. I7 |% l. @! A
  93. .ENDM
    4 @; j# m0 X) j  C8 B
  94. ; Q: @2 Q+ u# ^: U& ?. K. m2 c
  95. ;====================================================================================================  T7 v, v3 W+ S; S( E
  96. MACRO_ENABLE_IRQ  .MACRO9 F6 k7 Y9 _6 H0 _+ k! P' P8 l( [
  97. STA MAPPER_REG_IRQ_ENABLE9 [. |' S3 U( [+ s
  98. .ENDM5 d4 Q) `8 g6 i/ ^
  99. ; m9 W+ Q& t" C2 Q. C
  100. ;====================================================================================================  E/ X% F' A0 Z5 c# q% H6 i
  101. MACRO_DISABLE_IRQ  .MACRO
    5 |2 [. ?0 Z: d/ T% ^5 I
  102. LDA #$00% H% d: X0 {+ G6 T; Q/ w6 s
  103. STA MAPPER_REG_IRQ_CTRL! I' i! x4 Y) V* ^' q( u
  104. STA MAPPER_REG_IRQ_ACK
    : l5 K4 e) P8 D, N, _8 e3 a6 C% m/ {
  105. .ENDM
    7 v( D" W5 g" W: y1 S6 S* n

  106. ) \7 f- p  g4 p" B
  107. ;====================================================================================================8 f) R9 |. O) f0 ^  a
  108. MACRO_ACK_IRQ .MACRO" e% _1 o" E+ V1 c0 y% S% r9 _% L
  109. STA MAPPER_REG_IRQ_DISABLE2 y. F' g. t+ [7 R4 r
  110. STA MAPPER_REG_IRQ_ENABLE
    * C* H* \4 X# i* t) N
  111. .ENDM
    # u8 m& P1 q& T# A$ ?

  112. / E/ ^* A; F% Z* m1 i* a
  113. ;====================================================================================================5 F/ z( M' g! F0 i
  114. MACRO_IRQ_OPERATE   .MACRO
    6 Q& Z0 P. [7 c& z& b& Y, }3 Z

  115. ! N" x7 J3 U1 f
  116. ;==================================================& W$ U3 [4 [1 _" o4 g
  117. ;IRQ滚动模式常量
    " S( T) c' Z0 Q( i
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动
    6 h6 H4 P. B7 M8 t9 ?  W$ }* E7 {
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    5 A" D6 B# [7 f$ M" Q: W
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    # w& g# {& y% J6 o

  121.   n6 j, Z" ]0 |$ l9 i/ q; x
  122. ;IRQ扫描线数据
    , M* g: {5 K9 W( L& b3 y5 A2 T
  123. IRQ_Scanline_Data
    8 U( _4 m: Z6 z
  124. .DB IRQ_SCANLINE_1+ {+ O5 \* C, }  }6 E, w
  125. .DB IRQ_SCANLINE_2
    1 }' T& k6 u9 p  y! s8 m, Q- A: e
  126. .DB IRQ_SCANLINE_3  D" q+ R: H, ^" N
  127. .DW 00 ;关闭IRQ
    " E0 Y1 ]% W# V  X3 ^# t$ B4 K9 r
  128. / E. E2 I/ q6 {- a# G" f) l# {
  129. ;IRQ滚动控制模式3 P8 O4 Q4 Y1 ]
  130. IRQ_Scanline_Mode
    9 s0 r0 @$ ?+ s
  131. .DB IRQ_SCROLL_MODE_RIGHT
    " _& s! S- \9 G- d0 I1 U7 a
  132. .DB IRQ_SCROLL_MODE_LEFT5 j. Q6 G, w) r5 Y" v! E
  133. .DB IRQ_SCROLL_MODE_RIGHT9 P. b$ J2 b. E9 c5 \; L, E
  134. .DB IRQ_SCROLL_MODE_LEFT/ w) K- d" h! @. W9 f6 X
  135. , L/ [& s) U) {: E) ]
  136. ;==================================================
    4 J0 j' g! h) }: D& e0 {" q9 k
  137. ;;IRQ滚动控制+ f6 h- W; i- M' }5 E
  138. IRQ_Set_Scroll6 C# c/ P8 g6 ?/ n! c9 J
  139. LDX IRQ_Process_Index
    9 `, H4 X$ T- v2 M/ E$ Q$ t' ^
  140. LDA IRQ_Scanline_Mode,X
    ) H! L) u3 X) [1 j$ q
  141. CMP #IRQ_SCROLL_MODE_LEFT: x- U, W% @1 R% k4 `! [
  142. BEQ IRQ_Set_Scroll_Left
    0 N7 J5 l, a% g3 [3 W' Y
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    / f8 r& ?2 u) r2 G$ o3 ~$ f
  144. BEQ IRQ_Set_Scroll_Right
    2 Y, W5 I: g" j' d7 E: ?- R7 c
  145. IRQ_Set_Scroll_Zero;不滚动
    0 y5 z9 p' A& k# K6 X
  146. LDA #$00
    9 [, j+ g, X9 \. ^% y& h
  147. STA PPU_SCROLL. x: O: L7 P/ c# E% V
  148. STA PPU_SCROLL$ v, w; T! O5 S4 Q" e1 W& a8 m1 O. c
  149. RTS& n  ~7 [$ W& N1 [) X9 T+ b! u
  150. IRQ_Set_Scroll_Left;向左滚动
    ' W8 n9 X! b& Y/ n* N
  151. LDA Scroll_H$ X1 M2 @0 z  Y1 r3 T
  152. STA PPU_SCROLL
    " g0 n/ |/ p2 P+ I& d# j3 X  C
  153. STA PPU_SCROLL7 P3 X5 N$ f3 Y$ ?+ V) k, I% J: B4 c
  154. RTS
    . d8 \2 ~3 N  l, z6 N0 I8 Z0 L
  155. IRQ_Set_Scroll_Right;向右滚动% i; l$ P! Z: X& |; }
  156. LDA #$00
    % V* Z# ]: @( z. {4 ~# M
  157. SEC
    + Q; L9 _5 D8 S4 \' U1 B8 ?9 b8 r
  158. SBC Scroll_H' l& v. G1 O6 I/ Y
  159. STA PPU_SCROLL
    + U# \1 t5 f  w+ V
  160. STA PPU_SCROLL
    6 G* w$ q7 S  L) j
  161. RTS  [) P) E* h4 ?' O! g; s* d" P
  162. 6 c/ d) E# n: H8 _. k+ z4 f
  163. ;==================================================$ p" }; h  H' O6 M$ [
  164. ;;IRQ滚动控制
    / h9 Y7 Y9 O) T  y. a4 Y
  165. IRQ_Set_Ctrl
    . c+ T9 q# B: }  |
  166. LDX IRQ_Process_Index
    6 K% Q2 w" e/ D. d2 U1 F
  167. LDA IRQ_Scanline_Data,X
    7 {1 f% s" Y* F0 X0 }) _. B
  168. BNE IRQ_Process_Latch
    . }6 U. D* Y! H& ]. l
  169. IRQ_Process_Disable;禁用IRQ0 X2 j  X' [2 a, I9 l! P
  170. STA MAPPER_REG_IRQ_DISABLE: _2 q  c. _3 Q, ^0 d
  171. STA IRQ_Process_Index
    2 X) K% U. o! I  A8 ^3 w) A# g
  172. RTS
    ! S6 n0 T+ w0 q9 h; u# }
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线
    8 n6 l, t( u. x; n8 g' S
  174. STA MAPPER_REG_IRQ_LATCH
    / G1 F( x. r8 l" \% W  X* B
  175. INC IRQ_Process_Index
    ; |" n8 c& S5 q
  176. RTS# }- @+ V8 L! |, X' [

  177.   N. \) ?& B% W# p; [
  178. ;==================================================
    5 l- Y7 D1 y6 H2 b) W
  179. ;IRQ处理6 ^5 ~/ H/ J! v" \: }
  180. IRQ_Process_By_Index; c9 a$ O( b: I2 X7 v; g
  181. JSR IRQ_Set_Scroll7 X' ]( U% z- d: ?
  182. JSR IRQ_Set_Ctrl* N2 ~4 E- B0 I- _2 y
  183. IRQ_Process_End
    / N8 p& b+ `8 o5 U2 X; Z4 r
  184. RTS
    8 s/ y" p6 p" @
  185. ! y2 g- J, H' y# D7 G
  186. .ENDM
    & f+ ]3 h  `. Z, [

  187. 4 n5 [& f- k" w0 m
复制代码

+ B8 x7 y6 w7 w/ X% Y; e
+ y- M% p; \, u0 B6 {9 Q5 Z代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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