EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-12-1 18:39:55 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-12-2 17:37 编辑   M7 f1 _4 K8 G+ E: g
. I0 v/ [5 @, X+ N' B7 x
本次IRQ研究了如下:/ m( d0 t6 ~: A2 W2 p5 W
VRC2&4(Mapper21,23,25)/ U: _+ v# N; _  ~4 y' q) r
VRC3(Mapper73)
5 f( l: d$ u5 {' T: {5 e6 X6 @VRC6(Mapper24 & Mapper26)
) n8 y4 j/ `5 ~: N0 M$ ?+ uVRC7(Mapper85)( b# T6 f0 @* I% S
MMC3(Mapper4)& n' R* \5 R! v: s$ U4 z5 a. }
MMC4(Mapper10)1 m* {4 D0 N4 u, g, p) ^
MMC5(Mapper5)
7 R: _+ n4 S  T3 X6 xMapper183 g( U6 T9 K% D. U# W  [: l
Mapper64" d% ~' Z( o7 j4 x/ I$ J! m* J
Namco163(Mapper19)
% l7 P& d$ z& ^# b3 c6 W5 PSunsoft FME-7(Mapper69)5 Z: ?* n. f! L% {8 ?! T
( E7 ?' S1 Y+ F& S
共计11种Mapper的IRQ操作使用例子' I* b! t& I9 E2 e$ H9 G" {# S
代码内有详细注释, 希望能帮助到感兴趣的人." {" j3 s( _* z7 b& c

5 f1 ]$ d6 H, x/ N  C+ X/ i0 _" @1 B5 v; P: \

+ U+ p$ s( F9 E" V7 |* w' L: kMapper代码主要逻辑(以MMC3为例):
7 D% [! N: `8 u2 z$ c" \

  1. ) p5 l9 A3 S% s9 @* G
  2. ;==================================================
    & K3 z$ |/ k; h; j
  3. ;Mapper号
    5 {  m9 d$ X% `" @! s
  4. MAPPER_NUMBER           = 04
    0 f: v1 Q, Z& q; X; L( V
  5. ;==================================================( F3 H& c+ x) v; G
  6. ;MMC3 (Mapper 4) 寄存器常量
    9 j* W+ j' D+ K. R
  7. MAPPER_REG_BANK_CTRL        =   $80009 p( T  v4 c, n; O
  8. MAPPER_REG_BANK_DATA        =   $8001
    $ g) r6 f7 {) ~5 i
  9. MAPPER_REG_MIRRORING        =   $A000
    ) p4 L6 |; Y- c# v, S1 P
  10. MAPPER_REG_PRG_RAM_PROTECT  =   $A001  R( {) n6 K7 f4 T, x
  11. MAPPER_REG_IRQ_LATCH        =   $C000
    # D8 o9 H) k) q5 T0 a  V2 r
  12. MAPPER_REG_IRQ_RELOAD       =   $C001- x! c# {( j, v0 b
  13. MAPPER_REG_IRQ_DISABLE      =   $E000# m) L- O; Y4 E* C
  14. MAPPER_REG_IRQ_ENABLE       =   $E0017 r5 t+ u6 N) j$ I
  15. ;==================================================' u7 z( `4 ]/ ~: ^
  16. IRQ_SCANLINE_BEGIN          = 1352 T- q; X0 i9 f9 r. l( L! e8 X
  17. IRQ_SCANLINE_1              = 8
    4 l& _9 G3 `* a$ w
  18. IRQ_SCANLINE_2              = 54+ C1 e3 w. s6 H( ^+ M3 V) X* L) o, w+ |* D
  19. IRQ_SCANLINE_3              = 8( O) c6 F! L: |0 Q  k! e' r
  20. ;==================================================
    & ]( C( Q, m* v, ~+ Y

  21. , t9 l5 r# V: [! y
  22. ;====================================================================================================: F/ l8 u+ F2 v0 t- {; U
  23. ;宏常量( M8 s: N1 y( ]! k" g* o! f; ^  {+ @
  24. ;====================================================================================================9 |* x7 M% C4 s7 b" T, b

  25. + J$ f( L" @/ L. L  x" f) U0 K/ d
  26. ;====================================================================================================8 y1 i$ L/ T$ y) f5 I
  27. MACRO_MAPPER_INIT .MACRO
    9 w4 o+ g; n5 J( z6 R$ S& C  F
  28. ;禁用IRQ
    " D# i- R$ _* [7 O" O8 U% v
  29. STA MAPPER_REG_IRQ_DISABLE
    & q' t# }, ^4 F7 v! u* k. s& L; d

  30. 1 p" M4 R- x" H
  31. ;水平镜像
    " G8 W0 u! V9 _. K
  32. LDA #$01& Y" ]. C' L7 c( T6 ?
  33. STA MAPPER_REG_MIRRORING# A' N4 _" L2 e

  34. 3 I# h  w1 K: A6 u5 x& t
  35. ;初始化图形bank
    / }% J- j( g! [
  36. LDX #$05
    % K( W9 E9 D' W; n
  37. .Init_Chr_Bank
    5 r7 L* A- N  J( k5 [2 G5 f0 U
  38. STX MAPPER_REG_BANK_CTRL
    . I% U2 C- j. u: W  ?* D) x
  39. LDA .ChrBankData,X
    0 d. L# E  \7 ]& k
  40. STA MAPPER_REG_BANK_DATA
    ) @: p5 u3 }) I8 }  R8 C
  41. DEX
    $ ]# L) i8 U  _# q: T2 S8 `
  42. BPL .Init_Chr_Bank2 X/ p  F* Q+ U, X( V0 L
  43. JMP .Init_Chr_Bank_End1 ^$ K! }6 P9 {8 a8 m) H! r
  44. .ChrBankData8 f( S/ p. c) q8 X2 E5 [. q5 B
  45. .DB $00,$02,$04,$05,$06,$07- ]1 W7 R! c/ z4 c% b1 ^0 {
  46. .Init_Chr_Bank_End
    4 s9 o) j/ p! Z% R5 d
  47. 6 K1 K9 g- v3 u2 r
  48. ;启用SRAM7 e/ U) B5 p- ]3 H
  49. LDA #$80
    & W6 f3 R9 T. Z: }
  50. STA MAPPER_REG_PRG_RAM_PROTECT0 }4 }8 Q# ]1 i9 X- l9 G! \
  51. .ENDM6 s* r+ F1 U7 o( p/ K, z2 r1 u

  52. - a: _! T0 y- V
  53. ;====================================================================================================
    5 Q1 N% |+ k6 P6 W
  54. MACRO_MAPPER_SOUND_CLEAR .MACRO8 U0 I2 \6 A  {4 A2 z8 \
  55. .ENDM
    6 J3 y! {& O( B& r: p
  56. . c/ ~: A4 ^' `* |" i# f4 X
  57. ;====================================================================================================4 t& {' V' D; I- b6 h3 n: j
  58. MACRO_SRAM_ENABLE .MACRO4 \7 Z+ J) \1 X5 F9 H, m
  59. LDA #$80
    $ H: g8 z2 O: w; i6 \, c
  60. STA MAPPER_REG_PRG_RAM_PROTECT
    ) E" M1 s( Z6 i2 S* p, |" Q" e
  61. .ENDM" {. O. X* R& }6 p/ P' D( s( a
  62. ! |9 d5 ^1 C( [5 |0 P+ f8 Q
  63. ;====================================================================================================
    8 J& V' O+ J6 n: |( a( q
  64. MACRO_SWITCH_BANK_8000_A .MACRO: D: T) [- c+ N2 l) ^( G% v$ _
  65. PHA+ y# |8 p4 r! f" x$ s
  66. LDA #$06/ `7 d3 L; n1 `. x6 g, e# w
  67. STA MAPPER_REG_BANK_CTRL
    & X8 L* [3 K* O2 I
  68. PLA
    5 e) W' |! Y/ ?/ H
  69. STA MAPPER_REG_BANK_DATA
    & @6 F" K: R6 Y( u
  70. .ENDM+ L  w% Y; F+ x* Z2 }! G# d: m
  71. ' l2 \+ n) O$ F+ l' |
  72. MACRO_SWITCH_BANK_A000_A .MACRO3 |: Z! H( L: A1 d7 k
  73. PHA+ {( a; q$ f! L( U& C# B7 s
  74. LDA #$07
    ( g/ q! m) S+ z! `) N2 {$ j
  75. STA MAPPER_REG_BANK_CTRL- d3 N8 O9 u0 h. }
  76. PLA
    4 m4 p, c1 U2 }$ [3 e
  77. STA MAPPER_REG_BANK_DATA
    , x9 ]5 Y: W% Z, w
  78. .ENDM
    ) \0 L1 D% X" z" A% j

  79. ' Q$ M7 T, `0 P! N3 y) c' Q
  80. MACRO_SWITCH_BANK_C000_A .MACRO2 |. c3 f9 X3 K2 W* k1 B0 i
  81. .ENDM
    8 S8 M- J/ v7 x( U) U" l
  82. 1 @/ L- X0 e% p( ?! Z  {9 ~2 }
  83. MACRO_SWITCH_BANK_E000_A .MACRO) m1 r- ^* x% y9 G3 @
  84. .ENDM1 ^0 q. Q. O) m+ A8 G6 ]' I/ Y8 u
  85. 5 c0 j0 P4 d$ L
  86. ;====================================================================================================5 Y' {. `3 g7 G' t$ U
  87. MACRO_TRIGGER_FIRST_IRQ .MACRO6 m, O6 b' O: H! Q2 B0 Z9 A/ d
  88. LDA #IRQ_SCANLINE_BEGIN + 1
    5 x" e0 [  z% |) `
  89. STA MAPPER_REG_IRQ_LATCH
    0 r( ~% A; W- ]4 i
  90. STA MAPPER_REG_IRQ_RELOAD8 U. R; P5 ~2 \) K1 s" s5 Y
  91. STA MAPPER_REG_IRQ_ENABLE
    3 l$ j2 }' \7 s$ c- C
  92. CLI; z2 t# j' N6 q
  93. .ENDM- d7 \2 K# r7 j
  94. ( E0 W+ T- M% G3 p- t7 L1 W
  95. ;====================================================================================================
    ; h$ z; h/ e0 n0 A# K. n+ a
  96. MACRO_ENABLE_IRQ  .MACRO
    ' H! V7 r8 z# K+ G
  97. STA MAPPER_REG_IRQ_ENABLE
    5 `% }0 Q$ d, |8 G7 W0 V, N. k1 n; i
  98. .ENDM
    1 B/ S6 x$ N( M& r4 j+ z& F  c

  99. ' W6 E, T3 o4 h0 z" n, {
  100. ;====================================================================================================) K7 u1 A5 O! l1 j
  101. MACRO_DISABLE_IRQ  .MACRO
    5 V2 I9 l! p  l8 Y
  102. LDA #$007 O- h3 Z2 X, T) @
  103. STA MAPPER_REG_IRQ_CTRL
    0 w! v  i* \; I2 ~! ?3 u8 Y
  104. STA MAPPER_REG_IRQ_ACK  u5 r. A- ?/ J! ^: @
  105. .ENDM! k5 G  u1 A/ @1 U
  106. ; k( G/ W3 w1 {. K
  107. ;====================================================================================================; T1 i# T8 e7 I5 T9 p& X7 I
  108. MACRO_ACK_IRQ .MACRO" ^8 M7 ]; p' O5 I, _4 q
  109. STA MAPPER_REG_IRQ_DISABLE& A2 N  o; a% P- f" {
  110. STA MAPPER_REG_IRQ_ENABLE0 c# n. Y4 p; H+ n, i! L
  111. .ENDM$ \( a% r, s$ i; r8 {" F5 U% g0 z

  112. : I, S' j2 E1 Y& ?+ v% Q" D
  113. ;====================================================================================================% [" {. i4 i0 w  J- b
  114. MACRO_IRQ_OPERATE   .MACRO
    " j( t6 ~1 e) p4 A" q4 ]
  115. ) I/ W; k( O; P- h2 p- o$ Q2 y# F
  116. ;==================================================) c! \3 M& n/ I" w6 B0 @* o
  117. ;IRQ滚动模式常量
    ; P  a3 q; _+ d. n2 p
  118. IRQ_SCROLL_MODE_ZERO    =   0       ;不滚动) Z& s' e% L: H3 X! ]. k& Y
  119. IRQ_SCROLL_MODE_LEFT    =   1       ;向左滚动. O. }& n# R1 `+ Z1 t
  120. IRQ_SCROLL_MODE_RIGHT   =   2       ;向右滚动
    / R: W( p) F6 a2 `& z
  121. - |" c1 D) T1 M+ v+ N/ R
  122. ;IRQ扫描线数据
    % |( K: M: g9 G! P6 J6 Q
  123. IRQ_Scanline_Data
    $ v& m! e; J' W# G# v
  124. .DB IRQ_SCANLINE_1
    & W; n* ~: i. \
  125. .DB IRQ_SCANLINE_2
    8 \) F) j3 @. v" v
  126. .DB IRQ_SCANLINE_3' K( {0 y0 [! B$ {! |* e  j
  127. .DW 00 ;关闭IRQ8 i& H! k/ m' u& f' _; t

  128.   q/ {3 G; ]3 Z/ n/ t
  129. ;IRQ滚动控制模式
    4 D' Y6 h5 K( Z7 R9 A
  130. IRQ_Scanline_Mode
    . l9 I6 h% [. ?! L
  131. .DB IRQ_SCROLL_MODE_RIGHT
    ! M. D0 L$ H; N
  132. .DB IRQ_SCROLL_MODE_LEFT
    ! z7 l/ p& I! d+ H8 S  [
  133. .DB IRQ_SCROLL_MODE_RIGHT
    9 `/ B* H2 u* h: ^+ [, h  d
  134. .DB IRQ_SCROLL_MODE_LEFT
    ; m2 }9 ~, @( v8 ]5 g0 @3 `
  135. - ?$ Y, V2 q; J. ^- I" ~
  136. ;==================================================4 T% o$ U- u$ f
  137. ;;IRQ滚动控制
    : }: [7 Q1 i3 \3 R- e+ M& h7 b
  138. IRQ_Set_Scroll# n$ C3 ~6 {4 o" ^& [% r
  139. LDX IRQ_Process_Index
    / P) R" Q' r& X
  140. LDA IRQ_Scanline_Mode,X
    0 S- Q: b- N- H6 m! z: F
  141. CMP #IRQ_SCROLL_MODE_LEFT7 f" a" l; `/ o( K
  142. BEQ IRQ_Set_Scroll_Left- ]* o  |' X* u5 U. M3 s  H) z
  143. CMP #IRQ_SCROLL_MODE_RIGHT
    ) d3 Y8 B: j7 X) }* e: s) y
  144. BEQ IRQ_Set_Scroll_Right
      j) r/ K$ }: c* Y! q8 _) I
  145. IRQ_Set_Scroll_Zero;不滚动
    " `2 I- r: {/ d2 r9 b
  146. LDA #$000 ?( ^: }. k% H% s; ~
  147. STA PPU_SCROLL
    9 S- ?* a! S9 {! g& f
  148. STA PPU_SCROLL, G3 a! x0 e% I# l3 `
  149. RTS
    7 x0 B# p7 X6 U
  150. IRQ_Set_Scroll_Left;向左滚动  @0 a. {9 t4 M9 U
  151. LDA Scroll_H
    ( Z+ l4 _/ z9 j# D! _/ G. j
  152. STA PPU_SCROLL" S: c0 |  L4 W
  153. STA PPU_SCROLL& `( ]. I9 V$ X. |6 O) n+ l/ K  j
  154. RTS1 g( K2 x! i4 m  s& i; x. K
  155. IRQ_Set_Scroll_Right;向右滚动
    1 {! Q3 a# K8 l2 B  S4 V- ~8 o. d8 W2 V
  156. LDA #$00
    . y8 n% Z! Y  N- Y
  157. SEC6 W1 }0 L/ K' k. f! u7 v: v
  158. SBC Scroll_H" j! N: I* P/ k0 J) [- [
  159. STA PPU_SCROLL: f% h$ w9 G, m* V- T
  160. STA PPU_SCROLL
    # H9 U/ {$ `: r, Q0 @
  161. RTS, b' `6 r6 h( Z0 B, ~, U
  162. 7 h4 Z* i2 |# H) o
  163. ;==================================================
    # A( a7 Y$ z* h' S2 V" ]# @
  164. ;;IRQ滚动控制
    ( j! f; M+ {' p" R, ?5 s# P
  165. IRQ_Set_Ctrl
    $ O: \0 h: Z0 ?2 a! [$ W! i, Y
  166. LDX IRQ_Process_Index
    : X: B" n8 u$ o1 l4 t  i
  167. LDA IRQ_Scanline_Data,X4 N9 ~+ d7 l* J% e2 ]9 \
  168. BNE IRQ_Process_Latch
    , Q  L5 F9 P* Q( V; c) W$ r4 ?" d: |" b
  169. IRQ_Process_Disable;禁用IRQ
    ) l. Q- L% f+ _, h/ d  n& K; l6 P
  170. STA MAPPER_REG_IRQ_DISABLE
    9 G' h% P/ c* o; X( a
  171. STA IRQ_Process_Index
    0 k% l  O/ K% t) ^) P, D( V/ ?
  172. RTS
    ; M8 k+ w) M/ [1 f) c$ c
  173. IRQ_Process_Latch;设置下次 IRQ 触发扫描线& p9 r2 r' x/ I6 r+ b
  174. STA MAPPER_REG_IRQ_LATCH
    2 B+ {1 ~4 C/ V4 l/ C! y4 H+ ~! B
  175. INC IRQ_Process_Index  x( w4 F0 \6 z  t9 U$ o' n+ S
  176. RTS; A2 X) `3 s2 D; `

  177.   t+ x# w& y% b1 ~8 C4 G" |
  178. ;==================================================( j* U0 z6 j% h% I2 m; T4 ^
  179. ;IRQ处理6 T: s! q& R* Y/ ^9 F
  180. IRQ_Process_By_Index
    9 S- k0 p) D0 ?- [7 ]/ B
  181. JSR IRQ_Set_Scroll
    # G+ d7 j8 @, k6 u7 C: D: U
  182. JSR IRQ_Set_Ctrl
    % P1 }2 o& Q* M) q! h
  183. IRQ_Process_End
    0 J: `& o# f; g+ D8 v2 t" G' g
  184. RTS" z% K/ \! I2 ?% B& h

  185. ( E. [- k2 Z4 f. l. {
  186. .ENDM
    + d- j! b/ F/ V( n1 I& M
  187. " S! \9 s3 p1 z2 F; |$ r; G: a
复制代码
) p7 r4 L* F# q! G- R
) A' z+ B2 i% x* Q
代码仓库地址: https://gitee.com/flame_cyclone/fc-irq
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-5-23 16:42 , Processed in 1.062500 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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