EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2019-11-29 20:25:37 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2019-12-4 21:31 编辑
' J) d& n% g4 i' r0 M
' _7 x5 H: l0 z[FC][魂斗罗][最佳可视化]2 T+ ]0 k9 `+ d# h
时间:2019.11.30
2 O5 B9 |% S  f7 R7 t7 X1 E) a作者:FlameCyclone1 t" l$ ^- I$ f# m+ h8 U
内容:* a5 D' k+ D3 R3 C7 u$ q
1.可视化:    # r) p; {2 ~2 I+ @1 ~" K- l
     (1)暂停时按选择键进入菜单
' E* K  D( O9 \* Y5 l0 m6 a     (2)方向键选择功能: B键开启: A键关闭: 选择键交换,开始键退出
7 L' U' i8 p) w. e1 a     1.1.透明无敌: 透明无敌
0 I$ t$ |/ J+ Y# h9 H( t% l; _; V     1.2.加强无敌: 金身无敌& A6 ~9 m+ N9 U9 K! ~7 _
     1.3.生命锁定: 生命锁定3条
, H; c" K6 i* C# i1 X! m     1.4.武器锁定: 武器保持不变
4 F- W; D3 m( O. K! t* s     1.5.武器切换: 游戏时按选择键切换武器
. K5 @1 V( m: h( i( B     1.6.无限跳跃: 跳跃无限触发& R' j$ l2 c' f# j, \
     1.7.快速移动: 行走速度加倍
. u5 ~5 D8 A% D7 C     1.8.皮肤切换: 交换玩家肤色* u# S. x2 Q9 a0 [
     1.9.公平子弹: 玩家子弹可以与敌人子弹对打2 J; M, l. l' P8 l1 \
     1.10.强力子弹: 子弹打中敌人后继续穿透
. {* J! |; g/ d7 _8 V     1.11.一击必杀: 敌方中弹一发必死3 S' D9 \, g( V( I  r( @
     1.12.全屏击杀: 开枪时全屏可击中目标必死, I/ g5 B- p) b  n
     1.13.玩家双控: 两个玩家的任意一方均可同时控制两个玩家
& j5 I5 c3 {4 J3 m     1.14.移除电网: 移除2,4关的电网4 P$ J; U. A5 Y! |# v7 H
     1.15.掉坑不死: 掉坑后不会死亡% t+ l4 k6 @% D) |  R( G1 l
     1.16.跳过关卡: 跳转到下一关% {2 |4 E, S- ]4 _/ T" [2 ~
  1. ;[FC][魂斗罗][最佳可视化]1 t8 p2 M6 R6 _* a% M7 W+ X3 E4 X! v
  2. ;20191129, D& g9 y7 G/ ]
  3. - O9 {" U% Z' O: B
  4. ;程序开始地址
    " Q) t  i: w- z8 k
  5. .ORG $9000
    " ?4 P! p7 R4 N5 R4 o! U3 ?
  6.   `  S6 j; `( |0 r: R
  7. ;==================================================0 b+ r9 l3 |" Y% f! e
  8. ;==================================================
    3 d  k+ T7 d$ h8 |; m- E2 _
  9. ;是否双人玩家: _4 \+ r/ ?/ ]( O
  10. FC_IS_DOUBLE_PLAYERS = 1
    : d4 }' k" v4 ?
  11. & l" g$ H4 v  t3 V1 j5 X1 A  N
  12. ;==================================================/ V0 `2 G* o2 r! n" Y0 x
  13. ;PPU缓冲地址配置  X1 u: c( W8 h0 V
  14. FC_PPU_Buffer = $03007 U" ]; _6 V& J7 J- ?  z
  15. ;PPU地址配置
    , E2 [  r; ^6 P& T! R' T
  16. FC_PPU_Cursor = $00! [' n* y( v# N5 O! I) U
  17. FC_PPU_Status = FC_PPU_Cursor+$018 W6 `; B# }. z) e6 Y" Y2 `
  18. FC_PPU_Data_Cnt = FC_PPU_Status + $01
    $ ~4 i! |* i( \7 ]
  19. FC_Data_Port_A_L = FC_PPU_Data_Cnt + $01  ]" J( p# x, i- F' W( ^
  20. FC_Data_Port_A_H = FC_Data_Port_A_L + $01
    / Z. Y- ?: Z  [3 F; [
  21. FC_Data_Port_B_L = FC_Data_Port_A_H + $01* l/ ^" N1 g' s+ l; h: G$ O: d
  22. FC_Data_Port_B_H = FC_Data_Port_B_L + $01
    * n# F+ L  d4 t; N. d
  23. ;==================================================5 f- Y# _0 P8 c$ K/ V, z0 i+ p

  24. # F5 P6 a, R5 A0 V
  25. ;==================================================6 e+ b# t. t$ }0 D
  26. ;选择项地址配置/ W& i4 \" m0 @* J( |1 a
  27. FC_Select_Index = FC_Data_Port_B_H + $01
    $ a6 E) ~- H  v, r* D
  28. FC_Select_Temp = FC_Select_Index + $02! x% T3 b; f6 F
  29. ;NMI循环计时器
    , D6 j8 g2 L3 Q9 g
  30. FC_Time_Count = FC_Select_Temp + $01
    4 i" c3 l/ _) y) U$ Q" c9 b
  31. ;==================================================, r" G6 V4 n3 Z5 O* S

  32. " K4 }1 }* x) B, Q' w; A
  33. ;==================================================
    - n* w/ W& J  w; `% b$ n3 i
  34. ;光标配置0 W& k+ v; \% g7 \( b
  35. FC_Cursor_Addr_L = FC_Time_Count + $01
    ' V# w5 R+ l8 u, i/ U
  36. FC_Cursor_Addr_H = FC_Cursor_Addr_L + $01
    , r, I. a3 T' l# g! _9 x1 N* _
  37. FC_Cursor_X = FC_Cursor_Addr_H + $01
    2 G2 |  m, d' w) p4 q0 N
  38. FC_Cursor_Y = FC_Cursor_X + $01
    ' C2 o/ C# k$ V- b* t- Z, ]
  39. ;----------------------------------------
    1 A% A7 }# D+ o+ C; [
  40. ;光标图形号  e- [' _. {* j% [# P" O" N
  41. FC_CURSOR_TILE = $3E
    & u% B+ \* [, `4 |+ _
  42. ;光标偏移像素值# r8 ?6 E8 [. a
  43. FC_CURSOR_OFFSET_X = 12$ m; o% ~  f% @4 _" x
  44. FC_CURSOR_OFFSET_Y = 1
    4 c7 n" H" I5 E5 o
  45. FC_FUNCTION_OFFSET = 21
    ! m( y8 Z- v$ m" s, u+ D7 M' @
  46. FC_ON_TILE = $3D; K) P9 c' q, ?. I$ Y5 s0 b
  47. FC_OFF_TILE = $3C+ o) R, W% s) z1 {2 T+ _+ ]! o' a/ k
  48. ;==================================================
    " h2 O( e4 ^0 g) G; i

  49. : h2 w. t" t6 w9 ?- K8 s( e
  50. ;==================================================
    & v3 {; }$ M3 M1 e  M- U: ~
  51. ;翻页配置
    5 l; ~: E( J) N9 m) h+ V$ o
  52. FC_Page_Old = FC_Cursor_Y + $01
    9 A# c8 H( o; A1 Z, s; a+ H
  53. FC_Page_Cur = FC_Page_Old + $01) X1 q3 W9 {  `# h" q
  54. FC_Page_Item_Count = FC_Page_Cur + $018 N9 h' o6 b* h: @/ w# J" O4 ]; t* s0 M
  55. FC_Page_Item_Buffer = FC_Page_Item_Count + $01) X  D2 _3 g' c5 ]: I
  56. ;----------------------------------------2 Y9 i& o% v+ ^" c( p# s
  57. ;翻页属性
    # a& o/ |1 V. N* R1 A/ K
  58. FC_PAGE_SIZE = 10
    0 {5 w# f' C( u) x/ t
  59. ;PPU单次写入缓冲项数
    & \* _( H, p4 d/ L* S& Z. z
  60. FC_PAGE_BUF_SIZE = 2+ S& N  c+ g9 k* U( a" ?
  61. ;----------------------------------------/ e, F# q" p. |8 L+ Y2 h7 X2 T6 e; H% q
  62. ;显示项最大索引属性. c% L1 `4 \- u6 Y9 Q7 i2 @3 Z
  63. FC_ITEM_SUM = 16 - 1
    ' K* }+ s* T# t# }( Y
  64. ;最大页索引属性6 h& V" a4 h  W# \1 d- w
  65. FC_PAGE_MAX = FC_ITEM_SUM/FC_PAGE_SIZE*FC_PAGE_SIZE) e: y. i8 K9 \" u" t+ r' C$ c
  66. ;==================================================
    8 k" N* y$ |' K
  67. : `, o7 M( m  X. W- ^
  68. ;==================================================9 c$ h, n$ V. n; Q# H
  69. ;按键配置
    / [6 h: i; o- g( B
  70. Button_Keep = FC_Page_Item_Buffer + $01
    $ l1 E7 l( R6 _% _( I
  71. Button_Once = Button_Keep+$02
    ) W- o* P" b' W! A# L4 P
  72. Button_Temp = Button_Once+$02
    ! d7 K2 x  W. Q: n; l8 G3 c+ \
  73. Button_Buf = Button_Temp+$02* C+ h$ H% \# p1 ~/ ?7 y
  74. Button_Status = Button_Buf+$021 G7 j* n/ Z: B% B
  75. Button_Auto_Delay = Button_Status+$02
    3 Z9 _3 I0 `, U  t( P
  76. ;----------------------------------------; ]5 @( W. \1 N% S/ N/ i
  77. BUTTON_DELAY_MAX = $18% O1 ?6 _8 G. ^# R* E0 X
  78. BUTTON_DELAY_SPEED = $08
    ) ^$ P) P6 _1 S4 d- h$ T/ g: _

  79. * S: Y9 @! D6 R" U
  80. BTN_UP = $08
    9 W8 m2 k% ~* k5 ]2 I- u5 E. j
  81. BTN_DOWN = $047 h0 \, J" d) _- H
  82. BTN_LEFT = $029 d4 F$ D6 P$ X8 q6 R- u8 F1 O
  83. BTN_RIGHT = $01' j8 r' e, t! N1 O' x% v# M
  84. BTN_SELECT = $201 U3 Y9 ]7 f% F
  85. BTN_START = $10' t4 ~# A* g- a/ i: P: f
  86. BTN_B = $404 w8 f" S' k6 ?4 F, h. A  X% K2 k- O
  87. BTN_A = $800 T$ m( D/ _# I' G3 T
  88. ;==================================================
    . E1 N7 H# r  \7 p  b

  89. 2 A. t% l4 E# X% ~
  90. FC_Copy_Addr = Button_Auto_Delay + $01
    $ j# H0 E6 r/ l0 G6 N5 G* E% A$ t
  91. ;----------------------------------------5 \0 o- Z) D1 `$ S9 }
  92. FC_Clear_Val   = FC_Copy_Addr+$00      ;清除模式覆盖值4 _# q: K6 f4 T8 [/ M
  93. FC_Cpy_From_L   = FC_Copy_Addr+$00     ;复制来源地址低位  P: J! j2 v0 ~8 _. T6 Z
  94. FC_Cpy_From_H   = FC_Copy_Addr+$01     ;复制来源地址高位
    2 G/ v% I; x( \1 p4 l8 o7 C3 I1 g( Y0 w! V
  95. FC_Cpy_To_L     = FC_Copy_Addr+$02     ;复制目的地址低位
    2 E* s; P5 B. h  d( i2 r! k! ~( ^, n
  96. FC_Cpy_To_H     = FC_Copy_Addr+$03     ;复制目的地址高位! r8 y" o. C8 L, y- B0 X
  97. FC_Cpy_Count_L = FC_Copy_Addr+$04      ;复制长度低位$ C6 ]  u1 w/ d
  98. FC_Cpy_Count_H = FC_Copy_Addr+$05      ;复制长度高位5 i7 h4 U* A, M& K- f! [
  99. FC_Cpy_Port_L   = FC_Copy_Addr+$06     ;配置地址低位
    * P! @; z/ I+ J! B6 D
  100. FC_Cpy_Port_H   = FC_Copy_Addr+$07     ;配置地址高位, L. W7 z/ a4 U) `: ]
  101. ;----------------------------------------. i1 K- k! s# }7 x8 z$ p! }2 C
  102. FC_MODE_RAM_TO_RAM     = $00  ;复制RAM到RAM模式
    ' A9 ^* s( l* W. _3 s# t
  103. FC_MODE_RAM_TO_PPU     = $01  ;复制RAM到PPU模式& f' }/ f; n0 x0 u  V
  104. FC_MODE_PPU_TO_RAM     = $02  ;复制PPU到RAM模式% W: h/ L# R) e1 {. `+ @8 J
  105. FC_MODE_PPU_CLEAR     = $03  ;清除PPU模式7 A% f3 B/ y" ~; M# k" x

  106. + P- r, s* |% [( a1 s
  107. ;==================================================
    " ^1 s$ X  A+ T/ Z  x  ~
  108. Rom_Nmi_Addr = $FF
    4 [" \! U. Q- B
  109. Rom_Btn_Once = $F5
    3 W' Y- d% R2 X2 I& G; `  ~
  110. Rom_Btn_Keep = $F9
    + M2 Q) b) z7 q0 R9 {, S
  111. Rom_Pause_Addr = $25, Q* }& P' i; G% G: j! c2 x: e/ e
  112. Rom_Pause_Val = $01
    ! d- z- ~% n) B) ?$ ^( N! D9 g
  113. Rom_Pal_Addr = $07C0" f" f$ `# V8 C" c
  114. ;----------------------------------------& I# o# f: `" K. w) Y. p
  115. Save_Zero_Addr = $6200
    & A! j7 L4 g- H% V% _( B$ i# M/ Y
  116. ;==================================================8 h& q1 Y! r* }: f: s
  117. ;==================================================
    - B" j5 H/ |/ s
  118. 6 D( e7 r) q! T% j5 W
  119. ;程序入口- v  L3 Z( L8 b1 K! i
  120. Enter:
    : H4 N, s% F4 ^( C1 ?$ {6 D; q+ u
  121. LDA Rom_Pause_Addr: [- P$ U+ y. I; a
  122. AND #Rom_Pause_Val
    : |2 M2 A/ u" x6 g
  123. BEQ Quit_End
    2 E: [& ^3 I; `
  124. LDA Rom_Btn_Once
    # D* q! Q6 ~* S0 Z* ^0 O8 q
  125. CMP #BTN_SELECT7 z. e8 R' v4 O" w; L0 F
  126. BNE Quit_End
    * v% Q3 V8 K( B2 P3 J7 g$ J1 t
  127. PHA3 p/ a0 Q/ }) a
  128. TXA" y: ]0 \( f8 x7 K( f
  129. PHA4 U% ^) M% `3 S& t/ H& _
  130. TYA
    9 |/ o" r1 f# i1 k
  131. PHA$ D  P  `0 @& E
  132. JSR Wait_Sound_Stop& M* g1 V; y. G  P" W7 K  g, _
  133. JSR Save_Screen
    & G' H9 D; I4 E) H& m+ |. K
  134. JSR Program_Begin
    ! Y( j1 q* A: L# M
  135. JSR Load_Screen! |1 A) P$ }9 f2 e6 @) }0 w
  136. LDA #$10% k) H2 q2 Q/ z8 d% {* O" j$ g$ {
  137. STA Rom_Btn_Keep1 W3 A: n3 I' M
  138. LDA #$00
    ; Z& O" B8 n' N! j' V' P
  139. STA Rom_Btn_Once" q! H' g+ Q0 Q" p# y4 y
  140. Quit:: p+ j) ?# I/ S
  141. PLA8 y7 G. H& |# v% D6 d& @
  142. TAY
    0 u' u$ j( m9 D, O1 M. s+ x
  143. PLA
    3 i) Z; z" o+ |
  144. TAX: I1 c1 Z! j; B3 b% d
  145. PLA
    * v! O' N: Z% L9 G  R
  146. Quit_End:, B0 J+ n" W/ T$ u3 k4 F' g
  147. RTS
    " P+ v9 d7 U: [  ?1 K. j6 @

  148. # ~0 V1 l) Z, t4 f1 B. ]
  149. ;==================================================6 \0 T8 i! [" B) |  j4 S
  150. ;等待音乐结束) B) p2 K2 Y9 G! x
  151. Wait_Sound_Stop:' o% c( {1 ?  t0 ~8 F$ d5 b  M9 X
  152. Wait_Sound_Stop_Check:
    - s. O! J& i  {( }- n% c
  153. JSR NMI_Wait! y; _- I; t: j. V% c: }6 y% m3 l, [! G
  154. JSR $F825
    ' l- A7 P. r& D3 R/ I. z: d
  155. LDA $010A" Z& y6 Z3 r& G7 S
  156. BNE Wait_Sound_Stop_Check
    : `3 `' A# {! D# e8 e6 g4 Z
  157. RTS) X+ W" R, t/ y2 e
  158. * [  a7 S/ Z& ]# A$ z7 J* K
  159. ;==================================================  Y+ o6 {' {% v2 `0 G9 ^1 H3 A
  160. ;保存屏幕数据% }1 m5 O$ ?! d: d! C+ U5 M
  161. Save_Screen:# @5 _5 o! e* Y/ D4 \
  162. JSR Screen_Off9 ^! ^' E& A7 Y4 w3 y
  163. JSR Save_Zero
    8 a" i- i2 ~3 H
  164. JSR Save_Ram# L+ t! w' W, B* N. ^7 b4 a
  165. JSR Save_Ppu
    ' z: k/ V1 j$ W8 u1 x" g% c
  166. JSR Ram_Init7 U5 T+ o: I# q
  167. JSR Sprites_Init
    , Q3 m1 W2 b9 Q# z, r+ Z, g+ g
  168. JSR Clear_Ppu
    ; v' o, s. E/ @9 ?0 Q& i9 w( u' h2 T
  169. RTS# K) O8 L; h; T7 P- {
  170. 7 n- P0 D" X: O2 S8 J
  171. ;==================================================
    7 j" a3 u2 t# i% R* }& E
  172. ;加载屏幕数据
    9 C; ^. Y1 H: H3 {0 N
  173. Load_Screen:
    + D5 f: ]9 i9 v0 U0 U
  174. LDA #$00
    9 ]3 K: R  `+ y# H: {* N
  175. STA $2001. V: A4 c( Q8 R" u8 d; {. C1 M
  176. JSR NMI_Wait
    # Q4 {5 `; U& e
  177. LDA #$02
    & l! Y! x9 l! ?1 f1 O
  178. STA $4014
    # M1 N7 L+ \- a7 W2 Y, U' D; |0 f
  179. JSR Load_Ram
    , \- L- a0 T; @. C4 ?% S
  180. JSR Load_Ppu: _; v4 I; s5 L' d8 t
  181. JSR Load_Zero  O& b4 C. O, N! n* j! n
  182. JSR NMI_Wait1 O1 ~! }0 T, K: j3 A: j! z  @
  183. JSR Load_Palette
    - L5 C6 x! O; S: _$ O! V$ k
  184. JSR Screen_On
    ! d6 }( c% E/ O  Z) r. e( w! |4 K
  185. RTS
    , Z! V, `- P6 I9 N4 \0 w

  186. 9 n+ X# V/ K, a) I$ {! a
  187. ;==================================================, s( z, `& ^: V8 d9 a1 o, F
  188. ;关闭屏幕
    ) @% Y1 d, K) \" b" P
  189. Screen_Off:$ R5 F1 `$ d/ {- c* g% ~- a
  190. LDA Rom_Nmi_Addr" w6 p; m4 u& z. T- ]. r5 \. S
  191. AND #$7F
    ) ^4 {0 G( u# ~$ g( s. F. A( B5 O
  192. STA $20005 k; z8 D, |) S4 ], G4 S
  193. JSR NMI_Wait, @( l! b. j! ^7 t# U+ x
  194. LDA #$00' p( w5 T0 @: K' t( C
  195. STA $2000& D- i! q5 ~4 z1 h: F
  196. STA $2001
    % V- F$ g$ B7 s; @* c$ {
  197. RTS# v+ Q# \' g8 o; Y1 P# K  f

  198. 3 }' X; d# \$ M
  199. ;==================================================
    ! A- j$ A- _( _: c
  200. ;开启屏幕2 R" ~  q* G- z' I# |
  201. Screen_On:
    % p1 v' a  M( y$ _3 f8 c1 S
  202. LDA Rom_Nmi_Addr
    / Q, _7 Z/ C8 _. V8 P
  203. STA $2000+ N: B; P# U9 H6 i8 ~; T
  204. RTS) s8 B9 L. {; E5 a5 F

  205. 0 k5 k1 s8 d4 y. \+ _5 k
  206. ;==================================================2 Z+ D6 m) z" ?" e$ z+ P
  207. ;清空占用RAM0 e0 X" ?7 D/ i' {$ x- m
  208. Ram_Init:6 c1 w& X& I1 B4 y
  209. LDX #$00
    & C& O+ e" T0 I" X9 S* d) h/ h* a
  210. LDA #$00+ d# t# i9 s) o6 `
  211. Ram_Init_Set:
    ! D6 n* X+ |& P& w* G; `
  212. STA $00,X
    6 ^" [1 z2 }0 u2 _
  213. INX
    : K7 S" _! d" v
  214. CPX #$402 j) s1 n  H/ p, S9 W
  215. BCC Ram_Init_Set
    ; W/ k# k8 ]9 M4 L- U: C" C% m& T
  216. RTS
    ; ?8 k4 \, |+ p8 A
  217. 6 d8 ?1 k, c& f  M1 ?- j
  218. ;==================================================
    1 c" m$ z% D9 T* a
  219. ;清空占用RAM: W% d! d! e7 d
  220. Sprites_Init:
    & ], ]2 |7 A, X2 G
  221. LDA $2002
    % V; D! x: o* O
  222. LDX #$00
    ) {7 G* e& p: o# ]$ p: p
  223. STX $2003/ T5 S. m( ]7 A, L# V" e
  224. LDA #$F8
    " O( h  t7 m+ ]* u' [/ y' N
  225. Sprites_Init_Set:
    5 o" w3 k5 R, z9 n7 o( g
  226. STA $2004. w5 ]6 h' u; e  c
  227. INX
    9 K- B4 d' N# }; D/ h
  228. BNE Sprites_Init_Set$ _- V& s% V. d
  229. RTS# v4 R5 G8 T4 {1 h) D! f6 n: b' X

  230. ! H- s. o/ k; j: W2 S
  231. ;==================================================& o1 I% P1 ~" u, }
  232. ;保存零页数据& R8 h% k5 X7 i" `% R. @5 p
  233. Save_Zero:$ k2 [0 I+ d7 z* P0 Z7 t
  234. LDX #$00
    % R4 |0 X- B4 `3 j) V; ^( A1 t
  235. Save_Zero_Set:1 C# `; L$ ]# \0 ]0 l
  236. LDA $00,X
    ) d3 O) e5 L% z- [  ]' t# \, {5 N# s7 S
  237. STA Save_Zero_Addr,X
    2 E  E- U9 J1 w: [3 ~3 C7 n# ~
  238. INX
    9 U4 k/ I3 t' {2 C; Z$ s+ h; W
  239. BNE Save_Zero_Set; `% f8 I) r- _9 o0 N! q3 W+ g6 v
  240. RTS9 o9 A* Q9 _5 v! E8 z

  241. $ F( R% U! j  J: o1 Q
  242. ;==================================================$ v* ?6 ?) Q: p, F1 C
  243. ;加载零页数据
    0 @) w: L, s5 L8 B* a! ]
  244. Load_Zero:
    # ^0 A5 x  Y- x0 E7 V2 ?' D, G
  245. LDX #$00& D- T2 M. ], l
  246. Load_Zero_Set:
    * x8 u$ u* P  I9 Y
  247. LDA Save_Zero_Addr,X$ H6 Y0 w7 y% R$ q
  248. STA $00,X
    ; {. ^/ @  l1 Y
  249. INX5 e/ y3 e- t5 {: m  {0 U
  250. BNE Load_Zero_Set8 }$ f9 S& m! C1 l. Q( o
  251. RTS
    ( _7 K, K* {- m+ d
  252. ' @$ a1 [* j. ~/ H
  253. ;==================================================
    & x# Z2 H, c5 X
  254. ;恢复调色板  a" R3 k3 G2 Z! t5 {7 [; L
  255. Load_Palette:! @: T* a: A+ r9 m4 }
  256. LDA #$3F, G# x; K# _5 q) G" q' `
  257. STA $2006
    & U. c' x7 p' J9 q; z
  258. LDA #$00$ p: h- E& ^+ s4 i' _
  259. STA $2006  ~) q% O& ]) P* N% ^* C' r1 p
  260. LDX #$008 R3 F* `" a9 P6 E
  261. Load_Palette_Set:
    , O- s: G! q" l& {3 |$ |
  262. LDA Rom_Pal_Addr,X* N1 i; I  x) |6 b( Y- l
  263. STA $2007
    ; J9 `1 g. `& o) G' J, H) [
  264. INX& O7 k; z, E& F# W) y
  265. CPX #$20$ W% h& V2 d- L4 ~- P
  266. BCC Load_Palette_Set
      t- h- K4 X+ d1 u/ P, X7 n, b8 O
  267. RTS
    8 ?, J( i) i, m! Q/ A+ _) x& ^
  268. . G7 u, x2 P/ `% d+ d* R
  269. ;==================================================3 @2 E! X- }# W3 \
  270. ;==================================================! Z4 |+ F3 U0 e) L3 ?

  271. : m1 m. q- y7 C& s0 w) m( C  O  _
  272. ;==================================================6 s: z9 M4 k6 m+ t8 _9 S; S0 ]
  273. ;程序开始2 L! u0 x( z9 k: I, K
  274. Program_Begin:- O$ \4 H, k$ R, h' r2 u6 w
  275. ;==================================================
    3 B6 ?; P( j) C8 \- Q
  276. ;图形设置
    9 J- v, W% K5 M4 R5 g6 F; n! }
  277. JSR CHR_Set
    2 a2 v/ A3 u6 W' C) u, I; x! G
  278. JSR NMI_Wait
    ) z; T' T* f) x% J, A$ L$ e
  279. JSR Palette_Set
    7 g: Q$ k# C0 ?
  280. JSR PPU_Data_Page_Show
    " t# N/ ~* S5 ~
  281. * i  Q4 K$ o+ S- o: {; D+ q/ l) t
  282. ;==================================================6 [* V5 b# W; \" g" ?  X
  283. ;开启显示
    ' ]3 L" C* w! A" k
  284. LDA #$1E
    $ k( Z5 k) c" Q, J5 s* ^4 \6 ^
  285. STA FC_PPU_Status; s" R. {9 M, l7 P

  286. ) a/ Y6 W7 j; B4 g3 \( v
  287. LDA #BTN_SELECT( _6 `6 L. U7 |# o/ ^! q
  288. STA Button_Keep
    1 v# W7 b% v$ p
  289. ;==================================================
    ; n" ]1 b2 H. p9 d( W
  290. ;模拟NMI循环
    % v6 j9 E" N, D8 u. T9 f' ]/ G
  291. NMI_Loop:
    # [+ G$ u7 ^* H8 _( N4 D+ w9 u& K
  292. JSR NMI_Delay# b  I# I3 t# y: C8 P
  293. JSR Button_Process7 D7 Z- L; B" t
  294. JSR Button_Auto_Press! U! L0 _# |  x4 z4 R  V, v" E7 O
  295. JSR Change_Select_Item6 W* v# z7 F# g7 D- p6 q& U. b- N
  296. JSR Change_Function1 k7 J( R0 e  a  R! ~
  297. LDA Button_Once
    3 p0 Q& D% w$ e& r! T
  298. CMP #BTN_START
    / B; c- _# Y8 v: L7 h" o8 v$ ?7 l. Z
  299. BNE NMI_Loop
      ?; P1 H# Y# m* L# u4 p  I! e/ z
  300. RTS8 \9 V. ^* e: A7 d9 X1 {! |, x
  301. 9 U2 o8 w* I& N0 D
  302. ;==================================================0 j/ @5 c- j7 A: @% j6 l/ u
  303. ;模拟NMI中断
    / ~7 ^. R7 ?" O6 h
  304. NMI_Delay:
    : U; A4 F* K) ]! e9 z& s- ]
  305. JSR NMI_Wait4 O. D, s8 R6 o! h, S3 `+ {
  306. JSR Show_Select_Cursor* P$ g/ ?& A  Z
  307. JSR FC_PPU_Process
    ! N4 ^4 ~/ \. _' e
  308. RTS
    ( k; ]: V. [: \5 _

  309. 2 U# ^% s  B/ M, m: P  `0 n% t
  310. ;==================================================
    : J$ h8 w( A4 l; s
  311. ;等待NMI中断4 M. ?. |7 y6 Z  G9 P
  312. NMI_Wait:$ w# m% b1 [8 j( y0 B2 R& Q
  313. LDA $2002
    ; C6 j+ m, k, E& d5 b
  314. BPL NMI_Wait1 W( K4 s( w" V" L9 |
  315. DEC FC_Time_Count
    9 F% F. W" {7 o8 H  v& S
  316. RTS
    ! D. _$ Z4 \' c  B; R

  317. ) A# Y- t* ?# o2 ^: n. k
  318. ;==================================================
    7 d* C( o! F) O6 d( F5 |' N& a
  319. ;PPU写入模式配置属性% n6 U6 S" \5 t0 I
  320. FC_PPU_MODE_CNTL = $FE               ;带计数行写入
    ' ^# B+ v! g" V( p
  321. FC_PPU_MODE_CNTC = $FC               ;带计数行清除
    ; I5 t3 l2 A4 R- `& ~% k
  322. ;-------------------------------------------------" {5 L7 {  a$ E5 p8 S' O: I
  323. ;PPU处理: ~8 q/ G2 ?" b  @4 f( Q- g
  324. FC_PPU_Process:8 w' T. C5 H+ \+ Y  R; A  O; A: B# `
  325. LDA FC_PPU_Buffer7 n# l6 [7 K$ b* v9 o# r
  326. BEQ FC_PPU_Process_End
    " V$ X7 H6 W9 p
  327. JSR FC_PPU_Process_Beg
    3 F: Z0 h5 o3 |) R3 l" d
  328. FC_PPU_Process_End:" x; l5 e7 e! P! s& m. a
  329. LDA #$00
    , c: u4 g! x1 C3 G: X' n; ^
  330. STA FC_PPU_Buffer
    & k9 Y7 M% r1 E  ^( h
  331. STA $20063 M3 o2 W, R8 m; C, `8 l$ C+ E: P
  332. STA $20065 ^# _! M# U' d" I
  333. STA $2005
    + M1 u6 ~6 f7 X" X  b! ^  ]
  334. STA $2005& D  S9 p; L  k3 l+ m5 e
  335. LDA FC_PPU_Status% M! `& q9 Q- H: I/ ^1 [
  336. STA $2001
    / F3 d' J, N. @  }! l
  337. RTS! a1 g7 h  l( N* C+ H$ U
  338. ;----------------------------------------
    ; P( ]% `% J2 V7 c* K
  339. ;PPU处理开始
    - `$ f4 J7 w5 V( u9 e
  340. FC_PPU_Process_Beg:5 G2 C3 ^) K5 k
  341. LDX FC_PPU_Cursor
    # U3 n0 j& d5 H5 c, T( @& z
  342. LDA #$00, B* I; \2 r6 @+ C- y- d
  343. STA $2001
    + I: i8 P# l- ^7 D. h: Q
  344. STA FC_PPU_Buffer,X
    1 l- d) m! D: f4 C( Y5 q8 v( ?! q
  345. STA FC_PPU_Cursor4 ?5 I5 I& q) E- j0 P% z( s
  346. LDX #$FF
    + Q1 B2 @  P! t& L
  347. CLV( V' W9 Z8 z7 r1 f* W
  348. FC_PPU_Process_Mode_Select:
    5 R, S* m8 q" K% e
  349. INX  b% W4 t. {8 G9 p
  350. LDA FC_PPU_Buffer,X: Y  S6 Y: V6 h! ~  D" T8 ~2 ~
  351. CMP #FC_PPU_MODE_CNTL' X* z0 h- V0 h# p% h( G) U2 F
  352. BEQ FC_PPU_Process_Mode_CountLine
    7 J. |2 L9 w1 K& f/ a& q
  353. CMP #FC_PPU_MODE_CNTC' s7 Z  R4 N0 A/ v7 m
  354. BEQ FC_PPU_Process_Mode_CountClean
    ' j- }4 h7 K7 O4 H
  355. RTS7 v1 b5 R: p  r3 Q: _. g
  356. ;----------------------------------------3 ^" u! ]/ q; ~% z# Y7 a
  357. ;计数行写入模式
    : t& k# s) ]* F& _  P
  358. FC_PPU_Process_Mode_CountLine:
    4 P. A/ s* ^6 M9 y' L
  359. JSR FC_PPU_Process_Set_Addr_And_Count( f4 o' v5 I( Y- e4 C; C; e4 @
  360. FC_PPU_Process_Mode_CountLine_Write:
    + @/ X4 A& u2 \+ W* N
  361. INX. z8 B3 W% \$ \$ r; r0 ]
  362. LDA FC_PPU_Buffer,X" C$ a9 l6 E' Z  h/ l" v1 |* V
  363. STA $2007
    , x0 D, A  p; `  ]7 X
  364. DEY2 _; Q. x" \* _5 j
  365. BNE FC_PPU_Process_Mode_CountLine_Write
    3 e5 x1 ]7 i( Y
  366. BVC FC_PPU_Process_Mode_Select6 @: N6 o( J6 M" h8 R8 y4 o
  367. ;----------------------------------------
    0 J; @8 l' o8 S9 d* G: A: n7 c
  368. ;计数行清除模式+ e/ p8 n" J9 u
  369. FC_PPU_Process_Mode_CountClean:
      o) T; w- z$ s1 k- ?, V  Q
  370. JSR FC_PPU_Process_Set_Addr_And_Count" S/ P% i) ?6 w- y$ X# W0 z* \( X1 C
  371. LDA #$00( j8 O1 e% ~+ r2 p
  372. FC_PPU_Process_Mode_CountClean_Write:
    & _( g9 v$ l6 _; G8 e
  373. STA $20077 d* \! c8 D- v' Z& M
  374. DEY( Q: J5 u' t% d5 g4 w
  375. BNE FC_PPU_Process_Mode_CountClean_Write( d3 l! D9 t! O) L# F
  376. BVC FC_PPU_Process_Mode_Select
    ( W" r8 |1 j4 e$ |$ C2 N
  377. ;----------------------------------------; P( M2 p% M& C1 S8 U5 P* u$ r
  378. ;设置PPU地址和写入计数5 G$ i, |; |7 a/ t+ N# S' Q5 x
  379. FC_PPU_Process_Set_Addr_And_Count:
    # ^4 z+ P* `5 c5 b% F: Z
  380. INX
    + L+ _. l0 J0 ^# Y! C
  381. LDA FC_PPU_Buffer,X+ ?5 T% Y& a7 j8 N7 W" b
  382. STA $2006. y: {7 C7 @) l8 M! n$ X
  383. INX
      }  i8 g4 F9 @6 `
  384. LDA FC_PPU_Buffer,X+ p+ J5 x- t! Q# l; G2 l5 P
  385. STA $2006
    + ~$ E4 H  V* ^& S+ O8 ~0 q) f
  386. INX
    5 o) o8 _- T8 R- x
  387. LDY FC_PPU_Buffer,X
    ! G4 d) J4 T8 f% }5 e' {% K
  388. RTS
    . {) I3 K) V0 y1 ]& g
  389. + h% E  g: ?( v9 Z5 T, _) h
  390. ;==================================================, E9 R1 P" G3 ^3 r- J% J# b
  391. ;设置CHR图形
    % `5 l+ ^+ r% U1 P0 C4 J+ |- P, B
  392. CHR_Set:
    2 |: l6 y. _6 |. Z/ e
  393. LDX #$05
    5 ]4 M0 B: T* F- g. p' e, A6 X
  394. CHR_Set_Data:
    ( e; Z' A/ y% ]  v
  395. STX $8000
    + Q4 x" a& O. ~  T
  396. LDA CHR_Data,x0 x! Y4 ^6 l6 v, |
  397. STA $8001
    ' D! X# S6 R. ^( S1 q; T
  398. DEX% g. H6 w! n1 P
  399. BPL CHR_Set_Data
    % @: v  L* s; c8 M+ c
  400. RTS
    / M" l0 Y- ]* f1 r/ E
  401. ;----------------------------------------' h- a7 y1 N& \+ N. u
  402. ;CHR图形bank数据' X. @! c  m  i; f) U4 g3 j
  403. CHR_Data:, n( o% ]$ f0 p/ ^
  404. .BYTE $00,$00,$00,$00,$00,$00
    : v/ D3 j, f8 g

  405. - y+ e+ C8 s$ @5 D! ^* G6 u
  406. ;==================================================7 V" e* v- T. p5 N" [% A
  407. ;背景调色板设置/ i7 N, _  O% m4 Y2 B4 X
  408. Palette_Set:
    2 d% B. ^" w$ q7 Z5 H  p8 m
  409. LDA #$3F
    - |% q1 w3 W4 D% t2 n% m
  410. STA $20065 z2 W9 g; ]2 M, ~: b
  411. LDA #$00
    & d2 X6 C4 J- \8 W. Q+ |% ^6 v7 e
  412. STA $2006
    ' H7 o  w. }& Q# K  @
  413. LDX #$00
    . Z; M$ Y1 t' c6 O0 S2 o# ^. A3 S+ n3 t
  414. Palette_Set_Data:" L3 s4 u: j1 l. b& \% W- z
  415. LDA Palette_Data,X
    ! |  l% Z% N; V' E
  416. STA $2007
    ' E6 i! B/ \& ~$ R' d
  417. INX, d0 k0 E$ r" _/ f, ^
  418. CPX #$20
    ) t2 u& ~! B% J0 X" W) p
  419. BCC Palette_Set_Data9 T. j# o% e6 c3 W
  420. RTS
    7 Z1 x+ o; P$ E
  421. ;----------------------------------------0 s& l! Q$ f0 C$ ?+ @
  422. ;背景调色板数据, E4 |% c0 f2 \" S# d
  423. Palette_Data:
    7 z- `- S1 K7 ?2 }- `, e# x
  424. .DB $0F,$29,$24,$24,$0F,$20,$20,$20,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    $ U) u6 m! J* B( F) T9 J
  425. .DB $0F,$20,$26,$16,$0F,$24,$24,$24,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    " M* g  q5 u2 \

  426. " H9 I  a+ F6 w. M  ?* b

  427. ) a$ G. I+ \1 K) t' H
  428. ;==================================================! A3 v) L( L  J) |+ U% i
  429. ;按键扫描7 f% ~! N/ w& o9 g; h+ e5 F
  430. Button_Process:$ J. Q$ k  r3 v0 \
  431. LDX #$01$ s5 Z; S0 V( h2 z
  432. Button_Process_Beg:) e& ^- H' t8 e9 k
  433. JSR Button_Scan# E' c( r3 o. B% g
  434. LDA Button_Keep,X. F% ]3 l# P. a: ^! k& \3 n2 p
  435. STA Button_Temp,X( D5 y' j+ u0 c; }+ j
  436. JSR Button_Scan
    $ i+ @3 p$ V9 M: E0 j& }
  437. LDA Button_Keep,X, R& n: i, X0 H
  438. CMP Button_Temp,X
    ! n: ^) r1 e2 @
  439. BEQ Button_Get_Once
    * E* Q8 H1 M  E# c! s5 f
  440. LDA Button_Buf,X+ ^- R6 U  q4 A$ N4 S$ {
  441. STA Button_Keep,X
    " D2 ^: J9 `& m3 S
  442. Button_Get_Once:0 K2 @" ^  n* u  K
  443. TAY" W5 u) I; v. o. c3 [: l9 |
  444. EOR Button_Buf,X
    2 l1 p* i# B0 o6 d0 p
  445. AND Button_Keep,X+ Q4 B+ H6 ~/ V5 j1 J. w) f$ j
  446. STA Button_Once,X: j2 \1 Q: P0 `* q' ^
  447. STY Button_Buf,X
    , s. w. t) K2 _6 q+ G, O; g
  448. DEX
    3 m, X. H/ m6 x" i8 \1 m) F
  449. BPL Button_Process_Beg3 V( t0 z" Z; x" S5 a( t
  450. RTS
    & ?$ l1 P! L9 {
  451. ;----------------------------------------
    , q5 J% J4 Q: Z) f1 i: t
  452. Button_Scan:. n5 r6 Z- o( g: g7 n# l4 e
  453. LDA #$010 U0 J* {) n$ _* Z7 \
  454. STA $4016
    ( Q4 j4 n0 r) w" R0 d" U+ _+ J( n0 ?
  455. LDA #$009 d" ]8 c* L+ i0 Y
  456. STA $4016
    % ]9 t) z% m& F
  457. LDY #$08
    % i' k7 |% u4 n% e- c7 C! b
  458. Button_Value:
    . S4 t4 U# W. F- }: p
  459. LDA $4016,X% ?; S: h, x, A2 g# k$ [
  460. STA Button_Status,X' ]0 v  ?# b* S3 F) [
  461. LSR7 K7 S- W& C9 J0 \
  462. ORA Button_Status,X! U2 D8 @+ g1 a, A! V4 k
  463. LSR
    0 a: |7 L+ d  d2 Q
  464. ROL Button_Keep,X
    ( S4 H) `5 q6 x* X4 s. d
  465. DEY
    6 ?  [$ w; j) u7 K; E3 m7 Q# \
  466. BNE Button_Value
    , I3 |* A; y' `& M" o8 y8 j
  467. RTS+ j9 }8 P8 v/ ?+ u+ }
  468. . L; _) J. `! s; L" _; b
  469. ;==================================================
    . {/ v+ Z& W7 [: G% C" j8 ~$ _: v: `1 Q
  470. ;按键自动按压
    : D1 E, o$ c1 R+ j- |) z$ d) r. f
  471. Button_Auto_Press:
    ' C3 T% \( K: n- Y. Q. i7 }! {0 n
  472. LDA Button_Keep( J" d- f" G( t8 V. o0 R4 {; E9 u
  473. ORA Button_Keep + 1
    + k( W; o+ v5 B  L5 u
  474. BEQ Button_Auto_Press_End; A$ y* \; i4 P; @
  475. INC Button_Auto_Delay
    6 K$ V1 T. O$ W! r4 m
  476. LDA Button_Auto_Delay
    + [2 g8 s  t3 k% p: a
  477. CMP #BUTTON_DELAY_MAX. b. ]6 B  r' e8 q6 s7 A& `$ @0 J  Y, C
  478. BCC Button_Auto_Press_No_Active% f# f& T4 V5 {" a
  479. LDA Button_Keep" H* M4 F( W7 J
  480. STA Button_Once! ^" j' a( r' t: N* M% R
  481. LDA Button_Keep + 14 l, M; C/ X) v% ?6 I
  482. STA Button_Once + 17 o, u- E/ b8 r/ R
  483. LDA Button_Auto_Delay0 O( P7 y7 Y4 S4 i, V; W& _$ O
  484. SEC
    2 Q" }: F! N9 E- r7 @" W! n
  485. SBC #BUTTON_DELAY_SPEED7 s# b$ G$ d+ e! n) r& g( e! e
  486. STA Button_Auto_Delay9 ?* @( {' {% I" I4 K/ H% Q
  487. Button_Auto_Press_No_Active:% d0 b1 t: g4 |8 y! ]% N
  488. RTS
    % |( q, B% u3 p' F. r
  489. ;----------------------------------------! g+ V$ z! D5 T- \1 J
  490. ;未按压按键3 b, s  o4 m2 ]% `# g9 _
  491. Button_Auto_Press_End:
    ) _9 @  U4 C5 v$ x7 `9 c2 b/ l
  492. LDA #$008 Z: H7 \" h0 B1 S: e
  493. STA Button_Auto_Delay
    7 a2 }( Y0 j4 H
  494. RTS4 v$ k* x$ s" t4 b: @7 V
  495. . r( }+ P$ `/ _- }) G' w% ~0 n
  496. ;==================================================4 u: H7 s9 ?; e% i2 Z
  497. ;设置PPU写入模式
    / V! D( `$ n7 p4 x+ h, X
  498. Set_PPU_Mode:5 P# o8 B! |( B3 `0 r
  499. LDX FC_PPU_Cursor
    6 H- Y4 O* G6 c' X, v, _) N
  500. STA FC_PPU_Buffer,X
    1 ?1 m& O, s% I: S
  501. INX  T7 J* K) C7 d! n6 D  }/ w% e
  502. STX FC_PPU_Cursor
    - g- Z' |. ]9 z- F/ _
  503. RTS$ H) G, y, K/ v7 H6 ^/ T+ D- x
  504. , E9 T! D8 M; o
  505. ;==================================================( u) J9 x7 I' G  R6 C
  506. ;写入单独一行文本# H9 Q( m/ q8 v7 n7 l( e
  507. Set_Select_Addr:
    ! [, F( f3 p- S
  508. LDX FC_PPU_Cursor3 ~4 j1 Q% w5 l" A  c9 B
  509. LDA FC_Select_Temp9 ~1 q  I! |# w( b
  510. ASL
    : @# W* p& o, w+ x
  511. TAY5 Y( h* k. K# f9 J& {. R
  512. INY/ f- ^* L2 H/ n: u1 ?
  513. LDA Text_PPU_Addr,Y
    # P/ Z# t* h+ p
  514. STA FC_PPU_Buffer,X
    # b8 S' O8 j. e) i# ^) a2 R, v; q. c" y/ ~
  515. INX6 c8 x0 d2 o! q% O: E) _. K- r
  516. DEY
    : _- O. E/ Z& r, r  Z3 H' s
  517. LDA Text_PPU_Addr,Y& ?  Q8 T6 G& D& R( ?
  518. STA FC_PPU_Buffer,X& V- [4 n9 k5 v
  519. INX4 @; W) L2 C0 V$ N2 j, r$ e* c
  520. STX FC_PPU_Cursor
    & Y8 E4 n) y; W" K3 ^1 [" Y
  521. RTS7 ?7 r, N& c5 ^( r9 G; S

  522. # A  {0 S2 v  |7 H
  523. ;==================================================
    ! ?  S9 W& ~; Y6 t$ F
  524. ;写入单独一行文本
    1 x# ?5 R, g+ E7 }8 X
  525. Set_Select_Data:4 u9 V( S' v. \  O! a6 X* o
  526. LDA FC_Select_Temp. x0 c% r6 H, `( C8 _2 E
  527. CLC
    0 R5 _8 ?9 l) }& G1 R0 q4 W' X
  528. ADC FC_Page_Cur
    % M+ E' T, \% {+ `1 c9 H
  529. ASL
    % a4 Q1 C, A, u! Y$ Q
  530. TAY1 Y. ^+ ^; m/ g- U
  531. INY: F: B( }6 W0 g2 @
  532. LDA Text_Data_Addr,Y4 J: y) z: q5 j* }" R' o
  533. STA FC_Data_Port_A_H5 _1 I" E* k- e' w2 t7 }
  534. DEY
    + R; }4 P; j7 o1 R
  535. LDA Text_Data_Addr,Y
    6 V+ ?9 z2 w) \+ h5 d  k0 d3 T
  536. STA FC_Data_Port_A_L; D7 u9 b, ?7 V' _. E, o3 w
  537. RTS6 e4 E9 K0 k' y5 A9 v% \) q) K

  538. 2 ?: |3 d/ W3 Y3 K( e
  539. ;==================================================
    ( G3 W; u( m8 D
  540. ;清除旧文本6 {% d2 `- S% w6 E6 S
  541. Set_Select_Data_Clean:
    / I! M) h% L2 q  A0 V
  542. LDA FC_Select_Temp0 j0 _. x* n6 n0 K- O% O
  543. CLC
    1 N* S3 H/ C$ z) F3 Y5 J
  544. ADC FC_Page_Old6 b* I0 Y, J' h/ N
  545. ASL
    3 T( T# m" e% a0 p- t
  546. TAY
    ) p: ?. \% _/ k4 E( l( L
  547. INY
    % Z1 B( w: z. r- ~
  548. LDA Text_Data_Addr,Y0 l2 c2 Z% N+ ~) [% t
  549. STA FC_Data_Port_A_H! [5 V* O/ [. j" ?5 W
  550. DEY% h% v" N* W' z" B1 Q
  551. LDA Text_Data_Addr,Y
    ( u; l( U8 y1 B9 x- o5 T& n: O
  552. STA FC_Data_Port_A_L
    + i. |& B. ^6 G) x
  553. RTS7 o9 Q$ Y4 I3 ^

  554. 1 r3 M3 k2 g  X6 Z9 n1 y
  555. ;==================================================
    # R0 w+ @' P; S# V
  556. ;写入单独一行文本
    3 H7 l6 [+ I" U. A6 G
  557. PPU_Data_Write_Item:
    ' u6 o! o; a. S, h
  558. LDA FC_Select_Temp
    - {, O( L5 T6 x( P- ^" C' r
  559. CLC% H" H+ Z2 e* C5 ~
  560. ADC FC_Page_Cur
    $ a. F# p  x' h
  561. CMP #FC_ITEM_SUM" r6 g0 J# W2 C) a
  562. BEQ PPU_Data_Write_Item_Set
    % h6 P" ]+ o9 H5 Z1 U; G; g
  563. BCS PPU_Data_Write_Item_End: y5 T% z! @  D
  564. PPU_Data_Write_Item_Set:
    % n: ]7 G3 T& u4 O6 B. _
  565. LDA #FC_PPU_MODE_CNTL, @, U6 R9 i/ e. G# S+ ]' }
  566. JSR Set_PPU_Mode
    # k, [/ T8 |0 o$ }; q; b
  567. JSR Set_Select_Addr( c3 C0 a  \/ l0 `# H$ S
  568. JSR Set_Select_Data+ a# F2 n1 \9 f
  569. JSR PPU_Data_Write_Line
      y5 Q" ~% ?( ~! P% d/ i
  570. PPU_Data_Write_Item_End:! _1 V8 B" P7 Y- o* h9 {
  571. RTS2 B$ T, }5 V" t9 G% b" w

  572. : Q5 [+ }& I( m( Z
  573. ;==================================================7 c) Q# y) ]2 ~3 `; \7 V9 P
  574. ;清除单独一行文本
    8 E) O! Q  \9 X1 r6 S8 w* ?; R
  575. PPU_Data_Clean_Item:
    6 O1 A, U& N' r/ J7 D
  576. LDA FC_Select_Temp8 u% L. b# _5 c1 d( r1 z
  577. CLC
    : u6 f( Q9 h# h, \
  578. ADC FC_Page_Old
    # G# Y2 ?3 _2 O) q) W; T  B
  579. CMP #FC_ITEM_SUM
    # j( Z2 z5 d- V  n( b  }% I
  580. BEQ PPU_Data_Clean_Item_Set
    3 L- F7 c% m3 U
  581. BCS PPU_Data_Clean_Item_End1 K3 M* Y5 Y0 Y2 g% v/ `
  582. PPU_Data_Clean_Item_Set:
    : w5 g/ ]/ `6 q0 j$ I
  583. LDA #FC_PPU_MODE_CNTC  K; d. P% o* @  ^3 x, G) ?
  584. JSR Set_PPU_Mode) v# ?  I' F7 |" K4 e. F* @
  585. JSR Set_Select_Addr& b8 i! _  l% _- M+ A
  586. JSR Set_Select_Data_Clean
    + ~  \! h' ~7 j2 p3 X; l5 l. p4 o
  587. JSR PPU_Data_Clean_Line
    . n* Y& _+ k  {+ f
  588. PPU_Data_Clean_Item_End:+ _0 @+ [9 x; t# c- {1 n- ]- k: t
  589. RTS
      J' j" c- a4 J

  590.   V9 P, o: u& F5 a( I% Q
  591. ;==================================================
    ; r; Q& _1 `, z% F8 S' c* E
  592. ;页内容写入4 d8 h; q* o1 n
  593. PPU_Data_Page_Show:3 d% c/ G8 ]" ]& Q  c( j, N3 k
  594. LDA #FC_PAGE_SIZE7 C& D/ c+ ^# K0 t. b. ]8 S
  595. STA FC_Page_Item_Count
    ( e9 @, A+ k; Z+ N6 N$ o; U( [# i
  596. LDA #$007 z2 w' Z; I( s$ F  l
  597. STA FC_Page_Item_Buffer; x* M2 \' `- m
  598. STA FC_Select_Temp- V' ]/ i+ {# A2 z8 O+ c
  599. PPU_Data_Page_Item_Set:
    ' J8 [1 C5 ^/ W4 q$ y/ \1 ]
  600. JSR PPU_Data_Clean_Item
    2 |, L; h+ ?+ V) R) T
  601. JSR PPU_Data_Write_Item
    - b* S6 @7 I9 r
  602. JSR Function_Status_Clean
    - \0 H. {. s( s2 W1 H3 Z7 ?
  603. JSR Function_Status_Show) b. v# U: n9 J6 ?2 V. p
  604. INC FC_Select_Temp  b' j: N" h% l( g, Z2 j
  605. INC FC_Page_Item_Buffer) r5 v' q- d3 q' D6 U
  606. LDA FC_Page_Item_Buffer
    ' U7 V6 T* c! _& Z
  607. CMP #FC_PAGE_BUF_SIZE3 z$ G" i! w: l7 F( v6 t! G+ y
  608. BNE PPU_Data_Page_Item_Set_Check" l7 z$ k! J; U. J2 Z' [
  609. JSR NMI_Delay) ~  k, V0 C1 D+ ~/ ]8 w% f6 j
  610. LDA #$00* H) a3 L: G: j& Z. a
  611. STA FC_Page_Item_Buffer
      K3 Q. R5 W$ B% p
  612. PPU_Data_Page_Item_Set_Check:  I$ A: U% ~% ^# \/ |2 N: g
  613. DEC FC_Page_Item_Count( I, A" v% m, N9 y
  614. BNE PPU_Data_Page_Item_Set( s2 j2 j; D  r( X3 d
  615. PPU_Data_Page_Show_End_Check:
    4 E4 P! W. F/ M' I" t
  616. LDA FC_Page_Item_Buffer4 e2 `) ~! [2 T% s( S
  617. BEQ PPU_Data_Page_Show_End4 d' X  C. a$ x4 t5 L
  618. JSR NMI_Delay& N9 g; v0 g; p5 X0 o9 ?6 B
  619. PPU_Data_Page_Show_End:
    ) Z& k! I" Q  \$ H$ G0 o" z) I
  620. RTS8 q( r$ O" p8 I' W) a/ E; g* q

  621. 2 R3 s  v0 V# H# ]
  622. ;==================================================
    , C$ U. v, o% P
  623. ;PPU单行数据写入接口
    2 d2 y! g* u; Z. s# z1 g  S
  624. PPU_Data_Write_Line:  B" Q" e" b! o0 ]- {6 f
  625. LDX FC_PPU_Cursor4 W& \' h  h- y4 V8 n
  626. LDY #$00
      k0 f2 i+ Y, u% n
  627. LDA (FC_Data_Port_A_L),Y
    4 i! b/ ]8 l# m/ W9 R' r
  628. STA FC_PPU_Buffer,X
    ! |! s5 Q7 k6 Q
  629. STA FC_PPU_Data_Cnt8 d' h2 m2 V* w4 q, n0 Q
  630. INX7 p7 c  p, p) c' q$ J
  631. STX FC_PPU_Cursor! Q) K+ L5 P# a% V* T& {6 n
  632. INY
    . ]9 Y* G6 A/ V: l
  633. PPU_Data_Write_Line_Set:- Z9 g7 q. D$ ~; s* `8 b6 I
  634. LDA (FC_Data_Port_A_L),Y
    # o7 V0 {2 n* [. a6 |+ X
  635. TAX
    ( w, U' R9 L' v4 s6 d) |, d
  636. LDA Char_Rom,X 5 `' U  U/ R3 ]  B6 A
  637. LDX FC_PPU_Cursor$ b  R7 v$ M+ e# x3 Q
  638. STA FC_PPU_Buffer,X  S8 B+ x# K: }6 p$ e+ K
  639. INX
      P  z/ k' M7 ]- h' J, T
  640. STX FC_PPU_Cursor0 b7 F% ?% F) A( B8 _* x
  641. INY5 C( Z9 E  t4 {3 s5 f+ T
  642. DEC FC_PPU_Data_Cnt
    , m4 o. k5 e& ~$ s. L
  643. BNE PPU_Data_Write_Line_Set5 r2 ?  q# t9 ]. `& Y: X' p: L
  644. STX FC_PPU_Cursor
    : ?' |4 a# I& Z( V; G7 Y: d. E& c5 N4 Q
  645. RTS  d/ Z  [9 \" n3 p9 U; x" f
  646. * M& N3 f. K, b2 ^
  647. ;==================================================
    ( m9 T6 T$ M' Y. ?2 E
  648. ;PPU单行数据清空接口7 M& Y% n, m/ F! T2 p2 g& W
  649. PPU_Data_Clean_Line:
    # R& H) y7 U( {& l
  650. LDX FC_PPU_Cursor
    2 b. v8 u# x, m6 W2 Y# B! w
  651. LDY #$000 t# x: l& a, v& I& r) a6 i
  652. LDA (FC_Data_Port_A_L),Y' u: }1 Z1 [; }( B
  653. STA FC_PPU_Buffer,X& N$ \/ W7 _; I% y/ l5 G
  654. INX
    $ Y# @# Z! u' n2 T5 g& C& W' u( h
  655. STX FC_PPU_Cursor) \# t) G6 d+ g, C
  656. RTS
    ! v4 J3 U- G( Z: Q

  657. 0 U! n$ p3 F7 d1 k/ `# k
  658. ;==================================================
    & l- a% @" E$ h
  659. ;更改选择项1 i+ n; Z$ I/ I' R% U! S0 u; W
  660. Change_Select_Item:
    % U* c3 D: s# a# Q* A( S
  661. Change_Previous_Page:8 x; E$ N3 [5 ]
  662. LDA Button_Once0 Q# X! L  E' _% r+ v9 P
  663. ORA Button_Once + 1# P0 T/ F* J1 u! e  l
  664. AND #$023 A/ I0 b/ G8 m
  665. BEQ Change_Next_Page
    7 B+ q- ?* H- i2 A5 O
  666. JSR Change_To_Previous_Page
    8 D- \, V# I+ G3 _1 A" s& H
  667. Change_Next_Page:; D# Y3 b1 [4 b  a
  668. LDA Button_Once3 }& ^# a0 N  G& a. @
  669. ORA Button_Once + 1
    2 q% _2 T6 [5 w7 i* U$ H# f8 Q
  670. AND #$012 e; G# a& ]! w  O2 c# G
  671. BEQ Change_Previous_Item% L0 u) {. i* H1 d  G
  672. JSR Change_To_Next_Page
      Y6 |8 K+ Q8 i
  673. Change_Previous_Item:
    ! z0 B8 d2 n/ m
  674. LDA Button_Once; V. G+ k* z8 h0 }7 X
  675. ORA Button_Once + 1& V1 D) ]9 k( J8 L& g8 y
  676. AND #$08
    : O. K4 R7 @( T  C
  677. BEQ Change_Next_Item# w3 k2 M" x6 m4 V
  678. JSR Change_To_Previous_Item
    3 c$ Y- X; ?# t& R" [" w: x
  679. Change_Next_Item:
    2 S, n  J( b0 C' ~
  680. LDA Button_Once
    + ]3 p2 u& ~$ L# w( J5 i
  681. ORA Button_Once + 1
    / E; o9 S- J0 W8 O1 R/ |
  682. .IF FC_IS_DOUBLE_PLAYERS
    + L% A! |7 G5 |: R
  683. AND #$047 X2 |+ Z) `# w$ {' D: H( v
  684. .ELSE
    ! O5 s7 p; ~- d7 O) X3 y1 l- n
  685. AND #$24
    8 P  Z% j7 n; L; D
  686. .ENDIF
    & V, Z0 ?& a, D/ w, d2 u2 H
  687. BEQ Change_Select_Item_End
    9 D: S9 P3 K  L5 B9 l9 E
  688. JSR Change_To_Next_Item1 T" q; G' o# H8 E- \2 n7 Q, W- ]. m
  689. Change_Select_Item_End:- c+ s7 Q6 j0 O  ]3 X* ^6 _0 p% y0 P
  690. RTS
    3 \+ R3 X1 f6 |& v. S& i
  691. ) A1 P( a5 c/ Y  m, W2 B
  692. ;==================================================
    . ~# Y& U' l1 V7 T# x3 h
  693. ;切换到上一个选项
    ' y6 G8 b. c9 |. R
  694. Change_To_Previous_Item:# e% n4 g% b$ W4 P
  695. LDA FC_Select_Index2 }7 U  d- f( R$ N
  696. BNE Change_To_Previous_Item_Set
    6 R/ ?0 f$ t) g( n6 z/ o9 R
  697. ;----------------------------------------
    3 |' X/ r+ f0 v9 @1 w
  698. ;切换到末页最后一项* ?  _7 _( |. o% z& T+ x( K
  699. Change_To_Previous_Item_Set_Last_Page:
    & }8 N4 Y1 m1 j; Z8 U4 X- C" R
  700. JSR Record_Last_Page_Index$ \; J. r8 J( W# v! f4 F6 ~
  701. LDA #FC_ITEM_SUM$ C. _/ w- f7 \7 J' _' ?
  702. STA FC_Select_Index* Y1 ^) x7 b; e4 \' @2 U2 o
  703. LDA #FC_PAGE_MAX
    1 z0 d+ P' t7 u! @" e8 q
  704. STA FC_Page_Cur1 l- [5 [7 X) f$ P$ C
  705. JSR Update_Page_Content7 o3 w5 i  J) M+ B& f# g
  706. RTS
    5 S  J4 q# k7 l5 \5 h7 l
  707. ;----------------------------------------
    0 N& X. g0 P% {- B2 L
  708. ;切换到上一个+ D3 S/ Y. N9 B" p
  709. Change_To_Previous_Item_Set:
    / g4 V) h: n, D5 H
  710. ;检查是否需要换页
    3 F. P3 J* N8 `4 Z9 F) M: T
  711. LDA FC_Select_Index# ]2 x; D; a) r
  712. CMP FC_Page_Cur0 g/ k$ g$ y. ?0 f
  713. BNE Change_To_Previous_Item_Set_No_Page! ]3 w3 V/ U& S
  714. ;----------------------------------------
    - y  D" }1 G0 s: o( l
  715. ;切换到上一个(需换页)
    6 l$ e8 |2 G+ Z4 I. R% j
  716. Change_To_Previous_Item_Set_Page:
    & q" w# R2 i1 i2 s* D
  717. JSR Record_Last_Page_Index6 X: j2 m% l; m, p  y" P
  718. LDA FC_Page_Cur7 ~8 m! u8 N& C' ^3 G2 ]
  719. SEC: ~5 m8 q9 r, h2 V6 I8 n) k# L+ q
  720. SBC #FC_PAGE_SIZE5 R5 c# |# s4 H
  721. STA FC_Page_Cur
    & [, U0 Q  Q5 [( ?7 l
  722. DEC FC_Select_Index
    7 h$ z5 K0 v0 J8 ]: L" ]& J
  723. JSR Update_Page_Content
    3 x% q2 i. \. m% T( H: J; o
  724. RTS9 k6 h3 S9 L/ z% |- Y  `% K3 t
  725. ;----------------------------------------; i( v. K; A' ^9 P
  726. ;切换到上一个(无换页)$ ?# K; ^0 T/ l/ Z( ^" p0 F1 [* G
  727. Change_To_Previous_Item_Set_No_Page:3 x' D3 {4 L3 `+ T
  728. DEC FC_Select_Index: g) |: l! j: ]0 v, T# E
  729. RTS2 _& Q3 |- n3 Y2 C' E8 A

  730. % d9 B9 {+ O5 B5 R
  731. ;==================================================
    . j! W4 [+ \7 J9 r9 p) F4 m
  732. ;切换到下一个选项! C8 R  Q  j: x7 @9 ], Z& W
  733. Change_To_Next_Item:! C. I- c  q3 N, K6 W1 ?0 `$ _& R
  734. LDA FC_Select_Index  [' c' Q2 o( g! R2 B
  735. CMP #FC_ITEM_SUM
    5 w/ z, _1 c* c
  736. BNE Change_To_Next_Item_Set
    " l- n7 V8 ]+ F2 [5 @
  737. ;----------------------------------------1 n' _7 J) @: }2 s
  738. ;切换到起始页第一个
    . C  U9 Y3 h* N! U2 I6 K
  739. Change_To_Next_Item_Set_Begin_Page:) m6 H0 _4 `5 F2 ^, K
  740. JSR Record_Last_Page_Index$ s6 [8 P# P% P' p
  741. LDA #$006 F: G  ]0 k# i, f: ~; n. [' P4 Q
  742. STA FC_Select_Index
    " g  l+ |) t+ y* X# O" s
  743. STA FC_Page_Cur0 p4 N9 h* q' N/ h( G; t$ u
  744. JSR Update_Page_Content
    * F9 Z5 o3 T# b% w, l
  745. RTS' d0 X2 u% b: E8 _
  746. ;----------------------------------------. K. P$ d( L  a
  747. ;切换到下一个: N, ]( T; \$ M5 t3 w% v( b  ^! V
  748. Change_To_Next_Item_Set:  o/ P" Q1 g& `7 z& w4 z
  749. INC FC_Select_Index
    9 f9 B  N. `- n5 r9 k
  750. LDA FC_Page_Cur
    & r+ K5 l% L0 w% ~/ T5 x
  751. CLC4 F! E. V3 U: I
  752. ADC #FC_PAGE_SIZE
    + i8 q5 Z, ]! Q& o3 k
  753. CMP FC_Select_Index
    6 D4 G8 Y+ F, z! J5 m
  754. BNE Change_To_Next_Item_Set_End
    9 V4 e3 ~9 q6 B# }5 D: n, E& y0 l- @6 N
  755. ;----------------------------------------! A% w! \' K" E4 c- f" {% v
  756. ;切换到下一个(需换页)% |4 J2 _+ j  ]1 ?: C
  757. Change_To_Next_Item_Set_Page  l: |3 Y7 O, k4 H: A- a* z) U  s
  758. JSR Record_Last_Page_Index, j- p  l2 I5 ~
  759. LDA FC_Page_Cur
    3 [" E, p* }( ~3 o$ k2 E8 J
  760. CLC5 w$ N0 m5 V  S( P# C9 W
  761. ADC #FC_PAGE_SIZE1 ^2 b- Q- d, {4 H8 X
  762. STA FC_Page_Cur7 E* i3 M4 G/ H6 C: A
  763. JSR Update_Page_Content
    - Z. q2 {8 L6 Y2 a9 q4 W2 f" l
  764. Change_To_Next_Item_Set_End:% r+ D; J* b5 d2 q* ~
  765. RTS
    # \% ~* k1 i) i! R! r
  766. ; h# e+ f& ^: M. k4 ~# C* [
  767. ;==================================================
    1 l% C) v5 q# I* k
  768. ;切换到上一页
    9 M) c6 Z8 e7 t8 R9 n; |9 j
  769. Change_To_Previous_Page:
    + D. B1 v7 Y; Y
  770. LDA FC_Page_Cur
    ! ^8 W7 {: z% F
  771. BEQ Change_To_Previous_Page_Set_Last_Page9 Q+ _1 N" P5 p) ^
  772. JSR Record_Last_Page_Index
    5 K" u1 W6 I4 D6 y6 ]1 j  ~
  773. LDA FC_Page_Cur
    8 o4 h" j+ g  o
  774. SEC
    9 R& P- w" Q7 L8 U3 S/ q
  775. SBC #FC_PAGE_SIZE
    ; s7 x0 F  ~  S. Q8 {
  776. STA FC_Page_Cur- @" w' e* C& r' c2 n! L
  777. LDA FC_Select_Index
      c# X' C/ A1 j
  778. SEC: ^& C5 a2 t* `( w
  779. SBC #FC_PAGE_SIZE
    $ ^5 e8 h  I. c5 O+ C' `
  780. STA FC_Select_Index; E% r# }3 J/ _1 u4 `7 j
  781. JSR Update_Page_Content
    & P* Q. _7 c$ X) E# y1 {
  782. Change_Select_Last_Page_End:
    ( t* D% Z9 b( t* _/ J1 A
  783. RTS
      Z6 V. L- ?1 O8 h4 m6 U9 O
  784. ;----------------------------------------8 [, x6 i1 R& o: i
  785. ;切换到最后一页
    - N) n# M  c% B9 Z; |/ b
  786. Change_To_Previous_Page_Set_Last_Page:4 @2 G: e( S9 J( y% t( Q
  787. LDA #FC_PAGE_MAX
    0 A" r1 k0 C/ m( S. d; G% G/ A
  788. BEQ Change_To_Previous_Page_Set_Begin_Item% m; i& l) Y3 k- n. q
  789. JSR Record_Last_Page_Index( G" ?8 R6 _8 j! G
  790. LDA FC_Select_Index
    ( g* D" ]  V0 p8 G3 K
  791. SEC4 X- ^$ S: z0 w$ a- A1 [5 A
  792. SBC FC_Page_Cur
    $ T! X2 C. }: P& n, ~; u  H
  793. CLC
    0 H+ s" U- W. _- R6 d1 A7 L9 u
  794. ADC #FC_PAGE_MAX
    , |; R6 ^) I0 l2 ~7 S6 F8 d1 v
  795. STA FC_Select_Index% ?2 m& q0 l0 X4 A7 \+ o8 G* \
  796. LDA #FC_PAGE_MAX6 O- ?4 j0 N' p! H  L
  797. STA FC_Page_Cur
      f4 a1 m) W+ d  K- R3 s
  798. LDA FC_Select_Index' s8 a0 d( g: ]
  799. CMP #FC_ITEM_SUM
    / Z  ?; l  k. O3 Z: i9 J5 l7 A
  800. BCC Change_To_Previous_Page_Set_Last_Page_End
    ) X& s; a" C1 j4 H3 v. z& r
  801. ;----------------------------------------9 D% T$ Y& B4 S) Z$ e9 j2 {
  802. ;切换到最后一项
    0 y# l4 F8 g' Q4 b6 P% {+ R
  803. Change_To_Previous_Page_Set_Last_Item; t3 v, V  [# X. Y
  804. LDA #FC_ITEM_SUM5 z4 e' |& ^9 f; k8 w2 K% l
  805. STA FC_Select_Index
    * A' o7 ^# E: s3 y5 b& s8 H* |
  806. Change_To_Previous_Page_Set_Last_Page_End:1 a; X+ m$ d2 `- b
  807. JSR Update_Page_Content
    ; P, S4 J- m" J+ \( J
  808. RTS
    + N8 E  c7 C9 k
  809. ;----------------------------------------6 d+ b, R* b8 ]6 U! w
  810. ;切换到起始项(最大页只有一页时). j+ {1 |0 Y" o
  811. Change_To_Previous_Page_Set_Begin_Item:0 `0 v) k1 [3 W
  812. LDA #$00
    ( V6 @2 i" p! W2 r! \
  813. STA FC_Select_Index
    # Q- |5 J% w- [  }
  814. RTS
    0 Q  l& ?% p( e& f
  815. * d% E+ }7 Z! T& p$ b/ d8 c3 i* N
  816. ;==================================================5 T' L' J6 O/ y+ N# [
  817. ;切换到下一页
    ! D& \5 y2 s2 i4 }7 x& }' X8 i
  818. Change_To_Next_Page:2 p, V' T+ m1 b: v7 [( F3 Y
  819. LDA #FC_PAGE_MAX( K0 [/ p: C3 l: j7 P
  820. BEQ Change_To_Next_Page_Set_Last_Item+ o% ?# s& X( y( u
  821. LDA FC_Page_Cur
    : ^& o2 ~8 g" Z* C4 ]
  822. CMP #FC_PAGE_MAX
    ! }) o7 ~( X) M) \- t
  823. BEQ Change_To_Next_Page_Set_Begin_Page  Z( s0 Q8 U0 }& D
  824. ;----------------------------------------& {1 n) Q  ^# b; X. j
  825. ;切换到下一页
    # q! f* X+ O. `* T+ U% `9 |
  826. Change_To_Next_Page_Set:5 l- d; l! Y* R
  827. JSR Record_Last_Page_Index
    1 ?- E% L& y5 |5 c6 e+ B3 j/ g
  828. LDA FC_Page_Cur) _" y0 x; L' W/ I
  829. CLC
    2 g2 y; {( L9 B: L5 E3 [, D
  830. ADC #FC_PAGE_SIZE4 X6 h; q. v3 p
  831. STA FC_Page_Cur
    ' V+ V" y* c2 l4 ~, K* ]5 }
  832. LDA FC_Select_Index  C" _% D, N7 H
  833. CLC$ S" G! [9 O" T- P7 _) M
  834. ADC #FC_PAGE_SIZE
    + ~* X  i% o" b, E1 s* B
  835. STA FC_Select_Index0 s0 Q7 p% N7 c: n) W
  836. LDA FC_Select_Index
    % U8 q7 Q7 U" k
  837. CMP #FC_ITEM_SUM
    - f' ~0 P7 M8 K8 N7 o9 C
  838. BCC Change_To_Next_Page_Set_End
    : g  B1 B, A8 h; Q
  839. ;----------------------------------------
    9 H' e  H3 D( V4 d. ?
  840. ;切换到最后一项
    ( `1 J) O2 d; z2 X+ E# Z) G* h; p9 {/ I
  841. LDA #FC_ITEM_SUM  E8 m+ D- K3 G9 Z
  842. STA FC_Select_Index
    ! l  s/ y, Q5 r* _) M3 Q* c. }# D$ g
  843. Change_To_Next_Page_Set_End:
    4 g6 ?$ t# A+ K3 p
  844. JSR Update_Page_Content- \- c& V& d5 \  N- ]
  845. RTS# L. R+ E6 q. T. K6 @) p  u6 u0 e
  846. ;----------------------------------------
    2 h/ G) j6 q# m3 L; E
  847. ;切换到起始页
    5 s6 @4 n2 B4 U; H4 v% Z
  848. Change_To_Next_Page_Set_Begin_Page:
    ! E& x$ M( ^' e" @; {
  849. JSR Record_Last_Page_Index
    : ^( \. j4 K% Z2 d
  850. LDA FC_Select_Index
    ) h+ H9 F" R9 {
  851. SEC
    ) C6 K: u+ t- O  W
  852. SBC FC_Page_Cur7 B8 ?7 K1 X5 o( l, i; Z1 d0 F& P
  853. STA FC_Select_Index- F7 J9 B# m1 i  G
  854. LDA #$00' Z' C, z; x# p: l* ?
  855. STA FC_Page_Cur. m1 I% j8 r9 m/ Z6 @4 a8 N8 z
  856. JSR Update_Page_Content
    + ]' e0 Y* q1 @9 H& A  E8 w/ K) Y
  857. RTS
    9 [8 E1 O, N. `+ {' s8 K4 f. G
  858. ;----------------------------------------
    : B) y. A9 n  i6 G% b. R; b
  859. ;切换到最后一项(最大页只有一页时)
    " t3 |' c; P+ Y( A2 p( I  b
  860. Change_To_Next_Page_Set_Last_Item:
    7 g. z. Q7 a/ L* v2 `
  861. LDA #FC_ITEM_SUM% [( v# N8 k; x9 C* I5 U4 |
  862. STA FC_Select_Index
    4 U; d. {+ n$ W2 e
  863. JSR Update_Page_Content
    / [1 Z9 |# M0 H) e
  864. RTS/ q  J' P1 T. }0 d7 E+ E2 C1 m3 l
  865. 6 O: R' F4 f' D. M; b; U" W) X
  866. ;==================================================, S! X7 T0 @; ]) T0 F+ V0 F- y  _
  867. ;更新页面内容2 U3 [, j; ~9 G& E  x* Q2 t$ L$ |# g
  868. Update_Page_Content:) C" ]$ H6 Z9 Q' O8 y: b
  869. LDA FC_Page_Cur& @5 a4 L, H& N" T- c
  870. CMP FC_Page_Old
    - ]. z7 ~! U7 f7 s* a  @8 G
  871. BEQ Change_Update_Page_End" p8 W& j1 o) p! X  T' f- p
  872. JSR PPU_Data_Page_Show7 E. U' E: A/ l$ \0 ?
  873. Change_Update_Page_End:
    . B4 Q. P# `3 R8 N# q
  874. RTS
    ( G% W, j' s8 Q

  875. - c* t7 e) d" W# i' [4 G9 G- @  G5 \
  876. ;==================================================
    7 t9 k0 f8 i# b7 t+ w
  877. ;记录上次页索引
    2 B3 U) G( ?- _4 k/ R* C! G+ w
  878. Record_Last_Page_Index
    # J/ B: ~4 h7 F$ Z( z( D4 N
  879. LDA FC_Page_Cur
    7 y9 f+ D6 ?* `+ q1 @
  880. STA FC_Page_Old
    6 |/ q" }' s2 |: K, k- N. Y. M
  881. RTS
    5 R; Y2 V' k# c
  882. 9 O; x+ `3 S. t# o* l0 r9 e
  883. ;==================================================
    ) ?- a/ }4 V5 K4 Q
  884. ;显示当前选择项光标
    / ^) P; e* t# {" g, ~2 L4 P
  885. Show_Select_Cursor:" s  C( ^$ r. q
  886. LDA FC_Select_Index# {* F$ _% c) b$ g' K
  887. SEC0 }9 x% G6 }4 z* E4 C
  888. SBC FC_Page_Cur; J5 S8 P0 F  [* O2 A# W
  889. ASL- J: O' x) d1 N" K# B  \" Q0 T1 F
  890. TAY8 \- _' l& G' x& v- }
  891. INY
    1 |3 R% V4 U5 i/ }1 i$ j
  892. LDA Text_PPU_Addr,Y
    * v1 `! @" J( J6 t$ ]  q
  893. AND #$03
    ' ?/ [' H' T) m: Q
  894. STA FC_Cursor_Addr_H
    ( P7 d7 }7 X6 c  h4 c
  895. INX# D( Q( _, D" I8 d
  896. DEY
    + |! B; A3 M% V* r" l
  897. LDA Text_PPU_Addr,Y
    # \' I" H2 i  s! G: q( e- N
  898. STA FC_Cursor_Addr_L
    1 p% Y5 B: @! e5 Z# g
  899. ;----------------------------------------
    0 |" g8 C/ ~$ C6 C/ D5 S. z
  900. ;计算光标X坐标
    - ]$ T5 P% [1 R9 I" [0 G
  901. Show_Select_Cursor_Set_X:- O' |( S4 i# T/ @8 Y
  902. LDA FC_Cursor_Addr_L
    ! B4 `+ ]; s2 I7 t$ b4 ~* B( v
  903. AND #$1F& a0 |5 W5 D, c6 g! E' q, h4 B8 I3 i% E! L
  904. ASL
    4 n- [# O. G2 i$ p! k' o
  905. ASL
    & N( B' \( O$ G1 B4 m. k
  906. ASL# w' p" H4 f; t+ b6 F1 d
  907. STA FC_Cursor_X
    6 x6 H# w+ Y; q! \" h/ N4 h
  908. LDA FC_Cursor_Addr_L
    ; r+ a0 B" L& y  c; \
  909. AND #$E0
    . G) W0 {: ~7 j) R# D
  910. STA FC_Cursor_Addr_L8 f$ C3 m- A; G( l, Z& [
  911. ;----------------------------------------4 Q2 t3 U& e9 e4 o
  912. ;计算光标Y坐标
    / U' s! l7 z% T5 I% b
  913. Show_Select_Cursor_Set_Y:9 I# ]6 q. |8 `* A7 d9 l; A  b
  914. LDX #$05# B& I4 @# T4 G4 t7 @
  915. ROR FC_Cursor_Addr_H- B; G+ j9 A% w, B
  916. ROR FC_Cursor_Addr_L; L2 G0 d% ~4 `- c
  917. ROR FC_Cursor_Addr_H0 f- q( x2 c2 _8 {% U+ ]% |' M
  918. ROR FC_Cursor_Addr_L% k' m" T: H1 _3 r* f: d
  919. LDA FC_Cursor_Addr_L
    + m2 x0 U, H9 F& M
  920. STA FC_Cursor_Y( L$ Q  @$ P1 k% L! Q
  921. ;----------------------------------------: K  J  a* x& [$ {
  922. ;写入光标
    8 m: I' d" {  t/ Q; F
  923. Show_Select_Cursor_Set:
    2 e3 c/ g& Z& P1 Z
  924. LDA #$00
    " V9 {- F& I; U$ W+ M
  925. STA $2003" J# I' @2 W- x& Y. K' `3 \
  926. LDA FC_Cursor_Y- M0 c4 [* X( c7 \" N9 h
  927. SEC  h1 J. |9 `+ n- M( i
  928. SBC #FC_CURSOR_OFFSET_Y8 J7 P% n: G2 T* J' Y( c. E0 W
  929. STA $2004
    + K8 j7 |% j% u: m
  930. LDA #FC_CURSOR_TILE
    # e2 k( F: G6 Q1 y
  931. STA $2004
    , ]" g3 ~; j$ Q5 H5 M( m/ z
  932. LDA #$00
    " k& [3 P1 _# X) ]" U. C
  933. STA $2004
    * S6 }- ?# @" J4 O* u( j, k
  934. LDA FC_Cursor_X
    . D. @$ m1 \; H% a$ l3 `/ {4 J# O
  935. SEC+ T5 u& a4 O' k+ A$ e0 x
  936. SBC #FC_CURSOR_OFFSET_X5 ~2 u' P6 Q( d: Z
  937. STA $2004* V6 a) r1 a$ v6 O/ P* |" c
  938. RTS
    ; E% X8 ]5 b* O, B! v# X, P# G

  939. 1 Z6 h' f0 S7 x, S
  940. ;==================================================
      Q2 Y/ s& I1 B5 {/ L) f. ?" ^
  941. ;切换功能
    ' a# N2 h! j' T1 g( t+ j6 e5 _
  942. Change_Function:
    1 L: W3 [% w$ X6 w& u
  943. ;----------------------------------------: g7 Z2 e2 R7 h1 [
  944. ;开启功能A
    ) M* y& r7 s+ ?. T
  945. Change_Function_On_A:
    , \6 D: S; g. F, Q  z$ u
  946. LDA Button_Once
    . M( a, q! G1 R7 v, s" y
  947. CMP #$40
    6 }6 A- D7 k' Z  l
  948. BNE Change_Function_On_B1 z$ o2 @# ]4 b( z( S! y# c( w
  949. JSR Change_Function_To_On_A, F9 t. q" J$ O* o2 Q2 B  t" `
  950. JSR Function_Status_Update
    8 f6 |5 O* F- r5 a$ w. h
  951. ;----------------------------------------
    " e9 s+ O) [5 d3 Q
  952. ;关闭功能B
    , W, c8 W7 |, C7 q4 J2 y- T
  953. Change_Function_On_B:& |% u- F( n6 b% U; m# t
  954. .IF FC_IS_DOUBLE_PLAYERS
    / L0 L7 d+ c' M. o6 n$ v* S; \2 h
  955. LDA Button_Once + 1$ H. J2 r0 W9 I" k2 ~1 {2 k
  956. CMP #$40
    * e( E* f4 Z  s+ i7 y, i- @
  957. BNE Change_Function_Off_A) i* N) @/ k: c6 y7 W& R
  958. JSR Change_Function_To_On_B  Q* Y& B1 p) W# E, z+ u
  959. JSR Function_Status_Update
    % m% C; m5 p9 X  @! F
  960. .ENDIF9 f0 `# _% x+ S/ P
  961. ;----------------------------------------. M9 q$ {" [; K2 j) p5 l9 a
  962. ;关闭功能A
    ' M% W3 g1 g  ^$ Z& d4 b
  963. Change_Function_Off_A:
    ) |5 W# L6 B# i: ]# @9 K
  964. LDA Button_Once* J1 r6 W) Z7 c& q
  965. CMP #$80
    + A8 o8 N4 ?" N1 n& w
  966. BNE Change_Function_Off_B
    " S1 q" R+ W. Q  y2 g
  967. JSR Change_Function_To_Off_A8 y7 U9 L. c6 x, n2 Z& G6 V+ ]9 u
  968. JSR Function_Status_Update7 u) n3 K: M% _
  969. ;----------------------------------------
    . i( F0 F4 x" a- }, }6 o8 H' R
  970. ;关闭功能B
    9 |4 k0 M/ Y3 B
  971. Change_Function_Off_B:8 g" r; d* b+ T' J# ^
  972. .IF FC_IS_DOUBLE_PLAYERS
    8 l- o0 [& V. K$ U1 {; N
  973. LDA Button_Once + 1
    , A* U0 K7 W( ?/ u
  974. CMP #$80, p: |) Y  p" m; H; W2 J
  975. BNE Change_Function_Swap7 ~8 G6 ~4 i& r5 T
  976. JSR Change_Function_To_Off_B
    - |) _# t3 F  Q7 ?( i0 l7 S
  977. JSR Function_Status_Update( K: G' }8 ~  f* M) S
  978. .ENDIF  i/ [) T7 |# R) r4 D1 a5 L. |# c
  979. ;==================================================
      }) T# ^3 z& n3 ]% O1 ~' u
  980. ;交换开关) D0 E# [. i& B
  981. Change_Function_Swap:3 x7 V9 W2 I2 d0 s6 M" V: `. `7 S
  982. .IF FC_IS_DOUBLE_PLAYERS  b6 Q  w5 ?! `
  983. LDA Button_Once
    $ X0 Q- ~4 o. B* A) z
  984. ORA Button_Once + 1" y+ a) ?; N3 ?9 _3 e# B) b1 Z
  985. CMP #$20
      b! b+ R  r# ]' B8 j: S
  986. BNE Change_Function_End5 P+ e7 \& g) Z( _. @0 s" O- C
  987. JSR Change_Function_To_Swap
    % Q/ R: W) |! d" j7 l' b& z  [; _  z
  988. JSR Function_Status_Update
    1 R/ ?) W) K0 |. r; e
  989. .ENDIF
    0 t6 b" c* }1 d: |7 e7 D9 Y
  990. Change_Function_End:/ X( c$ Q; D( X6 O# j/ W
  991. RTS
    ) q, B- a! d: e' ~4 n
  992. / o8 g6 l+ H0 }0 T
  993. ;==================================================: ?9 j# S6 T- h* m7 {) Q  n
  994. ;交换开关状态
    & P& L. ^; C9 g& r
  995. Change_Function_To_Swap:
    , z# e5 @% \$ I9 n+ S) j4 m
  996. .IF FC_IS_DOUBLE_PLAYERS
    " W( F# n, S- Y6 o
  997. LDA FC_Select_Index& ~- s% ~  g" S1 J/ N+ K
  998. SEC
    5 N0 P1 [% M7 w
  999. SBC FC_Page_Cur+ `. E* C! d* i: n7 e
  1000. STA FC_Select_Temp
    - M0 p7 d4 E- f' x0 K
  1001. JSR Set_Function_Port
    5 L+ Q/ g9 X6 |3 i
  1002. LDY #$005 Z7 R/ C2 p  o$ ~  r
  1003. LDX FC_Select_Index' m; r  s: c. r5 o7 A# }
  1004. LDA (FC_Data_Port_A_L),Y/ l: }1 ~1 x4 \0 E
  1005. EOR (FC_Data_Port_B_L),Y$ b; O* g9 P* _/ A9 z) b+ l
  1006. AND Function_Check,X7 z( T% s0 O6 c5 K
  1007. BEQ Change_Function_To_Swap_End
    3 Q/ N. I4 K- b" ]; t
  1008. LDA (FC_Data_Port_A_L),Y  s* B+ p- L1 _0 P- M
  1009. EOR Function_Check,X- M2 g" O1 Y% f) P  r8 r" W
  1010. STA (FC_Data_Port_A_L),Y+ Z9 u8 b& x3 \1 i& u* A5 ^4 A
  1011. LDA (FC_Data_Port_B_L),Y
      ^* |8 l" j( l3 g* z
  1012. EOR Function_Check,X
    & G1 M3 C5 c3 N: g% r
  1013. STA (FC_Data_Port_B_L),Y& w7 R! a, ?  ~3 q5 M# |* e+ ~
  1014. Change_Function_To_Swap_End:
    1 B  M3 k3 D2 A8 \: a4 d6 c
  1015. RTS
    + b. p3 @( V" M( B
  1016. .ENDIF
    3 Y1 [3 k" P' _8 l: @2 ]5 a3 d

  1017. 0 c, J; J+ N3 \/ U
  1018. ; }" T7 s6 ]( G- a0 h- G" \
  1019. ;==================================================
    - Z" [- q5 o/ f5 u" K3 Q) q
  1020. ;更新功能状态( W7 x+ z# M6 N2 A1 Y7 o" ?
  1021. Function_Status_Update:
    8 _3 R% `6 S2 d
  1022. LDA FC_Select_Index6 k# g+ @7 z. P# b+ P. {
  1023. SEC( g( E- H' j0 E: U- [( Q
  1024. SBC FC_Page_Cur
    - I+ |: `6 f, z# }5 u; i
  1025. STA FC_Select_Temp
    $ _5 |, p- ~& v0 L+ F/ M: C" \
  1026. JSR Function_Status_Show
    " {1 k  J, z/ v7 Z6 {
  1027. RTS
    3 `8 n; T3 g0 W8 N
  1028. : l1 Q) p$ v) C+ L
  1029. ;==================================================
    5 b& `8 h' w/ f+ O: j  R
  1030. ;设置功能地址端口
    + n3 I9 o$ x: o  h! D7 v
  1031. Set_Function_Port:
    7 d6 ^  U7 T) b  x9 Q# g
  1032. LDA FC_Select_Temp
    8 b  K! D, D& Y0 d8 s5 Y
  1033. CLC% J/ @; g4 a  d, @# \4 O# z0 e
  1034. ADC FC_Page_Cur( z# s9 D2 k9 c" p$ ~$ U& F
  1035. ASL+ L' G: J5 `2 Q& U6 \, l: m) a+ n- a* J
  1036. TAY
    8 P& ~- v& O: j: v, e/ p0 {
  1037. INY& X& t+ U0 r* s2 V. Y6 J
  1038. LDA Function_Addr_A,Y8 x3 C4 H" e* U5 a8 G3 |2 U/ V- i+ [% f
  1039. STA FC_Data_Port_A_H
    ( y4 r8 g  @+ _0 h
  1040. .IF FC_IS_DOUBLE_PLAYERS$ u7 W( G, T( p2 R$ y/ R. Q9 j4 C
  1041. LDA Function_Addr_B,Y
    ; j8 h! q, a& o
  1042. STA FC_Data_Port_B_H
    ! {  j( `+ B8 a+ f
  1043. .ENDIF
    0 `9 ]4 K/ y1 U/ k$ R
  1044. DEY4 b/ I1 k% ]2 f+ f: b4 z
  1045. LDA Function_Addr_A,Y$ {+ ]4 `, C" w1 |% i& ~9 E- @
  1046. STA FC_Data_Port_A_L" ?' @+ @+ |, Y4 q, b$ K
  1047. .IF FC_IS_DOUBLE_PLAYERS
    ( d) P$ ]6 L& J3 m& G7 k; ~2 A
  1048. LDA Function_Addr_B,Y& k) O5 S% S) b
  1049. STA FC_Data_Port_B_L
    8 k0 \$ d* ^. v9 _
  1050. .ENDIF
    % T4 w5 y& q! q) x; P- Q0 Z
  1051. RTS
    8 F) @/ H: H/ u& R+ U$ V

  1052. 2 r% ]* W% r6 K) l. R( r; a" b
  1053. ;==================================================: g6 Q3 K. q* X( }: c: ]
  1054. ;设置功能临时索引
    9 W3 Z9 L/ n7 Z/ w
  1055. Set_Function_Temp_Index:: G9 M) N4 s; T2 }% c) }4 ]
  1056. LDA FC_Select_Index  |9 W- D7 [0 [$ j" Z' q% g7 S
  1057. SEC: R$ F1 }5 Z5 H# x# e
  1058. SBC FC_Page_Cur% j: \& b2 ]* E# C0 @, R) M. Y
  1059. STA FC_Select_Temp
    ; O8 d( [* B. F. W, v( O9 j2 n
  1060. RTS
    * w% k8 e! k+ q* P! ~/ |9 @
  1061. - r& H7 n% Y( H, {6 S# J4 M
  1062. ;==================================================
    2 Y; N) L5 k% ^/ B* Y$ J
  1063. ;开启功能A
    + T0 E. Y7 m, ~! k
  1064. Change_Function_To_On_A:; k* H1 ^& \- h- m1 [' X# s
  1065. JSR Set_Function_Temp_Index
    3 K; d' j5 e& X. _. P# Y8 I
  1066. JSR Set_Function_Port, J$ c/ b1 m% x: G# @( l
  1067. LDX FC_Select_Index! A( k) V+ t3 Q  ^
  1068. LDY #$00) K% s  v. A$ Y! j
  1069. LDA (FC_Data_Port_A_L),Y
    4 M& T: b" S" i4 l. z) k, n$ U
  1070. ORA Function_Check,X
    3 y6 b" ?* E. ]5 B7 r6 T0 E
  1071. STA (FC_Data_Port_A_L),Y$ P9 k6 I. I8 a! ^2 J8 R# R9 A
  1072. RTS4 u/ h+ d( L* [  {1 M. p# f5 @
  1073. ;----------------------------------------5 e& J) }/ U( T$ L
  1074. ;开启功能B2 J+ ^3 Q) r; T5 C( B
  1075. .IF FC_IS_DOUBLE_PLAYERS  n9 w. |+ T( {+ o  m
  1076. Change_Function_To_On_B:
    % M* [  X( O9 L; ~1 L4 @! T
  1077. JSR Set_Function_Temp_Index
    & k/ v7 P& p* g8 y3 q- n. U
  1078. JSR Set_Function_Port
    0 N/ W0 \4 H6 Z% \9 }
  1079. LDX FC_Select_Index
    4 V$ j# T5 H8 V! P9 G
  1080. LDY #$00
    " E  k) _, G7 N+ Q# s6 B# s
  1081. LDA (FC_Data_Port_B_L),Y6 R7 W7 N' p6 \* n; }0 \
  1082. ORA Function_Check,X
    % e& ~2 Q8 o- L4 \' F3 V
  1083. STA (FC_Data_Port_B_L),Y3 }. c: j! c* ]& A; K' p- u8 Y$ J
  1084. RTS* K, t: G) s2 i# B( j5 S3 P
  1085. .ENDIF
    % ^: w$ [( C' R, j
  1086. ;----------------------------------------$ M+ f" U& k0 p4 p6 r. q
  1087. ;关闭功能A
    ' x# |5 d$ w7 r3 L% d$ S! Y
  1088. Change_Function_To_Off_A:
    / F& U0 t2 v/ ]2 q8 J
  1089. JSR Set_Function_Temp_Index
    1 ^# K7 W; b7 r
  1090. JSR Set_Function_Port  e$ w# i! S/ T4 `" z% i
  1091. LDX FC_Select_Index
    ! [! q2 I4 q' C; p6 f
  1092. LDY #$004 J1 V) \# G4 \8 o# D
  1093. LDA Function_Check,X" Y  p/ _* R8 F  b
  1094. EOR #$FF6 w2 a4 E/ Q0 R/ l0 t
  1095. AND (FC_Data_Port_A_L),Y
    / A$ C7 F) f  \
  1096. STA (FC_Data_Port_A_L),Y
    7 U9 R4 K; \+ s
  1097. RTS7 o7 J8 I3 a) X  C" E
  1098. ;----------------------------------------
      W' T, a9 g' U1 r: C0 B
  1099. ;关闭功能B/ T! i! b! X4 x& \$ v* Q
  1100. .IF FC_IS_DOUBLE_PLAYERS) y* d% x- c: H3 z- v
  1101. Change_Function_To_Off_B:$ u2 v1 R$ k* M% X$ l
  1102. JSR Set_Function_Temp_Index  |* s+ D9 y4 N& S2 L# H1 m- P
  1103. JSR Set_Function_Port
    / j/ ?7 Z' @, c3 w: y
  1104. LDX FC_Select_Index8 Y" ~7 u( ~( ^! `' A. n+ o
  1105. LDY #$00# E0 ]( S( d+ x' F
  1106. LDA Function_Check,X( b5 M& x! g3 x0 F( N
  1107. EOR #$FF
    6 Q% X/ G: H. i% a0 z' j
  1108. AND (FC_Data_Port_B_L),Y
    " Q, N* i4 z1 B; z$ R
  1109. STA (FC_Data_Port_B_L),Y2 |& |/ n9 F0 {% j1 Y* S
  1110. RTS- K- d' b) f9 p( }) ]" P/ `
  1111. .ENDIF
    , P; ?! Y  n% Q3 K) v  j  ^8 }
  1112. $ D& c' @% v* j' K
  1113. ;==================================================9 t- q5 F2 S! `% k
  1114. ;设置功能状态PPU地址! G* |! L0 `- j2 O$ l0 z
  1115. Set_Function_Status_Addr:3 j1 O* s6 z! C0 b3 T
  1116. LDX FC_PPU_Cursor4 G- Y- c. U& K: b3 d9 t: t/ G6 Q% e
  1117. LDA FC_Select_Temp
    ! @4 L% {! J. K6 i
  1118. ASL
    , p+ N, K, H+ k3 m* Y
  1119. TAY
    , {3 [" c; u: K  z" ^% J, f0 X
  1120. INY
    5 j& J" g. N- s7 O$ T
  1121. LDA Text_PPU_Addr,Y2 Y# t: H7 J! _
  1122. STA FC_PPU_Buffer,X2 d: j% \# x% B- F8 D2 c: U! G
  1123. INX, ^4 {0 E$ H8 g7 G5 J5 I
  1124. DEY4 N. N/ T4 r$ j9 \# M2 l* Q( z
  1125. LDA Text_PPU_Addr,Y
    ! H. Z: M! f0 T& c
  1126. CLC5 p" X' f9 ?& g6 I$ Q
  1127. ADC #FC_FUNCTION_OFFSET# c4 G/ k1 X$ y
  1128. STA FC_PPU_Buffer,X
    4 x9 k. {6 N5 v  k: S. K3 V2 U% Q
  1129. INX
    + u! l/ b; R0 V9 \7 S# x
  1130. .IF FC_IS_DOUBLE_PLAYERS
    ! d/ p  r) s+ _1 t
  1131. LDA #$02
    0 \: m$ v8 C- A% @4 D5 `$ c  G4 M
  1132. .ELSE7 ?" c2 A$ {- N) @
  1133. LDA #$01
    ( i& S( A7 U0 T; K7 d
  1134. .ENDIF! U5 {5 G7 Q2 Y" @7 B* `# W7 e
  1135. STA FC_PPU_Buffer,X7 A' Y8 o, ?2 K' r/ C! p
  1136. INX6 O# }. y4 W- ?' i
  1137. STX FC_PPU_Cursor
    + Z2 P& `* I! ]" u# e
  1138. RTS
    ; y" Y7 p% G0 N3 P

  1139. % S3 Y$ X% ?: b( S" C8 C* m- h
  1140. ;==================================================; K( r6 C3 k8 h) @3 E2 u, _# J2 b
  1141. ;获取当前选择索引
    + L  e2 X7 n3 q9 a: b' k
  1142. Get_Select_Index:
    & j0 k+ l5 d9 ?* S! w# m
  1143. LDA FC_Select_Temp6 E5 F1 N. l0 R+ M& l2 H3 e9 N
  1144. CLC
    9 I: B: Z+ }( X& m* I
  1145. ADC FC_Page_Cur
    + f5 c) K! t& F7 A" d" v1 p+ O
  1146. TAX
    5 \0 l; ~; f9 c# z- }
  1147. RTS" c' R% l2 R  x8 B2 t. z1 @7 r8 a
  1148. ) c" o$ [5 X1 ~2 `0 H
  1149. ;==================================================- O4 h, N( R' Y% M, n; M
  1150. ;清除状态文本
    1 C3 w* |! C9 g/ l8 k  o( M6 a+ l
  1151. Function_Status_Clean:6 K; q0 Z1 r+ _9 J& D) m
  1152. LDA #FC_PPU_MODE_CNTC
    7 `& v( W; U+ H+ M7 Z
  1153. JSR Set_PPU_Mode5 j# T  T7 d9 u+ [' {- p
  1154. JSR Set_Function_Status_Addr5 k/ P; M5 B7 _6 h
  1155. RTS+ e- ~, x, J% b0 I

  1156. / W' h( d4 J8 s+ [
  1157. ;==================================================9 O8 a, \+ F0 g+ [9 ~8 R6 [8 [" z
  1158. ;显示开关状态1 }" c; Q) s, ?& o3 z# O1 X+ `% O
  1159. Function_Status_Show:
    , ?! }1 e2 T  i3 L
  1160. JSR Get_Select_Index
      }5 H: _5 N5 P8 W4 D9 n
  1161. CPX #FC_ITEM_SUM3 ^" P3 {2 G' z
  1162. BEQ Function_Status_Show_Set5 Y9 Y7 K9 S. I4 v  L7 f- _1 g
  1163. BCS Function_Status_Show_End" \% O0 t' H6 k# X/ n1 L
  1164. Function_Status_Show_Set:9 q" \! L6 g; S
  1165. LDA #FC_PPU_MODE_CNTL  [/ B3 V3 E: P1 g. d/ a
  1166. JSR Set_PPU_Mode+ l5 e# Z: H: T( B: [1 m7 u$ }
  1167. JSR Get_Select_Index5 F, j& _* ?+ W' g! E
  1168. JSR Set_Function_Status_Addr# ~# y1 y7 s4 c" R1 G
  1169. JSR Set_Function_Port2 v! v9 p( p. s' b3 o0 k
  1170. JSR Function_Status_Show_Check_A2 g# I8 ]- _5 [0 }/ H( \
  1171. .IF FC_IS_DOUBLE_PLAYERS
    . s. @/ w9 ^: L3 \! o, g, K
  1172. JSR Function_Status_Show_Check_B
    ! D1 s! o% o2 e& i5 V! s
  1173. .ENDIF/ i7 D: h+ ?# i
  1174. Function_Status_Show_End:0 o. q( _8 u- O2 Y
  1175. RTS) \) N4 x+ u/ w0 ?1 `
  1176. ;----------------------------------------  s6 B* x1 @5 k, B# ]+ E1 [  p$ I
  1177. ;检查功能A状态
    ; t/ X, Y: @/ ~+ i
  1178. Function_Status_Show_Check_A:
    . Z$ W7 q$ y- k* J- B" W4 ]. I
  1179. JSR Get_Select_Index
      d, }+ I2 U, Z- I
  1180. LDY #$00! r9 @9 F) v2 e; a
  1181. LDA (FC_Data_Port_A_L),Y
    ! B# y) X# D8 Z, c
  1182. AND Function_Check,X
    1 j0 t: P" C% M' j
  1183. BEQ Show_Function_Status_Off
    . g  Q( n: P0 t% i
  1184. JSR Show_Function_Status_On
    9 {/ @+ l9 y: k9 M0 M- c9 F5 T6 ^
  1185. RTS
    0 N! g6 `( f0 g& C( P
  1186. ;----------------------------------------$ l& r( A0 Q2 i+ I8 `
  1187. ;检查功能B状态
    # F3 i0 Q* N  o
  1188. .IF FC_IS_DOUBLE_PLAYERS) ^8 O" ^" `3 s6 p
  1189. Function_Status_Show_Check_B:
    0 y1 `6 `) O4 u' E( u' }
  1190. JSR Get_Select_Index  j5 ^& l" K1 N
  1191. LDY #$008 `7 c; @; `9 y
  1192. LDA (FC_Data_Port_B_L),Y/ [7 a$ F" O6 ]  R' E( m' k
  1193. AND Function_Check,X- w4 ]! J+ g9 ?0 [, @( Z. l
  1194. BEQ Show_Function_Status_Off
    ) x* m7 _8 Q8 o& N+ D
  1195. JSR Show_Function_Status_On. d4 w# J3 f" i  O- ^! n2 E' f
  1196. RTS) Z$ H; A5 ~. n* ^0 X0 N
  1197. .ENDIF
    & S6 Q4 n0 P8 B: N7 |$ G

  1198. - q$ C% N  M: |9 M8 ?
  1199. ;----------------------------------------5 L; c2 I6 d5 N& `$ k2 O3 A
  1200. ;显示功能开启状态# h; x# H1 X% q3 h! s% U  U8 H
  1201. Show_Function_Status_On:* d6 r9 F9 |, O6 y  @
  1202. LDX FC_PPU_Cursor
    : h2 s& S9 e6 E5 c+ E
  1203. LDA #FC_ON_TILE; _. Y1 k5 V+ L' @" b$ I
  1204. STA FC_PPU_Buffer,X
    ; b4 B6 U% @, I  ^9 Z
  1205. INX
    2 b( u4 @+ |* I
  1206. STX FC_PPU_Cursor3 q: V: j9 ^* M
  1207. RTS
    * t, C5 j9 g% `" y
  1208. ;----------------------------------------
      p* r8 C: L5 o1 w, {, r
  1209. ;显示功能关闭状态/ h6 {' B$ P' W0 _2 l3 }
  1210. Show_Function_Status_Off:# q4 }( W" [4 F+ x1 |7 @7 J  U
  1211. LDX FC_PPU_Cursor2 L4 g9 \7 }. e' m
  1212. LDA #FC_OFF_TILE
    + B6 \0 M4 c' L* ~$ Q
  1213. STA FC_PPU_Buffer,X
    2 {  \: r4 W5 L3 R2 P
  1214. INX
    0 V  I) ^! v- m) K& Z7 ~
  1215. STX FC_PPU_Cursor3 ~) P4 f2 j5 {1 f/ N
  1216. RTS! ?0 x7 S! G( T; P: N4 B

  1217. 9 e8 x/ G4 {1 W, X

  1218. 0 N; [' V. R+ b4 r! s9 H
  1219. ;-------------------------------------------------------------
    1 f& F2 t' e( X* z; W3 K
  1220. FC_Data_Copy:    ;数据拷贝参数设置
    . w6 v" a  r1 }
  1221. STX FC_Cpy_Port_L8 A5 |* Z8 f# u% v% v" U' J
  1222. STY FC_Cpy_Port_H' \/ D5 q: y2 Y1 L
  1223. LDY #$00* L3 n* u# y1 }) ^; r! |
  1224. LDX #$069 f6 E# t; w; U$ q1 M
  1225. FC_Data_Copy_Addr_Set:    ;从指定地址读入参数: d- i) S6 L4 y5 ~: [
  1226. LDA (FC_Cpy_Port_L),Y' o9 v# V# f' E" b; a
  1227. STA FC_Cpy_From_L,Y. n$ h& W- k! s
  1228. INY+ c5 _- l: N+ ?
  1229. DEX
    8 k& f6 ]$ ^$ D; O
  1230. BNE FC_Data_Copy_Addr_Set
    9 G  {! o+ b4 K8 h* H& F
  1231. LDA (FC_Cpy_Port_L),Y" {1 D  R0 I' W
  1232. CLV
    3 D7 I9 V# k. g4 h. h+ V
  1233. LDY #$005 I' d% h  N7 W3 J2 e% W
  1234. ;----------------------------------
    + M. |+ C, {2 J2 N
  1235. FC_Data_Copy_Mode:   ;复制模式校验5 R( A+ ~  B. j: W) e
  1236. CMP #FC_MODE_RAM_TO_RAM
    $ F. m) ]4 O! P& V0 v3 C: o
  1237. BEQ FC_Ram_To_Ram_Mode
    % Z( p. z4 _2 T: B
  1238. CMP #FC_MODE_RAM_TO_PPU% U" i/ m: E) m4 ~- I9 U4 l
  1239. BEQ FC_Ram_To_Ppu_Mode
    ( ^( R1 E( Q9 ]) }4 U) _
  1240. CMP #FC_MODE_PPU_TO_RAM% c( J" X* c  G
  1241. BEQ FC_Ppu_To_Ram_Mode' y% T; B1 |% M. h  ]# [9 ~
  1242. CMP #FC_MODE_PPU_CLEAR. J: z2 H4 {$ _7 f7 z
  1243. BEQ FC_Ppu_Clear_Mode
    ! _4 k% I; D# w" h% _
  1244. RTS
    - z) l+ Z, J# g3 s0 R: [
  1245. ;----------------------------------------, P7 C, f% ?9 y' q  S: Z
  1246. FC_Ram_To_Ram_Mode:   ;复制RAM到RAM模式4 b/ Q) B9 Q/ `! L8 B$ x
  1247. LDX FC_Cpy_Count_L
    5 u. U0 S# Y" Y$ a$ W* I! f
  1248. INX
    7 z/ P, c6 D3 O5 X6 T2 ^
  1249. FC_Ram_To_Ram_Count:   ;剩余计数检查4 Q' y, V  d4 X; a3 l) k
  1250. DEX; J( Y5 r, {- X( `
  1251. BNE FC_Ram_To_Ram_Copy
    0 |1 d2 Y; B& }" ?9 e* n( E$ |
  1252. DEC FC_Cpy_Count_H# j# L" D! Y9 Q0 P
  1253. BMI FC_Ram_To_Ram_Over
    0 ^) t% u8 b6 Y# W  U4 u. {4 e
  1254. FC_Ram_To_Ram_Copy:   ;开始复制数据+ F; m% V, i5 Z* [
  1255. LDA (FC_Cpy_From_L),Y
    * q/ Q& f- c- [- E! X+ t
  1256. STA (FC_Cpy_To_L),Y7 b, j' u+ ?2 }$ |" P) X
  1257. FC_Ram_To_Ram_From_Set:    ;源地址递增2 g# ^; Q7 J; J0 X1 K- e1 _
  1258. INY
    7 ~1 Q) n1 |7 `+ n. ?+ J
  1259. BNE FC_Ram_To_Ram_Count
    $ d6 R& z2 [* q9 c- i4 s0 b
  1260. INC FC_Cpy_To_H
    0 i2 D! M$ i7 O) _
  1261. INC FC_Cpy_From_H6 T. ?( T+ c+ t' F, J" T0 N
  1262. BVC FC_Ram_To_Ram_Count1 h) w5 ?- I/ A  [% A
  1263. FC_Ram_To_Ram_Over:    ;结束数据复制) r+ n7 |$ J3 g1 J
  1264. RTS
    ) a7 N9 G: L+ @* Y7 y

  1265. ! ]; x& ?, ?. {* B! |( @3 s
  1266. ;----------------------------------------, t& r! H: x8 X$ ~2 d
  1267. FC_Ram_To_Ppu_Mode:   ;复制RAM到PPU模式
    + v1 y' t; [# `" l* @
  1268. LDA FC_Cpy_To_H; h+ R! |  D1 Q
  1269. STA $2006
    " {! s0 p% D5 V* {
  1270. LDA FC_Cpy_To_L
      Y, e! C- s  f7 N3 r1 v
  1271. STA $2006
    2 ]/ g) r- W8 V; g
  1272. LDX FC_Cpy_Count_L( ~% K: G8 m- P: B
  1273. INX: U, Z7 W" \% ?9 I7 E) l
  1274. FC_Ram_To_Ppu_Count:   ;剩余计数检查
    6 h. E2 F, e2 g! R6 j( k, _
  1275. DEX# q# q* P5 ^" ^2 i# ?6 L$ n0 \
  1276. BNE FC_Ram_To_Ppu_Copy
    3 a+ E6 R( H3 J0 W
  1277. DEC FC_Cpy_Count_H
    . p9 ~7 I# x, ]* N. O% h: }
  1278. BMI FC_Ram_To_Ppu_Over
      U6 d" \3 M2 J5 D3 W
  1279. FC_Ram_To_Ppu_Copy:   ;开始复制数据
    ! t9 z9 H- p6 S: E) k" p1 m) U
  1280. LDA (FC_Cpy_From_L),Y! ^$ r" H: Q# n7 n% b4 M; m
  1281. STA $2007( F5 [, |, J# W. u& E1 o+ k' P- N
  1282. FC_Ram_To_Ppu_From_Set:    ;源地址递增
    ( O, o$ e8 u* |  f3 |; x* g
  1283. INY5 `$ g  \- A& X4 y3 x3 ]+ P
  1284. BNE FC_Ram_To_Ppu_Count  O' \+ T6 o! l
  1285. INC FC_Cpy_From_H+ y  D' ?8 h4 j( S. K3 t
  1286. BVC FC_Ram_To_Ppu_Count
    : M9 z# Y0 o1 q0 S6 c# p, Q3 M
  1287. FC_Ram_To_Ppu_Over:    ;结束数据复制+ ~' P6 k0 I1 M1 s& h
  1288. RTS
    # z6 B) n' p0 E4 p5 s/ r
  1289. : _- a! q' \: }% A- f
  1290. ;----------------------------------------
    7 I4 x- z' |# _# ]* P2 P0 h& O
  1291. FC_Ppu_To_Ram_Mode:   ;复制PPU到RAM模式
    ' J" p7 ^6 _- n& q+ @
  1292. LDA FC_Cpy_From_H
    1 G( H  T. H' J, z) h' B! t
  1293. STA $2006
    7 T+ j! m- {/ Q- z% Y0 r0 R
  1294. LDA FC_Cpy_From_L
    % ]/ w: }/ K- i2 r! s) E
  1295. STA $2006
    ' {4 {9 {9 K9 ~  g3 i& S9 w
  1296. LDA $2007' c# D2 D' @1 [0 h
  1297. LDX FC_Cpy_Count_L! [/ x- B2 K& [% X8 W- D
  1298. INX% U) V: K( D! k& ^! c# w
  1299. FC_Ppu_To_Ram_Count:   ;剩余计数检查' V4 F2 [7 m* h, D
  1300. DEX' r' T" \, l4 N$ O3 T* U$ A
  1301. BNE FC_Ppu_To_Ram_Copy7 F) b1 _2 U$ m3 n, H( f: z
  1302. DEC FC_Cpy_Count_H
    # l% L  r9 H+ @& _3 i3 s* L
  1303. BMI FC_Ppu_To_Ram_Over% ]3 I) O4 o9 G! I$ i) s6 D
  1304. FC_Ppu_To_Ram_Copy:   ;开始复制数据& Q% s. T9 d+ ~, X
  1305. LDA $2007
    % i6 W. V" z1 f9 {
  1306. STA (FC_Cpy_To_L),Y! [. }* p0 g7 W5 ~2 n" [
  1307. FC_Ppu_To_Ram_To_Set:    ;目的地址递增
    ! T8 o4 E* L6 r7 R, s: ?! n
  1308. INY
    6 ~0 g9 M* S# ~+ ~- e
  1309. BNE FC_Ppu_To_Ram_Count
    8 L) v9 [. Z! x$ I, L
  1310. INC FC_Cpy_To_H
    4 y! |9 C7 K; Q' R
  1311. BVC FC_Ppu_To_Ram_Count
    5 H, v% D: X$ {7 _8 t) x6 T
  1312. FC_Ppu_To_Ram_Over:    ;结束数据复制% M, y6 v2 f( L7 h4 }
  1313. RTS+ G! O2 u& o) |. m$ c: b

  1314. 8 v- N& k2 {8 w6 Y
  1315. ;----------------------------------------
    - Q, ~5 O" C) [. L" B
  1316. FC_Ppu_Clear_Mode:   ;清除PPU模式
    6 S/ l5 |, M0 h: h- |7 n
  1317. LDA FC_Cpy_To_H+ u8 C* v; r: p0 o- m4 i- _
  1318. STA $2006
    ; I- n  S6 Q! f  p0 D1 i: Q
  1319. LDA FC_Cpy_To_L# L2 n. ]- ]- T" B- M
  1320. STA $2006/ o; {" L: j  i* ]) q5 C
  1321. LDX FC_Cpy_Count_H
    ; ^: E% Z+ Y8 I7 Q$ m4 f0 F, l
  1322. LDY FC_Cpy_Count_L: j. v. z: Y; o' {# z5 b1 |
  1323. LDA FC_Clear_Val  ~! }# L- E! V. q* A
  1324. FC_Ppu_Clear_Count:   ;剩余计数检查1 _) q4 X# h# ~9 S9 F, X8 |7 a
  1325. BNE FC_Ppu_Clear_Copy
    - L( f. Q( I/ C" E4 u# m3 W
  1326. DEX3 |3 G9 i2 C; n, N
  1327. BMI FC_Ppu_Clear_Over1 C. u$ m( m+ N$ \. o- a% c2 L4 V
  1328. FC_Ppu_Clear_Copy:   ;开始清除PPU. `3 r* @* D" }" N6 [# Z
  1329. STA $2007
    * r4 ~' i" E/ i# e; h( ~% D$ x
  1330. DEY- ^+ O. k: s) S2 P3 |) _* A2 ~
  1331. BVC FC_Ppu_Clear_Count
    ! t' y/ Q' O9 P8 V& n" {- q
  1332. FC_Ppu_Clear_Over:    ;结束数据复制. S+ u: r" Q8 w) o: e
  1333. RTS
    5 \3 ?/ W, Q& y( ?2 l" B
  1334. . f2 m5 E! o0 D7 h
  1335. ;==================================================
    & i% F: R. g7 c  X
  1336. ;保存RAM数据# P1 s9 [$ f5 s- t
  1337. Save_Ram:1 d' T7 ~& p4 C# L% _8 L: s1 a
  1338. LDX #<Save_Ram_Data
    : b* t/ t2 K/ I" ^% |8 s9 ~, [
  1339. LDY #>Save_Ram_Data
    # |5 n  `' D3 `2 Y
  1340. JSR FC_Data_Copy4 e' f) S0 f* f0 F
  1341. RTS9 k  L( U/ l# }. g* x/ f

  1342. 0 i$ b) |8 e2 R4 \% X
  1343. ;加载RAM数据" T2 Y$ Y  f, p8 T) r1 b6 c, N9 Z
  1344. Load_Ram:5 ^- L7 e0 e: [  E4 [4 E9 Y
  1345. LDX #<Load_Ram_Data. p7 d& m& u0 S  {4 H% ]& m4 u8 O
  1346. LDY #>Load_Ram_Data5 E0 e, R9 o4 [7 Z0 `% W
  1347. JSR FC_Data_Copy- K9 @0 v' U' K6 B2 W; A% I
  1348. RTS
    ' S  N* [) _) R4 ~$ a, K$ ^) n
  1349. 4 f) x; ^) i3 z0 g; w8 y7 F
  1350. ;保存PPU数据
    / S' A# X) C. o+ @& b& v( \5 _
  1351. Save_Ppu:+ y, s6 k3 W. m0 [: I. \* f
  1352. LDX #<Save_PPU_Data$ q$ m* e4 a: k  P9 T% |8 H
  1353. LDY #>Save_PPU_Data* a+ h# }# F/ C! x: x; h) p
  1354. JSR FC_Data_Copy
    4 T& i3 r% g1 q# t* t+ @
  1355. RTS
    6 |4 g) ~" I: }

  1356. : o' z( f5 ~' V* Z+ W
  1357. ;加载PPU数据2 i# B) N. O# X* ^. M: ~2 l
  1358. Load_Ppu:
      `( R/ I) [# {( N. e
  1359. LDX #<Load_PPU_Data
    ! U3 P4 o0 i+ E1 r+ G) R' d! T/ }
  1360. LDY #>Load_PPU_Data
    ) S7 \# }2 k9 P" d5 m& q, Z( C
  1361. JSR FC_Data_Copy  I- t" x, P, e- C) H
  1362. RTS
    - W2 ], a) [# W0 N

  1363. 0 c" y# L" m1 S# G5 m) M0 n7 A+ @
  1364. ;清空PPU数据
    9 g5 ^; k# t+ g1 Q# ]
  1365. Clear_Ppu:
    . p) D$ F5 I- k2 t& r/ F
  1366. LDX #<Cln_PPU_Data
    ) |7 h2 F0 p# J, \5 q1 S; C
  1367. LDY #>Cln_PPU_Data
    ' Y/ [- X2 Z' J# U
  1368. JSR FC_Data_Copy
    9 i" ?7 [; |4 N+ U3 `4 d0 P% e
  1369. RTS
    : R; ^: `0 ^2 ~3 x3 r1 d4 v0 ]

  1370. # r& t% F+ X  c5 S: d9 U
  1371. ;==================================================2 S& _; W6 C. ^3 `
  1372. ;数据配置
    ( u5 u8 _/ D' j* [1 B: M1 n
  1373. Save_Ram_Data:
    & k% a9 B2 X9 @: k5 W8 t
  1374. .DB $00,$03,$00,$63,$00,$01,FC_MODE_RAM_TO_RAM
    / f. X5 z: s% r2 @( A1 a% ^
  1375. Load_Ram_Data:8 }+ A- a8 T+ |$ J
  1376. .DB $00,$63,$00,$03,$00,$01,FC_MODE_RAM_TO_RAM6 D; c, c$ Y0 S! k; f
  1377. Save_PPU_Data:
    & _: I1 n* S* E3 z* r% K
  1378. .DB $00,$20,$00,$64,$00,$04,FC_MODE_PPU_TO_RAM
    3 a- j+ ^- w2 z6 p. T# z
  1379. Load_PPU_Data:2 G+ Y" n9 F- Q/ r$ }. k5 B
  1380. .DB $00,$64,$00,$20,$00,$04,FC_MODE_RAM_TO_PPU- _& G' k9 Z1 X) r  K' `
  1381. Cln_PPU_Data:
    6 E/ t! d. b; [: }- b4 p
  1382. .DB $00,$00,$00,$20,$00,$04,FC_MODE_PPU_CLEAR; r. w- T) P8 G6 x9 X; Y) f
  1383. . U, A9 n+ M% N5 I1 u. ?! r

  1384. 7 s+ H% O# h; f7 v8 a: O
  1385. ;==================================================
    1 i; Q3 f2 z6 c4 w( Q! p
  1386. ;文本数据PPU显示地址
    $ s$ ?" b& z7 S" W7 \9 I/ `; Z. e! p" X
  1387. Text_PPU_Addr:
    ( y0 E; Y5 x1 [1 _/ Q1 V
  1388. .WORD $20C5
    0 s; z' v- [% m+ W! v
  1389. .WORD $2105; N7 e6 w! B$ P! c
  1390. .WORD $2145
    7 H6 Z+ M1 m2 R) s8 f, D- W: z
  1391. .WORD $2185
    ; [' {  t9 p* j( C
  1392. .WORD $21C5
    " {" [: \5 [$ j! @
  1393. .WORD $2205
    1 _& D3 y7 `* m3 |
  1394. .WORD $2245
    5 d! s* X1 e4 f$ E% [
  1395. .WORD $22857 ^# Q0 C: t9 z5 `; H0 [2 o) f
  1396. .WORD $22C5
    ! D6 O: ~# o/ M/ a2 H7 L. N
  1397. .WORD $2305
    9 s- L! e) H  T8 h7 g; n
  1398. .WORD $2345  x/ h( t3 Q6 r, U6 z( H) b, E
  1399. 9 R& ^0 ?& @; J# t
  1400. ;==================================================8 s) q' j9 i7 N9 ?
  1401. ;文本数据PPU数据地址0 V6 B2 T- L2 m8 M$ u. I
  1402. Text_Data_Addr:
    5 y3 k; T+ f  z. ?% h
  1403. .WORD Text_Data_01
    ( w# F  ]# i4 c% F1 l" T0 k$ i
  1404. .WORD Text_Data_02
    ) N; X) Q8 a- N' n
  1405. .WORD Text_Data_03* M% Y6 |# l+ b, h
  1406. .WORD Text_Data_04
    7 z; T% e$ v& b' T  e4 Q
  1407. .WORD Text_Data_05
    % ?1 i8 b7 `# R& [) I# M
  1408. .WORD Text_Data_06
    , |  z4 }; [+ n. R& q) C1 m/ f
  1409. .WORD Text_Data_07
    0 k* v! }$ c/ _* l7 {" X( m) X
  1410. .WORD Text_Data_08
    : d; W. X5 Q: `; V; i" ^
  1411. .WORD Text_Data_09# c) x5 d/ U/ |) `4 K! M
  1412. .WORD Text_Data_10
    5 b3 h! A; ]: x6 k+ f
  1413. .WORD Text_Data_11
    ; V9 k& [: _0 Q0 F- T" c7 y
  1414. .WORD Text_Data_12
      ], g6 m* `) B6 d
  1415. .WORD Text_Data_132 C+ U( p9 q" d% ?
  1416. .WORD Text_Data_14' s+ Q* A4 ^0 T, g) e
  1417. .WORD Text_Data_15' Q) X% l7 j: |' m; \0 L' g3 K
  1418. .WORD Text_Data_16
    1 b  b9 A2 z; y$ i8 f4 i

  1419. ! h1 Y& |7 W# ]: t( w) y
  1420. ;==================================================
    , p1 i' Q; @3 a8 ^
  1421. ;文本数据
    ) h7 u2 Z: M3 C! ]& L3 R
  1422. Text_Data:1 C. N" K" z4 J( }: q
  1423. Text_Data_01:: W  N* W) t+ n2 B1 X# x9 a$ r6 h" J1 `4 }
  1424. .STR "01.INVINCIBLE"
    7 ^4 g0 _+ x3 _# u, _' _
  1425. Text_Data_02:# o! }2 y5 x3 g, A4 L9 t& `
  1426. .STR "02.INVINCIBLE PLUS"
    - a: i9 F. \! I  F
  1427. Text_Data_03:
    9 k5 u; |1 f0 _" g
  1428. .STR "03.LOCK LIFE"
    6 a- o& t0 j+ ]% z9 j) x% p! Y: c% o
  1429. Text_Data_04:2 c7 A- v# U. p/ r
  1430. .STR "04.LOCK WEAPON"
    1 p) K7 i  W; D2 A  \
  1431. Text_Data_05:& H. ?8 k# {# j: Q6 b
  1432. .STR "05.SEL CHANGE WEAPON"4 O7 s; p3 u0 t& B6 |* p
  1433. Text_Data_06:. |1 X5 n$ [" s; R2 Y( P
  1434. .STR "06.UNLIMITED JUMP"
    , }' L8 r, E3 {
  1435. Text_Data_07:3 [) K- X$ F9 u5 V: ~( O9 K
  1436. .STR "07.MOVE FAST"4 n4 c0 A! H2 X% f* g7 p0 |! k# |
  1437. Text_Data_08:7 t( N2 J6 ~/ e
  1438. .STR "08.SWAP SKIN"8 c, u2 `2 o: l: ]
  1439. Text_Data_09:0 A9 N4 W  ]: w
  1440. .STR "09.EQUAL BULLET"9 d  u5 r) r0 _  U
  1441. Text_Data_10:3 t9 u/ w  }1 I: j) t
  1442. .STR "10.STRONG BULLET"
    " X& d. o) Q% P, n8 ?+ l. w; @
  1443. Text_Data_11:1 p0 C6 U- y' L! v0 p
  1444. .STR "11.KILL BY ONCE"
    : m2 Z0 O5 l2 K5 ~' y
  1445. Text_Data_12:0 r$ g3 [+ i8 h4 e
  1446. .STR "12.FULL SCREEN KILL"
    ) u) n7 [" x4 G3 E2 c1 v: D
  1447. Text_Data_13:. w4 a* d: U: T4 {- H
  1448. .STR "13.DOUBLE CONTROL"
    % d$ f! I# Z+ r1 Q, V! l7 R
  1449. Text_Data_14:
    " _2 t  e  Q0 ^8 j
  1450. .STR "14.REMOVE E-GRID"
    ' v9 v' S) G$ Z3 E& G, D' Q) \- w
  1451. Text_Data_15:: b! e3 I5 G& ~! c; _
  1452. .STR "15.FALL INVINCIBLE"0 B5 O1 R% c- U
  1453. Text_Data_16:
    4 N2 O- o4 ~& h; ^* X5 @
  1454. .STR "16.NEXT STAGE"# U; q& s. i0 K1 [: }
  1455. ' q* Y" K2 w+ E3 m2 Q, D
  1456. ;==================================================
    3 G" ?( ]9 B6 N; `  D$ q
  1457. ;功能开关检查地址
    9 R0 P% |; [) a) B) d
  1458. Function_Addr_A:& p# N. W. E; r) k  N- J
  1459. .WORD $01C0+ p$ N6 E9 t, K9 V% e
  1460. .WORD $01C0
    & H) d5 y- l  k8 _7 y+ C
  1461. .WORD $01C0
    ) r" Z9 ^7 W) y& n. h  s+ b9 e
  1462. .WORD $01C0" o1 S: h- N$ \/ b* k4 {" W% a( N
  1463. .WORD $01C0$ F4 ?+ W, B7 }7 r. c5 E
  1464. .WORD $01C0
    ) \. X5 a* N) w6 ?3 y$ `1 a, Y
  1465. .WORD $01C0
    # I& u1 T" C3 l$ i
  1466. .WORD $01C0& _4 w% x2 b9 `9 `
  1467. .WORD $01C4! F- F4 I, d$ H5 M6 H- w' ]. U
  1468. .WORD $01C48 b7 z. P' w$ O( n) I+ {
  1469. .WORD $01C4* |2 ~5 c. b( |7 H. I+ `# M6 z
  1470. .WORD $01C4
    / V7 k8 j2 W( A- z. r
  1471. .WORD $01C4
    " @$ F; b& v7 H$ ]2 K& Y! g
  1472. .WORD $01C4& i& p/ a( e6 R2 R* ~- {
  1473. .WORD $01C2) x0 k1 N9 A% Y# P& m% p
  1474. .WORD $01C4% w% U6 o/ X# X0 c
  1475. ' [: f( }. U1 h! S. A5 B2 d
  1476. ;功能开关检查地址1 n5 Q- Q; ]; q2 F: E/ Q+ X
  1477. Function_Addr_B:# b( u. t  g4 A4 j- K
  1478. .WORD $01C14 p7 ~% M: w0 i4 q
  1479. .WORD $01C10 v/ G5 q4 A: {5 S( x3 a. B
  1480. .WORD $01C1
    9 t/ h, b2 z+ l! f4 z
  1481. .WORD $01C13 \% L6 ?$ B; n' z. \) M- T
  1482. .WORD $01C1' E, B7 p, L  q1 K. v! ?* [8 [
  1483. .WORD $01C1
    ( O5 \% w+ {, v) ?  `% v' T" R
  1484. .WORD $01C1
    4 c2 K! q- y" f' z
  1485. .WORD $01C1
    7 J& Y* V6 l) v6 \4 c
  1486. .WORD $01C4, L3 y7 N: D$ k3 a* l
  1487. .WORD $01C47 D5 k, \  [; |
  1488. .WORD $01C4
    & T; B" e: ~/ `) m# G- s1 S) z
  1489. .WORD $01C44 @2 X0 R( L6 E
  1490. .WORD $01C4
    1 w% ]5 B1 u; K
  1491. .WORD $01C4+ I$ G2 R# K0 }! K
  1492. .WORD $01C3) g/ u4 C; E5 B
  1493. .WORD $01C4
    4 G; u& ]* o6 D- i: z/ h! E

  1494. % c3 \# x: q9 D1 [: o5 ?
  1495. ;==================================================
    ; @  }+ B# h  a6 {
  1496. ;功能开关检查数据
    ; @) v2 Y0 f6 J. r3 V' s
  1497. Function_Check:, L( W$ D" q  D* }+ a$ n7 m
  1498. .DB $01% Q, j+ e2 E* q9 T
  1499. .DB $022 `& E6 w" t) T, P
  1500. .DB $041 e( V) _% {, J% h
  1501. .DB $08
    / G8 R3 l# p" [1 E
  1502. .DB $10& V$ e8 a( t9 c" V
  1503. .DB $20
    ; M$ Z& t0 ]( p" w
  1504. .DB $40
    + m* f9 ?& z) L* F9 z; ]0 x8 S: v, S
  1505. .DB $80
    3 N' R/ e- v0 q
  1506. .DB $01; }) q4 _7 f& e
  1507. .DB $02" l2 S8 q$ _7 I% L" ^
  1508. .DB $04' Y6 \5 W) g3 G1 `
  1509. .DB $08
    * r3 D9 w5 W% t& V& I
  1510. .DB $10
    6 K* }7 Z/ U6 ]; {* g# Y( m3 ?& j* }1 @
  1511. .DB $20
    * O8 t- l$ g, P' H: }1 Z+ W
  1512. .DB $405 l+ n4 W+ c$ b% G4 r/ ], B& |
  1513. .DB $80! L8 f9 _; {4 p5 J: E

  1514. 3 m+ N* Q# S. L! M/ i
  1515. Char_Rom:+ m: c  W' D, M0 }: D- H9 P
  1516. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00" R* w: a8 t$ B- M
  1517. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    5 \* a8 C+ {4 @6 h
  1518. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3B,$25,$00
    * l. v) Y: W1 n% e
  1519. .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$00,$00,$00,$00,$00,$008 {" t7 N1 b4 d7 P5 A  _4 ]
  1520. .DB $00,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19
    ) h& T5 T0 a1 B- ?- _
  1521. .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$00,$00,$00,$00,$00* H) E8 N, n' s& q" V

  1522. 4 a  @1 @( s2 m
  1523. 5 }! ^5 a4 ^. o! F
复制代码

8 P% D  V/ T+ h0 A" }/ x
游客,如果您要查看本帖隐藏内容请回复
4 }1 A3 V0 ]9 R" {" w
flamecyclone.ys168.com! w0 ?2 U4 K8 ?' |
www.nesbbs.com

本帖子中包含更多资源

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

x

评分

2

查看全部评分

签到天数: 3165 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 142 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1694 天

[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
回复 支持 反对

使用道具 举报

签到天数: 2656 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1486 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 187 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1896 天

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

使用道具 举报

签到天数: 1266 天

[LV.10]以坛为家III

发表于 2019-12-5 06:49:43 | 显示全部楼层
樓主的修改一定支持, 魂斗羅是喜欢的系列.+ U7 i" h+ X# @3 H7 C7 \6 n, S
多谢楼主分享
[发帖际遇]: waikwokt 打扫环境卫生,被奖励 2 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 1183 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3608 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1341 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3302 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

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

使用道具 举报

签到天数: 632 天

[LV.9]以坛为家II

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

使用道具 举报

签到天数: 8 天

[LV.3]偶尔看看II

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

' c/ Z( g7 D4 A2 ?( Q9 VTec.PNG (8.05 KB, 下载次数: 0)! O/ C1 G/ q) C5 ~. ~* L

* A, ~3 |4 |% ?" w# [8 x) G下载附件  保存到相册3 ~% j. y0 J4 U1 |0 _8 _' U5 f

  V/ A, D( Y* e  `4 M# c1 L2020-3-13 13:33 上传; i9 S) s; e$ t7 ~% E% t. I
得到的文件解压后放在任何FC模拟器即可玩。NES上最优秀的篮球游戏!1 _8 G6 w! F: Z  ^" u7 _) S
5 i# w8 O: B# b: B修改内容:/ Y$ c- W. {& n+ B2 G
1)游戏时按START键可以开启或关闭怎样射球都进篮,全场照进!- t9 S2 d" W3 p& \  s( m1 v: R( ~4 L1 d
4 N# A* o  K& S. i2 c
, ~4 i* V! W/ u$ c不过开启了是双方面的,看到电脑拿着球赶快关闭!(有声音提示)。" p1 M) ?$ I+ `) P* f2
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-27 06:43 , Processed in 1.100586 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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