设为首页收藏本站

 找回密码
 立即注册
搜索
查看: 1580|回复: 27

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2019-11-29 20:25:37 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2019-12-4 21:31 编辑
  o' B8 O' Z/ i  v  t
) J: D9 H( z7 h1 \6 _0 [[FC][魂斗罗][最佳可视化]& u# x) J. B- f* h) A: n% Y
时间:2019.11.30  _  \+ X0 T1 ^+ O# K7 l
作者:FlameCyclone  P6 P3 ?2 a5 m! {& E
内容:, j% M. G4 n, T7 z8 A5 m
1.可视化:   
/ t4 V7 r, S# q8 [     (1)暂停时按选择键进入菜单
. F" |0 z5 [' M- ^+ \( N! @     (2)方向键选择功能: B键开启: A键关闭: 选择键交换,开始键退出2 Y0 \1 k6 c6 ?/ y" I* E/ A
     1.1.透明无敌: 透明无敌
/ Z3 _3 \0 z( w     1.2.加强无敌: 金身无敌) t, U2 {! L4 q6 U4 Q' ~
     1.3.生命锁定: 生命锁定3条3 i% S( m: q7 ~( r) v* u7 \
     1.4.武器锁定: 武器保持不变. x7 |$ S* R0 O% f7 e, I* X
     1.5.武器切换: 游戏时按选择键切换武器5 M5 h) s" T1 \) ^# e
     1.6.无限跳跃: 跳跃无限触发
; p3 |" v* K1 ~& f4 q- _     1.7.快速移动: 行走速度加倍
$ l; S* {+ n. ]% m3 s     1.8.皮肤切换: 交换玩家肤色: D: }3 g( }2 m7 M) s
     1.9.公平子弹: 玩家子弹可以与敌人子弹对打
3 E! a9 \# `  J% z4 F0 C3 l: l) ^     1.10.强力子弹: 子弹打中敌人后继续穿透3 m4 k4 K0 y1 u9 }
     1.11.一击必杀: 敌方中弹一发必死
" M% T: a# I. Q/ e+ R5 |     1.12.全屏击杀: 开枪时全屏可击中目标必死
8 N: K' g* o1 K& y+ h+ ^9 E     1.13.玩家双控: 两个玩家的任意一方均可同时控制两个玩家
3 r* [8 v$ j9 k# o: ~     1.14.移除电网: 移除2,4关的电网
0 T) F* d# x, p+ k. T' D     1.15.掉坑不死: 掉坑后不会死亡
8 H: {5 n& i3 u% W     1.16.跳过关卡: 跳转到下一关* G* M9 `; C9 K- c
  1. ;[FC][魂斗罗][最佳可视化]
    5 }/ U9 p* ~2 J6 ]# P( x- o
  2. ;20191129
    4 K" }" t7 T) X$ T

  3. 9 i5 M1 V& H1 o$ j* W
  4. ;程序开始地址) ?! [; Z( h1 G+ w
  5. .ORG $9000& Z/ e+ L  `& {) ?! p+ \
  6. 6 [1 |6 h8 e& e3 R; @: N1 {
  7. ;==================================================. q1 T- S! ^& p+ J  m8 Z
  8. ;==================================================6 I3 t, ]. _; i, E. I1 M
  9. ;是否双人玩家
    ' N" ?" y% k$ Q; u! b  [" u( ?. P* I5 ]6 Z
  10. FC_IS_DOUBLE_PLAYERS = 1( Y. P* A9 |* A" E; k6 y0 S

  11. , h/ T' D3 E1 J3 z* E8 V$ I
  12. ;==================================================+ R1 |8 r' Z  C7 S
  13. ;PPU缓冲地址配置0 l9 X2 d, O8 f/ ~2 n1 k. c: h4 m. e
  14. FC_PPU_Buffer = $0300
    ; y8 i' J1 z+ M, e
  15. ;PPU地址配置" p+ E  g: ^/ U$ E0 u
  16. FC_PPU_Cursor = $00
    , V, ?* n6 R% q* b+ q4 r6 R6 E
  17. FC_PPU_Status = FC_PPU_Cursor+$01
    ! d( A: b1 }- e8 K1 M& Y
  18. FC_PPU_Data_Cnt = FC_PPU_Status + $01
    $ {3 g/ U: J# C0 \& C2 C. \
  19. FC_Data_Port_A_L = FC_PPU_Data_Cnt + $01! Z& ^; l1 D5 y$ L
  20. FC_Data_Port_A_H = FC_Data_Port_A_L + $018 _- p" Y  n# K, W6 |. q9 \
  21. FC_Data_Port_B_L = FC_Data_Port_A_H + $01! ]$ v- t! w1 ]5 r! B- ~4 Q
  22. FC_Data_Port_B_H = FC_Data_Port_B_L + $017 R) l' i' O5 D( H$ O3 [
  23. ;==================================================
    # C* w3 ~+ ]- X8 c

  24. + R, O) l' v- T6 q2 ~
  25. ;==================================================
    8 G$ J8 L2 h2 \3 d; ^
  26. ;选择项地址配置
    5 m5 H4 Y7 ]( [" F
  27. FC_Select_Index = FC_Data_Port_B_H + $01! H! [8 k' u* X! t
  28. FC_Select_Temp = FC_Select_Index + $02
      ^! z( b: {: K5 Q' [0 u
  29. ;NMI循环计时器0 z2 F, I1 W( U3 |! C* W
  30. FC_Time_Count = FC_Select_Temp + $01( ~3 |. L$ `/ C. s3 _) `, M# X4 I7 S
  31. ;==================================================3 Z% b3 J& Q8 G- N' N5 ~1 \

  32. ) w# z8 Y4 G$ K( i
  33. ;==================================================
    2 X" N: d3 n3 O- I5 s& F( H
  34. ;光标配置
    7 h! M' L4 \8 i
  35. FC_Cursor_Addr_L = FC_Time_Count + $01% w8 u2 C) g6 A1 a+ ^
  36. FC_Cursor_Addr_H = FC_Cursor_Addr_L + $01' K8 y' T% O% Q/ e) O+ g
  37. FC_Cursor_X = FC_Cursor_Addr_H + $010 U$ g0 L5 v% z7 X: I: g# n% o
  38. FC_Cursor_Y = FC_Cursor_X + $014 ?+ }- N& A3 `2 \% k) f" R2 \' n) B
  39. ;----------------------------------------  a! b# Q4 p3 p& ?# E: @
  40. ;光标图形号$ |# P$ r# P( K8 u5 w5 B9 A
  41. FC_CURSOR_TILE = $3E
      N$ h. C) o) J0 a
  42. ;光标偏移像素值6 v5 A: s; a& P+ Q
  43. FC_CURSOR_OFFSET_X = 12
    2 k& g7 ^* x9 U: B! R
  44. FC_CURSOR_OFFSET_Y = 1& `) B" H+ I' F8 F9 i( A
  45. FC_FUNCTION_OFFSET = 219 W8 s# E4 x4 E; x& Q. M  S2 k$ H
  46. FC_ON_TILE = $3D* g/ k* T) ~0 h( r  ]0 O
  47. FC_OFF_TILE = $3C
    : ]8 C0 r2 l7 Y$ o3 F/ K
  48. ;==================================================
    + V# c' t8 L$ u4 R% y2 n; n
  49. ( V3 c8 `4 \  Y; k: W  w
  50. ;==================================================+ d5 Z" r$ F) N9 m- k; e0 W
  51. ;翻页配置/ D6 y0 p; ^2 q5 G# w
  52. FC_Page_Old = FC_Cursor_Y + $01
    / c% s) X4 s* D3 Z: f! Q( ]
  53. FC_Page_Cur = FC_Page_Old + $01! R* b1 d* u; N$ \+ v
  54. FC_Page_Item_Count = FC_Page_Cur + $011 o! q6 T; m! a/ u) ?8 i
  55. FC_Page_Item_Buffer = FC_Page_Item_Count + $01
    0 W- W' D1 }0 j" V. x$ s
  56. ;----------------------------------------2 h; p7 u) Y: Q2 f- U# G
  57. ;翻页属性
    7 A4 @0 X& X3 e- i6 W, l$ ^8 }
  58. FC_PAGE_SIZE = 10! ?* ^) U6 Y/ ]8 m* _
  59. ;PPU单次写入缓冲项数
    1 Y; s) `( h* }4 Z, W9 D
  60. FC_PAGE_BUF_SIZE = 24 ~. f! U2 V% y2 @% b
  61. ;----------------------------------------
    ! W1 w- k/ B) d" M2 q$ `! {
  62. ;显示项最大索引属性
    7 Y% G3 d! k/ T  J# H
  63. FC_ITEM_SUM = 16 - 1
    9 T$ ~: F: Z  w
  64. ;最大页索引属性
    % ]/ t5 [( ^- f$ L. T% M
  65. FC_PAGE_MAX = FC_ITEM_SUM/FC_PAGE_SIZE*FC_PAGE_SIZE/ d3 [+ ^- g4 b4 U6 Q3 a' n
  66. ;==================================================$ W  F2 y( z( i# e$ s* Q1 N; |

  67. / D. T+ s8 J' H) I, ?* y" C* ?8 E
  68. ;==================================================
    & {4 J  r0 t: U* e% X1 ]
  69. ;按键配置6 I  U/ L& v! g+ n/ v& d  B8 Z
  70. Button_Keep = FC_Page_Item_Buffer + $01
    , Z0 p! L$ V" C) B' z( z# M3 @* E
  71. Button_Once = Button_Keep+$02
    ( n  s0 Y! D& }' t- ^
  72. Button_Temp = Button_Once+$02) n5 S4 }; {' @! K4 r/ g
  73. Button_Buf = Button_Temp+$02
    5 a. C# P0 Y- |3 {7 n2 `* K
  74. Button_Status = Button_Buf+$02
    ; T. R1 O/ G3 I; {) Q) X
  75. Button_Auto_Delay = Button_Status+$02/ x9 l( y3 V6 R# Y) t/ x% n
  76. ;----------------------------------------
    # _+ L1 U' |: x3 d' b# c6 ^
  77. BUTTON_DELAY_MAX = $18, L" N3 ?1 ]3 N6 C6 ]6 m
  78. BUTTON_DELAY_SPEED = $08% O1 H; Z" }$ G4 j

  79. ' T6 C1 c7 g) C! h1 o
  80. BTN_UP = $08  U# o: n1 w  {7 B/ U1 j7 A
  81. BTN_DOWN = $04
    % q: U1 H9 v( O) `( Q
  82. BTN_LEFT = $02* }* ?/ y  t5 V, p+ _/ u' s  ^/ S
  83. BTN_RIGHT = $01" [- @5 D$ H8 c; h6 s. N
  84. BTN_SELECT = $20
    7 m7 \3 C0 v3 i4 J0 k& U
  85. BTN_START = $10$ E) U: x7 [& M/ s9 ]
  86. BTN_B = $40
    . P6 A. A; _9 n- _
  87. BTN_A = $80
    + |+ I7 v; Q- j) G$ Z
  88. ;==================================================! R  c4 ~+ p. L4 }6 {/ Z0 S2 [
  89. - K: O6 t0 t: N: a- s$ K3 X
  90. FC_Copy_Addr = Button_Auto_Delay + $01
    + ^5 `- [9 c/ C, x, K8 `
  91. ;----------------------------------------+ W$ F% L+ k: W# [% A. C
  92. FC_Clear_Val   = FC_Copy_Addr+$00      ;清除模式覆盖值0 k, g4 U8 _; D3 z8 i4 P
  93. FC_Cpy_From_L   = FC_Copy_Addr+$00     ;复制来源地址低位
    ' x5 b0 t  v9 X
  94. FC_Cpy_From_H   = FC_Copy_Addr+$01     ;复制来源地址高位
    , K) z1 Z4 n& o/ Y  I" W. W
  95. FC_Cpy_To_L     = FC_Copy_Addr+$02     ;复制目的地址低位
    # U" K% t. j9 O+ w8 d# Y
  96. FC_Cpy_To_H     = FC_Copy_Addr+$03     ;复制目的地址高位
    4 G. g0 I/ ^" ]$ H7 }2 [9 d
  97. FC_Cpy_Count_L = FC_Copy_Addr+$04      ;复制长度低位1 T3 c  R3 ^- f: C* V
  98. FC_Cpy_Count_H = FC_Copy_Addr+$05      ;复制长度高位
    7 f) k) Y5 @! c: I
  99. FC_Cpy_Port_L   = FC_Copy_Addr+$06     ;配置地址低位
    ) \5 i. @5 n- c. |
  100. FC_Cpy_Port_H   = FC_Copy_Addr+$07     ;配置地址高位
    5 \3 i& X& X) W$ {
  101. ;----------------------------------------
    + \5 Y! q2 g, B$ t
  102. FC_MODE_RAM_TO_RAM     = $00  ;复制RAM到RAM模式  r+ J  @& ]* c6 N  a( p
  103. FC_MODE_RAM_TO_PPU     = $01  ;复制RAM到PPU模式
    4 s4 q, x, a8 `* U3 y0 |( t% X
  104. FC_MODE_PPU_TO_RAM     = $02  ;复制PPU到RAM模式& y  Y5 G% l2 b5 U
  105. FC_MODE_PPU_CLEAR     = $03  ;清除PPU模式
    0 s4 V! P$ ]; P
  106. & B3 K# H3 n9 k+ u7 H
  107. ;==================================================
    , B0 B- Y1 w) k; S* N$ M8 f
  108. Rom_Nmi_Addr = $FF  N2 Y8 T8 w2 U* ~
  109. Rom_Btn_Once = $F50 M+ N# M. b$ X! e3 i6 W) z  V* P6 M
  110. Rom_Btn_Keep = $F9
    ' v# y4 Q0 H: v
  111. Rom_Pause_Addr = $25' y- W4 g9 h6 d9 z  |0 a
  112. Rom_Pause_Val = $01
    - S( ^" ~) ~- w9 y; [3 i( a# B: ^
  113. Rom_Pal_Addr = $07C0
    ; y9 A' e0 |7 W
  114. ;----------------------------------------
    . y; [- Z& ^; Q0 B$ L% d7 C5 m
  115. Save_Zero_Addr = $62008 K0 @7 Z( S& L4 A
  116. ;==================================================
    8 Q9 O1 r  U  t+ F# K/ d& U
  117. ;==================================================
    . f! q3 ]6 H, a; q7 A7 H

  118. " m/ K) P% g" s1 j- W
  119. ;程序入口) c6 s: d: w& A4 `5 b
  120. Enter:
    - Z, P: V3 y, _# [+ i, F
  121. LDA Rom_Pause_Addr& E0 c* Q( |9 f
  122. AND #Rom_Pause_Val' p; @! M; I9 n! L1 f  m  A/ c: A: v
  123. BEQ Quit_End
      S4 b/ T, u  ~* p% S1 ~( H3 E* R
  124. LDA Rom_Btn_Once6 O% X- _6 P! ^) Y1 m
  125. CMP #BTN_SELECT
    2 Q7 F  U' ]9 a6 ^2 u) S6 Z
  126. BNE Quit_End! V0 g( i4 ~- `4 `2 X" g6 C
  127. PHA
    " ~: I# z) k3 _5 }0 Y. X0 l
  128. TXA$ Z& M3 y7 C. L
  129. PHA. v3 G# X/ \; y9 X! @* A( ^+ ~
  130. TYA
    1 o" U% K; i% m' Y4 g4 w: B" `) K
  131. PHA
    " |  P* C* u8 \" Q* D
  132. JSR Wait_Sound_Stop4 C% z% [; f' Z* K5 T
  133. JSR Save_Screen. r) k- h/ {' |% E; ^% Y7 j
  134. JSR Program_Begin
    ' B1 V3 |/ S# b
  135. JSR Load_Screen$ U& G7 ~# ^3 z
  136. LDA #$10
      M3 Q- h/ O) o2 l
  137. STA Rom_Btn_Keep3 C* R  e; `0 i$ U
  138. LDA #$00
    ( c+ {' c* @, A1 r) h+ V0 l/ [4 D
  139. STA Rom_Btn_Once$ q& W, I1 }+ b8 _9 R
  140. Quit:7 `. ?$ \; _1 f4 u- V0 |
  141. PLA) x2 E" O4 I8 b+ A  a: _
  142. TAY. e( h3 G+ Z/ }3 a  W' j
  143. PLA7 j" q2 D, ]/ q
  144. TAX
    & G1 F! X& T' k
  145. PLA. W9 z' a3 [& R5 M% \. R/ d
  146. Quit_End:
    ; m$ c( r& q+ x: K2 f& k; y
  147. RTS7 y% _  o! ~6 b

  148. * U) `! ?3 l- M. G% R
  149. ;==================================================
    1 ^  b+ T! m  U6 ?
  150. ;等待音乐结束0 r6 ^# e% z0 u
  151. Wait_Sound_Stop:
    - Q' n' k& ^  k) }$ Y+ A5 v
  152. Wait_Sound_Stop_Check:$ n, _% G; ?) ^' x
  153. JSR NMI_Wait
    6 a: R5 r0 Q+ ~" ?
  154. JSR $F825
    ' G! I" G( `$ M# x$ c4 q" M# G) e
  155. LDA $010A
      b. X% C0 B5 H1 k2 J
  156. BNE Wait_Sound_Stop_Check, R6 y2 H9 H# m$ ?) v  T. K
  157. RTS
    9 y" S+ l$ Z4 t! \

  158. 3 V3 `; ]7 v" R
  159. ;==================================================7 ^' l( Q) h3 o
  160. ;保存屏幕数据
    ! t8 i/ s* _# u% o
  161. Save_Screen:
    . r8 Q: `8 ?. L! C5 g) [& ]
  162. JSR Screen_Off2 O+ A3 v# \7 b8 y9 x
  163. JSR Save_Zero
    $ n% Q5 b6 B. o6 m, o9 l+ u* l
  164. JSR Save_Ram
    0 H; m5 c# E( t$ ?
  165. JSR Save_Ppu1 a7 h6 {6 @& o2 o) P# `9 e
  166. JSR Ram_Init
    ) A1 N6 {% ]$ t8 o* C! f
  167. JSR Sprites_Init/ e; t: j. B8 p% C
  168. JSR Clear_Ppu1 {1 V# E8 e1 Y
  169. RTS% m; U3 D  Z; g( C+ E

  170. : K! @( t7 \& V
  171. ;==================================================9 a' a0 l) Y0 T+ `: i5 A& \
  172. ;加载屏幕数据$ m, z0 t, ~$ r. u
  173. Load_Screen:
    6 M( ?* Y" [; g% G
  174. LDA #$00
    - q3 W$ s- N; B8 [8 G5 {
  175. STA $2001
    / H4 D9 U5 ?3 L, t" ^' x
  176. JSR NMI_Wait
    0 m, X. x: x" }, f6 e, p% M6 t% U
  177. LDA #$02& F; Z! M/ B- X) }
  178. STA $4014- z! f: K7 p5 @4 A- m+ [- f
  179. JSR Load_Ram% Z  p9 \  f; l3 {8 ]
  180. JSR Load_Ppu: b6 h$ Z6 a+ W  f. T2 m. r
  181. JSR Load_Zero  J; |5 s0 ?7 x  \& @
  182. JSR NMI_Wait9 k9 W; [9 n8 N
  183. JSR Load_Palette7 x: k: X( [+ |  _
  184. JSR Screen_On; y: }% E- U' ?9 H8 G8 v
  185. RTS1 u4 E! D0 P3 \2 o' Q+ ~' I
  186. 7 W. F3 R/ o" e/ z
  187. ;==================================================, R$ |$ d; h7 l* o& r; c$ U
  188. ;关闭屏幕
    . {7 T4 e1 P, p" ?
  189. Screen_Off:
    ( T1 W- ?5 d# G* V6 _
  190. LDA Rom_Nmi_Addr3 S- L- N: h8 r
  191. AND #$7F
    & V% z  A7 }/ I0 w" |( n5 k7 P
  192. STA $20006 _, g. k" N! ^/ f8 A+ d. {1 @
  193. JSR NMI_Wait
    ) M$ G: Y2 ^: O5 d- r
  194. LDA #$00
    3 k# L% {, ^8 S# F' @. j
  195. STA $20003 v. N7 X1 S* K2 {  M
  196. STA $2001
    : [9 R$ `2 z6 C8 R! r
  197. RTS
    . L" Q# d6 x5 j/ I1 W3 t4 K
  198. 5 t7 ~3 Z. @3 i  J
  199. ;==================================================9 F3 x! p; E8 M  p9 ]
  200. ;开启屏幕0 r& G  ~6 I0 N* |' M0 i. R* Z
  201. Screen_On:4 V( l& f" T: J, M6 ~9 g1 l+ w
  202. LDA Rom_Nmi_Addr0 j1 X+ ?6 `9 \8 M  E
  203. STA $2000, e  u- h# f0 ~( N
  204. RTS
    - ^! g, R4 j1 J" ?0 Q' `
  205. " ^; \8 H2 @- Y
  206. ;==================================================
    ' t; v1 Y' ?  D1 V
  207. ;清空占用RAM
    , A5 B# ~$ [+ i- L; p3 l7 \
  208. Ram_Init:8 Q5 O2 ]$ n7 B* }
  209. LDX #$00
    ( u6 |* I7 M9 z/ G1 b) f$ ^
  210. LDA #$00' z) I+ x6 Y4 g  C
  211. Ram_Init_Set:
    ) y; \. K8 P$ V
  212. STA $00,X
      _9 D6 b& N5 O) n) K8 c# ?
  213. INX6 R/ w% V3 k) z" R4 `% m8 v0 t
  214. CPX #$40% }0 g2 X4 d7 F; p: h- ?
  215. BCC Ram_Init_Set
    6 g1 U9 @0 s1 w5 k
  216. RTS
    2 a& l$ s: q, k: `
  217. + ^8 ?6 [8 ^5 {3 W8 M
  218. ;==================================================+ v, R$ l: a0 R4 r7 R
  219. ;清空占用RAM
    4 u; J" T, F: P. d' g0 l* N
  220. Sprites_Init:5 d+ n( u) K2 U9 {/ X" G
  221. LDA $2002
      A* K4 \0 D' L3 q7 I
  222. LDX #$00
    ( t  @2 y1 R4 c, m% `
  223. STX $2003
    6 E/ B- E8 m6 o$ u: ^3 b% [7 v# N% B
  224. LDA #$F8
    0 S; J0 ~& n$ r: L4 @$ C
  225. Sprites_Init_Set:
    ( g/ K: U1 A0 h8 b+ q
  226. STA $2004- r" k2 `, E: m, o. G% Y& H
  227. INX
    " N* g" t. c$ v' ^/ r+ g
  228. BNE Sprites_Init_Set
    5 Z7 L$ G! r) k6 Z& i/ ?: _, L
  229. RTS
    0 ]& f8 l' n& l% `! c

  230. # C. A1 Y1 a- h7 W% i' t8 P( {
  231. ;==================================================$ p0 ]7 d% V  K& `* G8 x
  232. ;保存零页数据
    5 c4 k$ E0 ~& k( _! F
  233. Save_Zero:
    ) P5 O3 C$ W: D. u$ X
  234. LDX #$00  O$ U1 n* P4 B
  235. Save_Zero_Set:
      g/ C9 o  i0 d% i5 L
  236. LDA $00,X% @5 B6 ~/ b8 ^7 g3 c! i8 X
  237. STA Save_Zero_Addr,X7 g/ M6 t9 {2 |( U' l- m
  238. INX+ X/ F, S' ?- Z- Q( A4 y# a
  239. BNE Save_Zero_Set
    ( I8 _  g& n/ |% U9 R" ]* G
  240. RTS8 }; p% u6 m1 D! \+ X4 t

  241. + C& z( k& o& V. p
  242. ;==================================================
    6 y* I( X: v. H9 O9 j" u0 j
  243. ;加载零页数据5 S+ g, L* B! p8 K) `
  244. Load_Zero:6 O2 W4 V7 J8 P  b% S4 X
  245. LDX #$00" i7 d3 b3 _5 I9 d0 G
  246. Load_Zero_Set:' h. q9 _3 l4 ~+ l9 G
  247. LDA Save_Zero_Addr,X
    : h, e4 Z4 i  Z7 B; s
  248. STA $00,X
    : ~* [  c. Y/ ^6 H
  249. INX
    2 D6 o, q8 O2 g8 m4 w9 N' t, k' A  W
  250. BNE Load_Zero_Set
    8 C- G. [$ y9 u* k8 x, d- K
  251. RTS
    * V. R! ^3 U' Z7 p. N) t5 A# B
  252. 8 _, J6 A* l. i+ @$ u
  253. ;==================================================3 E3 k7 e% D* f- b
  254. ;恢复调色板
    0 t$ Y. h0 q* E+ s+ E) k8 F1 {- f
  255. Load_Palette:/ ^- o: K% D! f! G
  256. LDA #$3F
    4 F4 W+ O( O3 D) d: A: `4 u; M
  257. STA $2006# j6 i2 h) A7 z
  258. LDA #$00
      \" c6 G& a/ P& s0 i6 J/ x! d
  259. STA $2006: T- X, I9 P# E, p) Y5 y  C) y5 K
  260. LDX #$00
    , b% G" h( j+ x
  261. Load_Palette_Set:, t0 T- H. g9 m; \  N$ C9 K6 d! t
  262. LDA Rom_Pal_Addr,X6 R/ J" x2 U! I% n1 C
  263. STA $2007
    ; Y: }( r8 G: k, c/ B( Q0 f
  264. INX
    9 J4 s! a" @) f" j, G
  265. CPX #$200 z0 ^7 Z- Y2 e' t. R1 \! v
  266. BCC Load_Palette_Set
    8 ?8 E! }6 i8 n5 _( B& V
  267. RTS
    9 t1 z1 u* @  d$ Y
  268. 2 A2 [0 p6 X6 x5 A2 `$ ]  z+ L
  269. ;==================================================3 G( E( t) l2 ?. F
  270. ;==================================================! @/ M; t2 ^' y& t& e! s

  271. 1 l  \. \  r# M
  272. ;==================================================9 b/ n/ c" H6 d  Z* |) E
  273. ;程序开始' K8 ^1 k' {  `  O' K
  274. Program_Begin:" `# f$ J1 r5 x9 x7 n; S
  275. ;==================================================$ v: t( j) P. W5 L( J8 Q1 C
  276. ;图形设置
    5 c7 _  @  P. s6 E, Q
  277. JSR CHR_Set
    ! G7 S8 q7 f6 E$ @7 s
  278. JSR NMI_Wait
    1 {6 @/ |) o9 T
  279. JSR Palette_Set; I% b, O0 [0 u, w. }; b5 y
  280. JSR PPU_Data_Page_Show
    , _: A9 \2 y3 c4 ^) n( q
  281. 3 Z' w0 J6 d# t; n: ]+ f" L
  282. ;==================================================; k" w8 S, l- }
  283. ;开启显示  P; }) t! U& R/ _* d3 r
  284. LDA #$1E& n# `7 I% W) r: D9 K
  285. STA FC_PPU_Status. Y2 K4 E$ {, |  ?

  286. 0 ^8 R% N$ \& s+ b
  287. LDA #BTN_SELECT
    % s/ k# D! F- c
  288. STA Button_Keep
    & A2 o; v5 ]0 S6 A+ I; y
  289. ;==================================================" P. [' X( p! Q/ R' Z7 [
  290. ;模拟NMI循环
    4 C! U/ v4 ~# N! {/ U1 y' E+ g3 B) n
  291. NMI_Loop:* g( s( o- D9 r/ m% D/ r7 K: K. @+ I  M
  292. JSR NMI_Delay1 v- X# n0 ^' S5 P3 P2 p
  293. JSR Button_Process
    / Q3 G& a# M# Q0 s6 x2 W
  294. JSR Button_Auto_Press& \( o, j; E, q& x; y
  295. JSR Change_Select_Item1 K3 l0 u' Y$ `" m) C
  296. JSR Change_Function1 c8 @- @. K8 f3 z1 M
  297. LDA Button_Once+ }0 i+ [4 n! n
  298. CMP #BTN_START
    4 O; Y  w& J0 c
  299. BNE NMI_Loop
    ( X; p. c& q* w& b0 Z
  300. RTS
    8 H4 ]7 Y& K8 U

  301. 0 {1 C1 G0 c: n5 z
  302. ;==================================================
      x6 [* J' H* f/ E# ]  g' I9 j
  303. ;模拟NMI中断7 f1 ^2 n8 Z- W* ]
  304. NMI_Delay:
    4 d+ I! Q6 @4 \
  305. JSR NMI_Wait
    ; F0 ^& v6 e1 [' X' q& N+ F
  306. JSR Show_Select_Cursor: K2 z% C" Q$ b' M0 w+ ]- y
  307. JSR FC_PPU_Process
    $ v6 x1 A/ y$ ^
  308. RTS% q- |- W5 d, D$ R$ |
  309. $ l. b" H- B/ Q4 o1 ?9 X. `4 z
  310. ;==================================================5 Z8 ]% f" b$ g
  311. ;等待NMI中断6 B+ o' t4 B0 K/ _+ L
  312. NMI_Wait:
    * m( F6 o+ Q5 F" ]- r& A! D5 Z% N4 H/ K
  313. LDA $2002
    & z% q  x3 I  {6 I% N1 r5 I
  314. BPL NMI_Wait
    . ]: `+ y4 T& g: X
  315. DEC FC_Time_Count; H: H2 I  p8 p9 ?' b
  316. RTS
    & b5 F- O4 {7 G4 {) k& X; O$ B* h' S

  317. 6 ~: a( Q6 d# h2 f0 k
  318. ;==================================================
    ( V6 f6 Q% C0 F* L6 A& q( e4 g2 a
  319. ;PPU写入模式配置属性
    - l$ K1 d) R# D% R: m% e
  320. FC_PPU_MODE_CNTL = $FE               ;带计数行写入
    ; r+ E2 C+ X, t
  321. FC_PPU_MODE_CNTC = $FC               ;带计数行清除
    - W- F4 m3 O, [8 H4 I! B
  322. ;-------------------------------------------------+ T) A+ B# w$ R7 ?, R
  323. ;PPU处理6 Z8 E- }8 ^! ?3 b
  324. FC_PPU_Process:
    5 E& ^, E' w. y4 u$ y
  325. LDA FC_PPU_Buffer
    " D5 F6 M) e; n8 x, x
  326. BEQ FC_PPU_Process_End5 Q$ {" P5 d; ^9 ~4 m
  327. JSR FC_PPU_Process_Beg- y8 }1 l) G9 O* C: A# C
  328. FC_PPU_Process_End:
    9 N# q) C% q9 f
  329. LDA #$00
    9 e3 j9 ~  q2 w" ]
  330. STA FC_PPU_Buffer
    $ U9 S# L- h' }- \* b& I+ _
  331. STA $20064 `* m3 _- R. e' z& H
  332. STA $2006
    $ t0 h2 x5 g0 ~' `( X9 [
  333. STA $2005
    / }9 s3 o' T, p7 t+ S( U3 H% l- I- w
  334. STA $2005
    6 E- `+ C& ?( o  Y& t5 W
  335. LDA FC_PPU_Status
    ' v7 p/ m0 \3 z6 G# ^6 [; C6 `
  336. STA $2001
    / ^9 ~; i' C7 j3 b" W, B: o5 ?
  337. RTS( q5 h( C) h6 a# \
  338. ;----------------------------------------1 [& Z$ |5 P& h8 F3 ]' H
  339. ;PPU处理开始
    # R: R+ f8 J+ _- Y3 F' p
  340. FC_PPU_Process_Beg:
    ; p; b' f" c! y$ C+ d# o
  341. LDX FC_PPU_Cursor' b5 a# J5 E3 c' ~
  342. LDA #$00
    ; `* ?0 t4 c, q0 N  M3 }/ U. l& w9 N
  343. STA $2001
    # j* {7 x9 \0 q, O) N
  344. STA FC_PPU_Buffer,X
    1 @% }6 k$ T+ l1 b/ A; \+ v: z! K0 o  Y
  345. STA FC_PPU_Cursor
    + c  U7 Q: B8 |' l% W
  346. LDX #$FF. Z. a: Z0 Z! L+ H# C
  347. CLV
    " [! o6 a) n" Z4 r
  348. FC_PPU_Process_Mode_Select:+ _1 a4 M3 E7 r* |( j5 ~
  349. INX
    ( K, ?$ j. c# Y
  350. LDA FC_PPU_Buffer,X
    ( X8 t; p7 k% R3 |4 J  f
  351. CMP #FC_PPU_MODE_CNTL9 O+ @1 ?8 ^' L3 K
  352. BEQ FC_PPU_Process_Mode_CountLine
    2 h3 x( d$ N* g0 p6 c5 ?3 W' X
  353. CMP #FC_PPU_MODE_CNTC
    1 ?, q1 W* m# I! U3 w5 U
  354. BEQ FC_PPU_Process_Mode_CountClean
    * y0 I. @$ y% e5 w' F5 p3 p6 @* P" W
  355. RTS3 \% W4 v8 r; F7 ~# L6 `
  356. ;----------------------------------------2 T* [' O2 n! N- T2 R( w# i( N
  357. ;计数行写入模式
    - z: G7 V* ^- ?7 M. n  {% j. T. [
  358. FC_PPU_Process_Mode_CountLine:% m1 R5 L. ~" l/ Q+ G
  359. JSR FC_PPU_Process_Set_Addr_And_Count8 O  d5 o8 q1 f1 |/ A' u+ `
  360. FC_PPU_Process_Mode_CountLine_Write:' {( N0 P/ O5 a. q
  361. INX
    4 ]& z! ], U! y# X. C
  362. LDA FC_PPU_Buffer,X
    ) u( [( J$ ]2 _) m$ ?( v  p! @
  363. STA $2007
    3 ~6 g( M- L) M
  364. DEY2 x$ y. D+ W) m" i' F
  365. BNE FC_PPU_Process_Mode_CountLine_Write7 D! q! J( r- B. L2 F/ E
  366. BVC FC_PPU_Process_Mode_Select
      g! J4 }$ o3 }
  367. ;----------------------------------------
    8 [* n) F. y7 \
  368. ;计数行清除模式
    1 V% A, [. _9 f! K0 R( {. Z! Y2 O
  369. FC_PPU_Process_Mode_CountClean:" W; C: N3 A* W- j7 l: m, K
  370. JSR FC_PPU_Process_Set_Addr_And_Count
    * {  {- c# O# y4 F# ^* M  y
  371. LDA #$00
    ( V8 Z( _1 V9 {' K! Z) q
  372. FC_PPU_Process_Mode_CountClean_Write:
    % Z" g+ U4 x0 t0 B5 g/ A& r
  373. STA $2007
    % ~( R6 a2 Y, B/ k% R+ `3 Y; H
  374. DEY
    % ~. k3 O) S$ U$ R1 a
  375. BNE FC_PPU_Process_Mode_CountClean_Write' s: h' g; H  E+ C5 p' k+ h
  376. BVC FC_PPU_Process_Mode_Select4 W7 A" a. p: _& U" m' `( S4 |
  377. ;----------------------------------------* s4 O2 A+ [, r) n6 C2 U% e/ o+ x
  378. ;设置PPU地址和写入计数
    * y. `! x+ |, H; g  S+ I2 i$ _: r
  379. FC_PPU_Process_Set_Addr_And_Count:  M! E6 a& _1 _& C5 T1 w# h: U: J% q( Y3 u
  380. INX
    % q3 [( n( n$ s  R4 m
  381. LDA FC_PPU_Buffer,X
    $ k  |" l8 {% p
  382. STA $2006
    ! E7 \7 Y; v% Y6 N( A
  383. INX$ k, Q5 q. G3 v8 n0 q% C( w
  384. LDA FC_PPU_Buffer,X
    ! \6 X3 D& }+ G. |- b% h
  385. STA $2006
    + b6 J: N  R& b
  386. INX
    , s/ \% c# b/ R1 O5 Y
  387. LDY FC_PPU_Buffer,X
    4 n% r1 |9 Q8 }+ ~' o1 _
  388. RTS/ q  r. t5 W, S, m0 [* F5 D$ i1 ?

  389. * p  J$ Z5 B6 p1 P; @) w+ {( ]
  390. ;==================================================
    6 d9 ]/ w& y: q) u. y
  391. ;设置CHR图形
    " N; r9 o$ ~& M" W* v" q
  392. CHR_Set:5 |8 ?) @5 [& a
  393. LDX #$053 g8 \* `! I# I* `. `. u
  394. CHR_Set_Data:
    " Q- a1 ?, r+ c: Z; A
  395. STX $8000
    . O8 F1 p# |3 F* i$ Q
  396. LDA CHR_Data,x- ~$ R! F& u3 h, h
  397. STA $8001
    9 A# t% f. B9 K: g5 e' `
  398. DEX
    " R  |% O( Q# }2 }
  399. BPL CHR_Set_Data
    / h' g& U# w, ]8 q$ l
  400. RTS
      ]* ^3 X' p; B
  401. ;----------------------------------------
    ! L9 W& w" x# d/ Q( S
  402. ;CHR图形bank数据
    # L1 y% a8 O3 v; d/ B5 v- [5 i
  403. CHR_Data:
    + P& q( [9 W- Y3 e3 @8 v: `
  404. .BYTE $00,$00,$00,$00,$00,$005 Z, e, Y/ \. j7 w. m6 d7 `
  405. 4 l- w" t' C7 m$ O8 l) l4 p8 n2 e
  406. ;==================================================9 N" }' v% R. y' v" a4 X# [
  407. ;背景调色板设置( P" S) n. w6 M9 T$ f* r, P
  408. Palette_Set:
    9 F! e8 k7 z7 M0 j
  409. LDA #$3F
    8 o2 `' L+ h7 X, \: k
  410. STA $2006
    7 ~* h4 |* i  _' J! \3 j( H: i( x
  411. LDA #$00
    0 n7 m7 o! Q# J8 |6 n, V$ E
  412. STA $2006
    / w3 }8 t4 L3 c* W# }6 i
  413. LDX #$00
    , b  o4 G7 z' x
  414. Palette_Set_Data:; [/ r/ U8 b: S2 Q" P' [- z
  415. LDA Palette_Data,X1 F: X0 t, V( e$ t0 b0 j' a, g
  416. STA $2007, Z( J. D/ M8 @9 m5 o( \; {
  417. INX! Q; }% M* r$ K$ f2 |/ \9 H
  418. CPX #$20: V8 F0 y+ j; o2 L# ]
  419. BCC Palette_Set_Data$ R7 x: W( F% s4 E3 D
  420. RTS6 V' N3 P7 a, q8 j- K. [
  421. ;----------------------------------------7 E6 B% |) B0 L4 U. b
  422. ;背景调色板数据
    , ?- R8 C; M8 U: h1 `+ U
  423. Palette_Data:+ v- h6 @( ^( \- M& z) V/ t
  424. .DB $0F,$29,$24,$24,$0F,$20,$20,$20,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    / I9 P* i8 S6 i3 ^1 [8 l
  425. .DB $0F,$20,$26,$16,$0F,$24,$24,$24,$0F,$26,$26,$26,$0F,$2A,$2A,$2A$ I( ~+ A. P' X! _! ^  B
  426. % W2 q2 k1 ^9 X6 ]; j2 }& c

  427. . k; c& w0 |- \* D! B3 M
  428. ;==================================================
      ?2 D  Z# k) B2 J
  429. ;按键扫描" Y: C1 A' L" \; F4 P( c$ Y& l
  430. Button_Process:
    2 U, t0 J1 B% x  _- P- |
  431. LDX #$012 t- x( V- Y7 @$ m* x  ?: C
  432. Button_Process_Beg:2 w5 K% K) k# i6 V! X( a2 O
  433. JSR Button_Scan. N; [9 C/ e. B* P8 q* W
  434. LDA Button_Keep,X
    " ?1 b* e( O* T: \' B# e- y
  435. STA Button_Temp,X
    + O, Y8 K- l4 E
  436. JSR Button_Scan
    3 S3 t; m1 |, K) v3 o
  437. LDA Button_Keep,X
    ! B5 C5 N. a6 I; ]
  438. CMP Button_Temp,X
    % ^" F# q* y" V7 I7 J! ?8 Y
  439. BEQ Button_Get_Once
    " L  p9 ]- }; m
  440. LDA Button_Buf,X( ~  H3 z. }  W3 J( ]
  441. STA Button_Keep,X) @& l4 O( @' z/ Z. x: p4 a
  442. Button_Get_Once:2 M2 \7 \+ _5 m) e& F8 Q
  443. TAY
      a8 `% z0 W. W* H' C. X4 G0 S
  444. EOR Button_Buf,X
    7 D% J- C1 J4 k7 d% b9 V1 c
  445. AND Button_Keep,X+ j( A0 k( \- i& m$ _  Q
  446. STA Button_Once,X
    - O( y8 d% a& R+ o  R
  447. STY Button_Buf,X3 {: ?- C7 s$ C  n+ I
  448. DEX. i8 _+ \3 n$ j: l
  449. BPL Button_Process_Beg
    + E  s1 i0 {7 n( P1 t9 [  C
  450. RTS& M: \' h3 \8 y
  451. ;----------------------------------------+ R& S. \& e1 z' S  C
  452. Button_Scan:
    2 w/ ]3 I3 X$ N. I$ `
  453. LDA #$01* h( B- H6 A3 ^3 l; Z# {
  454. STA $40162 A2 D1 B) G; [$ Y: k7 ~' T
  455. LDA #$004 D. I8 E. O, `' }  O; O
  456. STA $4016
    1 \  n4 t% Z# w- t* I
  457. LDY #$08
    8 U! ?: x# d& t; C
  458. Button_Value:
      Q/ H! i' c% c2 l3 w/ s
  459. LDA $4016,X
    ! m+ V* j: E* k+ g
  460. STA Button_Status,X# d8 x" w' d+ I. _  n: _
  461. LSR8 f8 n" d' Z; w  M1 Q6 ~2 [& I
  462. ORA Button_Status,X) F4 j  a6 q2 D/ E: ^8 G9 Q
  463. LSR4 m4 v4 @4 A4 J% ~* Y, @7 s
  464. ROL Button_Keep,X
    $ ]2 N6 b& C1 P! i, {# {1 u0 k$ g
  465. DEY( C7 `1 ~8 C3 u- n4 e
  466. BNE Button_Value
    3 Q( m* L! W9 p2 A% v8 u9 |' {
  467. RTS5 @5 x" S& e2 y& }' [  s
  468. + B6 g3 c( j2 ^
  469. ;==================================================
    6 x" f0 |4 R+ {
  470. ;按键自动按压& K6 c% b$ y; S7 h3 n& ^) ^! |) q) d
  471. Button_Auto_Press:
    4 F  Y: z' f- v3 S2 X% r' _' x7 v
  472. LDA Button_Keep
    $ T! ]/ g3 h+ Z3 D
  473. ORA Button_Keep + 1
    4 R9 J+ _' f6 @$ Q6 Z" H# Z
  474. BEQ Button_Auto_Press_End/ Q3 Z/ ?4 O5 ?# T6 W6 _. H0 W- W1 b
  475. INC Button_Auto_Delay# e* t5 K, I% S3 R
  476. LDA Button_Auto_Delay% c8 ?- o7 J7 p' K4 Q$ Z# ]1 L& r+ t
  477. CMP #BUTTON_DELAY_MAX' M. B4 C% V( r* b" X& S2 b- S) B
  478. BCC Button_Auto_Press_No_Active
    + \1 r: J3 m) M. U) }* p$ D
  479. LDA Button_Keep
    / p7 m. Z& F$ x1 J' ?* [9 i
  480. STA Button_Once
    ! x3 F" }$ A2 o9 j6 W' ]6 H4 }) }
  481. LDA Button_Keep + 1
    2 J) F% _7 C! N8 E# z7 c+ Y" P$ ^
  482. STA Button_Once + 1
    ( [3 k8 e- Z' s7 \' L3 ^" p
  483. LDA Button_Auto_Delay
    ; p- V4 K* k. u/ O) t
  484. SEC
    - U9 O  O& c  W
  485. SBC #BUTTON_DELAY_SPEED
    1 w6 Z  q2 L- q% B8 \+ h' Z6 l
  486. STA Button_Auto_Delay
    " U' Q* T1 }& o& V6 Q, l
  487. Button_Auto_Press_No_Active:
    1 c1 f2 O( q4 w/ L( t: h) D- K
  488. RTS
    * r9 _6 E0 Z7 m0 a0 A
  489. ;----------------------------------------
    & i; `8 R) l% V' ^9 G, Z8 S0 t
  490. ;未按压按键- |% F, D$ |# b% T6 H! b" c( g
  491. Button_Auto_Press_End:( C) y2 a! H8 Q9 m+ V) B& N) k& @
  492. LDA #$00
    ; F' O; u" K" F' n7 p6 R& Z5 y: S
  493. STA Button_Auto_Delay% n* d5 y& q! G
  494. RTS
    : S# E& S, c6 A2 I( I$ }$ b' R$ D
  495. ( R+ X2 J  d' C# f8 q# l2 `! Z
  496. ;==================================================
    ) p0 t# z1 c) ^' f
  497. ;设置PPU写入模式  o: d) X7 M+ O  }! j
  498. Set_PPU_Mode:
    7 Z4 z( q; L  H, J/ i; t
  499. LDX FC_PPU_Cursor
    0 Y6 v0 J  q+ ]
  500. STA FC_PPU_Buffer,X
    3 d3 d  ]. `1 \  Z) N( p+ I. u
  501. INX
      Q; ~# m+ U* t* z# d# i2 S
  502. STX FC_PPU_Cursor
    " V# u6 [- {. g& T9 O, Y8 Z
  503. RTS
    ( Y5 m# M* p, h7 f4 V1 v1 p; |

  504. 1 |8 [3 g9 r& f% k1 E5 g3 H
  505. ;==================================================7 h+ k; z+ d7 O% i  [
  506. ;写入单独一行文本9 e* e* d# T; {- M
  507. Set_Select_Addr:
    5 B% |9 y3 X8 @1 ?
  508. LDX FC_PPU_Cursor, k2 N) j( g' R9 z. |; Y4 j3 a
  509. LDA FC_Select_Temp
    4 ]* B: c: M# s5 E% i0 k
  510. ASL& H) Q& g7 `- @, v" S4 l  F: F) r
  511. TAY
    & D, [/ W3 j! _+ i8 `. N4 K4 |3 X: v7 ]& A
  512. INY' I# ?9 P; t  p+ m
  513. LDA Text_PPU_Addr,Y
    " A& \$ T1 p; [* a& z
  514. STA FC_PPU_Buffer,X. k% |2 h2 v1 l' v& Z
  515. INX  s! F/ h: \0 L
  516. DEY
    * o0 O4 j% F6 }& g- s! C
  517. LDA Text_PPU_Addr,Y) r$ K1 W  W) D
  518. STA FC_PPU_Buffer,X: q+ V# W0 r% Y4 Z7 L; g) o
  519. INX! u3 t% G3 j( E7 h1 [" A, G
  520. STX FC_PPU_Cursor% n& F, ~4 G3 h+ m% f1 v
  521. RTS
    ' B. M' j1 G- R  D+ }( q

  522. , W& _, c8 e4 [! ^5 a% z& J
  523. ;==================================================
    1 _6 b  \  C% p0 w  }! [1 A
  524. ;写入单独一行文本3 |/ _6 X: f1 d/ P
  525. Set_Select_Data:  E" D7 O: K9 K% N* H# a1 K- G4 @
  526. LDA FC_Select_Temp
    - ~; H/ b8 N! n# I  C/ l" H( I1 `5 {
  527. CLC0 W* }0 `; ^* `! f# S
  528. ADC FC_Page_Cur
    % I% o' K' C' K
  529. ASL1 a5 O2 u0 J, K4 m! s; G' t
  530. TAY
    ; G+ m9 m4 l# H- z# [
  531. INY
    , f# k4 M8 g" z( y6 ]& K. d. H7 A
  532. LDA Text_Data_Addr,Y' q7 g2 C- A' Y, X1 D1 x
  533. STA FC_Data_Port_A_H
    2 r2 b+ X, n7 E6 }8 g: V: ]
  534. DEY
    9 q8 A; H" L: Z, n0 U$ G# T
  535. LDA Text_Data_Addr,Y, @& u, z4 I& w2 V
  536. STA FC_Data_Port_A_L
    * d6 d7 M- y- t9 B3 |! J: G4 Q
  537. RTS
    ; {/ a! d, x( K( Z8 b8 ^' P7 M" U8 w
  538. ( z9 R: X) n) ]% L5 {1 m
  539. ;==================================================( E: k) s; s! j9 ~' o! r, Z, j
  540. ;清除旧文本
    + C, Q+ ]' U0 x: _
  541. Set_Select_Data_Clean:, B/ K  I6 j  F8 L) ]2 t8 h
  542. LDA FC_Select_Temp
      e0 y  g! M7 ], W5 {0 t# H' }
  543. CLC! U* m' F1 s! U1 s& g. k
  544. ADC FC_Page_Old2 p' u; a4 d( f. T! E% }
  545. ASL
    / c' p1 U8 N  b* o! o
  546. TAY
    # g2 T0 J! j) B* {
  547. INY
      t5 }$ L$ D# O! e
  548. LDA Text_Data_Addr,Y" P9 a. s, b# L: h, f
  549. STA FC_Data_Port_A_H
    7 s" X% j- \& x$ V/ k0 X6 ]" w
  550. DEY) i3 o! f! G# Y& A. S
  551. LDA Text_Data_Addr,Y
      K1 e& `/ I4 N* I- x+ p  u
  552. STA FC_Data_Port_A_L* U; _5 G+ L0 F) D3 O
  553. RTS
      C1 [, J1 v+ ]5 i, R6 k! ^
  554. 7 n2 d" @( d2 @
  555. ;==================================================% M; f( F2 f( D5 q  F4 E7 U
  556. ;写入单独一行文本
    & I$ h/ e& V( T1 S/ k
  557. PPU_Data_Write_Item:6 v1 O: f! G( p3 s2 C. _. ?+ H
  558. LDA FC_Select_Temp3 u9 q; g, e# b+ s; g
  559. CLC
    . |* }9 k+ ^8 Y2 R9 Y
  560. ADC FC_Page_Cur: f- l) h( z+ L" h+ M1 y* T
  561. CMP #FC_ITEM_SUM
    5 _% g' @7 }7 J& v& O1 N/ g6 q
  562. BEQ PPU_Data_Write_Item_Set4 D" c; o+ \6 z5 i) N* u% C
  563. BCS PPU_Data_Write_Item_End* E6 S& B. {* q3 @
  564. PPU_Data_Write_Item_Set:4 y4 [$ p* f/ b: X# d
  565. LDA #FC_PPU_MODE_CNTL
    3 Z# L& p) b! E+ O; k
  566. JSR Set_PPU_Mode6 o) C1 \1 J# X! |$ g  z2 _8 Z
  567. JSR Set_Select_Addr5 {: `# N/ j$ L6 \# R* W( T8 \
  568. JSR Set_Select_Data2 @3 d5 z+ t2 I6 @
  569. JSR PPU_Data_Write_Line2 R+ ]8 v) ?: s, O' I2 h& d
  570. PPU_Data_Write_Item_End:
      T! z& x- z+ a$ \* _" g, T
  571. RTS0 ^# I& C3 k" f+ b0 V2 i; E3 L; a
  572. + p) t) G/ ~3 |! f- C) Y5 s
  573. ;==================================================( X0 V1 W5 h% Y* f0 `
  574. ;清除单独一行文本
    * m9 d5 T: @! n+ i
  575. PPU_Data_Clean_Item:5 {) a6 W: {8 P  z$ U
  576. LDA FC_Select_Temp
    3 q8 C, `! i& q* k! W
  577. CLC
    2 e4 O9 m+ M( x1 x* I* S
  578. ADC FC_Page_Old  ~8 M4 _# J6 @9 k) u( B
  579. CMP #FC_ITEM_SUM0 F8 j  j" I8 y, O% l
  580. BEQ PPU_Data_Clean_Item_Set
    . f" `+ T! y0 l$ l
  581. BCS PPU_Data_Clean_Item_End
    4 f* o# L3 K* {
  582. PPU_Data_Clean_Item_Set:" |+ T) ]% }4 s+ e
  583. LDA #FC_PPU_MODE_CNTC# ^. X( H5 m( c6 h& C0 ^' z* Z; l  V, E
  584. JSR Set_PPU_Mode
    - k- [1 d' E2 Y1 ~; f1 g
  585. JSR Set_Select_Addr
      ]6 S& B! T8 y$ b. }0 o
  586. JSR Set_Select_Data_Clean
    1 [1 ^$ o5 d2 n1 r* _1 |
  587. JSR PPU_Data_Clean_Line
    , s' G: y  k9 n  ?9 [7 \
  588. PPU_Data_Clean_Item_End:
    / Z/ c2 W* C5 n
  589. RTS
    8 C: g# T% r0 `5 Q6 Y
  590. 5 p! F1 D+ ^& ^5 @
  591. ;==================================================6 f8 Y/ {$ j' \4 x
  592. ;页内容写入0 }4 V1 i) ?9 `( E, N7 v) {7 |  x
  593. PPU_Data_Page_Show:
    # R/ y+ n7 d* e
  594. LDA #FC_PAGE_SIZE
      k. ^0 f0 C3 V$ g
  595. STA FC_Page_Item_Count5 h  ~( r: G8 }. E2 _; ]
  596. LDA #$007 B8 f5 `" i$ t/ H8 Q
  597. STA FC_Page_Item_Buffer
    * K0 I1 o5 G( J5 H
  598. STA FC_Select_Temp
    * b7 ?: ]" m, t. S4 K4 K7 q
  599. PPU_Data_Page_Item_Set:3 Z" f+ [4 r0 W! ]. i+ ~
  600. JSR PPU_Data_Clean_Item$ x4 S1 S/ @3 J8 X1 e3 I
  601. JSR PPU_Data_Write_Item/ a% N: `# z; j9 {( y/ L1 E
  602. JSR Function_Status_Clean
    ( p4 \7 N; A1 R; {+ N) z3 l3 v
  603. JSR Function_Status_Show
    . t) o% M) ~# v4 `
  604. INC FC_Select_Temp
    + C6 p  y1 S# J5 Y
  605. INC FC_Page_Item_Buffer
    ) R+ f& f0 R( u3 j( B* u, w
  606. LDA FC_Page_Item_Buffer* F% y9 j6 [% ~( m
  607. CMP #FC_PAGE_BUF_SIZE
    ) U, J, i9 _* ]0 p
  608. BNE PPU_Data_Page_Item_Set_Check7 I$ U" L% o, D7 W% I  B) W  g
  609. JSR NMI_Delay
    / u- ~/ g3 Q; F* v, k& g4 @& W
  610. LDA #$00
    . j! g% d3 w3 n' `) {; K
  611. STA FC_Page_Item_Buffer" f! y, v! S( D5 y( z, Y3 y3 c/ v! H! n
  612. PPU_Data_Page_Item_Set_Check:
    ! T$ Q7 z7 ^9 j, I, b( C
  613. DEC FC_Page_Item_Count
    / G7 [1 i, W( @5 y* C' p
  614. BNE PPU_Data_Page_Item_Set
    3 V3 p$ E- J5 w1 F, C
  615. PPU_Data_Page_Show_End_Check:
    ( p% ^! X" |& n$ p
  616. LDA FC_Page_Item_Buffer! d5 C) Z9 G* ^, V9 t
  617. BEQ PPU_Data_Page_Show_End
    0 l+ @; d  h0 l
  618. JSR NMI_Delay3 u2 V- P' Z5 g
  619. PPU_Data_Page_Show_End:, C( S: H% E# K
  620. RTS3 f- o6 A$ s+ R
  621. 6 e4 c- E, g% q
  622. ;==================================================0 z& |6 s4 ]& f& H1 _% h) F; Z1 C
  623. ;PPU单行数据写入接口, C; W0 V" t  Y: n5 k* p  n7 @
  624. PPU_Data_Write_Line:9 E' |0 s4 K* N* E) w
  625. LDX FC_PPU_Cursor
    1 |3 d( f8 M! h# @; h) s- u7 W
  626. LDY #$00
    7 M0 [$ B9 o" U5 c- r, _
  627. LDA (FC_Data_Port_A_L),Y
    & I9 l* e. v+ \6 g) n! `
  628. STA FC_PPU_Buffer,X$ W3 i' L# R: D9 L5 E  \
  629. STA FC_PPU_Data_Cnt# I" o" @& x/ Q6 ]. p% l
  630. INX% |* E+ F$ a) U9 r6 h' P
  631. STX FC_PPU_Cursor
    , C$ P* g# k. m1 D' T# K
  632. INY
    8 h  M" f% a+ b& d
  633. PPU_Data_Write_Line_Set:
    1 q% r# i$ Q! K4 g1 v
  634. LDA (FC_Data_Port_A_L),Y6 q' r3 C1 E& N3 R$ }7 j7 a; P
  635. TAX. f* ~; i) z4 `' P8 [. c1 o% L: e
  636. LDA Char_Rom,X ) n4 D- t& Z( {& F% D. t
  637. LDX FC_PPU_Cursor$ x( Z+ p: m2 O. s6 x
  638. STA FC_PPU_Buffer,X
    - r3 ]* k- i+ c. p- f7 N7 `
  639. INX
    $ _2 w, @% [, X  g2 ~% ^* a
  640. STX FC_PPU_Cursor+ [' }  J- j* x7 M  u, D
  641. INY
    ) ~8 r& g" W  s. U  K
  642. DEC FC_PPU_Data_Cnt( A' n% l1 r; e. k% y; e2 E9 x- I6 L
  643. BNE PPU_Data_Write_Line_Set% n  T5 F' Y+ q& D/ v: C7 h& N
  644. STX FC_PPU_Cursor
    " ~  H; [$ I: I3 S1 L( p0 U/ r
  645. RTS
    ) d& R& c: A% ^, e

  646. ! U3 M6 p; _4 g7 k
  647. ;==================================================
    1 p' k4 j, D% u& V8 C7 ~( X
  648. ;PPU单行数据清空接口9 [: ^* w! \1 O5 V9 ]/ S9 \
  649. PPU_Data_Clean_Line:# w: G0 t2 [% q
  650. LDX FC_PPU_Cursor
    * z. ]' V8 Q5 `" F- `
  651. LDY #$00
    1 I& t4 Y, Z; ^
  652. LDA (FC_Data_Port_A_L),Y- H* Q; H4 @( j
  653. STA FC_PPU_Buffer,X
    , S+ v8 K6 x7 t5 n9 A! p; w6 v# y  H
  654. INX- ]% ]4 @8 B7 O7 e% q
  655. STX FC_PPU_Cursor" z+ j- x+ E/ Z3 w
  656. RTS# G6 [, d5 `# ^/ n) V  x

  657. 6 t5 B6 a8 a' H- d* q6 X: @
  658. ;==================================================" l/ k, x) s* ]" [% [
  659. ;更改选择项
    7 _, q* a1 J8 b( g( d
  660. Change_Select_Item:1 ]) U" n/ h6 h) w
  661. Change_Previous_Page:( q( O' L  S+ P, f4 T$ H
  662. LDA Button_Once% U$ M5 V! u  m; w% i/ n6 c4 G6 Q
  663. ORA Button_Once + 1
    5 J! h1 c; z* x1 Q) m# `% ^
  664. AND #$02
    % K# t2 p8 }6 H/ F
  665. BEQ Change_Next_Page& q  C3 y/ Q+ ^! W, Q8 u
  666. JSR Change_To_Previous_Page
    8 K4 h; B5 P) K, t) D
  667. Change_Next_Page:3 o) g9 v- ], Z+ p6 I
  668. LDA Button_Once4 d1 v& F2 `2 j" z, ]
  669. ORA Button_Once + 1
    5 }4 O9 ~  u+ A; ^8 ?
  670. AND #$01
    " @: M0 o+ h5 a4 ?
  671. BEQ Change_Previous_Item5 d* g5 h) X: t8 z$ h7 U, |
  672. JSR Change_To_Next_Page3 v1 W8 s6 h0 U9 D* V: i3 ?
  673. Change_Previous_Item:9 R1 u* a  r; [3 [' c6 c
  674. LDA Button_Once
    : o; E: l5 [, V4 {6 D
  675. ORA Button_Once + 1
    & g" A. c# C7 n
  676. AND #$08
    ' c2 p, x% g: H7 Z1 }8 ?
  677. BEQ Change_Next_Item
    ; |' o+ }, `' p  j$ y; d4 ]
  678. JSR Change_To_Previous_Item
    " @" u# G9 V) S" G* D& l1 C# A
  679. Change_Next_Item:
    + H* f% K2 L0 D; `& `
  680. LDA Button_Once6 o0 S: ~5 O1 \( h! t
  681. ORA Button_Once + 17 `, s: w8 j2 d' c, M. ^8 k
  682. .IF FC_IS_DOUBLE_PLAYERS/ N; p$ F9 R: _0 k( ]
  683. AND #$04
    - W- X# e3 w% v# Y+ B
  684. .ELSE
    : n% {% p6 c& [# v' e5 ?6 L$ D
  685. AND #$247 C' R0 X8 ~% @. ~
  686. .ENDIF
    6 k* E* Q% D, x. o7 l
  687. BEQ Change_Select_Item_End* [7 q( x7 B6 A5 {" V
  688. JSR Change_To_Next_Item8 y/ |! J& u( c' a; k! I
  689. Change_Select_Item_End:
    6 \3 k# x, Z/ s# M
  690. RTS2 ]# p$ O. z* O

  691. ! }7 D! S5 \6 A' V5 U
  692. ;==================================================) W9 l: S2 _6 d% b+ R4 Z9 e! o
  693. ;切换到上一个选项
    5 A4 N. S/ {; v
  694. Change_To_Previous_Item:0 k/ m9 z0 f) V/ [* Q1 O  B0 i2 E# `
  695. LDA FC_Select_Index
    2 W* U( m3 H- Z. K
  696. BNE Change_To_Previous_Item_Set
    ( F4 ]+ q4 }3 `! K+ M0 _
  697. ;----------------------------------------
    : f1 p7 {; ]3 L
  698. ;切换到末页最后一项
    1 K: ?1 L; x! d3 k: ?# G! s4 V
  699. Change_To_Previous_Item_Set_Last_Page:" k0 I4 ~% S. {$ @4 N: n/ u
  700. JSR Record_Last_Page_Index
    ( Y) t8 U( r; y" S7 Z5 k
  701. LDA #FC_ITEM_SUM4 b0 {% n: P& C8 d/ O1 f- S/ ]% q
  702. STA FC_Select_Index( A! j1 N) ~* t' l- [! G( z" F
  703. LDA #FC_PAGE_MAX) I- ]/ o+ ~( H# r% f/ C* V
  704. STA FC_Page_Cur" L  [$ I  T6 w3 a
  705. JSR Update_Page_Content
    ) ]" w5 @+ E4 P: {
  706. RTS! M% l# c5 J2 s1 Z& ~$ Q
  707. ;----------------------------------------5 T" N, c7 H* I, a- _
  708. ;切换到上一个
    7 H9 w5 q7 ]# M3 K6 n& |7 ?
  709. Change_To_Previous_Item_Set:) r( O1 J; b2 i8 _/ w
  710. ;检查是否需要换页# s& Q- x% i. @' X! ^) O9 F
  711. LDA FC_Select_Index
    ) P' \8 e5 P! c. s( d* u9 a" U2 }
  712. CMP FC_Page_Cur
    ; A! [  k4 ]5 \9 ^. ]+ t! K. p6 Z
  713. BNE Change_To_Previous_Item_Set_No_Page9 G( @) j- L8 c* v6 V: A
  714. ;----------------------------------------
    ( g6 _5 d$ y* w. u1 o. |* v
  715. ;切换到上一个(需换页)
    2 m: |/ e$ `# W+ r
  716. Change_To_Previous_Item_Set_Page:4 ^! P' I, `* u" M
  717. JSR Record_Last_Page_Index
    ; p/ q9 `: L3 T. z
  718. LDA FC_Page_Cur$ S6 Y! L' R  ^
  719. SEC
    ( _5 g# m: M8 Q  S& s0 U5 D
  720. SBC #FC_PAGE_SIZE
    6 k5 D3 n' Q# S
  721. STA FC_Page_Cur
    ! U4 R, C- b1 a! e: Q9 ]( w2 \7 S
  722. DEC FC_Select_Index
    7 O  g# V: h: E8 d) V  `8 j' P, q
  723. JSR Update_Page_Content7 w# o! G2 L, p& f( O
  724. RTS
    3 o; i7 I6 C% g
  725. ;----------------------------------------
    2 v1 G+ ~& c7 s0 ?! j0 h4 [
  726. ;切换到上一个(无换页)
    4 g- n7 [3 y" i% [
  727. Change_To_Previous_Item_Set_No_Page:) x/ Y! x. F: V; _' c1 G  k
  728. DEC FC_Select_Index
    * M, y6 w8 R0 n
  729. RTS3 A+ f0 g5 N/ r+ t
  730. & L+ q; g& r: f! `3 u
  731. ;==================================================
    ; r* I. T) X( I4 D4 ~
  732. ;切换到下一个选项1 f5 b: y* q/ `
  733. Change_To_Next_Item:, j6 j3 {! V* x- M
  734. LDA FC_Select_Index% |7 B, c  y! q1 J
  735. CMP #FC_ITEM_SUM- o; W& J! Y3 n0 v; G& I
  736. BNE Change_To_Next_Item_Set" a8 P, v! {. D/ {: x0 J) Y8 ^, Q
  737. ;----------------------------------------
    - |) C5 u; I8 w4 B
  738. ;切换到起始页第一个$ ^9 e0 N& E0 f8 r
  739. Change_To_Next_Item_Set_Begin_Page:" t- z. ]; Y0 L+ a
  740. JSR Record_Last_Page_Index& H9 L  h( ]* w! W
  741. LDA #$00
    2 \  h8 o$ a5 m! z0 d! x
  742. STA FC_Select_Index
    4 P  O3 f! u8 N1 ~! M3 z: m
  743. STA FC_Page_Cur. u! Q& n. P" n8 ?# t9 m
  744. JSR Update_Page_Content
    # }% n: {/ U3 K$ _, }4 d
  745. RTS+ D# k0 p5 C7 b  S+ n
  746. ;----------------------------------------
    4 r# Z, l- W. q- h2 I
  747. ;切换到下一个
    4 |- x5 h" [' s5 y1 z- n/ ~
  748. Change_To_Next_Item_Set:! @, |3 t) h5 G2 q
  749. INC FC_Select_Index
    ; l4 L, E: i  U5 G) ^
  750. LDA FC_Page_Cur4 }& @3 C" l1 P8 |4 k  o0 x9 e8 L: ]
  751. CLC
    . F, P0 ]& X0 w# z0 U$ d6 B
  752. ADC #FC_PAGE_SIZE! U6 V7 `% h8 `" S+ C! R
  753. CMP FC_Select_Index
    $ E2 ~& o: Y; R! s4 f& B8 `
  754. BNE Change_To_Next_Item_Set_End
    $ q3 _) e- ^5 ~* K( l
  755. ;----------------------------------------
      U# W* d7 g) [; p
  756. ;切换到下一个(需换页)9 @  `5 j% F8 K/ n. b/ i/ Z3 K7 M
  757. Change_To_Next_Item_Set_Page
    * G6 p1 c, a" u1 u5 _; F) H
  758. JSR Record_Last_Page_Index( a9 a" P) M: N0 I7 Q, c" r- V
  759. LDA FC_Page_Cur
    0 ~$ D0 v+ n( u# B  g7 n
  760. CLC
    4 i9 E1 c4 j2 C. }4 u# y
  761. ADC #FC_PAGE_SIZE$ V  Z3 O5 D6 h/ U
  762. STA FC_Page_Cur
    ' J3 _* f& c2 b3 ]" p
  763. JSR Update_Page_Content
    " Z+ I2 U$ h3 R1 k  W. H
  764. Change_To_Next_Item_Set_End:
    4 F& @- R3 O9 Y
  765. RTS
    ( `0 X  N1 F7 L( d+ }- g9 N3 m
  766. 9 u) e/ u: `0 I
  767. ;==================================================
      {. L/ m2 V+ T) ]) i+ W
  768. ;切换到上一页4 z3 p1 F3 ], G: I* U1 P
  769. Change_To_Previous_Page:
    ( h; |( A8 v- B) I- p0 _
  770. LDA FC_Page_Cur
    8 N5 [$ Q7 Q  l
  771. BEQ Change_To_Previous_Page_Set_Last_Page
    0 S8 @$ A7 G1 {& B$ K2 W( c% ]
  772. JSR Record_Last_Page_Index3 L/ X% ^4 K/ k+ v& I5 m
  773. LDA FC_Page_Cur+ w  o1 w5 L  M% P
  774. SEC
    , f* x: ]9 x8 _  a/ J
  775. SBC #FC_PAGE_SIZE7 s, `5 N2 P4 n
  776. STA FC_Page_Cur( E7 T& j" k* R  _( K/ B
  777. LDA FC_Select_Index' R0 d0 ^+ T( l' d% Y  Q
  778. SEC& ^0 W" d7 w8 l- q! N4 K
  779. SBC #FC_PAGE_SIZE
    . y$ {: W1 F1 K2 z+ C8 B' |1 v1 g8 o
  780. STA FC_Select_Index
    * H. I3 n) R# h* P6 |
  781. JSR Update_Page_Content
    ' d, ]. r5 u+ c% J
  782. Change_Select_Last_Page_End:+ V, V, S1 r$ d/ c& j4 }9 G  C! M7 E
  783. RTS0 O  k- R  ~# _* t# u! ^4 D. P
  784. ;----------------------------------------/ V) o1 p" F/ C
  785. ;切换到最后一页; I5 S  D: l3 w& v( V7 F' F
  786. Change_To_Previous_Page_Set_Last_Page:9 `4 m9 {; E( e4 g
  787. LDA #FC_PAGE_MAX. J& {8 ?. }( W4 @- @4 V
  788. BEQ Change_To_Previous_Page_Set_Begin_Item
    / e# v7 s& g+ y4 {$ c4 v4 T) v
  789. JSR Record_Last_Page_Index
    ; p5 E- b$ ~6 C" d$ j
  790. LDA FC_Select_Index
    : g" h6 o; q: x. L) {! R
  791. SEC
    6 j+ z! {! V3 x! X0 K
  792. SBC FC_Page_Cur
    ' M6 S) Z: n. {, s; _
  793. CLC+ R2 E0 n0 X# T8 f. P2 {4 k
  794. ADC #FC_PAGE_MAX
    + m1 r7 Y" ~  X; o
  795. STA FC_Select_Index
    ; y  b, \' Z" d6 z8 F; L- w* \, b
  796. LDA #FC_PAGE_MAX
    $ i. \7 x5 N" ^$ B
  797. STA FC_Page_Cur
    * k5 I2 ~; u6 M  v! Q7 f
  798. LDA FC_Select_Index
    / N$ {; r6 J1 a( x6 \
  799. CMP #FC_ITEM_SUM9 m! B1 e# X: p( `- Z9 E* J8 Z
  800. BCC Change_To_Previous_Page_Set_Last_Page_End4 O7 }; B) h# s  b' U7 k/ E) T
  801. ;----------------------------------------
    7 v: Z! {# E+ U1 k# b, G6 i7 I
  802. ;切换到最后一项
    3 F' W% c, ^2 l. |0 x
  803. Change_To_Previous_Page_Set_Last_Item2 f; p6 A+ E9 G' f/ W5 |
  804. LDA #FC_ITEM_SUM
    ) O. E$ D  K1 x5 }
  805. STA FC_Select_Index. a8 J- w' a+ G* k1 a; w
  806. Change_To_Previous_Page_Set_Last_Page_End:% ~, C7 ?6 o$ J2 {" `
  807. JSR Update_Page_Content/ S) T0 G! I; v: c; g
  808. RTS6 K" x+ L% S7 E+ d! N
  809. ;----------------------------------------3 m5 n% ?) c( n' G# a
  810. ;切换到起始项(最大页只有一页时)+ l* |2 O2 z% x  n( O
  811. Change_To_Previous_Page_Set_Begin_Item:
    9 e9 @3 j  R) U( s1 F4 e: p! Z
  812. LDA #$00
    % E8 [. j2 I# ?0 h3 D4 I3 U- E/ g- i
  813. STA FC_Select_Index
    & S# o1 f* L2 x; f" v
  814. RTS
    - W9 Q. d* r5 I" P7 h4 \' ~% j
  815. . h# }1 E6 _# f
  816. ;==================================================5 A+ L9 C; \/ C: ]: S7 o( R+ [
  817. ;切换到下一页% k/ M3 \0 b4 r+ R  X' a  ^- G" E
  818. Change_To_Next_Page:7 @# Y; |; w/ w# t
  819. LDA #FC_PAGE_MAX7 ^" v+ u" \4 I* B" t$ k4 @1 T0 H; g* k
  820. BEQ Change_To_Next_Page_Set_Last_Item
    % e  a( C( p& k' x# L
  821. LDA FC_Page_Cur
    " D  @5 g! a- e
  822. CMP #FC_PAGE_MAX
    - ^) c% B: m  m
  823. BEQ Change_To_Next_Page_Set_Begin_Page# C" v7 g" ]# ~$ J5 |# b2 P
  824. ;----------------------------------------
    : I/ e/ N; m6 _! D% g" \0 c
  825. ;切换到下一页+ L2 @4 w; O- |
  826. Change_To_Next_Page_Set:
    8 S3 U% r! ?) X( x& n) I; b
  827. JSR Record_Last_Page_Index
    4 \  P) d0 H, V  a
  828. LDA FC_Page_Cur
    4 z7 V. t* ^  w+ S9 m
  829. CLC
    2 g3 [1 R* Y9 L2 v) Z
  830. ADC #FC_PAGE_SIZE' L9 x" V: ^3 @! z# c$ {$ d- Y
  831. STA FC_Page_Cur
    2 S; M* k4 W) d" W% Y
  832. LDA FC_Select_Index
    2 Q; V) A$ Q( a+ s  t) N! p, Q+ ~
  833. CLC
    / z  L2 m2 A# m' D  z* [+ q
  834. ADC #FC_PAGE_SIZE( G$ p. ?  Q& i) e5 w
  835. STA FC_Select_Index
    9 S$ i6 M7 i' y7 ~$ G+ u( ], `7 B
  836. LDA FC_Select_Index- e$ O6 b5 g2 F- r
  837. CMP #FC_ITEM_SUM
    " _9 |/ S1 l( Y
  838. BCC Change_To_Next_Page_Set_End2 r6 B. F* C) u" v4 C" \- G$ t5 l
  839. ;----------------------------------------; ]/ u5 M& v7 K5 L' f" H. D$ K
  840. ;切换到最后一项
    ( j6 K* }' ^! m3 O" c
  841. LDA #FC_ITEM_SUM) _& Q. p2 W  d4 U1 C
  842. STA FC_Select_Index8 ^' D0 K8 a+ x9 |
  843. Change_To_Next_Page_Set_End:
    , d; z$ [  q  O# e
  844. JSR Update_Page_Content
    ( D; C9 [  k1 v: o  {' Y) @
  845. RTS" P: }* ^8 g. }8 a! Q
  846. ;----------------------------------------7 S  i6 }& T) g# e, o, w+ M) }+ b* p
  847. ;切换到起始页
    & W7 ]! v  [2 E$ l( L- T9 I1 ~
  848. Change_To_Next_Page_Set_Begin_Page:$ p. f4 f( n: h6 l
  849. JSR Record_Last_Page_Index9 L, l4 T( ?: H6 k2 K, \- v
  850. LDA FC_Select_Index
    + P  R- v$ v9 w/ W5 ~4 D- K+ H& y
  851. SEC
    % a* e9 A3 ]; V! x3 {5 a7 M2 w. a
  852. SBC FC_Page_Cur
    . O$ J3 `$ D+ B% }: T" x0 x
  853. STA FC_Select_Index! w3 I5 C' K2 b- _: r5 `
  854. LDA #$003 {; C1 A. }$ v4 Q/ F9 }8 @
  855. STA FC_Page_Cur
    : u1 Z1 L; Q9 b
  856. JSR Update_Page_Content
    8 L& Z, |6 i: f% c  R' x7 j! I/ y, v
  857. RTS
    9 X4 U' z) N! x8 h. p
  858. ;----------------------------------------, O6 k- b% E; n- W+ N
  859. ;切换到最后一项(最大页只有一页时)$ Y0 \9 [) g, Q% U
  860. Change_To_Next_Page_Set_Last_Item:
    8 @1 F* @, o$ J3 f* D+ M
  861. LDA #FC_ITEM_SUM* U! j! a0 S4 Z
  862. STA FC_Select_Index* X6 p, R' H8 n0 ?( O/ Y5 Q7 F
  863. JSR Update_Page_Content* L& @/ s1 A) f5 ?1 ?5 `- e; l  K
  864. RTS
    : W! M& r& h& A' Z  H6 V2 ]4 N& v
  865. / S; @. _1 y) I" T& V/ n
  866. ;==================================================
    2 \5 u0 r# k7 r. p
  867. ;更新页面内容
    0 z) x9 h5 V# o4 Q, ^4 C* o
  868. Update_Page_Content:. ]- U; N. N4 y& E
  869. LDA FC_Page_Cur$ N2 i- F3 L, |$ Q! i- b4 ?  I' e
  870. CMP FC_Page_Old
    : R- Q+ l8 \$ O; d5 Z  h; g" Z
  871. BEQ Change_Update_Page_End
    & m; m' S* c3 T# N+ h# T2 B7 }
  872. JSR PPU_Data_Page_Show& @) |# t& w  l
  873. Change_Update_Page_End:. E" w, k7 O2 J: j
  874. RTS
    # A0 A& ^! d6 O; `/ `6 O: p$ P& s
  875. 9 w7 v) D) [9 g+ P
  876. ;==================================================
    . ]* Y7 X( a" S7 s' s( L
  877. ;记录上次页索引
    2 m' q( J  q5 [8 M) d9 z0 z
  878. Record_Last_Page_Index
    4 |7 m3 p& J/ t$ L% p! D( G7 j" r
  879. LDA FC_Page_Cur9 K( @0 i/ d  J
  880. STA FC_Page_Old
    / P/ M3 j& p3 L* N* t
  881. RTS+ c( M: ]/ t; ]7 [
  882. / l3 r' O0 I# E7 q9 }
  883. ;==================================================- X& s, V8 X  w3 W7 w. V+ T
  884. ;显示当前选择项光标
    : a4 M& J& M5 L: w1 H, j
  885. Show_Select_Cursor:& k! e* i5 F7 y
  886. LDA FC_Select_Index' F% j! W; ^* X6 H
  887. SEC* g1 ^6 _$ Y3 M+ F* G
  888. SBC FC_Page_Cur
    7 z! u6 R$ h2 O( e( E, E( s3 Z
  889. ASL) j  D) G$ Z8 u/ c1 p  d
  890. TAY
    0 H2 o! w$ S5 k, R) U
  891. INY: m& Q) ]+ }$ [# l! f
  892. LDA Text_PPU_Addr,Y2 W4 r6 x$ b6 H- @3 l4 \: E, m
  893. AND #$038 f# X5 O; }" U2 R
  894. STA FC_Cursor_Addr_H
    / Y$ ^$ b5 g5 {9 {9 r
  895. INX- i5 s* F8 U; L2 {* g
  896. DEY
    # z) ]0 X( I9 W. T; l
  897. LDA Text_PPU_Addr,Y8 W* k. N5 N4 e1 F; H2 \/ K
  898. STA FC_Cursor_Addr_L/ G: }/ ]  y- i- ?, c- x3 V2 S0 e
  899. ;----------------------------------------
    $ v8 u" q" X& S  a4 u4 Q8 M1 X. A' V% l
  900. ;计算光标X坐标
    5 a0 ~6 l% o! t- g! p" k+ q' V
  901. Show_Select_Cursor_Set_X:
    " f  X) Q! l+ t+ _
  902. LDA FC_Cursor_Addr_L
    8 e7 ^  q5 H& r  t' P$ @
  903. AND #$1F% m2 I) L4 m& U6 [
  904. ASL! V6 Q' |1 z( e6 w( \/ d9 F
  905. ASL
    ) r+ r* y' A/ W2 z: B3 P
  906. ASL
    ' w3 l2 `) I( Z# U
  907. STA FC_Cursor_X
    0 M& o; `; h0 V5 |* z
  908. LDA FC_Cursor_Addr_L* B0 b) P8 g9 a* B6 N  @
  909. AND #$E0
    ! _& F) p* f/ ]- ^4 q1 ~
  910. STA FC_Cursor_Addr_L
    # b7 O0 A! d4 x& u
  911. ;----------------------------------------5 m' {" ~+ Q& D! H) w4 t
  912. ;计算光标Y坐标
    0 C. v7 r) S2 u) d& C# Q
  913. Show_Select_Cursor_Set_Y:' ]0 j$ w# D& @, W/ y& V
  914. LDX #$05
    3 X+ h% k, e; u; z; ?5 x) y2 N
  915. ROR FC_Cursor_Addr_H3 o/ F* f7 [+ I$ H3 |' v
  916. ROR FC_Cursor_Addr_L: v  f. _6 `2 t- z* T. ~9 ?; k) b: v
  917. ROR FC_Cursor_Addr_H7 y% l9 \1 i, B! i! v: q
  918. ROR FC_Cursor_Addr_L
    ' [' `. D9 W6 `
  919. LDA FC_Cursor_Addr_L
    & Z! L' q2 e1 H8 k$ T
  920. STA FC_Cursor_Y
      @5 L' b* A. R) w5 s: ~% u; C* Q
  921. ;----------------------------------------4 a) I0 C$ ?  C- h* q6 Q4 i
  922. ;写入光标
    . c" }, t' [. q. Q' O9 s. v# l1 O
  923. Show_Select_Cursor_Set:
    7 \: _  R" ]+ R
  924. LDA #$00% x7 m, X1 L$ o6 V+ p( S
  925. STA $2003
    9 |! P+ e* Y) C' i1 {6 K
  926. LDA FC_Cursor_Y' n% n$ r1 c( v% `$ \, d! F
  927. SEC
    4 Q' s; T9 p' b5 A8 ~; ^3 r
  928. SBC #FC_CURSOR_OFFSET_Y
    ) E" C: U, T" I& B+ }( t
  929. STA $2004
    4 Y3 i& C/ a, N& q( k5 \
  930. LDA #FC_CURSOR_TILE; f5 l% L+ D- _8 C1 w4 n
  931. STA $2004/ }; x' t6 H" g
  932. LDA #$00
    1 S1 Y) b  h8 C. T/ ~! h: m
  933. STA $2004
    0 a) l; t2 ^* C: @7 P4 n
  934. LDA FC_Cursor_X
    6 @9 w& ^, o% M2 f% K- b, v, ]
  935. SEC# C9 H2 \* \$ x' T4 `
  936. SBC #FC_CURSOR_OFFSET_X6 J8 ~' j( r% t& y+ W) ~; l
  937. STA $2004
    * E8 n2 n* G% d# o
  938. RTS: q, u! s; d0 h! m
  939. , @+ u+ x) z+ l5 ~- {/ Y
  940. ;==================================================! m* l7 m0 F& ~* t* E4 b
  941. ;切换功能
    0 J& Z' c, w' Q
  942. Change_Function:
    & _2 f# Q8 o% k
  943. ;----------------------------------------" t6 i8 K  x* y* g3 j; ?
  944. ;开启功能A
    - \+ X+ u( P. [$ C/ y) z3 O7 z
  945. Change_Function_On_A:: @6 F2 u' D5 x% `/ {$ b, U) v
  946. LDA Button_Once- ^/ G- ^# a& U, g
  947. CMP #$40
    6 ~# F$ T# F4 g" m* e- S
  948. BNE Change_Function_On_B
      _6 J+ m- n0 ?0 i. Z
  949. JSR Change_Function_To_On_A
    3 T% F+ D# P9 v( G( l2 w
  950. JSR Function_Status_Update/ _! U7 c3 H) A1 r! ~# G# q
  951. ;----------------------------------------
    9 D  ?$ J6 s3 K; A& P
  952. ;关闭功能B
    * G; A9 k. ]0 T# t( s6 J
  953. Change_Function_On_B:
    6 D% F  O3 ]6 m! I( T% G
  954. .IF FC_IS_DOUBLE_PLAYERS
      ], b+ ~) `1 f- Q: d( X0 W! g
  955. LDA Button_Once + 12 u% H% u; j% x: k
  956. CMP #$40
    # j6 U. u. p/ r: t: S" M
  957. BNE Change_Function_Off_A
    & _2 I7 R+ Z# z! h9 }
  958. JSR Change_Function_To_On_B# ?! T: m  r; z1 x
  959. JSR Function_Status_Update9 Z9 h6 g% w+ B
  960. .ENDIF
    8 C- N0 c; j0 ]! Q- b/ @/ p: f
  961. ;----------------------------------------
    2 \$ c" |1 g2 v: J
  962. ;关闭功能A
    # M& C3 i5 B4 L% U3 I5 E' g
  963. Change_Function_Off_A:
    " t  Q. F1 n* b, h
  964. LDA Button_Once. c/ Q. B/ N' i! p( l7 g
  965. CMP #$80
    3 h6 p7 L+ ^$ Z1 F
  966. BNE Change_Function_Off_B
    5 @% j& z( A8 i7 a8 z0 ]
  967. JSR Change_Function_To_Off_A0 E. J: G4 V, {4 Q
  968. JSR Function_Status_Update
    2 }0 @; m9 U0 P3 X& j
  969. ;----------------------------------------8 L* b5 n, D9 Z2 J( m2 w5 u
  970. ;关闭功能B9 _) U- ~- A, G! T* @. J
  971. Change_Function_Off_B:' g% X; ]7 w6 a5 v0 z
  972. .IF FC_IS_DOUBLE_PLAYERS
    % N1 C( M2 e5 D7 ]' X
  973. LDA Button_Once + 1
      E; A. |8 e( J) L
  974. CMP #$80
    6 m0 ]( Q& ~, ]) _
  975. BNE Change_Function_Swap1 _  U% A* X. m$ n8 q! S5 f
  976. JSR Change_Function_To_Off_B* K! q( v! {# I* [3 x6 x
  977. JSR Function_Status_Update: v" i2 e" ~. A9 B) ]8 W3 `
  978. .ENDIF8 x4 o5 [" p6 i5 {8 S
  979. ;==================================================: v# `" M, X" d% b+ D% }3 a' V, W
  980. ;交换开关3 x5 t! r+ P( K. W( l  n3 C
  981. Change_Function_Swap:
    , P0 ~& I# T$ h" L+ \
  982. .IF FC_IS_DOUBLE_PLAYERS+ Z% p# K7 t  d8 H0 W! B
  983. LDA Button_Once) S6 R  y& ]: x/ N& M& c/ H. U) q' G
  984. ORA Button_Once + 1
    , V' b+ P9 F2 c* Z1 d( H
  985. CMP #$204 w: V. j- g6 @" @" Y% _' g
  986. BNE Change_Function_End
    4 `; [/ L9 u3 e9 Z$ s/ T
  987. JSR Change_Function_To_Swap
    $ _1 a( _1 @" s  \2 m
  988. JSR Function_Status_Update
    - K# t9 x* O8 E% M" H1 S' O
  989. .ENDIF$ r0 [" Y; i$ H  m6 ~' {/ P
  990. Change_Function_End:$ Q0 q6 T! @5 x6 F
  991. RTS
    & Q3 p1 A& w9 n. {& m

  992. * Q/ ]& F! L5 Q+ k# \( X, m* o7 k
  993. ;==================================================2 ?, U( U' O+ P7 _) d
  994. ;交换开关状态
    * y  _9 u, n1 T- {
  995. Change_Function_To_Swap:% ^6 [! m! P" a8 F$ I* k
  996. .IF FC_IS_DOUBLE_PLAYERS- ~. e$ l4 T" z; _; `( |2 N
  997. LDA FC_Select_Index+ N( g4 l, H" h0 Z9 E
  998. SEC
    ! o- a3 p( R0 E  t; o! V; I
  999. SBC FC_Page_Cur
    , F1 {1 r5 v8 F( l0 J& q
  1000. STA FC_Select_Temp
    6 B: E2 m9 K" R2 m. A: t- d0 m
  1001. JSR Set_Function_Port0 ~# x2 {1 z6 c
  1002. LDY #$00
    1 M0 Q. ]5 P. U* i
  1003. LDX FC_Select_Index: |7 i9 f/ e" h& G+ T
  1004. LDA (FC_Data_Port_A_L),Y
    9 F( L- k2 X9 X2 {. w! I1 d' `8 N
  1005. EOR (FC_Data_Port_B_L),Y% G6 N; r* }9 _/ h) U
  1006. AND Function_Check,X% `# l& `; N' ^! c* A* |
  1007. BEQ Change_Function_To_Swap_End& j7 |0 i! T6 |8 o- [
  1008. LDA (FC_Data_Port_A_L),Y7 u2 F  V- T( V& b
  1009. EOR Function_Check,X
    $ U8 ^) L1 `# I1 a( c$ b
  1010. STA (FC_Data_Port_A_L),Y
    " X" d" @2 f, H* J7 b
  1011. LDA (FC_Data_Port_B_L),Y5 t- ]: ?# Q2 ]% x
  1012. EOR Function_Check,X
    + W3 e( \' V8 o0 e  Q& T- ^" b
  1013. STA (FC_Data_Port_B_L),Y( m' C( b6 a  N& D- K& e; m8 Z
  1014. Change_Function_To_Swap_End:
    & T9 m* U0 d1 r7 P8 d4 X/ ]/ e
  1015. RTS/ C+ `6 k* @) E5 y7 U0 v0 ]
  1016. .ENDIF
    4 ?4 x2 _6 }# @1 ^8 M
  1017. 6 M. W; {$ G* L: F8 ^6 L
  1018. " g+ w% u5 _8 s$ X$ T
  1019. ;==================================================
    1 F( y9 ]' q! f1 a9 E
  1020. ;更新功能状态9 ?* G" F; U7 G
  1021. Function_Status_Update:
    : v& x. @9 F8 s" P# X8 Z' e; r" x! p
  1022. LDA FC_Select_Index
    ; n5 q' l9 I) @
  1023. SEC
    0 y- J' t$ e. C2 h7 J  c
  1024. SBC FC_Page_Cur3 T6 Y7 K6 ?7 I. g5 o6 W  r6 o- q
  1025. STA FC_Select_Temp' N% r5 L$ }2 U& r$ I" d- @
  1026. JSR Function_Status_Show
    2 z) x5 n& d8 j- U7 t4 i
  1027. RTS$ A1 f& ?( p& Y, r' m8 b
  1028. 8 C9 ?0 K0 @, O4 a$ Z
  1029. ;==================================================7 f# O& g9 q' [9 p/ g2 `
  1030. ;设置功能地址端口; l, E* O$ q3 Q; h5 S8 X
  1031. Set_Function_Port:0 d9 r  A" `- U) \0 M* c
  1032. LDA FC_Select_Temp/ D# a, S( f8 J# c/ t/ m9 `7 i
  1033. CLC7 P+ g4 Q7 ~, p# A* R" k7 u# h* L
  1034. ADC FC_Page_Cur$ g. F  m; m* ]  F; A4 v  @* C
  1035. ASL
    & `$ i" [9 G$ L$ l" ?
  1036. TAY' b  l0 B$ j$ [- q
  1037. INY$ N# e! g* N' ]' a4 o: e
  1038. LDA Function_Addr_A,Y+ o8 }7 X* x9 j+ s. ~
  1039. STA FC_Data_Port_A_H, W4 c' }3 {" D+ }( p
  1040. .IF FC_IS_DOUBLE_PLAYERS& k8 C. H7 v: m
  1041. LDA Function_Addr_B,Y
    8 x% a3 T+ }$ z
  1042. STA FC_Data_Port_B_H
    - I: b6 J! p; `# [
  1043. .ENDIF) \4 b* @# I( [- c4 u$ W
  1044. DEY) ?  G4 x0 t3 N4 }5 ^6 D
  1045. LDA Function_Addr_A,Y
    ( J) t' j/ q6 u- Q& z! e
  1046. STA FC_Data_Port_A_L) }0 F2 `% `4 ]
  1047. .IF FC_IS_DOUBLE_PLAYERS
    " H) F0 [8 _( G/ p! F4 }, G
  1048. LDA Function_Addr_B,Y
    # R- c, [$ Y3 ~( J  }& ]' c
  1049. STA FC_Data_Port_B_L
    + e, y% T5 [  s0 W6 _5 g
  1050. .ENDIF
    " o4 R; z7 n  M. b& s9 a
  1051. RTS
    ' {# a( e6 b5 ?( \& w7 ?2 a" s5 x/ p

  1052. ( P9 x; B$ {" Z9 g1 f' c* ~
  1053. ;==================================================; M9 N$ ?/ q0 r5 V( H# m4 c
  1054. ;设置功能临时索引+ y  b: W; ?4 b9 Q
  1055. Set_Function_Temp_Index:
    ( M8 G. ~6 f, M& m. \
  1056. LDA FC_Select_Index
    5 u$ x& X3 F6 p, }( M
  1057. SEC. P9 b: p! W: S6 c0 x9 F( u
  1058. SBC FC_Page_Cur
    % ~% M7 X9 I0 w6 F5 T. M
  1059. STA FC_Select_Temp7 ~4 _3 p4 h, T$ j
  1060. RTS
    & T  `2 i& h1 V  J4 b) w
  1061. % f1 F7 L, c0 x5 [4 g6 D7 g5 a: ]- G; l
  1062. ;==================================================
    ! X8 G' J9 L' F5 k& P8 Z
  1063. ;开启功能A8 t! F) `5 v; E7 f
  1064. Change_Function_To_On_A:7 A  r( p( i: H
  1065. JSR Set_Function_Temp_Index$ k& Y9 ?) l- R5 ^+ V
  1066. JSR Set_Function_Port
    8 U, r; N3 i( v1 x7 r, S! r
  1067. LDX FC_Select_Index
    ! ?8 @# {5 z% x" i) ^
  1068. LDY #$00
    - x" K# X+ m0 [3 i/ v
  1069. LDA (FC_Data_Port_A_L),Y
    . U) k4 N/ L5 E9 n( w
  1070. ORA Function_Check,X! l& x4 b; g; }1 j  u3 i* m2 |7 ]) }
  1071. STA (FC_Data_Port_A_L),Y
    - C3 Y7 M3 A# N9 r: S' ?2 K
  1072. RTS
    ) U* ~+ D" n3 o" V
  1073. ;----------------------------------------
    ; I1 H6 m) e/ G+ [
  1074. ;开启功能B
    ) k+ k8 v# ~5 z) C
  1075. .IF FC_IS_DOUBLE_PLAYERS3 e/ _$ M# j7 }" A: W6 Z( I8 I
  1076. Change_Function_To_On_B:
    7 r8 R% l" O* i' C/ m/ {
  1077. JSR Set_Function_Temp_Index5 h& @9 H* R/ D! A4 Z: V( E
  1078. JSR Set_Function_Port$ [2 J5 ?0 \) y" A, ~0 ~  S9 `
  1079. LDX FC_Select_Index4 V# B/ R5 v& t
  1080. LDY #$00
    - y4 n9 S( ^/ J0 W. W: |3 ~% [
  1081. LDA (FC_Data_Port_B_L),Y3 A9 d  U& e) k( w. g! M
  1082. ORA Function_Check,X
    / v7 l: ]! A6 N0 E6 B0 ~
  1083. STA (FC_Data_Port_B_L),Y
    4 n# }9 w/ b: x; s, l
  1084. RTS
    ) a, E: m, a5 e7 N
  1085. .ENDIF* Y. D) o1 l4 ^/ b
  1086. ;----------------------------------------
    ; Y, `9 k* _7 H# M
  1087. ;关闭功能A
    . Q' f) d0 Y! b$ a, S
  1088. Change_Function_To_Off_A:2 A; v) X6 k+ M- T6 c$ U
  1089. JSR Set_Function_Temp_Index4 h6 @( t& q* T( ^
  1090. JSR Set_Function_Port
    , c# Q0 R7 o1 j4 h
  1091. LDX FC_Select_Index3 T; j/ L" w3 F5 n# S7 l
  1092. LDY #$00
    6 Y0 U! ]9 V+ m3 w0 l
  1093. LDA Function_Check,X
    7 U( A1 h0 K! Z% o+ C6 |
  1094. EOR #$FF
    . I' h8 D. k2 {- U
  1095. AND (FC_Data_Port_A_L),Y
    5 U3 m- B# F) m; r4 `0 u
  1096. STA (FC_Data_Port_A_L),Y9 i- N2 n6 ^8 l8 `
  1097. RTS' U6 S" q+ a( t/ N1 P. G, o
  1098. ;----------------------------------------6 K# m" N( }3 f, c2 h% |
  1099. ;关闭功能B& g' N/ x8 y+ K
  1100. .IF FC_IS_DOUBLE_PLAYERS
    - p) v5 A4 W/ p9 t8 f& J- v, ~
  1101. Change_Function_To_Off_B:* M- I5 a0 S$ j. t
  1102. JSR Set_Function_Temp_Index) Z4 ?- B2 ]& X1 K
  1103. JSR Set_Function_Port
    1 p" e% t5 G- ^9 Z7 W
  1104. LDX FC_Select_Index
    ; q7 p$ C5 ?8 {9 s1 C4 Q
  1105. LDY #$007 \/ E: k1 D  F; C  O8 H
  1106. LDA Function_Check,X; D( \2 m2 \! a4 v. c6 H9 h5 T
  1107. EOR #$FF; f+ \- L+ X% m: r% V' C& V( \) b
  1108. AND (FC_Data_Port_B_L),Y4 ^9 T$ M3 Y" c& @4 P
  1109. STA (FC_Data_Port_B_L),Y3 {( s5 O9 o, }) j8 C
  1110. RTS
    3 U6 w, B$ F% O0 ~* C( b" b
  1111. .ENDIF
    8 B2 V" i0 ], U/ O+ u2 b
  1112. ) E" D) i& d" }9 {$ ]( P
  1113. ;==================================================0 v! K. T% b" W( ^) o
  1114. ;设置功能状态PPU地址- R% ^: R0 G- w* o" Q
  1115. Set_Function_Status_Addr:' l; o- r4 h) G' E# a4 O( w
  1116. LDX FC_PPU_Cursor
    ) q9 m# ~- o: M: L
  1117. LDA FC_Select_Temp; V2 t6 c% f' w' u8 Q2 I6 M! S
  1118. ASL8 Q3 ~( C3 U# N* d
  1119. TAY" J3 F# B& @) h& o( D
  1120. INY
    . v- H% T9 @2 c/ }* A
  1121. LDA Text_PPU_Addr,Y
    . h0 i) x# S7 I1 t1 a
  1122. STA FC_PPU_Buffer,X
    - y  l3 [7 B) _1 b( M
  1123. INX
    + h7 x' @6 |1 [7 w+ ]/ W0 h
  1124. DEY
    9 {9 X( ^2 y& n2 a' I1 ~9 R
  1125. LDA Text_PPU_Addr,Y
    / b: k# Q8 ]) y( p/ u8 e
  1126. CLC0 U2 G8 L* v- i0 O* O& i
  1127. ADC #FC_FUNCTION_OFFSET
    - ]3 R" Q8 |/ D& }. e, }
  1128. STA FC_PPU_Buffer,X" q5 }' d/ |: Y1 H& ~
  1129. INX2 Y# r% L# ], N7 S9 [3 _5 J6 n
  1130. .IF FC_IS_DOUBLE_PLAYERS2 ?8 N7 ], C: f$ ~& g1 _
  1131. LDA #$02
    ) Q/ p4 [, I3 u, u3 |* A
  1132. .ELSE. o3 q. o+ N" }# h# H+ C9 @! S
  1133. LDA #$01, t7 \: t, W- [6 w  L! N
  1134. .ENDIF
    5 ~3 h8 T, ~9 F. c
  1135. STA FC_PPU_Buffer,X6 ?* d& C3 T" }6 C
  1136. INX
    " H( q0 p/ Z+ U
  1137. STX FC_PPU_Cursor4 n- {0 ~8 L2 F$ r2 ^* o+ n  ~$ V
  1138. RTS
    - }1 v% m) b$ C: n
  1139. 9 a2 }2 W# c, Q- P, b9 h# x
  1140. ;==================================================, J/ {9 ?% f8 E9 o, _& q
  1141. ;获取当前选择索引
    0 _5 k) Z& ^8 }/ x1 X, Y. T( @7 A
  1142. Get_Select_Index:' b8 B% T# D, |/ `. e3 N
  1143. LDA FC_Select_Temp
    7 E: z# U- {6 R2 n4 s
  1144. CLC. |' v! U6 i8 v: i
  1145. ADC FC_Page_Cur6 [  E: w, `* e' R/ F" H
  1146. TAX' a/ I- B- l1 N
  1147. RTS
    # A1 \5 `) `- k) ?) a
  1148. " Z8 ~) Z+ M4 q# C
  1149. ;==================================================/ o" n2 t6 R3 B3 t8 W  ?4 x, E5 Z
  1150. ;清除状态文本
    & U) @4 c& \+ ?
  1151. Function_Status_Clean:
    % _3 J8 Z( \; m7 K3 A9 ?, g! `
  1152. LDA #FC_PPU_MODE_CNTC: l  [7 Q; `% D# v* `
  1153. JSR Set_PPU_Mode
    + x1 M6 p5 L+ Z0 }# H/ W; i
  1154. JSR Set_Function_Status_Addr
    ) r) [) q4 N  _' W9 }8 G& w
  1155. RTS5 s  M* m) M- T

  1156. ; X) Z9 c- L; x  p; `$ r% b
  1157. ;==================================================
    4 U9 L, l4 {6 d$ E8 k: K/ j' j$ Q
  1158. ;显示开关状态
    7 Q9 T# b0 j: z  X
  1159. Function_Status_Show:
    % e9 ?& f7 A& |7 ?) K
  1160. JSR Get_Select_Index) E8 z3 z2 p% |) _8 F
  1161. CPX #FC_ITEM_SUM  m, b+ A0 b! \+ t+ A
  1162. BEQ Function_Status_Show_Set9 [0 W8 @% I; \7 n$ c
  1163. BCS Function_Status_Show_End$ i% [; }- r6 f# o4 o
  1164. Function_Status_Show_Set:9 p0 h) V4 H- C5 c: V' c
  1165. LDA #FC_PPU_MODE_CNTL
    : ]; p: A0 J5 e, _) X: T2 b/ V" V0 B
  1166. JSR Set_PPU_Mode6 m4 g. V3 N  m8 B/ v, \0 {
  1167. JSR Get_Select_Index/ A3 c& A% ?. D0 h6 L8 p
  1168. JSR Set_Function_Status_Addr
    + w  w3 l4 p" M
  1169. JSR Set_Function_Port. r7 p  T# X6 w$ U! l
  1170. JSR Function_Status_Show_Check_A0 J% M) R* S: Z# p3 m
  1171. .IF FC_IS_DOUBLE_PLAYERS
    1 f: F+ i" J- @& Y+ R% D) f
  1172. JSR Function_Status_Show_Check_B
    ; D# [- ~' b) r. c+ l* {0 [
  1173. .ENDIF
    $ |3 J4 t9 h% ]( D4 i
  1174. Function_Status_Show_End:& M6 D' K/ C* G) l
  1175. RTS& v( ^* d  p$ U( ?/ `' {
  1176. ;----------------------------------------
    0 t) [1 W$ C( _* V3 N- W! @/ P/ P
  1177. ;检查功能A状态& f: K+ p4 X# z  p/ v; j
  1178. Function_Status_Show_Check_A:3 W- U+ `7 k% a5 a/ ]; c4 y9 s4 u
  1179. JSR Get_Select_Index
    3 x% T3 b( C6 P0 Q
  1180. LDY #$00+ w9 e5 |. h$ L$ U( }* W7 \9 W6 D
  1181. LDA (FC_Data_Port_A_L),Y; a/ ]! _) Y1 f/ R+ {/ [2 A! F) W
  1182. AND Function_Check,X
    ; A) x4 W4 G0 b, t! \: ^4 S3 `7 Z
  1183. BEQ Show_Function_Status_Off
    0 R6 d2 C2 y8 b' Q  V) L
  1184. JSR Show_Function_Status_On1 G' q4 b. K0 N+ [8 Z
  1185. RTS) l' Z, u. Q9 u6 L* ]1 H
  1186. ;----------------------------------------+ G5 R! V  _) l4 R9 f$ \
  1187. ;检查功能B状态
    : c! P' y7 T& k  v5 k1 c. K& b
  1188. .IF FC_IS_DOUBLE_PLAYERS! }! z1 i# o6 @5 b7 I+ J
  1189. Function_Status_Show_Check_B:3 n5 k! {3 I# E3 n% \* ~3 n2 z' b
  1190. JSR Get_Select_Index/ T4 |2 P, _" L/ |9 v6 T6 F8 h9 @
  1191. LDY #$00
    5 p- F. h; r; u9 N, M: u" }& x" p
  1192. LDA (FC_Data_Port_B_L),Y2 t2 [: O1 q- P. i! M* j8 X, Z
  1193. AND Function_Check,X
    ( m/ w/ y6 F9 W. L! V' J
  1194. BEQ Show_Function_Status_Off
    0 m# e! I. d: s) w/ S( u5 Z
  1195. JSR Show_Function_Status_On
    8 h/ F& c! S! @/ v# N7 f* y
  1196. RTS
    / A. j8 m/ X- ?: X; d
  1197. .ENDIF% O! Z7 I' a0 @; k% [3 U7 n

  1198. # U1 O$ ~6 R. J
  1199. ;----------------------------------------
    ' J- g% j7 X+ `6 L3 S$ @) U" u
  1200. ;显示功能开启状态
    9 V" J8 f4 J+ a- D9 T6 r3 R& x7 t
  1201. Show_Function_Status_On:
    . i- [; o" d) Z  j2 j. C
  1202. LDX FC_PPU_Cursor
    ) k0 `2 k! E, Z* }  [
  1203. LDA #FC_ON_TILE5 c9 Y+ ?$ v1 F4 R& G3 @6 m
  1204. STA FC_PPU_Buffer,X
    ) ^. V3 ]$ O5 w6 b' u
  1205. INX$ p$ p" x5 I  y1 }7 ~
  1206. STX FC_PPU_Cursor3 U( ^4 c# P7 B+ R/ B
  1207. RTS
    , r% h  ~9 B. I
  1208. ;----------------------------------------
    / `9 _# g  {5 h2 R/ O- A
  1209. ;显示功能关闭状态
    ' v8 N+ {: H; |5 s$ n
  1210. Show_Function_Status_Off:
    $ A& H7 U% ]+ l2 A. ~8 b% M4 q
  1211. LDX FC_PPU_Cursor
    . t8 u! a$ W. H8 X. R
  1212. LDA #FC_OFF_TILE. b0 d: Q3 k) F* F0 @
  1213. STA FC_PPU_Buffer,X6 I$ v" {2 R3 c* w; b' O1 J* p
  1214. INX
    - ]) ?) ?0 a' {, z. W! P  z
  1215. STX FC_PPU_Cursor
    0 J' h: L& |; v# F$ Q
  1216. RTS
    . w) S" @9 {+ o2 K

  1217.   s' W+ F6 P& z* {1 W1 w1 S& C- Q1 o6 f% Y
  1218. 7 _, D6 H& l5 r' Z+ Q3 n# M
  1219. ;-------------------------------------------------------------
    , Y/ ?. }% c3 _/ j# c3 t
  1220. FC_Data_Copy:    ;数据拷贝参数设置" ~+ a; T4 z% E0 a
  1221. STX FC_Cpy_Port_L
    $ N: }' {* ]4 d& L6 O2 m' T
  1222. STY FC_Cpy_Port_H
    2 ~; l% @5 k# v% N. p# ?
  1223. LDY #$00
    ( V$ u6 @( |: H. o5 a! j
  1224. LDX #$062 Y+ M1 e6 V! e6 l
  1225. FC_Data_Copy_Addr_Set:    ;从指定地址读入参数5 r0 G: M* t$ R; ?3 ^( R
  1226. LDA (FC_Cpy_Port_L),Y
    9 C4 A4 c( ]. ?2 P9 }. d
  1227. STA FC_Cpy_From_L,Y" S9 y- l: E: o5 e( v5 A$ X! y  w
  1228. INY
    4 R0 |1 l# D6 J
  1229. DEX
    ( ]5 _7 U, B8 l  k
  1230. BNE FC_Data_Copy_Addr_Set" e  f: _' {% p% j
  1231. LDA (FC_Cpy_Port_L),Y1 a/ M& @' T  z  ~3 \
  1232. CLV" ^+ F" {1 v/ ~# u: i
  1233. LDY #$00# O( y3 g5 J7 y
  1234. ;----------------------------------
    6 K, ~" h4 T7 I6 v+ ^
  1235. FC_Data_Copy_Mode:   ;复制模式校验
    # S3 d: c6 \3 @* z+ e) O7 }
  1236. CMP #FC_MODE_RAM_TO_RAM- q7 e# l7 R. u( Y; O- G$ L
  1237. BEQ FC_Ram_To_Ram_Mode3 s/ F9 u$ y9 g0 O( F$ X1 d
  1238. CMP #FC_MODE_RAM_TO_PPU. ?, @7 ^2 ^, d4 R% U, j
  1239. BEQ FC_Ram_To_Ppu_Mode& ~5 s$ |! Y  V9 L* ^/ g( Z" k
  1240. CMP #FC_MODE_PPU_TO_RAM6 e4 h) q7 c3 n, g4 U" t
  1241. BEQ FC_Ppu_To_Ram_Mode! d# c! E' l2 h) v+ l2 @/ G- m
  1242. CMP #FC_MODE_PPU_CLEAR' n- i  v( k( s
  1243. BEQ FC_Ppu_Clear_Mode
    / Q7 k9 T  E. ~( W! U) ?
  1244. RTS
    2 P) y& m- ~' _( u$ Y* h
  1245. ;----------------------------------------; C8 b  @4 }3 i7 O/ E. l  V! Y9 Z
  1246. FC_Ram_To_Ram_Mode:   ;复制RAM到RAM模式0 g" Y8 [9 s4 f9 Y
  1247. LDX FC_Cpy_Count_L( P* y. Y' B% M' Z+ @  C7 i! Z* ?$ X2 N
  1248. INX+ y7 W' \7 Y- Z( @
  1249. FC_Ram_To_Ram_Count:   ;剩余计数检查
    1 z6 @+ D4 J' B( C, a! _
  1250. DEX) ~) G7 n' ]2 S$ J
  1251. BNE FC_Ram_To_Ram_Copy0 M4 r* Y% U3 a5 t$ m( t
  1252. DEC FC_Cpy_Count_H
    : x* [- a2 Z6 w5 Q3 [, A0 M
  1253. BMI FC_Ram_To_Ram_Over2 m( i4 S4 i* ]5 r/ _
  1254. FC_Ram_To_Ram_Copy:   ;开始复制数据
    5 Q( ^: m: x: o! {, T2 |5 K
  1255. LDA (FC_Cpy_From_L),Y2 ~7 @9 K7 F' o* h% n5 v# b
  1256. STA (FC_Cpy_To_L),Y  X8 i2 `, V& v4 t/ O- K! n* A5 R
  1257. FC_Ram_To_Ram_From_Set:    ;源地址递增
    ' Q8 S3 R: y+ P  n# w4 Z- m8 J
  1258. INY7 c' d7 x* _3 J" _6 m# x8 I. T
  1259. BNE FC_Ram_To_Ram_Count
      Q/ d; k5 T2 l) E( q- Z$ y
  1260. INC FC_Cpy_To_H  b: z, q2 s9 N: z& R, R" Y5 `" i9 x
  1261. INC FC_Cpy_From_H7 o3 t3 d" r# D: v9 s1 a
  1262. BVC FC_Ram_To_Ram_Count
    " m/ o+ S% ^6 z6 r* ^
  1263. FC_Ram_To_Ram_Over:    ;结束数据复制
    * Q- ]( F+ `; i/ L" M
  1264. RTS
    . {! d( t- |' u, \

  1265.   e! h1 Y" H  h8 a' r. p
  1266. ;----------------------------------------
    " ?( ?# y7 y& h' p: i
  1267. FC_Ram_To_Ppu_Mode:   ;复制RAM到PPU模式* {" j% I7 y) E2 I
  1268. LDA FC_Cpy_To_H
    6 n( [7 }7 @- b# P3 I5 f, m
  1269. STA $2006: h" ^' K! G; l+ A
  1270. LDA FC_Cpy_To_L
    % r+ m% }. |: t) o4 {! \
  1271. STA $2006+ E# x5 P) a. r, B+ F7 {
  1272. LDX FC_Cpy_Count_L
    2 |, Y" V( z) K2 R
  1273. INX
    , v) s9 u# [( d' M
  1274. FC_Ram_To_Ppu_Count:   ;剩余计数检查; ~+ b9 h8 Q( O
  1275. DEX6 o! d5 t, x0 l; O6 t2 p& v4 _
  1276. BNE FC_Ram_To_Ppu_Copy
    & c/ z! Q, |3 C4 E6 z
  1277. DEC FC_Cpy_Count_H* u- \1 k- p. P/ Z: X1 v
  1278. BMI FC_Ram_To_Ppu_Over
    ! P/ n3 a) Z- M6 ?# ^! }
  1279. FC_Ram_To_Ppu_Copy:   ;开始复制数据2 t- k4 H. Z; P4 c
  1280. LDA (FC_Cpy_From_L),Y9 V3 P6 V; j+ v. Z
  1281. STA $20075 P' Z( Y8 G4 g* o8 G
  1282. FC_Ram_To_Ppu_From_Set:    ;源地址递增
    ' q1 _+ `' {: g, \* K8 Q& M
  1283. INY- b& Z0 d# p4 `1 k
  1284. BNE FC_Ram_To_Ppu_Count) j, b3 B: ^: A$ t7 R, P, P
  1285. INC FC_Cpy_From_H/ L" g7 C  F1 E& B6 B3 b3 B
  1286. BVC FC_Ram_To_Ppu_Count
    + [" Z$ X9 ~; M. @) z9 ]
  1287. FC_Ram_To_Ppu_Over:    ;结束数据复制& K+ M( S, u. w' [$ f/ I, F+ `
  1288. RTS
    ; \( J: f# u7 v! \0 I3 F
  1289. 0 {8 i& o3 |) E% Z, l
  1290. ;----------------------------------------
    ! V' F& w, t' t0 \
  1291. FC_Ppu_To_Ram_Mode:   ;复制PPU到RAM模式
    % k" F2 v' I0 Z6 N' Q
  1292. LDA FC_Cpy_From_H( B" O! i- r# Q$ J% p
  1293. STA $2006
    $ r; e; F% ]$ I
  1294. LDA FC_Cpy_From_L. a. x9 n7 ]) U/ ~; [! w. B  w
  1295. STA $20066 _- g* Z4 ]) o: q+ ~8 o) o
  1296. LDA $2007; [0 d( ^4 B2 C7 q/ K7 O0 v/ ]# o
  1297. LDX FC_Cpy_Count_L
    * a0 s) [* |2 ~8 M- Z: N2 u
  1298. INX! g0 K+ ]7 [1 P. [5 K$ @2 Y/ e
  1299. FC_Ppu_To_Ram_Count:   ;剩余计数检查
    1 F* M8 n: l5 [/ q. M
  1300. DEX
    + b) V) b6 Q6 a" h! ~8 n
  1301. BNE FC_Ppu_To_Ram_Copy
    ; I% Q9 i8 y% y# o; x& t- ~. w2 e
  1302. DEC FC_Cpy_Count_H7 w8 u" u1 k6 g. i5 ]6 w
  1303. BMI FC_Ppu_To_Ram_Over
    / }9 \- w" F$ [  z  c9 J8 L* @
  1304. FC_Ppu_To_Ram_Copy:   ;开始复制数据
    ( r+ J' [7 B. v/ [
  1305. LDA $2007
    + e$ ^2 Y( F' |. \
  1306. STA (FC_Cpy_To_L),Y6 ?& S7 J# x( i9 O6 W/ i+ ~( e
  1307. FC_Ppu_To_Ram_To_Set:    ;目的地址递增
    ; E+ M9 [( l/ U. ], i7 Y  G, {
  1308. INY
    7 L; n0 E2 U7 K
  1309. BNE FC_Ppu_To_Ram_Count
    1 |+ L& Z  t: m* O% Y/ |6 n
  1310. INC FC_Cpy_To_H1 _( ?: ^+ [  L+ Z0 q9 s4 i
  1311. BVC FC_Ppu_To_Ram_Count
    2 j  O$ r1 g. g) u
  1312. FC_Ppu_To_Ram_Over:    ;结束数据复制% k; U9 f# r* g& C7 v  }
  1313. RTS
    6 b, R  ~6 w* h
  1314. 9 W/ Q0 h2 h  V" M
  1315. ;----------------------------------------
    ) b9 B5 J) s4 G; r1 S1 w, c
  1316. FC_Ppu_Clear_Mode:   ;清除PPU模式/ v4 ^; ?6 x( q2 g7 m, n
  1317. LDA FC_Cpy_To_H
    - P, l& O# S$ K0 s$ S/ k$ R0 _
  1318. STA $2006
      l. X; y7 E4 [- u  I, Q5 E# q
  1319. LDA FC_Cpy_To_L
    , P% {+ M. c- s
  1320. STA $2006$ P  w; h" q; n9 b
  1321. LDX FC_Cpy_Count_H
    0 J1 i6 @. \/ t9 ~# @+ p; G3 W
  1322. LDY FC_Cpy_Count_L' X* Q' m- a' A6 C, ]
  1323. LDA FC_Clear_Val
    - Z1 k6 K* C6 I& s5 w' F
  1324. FC_Ppu_Clear_Count:   ;剩余计数检查
    . N$ J% [1 d% G" f
  1325. BNE FC_Ppu_Clear_Copy9 O( O8 i( _; J$ @3 Q
  1326. DEX9 K2 f, }+ V+ y
  1327. BMI FC_Ppu_Clear_Over
    + M: R3 [0 j9 o7 k5 ~! ~! W
  1328. FC_Ppu_Clear_Copy:   ;开始清除PPU
    8 n) Z0 P" E* a
  1329. STA $2007, x5 y! U. A, v! S) u
  1330. DEY. @. ?/ G* I  ~/ E" M6 \9 e/ t$ [
  1331. BVC FC_Ppu_Clear_Count
    ; K2 e. |: l  B  n0 x
  1332. FC_Ppu_Clear_Over:    ;结束数据复制
    ( J) C: L) B, p  g$ K* Z5 f
  1333. RTS
    & T* }3 p4 @8 C3 ]# h5 j5 U
  1334. , ?" s" H% c- m) i! c
  1335. ;==================================================6 c4 p! D2 `+ c! |
  1336. ;保存RAM数据* Q( u1 A( K  i9 s/ |' d
  1337. Save_Ram:
    $ r, C8 K# e# ?# O
  1338. LDX #<Save_Ram_Data! E$ O3 R& l6 ^# C. ^
  1339. LDY #>Save_Ram_Data
    " w, u8 q6 b; `0 {/ S$ }- a
  1340. JSR FC_Data_Copy" ]/ }6 A9 z0 m- h, o
  1341. RTS2 s. D, T- S. Q  |$ e* A

  1342. ' X* [5 y+ E- z  k0 C0 N+ N; @2 A
  1343. ;加载RAM数据
    0 p, b+ K2 Y. [  _
  1344. Load_Ram:9 R& `( W: @# U4 o' A* \
  1345. LDX #<Load_Ram_Data7 p3 m9 x) h; y8 l
  1346. LDY #>Load_Ram_Data6 G, c' R8 C! P3 n
  1347. JSR FC_Data_Copy
    % p7 p8 _% q9 ~
  1348. RTS+ T# J1 s: d/ v8 W2 ~
  1349. 3 C: v# ?- k+ y: q$ c
  1350. ;保存PPU数据. K7 m- a! m, V' K; g
  1351. Save_Ppu:
    1 [( k- L+ r/ D
  1352. LDX #<Save_PPU_Data0 Q  f- I- [" F! s# E$ [& u5 f' N
  1353. LDY #>Save_PPU_Data
    ' B+ H, m" {9 T% g; L3 W! d' a
  1354. JSR FC_Data_Copy
    : M) J3 o/ C" t7 _% T/ G
  1355. RTS9 `2 x0 B; L5 |- H
  1356. 3 W+ H) O' Z7 B! t( H, Z
  1357. ;加载PPU数据
    - D+ [! T8 G# H) E+ ^
  1358. Load_Ppu:
    6 P) O: T5 M. ^( X
  1359. LDX #<Load_PPU_Data9 ]5 O. R, M* C, {9 E" N- J2 ?
  1360. LDY #>Load_PPU_Data
    - u3 ^2 D' j% a) r4 n. t
  1361. JSR FC_Data_Copy( W( e- i( u; y. D8 }, }
  1362. RTS6 n! k# U+ k% \: [! i. e. ^

  1363. " y1 _1 |( r$ }, @* B
  1364. ;清空PPU数据
    0 g# A) @5 y0 S' @6 d
  1365. Clear_Ppu:/ m. b7 F& ^$ J+ T+ O
  1366. LDX #<Cln_PPU_Data
    # j" r: q' s+ Q2 F0 P; k
  1367. LDY #>Cln_PPU_Data7 T! T; i6 g7 E' K
  1368. JSR FC_Data_Copy
    7 D7 A! S2 w$ }" h
  1369. RTS
    9 q+ I4 G- c7 |4 U: L+ W% T
  1370. 4 A2 V* R% A  s! j2 @% E  y- v
  1371. ;==================================================# \: C9 p  D9 B  O- c
  1372. ;数据配置) g- V; d/ }& U- N% p5 I
  1373. Save_Ram_Data:* a3 m" R0 m0 X/ R7 G% Y+ `4 X
  1374. .DB $00,$03,$00,$63,$00,$01,FC_MODE_RAM_TO_RAM
    ) @3 ^+ L7 F* M2 T" S5 _
  1375. Load_Ram_Data:9 O8 d8 d4 A7 d7 i3 ]' h
  1376. .DB $00,$63,$00,$03,$00,$01,FC_MODE_RAM_TO_RAM
    ; w+ [2 u/ q( ~' Y8 x
  1377. Save_PPU_Data:- [7 D) L4 b8 i3 N7 y
  1378. .DB $00,$20,$00,$64,$00,$04,FC_MODE_PPU_TO_RAM
    & y2 O- P, H/ ~) W  J/ ^
  1379. Load_PPU_Data:
    4 t$ h% h' v9 O9 H$ ?
  1380. .DB $00,$64,$00,$20,$00,$04,FC_MODE_RAM_TO_PPU4 D; f8 g  K  t( T4 x9 A( g9 h
  1381. Cln_PPU_Data:
    ! {+ ?8 b. D! X$ D; a, U, R, {
  1382. .DB $00,$00,$00,$20,$00,$04,FC_MODE_PPU_CLEAR% k5 }* X% U  Q

  1383. ; s7 p. ?, S# n$ ]9 o
  1384. 6 I* i9 H3 d# v, d+ B2 a8 b  T
  1385. ;==================================================3 H3 D2 A! H" _" Q) t& Z: i  M
  1386. ;文本数据PPU显示地址
    ' ?4 e# G. s  [. `) u3 D! }  b0 i. v
  1387. Text_PPU_Addr:3 f2 @! K+ _6 _3 X/ ?
  1388. .WORD $20C5. Z% r. u9 B" H: _6 Q; v" M3 |
  1389. .WORD $2105
    ! I* w  y7 R3 z# m4 s3 ~! B
  1390. .WORD $21453 Y  ?( S: n2 `# P- W" ]  A
  1391. .WORD $2185
      ]0 {/ V0 ^: g
  1392. .WORD $21C58 ~0 z! a' C' T, Q  u1 p9 n& c
  1393. .WORD $2205
    / {1 A5 B3 x. ^) w8 g
  1394. .WORD $2245/ T2 f+ |( J1 H( R0 D8 j
  1395. .WORD $2285
    & s" z8 W2 s# A) N$ j
  1396. .WORD $22C5
    . b/ L9 r9 A5 \0 m5 F2 x& ?0 `( X- g
  1397. .WORD $23050 q9 L5 |7 a* t1 e
  1398. .WORD $2345
    1 S, _. ?+ z; C

  1399. 3 H' N8 m7 A4 c, h- J! \
  1400. ;==================================================. q! @. G, F3 M: U7 U
  1401. ;文本数据PPU数据地址2 F9 r/ C1 }, A  C& G" y
  1402. Text_Data_Addr:. `" b1 [7 @/ D. d, r; I
  1403. .WORD Text_Data_01
    . ?! e3 [2 |" J' j. p4 k7 F
  1404. .WORD Text_Data_02, {1 d7 W8 O' x, K2 w
  1405. .WORD Text_Data_03
    ; J% A: C; c3 c+ A
  1406. .WORD Text_Data_045 E) O: ?* y2 _/ k0 D" n2 p* M
  1407. .WORD Text_Data_05, {! L) h9 m1 F% S5 C, _3 @- \
  1408. .WORD Text_Data_06
    7 |! l% h$ I; }2 D$ G# t
  1409. .WORD Text_Data_07. p% \) f" \* v0 @
  1410. .WORD Text_Data_08
    ' Y9 h9 E0 C, N: E0 t( ~
  1411. .WORD Text_Data_09+ F  v' m! B; ]+ C4 z/ L' l4 L4 i
  1412. .WORD Text_Data_10
    ' v/ _* @* Q( H, J7 o  B) O
  1413. .WORD Text_Data_11
    ! U) L9 V  @0 i' e
  1414. .WORD Text_Data_12
    . i6 `1 p) J0 q6 X
  1415. .WORD Text_Data_13
    - z2 ?, H  N3 E# d! K6 m
  1416. .WORD Text_Data_14% }" n) O4 E- F* B. H1 \
  1417. .WORD Text_Data_15
    ; `; l  V  v/ G9 z5 {6 z2 w) I
  1418. .WORD Text_Data_16# g3 ^0 Y* ]1 q4 e
  1419. . M, r, u2 O) g2 z
  1420. ;==================================================
    ; L) A  _& z: c1 E5 c8 ]+ E4 w
  1421. ;文本数据) {8 _2 ^7 z+ J8 U' w
  1422. Text_Data:
      D3 ?0 B+ V6 }( O2 A' Z: X; e
  1423. Text_Data_01:. o. ^, L; n5 c7 D
  1424. .STR "01.INVINCIBLE"
    ( g6 t% m. i. ]7 D
  1425. Text_Data_02:
    ! h- n2 E' N8 k
  1426. .STR "02.INVINCIBLE PLUS"0 B8 ~  L2 D9 C3 p
  1427. Text_Data_03:
    , v$ B  Q, z2 ^; P8 y
  1428. .STR "03.LOCK LIFE"2 k. M8 j+ p# l
  1429. Text_Data_04:
    / _5 X# {. }; C+ |( M' e, w0 M
  1430. .STR "04.LOCK WEAPON"
    0 O1 B9 h9 ^" e+ X, z6 B
  1431. Text_Data_05:% o+ q6 Z& L' k% _; ~2 y
  1432. .STR "05.SEL CHANGE WEAPON"" U* h6 c/ _; Q
  1433. Text_Data_06:- }, X2 i7 E: M- m
  1434. .STR "06.UNLIMITED JUMP"
    , ]$ _" l& p& Q& ^5 s
  1435. Text_Data_07:
    2 {" N4 e  f/ X4 c( L8 N
  1436. .STR "07.MOVE FAST"  G/ ]; V7 e; E8 ~. ~: X
  1437. Text_Data_08:
    5 |1 i& L8 k  W' s5 e% Q4 U" t8 U
  1438. .STR "08.SWAP SKIN"
    : N4 F( j6 N7 H% C; d) s2 a/ Z
  1439. Text_Data_09:
    ; k! o* \! z7 P$ m; z; T$ P& y
  1440. .STR "09.EQUAL BULLET"
    * b) Q$ A) r0 {* l+ G5 N
  1441. Text_Data_10:
    4 u& F7 m, n3 ~; }
  1442. .STR "10.STRONG BULLET". E+ y4 H6 Q' Q
  1443. Text_Data_11:
    7 u6 f# R2 b7 a0 {8 L$ x/ ~
  1444. .STR "11.KILL BY ONCE"
    & s# W) h5 }: o' w/ A7 ]
  1445. Text_Data_12:
    6 k2 p% ]4 f9 \1 A+ P. H3 R5 B
  1446. .STR "12.FULL SCREEN KILL"
    0 {- g, t( y; X0 b
  1447. Text_Data_13:
      l, C. {0 Y4 y. V9 C
  1448. .STR "13.DOUBLE CONTROL"
    3 a. |/ s$ |* ?5 Q
  1449. Text_Data_14:/ g) |- V$ V7 g( V# i: R
  1450. .STR "14.REMOVE E-GRID"5 r' c* Z9 C# x. n
  1451. Text_Data_15:  C+ U( m  P5 J" C7 E" ?2 _
  1452. .STR "15.FALL INVINCIBLE"
    ( V- ~. b5 T5 F6 o3 k2 I
  1453. Text_Data_16:
    ! }% `) p8 o4 N0 Q7 O/ H8 i
  1454. .STR "16.NEXT STAGE"! c8 h1 P2 x' U( b

  1455. 1 R, d, v. W6 y2 z5 n" C. `: p
  1456. ;==================================================9 I$ N; y" T* g. y' S- g
  1457. ;功能开关检查地址
    " a" n( g  c6 V2 p- C7 j
  1458. Function_Addr_A:6 I; x2 @* e# q0 f8 Q
  1459. .WORD $01C0
    + x9 [+ |1 u& }& _) \' a- N
  1460. .WORD $01C00 O& Q+ V& e: d' P( j
  1461. .WORD $01C0; V8 r' p5 g0 Q( D% u& j
  1462. .WORD $01C0
    / U0 K0 q5 w2 a  D& s
  1463. .WORD $01C0
    - z' c, J& D$ I1 X3 v
  1464. .WORD $01C0( O' s& T/ h( L: d  c9 @
  1465. .WORD $01C0
    1 S5 c: P9 Y& Z9 _
  1466. .WORD $01C0
    " _! i; _: L8 {7 i0 x: f, `$ v, F% X' y
  1467. .WORD $01C4
    + q& H. g. p1 O7 J4 W) g( X# B9 k2 _( N2 C
  1468. .WORD $01C4
    $ e) R9 d* M7 L* Q: q. }2 E
  1469. .WORD $01C4
    # M5 C3 k$ ]& q: R! J6 _* I6 n
  1470. .WORD $01C44 y2 [8 ?+ ?" x- @- x7 x
  1471. .WORD $01C4
    , \! r( {$ V9 i0 T+ S
  1472. .WORD $01C4
    7 R, Q5 K7 s, ?7 C/ I8 G
  1473. .WORD $01C26 \! C# C: M: p2 q% w
  1474. .WORD $01C42 M4 H; m( }( z+ [# ?- o# P8 c" {

  1475. % b+ S. u* Y5 W( N$ l
  1476. ;功能开关检查地址
    : Q7 N( w" T" O! j" K! f
  1477. Function_Addr_B:8 x* D# A8 H$ A) ?0 t: k1 t' `
  1478. .WORD $01C11 Q5 w" K% Q( Z! f' v  y
  1479. .WORD $01C19 K- z2 p& R" G( y! ^( I5 Q5 n
  1480. .WORD $01C1
    ; N' y8 m; D% o* u$ T
  1481. .WORD $01C1" Q; w0 E. e1 D; Z
  1482. .WORD $01C1
    : s% F6 K8 v5 [: k2 S4 P; j' `
  1483. .WORD $01C1* h- d& V, v+ ]9 [2 S
  1484. .WORD $01C1* T# O- C6 Y# O- B; P- b1 ^
  1485. .WORD $01C1
    : {$ r" \0 y# y& f4 p
  1486. .WORD $01C47 @1 S; h( y0 y
  1487. .WORD $01C4
    - u  U5 S  A* N+ Q. a- _0 ]- G
  1488. .WORD $01C4
      a  I/ \; u9 {
  1489. .WORD $01C4# [3 q9 v2 v" [/ T% l
  1490. .WORD $01C46 r8 A. c- i% A. c& D' F
  1491. .WORD $01C4- H3 @: z1 S% b  |; t
  1492. .WORD $01C3
    5 u# t' T, Z7 n$ I
  1493. .WORD $01C4
    $ j" i! A% Q7 ^" j- N2 b) }+ R

  1494. 7 c5 m8 Q# L! G+ F- u
  1495. ;==================================================
    . l( t, P; K) ]6 b
  1496. ;功能开关检查数据- o5 o4 c2 q) S
  1497. Function_Check:: x; \. b4 e9 R/ R
  1498. .DB $01( ]; J5 A* a7 @+ i
  1499. .DB $02
    / ^7 H, i7 o0 ^! b! O0 H
  1500. .DB $04
    " Y( e' G2 \/ `8 ?& i' M+ i
  1501. .DB $08
    8 T; M. j  K8 @
  1502. .DB $10
    $ N0 U% H4 B9 k: f" O
  1503. .DB $20" x! X% ^, I! O% l; Y
  1504. .DB $408 r; H1 }. T7 v. ^8 A1 M
  1505. .DB $80
    6 m+ z0 L3 N8 t! \; Q
  1506. .DB $01
    5 N. Z- d( G. ~4 k8 A3 Y4 ^/ n
  1507. .DB $02
    + U% t: E9 Q" E4 |2 ^0 b; w' y" j. O
  1508. .DB $04
    * U3 v* k8 Q2 T( R8 ^
  1509. .DB $08
    7 S, m5 {/ Z& v% ~' D6 O
  1510. .DB $10
    " ]( |+ g# g- q7 |$ b* X* g" F
  1511. .DB $207 u- }+ V9 A  p7 j
  1512. .DB $40
    ) U4 R' I9 b5 z+ K# u
  1513. .DB $80* b7 h6 E- A; z2 z7 F

  1514. & S9 y  s7 |$ C. `
  1515. Char_Rom:
    % j" f4 H: l8 p- ^1 n9 A
  1516. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00- s' ?8 V  {- {1 b4 b
  1517. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    - Q( r& j& {0 L. U  t( g
  1518. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3B,$25,$00
    % W, `* i$ z# l: ?
  1519. .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$00,$00,$00,$00,$00,$002 i1 ]: X7 R9 T. P# |) P
  1520. .DB $00,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$193 W4 |9 t  t" Q0 X
  1521. .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$00,$00,$00,$00,$00# E1 Q0 H: k, M( M* N9 Y9 a

  1522. 3 R/ K/ W$ o" y

  1523. 2 O5 ~* S6 L' D" C$ h
复制代码
8 Z3 I' T; e: B* E) t3 w- D
游客,如果您要查看本帖隐藏内容请回复

2 Y# w8 D/ @; ^flamecyclone.ys168.com
4 j$ U& B1 ^3 O: Ywww.nesbbs.com

本帖子中包含更多资源

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

×

评分

2

查看全部评分

签到天数: 3145 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 142 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1622 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 39 天

[LV.5]常住居民I

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

使用道具 举报

签到天数: 1759 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 2623 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1467 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 187 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1882 天

[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 | 显示全部楼层
增加烧录支持(其实是之前遗漏了兼容性)
回复

使用道具 举报

签到天数: 1289 天

[LV.10]以坛为家III

发表于 2019-12-5 06:49:43 | 显示全部楼层
樓主的修改一定支持, 魂斗羅是喜欢的系列.& L; C* s2 o1 y! c6 u5 y
多谢楼主分享
[发帖际遇]: waikwokt 打扫环境卫生,被奖励 2 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 1226 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3591 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1341 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3281 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

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

使用道具 举报

签到天数: 620 天

[LV.9]以坛为家II

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

使用道具 举报

签到天数: 7 天

[LV.3]偶尔看看II

发表于 2020-3-22 14:13:00 | 显示全部楼层

8 K. _3 J  D- R* ^/ B9 c2 N8 {7 RTec.PNG (8.05 KB, 下载次数: 0)) T- K  ~, ?" r2 G% U

" H2 [8 Z" C) W下载附件  保存到相册
" _+ j4 B. d% a* U- P, f6 X& t, ~4 a" L- Y5 f- r6 o
2020-3-13 13:33 上传
3 d: f5 v1 h8 h& [- S得到的文件解压后放在任何FC模拟器即可玩。NES上最优秀的篮球游戏!1 _8 G6 w! F: Z  ^" u7 _) S5 r/ J& w6 @3 v! n" z; ^4 U& ~% I4 F
修改内容:6 ^3 ~9 s8 {8 k" ~/ P
1)游戏时按START键可以开启或关闭怎样射球都进篮,全场照进!- t9 S2 d" W3 p& \  s& \/ }3 D2 U2 I5 k
4 N# A* o  K& S. i2 c
5 p8 N: m! O0 L' b0 L0 y不过开启了是双方面的,看到电脑拿着球赶快关闭!(有声音提示)。" p1 M) ?$ I+ `) P* f2
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-8-5 04:01

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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