EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑 & ?) c# a# H, X/ e
1 |+ [0 P5 s% O5 H* \  ]/ f
本次IRQ研究了如下:2 F5 @; g* U4 S- F  S& o0 a  ?; m
VRC2&4(Mapper21,23,25)
* Y7 I$ o$ d7 F9 }+ s* ~; u, rVRC3(Mapper73)( A( m3 ~: T: F2 t  w
VRC6(Mapper24 & Mapper26)) b( k# B( O: K( ~% o" @! ^  _
VRC7(Mapper85)
% u# X2 R7 N# l0 e: f9 D  I) z6 yMMC3(Mapper4)
% k- U9 w& n! g, fMMC4(Mapper10)
! M% P4 {1 Q5 r$ FMMC5(Mapper5)
6 v2 _. y1 w6 g. m* eMapper18
/ B: o3 c" a. f3 V5 `( oMapper641 f5 \8 H1 B& O7 |7 ^
Namco163(Mapper19)
+ C; c( P+ H% U! d6 iSunsoft FME-7(Mapper69)
  \8 P/ u2 B# Q( z( J" C  h
9 _5 L) s; K: P共计11种Mapper的IRQ操作使用例子; e3 K0 M3 c9 H8 g7 b1 n# t( R
代码内有详细注释, 希望能帮助到感兴趣的人.
( \2 u( r" X/ s+ A
( M* `7 O8 \8 ^# d) F6 K5 o: S7 ?; F+ M2 [

2 {) ^2 U( f$ N) Z+ BMapper代码主要逻辑(以MMC3为例):
4 i8 [; u! d* b' k5 E4 z3 X
  1. * z8 o$ J4 V- |
  2. ;==================================================
    ( B! g2 ^# F6 D' P1 s% ^" C/ R
  3. ;Mapper号. i- d5 d( \& |3 o7 u" e7 K
  4. MAPPER_NUMBER           = 04( H+ Z7 }6 L& b: S" l/ |4 F% y7 J
  5. ;==================================================7 y; k- j% {7 Y" q, K
  6. ;MMC3 (Mapper 4) 寄存器常量
    : \/ ?. P5 \+ b- O
  7. MAPPER_REG_BANK_CTRL        =   $8000- h$ T3 u3 U( R' V
  8. MAPPER_REG_BANK_DATA        =   $8001
    - ^* a. K/ H: v2 e; f- v7 N
  9. MAPPER_REG_MIRRORING        =   $A0007 W/ `3 c3 f8 _" T3 T* Z
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001
    3 @! a& U' [; H& U
  11. MAPPER_REG_IRQ_LATCH        =   $C0003 b! S4 Y& V  f# U/ a2 n( I
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    - N) V* h4 t' }/ j+ I; ~% E6 {; x
  13. MAPPER_REG_IRQ_DISABLE      =   $E000& R, M1 p4 R- M3 ?$ L  w0 K
  14. MAPPER_REG_IRQ_ENABLE       =   $E001! i$ ]3 }: V5 P* J- Q: d  y1 C5 [
  15. ;==================================================' g4 M+ F8 a& E2 ^" M9 }4 n
  16. IRQ_SCANLINE_BEGIN          = 135
      t- H) j8 v. c/ `% }( V6 t
  17. IRQ_SCANLINE_1              = 8& E4 r, a! Z- K( S: E5 e& Q0 O6 n5 p
  18. IRQ_SCANLINE_2              = 54
    7 ~) x2 @0 K1 u( o' O. K; a
  19. IRQ_SCANLINE_3              = 8( r. `3 |2 J! n2 V. F- Z' P
  20. ;==================================================8 J1 e+ b- N2 L* Q1 h
  21. 4 l3 G0 a' A% H: g' o7 s
  22. ;====================================================================================================) D0 T. ~' V, c# T' g  ~3 l
  23. ;宏常量
    9 ]  i% }. }) D- N
  24. ;====================================================================================================
    5 u- D1 Z8 U/ ]3 M0 W8 \. Y1 B5 d9 n

  25. ; F# _1 T: E1 e+ E
  26. ;====================================================================================================
    * |' S$ I9 _  h1 J+ M
  27. MACRO_MAPPER_INIT .MACRO! H' R' M2 @+ C
  28. ;禁用IRQ" C4 v6 T$ p1 {5 {" |% L
  29. STA MAPPER_REG_IRQ_DISABLE  m& `- I+ S3 C' I) X! x2 B
  30. 3 b! m- }* z( `  H
  31. ;水平镜像+ b8 \: T$ p! B3 ^. h- s6 E6 d3 y
  32. LDA #$01
    0 v  e0 O( _- ~+ U, P# T! }! b
  33. STA MAPPER_REG_MIRRORING
    6 {9 F/ D9 t: j( g  _

  34. , J- x& J$ S2 Q2 `! ?- m; r4 |
  35. ;初始化图形bank
    . B/ H; [' i& S1 g! r8 H! y+ Y
  36. LDX #$05( S8 {' n6 \' _2 h6 B
  37. .Init_Chr_Bank* A  P) a( N$ z/ {
  38. STX MAPPER_REG_BANK_CTRL5 @8 q1 S- y: Z$ g3 Y6 V
  39. LDA .ChrBankData,X/ u, L$ N2 m* j+ [  v" s, {1 n
  40. STA MAPPER_REG_BANK_DATA$ V; H$ u. h+ I( l
  41. DEX
    / d3 H2 i7 K. E
  42. BPL .Init_Chr_Bank
      s6 G  l# [- a8 G+ ~8 M
  43. JMP .Init_Chr_Bank_End1 s* E, D  `! o( s4 V) C5 ?+ X" ~
  44. .ChrBankData* `1 F9 M% T6 M- Z, y/ C! E/ d
  45. .DB $00,$02,$04,$05,$06,$07
    ; N  N0 O. L! W4 w. |! y
  46. .Init_Chr_Bank_End/ A* e' c3 t2 l% a% H1 Z: X
  47. + S; I2 k5 ~9 g8 h& l$ T
  48. ;启用SRAM0 z0 B+ l! E1 a& f9 y
  49. LDA #$80. a1 }+ s8 z! \# X* Q/ s
  50. STA MAPPER_REG_PRG_RAM_PROTECT5 ~6 f6 c5 S2 v/ _; ^: k
  51. .ENDM$ s0 c1 o! y2 _1 I
  52. # w2 [) w  @/ y- L1 r! t
  53. ;====================================================================================================
    . _4 F9 _' q/ F& D8 l
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO% |- N1 R, x+ W
  55. .ENDM
    + _0 j  T7 U+ _
  56. % Z' i4 m7 K. D2 N) j
  57. ;====================================================================================================- F5 q$ v# J) D! i- \+ L
  58. MACRO_SRAM_ENABLE .MACRO; S" D: _/ D1 Y- i
  59. LDA #$809 F3 ~8 C! L# D3 D$ d+ Y/ l
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    3 i! y* X1 g4 P+ P, N/ F
  61. .ENDM
    % k. H( Q5 A: d! M# i5 k  T
  62. ( ]0 y6 ]. m9 A' j- c5 R
  63. ;====================================================================================================3 U( ~% |% X- k% }+ z3 f
  64. MACRO_SWITCH_BANK_8000_A .MACRO
    ( N9 m- d  b  o5 u; o$ i' r6 r2 r
  65. PHA
    7 S; ~9 ^7 _" \; F" j- u7 z% c
  66. LDA #$06
    1 h- a4 s) B/ R7 Z
  67. STA MAPPER_REG_BANK_CTRL  g1 i" @2 T& i9 H, g% M
  68. PLA
    / i2 k# ]4 [9 o- I. [% a
  69. STA MAPPER_REG_BANK_DATA
    - P# u. B( j5 C% F! M
  70. .ENDM# r  p5 o: i8 K! n6 d

  71. : O2 c- n: u: a! l! \1 W: A
  72. MACRO_SWITCH_BANK_A000_A .MACRO
    ) v' ~7 J' V  P0 `2 i% e+ X. k
  73. PHA
    ! y: V! ]' @- ~. v! N' A
  74. LDA #$071 j6 X* P( g; N! j. Q/ Z
  75. STA MAPPER_REG_BANK_CTRL0 x5 e0 g( r$ U: J
  76. PLA$ b- H( o5 n7 }) L! P
  77. STA MAPPER_REG_BANK_DATA% y# m7 J+ S# F6 x0 ^7 B
  78. .ENDM3 _! s, R4 Z2 T' }: d
  79. 5 k1 f0 _5 ]) Z; e# o$ u
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    7 V, H& t5 N% p3 W, Y3 k
  81. .ENDM
      m* ]- P4 q* p  t/ D! t3 O
  82. " C! I' F6 Q) `" o* K
  83. MACRO_SWITCH_BANK_E000_A .MACRO9 N. q- `, u4 [: l$ P& I" h4 ^
  84. .ENDM
    " t3 i5 n, F: ?
  85. 7 b3 ~$ `1 X5 w- a! e0 U6 J6 O
  86. ;====================================================================================================
    : o9 h( j5 k/ R+ [
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO
    , u6 u# \7 S' {' O6 c
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    ! W4 M& z/ h7 W& G% q3 k! k
  89. STA MAPPER_REG_IRQ_LATCH* S# X& o: E9 H6 k. v
  90. STA MAPPER_REG_IRQ_RELOAD
    ' |+ A; \% ^& r
  91. STA MAPPER_REG_IRQ_ENABLE+ k/ e; w. N4 v4 _' x; J0 C
  92. CLI
    1 w9 X/ O; V: t8 P
  93. .ENDM$ r# v: F0 A' Y9 [# Q9 q5 p5 I' m9 g

  94. + E/ S& K! x5 y, a% E4 q3 X* E0 T
  95. ;====================================================================================================7 |) u2 R! M8 _
  96. MACRO_ENABLE_IRQ  .MACRO
    & i2 [( @" F( k6 A
  97. STA MAPPER_REG_IRQ_ENABLE- B6 B& k  R' G4 \
  98. .ENDM
    " A5 ~: r8 O) \  Y! ^4 _
  99. & u, j) b8 J7 K* ^! X' E- ~' M6 r
  100. ;====================================================================================================
    + v% K5 U7 b' X2 \# o
  101. MACRO_DISABLE_IRQ  .MACRO
    2 h/ N5 M% \3 W4 l" z( l3 _5 S) o
  102. LDA #$00. p( v7 l7 V% s9 y8 W
  103. STA MAPPER_REG_IRQ_CTRL
    ; T0 M5 W. e( W6 H8 O
  104. STA MAPPER_REG_IRQ_ACK7 O7 m( C2 t/ K4 c) A& ]2 s8 o
  105. .ENDM
    9 K5 T) v5 z0 P5 u" A9 h5 K$ m

  106.   a/ U! _2 _3 j! a) A% z& O9 b) d
  107. ;====================================================================================================# [" k. ^3 j" w  k( U
  108. MACRO_ACK_IRQ .MACRO
    , d2 z# f6 s5 X3 Z7 g
  109. STA MAPPER_REG_IRQ_DISABLE
    ( V) ]9 ?, R& b1 I
  110. STA MAPPER_REG_IRQ_ENABLE
    % v! W% D) t- v3 d% n# [, q
  111. .ENDM1 U8 }" _0 |9 C9 ~; x

  112. 0 U  J+ X, [( E- Z; p
  113. ;====================================================================================================
    - c/ v; O$ F- z# _/ E2 q/ S
  114. MACRO_IRQ_OPERATE   .MACRO
    7 D5 F8 V0 _9 {

  115. ) i( s" b! p- ?- T9 y
  116. ;==================================================
    " Q7 Y& h8 ]7 H
  117. ;IRQ滚动模式常量
    9 x; Q4 Z" o8 ^3 y& s% o
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动5 h( J$ o" c% v' l
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    3 e3 y+ D$ h4 [6 n$ o
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    3 D& n  a7 \/ g: c- U0 `; F( V
  121. & p4 `& e3 {* @8 O# Y; z" J
  122. ;IRQ扫描线数据! z9 {5 P, c7 m0 H" ?
  123. IRQ_Scanline_Data
    3 g( H3 a6 \3 n, m
  124. .DB IRQ_SCANLINE_1$ S5 y  a) M+ C' F$ m4 A9 i; ^$ a
  125. .DB IRQ_SCANLINE_2- f4 I& u* d1 W- U3 `0 a
  126. .DB IRQ_SCANLINE_33 X) c' K9 W" ~! _
  127. .DW 00 ;关闭IRQ5 J7 Q8 @6 Z4 s; O  w& w8 L; n; p- _

  128. 7 Q! L4 k8 D! m' V3 l
  129. ;IRQ滚动控制模式
    9 v% I1 A# P# y9 G
  130. IRQ_Scanline_Mode
    6 r* j2 t3 w3 w  k! Z! o; R7 }. W6 U
  131. .DB IRQ_SCROLL_MODE_RIGHT
    & @. m; B0 y( V- S1 f3 \
  132. .DB IRQ_SCROLL_MODE_LEFT/ U& {- m9 w: I% n
  133. .DB IRQ_SCROLL_MODE_RIGHT" \9 r1 L% x, ?' B; b- R
  134. .DB IRQ_SCROLL_MODE_LEFT' j7 S# X* d9 D& h# Y/ J
  135. $ ~# Q6 a! f3 l: |
  136. ;==================================================9 U' ^8 O* [: W, v8 i/ a
  137. ;;IRQ滚动控制0 l! N8 o7 B6 q3 s2 e4 v
  138. IRQ_Set_Scroll
    / e: ^4 d8 G9 R% d5 d1 I5 K
  139. LDX IRQ_Process_Index9 B" g3 s+ V2 d% I
  140. LDA IRQ_Scanline_Mode,X: r$ T# W$ o- D
  141. CMP #IRQ_SCROLL_MODE_LEFT
      Y4 F2 u3 T+ v: ?  N- J" u
  142. BEQ IRQ_Set_Scroll_Left8 Y- ?& Y! A& f* n5 U( M
  143. CMP #IRQ_SCROLL_MODE_RIGHT) [* J/ A0 y7 W+ c' [: f) Z2 g
  144. BEQ IRQ_Set_Scroll_Right
    * q( ^4 X! w; n5 K, ~& N3 C( r0 m0 R
  145. IRQ_Set_Scroll_Zero;不滚动+ {$ Y3 k, I4 {" Q# M, r- g
  146. LDA #$006 _9 o, j/ G- k1 y& U1 c. b; ^
  147. STA PPU_SCROLL5 ~. ~9 Y* [" G% r6 u, v
  148. STA PPU_SCROLL# ^  q" w+ B/ U' [/ j. S2 {" @
  149. RTS
    ) {; w: _& V" c: m7 K6 A& X
  150. IRQ_Set_Scroll_Left;向左滚动9 q7 F. l, I" B8 ]& Z8 T4 x' ~: \
  151. LDA Scroll_H0 I' }5 Z  m# x
  152. STA PPU_SCROLL
    7 Z! U8 r; b5 V1 X' A
  153. STA PPU_SCROLL2 V' a3 X6 N6 B; S) N  n% o
  154. RTS" ~( ]7 M4 Q6 `) H, j8 |
  155. IRQ_Set_Scroll_Right;向右滚动, ]. U: I" v( l% p
  156. LDA #$009 T3 A' N# b/ O
  157. SEC+ x: H: X  d: {# k3 e  o( v
  158. SBC Scroll_H
    6 S; n& l1 N3 U5 Z
  159. STA PPU_SCROLL( [* c. j$ i! Y  Y: V) _1 \
  160. STA PPU_SCROLL( h7 U7 q9 L) R7 w+ ^- r
  161. RTS, W" w7 \$ _; q7 v8 a7 }! r

  162. # _6 a( }) d# R( }' K6 @
  163. ;==================================================
    0 S1 R* Z/ O4 K
  164. ;;IRQ滚动控制( g0 z9 X( M  f% k2 V+ e. N
  165. IRQ_Set_Ctrl
    5 o, w' K( _* x; `8 j# ?  d0 V- j
  166. LDX IRQ_Process_Index" C1 B0 G; l! z0 R% r8 Z6 @# p/ p8 U( Q
  167. LDA IRQ_Scanline_Data,X
    3 t! `) X5 ]$ _" Z
  168. BNE IRQ_Process_Latch* u& I' D) k' K* j, Z- V" d0 n
  169. IRQ_Process_Disable;禁用IRQ
      e* K4 R+ L% M  t
  170. STA MAPPER_REG_IRQ_DISABLE
    & e4 Z; n* c' l# w
  171. STA IRQ_Process_Index5 ]/ e2 K* f  r  l" t( T
  172. RTS
    1 w9 V' R* J8 p
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线* B# e' i1 t6 Z% |
  174. STA MAPPER_REG_IRQ_LATCH
    ! [2 }9 m6 b6 d- }5 \/ J) H
  175. INC IRQ_Process_Index
    , z" o/ `8 I! m# k8 [
  176. RTS
    ' g7 s3 g6 Y0 D1 u
  177. + [4 F8 x# S  A' n( Y
  178. ;==================================================
    2 m; n# o1 k: A
  179. ;IRQ处理
    & i6 ]) b$ k% U7 V
  180. IRQ_Process_By_Index
    + _) R5 C+ E' x4 k
  181. JSR IRQ_Set_Scroll
    # P& U3 ]7 L* a
  182. JSR IRQ_Set_Ctrl
    . e+ H6 |, V0 E% z3 s& T" z
  183. IRQ_Process_End! y* N& V4 A1 Y& r! Y
  184. RTS1 |: _) H0 C% o: D8 B  e
  185. . J7 b6 X& ~" L5 f* {" ~
  186. .ENDM1 O3 i* j+ B% |1 U- V8 e, o
  187. ( ]' T$ ~) y7 K0 y, h5 s
复制代码

  i' d5 ~7 d: v  x, O9 {2 G$ u( y
& ^9 H1 M: O5 C代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-4 19:55 , Processed in 1.078125 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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