设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑
: C3 L* |' w* D$ s5 H1 K2 a
& q, S* u3 U' i本次IRQ研究了如下:
  v7 J( Q9 E! o& k: {5 a8 \VRC2&4(Mapper21,23,25)+ r/ T( B) V  M0 r- z' H
VRC3(Mapper73)2 {4 {4 W7 a& T& M0 h  H5 B7 F3 Q" ?
VRC6(Mapper24 & Mapper26)/ C) l3 G$ p1 [9 d* t$ |6 l) e
VRC7(Mapper85)
5 J$ @9 C3 W2 D. D. Q$ y: gMMC3(Mapper4)
, A. D( d1 \' S3 a4 X) OMMC4(Mapper10)6 ~$ k' R! s4 D$ m7 b
MMC5(Mapper5)
& @  e& V: _2 \: Y) a( jMapper18: \* w5 M+ D- U/ B+ ?; G
Mapper64
& z# Q0 d( c4 D( |. cNamco163(Mapper19)
, @8 Z& Y# C% v9 ^Sunsoft FME-7(Mapper69)
, o4 r8 |" x( X8 S4 x, W4 ^: X/ E, _
. @' A' i8 Z, {- K0 ]4 y共计11种Mapper的IRQ操作使用例子
  \: Z* u- R+ ~代码内有详细注释, 希望能帮助到感兴趣的人.; H7 S* E# `4 H1 I7 b% k+ m& K
. i2 L0 c1 }8 @5 q% V6 |7 m5 j

* C, r- }" ]5 A5 W* ]( D! C: P! b1 s; P" d% m6 G- i6 V
Mapper代码主要逻辑(以MMC3为例):+ [0 W) r2 Q  Q4 W

  1. * A' x4 L7 q7 y- Y) }9 ]' I; o
  2. ;==================================================# z2 D6 J+ G0 o9 F4 M' M
  3. ;Mapper号4 k1 w% I1 Y1 D3 ^$ H( p2 X
  4. MAPPER_NUMBER           = 047 L6 p: _3 L4 |/ Y% j
  5. ;==================================================- C3 ?! u/ b9 m$ J
  6. ;MMC3 (Mapper 4) 寄存器常量$ F5 }5 ~5 ~) e% w0 K2 I
  7. MAPPER_REG_BANK_CTRL        =   $8000
      O3 o! g4 G  {, \
  8. MAPPER_REG_BANK_DATA        =   $8001* d2 r) @. s4 d& u
  9. MAPPER_REG_MIRRORING        =   $A000
    1 \8 L; Z! ?$ k- [2 F
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A0012 k9 U5 f; S+ r$ |3 X1 ~$ p
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    + ^3 H5 @3 n$ @
  12. MAPPER_REG_IRQ_RELOAD       =   $C001
    5 d* G6 I: _* V/ d
  13. MAPPER_REG_IRQ_DISABLE      =   $E000
    " N% B0 k' J- [4 p" m( e: G! ]8 a
  14. MAPPER_REG_IRQ_ENABLE       =   $E001) E# g; H9 e  ^* `3 L& _1 i) K
  15. ;==================================================- {! [, L, J( H
  16. IRQ_SCANLINE_BEGIN          = 135
    % p/ B) d  X% |/ p% s5 ?$ {/ P
  17. IRQ_SCANLINE_1              = 8
    4 M" `6 b6 t- m5 |7 v7 K' n
  18. IRQ_SCANLINE_2              = 54$ R- p4 ?" r3 v; }9 M/ L2 s' `4 i% q: f
  19. IRQ_SCANLINE_3              = 8
    / h8 r2 w: M) U5 ?: v) T
  20. ;==================================================
    ( S+ S: _  F; p& s

  21. * C4 {# K6 |9 O1 Z, R! d- J% ~
  22. ;====================================================================================================; s' h. ?! ~4 ~. |8 b6 E2 n& r
  23. ;宏常量# k9 F. J( U0 c1 X5 Y
  24. ;====================================================================================================
    * X( S7 U; O" C$ a; s2 c0 x

  25. * i7 O; g" c; t" k4 z- x
  26. ;====================================================================================================
    5 q7 t5 a+ z% e0 `7 V
  27. MACRO_MAPPER_INIT .MACRO
    7 r* X3 g/ d: j& _" u+ o/ `7 J
  28. ;禁用IRQ7 w7 \% m/ }3 X0 L3 m6 s
  29. STA MAPPER_REG_IRQ_DISABLE
    / G6 E* d! Q4 `% D

  30. & E8 y( i# A, B1 n8 O$ W
  31. ;水平镜像
    $ k( |9 c9 E" @0 I
  32. LDA #$01
    / `( _% t( f% f$ ~
  33. STA MAPPER_REG_MIRRORING
    . t4 S2 N' _( t6 @3 U) n( I3 l
  34. & X" ]/ t# Q$ i# I6 \0 U( _/ O, L
  35. ;初始化图形bank2 n# g4 M% F" Y3 e( R
  36. LDX #$05; B1 G% F! ^5 [' j  o
  37. .Init_Chr_Bank) i" e( u; e; e  j6 @: K
  38. STX MAPPER_REG_BANK_CTRL. c% `5 W; y# `' V, |
  39. LDA .ChrBankData,X  E( q. F# x" k; Q$ }1 g2 |# y& b9 L
  40. STA MAPPER_REG_BANK_DATA
    8 F/ y  i  J& `& j8 M
  41. DEX
    8 Q) N# ?0 e7 o3 r/ i
  42. BPL .Init_Chr_Bank4 a; \$ m) M7 d
  43. JMP .Init_Chr_Bank_End
    3 K# f) c. E$ I
  44. .ChrBankData
    5 h- K- Q: G3 @% G
  45. .DB $00,$02,$04,$05,$06,$07
    / e4 g- o2 m( x! j
  46. .Init_Chr_Bank_End
    1 I( D$ m, \! o$ w+ a+ {
  47. 4 l9 S+ F4 \2 ?7 n
  48. ;启用SRAM: l& u3 D' s& o; B
  49. LDA #$80$ w3 f: \0 N: M3 w% l1 p
  50. STA MAPPER_REG_PRG_RAM_PROTECT
    . t6 A' |; }% ~) a# z/ a
  51. .ENDM
    5 G3 _( S) F/ ~9 y4 l

  52. - [% p6 z! y8 j, |+ d- u, ?
  53. ;====================================================================================================# e3 v4 p- J# F' |" M, i& I
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO
    ' e) a% a8 B- u' w% S
  55. .ENDM6 x4 ^- G) O6 q) o$ ~: n5 Z1 ~

  56. & T' }. F% L  b+ M, O* n) @8 b& M
  57. ;====================================================================================================5 W; u3 ^5 Y1 d9 g3 ^( h
  58. MACRO_SRAM_ENABLE .MACRO
    $ m1 T' O0 O  U! D& H* `
  59. LDA #$801 f9 r& S0 K4 k) R: k
  60. STA MAPPER_REG_PRG_RAM_PROTECT  m. m  ~! L3 T
  61. .ENDM! w( A* P" ^7 _3 b5 a# F5 [
  62. ( K) n" a! W2 N- `* [
  63. ;====================================================================================================* f  T" R: ~' J; p: W' v
  64. MACRO_SWITCH_BANK_8000_A .MACRO$ q/ a5 Y0 ]+ j* e% U  S; Z
  65. PHA
    % b$ Z) w; W* [; |7 F8 s% n0 a* t3 }
  66. LDA #$065 y6 L4 f" M7 }  A
  67. STA MAPPER_REG_BANK_CTRL- I& m2 {5 h) U# r3 n
  68. PLA4 H  W( y4 o6 b! q  R# h6 ?
  69. STA MAPPER_REG_BANK_DATA; \- N1 Q+ i% K/ r9 F: F
  70. .ENDM6 q7 u9 S" I3 r& N4 q+ Z

  71. & H7 w5 Z5 o: Q; V0 p& P
  72. MACRO_SWITCH_BANK_A000_A .MACRO. X* P% b3 S: O3 Y- `+ P& \% ~
  73. PHA0 R2 e1 Q* D# L& Z
  74. LDA #$077 f! @8 ^* [: o7 h
  75. STA MAPPER_REG_BANK_CTRL/ y5 n3 C  r  p
  76. PLA
    4 [! j7 ]( R7 ?7 p' a. I, C- [7 T
  77. STA MAPPER_REG_BANK_DATA
    1 Z) o1 B; ?3 U! W, i
  78. .ENDM
    % q" k( O& y% E6 K2 G

  79. ! d/ V  f4 Y4 ]5 a6 R
  80. MACRO_SWITCH_BANK_C000_A .MACRO
    5 \$ }; B; M; a* B! j. r3 s
  81. .ENDM
    6 D% c6 m6 G* d9 C7 B1 h

  82. 8 `* `& n7 U- T8 q' x% ?4 }
  83. MACRO_SWITCH_BANK_E000_A .MACRO
    ' V1 K( M  F3 V6 B  ~$ x3 r0 O
  84. .ENDM  J6 s  ]* r; @2 \3 B
  85. 4 K" R' L# p6 }7 z+ [
  86. ;====================================================================================================
    3 b9 O; q; a1 N
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO& d& m, \" D) d% _# D
  88. LDA #IRQ_SCANLINE_BEGIN + 18 \! v/ ^2 k  p/ S: j0 \0 A
  89. STA MAPPER_REG_IRQ_LATCH
    3 a+ b- i1 r, |* y
  90. STA MAPPER_REG_IRQ_RELOAD8 b5 w2 ]# m+ K- u
  91. STA MAPPER_REG_IRQ_ENABLE
    9 h" K. a9 a3 k$ M5 A
  92. CLI$ Z- o0 x- v0 I% ?7 t- }. {
  93. .ENDM; o) L8 B# R2 r% D5 q5 }; L

  94. + E& p" k" C1 h; I; G1 h# T
  95. ;====================================================================================================
    5 J' V5 d3 `. Q
  96. MACRO_ENABLE_IRQ  .MACRO
    $ w' ]% o$ R% k6 `9 M+ x
  97. STA MAPPER_REG_IRQ_ENABLE
    ) `' B' J0 l) i9 \
  98. .ENDM* X" m7 H# \% e; N# T
  99. ! D. M, c! @6 I6 A) |
  100. ;====================================================================================================
    . I! t" O8 I$ L8 `; U' Y! C
  101. MACRO_DISABLE_IRQ  .MACRO" {5 r( ~' G2 p0 M
  102. LDA #$00
    - t9 z8 _" F5 \' b
  103. STA MAPPER_REG_IRQ_CTRL
    # T# z9 e3 e9 _$ T$ S. G2 y
  104. STA MAPPER_REG_IRQ_ACK) G1 t6 ^5 `+ ?, I% Y
  105. .ENDM
    3 {; [! W1 j3 N; y) R, K  }
  106. 5 e/ K# T, D) c8 c4 Y$ @' H
  107. ;====================================================================================================
    2 D* f1 s. w. ~, D7 |& m
  108. MACRO_ACK_IRQ .MACRO
    ! Q+ M! k+ B+ i2 g* C7 ]& m
  109. STA MAPPER_REG_IRQ_DISABLE
    * E' H8 I; I- {" T/ a' v% T$ J& {
  110. STA MAPPER_REG_IRQ_ENABLE1 k" V: Y+ O$ o" F5 q
  111. .ENDM) V/ F* d# {; z( J: Y

  112. + T1 v9 F5 t: a- f+ |: h
  113. ;====================================================================================================
      F1 A* a$ V3 N8 ^, z. D
  114. MACRO_IRQ_OPERATE   .MACRO
    9 U; Q* V. H0 @( k* X0 N5 q0 W' ^
  115. 8 T+ ?1 G/ F$ }# b
  116. ;==================================================
    7 M  d1 \9 B  ?, h0 ~) t0 c
  117. ;IRQ滚动模式常量% v4 V& d$ D$ y5 b
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动! h# n3 `/ y: C1 F
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动
    8 m) J# u. s3 b) k' z# n
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    % j- u& V4 |5 _. a% R/ B: q1 c. ^
  121. & K% b% Q# y, P1 c$ k9 b
  122. ;IRQ扫描线数据
    + S2 N6 y6 W- @! y8 _7 C
  123. IRQ_Scanline_Data
    $ H/ b& w+ i7 d' @$ w  V
  124. .DB IRQ_SCANLINE_16 h" {' v8 G' B( o
  125. .DB IRQ_SCANLINE_20 `( V* r$ g% O. @1 y9 g' r0 c: B% |
  126. .DB IRQ_SCANLINE_3
    ) l, H) L+ o  M4 W  K) s) g
  127. .DW 00 ;关闭IRQ
    + H' F! X# R/ b& ?( H
  128. ' a, H7 F: o# |* M- h
  129. ;IRQ滚动控制模式3 I, }) s/ M& |# h8 @
  130. IRQ_Scanline_Mode7 ]4 O4 \  f4 C
  131. .DB IRQ_SCROLL_MODE_RIGHT$ q4 O9 R  `9 U1 d$ E/ L
  132. .DB IRQ_SCROLL_MODE_LEFT* E* L* L# E; z2 `% E
  133. .DB IRQ_SCROLL_MODE_RIGHT
    ! \  ]  J) O, \
  134. .DB IRQ_SCROLL_MODE_LEFT; m9 i  ?0 u! N
  135. 5 u$ y4 s+ z5 n9 H; x9 t! g3 ^
  136. ;==================================================: s/ s; a" r, v" E' A7 a
  137. ;;IRQ滚动控制5 }3 U" j- @/ C2 f* I6 Q
  138. IRQ_Set_Scroll8 q  y1 N+ {# d7 L
  139. LDX IRQ_Process_Index- C0 b; D6 d, O! ^, \. n( J
  140. LDA IRQ_Scanline_Mode,X
    4 e  x: m: U8 j1 |
  141. CMP #IRQ_SCROLL_MODE_LEFT
    1 J/ F. M  N% t# w" v
  142. BEQ IRQ_Set_Scroll_Left" P# V) F7 ?& j5 _( G; H
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ; W- P/ b! m' |8 N" v
  144. BEQ IRQ_Set_Scroll_Right5 K$ S9 K; x1 ?; i! l
  145. IRQ_Set_Scroll_Zero;不滚动8 W3 ^& b) }! o1 [0 q1 @
  146. LDA #$00* Q9 F8 _, C+ m  g% j, K7 e
  147. STA PPU_SCROLL
    : Q" t% D5 m1 N  g  o! F
  148. STA PPU_SCROLL
    : |* Z  F% Z0 ^4 e5 v& A: S  X
  149. RTS! e' L, M/ d% }7 A
  150. IRQ_Set_Scroll_Left;向左滚动$ Q3 d+ {( B3 [3 W* P
  151. LDA Scroll_H- F2 a* m) e( x
  152. STA PPU_SCROLL
    + ]2 S" r- J3 t8 X% c+ s8 D, v$ E" Q
  153. STA PPU_SCROLL
    : `$ l7 x1 a7 y: @4 Y
  154. RTS
    1 w) a! h; Z9 u' T
  155. IRQ_Set_Scroll_Right;向右滚动
    ! Q) q1 }% o8 z' g
  156. LDA #$00
    2 t3 z; g' j& R. Y# V
  157. SEC
    2 Y/ {$ [& D" O2 d- G
  158. SBC Scroll_H1 W# ^" r8 p8 L# v$ E
  159. STA PPU_SCROLL, [, Q' O. p* {
  160. STA PPU_SCROLL3 Q. g5 X" y. G& ^1 l8 O
  161. RTS( f% D% E4 G, R% m! j* [- _3 }

  162. # o* a1 b" G" i9 c& S2 T5 F5 O
  163. ;==================================================' a- R) W# ]* ?( x5 j# [3 Y  _
  164. ;;IRQ滚动控制
    : G3 _! a* B0 @) T8 W3 w
  165. IRQ_Set_Ctrl/ U( m/ e, z, R% V2 y0 k8 `8 |, y
  166. LDX IRQ_Process_Index, j+ `2 `& H3 y* G6 }
  167. LDA IRQ_Scanline_Data,X
    ' F5 S7 N. `9 t$ g# n. W# w
  168. BNE IRQ_Process_Latch
    - H' C. E# y, _3 [4 r* b; `& c( c# g
  169. IRQ_Process_Disable;禁用IRQ
    3 e% U, z, |! I- F. d% k
  170. STA MAPPER_REG_IRQ_DISABLE6 F1 f9 \* X: F: _" A, Q; y( D+ x
  171. STA IRQ_Process_Index
    " L9 K0 F2 X9 `3 E
  172. RTS" c( I& U; u3 B: [# T
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线0 }! g5 \3 T, `! j* ^5 n
  174. STA MAPPER_REG_IRQ_LATCH
    & ?  |5 p. c/ c' b- O5 b* j
  175. INC IRQ_Process_Index
    $ H$ @. d: k" y' t$ F& e
  176. RTS/ ~( Y* H9 q7 V  d8 D( i
  177. ) l3 S4 E* a1 k; T" J
  178. ;==================================================
    9 Q+ a3 I* {3 j  A! W. b" C
  179. ;IRQ处理
    9 }5 Q" t2 v* x; E/ D
  180. IRQ_Process_By_Index! J* V& q6 w* Z+ }3 Z) v
  181. JSR IRQ_Set_Scroll4 u! }- n2 t: P6 g5 U# Y+ V
  182. JSR IRQ_Set_Ctrl
    ( W8 Y4 }+ [/ v( t7 n
  183. IRQ_Process_End2 @1 e, Q5 G4 M
  184. RTS
    " K% s" ]$ \) x+ H
  185. ) q* D( J2 h+ r
  186. .ENDM1 J, d5 U/ x8 ~+ i5 b8 p! W& u
  187. % N+ t! _  S( v& _0 V! {% Y
复制代码

3 ?1 E0 s$ S" P3 Z# h
5 s3 {* L" w4 h; ~4 [代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-26 17:36

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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