EMU618社区

 找回密码
 立即注册
帖子
查看: 326|回复: 2

[原创] [FC][音乐播放器][NES + 源码]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2023-7-11 19:08:59 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2023-7-11 21:32 编辑 ( J* h/ `3 j. }! S9 i- P* l8 Q, O
$ h+ z5 l5 U3 d7 N2 e0 I' d0 X
1.魂斗罗" d3 o% ?1 b, j& `: G
2.超级魂斗罗: P" S' r% z: j: D
3.赤影战士8 T; l6 t3 q0 D/ i( i! Q
4.忍者龙剑传2+ L4 P+ v! c  p" W5 L

' S2 F! U0 Q2 x8 X
- K$ p: K% F. Z1 T& P) o" D/ k4 x2 a3 \+ t. _! b' x" _

7 J9 v% |# K  Q* Z6 f5 L源码:4 |* C2 s* E% q' S
  1. ;[FC音乐][播放器模板]
    * C) K! C2 ~# K
  2. ;FlameCyclone 20230710
    7 J: B) t: `+ p2 s, A$ J
  3. 5 J8 L8 w! W; e+ x  k6 d! k
  4. ;文件头
      P% ]# H. J+ G/ c9 L+ @" B
  5. ;======================================================================$ ^5 J- _- |" E7 m
  6. .INESPRG 4                                              ;16KB PRG 数量, W$ j; q. G7 j1 l$ \9 q& s
  7. .INESCHR 0                                               ;8KB CHR 数量1 K/ H6 n: c  o' f5 P  z: c( q' a
  8. .INESMAP 4                                                   ;mapper 4
    & b4 N9 T+ D$ S1 h
  9. .INESMIR 1                                   ;命名表镜像 0水平 1垂直
    2 O# M$ ~' R6 X6 u3 @$ p( @1 ~6 d

  10. ( _4 R' j( s; n: O) x2 r/ }' L
  11. ;==================================================
    * `8 O9 k# B0 O4 J0 h- ^: |- m
  12. SOUND_BAR_SHOW_ENABLE       = 1
    ! r( }5 C7 A3 P7 ~' Z! W
  13. ;==================================================* S4 w' ^1 Y- T* U# Y& `
  14. BANK_DATA_MASK              = $07
    ! m3 _; ?8 h* O- }5 x, s; A) S
  15. ;==================================================
    , N, @+ |, ]& T* f- |' g+ [$ C
  16. SOUND_DATA_BANK_0           = $00
    1 p9 d" H; X  `5 d9 r% f: e+ `/ `
  17. SOUND_DATA_BANK_1           = $018 |( Y8 r0 N" q0 q
  18. SOUND_DATA_BANK_2           = $02
    " z5 @5 r7 ^% d  I
  19. SOUND_DATA_BANK_C000        = $06" O' [7 f) I/ J, y
  20. 0 _8 Y) `6 G* t  j6 g
  21. ;-------------------------------------------------
    * R% |3 y0 u: Y$ ]: l
  22. CHR_DATA_BANK               = $04
    ) Y. I$ U5 @4 ^. i7 B
  23. CHR_DATA_ADDR               = $A0002 s1 \) |. ], a$ o
  24. ;-------------------------------------------------! {9 ]: U- P. ?: V3 X, V. K/ f5 J3 R
  25. PROGRAM_BANK                = $05
    * t) B) J$ S8 Z4 q
  26. PROGRAM_ADDR                = $8000
    ; g6 ], P2 U  l9 T$ `
  27. ;-------------------------------------------------
    8 d, ?) s% n! F( p+ @! U
  28. RESET_BANK                  = $075 i! S2 O8 @0 m$ G* H' Q" o
  29. RESET_ADDR                  = $FE008 E  G  b" c; m; ]
  30. ;==================================================! D! p% c( i: [/ f7 ?
  31. Music_Init_Addr             = $DFF0 ;音乐初始化地址/ D' H6 t* X" g+ s. R/ g- R
  32. Music_Play_Addr             = $813C ;音乐播放地址
    . K* r  s+ W5 x' I0 I
  33. Music_Reset_Addr            = $0000 ;音乐重设数据地址
    * X& s4 T* t" m& B' [
  34. ;==================================================* s0 o# V- V. L/ K! U
  35. Music_Song_Total            = 039  ;全部曲目总数1 T) b. V2 ^* c* e" P. n
  36. Music_Start_Song            = 007  ;初始播放曲目3 @& F4 H) Q1 l' L, H- }
  37. ;==================================================; q& ]/ g  m) d+ `

  38. : z9 u1 F, t% G, m$ F9 d+ m
  39. ;==================================================% w( c2 [5 Q# i9 `1 L! _) x
  40. Title_Text_Pos      = $210D ;标题文本位置" S- z5 ]$ g1 J: X- S! G  Z
  41. Author_Info_Pos     = $2284 ;作者文本位置
    9 b/ t9 Z0 n( Q( |, d! u/ ]- q$ \
  42. Date_Info_Pos       = $22CB ;日期文本位置* A) V# l' x3 ^4 N8 s4 ~( V
  43. ;------------------------------
    4 n8 q$ B% D: g: C$ X
  44. ;------------------------------
    ! N$ O" `4 A8 A1 q+ B
  45. .IF SOUND_BAR_SHOW_ENABLE; S1 J% P+ U7 R, n5 f  F/ Z+ F
  46. Play_Index_Pos      = $21B3 ;当前曲目位置
    $ L. |  J6 r% S& {1 |
  47. Play_Time_Pos       = $21F3 ;播放时间位置( z- z6 P- r  D- g
  48. Play_State_Pos      = $2233 ;播放状态位置" J! m- @" @/ M/ n
  49. .ELSE
    / V9 s" N( U8 J% j8 U

  50. 0 C( _4 ^6 {3 S8 I
  51. .IF Music_Song_Total > 99
    & V3 c5 F' K2 A' Q' L0 x
  52. Play_Index_Pos      = $21AC ;当前曲目位置
    1 B2 {" q2 Y0 F$ ^. f1 y
  53. .ELSE
    8 a6 T. O$ b& _+ Y) B5 Y# K
  54. # _/ N' q* a7 c. d$ J
  55. .IF Music_Song_Total > 9+ n9 y6 b2 J( u4 q$ S8 {7 ~
  56. Play_Index_Pos      = $21AD ;当前曲目位置
    . L, |5 d! E5 p3 _) S4 W
  57. .ELSE
    " a/ t# Z& ]  j' \, f! L
  58. Play_Index_Pos      = $21AE ;当前曲目位置
    : L* M) O% C% o3 e& S9 V9 W3 v
  59. .ENDIF
    # X: l. ~/ r2 P  R
  60. 5 N- M( g$ E8 L. I! O
  61. .ENDIF0 l2 H. L( W. r2 c
  62. 0 A) d  l/ Q' j3 {/ u

  63. * D. E. \  ^9 M: |( E; a! a, }
  64. Play_Time_Pos       = $21EC ;播放时间位置
    # H2 v9 o" F6 X( ]: j) F& m! O
  65. Play_State_Pos      = $222C ;播放状态位置
    $ \5 M% y5 N8 T( |6 v
  66. .ENDIF
    1 e4 R& {( ?& G6 U
  67. ;------------------------------& s; g& Z. V* c1 o  J, Y' h6 ~( u2 K6 Z
  68. Track_Name_Pos      = $216B ;曲目文本位置
    ! `" z; L) n+ x) i
  69. Sound_Track_Pos     = $21A5 ;声道文本位置+ A, p7 D. U1 v3 }8 {
  70. Sound_Bar_Pos       = $21A9 ;音乐条位置7 r" W& i$ l9 h$ f( a. M" ]
  71. ;==================================================) z2 [! m3 y) `( u& ~
  72. Scroll_X = $00  G- W6 C. S9 m% V% f
  73. Scroll_Y = $066 _  l& f6 l0 n. l, V
  74. ;==================================================
    9 S& w& [; t  L! I
  75. RAM_Cln_1       = $0100+ X; |1 K6 n/ H* o/ x
  76. RAM_Cln_1_Size  = $80$ y) d3 W0 c) k8 N- o
  77. RAM_Cln_2       = $00E0% R" c, j, j7 {% ^, G* _: K  x. x
  78. RAM_Cln_2_Size  = $20) V, I* p( E7 \
  79. RAM_Cln_3       = $00E05 b& O. [; u6 l
  80. RAM_Cln_3_Size  = $209 P5 Y0 |% R1 x) F
  81. 9 j7 l8 K5 ]9 q. F: A9 ~5 {
  82. ;==================================================' Y! z4 Q$ g8 i8 v' l4 B/ W
  83. PPU_CTRL                =   $2000   ;PPU控制寄存器
    5 {9 ]- j  z$ P6 A8 l$ q, O
  84. PPU_MASK                =   $2001   ;PPU掩码寄存器( m( g" [0 H# {) Z
  85. PPU_STATUS              =   $2002   ;PPU状态寄存器:读取后PPU_SCROLL和PPU_ADDRESS被复位,下一个写到PPU_SCROLL的数据是水平的,写到PPU_ADDRESS的数据是高位
    5 b, P9 f, Q* p0 ?6 n
  86. PPU_OAM_ADDR            =   $2003   ;精灵RAM地址:用来设置通过PPU_OAM_DATA访问的256字节精灵RAM地址。每次访问PPU_OAM_DATA后该地址增加1
    - m) G7 `6 J+ f. d6 P
  87. PPU_OAM_DATA            =   $2004   ;精灵RAM数据:用来读/写精灵内存。地址通过PPU_OAM_ADDR来设置,每次访问后地址增加1  \8 Q( p2 Q( ?# P( s' H
  88. PPU_SCROLL              =   $2005   ;屏幕滚动偏移:第一个写的值会进入垂直滚动寄存器(若>239,被忽略)。第二个值出现在水平滚动寄存器 - p- k& r5 A$ B; Q' u- w
  89. PPU_ADDRESS             =   $2006   ;VRAM地址:设置PPU_DATA访问的VRAM地址。第一个写地址的高6位。第二个写低8位。每次访问PPU_DATA后地址增加
    / J1 Z% T3 E; ]! E. J) F+ d
  90. PPU_DATA                =   $2007   ;VRAM数据:用来访问VRAM数据,通过PPU_ADDRESS设置的地址在每次访问之后会增加1或32 1 Q9 l" q3 j/ F* {( s2 B5 E
  91. OAM_DMA                 =   $4014   ;DMA访问精灵RAM:通过写一个值xx到这个端口,引起CPU内存地址为$xx00-$xxFF的区域传送到精灵内存
    # J4 O, t- E5 e" i% a
  92. APU_STATUS              =   $4015   ;声音通道切换$ J" M) n. d1 ~3 d7 R0 [" D" A5 D
  93. JOY1_FRAME              =   $4016   ;手柄1 + 选通* i) ]( k" p0 Q
  94. JOY2_FRAME              =   $4017   ;手柄2 + 选通
    ; p/ N$ |& t8 U- F; A) d
  95. ;==================================================! W, w8 c+ W6 \6 L9 Y5 ~
  96. MMC3_BANK_CTRL          =   $8000
    0 U! Y' F9 n- n
  97. MMC3_BANK_DATA          =   $8001
    . @) P- A7 ]% X6 r# o+ d/ w  q$ Z
  98. MMC3_MIRRORING          =   $A000  p- ]. [: K2 j% v  e, n" M7 S
  99. MMC3_PRG_RAM_PROTECT    =   $A001
    , `4 T; a! G$ e* w8 I6 ?
  100. MMC3_IRQ_LATCH          =   $C000# P* u" J3 F) A
  101. MMC3_IRQ_RELOAD         =   $C001# d5 R6 `7 _1 V& z) d
  102. MMC3_IRQ_DISABLE        =   $E000+ l1 w3 ~2 I& f! T! k0 a3 C
  103. MMC3_IRQ_ENABLE         =   $E001
    / B, ?' l# l9 }7 k: Z# l

  104. 8 ^6 `0 d$ L, w" C1 s5 W
  105. ;音乐数据块; W! V( M7 j8 B% a$ J/ ]
  106. 9 ?0 n! f4 C: n7 |
  107. ;======================================================================& x. M4 g) ?7 Y5 h! Q- U
  108. .IF SOUND_BAR_SHOW_ENABLE
    ) T0 F" v4 I2 q; }8 t& P
  109. .BANK SOUND_DATA_BANK_0 & BANK_DATA_MASK
      i1 P  g; m, t
  110. .INCBIN "sound_bank_bar/music_data_0.bank"4 @, p7 z2 j- a

  111. / F% a  x0 y6 l. C
  112. .BANK SOUND_DATA_BANK_1 & BANK_DATA_MASK
    + O! T# U5 R4 }* l+ y; b2 j
  113. .INCBIN "sound_bank_bar/music_data_1.bank"
    : Q' T! [& `* B6 [# x9 K. {

  114. ' p" `" `6 J& ~6 Q! @0 T! |
  115. .BANK SOUND_DATA_BANK_2 & BANK_DATA_MASK
    ' C" q" b! p5 V- m
  116. .INCBIN "sound_bank_bar/music_data_2.bank"
    * d/ A7 C$ \, c" V' y: o3 B9 J
  117. # w6 `3 I9 Q4 Q
  118. .BANK SOUND_DATA_BANK_C000  & BANK_DATA_MASK
    # Y' |8 S+ i! ~; n: V) d
  119. .INCBIN "sound_bank_bar/music_data_3.bank"
    " v/ l- Z6 M+ P  A. y
  120. 3 u6 z8 V, m+ v4 D$ K4 t6 _; I
  121. .ELSE% ~) H/ ?, |+ i) s2 L. U
  122. .BANK SOUND_DATA_BANK_0 & BANK_DATA_MASK* U5 x* x8 G. b: i4 Z
  123. .INCBIN "sound_bank/music_data_0.bank"* X0 v; W0 _" G. s/ q' u
  124. ( [6 [4 W0 n9 m1 B- ]
  125. .BANK SOUND_DATA_BANK_1 & BANK_DATA_MASK2 E: ?; E8 G" c) X- l/ W
  126. .INCBIN "sound_bank/music_data_1.bank"
    ' L: w) A) P* R- D  D. Z, R
  127. " j: f/ P6 r% T  X2 P
  128. .BANK SOUND_DATA_BANK_2 & BANK_DATA_MASK
    " |$ D5 u( l7 o8 b: a
  129. .INCBIN "sound_bank/music_data_2.bank"
    4 W- E* R- Y/ B$ J+ _! O- M" i9 B
  130. , b- X% \- D& W! J+ u2 |. F' ]
  131. .BANK SOUND_DATA_BANK_C000  & BANK_DATA_MASK
    5 k* r1 }# D" o; C; E5 C4 L
  132. .INCBIN "sound_bank/music_data_3.bank"
    ! L3 y- v1 g3 c+ ]
  133. .ENDIF
    3 l" [( d: d2 n; I1 k) i! G

  134. % v: W  d. N2 ?$ E9 y  ^: E+ ^
  135. ;CHR图形数据
    % e3 K- o; V% V8 C' O4 a
  136. ;======================================================================
    9 F6 f' Q" E2 f  y, \- |4 v8 S# D
  137. .BANK CHR_DATA_BANK, {  Y4 N3 R+ ]9 }8 R$ ~
  138. .INCBIN "chr_bank/chr_data.chr"0 d( z6 X0 m: Q) R( m! m

  139. * P. A& x# |6 e; d7 _2 a
  140. ;==================================================
    - L( l& u1 D" I2 h3 H
  141. PPU_Addr        = $0300' d8 a2 ~/ h7 c0 C) G
  142. Palette_Addr    = $03C06 P# E6 g: K6 D3 l/ q" t# O
  143. Sound_Bar       = PPU_Addr+$E0
    2 O( H3 X7 F' B" {6 ~: a/ j
  144. ;==================================================
    $ h: c) I) X* R
  145. Palette_Update_Addr     = Palette_Addr+$0D
    # {4 g2 c6 d7 J. q  M9 V
  146. Palette_Update_Max      = $2C3 ]7 K7 s7 [( g' _6 C
  147. Palette_Update_Min      = $21
    : z3 s, V2 j! y) H
  148. Palette_Update_Interval = 60
    ) d3 Y8 U( u4 d, R  g
  149. ;==================================================- q1 [7 W0 G/ H% K7 D, \
  150. Sound_Bar_Cnt       = PPU_Addr+$F0+ T' C$ T) w+ r3 Y
  151. Screen_State        = Sound_Bar_Cnt+$01
    , G8 S, `* z7 j1 T; N6 c8 e
  152. PPU_Cur             = Sound_Bar_Cnt+$02
    . Z, B/ V2 _/ [  r2 u$ X
  153. PPU_Addr_H          = Sound_Bar_Cnt+$03
    9 ~8 R) m( p+ t2 v, @5 a4 M
  154. PPU_Addr_L          = Sound_Bar_Cnt+$040 c6 ]. r6 Q; q, X) ?
  155. ;==================================================, j2 ~* R9 X% E
  156. Data_L              = $70
    0 \% Y4 _% l0 y% Y; C
  157. Data_H              = Data_L + $01
    ! r# W" ?. \5 m0 D4 q. W# m6 O5 ~
  158. Data_Cnt            = Data_L + $020 `- Z  f, g( S) S1 a/ F
  159. Data_Buf            = Data_L + $03
    ( B5 n1 I( ^1 M0 d6 a( q
  160. Time_Wait_Cnt       = Data_L + $04! b2 I  C+ S6 s, ]) L
  161. Palette_Wait_Cnt    = Data_L + $05- G& _/ m8 f# x- {- K  c
  162. Palette_Update_Flag = Data_L + $06
      }* i8 B1 v, G; h, ?. e1 I- M
  163. Show_Track_Name     = Data_L + $078 k) `2 ], E1 d
  164. ;==================================================
    9 O$ \7 \4 J4 g. t+ i. T1 y# I; Y
  165. Key_Keep            = Show_Track_Name + 1
    5 {8 y; r% W) p' X) y: U
  166. Key_Once            = Key_Keep+$01
    5 S+ M4 k& f6 O& V
  167. Key_Kemp            = Key_Keep+$02  \7 J' @% r! [9 y" I- ]$ \, B1 n
  168. Key_Temp            = Key_Keep+$03, ~- C3 p8 M; a2 w4 Z3 p
  169. Key_Getv            = Key_Keep+$04
    * Y- Q; ?; h! P1 d9 g. T
  170. ;==================================================
    0 _" y! X- w  w
  171. Music_Cur           = Key_Getv+$01' E* d/ P( `$ }
  172. Music_Last          = Music_Cur+$016 E( ?  l4 i3 w' t( s
  173. Music_State         = Music_Cur+$02! w8 G% F" U, b' B) e* y
  174. ;==================================================* a# m4 i1 x5 o" h- j5 t
  175. HEX_Data            = Music_State+$019 Z: p3 w2 G8 R) I3 P7 `5 `
  176. DEC_H               = HEX_Data+$01
    : v1 G% U& v% v( A$ a" U
  177. DEC_T               = HEX_Data+$02
    + ]- `* R+ W7 i- u, X+ h
  178. DEC_L               = HEX_Data+$03
    % N# S. X" o* `' k
  179. ;==================================================
    ) j/ C  M. l- p# H% v( Z6 r# Q$ x
  180. Time_S              = DEC_L+$01
    ; M7 Z; |: I  E2 S( [" Z$ n+ c3 x
  181. Time_M              = Time_S+$01. |% u/ E' E! Z/ v) [" s
  182. Time_H              = Time_S+$029 H# s% N8 e( V! N/ P8 q
  183. Time_Cnt            = Time_S+$030 D8 V# Z; `* Q

  184. 0 F1 h. L8 [9 |6 W/ x! g2 ]
  185. ;==================================================
    5 Z4 o1 X# M- T
  186. Music_Bank_8000 = Time_Cnt + 1# U! n0 W  s8 ]# J* y
  187. Music_Bank_A000 = Music_Bank_8000 + 1
    . t7 C9 B7 I# R/ g' @# n
  188. ;==================================================. k2 y% R3 a$ b* J
  189. 6 ]5 S# O3 v$ N  N6 C+ l2 T0 Q: F
  190. ;======================================================================
    , m0 O* ^( y# m3 z* Y
  191. .BANK PROGRAM_BANK" E7 {% q% m: O6 [
  192. .ORG PROGRAM_ADDR0 M1 z9 ^0 ?' k1 Q& ^8 y
  193. 9 v: y) F- f! B# I' }! i
  194. ;==================================================
    7 `# w, D7 l' g6 l4 g2 _, q
  195. NmiProgramProcess;NMI中断程序处理4 g3 V) b% \* m1 r+ Q
  196. ;处理PPU图像
    3 \! [1 ?( |$ n! ~* F. ~
  197. JSR PPU_Proc
    / S$ j7 R. W5 z% H

  198. ' F% t8 P" J" I& f- k
  199. ;启用NMI中断: n4 n: P2 z# e9 J; E* i, W
  200. LDA #$80. K( @& P% r5 i) V! Z
  201. STA PPU_CTRL
    ! k( {* s1 g' Z

  202. 1 Z& e" a( F, w+ X0 w% P
  203. ;更新调色板; N. A& B1 v6 H0 Z# w, c1 l
  204. JSR Update_Palette_Data
    ( A5 y/ o% u3 U3 ?2 R
  205. 9 c5 M2 g# f0 P6 C6 ]: O
  206. ;显示时间(缓冲)& c6 w! O# a! k2 _  q7 _
  207. JSR Time_Show
    ; r" F! |5 Y. F
  208. ' h0 z4 I- z9 H3 f6 m1 l5 d1 w. ^
  209. ;播放计时
    " H' I/ h9 e+ z$ \& r( R2 Z7 O
  210. JSR Time_Count6 n) S7 S$ v8 Z+ _( m! `! m' d4 G2 i
  211. 5 H. b& y. `6 q9 n
  212. ;播放声音  A2 }8 A& j( ~3 u
  213. JSR Sound_Play& R3 C4 g# k9 ?+ Z2 x$ b/ _9 _

  214. 6 f7 O' ^7 X5 x0 L8 V7 [( H
  215. ;切换音乐(手柄触发)$ p6 l$ r" t5 Q  O7 N
  216. JSR Music_Switch4 a, j& D% D8 ]
  217. * q, ?6 }5 X8 d; L
  218. ;音乐显示(缓冲)
    7 `0 h& R& W" w& ]- r" |! G* C
  219. .IF SOUND_BAR_SHOW_ENABLE
    ; X0 S, a8 q5 R! W* v
  220. JSR Music_Vision, Q. D. z9 L2 j7 n! K
  221. .ENDIF7 Y9 `9 G2 o; \4 o

  222. 2 k4 J6 _0 n/ ~/ A  W3 Y' ^
  223. LDA Time_Wait_Cnt7 n/ Z3 f$ H- _& U8 n/ G
  224. BEQ NmiProgramProcessEnd. I3 F8 w, W# e) j3 O4 W. ?8 [
  225. DEC Time_Wait_Cnt- z+ V! \4 N* X% U8 ?; P0 ]2 e, A( _  H
  226. NmiProgramProcessEnd# \4 a- C5 E. L% M$ V4 M
  227. RTS4 i: Q5 p. Z" [$ d. o

  228. ( R+ S4 z& ~& R6 `# ?  f. H+ _
  229. ;==================================================  S/ q: I+ J4 Y) M& u% j9 A
  230. ProgramBegin;主程序
    % J* I5 T: h' ?6 B
  231. LDA #$00
    ' b8 e+ i9 T/ _- z6 h
  232. STA PPU_CTRL
    . A* S  ?# X. j9 S3 J( @
  233. STA PPU_STATUS4 X& {* E/ v5 p! b& I) R# o. L3 p
  234. STA PPU_MASK* d& K  B; ^! ]6 D* W$ A
  235. STA APU_STATUS) C" b: K! R# Q4 ?& `7 w1 c0 `/ i
  236. STA PPU_SCROLL5 n5 t: ?) [7 e& {, _- Y
  237. STA PPU_SCROLL
    6 d  o6 M& d5 t
  238. LDA #$C0) t1 Y3 e: Y$ c4 C( z
  239. STA JOY2_FRAME
    + d# R( n2 t1 m$ I

  240. 5 U) x/ \: i8 c3 z+ ~# t
  241. LDX #$FF, X7 C( F' P' A( L
  242. TXS$ }, f4 `( I0 B( V
  243. LDA #$00
    1 K+ h9 D2 t7 B* ^8 M2 k
  244. STA PPU_CTRL4 g; f# d8 a8 k6 {  `: x
  245. STA PPU_MASK3 l/ L! z0 U* ^# z- Q- l# S* b
  246. STA MMC3_IRQ_DISABLE
    / j2 x3 a# \% a% K; j

  247. & {* Z; Q" R1 d8 w2 @2 \% Y6 J
  248. ;==============================
    & ?' f$ d4 I1 `. H7 W( z1 N2 T
  249. ;调色板清空. i- h7 c+ ?6 }( m& a3 e
  250. LDA #$3F  x6 R  y* m+ k$ n  R
  251. STA PPU_ADDRESS, t: B( g% w+ i' J$ X% A
  252. LDA #$00( a0 ?/ k* j  i' y5 k9 T4 ^
  253. STA PPU_ADDRESS
    6 Z4 m" U$ i+ d- p, B% r  R9 f
  254. LDA #$0F
    . C) o3 d. W* d$ g1 n. H& Y: W
  255. Palette_Clear
    " |9 k( M( s" W- v1 {
  256. STA PPU_DATA
    5 l7 H7 v& ]  l. g! h  X
  257. INX
    # l/ {8 u( V8 d; i; M: ?
  258. CPX #$20
    : I% m0 t" d8 i
  259. BCC Palette_Clear- h1 K( E+ x- _# S  f* }' u
  260. LDA #$00$ p5 i' d+ S* ^7 h
  261. STA APU_STATUS
    " M. Q) k3 f9 N" Y3 u2 ?5 J
  262. ;==============================  j& E1 s, s- k1 u, n; C; V/ Q
  263. ;初始化背景调色板
    5 g( E, T3 X- L( q, h
  264. JSR Set_Palette_Color% G) \3 Z, H1 t+ q
  265. JSR Set_NameTable_Attributes
    ) N, m- o; o4 r% n) s5 B( \
  266. # a: b$ V6 X! _" v1 O; x; Y
  267. ;==============================
    ' Q) H  y  N9 d, M
  268. ;RAM初始化' U) @4 p1 D7 l7 p4 a% X& s
  269. RAM_Clear_All
    2 }8 K) y% b5 C. `7 a
  270. LDX #$00
    1 L" P; l9 d1 c6 _* t$ w
  271. LDA #$000 I! \* p. [3 H3 O( o
  272. RAM_Clear_All_Start
    + ^5 J8 J" X9 `2 M
  273. STA $00,X) c& H$ C$ X' R8 L* F# b
  274. STA $0100,X
    5 E4 X2 p3 G& q" n) n$ v
  275. STA $0200,X  L& V8 l" `. D6 B3 L9 ]# A
  276. STA $0300,X3 i; c$ G  e$ w2 ?% P. ?# u
  277. STA $0400,X
    * _5 R$ o  T4 z& W$ Y/ x+ e4 C. X1 D% o
  278. STA $0500,X* Z: |7 D. Q( T  _3 ?$ @' l
  279. STA $0600,X
    0 Z$ e) C, z/ a! L* e9 N. k
  280. STA $0700,X2 {) F! s& ?9 `, i
  281. INX* E" B% B( s9 l% }! t
  282. BNE RAM_Clear_All_Start
    1 L6 W' q+ D9 k- _: {- W
  283. 8 ~% j8 t' F6 o; E( G+ i
  284. JSR VramInit* s# T" g  e4 g" ^1 `1 w) `7 T. i
  285. JSR Init_Palette_Addr
    + G4 q* h1 @/ R% O) }/ Y
  286. - ~3 P) c5 v1 ?1 B% d. a
  287. .IF Music_Reset_Addr3 N3 ?6 Y" S4 a
  288. JSR Sound_Reset0 f" p/ C% H! E+ q; \; m0 k7 Y& I
  289. .Endif1 W( t& M0 O9 T

  290. 7 a: ]# U9 o8 r
  291. LDA #Music_Start_Song-$01
    8 o% r% T. r( [! X( Q% Q/ `
  292. STA Music_Cur: X9 i2 ^3 d& q" ~* {! l+ b5 P' v
  293. 5 p5 X8 h0 n* K, H1 A; U7 Z
  294. JSR Show_Music_Text' N2 q& Z. D* [0 V6 T/ ^

  295. 2 {6 |  F2 y: _* \* ?$ j
  296. .IF SOUND_BAR_SHOW_ENABLE
    ) p/ f/ G8 o  F2 k# h
  297. JSR Sound_Bar_Text_Set1 ]  M& F' M: R8 v& h
  298. .ENDIF
    3 i2 t3 W1 r; ~& u1 X# S9 [

  299. & f7 v" S1 n4 A4 A; a
  300. .IF Track_Name_Pos
    . V- F) Y# a) f
  301. JSR Show_Track_Info  ^+ f, Z5 s' O; j  W6 Q% S# l
  302. .ENDIF/ r6 H' @+ Y! ]$ P" C
  303. * H1 c# @4 \7 `; _( U. K/ U
  304. JSR PPU_Proc9 e1 R* \$ ]/ u

  305. , |, d7 S+ r  w* ^+ o) F% q
  306. LDA #$0E
    # h8 S% z" J2 @6 _. i
  307. STA Screen_State
    * n) s- L3 k) Q/ d+ \# G

  308. " V0 i* {' n: R% d, t6 M$ b" l. S
  309. JSR Sund_Bank_Init% F3 A) |+ c5 V% F

  310. ) J% ?, i+ N# ]" V) X! p
  311. JSR Music_Show' R1 n8 K+ v) X; g  s
  312. JSR Time_Show) i- t; I4 H$ [3 z5 W5 d$ v
  313. JSR Music_Stata_Show
    + w9 q0 O- \' ?4 S
  314. JSR Time_Delay
    4 ]3 E- H; U8 J
  315. - e; a6 ^7 U" N8 b/ ~( W0 {7 a
  316. / e" u! r  m) O" l1 T. h  o: _
  317. LDA #$800 }9 \' t! {, I1 I, {
  318. STA PPU_CTRL9 U3 z0 L" y2 ?

  319. : b- O8 V6 M. o: W
  320. LDA #$20- X8 I1 m& |$ r4 o# ]3 h- s
  321. STA Time_Wait_Cnt$ W  k" v0 G4 N9 [1 q4 ^

  322. + g2 W% m' P* i5 I  B
  323. Wait_Time_Over, V0 ]) t, t$ H5 ~& ~. A! T
  324. LDA Time_Wait_Cnt, m: X  D" R4 x, t8 m
  325. BNE Wait_Time_Over
    : Q% E5 P. b1 J/ e5 K# T0 q
  326. ! j4 W& f# e% m6 x
  327. LDA #$1F
    6 m* M; ?) u# E, \) T( H4 C
  328. STA APU_STATUS. W6 Q8 c3 S6 N& n
  329. LDA Music_Cur: N5 q5 o7 v% K' R0 S0 R% U: t
  330. JSR Sound_Init  Q/ q3 l# s/ y5 h8 W
  331. , M0 \6 c" B7 A5 o, S  J
  332. JMP MainLoop/ E. l* N# X2 a- |" Q6 N. z2 g
  333. 2 m' z/ M7 R- T
  334. ;==============================
    % d* r+ q/ n/ t
  335. Time_Delay;延时等待2 @5 V' e* {' q" h& {9 M* U
  336. LDA PPU_STATUS" ]# V& _% q2 U0 Y( W
  337. BPL Time_Delay
    2 r8 ~- G# e+ }1 n. H
  338. RTS
    / j, ~1 S, F& i9 X
  339. 6 c; Q1 D8 Q" k1 D! G
  340. ;==============================( r3 `2 a6 d4 g8 l. R1 ?0 I
  341. VramInit;初始化图形内存
    1 n8 }7 `7 F9 t$ |
  342. LDA #CHR_DATA_BANK) `7 a; K' }" Y- \/ n9 _: b
  343. JSR SwitchBankA0003 a8 ~: `# f/ d2 ~
  344. LDA #LOW(CHR_DATA_ADDR)3 m$ ?" C" a( l/ @- d* W9 {
  345. STA <Data_L
    5 Y/ a) t4 _2 R$ U
  346. LDA #HIGH(CHR_DATA_ADDR)5 Y/ U$ l& t& t8 T# a; X
  347. STA <Data_H. n( I' n5 _$ A! U( f! \/ O
  348. LDY #$000 ~# A' z! g( V: P
  349. LDX #$20: T; J* ^) g: w1 J
  350. LDA #$00' ], A) V' _  d8 y- v0 Z3 J% v3 ^, W
  351. STA PPU_ADDRESS
    * j* `9 l- r& r, f$ s
  352. STA PPU_ADDRESS
    1 k+ e: G4 q6 J8 t
  353. VramInitWrite
    3 f5 h; {) L! P2 P' C+ ~; J
  354. LDA [Data_L],Y! C4 H5 m8 Q- h7 |- [
  355. STA PPU_DATA
    ! x! q# b0 [0 b( L2 R( S
  356. INY' n& s  X& U$ x; P* f0 t( o! _6 n
  357. BNE VramInitWrite
    " V3 y) u$ x) n3 X+ u
  358. INC Data_H
    % _5 e: d6 a, W! `8 v( K/ h) f
  359. DEX8 O9 I4 ]" k' T$ R
  360. BNE VramInitWrite2 ^5 ?  r3 D( ^
  361. RTS
    : H' f. Z2 N) M8 t6 b3 c
  362. ' n* L6 Q& ~) |. @4 H) A; m6 s0 r
  363. ;==============================
    $ S, D0 s- H# o- ?9 X; B! g- i
  364. RAM_Clear;RAM清除7 C7 }) h0 d1 e  i; {$ j
  365. LDX #$00
    - h) v( Z( e- I  M' t" h, B+ v4 E
  366. LDA #$00$ U# l0 e) _0 c* N7 m7 u
  367. RAM_Clear_1# h5 ^8 a( O2 d- F# \8 [0 X
  368. STA RAM_Cln_1,X
    ( B3 b* m' Q) I
  369. INX
    6 y8 p3 j" e/ }- X3 ~& g
  370. CPX #RAM_Cln_1_Size
    2 K+ N# {1 a: U( w' ]2 b$ z4 i
  371. BNE RAM_Clear_1- C* ]! T. i8 T: d
  372. LDX #$008 Q2 E! O! ?" y3 v2 T
  373. RAM_Clear_2& R: }: k( Q" e% m/ Z
  374. STA RAM_Cln_2,X) ~8 c$ R% G; A- h3 w9 w2 O
  375. INX$ f6 j1 y' G5 [& i; E
  376. CPX #RAM_Cln_2_Size
    2 m/ f' F5 W  B
  377. BNE RAM_Clear_2
    $ l% [  D: c" x4 A6 V
  378. LDX #$00
    ! |, e5 B8 j% N! k/ w: O
  379. RAM_Clear_3$ X* L# g) D( C' T5 g/ U  W+ r7 I
  380. STA RAM_Cln_3,X
    ! n) ?. r' F) a( j1 e/ y
  381. INX6 ^8 W; k( K# j7 d% x
  382. CPX #RAM_Cln_3_Size8 Q: Z# r0 j! v7 [  d  z' \
  383. BNE RAM_Clear_38 z& l* b6 W% E6 }" Y
  384. RTS
    7 ?. r% U% P1 C( A% q
  385. 4 T, P7 {( a$ T( t% L8 r
  386. ;==============================
    - `( i# a& ~/ g/ u2 x. q
  387. ;音乐切换$ P7 D; l, b7 v( [0 b* t+ r* g
  388. Music_Switch1 B" \5 \8 ~, K
  389. JSR Key_Proc( c4 `2 i  ^/ f0 L: W
  390. LDA Key_Once
    ( J$ {* I; E/ i$ |
  391. CMP #$10
    % L# x- c) A+ z, x
  392. BNE Music_Start_SongStop+ j  n; c7 S- T; P
  393. JSR Music_ReSet
    2 Z+ Z, B: \. |& p0 V
  394. 6 Z) @& c; P! W+ h: x5 A
  395. ;音乐停止0 R' M5 y% Q! e" {% K" g
  396. Music_Start_SongStop5 r# \% o1 Z$ H/ Q) K
  397. LDA Key_Once
    4 K9 N: i, S8 }9 T0 g/ j
  398. CMP #$20
    6 I6 G. K% ?& H, K
  399. BNE Music_arrow4 ?  A9 U/ B6 f0 x, g
  400. LDA #$01
    / a! D8 K9 }2 q- g/ f8 Y6 \
  401. STA Music_State0 L" n$ M1 O' ]
  402. JSR Music_Bar_ReSet
    2 I0 P- h) T9 w: w2 @! @- M
  403. JSR Time_ReSet) b9 S) m, J5 m) c6 W
  404. JSR RAM_Clear! X, z( r) c9 A/ l& Q1 `9 [
  405. JSR Sound_Clear/ q. T4 h% u# J
  406. JSR Music_Stata_Show( B3 U& P; D. S5 [
  407. Music_arrow
    / M+ c- K& g' o2 C8 e
  408. LDA Key_Once1 `7 r, T# u5 Q
  409. AND #$CF- H; E7 D$ E, h
  410. BEQ Music_Switch_End, b5 n! h5 c- |/ w2 [
  411. JSR Music_Number1 f! L* q. z+ r* m9 ^
  412. JSR Music_ReSet' D/ g- \6 t" R% P4 f% S+ g
  413. JSR Music_Show
    2 c5 r. j5 N  ~2 U" _5 y3 {
  414. Music_Switch_End; s5 Y. V/ f* t6 k% \6 u
  415. RTS. v9 A/ n, @+ {8 h' q# n- j

  416. 0 p! v$ [0 g5 L  X) E
  417. ;==============================
    + F% o" m* b, X3 i$ F# o) y  P
  418. ;音乐曲目切换8 Q2 }0 V: U7 f( Z* D1 e$ R
  419. Music_Number8 h) k4 j( h; H' h
  420. LDA Music_Cur! y0 P' h1 {2 M' D
  421. STA Music_Last
    , A- i4 e, T/ r2 ]7 N& X2 g
  422. Music_Decrease
    ; \2 G8 [7 L% X0 E' I
  423. LDA Key_Once: j9 M) m& z/ }) j  Z: k
  424. AND #$427 e' U* ^$ R( T& |  T
  425. BEQ Music_Increase
    ' P3 i% ]  a; c/ B
  426. LDA Music_Cur0 b& Y9 x! |5 u& ]& a8 w
  427. BEQ Music_Increase
    - l- X4 f4 E% ^! m( G
  428. DEC Music_Cur
    ( u9 S: T( T1 Q3 K) A! M+ d
  429. Music_Increase7 G0 T! f% A5 [5 B; @& E+ ]: a
  430. LDA Key_Once/ A/ N4 z6 r& B- Z
  431. AND #$81
    7 T- s, r7 \4 _# D7 n. u
  432. BEQ Music_Decrease_10
    ; i, G( \4 |8 Z5 A% W5 B
  433. LDA Music_Cur
    ( V( ^. W# F+ x* ]
  434. CMP #Music_Song_Total-01' ]2 E, e9 }9 K. q+ F5 z
  435. BCS Music_Decrease_10
    2 o) n- n- B" n/ S/ g4 e0 `: K. B9 |
  436. INC Music_Cur) A" @! d' j, A' [6 J" J
  437. Music_Decrease_105 q# K3 M6 Q& l' k  \+ K
  438. LDA Key_Once5 C% j  |  ?3 r, z! o# P# \3 Y1 }
  439. CMP #$04& V! Z) D  O1 G2 I9 n
  440. BNE Music_Increase_109 u3 v2 l# u! e1 \# Y
  441. LDA Music_Cur
    + n& N( y% p$ M3 H0 b
  442. CMP #10
    ; i* M7 J7 _5 ]% p3 U' H/ x( ~
  443. BCC Music_Start_Song_Min
    * ?$ K7 h' T* u: b+ h% ^8 C1 K
  444. LDA Music_Cur" w7 z7 |) d' g  T7 x
  445. SEC5 i2 l( N. I5 Y* Q0 j2 i+ e
  446. SBC #10
    : R2 `7 P' F+ n
  447. STA Music_Cur
    : v5 E# ?3 K. B' L) q
  448. LDA #$00
    * Q) s# C7 H7 |( G. l  @
  449. BEQ Music_Increase_101 `$ F, [. F, _/ k' c% S. M
  450. Music_Start_Song_Min
    ' U. ]) B9 }7 v; N
  451. LDA #$00
    ; D, b$ m" f" q/ b* Q! Z$ U
  452. STA Music_Cur
    ( V7 x; a) h0 v4 b& e
  453. Music_Increase_10
    ; I* o: Q0 t; W, I+ n* P
  454. LDA Key_Once
    & V& w6 m8 K/ P2 E) z8 [
  455. CMP #$084 v  d5 w+ n4 I
  456. BNE Music_Number_End
    * O0 ?/ c# o4 m3 q
  457. LDA Music_Cur
    " @: n9 [- l) L
  458. CLC; @7 r$ `$ c- Y% U$ |
  459. ADC #10
    0 E. B' L8 [! d7 \
  460. CMP #Music_Song_Total-018 y' ?/ p. L2 ~- w# {- D" }
  461. BCS Music_Start_Song_Max2 X' L0 M# x& n
  462. STA Music_Cur* ^$ H: l+ E& ~+ z5 B+ ^7 ~: J2 T
  463. LDA #00
    + T) t" _2 ~: [: z8 n
  464. BEQ Music_Number_End
    % o8 Y2 L% S. \; C3 C
  465. Music_Start_Song_Max3 W" v. i3 {2 n4 W& p
  466. LDA #Music_Song_Total-018 {/ H( b" L: x
  467. STA Music_Cur) X9 `# {9 {% m/ `) @2 n
  468. Music_Number_End
    - n0 p* Q9 v' v6 q2 n2 Z
  469. RTS9 ]: f# P7 H7 f7 M; |

  470. 6 [3 _  I1 R6 M4 J: h3 c6 L
  471. ;==============================; s) @+ y$ V8 D# l6 h% s. F# A
  472. ;音乐重设7 [4 J( D% v. I0 ~3 M0 G9 h, L
  473. Music_ReSet
    , U. T! r, V9 C# I9 ^. }* y
  474. JSR RAM_Clear
    ' g* ?7 }* \8 i6 e
  475. JSR Sound_Clear, J% u: g( k5 ^9 t) a; W3 u, _7 [- x
  476. LDA #$1F
    3 z0 T) g+ f0 V4 [4 m' y. U
  477. STA APU_STATUS
    + A; K7 N# N" g' O4 K- V$ u+ o
  478. LDA Music_Cur' J" r* z+ e7 y! ?, k; c2 J
  479. JSR Sound_Init
    ! Q$ A2 U2 ~" U5 a0 w
  480. RTS0 m' z/ H# R+ o6 s

  481. / |' I+ d# N$ V) i) `% c
  482. ;==============================
    * Z* N/ p* F% B' I# _
  483. ;音乐端口清除* H( |+ z( N; c- T
  484. Sound_Clear1 T+ @6 `4 K. g3 @4 T
  485. LDA #$00. b  R  {6 @7 N' S9 a+ ]6 R
  486. STA APU_STATUS+ x8 b, q% G, J+ `- X0 l
  487. LDX #$00
    9 B+ l" f7 N: i. c% m
  488. Sound_Clear_Start) q$ e4 ^# s. e: E- y( ?* ~
  489. STA $4000,X% k$ ~+ V9 }/ ^* A4 C! ?
  490. INX7 O: q1 N- X3 v+ m, C! L
  491. CPX #$14
    : ^1 \8 t* s9 e$ H5 `
  492. BCC Sound_Clear_Start* k- H. R, a, j4 b7 v
  493. RTS
    3 Z4 y' d. ^+ }: _% k% `

  494. ( X; t5 t+ [0 }( f# u
  495. ;==============================3 I9 o" p- F3 t# e
  496. ;按键处理1 O3 I/ c6 ^4 U  Y) _
  497. Key_Proc
    # F- x! L$ y+ L5 U8 s8 Z5 d
  498. JSR Key_Scan
    , [# t, g  w4 [- n5 D* A: l, p
  499. LDA Key_Keep" j* k0 O7 ^# C8 y& Y
  500. STA Key_Temp
    * O, u1 l9 @7 M6 L8 B3 [! U5 U
  501. JSR Key_Scan, h9 A$ X" |9 F) J/ }0 `
  502. LDA Key_Keep
    ) h6 H# @" B" z" p$ }% u* R
  503. CMP Key_Temp
    ' O  ~' R2 H, T/ s3 q
  504. BEQ Key_Get_Once
    6 o5 d1 f" Q* R( O& |0 u+ I& E  C
  505. LDA Key_Kemp8 I# _4 G# |  u. _8 l4 Y
  506. STA Key_Keep
    : k+ J# ]2 Q8 l" \. O
  507. Key_Get_Once
    , [3 y$ }% b5 `7 p& @
  508. TAY- R8 o) S( d! i
  509. EOR Key_Kemp
    5 V$ M9 K8 B: h% y; ^. ?
  510. AND Key_Keep
    . [, e+ J1 `' d  F9 S
  511. STA Key_Once
    : n- D; ^! |( k6 M- l
  512. STY Key_Kemp% Y2 Y% t- [+ J8 @* y' ]- ?. e
  513. RTS
    ( M4 A) h1 x; Y3 O7 _
  514. ;------------------------------
    5 f0 A: U3 S/ f; r1 t
  515. ;按键扫描
    # K* M9 Q" a2 s  B
  516. Key_Scan
    : d: F' i& _& U5 V9 Q
  517. LDX #$01  Q" R, n$ Q6 K2 k
  518. STX JOY1_FRAME
    4 A1 s9 A/ ~% U4 D8 Q& s* g
  519. DEX
    + o9 O5 V& o( a* A
  520. STX JOY1_FRAME) p2 G' e! _* P) o# I
  521. LDX #$08+ X. w7 y3 o% N5 }3 ]
  522. Key_Value
    % C7 G7 ~; X, k' _: g3 k; n# R$ U6 o% S
  523. LDA JOY1_FRAME$ B3 n5 i' X: z  C: ]  y; z
  524. STA Key_Getv3 n6 |: A. O+ s" s. m" V, [
  525. LSR A
    4 _4 H2 Y+ |) e" J" i- o/ h
  526. ORA Key_Getv6 y$ t+ A6 Y5 u* [: \9 d
  527. LSR A7 n! F! b  x! K" y4 H% b
  528. ROL Key_Keep" ]+ H7 C# C0 `, [8 x6 H
  529. DEX: q: u, u. P. N& S
  530. BNE Key_Value
    7 [+ K$ ]+ V7 s) o7 y' `
  531. RTS1 g% P) p4 J( ~8 x

  532. 2 c: X+ g) Y* z% I( F' Z
  533. ;==============================/ g* R9 Q0 K* h& ?- p
  534. .IF SOUND_BAR_SHOW_ENABLE; a* [7 V( N. f4 c& [2 y
  535. ;音乐条显示
    0 \: |* b, ^# _9 y
  536. Music_Vision9 L" g4 V& w* ?& y* T5 m
  537. JSR Music_Animation% x! S$ b. B  n+ @4 D
  538. JSR PPU_End( o! t# h3 ^7 N" ?0 T
  539. RTS
    $ C  [( ~* y) t& e/ ~1 L: a
  540. ;------------------------------  f3 O% D1 v8 ?3 @
  541. ;音乐条显示处理, |# D/ q, O. @" C
  542. Music_Animation
    . K( Y" Z, S4 O) k# ~$ ~  o
  543. LDX PPU_Cur0 U7 K8 E3 \& a! W1 w
  544. LDA #Mode_Line
    4 l2 b+ q- c2 b2 C; A$ r0 p: P
  545. STA PPU_Addr,X
    - |) @/ V: \9 e  p4 Y
  546. INX: [; A8 J6 [0 Z' ]1 F/ P6 B; ]
  547. LDA #HIGH(Sound_Bar_Pos)! I% h" m2 G# e6 b* J5 j
  548. STA PPU_Addr,X
    7 p/ a& {$ c: q8 Z/ e6 {3 W; B
  549. INX, W3 |9 @0 W6 H/ R5 Z0 }
  550. LDA #LOW(Sound_Bar_Pos)0 v# @; X+ Q4 s
  551. STA PPU_Addr,X$ @, i8 k( B7 T
  552. INX
    4 [# S: V( x; O) k7 p
  553. LDA Sound_Bar
    0 x2 j1 l( l) t+ h1 U3 C# G
  554. JSR Volume_Convert$ w8 g$ L* i0 X3 g/ a
  555. JSR PPU_Return$ ^1 h8 k3 d' c) f7 A+ i7 D
  556. LDA Sound_Bar+$4
    - ]# g( i. e- c8 f1 _5 Z2 g; j
  557. JSR Volume_Convert$ w( a# K4 g: t! Y& x$ l; d
  558. JSR PPU_Return# t6 h- J! o0 P* u* k
  559. LDA Sound_Bar+$8& g! w- T# h( |
  560. JSR Volume_Convert_Ex
    & x2 f/ `  P& o- ]6 L
  561. JSR PPU_Return
    ( Y0 g+ _* J" M% o; f* z
  562. LDA Sound_Bar+$C$ H# @& p( q" t$ N4 Z. x2 r
  563. JSR Volume_Convert. J8 I4 d/ Z/ I* D
  564. JSR PPU_Return
    7 O7 R, n9 O- E1 K& W! @" h) q4 K- W1 J
  565. LDY #$10. @/ Y9 u/ a/ x9 i- g
  566. LDA APU_STATUS
    & J3 a& u+ n3 Q6 q" a* b0 y
  567. AND #$10
    6 i$ L0 K# J, G/ _2 S" U+ N
  568. BNE Volume_Count6 F$ K4 k! s/ f- O! t. |
  569. LDY #$00
      |# k; E6 A* e/ {4 p/ o8 C9 j1 Y
  570. BEQ Volume_Count+ D% X/ Q3 A5 k
  571. ;------------------------------
    ; N5 E; {7 C# a* T, Y( y% C0 d+ R
  572. ;音乐条处理2 \! G3 y) Z; J3 N$ u" H' n# P8 R
  573. Volume_Convert_Ex7 U4 E4 {# I! W3 p$ G: t; [3 ]( k
  574. AND #$1F
    5 w9 S- G! O' p# O% z
  575. TAY" o: [1 e! p# j
  576. BNE Volume_Count
    : r  L( N# N) ~. B9 V' `" B* ]$ m% d
  577. Volume_Convert
    % |, w2 J6 u* S4 O* t. ~- T
  578. AND #$0F
    3 m- ]4 p- Q) c& `7 @  C
  579. TAY
    2 U/ \4 d2 k5 t2 r+ t) w2 _) `; ]
  580. Volume_Count
    ( k$ I- w' p* G% ?' |
  581. LDA #$08
    : d) V5 O$ R) _! v: S* H- ~
  582. STA Sound_Bar_Cnt
    1 S/ z- i  k! `9 {' i  j
  583. Volume_FILL
    . {: [7 m) m  j4 D, o% ~4 {
  584. DEY
    / S; `( r1 w& E$ w& w+ X/ @2 ?4 A
  585. BEQ Volume_Half  F9 }2 {. q9 m7 L$ H2 l
  586. BMI Volume_Empty" F0 g: u% [1 V  S& x3 D/ p
  587. DEY
    + h/ \: U9 G  D8 U
  588. Volume_Full
    ) n( b* m9 T. w# @$ v& ?6 G. K
  589. LDA #$16  o$ [4 ~1 Q0 e
  590. BNE Volume_PPU4 J( T& a' Y7 o% a# t) E
  591. Volume_Half' B  \2 j( V2 u6 ]% k* E
  592. LDA #$15
    * v( X2 I. k* z% u
  593. BNE Volume_PPU
    * @3 F! w) ^/ Z
  594. Volume_Empty8 |) A' r7 f- U! L5 a
  595. LDA #$14
    2 u" i+ |1 J7 V- J6 r" m2 }! c
  596. Volume_PPU( i6 ]2 e1 k1 ^% S5 v9 K2 |
  597. STA PPU_Addr,X
    : }2 C# H& B/ A$ d2 E
  598. INX
    % F" v6 [/ ^5 @  y6 b% B, V
  599. DEC Sound_Bar_Cnt: ]( W* a, {$ H6 U$ J/ w3 ^
  600. BNE Volume_FILL$ \& z% p1 K' o! u) k& ^
  601. RTS! ^* n& R  M: o& V* N* l# Q" x

  602. 4 x9 t6 j3 g2 A$ B! h9 a
  603. .ENDIF
    ' W+ r: }5 P3 j! G

  604. ) h4 \) n+ t. }' i) _8 ]
  605. ;==============================
    : {8 l7 a( D3 I" J9 L. d
  606. PPU_Addr_Set;PPU行开始
    2 s" X& w1 r( {3 C
  607. LDX PPU_Cur9 u% g* A" ~2 G& A: @, M+ }* i
  608. LDA #Mode_Line
    6 M8 E8 R9 ^7 N! c6 L8 H7 \
  609. STA PPU_Addr,X
    5 }! G$ z, Q) l+ d# R
  610. INX
    8 f3 @0 |( Y. j, P
  611. RTS! o2 x9 ^$ m" o1 X2 f' ]7 P- h7 c: M& Q
  612. 5 }, I) m( g* i
  613. PPU_Return;PPU转行
    , E0 |) K/ i8 i1 P2 \0 h1 A
  614. LDA #Flag_Over# d1 Z: J, e4 R: Y9 y" c# x
  615. STA PPU_Addr,X) P+ f' ~* y! P6 y
  616. INX
    2 P! x2 T$ G& U9 l5 o
  617. LDA #Mode_Return( a# y6 Z  k. ?# j/ ?, M  B  a
  618. STA PPU_Addr,X, H6 w. d4 b: [, b
  619. INX
    3 B. ]# |% @" m
  620. RTS
    : c+ P0 `' w* Q, Z$ L- P" v( X& e% M
  621. $ S! }0 D& o2 \/ @$ Y
  622. ;------------------------------
    . B8 i. ^& K4 m: U, ^/ S* K
  623. PPU_End;PPU结束' x& r- N: I/ y/ W( R
  624. LDA #Flag_Over
    ) t2 i/ n  A. J6 M) y3 w% H
  625. STA PPU_Addr,X
    2 [: `+ U& s. S. X, W! V
  626. INX# u2 y3 q" G# l5 s0 g! ~, A6 C' M( k
  627. STX PPU_Cur  p7 H9 a" w( k1 y+ ~1 L
  628. RTS: v$ c: k) S) j* s" w/ Y. E/ p
  629. ;==============================
    4 S+ f: Z. P9 e, C
  630. Mode_Line     = $FD    ;新起行模式$ Y, k# M% `2 s5 v  f3 @# i
  631. Mode_Return   = $FE    ;转下行模式+ @8 w$ B5 K. I+ }
  632. Mode_Clear    = $FC    ;行清除, [, G) R% ^: w7 Y0 t/ |7 p) v
  633. Mode_CntLine  = $FB    ;行计数写入
    , X  |/ C. \) |5 \2 |
  634. Flag_Over     = $FF    ;行结束标志
    + L' [+ I! B% k' H1 }  h+ L; C+ b

  635. 9 v" r! n$ L* Z) t
  636. ;------------------------------
    4 F$ `6 ?" V3 q) O* a1 P: q+ O# X0 {
  637. ;PPU处理$ i, L' Z# f$ C2 }6 P
  638. PPU_Proc7 {+ x* {# J9 B/ `: @( c0 X" k; @
  639. LDX PPU_Cur
    9 X$ S4 W) r% p7 O1 p' x" g
  640. LDA #$00
    0 V" o+ q  `6 R- I  \
  641. STA PPU_Cur( ?: j. y& B- ?! c: H4 F0 f  R# H
  642. STA PPU_Addr,X. ^3 k3 J' o: ^' q% q+ p' }
  643. LDA PPU_Addr
    & F# ~6 H# H- M9 P+ ]6 B2 i# \
  644. BNE PPU_Proc_Beg: ]& [; ~/ ]; Z- A9 Y
  645. PPU_Proc_Ret
    , L. g' |0 T- K6 |1 l  y4 Z
  646. RTS
    - g, p, _  k& k. g$ H" S; e& t
  647. ;------------------------------
    # G3 O+ M. R/ x7 @2 O! H( j
  648. PPU_Proc_Beg  ;处理开始
    5 z* `5 M+ }3 X% F
  649. LDX #$00; R% q7 E2 [% V
  650. STX PPU_MASK
    * r+ d( S+ f% W8 d) t1 E8 {; A
  651. ;------------------------------0 Q! I. Q4 H- Z0 W
  652. PPU_Mode_Select  ;模式选择
    - x/ q/ M7 x) h! r
  653. LDA PPU_Addr,X
    / c, o& l$ f* e& W0 e
  654. CMP #Mode_Line
    1 k# S% I2 C$ }( V, C' t
  655. BEQ PPU_Mode_Newline
    ! D( R4 ]( D; \, U  p1 g
  656. CMP #Mode_Return, J5 p" M7 h& X2 k  k* D6 T. r" O
  657. BEQ PPU_Mode_Return
      Q, J3 b% t1 z
  658. CMP #Mode_Clear2 t, z7 u( {4 I; c
  659. BEQ PPU_Proc_Clear
    ' T0 b' e6 k! I* P, }1 Y9 J4 e  }
  660. CMP #Mode_CntLine
    - b. ?4 S8 ~' D2 y1 X/ G" K, P
  661. BEQ PPU_Proc_Cnt_Line- y7 |, V' U$ X. e
  662. RTS1 ]+ m3 h1 S$ |. R
  663. ;------------------------------0 s" o9 ?9 ~: S* P0 @
  664. PPU_Mode_Return  ;转下行模式
    & y  c7 P" g: r: C& C3 b
  665. LDA PPU_Addr_L
    % g, b' i- g" q5 [/ U8 T( T% E! z
  666. CLC
    6 V* z1 J* k- f4 t- L+ l
  667. ADC #$20+ G$ q9 I+ z; ^7 F5 r# m, E
  668. STA PPU_Addr_L8 [  e2 f5 z  B( ^! B& H
  669. BCC PPU_Return_End
    & y0 H( A0 i6 C; P: k
  670. INC PPU_Addr_H
    / n  @8 y) ~1 N+ M+ T# W
  671. PPU_Return_End
    ) \; O3 @' Z' [# Y8 ]  v( M% j
  672. JMP PPU_Set_Increaser
    : A9 I3 \( {; k: A, F
  673. ;------------------------------0 s3 C" L  x# F; w6 k7 E1 A7 \( v
  674. PPU_Mode_Newline  ;新起行模式0 o* P( E: k  _3 l6 G+ K
  675. INX- P' v4 J  f5 B$ H+ D7 M
  676. LDA PPU_Addr,X
    ' |0 V) j& o/ i; M. o1 t5 E
  677. STA PPU_Addr_H& J5 a2 Q1 X, d* F# b+ |6 b
  678. INX
    1 z$ A: ^" ]- W' h9 {) r
  679. LDA PPU_Addr,X
    % D# E7 a% t; X$ |0 y! I0 |& j
  680. STA PPU_Addr_L, l* N' v/ Q% }
  681. ;------------------------------! r  U5 ^  h- g. j, ]* T
  682. PPU_Set_Increaser   ;设置写入地址- f" [" Q& W! W1 {
  683. LDA PPU_Addr_H
    5 C0 r4 i, A2 Z# i* w* A, E
  684. STA PPU_ADDRESS
    / S, J/ ]2 C7 S& e
  685. LDA PPU_Addr_L
    9 N2 m5 @  i0 _3 X1 Q# Y
  686. STA PPU_ADDRESS
    . H* B! J9 M; e& u2 c+ M
  687. ;------------------------------: \+ \$ Q3 s8 `
  688. PPU_Write   ;写入数据
    * q/ b7 r4 I' n
  689. INX
    # [' B/ @8 W7 H8 i
  690. LDA PPU_Addr,X! a% S1 \) b2 c: x; h
  691. CMP #Flag_Over( J9 A4 B1 P& t( X# @5 N& Q% I: |
  692. BEQ PPU_Proc_End
    % O# B# j7 ?& k/ e( P3 `% F4 V0 S$ c
  693. STA PPU_DATA1 ?6 L$ Z% s" t5 c: ?" j8 w6 a) J) @
  694. JMP PPU_Write
      a" p6 L7 z% q; L& O3 J
  695. ;------------------------------
      l" d/ {: w, P) l- W
  696. PPU_Proc_End  ;单行写入结束
    % a5 ^% e$ V, P: Z2 J& Q
  697. INX
    ' D2 Q9 q& p3 _5 u" j
  698. LDA PPU_Addr,X
    ( p! u4 T4 a, i( X5 K! A% c2 n
  699. BNE PPU_Mode_Select2 W5 h" m  i8 f9 }2 d
  700. STA PPU_Addr
    & X$ \: I9 \+ t& s0 j/ o% v
  701. JSR Update_Palette_Color
    9 u2 I' G# h! }0 B' D
  702. LDA #$00
    ) \2 L5 X- }6 {$ l5 C( ]
  703. STA PPU_ADDRESS* o3 Y  F' s5 u5 F# E, y9 A
  704. STA PPU_ADDRESS
    ! k9 W# L. e' M. T0 Y: `$ D
  705. STA Show_Track_Name7 L) W8 o7 r  t
  706. LDA #Scroll_X
    $ l1 \7 s* \" X. J) t% K$ U
  707. STA PPU_SCROLL
    % \& n8 B0 v* e& H1 t
  708. LDA #Scroll_Y
    : i: Q* b* }2 r! z- b
  709. STA PPU_SCROLL
    4 z1 u7 j( R+ N' ^# ?* H
  710. LDA Screen_State2 C7 d% z) T$ |. m% l1 V3 C+ U
  711. STA PPU_MASK: B3 ~* @, C* e+ ?& Q6 }; X
  712. RTS
    3 Z" M: H' y" }# F# F( L+ f& ?6 I
  713. . ]: {: E5 X6 w4 \" |1 l
  714. PPU_Proc_Clear% U( @6 z$ ]+ V" [/ r
  715. INX6 F, x1 \0 M3 Y& {8 R* j. }
  716. LDA PPU_Addr,X
    ; t, x9 F5 {5 [) t4 J
  717. STA PPU_ADDRESS$ J  \! V: K9 z7 Y8 K$ T$ o8 X
  718. INX" b- p8 }7 D$ [  [2 h* R( R) u
  719. LDA PPU_Addr,X
    3 Y+ ^, \4 h3 g& L  `+ z* }8 Z
  720. STA PPU_ADDRESS
    , a" S- ?4 B- h* s6 ^9 l/ Z+ d
  721. INX; |, d0 ^/ x( T
  722. LDY PPU_Addr,X1 e0 c' b  ~. ]: ?6 l) e% C
  723. LDA #$00
    % k' J* C3 N" n9 O+ G/ n; K8 z
  724. PPU_Proc_Clear_Write
    ' B4 S/ f# _( L6 x- J
  725. STA PPU_DATA
    ( Q9 x' a" t% ~& d
  726. DEY
    + u" S6 i1 z) ^( ]1 i
  727. BNE PPU_Proc_Clear_Write
    6 z2 R8 H- j" o& \# t4 t5 ~4 ?
  728. JMP PPU_Proc_End# Z& [, ?: f( b, w" f* q

  729. 4 _4 b! \& Y* E
  730. PPU_Proc_Cnt_Line- o/ J; y, o; O  O1 G
  731. INX' U- y: _: y8 D! t! m$ k/ `
  732. LDA PPU_Addr,X
    - q7 S# J' N& W& o5 z
  733. STA PPU_ADDRESS
    2 V7 V. O9 J* Q6 C) e+ \
  734. INX, ^' [8 Z  Q3 |9 R. |$ G1 x6 G
  735. LDA PPU_Addr,X9 c) w* w9 A% S7 E2 N+ M4 n0 `
  736. STA PPU_ADDRESS3 ]4 {( d$ x( x/ ]
  737. INX& m$ I3 w1 v- @# @+ b3 L
  738. LDY PPU_Addr,X2 Y! y4 u- E/ A& f
  739. PPU_Proc_Cnt_Line_Write
    ! [+ u; T& d+ V( _* S% b
  740. INX, _! M3 z' m: V, _& H8 w
  741. LDA PPU_Addr,X
    # U. C# H. [9 h5 V! ?5 O
  742. STA PPU_DATA) {  Q4 {. e9 n) ~8 `# @
  743. DEY
    : P0 T; A. ~6 L. p* u. z
  744. BNE PPU_Proc_Cnt_Line_Write$ t6 k6 h) _8 D& c4 @, G
  745. JMP PPU_Proc_End3 M/ m: N2 e) _9 ^  r% ~( L& [
  746. 3 k1 S' ]3 u) P! {+ d
  747. ;==============================* }$ c. ?0 ^2 t7 d7 y
  748. HEX_To_Dec;十六进制转十进制
    ! m3 r: g% ^6 l0 A) U
  749. STA HEX_Data# b% P9 s/ S( L3 B2 ^. Y" n) h
  750. PHA
    8 w* }& E9 I1 N1 ?" n. i
  751. TXA
      J0 y8 H$ F& E1 z8 |  {
  752. PHA) `% J: P  Y4 i9 b, Q  V, Z/ R
  753. LDX #$00( d2 b7 Q. u# T) z
  754. LDA #$00
    ; F/ E7 H* W7 z/ o9 ?$ B8 F0 L3 P
  755. HEX_Cln$ |% c9 R$ e8 k2 ?; g9 V
  756. STA DEC_H,X
    ) V" a6 Z4 R) |- x
  757. INX1 f& C# }" Q6 y4 I7 d0 y6 o* M
  758. CPX #$03% ^( v, K" c7 c, @# {9 @& |
  759. BCC HEX_Cln
    5 _0 r, O% R1 x
  760. LDA HEX_Data/ ~3 ^: L7 b! O+ U, l
  761. ;------------------------------2 g" ^- M2 z: m# q
  762. HEX_1001 d% L# R. x( a) `% l2 i
  763. CMP #1007 T+ V' O4 a: d- G$ d, m
  764. BCC HEX_10
    5 H% ^3 m$ ^8 w/ \( f; y* y
  765. SEC: q! @( K% e7 x  n9 j' z: Z
  766. SBC #100& D5 ~6 K( {+ H( M8 \. q: [0 e
  767. INC DEC_H
    ' W1 E. B# D8 b; N2 f
  768. BNE HEX_1006 s) A% @3 {9 q
  769. ;------------------------------
    " j# W8 G$ c: S
  770. HEX_10
    4 U7 d. n# d. m& n8 N% Y/ b1 [  w
  771. CMP #10
    4 d  \9 h" _) a# @. @' {
  772. BCC HEX_1
    1 t6 {% `3 f9 B" a7 n* y
  773. SEC
    8 O( t$ L) m5 ]5 K- H
  774. SBC #10
    + \% Y  Q# ~: K% w6 s9 ^
  775. INC DEC_T
    & `$ g3 u) }4 Y/ R' H9 E
  776. BNE HEX_10+ e" t" y+ ~3 H+ v/ t+ f
  777. ;------------------------------% C- x2 |5 I5 U* r4 P
  778. HEX_1! o- K  K' H5 h3 k  X7 Z! j4 }( U
  779. STA DEC_L' n( U1 u) J9 E" c1 Q
  780. PLA, d2 r: r# z6 N9 @( \+ w0 e5 X: m4 `
  781. TAX; `4 w6 m) F. ?
  782. PLA
    , y" c  C* o/ N
  783. RTS/ `+ _8 i5 l* a) |& v( N6 ]) ?

  784. 3 p2 T$ k4 ^6 ?2 O- h8 t( r( Z! k/ s
  785. ;==============================
    + E% C1 o9 z( W) W# d& j
  786. ;音乐曲目显示
    0 p. e$ e! N3 _( e, `
  787. Music_Show
    & L: f( B  A+ a
  788. LDA Music_Cur* e1 }' H9 s$ ], u) `8 c
  789. CLC2 Q6 ~5 E5 y7 ^( j
  790. ADC #$013 L' k) |0 B0 r6 |. O$ T
  791. JSR HEX_To_Dec1 B( y* F% f* ]6 m8 s2 P3 }  k
  792. LDX PPU_Cur
    0 w4 Z9 F. n# c# c( o
  793. LDA #$FD
    4 N( Q; v, J5 Z! _8 Z; L! l
  794. STA PPU_Addr,X" w# P* H% W2 R: `" e
  795. INX8 S9 M* P8 ?5 P
  796. LDA #HIGH(Play_Index_Pos)) T; j5 L: d! T" k+ V# V6 n
  797. STA PPU_Addr,X
    - j% `3 q2 \0 I' T. B
  798. INX
    9 U( q: W  Y" ~3 z
  799. LDA #LOW(Play_Index_Pos)' `4 C; i. A! ~
  800. STA PPU_Addr,X1 q5 c2 t2 S# \
  801. INX% S7 y4 |2 y5 F. G: H" w2 V( l% [
  802. , p1 y$ j' n+ f+ N  y& T
  803. .IF Music_Song_Total > 990 Y4 Z6 @* e7 h/ j  ^0 `# h+ A$ ]
  804. LDA DEC_H
    , L# C1 o4 l" ^. G! L
  805. ORA #$30/ y3 U/ D2 P7 G2 ]$ c' {& H5 N" B
  806. STA PPU_Addr,X
    9 `6 g0 P" v  h6 D  P
  807. INX& S$ o: J* N, B6 R
  808. .ENDIF& r# A/ i- b; D% c. c3 q
  809. - [$ @! D1 o8 j$ q& U3 }% D0 V7 v7 F
  810. .IF Music_Song_Total > 9
    ! y+ d0 j8 w/ z# _0 Y' A- Q
  811. LDA DEC_T4 O) L, N- Q. A- J' Q! U# W
  812. ORA #$303 s* O- o; d- Z& |
  813. STA PPU_Addr,X
    - z0 {6 G2 v2 \, [+ ?  }% U
  814. INX
    . K( K! @: Q: x! F
  815. .ENDIF
    8 V' k- ]; w* w1 y0 }

  816. ( G7 N# G: _4 e. M, O; _' Q9 o
  817. LDA DEC_L
    / g  ]2 `" |# d+ x# O& ?) O  }, }
  818. ORA #$30
    $ \8 Z# i; F0 W0 `5 \
  819. STA PPU_Addr,X+ \8 F5 p) o1 ~
  820. INX
    & O( X2 c: O  @6 @9 e; k4 k

  821. * F; n* C. o0 a# A" e
  822. LDA #'/'7 K! [$ H8 p( \! J& h1 E
  823. STA PPU_Addr,X
    4 v8 c0 F" ?, g* K5 p
  824. INX
    , h. L- s( v( H& Q
  825. Music_Show_Total
    0 Z. S5 m& E4 M4 e; T! a7 _
  826. LDA #Music_Song_Total: o( r+ k' }: R1 ^4 N
  827. JSR HEX_To_Dec
    1 D( c. P/ f8 r& U! K& Y# j9 a7 z

  828. 5 M$ {" l8 S7 ], K: D
  829. .IF Music_Song_Total > 99
    6 L# v$ R6 D; C- k4 Z' ^  j! F
  830. LDA DEC_H
    5 b% s. `0 u$ V2 |3 [
  831. ORA #$301 Z8 N& h; x# k0 G
  832. STA PPU_Addr,X
      G% x* ^+ y5 X0 ]
  833. INX
    # E4 y4 {8 |- B4 ^" \( S
  834. .ENDIF$ {; M# R* Y& p  O2 g' n$ }4 x
  835. 3 o7 [3 q- }  d$ \
  836. .IF Music_Song_Total > 9
    . E3 Z& H6 S: ^$ U& a
  837. LDA DEC_T& A3 A( E3 X8 U% y
  838. ORA #$30) O# a* V6 y. P. ?+ y4 ?
  839. STA PPU_Addr,X# a* A# Q7 {, p  [' ~
  840. INX; I2 F& o% F) z$ _1 p  g3 S
  841. .ENDIF
    7 \1 H4 t; N- T& q- u- O

  842. 5 Q- d/ ^# C0 u
  843. LDA DEC_L
    6 r# j* c% {+ d1 |
  844. ORA #$306 M2 }4 x4 u: O& K3 P
  845. STA PPU_Addr,X+ b0 k; S! Z3 F, n3 b1 ?3 U) e( R
  846. INX
    . e# ]8 N9 q( V" ^' m( \. K
  847. ) L9 I( C. @; l, [/ d$ {
  848. JSR PPU_End4 N4 Q; o: q! I4 `1 Q$ ^# V8 k
  849. Music_Show_End
    4 t/ @; H- m. p) C3 e: l' j
  850. RTS4 H# t2 y- e( y2 d

  851. . J9 _% q% e& i7 F" y6 O
  852. ;==============================
    ; M, L$ D; O0 X4 x; P- d7 T
  853. Time_Show;播放时间显示
    % u; e2 i7 S: ^- B4 V/ W5 l
  854. JSR PPU_Addr_Set
    6 _6 F2 u) t' v- J& c2 K% ?
  855. LDA #HIGH(Play_Time_Pos)% O5 Y! E8 Q% B
  856. STA PPU_Addr,X
    ' v$ @3 R% r; F  v2 E
  857. INX5 i. {0 D5 V% k8 w; X) ]
  858. LDA #LOW(Play_Time_Pos)/ \1 f- R( ?) {9 {: a/ b
  859. STA PPU_Addr,X
    8 a1 p* [' X4 W3 d) J
  860. INX# G7 I6 q2 I0 v, E& y* B0 l# i
  861. Time_Show_H
    + h  l/ C3 g; r/ P0 A: U& X8 @
  862. LDA Time_H
    . n( ^9 p# n3 b0 ?8 C6 R: r
  863. JSR HEX_To_Dec
    . ~0 T  C" q; Q) s
  864. JSR Time_Digit' J  F* E6 O# U: `5 k
  865. LDA #':'
    9 p. ^- q+ M* X8 Z! r) K  V
  866. STA PPU_Addr,X
    3 G, D; L" w# K" n6 J, e
  867. INX
    & I" y; c% j6 i# L
  868. Time_Show_M/ \$ O4 _* _' _" K: R, C* {7 Q/ `
  869. LDA Time_M- u$ q& D3 I0 B2 k( k
  870. JSR HEX_To_Dec
    ( e% U9 S3 Z. z; D
  871. JSR Time_Digit
    " ]( e' [% W8 \7 w0 t9 G
  872. LDA #':'
    # K% _7 Q( b4 c8 N
  873. STA PPU_Addr,X" S: C4 V" E& Z' ?1 b
  874. INX
    # l1 u( L' q+ O
  875. Time_Show_S
    ) v8 @; `  f! e
  876. LDA Time_S
    $ D. D  I7 I* U! g# \
  877. JSR HEX_To_Dec
    * n. H# z& {' b. \7 Q
  878. JSR Time_Digit
    * i$ \# h+ i; x0 E
  879. JSR PPU_End- H/ p0 W  o' W6 t/ z- f( {+ B
  880. Time_Show_End# {1 H2 ~- T; H% c# b7 ^8 \$ K
  881. RTS# k+ O! z) J8 \* M. z, q

  882. ; o+ g* ^5 m* s( D, T* Z7 L4 U
  883. Time_Digit- m2 R) B4 U/ J" F$ w* ^
  884. LDA DEC_T( l7 t$ e  h$ K1 h
  885. ORA #$30. f) N0 s  w' D9 E% J8 F% t
  886. STA PPU_Addr,X
    # v9 t8 I. O* g
  887. INX
    ; d7 m2 u. u! @9 h7 B7 h  c
  888. LDA DEC_L
    : T4 V$ y7 S1 w" ?
  889. ORA #$300 A: ^5 J: _# M
  890. STA PPU_Addr,X
    6 x  C: F2 w& I3 f: t
  891. INX' I6 t1 x8 N# Y" V
  892. RTS* U, _  y. S0 i8 `7 x1 D) F2 H
  893. 7 }1 I- c, c' s" \3 e/ o
  894. ;==============================6 E) z: Q& H# S* U7 X( J3 o6 }" @0 m
  895. Time_Count;计时
    2 O( {  K% S" L" m' _
  896. LDA Music_State" e! M/ [: J& j8 z
  897. ORA Time_Wait_Cnt
    / A; Q6 ]0 r. N+ B7 n
  898. BNE Time_Count_End
    5 n2 y# J8 q0 y2 E  A
  899. INC Time_Cnt
    9 I8 \' d, t. O+ S: l
  900. LDA Time_Cnt" _7 q# Q4 n4 k  P1 G/ J0 E
  901. CMP #60
    5 ?9 a( R2 u( w( b( ~  e
  902. BCC Time_Count_End
    " x% ^7 e; E8 v3 s
  903. LDA #00' R2 [* Q9 Z+ V) h# V# m
  904. STA Time_Cnt" ?) W- z  w: f+ g3 D- U
  905. INC Time_S
      V: g, m" B! N+ @
  906. $ S( p) r! K+ K6 d: r- Q
  907. Time_S_Cnt
    % q7 p1 u6 i- o0 g) _
  908. LDA Time_S) L) H6 P; {8 c/ W% M- w# w
  909. CMP #60
    2 K$ W6 d: O) X" [. S* S! T) W. }8 a9 o# W
  910. BCC Time_Count_End
    , f: L) j: W2 [1 z9 E8 c( V
  911. LDA #00
    ( a9 r4 j0 F0 u$ h
  912. STA Time_S, A+ ]: e/ [; j2 u. ^7 h0 W. G- D
  913. INC Time_M
    & O) b* ~) m$ `" f8 o1 l
  914. / s) l! c2 r" Q6 S6 H& ~  D
  915. Time_M_Cnt
    # E: ?# M/ [6 m# w) I% c6 h5 J
  916. LDA Time_M
    * M! K5 y" p  d3 j; u
  917. CMP #60+ }- X) \. ^* [% l# u7 c- l
  918. BCC Time_Count_End
    * k$ Q7 O; ^5 X) y* o- [
  919. LDA #00
    8 s0 j+ t# C: M* V. t% q
  920. STA Time_M( r( f0 z  f1 B* f, v& q8 w
  921. INC Time_H
    , d$ P; }" V  m$ E
  922. ( P/ E- S# i9 @# C) s9 R3 W6 |
  923. Time_H_Cnt
    6 M8 y% O$ {5 q, D- _: a* {
  924. LDA Time_H5 Q: B  x8 }" Z4 Q
  925. CMP #24
    7 L& H# Z, `3 \4 {( q2 j9 b
  926. BCC Time_Count_End
    ) u  V! y5 c' _9 f
  927. LDA #00' T; V% ~& W' f1 f% b4 d" ~
  928. STA Time_H
    ) p+ g' i6 o9 V3 I# U- |. b0 P
  929. 3 t/ l* U* ^( ~  L
  930. Time_Count_End9 W# N) `! z" Z; m' C' w) X) [
  931. RTS' c! l4 Y- m: O" e9 f' v% e$ ~
  932. 6 B& ?$ c, s9 l
  933. ;==============================1 m: D5 g, _+ H/ |' z) q
  934. Time_ReSet;播放时间重置
    0 _* p) q* d- i
  935. LDA #$00
    0 f; ?9 B2 v* y7 W
  936. STA Time_S
    - m& m0 X5 |$ n; B$ `
  937. STA Time_M * f/ O; }: F$ v* V; _+ n! g
  938. STA Time_H4 U$ k- h2 |0 _. [
  939. STA Time_Cnt! r+ i. m0 R4 Q, x7 H
  940. RTS. [6 }1 ^' @9 u& B0 o+ a" e( X3 N9 ], w
  941. 9 |$ q( ]6 l" j% g- o: T2 s
  942. ;==============================+ O% j! i) s% p6 X( R
  943. Music_Bar_ReSet;音乐条重置# g: ~2 {" k  s) Q
  944. LDA #$00
    * O6 F- n6 T; c8 j6 f
  945. LDX #$00
    7 Q& y( X/ k* }$ X8 L
  946. Music_Bar_ReSet_Set
    ! l9 u: f. [/ e# ?2 M6 M
  947. STA Sound_Bar,X
    3 a' m7 h3 |# \7 w
  948. INX/ u, s6 O# D* ]( v* s
  949. CPX #$10/ v# t" |, y6 b" z: X3 b
  950. BCC Music_Bar_ReSet_Set9 F+ \7 j' [# [, ^( W/ H" N, y, b
  951. RTS. T& f6 j; m  T! R6 M% @

  952. * S; G( Z9 S" r+ ?6 Q, w1 S7 p
  953. ;==============================6 q  r' J' h& u$ M% S9 w  E
  954. PPU_Data;PPU数据写入% \- Q) e. F2 a
  955. STY Data_L# f% F# B8 A3 i+ e* f. u
  956. STX Data_H
    $ Y. T9 x7 X9 e' d
  957. LDY #$FF
    3 s' G; O, X3 I5 t4 h8 K
  958. LDX PPU_Cur+ _1 J# o! ?, g( L
  959. DEX
    . A5 P  t9 K' R* J3 Y6 p( U
  960. PPU_Data_Beg
    ' v& n5 y" c  f  Q& ?: V
  961. INX
    % \" m  A( M$ m1 @, Q9 z4 C
  962. INY
    ) o; m0 S) b) F! \: \" D8 X2 [
  963. LDA [Data_L],Y
    + [' B6 G( ?* i# k* @0 T  T
  964. STA PPU_Addr,X
    - P" ?3 Q4 Q! Q! a* ~' K( E( I
  965. BNE PPU_Data_Beg3 Y+ |0 k( z" x; B1 W; Q
  966. STX PPU_Cur  ~$ C% H* s0 M5 }
  967. PPU_Data_End
    # {3 L1 t! w5 I, q9 J6 R
  968. RTS/ H  U9 f. b* \) W# r6 r

  969. $ G% }9 H8 {4 J& \, k# o+ s. S  J: z
  970. ;==============================
    % }+ B1 W  g/ w3 q3 o9 @' q/ E3 a0 z
  971. Music_Stata_Show;播放状态显示
    ; U) {! J' p. l5 N9 H
  972. LDA Music_State  u8 Q+ R2 _# K( K% @
  973. BEQ Music_Stata_Show_Play5 J9 B2 S, d0 W" R, l, m; U, T
  974. Music_Stata_Show_Stop5 e, {2 o% C; [; e  x% g
  975. LDY #LOW(Music_State_Stop)- R5 ^& b/ S: P& n( V! w3 ~
  976. LDX #HIGH(Music_State_Stop)
    9 d8 _+ D# X" |+ G( s* Z
  977. JSR PPU_Data6 F. R7 U3 l! N+ q" e7 u" Z1 ?5 @
  978. RTS) @! I* i7 W3 a1 U/ F
  979. Music_Stata_Show_Play
    $ ~2 c' u) Y0 ]+ B6 c7 {' x+ r) ^
  980. LDY #LOW(Music_State_Play)) M1 L0 B6 n; N$ ^) G
  981. LDX #HIGH(Music_State_Play)
      F" ?+ p8 c: b& P# X
  982. JSR PPU_Data
    * p( M+ i  v% D' m) P! Z
  983. RTS
    ; d# s9 `* l9 N+ Z1 x5 q) t3 g1 e

  984. & n. w8 F2 Q  j) K/ b
  985. .IF SOUND_BAR_SHOW_ENABLE
    2 O; i+ i) ~9 {0 ?  a1 O$ o
  986. ;==============================- B4 m2 o" ~; a6 B
  987. Sound_Bar_Text_Set;标题与音乐条初始化
    . D$ z+ y: s8 w5 z. @8 W% m
  988. LDY #LOW(Sound_Bar_Text_Data)) k! u5 R% W/ j6 g+ a0 c
  989. LDX #HIGH(Sound_Bar_Text_Data)
    + S: f! ?9 [1 s) D# i' E5 H
  990. JSR PPU_Data
    6 b+ @$ T# \9 i9 T* r
  991. RTS8 F6 \  d& Q. d) q
  992. # P+ i" s  N" B
  993. .ENDIF
    - X# U! Y9 ?1 L7 N6 t( F. q

  994. 7 I" k- V, F2 r9 F+ g0 G
  995. ;==============================
    7 b0 y1 G5 i9 `0 a6 L$ F
  996. Set_NameTable_Attributes;设置命名表属性' n9 i0 l" j7 _- F5 M  L
  997. LDA PPU_STATUS3 u$ l4 B$ K) Z& v& ^' W9 M5 w
  998. LDA #$23& y" P. p" d+ v2 _' t
  999. STA PPU_ADDRESS
    , O; Y4 M; p# B/ t3 ]6 `$ d
  1000. LDA #$C03 v# {. S/ P. b5 T+ W% }
  1001. STA PPU_ADDRESS
    4 ~9 |" M% B" {( k! j* t; J' j5 o0 t
  1002. LDX #$008 g; b( ?* o7 v: n7 D5 J* k
  1003. Set_NameTable_Attributes_Write
    9 `5 A5 O) E! ]  C% y. p
  1004. LDA Palette_Attributes,X1 w; a% y" `' j5 Y- S
  1005. STA PPU_DATA
    $ K2 `! O( L4 G6 C+ }' h2 u, j
  1006. INX
    * b$ n. O$ g; C; T& _
  1007. CPX #$400 a) U- K( @: B4 R& d
  1008. BCC Set_NameTable_Attributes_Write' j9 U. m/ i; r$ m
  1009. RTS
    3 R: i- I4 x% O: t9 q
  1010. 0 f/ U+ ]7 \0 D; M- m9 c2 ^( c
  1011. ;==============================
    - P( [& [# i' E
  1012. Set_Palette_Color;设置调色板数据
    3 k( v+ B) R8 X2 B) O
  1013. LDA PPU_STATUS# _; b. ~# |( E% n0 o3 d
  1014. LDA #$3F4 f5 d! F0 H+ Y& Q
  1015. STA PPU_ADDRESS
    ( ]' u) M+ b4 z9 |5 U
  1016. LDA #$00, F3 @4 ?7 ?# Q7 s  N2 B
  1017. STA PPU_ADDRESS3 w& l' B7 ?% n: Q
  1018. LDX #$001 P" Y) M, x6 y! f! f) k
  1019. Set_Palette_Color_Write( ]" [$ y3 J' M8 V( `" \5 g; ]
  1020. LDA Palette_Data,X" H! w6 h' ]0 k9 h' M9 m. k$ q
  1021. STA PPU_DATA
    0 f7 v3 ]% Y" C+ \" p1 J# T; F$ E
  1022. INX
    * w+ m8 K2 R, E. i
  1023. CPX #$20
    ( O6 R- Z( A) k6 R( R% P; [
  1024. BCC Set_Palette_Color_Write
    * O3 {' Y: o2 d
  1025. RTS5 H2 w! z* e7 d3 _% c# I9 X# a
  1026. 7 e3 G, J' u% e% R) x7 \, |: m. f
  1027. ;==============================' P- F; i3 c3 ^+ x6 I
  1028. Init_Palette_Addr;初始化调色板数据( p' h( i7 q# s6 x# _0 V" {
  1029. LDX #$00* u$ B/ E. ?1 O1 @' D/ o0 P3 f, D
  1030. Init_Palette_Addr_Write. s, _3 C; q3 j1 p  V" @; j% p
  1031. LDA Palette_Data,X$ A+ b3 `" D1 O( h  N1 v9 X
  1032. STA Palette_Addr,X. q6 Y. M( |( K
  1033. INX
    ! J1 T0 f; Z" ~( x  G5 M* |' E# E
  1034. CPX #$20
    $ y  u" u; c  Z: m9 N* `1 b: [7 {
  1035. BCC Init_Palette_Addr_Write  }+ S6 {& Z# t' B! i! F
  1036. RTS
    & o) ^' j+ x( A. C' L1 F& K: k

  1037. ) j% z, o4 i0 i) I% |
  1038. ;==============================
    2 L7 _* M7 S! {
  1039. Update_Palette_Color;更新调色板颜色7 `% U( e) R5 _' a8 Q" |
  1040. LDA Show_Track_Name
    # Q% u* I% ]' m) i9 w# n( B
  1041. BNE Update_Palette_Color_End! j8 o' G" X) n, M2 F
  1042. LDA Palette_Update_Flag
    - a% h4 ]' y' C* s
  1043. BEQ Update_Palette_Color_End9 w0 m* O- ?$ ?) H0 J' y" Y
  1044. LDA #$3F5 S- Z& k1 @+ V& H5 W
  1045. STA PPU_ADDRESS
    2 R) i; ~; H# f8 B* Z
  1046. LDA #$00
    $ n9 W1 \) h! ~2 u/ G
  1047. STA PPU_ADDRESS
    1 M! _. X& E% W1 ]+ z
  1048. LDX #$00+ c  q2 i2 H! f& h# z$ p
  1049. Update_Palette_Color_Write) V' i1 N- e% R% }) k
  1050. LDA Palette_Addr,X
    # ?7 [/ z- W1 i
  1051. STA PPU_DATA
    $ Y& |( l: W: C2 `
  1052. INX: c0 Q; \  |8 C8 g  ?
  1053. CPX #$203 i- o0 j- D& w* c  L
  1054. BCC Update_Palette_Color_Write
    5 Q, I& c. O7 O6 M
  1055. LDA #$009 O: b3 E8 R. W: L
  1056. STA Palette_Update_Flag  I" ^. z( L( A, j
  1057. Update_Palette_Color_End* j6 Q& K# X, N" ]0 n
  1058. RTS
    9 M( N0 P1 X# f

  1059. 1 ^: X) {5 b4 t( g
  1060. ;==============================
    7 l7 P5 ?* j4 G2 |, X
  1061. Update_Palette_Data;更新调色板数据
    + P7 G5 }" w0 A' `/ e1 s# u  p
  1062. LDA Show_Track_Name8 P2 i  L. ?# f& I8 l" @8 W$ U1 @/ N+ G
  1063. BNE Update_Palette_Data_End
    $ O* N1 }; [& c6 l: c5 S
  1064. LDA Music_State' F" {* x7 r% d  B# V- t1 R
  1065. BNE Update_Palette_Data_End
    . M- T/ l- {; X# w! A- V5 H2 T9 x
  1066. Update_Palette_Data_Check
    ) g2 M) Y# s- T2 v. o
  1067. LDA Palette_Wait_Cnt# Z, @  U  n2 _% o) S% n
  1068. BPL Update_Palette_Data_Check_Over: [9 h6 P7 H; i9 V! c) U
  1069. LDA #Palette_Update_Interval
      C2 q& |; ^! A7 x
  1070. STA Palette_Wait_Cnt
    ' M1 Q. C! k! e1 c1 K
  1071. Update_Palette_Data_Check_Over
    ) V/ R7 z6 |% P0 [6 S$ }
  1072. DEC Palette_Wait_Cnt
    & Z5 ]* i" O0 |! {& @
  1073. BNE Update_Palette_Data_End
    : p0 u/ N( v, U. d
  1074. INC Palette_Update_Flag+ I2 @3 A( k- B4 {
  1075. LDA #Palette_Update_Interval! I9 k0 x. h( `9 |; g" T3 ^4 ]  I
  1076. STA Palette_Wait_Cnt
    7 f- A8 B- w( ]- l' t9 O( s* j
  1077. LDA Palette_Update_Addr2 O' I  y" [2 h7 G$ [0 k
  1078. CMP #Palette_Update_Max5 D* P: }- d2 j% I
  1079. BNE Update_Palette_Data_Set) q% c' B" I# i1 F. r
  1080. LDA #Palette_Update_Min - 16 ^2 I5 q% Z# W9 s7 {$ A
  1081. STA Palette_Update_Addr2 R9 c) k9 S$ y( n3 Q  x* m
  1082. Update_Palette_Data_Set
    5 ]; i* A$ j7 _! E8 @$ i" b
  1083. INC Palette_Update_Addr
    & y2 [5 r9 h/ s% K4 y
  1084. Update_Palette_Data_End
    # X# H) y! R' Y0 Q; B& a
  1085. RTS
    ! s" o3 j/ X* @4 e
  1086. 9 E3 W( D5 H  i* e. E
  1087. ;==============================$ N: F( b! e& g6 ]
  1088. Show_Music_Text;显示静态文本' Z) t0 K5 g" L
  1089. LDX #$00/ [; Q& b3 R* d
  1090. Show_Music_Text_Set
    % i! z& a! W: v, F* b( R5 u
  1091. LDA Static_Text_Data,X* Z& k5 T( }( y$ y
  1092. STA Data_L4 o/ N: t, e- U/ {/ H( ?
  1093. INX
    ; v! x' O: U) M* |
  1094. LDA Static_Text_Data,X
    " f& P0 s' s* Q3 k
  1095. STA Data_H
    % p7 h* y, l' R; n; o) H3 {! r
  1096. INX& `$ t8 ?5 R5 a
  1097. LDY #$00" g% x, W* {+ q3 J/ c
  1098. LDA [Data_L],Y1 {) Q' D! v  n8 F/ w! ?
  1099. STA Data_Cnt5 v4 g+ t& z3 I
  1100. DEX3 ]7 i+ V2 c% l* g1 I) {
  1101. DEX$ ]+ i8 S  g* O* k6 e5 M
  1102. LDA Static_Text_Pos,X7 }$ M' S% g9 t
  1103. STA PPU_ADDRESS( o  T5 u9 Y& p1 T
  1104. INX
    6 t7 c$ G1 o+ |, a% s8 u
  1105. LDA #$20
    ; y+ M2 e9 j) K; g
  1106. SEC/ u# V5 h# A4 f$ a
  1107. SBC Data_Cnt
    ' j! x1 R% s  J  S+ \
  1108. LSR A3 A. L8 Z7 |! f: y7 \; {
  1109. STA Data_Buf
    - P+ X& [, |" @8 s. ~
  1110. LDA Static_Text_Pos,X
    . b( p4 z1 q3 n: t/ {" d
  1111. AND #$E0
    4 {' S: J( |0 H: E+ Y" t
  1112. CLC
    * l  Y% r& P6 D. L( @1 s
  1113. ADC Data_Buf
    * G* ^0 a% F3 u8 \
  1114. STA PPU_ADDRESS
    3 r- S+ Z: p4 I4 H/ F. A0 J6 a/ W& {; O& J
  1115. INX5 b- ?! ?4 a8 M; |: O7 N, C% C1 s
  1116. Show_Music_Text_Set_Write
    : N* k. }9 Y3 N$ n1 r5 n/ O! v; Z3 q
  1117. INY: {% n* b* }3 M; J, l# n
  1118. LDA [Data_L],Y
    4 g% }+ B5 [; b6 Z3 x$ l% g. Y, Q8 ]6 Q
  1119. STA PPU_DATA
    # B# q0 N. G: {* J& {
  1120. DEC Data_Cnt
    # C8 X! B6 D- G. \* L
  1121. BNE Show_Music_Text_Set_Write2 t! X0 A! s7 y7 n, P1 n: {) C
  1122. CPX #Static_Text_Pos_End - Static_Text_Pos& w; A1 G( c( I* z
  1123. BCC Show_Music_Text_Set: R1 ^9 Q  W$ j  J4 ], [; _
  1124. RTS5 ~* M$ ?5 `/ z2 x* C6 z

  1125. : ^( N  L7 v0 T9 W$ M$ S
  1126. ;==============================
    % M2 j! N2 q, F7 n
  1127. .IF Track_Name_Pos;显示曲目信息0 }) V& {  {* D' f( B( H
  1128. Show_Track_Info, @- B# ~; c, }# k6 r& W: v/ }: y
  1129. INC Show_Track_Name
    / z, b7 n  C' n0 j* I; K
  1130. Show_Track_Info_Clear
    : `$ J# B  L0 l/ P6 t8 L
  1131. LDX PPU_Cur
    9 b' z- }- \6 F! z; [
  1132. LDA #Mode_Clear
    . u7 w: g8 [5 D( b1 l1 V3 Q  n
  1133. STA PPU_Addr,X
    % C- a1 \+ U/ R2 B& Y8 J
  1134. INX  I. i' t' p. ]
  1135. $ s* @2 y7 P& c6 q5 i& E4 |
  1136. LDA Music_Last! r# b" x* R1 z6 ]! s
  1137. JSR Show_Get_Track_Name_Center_Pos' N# w# E1 w, k2 D. a
  1138. Show_Track_Info_Write_Cur
    7 Z8 u/ D. E- D8 ^8 q! b  D1 }; _- l
  1139. LDA #Mode_CntLine
    % S: U3 ?9 c& j% K- T
  1140. STA PPU_Addr,X% `3 P4 A$ r5 j
  1141. INX7 ]' v% c9 B( N
  1142. * D/ n: J3 N, q0 ^/ p' ?
  1143. LDA Music_Cur' |$ M" h9 @. p/ U
  1144. JSR Show_Get_Track_Name_Center_Pos# ^! E( W! l6 i( H. Z$ ]
  1145. " i5 m3 |) H* D
  1146. Show_Track_Info_Write_Cur_Data
    ! O1 [5 f9 o% P2 A
  1147. INY) w5 ?6 R$ {' s) W; i
  1148. LDA [Data_L],Y# z0 ~  [+ o: u/ O/ ?6 F4 `; P
  1149. STA PPU_Addr,X, q8 l" I2 k( H! y$ g) F
  1150. INX
    ; `" B7 A0 N1 ^
  1151. DEC Data_Cnt1 ^  W8 I% S) c
  1152. BNE Show_Track_Info_Write_Cur_Data
    2 F# O: ?3 Z0 m& M
  1153. Show_Track_Info_End
    : O/ K" b- _1 f+ W2 d  e4 r
  1154. STX PPU_Cur
    , c/ O- _' v2 j4 `! o6 [# z1 }
  1155. RTS
    5 }# x: R# N) @% I, |. P' o; I( Q
  1156. , f  N6 B4 u$ b
  1157. ;==============================( D: w$ G, ~5 R5 h- ]
  1158. Show_Get_Track_Name_Center_Pos;获取中间位置) m) ^: V' F$ I; }. P
  1159. ASL A9 x  A% c) |: Q
  1160. TAY
    4 y, v' @3 O& Z7 `) o/ b9 B3 q
  1161. LDA Track_Name_Addr,Y) [1 `5 ]! ]# B% I$ h) e! T' V
  1162. STA Data_L) _6 @2 W- R3 l8 L* x
  1163. INY5 Q; S; \1 ~, o0 f6 Q: c
  1164. LDA Track_Name_Addr,Y  D; e, @& M- u: D4 L
  1165. STA Data_H( U# L% p7 @8 C! N% c
  1166. LDY #$00
    7 g0 r, x' I* h0 r1 {% R
  1167. LDA [Data_L],Y* N2 f2 D7 k+ y9 f
  1168. STA Data_Cnt
    1 ?, y( O: i7 J# x1 a/ o
  1169. LDA #$20. p/ P! ~3 Z* d$ }  f+ h
  1170. SEC) z# {" r; V) x. T
  1171. SBC Data_Cnt
    $ o+ R) C, ^$ _& |
  1172. LSR A
    " y6 o6 p+ O- g+ K0 B$ O, Q
  1173. STA Data_Buf
    # }) ^- ^$ K1 _1 F/ x; L
  1174. LDA #HIGH(Track_Name_Pos)
    5 o. a1 a- o% y& {/ S
  1175. STA PPU_Addr,X$ q* \5 l0 B7 L- p: ]3 N
  1176. INX! |0 G* P" [1 ]" x% F3 U
  1177. LDA #LOW(Track_Name_Pos)
    & t  ?$ l  S3 F. a) y
  1178. AND #$E0
    $ R. L( c( i; g0 b
  1179. CLC& i6 l" a9 G6 L
  1180. ADC Data_Buf
    + R/ C: z% R4 m, V! j! ^7 v8 G
  1181. STA PPU_Addr,X
    ! o& ^' V+ V! ?) d* q0 d! e
  1182. INX$ W+ U, R; R; Z
  1183. LDA Data_Cnt
    ! y+ l% k. C8 P, ]9 Z! z8 ]' W
  1184. STA PPU_Addr,X
    : r: b$ e( p1 \9 J/ ]
  1185. INX
    ( a- u" ]( P5 N; n; u" q7 Z; N
  1186. Show_Get_Pos_Center_End' `0 Z+ W( |* `
  1187. RTS7 ^7 z. V6 `4 x
  1188. .ENDIF1 p' G5 n5 U2 F6 c

  1189. & {. A( B8 q% O3 i5 J
  1190. ;------------------------------5 E5 R3 M" a! |, W
  1191. ;命名表数据- c9 N; O3 F; s3 z- M
  1192. Palette_Attributes0 ?3 D. n8 D. U: o
  1193. .IF SOUND_BAR_SHOW_ENABLE
    8 P! }+ i  f/ }2 z: [. J& g
  1194. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$000 O, u( t7 S) c/ D" K' D
  1195. .DB $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$FF,$FF,$FF,$FF,$BB,$AA,$AA,$AA! ^8 [- G* l) F
  1196. .DB $0F,$0F,$0F,$0F,$0B,$0A,$0A,$0A,$55,$55,$55,$55,$55,$55,$55,$554 b1 X+ i# M9 U5 i* n. R$ V4 A4 f
  1197. .DB $55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55  c3 o* e% S4 s
  1198. .ELSE* I# J" w, Q$ D$ J, v: l
  1199. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    7 P' l3 j- V6 r  C' n
  1200. .DB $F0,$F0,$F0,$F0,$F0,$F0,$F0,$F0,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF& z+ O& K1 H+ S- O5 z( s3 w3 j
  1201. .DB $FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$55,$55,$55,$55,$55,$55,$55,$55/ _" ~; f# I: W) e
  1202. .DB $55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55,$55
    4 V& a0 O4 _; f( t
  1203. .ENDIF
    3 N" r' V: l  ~) D7 |( e. f
  1204.   y0 q! ]- T& @7 k# E  g; F1 a/ E
  1205. ;------------------------------5 f* F& J3 `/ n7 i# C) i
  1206. ;调色板数据
    6 ^7 E/ u8 G0 t. v* H7 J! j5 I
  1207. Palette_Data3 ^* d3 t- w3 `" q( P( ]
  1208. .DB $0F,$27,$20,$0F,$0F,$24,$20,$0F,$0F,$21,$20,$0F,$0F,$25,$20,$0F
    ; J3 V" R8 A$ p8 X/ v
  1209. .DB $0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F,$0F,$24,$20,$0F
    # C2 t' C& _9 @+ I5 {

  1210. 4 L& h# I9 N. s# K
  1211. ;------------------------------
    + [8 v3 D/ {" ?9 @! E- f
  1212. Static_Text_Data
    2 e' d$ q' u. R& \6 g/ |  G
  1213. .WORD Static_Text_Title_Data
    3 q. o- X! Q. [- Q- u8 {, B- Q
  1214. .WORD Static_Text_Author_Data! d) [8 u" Z6 }: L
  1215. .WORD Static_Text_Date_Data( a6 |7 O  l* m, T
  1216. Static_Text_Data_End) A+ B8 h( d7 a. m8 P4 \
  1217. 4 Z4 I4 C+ B/ \
  1218. ;------------------------------  D5 c, ?6 Q$ _. M
  1219. Static_Text_Pos
    $ r1 y  T! c$ B* T/ X  \
  1220. .DB HIGH(Title_Text_Pos),LOW(Title_Text_Pos), L* K$ |7 g, e0 |1 y) H: s/ Z
  1221. .DB HIGH(Author_Info_Pos),LOW(Author_Info_Pos)9 A# O5 a* p6 J7 Q
  1222. .DB HIGH(Date_Info_Pos),LOW(Date_Info_Pos)- J. o- s; v9 Z
  1223. Static_Text_Pos_End
    # h, r) {3 s* [% G* c
  1224. $ s/ Q5 g2 \, l" T+ u$ C6 n$ q3 T3 F
  1225. ;------------------------------3 U% p+ f1 B, ?+ L1 _8 `; l2 K
  1226. Music_State_Stop
    / J  _+ e" o! u; n6 z* V( A$ g
  1227. .IF SOUND_BAR_SHOW_ENABLE
    ( {6 [, O, R4 X1 Z1 Y& w
  1228. .DB $FD,HIGH(Play_State_Pos),LOW(Play_State_Pos),"STOPED ",$FF,$00
    0 l  |9 @& G" d4 c
  1229. ELSE
    . j( r7 h& N/ o. O1 L* Q+ R7 z6 \
  1230. .DB $FD,HIGH(Play_State_Pos),LOW(Play_State_Pos)," STOPED",$FF,$00* {+ \& v  |9 k# P- N9 m, E$ a: K
  1231. .ENDIF+ a$ u4 I, v0 |5 A9 T1 @: ^: m
  1232. Music_State_Play  S; p3 T3 p2 O! B
  1233. .DB $FD,HIGH(Play_State_Pos),LOW(Play_State_Pos),"PLAYING",$FF,$00
    * R% r1 F; X9 a( g, F
  1234. ' E/ M# }" n* g1 W: X% n; |
  1235. ;------------------------------
    4 c" h9 B, J/ F
  1236. Sound_Bar_Text_Data;声音类型文本/ i1 Q: r9 \7 |4 i$ n. m
  1237. .DB $FD,HIGH(Sound_Track_Pos),LOW(Sound_Track_Pos)8 E( M* O* O$ T9 {3 _+ T" v1 \
  1238. .DB "SQ1-",$FF* Z2 H& X; U5 d6 n9 L, p
  1239. .DB $FE,"SQ2-",$FF! m9 P: ~& D; R( g
  1240. .DB $FE,"TRI-",$FF
    . z/ |, m8 K+ h( \/ f+ z
  1241. .DB $FE,"NOI-",$FF5 {# S( ?  o* G6 r/ R5 ^
  1242. .DB $FE,"DMC-",$FF,$007 ?5 N" N6 \4 x  j% n+ W8 L  x

  1243. 3 h" T5 R& U9 ^
  1244. .IF Track_Name_Pos% k2 C; x) B7 G+ p& z+ S, s
  1245. ;------------------------------
    " H8 H$ A7 ?* N4 d- q
  1246. Track_Name_Addr;曲目名地址索引
    % E# d# C/ v9 G! b, g- P6 m  Q5 D+ t
  1247. .WORD Trackr_01
    . l. }9 w: R5 a, Y4 V
  1248. .WORD Trackr_02
    * Y7 q- b; N1 g; o
  1249. .WORD Trackr_03* o2 R1 o6 K2 w( b7 D6 A) e- m* T
  1250. .WORD Trackr_04
    . ]6 y# l8 Y# ?0 ?+ }- q
  1251. .WORD Trackr_05
    + [, n5 I8 P4 N  R+ P
  1252. .WORD Trackr_06
    7 j7 w6 S* |7 W2 k8 T* U
  1253. .WORD Trackr_075 K, J1 p% B" |- R2 P2 [9 q* p
  1254. .WORD Trackr_081 z; u3 i% ?# v) ]# Y
  1255. .WORD Trackr_09
    0 C- w! r" e. G  s# ^" h
  1256. .WORD Trackr_10
    5 _. U3 y9 k1 m5 H, m4 B* p8 Q
  1257. .WORD Trackr_11
    3 j$ I! B- H$ h2 Y
  1258. .WORD Trackr_12
    8 {# Q5 n) ~( l9 z) s/ j
  1259. .WORD Trackr_13, B& C9 W1 O; A" V
  1260. .WORD Trackr_14
    ) y: V) X! Q% E2 W; f: L4 }# i
  1261. .WORD Trackr_15
    $ ?9 V- C) W( W# s
  1262. .WORD Trackr_16! G  z" C! Q" `" Z1 }3 n7 l
  1263. .WORD Trackr_17
    4 n* D& I( \0 A- X
  1264. .WORD Trackr_18
    : d+ S  K9 o$ V, d" v9 l
  1265. .WORD Trackr_19. J& y) l: n3 O1 W
  1266. .WORD Trackr_20
    ; H" |, j& e4 g4 M- v3 n: S# a
  1267. .WORD Trackr_21
    $ @- Z  j4 Z+ P: d( f5 `0 ]7 F9 N
  1268. .WORD Trackr_22/ s% F% N9 T! C/ a* y- G  `
  1269. .WORD Trackr_23
    & F" n6 }2 M( }
  1270. .WORD Trackr_24' V' P2 o% \: K' X# X  \
  1271. .WORD Trackr_258 t% l( T4 h( Q3 Y7 J9 F
  1272. .WORD Trackr_26- x6 G4 V) f! U/ x! j
  1273. .WORD Trackr_27  C  ]# z4 m/ G  I/ D4 S
  1274. .WORD Trackr_28  U1 o0 L9 U1 i( V! m0 `
  1275. .WORD Trackr_29- M* ]9 M0 G5 g: x
  1276. .WORD Trackr_30
    ( p+ ]" p9 c4 R& t' B* S) Q
  1277. .WORD Trackr_31! l1 R+ o4 n3 g; j/ G" R
  1278. .WORD Trackr_32- X9 L  k- n+ T7 H
  1279. .WORD Trackr_334 d* `% g9 U2 K9 O; }
  1280. .WORD Trackr_34
    + L/ `" [9 _( ~; R5 S) }
  1281. .WORD Trackr_35
    0 J. W7 @, q$ \* y* Y# Z% j" U
  1282. .WORD Trackr_36; Z+ w7 i8 W# ^- q+ b! F4 g0 O' @
  1283. .WORD Trackr_376 ?, e& d; ^) C$ ?
  1284. .WORD Trackr_38( l7 t2 b# F2 _6 q, u, V2 K
  1285. .WORD Trackr_397 d7 p/ ?, n' w8 K. O
  1286. 4 o! [, r9 f  _6 F" s7 p& t5 g$ n
  1287. ;------------------------------
    / g4 _2 {7 F: q' ~/ V
  1288. Trackr_Name_Data) ^/ W; m0 F1 R/ e
  1289. Trackr_01 .DB $05,"BGM 1"2 ~8 ?  f! L0 s5 h  Y0 N
  1290. Trackr_02 .DB $05,"BGM 2", c$ \+ e- Y1 o, r; ]
  1291. Trackr_03 .DB $05,"BGM 3"
    3 B3 _5 h8 s8 i7 d% `# o* b
  1292. Trackr_04 .DB $05,"BGM 4"
    2 ~0 E: K& G! Y( n: A- s
  1293. Trackr_05 .DB $05,"BGM 5"
    0 w6 y! w* J6 Y: \+ J; l2 L) z
  1294. Trackr_06 .DB $05,"BGM 6"* y" O( K2 M3 y, J
  1295. Trackr_07 .DB $05,"BGM 7"1 H6 t6 ?9 L8 f! {. R
  1296. Trackr_08 .DB $05,"GREAT"
    5 o" |5 K# j# o
  1297. Trackr_09 .DB $08,"BOSS BOM"7 F6 @9 D- @+ Z. `& B7 J9 ~
  1298. Trackr_10 .DB $08,"BOSS2BGM"8 F  S2 Y0 T$ x" \3 B
  1299. Trackr_11 .DB $07,"P CLEAR"
    : ~" {% F9 Z5 R$ h# b2 U
  1300. Trackr_12 .DB $07,"A CLEAR"
    0 [1 ^/ j2 b0 d3 M" e: V
  1301. Trackr_13 .DB $04,"OVER"8 V4 k# z( t  o! c! t0 A
  1302. Trackr_14 .DB $06,"ENDING"
    5 H9 V1 X/ O" r& b4 D, ?
  1303. Trackr_15 .DB $04,"SUTA"
    : T9 H8 Z, n* V% U% _( m2 C' ?& E
  1304. Trackr_16 .DB $07,"THUNDER"
    7 v* C8 r; i$ V! B8 f( l
  1305. Trackr_17 .DB $04,"SHOT"6 k# [' M, T. B% {# W5 H6 o3 G3 U
  1306. Trackr_18 .DB $05,"LASER"
    0 G% @# e! r7 k  s9 O4 \5 p
  1307. Trackr_19 .DB $06,"SPREAD"
    . R4 i+ t3 S: y  Q  j+ L2 c
  1308. Trackr_20 .DB $04,"FIRE"
    , ?  Q: a- b  T' C% S" M5 l! M
  1309. Trackr_21 .DB $06,"B SHOT"
    * ?- {- x" U, |6 K- E; T; T. w
  1310. Trackr_22 .DB $08,"T DAMEGE"! k* J1 E2 O8 f& d
  1311. Trackr_23 .DB $07,"HARETSU"
    9 _. o/ D4 x! u) d" A# t% w
  1312. Trackr_24 .DB $05,"T OUT"
      S+ k7 A5 i# [1 z8 V$ Q2 S5 H
  1313. Trackr_25 .DB $05,"Z OUT"
    4 F' B5 S5 F% l8 ^1 z/ k, s
  1314. Trackr_26 .DB $05,"A OUT"+ a9 k/ x4 J4 W  D; P3 V# z
  1315. Trackr_27 .DB $04,"ROLL"
    * A- l; Q9 m9 g, K8 b  n' x
  1316. Trackr_28 .DB $06,"APPEAR"  P0 Q1 W1 l7 y
  1317. Trackr_29 .DB $05,"POWER"
    2 i/ P8 m3 w/ G0 ]. d1 a3 B+ V* q+ R
  1318. Trackr_30 .DB $07,"BOKK BK"
    . z9 X5 |( Z6 q+ G" S
  1319. Trackr_31 .DB $08,"BAKUHA 1"
    6 a5 G; _& }' x
  1320. Trackr_32 .DB $08,"BAKUHA 2"
    4 `3 Q; o$ R' g  y
  1321. Trackr_33 .DB $05,"ARUKU"0 f. x" v$ t$ _- J$ l" r. V6 P
  1322. Trackr_34 .DB $06,"JIWARE"* T( i* z: E9 U% ?
  1323. Trackr_35 .DB $05,"SILEN", o, L" I7 U3 W* X7 `1 @4 P
  1324. Trackr_36 .DB $05,"P 1UP"
    9 k9 u0 p, R; P9 G# ]. h
  1325. Trackr_37 .DB $05,"P OUT"( f4 o6 @4 _' u3 S
  1326. Trackr_38 .DB $05,"B OUT"
    7 D- a  w. v# m/ S) D
  1327. Trackr_39 .DB $05,"PAUSE"4 p  o3 B, D0 {% q6 {
  1328. 0 `: n' f, v$ A9 Q4 I( B* f; h
  1329. .ENDIF
    - Q, F. \9 b& z" a
  1330. 6 e( l3 n, X( e6 f. }" j
  1331. ;------------------------------
    5 L7 s3 u% I+ q* h# L
  1332. Static_Text_Title_Data;静态文本数据+ I# k% z) t: n! |
  1333. .DB 12
    4 i7 O+ G8 H# y( P' ~- ]
  1334. .DB "SUPER CONTRA"
    5 t' H( R0 e: S
  1335. Static_Text_Author_Data- O3 b/ k4 w* ~3 @6 Q) x
  1336. .DB 23) T+ q$ w2 e' e
  1337. .DB "EXTRACT BY FLAMECYCLONE"- Y2 U3 t+ X4 d& Y$ N/ L. l/ _
  1338. Static_Text_Date_Data; ?! _( ^3 T6 f2 p+ R0 b* B/ g
  1339. .DB 10
    / U; i  U1 @: ~) E/ Z5 r; K* |
  1340. .DB "2023.07.11"
    ! `8 f* C6 j5 W) Z9 [  |

  1341. , U0 w+ B# `8 J& d8 D) B
  1342. .BANK RESET_BANK & BANK_DATA_MASK; S+ Q6 R( {+ J. h% O$ t& i9 }; T+ i
  1343. .ORG RESET_ADDR, _0 X) t# s+ A2 Y

  1344. 2 B4 y& v& H, d2 {* y& L

  1345. 6 x- W; ^4 z1 [2 K
  1346. ;==================================================/ E4 @# n3 t' }* A
  1347. ;切到主程序bank2 z4 F% p% f% U; n
  1348. SwitchMainBank: X; b7 l" ?+ B  g
  1349. LDA #PROGRAM_BANK & BANK_DATA_MASK
    7 v( Z+ z# b8 t
  1350. JSR SwitchBank8000' e4 O7 l0 r7 T( q8 [/ x
  1351. RTS
    * n' v2 b; u* a0 L0 x" U3 U
  1352. " ?! I/ z* z! `) U1 s2 D& v
  1353. ;==================================================
    ( q( s1 a! D! K0 A) l' s
  1354. SwitchBank8000;切换bank到8000-9FFF7 `% ^( h* w9 C( D3 Y: G" ^
  1355. PHA
    ' \9 w8 p3 _( G3 R
  1356. LDA #$069 ~) j7 c7 k. @
  1357. STA MMC3_BANK_CTRL: @6 D* `8 N! |& S. V  Y# }
  1358. PLA
    , P! q$ H3 F; X) l) j; m" i
  1359. STA MMC3_BANK_DATA
    . Z3 H5 r( H) I& _7 q
  1360. RTS, e6 E8 P- `. C. G0 @+ C# e

  1361. % t: e3 M1 X. w7 v9 E; T. W
  1362. ;==================================================
    ; I4 @4 w  n: h
  1363. SwitchBankA000;切换bank到A000-BFFF
    5 ]6 \( L4 ~+ a* V9 p1 x% e
  1364. PHA
    5 A' M8 n" K7 m
  1365. LDA #$07
    5 j$ ^3 R  ]+ [, f/ p
  1366. STA MMC3_BANK_CTRL
    ' n( b) u5 S, A, ?
  1367. PLA
    $ S& _1 s  t! K- w' e/ G
  1368. STA MMC3_BANK_DATA
    + ^; e, x; v+ f. k7 _" u! R; y8 p
  1369. RTS; D' K. v8 X0 b; J

  1370. & n. N! R+ D- ?" {# L
  1371. ;==================================================
    - x7 b1 l% E! m  ]
  1372. Sund_Bank_Init;音乐bamk初始化
    2 I; k7 B9 G) L
  1373. LDA #SOUND_DATA_BANK_0 & BANK_DATA_MASK+ S) N6 ~2 Y" S  M+ L: @
  1374. STA Music_Bank_8000# G$ ?4 M( R4 \4 M% f4 K" q
  1375. LDA #SOUND_DATA_BANK_1 & BANK_DATA_MASK
      \7 V( T  i8 t4 z& H* i
  1376. STA Music_Bank_A0008 k$ U# ~& A) U& K6 B( l0 D
  1377. RTS
    * |( G5 S5 O) [1 w
  1378. 6 j3 N+ _- A$ j# h6 Q* x7 K9 {8 s/ E% N
  1379. ;==================================================
    2 f* r8 t5 k& ~0 r
  1380. Sund_Bank_Set;切换音乐bank0 l! {1 _- s$ [% g; ?- I
  1381. LDA Music_Bank_8000
    8 S% }6 ^2 e. H4 p: f
  1382. JSR SwitchBank8000
    9 t; V8 K& }' ~4 Q+ t4 l! O
  1383. LDA Music_Bank_A000
    4 A( \/ B7 u; m/ j
  1384. JSR SwitchBankA000- Z, |$ V7 [. v% `% ~
  1385. RTS# o& H, [* z" C7 o6 w

  1386. 7 T, V( c* b2 p' `* Y: j+ M1 A: q% S
  1387. ;==================================================
    $ e' d4 b* M2 w0 G. W* _9 P; ?
  1388. Sound_Init;音乐初始化
    . m, W$ N: v# [. |) t; p& P0 s
  1389. PHA; b5 Y6 L( n$ _' d3 {* Z
  1390. JSR Sund_Bank_Set5 p( [$ M3 E1 l8 e6 O' p
  1391. PLA
    9 ?5 J( u( c. B3 k5 J$ S
  1392. JSR Music_Init_Addr
    4 W. W5 C% X# S& r; `! v
  1393. JSR SwitchMainBank
    " i& v$ I8 R$ Z( H6 a
  1394. - x2 l# [. `+ Q! Y9 N7 q5 u
  1395. JSR Music_Bar_ReSet
    7 T4 @4 a! h' g5 ~
  1396. JSR Time_ReSet
    # ^! H$ |( M  [, t
  1397. LDA #$00
    2 v7 k' T2 a3 i. A
  1398. STA Music_State
    : D; G3 [: e/ {4 L! ?
  1399. JSR Music_Stata_Show0 S, o# p2 f. c0 u5 F# [# {5 S
  1400. .IF Track_Name_Pos
    , y# w* V/ c% C: j3 |- N- u$ J  O
  1401. JSR Show_Track_Info& y, d; x- a% a6 H" K
  1402. .ENDIF
    ) ~! A7 i% m  b" h" f! O" J
  1403. ; b+ S6 e: a8 F! O& Z
  1404. RTS* ?) M: j) l- x& y4 i) M
  1405. ( L' N0 L* ?& J
  1406. ;==================================================
    4 z6 X0 z; b/ Y  q0 {
  1407. Sound_Play;音乐播放* ^# ?- n$ ^- k! d
  1408. PHA' _# x( `/ X1 d& T
  1409. JSR Sund_Bank_Set
    & }6 g# O% d% E
  1410. PLA
    , q) k# U* s) M
  1411. LDA Music_State
    1 \' k: n: n( D0 t* ^9 B
  1412. BNE Sound_Play_End
    3 ]. D  K' j8 A* U5 k) K" Y
  1413. JSR Music_Play_Addr. l  ?0 H& O" s+ ~
  1414. Sound_Play_End
    ( {7 O& o$ A) A$ T* Z( U
  1415. JSR SwitchMainBank
    7 b2 d2 C$ U3 ^5 H6 v/ o7 ]/ b
  1416. RTS
    * |0 L& H* t+ Y. A4 e; e0 O" N3 x; }& a
  1417. * a& G8 ?# p- o2 d( c
  1418. ;==================================================+ y: p+ j. w  z* D
  1419. .IF Music_Reset_Addr
    , o+ |, `& X) @% `* P( m
  1420. Sound_Reset;音乐重设(如果有的话)
    / P9 Y5 |( y6 i, M
  1421. JSR Sund_Bank_Set
    ' J% G3 U2 W- W8 m3 y9 O  u+ X9 \
  1422. JSR Music_Reset_Addr* ~- a3 k5 I, C( R+ O5 M
  1423. JSR SwitchMainBank# P; V( p  Z  [2 K
  1424. RTS
    4 K7 N# O! K9 ^
  1425. .ENDIF
    - l8 P4 ]7 N7 E$ D6 L' ?2 O: ^
  1426. 1 C) }9 ~% J& v  `
  1427. ;==================================================
    $ G( ?/ j+ k  k$ ^* i
  1428. MainLoop;死循环
    9 o8 i; F$ F- N, z1 B# _
  1429. JMP MainLoop, o& @* {5 e) I# m+ p7 c* F
  1430. $ s- m) d1 ?* v7 A4 ~7 E
  1431. ;==================================================/ K4 L0 K1 q# n1 @1 Z
  1432. NmiProgram;Nmi中断处理
    4 g7 U% U/ _/ b: D' d6 N/ K+ B( `
  1433. PHA3 D5 s' P6 S1 X3 V2 U5 b
  1434. TXA
    9 t" W" g  [1 n
  1435. PHA
    " h3 v  S1 s, V8 C
  1436. TYA& p! y) x- s. s# c# j2 ?% G. [  z
  1437. PHA1 J* W$ ]. e( H# [6 W4 D
  1438.   e& P& @* s1 y9 d
  1439. LDA PPU_STATUS
    7 }0 J3 U6 n" B; T2 M8 H* `, L: {8 R
  1440. LDA #$00' H( B$ x  O7 m, e6 l
  1441. STA PPU_CTRL, v" G( K9 h1 y
  1442. 8 ^2 E# {$ Q( Y+ f8 P6 z" _
  1443. ;切换主程序bank
    ' a( u9 w! m- o! x! c3 U) ~: Z5 x
  1444. JSR SwitchMainBank
    + w; h7 c5 P/ _8 p" T3 G5 {! X

  1445. 6 E' V2 S: W) s2 i. o! Y( E# p
  1446. ;NMI处理) u0 j9 R+ s( t* n
  1447. JSR NmiProgramProcess) K& P8 _# P- y
  1448. % y% \- k! i9 Y, z9 K( e
  1449. Nmi_Proc_End
    8 C. i) G# F" L
  1450. PLA! n4 E& s* D0 O4 Z8 ?' w& F
  1451. TAY/ U' n( k- L; @& r: s
  1452. PLA, h1 O+ N: T8 r9 j
  1453. TAX" {2 ]$ `5 S3 v) ^1 E, U) w
  1454. PLA
    6 a7 N7 _' Q9 ]. u$ p; |

  1455. # m; X* D5 g* n  M, v- l& M
  1456. RTI
    : \5 O/ h2 l# m( [& ~. u6 {
  1457. ( w/ Z/ w; C, E
  1458. ;==================================================
    " z# g' l/ {4 |5 z- A. I
  1459. ResetProgram;重置中断处理# c. j7 J# P8 n$ e
  1460. SEI
    ) n, a* |% u# P6 n; p
  1461. CLD4 ]& e+ [1 r5 y: q8 n
  1462. LDA #$00) W! q, x# s2 Z" C+ f
  1463. STA PPU_CTRL
    0 W2 [1 ^" a' C* M8 t5 X1 o
  1464. STA PPU_MASK: D( ~" p- \( d9 b" o; g
  1465. , i& u6 V6 t/ `3 Y  v: {0 J; U
  1466. JSR SwitchMainBank
    5 K# Z3 p5 V8 L1 ^$ {/ P
  1467. JMP ProgramBegin
    7 N; E( I: o9 R$ B  Y

  1468. - z# m! ~, I( q. N( o6 W0 J
  1469. ;==================================================
    ) l, r1 c+ {7 g  E) ?& p
  1470. IrqProgram;Irq中断处理  y7 o# @0 m" I  e
  1471. RTI
    ! u* b' }: S( N$ Q' V  }9 ~7 ~

  1472. 1 ?' k9 ^# f5 l! `/ Y7 p2 c
  1473. .IF SOUND_BAR_SHOW_ENABLE  I5 V* Y" [; {
  1474. .ORG $FF80
    ; O* H1 g8 U! Z$ S& a
  1475. STA $4000,X5 Z& k( U4 {: ?1 ^6 W$ D
  1476. STA Sound_Bar + $00,X/ n: t) V9 q- w& ~8 k( O( }: y
  1477. RTS
    ; @$ g% L7 V& U: B0 @8 [
  1478. ' v& w" U7 n2 X
  1479. .ORG $FF88+ e; O+ ]6 ?% c8 U( ^$ h; w: Z
  1480. STA $4000,Y
    6 }2 n5 Q' C9 c7 u, J; Y" r
  1481. STA Sound_Bar + $00,Y
    $ Z" M3 e3 i$ H3 _8 C& A
  1482. RTS
    / w" M/ c& q) m8 A, Y2 @* [

  1483. 4 z: ], o! [. Q6 Z) j# z  o
  1484. .ORG $FF90
    4 E% ~) B2 V# E
  1485. STA $4004,X
      G- F3 e# r0 h. k
  1486. STA Sound_Bar + $04,X
    / `8 n# E/ D) i
  1487. RTS; M8 o  B* f) _, ?' y; L

  1488. ! @" V( ]5 ?7 b" N9 z
  1489. .ORG $FF98
    # ^- b1 |3 R; T8 @6 S
  1490. STA $4004,Y3 O. m. g. h  _! U
  1491. STA Sound_Bar + $04,Y
    ! y6 c8 x' b+ d% `! c/ d$ f
  1492. RTS% r2 ]; B. p+ P/ C, d

  1493. 5 U- \, X  {% v: \, A: s* P, ^
  1494. .ORG $FFA0  [2 d# g7 N# a. N
  1495. STA $4008,X; M$ z7 {/ ]- H9 j8 U
  1496. STA Sound_Bar + $08,X
    1 m+ O' |4 F% \, K6 e
  1497. RTS3 i7 Q& f/ p* ~+ w
  1498. 6 j9 Y" a9 [% X; r
  1499. .ORG $FFA8
    ( z- C% j  [* V4 y; f
  1500. STA $4008,Y
    / M  \$ j' O3 k2 G+ V+ ]3 e
  1501. STA Sound_Bar + $08,Y
    % S" X1 j. f& N- V0 \1 K  ~! F
  1502. RTS
    8 E2 a3 T) D# i1 }
  1503. * N! u9 @+ k- Z; ^& U
  1504. .ORG $FFB0
    " [- G; R1 s" b% I3 H& e
  1505. STA $400C,X9 b8 `6 c8 b) a7 a3 J/ n1 _2 i8 ]: u
  1506. STA Sound_Bar + $0C,X
    . o! O5 ~9 m0 H$ r" v. n$ \3 F* }
  1507. RTS8 g* \" c2 `: x* H! e7 @
  1508. : |& F& I# `" d  U, v- Y
  1509. .ORG $FFB83 L! Z0 l: c" n( H1 R0 u- t- f
  1510. STA $400C,Y
    9 y; _1 Q4 Y3 _! k$ s/ I* S% [
  1511. STA Sound_Bar + $0C,Y
    3 t: A2 q0 D- C) f7 t9 @/ v: S
  1512. RTS/ [* h' H" K( O) i' K4 @8 d: }

  1513. 0 d5 K% o0 ?# @+ N9 T
  1514. .ORG $FFC0
    ( _6 w  F: q5 ?5 g5 b8 b4 _
  1515. STA $4000
      {3 m% R# k: I# T( p
  1516. STA Sound_Bar + $006 k0 R* v  p6 ]& @
  1517. RTS
    . \4 d' u" i1 N# B
  1518. ' s' U. }1 z) k; j) n, l# a* w
  1519. .ORG $FFC87 N( d, Q1 k, F( [$ _
  1520. STA $4004( w$ W" r1 H3 h/ G4 U
  1521. STA Sound_Bar + $04, k6 ?" r4 c* d" ^1 @9 {2 j" \/ i9 l
  1522. RTS
    2 F( b0 t2 E( z, D

  1523. . E* `* d6 Z- K, _& _/ F( g7 ]
  1524. .ORG $FFD0
    $ e% ^" }( F1 Y6 C& v7 X3 p* G
  1525. STA $4008; }, O4 z+ x& H+ I, k
  1526. STA Sound_Bar + $08$ y$ T0 g9 Z2 H1 ?! t# y* z
  1527. RTS
    ; {, G7 N4 ~3 W
  1528. 1 u+ @! ~2 Z" i* P! _8 o0 W
  1529. .ORG $FFD8
    $ N. e  |8 @0 ^# \4 l: o: l
  1530. STA $400C
    3 b# `( l% l0 q3 C
  1531. STA Sound_Bar + $0C
    ' Q$ a. P8 `" A* s0 j
  1532. RTS
    ' w* {1 P0 T4 }8 _! J

  1533.   s$ x0 D+ Q4 ]& M: X
  1534. .ENDIF
    7 T% ~) v" Y% B' k" ]9 ]
  1535. , t. P0 ^4 ?& b+ D5 ^) c
  1536. .ORG $FFFA
    / S6 w$ J1 ~! L, ]
  1537. .WORD NmiProgram9 [/ A+ Z0 l: R* m2 d
  1538. .WORD ResetProgram
    ( j- g/ A0 l8 E
  1539. .WORD IrqProgram
复制代码
! D5 z( X4 d0 Z) y3 t  Q* K- Z) c
6 W$ z0 E$ X$ i/ c1 ~: C
游客,如果您要查看本帖隐藏内容请回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

1

查看全部评分

签到天数: 1264 天

[LV.10]以坛为家III

发表于 2023-7-13 16:43:54 | 显示全部楼层
很赞啊!
[发帖际遇]: fragranse 在网吧通宵,花了 3 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 3255 天

[LV.Master]伴坛终老

发表于 2023-8-5 12:44:16 | 显示全部楼层
必须支持
[发帖际遇]: leshui 在网吧通宵,花了 6 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-11 10:03 , Processed in 1.135742 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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