设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2019-11-29 20:25:37 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2019-12-4 21:31 编辑
; Q" H7 i  h( p4 o" h7 \; f2 \
2 o6 b* s# a5 ^" Q) t2 R[FC][魂斗罗][最佳可视化]
% _8 F# q" q6 i0 v; u- g时间:2019.11.303 S. y  [" q4 r. F4 ]
作者:FlameCyclone# j: r( R7 j- k* u4 m
内容:) d3 @' P+ d) t) p. x
1.可视化:   
( s8 N$ F' X  H. L' x  z1 K     (1)暂停时按选择键进入菜单8 Q4 m9 Z3 O1 s( ^7 x. k
     (2)方向键选择功能: B键开启: A键关闭: 选择键交换,开始键退出
  Q0 t" d" G- ]4 }3 c9 r: o$ s' o     1.1.透明无敌: 透明无敌1 v% S* h+ @, @% |! o$ ?4 k
     1.2.加强无敌: 金身无敌# n9 ~% H, S1 B2 l+ A
     1.3.生命锁定: 生命锁定3条9 F, C! p; E' z
     1.4.武器锁定: 武器保持不变8 V, u0 A1 ^% }# R: ?. H
     1.5.武器切换: 游戏时按选择键切换武器! J7 O8 `* e7 a4 x6 c3 C+ P) ^& ~
     1.6.无限跳跃: 跳跃无限触发
4 S8 r: g, x0 |7 H     1.7.快速移动: 行走速度加倍
: t4 ]$ {8 E' o5 V8 R; q     1.8.皮肤切换: 交换玩家肤色  ?$ |# O! f" F! B- Z. G9 U: @
     1.9.公平子弹: 玩家子弹可以与敌人子弹对打/ f" a' y5 n6 [8 O
     1.10.强力子弹: 子弹打中敌人后继续穿透
- P6 ?8 t, P+ Q# g; [  X     1.11.一击必杀: 敌方中弹一发必死& _0 F8 K( Z. H& o2 K7 P# b
     1.12.全屏击杀: 开枪时全屏可击中目标必死) M0 H, s# E# l2 ^& s
     1.13.玩家双控: 两个玩家的任意一方均可同时控制两个玩家$ n. [* ~& |9 |! {
     1.14.移除电网: 移除2,4关的电网1 P$ k/ g8 Y/ R/ e5 i( a
     1.15.掉坑不死: 掉坑后不会死亡2 I3 d0 R5 |* R  w. r" {
     1.16.跳过关卡: 跳转到下一关
2 q8 c0 E: p2 M
  1. ;[FC][魂斗罗][最佳可视化]
    " I( |" d, ^6 y6 k
  2. ;20191129
      O3 r  ?+ h0 i$ w  l3 N

  3. + o) K  y3 h& H+ @% |
  4. ;程序开始地址+ b( [9 d! k, v  ~( n, b$ O( \6 @
  5. .ORG $9000& E6 U6 `' @. U: d
  6. ! j/ N. w* W2 {9 t- j
  7. ;==================================================
    $ w( B4 b& q# V5 s/ v
  8. ;==================================================
    , G, [7 h% {* Y8 n8 X
  9. ;是否双人玩家
    ( h1 s7 W% E, ~) t
  10. FC_IS_DOUBLE_PLAYERS = 1" o& j/ C- v- k- `& K
  11. : G0 t& m+ z/ B- R% v/ j6 |
  12. ;==================================================1 b! T+ v% o' s1 r- T4 r
  13. ;PPU缓冲地址配置3 m; A% N3 b6 r$ a7 i' m6 z6 ]' ~1 m
  14. FC_PPU_Buffer = $0300) T: c2 r! N: G
  15. ;PPU地址配置9 O" e8 Y7 {% a  k% Q: v
  16. FC_PPU_Cursor = $00) I! U4 [4 Q6 K' S5 M  k
  17. FC_PPU_Status = FC_PPU_Cursor+$01  L5 X, Y, J: B4 ?; N6 c& a
  18. FC_PPU_Data_Cnt = FC_PPU_Status + $01
    , y3 x1 ]1 b( F0 G( F' s
  19. FC_Data_Port_A_L = FC_PPU_Data_Cnt + $01
    # ?* W- ~/ Q; e8 m9 b( }
  20. FC_Data_Port_A_H = FC_Data_Port_A_L + $01
    ( L% e" e2 |1 j/ K' Z' {% \" ?4 H
  21. FC_Data_Port_B_L = FC_Data_Port_A_H + $01! t9 j1 K3 D* b( ?
  22. FC_Data_Port_B_H = FC_Data_Port_B_L + $015 w( m# X: M# q2 n
  23. ;==================================================
    - `* z0 D) g- |# y3 s- S$ O

  24. . v0 }% k* Y; _$ O: p
  25. ;==================================================
    # x, E5 X$ `7 v  D  R2 |5 w' q- b
  26. ;选择项地址配置
    ) \  p5 L3 B' V
  27. FC_Select_Index = FC_Data_Port_B_H + $01
    , y, n: U5 O" H0 ]
  28. FC_Select_Temp = FC_Select_Index + $028 K; T" Y, M6 _5 q3 F7 y
  29. ;NMI循环计时器
    * Q* w3 y. p" K  e5 m2 F
  30. FC_Time_Count = FC_Select_Temp + $01( }# S' F  u" Z: ^! p
  31. ;==================================================
    & M( [$ W1 M& z* H" o3 U  u: v5 R4 A
  32. $ K8 V; a: W) o0 }' m/ v
  33. ;==================================================) i6 z5 r1 r$ N0 J0 P- h
  34. ;光标配置
    8 ~5 _) H3 ~+ Z/ }
  35. FC_Cursor_Addr_L = FC_Time_Count + $01
    9 }9 H- J; o0 u  R! }) |& ^
  36. FC_Cursor_Addr_H = FC_Cursor_Addr_L + $015 e8 d& S5 e' G8 p2 g
  37. FC_Cursor_X = FC_Cursor_Addr_H + $01
    / _1 Q# I& K4 L9 C
  38. FC_Cursor_Y = FC_Cursor_X + $01% H$ W* l( r+ W
  39. ;----------------------------------------
    : j9 U; K  e. F
  40. ;光标图形号
    ' `! |/ d) ]: d
  41. FC_CURSOR_TILE = $3E
    & S+ h! G, i# Q! A! Q7 R* [  h1 g: N
  42. ;光标偏移像素值: c$ X4 [" x0 b1 w4 ^( ~
  43. FC_CURSOR_OFFSET_X = 12
    6 R8 ~* x: t. y0 C8 a8 v. f
  44. FC_CURSOR_OFFSET_Y = 1! o% ]5 M7 e( Z
  45. FC_FUNCTION_OFFSET = 21
    ! t; D# H) ?- ~6 |! b' `
  46. FC_ON_TILE = $3D3 n4 _5 A0 g. X  e
  47. FC_OFF_TILE = $3C# T6 _# G. h1 G5 z
  48. ;==================================================
    ) T* |+ V" M! M% e8 j% A$ |" @8 J* _
  49. $ t0 Q! x" K/ i
  50. ;==================================================
    # \( v: t* K) u( \
  51. ;翻页配置
    & g; A+ E+ e% ~2 s. I
  52. FC_Page_Old = FC_Cursor_Y + $01
    3 s: }* \' u! J! r& o
  53. FC_Page_Cur = FC_Page_Old + $01$ P: h% A2 H: C! M
  54. FC_Page_Item_Count = FC_Page_Cur + $01
    9 _1 ]3 w( h8 `! j! L
  55. FC_Page_Item_Buffer = FC_Page_Item_Count + $01
    , ~* k" }/ X& ~
  56. ;----------------------------------------2 T5 D" j  b3 d! b( o$ f
  57. ;翻页属性8 A# V# W! V, g3 o% {* d+ r
  58. FC_PAGE_SIZE = 10$ F; C1 c2 K( A, L8 ~5 V0 }
  59. ;PPU单次写入缓冲项数- q. C" X' l! K7 e$ x4 X3 n# \
  60. FC_PAGE_BUF_SIZE = 2
    4 M2 W8 X5 Z2 J$ p% Q' `
  61. ;----------------------------------------
    , Z* D1 F0 z3 m( d) l( B
  62. ;显示项最大索引属性
    ! c4 {# X' k7 r/ T' Q6 k
  63. FC_ITEM_SUM = 16 - 1% p5 v3 i$ G! B8 O8 s, }: T  a
  64. ;最大页索引属性
    3 O, _0 A# Q( ~/ n5 U0 h
  65. FC_PAGE_MAX = FC_ITEM_SUM/FC_PAGE_SIZE*FC_PAGE_SIZE' v* ]. i9 _9 r9 ?* d7 {
  66. ;==================================================# l- e+ Q! n) [. Z7 o

  67. ; r; c: |; S6 r( E6 I% o
  68. ;==================================================/ W* Y5 u& M3 ?5 ]: ?8 r
  69. ;按键配置
    8 g2 D& x+ i/ r2 T8 [
  70. Button_Keep = FC_Page_Item_Buffer + $018 r6 z7 n. W0 f7 F  H: H, @6 c
  71. Button_Once = Button_Keep+$02
    " n8 h; h4 H' K2 u% Q4 u* O3 G# ~' D
  72. Button_Temp = Button_Once+$027 ?& Q2 C/ p! Z
  73. Button_Buf = Button_Temp+$024 L* t& ]' `3 c/ E& G, Q
  74. Button_Status = Button_Buf+$02  W7 @" v  z1 d2 C8 b, m
  75. Button_Auto_Delay = Button_Status+$02
    * Y7 g. Q+ _9 K7 v9 C
  76. ;----------------------------------------
    ' ~# a; C$ ]% N: X, C5 d. K
  77. BUTTON_DELAY_MAX = $18
    ' c' r; w( ?, ]) c' Z- x/ c, @7 K0 v
  78. BUTTON_DELAY_SPEED = $08
    " Z' b0 m. p3 S: L7 f' N" [

  79. ! g6 u' b5 K) Q# z6 i
  80. BTN_UP = $08
    $ Q- |+ J# e( e5 ^
  81. BTN_DOWN = $04
    3 q$ A6 e3 C$ r) W
  82. BTN_LEFT = $02; v; {4 U3 n. V1 j" p
  83. BTN_RIGHT = $018 J9 |0 P6 x% A7 R) |+ l
  84. BTN_SELECT = $20
    # E" E6 i+ k2 s5 m8 M
  85. BTN_START = $103 C$ E+ O# B( k6 y" H( h
  86. BTN_B = $40* `0 [3 P4 ]% Z2 A2 |
  87. BTN_A = $80
    9 ^5 n2 J( K+ |* {
  88. ;==================================================
    + ^( Z/ d) V# l  ~2 T
  89. ! T2 l- R1 v% X; p
  90. FC_Copy_Addr = Button_Auto_Delay + $01# s% u0 s  g2 W
  91. ;----------------------------------------
    9 f" d/ V9 w) Q. y4 o7 A) r: N
  92. FC_Clear_Val   = FC_Copy_Addr+$00      ;清除模式覆盖值
    9 s4 }+ m1 T" c" A" }, m
  93. FC_Cpy_From_L   = FC_Copy_Addr+$00     ;复制来源地址低位; M! ~  E# z* e7 l# n% O
  94. FC_Cpy_From_H   = FC_Copy_Addr+$01     ;复制来源地址高位5 i  r& R" b/ X! l: }
  95. FC_Cpy_To_L     = FC_Copy_Addr+$02     ;复制目的地址低位
    % Y8 C2 F( @0 k
  96. FC_Cpy_To_H     = FC_Copy_Addr+$03     ;复制目的地址高位
    4 n' ]& n4 A4 S: ?. v1 F) V
  97. FC_Cpy_Count_L = FC_Copy_Addr+$04      ;复制长度低位# g9 r; ?$ @6 N6 ~2 a  g2 B7 ?3 V( k
  98. FC_Cpy_Count_H = FC_Copy_Addr+$05      ;复制长度高位
    4 p+ k4 `0 M, J$ i' A
  99. FC_Cpy_Port_L   = FC_Copy_Addr+$06     ;配置地址低位5 E; M7 F- G# I
  100. FC_Cpy_Port_H   = FC_Copy_Addr+$07     ;配置地址高位4 `; d* @/ X4 @4 c9 l
  101. ;----------------------------------------
    + d( F+ D. u  S, |% h' u, I
  102. FC_MODE_RAM_TO_RAM     = $00  ;复制RAM到RAM模式) e6 t5 \. _* F2 T. H) \! o
  103. FC_MODE_RAM_TO_PPU     = $01  ;复制RAM到PPU模式
    4 |# r7 g; A- p* Y
  104. FC_MODE_PPU_TO_RAM     = $02  ;复制PPU到RAM模式. S/ P% V/ O$ o3 Z. x
  105. FC_MODE_PPU_CLEAR     = $03  ;清除PPU模式' |6 q& z8 f( A( \

  106. ' r# }  K5 c' M3 Q, A
  107. ;==================================================% X* W- a, m3 S1 {5 `
  108. Rom_Nmi_Addr = $FF
    ! L. b3 q3 J3 X7 h# u$ P( d' P5 u* s
  109. Rom_Btn_Once = $F5
    ( }/ d6 m8 x* \4 `& w
  110. Rom_Btn_Keep = $F9
    ' N# u( J& m  W7 K' f
  111. Rom_Pause_Addr = $25
    . [* m9 n9 N! D2 ^
  112. Rom_Pause_Val = $01. j! W! ^7 k" c- l5 I: p* H
  113. Rom_Pal_Addr = $07C0# N! Y( l: ^( D4 G$ `
  114. ;----------------------------------------
    # x. ?  b5 L9 E" v+ i1 E) b3 R
  115. Save_Zero_Addr = $6200
    : J" P3 A" L  ^" n- b  ~
  116. ;==================================================! P- S8 T; n' Q. B% E% |
  117. ;==================================================
    6 _! U: ^1 k  z3 [

  118. $ m* v2 W4 `/ ]) u$ T/ v
  119. ;程序入口
    # x7 w8 {3 P- c" N, F
  120. Enter:
    ! h/ R2 l0 N, J# B- I+ F
  121. LDA Rom_Pause_Addr
    6 i0 k. y8 V1 W3 \/ {5 P( @# R
  122. AND #Rom_Pause_Val, `& `4 z$ G& N  |) S" m
  123. BEQ Quit_End0 }2 n3 a. b8 y' ^" i" M2 F
  124. LDA Rom_Btn_Once5 `# N. {  D- R. C# C
  125. CMP #BTN_SELECT
    - w  A' R" f% J9 [! _
  126. BNE Quit_End
    " D: [; c# M; F1 o
  127. PHA
    $ l$ S( k; H$ ~
  128. TXA
    7 h8 x# S; [; |; x
  129. PHA
    0 _; B% w% w- g& ]! w
  130. TYA) y5 r4 u( o2 Y; L
  131. PHA
    3 n6 |$ x# U7 u5 L7 N
  132. JSR Wait_Sound_Stop
    . l0 b1 V, l: O$ M
  133. JSR Save_Screen
    $ U/ h, u9 R% z' m
  134. JSR Program_Begin  O  ~' a! v8 w' o  q2 D" o
  135. JSR Load_Screen
    # o' P' I, j7 t7 @. ~
  136. LDA #$107 g; g7 ^& O# Y$ l, ]
  137. STA Rom_Btn_Keep2 _* z+ b) E1 f, v. Z; S8 O
  138. LDA #$00
    3 c9 h3 ~0 {" @2 h4 Y- |8 q- n
  139. STA Rom_Btn_Once4 }+ i  R, l* w* q' k
  140. Quit:7 S5 J; ^7 N3 t5 t2 p4 V5 I
  141. PLA
    5 `5 s& T/ W6 [- ]4 A3 I/ u/ p
  142. TAY
    ; @1 t$ s" z7 Q5 _9 d6 x  u
  143. PLA
    0 l) \! A2 [7 v
  144. TAX
    ( p# o# B* t8 p! e% p
  145. PLA
    $ C- K: x  K$ A2 f" O! o3 @; p$ U* A
  146. Quit_End:' u8 k: X) w' ^7 I
  147. RTS
    1 ]5 s6 x" n% B+ F; T3 N+ I6 G8 K) s

  148. 3 `3 }) q5 `. e
  149. ;==================================================5 v& b: c9 j$ y  r
  150. ;等待音乐结束
    . @9 B0 \0 G& B7 G/ s3 L
  151. Wait_Sound_Stop:
    1 Q2 G5 {0 M5 ?
  152. Wait_Sound_Stop_Check:
    + v! |: ~0 ?+ p/ Z
  153. JSR NMI_Wait( ]1 N& z2 z' ]8 ]
  154. JSR $F825
    2 v5 m& l* o# o8 S* e: R' W+ b9 u
  155. LDA $010A' O9 C: w5 y/ R7 o6 E% A* P
  156. BNE Wait_Sound_Stop_Check1 m7 E, M, W7 F2 W' V" d2 M  @+ P
  157. RTS
    ; b! H: n$ A- _6 Z7 H

  158. 4 V) o$ d) B& J. @; i6 N: g+ |
  159. ;==================================================
    1 r! E, B( \/ g9 t# X
  160. ;保存屏幕数据
    " k4 `* T+ J% O& U5 h  `
  161. Save_Screen:
    3 y* N5 R1 B5 r1 F: \/ f
  162. JSR Screen_Off, S7 h  n" z/ S
  163. JSR Save_Zero
    + z6 t* a+ p5 H5 }3 C" B/ q' ~: q
  164. JSR Save_Ram
    4 i; V5 J1 s& L2 k1 f7 j
  165. JSR Save_Ppu
      o( Z) V" }& n% w# ^
  166. JSR Ram_Init
    : l3 Q5 Z( Z5 |8 o5 A) }. K: u
  167. JSR Sprites_Init
    4 z; l+ A7 N6 B5 U0 W
  168. JSR Clear_Ppu8 ~5 H- u! B1 @9 R! q
  169. RTS
    + x) P+ V4 ]; `- I( s) ?3 Z# Y

  170. , P8 i" g8 ^2 n/ y& J
  171. ;==================================================
    ) Z* \6 L7 o. a- `6 p2 Y6 Q
  172. ;加载屏幕数据3 K- e7 X8 Y& u0 i
  173. Load_Screen:  z/ l6 z9 h8 B' A2 J- \: H4 C0 Y
  174. LDA #$00$ u: K/ x5 n4 v; p- {
  175. STA $2001
    * r4 ^7 p0 @; ?- X- ?: @
  176. JSR NMI_Wait& i1 P' `) _5 ~6 S1 m7 x* o
  177. LDA #$02. t! Y+ w; F$ V% \# D0 I; c
  178. STA $4014
      r( N9 ]! P' U* E3 X1 z* T
  179. JSR Load_Ram
    8 @$ e8 R" m( m& Y8 h% g8 i  w
  180. JSR Load_Ppu
    0 k1 }& H; L2 E* Z0 ^
  181. JSR Load_Zero
    * V6 k* t% ^0 D; u0 ?- {2 ^" Z
  182. JSR NMI_Wait' H+ v6 e9 w5 W7 L. x. G( U- X
  183. JSR Load_Palette
    . V, B2 x/ t  o. E3 J
  184. JSR Screen_On
    * O, |6 p0 }2 b; B( ^: x
  185. RTS
    8 @# ]( W& f0 o9 d
  186. ) `7 O5 V% j2 L3 H
  187. ;==================================================
    , o3 X8 V3 e" f6 O7 m
  188. ;关闭屏幕
    * k8 G* {1 T1 ]( u3 O' {
  189. Screen_Off:
    4 R  V! z$ H6 f2 J  p
  190. LDA Rom_Nmi_Addr
    " ~6 U2 c  [, y6 W( Q- P+ x
  191. AND #$7F6 f; z7 p% f+ \  U& E+ l7 e0 W+ l
  192. STA $2000& \% T' x: U  u% ]- f! f  t
  193. JSR NMI_Wait
    # L$ N3 }0 D( [, h$ @
  194. LDA #$00
    , L& f# i$ w7 K4 Z8 r
  195. STA $2000' d+ j: x( N. S# f! ~1 P4 L' X
  196. STA $2001
    2 O' K+ t( m5 G! A' K& U
  197. RTS5 A& }. X, q# ]( A* n2 Y

  198. 9 b1 L# Q' t: [
  199. ;==================================================
    + x; @; g# @+ a+ p# k' d8 j
  200. ;开启屏幕
    ( P! ^; c; X/ b# b; Z5 O7 z
  201. Screen_On:
    ' q0 p9 f% w& ^- D: U/ ^
  202. LDA Rom_Nmi_Addr
    : _, k9 h6 y3 y! R! u
  203. STA $2000( `( J9 d! P& h: I. p: T, `
  204. RTS+ T! o, f5 a2 R7 `+ e- B

  205. 8 v5 a6 V5 ^- X3 D  H8 f
  206. ;==================================================
      ^) k1 O: V5 ~
  207. ;清空占用RAM) H" S% q/ H! s! v7 w: Q
  208. Ram_Init:* B8 S" O+ I$ R$ k4 {% b
  209. LDX #$00
    2 Y' w) Q8 h& O) @" q& Z
  210. LDA #$007 x+ C, f# t7 b& E1 v9 n
  211. Ram_Init_Set:. a& ^( V7 T  y/ u3 r9 q: y' i
  212. STA $00,X6 `2 F6 f7 l& `- E5 q' ~
  213. INX, h; ]0 E3 N: W' Q, D4 r9 O
  214. CPX #$40" D. I) Q5 A3 k, y; E
  215. BCC Ram_Init_Set
    , ?9 h: K- ?" k" T
  216. RTS6 R  M2 H) l! H' |% y
  217. ; t- a$ [0 N8 H
  218. ;==================================================6 y$ b. f. D) {( F
  219. ;清空占用RAM
      t; v+ t7 G* A8 o: h7 e- H
  220. Sprites_Init:
    : i- _  M% g) m6 P" ~
  221. LDA $20029 W$ N/ J6 U  G' ^$ {
  222. LDX #$00
    9 b0 i. n9 C$ q( n# u0 S( F4 D& Y1 T% c
  223. STX $2003# y4 |2 q, s" X$ ]$ c
  224. LDA #$F8( t: O. b. H- u8 K3 ~1 q+ B
  225. Sprites_Init_Set:7 _+ X3 q6 F3 E1 I) D- q9 X
  226. STA $20041 o# P: E  ]( Z5 V  B5 C& f
  227. INX( m! Y( `0 r, b$ y: H
  228. BNE Sprites_Init_Set) W4 q8 l; t: O5 {4 x! s4 E
  229. RTS
    ! \+ v/ |$ ~; p
  230.   s6 x* V! b$ e% K& _2 l# T8 A: t
  231. ;==================================================+ C" s: E' c/ l4 Q8 s% ?' e' E3 o
  232. ;保存零页数据
    + l3 y8 o' C* T( t) _! W
  233. Save_Zero:& G& \' [9 J4 [, R# o
  234. LDX #$00
    " E& h8 w  \* x( \. M& f( c* t7 u) x# ]4 Q
  235. Save_Zero_Set:
    % I5 T, t$ o6 V$ u# g( x% s0 c; x
  236. LDA $00,X
    1 f- w+ V$ L9 m0 T/ G
  237. STA Save_Zero_Addr,X' m; `% j& `" N6 V$ K$ f8 q
  238. INX% H8 e  u8 f, Q  m/ g2 c( c9 R
  239. BNE Save_Zero_Set
    1 ?' }' B$ p. ]) ~( ~' H* D9 {) d
  240. RTS* t+ Q) q) R$ m% ?( I

  241. ) `, X2 r( a! b% g% b- @
  242. ;==================================================. j* b& Y( @# j6 d* w
  243. ;加载零页数据4 z- q- U/ O+ V4 x  c
  244. Load_Zero:# N3 w1 T& n6 _8 d0 }. t
  245. LDX #$005 \, r0 [( a& z2 w
  246. Load_Zero_Set:) `: x  C+ F- U* ?
  247. LDA Save_Zero_Addr,X$ P1 y5 j1 ]. I7 ?
  248. STA $00,X5 X; |. h  r8 Y; M7 \$ k
  249. INX- g2 U3 G3 M" V+ N! V
  250. BNE Load_Zero_Set' n/ m  \, \  i9 k
  251. RTS' l1 L  }' H* M* x
  252. 1 [( I  A# ~  y
  253. ;==================================================
    2 J2 p+ }5 u, @4 q3 S
  254. ;恢复调色板( L  ]* M$ a% c1 W
  255. Load_Palette:9 O; r4 V, W- [$ [" B2 @% Y3 o
  256. LDA #$3F
    - {; ^8 D# ?7 u; I
  257. STA $2006
    ) m5 m8 f# l0 z
  258. LDA #$00# y; r, o4 p( [6 K
  259. STA $2006' O0 G$ [& {. i; D. ]
  260. LDX #$00  o$ H0 H* o. ], {$ o6 ]5 Y
  261. Load_Palette_Set:
    - h: S+ T* E3 s/ p
  262. LDA Rom_Pal_Addr,X3 ], n$ i9 y* `8 z& U0 K: m
  263. STA $2007
    ( B5 {! M5 T6 n* J
  264. INX& A' V/ p6 A/ r4 ?7 g
  265. CPX #$20
    # F# l+ v' w4 [' Q
  266. BCC Load_Palette_Set
    ! M% ?( |0 C7 q7 h
  267. RTS, ~7 I) h5 I4 s& [, r2 {2 L) k6 s2 r

  268. : G7 g, w% c- s# n5 q1 [/ l
  269. ;==================================================
    & X4 I+ X! `; e+ ]3 J
  270. ;==================================================
    0 F. B0 c1 h: E

  271. ! W9 ]$ d; V2 `
  272. ;==================================================) k7 k  o" s) D3 g6 F
  273. ;程序开始6 A7 q" `0 t4 H. A0 K0 I; z
  274. Program_Begin:5 K; u5 D, O3 c8 U0 C
  275. ;==================================================
    8 G5 k( W, J; E* k
  276. ;图形设置' n, G2 r2 Y& T
  277. JSR CHR_Set8 D- D) w5 U, j5 j3 \. A1 ?. E
  278. JSR NMI_Wait/ a6 ]7 _/ S8 l/ ?+ x6 G
  279. JSR Palette_Set9 k% u; h2 q" H
  280. JSR PPU_Data_Page_Show
    5 }- g, }* R7 W2 }. v5 Z

  281. , m: T' M. o- Z" L& X# T$ m- V' a8 |1 G, L
  282. ;==================================================
    " z3 y" L- d1 y+ y- Q3 T! P1 M
  283. ;开启显示, P' k# {6 ?2 }* p
  284. LDA #$1E
    ! n6 N6 g8 C9 `' ]8 \( X8 `
  285. STA FC_PPU_Status
    % g/ a0 p, x8 ?4 v0 ]

  286.   \, M0 V' v4 _1 k$ q
  287. LDA #BTN_SELECT
    - v+ D" \: s' }* \% W  _
  288. STA Button_Keep4 I2 `! a: r8 Y6 w
  289. ;==================================================8 a; j* N4 \6 q( K: b! |" h2 Q
  290. ;模拟NMI循环; N" x* Z+ ^$ N
  291. NMI_Loop:
    1 ?( x+ F9 l1 [7 v. L* ~
  292. JSR NMI_Delay
    # o7 M/ c! h2 v! c! H
  293. JSR Button_Process5 Y! K$ ]" A! F  C* R
  294. JSR Button_Auto_Press5 v+ X2 E$ y6 i0 p/ z; Q) T
  295. JSR Change_Select_Item/ ^$ ?+ c" e* ?6 w- C
  296. JSR Change_Function/ q7 M( w; k! D6 P1 V$ s) t
  297. LDA Button_Once
    # A3 t! c# p7 H# W; {4 l/ U
  298. CMP #BTN_START+ U! H4 p2 o" h0 M( S% A. X
  299. BNE NMI_Loop
    ' V7 k4 I" d3 v7 y4 G1 q/ \
  300. RTS1 s3 Z' v4 r! p/ \, c
  301. : G) b% ?7 [$ j$ M! q
  302. ;==================================================
    + J7 G7 i" T% O8 U
  303. ;模拟NMI中断( Y* K! `& G" y, Z9 q
  304. NMI_Delay:" o: ~9 H* s0 Z
  305. JSR NMI_Wait5 c  a9 l. q- C  ~
  306. JSR Show_Select_Cursor1 ]+ s+ P  S7 t% d
  307. JSR FC_PPU_Process+ I" A) \2 I6 u; i& m( Z+ Y+ G
  308. RTS9 o( x" g* L1 ~0 K; Y8 h

  309. * Y% T5 ]' g# c
  310. ;==================================================$ w" v( L/ r4 N( v' l
  311. ;等待NMI中断; t7 t8 q- x& L6 x- c) Q) i4 o3 ~4 {) T
  312. NMI_Wait:3 u. u+ U( {5 H  \
  313. LDA $2002+ \6 [- y0 [! I: }8 i% V
  314. BPL NMI_Wait
    , {2 R$ e7 V1 Y9 W& k
  315. DEC FC_Time_Count
    5 q) X/ d. T* B; P
  316. RTS1 o5 l' W! p6 }! M
  317. 0 o# K% W9 F0 D& f; N7 h7 _
  318. ;==================================================
    0 |( S  ]% a& G/ r  s& p- q- [( `, p
  319. ;PPU写入模式配置属性
    % T! B7 n4 W/ ~! P
  320. FC_PPU_MODE_CNTL = $FE               ;带计数行写入- I4 `4 w! G, K# h
  321. FC_PPU_MODE_CNTC = $FC               ;带计数行清除
    " ~( J- }$ X+ m- X7 V/ \3 K) O
  322. ;-------------------------------------------------+ W( J7 W$ L1 }/ {$ _% `. |
  323. ;PPU处理( f7 H7 f( D. v8 J6 ~! i8 |
  324. FC_PPU_Process:) K- f6 B0 V# L2 c2 g7 T
  325. LDA FC_PPU_Buffer
    - M# ?2 ?& _; r0 h( p* V" ]
  326. BEQ FC_PPU_Process_End
    $ V. t6 W  Z# h* m9 w4 W& e) i- _6 Q
  327. JSR FC_PPU_Process_Beg" T: x6 P2 M% K; K! M7 P
  328. FC_PPU_Process_End:6 O% \  E; s8 w2 E3 Q* P; c2 X% D
  329. LDA #$006 N& L* P. W) b' N- W( [
  330. STA FC_PPU_Buffer
    4 P7 f+ \, C' S
  331. STA $2006
    7 S7 z. v7 k: U2 t0 l5 y5 V! q
  332. STA $2006
    1 K/ h7 \1 I3 M7 r. h
  333. STA $2005
    2 p( a6 E  c2 c
  334. STA $2005# ^9 U3 S! J; g
  335. LDA FC_PPU_Status
    2 J6 h& m! }  j/ {/ V3 \' a" _' _
  336. STA $2001
    ( J( K7 e* l  X. t  M$ m6 q" p5 d
  337. RTS
      g" \- o" `9 q) P
  338. ;----------------------------------------/ r; e% S) \  M2 Q
  339. ;PPU处理开始' U! l4 I4 p: P: @7 q' a! p
  340. FC_PPU_Process_Beg:
    5 U7 N! C. U3 V1 N
  341. LDX FC_PPU_Cursor. W" b1 a9 \1 [) O; Y  x
  342. LDA #$00
    " M& m" U. g6 g  k) }5 t2 i" }# ^
  343. STA $2001, B2 n6 }' X* N: `1 ~+ _# Y; m; G
  344. STA FC_PPU_Buffer,X" k) ~, ]7 S0 D3 A- d6 V
  345. STA FC_PPU_Cursor
    ' [# o# d' o  ~7 f' w
  346. LDX #$FF
    ) k4 c  ?$ T) A' j0 ^
  347. CLV! P" P" m8 J/ Q
  348. FC_PPU_Process_Mode_Select:
    & }0 X1 {; w: I+ V5 F/ `; H( T( |
  349. INX  V) f, p9 c2 m0 t
  350. LDA FC_PPU_Buffer,X# M) ?3 J/ E3 N/ Q! V
  351. CMP #FC_PPU_MODE_CNTL
    5 o3 t! T- n$ O. H6 E5 O
  352. BEQ FC_PPU_Process_Mode_CountLine/ J" |6 ?+ y+ f* i4 ~, R7 w
  353. CMP #FC_PPU_MODE_CNTC
    9 x( ?  \9 g7 N- m
  354. BEQ FC_PPU_Process_Mode_CountClean) L/ G4 P- }, t$ f
  355. RTS
    / Q2 i: H9 \. w/ m* g7 i
  356. ;----------------------------------------
    7 S3 N, X: u0 _0 y3 E' {
  357. ;计数行写入模式
    , K# |3 i* P) g
  358. FC_PPU_Process_Mode_CountLine:! _  `- P1 x' e( W$ S! m3 r: _2 \
  359. JSR FC_PPU_Process_Set_Addr_And_Count
    ' d4 [1 a: m; l3 {' ^/ \2 n7 t
  360. FC_PPU_Process_Mode_CountLine_Write:" N$ z2 F  v4 N+ z9 x3 g. n
  361. INX
    + n& E3 _4 V  u. t8 ?
  362. LDA FC_PPU_Buffer,X- T- J. J' @+ \# u
  363. STA $2007
    ( T. T, G" P3 l( p* c" l
  364. DEY
    ( v8 A5 I: z% b8 _& H- w
  365. BNE FC_PPU_Process_Mode_CountLine_Write& w4 p1 B4 P, K' H5 Q
  366. BVC FC_PPU_Process_Mode_Select
    - ~7 M4 J6 ^8 m) M& t% w7 X+ }) t
  367. ;----------------------------------------. ?5 c3 y" P  O3 z7 q. h
  368. ;计数行清除模式! D: Z( u5 h( _# }: Z  b7 l
  369. FC_PPU_Process_Mode_CountClean:% h: r0 H5 t8 `1 C
  370. JSR FC_PPU_Process_Set_Addr_And_Count
      E. n% S2 M8 u7 E, N4 j& @
  371. LDA #$00
    + m3 q/ w- c4 q1 j
  372. FC_PPU_Process_Mode_CountClean_Write:
    6 m2 k! H6 @2 \8 U* R
  373. STA $2007
    9 ]+ s# d8 R% G, ^: ]1 f( ^
  374. DEY
    - P$ a7 V' n8 z% x% Q4 a
  375. BNE FC_PPU_Process_Mode_CountClean_Write7 Z" U2 ?: j: @  Z- z; Y
  376. BVC FC_PPU_Process_Mode_Select
    5 o: {$ U) D8 y5 W! l
  377. ;----------------------------------------3 G8 J. b, L$ l; g: x
  378. ;设置PPU地址和写入计数
    * v- ]7 |& j& |- f. H4 Z" f9 Q+ r5 G
  379. FC_PPU_Process_Set_Addr_And_Count:
      ~4 S7 a0 r4 }( T
  380. INX) u: w$ E4 _% f# B0 @& n7 W) F; {
  381. LDA FC_PPU_Buffer,X- b* s6 [" d( k7 b
  382. STA $20066 d) |( i9 t3 J5 l
  383. INX8 a5 g$ W+ o  R+ X& x0 y- P/ Y
  384. LDA FC_PPU_Buffer,X1 `/ d# u( Y) @2 A. ~+ W
  385. STA $20064 h7 l2 x& K2 J, f+ v) ~( i. O
  386. INX
      K" b3 R8 a7 H3 m
  387. LDY FC_PPU_Buffer,X, A/ F' j8 T; Z5 L
  388. RTS- ^4 e( r/ ^( \$ z1 Y
  389. 7 e, E' P! j& Z' K
  390. ;==================================================# O9 \( {4 i- T7 v* q4 H! i
  391. ;设置CHR图形
    * F% e; c, }' S/ S( f$ L, y: g
  392. CHR_Set:* j# v* B, D4 I3 D; M
  393. LDX #$05
    4 ^& }0 j$ D$ N0 S. N: X
  394. CHR_Set_Data:
    # ]5 ~- [; o/ O7 H
  395. STX $8000
    $ R. o) P1 Y. S& f
  396. LDA CHR_Data,x7 D# t+ o% D/ s# `" X
  397. STA $8001
    8 [+ q7 W6 e8 k  m
  398. DEX
    4 v( h, C" F! c8 {0 W" e. P
  399. BPL CHR_Set_Data
    6 b/ p& V( P% f' g; m. d0 x$ {
  400. RTS2 Y) y, ?* d3 `: s- p
  401. ;----------------------------------------
    & o( m& v' h1 F8 k+ d
  402. ;CHR图形bank数据9 ]' }6 g5 [: B8 P1 Q- E
  403. CHR_Data:/ j: D6 w$ ]3 u7 {0 e' X
  404. .BYTE $00,$00,$00,$00,$00,$00
    ) {) @9 C3 e' V/ T8 `  S) i

  405. ; h; b8 G- u2 r& f1 h
  406. ;==================================================* {4 ^* x( q1 |  r
  407. ;背景调色板设置
    1 v' b. O- I8 f4 [' {
  408. Palette_Set:
    # D( m/ {) ?6 M! F* C
  409. LDA #$3F! }. w% ^# b# t0 L* s
  410. STA $2006
    & x; J5 `8 `) a8 U
  411. LDA #$00! l, u8 ~4 x( J  o; _6 c; G4 k
  412. STA $2006, e3 t* s# w" v& }
  413. LDX #$00
    4 \+ U, d0 l/ V- c
  414. Palette_Set_Data:
    + W9 k4 D* f  k
  415. LDA Palette_Data,X  U. W2 }3 y5 o9 b; F: m5 H
  416. STA $20072 m  J0 {: o7 W6 G3 t' n
  417. INX
    7 i* I( b) B5 m8 [1 I& S0 J
  418. CPX #$20: ^5 g' t( l% @  M" N* Y7 @2 N
  419. BCC Palette_Set_Data
    ' i, b  e+ \8 v+ ^7 J( f! V* N: b
  420. RTS
    % c. R* A- s, A! V7 R8 @( _
  421. ;----------------------------------------' U) J) i- }) E1 e& u: D2 I* J1 `7 A
  422. ;背景调色板数据
    $ D8 X1 j6 l1 X* q, }
  423. Palette_Data:" K2 S% I8 v! _" r$ y% ?9 u7 V
  424. .DB $0F,$29,$24,$24,$0F,$20,$20,$20,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    - n* |) f" i: f5 k
  425. .DB $0F,$20,$26,$16,$0F,$24,$24,$24,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    5 I+ F# V: K! t% P% v

  426. * P+ P  o+ D" x1 P% G$ E. H
  427. # X2 e1 y& N( H$ W7 t4 z6 r
  428. ;==================================================( z' O) p; R6 g
  429. ;按键扫描9 u0 a7 W- ^, @. y  p- g6 e
  430. Button_Process:
    7 ~+ O  x' y7 ?8 I0 A
  431. LDX #$010 \  N6 z# ~3 i+ V; |
  432. Button_Process_Beg:
    & L! I( I5 B7 M: ~9 ?
  433. JSR Button_Scan. G3 R& @6 `; W0 p9 {+ ?& _0 C' W
  434. LDA Button_Keep,X
      e, z9 X4 _* U5 T5 y
  435. STA Button_Temp,X; E! D7 a5 w! z6 g4 T
  436. JSR Button_Scan
    8 i" C+ [* [) E. W; w; w/ A# X. d
  437. LDA Button_Keep,X
    $ D! x9 X$ D2 B0 \+ q" A& b
  438. CMP Button_Temp,X
    9 z* c/ s+ X( U2 F& m0 `" k
  439. BEQ Button_Get_Once
    : I8 e$ @0 w3 {6 b
  440. LDA Button_Buf,X1 w0 G) g+ ~5 I3 ?
  441. STA Button_Keep,X
    3 i7 K* p) C$ y/ j1 ?6 L( j
  442. Button_Get_Once:
    0 H5 S9 }8 t9 y8 v. ~# V6 O
  443. TAY; ]2 F, |( `) a
  444. EOR Button_Buf,X
    ; L8 T2 @  R" a" L. k
  445. AND Button_Keep,X
    ; r* O" ]6 j) T
  446. STA Button_Once,X1 B+ n$ A2 ^4 |
  447. STY Button_Buf,X
    0 m% h# Q" \. |
  448. DEX
    ( z$ M, G8 ^! ?7 K8 e/ {" _
  449. BPL Button_Process_Beg
    . O9 S2 R; ~% ^
  450. RTS" O5 G3 h( d7 O/ j% G# y; p
  451. ;----------------------------------------; i; z6 y+ S7 [% {. U( F
  452. Button_Scan:% w; R% d4 k; Y: r/ R3 `; X, L. Y
  453. LDA #$01
    * A% J0 w4 d+ [3 N! L
  454. STA $4016& H# q% G. d. E5 s6 S8 D2 {7 e" M
  455. LDA #$00! F9 X" P8 I$ }+ \7 Y- D/ x
  456. STA $4016
    8 L( @" j: A7 H$ F' ~( D: V3 e
  457. LDY #$08, C( b; \4 z" S- E0 i
  458. Button_Value:
    ( _( i  |9 A7 r8 X
  459. LDA $4016,X$ |4 J( }6 g3 `( F+ k6 i
  460. STA Button_Status,X, d, N) r1 C$ a3 }( Q
  461. LSR
    6 `8 V# a1 s/ h8 ]3 a
  462. ORA Button_Status,X
    5 L% G, k0 @, \
  463. LSR; x8 r. B6 o' G
  464. ROL Button_Keep,X
    # J) ~+ ^. ^! L! y' z
  465. DEY) k8 i# d9 }, M' M+ x
  466. BNE Button_Value
    ! N9 Y  K8 o8 {$ k2 p6 C" J& @
  467. RTS0 h( F7 ]4 u, T

  468. 5 z5 K2 B6 v1 o( ~0 C2 `
  469. ;==================================================
    5 i# Y% W3 Y# |: D5 L
  470. ;按键自动按压
    9 `' x* e3 [& o0 b4 z) A$ ~4 @
  471. Button_Auto_Press:
    " N' R8 j& _( y9 u  j, `* ?% {
  472. LDA Button_Keep
    - ]3 R8 G  ~3 n+ i$ M9 [/ z
  473. ORA Button_Keep + 1" U" E0 Y# g- L, `: w! A! I0 q
  474. BEQ Button_Auto_Press_End
    2 d# `: x- s/ Y, |6 J" V/ S
  475. INC Button_Auto_Delay
    ; Q0 A2 y  i2 f
  476. LDA Button_Auto_Delay
    / ]! `8 ]- b8 K" {! l; R+ v; X3 }
  477. CMP #BUTTON_DELAY_MAX
    2 @' }( L7 X1 m2 k% E7 b1 ^
  478. BCC Button_Auto_Press_No_Active
    ' _1 M) Z# m$ G/ W7 e7 g
  479. LDA Button_Keep' S; H8 K- e$ u; }& t
  480. STA Button_Once
    ) p3 E6 e9 ?+ K& @
  481. LDA Button_Keep + 1: Z+ c! @7 V, @
  482. STA Button_Once + 12 s  A% x" [- }  N
  483. LDA Button_Auto_Delay* @* b, E( ^1 N( L$ U
  484. SEC
    7 h) N% N" j6 N2 u! y1 ]5 e
  485. SBC #BUTTON_DELAY_SPEED/ s8 L9 E+ ^! X% D1 N
  486. STA Button_Auto_Delay
    9 R6 d2 N& g  t: K: @% A8 t
  487. Button_Auto_Press_No_Active:
    1 q1 V. `$ d: g4 ?4 o# s- S
  488. RTS4 r* C. d8 B6 M* x8 V
  489. ;----------------------------------------5 R, D. L9 d$ d# z
  490. ;未按压按键9 S5 \: [' r* h5 `
  491. Button_Auto_Press_End:( [( C  \9 ]' j. |
  492. LDA #$00
    / g9 y: K: I! b& i1 w, P# U/ I
  493. STA Button_Auto_Delay6 O, C+ y0 v: m3 G/ K! W
  494. RTS
    " e" C) X. h/ @; S, d* g  @
  495. # ?3 n5 r( x0 l% h' J  q
  496. ;==================================================
    # S2 m& t' l$ R: J! A- C  J
  497. ;设置PPU写入模式- D* \8 K0 J( z% E! n4 v
  498. Set_PPU_Mode:
    8 C. y' P, {9 w6 L
  499. LDX FC_PPU_Cursor9 s% S; Z; ?0 e- U
  500. STA FC_PPU_Buffer,X
    8 a  o% M9 }7 ~- P# h6 W
  501. INX
    2 r5 ]" L; @0 I9 L- N
  502. STX FC_PPU_Cursor
    9 O: i& b7 a# U8 F) k
  503. RTS+ w8 ]$ W, t2 p/ i' y6 l# N
  504. + v- @; A, m, X  W$ j! R
  505. ;==================================================( k" }0 x2 w. t! I) o
  506. ;写入单独一行文本
    8 a4 G5 V8 B* x
  507. Set_Select_Addr:. Y  w: X2 x+ |; ~+ t4 Y
  508. LDX FC_PPU_Cursor3 m( [: l. ^6 L) b
  509. LDA FC_Select_Temp
    2 N/ y4 p" z8 Z9 C- i" `- ^; x
  510. ASL
    ( @4 T& Q5 l  i2 u; x0 |( G
  511. TAY) k. l( E1 b& N' W; B0 @
  512. INY5 T( v; l! f! Q- {
  513. LDA Text_PPU_Addr,Y
    ! K& B& o+ T) Q$ U
  514. STA FC_PPU_Buffer,X" c' \# p' U+ J! ~$ o
  515. INX
    ! u( }( [, q/ Y* I: k% T6 Z$ Y7 E
  516. DEY( I- B5 y) i- a1 G2 c; ~
  517. LDA Text_PPU_Addr,Y
    % g! q9 p; n$ C) s: _. r+ h4 ~
  518. STA FC_PPU_Buffer,X
    . _, ~, Q" n2 N6 B3 f
  519. INX: m( n" c# b* W* C4 S
  520. STX FC_PPU_Cursor
    9 p) N7 C6 ^8 g  H: F
  521. RTS
      W+ l) E% v* L: S
  522. 1 K* k1 f* ~( M
  523. ;==================================================
    7 I6 x1 \+ @. a0 w  j+ i
  524. ;写入单独一行文本& }$ B- L* ^$ f
  525. Set_Select_Data:0 d5 E4 e* [0 }+ t9 r
  526. LDA FC_Select_Temp
    1 E" \+ r, T# ?: p
  527. CLC
    5 C. c  B+ }+ d( P' l" B
  528. ADC FC_Page_Cur
      r$ `9 k% y; @9 K
  529. ASL
    + o5 F% v; v6 l* y* M  H) x
  530. TAY
    ( w9 S% O" e  \# O
  531. INY
    : ?8 K, }5 H; }" B' a( I& p
  532. LDA Text_Data_Addr,Y
    ; M: X' c7 e' _9 q+ \
  533. STA FC_Data_Port_A_H# R4 s4 ~+ X$ N6 g+ ?8 U
  534. DEY
    3 s' G: j- f; \  U" r( b
  535. LDA Text_Data_Addr,Y
    * V8 [. Q9 x4 M1 x" k
  536. STA FC_Data_Port_A_L
    + V' z% a7 V* B, J6 V# P. c  F
  537. RTS% c& G0 [1 i# d; n0 `

  538. ' u& B/ z; A% n
  539. ;==================================================
    , Z8 l0 b. c5 Z. Y; _
  540. ;清除旧文本
    $ ]4 m0 p9 a2 D3 j  O6 n- m
  541. Set_Select_Data_Clean:
    2 J& l- \! V, b7 A7 q
  542. LDA FC_Select_Temp3 S! B. Y- z9 Z; v0 _# D$ |
  543. CLC6 a0 ^' c! c# {( e
  544. ADC FC_Page_Old
    # r4 R7 ?) v# w& M) p. @
  545. ASL2 `; X9 A" P7 G9 {
  546. TAY+ q9 i1 V, k% w1 j& x
  547. INY
    ; D) o9 e- E/ r8 g/ ]1 R
  548. LDA Text_Data_Addr,Y
    ' H$ L- G3 h" Y2 u
  549. STA FC_Data_Port_A_H
    7 w  E$ }7 Q& D" k+ v
  550. DEY" `3 F' C7 m* o9 P# l
  551. LDA Text_Data_Addr,Y' k1 v: u# Z$ `6 h
  552. STA FC_Data_Port_A_L
    & `: V3 C7 j9 ^4 p7 Q$ v% t- w
  553. RTS
    , f# j# Q& k- d8 W$ I. t& k: [

  554. + Z/ J  _2 I0 O: M% G
  555. ;==================================================
    6 k2 U  {* d/ Z# u
  556. ;写入单独一行文本- q' {& y4 d" ]5 \% n, ?, u1 [, \
  557. PPU_Data_Write_Item:
    , e. Q1 l. p" L- k4 h3 [
  558. LDA FC_Select_Temp
    9 `9 W! z" y9 t, h" Q
  559. CLC) u. h# x. N$ J: P5 n. x; H
  560. ADC FC_Page_Cur
    % S2 H$ a: D, Q, w
  561. CMP #FC_ITEM_SUM* q$ E5 y4 I& g$ v
  562. BEQ PPU_Data_Write_Item_Set$ s$ O- Z$ o7 C, J9 R+ C# W
  563. BCS PPU_Data_Write_Item_End9 {* m0 Y5 t4 O
  564. PPU_Data_Write_Item_Set:0 \, r" U$ g% V6 C
  565. LDA #FC_PPU_MODE_CNTL
    ( D! J% [- L  Q, C
  566. JSR Set_PPU_Mode7 o1 K- O! w5 T# X2 R" Y; j
  567. JSR Set_Select_Addr
    # F3 a4 z: {* I/ Y9 h8 P# b$ X
  568. JSR Set_Select_Data5 O8 J, ^/ A' Z+ Z. ~
  569. JSR PPU_Data_Write_Line  ?* M0 ^' d' q" y
  570. PPU_Data_Write_Item_End:$ a6 R% N3 r* }6 G% \2 X
  571. RTS  L& i) b: S8 t% \/ s
  572. / E) \. @3 f; S- |/ C7 _
  573. ;==================================================
    : X& R2 n* c1 D6 h- ^& Y
  574. ;清除单独一行文本
    % L, V+ ^8 i& i
  575. PPU_Data_Clean_Item:/ l  u6 S1 e2 I) G" S
  576. LDA FC_Select_Temp
    " p2 j3 j" \% p' y) E
  577. CLC
    / D' n3 h- Q0 Q! V# a
  578. ADC FC_Page_Old2 ~% o# }7 r4 V9 a2 E1 m9 y
  579. CMP #FC_ITEM_SUM* f) v/ _# J- f3 `1 x3 Y+ q
  580. BEQ PPU_Data_Clean_Item_Set3 m; x! F: e% A! S3 g+ `7 @7 c
  581. BCS PPU_Data_Clean_Item_End! F  n# i, e* M% a& n. p- \" h
  582. PPU_Data_Clean_Item_Set:
    ( v/ o6 l) a5 ^8 A7 I% t
  583. LDA #FC_PPU_MODE_CNTC
    . N# O  R- O0 z: b
  584. JSR Set_PPU_Mode
    : W3 L% k3 ~# O# b: T7 t
  585. JSR Set_Select_Addr" M* }! x. C! a
  586. JSR Set_Select_Data_Clean
    ( w6 w4 M( C( j0 g
  587. JSR PPU_Data_Clean_Line
    + j0 |8 q: e+ S, }6 f1 K: x4 v& z! o
  588. PPU_Data_Clean_Item_End:& ^# ^$ e! ]6 V
  589. RTS
    9 I6 Z6 G) d* ?4 X5 F
  590. 1 k  n' {$ `9 X3 Y  w) M
  591. ;==================================================
    0 B( k! j( f, I. \$ |
  592. ;页内容写入/ O" i- j8 F" r* k2 r. A: N
  593. PPU_Data_Page_Show:
    8 X: s3 L1 t/ t
  594. LDA #FC_PAGE_SIZE/ \$ M3 F( T5 Z5 Y8 x
  595. STA FC_Page_Item_Count
    + K* H, x5 {4 \4 Z2 W; A% @  x
  596. LDA #$00# T& E: n; _: U( C
  597. STA FC_Page_Item_Buffer& V) {  q* M& D9 C4 m
  598. STA FC_Select_Temp
    0 e+ D6 j8 v% M0 {( e7 F/ N! K0 N2 Y
  599. PPU_Data_Page_Item_Set:
    # z7 [# I! u# |" w! D. t* _
  600. JSR PPU_Data_Clean_Item
    % V7 A' _; k) U9 A. f# v
  601. JSR PPU_Data_Write_Item* @+ \4 s6 R2 D# F, b: W3 o, Z
  602. JSR Function_Status_Clean
    . Z3 H! w6 D, N" r( k
  603. JSR Function_Status_Show
    - y) |8 B+ N2 \" o' @4 Z" Z
  604. INC FC_Select_Temp- }( {6 i  m0 i$ I1 T* r% S0 ^
  605. INC FC_Page_Item_Buffer7 S  I( U' M( q1 X4 d4 k
  606. LDA FC_Page_Item_Buffer" e2 W6 s( b1 t/ s4 t9 v: h( v
  607. CMP #FC_PAGE_BUF_SIZE/ S. p* j! ~9 G+ n0 {) a
  608. BNE PPU_Data_Page_Item_Set_Check# ?! P# L( R2 s: D; y; m7 Q
  609. JSR NMI_Delay
    8 x* L2 l) b+ [* O
  610. LDA #$00  t- W/ o8 {: b. T6 C
  611. STA FC_Page_Item_Buffer  ]% v5 K3 ~6 }7 w* @( ~; [0 e1 n
  612. PPU_Data_Page_Item_Set_Check:
    6 t/ f% S; v. o" ^% |
  613. DEC FC_Page_Item_Count
    8 S( ^2 a& Y# {4 F5 }- q
  614. BNE PPU_Data_Page_Item_Set
    - R5 T! J* p+ w, z8 ~
  615. PPU_Data_Page_Show_End_Check:
    - U0 T' C8 ?/ d2 k) G3 v
  616. LDA FC_Page_Item_Buffer2 x4 x: `$ ?# U& O$ l) ^
  617. BEQ PPU_Data_Page_Show_End' o" B% ~. |1 @' n
  618. JSR NMI_Delay
    + o# E1 |! D  l9 S( p' q; |8 f5 P3 P
  619. PPU_Data_Page_Show_End:- N9 B0 R* \+ [; @6 C) k
  620. RTS
    % P* V) A: I' f
  621. % u3 [8 h6 G7 M
  622. ;==================================================" l( K& u! T" h( b
  623. ;PPU单行数据写入接口3 u1 e. N# \) D; J" E
  624. PPU_Data_Write_Line:
    / u/ Y( l2 L1 r+ s0 S6 j
  625. LDX FC_PPU_Cursor
    $ d' G' j- B( Q/ M0 G
  626. LDY #$001 D4 ^; j2 y% [: m9 y' `" K8 N) x
  627. LDA (FC_Data_Port_A_L),Y
    $ Q+ X% k) K/ T5 s/ q" k) }( n5 H7 O; p* |
  628. STA FC_PPU_Buffer,X2 H. t# Z( `0 ^# ?* G( G  q
  629. STA FC_PPU_Data_Cnt
    1 P$ E3 G4 t; o
  630. INX0 W4 U) [0 G, U" I1 D) X
  631. STX FC_PPU_Cursor' J1 _4 V* S  ^; k6 g& t
  632. INY5 b) B. L) b% m/ M; e
  633. PPU_Data_Write_Line_Set:, R) L" g: U- U
  634. LDA (FC_Data_Port_A_L),Y
    % v+ v7 h. ^7 J  ~0 v
  635. TAX2 P3 p) Q8 B2 R# t+ {2 {  D) l
  636. LDA Char_Rom,X
    7 D* e- ?: e. J) Q+ Q, {
  637. LDX FC_PPU_Cursor
    8 u7 X5 {$ G& c* x- g% O2 q
  638. STA FC_PPU_Buffer,X
    . F6 I2 B0 ~7 _  C8 i5 k
  639. INX: I! d3 L; S; K- @& i9 m/ V& n
  640. STX FC_PPU_Cursor
    - u$ @' y9 F" A3 H) I& v9 X
  641. INY
    5 l% B3 o# ^4 I! G. F( Z
  642. DEC FC_PPU_Data_Cnt, y3 W7 r! Y5 S. t
  643. BNE PPU_Data_Write_Line_Set
    ! d" \' {2 q% ]6 B. L/ b9 K) \
  644. STX FC_PPU_Cursor
    ( S% J' L; F* O, y( O. \$ R
  645. RTS
    6 Q( ~) v  A' N9 {9 q

  646. 5 ^+ R4 `3 c3 l- U
  647. ;==================================================6 Q% [- K3 k8 t( K/ ^0 B5 l/ k, S
  648. ;PPU单行数据清空接口5 w8 U, |4 H! J
  649. PPU_Data_Clean_Line:
    * [5 F! n. O, x( @5 b( R
  650. LDX FC_PPU_Cursor6 S) R6 Z  T2 m: t% G
  651. LDY #$00
    + X  ?6 S6 @1 }/ w* D1 `! q8 b8 K
  652. LDA (FC_Data_Port_A_L),Y
    2 [0 M/ O* ]8 |5 Z
  653. STA FC_PPU_Buffer,X
    % ?: d; ^# _8 M; N/ j
  654. INX
    5 S8 N5 h: S( ?$ T7 n( W
  655. STX FC_PPU_Cursor
    1 Q  c' X7 s, l9 U( o4 j' u& s5 s3 C
  656. RTS6 U+ W; |& @8 N9 }8 B3 u
  657. % U3 q7 e1 h4 m6 e2 j
  658. ;==================================================! k& U1 f/ |4 j* l
  659. ;更改选择项0 j2 p+ z8 U" M  Q+ }0 i
  660. Change_Select_Item:6 i/ h6 Q3 T& f& ], O
  661. Change_Previous_Page:, h" I( S0 |& u7 M  x# _
  662. LDA Button_Once
    # i4 h, v+ u8 D5 [) ^- D# R
  663. ORA Button_Once + 1
    & D$ ?& v$ a* Q' ]# [3 R/ |
  664. AND #$02# H( L, J; p- _6 @! Z5 F  x. r9 }
  665. BEQ Change_Next_Page7 X+ K! `3 _% K4 D* B+ J2 ]. g
  666. JSR Change_To_Previous_Page. W& H' ~/ t2 e5 \) `) ^
  667. Change_Next_Page:
    - A& @0 T& K3 e* L
  668. LDA Button_Once# D1 O( @" Z2 A) l
  669. ORA Button_Once + 1
    ' v& z7 C& D- M9 |/ c, v# R6 A; a
  670. AND #$01
    ; H- f5 R$ h* M
  671. BEQ Change_Previous_Item+ S" X8 u6 p+ s2 g  f3 B4 H- }
  672. JSR Change_To_Next_Page
    ; @% q# t# D+ R% c6 u& x  N! ~6 O
  673. Change_Previous_Item:
    ! H) E- n0 a% L( ?8 m
  674. LDA Button_Once
    ) x* |& h" H  ^2 }1 G5 a
  675. ORA Button_Once + 1
    # h4 o. \9 i% G% O  S
  676. AND #$08" B3 k3 y! a' |9 ^: w% I) ^# k
  677. BEQ Change_Next_Item2 |* t9 O/ ^3 K
  678. JSR Change_To_Previous_Item" D/ z4 \3 |9 {( Q( y
  679. Change_Next_Item:8 J' a' @0 i; D9 a7 J4 A+ M5 Z; V
  680. LDA Button_Once9 Y+ W. X$ V$ ]6 e
  681. ORA Button_Once + 1
    $ n3 f6 D3 U% a5 P5 o" `  S: o/ Q
  682. .IF FC_IS_DOUBLE_PLAYERS* |8 g4 q* F2 q& ^
  683. AND #$04, Y0 v3 ^2 R" v+ \
  684. .ELSE4 ]. u% ?) I8 ^( o$ K$ t* q7 t/ i
  685. AND #$249 L4 b" @! }7 e  ~2 N
  686. .ENDIF
    3 o8 J4 j: D7 I* X/ N( V( b
  687. BEQ Change_Select_Item_End
    , n. d  j( ]0 p0 L4 j' i  ~: n
  688. JSR Change_To_Next_Item
    ' F0 j! a" K7 t: E( ~
  689. Change_Select_Item_End:
    ; q0 A' [, b4 Z! ^3 B+ H: r
  690. RTS* i3 E, W( d6 G& c

  691. 5 \3 k" D' ^4 ?
  692. ;==================================================
    : H. J" S* I# A6 v
  693. ;切换到上一个选项! i! W. e/ T0 d
  694. Change_To_Previous_Item:1 G+ k8 N/ k& H) q9 U. Q* N
  695. LDA FC_Select_Index4 X3 ^: t0 s8 h7 D
  696. BNE Change_To_Previous_Item_Set7 w# a! q1 A# o( u! _+ |& ?
  697. ;----------------------------------------
    : L' w* b- ~9 M% j& O* u4 E, s; O. M
  698. ;切换到末页最后一项' \  F/ _; q0 ?9 s) P& j6 L9 P6 j
  699. Change_To_Previous_Item_Set_Last_Page:
    8 A- Q& @4 r5 u/ s# Z
  700. JSR Record_Last_Page_Index: E( G% L/ k( E- l7 `
  701. LDA #FC_ITEM_SUM
    + [' d0 g! [+ U* f1 K9 T
  702. STA FC_Select_Index" H0 V5 ~0 q( L2 B5 y
  703. LDA #FC_PAGE_MAX4 `2 t, A& x2 C
  704. STA FC_Page_Cur
    3 b, ]! K" E+ R. |; {1 Q5 c2 t
  705. JSR Update_Page_Content* L4 \& i5 }/ v, D
  706. RTS/ N7 c/ V+ _# o# f. H( ]
  707. ;----------------------------------------2 L4 N: m- y, W- W* f% O& q& X
  708. ;切换到上一个
    , c0 i5 {! h3 G" F; b
  709. Change_To_Previous_Item_Set:
      @! Q/ a8 m: O
  710. ;检查是否需要换页
    9 z4 y1 |% W% a$ \$ J+ k5 G
  711. LDA FC_Select_Index' ]) r2 h. j5 F
  712. CMP FC_Page_Cur
    2 j1 D* N* E: c1 O! y7 w
  713. BNE Change_To_Previous_Item_Set_No_Page
    / h* d0 e9 B& d, F* ^- b
  714. ;----------------------------------------# s2 \7 e% I- M) A: j  x0 W$ |
  715. ;切换到上一个(需换页)
    % W2 y# ~, X' ~' g+ B
  716. Change_To_Previous_Item_Set_Page:
    6 R! g0 `5 x  Z
  717. JSR Record_Last_Page_Index* {! q; |$ R+ z; u0 r
  718. LDA FC_Page_Cur/ y1 s: T2 I7 L$ }+ v6 S, d7 W
  719. SEC% U& N6 l) m$ \5 s8 [0 W/ o
  720. SBC #FC_PAGE_SIZE7 s* Z$ f* \8 E# i5 h
  721. STA FC_Page_Cur8 @6 E& c/ k0 I
  722. DEC FC_Select_Index
    " G/ v! h% G* w3 S  f) Q
  723. JSR Update_Page_Content
    * {$ E8 l9 F+ H% c+ e8 a' K% Y
  724. RTS- u; Y; D& Z! w0 i' l. N; i
  725. ;----------------------------------------. I' t- w8 C! H  L( l  j
  726. ;切换到上一个(无换页)
    5 e7 i( @& y( @; o
  727. Change_To_Previous_Item_Set_No_Page:: K2 S# }4 c7 u: v. V# i9 h6 @
  728. DEC FC_Select_Index  P0 \! z( a4 h% J
  729. RTS& b& G& `' }7 ~* ^! d
  730. & n( f1 u; a1 L# v6 m4 ^
  731. ;==================================================4 b# O( ?0 N8 P0 f  t
  732. ;切换到下一个选项) q' a/ }! z5 l; u8 a# Q
  733. Change_To_Next_Item:
    ; ?! J2 q1 ?. O, D/ t
  734. LDA FC_Select_Index
    ) B! F' Q' f7 e# o/ t3 z$ B
  735. CMP #FC_ITEM_SUM) I) D; i' n+ b- S  O+ K* Y" m
  736. BNE Change_To_Next_Item_Set
    3 O! s- y% _+ E9 N- @
  737. ;----------------------------------------
    ( w0 G0 r. l2 s8 L0 l
  738. ;切换到起始页第一个
    0 H8 D9 u& w# L) u7 E
  739. Change_To_Next_Item_Set_Begin_Page:' T9 a% I6 ?( O* i5 @; c# T/ s+ D
  740. JSR Record_Last_Page_Index! e' r( @9 |6 N* S- y
  741. LDA #$00, x# O# f& v* F. _$ M0 [  r
  742. STA FC_Select_Index
    ) u' J" e9 H' g! m8 K* {0 ?4 L
  743. STA FC_Page_Cur
    : W1 O$ n9 Y( _" E* ?0 S2 z2 Q$ v# A
  744. JSR Update_Page_Content
    0 H" o1 C1 b" i) {9 O! F
  745. RTS
    # n7 C: b- g$ k5 x% t
  746. ;----------------------------------------0 N$ v9 k% k, d% R! J+ i! j& Q2 L8 s) l
  747. ;切换到下一个$ j0 }2 Z# J4 M! @2 V
  748. Change_To_Next_Item_Set:
    % Q5 `/ k/ Z) M3 [" m. w' O
  749. INC FC_Select_Index8 l. n5 E% R# q  v8 S9 [
  750. LDA FC_Page_Cur4 t6 M1 h4 x/ B8 m
  751. CLC
    6 d% C; i1 h, Q& w& t4 m, |
  752. ADC #FC_PAGE_SIZE
    ) q( }6 I/ F4 }$ F4 M
  753. CMP FC_Select_Index
    8 W+ K4 ^/ k1 e8 h
  754. BNE Change_To_Next_Item_Set_End
    7 X7 u( e3 o7 b) n+ Z( Z" Y# j2 I
  755. ;----------------------------------------
    % Q9 q9 t; }! L) c
  756. ;切换到下一个(需换页): V/ m5 F; n+ Y: _6 d- s
  757. Change_To_Next_Item_Set_Page, p8 J& R, |. v
  758. JSR Record_Last_Page_Index
    ' s0 Z: X# q% F% S0 \; P  e2 f
  759. LDA FC_Page_Cur
    ; y( D9 h1 D* y- g! w2 U" n
  760. CLC
      ]6 R- C" C# ?1 C+ e# D2 S
  761. ADC #FC_PAGE_SIZE
    8 B; B6 u6 U, p/ R* z* d
  762. STA FC_Page_Cur* Z% T) F! \% h2 ]* ?( X
  763. JSR Update_Page_Content
    3 K! S, v* n) z0 a5 m
  764. Change_To_Next_Item_Set_End:/ B) p& e/ |) [
  765. RTS. h3 _) ?1 f# I+ A1 r0 V5 F5 Y9 q
  766. $ _) d( O3 K. B
  767. ;==================================================( a! J1 a5 k, o( C) C
  768. ;切换到上一页
    . _. [: |) [/ g  v0 l& w
  769. Change_To_Previous_Page:2 [3 n9 F% K/ ^8 {) [) u# `
  770. LDA FC_Page_Cur4 ^/ k  u3 O2 L/ r# |* @) T8 K3 y
  771. BEQ Change_To_Previous_Page_Set_Last_Page  A" W/ O9 w0 c* ^% y4 t
  772. JSR Record_Last_Page_Index
    3 r5 X1 b. J& d4 j* Z% f% T
  773. LDA FC_Page_Cur3 ?$ W4 P. O1 \
  774. SEC( S0 T5 I+ l+ O# _) U
  775. SBC #FC_PAGE_SIZE
    . H. m& G. v' T6 Z" ~; L
  776. STA FC_Page_Cur
    . v+ t3 F6 k: |  B
  777. LDA FC_Select_Index$ {& y" ~! x  i8 q7 ~* E& l  j" b
  778. SEC8 \4 G1 G8 V; \/ c
  779. SBC #FC_PAGE_SIZE
    ' y, q9 B/ D% l! l( _7 ^
  780. STA FC_Select_Index
    + O: S2 z% a# o& Q% |
  781. JSR Update_Page_Content
    / J# H) M# z9 c& L9 C
  782. Change_Select_Last_Page_End:4 G5 t' _* J) Z7 a
  783. RTS
    5 s% `# S) h1 Q
  784. ;----------------------------------------# c. P# u, _3 q, X) j8 h6 {
  785. ;切换到最后一页
    7 R( ^- v* h! _" a+ `2 A; ^" T
  786. Change_To_Previous_Page_Set_Last_Page:+ J7 \  h) e. ?- U; v1 ~5 }9 C- T" C
  787. LDA #FC_PAGE_MAX
    8 m$ I1 ~+ ^6 F8 Y  c8 o8 [  M
  788. BEQ Change_To_Previous_Page_Set_Begin_Item: Q& Y0 m% R& y# s+ C
  789. JSR Record_Last_Page_Index. {# V! }/ o+ u( ^* ~
  790. LDA FC_Select_Index3 C: r" O1 L9 d3 Q' `$ S. m
  791. SEC
    6 H5 R! z  X1 i, x: M  J3 p( q
  792. SBC FC_Page_Cur2 B+ Y+ f( j& O# H8 ?5 }
  793. CLC
      Z8 Q, U' ~7 F% s, a9 p
  794. ADC #FC_PAGE_MAX
    9 F; G! K# h+ u3 f
  795. STA FC_Select_Index
    ! F( L" i; R* x8 B
  796. LDA #FC_PAGE_MAX2 n" ]) {% j( N0 P- ~
  797. STA FC_Page_Cur
    3 Q9 a% o- ?& B+ _! a
  798. LDA FC_Select_Index# x; l+ X  E, F- e+ y; n
  799. CMP #FC_ITEM_SUM( v2 C; `" m, v9 c. r' ]
  800. BCC Change_To_Previous_Page_Set_Last_Page_End- F3 `. C" c# N
  801. ;----------------------------------------4 p: s0 {0 @0 Y, S& |
  802. ;切换到最后一项
      n) e4 m3 e2 B7 f
  803. Change_To_Previous_Page_Set_Last_Item) G+ f, B. W' H4 V  ]6 p4 o+ l9 u. g* N
  804. LDA #FC_ITEM_SUM
    6 W, j( U- C2 e% _/ L3 x0 F: O; u
  805. STA FC_Select_Index6 ~6 q0 a/ q  @( q  f7 T
  806. Change_To_Previous_Page_Set_Last_Page_End:3 {+ h9 Y3 F4 t, d- b5 B- ]6 b
  807. JSR Update_Page_Content
    6 v& Y9 n1 l4 z) R
  808. RTS
    5 b6 h- r0 I, o
  809. ;----------------------------------------) m- H- a3 {* q, S& U
  810. ;切换到起始项(最大页只有一页时)
    " d+ b  C, W: O0 E; k9 ~; Y
  811. Change_To_Previous_Page_Set_Begin_Item:
    ) U# \9 ?! f+ P  ]" p. r
  812. LDA #$00
    / U+ h5 }" {! B9 g3 e; @
  813. STA FC_Select_Index+ V' s6 g# j9 C' S- a! ^# R
  814. RTS) v* C0 ]9 o* |& f! Z! B

  815. 7 ~, E7 A: y: N6 o1 V- j' w
  816. ;==================================================+ h2 ]" d4 M3 P8 {* @0 ?1 y
  817. ;切换到下一页( h+ L* h9 u- _/ ?) E
  818. Change_To_Next_Page:
    # a) b) ?" k. ?) Q' b& h7 E5 @
  819. LDA #FC_PAGE_MAX
    $ \5 r9 w0 t; `1 {& Q3 N  G
  820. BEQ Change_To_Next_Page_Set_Last_Item
    ' i' G8 J, `" _3 `
  821. LDA FC_Page_Cur
    : _: u1 y6 n$ Q
  822. CMP #FC_PAGE_MAX5 J; E  L1 E  i) x% g4 V) U
  823. BEQ Change_To_Next_Page_Set_Begin_Page  C  h! Y& L# m
  824. ;----------------------------------------
    / U8 h8 C) ?# v4 h& {, L4 K
  825. ;切换到下一页
    9 b) m3 z- k/ Y+ J' E# X- \
  826. Change_To_Next_Page_Set:/ W% N: B5 Q# f4 }& Z
  827. JSR Record_Last_Page_Index
    6 k) X1 e# M& i- i
  828. LDA FC_Page_Cur
    1 j* _' U, S+ ]9 k' X0 N5 P
  829. CLC% v! m7 U, ?* E! C% J3 b: |
  830. ADC #FC_PAGE_SIZE
    6 {% Y8 I- n% _8 F' y; K
  831. STA FC_Page_Cur
    & f5 g- V* m8 b  J" m$ f
  832. LDA FC_Select_Index
    ( V: t6 A! K1 s7 O3 l
  833. CLC
    . r) a4 k, m/ f, {
  834. ADC #FC_PAGE_SIZE3 @5 j# n6 \7 d4 t5 d' K0 F! L
  835. STA FC_Select_Index+ C# x7 t5 D3 @4 c
  836. LDA FC_Select_Index4 q3 J0 @( J6 t1 E# O
  837. CMP #FC_ITEM_SUM
    1 _  h% a1 w3 |; ?) d' i
  838. BCC Change_To_Next_Page_Set_End. }3 \2 U& f' N% o2 c9 M
  839. ;----------------------------------------+ r) Y; V2 M. H+ D" Y& F- }
  840. ;切换到最后一项" h/ H6 k- ?) a! Y# j
  841. LDA #FC_ITEM_SUM  g5 H$ s0 X  T5 k8 G9 i
  842. STA FC_Select_Index
    % ]! j1 ]9 C3 H' x
  843. Change_To_Next_Page_Set_End:6 O* a- B5 C, ?3 o
  844. JSR Update_Page_Content5 X3 {( f) ~2 Y: a
  845. RTS: Z( {" L& ]6 B# _; `) ]4 p  |+ L
  846. ;----------------------------------------
    3 `3 D' H( V5 U' q  b
  847. ;切换到起始页% ~  l2 |+ ?% L1 I
  848. Change_To_Next_Page_Set_Begin_Page:& D/ Z6 A6 T& s4 {4 D' Q0 T
  849. JSR Record_Last_Page_Index0 q' Z# v% c2 h
  850. LDA FC_Select_Index
    9 P8 I$ |$ }9 B- A; }5 k5 d. z
  851. SEC
    : y) m" f6 g5 M; r; q
  852. SBC FC_Page_Cur. v. c8 O5 J. y7 E  z
  853. STA FC_Select_Index' e  L9 i# t. p  f! P7 ~9 s1 V
  854. LDA #$00
      ~& Q  y; E- Z, U! m
  855. STA FC_Page_Cur
    + ^; g+ {  i7 ^# r: x
  856. JSR Update_Page_Content
    % L0 E# H* r6 x" H
  857. RTS
    % C8 {% ~' w* o, ?* z
  858. ;----------------------------------------+ X, S  P8 M& j
  859. ;切换到最后一项(最大页只有一页时)
    ! V: _/ g3 B+ Z- }5 J! R
  860. Change_To_Next_Page_Set_Last_Item:
    " B) W7 J# L6 G6 O; x* V
  861. LDA #FC_ITEM_SUM
    & q" ?, d5 ?6 _% E4 V3 R
  862. STA FC_Select_Index
    , V" M  U, ?: ]
  863. JSR Update_Page_Content
    ( j& O3 }1 j. @7 `0 \9 k- w0 Y
  864. RTS
    % y: i8 \! Y2 _( {  a/ [$ f
  865.   h. J6 \6 v6 E) n
  866. ;==================================================5 {7 u2 r9 a5 L" j0 B
  867. ;更新页面内容
    , S* l& w1 b; k1 z
  868. Update_Page_Content:; A# c/ m) v/ [. O; P4 J8 `
  869. LDA FC_Page_Cur" d$ l# c" x9 ~' O9 c
  870. CMP FC_Page_Old
    5 o9 I( f- q' |4 \6 r( B
  871. BEQ Change_Update_Page_End  A2 j8 _: |: H2 |
  872. JSR PPU_Data_Page_Show& N: D1 z. z( K; ]
  873. Change_Update_Page_End:
    $ f3 t1 \- u" p& o
  874. RTS
    $ X# N0 g- Z) C9 g: ^2 y

  875. 7 @; [6 ~! F% I7 e# _: i7 R( K1 Y
  876. ;==================================================& k& f% w: S6 @$ E
  877. ;记录上次页索引
    7 c7 K& h$ Q: f5 j5 p; q! d8 `
  878. Record_Last_Page_Index
    . ^) g  K3 V4 Z0 n: g5 R
  879. LDA FC_Page_Cur  w: t" o- }. Y' n& Q
  880. STA FC_Page_Old
    4 [9 O& l& I8 F
  881. RTS
    % g- _# v* K9 I$ l
  882. * M: }: m5 Z! k% R# \+ ~, }$ I
  883. ;==================================================; C9 u; o1 L6 r- a$ m* X  B
  884. ;显示当前选择项光标
    1 a1 n7 N7 u  v+ N/ x
  885. Show_Select_Cursor:
    4 ]+ C7 n1 P# K4 {- ~
  886. LDA FC_Select_Index
    2 `" d% n: C) z, e( q5 H, [
  887. SEC7 G( j6 O. K' m9 _& y, L
  888. SBC FC_Page_Cur# m( ^) G' i/ s" {
  889. ASL
    % n8 N; [9 B2 p$ }/ N* I
  890. TAY
    + E+ D% X8 s; T4 m7 L8 j
  891. INY, _; @0 O/ i3 c# u/ b4 O; m' ~7 Y
  892. LDA Text_PPU_Addr,Y
    * ?5 E, y. J& P$ Q; v# n! w
  893. AND #$03
    , w; {9 X+ o* x' x6 s# @( Z
  894. STA FC_Cursor_Addr_H
    ( }2 n$ S- h1 \3 n* o$ U
  895. INX
    ' o5 @3 d( ?* w& u; e7 n7 b
  896. DEY6 P' q+ k' w( v$ q9 `' T
  897. LDA Text_PPU_Addr,Y1 G: e8 K* G; l% U! G' n$ x- \
  898. STA FC_Cursor_Addr_L
    0 v& F! z; T1 T
  899. ;----------------------------------------& |0 ^; X; @- T! u5 |" X8 T1 A  n
  900. ;计算光标X坐标
    * T. {6 n! i$ N. z
  901. Show_Select_Cursor_Set_X:
    6 s) K  g- G5 l* W: l
  902. LDA FC_Cursor_Addr_L1 J9 R7 a8 I4 }- R/ S" G
  903. AND #$1F5 H' u- G: D; ~5 s" ~0 O7 I
  904. ASL( [+ [- X+ d: L/ ~1 @5 g. W- v1 T
  905. ASL
    4 f$ f/ e$ f, ^; W
  906. ASL" G' T0 ?" G% G1 n5 g4 `
  907. STA FC_Cursor_X5 B" f* E3 c9 s+ n+ s
  908. LDA FC_Cursor_Addr_L  Z( k7 F: N0 y  {- k! `
  909. AND #$E0
    $ r9 A/ |( W* |9 p/ ]
  910. STA FC_Cursor_Addr_L  k' F. h8 g3 ~( \8 b7 d4 z
  911. ;----------------------------------------
    , `8 y. T9 r* M
  912. ;计算光标Y坐标# K+ ~% H, J) p7 h4 @
  913. Show_Select_Cursor_Set_Y:
    : u) u7 M, W2 e1 r7 P
  914. LDX #$05' {: n3 w8 ^9 C) w# ?
  915. ROR FC_Cursor_Addr_H" y. }3 I! |- S0 o" |5 D9 C
  916. ROR FC_Cursor_Addr_L
    % O7 ?  D: D, O& j: S
  917. ROR FC_Cursor_Addr_H9 _# W" ^5 q# H  T
  918. ROR FC_Cursor_Addr_L
    . B3 d9 e! [' ?% r! f  f
  919. LDA FC_Cursor_Addr_L+ I  O; H$ {! Z# B% Q3 f6 v
  920. STA FC_Cursor_Y6 k- c2 H* E$ W: a- n2 G
  921. ;----------------------------------------2 d' t( x. _) j* i3 |2 }: C# r8 G; F
  922. ;写入光标) _. v* Z3 P- c3 ]
  923. Show_Select_Cursor_Set:. v7 J9 M7 p# v9 {7 {
  924. LDA #$00
    / Y/ n2 U# X2 r0 K5 v! h4 H
  925. STA $20031 y* ^1 p$ q8 S% a2 H
  926. LDA FC_Cursor_Y
    9 C9 {0 |" ~6 p0 I
  927. SEC1 v5 ^; [6 q, q8 N. Y
  928. SBC #FC_CURSOR_OFFSET_Y
    3 |$ D7 r2 H- n! k  W
  929. STA $2004
    0 Y# o% M3 y) Y. `$ w' g
  930. LDA #FC_CURSOR_TILE4 X! d3 H* Z% P6 A$ B
  931. STA $2004
    ! w/ d) j# J% I" r$ ]5 M
  932. LDA #$00  T5 M0 Q( i4 z- _
  933. STA $20046 X5 j  Q& j# [5 y) h% ?
  934. LDA FC_Cursor_X' F- A/ Q8 _- \( `" D
  935. SEC
    8 |* c7 _& J) `$ W: b" W8 o, c9 y
  936. SBC #FC_CURSOR_OFFSET_X  V; E0 z; a% y
  937. STA $2004. |" g' N* ?1 n5 m' d8 t9 a. F8 M- v
  938. RTS2 W7 m+ p0 i% c7 y: b

  939. , q0 i9 s1 [4 J& L. H
  940. ;==================================================% y/ h4 ~' x8 i
  941. ;切换功能
    # c, h2 v% S: \& |* T* y
  942. Change_Function:% F7 y' u/ j" e. s/ x% m  D
  943. ;----------------------------------------
    . }# c/ F9 Q1 H
  944. ;开启功能A& M# [" W* @5 N* j
  945. Change_Function_On_A:- n8 t, _8 d" N1 n( P5 F; L
  946. LDA Button_Once
    6 L, U' g4 l6 m4 }
  947. CMP #$40
    4 b$ I* E$ p* a& [1 ^
  948. BNE Change_Function_On_B5 M, D" g3 [4 h$ i" o
  949. JSR Change_Function_To_On_A
    1 T3 p9 h$ f/ J+ K) U
  950. JSR Function_Status_Update2 T/ Q# {/ n( d: ]' E( j# |* ^9 q
  951. ;----------------------------------------' y& A. f5 |! C* B. O# S3 ~* G
  952. ;关闭功能B
    4 i3 u) X- \2 n) I0 P# s" n* {
  953. Change_Function_On_B:( g+ ?$ R& o; ]" I9 [/ z+ L% @
  954. .IF FC_IS_DOUBLE_PLAYERS
    " ~6 F2 Z: t" a7 v, D* x' ^
  955. LDA Button_Once + 1
    - J+ P( ]) X) s1 G, W3 v( j; f2 N
  956. CMP #$40
    . a7 b3 |5 `# O4 F5 {
  957. BNE Change_Function_Off_A' ^; D4 h$ A$ v/ F
  958. JSR Change_Function_To_On_B
    - ]) d; c7 g/ k2 i
  959. JSR Function_Status_Update
    ; V; r. M" g3 l7 ?6 O% I
  960. .ENDIF( O/ `9 C2 G% c3 J4 q' j+ _' k/ S
  961. ;----------------------------------------1 ]" z* G9 Y  t
  962. ;关闭功能A0 u0 ?9 I# N5 S% ~7 G5 d0 Y( }& t! }
  963. Change_Function_Off_A:
    , N# x) k) ^. B5 f3 w
  964. LDA Button_Once: w+ W: \8 y, v% U8 a( ~6 D
  965. CMP #$80
    / q) R( b0 z. z: v& C
  966. BNE Change_Function_Off_B7 \! p5 j3 U1 ~8 j1 J3 j" \
  967. JSR Change_Function_To_Off_A* A, f& j% s+ ]$ f+ n
  968. JSR Function_Status_Update
    2 ]2 B! W* g- s5 f+ V( ~5 l1 ~
  969. ;----------------------------------------2 Z0 n( ]. O5 q' T- t. m
  970. ;关闭功能B# k$ j) `; G0 f9 f7 [. C0 b$ O
  971. Change_Function_Off_B:
    6 Q$ B% F! r2 r- k
  972. .IF FC_IS_DOUBLE_PLAYERS8 N- T& p* h  q& Q# s" ~" Z, S
  973. LDA Button_Once + 12 S9 {( f1 ]+ s
  974. CMP #$80
    1 w& x1 \) |+ U7 N; F
  975. BNE Change_Function_Swap
    $ d$ i& t( P' w- ]6 w6 X2 C
  976. JSR Change_Function_To_Off_B
    0 Q7 H  H. K6 y# R( U7 j
  977. JSR Function_Status_Update
    1 o; ^9 s! p# z8 {6 `* R8 G5 w
  978. .ENDIF
    / q  ~4 A5 r; D' ?8 t6 r4 S. H
  979. ;==================================================
    # i3 u6 I) B+ g3 K" e4 f$ P
  980. ;交换开关
      S/ w" i: {0 @6 Z; J$ J
  981. Change_Function_Swap:+ O; a$ O1 x. V2 t
  982. .IF FC_IS_DOUBLE_PLAYERS9 y# @0 l& B' b* m- Q! T( o: q
  983. LDA Button_Once
    . Z% a( e) e+ C- E# `# A, E
  984. ORA Button_Once + 18 }6 a  f' [( i: o
  985. CMP #$203 p4 C0 j' p( V' ]& u) A# g
  986. BNE Change_Function_End
    : k2 x, [: H- {1 `  w* Q% p  [
  987. JSR Change_Function_To_Swap
    % a# l& n$ `  T+ z  T# |6 D
  988. JSR Function_Status_Update
    ' M" Q6 k6 C, |* Y/ ]- }
  989. .ENDIF- ^6 p3 {' m8 `) `
  990. Change_Function_End:
    * j0 x+ `7 Q: d+ ^/ q( ^; C
  991. RTS$ w  p# @8 K! [' o
  992. % U* o$ K. a; I" A# }
  993. ;==================================================' J/ w; Q2 Q" X
  994. ;交换开关状态' ?, ?- L* n/ i7 x
  995. Change_Function_To_Swap:
    % t& d8 W2 c2 l$ ~! G7 }9 i  C
  996. .IF FC_IS_DOUBLE_PLAYERS
    & z5 A6 [: a8 N; f
  997. LDA FC_Select_Index
    " F. `  N2 U- I
  998. SEC
    ' p) N& L0 t# y# E3 d& J
  999. SBC FC_Page_Cur
    5 T& s' ]0 U6 l+ A, j) H
  1000. STA FC_Select_Temp
    ( e& g$ ~5 V. Z% w6 g
  1001. JSR Set_Function_Port
    ' R5 ?' b/ B0 ?% |, n
  1002. LDY #$004 @) Q  X, j4 J5 z1 x
  1003. LDX FC_Select_Index
    0 Y4 m+ D2 J6 C- n- H1 ?1 P6 `
  1004. LDA (FC_Data_Port_A_L),Y* u' X% G" u4 z8 z
  1005. EOR (FC_Data_Port_B_L),Y
    9 e. }% ^+ q$ x5 E9 v8 X- t6 }2 t
  1006. AND Function_Check,X9 u, l/ p- c2 v- q( L: ?' m2 ~1 G# ]
  1007. BEQ Change_Function_To_Swap_End. P) }) S6 k. C5 m
  1008. LDA (FC_Data_Port_A_L),Y
    ; m( |4 P+ K/ u) s
  1009. EOR Function_Check,X
    , [, T$ J6 f2 y# x7 M9 v
  1010. STA (FC_Data_Port_A_L),Y$ s3 A1 A* \; {4 B4 X
  1011. LDA (FC_Data_Port_B_L),Y
    # q3 o* n) f+ U6 a  V$ x
  1012. EOR Function_Check,X6 T1 n9 c( ^3 V& ]7 M% G* Z
  1013. STA (FC_Data_Port_B_L),Y5 o$ [6 X, K9 d- m% J
  1014. Change_Function_To_Swap_End:4 I  D2 E% N7 W! n4 u+ f$ B
  1015. RTS0 q: E& B. h$ E: X3 y4 h* N% i; W
  1016. .ENDIF
    ( o$ V: f  H) O

  1017. ; l; [" s, a2 Y9 g6 I, j

  1018. / {) j* W: t& O* e6 K" Q
  1019. ;==================================================6 D( ^% U- o5 t( X4 ^
  1020. ;更新功能状态1 Q" {7 D9 S/ ~3 ~: u  Y
  1021. Function_Status_Update:
    , F5 W. L$ a. m6 ?& A3 F0 |- {& q! Y
  1022. LDA FC_Select_Index. m. [9 `  W* f; L' Q" n; @: u  ]
  1023. SEC" J) K* D# l4 i9 [: r2 H9 `
  1024. SBC FC_Page_Cur
    # G. B3 h  |; t0 O
  1025. STA FC_Select_Temp- _7 v. f  {5 V6 L1 H! b, y
  1026. JSR Function_Status_Show2 g- L4 w- `1 i( W
  1027. RTS* |) E3 F4 N* x% ?8 _0 \- o, S
  1028. % p7 I% M4 Q6 ?2 N
  1029. ;==================================================( t2 q; i" B/ D
  1030. ;设置功能地址端口
    6 m4 j4 a2 w: P
  1031. Set_Function_Port:* D1 V( E5 X7 A5 T# v& O4 U, x" j9 E2 @
  1032. LDA FC_Select_Temp
    ' X4 X* y$ t- @1 P
  1033. CLC
    " R5 k8 ]/ a, f3 A# w. h6 F4 y, g
  1034. ADC FC_Page_Cur
    & l/ h1 @% Y2 \; `0 S$ a
  1035. ASL# C7 U6 |* K; Y) j% C( j& Y/ z
  1036. TAY
    2 D- [5 m/ g3 y% J
  1037. INY# Q8 Q. h4 J/ ~
  1038. LDA Function_Addr_A,Y
    1 c+ d* h* }) u7 t* d, e' K
  1039. STA FC_Data_Port_A_H/ |1 k% D7 S% M- q- t2 I, J
  1040. .IF FC_IS_DOUBLE_PLAYERS
    $ Q6 g) j9 t2 ^; _" a& B
  1041. LDA Function_Addr_B,Y4 X) F! ?  u5 Z$ A
  1042. STA FC_Data_Port_B_H
    / y0 D' g' s6 ^* O
  1043. .ENDIF
    - Y" j, e$ p3 H7 R
  1044. DEY
    ( v7 q$ d/ {; t! |
  1045. LDA Function_Addr_A,Y+ k1 ^% q! O' a% P; W
  1046. STA FC_Data_Port_A_L
    , g2 T8 ]& S8 k$ m3 E1 V, X
  1047. .IF FC_IS_DOUBLE_PLAYERS
    - F% P% d; d7 G. a9 g8 A& C5 G
  1048. LDA Function_Addr_B,Y
    ' E/ e$ t( h; o
  1049. STA FC_Data_Port_B_L' z$ \# [6 p( F& q5 b6 F
  1050. .ENDIF
    ' u9 L$ z" a0 `6 b
  1051. RTS, Q9 j3 h: p  M' c: m

  1052. * V* b( ^  P3 g) x% _
  1053. ;==================================================
    5 H+ e0 S& m" y! k8 l/ v" u, T
  1054. ;设置功能临时索引
    ; o# E1 c4 ~( l$ u! @' `/ K( d
  1055. Set_Function_Temp_Index:5 J# \! |9 ~+ c: x  f
  1056. LDA FC_Select_Index9 R7 b7 g! u6 z5 j2 N8 c
  1057. SEC
    % E4 |$ Q, y% Q, J  p
  1058. SBC FC_Page_Cur/ V, a. I+ _9 }. D9 t& i
  1059. STA FC_Select_Temp
    + Z1 [/ Y5 g2 |- B- j1 i9 v
  1060. RTS% z2 @7 }% W7 c4 l* J

  1061. & s1 T+ z; Y- k: {, E  N5 V
  1062. ;==================================================
    $ Z& z( o1 K7 o& ?) G5 D" A
  1063. ;开启功能A3 n7 [' m& o' U6 O
  1064. Change_Function_To_On_A:7 e: z9 b/ X# t" J: ]) w
  1065. JSR Set_Function_Temp_Index. s" K9 u5 Y6 e
  1066. JSR Set_Function_Port
    3 T, t8 ^8 h+ c7 c- W
  1067. LDX FC_Select_Index
    0 J) E3 _! x2 f2 i
  1068. LDY #$00
    7 g% _% n2 x' E
  1069. LDA (FC_Data_Port_A_L),Y
    % i7 R$ }* I! c: }9 E& j
  1070. ORA Function_Check,X: _8 N! I$ d' j* n3 a; k4 N" x, ~' {' e
  1071. STA (FC_Data_Port_A_L),Y
    8 X0 N4 `+ ^1 O+ j) g
  1072. RTS
    ) g1 i: _, T. B. z6 R; F7 G
  1073. ;----------------------------------------" Y! t7 H4 P2 p) ]: H/ t3 l* j* O
  1074. ;开启功能B: t/ Q7 d7 }; A* \* R, A4 A9 b
  1075. .IF FC_IS_DOUBLE_PLAYERS
    . l0 O+ x: P; P* i6 n' ?) J& z
  1076. Change_Function_To_On_B:
    / H9 u; h9 {* e$ l
  1077. JSR Set_Function_Temp_Index3 V# f( t0 d( |3 v$ }
  1078. JSR Set_Function_Port
    , r* `, _4 h1 c, a$ a7 H
  1079. LDX FC_Select_Index
    : @6 t8 s* z# D% m1 S4 W0 j/ R, |% ?2 ^
  1080. LDY #$00
    $ u# \" S# P  Z
  1081. LDA (FC_Data_Port_B_L),Y5 W  Z' o3 W; s3 q
  1082. ORA Function_Check,X+ u1 h- c% B& w1 R* T
  1083. STA (FC_Data_Port_B_L),Y
    . g) I8 b! P1 a& I7 }
  1084. RTS* Y& ]; w% B5 h8 K2 _) u/ N
  1085. .ENDIF
    ' f: d' ^! H6 g2 h8 q5 n
  1086. ;----------------------------------------
    ' q" R% p3 U2 J/ O& u) T
  1087. ;关闭功能A7 \% _- p% C' C" q9 c( q
  1088. Change_Function_To_Off_A:
    9 A* {; J$ d' {% E
  1089. JSR Set_Function_Temp_Index2 ]% {' w  `5 l' a
  1090. JSR Set_Function_Port8 _0 s9 _# o3 T" x- i
  1091. LDX FC_Select_Index+ ?# D' A5 D" x$ A8 r8 s- A
  1092. LDY #$00
    8 W$ a1 H6 K6 J( N* J3 s
  1093. LDA Function_Check,X5 ~/ J% I2 n) C4 @  E* p6 E2 ^
  1094. EOR #$FF
    7 j) h9 `- x* }7 C! K
  1095. AND (FC_Data_Port_A_L),Y, D/ L7 D; Z$ U9 |; L6 Y  _
  1096. STA (FC_Data_Port_A_L),Y
    9 ?" i' y0 P3 p* z+ n
  1097. RTS
    7 @6 v7 w4 m0 W& V( I
  1098. ;----------------------------------------
    3 Y7 c- X  B' M
  1099. ;关闭功能B
    % U! s: ^6 \, C* p, L
  1100. .IF FC_IS_DOUBLE_PLAYERS, W1 X4 L, F" p( V# l
  1101. Change_Function_To_Off_B:9 h3 f9 c. E) T
  1102. JSR Set_Function_Temp_Index
    ' ^' a- a, H0 T
  1103. JSR Set_Function_Port
    ; Y; L& U: ]: W* ?3 S# n& e
  1104. LDX FC_Select_Index
    8 ~9 j% \( _3 @
  1105. LDY #$000 }' ^: ~1 @; M) I
  1106. LDA Function_Check,X  z# y8 N2 Q0 _2 h
  1107. EOR #$FF
    # i+ J2 O* P' v6 [5 @$ Q8 c/ D
  1108. AND (FC_Data_Port_B_L),Y# k/ x: w3 r7 o3 Y& ~. ?. s
  1109. STA (FC_Data_Port_B_L),Y
    # k; ^: ~, u4 v# C: H
  1110. RTS, M; |* h! @: ^* j
  1111. .ENDIF. K5 \8 O" K- B% h% d7 R

  1112. * ~1 c4 h1 w, l* U
  1113. ;==================================================) }0 ^: {. d2 \7 X/ \
  1114. ;设置功能状态PPU地址5 E: i  g7 Q8 |& U" K
  1115. Set_Function_Status_Addr:3 p! E& ~7 Z9 m$ W1 ~( x/ ~
  1116. LDX FC_PPU_Cursor
    : ~+ c8 s& H" T% g3 z- m
  1117. LDA FC_Select_Temp
    0 J) ~! V9 U3 [
  1118. ASL2 |+ T& @! M. ?' }5 t0 `" V# p, W
  1119. TAY
    . V: n3 Q: Q$ Y/ O4 V. ?$ l/ d2 M/ [
  1120. INY
    * v- U/ }. s( l
  1121. LDA Text_PPU_Addr,Y
    " j. n( {7 s. m- {( R4 `
  1122. STA FC_PPU_Buffer,X
    3 [2 ]& i% O6 z' O4 x0 g; G
  1123. INX% I* [! ]. ^& N5 E( V
  1124. DEY# u' G3 `3 j6 w+ f
  1125. LDA Text_PPU_Addr,Y
    1 q# P& b2 b/ l% D
  1126. CLC$ }" n9 s& Z, A5 H1 h; @
  1127. ADC #FC_FUNCTION_OFFSET
    " s* Z# K+ l& C0 g, D
  1128. STA FC_PPU_Buffer,X
    4 @0 E& @7 Z5 A% q# _. d
  1129. INX
    6 L8 J8 Q2 l( d8 `
  1130. .IF FC_IS_DOUBLE_PLAYERS9 W0 n4 o! v4 [1 _9 ]
  1131. LDA #$02
    5 i( ]) A% n/ y0 ?+ f- r
  1132. .ELSE
    ) s( K$ W4 z! Z- r5 x
  1133. LDA #$011 }5 o0 F. G7 s- O- P/ Y) w2 n
  1134. .ENDIF
    : T1 K( J9 e1 ?+ w* l7 N
  1135. STA FC_PPU_Buffer,X0 q. |4 A! b8 ~0 w3 U1 C% @( M
  1136. INX
    8 {+ {- s& B+ c, f8 B2 U
  1137. STX FC_PPU_Cursor1 r& F! v* ^8 u, w7 M4 L' R+ s
  1138. RTS9 h# g) R* q- E4 k8 q+ w

  1139. ' z: F) T' w$ O% T5 h5 f
  1140. ;==================================================: h% E9 F3 r5 C
  1141. ;获取当前选择索引5 N) j( M  S9 N8 U9 e4 S+ h
  1142. Get_Select_Index:
    9 X* _2 g$ j+ K; f( X7 C* ?
  1143. LDA FC_Select_Temp7 P, r4 X9 t3 b7 a* R, v& d7 B- }
  1144. CLC; D0 I; }2 j' f; R2 Z
  1145. ADC FC_Page_Cur1 M& F: K& f; z% \
  1146. TAX, o# s1 i) }1 |( M2 W7 z1 D) y
  1147. RTS; n$ E4 V* c- v( T6 v

  1148. / k* f7 S# }3 Z0 I
  1149. ;==================================================
    - ^+ b7 h$ M# X: P5 I8 g
  1150. ;清除状态文本: n8 y$ ?- y3 M) E5 d; \
  1151. Function_Status_Clean:  X( {7 L4 n1 ~: U
  1152. LDA #FC_PPU_MODE_CNTC$ ?, x1 Z8 Y0 s) k, j0 E
  1153. JSR Set_PPU_Mode
    % N$ |2 ]$ d& [; S& \
  1154. JSR Set_Function_Status_Addr. |( H' `7 K( _& H& j6 [
  1155. RTS( Y, d6 }* b& Z5 V7 u) o4 U
  1156. ! T  M0 ]4 r, w7 Y+ o! `" K
  1157. ;==================================================
    # A% [4 I8 ~* Y6 w5 [, r1 P  B8 q
  1158. ;显示开关状态
    0 K+ w% u- {: D$ v7 q+ ~4 S
  1159. Function_Status_Show:
    # v: }% O. m  L8 @
  1160. JSR Get_Select_Index
    % ~- N( ?8 n  o% ^5 ]
  1161. CPX #FC_ITEM_SUM8 d1 w9 T. a' T
  1162. BEQ Function_Status_Show_Set1 U* F+ f' ~6 u+ t* \3 f- w- M
  1163. BCS Function_Status_Show_End1 L" u: V2 X; l
  1164. Function_Status_Show_Set:$ O( k/ x! J0 V# [& O# U
  1165. LDA #FC_PPU_MODE_CNTL& @/ ]" ?+ q; O+ Y$ A  m& c+ A! m
  1166. JSR Set_PPU_Mode  F4 i& C0 }8 F' \# Z7 l
  1167. JSR Get_Select_Index
    $ K6 c/ |7 i0 d- ]
  1168. JSR Set_Function_Status_Addr. S/ `; s7 ]+ L; v$ H: i
  1169. JSR Set_Function_Port
    5 u* x( a2 H: I# v1 X, M4 ~3 X7 _
  1170. JSR Function_Status_Show_Check_A
    2 y) Z( z1 v, {+ C; h
  1171. .IF FC_IS_DOUBLE_PLAYERS: e( t) m' Y) \& q
  1172. JSR Function_Status_Show_Check_B0 Y1 |# e( o3 u( j1 X
  1173. .ENDIF
    6 z6 u8 K, p1 G1 L, O
  1174. Function_Status_Show_End:0 \3 ]: k! E! |  w! S/ H! i
  1175. RTS- p! Q. ~2 I. U: h
  1176. ;----------------------------------------/ D' g+ ?% \4 p0 W' }. M
  1177. ;检查功能A状态: U( t& P# Q7 r- c6 R
  1178. Function_Status_Show_Check_A:+ _- L* K, \2 v( j+ m  T$ L
  1179. JSR Get_Select_Index
    1 a5 b, M0 _$ p3 h' C
  1180. LDY #$00/ `8 r; m; \& z3 ?9 w% u
  1181. LDA (FC_Data_Port_A_L),Y
    * n1 z0 t" T& U) D; K8 u
  1182. AND Function_Check,X
    . i0 I  V7 b( d0 h- p
  1183. BEQ Show_Function_Status_Off6 d% L4 K  u; @' X' Q3 ?; H6 s
  1184. JSR Show_Function_Status_On& }  ~! _$ t; O$ U( ^
  1185. RTS
    5 x- R6 H( u8 {$ j2 N8 y
  1186. ;----------------------------------------
    8 {" m( p) |% Y
  1187. ;检查功能B状态
    6 s3 F! t$ R# q; N
  1188. .IF FC_IS_DOUBLE_PLAYERS
    / k) c8 E5 u  D& d7 E
  1189. Function_Status_Show_Check_B:
    0 T5 N* y, u  K, h$ _$ N
  1190. JSR Get_Select_Index
    4 ?6 u8 Y. N  B. R- D/ L) f
  1191. LDY #$00$ f; ~& |% E. ^: v4 t
  1192. LDA (FC_Data_Port_B_L),Y
    $ f* h4 W8 v3 @3 x0 c
  1193. AND Function_Check,X/ m3 i* j+ g! E. R* I6 C0 ?
  1194. BEQ Show_Function_Status_Off
    - U3 x+ g; G' i
  1195. JSR Show_Function_Status_On0 \5 [4 V3 {+ Q" v# I
  1196. RTS* C8 Y( |! T8 [2 y6 \" D* V8 O) r
  1197. .ENDIF
    2 X6 W7 L! {* U! u6 X6 q( Y

  1198. ; C( Q! Z5 G0 C% n2 Q
  1199. ;----------------------------------------" W8 {2 E! ?9 Q1 P- r; W9 g; H
  1200. ;显示功能开启状态- `1 ?( E" E) t8 w2 M
  1201. Show_Function_Status_On:- I8 ?) [; {7 Y& V/ \/ T& A
  1202. LDX FC_PPU_Cursor
    ; i) b! q; V& T/ w
  1203. LDA #FC_ON_TILE
    % n0 D5 m+ r2 m! ~
  1204. STA FC_PPU_Buffer,X
    ( n, p4 T. H9 J
  1205. INX0 @: R; I# x; h9 O9 S0 q
  1206. STX FC_PPU_Cursor1 S) L) [& I- O
  1207. RTS
    . U- o! {5 U% j4 F
  1208. ;----------------------------------------7 M) M! G& W- T, U& f: v
  1209. ;显示功能关闭状态& i! T" ~% m- w- u4 t
  1210. Show_Function_Status_Off:2 w% ^3 L, K6 @
  1211. LDX FC_PPU_Cursor
    " @' g# E8 ?5 m# ~$ ^5 _) m* z- t7 s
  1212. LDA #FC_OFF_TILE- x, i/ l/ c: Y7 g
  1213. STA FC_PPU_Buffer,X
    ! _- h& f4 I  X+ C
  1214. INX
    6 V( X* N3 W  b4 _2 `5 R
  1215. STX FC_PPU_Cursor$ P2 z- t# G- d$ C1 B1 h
  1216. RTS5 E5 _: r) I0 n" w

  1217. $ n2 j2 a- W$ P* H- t$ _
  1218. ' U# z: H- f0 C2 b" D% [
  1219. ;-------------------------------------------------------------6 G3 b( n3 y+ B+ K! l/ u
  1220. FC_Data_Copy:    ;数据拷贝参数设置# Y; V8 a% M/ T
  1221. STX FC_Cpy_Port_L
    " n8 G, o# p: {* b$ O9 }4 Y5 ]" N- ~; L
  1222. STY FC_Cpy_Port_H0 B0 b& Y% L) W) _+ _
  1223. LDY #$00# i8 E6 J7 A6 v  l9 S1 Q6 q' K
  1224. LDX #$06
    % q3 [  t0 N; N& [1 r1 w# S
  1225. FC_Data_Copy_Addr_Set:    ;从指定地址读入参数
    8 V8 }+ E' \. G1 F  T& C7 _* G
  1226. LDA (FC_Cpy_Port_L),Y" [+ b6 r  i: u8 t$ b
  1227. STA FC_Cpy_From_L,Y
    . L8 O( P4 u. u% t* }- @& P/ o& R
  1228. INY- L! f1 l6 b3 z. {. _. W
  1229. DEX6 v$ s% o5 E! e3 K, o* z  N6 B
  1230. BNE FC_Data_Copy_Addr_Set# _; B- T' C- @5 K
  1231. LDA (FC_Cpy_Port_L),Y0 \$ S: y& Y) _- d
  1232. CLV
    " P/ r2 m' |8 J8 r$ u: P; Y" l
  1233. LDY #$00
    5 j; Q# N: _' m5 r! y8 |: Y6 m- W
  1234. ;----------------------------------: e5 Q1 J/ {' }; F/ M# o
  1235. FC_Data_Copy_Mode:   ;复制模式校验
    : o; T5 Y- G- C7 T& P2 x. O3 O
  1236. CMP #FC_MODE_RAM_TO_RAM
    ) P7 G& v; J9 d4 B' F1 U/ g- A
  1237. BEQ FC_Ram_To_Ram_Mode
    # v0 ^# ^. N. J9 M5 C
  1238. CMP #FC_MODE_RAM_TO_PPU: B/ ]2 q& x, J( d/ Z% R+ i
  1239. BEQ FC_Ram_To_Ppu_Mode) J( q. |# [+ Z, N, R
  1240. CMP #FC_MODE_PPU_TO_RAM5 Q, F. {7 M( F, s
  1241. BEQ FC_Ppu_To_Ram_Mode! R. n# `$ W' G: n" p
  1242. CMP #FC_MODE_PPU_CLEAR
    + \- Z+ ^0 S9 ~/ v5 x" o
  1243. BEQ FC_Ppu_Clear_Mode
    ( e& u& y, W) C, n
  1244. RTS
    & g# S! z" t$ Q$ s
  1245. ;----------------------------------------$ R# d$ C9 K" f* I, m$ a/ D
  1246. FC_Ram_To_Ram_Mode:   ;复制RAM到RAM模式
    ' {3 L7 \& d$ `
  1247. LDX FC_Cpy_Count_L% i- U+ [; U. |' c/ C1 E3 F
  1248. INX/ Z9 ^1 l) f! B( q! l0 n4 T6 m- W
  1249. FC_Ram_To_Ram_Count:   ;剩余计数检查
    / B4 w" h4 ?/ O' b" k! r5 W* C
  1250. DEX
    ) _+ n8 h; H6 s- e4 q& v
  1251. BNE FC_Ram_To_Ram_Copy
    & Y, b' [9 W6 e* i$ c: x7 _
  1252. DEC FC_Cpy_Count_H1 p( K% ^4 ~3 |0 _9 Y
  1253. BMI FC_Ram_To_Ram_Over
    ) t8 `" ^+ V, R
  1254. FC_Ram_To_Ram_Copy:   ;开始复制数据( ]; m2 [  Q3 l3 V0 P1 J; Y
  1255. LDA (FC_Cpy_From_L),Y% v( b* O" g/ B; S0 K8 {$ o* N
  1256. STA (FC_Cpy_To_L),Y' `- V, X0 I- t9 I
  1257. FC_Ram_To_Ram_From_Set:    ;源地址递增
    # j& R" B. m6 |" o
  1258. INY. _2 U) d9 ^8 y# y# R* i( [5 S
  1259. BNE FC_Ram_To_Ram_Count7 i% |& a4 Z; \! R) W+ E6 e0 e
  1260. INC FC_Cpy_To_H' J. I6 Q% J$ T! t1 U7 `3 N
  1261. INC FC_Cpy_From_H
    1 t2 a6 i3 c# V4 Z* ~; h8 |
  1262. BVC FC_Ram_To_Ram_Count
    0 ?/ J( ~: T4 R, e( y1 q3 ]9 N
  1263. FC_Ram_To_Ram_Over:    ;结束数据复制( a6 r& W8 J( E
  1264. RTS
    % G  P( Y4 Q& ^" v* B* t4 Z8 J
  1265. ! R% q/ s* n5 m6 [3 G1 W% Z
  1266. ;----------------------------------------
    . B; |3 H. b% G' G/ q* G5 X) @) K
  1267. FC_Ram_To_Ppu_Mode:   ;复制RAM到PPU模式
      k" I" q5 H' E3 }4 p
  1268. LDA FC_Cpy_To_H) [9 S. B; y) o+ S( u; C
  1269. STA $2006
    # t, ?5 Q5 o0 ?: ]
  1270. LDA FC_Cpy_To_L, L1 \  U* E" f) G; C3 z3 |) W
  1271. STA $2006
    $ m; r  Y6 m( D/ Y0 J% v
  1272. LDX FC_Cpy_Count_L
    / b$ s. z: ^# P0 Q! E, o# Z) h
  1273. INX
    5 M- e  J& l. h9 ~: s
  1274. FC_Ram_To_Ppu_Count:   ;剩余计数检查
    / Y" H* ?* H4 ^: p
  1275. DEX( F- i) f+ j2 u; X3 {
  1276. BNE FC_Ram_To_Ppu_Copy% j2 P" P. w% ?- p( t
  1277. DEC FC_Cpy_Count_H
    # F( {; J- f9 @& w+ v% L9 o
  1278. BMI FC_Ram_To_Ppu_Over
    ' e9 I& U# s; T
  1279. FC_Ram_To_Ppu_Copy:   ;开始复制数据3 C/ V- g* {3 e
  1280. LDA (FC_Cpy_From_L),Y
    , }' ^. _" [* D! R+ a/ m8 W' l
  1281. STA $2007& U" \/ {  ~0 M# L- ~2 \# B
  1282. FC_Ram_To_Ppu_From_Set:    ;源地址递增+ U) @0 W) r& x7 [: d; l
  1283. INY
    ' l" j6 c  Q2 @  o1 a
  1284. BNE FC_Ram_To_Ppu_Count% @* B7 E7 w4 i" ]8 W# \3 o
  1285. INC FC_Cpy_From_H
    9 a- }$ c. _! ?
  1286. BVC FC_Ram_To_Ppu_Count
    ; w& X4 x$ H: p- x0 R4 j
  1287. FC_Ram_To_Ppu_Over:    ;结束数据复制/ d! o5 w/ G* M* [
  1288. RTS
    3 D' H% T- v. P2 l* n

  1289. 9 |0 q8 d: U2 @( @2 x, D1 B
  1290. ;----------------------------------------5 C# l  X6 Q, Z9 `( O* E; A
  1291. FC_Ppu_To_Ram_Mode:   ;复制PPU到RAM模式9 j2 h) Y, z( x; S8 h, Y
  1292. LDA FC_Cpy_From_H
    * [5 G, m) i% g* i
  1293. STA $2006
    $ |0 z: W1 U7 U2 r& }& e, g) K" t
  1294. LDA FC_Cpy_From_L
    # Z9 m( F% L& [! ^+ D! K
  1295. STA $2006# Y8 ?: i: K. O1 l& [
  1296. LDA $2007
    $ P* M; _: k4 w$ s% N" q
  1297. LDX FC_Cpy_Count_L
    - K3 ~: D2 Z+ k! Y. t4 J0 w* n6 ?
  1298. INX
    1 W+ |  G0 Y' |4 v2 f$ j1 Z/ N
  1299. FC_Ppu_To_Ram_Count:   ;剩余计数检查
    ' q  U" P6 J. G4 O" I
  1300. DEX
    1 U" {1 z# g5 Q& v/ Y* m
  1301. BNE FC_Ppu_To_Ram_Copy
    : u$ `0 X( i3 x
  1302. DEC FC_Cpy_Count_H/ r  r) l. R9 Y. _3 o, Z
  1303. BMI FC_Ppu_To_Ram_Over* M" Y% n. b* B# G# Q
  1304. FC_Ppu_To_Ram_Copy:   ;开始复制数据
    ( H  X/ N( ?! A9 b
  1305. LDA $2007
    ( ^/ V& k3 h8 e6 s% C4 O
  1306. STA (FC_Cpy_To_L),Y; U! y1 t0 N* @! i5 d9 ~. x
  1307. FC_Ppu_To_Ram_To_Set:    ;目的地址递增, S% X* T8 F0 ^& I/ c
  1308. INY! e8 B* R" ^! r, C# b
  1309. BNE FC_Ppu_To_Ram_Count/ Y: L; B1 j9 Y  c- q
  1310. INC FC_Cpy_To_H  M' A6 J" ^' l* E3 Y
  1311. BVC FC_Ppu_To_Ram_Count
    1 I4 F5 B. G( p7 ], W2 t# L: u
  1312. FC_Ppu_To_Ram_Over:    ;结束数据复制0 }$ Z3 ?; p( F1 p; T( Y5 `/ Y
  1313. RTS
    & E! W. c$ M, d4 E  @. r
  1314. 7 p6 U! v/ R& m
  1315. ;----------------------------------------
    8 ~- {! R' a8 T5 t, v) E
  1316. FC_Ppu_Clear_Mode:   ;清除PPU模式
    : R% O8 i- H) ?# t$ H
  1317. LDA FC_Cpy_To_H
    ' y5 L6 _  x9 e* }
  1318. STA $2006
    1 h' q% R: q+ V  P5 O  @
  1319. LDA FC_Cpy_To_L
    ) }  F% P4 R9 Z  G  [8 n( R, {
  1320. STA $2006
    ; k0 }% Q+ ~) \3 q
  1321. LDX FC_Cpy_Count_H
    - d& g  y+ Q$ J+ t; Q2 t' a
  1322. LDY FC_Cpy_Count_L
    ; X: n* z3 Y8 S0 o. F
  1323. LDA FC_Clear_Val
    $ n! G% z. ]# t: I
  1324. FC_Ppu_Clear_Count:   ;剩余计数检查
    ; K1 ?$ G* A! e- [% G+ E
  1325. BNE FC_Ppu_Clear_Copy
    6 J* [( d9 A+ `1 \
  1326. DEX* u0 ~5 u7 i* @% ]" a% g6 S
  1327. BMI FC_Ppu_Clear_Over
    : F1 G; Z4 J+ ]1 n2 G* f
  1328. FC_Ppu_Clear_Copy:   ;开始清除PPU% L4 A( Y# ]+ j0 L. t% Q
  1329. STA $2007
    % d4 i4 ~" ?+ p) w2 V
  1330. DEY
    & Z/ o9 |( O2 @/ p
  1331. BVC FC_Ppu_Clear_Count
    ; d& C' L- `4 a) M
  1332. FC_Ppu_Clear_Over:    ;结束数据复制
    ; F+ |+ k: D- T4 l
  1333. RTS
    0 L3 I" z7 \! ?$ T  ^5 q- Y1 x6 I
  1334. 2 a% V. {4 y$ g( Q" s
  1335. ;==================================================4 H) E2 q/ @& t& ?
  1336. ;保存RAM数据
    ' ~& g+ \1 `2 |
  1337. Save_Ram:9 z  e/ h) |# W
  1338. LDX #<Save_Ram_Data
    " Y* K8 J. A0 u% L4 @
  1339. LDY #>Save_Ram_Data
    ( L! b/ _) z+ T& ~
  1340. JSR FC_Data_Copy
    1 q6 Q( L  `! e1 S$ ?& x
  1341. RTS
    : L+ s2 n- K2 O- S
  1342. ) m/ d0 _, i+ R3 }' f$ X
  1343. ;加载RAM数据
    7 J8 V$ I- p$ C' D* R* ^0 k) L1 N& K
  1344. Load_Ram:* h- i8 N; k% w' V4 }
  1345. LDX #<Load_Ram_Data7 A* v5 d* B/ C1 U1 h* f- C; }$ H5 k
  1346. LDY #>Load_Ram_Data
    8 e" e9 i+ P( h
  1347. JSR FC_Data_Copy
      Q* i. R  V9 R
  1348. RTS
    # F3 R9 m4 D$ R. E7 Q

  1349. 6 Z% G% Q) q" c2 ~3 ?
  1350. ;保存PPU数据
    # y! T4 C1 O( D. R% W5 u
  1351. Save_Ppu:
    9 M' G# A( P& ]0 A; ]5 j5 f( u
  1352. LDX #<Save_PPU_Data
    7 t0 O9 B( K& _" ^( G2 c! P
  1353. LDY #>Save_PPU_Data
    ! H; S$ c# K& W
  1354. JSR FC_Data_Copy
    . c9 O0 P! p' a, C
  1355. RTS
    ! f# n  z# B0 {/ ]3 ?9 p, ?

  1356. ; {! r# \, W, p/ N" s, n
  1357. ;加载PPU数据
    $ r  e1 A  U0 m% A6 k5 Y
  1358. Load_Ppu:0 o; g5 s2 |* Y  {# D3 H
  1359. LDX #<Load_PPU_Data
    # T3 z$ ]( ~% @+ W
  1360. LDY #>Load_PPU_Data
    # L3 @6 V$ r1 u( B* ]
  1361. JSR FC_Data_Copy
    & C, |4 C1 K8 a# c/ m' a
  1362. RTS- }& M* w- s, N# s. A3 E7 e1 n
  1363. , I; G0 B+ U' _6 L  E$ s/ m
  1364. ;清空PPU数据' b/ z6 v- x9 B
  1365. Clear_Ppu:* x! q# g. q+ F; K
  1366. LDX #<Cln_PPU_Data& ]9 @2 ~( ?5 j7 R! h
  1367. LDY #>Cln_PPU_Data
    - |; T. j9 x6 t, f1 n
  1368. JSR FC_Data_Copy" \2 b# F; y. [- K& C; B
  1369. RTS
    7 x, D# U7 y% X/ G5 v
  1370. + j: c' d8 P$ I; `$ E
  1371. ;==================================================
    5 A3 f6 g! _: t" h# I
  1372. ;数据配置
    $ U7 Y/ r0 m, A: I  u1 C
  1373. Save_Ram_Data:. Y3 t! }" r* |! }
  1374. .DB $00,$03,$00,$63,$00,$01,FC_MODE_RAM_TO_RAM
    9 |& n5 Q+ I, u9 ]0 r2 V) k
  1375. Load_Ram_Data:3 [" u1 H' E* {. H8 ]5 f8 {
  1376. .DB $00,$63,$00,$03,$00,$01,FC_MODE_RAM_TO_RAM, `/ k; ~: E8 P1 z$ h: O3 s. C
  1377. Save_PPU_Data:
    % H) C% ?0 z' J
  1378. .DB $00,$20,$00,$64,$00,$04,FC_MODE_PPU_TO_RAM
    , D9 t: F0 Z3 \0 f$ g& u
  1379. Load_PPU_Data:: d0 o1 G) A) ~3 r1 L3 |6 @
  1380. .DB $00,$64,$00,$20,$00,$04,FC_MODE_RAM_TO_PPU! [7 V1 z" W4 e2 ]) l# T% `- r
  1381. Cln_PPU_Data:
    2 ^; C7 z. O" B9 a. [4 F
  1382. .DB $00,$00,$00,$20,$00,$04,FC_MODE_PPU_CLEAR
    . c1 @, D6 L) l8 f

  1383. & u  ]3 f6 W5 T) C+ `# e1 B/ |% X# r

  1384. / b6 i: B9 u) Z1 d# X0 ^: ^- u
  1385. ;==================================================
    6 Q- A" G' P/ ]. E
  1386. ;文本数据PPU显示地址8 o, s2 _. Y2 N1 U# S. Q* J9 u4 J
  1387. Text_PPU_Addr:
    ) P# Q8 v& P; e' C+ j2 Q
  1388. .WORD $20C5
    , H" i2 u& m' Y' G  F3 e7 ~2 `
  1389. .WORD $2105
    ; m% {- p4 C5 j8 o2 S
  1390. .WORD $2145
    3 P( _2 W7 w% `; ]: e& }% `
  1391. .WORD $2185  X6 V& y( A$ V. ?
  1392. .WORD $21C5" t- |0 m+ ?' P) y8 w9 ?8 H
  1393. .WORD $2205
    8 D* V9 |( G7 S1 _$ h
  1394. .WORD $22457 G$ w- y$ ^5 ^* _0 t6 h6 L. V/ Z
  1395. .WORD $2285& x$ C# l5 |6 I: P/ J& ?2 f
  1396. .WORD $22C5
    , C/ F: y  z  g" T
  1397. .WORD $2305
    - }5 Y8 G' H2 {0 [% n' l, J* {
  1398. .WORD $2345
    ' f1 G- l  `  u3 C

  1399. ; Q! _1 X1 L  T4 F) s
  1400. ;==================================================
    6 r; k/ B( M* q7 s) W! a
  1401. ;文本数据PPU数据地址
    0 W: x% b5 ]2 P8 E0 i+ `1 }
  1402. Text_Data_Addr:
    $ T7 ~$ X0 n8 ], X" V* a( ?% h
  1403. .WORD Text_Data_01
    & e: Q. h/ d; ^; q, Z7 N  z
  1404. .WORD Text_Data_024 Q. W" r2 G: f5 C$ ]
  1405. .WORD Text_Data_03
    ( C  o0 s' v2 E. i" B
  1406. .WORD Text_Data_04
    ; g# \( M! Y& X' b- h& s9 x5 o: }
  1407. .WORD Text_Data_05
    2 K( `1 ~0 z) p$ C0 D4 ]
  1408. .WORD Text_Data_06+ M- ~; e* {# F7 h) H% @! l2 U& [
  1409. .WORD Text_Data_07
    $ y6 z$ F, W; N6 g0 z
  1410. .WORD Text_Data_087 }/ w' d$ |6 C/ `' y% T& y
  1411. .WORD Text_Data_09
    ' U3 }  n2 S7 j  \  B3 H
  1412. .WORD Text_Data_10( M0 n3 o5 ~# h7 ~% |& b
  1413. .WORD Text_Data_11% z2 h! a0 i( U9 k
  1414. .WORD Text_Data_12
    1 g) S4 V% c9 _- J# M
  1415. .WORD Text_Data_13
    0 t, v3 g. K0 |. n8 E. Q$ ?# t9 @5 w( m
  1416. .WORD Text_Data_14
    " i+ V: H" z0 ?- ]( s: e6 H3 j
  1417. .WORD Text_Data_15
    2 M( h$ c: y* N  S- y
  1418. .WORD Text_Data_16* H/ M$ i# v$ c% _( V9 Z

  1419. ; }) _; U% h) U$ a6 u
  1420. ;==================================================2 x) l) ?; Z6 _/ |0 y/ ]% G# Y
  1421. ;文本数据
    5 u# }5 Q8 q$ l4 E' ~- e+ u
  1422. Text_Data:
    6 b$ S( q$ N+ I: @& ]
  1423. Text_Data_01:6 @! ~* B. j! Q4 p- T; i
  1424. .STR "01.INVINCIBLE"
    ! k6 M1 z" b9 l3 ^  o# T
  1425. Text_Data_02:
    + T6 ^4 X  i9 h- J+ s8 P9 Q  V
  1426. .STR "02.INVINCIBLE PLUS"
    ( v, h0 ^. l8 @3 N: a1 F
  1427. Text_Data_03:# |' p7 y& j$ a- S8 Y
  1428. .STR "03.LOCK LIFE"6 q* O/ Z  p( O6 l- n; q
  1429. Text_Data_04:* e7 }* W- }3 h5 {9 V. x
  1430. .STR "04.LOCK WEAPON", s. V2 L( r7 f$ N3 h
  1431. Text_Data_05:
    ( v9 n; w$ Z  v; x
  1432. .STR "05.SEL CHANGE WEAPON"
    : p  I1 v* |' R1 s+ f0 \% z
  1433. Text_Data_06:
    4 }" l' Q1 E+ P2 x  r  \
  1434. .STR "06.UNLIMITED JUMP"7 V& }5 _: \3 U8 E$ M& ]1 G3 G
  1435. Text_Data_07:
    ; w; y: S; w* {. C% W( A
  1436. .STR "07.MOVE FAST"% V7 u" ~6 J, X2 J
  1437. Text_Data_08:
    2 {6 G5 D% m& O# a8 E
  1438. .STR "08.SWAP SKIN"5 h% m1 Y7 O" B9 a) L
  1439. Text_Data_09:2 W9 m8 b9 T2 b3 T  l6 E
  1440. .STR "09.EQUAL BULLET"
    8 p- Z. ?$ r4 T$ C! E' t4 f
  1441. Text_Data_10:. X4 D$ s0 K. t( H+ ?: o
  1442. .STR "10.STRONG BULLET"
    ! f  L6 v6 K2 W& {8 F: U$ q
  1443. Text_Data_11:
      y$ v7 \" d* A0 z- @
  1444. .STR "11.KILL BY ONCE"; j0 r! s5 N' S
  1445. Text_Data_12:
    , I4 \9 y7 e5 v1 @7 d* ?1 F  Q0 z
  1446. .STR "12.FULL SCREEN KILL"( C7 P7 W" }2 {$ ^$ v; b, v# o$ H( p
  1447. Text_Data_13:
    . v/ Z! e( j) m. Y7 a% r
  1448. .STR "13.DOUBLE CONTROL"
    $ I0 q( B: B/ D) `3 m/ n
  1449. Text_Data_14:- h& J$ u, ^7 h( o
  1450. .STR "14.REMOVE E-GRID"
    ; z# V- P* U) J9 S
  1451. Text_Data_15:
    # L7 I3 m0 t& ]3 F; }) M
  1452. .STR "15.FALL INVINCIBLE", R9 j& k- N: x
  1453. Text_Data_16:
    " d3 ~/ W( {9 N& F( j
  1454. .STR "16.NEXT STAGE"7 N! Y6 T% f- A% o
  1455. , n  U' J# L. \/ ?) ~- H* R4 M) |3 b3 j
  1456. ;==================================================3 k2 J8 L$ U. q: j9 j
  1457. ;功能开关检查地址
    7 k( n! Q% m0 B3 I
  1458. Function_Addr_A:
    + T9 A% k% L5 c) H0 `1 d7 e6 Q# }
  1459. .WORD $01C0& w! O- J* L) b* h! B+ c
  1460. .WORD $01C0
    ) g* B/ U/ m3 Z3 |  X
  1461. .WORD $01C0
    / {% b0 n8 _9 J) ^" b& `
  1462. .WORD $01C01 ^7 Q8 a! z# [  l/ F( B6 D
  1463. .WORD $01C0! u( R3 b  B6 T# v6 @8 t9 e
  1464. .WORD $01C0
    / r* W, r; q# W
  1465. .WORD $01C0" w- s/ W# X' |3 q
  1466. .WORD $01C0/ _% y% C4 M& M  E+ i
  1467. .WORD $01C49 m, r. t  \; n5 Q7 c3 q7 q
  1468. .WORD $01C4" @2 T8 h$ I( o+ b1 i9 y* P
  1469. .WORD $01C4$ q( u  C7 i+ g4 W6 q7 P5 J
  1470. .WORD $01C45 r& s0 R. b7 R3 k8 c, g
  1471. .WORD $01C4
    5 v6 T. b5 |+ ]5 @3 W
  1472. .WORD $01C4' l: j, V* F' F9 Q6 P5 a
  1473. .WORD $01C2, |% r/ A8 g, B3 I+ H
  1474. .WORD $01C4$ T& |" w3 A. C0 B$ ^

  1475. : x& p5 m& ?9 d+ p; t4 F( o
  1476. ;功能开关检查地址
    2 W9 ?7 R6 H+ F( H* n, k/ Z* ]6 `
  1477. Function_Addr_B:* T* @" ~" ^, h- }
  1478. .WORD $01C1
    ! m. M- {! w/ V  I- i
  1479. .WORD $01C1' b6 |7 C0 x/ X7 I4 S6 ?" _
  1480. .WORD $01C1
    1 P% E" b; B3 M
  1481. .WORD $01C1
    2 C5 B1 T% `" a- y/ w9 Z8 r. h
  1482. .WORD $01C1
    9 }" T6 X; ?* ]! N, R4 G
  1483. .WORD $01C1
    % e: C! m$ W0 y% f
  1484. .WORD $01C14 F. ]. Q5 x2 C4 D1 h
  1485. .WORD $01C1) I* i& {. R1 Y6 ?: u- ?2 ]
  1486. .WORD $01C46 `: \1 t6 e0 n2 s# m. X! i
  1487. .WORD $01C4
    + w3 \4 C+ a  T2 {' Z3 y  C1 D
  1488. .WORD $01C4: {( g/ C. w) e. g! z4 u. z! p
  1489. .WORD $01C41 x; V; G" Y" k5 g7 e
  1490. .WORD $01C4* h/ }0 `2 W0 Z' Z& ~& V0 v9 }
  1491. .WORD $01C4
    1 w: b$ m- q9 m+ q  a/ h
  1492. .WORD $01C3
    ' q, L8 F9 r$ L& o9 m" S
  1493. .WORD $01C48 ~# x; F& F$ V- v0 Z5 z; m

  1494. ( z. K9 q" L9 ]% G0 ~5 S: c- W, D
  1495. ;==================================================
    . ?  g" S; f# O$ \, U
  1496. ;功能开关检查数据- O  d, y6 C% c* g6 H
  1497. Function_Check:
    . p/ }4 g" `3 }5 _* o
  1498. .DB $01. ], e8 p0 ~, R, H
  1499. .DB $02% z" w. W  C5 B  a( Z! y4 ?5 c
  1500. .DB $045 @6 l) F9 z* \# D' h
  1501. .DB $08
    - G; o5 ~: ^' P" z! [
  1502. .DB $100 W: |$ |: d1 Q' R" B( Y
  1503. .DB $209 S& \( c8 Q- a5 v0 A: A
  1504. .DB $40! i+ j0 o7 R% J
  1505. .DB $80
    3 m4 [& {$ g( K2 B8 K. K- Z
  1506. .DB $018 Q, r$ t7 V: x# d* c2 u4 J
  1507. .DB $02
    5 e$ v! O! z* L; p' I1 D
  1508. .DB $04' `. Q! Z: [7 r1 d0 L+ x
  1509. .DB $087 J4 ]$ j: E& D) n2 b& C6 }; l5 F
  1510. .DB $10
    9 \7 {' T7 i5 d0 X" F
  1511. .DB $200 v& S4 X3 o; Q, P
  1512. .DB $40
    / |3 ^: z( l' Q4 G; P0 R) M
  1513. .DB $80, r4 V0 B1 E8 i' n: S
  1514. , j/ N  |8 Q  B( j( l; ]
  1515. Char_Rom:
      d: P; T% |3 o( f4 T
  1516. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00, X  `3 l; `1 a7 o) t
  1517. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    ( F8 k9 K9 Z% A5 P8 b
  1518. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3B,$25,$00
    $ Q3 ~. A! x0 s7 J8 h
  1519. .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$00,$00,$00,$00,$00,$00- p6 {2 |1 }( g2 a2 O, q
  1520. .DB $00,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$199 F6 w6 E$ T) q* @1 @
  1521. .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$00,$00,$00,$00,$00
    3 n* Z1 A  v0 F# [5 j% q  q3 p
  1522. ; X0 m2 l  i8 ~  a! Z" L# @3 k
  1523. 3 Z- ~1 c0 b: ]# ]+ H) f
复制代码

& i! C3 A9 Z5 J8 T, @9 C
游客,如果您要查看本帖隐藏内容请回复

/ v- Y6 b+ x$ ]9 }4 Bflamecyclone.ys168.com8 }5 c. I3 P- [" _& K4 O9 L  z
www.nesbbs.com

本帖子中包含更多资源

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

×

评分

2

查看全部评分

签到天数: 3028 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 142 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1579 天

[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
回复

使用道具 举报

签到天数: 2535 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1360 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 187 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1785 天

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

使用道具 举报

签到天数: 1201 天

[LV.10]以坛为家III

发表于 2019-12-5 06:49:43 | 显示全部楼层
樓主的修改一定支持, 魂斗羅是喜欢的系列.
% i' @1 M: y. Z! H* G( d, `多谢楼主分享
[发帖际遇]: waikwokt 打扫环境卫生,被奖励 2 个 柠檬. 幸运榜 / 衰神榜
回复

使用道具 举报

签到天数: 1147 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3470 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1341 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3163 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

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

使用道具 举报

签到天数: 519 天

[LV.9]以坛为家II

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

使用道具 举报

签到天数: 7 天

[LV.3]偶尔看看II

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

8 a$ G8 d6 {; {5 T- e' Y4 r4 }Tec.PNG (8.05 KB, 下载次数: 0)  V# c: X' I; d/ R+ L  G/ s/ ]3 v
% N& f8 |7 R( [! b3 b6 [+ g
下载附件  保存到相册( d0 y& E$ ~7 b$ N* o5 V  p% a1 j
+ \! f8 ?- ?! U: ?  m& [
2020-3-13 13:33 上传/ @4 g" m9 S8 \& x. M  Q3 P
得到的文件解压后放在任何FC模拟器即可玩。NES上最优秀的篮球游戏!1 _8 G6 w! F: Z  ^" u7 _) S. _8 t* ]$ U% x6 O1 B" J/ b4 ]
修改内容:4 O- i8 {5 g! f) T
1)游戏时按START键可以开启或关闭怎样射球都进篮,全场照进!- t9 S2 d" W3 p& \  s
9 t' s% H" T& k! ^1 `. n4 N# A* o  K& S. i2 c; j& ~$ ]8 N$ j, `
不过开启了是双方面的,看到电脑拿着球赶快关闭!(有声音提示)。" p1 M) ?$ I+ `) P* f2
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-6 08:29

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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