EMU618社区

 找回密码
 立即注册
搜索
查看: 1480|回复: 26

[原创FC/FDS-HACK] [FC][魂斗罗][最佳可视化]

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2019-11-29 20:25:37 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2019-12-4 21:31 编辑
: D" `8 s# D. {1 v6 @" o2 a
6 Q- F' P  m2 p[FC][魂斗罗][最佳可视化]& w/ m; S1 V& i6 S7 Y- y' N
时间:2019.11.30
3 h- G' l5 g7 ]+ B4 ]作者:FlameCyclone
, z; M5 W! t. l& G0 g; E内容:
' }% ]) ~! w5 d' b& V, z& f8 R 1.可视化:   
- K: p6 I4 [  q- q* E     (1)暂停时按选择键进入菜单
% G& S% {/ p" ^# Z+ N5 b* _     (2)方向键选择功能: B键开启: A键关闭: 选择键交换,开始键退出! @; p# _  d+ ^( k9 }8 T
     1.1.透明无敌: 透明无敌
, E, w5 b( h: U7 `. ]6 C2 s2 ]     1.2.加强无敌: 金身无敌
0 u  o' L, B: M     1.3.生命锁定: 生命锁定3条8 C% l$ A3 ]+ g
     1.4.武器锁定: 武器保持不变
6 Y7 ?+ @- ~5 M9 `; Y/ r     1.5.武器切换: 游戏时按选择键切换武器
$ K0 H9 Y& G6 U! Q% _- h- Y1 Z* }     1.6.无限跳跃: 跳跃无限触发, M* t4 h! c: C
     1.7.快速移动: 行走速度加倍/ }0 O5 X3 u7 Y7 {& {7 W- o
     1.8.皮肤切换: 交换玩家肤色* B) D' z- }' Q5 R( Q
     1.9.公平子弹: 玩家子弹可以与敌人子弹对打. @. [$ O. ?" p5 F& n
     1.10.强力子弹: 子弹打中敌人后继续穿透
; T! d  @" z1 k8 D/ p9 j5 ^     1.11.一击必杀: 敌方中弹一发必死
) C  u: ?6 T8 g) y% _     1.12.全屏击杀: 开枪时全屏可击中目标必死
8 B, c: v- ~) N; h3 D: N2 b     1.13.玩家双控: 两个玩家的任意一方均可同时控制两个玩家5 }& @7 b- G& F$ J& I0 N
     1.14.移除电网: 移除2,4关的电网
2 J! C, h7 }! m7 X* r# U. {3 E     1.15.掉坑不死: 掉坑后不会死亡9 j1 h9 T6 E  ]* d
     1.16.跳过关卡: 跳转到下一关4 ~+ n2 }3 \/ ?  A" Z, t( f
  1. ;[FC][魂斗罗][最佳可视化]* _( E5 Q2 f4 w4 w0 O
  2. ;20191129; S1 F$ p5 i& ]+ A

  3. % I: n! t5 C! o
  4. ;程序开始地址- s; n+ h1 F# t) w, q, D$ R
  5. .ORG $9000. X: e/ x  W% B8 w  `- C
  6. 0 o- M. u$ \) _; u
  7. ;==================================================
    ' {! ?' A' I! V0 Q) _
  8. ;==================================================
    # J9 j* g" E& D
  9. ;是否双人玩家
    ) G  H. P/ _: X7 k
  10. FC_IS_DOUBLE_PLAYERS = 1  ^% Z3 l. ^7 n9 m  ^* c4 M5 ?

  11. - r+ L$ @  I1 X' \; C
  12. ;==================================================
      Q3 n/ l5 g) N' _" m9 ]2 x! F
  13. ;PPU缓冲地址配置* _$ l- Q+ G  o" R9 [
  14. FC_PPU_Buffer = $0300, B; ]8 }" G+ M8 D1 q* H6 B: I* E' V( U
  15. ;PPU地址配置
    ) K6 x# M: N( N( e
  16. FC_PPU_Cursor = $00+ \4 V, c% X- g- K% C, o) O
  17. FC_PPU_Status = FC_PPU_Cursor+$014 S7 X8 T8 {; c" D; `$ f. Z
  18. FC_PPU_Data_Cnt = FC_PPU_Status + $01, A) a: e" T1 s( [$ i, ~
  19. FC_Data_Port_A_L = FC_PPU_Data_Cnt + $01
    " h! K* P7 |9 D3 n; {/ S; c
  20. FC_Data_Port_A_H = FC_Data_Port_A_L + $01
    ! E8 l2 Y# r) Q8 Y: B: e
  21. FC_Data_Port_B_L = FC_Data_Port_A_H + $01
    ' z8 F7 i1 o% C: S
  22. FC_Data_Port_B_H = FC_Data_Port_B_L + $019 v: A5 r1 j: G. J3 ^: z( l
  23. ;==================================================
    ; f8 i6 Z" |( H6 c, _" [: m8 J

  24. 1 O) p. P$ D$ o1 e- [* _* |
  25. ;==================================================
    # o2 v! i# q/ N  c
  26. ;选择项地址配置
      e3 X  W1 [2 z
  27. FC_Select_Index = FC_Data_Port_B_H + $013 N# T3 `1 S1 b- q7 q% B  O, z
  28. FC_Select_Temp = FC_Select_Index + $02& x/ D8 u% f! S  G% s  `% |) l
  29. ;NMI循环计时器
    & c) {2 J# }: z- R7 o$ P; E
  30. FC_Time_Count = FC_Select_Temp + $01
    ; @) l9 P7 g7 m  |$ ^7 Q
  31. ;==================================================6 k7 @3 s0 @, q9 \: D) p
  32. . W5 w' l% D! L- d# l4 ]
  33. ;==================================================
    ; |$ B% ?  e% j  W
  34. ;光标配置1 V8 a3 c7 O, ?/ d. ~1 p) t
  35. FC_Cursor_Addr_L = FC_Time_Count + $01, x8 h' L& l3 h2 M6 ~
  36. FC_Cursor_Addr_H = FC_Cursor_Addr_L + $01
    % i( i, c# I) g+ D% K
  37. FC_Cursor_X = FC_Cursor_Addr_H + $011 ?/ i% f9 i: T: o) T% |( z
  38. FC_Cursor_Y = FC_Cursor_X + $01( F9 o8 }1 k, L! z# N, L  F
  39. ;----------------------------------------
    5 b( }+ p. V1 ~
  40. ;光标图形号* c7 l6 V) x* \& a% K
  41. FC_CURSOR_TILE = $3E
    ( t4 Z) Z' a; l& h/ P: ^) k2 X
  42. ;光标偏移像素值
    * a5 B1 q5 Z' n2 I* h
  43. FC_CURSOR_OFFSET_X = 12
    9 x9 k1 }7 y% k2 o
  44. FC_CURSOR_OFFSET_Y = 1
    8 s" T+ {# u6 e. s. w
  45. FC_FUNCTION_OFFSET = 216 R1 X1 a& b& Y- M7 l
  46. FC_ON_TILE = $3D' ]5 X4 e' d% d2 Q& }/ i# z0 H4 W
  47. FC_OFF_TILE = $3C
    + f, t7 @3 u3 T2 K
  48. ;==================================================
    $ _( Y+ ^( L7 E% K* M

  49. 9 t- k+ p8 q2 L! f6 x. ?
  50. ;==================================================
    * J& @) g  I, P/ `. U
  51. ;翻页配置1 E" g( M* x+ ]( h
  52. FC_Page_Old = FC_Cursor_Y + $01/ @0 R. G; B' m8 l3 l* }: H& c
  53. FC_Page_Cur = FC_Page_Old + $01
    " U: r! ~. R4 p, T1 ?5 s4 e/ E$ K1 B4 X' N
  54. FC_Page_Item_Count = FC_Page_Cur + $01
    4 Z  k6 e$ ^3 `; z4 H4 h
  55. FC_Page_Item_Buffer = FC_Page_Item_Count + $01. A2 P: `4 B* K- R% V: G# h- _
  56. ;----------------------------------------4 k1 h& p5 o' C( @+ n* k, `
  57. ;翻页属性
    # E6 r. {- l6 b* m: h
  58. FC_PAGE_SIZE = 10
    ! d# v5 Q5 X  b7 w, _: k
  59. ;PPU单次写入缓冲项数
    / T5 j7 t0 d; Z* |# `
  60. FC_PAGE_BUF_SIZE = 2' [/ r: v3 u: l
  61. ;----------------------------------------/ {/ u, D& F' \9 v) U) z
  62. ;显示项最大索引属性
    * z. h4 Z# T8 }5 ]# g
  63. FC_ITEM_SUM = 16 - 17 n4 @5 k9 y5 [! Y8 r/ m  l
  64. ;最大页索引属性
    8 P; F6 V1 T( x+ G$ [' J' |) D. i
  65. FC_PAGE_MAX = FC_ITEM_SUM/FC_PAGE_SIZE*FC_PAGE_SIZE
    7 z2 h+ y. G& Q
  66. ;==================================================$ u: c' w% |  [

  67. $ i5 N- N  H1 i, j( U. _
  68. ;==================================================( {5 A/ p) w! `( X4 H, p
  69. ;按键配置! H, f, L1 y0 F2 d$ F& S
  70. Button_Keep = FC_Page_Item_Buffer + $01' d  }: C9 |0 d3 @- U; {5 R
  71. Button_Once = Button_Keep+$02
    % Z- i9 c% |% U2 C& @
  72. Button_Temp = Button_Once+$02
    % m9 {' N* A8 f. N2 q$ h
  73. Button_Buf = Button_Temp+$02
    ) u# l( {8 ^! x( A
  74. Button_Status = Button_Buf+$025 }# C0 ]( N/ F1 y& g1 v
  75. Button_Auto_Delay = Button_Status+$02
    9 A' }0 b( l. ^9 t/ a/ b* u
  76. ;----------------------------------------4 k. C8 s5 z+ L! Z5 U
  77. BUTTON_DELAY_MAX = $18
    ! ?- n: J- Z* t/ `' q5 t
  78. BUTTON_DELAY_SPEED = $08
    7 a% f6 F+ E# Y  }
  79. 5 e) L; P% v8 R) M3 h$ F4 Z
  80. BTN_UP = $08
    2 _% |6 n" }: k# E$ F  H! Q( u
  81. BTN_DOWN = $04
    % a. K* B- H1 p$ j* a: a2 G
  82. BTN_LEFT = $02* V" I, V0 \! \6 a7 g; }( O
  83. BTN_RIGHT = $01( K0 U- R4 W' o. d! w4 n4 q5 a7 o
  84. BTN_SELECT = $20
    * B8 n; w# G6 |' K
  85. BTN_START = $101 }/ j- A* I1 h- `- S/ U. }, G+ J
  86. BTN_B = $40
    7 `6 M% `3 r5 g: N8 p1 J
  87. BTN_A = $800 A) T* r0 w" M
  88. ;==================================================7 @- c7 u' Y; a9 a2 Q

  89. ! T' _) J8 h5 }+ @+ o! y
  90. FC_Copy_Addr = Button_Auto_Delay + $01
    3 |0 D  R- d6 M/ P+ a  y/ X
  91. ;----------------------------------------
    3 g- z, Z) v6 p5 J' A" k, |
  92. FC_Clear_Val   = FC_Copy_Addr+$00      ;清除模式覆盖值% C6 X# n0 z# k6 ^" ~* {0 X
  93. FC_Cpy_From_L   = FC_Copy_Addr+$00     ;复制来源地址低位5 N7 B9 H& m( v5 B( }( R
  94. FC_Cpy_From_H   = FC_Copy_Addr+$01     ;复制来源地址高位( ?$ i7 r3 o* L, W' W
  95. FC_Cpy_To_L     = FC_Copy_Addr+$02     ;复制目的地址低位4 t: w1 y2 z+ s0 B3 S. n& [
  96. FC_Cpy_To_H     = FC_Copy_Addr+$03     ;复制目的地址高位
    * H9 H( R1 D& s- _
  97. FC_Cpy_Count_L = FC_Copy_Addr+$04      ;复制长度低位6 z7 h& [# ]/ x! o
  98. FC_Cpy_Count_H = FC_Copy_Addr+$05      ;复制长度高位/ U* ^) d$ D( i0 m
  99. FC_Cpy_Port_L   = FC_Copy_Addr+$06     ;配置地址低位' q- E, M* P; N6 D  U1 t
  100. FC_Cpy_Port_H   = FC_Copy_Addr+$07     ;配置地址高位
    4 m( ~# q0 o6 g+ l! s* Y/ i
  101. ;----------------------------------------
    " g  |! U8 t9 o
  102. FC_MODE_RAM_TO_RAM     = $00  ;复制RAM到RAM模式4 P2 y* M% q6 z1 s- e
  103. FC_MODE_RAM_TO_PPU     = $01  ;复制RAM到PPU模式9 s/ t7 b( e, k8 Q6 Z) H
  104. FC_MODE_PPU_TO_RAM     = $02  ;复制PPU到RAM模式1 _: Z: X8 m: K$ _9 `) h% e
  105. FC_MODE_PPU_CLEAR     = $03  ;清除PPU模式& ]( u: ~3 m5 p# P9 k
  106. & G2 X- {# h6 [- m) q" H# A2 j. c) j
  107. ;==================================================
    , R$ P" W$ r* b1 I1 T3 [/ j# q
  108. Rom_Nmi_Addr = $FF
    ( M9 |+ w! y, N* f! \+ U( Z! i( a
  109. Rom_Btn_Once = $F53 S# i. t1 ]. k' M- i* n- D
  110. Rom_Btn_Keep = $F9% u& @! O7 C. l  A
  111. Rom_Pause_Addr = $25
    + j8 v2 s/ f* h4 ~) f# P
  112. Rom_Pause_Val = $01' ]$ N6 X& P. C; m
  113. Rom_Pal_Addr = $07C0
    3 V6 @% Z' y; X" O0 u' _! F8 [% o
  114. ;----------------------------------------3 m) m# U4 ^5 {. E" O, t! H) |$ V
  115. Save_Zero_Addr = $6200
    ! n4 L! l- _% `( l; ]. G
  116. ;==================================================7 X/ J( \5 z, [# ~' P
  117. ;==================================================
    5 r3 E& F7 e6 {: l- C- Y5 ~
  118. ' y. ^% J5 @) `! f" W' R
  119. ;程序入口
    , ]& o9 O5 q# ~7 w( m$ T8 M, Y
  120. Enter:  i  V  A! i" N1 u/ ]5 v
  121. LDA Rom_Pause_Addr
    : Z- K! V% s! I) `
  122. AND #Rom_Pause_Val: {, K& a2 W' k8 M
  123. BEQ Quit_End/ V* n( p1 h2 m. V  v. x; p/ D
  124. LDA Rom_Btn_Once
    ' v; p" M3 e9 c4 M( a
  125. CMP #BTN_SELECT, |+ S# j% }2 g- T( c8 O- v) Y
  126. BNE Quit_End/ @0 k2 d# G% t  `1 P! f( j
  127. PHA
    ) B0 r! q7 k+ m
  128. TXA
    - e9 m: u, w$ k/ V
  129. PHA8 ]* f5 u: }; c% }; a) s9 ^1 }2 R
  130. TYA
    0 O) J! y$ H3 Z2 C7 B
  131. PHA
      S, n) u. e: z
  132. JSR Wait_Sound_Stop
    3 ~2 H' x: A, h: b2 C; z
  133. JSR Save_Screen% X4 _  `8 Y, Z8 n( H2 m# v% J
  134. JSR Program_Begin# T7 W! A* Q5 A; e
  135. JSR Load_Screen
    ! s* k) ^* u: }1 U
  136. LDA #$10  [" y- M* d: A( N) X. p/ N
  137. STA Rom_Btn_Keep
    0 p' \4 g2 D2 P- ~/ Y8 z
  138. LDA #$001 ~* G. I# K+ i; p) m2 M
  139. STA Rom_Btn_Once
    4 E7 r: ^0 S% D& R1 c6 z
  140. Quit:
    ( ?% V$ W  u+ e
  141. PLA# u% z4 |  d- A) `6 B
  142. TAY
    ; u/ N- ?3 n/ y" r. k1 b4 c7 m
  143. PLA, w3 `, Q$ o9 w, _- A
  144. TAX
    ) a% f$ o! \6 B/ u3 ~$ W
  145. PLA/ u  L* v! M& l8 W, Z
  146. Quit_End:' w; t) v" Q/ w2 q
  147. RTS$ A6 A2 {0 @$ P

  148. 2 j1 U8 N: C) e' y& r5 e* ]0 U
  149. ;==================================================
      _9 D5 p# E" B7 h$ b
  150. ;等待音乐结束4 v3 g  U5 C3 K! s/ o6 f( h
  151. Wait_Sound_Stop:/ D. `5 E' J- t; Z! `. J- |
  152. Wait_Sound_Stop_Check:
    3 n1 ]1 ?( K% x6 g" w
  153. JSR NMI_Wait
    . q3 ?$ R, h( E3 D! Y; D  V
  154. JSR $F825- e8 X. a  Q: @1 S3 r7 R0 h* k# d* j! K
  155. LDA $010A
    / X4 F4 W4 ^5 c% T0 a$ i
  156. BNE Wait_Sound_Stop_Check4 ~( E# \5 x" o  k. s
  157. RTS1 o6 j- ?1 q7 y) K+ t! a. Z

  158. # b7 N, T3 {* D; g6 |6 b2 E
  159. ;==================================================
    4 D7 S, ~* x: J
  160. ;保存屏幕数据4 ?3 K8 r' p: W3 f, T
  161. Save_Screen:
    " l3 `* r& r0 l
  162. JSR Screen_Off( ^9 F$ _9 g: h& ~# A! D8 y
  163. JSR Save_Zero
    % P. C1 I# k* K. G! E7 @
  164. JSR Save_Ram$ {% B% K& d; V6 {2 n9 r  i* d
  165. JSR Save_Ppu$ P4 S& K- S) O* P+ g6 j) G
  166. JSR Ram_Init+ t! k: l- @2 K, K" h/ u
  167. JSR Sprites_Init2 I2 R& B0 W, B& h. M. v4 E
  168. JSR Clear_Ppu9 K, z9 `2 r, e6 O% r
  169. RTS
    & p/ W* H) r/ T
  170. ; e! u2 m8 ~- ~4 f9 I
  171. ;==================================================
    ) [4 {! C0 o2 Z
  172. ;加载屏幕数据
    $ O- O* v# p+ s5 ^2 {9 k0 D  }
  173. Load_Screen:* E0 X) x' C7 ^0 k/ E/ w$ F
  174. LDA #$002 V, z8 D1 k( N4 z  J# I" E
  175. STA $2001
    9 I% b7 J; u5 x8 x8 S- J) y
  176. JSR NMI_Wait
    9 ~: [4 ~: H$ D+ c' o
  177. LDA #$023 ]0 Z$ N; Z+ |# B  `$ G
  178. STA $4014  ]6 |. U) E! b+ U4 `2 w2 D
  179. JSR Load_Ram% u/ l2 z, T+ b
  180. JSR Load_Ppu) f& R: t- X) y' M6 b5 U
  181. JSR Load_Zero
    # I4 I6 T, Q6 _7 v* V1 N9 H
  182. JSR NMI_Wait
    1 B4 k" S9 _. P1 S0 t
  183. JSR Load_Palette& L6 H( p4 k" A- R( R. Z; I
  184. JSR Screen_On+ O) j9 a/ V# d0 o* l9 V
  185. RTS6 d% r, l5 z( C$ X8 S* c1 O

  186. 6 C& B. I2 _1 }9 G/ l% b3 g
  187. ;==================================================
    4 y. _# s# ]9 w
  188. ;关闭屏幕
    ! M) }& I9 E: A
  189. Screen_Off:) m! a: R1 A$ k- w/ k6 ^1 Y
  190. LDA Rom_Nmi_Addr' {3 J* d  R( ?+ F: c& [! b
  191. AND #$7F
    0 w: X$ a1 C. W. U  d
  192. STA $20009 p/ E4 Q7 A; p  i
  193. JSR NMI_Wait5 }- X& [% L: y, A, [% L8 G5 A
  194. LDA #$003 b) L1 j1 h' u  R9 r9 T: ?
  195. STA $20007 L$ F6 N$ z& P! c$ ^
  196. STA $20013 c5 m  q' b1 d. B2 q
  197. RTS
    , d) @, t4 h- C2 L
  198. / s. ~+ {: }+ I3 p. Z# C( Y: q: g: q: ^
  199. ;==================================================
    / K- D# e4 m" ^) N1 C5 q" H
  200. ;开启屏幕% K( C& E4 e* F6 |2 r* N, N  l0 ^
  201. Screen_On:* v( A2 H% M- p  }; _
  202. LDA Rom_Nmi_Addr
    . M$ q7 _2 g4 A! Q7 s4 x8 `! ]0 u' j
  203. STA $2000
    5 E6 v+ e" q4 N6 L$ M
  204. RTS
    * J! \6 q% }; [- n& i1 `6 M) U0 `

  205. 2 _' D% e6 p# Q0 m6 V0 q2 q( g! T
  206. ;==================================================) H( w0 v3 ^+ x7 v
  207. ;清空占用RAM3 x" g7 G( V# O
  208. Ram_Init:2 K3 M, |* s6 d. P' U
  209. LDX #$00
    : C* m# |7 i1 }9 @, l
  210. LDA #$00; q' f6 ]) ~) o2 z" r
  211. Ram_Init_Set:
    : G/ o. E9 {( K. C# S
  212. STA $00,X
    " s# [' h: L1 s3 |, g% J; @1 B3 x% J
  213. INX$ G7 W/ ?* \, Y. O: V/ G$ C
  214. CPX #$40
    4 W) G" q( u" L- B( y! e
  215. BCC Ram_Init_Set
    ! l4 F1 P0 J9 m$ a: P0 V, R8 \
  216. RTS
    + G) A, y" E1 c8 F
  217. ( p8 a5 Q4 E, h- Q% A7 m
  218. ;==================================================  v8 D$ @0 P) S4 m" p# ^$ s1 A
  219. ;清空占用RAM
    5 Y; `0 p. U7 }0 `
  220. Sprites_Init:
    + i$ a6 J- j6 s5 x6 h
  221. LDA $2002: O1 _& g" P3 D7 f% [
  222. LDX #$00
    / ]. v6 e+ k7 E2 P" y5 o4 |! `( E. R- Q
  223. STX $2003+ R2 d( T: l% p9 x
  224. LDA #$F8$ a* H6 q  P1 \; B
  225. Sprites_Init_Set:9 |; _1 o1 P: U4 K& L# j& _2 \* A+ E
  226. STA $2004
    : y2 C* S! R8 [( r1 g7 i1 ^+ N
  227. INX' Y* b& s7 N8 r( K: V2 g7 g
  228. BNE Sprites_Init_Set/ ^% {, z# A9 @  H7 z8 z
  229. RTS7 i7 F* Y5 Z4 ]5 S5 u9 o- B# D+ ~, F

  230. $ P- n) U1 @; u+ }
  231. ;==================================================/ e5 z, L& R3 G/ k+ F. F
  232. ;保存零页数据3 I2 b+ Q) Z- D  s
  233. Save_Zero:
    9 Z, V3 ~# c& z! P" }: F
  234. LDX #$00& X! F, I5 j" T+ {
  235. Save_Zero_Set:: Y/ t3 I+ Q. B3 m: Q6 ~! s
  236. LDA $00,X' D6 f: ?2 d% O( f; y
  237. STA Save_Zero_Addr,X6 d3 W/ C+ k0 Z9 }  y
  238. INX
    1 q5 j& i; s2 I1 j* ~( q% F/ Z; r; K% q
  239. BNE Save_Zero_Set
    + i1 B6 z) M+ H
  240. RTS2 `7 J9 K, A* I& b; O# l

  241. 3 ]0 f2 E: {- U
  242. ;==================================================+ q8 u2 ]( C1 c" l
  243. ;加载零页数据# a$ L2 q8 {$ s( [0 A
  244. Load_Zero:
    , h7 B' Y; i# K6 t1 H$ B# j1 @' N5 q
  245. LDX #$008 X3 n$ E% J/ E# W* a$ X3 f/ I
  246. Load_Zero_Set:  ~3 Y+ Y0 S, j; Z; h
  247. LDA Save_Zero_Addr,X( h% J5 ~- _4 n5 B5 n+ B' T' |+ _
  248. STA $00,X
      s7 O; M& `# |2 |% Y* B
  249. INX
    $ ~; {% j. ^. Z, g  B( N* H
  250. BNE Load_Zero_Set
    2 a) m( i% E* v
  251. RTS5 v8 a8 l2 ?, G9 _6 g! S. l6 h
  252. " a6 b, n! ~8 N: p+ x) ^. d. R
  253. ;==================================================
      _. I7 [5 M: ~( K1 v+ G
  254. ;恢复调色板( u" L0 M+ g, }5 V  {
  255. Load_Palette:
    , \) d3 e4 g- g6 I3 z7 l# G5 a9 L
  256. LDA #$3F
    ( W& w- R+ R$ I
  257. STA $2006/ B- ^: v, G6 @0 K  h5 F* K4 m
  258. LDA #$00/ ^6 x2 @, L( H1 x* ?
  259. STA $2006
    , A' t5 \, R5 u& k, A
  260. LDX #$00
    / D: A9 l  ?) |* ]
  261. Load_Palette_Set:
    " y, o$ A3 l+ G3 `  L
  262. LDA Rom_Pal_Addr,X
    4 q* L7 \! \2 F2 u4 W- Z: }
  263. STA $2007
    4 [5 e* I: Z6 w) P7 e
  264. INX0 I1 A9 g' [- D
  265. CPX #$20
    3 X! S4 M' t( S
  266. BCC Load_Palette_Set
    " ^0 ^: ]% \/ n& A
  267. RTS8 q5 [8 e2 o/ }/ K

  268. 6 b% o0 @- o4 R
  269. ;==================================================6 Y8 ]* e  A# v' j
  270. ;==================================================
    4 c& l8 e* i  B

  271. % ?6 C& l5 ~5 ~" \) S
  272. ;==================================================, |+ s$ s6 ~( ]
  273. ;程序开始
    ! L: j; N4 T# ~1 ~7 r* w
  274. Program_Begin:0 l' X" j2 S& ~
  275. ;==================================================
    5 f0 a1 @; u2 M" y# |$ B
  276. ;图形设置9 B3 `- q8 X( N2 x9 [
  277. JSR CHR_Set$ d  T3 ^! b7 G) Y" R6 W- Z+ ~& ~
  278. JSR NMI_Wait
    ; W: e$ y+ z' T1 j8 \4 j6 ~  }9 `
  279. JSR Palette_Set
    - h" P: ^" A. k6 l  z
  280. JSR PPU_Data_Page_Show$ ]4 q' b# a" y# f" z# O$ F
  281. ) b% n, n) |! D2 v
  282. ;==================================================
    8 O; n! s8 q3 X" y' i
  283. ;开启显示- `8 x+ ^/ ~: E& ?
  284. LDA #$1E
    # t/ l6 r  u( b+ U5 j; V
  285. STA FC_PPU_Status
    6 u( n1 Y$ i& E5 C. c& ~
  286. / n( |! j7 l- f5 F) V
  287. LDA #BTN_SELECT
    ! z' S, h7 x2 z% H, ]0 ~7 Z3 ~
  288. STA Button_Keep3 G/ A0 U) V1 }- J
  289. ;==================================================7 z, z& v+ C3 }& Y3 U8 {, e
  290. ;模拟NMI循环
    6 R# q; R7 @! y) B- k  N
  291. NMI_Loop:
    8 D' P$ b% E& m/ l& s6 o! m4 Z
  292. JSR NMI_Delay8 A( y$ c" P$ R) ~$ ^+ x) U. u; D7 K
  293. JSR Button_Process
    ( h; h2 e( B, d5 `* o
  294. JSR Button_Auto_Press# |" U9 H. l- p* p$ m2 Q5 e( s
  295. JSR Change_Select_Item/ j3 t1 a* S8 a0 l
  296. JSR Change_Function3 l% r0 h5 q' Q/ D2 t
  297. LDA Button_Once
    + i: K2 i+ b1 f$ R" E
  298. CMP #BTN_START
    & s0 C4 V; i5 ]
  299. BNE NMI_Loop
    3 B6 Q; u3 `3 K" ]4 ^$ y- _
  300. RTS, e$ B8 _' ]/ g- k; `! z/ d6 K  i
  301. 2 r' i/ d: w  x2 b" ]
  302. ;==================================================4 h8 D9 G7 F/ E) a
  303. ;模拟NMI中断
    0 y* O+ J' ~. k8 w
  304. NMI_Delay:  B. G* m/ t! L! z- v/ I
  305. JSR NMI_Wait, z- h! j, @$ o
  306. JSR Show_Select_Cursor
    ; z/ H' F4 v$ F7 A! Q* F' Z9 e' L8 S
  307. JSR FC_PPU_Process
    3 k; o2 k" _$ Q% _
  308. RTS3 l6 f; U# J) _0 j6 e1 m
  309. : c- s* P: ^, ^/ N- V
  310. ;==================================================6 Q+ Q2 ]) a. S1 I4 ]- S- z
  311. ;等待NMI中断
    # z% E) w9 Z& z% j1 \. n
  312. NMI_Wait:. m9 W( n3 Z3 _% Y+ Q! u( e6 x
  313. LDA $2002
    ' w% l$ f' ^  \1 X& T! P
  314. BPL NMI_Wait
    5 I5 d) K: r( ?. g' |
  315. DEC FC_Time_Count
    4 x  K& w5 l1 Q. U
  316. RTS
    / K+ M6 U( F+ e$ w

  317. 5 B7 o! |8 k& G; h: c+ ~% o9 C/ _
  318. ;==================================================
      C# [7 u. {8 Y5 r9 U5 R5 B
  319. ;PPU写入模式配置属性0 L. X% G7 z4 `" x) U0 m4 g* h8 E
  320. FC_PPU_MODE_CNTL = $FE               ;带计数行写入
    . I* h; m- Q, P6 N( q0 o& |
  321. FC_PPU_MODE_CNTC = $FC               ;带计数行清除
    " d+ {* G% \% \: J2 R( y; F% p
  322. ;-------------------------------------------------' ]! m' e9 o1 H( f+ z( M8 L- L# _
  323. ;PPU处理
    $ k( y+ ~8 W9 U4 e% t
  324. FC_PPU_Process:
    " q! m( ]& r0 \3 {' K
  325. LDA FC_PPU_Buffer
    3 k3 h$ u: q/ P% ?
  326. BEQ FC_PPU_Process_End
    # G  b7 n. H. e' x& {
  327. JSR FC_PPU_Process_Beg, j1 N! H" v( A/ G0 {6 _
  328. FC_PPU_Process_End:/ ]# v  N" h7 R. h- \6 c9 e$ i
  329. LDA #$004 z) p# p- H  j
  330. STA FC_PPU_Buffer
    * o  {. T: \5 _7 w4 M  D
  331. STA $2006( ^! M) H7 H9 u4 P0 M
  332. STA $2006
    7 H9 C* N2 Q% y
  333. STA $2005
    3 F! W# [+ x2 P+ M; h
  334. STA $2005
    : K& h+ Q2 ]5 m0 R; v
  335. LDA FC_PPU_Status
    ! o7 H; F3 V5 O8 x
  336. STA $20016 e; Y/ x( B1 N" K0 J6 p
  337. RTS
    / F: s% m/ D* }' P' q5 i  k
  338. ;----------------------------------------
    3 `5 x4 z0 m6 d5 v5 R
  339. ;PPU处理开始/ L1 s: R& n9 b# s' l
  340. FC_PPU_Process_Beg:
    2 r- e9 \( @) D
  341. LDX FC_PPU_Cursor3 W7 m( ?) ]" S& Q6 z8 t+ Z) L( ]5 J% l
  342. LDA #$00# \2 b. S% i4 _  l& G! V8 T2 g
  343. STA $2001
    ( C+ `9 U3 a/ Z
  344. STA FC_PPU_Buffer,X% u# K  A5 X, l3 W8 Q0 h
  345. STA FC_PPU_Cursor$ A& A( n5 P+ F+ }
  346. LDX #$FF' C* `8 s2 A1 P4 a2 }: X8 E9 U5 i
  347. CLV
    # M4 d* M" m  v2 `
  348. FC_PPU_Process_Mode_Select:) D* g5 l! [( _7 H2 W" K
  349. INX& d6 T) k' G! |& v" _: J
  350. LDA FC_PPU_Buffer,X8 P( l" _1 A  c7 Q- H" \* H
  351. CMP #FC_PPU_MODE_CNTL
      u  V/ I' A& t  H2 `8 ^% O2 j8 E
  352. BEQ FC_PPU_Process_Mode_CountLine
    - O5 H; I/ `4 P8 G# q
  353. CMP #FC_PPU_MODE_CNTC+ {2 f3 E* `. `7 F
  354. BEQ FC_PPU_Process_Mode_CountClean
    " V6 f! e% K- o( j5 Y
  355. RTS
    % d- E+ U6 B, V+ e. }
  356. ;----------------------------------------
    5 `/ j0 R, j0 a5 _5 j; U
  357. ;计数行写入模式
    - p3 t( n0 E& x9 M
  358. FC_PPU_Process_Mode_CountLine:9 V  ~4 }3 j. O8 _6 q6 D' q2 `
  359. JSR FC_PPU_Process_Set_Addr_And_Count
    " Z: y4 w6 C) O- _# `: S
  360. FC_PPU_Process_Mode_CountLine_Write:0 L4 C2 N, y* N2 {% f/ e
  361. INX3 ]0 e0 E9 T/ b
  362. LDA FC_PPU_Buffer,X
    : i, d! |/ g0 V
  363. STA $2007
    ) ]# R) F9 n$ k$ z
  364. DEY1 B3 ^8 t' B: s! _
  365. BNE FC_PPU_Process_Mode_CountLine_Write
    + t. W! r7 }5 `4 [' g$ g( n
  366. BVC FC_PPU_Process_Mode_Select
    & T& n  C2 O+ F4 u3 k
  367. ;----------------------------------------
    8 ?5 w) m9 R  I
  368. ;计数行清除模式1 M4 s+ ~: S9 u" F; i
  369. FC_PPU_Process_Mode_CountClean:9 M3 w3 ^/ _# u/ u8 P0 |
  370. JSR FC_PPU_Process_Set_Addr_And_Count
      k  S4 I( G* K9 Q1 q/ R
  371. LDA #$00
    + }6 m, P0 @9 V9 w0 ]2 Z
  372. FC_PPU_Process_Mode_CountClean_Write:  N7 S, X2 {+ s) z
  373. STA $2007* C& Q) ^0 X$ k
  374. DEY
    6 j' r+ |4 O- G( Z, J# Q* P8 `8 W
  375. BNE FC_PPU_Process_Mode_CountClean_Write
    ) {- F+ t7 G+ [& E( Q" v
  376. BVC FC_PPU_Process_Mode_Select7 N! G7 u- I$ g# i
  377. ;----------------------------------------
      y. a5 n: U& z: @$ }* f, i, T
  378. ;设置PPU地址和写入计数5 y6 T, i; Y2 M1 R
  379. FC_PPU_Process_Set_Addr_And_Count:3 S& `- k+ b" f
  380. INX3 D% x2 w# }% c2 y! m! L; F+ M
  381. LDA FC_PPU_Buffer,X4 h5 u3 k) R% \; Y! k* b( ]+ F( U* V, N
  382. STA $2006
    , \$ ~! v6 K/ @) b! U- K
  383. INX5 V6 v) n# G, P# O, I
  384. LDA FC_PPU_Buffer,X
      t) f' S0 g. S+ y+ A! N$ g; Z
  385. STA $2006( b" T* l- X9 E- Z; c( _
  386. INX
    # K3 u3 {5 Q) r8 N1 }! O" \
  387. LDY FC_PPU_Buffer,X
    & w' L( |, n/ A1 j4 Q" w; F
  388. RTS* @& x* M7 ?: c1 P7 `+ M9 ]) }( t
  389. 6 o* G. g  Z) b, U: q! _
  390. ;==================================================. A; g. m# b3 Y* G1 v
  391. ;设置CHR图形
    & f' W  y! Q0 N- V  S
  392. CHR_Set:
    0 K( L  T% [3 [0 z9 R! T
  393. LDX #$05
    ) B5 g: I) Z2 c5 X: h
  394. CHR_Set_Data:* O; D7 B8 n* H
  395. STX $8000. R* w$ f) [9 W' G/ i3 I2 ~+ M
  396. LDA CHR_Data,x
    8 {3 Z/ n& l' ?+ g
  397. STA $8001
    1 R: |. s* N5 o; @
  398. DEX+ _" b9 l. c+ q  E9 J; {9 }; {
  399. BPL CHR_Set_Data
    , ~" Y/ [& |6 t) e# j5 J. [
  400. RTS& q+ s6 S  J9 B5 j& b0 G
  401. ;----------------------------------------  b& X' ]1 _% G; B& Q! y3 \7 U( d4 F' U
  402. ;CHR图形bank数据' m/ t; f+ ^, ?. j5 W9 L" u
  403. CHR_Data:
    1 h, c+ ?3 K* [/ f
  404. .BYTE $00,$00,$00,$00,$00,$007 o3 n% h4 z) F4 \- f1 ^# u/ S. M

  405.   [. w" x/ [2 ^- T7 s" L
  406. ;==================================================% G3 A1 t. R% B" W0 P5 i
  407. ;背景调色板设置6 l0 y% \6 a" C$ A
  408. Palette_Set:7 j+ |5 @- o3 T
  409. LDA #$3F
    - n7 o& s! C& r" x, U
  410. STA $2006
    2 t. x- r0 d2 n( f
  411. LDA #$00
    ( j0 ?5 ]1 f6 V7 m) Y- ?
  412. STA $2006
    * A* [( g) K3 b: H+ B5 i
  413. LDX #$00
    . r# E6 d( b- B# U2 D% t
  414. Palette_Set_Data:
    % x7 b( i7 y% J( S
  415. LDA Palette_Data,X
    1 }/ g* o, I+ L
  416. STA $2007$ j( S* P( H7 f3 z
  417. INX+ V$ Y+ D# G; M4 X
  418. CPX #$20
    5 J1 @" b$ P, p" Z
  419. BCC Palette_Set_Data
    : [7 O9 Z8 \, M% ^, Q5 X
  420. RTS5 E8 b$ ~- c* }' b
  421. ;----------------------------------------" i! H3 i! a- h9 |# {8 A# T
  422. ;背景调色板数据8 h/ t! {2 t1 \5 ~
  423. Palette_Data:
    0 t8 C, w$ }7 D  Z* I& G
  424. .DB $0F,$29,$24,$24,$0F,$20,$20,$20,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    6 S7 l6 f9 m3 N+ x
  425. .DB $0F,$20,$26,$16,$0F,$24,$24,$24,$0F,$26,$26,$26,$0F,$2A,$2A,$2A' H( j6 v: S: z3 M6 {  u
  426. ' E" i+ [1 o: E6 q- V

  427. ! z% G+ k( Y$ E, c4 \" L; E6 r. X8 C
  428. ;==================================================
    ! z1 [8 s2 F: |8 ]; c) Q' m4 ?
  429. ;按键扫描: q5 b) @3 u# z) q# i; v$ |
  430. Button_Process:! V5 T! u8 R6 L* Z" W8 L
  431. LDX #$01
    + S9 A* F) t) W: n
  432. Button_Process_Beg:+ I: A& _) W1 ~; s- {& c
  433. JSR Button_Scan
    2 ~# {6 z" @, k  ~/ |: ^4 a
  434. LDA Button_Keep,X: j5 V/ D+ c. R: ~$ O3 C  P
  435. STA Button_Temp,X
    $ [8 w4 P! J, [& P7 ^5 d
  436. JSR Button_Scan
    & O) e7 {" A& q) Q/ [# ^7 n
  437. LDA Button_Keep,X( B9 d# j2 r( [  ^8 ~, Z7 i% x* `8 ?+ E3 v
  438. CMP Button_Temp,X8 e8 E5 I& J2 ^; N) f* A
  439. BEQ Button_Get_Once) I. N0 a- O$ i  L. W
  440. LDA Button_Buf,X
    5 ]# `3 H* G% U! W. _( U8 \
  441. STA Button_Keep,X" a. P9 H* k( I4 h- }! l8 O
  442. Button_Get_Once:) v! r5 q# I+ [/ b) _
  443. TAY
    : T* h, g: q0 D+ m' ^4 m6 H
  444. EOR Button_Buf,X7 }: y$ s5 O% J
  445. AND Button_Keep,X
    , j% K% I/ T& j; `; z, p& m
  446. STA Button_Once,X0 B' h* Y3 d0 q3 g7 V4 m" K
  447. STY Button_Buf,X( ~3 f+ r4 y& C$ Y
  448. DEX2 P/ U$ H) S# s# L5 `
  449. BPL Button_Process_Beg2 V5 ^+ z# E! Q3 Y# \$ {3 z
  450. RTS
    8 I& E$ J9 X8 i
  451. ;----------------------------------------
    ' `; ~: b) _2 S. K$ A  R( n
  452. Button_Scan:
    : X7 t! |5 `# f' {
  453. LDA #$01% A  `, A* b- _+ c5 ^
  454. STA $40169 W3 P; `; p6 M  u
  455. LDA #$00" n  B. v/ [; ]3 B. x7 Y! G
  456. STA $4016) O& ^* M2 m; w) e
  457. LDY #$08. H9 m, z0 I& H
  458. Button_Value:
    * H5 H' q: n5 W! m, W# [1 k  I
  459. LDA $4016,X
    2 f# f# b, F4 g( @, ]6 E% C
  460. STA Button_Status,X
    9 }! _7 z7 K8 ~* O6 p! C
  461. LSR
    + R; c+ N- ?3 P$ N
  462. ORA Button_Status,X2 k  ~: G" z% `$ F2 v
  463. LSR2 M* q* B# M( m& Q1 d: c4 ^
  464. ROL Button_Keep,X6 L7 q" `8 a8 Z) @" N& v. Z# r
  465. DEY' p8 y2 Y8 J0 |& k% A
  466. BNE Button_Value  |* \9 @8 j# _: J: D
  467. RTS9 G2 V$ G: h3 Q8 ]9 S
  468. . Z* \# b" L0 q8 L
  469. ;==================================================
    / \% ~$ W& R1 t2 m1 R) k
  470. ;按键自动按压
    % T* V, r, W1 k% `' u6 u. }; \2 F
  471. Button_Auto_Press:
    * z% b/ i' b/ g1 s5 R& F: @
  472. LDA Button_Keep
    * m1 u! t, r6 b' `5 J* q8 ]' h
  473. ORA Button_Keep + 1
    5 I9 i2 g  _* o, y
  474. BEQ Button_Auto_Press_End9 r2 `$ `; }5 e5 r. b: r7 E6 A
  475. INC Button_Auto_Delay$ o% |, l# s5 o! C$ a
  476. LDA Button_Auto_Delay, I$ Q2 E  g" a0 q
  477. CMP #BUTTON_DELAY_MAX1 z6 d) u. g6 q; X0 G6 a
  478. BCC Button_Auto_Press_No_Active& S+ Q+ z" B9 U0 C5 P8 ^
  479. LDA Button_Keep$ M7 ?- `3 l+ ^* \# b
  480. STA Button_Once5 W& ]9 q  m4 u5 c* P
  481. LDA Button_Keep + 1
      N9 _0 l. ^! P9 q; y  |
  482. STA Button_Once + 1
    * p: |8 d% |* j* R8 `# ]
  483. LDA Button_Auto_Delay
    5 t1 k- u& f* |# V+ v5 V
  484. SEC
    % _9 l! L: J/ y* n, D' [# Z9 {& l" D
  485. SBC #BUTTON_DELAY_SPEED
    % O  o* L/ J* F8 I, t. j* m
  486. STA Button_Auto_Delay8 E2 w# L: T0 ~* T( j/ F; b
  487. Button_Auto_Press_No_Active:/ H% J* p+ Q4 |$ T+ B
  488. RTS
    7 [) }) J0 x! @
  489. ;----------------------------------------
    6 w0 F' N. X" E, B: r6 D" j/ V6 m1 h( ?, {
  490. ;未按压按键5 Q, v+ x' R0 H! i( h
  491. Button_Auto_Press_End:6 v, a3 |- A1 t  f) m
  492. LDA #$00
    6 N+ {. o- P" n. R. M5 t
  493. STA Button_Auto_Delay
    * Q! v) a  U+ x1 V( ~& B  z
  494. RTS/ B5 x+ e1 W( K8 l: G6 H1 L
  495. 1 e* b6 M! e" t. ~
  496. ;==================================================
    5 r5 u$ ^! I' `0 k
  497. ;设置PPU写入模式5 N' v: P& f1 ^9 m
  498. Set_PPU_Mode:
    8 F( P- D' j6 ?4 a. i
  499. LDX FC_PPU_Cursor
    ; e$ T. X, k  j3 V- L  {7 ?9 J
  500. STA FC_PPU_Buffer,X2 ?7 V0 B# m0 `! g) i( _! j
  501. INX
    $ g& j5 S- s  i; \0 |' Z0 N
  502. STX FC_PPU_Cursor0 o* R5 `8 k4 `7 H9 F( e5 u
  503. RTS, u/ Y  |* u+ I/ \. O
  504. $ W9 P' r$ x& R* A" y' y. j5 X5 _
  505. ;==================================================
    9 D# z- V" m5 L2 G$ h
  506. ;写入单独一行文本
    ' e$ D7 @8 k& D8 P
  507. Set_Select_Addr:
    ! x3 E( P3 M% Y
  508. LDX FC_PPU_Cursor
    5 L9 U9 v* T" C7 N. p
  509. LDA FC_Select_Temp
    . a. v9 O8 {9 w  l' U
  510. ASL
    2 _) H& H1 j* _& E6 d2 _- Y
  511. TAY6 \, {6 M5 ^) n" ?7 K; H
  512. INY
    - y3 m. ]9 {$ Z
  513. LDA Text_PPU_Addr,Y
    8 _9 X' d0 z8 b
  514. STA FC_PPU_Buffer,X' g2 m- U. `; d0 G5 U2 _+ b3 z, y
  515. INX* v, Q! Z. O8 x7 O
  516. DEY
    ' Q4 x' z0 B# ~) x3 u
  517. LDA Text_PPU_Addr,Y, ?0 U& w. u" a+ b
  518. STA FC_PPU_Buffer,X
    : r% b; Z& C. C. C4 \5 O+ D
  519. INX& f, S6 H  R$ q1 n! q
  520. STX FC_PPU_Cursor
    3 a1 F6 H( ]8 r" d9 m1 ^
  521. RTS
    / g0 O) a- q; q+ J9 G
  522. 3 [7 b" T0 I; J) T9 k3 v* ~
  523. ;==================================================) g8 \2 b* p9 _6 m7 E) _. Z. D
  524. ;写入单独一行文本( Z; z* u7 `5 ~' Q8 w- Z
  525. Set_Select_Data:  z' k8 S+ ~: ]8 k/ {
  526. LDA FC_Select_Temp; u9 ~  O% V4 @5 a6 Q! b8 K
  527. CLC
    # u" G) F' b0 r) b
  528. ADC FC_Page_Cur' h' m/ K  [) a: P
  529. ASL/ e4 g1 I3 {- e: p
  530. TAY+ u: \3 }9 }( L8 T
  531. INY
    9 Q( N3 `$ K% E* H5 L
  532. LDA Text_Data_Addr,Y
    ) m# K( n4 M0 G0 A) d
  533. STA FC_Data_Port_A_H
    & B& f' _+ p! B' H$ U& I) L% R
  534. DEY1 q/ h  E" a6 E7 R- b  R# Z
  535. LDA Text_Data_Addr,Y
    $ f/ o' H& m5 j! k+ M
  536. STA FC_Data_Port_A_L4 e- \  J2 O6 t6 J
  537. RTS2 n8 z! `( _+ ?* b

  538. 4 L, m+ }! Q' W/ }; l% J
  539. ;==================================================
    $ K% ?2 w3 x) P# n- }9 H1 l6 }1 b0 q
  540. ;清除旧文本
    , g% l- J$ `$ o, O& W" x* y- b) H1 a
  541. Set_Select_Data_Clean:
    & j3 E/ ^; h1 M9 u3 U9 m
  542. LDA FC_Select_Temp3 K. L( e. J7 j/ j( `' {" Z9 L
  543. CLC
    % p5 w2 ~( x/ y* R4 v# e
  544. ADC FC_Page_Old
    5 Q4 i" D( p! }
  545. ASL
    7 q, Q3 A% q, [6 K; R2 t* f
  546. TAY
    4 x% v( h& i$ \! Y
  547. INY
    3 c! ]* C; `; A. D2 |1 `
  548. LDA Text_Data_Addr,Y
    " Y( K8 O% n5 i5 c. }
  549. STA FC_Data_Port_A_H
    ( Q6 p9 Q, N3 p
  550. DEY
    ' U1 _" x, ?! L7 x4 B/ w8 x! ?- ]
  551. LDA Text_Data_Addr,Y2 x" e* u" h* m( L$ s7 Y* ?
  552. STA FC_Data_Port_A_L- E# P: C( S, U* N- `
  553. RTS3 h  D& H3 C" z. a
  554. ) w6 ]* h( R# x5 M. |' e$ |: r0 H* Q
  555. ;==================================================
    ( |/ G( C* |) P2 q9 I- |9 f( c
  556. ;写入单独一行文本
    ! e; `& R( [4 k; U- c+ k1 ?
  557. PPU_Data_Write_Item:3 o1 j' c# |/ N$ p
  558. LDA FC_Select_Temp, x% d( V8 M: w3 g" s0 j
  559. CLC
    * g* Z+ y2 u# M. o/ C% @4 T: m) z
  560. ADC FC_Page_Cur/ y0 `1 A2 u# N; H4 {; Y: F4 P. k/ d
  561. CMP #FC_ITEM_SUM
    $ h- N7 v: j, c  Y7 v! e
  562. BEQ PPU_Data_Write_Item_Set
    / J4 w, g# Z1 s! N. h
  563. BCS PPU_Data_Write_Item_End
    , j: d5 v/ p) C& W
  564. PPU_Data_Write_Item_Set:* ?9 q$ _* W0 G2 }! X2 t
  565. LDA #FC_PPU_MODE_CNTL" u) c# @+ |" r, L$ [! O
  566. JSR Set_PPU_Mode% Y* u8 Y. f. f) B1 l# A5 C" F' p
  567. JSR Set_Select_Addr* ?7 o9 }7 f! {0 B7 Y# G! f
  568. JSR Set_Select_Data4 C: ]% s# f' W9 Z8 {3 g
  569. JSR PPU_Data_Write_Line8 f8 ^5 r( m! p7 i- B
  570. PPU_Data_Write_Item_End:
    ! j  e: `, ^$ r9 F: R# X
  571. RTS* U! _1 \! V0 {$ h" ?9 B

  572. & X# `5 t3 p! M& d- {
  573. ;==================================================7 l: _. L( _" W; j
  574. ;清除单独一行文本
    " |3 t" k0 Z" a5 x
  575. PPU_Data_Clean_Item:
    ( h8 h+ }/ _. E; M- K) ?! ]
  576. LDA FC_Select_Temp  b  ^8 M5 b* u$ u: i$ p* N
  577. CLC: ^. ?/ S* t0 \$ L% a! o; i: I
  578. ADC FC_Page_Old& _7 H& `  S* Y9 h
  579. CMP #FC_ITEM_SUM
    3 L. f' Z3 |/ ~9 W, V! I' V
  580. BEQ PPU_Data_Clean_Item_Set/ m! S* z: ]8 w; [/ ?" Y
  581. BCS PPU_Data_Clean_Item_End: E# Q3 O% S: [1 S+ L& S9 o- Z9 S
  582. PPU_Data_Clean_Item_Set:
    / c/ |/ t+ t9 W1 C: {7 j  F" V
  583. LDA #FC_PPU_MODE_CNTC
    5 n* L* _4 S% ?& V: e
  584. JSR Set_PPU_Mode
    8 w' E6 {+ Y1 z
  585. JSR Set_Select_Addr# L3 B: i% R: u
  586. JSR Set_Select_Data_Clean# q8 o8 r1 E% n5 c( {  _/ b
  587. JSR PPU_Data_Clean_Line
      T& S2 Z! s) R
  588. PPU_Data_Clean_Item_End:/ \0 A, D- c6 }  Z! a4 V0 Y, x4 M2 `
  589. RTS
    / u% n0 m- Y0 i2 T! N3 ^# a
  590. . _' S# I' q) t' B! _* T6 L
  591. ;==================================================, j1 R' m3 `3 b8 i
  592. ;页内容写入* H  n* ]# N3 t; @- M0 }0 d
  593. PPU_Data_Page_Show:# x8 U3 Q/ n4 A, r& I( m0 e; C! @: t
  594. LDA #FC_PAGE_SIZE
    " y: D' F' U8 P! m" V' E; w
  595. STA FC_Page_Item_Count( ?# f" ?! F  ]& h* ?' ?
  596. LDA #$00# {5 c8 j, p2 F. U4 a3 ?8 D, o
  597. STA FC_Page_Item_Buffer
    ! H; S5 v% ?( x7 q
  598. STA FC_Select_Temp
    & o- T5 K; `  D
  599. PPU_Data_Page_Item_Set:
    - ]; E6 u& I/ ]
  600. JSR PPU_Data_Clean_Item
    ' X! M; P0 T# Y& v
  601. JSR PPU_Data_Write_Item# j3 X% ]1 L, f0 h' K
  602. JSR Function_Status_Clean
    9 T7 ?1 R, s+ A4 L
  603. JSR Function_Status_Show
    " L2 [+ D: u0 V( r! p: s
  604. INC FC_Select_Temp
    % h7 ?6 z9 O7 v4 P
  605. INC FC_Page_Item_Buffer$ I/ f1 H2 v0 m) |, Q. }
  606. LDA FC_Page_Item_Buffer
    4 K2 s# ~0 o+ F3 P, m9 n% @, E
  607. CMP #FC_PAGE_BUF_SIZE
    ; `4 n7 A' e9 n/ A/ ~4 x
  608. BNE PPU_Data_Page_Item_Set_Check
    & U& u# u  }# h6 A5 x& W. ?& E
  609. JSR NMI_Delay
    + r# l# S/ ~  I  W& J" ~
  610. LDA #$00
    " D4 h! n* x4 l
  611. STA FC_Page_Item_Buffer
    - ?0 C- s  U' w1 ~5 \
  612. PPU_Data_Page_Item_Set_Check:
    ; }2 c: Z2 W% x# w* o2 p" J; |
  613. DEC FC_Page_Item_Count; j' [9 Y: r# u: Y5 r
  614. BNE PPU_Data_Page_Item_Set
    ' G. n* ]" {5 j. Z- J+ X
  615. PPU_Data_Page_Show_End_Check:! a4 M2 l- O* R: Z3 y
  616. LDA FC_Page_Item_Buffer
    1 h* V* t# t7 s: G0 X5 U
  617. BEQ PPU_Data_Page_Show_End) a) `; s+ k4 o  i% b
  618. JSR NMI_Delay2 t9 G5 Y& ~: {
  619. PPU_Data_Page_Show_End:
    $ ?' t4 b! F; l
  620. RTS
    : b7 q+ y* Y9 \; L0 `

  621. 5 K( o; |$ M, X6 |
  622. ;==================================================+ O$ N/ G5 m5 x! N
  623. ;PPU单行数据写入接口
    4 y! k; t% d" {% z! ~6 a/ _' F1 S; g8 R
  624. PPU_Data_Write_Line:+ H- ?! q( K/ E# I( v/ x' i! t2 V: S
  625. LDX FC_PPU_Cursor
    + O* H0 E' t8 O- @
  626. LDY #$000 g: X7 D5 W. v8 r$ ~$ N
  627. LDA (FC_Data_Port_A_L),Y
    " [3 e6 a) w, |3 D  K$ I
  628. STA FC_PPU_Buffer,X
    $ x1 s% {  g$ ]& c! i" J8 m
  629. STA FC_PPU_Data_Cnt1 z8 A, k0 s1 S6 k+ L' x
  630. INX
    7 M( e- A9 {2 B4 k# I$ X0 {% d4 k
  631. STX FC_PPU_Cursor
    8 ?; S/ y# T- |" u" N
  632. INY: {* ~5 A6 ^; ~* n3 `' o
  633. PPU_Data_Write_Line_Set:$ V" K2 M" g: k
  634. LDA (FC_Data_Port_A_L),Y
    - y3 X0 u- i- n5 D; _) [
  635. TAX1 A" k1 c$ v4 f' p" t
  636. LDA Char_Rom,X
    * q9 I  N* p" G3 H$ K5 J
  637. LDX FC_PPU_Cursor5 U, ]& `0 w( Y8 p% }. z+ m  Q
  638. STA FC_PPU_Buffer,X+ i# Y1 S' P* e: r2 N# [
  639. INX
    9 v* P% C; W: H$ K5 o& `7 T
  640. STX FC_PPU_Cursor
    / N9 L6 T$ U5 T" ?
  641. INY
    / h) [$ G1 Y, r  T; Y/ ]
  642. DEC FC_PPU_Data_Cnt/ N8 ]' X& |3 b) M, m6 R
  643. BNE PPU_Data_Write_Line_Set
    * a1 a# V8 B1 ^" q0 u
  644. STX FC_PPU_Cursor
    , Y3 B; F5 o' B7 h
  645. RTS
    5 ^& u2 B; I  r0 ]
  646. 6 r/ Q* Y4 o/ t9 F9 }
  647. ;==================================================
    ( c. i6 W; N6 C2 j1 F9 f3 t
  648. ;PPU单行数据清空接口( {4 W! m5 \! x% x5 q
  649. PPU_Data_Clean_Line:! M6 Z! M2 P! r
  650. LDX FC_PPU_Cursor% k* p" Q, a7 I
  651. LDY #$00+ n) r1 o7 r, V' v6 {% @4 b
  652. LDA (FC_Data_Port_A_L),Y
    & I  ~7 b' }+ I: ^' }- p) B
  653. STA FC_PPU_Buffer,X$ H* u) N" B  U  c) V
  654. INX8 N% N/ w% J3 m; d
  655. STX FC_PPU_Cursor
    + q4 ?2 r* v! K* l
  656. RTS
    " H. O  N# S( i' G6 Y6 T

  657. 2 x( F6 F, P) _
  658. ;==================================================; {  U7 D; l! O. d# E) E$ x9 D
  659. ;更改选择项
    ( Q# Q+ b6 Y4 U; A5 Y% Z
  660. Change_Select_Item:% d9 I1 a" \" `# F' `% ?
  661. Change_Previous_Page:+ l7 Y; ~& i) z* K8 B) m
  662. LDA Button_Once
    6 z; h9 [: }" N. I9 N+ \( a# E
  663. ORA Button_Once + 1
    , T. A1 m( ?) P& Z* _* Y; W
  664. AND #$02
    * w% Q/ o: z0 V/ M7 n# `' h9 y
  665. BEQ Change_Next_Page6 H, ~: Y0 f1 V! {: M; M& x
  666. JSR Change_To_Previous_Page
      s) u3 r- K% ?; q: S; T3 N' h* ~
  667. Change_Next_Page:
    % G' g" P- n! \( U: }- W* ]
  668. LDA Button_Once
    $ I7 d' f; i2 U4 \  F! B3 e8 a2 T
  669. ORA Button_Once + 12 a, P  q. B, j' x" [, R
  670. AND #$01  J  _! H3 o% l; {' J
  671. BEQ Change_Previous_Item
    " ~) l* o3 _$ n% l5 |: W# B( V
  672. JSR Change_To_Next_Page6 P/ @+ M2 ^4 L1 W, T8 E; n* l
  673. Change_Previous_Item:2 u3 w6 M0 |* {: M4 F: f7 X' L
  674. LDA Button_Once
    + `3 [, O  l1 B% e* G
  675. ORA Button_Once + 1, y+ `2 G7 x; h6 Z' t
  676. AND #$08/ k9 I! i5 N2 c7 U
  677. BEQ Change_Next_Item
    & `4 o9 q* ?- e' \6 ~2 E+ G% U! @- g
  678. JSR Change_To_Previous_Item( d3 f; g; f, y
  679. Change_Next_Item:: P1 r0 F2 I% y8 G% l/ z  r
  680. LDA Button_Once
    ' v0 f' K1 C* m  X" @) w
  681. ORA Button_Once + 1; W8 ?4 X+ `- h
  682. .IF FC_IS_DOUBLE_PLAYERS
    8 D% G# W8 z# w, u" r
  683. AND #$04- f8 }& t1 T1 X' U
  684. .ELSE5 w' f. n+ L1 S
  685. AND #$24
    0 ^* O1 C, Y! y  ?% C
  686. .ENDIF& i6 I0 L$ G5 F8 V
  687. BEQ Change_Select_Item_End2 {; Q/ {$ R) d. g0 y; z
  688. JSR Change_To_Next_Item+ P# r% m( H1 ]; u) {) |
  689. Change_Select_Item_End:2 Y2 f& t- q7 v( B( `* T
  690. RTS
    * O8 s; Z, m0 G% `
  691. % f8 e; L! s) i) P5 B+ `
  692. ;==================================================0 U- q# s0 A- y( f) J8 v
  693. ;切换到上一个选项+ a- ~2 m* h% Y1 U
  694. Change_To_Previous_Item:& w! m( S! t, z' F7 k4 s
  695. LDA FC_Select_Index
    ' E: l6 o3 d* ^$ E' `8 }2 i( e8 m
  696. BNE Change_To_Previous_Item_Set" O6 e2 X$ Y* j5 N
  697. ;----------------------------------------
    ) a0 \& W# Z5 l7 t) t
  698. ;切换到末页最后一项7 Q- Y- ~. r! G5 ~: J' f2 a  n
  699. Change_To_Previous_Item_Set_Last_Page:
    8 T" a/ ]% i3 L8 q: x" a" J; b
  700. JSR Record_Last_Page_Index
    0 J, n$ K5 P$ ]( m# j3 h- D
  701. LDA #FC_ITEM_SUM. b  Q6 A2 G5 K% C# P3 w
  702. STA FC_Select_Index3 R( B0 \# D) C4 b& m
  703. LDA #FC_PAGE_MAX
    / W5 E2 l. t( R9 Q4 g$ `
  704. STA FC_Page_Cur! o% g% A1 T6 R% W3 V
  705. JSR Update_Page_Content
    ' B6 r- z* a6 V
  706. RTS
    6 d5 s) [8 L9 v/ X% m& ?: T
  707. ;----------------------------------------+ o1 V% h; S: D. B* s( D
  708. ;切换到上一个
    ; r% S5 D+ @, @1 B! i4 q
  709. Change_To_Previous_Item_Set:2 s2 c/ U; E! P$ c( j: ]3 M1 ?
  710. ;检查是否需要换页5 T3 A* [7 S/ Y# a- I$ B& n; Y- ]
  711. LDA FC_Select_Index7 E) Q% V* }( I9 X, ^/ P3 K
  712. CMP FC_Page_Cur
    * u- }5 g. I! w
  713. BNE Change_To_Previous_Item_Set_No_Page* k, e8 L. F$ Q, H  w" A1 }
  714. ;----------------------------------------
    ) R0 y  x' W) Y0 e' j3 d
  715. ;切换到上一个(需换页)
    # a% }/ Z' F3 ~$ i. G  m( b
  716. Change_To_Previous_Item_Set_Page:. \7 C. ^# |6 ^" {
  717. JSR Record_Last_Page_Index0 B  f5 ]* N. q! }
  718. LDA FC_Page_Cur
    ! G) K. R% f5 b7 f+ H: f% \# I: \
  719. SEC9 o, C7 ?9 \/ g0 {! X/ k
  720. SBC #FC_PAGE_SIZE
    ! G# n& v1 E$ ^  w
  721. STA FC_Page_Cur1 K9 p6 F, {3 \9 P
  722. DEC FC_Select_Index; h8 R9 W5 ?; B: W) G3 h5 u6 d
  723. JSR Update_Page_Content2 _! T. z/ l  A9 s8 v8 ], t! j" N
  724. RTS6 g7 o6 r& S  b4 W/ Z# Y4 z
  725. ;----------------------------------------
    ! V! m0 Q7 f( @9 z1 m
  726. ;切换到上一个(无换页)# w# I) W- r! Y8 `" p; L/ S
  727. Change_To_Previous_Item_Set_No_Page:
    * T4 A4 Q* P/ y& ]/ }0 q% C0 Z
  728. DEC FC_Select_Index
    ! A* z2 i: {0 t2 o# k& S
  729. RTS. T6 r& R5 Y% g  A1 [* A; u- r

  730. ' ?  s) F) r) e( f
  731. ;==================================================* g: n* \+ {( s0 Y7 z2 d$ r
  732. ;切换到下一个选项
    7 T) Q3 C* \' t' I9 b) n
  733. Change_To_Next_Item:. ]; k( H& _0 a, m1 i- N
  734. LDA FC_Select_Index
    , u0 D( V3 Q8 B; ]* s
  735. CMP #FC_ITEM_SUM2 a! |" W$ \3 O! t8 |$ L
  736. BNE Change_To_Next_Item_Set
    9 Q" R5 a5 l1 }
  737. ;----------------------------------------
    ( `; q5 `2 S! t6 g( c5 S  i9 K( Z$ _
  738. ;切换到起始页第一个
    % Q9 I+ m! x2 l! t" v4 Y9 `
  739. Change_To_Next_Item_Set_Begin_Page:/ J3 P9 B) N& s, q
  740. JSR Record_Last_Page_Index
      ~0 [: j% _/ U2 M+ v$ c. k
  741. LDA #$00
    7 g0 m" s' m) I) X, h
  742. STA FC_Select_Index
      p; x! l6 `7 h, z: Z
  743. STA FC_Page_Cur
    : m, Z- J: p8 T; W
  744. JSR Update_Page_Content2 c  x; F/ _. }: e. m
  745. RTS
    ' i7 p+ R: o9 T8 b% f
  746. ;----------------------------------------
    : v- o% Q, |6 n! T- s
  747. ;切换到下一个
    3 A4 c" Y3 T1 F/ r
  748. Change_To_Next_Item_Set:! H! ]# J' Y/ I
  749. INC FC_Select_Index
    * V: l3 e! ]7 x& U' N! Q
  750. LDA FC_Page_Cur2 y6 Y  S3 W) K- Z( a3 P
  751. CLC/ C+ L" ^% c; R/ w4 g8 ~3 B
  752. ADC #FC_PAGE_SIZE! [6 l8 P$ C5 b
  753. CMP FC_Select_Index3 t0 B7 R4 }' N. p: W
  754. BNE Change_To_Next_Item_Set_End7 u* J5 ]* k1 t. A% }8 a& F, t# k* t, X
  755. ;----------------------------------------
    $ N' z8 N  l/ r
  756. ;切换到下一个(需换页)! _) D; ^( V! [" H6 ~; U" T! f/ P) D  M7 Q2 x
  757. Change_To_Next_Item_Set_Page$ D7 g- w6 v, Q$ `% G& ^
  758. JSR Record_Last_Page_Index- b! V+ Z! O' e/ l  r0 r2 V
  759. LDA FC_Page_Cur3 O* f6 k( F) R$ \7 l6 [6 X9 T
  760. CLC2 N2 _. b! U8 ~7 @
  761. ADC #FC_PAGE_SIZE  L$ J- Z& X1 j! ?1 z" E
  762. STA FC_Page_Cur1 b6 m8 e" s' P( h1 U. s  b
  763. JSR Update_Page_Content
    $ B5 w: i+ f& ?$ C4 Q  @$ m
  764. Change_To_Next_Item_Set_End:
    % g+ g8 u+ n* t) D  H  J6 N
  765. RTS
    * u, k* D5 z5 v5 }( `" H  k3 _

  766. ) Q& B9 r. V# G3 z$ g+ j; j
  767. ;==================================================
    ( M+ o' q& I/ U: l5 t
  768. ;切换到上一页
    . _, z" o* S* v% I
  769. Change_To_Previous_Page:" ~/ Z; ?! \6 N3 ]4 u
  770. LDA FC_Page_Cur
    ; f2 n( B% j- D* Z# A/ [
  771. BEQ Change_To_Previous_Page_Set_Last_Page* L8 t/ C+ v* d+ a4 D
  772. JSR Record_Last_Page_Index. o9 e( E. O8 v2 X
  773. LDA FC_Page_Cur
    - N8 M% N/ D7 R9 {+ |+ |3 y
  774. SEC
    5 I. L9 f* a7 x1 u1 r2 k. k
  775. SBC #FC_PAGE_SIZE
    / S) y, H5 A) F% |5 q. i
  776. STA FC_Page_Cur3 [: q$ P0 ]2 U7 u
  777. LDA FC_Select_Index
    4 P3 ]& @. t) R. _: Z
  778. SEC
    ! G8 e6 u) C  G" O- u/ _! N1 r
  779. SBC #FC_PAGE_SIZE# D. ~0 Y' ^9 v0 e& c2 z# v' i
  780. STA FC_Select_Index
    : I+ h8 m( a( i" O
  781. JSR Update_Page_Content6 K# [: `. g; m" J* j- W
  782. Change_Select_Last_Page_End:% p6 ~8 V7 I. A  o7 ^9 J
  783. RTS
    9 J: ~$ }. z6 I+ M* A  o% Q8 d
  784. ;----------------------------------------
    ( X0 h( T  p3 w! A3 P9 ~) M+ D
  785. ;切换到最后一页
    ( D0 d4 C2 }2 Y2 [1 p' T0 j
  786. Change_To_Previous_Page_Set_Last_Page:0 D; `, G$ N6 R+ o1 E% H( }
  787. LDA #FC_PAGE_MAX; v1 Q% j8 f5 J0 H" @
  788. BEQ Change_To_Previous_Page_Set_Begin_Item5 y, `$ B; d7 V( |7 j7 i8 {
  789. JSR Record_Last_Page_Index8 Y$ i# g; N7 R9 Q  C
  790. LDA FC_Select_Index% d2 p3 j/ H6 u  Z7 z: u
  791. SEC
    $ n3 L0 T5 ?0 k4 w7 ?- w7 _
  792. SBC FC_Page_Cur& ^7 T2 R" l' M" V% B8 Z' C- o" e
  793. CLC
    # J( c' n" o* Q' z% G9 x
  794. ADC #FC_PAGE_MAX3 `! m# s' G+ [% T- h# \
  795. STA FC_Select_Index
    : l$ z: ?: ?8 f7 ?5 `
  796. LDA #FC_PAGE_MAX% ^2 E. C; _: L7 E6 i
  797. STA FC_Page_Cur/ ]: \: a! U3 w# e" _) A. R2 @
  798. LDA FC_Select_Index
    + y# ~9 K, d" {$ m
  799. CMP #FC_ITEM_SUM4 T+ D5 S& f. ~# C' n& x
  800. BCC Change_To_Previous_Page_Set_Last_Page_End' b, C+ s) d5 a! U- x
  801. ;----------------------------------------8 V4 |* I$ ~, t+ X& b
  802. ;切换到最后一项" A) _: H+ D/ ?0 ]
  803. Change_To_Previous_Page_Set_Last_Item
    ; Z! P3 }8 F0 F' z5 s; ^5 [
  804. LDA #FC_ITEM_SUM% ^' e+ l2 i& t9 r) m+ _$ t+ c
  805. STA FC_Select_Index
    " ^* [" {6 M+ C' t) K' D" y8 P
  806. Change_To_Previous_Page_Set_Last_Page_End:
    + `* w# g" N1 B; t; u3 {9 N
  807. JSR Update_Page_Content
    ) B& r6 R8 ]' w: }
  808. RTS
    % h# A8 P* T+ ^( o$ X% ~
  809. ;----------------------------------------
      Y# ~: P8 u& r- b; |8 N
  810. ;切换到起始项(最大页只有一页时)6 G: V) t/ q* V! z4 N9 V
  811. Change_To_Previous_Page_Set_Begin_Item:  C" Q$ z% o) ]  c( b. I
  812. LDA #$00$ ~& j4 Q+ f. j7 C# b% r5 Y; h( ]6 L
  813. STA FC_Select_Index1 ~, v' J# g5 w! M) E2 G
  814. RTS
    * \3 T' `& V7 U
  815.   e8 [$ y0 s4 S* h$ a& r8 E
  816. ;==================================================1 v# W# z2 K$ |( ^
  817. ;切换到下一页
    ! e# g% r5 Z+ _) U
  818. Change_To_Next_Page:/ Y  ^9 u  K+ q- p
  819. LDA #FC_PAGE_MAX
    - U! i. g+ i/ r% C. @  C# V. P3 |
  820. BEQ Change_To_Next_Page_Set_Last_Item
    6 g% g: ~' j7 P. G: E& P
  821. LDA FC_Page_Cur7 v  P; Y/ J/ C, ^& d
  822. CMP #FC_PAGE_MAX! }2 `7 z% @9 O; \, N+ I+ F
  823. BEQ Change_To_Next_Page_Set_Begin_Page
    8 W6 o4 ^4 O- o7 T+ |
  824. ;----------------------------------------
    / u' d. I2 }. B7 {
  825. ;切换到下一页
    1 B+ ~" t+ Q5 _& p5 h
  826. Change_To_Next_Page_Set:
    $ x5 V$ g' V$ h" V; n6 L
  827. JSR Record_Last_Page_Index* m8 {5 T2 p  q, l4 Z
  828. LDA FC_Page_Cur
    6 e; v) m8 g- @0 M" ]3 Y
  829. CLC
    $ Y( D, c% N7 v9 m! s/ l
  830. ADC #FC_PAGE_SIZE  c9 |6 l6 \* _: ~# l8 r
  831. STA FC_Page_Cur, k( ]1 e8 V" B
  832. LDA FC_Select_Index/ z! H3 M1 a% e* a, \. O
  833. CLC, i0 V2 k& ?, L! [; l6 p6 b# s1 i
  834. ADC #FC_PAGE_SIZE
    * ?0 }0 c( U; v7 f
  835. STA FC_Select_Index' l' \. e0 w& h1 ?5 d5 a4 A' I
  836. LDA FC_Select_Index' |( h: S) H# |- I% v' ?* R6 l
  837. CMP #FC_ITEM_SUM" P" D: p1 I' Y6 k9 E% ~
  838. BCC Change_To_Next_Page_Set_End$ I( L* g# p8 p! n
  839. ;----------------------------------------
    1 O) c$ z3 R4 a& {) J& l9 ?
  840. ;切换到最后一项
    2 y( B) @: I, @+ _# f
  841. LDA #FC_ITEM_SUM
    ' @& G5 G$ @# k+ V; ?+ g8 R5 E
  842. STA FC_Select_Index. g& E$ I8 Y7 j& L( C
  843. Change_To_Next_Page_Set_End:6 C6 V" H4 S& ?3 I: q  P3 ~
  844. JSR Update_Page_Content" F0 }- V) u$ p4 H( h
  845. RTS# Z7 R; T7 \2 O  ^/ g9 E2 n/ Q
  846. ;----------------------------------------
    ) v8 r& C  W9 L2 |1 D5 c
  847. ;切换到起始页
    ) R$ U  j6 r1 p2 G
  848. Change_To_Next_Page_Set_Begin_Page:0 X* u0 \* M# C0 s& T- ^" F6 k
  849. JSR Record_Last_Page_Index
    & U8 c3 G  q% J/ R# H4 G5 j! E1 p
  850. LDA FC_Select_Index
    & [4 y& V0 z- U
  851. SEC0 V7 D$ v8 R- v& t7 S- o' c
  852. SBC FC_Page_Cur- [7 [6 Z2 K* ]1 u% n: R
  853. STA FC_Select_Index* `& k9 v# s' y% r8 b' t. a' {" c
  854. LDA #$004 z# D, x5 Q' o
  855. STA FC_Page_Cur7 _3 R+ m' V- L
  856. JSR Update_Page_Content  n/ b2 O8 o; y; f$ S
  857. RTS
    - V! g; U/ \( J" R0 Q+ Y: i
  858. ;----------------------------------------2 x" f! B" M* `
  859. ;切换到最后一项(最大页只有一页时)0 T% t2 Z; A7 D, v0 a
  860. Change_To_Next_Page_Set_Last_Item:: x/ S! M) {4 x2 f2 \1 |
  861. LDA #FC_ITEM_SUM. H% X* c5 @. H! j- F5 G7 \
  862. STA FC_Select_Index
    8 ^$ c! b7 @" i" ~9 {
  863. JSR Update_Page_Content* i" O7 R# K5 T6 A/ [. {' t
  864. RTS' b. P" ?  N1 W" `+ S* d+ r3 K  R
  865. 3 s: m% q, z4 n
  866. ;==================================================& h7 U  p2 Y% R1 j+ X1 J
  867. ;更新页面内容3 ?- G- g4 G6 O5 T. V5 X; _3 {
  868. Update_Page_Content:. I) L) q4 {1 z! b
  869. LDA FC_Page_Cur
    ' r1 o8 [0 L5 o$ ?
  870. CMP FC_Page_Old* e- _" N0 D) U5 B# `, u% }# r1 n
  871. BEQ Change_Update_Page_End
    4 W6 z" S3 W# I, n) X  k& p0 g7 ~
  872. JSR PPU_Data_Page_Show
    0 y# g2 T0 d  `; X* Y7 }7 o- A+ |
  873. Change_Update_Page_End:
    % C+ m6 B( p7 Y, D
  874. RTS3 t- O" x( B4 Y3 W+ _/ Y

  875. 0 F$ J7 a0 T7 `* H$ {7 v
  876. ;==================================================, o; |: w8 N. _+ h! U* O
  877. ;记录上次页索引: i9 `6 `9 v. ^# d; Q, ]
  878. Record_Last_Page_Index
    4 c" @' S+ w! k" v8 q
  879. LDA FC_Page_Cur) K9 G* Y1 y. G5 U; A3 }" Q
  880. STA FC_Page_Old. f9 o: @4 ?$ J
  881. RTS3 A0 u; _# g% p* U5 X

  882. ! D. S% m0 Y' B5 B8 g9 t
  883. ;==================================================
    ; \# y' `" `2 k! E; q6 J
  884. ;显示当前选择项光标
    5 ]+ F7 @% E% u; s" ^3 I
  885. Show_Select_Cursor:$ Q# C! V) A2 Y$ R+ Q  S) s
  886. LDA FC_Select_Index
    5 n0 L8 k2 O; i1 R* ~
  887. SEC
    " H0 t6 T6 b: `- h* F& ?
  888. SBC FC_Page_Cur
    - G! Q" c# P4 Y- N+ K# z
  889. ASL
    8 W5 O% F  r3 I
  890. TAY. q3 ]5 ]$ h6 W0 {/ j: d1 M( v- g' h4 M2 b
  891. INY' R  |) l- l: a* B
  892. LDA Text_PPU_Addr,Y
    # |* x( E' Z  }- G9 {# \' X3 T
  893. AND #$03; `0 k+ E- K: B( a! J/ j. K& l$ \
  894. STA FC_Cursor_Addr_H
    , @7 V: Z: ~4 x$ l3 \0 H" j9 \/ i
  895. INX
    " C) T% d4 U# l
  896. DEY7 I* A5 Z: H2 O2 J
  897. LDA Text_PPU_Addr,Y) ^: s+ {- W3 Q- P1 p8 [2 D
  898. STA FC_Cursor_Addr_L
    6 @# C1 L8 D0 v# L. _+ l- J0 g
  899. ;----------------------------------------
    & I6 C; G+ n/ b/ `/ @$ G
  900. ;计算光标X坐标( B. A! A; ^5 a" m8 d7 }% L
  901. Show_Select_Cursor_Set_X:
    7 k3 B0 B8 _3 e: s' t
  902. LDA FC_Cursor_Addr_L
      B! x! ]; d5 \' F
  903. AND #$1F
    : Q7 d. T$ H; B9 Q' K" ^) Y
  904. ASL; i! j  U. ]+ |% l4 e" M
  905. ASL
    4 M+ J3 P3 m& g1 [
  906. ASL
    ) |, q, m1 w, L# C4 B, ]
  907. STA FC_Cursor_X4 N/ d1 A+ D, F* k" O
  908. LDA FC_Cursor_Addr_L
      }8 L" I6 l  a: T. w, Y
  909. AND #$E0- C4 v# U: M! Q5 D$ V! [* ~# B4 l9 _0 r
  910. STA FC_Cursor_Addr_L6 ]+ o2 }& t* U- `6 H
  911. ;----------------------------------------
    % ^# u9 Q) E3 ~
  912. ;计算光标Y坐标
    ( Y4 W: I/ T1 L3 j" o5 U! o% T' ^- Z
  913. Show_Select_Cursor_Set_Y:. l" d8 t6 V8 o" ?/ o
  914. LDX #$05
    6 T) w$ e6 h% p
  915. ROR FC_Cursor_Addr_H" ?5 ~5 I2 P: a; n- _
  916. ROR FC_Cursor_Addr_L# h1 V) X. Q+ {; e
  917. ROR FC_Cursor_Addr_H4 D0 D0 @+ C4 N* I6 R! k
  918. ROR FC_Cursor_Addr_L
    7 a  j; L1 d: F7 R1 e# e. Z7 M( S* n
  919. LDA FC_Cursor_Addr_L% V$ \: j- e" S1 q0 ^
  920. STA FC_Cursor_Y
      ~* H) E4 a6 N) o8 y
  921. ;----------------------------------------
    : y7 A$ y$ u: D; s2 i# o
  922. ;写入光标( K7 g2 X  e* P* U. ^; ~
  923. Show_Select_Cursor_Set:
    7 j6 R8 J1 J& l
  924. LDA #$00
    / f' Z7 x3 `* K  _
  925. STA $2003% ?. {7 p4 S& C+ E  o
  926. LDA FC_Cursor_Y
    1 E& y# {' t* V4 Q; D
  927. SEC9 M  K$ `1 ^" {% B' m
  928. SBC #FC_CURSOR_OFFSET_Y
    ( H8 l5 G7 G3 w1 _" B
  929. STA $2004
    - g& \* j! o' k8 b* D% f) W! P3 I( @
  930. LDA #FC_CURSOR_TILE
    5 I# g. |" n5 j! b# J: h$ K
  931. STA $2004/ S, f3 z+ Q  b( I2 D, P
  932. LDA #$00% {/ Z2 r! d+ S; S4 C
  933. STA $2004
    $ a% `3 F+ v' u3 B9 f* O
  934. LDA FC_Cursor_X! }7 Q6 s4 _6 A, ?$ [# _- Q
  935. SEC; y/ W( d! Z6 W+ A
  936. SBC #FC_CURSOR_OFFSET_X# y% X5 l% \1 M1 y; p! M' v
  937. STA $2004
    2 y) P3 o* \+ V9 V
  938. RTS
    8 ?' [5 }* ]6 f  P, G

  939. 2 G8 g6 i$ `! W2 Z
  940. ;==================================================
    % z( U' a# l9 }+ J6 A
  941. ;切换功能+ H( N) i1 P" c% G- w8 {6 H
  942. Change_Function:
    5 J% ?3 `5 A- B+ G5 \2 U+ o, i! G
  943. ;----------------------------------------5 ~! k/ ]  _' D) I, a
  944. ;开启功能A! O  C# P2 H, v7 Z0 }
  945. Change_Function_On_A:
    - z2 M7 f  b: j( p/ {
  946. LDA Button_Once# X" _; Z  J* k& B
  947. CMP #$40  j  [; l* O. c- s5 L2 B
  948. BNE Change_Function_On_B
    ( I# a" b; `. X1 b
  949. JSR Change_Function_To_On_A" q1 z: W% f, n6 l8 Z$ c* y. S
  950. JSR Function_Status_Update
    6 P( c! @: \. l4 `3 ^
  951. ;----------------------------------------
    & ?& P2 ?/ ?7 J1 R9 D! ?
  952. ;关闭功能B
    ) n' z7 u$ l) e4 l* E6 W
  953. Change_Function_On_B:& @! B* N8 W8 G) `: r# C
  954. .IF FC_IS_DOUBLE_PLAYERS$ c$ w* ]% N- r4 Z% n5 m- d
  955. LDA Button_Once + 1
    $ C9 V" r  E, H# P+ h
  956. CMP #$40
    % Z) ~: q: G4 G# A7 H
  957. BNE Change_Function_Off_A2 }& o/ d8 n+ f: t
  958. JSR Change_Function_To_On_B" u, I. h. K$ c) t
  959. JSR Function_Status_Update
    % b* c; T# l+ g( ~6 K; q
  960. .ENDIF5 |; w+ i& x3 f# }! q# {& {
  961. ;----------------------------------------7 v8 f- _- ?* s# g2 A% M6 T* p' ~
  962. ;关闭功能A; U0 Q3 ^/ L1 @9 E6 e; k8 H
  963. Change_Function_Off_A:4 T: ^4 C, I3 }, n/ n' X
  964. LDA Button_Once7 T  B5 m& R6 O) i
  965. CMP #$809 U: @' R% c, e$ |
  966. BNE Change_Function_Off_B
    1 |2 m; H+ N# j* v3 d# s+ T: r
  967. JSR Change_Function_To_Off_A
    + X( i9 Q& l% k$ d
  968. JSR Function_Status_Update# d2 F, c; X7 d2 _5 ^3 C: q5 B$ `
  969. ;----------------------------------------
    ; W% S  g) }: ^! K( |0 v- o
  970. ;关闭功能B
    * D, A! L9 L$ J* T$ }
  971. Change_Function_Off_B:3 x. S/ L# g& b$ I. m, P
  972. .IF FC_IS_DOUBLE_PLAYERS( y2 v8 L, J, p3 r- g) ^4 h; `$ _
  973. LDA Button_Once + 1
    . s7 v) q' P; q6 u8 x
  974. CMP #$804 }6 @, V  p& ?. [. A* y  q
  975. BNE Change_Function_Swap
      V8 @& u$ \* Q( K0 j1 S
  976. JSR Change_Function_To_Off_B1 `6 m: z) K: H
  977. JSR Function_Status_Update
    / K, F" n% e! R0 X! d9 r4 [! G% d
  978. .ENDIF
    4 l: B. z* Y) ]4 H/ Q( E
  979. ;==================================================
    - \: z, }& k: x6 {9 |
  980. ;交换开关
    7 e1 o  a* G5 o9 T$ U; o. y
  981. Change_Function_Swap:5 ~2 E/ g5 [$ N% I8 T0 V
  982. .IF FC_IS_DOUBLE_PLAYERS* d0 g2 t5 L3 b7 K4 }
  983. LDA Button_Once6 q5 h3 {- s+ {) @$ K) o2 V6 Q
  984. ORA Button_Once + 10 G; U8 t/ x9 H5 q+ W) J, d+ t
  985. CMP #$20$ V# u2 [8 ?5 p* H% A
  986. BNE Change_Function_End
    5 Y" J! B5 i+ J
  987. JSR Change_Function_To_Swap
    ) H- `/ o* w4 e- v
  988. JSR Function_Status_Update
    ) c; ^& n- e6 S: G; \
  989. .ENDIF. \; X+ f$ u2 z, ]& q5 |1 e, u( g5 f
  990. Change_Function_End:% O* m( o+ `- Q7 X! R
  991. RTS
      J: ]0 J" _% ], y  A

  992. - O8 t1 N) U# S4 {& I
  993. ;==================================================
    ! L/ d7 j& k, u+ l
  994. ;交换开关状态
    % [4 {" F  G* U  i: z
  995. Change_Function_To_Swap:$ J2 }* s! }% n  L" H. B, y
  996. .IF FC_IS_DOUBLE_PLAYERS
    + u+ M7 t+ }% J
  997. LDA FC_Select_Index# o) _8 a# G( H
  998. SEC
    1 u) t0 ?8 e, Y: Y6 u5 K- O, n
  999. SBC FC_Page_Cur
    + B/ m2 K8 q4 ^5 c; H
  1000. STA FC_Select_Temp
    ) q: Q$ L" y. Q/ z" B, A$ E
  1001. JSR Set_Function_Port; J* ?: U4 E" b  D: N/ m6 m# n3 v4 k
  1002. LDY #$00' y% r0 q9 @& x9 P
  1003. LDX FC_Select_Index
    2 M5 u2 q' d+ [/ z
  1004. LDA (FC_Data_Port_A_L),Y
    0 y5 p) Y- F6 z$ `
  1005. EOR (FC_Data_Port_B_L),Y
    4 U! F0 E" w$ ~( V
  1006. AND Function_Check,X* B% N3 Y% P% r1 @: z
  1007. BEQ Change_Function_To_Swap_End9 N0 M& i7 ^1 {
  1008. LDA (FC_Data_Port_A_L),Y& j; r  C2 F( W0 j
  1009. EOR Function_Check,X
    6 N* _' a2 _! B4 X2 ]
  1010. STA (FC_Data_Port_A_L),Y
    ' G  V5 u% G6 }! z, ~
  1011. LDA (FC_Data_Port_B_L),Y
    : C$ m  W, I4 z/ h
  1012. EOR Function_Check,X
    6 _" @. c- A9 Y8 \2 x4 Z1 D2 j
  1013. STA (FC_Data_Port_B_L),Y) m1 q5 O. ]# |4 i
  1014. Change_Function_To_Swap_End:  C: t8 Z2 N3 g4 u% M3 J; S
  1015. RTS. n! A% l; Y: r3 e+ |5 K
  1016. .ENDIF
    ' n" G# u% x! t5 \4 b
  1017. 3 E, r9 o# {" I% t  W1 `, F' h) U
  1018. ' S; s' O8 [/ Z- w; D
  1019. ;==================================================
    & k+ S6 H$ d  c
  1020. ;更新功能状态
    9 C1 R6 ?" Z" W* a: ^$ E6 W% u
  1021. Function_Status_Update:  C7 K# P+ m1 X& ~' Y. ?) c" Y
  1022. LDA FC_Select_Index
    + z8 X2 h: N  U0 C0 D- K0 [1 _
  1023. SEC# S- }# O. Q+ _" }# T
  1024. SBC FC_Page_Cur. j( Y+ A/ K* t3 w6 `
  1025. STA FC_Select_Temp/ x& o% j/ Y* A% p/ T& q
  1026. JSR Function_Status_Show4 x9 u9 m, O$ ]! S0 g& h
  1027. RTS) M* ]6 S0 _' a& }4 |, ^( u1 t' e. B) P

  1028. 9 ^1 I! J. \# W
  1029. ;==================================================! j( c0 m. P7 _
  1030. ;设置功能地址端口
    2 K: s7 a7 d( i$ C
  1031. Set_Function_Port:
    7 ?) F0 q- n% N8 g, a# }+ C  t8 ?
  1032. LDA FC_Select_Temp
    . W4 t) P( F6 V4 g: h( v" O
  1033. CLC5 G+ Q  q( a' Q* a, v
  1034. ADC FC_Page_Cur, g4 p. u. W3 U
  1035. ASL
    : e& y; ^( a" a6 d6 x  {
  1036. TAY2 f$ Z- v; @! i/ n& l
  1037. INY
    3 ~- H% s8 m5 l$ l
  1038. LDA Function_Addr_A,Y! X; i1 a3 u* R- t
  1039. STA FC_Data_Port_A_H
    0 z0 `$ K/ v' H& C6 H/ T( \
  1040. .IF FC_IS_DOUBLE_PLAYERS0 C: b+ `4 A( h; f; J: H9 g
  1041. LDA Function_Addr_B,Y
    1 w, c( ~4 P: f& t2 \2 G$ d
  1042. STA FC_Data_Port_B_H3 d: }/ d$ [9 _, F. c/ g% B+ x  Y
  1043. .ENDIF7 H3 q8 x! X: X( X  W
  1044. DEY
    & D) a4 |- i" t5 J8 K( @$ t2 G7 {
  1045. LDA Function_Addr_A,Y
    2 V( l3 h8 V- m" S9 G& K+ J
  1046. STA FC_Data_Port_A_L/ t. H% P0 K* F" B/ C1 @( T" B9 F2 ^
  1047. .IF FC_IS_DOUBLE_PLAYERS* l' S; n: V  J: j4 J
  1048. LDA Function_Addr_B,Y
    $ E5 u6 s3 n0 |5 M4 P
  1049. STA FC_Data_Port_B_L
    ( R! ^. V6 p/ p" F
  1050. .ENDIF
    8 m2 q. F" R. ?# P
  1051. RTS
    % V' f! ?- [- F( o3 x: n+ B
  1052. - j7 K" K& G1 N4 s5 i, X
  1053. ;==================================================) y  A3 ^/ L+ ?9 }
  1054. ;设置功能临时索引+ _# V% P1 h; C7 @
  1055. Set_Function_Temp_Index:
    2 }9 b1 e: h  P! \) L& p
  1056. LDA FC_Select_Index
    - p% D1 l1 ^  G
  1057. SEC
    & o: `" Q3 U8 A  E
  1058. SBC FC_Page_Cur
    * w% F( Y" _. i+ k/ y/ [2 K) H7 m  k
  1059. STA FC_Select_Temp
    6 d2 D% u* B8 K/ |  E- U- b
  1060. RTS5 c# W" Q' G- [

  1061. , Q) m+ m+ U* |6 H/ |; W
  1062. ;==================================================
    ) ?+ R- j  p, r% N
  1063. ;开启功能A: I" z3 \" T( p1 h, a6 f
  1064. Change_Function_To_On_A:) {. t3 e8 V& E7 R
  1065. JSR Set_Function_Temp_Index
    , g' h( @6 d, W  T) D, V% T
  1066. JSR Set_Function_Port
    - A- ]. p2 Q- l9 F0 j$ s
  1067. LDX FC_Select_Index% j3 X- F! M' a/ E* i/ y5 w2 ~& N
  1068. LDY #$00
    ' L4 ^  I( |! Y' O2 N- ]8 v' m
  1069. LDA (FC_Data_Port_A_L),Y
    - L% {) @$ ^, d2 M9 A( W" E
  1070. ORA Function_Check,X
    3 q0 r+ C1 P+ @) ^1 @
  1071. STA (FC_Data_Port_A_L),Y% g8 ^- o' J9 `# A* l, j
  1072. RTS; U' T' K1 ~! |/ T
  1073. ;----------------------------------------" J0 q" I. U7 o5 j% P' P8 W
  1074. ;开启功能B7 D9 T9 C) ^' t* g. d
  1075. .IF FC_IS_DOUBLE_PLAYERS7 v) \$ h7 l" g- C: ~$ q
  1076. Change_Function_To_On_B:
    * h* l, r' O3 ^( S
  1077. JSR Set_Function_Temp_Index' ^6 ^' ^$ F9 U: A6 ^0 g: p
  1078. JSR Set_Function_Port
    ! ~+ o) D" H6 G& n& t, R
  1079. LDX FC_Select_Index/ y' `. U2 u; h. S: H1 L% C% j  ]
  1080. LDY #$00
    % \9 C! v! b- N( {8 N
  1081. LDA (FC_Data_Port_B_L),Y! ?# F; l- [5 |1 H2 i0 ]
  1082. ORA Function_Check,X4 L* C2 w% n/ S- d! l9 `
  1083. STA (FC_Data_Port_B_L),Y6 S7 a4 E4 k' m
  1084. RTS
    7 b- L2 R7 C/ ~' C
  1085. .ENDIF
    ' h6 M  J- G- k% g( I& [6 p
  1086. ;----------------------------------------
    + k( ?/ e6 W% n. B& c# F' `
  1087. ;关闭功能A
    ) Q1 T+ h0 e4 X, J9 u) W& d
  1088. Change_Function_To_Off_A:
    ' Y8 l+ _. R! P0 E8 i' z$ h
  1089. JSR Set_Function_Temp_Index- Y/ _+ F# m* ?6 g4 {0 i
  1090. JSR Set_Function_Port: H* K  W& ^& K$ r' Q
  1091. LDX FC_Select_Index- Y3 F$ t7 {5 s( G3 q1 f8 B4 i+ C! t( k
  1092. LDY #$00
    3 D8 N9 S: m/ z. G4 v$ @5 z
  1093. LDA Function_Check,X
    3 T- M/ ~; }; A0 z
  1094. EOR #$FF% a& c9 F# H9 B) D2 c8 T
  1095. AND (FC_Data_Port_A_L),Y
    ! k9 ], q9 S! A7 p* j" _4 {3 ~
  1096. STA (FC_Data_Port_A_L),Y, D* H  e1 w- r% ]
  1097. RTS& {0 h' a% v! i4 p; o
  1098. ;----------------------------------------
    ) J' s7 M/ u! k
  1099. ;关闭功能B
    ! Y6 f  S* e9 b$ i
  1100. .IF FC_IS_DOUBLE_PLAYERS
    8 p2 \6 q  j; o( ?; p, _' Z8 `' B
  1101. Change_Function_To_Off_B:7 \$ P. x2 L* |; ?  T
  1102. JSR Set_Function_Temp_Index8 w1 _; D+ H# N2 c1 u9 ?
  1103. JSR Set_Function_Port
    1 I) H. n' z5 M* V/ E4 ]6 Z
  1104. LDX FC_Select_Index
    * h  d* c' G# J, l5 V9 [  s6 H
  1105. LDY #$00& d+ b4 k+ t, ]4 I  V: d
  1106. LDA Function_Check,X
    % ?- ?! h' h9 N0 e7 F$ b
  1107. EOR #$FF  @" n8 T2 L! s4 h5 j6 h
  1108. AND (FC_Data_Port_B_L),Y8 Y% s1 T: E/ M- q, a& L' {
  1109. STA (FC_Data_Port_B_L),Y
    / x6 a) f" a/ ?' F/ Y- F7 ]* k
  1110. RTS
    9 L" }4 y; P( m0 g# {
  1111. .ENDIF2 @, b4 I) h7 i( P5 h/ o' h/ G
  1112. 0 r8 c- Y1 s+ A1 A8 W( t
  1113. ;==================================================1 I! y! {; l. f) m% k; x
  1114. ;设置功能状态PPU地址7 f& p! `( t; ~) Q4 f8 n
  1115. Set_Function_Status_Addr:) Y0 v# Q8 O- u8 i0 E4 t
  1116. LDX FC_PPU_Cursor, M- K' _; {" s& a$ V7 I! {
  1117. LDA FC_Select_Temp
    ; l5 N: n: J/ X: `% L( g5 ~. Q& P; y5 t
  1118. ASL
    6 W: e8 G$ X8 A
  1119. TAY
    / O8 C1 T/ K' `. t
  1120. INY
    ! i5 G/ O; N" O! E0 T  B* }
  1121. LDA Text_PPU_Addr,Y
    : F  ?- L" F5 V- g
  1122. STA FC_PPU_Buffer,X- ^( ^: W+ B1 c
  1123. INX( B, q* \& q" x
  1124. DEY
    4 d% g' f/ L2 l" j% x( ^+ z
  1125. LDA Text_PPU_Addr,Y$ }5 P6 L" P7 ~+ s* n' \; B* k) m
  1126. CLC/ Z8 i# V) ^/ l1 Y2 A
  1127. ADC #FC_FUNCTION_OFFSET+ D9 V/ X4 A! [( a
  1128. STA FC_PPU_Buffer,X
    1 v8 N$ B/ o. q. Z$ h
  1129. INX" Y" p1 x: }4 F/ c8 o7 I
  1130. .IF FC_IS_DOUBLE_PLAYERS
    2 z+ Z/ Q: h/ p5 A1 g% L/ A
  1131. LDA #$02& J7 g% e) `# o3 C
  1132. .ELSE  M  }( W. x% s2 ?+ S$ j# t
  1133. LDA #$01
    5 {. Q7 w' M+ d* y/ d$ l/ r
  1134. .ENDIF
    4 ?  S, T5 ~1 c: V& i
  1135. STA FC_PPU_Buffer,X' m3 o* S7 B3 u+ U! v2 [
  1136. INX# _& s% D3 X, K) \% [' P6 g
  1137. STX FC_PPU_Cursor, \& J7 K+ @$ m+ b
  1138. RTS4 C7 `. I0 e' s! G6 ]
  1139. # _. k/ K2 `1 i: G0 L
  1140. ;==================================================
    , ]0 M; D! c' l5 B! C: k: X) J$ P* [4 u) g7 G
  1141. ;获取当前选择索引- h1 J1 j: B4 y: @1 ^+ a
  1142. Get_Select_Index:1 w& N. U4 S( ]! X0 n5 T- p
  1143. LDA FC_Select_Temp
    % \) m. a( c  ?2 V
  1144. CLC- J: _7 t: Z. B( T% ~
  1145. ADC FC_Page_Cur
    ; o+ q7 V9 O5 g; q0 n
  1146. TAX
    : X4 t' b9 q) q% {' u! Q
  1147. RTS2 a  [1 B& k9 N+ k  W& n
  1148. $ ~+ T8 ?& v# }1 `" C( Z5 Q
  1149. ;==================================================: P- T# m- D( F5 P3 g5 s( q
  1150. ;清除状态文本* D7 ~8 S' _# D. q+ u0 j
  1151. Function_Status_Clean:
    4 e( ], G1 L$ I2 d
  1152. LDA #FC_PPU_MODE_CNTC) g1 J0 @' `0 ^, A; \
  1153. JSR Set_PPU_Mode
    , v# O0 s+ O" m4 [$ {
  1154. JSR Set_Function_Status_Addr8 e; Z$ f" d8 E$ Q3 D# ^
  1155. RTS
    8 v* Q; Z5 @* y+ R5 x! H- E/ E' o! c
  1156. 2 E  b( k8 N" P& O$ Y
  1157. ;==================================================
    ; H0 l' f% ~" E1 s( d3 ?
  1158. ;显示开关状态# t- `( n: }0 a
  1159. Function_Status_Show:
    2 q# `! b9 b/ P/ m, _1 i/ y
  1160. JSR Get_Select_Index6 J/ N- I- ]& u) }# X/ e
  1161. CPX #FC_ITEM_SUM5 [, ]' d+ }( k. O/ d" w
  1162. BEQ Function_Status_Show_Set# v1 @" u$ e& U6 G
  1163. BCS Function_Status_Show_End
    # U# d6 d  n) J7 L% ?! b7 i3 R" u" ^( v
  1164. Function_Status_Show_Set:
    : I3 I' r7 N( [
  1165. LDA #FC_PPU_MODE_CNTL) \* F9 }0 k- z1 Q; Q$ v1 O3 `* e
  1166. JSR Set_PPU_Mode) P0 c/ w5 x/ o/ W
  1167. JSR Get_Select_Index
    ! C& G2 O$ e4 u
  1168. JSR Set_Function_Status_Addr
    / z2 I9 U. F1 {7 _& J& l
  1169. JSR Set_Function_Port
    2 n- B# w5 N% H/ I6 n" ?& w1 H
  1170. JSR Function_Status_Show_Check_A
    ) K# N, o7 d* ?; j0 _7 b
  1171. .IF FC_IS_DOUBLE_PLAYERS1 a* n& e0 ]# t' _9 @
  1172. JSR Function_Status_Show_Check_B. F- k* g1 X) F7 g  ], \- R3 V
  1173. .ENDIF0 `( u- M- \; g  N+ g) I; u  C- P
  1174. Function_Status_Show_End:& [- S# h9 ~$ u4 d; j& E
  1175. RTS
    6 g* ~* Z. }% C  P: \
  1176. ;----------------------------------------
    ) D" p# Q/ G% R8 K1 K% u
  1177. ;检查功能A状态9 j$ d" K8 H+ I' S) l7 ?. k4 W; ?
  1178. Function_Status_Show_Check_A:: ^3 T  w, r6 T0 a# t& k8 k
  1179. JSR Get_Select_Index2 O/ \8 S3 F# |8 V, Q
  1180. LDY #$00
    % P. |; @" i$ }# o. o& E; C* }
  1181. LDA (FC_Data_Port_A_L),Y
    : Q* y  `1 j* V3 p
  1182. AND Function_Check,X
    ' F- n7 x( L( O* i  |* O
  1183. BEQ Show_Function_Status_Off
      j+ S; d0 v" F; W6 A
  1184. JSR Show_Function_Status_On: [$ ^$ J4 O% c* z
  1185. RTS
    ; f2 a/ ^) q& P& C: Y* |% B! r4 |/ F
  1186. ;----------------------------------------
    # L5 y# A  ^  C
  1187. ;检查功能B状态. t5 u( w- l  `/ m: h1 F) B
  1188. .IF FC_IS_DOUBLE_PLAYERS
    0 k: m  I: [1 x
  1189. Function_Status_Show_Check_B:
    " \: s3 [+ ]( D8 Z8 C7 O# O
  1190. JSR Get_Select_Index
    / I8 L4 @& F- ~+ H4 h9 h  A  c
  1191. LDY #$00" V8 f- U7 d0 s( @. p
  1192. LDA (FC_Data_Port_B_L),Y$ C: }8 {5 t. _$ ~- {
  1193. AND Function_Check,X
    4 D7 j$ S% h0 I
  1194. BEQ Show_Function_Status_Off
    - `8 L0 P! P/ B9 X% _9 ~: B/ \1 }
  1195. JSR Show_Function_Status_On; \* T' s8 A8 ]0 N* a& e3 \
  1196. RTS. {9 W7 M" ^1 T
  1197. .ENDIF
    5 E& u3 A/ ~0 e5 ?5 e. X- C

  1198. 4 d' c& |  @' T/ y
  1199. ;----------------------------------------& ^8 R$ r, O8 v2 n
  1200. ;显示功能开启状态  V* _$ `5 k2 d: I
  1201. Show_Function_Status_On:
    % D+ m6 s" L4 Q  |6 `3 u
  1202. LDX FC_PPU_Cursor
    - o0 H! y: l2 l9 s
  1203. LDA #FC_ON_TILE
    4 z: M# T6 N! x1 i# w/ |
  1204. STA FC_PPU_Buffer,X7 V7 ?# V. t- P) l. l
  1205. INX3 d' O7 o" B6 {% i" r) ?
  1206. STX FC_PPU_Cursor
    7 f/ D/ _. `$ Q$ O; n" _+ t5 j
  1207. RTS9 |! w4 k' O1 J6 l0 o9 E
  1208. ;----------------------------------------
    & t6 e4 E9 l; K  c9 E; l; v' V
  1209. ;显示功能关闭状态
    4 {4 p+ T! |& Y
  1210. Show_Function_Status_Off:2 b7 L* ^$ \# c; ~1 Q9 u5 t
  1211. LDX FC_PPU_Cursor! f( J. `: r% |
  1212. LDA #FC_OFF_TILE
    ' K9 \; O0 N  Q( p% x' a
  1213. STA FC_PPU_Buffer,X
    ' \! Z) w( h  t1 T! [9 x  P* T4 R
  1214. INX5 V, L! U; M5 t! V4 k
  1215. STX FC_PPU_Cursor- q3 \, [/ G% c# F# B1 ?; M% _
  1216. RTS2 w* j+ {. k* X! Y. {
  1217. / f0 M- f5 N( x0 `, ]0 R5 s
  1218. 1 _& V' ], s, M
  1219. ;-------------------------------------------------------------
    " ]! L9 z. g3 h' N
  1220. FC_Data_Copy:    ;数据拷贝参数设置
    ; m3 g8 u4 w  H' P2 _; ]
  1221. STX FC_Cpy_Port_L* e2 S+ X, C; j+ L
  1222. STY FC_Cpy_Port_H
    ! S; @( v3 u9 n, d, F/ j$ z4 j' T
  1223. LDY #$00
    / s- \/ X/ j  I+ p
  1224. LDX #$06# D/ [6 e' q  H' O7 s7 b/ I
  1225. FC_Data_Copy_Addr_Set:    ;从指定地址读入参数: l  B; H' \1 x5 O4 w
  1226. LDA (FC_Cpy_Port_L),Y
    9 p, H1 v" x# n; W& f8 v) i
  1227. STA FC_Cpy_From_L,Y
    8 P+ V6 t- P. F/ \1 }# _8 @* K( X
  1228. INY
      s( o) }4 g2 r% a% c& a
  1229. DEX
    ! w7 O8 o& f* @$ ]- H
  1230. BNE FC_Data_Copy_Addr_Set
    4 u8 b6 v' N3 Y* P( s( K
  1231. LDA (FC_Cpy_Port_L),Y
    , b( R$ K' ?& c8 f1 h% l
  1232. CLV
    * y; T! R% w) E% X
  1233. LDY #$00) b( c7 q3 |( V; G- n4 [7 {
  1234. ;----------------------------------
    # B! y" k8 M, W( w3 `/ O! q9 [3 X
  1235. FC_Data_Copy_Mode:   ;复制模式校验
    & B7 u& A: f( }2 S
  1236. CMP #FC_MODE_RAM_TO_RAM
    / ], F* M1 O! Y& A5 e$ W' D8 W
  1237. BEQ FC_Ram_To_Ram_Mode
    ! c, i, M0 E- Q4 k
  1238. CMP #FC_MODE_RAM_TO_PPU, N* t8 }# d3 _, Z
  1239. BEQ FC_Ram_To_Ppu_Mode
    6 G- p' t6 v7 z- V0 o; C3 \- t3 J" |. B
  1240. CMP #FC_MODE_PPU_TO_RAM
    % v+ n: L, t. ?1 m
  1241. BEQ FC_Ppu_To_Ram_Mode
    0 `0 E5 K3 D+ j& A) u, s' T+ ]- h3 t- P
  1242. CMP #FC_MODE_PPU_CLEAR
    " b5 T& |  Q& `8 |* A5 d+ _
  1243. BEQ FC_Ppu_Clear_Mode; s. y3 ^. w4 I* v$ _$ D
  1244. RTS
    # Z+ @" k$ c* a1 M
  1245. ;----------------------------------------
    " Q' C+ T) v4 P+ e2 o9 j
  1246. FC_Ram_To_Ram_Mode:   ;复制RAM到RAM模式. y! a  v6 O# x/ l
  1247. LDX FC_Cpy_Count_L9 k/ m# p( B* A) S8 Z, N! x
  1248. INX& d: X: L- z4 G: l9 v6 c  q2 f" n
  1249. FC_Ram_To_Ram_Count:   ;剩余计数检查
    / Z5 P  J: q2 w6 j1 U
  1250. DEX
    , F2 V8 m5 S4 @' r( T" z; e
  1251. BNE FC_Ram_To_Ram_Copy9 J1 n/ o! y2 o* g6 @  L* i
  1252. DEC FC_Cpy_Count_H
    9 N/ F$ c8 b3 B, A/ ]3 l
  1253. BMI FC_Ram_To_Ram_Over
    5 w5 r) L- c. i6 M+ h$ F
  1254. FC_Ram_To_Ram_Copy:   ;开始复制数据( l$ n2 \9 e. o- |, ]
  1255. LDA (FC_Cpy_From_L),Y/ A. q" G, e: |6 q# v+ v
  1256. STA (FC_Cpy_To_L),Y% d& p4 x4 @5 g! J. Q, f9 X* c8 h
  1257. FC_Ram_To_Ram_From_Set:    ;源地址递增# R: S) q0 B  F4 O$ X6 M: D
  1258. INY6 A7 H" d: }0 m1 k8 O5 A4 r
  1259. BNE FC_Ram_To_Ram_Count3 O3 t& @+ v! z4 l2 l" q
  1260. INC FC_Cpy_To_H5 d% C/ x6 g: X* `" c
  1261. INC FC_Cpy_From_H
    ) f" r4 D" i( U
  1262. BVC FC_Ram_To_Ram_Count
    ! L$ V! [, n" j
  1263. FC_Ram_To_Ram_Over:    ;结束数据复制
    8 W3 j% n. ?7 }1 X, r! n  O, v3 L
  1264. RTS5 w; M; \" a0 K7 L8 \1 {# ?; [

  1265. 0 |7 k" F: l! @) ?7 \  n
  1266. ;----------------------------------------
    $ K; [" F" C+ m: R0 E
  1267. FC_Ram_To_Ppu_Mode:   ;复制RAM到PPU模式; V  ^5 g6 Y: P' K, ~
  1268. LDA FC_Cpy_To_H
    3 L; t1 e1 J& O, ~$ o
  1269. STA $20061 j8 L7 `# v. K# u" L! Z6 e  M( A
  1270. LDA FC_Cpy_To_L( T) ~& K* A, F: [& }/ t
  1271. STA $2006
    7 T6 M, q0 ]" f) g- x+ ?( O
  1272. LDX FC_Cpy_Count_L
    : Z& H$ L5 O& s2 C* K# n4 v# b  U
  1273. INX
    ) j4 u* ?% U  ~8 f, j. p2 t
  1274. FC_Ram_To_Ppu_Count:   ;剩余计数检查2 z& a& O$ ~: t
  1275. DEX: C( x& F' r6 g, }
  1276. BNE FC_Ram_To_Ppu_Copy+ f. I# a: I0 _# W
  1277. DEC FC_Cpy_Count_H
    & C0 q! J; D5 S% E7 c
  1278. BMI FC_Ram_To_Ppu_Over
    ( I. s1 f" v( E* b" ?* H
  1279. FC_Ram_To_Ppu_Copy:   ;开始复制数据
    / f  V" V  `0 s5 i
  1280. LDA (FC_Cpy_From_L),Y
    $ P  @' q' e, T# O8 u& d
  1281. STA $2007
    ' ]3 j2 c* U1 V) N# y
  1282. FC_Ram_To_Ppu_From_Set:    ;源地址递增
    ) @( Q6 M; [% O8 L0 P
  1283. INY
    ; b; z4 o5 ]/ l4 T5 N
  1284. BNE FC_Ram_To_Ppu_Count
    0 [  g" ^* D5 h; R1 L# R
  1285. INC FC_Cpy_From_H
    " [, u- g' c$ `& `
  1286. BVC FC_Ram_To_Ppu_Count
    7 t7 @4 S! E0 N3 k  n" E
  1287. FC_Ram_To_Ppu_Over:    ;结束数据复制
    : v% Z0 d6 _# W6 f2 P3 [8 l7 a
  1288. RTS
      p0 k8 M3 q' Z2 \$ H4 ^$ y
  1289. / }# z; Y) T" Q/ s; C  N
  1290. ;----------------------------------------
    & L; c  z& N& E6 C
  1291. FC_Ppu_To_Ram_Mode:   ;复制PPU到RAM模式
    9 U7 \# S2 G% y$ r
  1292. LDA FC_Cpy_From_H
    ' ?) v" `9 _" b+ W! C$ c! S
  1293. STA $2006* _+ H$ ?1 D' Q: K  B
  1294. LDA FC_Cpy_From_L8 Z, p+ K1 C3 i" d8 y
  1295. STA $2006% S* @% G  q8 ?
  1296. LDA $2007
    + F0 N" f! _% B& _2 b
  1297. LDX FC_Cpy_Count_L
    $ b% s1 ]- d& `1 x
  1298. INX
    2 L* U8 y2 w- ~- R+ E( b% Q
  1299. FC_Ppu_To_Ram_Count:   ;剩余计数检查  ]6 n3 e5 M% [" p6 X3 g
  1300. DEX0 d& l4 n% W$ `' u0 v% l
  1301. BNE FC_Ppu_To_Ram_Copy! }* d% c1 d1 R- X  I. `
  1302. DEC FC_Cpy_Count_H: F. Z. f) C+ B* n
  1303. BMI FC_Ppu_To_Ram_Over
    4 E8 B% c2 h8 `+ I( @
  1304. FC_Ppu_To_Ram_Copy:   ;开始复制数据# W. s. f% f7 ^7 Y6 s3 h  K$ x& W/ w
  1305. LDA $20071 i3 I+ V( G1 x  i1 G& }! ]) ?
  1306. STA (FC_Cpy_To_L),Y
    & m0 c0 S( b. @7 o/ d  w- o" r
  1307. FC_Ppu_To_Ram_To_Set:    ;目的地址递增
    " F$ j9 _$ t) \: X; @- P5 m
  1308. INY
    7 s* G# z: Q) t7 P9 e" [
  1309. BNE FC_Ppu_To_Ram_Count
    & b' F" E" F( y
  1310. INC FC_Cpy_To_H
    # h7 L4 Y0 T( o$ [! Y9 q, Z5 z
  1311. BVC FC_Ppu_To_Ram_Count3 @. z/ C& V/ m2 r1 `+ k. g
  1312. FC_Ppu_To_Ram_Over:    ;结束数据复制! F: W4 i  Z4 g$ Q2 ^
  1313. RTS( m; F6 `# G9 w0 a1 x

  1314. 3 `% T8 _% o2 |6 J" e6 v4 L
  1315. ;----------------------------------------. }* L, z4 G, G" K
  1316. FC_Ppu_Clear_Mode:   ;清除PPU模式
    3 h( a* @% a" z1 |% W+ n+ O5 m
  1317. LDA FC_Cpy_To_H
      h$ _6 o8 m& i. x! }( m& x/ L  h
  1318. STA $2006
    2 K" U( C% }) y+ u( ~. ?
  1319. LDA FC_Cpy_To_L9 L+ f. n, U* D; s* |
  1320. STA $2006; x6 M6 B5 {4 J
  1321. LDX FC_Cpy_Count_H( ]+ R1 X2 `1 _9 r8 D
  1322. LDY FC_Cpy_Count_L
    : T) |& v# I3 P8 k8 b
  1323. LDA FC_Clear_Val
    8 t- w' u$ T9 g0 X9 ?4 M
  1324. FC_Ppu_Clear_Count:   ;剩余计数检查
    8 S. w/ T8 w9 R
  1325. BNE FC_Ppu_Clear_Copy
    . A, B. _7 Q3 j- u) S1 O
  1326. DEX, w6 y$ S, P) v" M+ R; F6 D
  1327. BMI FC_Ppu_Clear_Over" U3 j1 s. d2 C: N8 n! j8 y4 x
  1328. FC_Ppu_Clear_Copy:   ;开始清除PPU
      G2 o  w. L6 ?# Y
  1329. STA $2007, ^. ~! w4 i9 j
  1330. DEY
    ' |* J& N# L! [3 t, _+ H/ x
  1331. BVC FC_Ppu_Clear_Count
    2 H6 o. E  b, n8 [5 h; p- W0 ~
  1332. FC_Ppu_Clear_Over:    ;结束数据复制
    # A+ I) y4 f8 n6 v/ w' Y
  1333. RTS
    ) J( p1 d% ^' {

  1334. 5 _% i4 C8 R. V" Q! P
  1335. ;==================================================6 p# O1 W  R& p; c' z' ~& e* b# p
  1336. ;保存RAM数据
    8 |* J7 C. b" ?" y/ \* r0 u
  1337. Save_Ram:
    . q+ E$ ~8 d# d4 z$ D# t
  1338. LDX #<Save_Ram_Data9 |5 o/ m5 v+ e; H' f& O
  1339. LDY #>Save_Ram_Data, ]/ |' q. m+ X3 n2 {
  1340. JSR FC_Data_Copy
    . m: i/ A8 Y2 K: U
  1341. RTS; h* d) Q. `1 r' y3 T0 O

  1342. ; p6 a* h4 S$ j$ G8 B
  1343. ;加载RAM数据& {- \1 p0 ^/ P
  1344. Load_Ram:
    . |- x4 a; }% q. {- i1 _) o
  1345. LDX #<Load_Ram_Data
    ( h8 ]6 P5 Q( \
  1346. LDY #>Load_Ram_Data
      f1 c& s$ g! a) Y' g6 c
  1347. JSR FC_Data_Copy/ K2 T3 X5 M( z" F2 m4 d: g
  1348. RTS
    $ y, k% w7 \+ |$ @; t+ b
  1349. ) f* J  ?) Q& H7 I+ ]- j1 E' b
  1350. ;保存PPU数据4 [3 f% D4 }+ h6 s4 r9 e
  1351. Save_Ppu:5 K6 K* {% o+ d( |
  1352. LDX #<Save_PPU_Data4 s, f5 f/ B3 |5 J* D$ R; u0 e; W
  1353. LDY #>Save_PPU_Data- j$ w% w  {6 `# J; q* d
  1354. JSR FC_Data_Copy7 `. U$ ?* \$ O  m# F- [
  1355. RTS
    / {/ [7 z, J: I
  1356. 8 c6 a8 M! p0 R: v$ e
  1357. ;加载PPU数据
    % t/ g9 M& ~1 O0 I
  1358. Load_Ppu:& Q) W& m2 I0 p9 _
  1359. LDX #<Load_PPU_Data
    8 I* ~( G2 C+ [1 V
  1360. LDY #>Load_PPU_Data0 ]# v5 T) f% l4 E8 i6 r
  1361. JSR FC_Data_Copy" ~* h" }# N' E& c& f- Z. g
  1362. RTS( Q+ x* R& P0 E
  1363.   V- Z. h! N6 ^. z- \4 o2 r
  1364. ;清空PPU数据
    ; L* W& j9 F0 [: m+ _
  1365. Clear_Ppu:" b  x+ s# ]0 n- Z# @0 h) |
  1366. LDX #<Cln_PPU_Data% O2 K5 @/ x8 T5 [6 F( w% ?
  1367. LDY #>Cln_PPU_Data: E% I; b6 E% P* Y& m
  1368. JSR FC_Data_Copy* k# r6 f: a! S$ z" O
  1369. RTS
    $ A- `: n" F) b- d; k* a

  1370. 0 P6 E) O6 Z' A  P" w; ?+ {
  1371. ;==================================================
    # @0 d! Q$ A, x6 e& v. E! s( o: j' X
  1372. ;数据配置
    ; d1 |3 \# r& p4 v% y  r
  1373. Save_Ram_Data:
    ; g* G2 w* X, R- ?
  1374. .DB $00,$03,$00,$63,$00,$01,FC_MODE_RAM_TO_RAM4 d. Z! t, G) K5 D
  1375. Load_Ram_Data:9 {7 P. f7 w! E  p% w
  1376. .DB $00,$63,$00,$03,$00,$01,FC_MODE_RAM_TO_RAM9 \; ?; F7 l' Y1 D- }3 ]
  1377. Save_PPU_Data:
    5 J. v% i) Y  m8 l
  1378. .DB $00,$20,$00,$64,$00,$04,FC_MODE_PPU_TO_RAM
    ! D* b2 [6 w. c$ Z: h6 O2 i" s
  1379. Load_PPU_Data:
    & ]- }* e+ Y  ^2 p
  1380. .DB $00,$64,$00,$20,$00,$04,FC_MODE_RAM_TO_PPU
    1 F8 i& m3 c/ N2 b
  1381. Cln_PPU_Data:- H2 @$ J. e3 f( x' g" A9 r
  1382. .DB $00,$00,$00,$20,$00,$04,FC_MODE_PPU_CLEAR9 n' @  D* I. u8 P5 I1 u
  1383. - b1 h4 k& m* ]% G/ N
  1384. 4 S0 S% W; w+ C, @& C  C) o
  1385. ;==================================================( E: j& i7 C( x5 f9 J, u
  1386. ;文本数据PPU显示地址
    8 q7 V( |9 \! J, H; ~! w
  1387. Text_PPU_Addr:
    8 k% G0 `  E$ s. w, p0 w: l1 p
  1388. .WORD $20C5& F* L' Y8 y4 H( _* X% D8 d* }3 {
  1389. .WORD $2105
    * Y0 S4 ]9 D, T) q. q
  1390. .WORD $21456 z( k: y6 j8 x# ^; R0 R
  1391. .WORD $2185/ ]  x+ u: [9 F! q7 y6 D
  1392. .WORD $21C56 C1 ~8 M# L$ M' {
  1393. .WORD $22055 i6 N# a. `4 ^0 s1 S& C; W
  1394. .WORD $2245! S6 P9 E! m8 d
  1395. .WORD $2285
    $ B+ b  b6 x; `7 P: b
  1396. .WORD $22C5
    ) E# L! g. K: ]8 m3 H1 k
  1397. .WORD $23055 N" E! G- B7 |( k4 h
  1398. .WORD $23457 O' e) R( ?; K$ A' R" j6 x6 T: {( p
  1399. 5 C3 T; q% S' Y/ U4 h, n
  1400. ;==================================================( k3 W9 m- d: `+ s
  1401. ;文本数据PPU数据地址
    + a1 q" ^9 y: C' W- |
  1402. Text_Data_Addr:* W* J$ @- {" C* {  _
  1403. .WORD Text_Data_019 k! I; f; t  L9 o" D+ r: \0 v
  1404. .WORD Text_Data_02, F0 r9 ~) f9 N: b: {9 m1 N/ Y; b
  1405. .WORD Text_Data_03; e0 |+ X) {1 f" j
  1406. .WORD Text_Data_04
    2 L4 w$ U5 N9 G4 L3 Q& T" M$ W
  1407. .WORD Text_Data_05
    * y# W. g% A5 [3 V4 z9 C: {
  1408. .WORD Text_Data_06
    7 }2 Q+ }. `, d/ K& u7 ]4 i
  1409. .WORD Text_Data_07
    5 B" s8 R' _  W! w7 r% K4 G
  1410. .WORD Text_Data_087 M5 a4 D0 q: [1 t
  1411. .WORD Text_Data_097 s( W3 i) [  I1 j" g$ ?! D( C' e; i  F
  1412. .WORD Text_Data_10: q  b8 s0 P, U
  1413. .WORD Text_Data_11
    ; C- z. P$ y# P9 ]: m" l/ N0 }6 Z9 q
  1414. .WORD Text_Data_126 [4 W2 E( ^2 ^& k
  1415. .WORD Text_Data_13
    9 N# @' L* u& i
  1416. .WORD Text_Data_14; I8 n8 i& c0 W1 w8 {# `& t
  1417. .WORD Text_Data_159 O; x! \7 D( [, J8 L& y
  1418. .WORD Text_Data_16- N, b% i; ]& @7 @* W& l3 m  S# @
  1419. 6 I) F' ^5 O) W
  1420. ;==================================================
    5 \6 `- I8 \0 O$ t
  1421. ;文本数据" |5 H  K' u9 j* b6 I" F
  1422. Text_Data:
    5 f3 z! F& e9 h7 O9 c
  1423. Text_Data_01:5 ~, N& z; b" y/ E8 m
  1424. .STR "01.INVINCIBLE"  c" G7 A% k8 F# ]+ V
  1425. Text_Data_02:' w& U/ ~2 @. q$ a% W4 J0 ~
  1426. .STR "02.INVINCIBLE PLUS", \1 m+ Y4 F1 n- u
  1427. Text_Data_03:4 g* _% W% \  E$ |" e
  1428. .STR "03.LOCK LIFE"
    8 G! l# Q$ F$ u( z, u% e. M' D
  1429. Text_Data_04:, E) C( k' s; O7 p- O( n4 I% P; f4 ^* X0 P
  1430. .STR "04.LOCK WEAPON"" ~' b" v4 c" V2 Y) j
  1431. Text_Data_05:
    / T% e+ X$ ~) _" D
  1432. .STR "05.SEL CHANGE WEAPON"
    ) {9 L7 {0 o0 Y  C
  1433. Text_Data_06:: L9 W% {0 W' ~. l# \2 ?: E+ s: ^
  1434. .STR "06.UNLIMITED JUMP"! ]3 @; X, }, C
  1435. Text_Data_07:
    % c' E0 C# I4 D" d7 C2 x! M/ u7 y
  1436. .STR "07.MOVE FAST"* L) a* X* e. E0 V6 a
  1437. Text_Data_08:
    9 T) x8 ~) C1 ~7 E% F
  1438. .STR "08.SWAP SKIN"" X0 f9 q( {( P- X( E! @
  1439. Text_Data_09:
    / F) G4 x9 {+ U- ]9 K
  1440. .STR "09.EQUAL BULLET"
    # ^, w7 `$ T8 P7 j4 T
  1441. Text_Data_10:
    9 c1 b5 X- {$ _7 e+ H+ x7 Z3 m
  1442. .STR "10.STRONG BULLET"
    ) `# ~8 [9 U! }$ J# U
  1443. Text_Data_11:1 h7 y. a. z$ H  G
  1444. .STR "11.KILL BY ONCE"
    9 M% _0 ^6 I1 F0 K) p& `
  1445. Text_Data_12:3 i" N2 e) [+ [; Z
  1446. .STR "12.FULL SCREEN KILL"
    % E6 R- A& |6 M* D
  1447. Text_Data_13:
      j0 ?5 i2 _* V; K# k
  1448. .STR "13.DOUBLE CONTROL"
    & L8 L, C( k' a# s6 D
  1449. Text_Data_14:' z+ W9 l% s5 A. S
  1450. .STR "14.REMOVE E-GRID"( f2 G# r& n+ }- {$ C& e! q
  1451. Text_Data_15:
    " c# z: \4 P8 [1 f! n
  1452. .STR "15.FALL INVINCIBLE"
    6 N$ D) U3 Q4 }; L/ Y
  1453. Text_Data_16:
    - M5 d9 `7 L7 M, V" ?2 s4 I
  1454. .STR "16.NEXT STAGE"
    ! H9 j& W/ K4 M6 U
  1455. . j. T) r, s8 V/ g  v! i& K# m
  1456. ;==================================================
    0 M* C' b. |. H
  1457. ;功能开关检查地址- f* k0 V/ V7 \/ l
  1458. Function_Addr_A:7 n6 a- m9 ^) H- k5 N" [6 q. p
  1459. .WORD $01C00 ]$ U& ]9 T- V+ D
  1460. .WORD $01C0
    ) j) `# n; ]% Z
  1461. .WORD $01C06 `' X1 k6 @. T& m" s- C3 j
  1462. .WORD $01C0
    0 h8 @: H/ k  d' ]6 u
  1463. .WORD $01C01 v5 r* j' R0 K1 `! n/ A
  1464. .WORD $01C0
    ' ^! f' R3 m& H# x" Y/ _. ~; N
  1465. .WORD $01C0
    # c" d& T9 G1 `, D0 b8 [4 {
  1466. .WORD $01C05 A. q$ h2 h, i( ?4 {" w
  1467. .WORD $01C4/ C0 t( F, K4 g( q
  1468. .WORD $01C4
    8 r) X2 r7 L9 L" K3 R' [
  1469. .WORD $01C4/ l; u( D) t9 k& t* `) A
  1470. .WORD $01C4$ e1 f/ \' a. K. p. ]3 B
  1471. .WORD $01C4% o# `. k0 c7 d( m# v
  1472. .WORD $01C4
    $ L5 k& n7 `; i9 N# Q  `6 ]
  1473. .WORD $01C28 M% e0 w. j7 M6 z" b# b
  1474. .WORD $01C4
    7 c& O' Q; U& y* P

  1475. + _8 [* `( {0 u8 f+ R2 s
  1476. ;功能开关检查地址; E- h* l$ I4 \( {$ [
  1477. Function_Addr_B:) s) d! I3 X: a( K6 g8 U
  1478. .WORD $01C1
    & l  L5 Z# w5 ]4 _* Q
  1479. .WORD $01C1/ x9 d$ K0 g3 ?0 B9 G) Q  R
  1480. .WORD $01C1
      m* `4 w& n- a9 Y- e$ }) S
  1481. .WORD $01C1
    1 ]% ]; C: S# u7 T2 U2 {  ~
  1482. .WORD $01C1/ d* o/ P8 M: Z
  1483. .WORD $01C1
      J  M- ~* V$ b& g' G( W& O% m! }
  1484. .WORD $01C1
    $ m8 a6 l. f- K+ _
  1485. .WORD $01C1: `$ q. f/ r4 H3 d4 P8 B- F2 `
  1486. .WORD $01C4' l! Z- t7 c9 v1 @; ^
  1487. .WORD $01C4
    . o& k; k& y2 o. c7 m
  1488. .WORD $01C4
    : q1 q3 n0 H* F  ~5 V$ v. P5 x
  1489. .WORD $01C4" N+ H+ [6 n4 ~/ g9 i; v
  1490. .WORD $01C4/ P' _- o% T+ V" S
  1491. .WORD $01C4
    5 H4 s, Q6 H! }/ K; X
  1492. .WORD $01C3
    - T& k: Z) Y& s) `1 X$ A8 g) u
  1493. .WORD $01C4- V3 `# z( \. M3 {0 J
  1494. ) z, c' D4 g9 b& J% V1 C( ^: O
  1495. ;==================================================
    ! K; b3 f6 M% c2 k
  1496. ;功能开关检查数据
    ' b+ U6 O6 s* ?0 X$ |' j. x
  1497. Function_Check:
    " Q1 T7 P6 s$ M
  1498. .DB $01
    * X3 u3 Y- ^; F9 X5 P
  1499. .DB $02* {# q) b3 e3 @& j& y
  1500. .DB $04
    ) V% W. D3 D- d9 r
  1501. .DB $08
    % Q1 V& C9 J9 _3 B
  1502. .DB $10
    " h2 F, s4 |: R
  1503. .DB $20, q- |3 D  h5 m, D" }
  1504. .DB $40! ^% F8 I% c$ F8 I8 y1 i& H$ t
  1505. .DB $80
    0 s$ o- \1 O1 I3 Y
  1506. .DB $01
    , N+ k" N/ Q( p5 A) s
  1507. .DB $02
    ' N  t& r7 I: [$ n/ y
  1508. .DB $04
    7 O7 I5 T( c2 \0 z
  1509. .DB $08
    " P% R8 J1 P* d" Q. a
  1510. .DB $10
    # H5 d: v2 I! |" o
  1511. .DB $20& U7 ?5 M6 c6 g3 g% C$ c5 Y
  1512. .DB $40' s: ^( J. R, O" F
  1513. .DB $80
    7 ^( h' A% H) L/ T" W& g1 _

  1514. 5 d1 K+ ~( a/ m3 K3 P5 h
  1515. Char_Rom:7 C, v5 q! `# ~9 |$ k. T
  1516. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    & F& M' K8 f$ T  c1 |$ b/ S/ J
  1517. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00% i' j' v9 |* ?8 }7 \+ ]9 ?3 _2 f( Z) v
  1518. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3B,$25,$00
    4 f; O: [8 k# O
  1519. .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$00,$00,$00,$00,$00,$00
    3 S$ M$ f2 l( G  q* x: o
  1520. .DB $00,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19
    ' f# |; _2 e% H' Q
  1521. .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$00,$00,$00,$00,$00) Y! j# t- \" ~
  1522. + S2 v  ?& c: k9 n* e" G1 f& u

  1523. ' s0 C( }6 z8 }1 q& Y  W8 u. a$ r
复制代码
9 e( a+ _/ U6 n! m
游客,如果您要查看本帖隐藏内容请回复
% j$ P3 u3 A5 z4 @" _+ {' c% _
flamecyclone.ys168.com
0 ^, |( P6 H: i, Kwww.nesbbs.com

本帖子中包含更多资源

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

x

评分

2

查看全部评分

签到天数: 3234 天

[LV.Master]伴坛终老

发表于 2019-11-29 23:03:37 | 显示全部楼层
支持楼主,非常丰富的修改选项!
[发帖际遇]: afti摆地摊卖菜,占道经营被城管罚款 1 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 142 天

[LV.7]常住居民III

发表于 2019-11-30 14:20:13 | 显示全部楼层
顶楼主啦..希望楼主多发精品好帖啦.....
[发帖际遇]: yelei花2 个 柠檬买彩票,血本无归T_T. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 1753 天

[LV.Master]伴坛终老

发表于 2019-11-30 14:45:08 | 显示全部楼层
改的挺多,支持!
[发帖际遇]: 狮子座 发帖时在路边捡到 1 个 柠檬,偷偷放进了口袋. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 39 天

[LV.5]常住居民I

 楼主| 发表于 2019-11-30 16:11:17 | 显示全部楼层
重新制作, 修复已经发现的bug
[发帖际遇]: yandagui 发帖时在路边捡到 5 个 柠檬,偷偷放进了口袋. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 1764 天

[LV.Master]伴坛终老

发表于 2019-11-30 16:11:46 | 显示全部楼层
666666666666666666666
回复 支持 反对

使用道具 举报

签到天数: 2709 天

[LV.Master]伴坛终老

发表于 2019-11-30 18:27:30 | 显示全部楼层
楼主威武
[发帖际遇]: caochunyuan辛苦发帖,赚了 4 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 1551 天

[LV.Master]伴坛终老

发表于 2019-11-30 21:38:25 | 显示全部楼层
感谢大神分享!可视化修改非常棒!
回复 支持 反对

使用道具 举报

签到天数: 187 天

[LV.7]常住居民III

发表于 2019-11-30 23:17:50 | 显示全部楼层
多谢你的分享
[发帖际遇]: dabayu为灾区捐款 7 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 1957 天

[LV.Master]伴坛终老

发表于 2019-12-1 13:14:11 | 显示全部楼层
感谢楼主分享
[发帖际遇]: DEN 发帖时在路边捡到 1 个 柠檬,偷偷放进了口袋. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 35 天

[LV.5]常住居民I

发表于 2019-12-3 18:46:27 | 显示全部楼层
感谢{:4_92:}分享
回复 支持 反对

使用道具 举报

签到天数: 39 天

[LV.5]常住居民I

 楼主| 发表于 2019-12-4 21:39:53 | 显示全部楼层
增加烧录支持(其实是之前遗漏了兼容性)
回复 支持 反对

使用道具 举报

签到天数: 1301 天

[LV.10]以坛为家III

发表于 2019-12-5 06:49:43 | 显示全部楼层
樓主的修改一定支持, 魂斗羅是喜欢的系列.6 K+ E8 k5 T" I2 j' l+ g
多谢楼主分享
[发帖际遇]: waikwokt 打扫环境卫生,被奖励 2 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 1213 天

[LV.10]以坛为家III

发表于 2019-12-5 10:13:59 | 显示全部楼层
漏了一个下载。现在魂斗罗2部都齐了。谢谢楼主无私的付出。
回复 支持 反对

使用道具 举报

签到天数: 3678 天

[LV.Master]伴坛终老

发表于 2019-12-21 02:21:12 | 显示全部楼层
感谢楼主分享
回复 支持 反对

使用道具 举报

签到天数: 1341 天

[LV.10]以坛为家III

发表于 2019-12-31 21:29:52 | 显示全部楼层
这个牛叉大了
回复 支持 反对

使用道具 举报

签到天数: 3357 天

[LV.Master]伴坛终老

发表于 2020-1-18 16:09:02 | 显示全部楼层
不错不错
[发帖际遇]: leshui扶老大爷过马路,警察叔叔奖励leshui 2 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

发表于 2020-1-21 11:56:09 来自手机 | 显示全部楼层
谢谢楼主了
回复 支持 反对

使用道具 举报

签到天数: 644 天

[LV.9]以坛为家II

发表于 2020-3-5 21:18:20 | 显示全部楼层
谢谢老板啊
回复 支持 反对

使用道具 举报

签到天数: 8 天

[LV.3]偶尔看看II

发表于 2020-3-22 14:13:00 | 显示全部楼层
/ m" C4 e1 }) n+ k; A2 V) e
Tec.PNG (8.05 KB, 下载次数: 0)
( J- o; y! z1 u) T
4 q) k! d/ p* n: X下载附件  保存到相册9 E' O7 F4 j. H+ D( X$ b
% r  F4 c% x2 y* m8 [4 d1 _
2020-3-13 13:33 上传) c) h" i5 l1 N# e, S
得到的文件解压后放在任何FC模拟器即可玩。NES上最优秀的篮球游戏!1 _8 G6 w! F: Z  ^" u7 _) S$ R" z' Z# B; Q
修改内容:0 i" a% S1 }7 ~0 {
1)游戏时按START键可以开启或关闭怎样射球都进篮,全场照进!- t9 S2 d" W3 p& \  s; j' r1 U. \( X) H, n
4 N# A* o  K& S. i2 c8 q! \$ r5 k2 Q1 C
不过开启了是双方面的,看到电脑拿着球赶快关闭!(有声音提示)。" p1 M) ?$ I+ `) P* f2
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-5 14:01 , Processed in 1.123047 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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