设为首页收藏本站

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2019-11-29 20:25:37 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2019-12-4 21:31 编辑
( |9 b, d0 Y4 B1 A
, x% t1 ^' ]) @3 d! w8 [/ g' [[FC][魂斗罗][最佳可视化]
9 }* r( x- F+ q时间:2019.11.308 V$ u6 U$ Q+ C/ F: B3 l0 g. e
作者:FlameCyclone
; ~% @& c2 Q5 t8 T! D' D内容:( L$ a9 G+ e: o# j0 k
1.可视化:    ; ~8 b. i) V) I! a, A4 s7 j
     (1)暂停时按选择键进入菜单
6 d9 x% e; }0 p+ Q1 |6 \4 b) i     (2)方向键选择功能: B键开启: A键关闭: 选择键交换,开始键退出# H4 ?) [: J7 v- p2 a$ M' O* [
     1.1.透明无敌: 透明无敌
0 q& t4 H' C' U, f7 \5 n  @, ~     1.2.加强无敌: 金身无敌
  C. |& G1 H, z# ^- j, I! @& Y8 g     1.3.生命锁定: 生命锁定3条
; L% g1 ~0 R2 s/ [- {& K     1.4.武器锁定: 武器保持不变
; T$ U# u/ D& z/ a! P     1.5.武器切换: 游戏时按选择键切换武器
) I6 \1 S3 x3 A2 V* M2 D$ @- K4 [     1.6.无限跳跃: 跳跃无限触发
2 g. Q- Z# E: d     1.7.快速移动: 行走速度加倍
, G/ N* ^3 t8 T7 E5 y; ]' s     1.8.皮肤切换: 交换玩家肤色6 H- I. k# q. ^6 J, w5 {
     1.9.公平子弹: 玩家子弹可以与敌人子弹对打3 v$ M: i/ k0 N7 I9 K$ P" P
     1.10.强力子弹: 子弹打中敌人后继续穿透
, X3 {: z9 @2 k  U* p4 C     1.11.一击必杀: 敌方中弹一发必死
. j7 z/ S3 c6 \& a' {+ W+ V+ B     1.12.全屏击杀: 开枪时全屏可击中目标必死
" |* ?$ ]7 r& h& s% r6 Z) P* B; s     1.13.玩家双控: 两个玩家的任意一方均可同时控制两个玩家/ D9 f6 x2 `$ C, r+ w
     1.14.移除电网: 移除2,4关的电网1 _# q$ l3 @2 f+ K- [7 E) [' C4 R
     1.15.掉坑不死: 掉坑后不会死亡
& e2 l- }  n  X0 b% u     1.16.跳过关卡: 跳转到下一关6 q1 u# J8 i' F2 \2 a" p
  1. ;[FC][魂斗罗][最佳可视化]2 U% n' t" ?- B3 B8 ]  \2 A
  2. ;20191129
    3 S5 T' m4 Z* }* g1 p

  3. ' J. k! F" ~5 N
  4. ;程序开始地址' v. J6 y# d) |0 c
  5. .ORG $9000
    / t; p( H2 \( A* D9 u2 D
  6. $ v' Y8 I9 |  f4 V2 f7 o3 R
  7. ;==================================================) S0 w+ n- m6 u8 X! ^4 ?
  8. ;==================================================3 J$ A% o8 G+ M
  9. ;是否双人玩家5 V( t( x: u- ^+ c
  10. FC_IS_DOUBLE_PLAYERS = 17 b9 b+ I& |4 s' ]7 c
  11. 0 O. }2 Y* i, E/ ^+ U) ^! n
  12. ;==================================================" k0 p+ I; y9 ^% D, `& ?
  13. ;PPU缓冲地址配置( M$ {: a1 j: i+ u: V
  14. FC_PPU_Buffer = $0300; q" I- v: d; l2 o' \  B, D6 i
  15. ;PPU地址配置1 O! F; ?) S' `. s- B3 i8 n5 T5 H
  16. FC_PPU_Cursor = $00
    1 P/ @" k) v7 c, c4 ^
  17. FC_PPU_Status = FC_PPU_Cursor+$01
    , H$ J- m3 b$ g7 E4 }; |$ F
  18. FC_PPU_Data_Cnt = FC_PPU_Status + $01
    0 M5 Q( a% S: q- u
  19. FC_Data_Port_A_L = FC_PPU_Data_Cnt + $012 R5 p# b' [# H' T% o
  20. FC_Data_Port_A_H = FC_Data_Port_A_L + $01
    ( S8 Y+ w6 l4 M
  21. FC_Data_Port_B_L = FC_Data_Port_A_H + $01! b7 o0 V# m* m' N! L- `, t. ?
  22. FC_Data_Port_B_H = FC_Data_Port_B_L + $01+ ?+ z" j* E( R4 W
  23. ;==================================================
    8 G- s' j" q% M; v5 H2 Q

  24. " |' O$ k$ o+ c- D$ ?
  25. ;==================================================
    ) F' n5 Z+ G# V
  26. ;选择项地址配置
    " J7 \6 P0 j; ]4 D
  27. FC_Select_Index = FC_Data_Port_B_H + $01
    " l- e+ t9 K# X6 _3 C, C. j+ K
  28. FC_Select_Temp = FC_Select_Index + $02
    + `4 g) \2 Z* h5 F
  29. ;NMI循环计时器
    & h& V/ h) ?$ B2 g* v: R
  30. FC_Time_Count = FC_Select_Temp + $019 j. {1 V" R' t
  31. ;==================================================: ]' H& q/ h+ v  C* B  o
  32. + |7 j3 o7 ~5 h) X$ m/ \
  33. ;==================================================3 R* D/ `8 ^! j" J
  34. ;光标配置- o( i. ^: ~6 w$ t* [
  35. FC_Cursor_Addr_L = FC_Time_Count + $01  M% f# Q4 U" B, Z3 o. m9 P
  36. FC_Cursor_Addr_H = FC_Cursor_Addr_L + $01
    2 e% ?: L3 G1 e9 |8 L: L: j
  37. FC_Cursor_X = FC_Cursor_Addr_H + $01
    8 Q/ b0 u# ?4 {$ z
  38. FC_Cursor_Y = FC_Cursor_X + $01
    # q2 C" h5 M  _6 e7 i# B2 D
  39. ;----------------------------------------- `" _& s: z+ q7 j$ j* A* y
  40. ;光标图形号6 z% t# L# f# q; S/ I+ W
  41. FC_CURSOR_TILE = $3E: B5 B) ^, m( h2 P) Y2 i2 p* l
  42. ;光标偏移像素值( }9 @) c1 H, m% K( R9 N
  43. FC_CURSOR_OFFSET_X = 12
    7 c4 Y4 y2 {# f! M, g7 }( e0 I% u0 j
  44. FC_CURSOR_OFFSET_Y = 1
    ; W. i9 v; K7 A( k+ a% d, u; w
  45. FC_FUNCTION_OFFSET = 21
    2 c: J- _$ C. o  g4 Q
  46. FC_ON_TILE = $3D
    / V8 B( ?- R3 z( z( n/ \/ s9 G
  47. FC_OFF_TILE = $3C' n. n" ^8 I" @+ n3 J6 T0 w" k
  48. ;==================================================* H& b! W! F. d- @

  49. 8 b. l" M1 m. D; z$ Q: |
  50. ;==================================================
    3 T( t2 z: C4 a7 M8 _# f1 {
  51. ;翻页配置
    : X6 X/ N( u9 T
  52. FC_Page_Old = FC_Cursor_Y + $01
    - _4 E, W* K) T- P+ [! L7 l6 v; a. h
  53. FC_Page_Cur = FC_Page_Old + $01( e: H! u; `; O, N/ r
  54. FC_Page_Item_Count = FC_Page_Cur + $01
    " i; d: F1 M; w- G
  55. FC_Page_Item_Buffer = FC_Page_Item_Count + $013 @' R9 k3 Z# Y% u, @2 m$ Z5 T
  56. ;----------------------------------------
    & o) o% n$ D6 d1 W# E. O1 Y! g6 k) p
  57. ;翻页属性
    & z3 O( [# B' G# L  Z: h, `
  58. FC_PAGE_SIZE = 10
    $ ^% y" H2 G4 P) K# m2 O
  59. ;PPU单次写入缓冲项数
    5 c1 U/ k7 R$ G7 {
  60. FC_PAGE_BUF_SIZE = 2% u  ]0 K9 T* S8 g, D( G# s
  61. ;----------------------------------------
    ' y  I6 L) _) W5 ~  Y% o
  62. ;显示项最大索引属性+ p% l$ ^% i2 M" j
  63. FC_ITEM_SUM = 16 - 1' I4 _  c3 }3 ]8 V3 A$ S) c, j6 F$ ?
  64. ;最大页索引属性
    1 e  Q  r) y9 ^* q2 N1 h
  65. FC_PAGE_MAX = FC_ITEM_SUM/FC_PAGE_SIZE*FC_PAGE_SIZE
    " t3 T& J2 x' v9 o9 A+ B, `
  66. ;==================================================
    9 g, V& b; G+ M/ g3 n* T& Y
  67. * d* z' l- f" u/ |# Y& M  G
  68. ;==================================================* w* z/ A8 Y" I& j: e' [# d' a
  69. ;按键配置. y' z+ X( H5 l  k8 e1 M. s. C
  70. Button_Keep = FC_Page_Item_Buffer + $01& t2 E8 b1 D. e: p3 [3 |
  71. Button_Once = Button_Keep+$02& o7 r1 ?" Z! b+ E
  72. Button_Temp = Button_Once+$029 \' z4 f, [( {2 ^
  73. Button_Buf = Button_Temp+$02
    . i) f/ y+ V; K% _* V+ Y
  74. Button_Status = Button_Buf+$02" l( P% L* b' f
  75. Button_Auto_Delay = Button_Status+$02
    : F6 A- h/ q. Y4 ]
  76. ;----------------------------------------. v7 d, {" r0 h) C  G
  77. BUTTON_DELAY_MAX = $18
    : y6 Z1 |$ B+ @3 ^+ [. U7 v# z
  78. BUTTON_DELAY_SPEED = $08
    # H$ x& s$ l( |% {

  79. - x9 Z- Y  Y5 M
  80. BTN_UP = $08+ l" c  B/ Q6 s5 w) t5 u$ j1 x
  81. BTN_DOWN = $04
    + U& ]  Q3 W4 {. T. ?* M. f
  82. BTN_LEFT = $02
    7 I/ G6 Z3 @1 r* w& ?; v( D* ^
  83. BTN_RIGHT = $01
    0 d* {* v9 X/ |
  84. BTN_SELECT = $20
    " v7 v; p$ Z4 S- I$ Z2 C
  85. BTN_START = $10
    / D4 F+ }' T- K1 ~% ]' C+ A
  86. BTN_B = $401 o: T( J( k! H& U3 Z& {
  87. BTN_A = $80
    , z! ?. w2 {& F- I! F
  88. ;==================================================
    2 f# L! \. b6 ]2 N+ C6 @/ l

  89. 1 b4 b3 I1 J" `% G3 b6 N5 W
  90. FC_Copy_Addr = Button_Auto_Delay + $01! r% r, O/ \& x
  91. ;----------------------------------------' K: W' o. U& t9 L6 L! }( M
  92. FC_Clear_Val   = FC_Copy_Addr+$00      ;清除模式覆盖值4 f" T% w7 u) Y
  93. FC_Cpy_From_L   = FC_Copy_Addr+$00     ;复制来源地址低位
    # o" R! Z8 ^/ m$ K. Y+ C6 C
  94. FC_Cpy_From_H   = FC_Copy_Addr+$01     ;复制来源地址高位8 r0 K, x! l! R2 c& M& \0 u2 L* y3 s: L
  95. FC_Cpy_To_L     = FC_Copy_Addr+$02     ;复制目的地址低位
    * O* l0 q5 x% n
  96. FC_Cpy_To_H     = FC_Copy_Addr+$03     ;复制目的地址高位
    , O5 H9 w, j; R& `' @  J* f
  97. FC_Cpy_Count_L = FC_Copy_Addr+$04      ;复制长度低位8 d, F3 ?$ M. |3 a( z4 L: l
  98. FC_Cpy_Count_H = FC_Copy_Addr+$05      ;复制长度高位# Q$ [# S  f& r2 {6 H! [1 x
  99. FC_Cpy_Port_L   = FC_Copy_Addr+$06     ;配置地址低位
    4 `% T5 I+ A1 q0 M# x, ~
  100. FC_Cpy_Port_H   = FC_Copy_Addr+$07     ;配置地址高位
    " {4 W" c: N6 d
  101. ;----------------------------------------
    & L& L' \2 l3 B  v1 O1 b1 n! {
  102. FC_MODE_RAM_TO_RAM     = $00  ;复制RAM到RAM模式6 J6 P+ k2 U5 G' ^6 w: Q* D
  103. FC_MODE_RAM_TO_PPU     = $01  ;复制RAM到PPU模式# Z: V5 n* q# f: \- T# e4 E4 k! b
  104. FC_MODE_PPU_TO_RAM     = $02  ;复制PPU到RAM模式
    4 p7 j" J5 C! {$ q
  105. FC_MODE_PPU_CLEAR     = $03  ;清除PPU模式$ R7 ^3 O1 E& z  s1 M

  106. + v/ i1 `% Q$ o* j6 m" s
  107. ;==================================================
    $ F- t. r+ J( v- R1 [7 P
  108. Rom_Nmi_Addr = $FF
    1 N- h3 R7 U" m8 c
  109. Rom_Btn_Once = $F53 w1 ~+ y. b" I) u- v
  110. Rom_Btn_Keep = $F9: c9 F( l5 T, `& h; O
  111. Rom_Pause_Addr = $25, h, {1 I/ v, [- I3 `; ]
  112. Rom_Pause_Val = $015 ~' X% T  @; T3 J7 g& x. g
  113. Rom_Pal_Addr = $07C0' e1 {/ O# u: Z8 K, f
  114. ;----------------------------------------7 B' z1 M& H4 V3 x
  115. Save_Zero_Addr = $6200: E6 G, j: z: r1 p5 c9 {( w- a
  116. ;==================================================0 W& r( ?2 A0 F. I
  117. ;==================================================
    ! c& A, o3 Z$ c7 |

  118. + i* m7 p# P) q8 h
  119. ;程序入口
    ( w3 ^. `" _" \% q
  120. Enter:
    . j) p; J- P, S5 C+ C: Y
  121. LDA Rom_Pause_Addr6 W% t0 Q5 G6 G0 k' X: e5 u3 G
  122. AND #Rom_Pause_Val
    ; I1 M3 o3 B3 w5 k: {& P& w' i2 |
  123. BEQ Quit_End
    7 W0 @0 c9 |: ?9 H1 w; c
  124. LDA Rom_Btn_Once
    1 N# }+ P7 {( |; a2 |
  125. CMP #BTN_SELECT' H2 X$ n! ]1 i4 Z: X0 h$ U
  126. BNE Quit_End
    " m! `! j! _( D$ c8 c( A
  127. PHA% \1 j- u. W2 H% }: b, N
  128. TXA
    , k  Z9 \# W. n0 P( I* N" y
  129. PHA, `( p2 }; G7 i4 }  V
  130. TYA
    3 K) J% H/ M; u4 \- o& |/ @
  131. PHA
    " E5 ^" S/ T7 a3 D
  132. JSR Wait_Sound_Stop
    3 C; k; ^0 S4 J5 }; s0 ]+ Y
  133. JSR Save_Screen
    7 |- p7 n& |9 }
  134. JSR Program_Begin
    ' a- n0 s0 Z& h6 G
  135. JSR Load_Screen( a2 _9 m. ]$ i7 Z: C0 w
  136. LDA #$10
    % j3 F* M; G1 v/ t+ Q: L2 s3 T
  137. STA Rom_Btn_Keep
    8 T; o- ~) t8 t4 h" }% j# E
  138. LDA #$00% }+ ^$ |: Y7 q4 A0 p& W' x
  139. STA Rom_Btn_Once
    6 ^; L6 ]6 x  s- Z" \
  140. Quit:
    % ~2 O4 R# Q6 j6 ~" v
  141. PLA; Z! A2 g( n" U$ N! u
  142. TAY4 N/ ~  t* N. H3 U; _3 ^5 o
  143. PLA
    / G( h! Z- }3 @* a; E) ?* ]
  144. TAX2 J( G- X. R% r. r
  145. PLA
    : c2 f4 O+ M9 B) w5 z& u
  146. Quit_End:3 \, A/ z9 K- _3 u2 \: W
  147. RTS
    ! O" p( _+ v" r7 D8 b9 @( T

  148. 0 w  z' I5 S5 _& u0 C
  149. ;==================================================% Y5 w. m/ v. l2 U3 R! e
  150. ;等待音乐结束
    * Q; E" o3 ~. P- |
  151. Wait_Sound_Stop:
    0 X( ]- s" X* A; z7 D
  152. Wait_Sound_Stop_Check:
    * i7 i/ M* S: Y
  153. JSR NMI_Wait
    4 S; \; e  }0 Z
  154. JSR $F825% Y/ q$ x) W) o$ H2 t7 ]; {& M5 y
  155. LDA $010A5 X) ^! r7 H9 g
  156. BNE Wait_Sound_Stop_Check* B" E7 b' ~# i; b5 O: G
  157. RTS
    & ^& s3 P5 A, m
  158. 1 \% b) m6 ~7 ^/ L4 T5 I
  159. ;==================================================# v- X* n* M" @. I- T& L; j" J
  160. ;保存屏幕数据
    ( D5 C3 }& L# J( b) Z; g' G
  161. Save_Screen:
    7 n  l8 {) B% k2 L+ t( s
  162. JSR Screen_Off2 @5 b$ Q' A  v$ N
  163. JSR Save_Zero
    - f. @7 E' e- M& x  R
  164. JSR Save_Ram; P* _% B/ @: l0 a- ?+ Z- R3 R
  165. JSR Save_Ppu9 B; \! ^/ L( a
  166. JSR Ram_Init
    6 P/ F) j! r7 b/ V& U( O
  167. JSR Sprites_Init. w& M  R. J$ m
  168. JSR Clear_Ppu2 ?5 m0 N: x8 P4 u
  169. RTS
    ( R3 v& b6 N& N$ B5 `
  170. 5 c9 c' m" f+ J9 E/ Z# v3 U
  171. ;==================================================- g4 u: u# l+ s% L2 D
  172. ;加载屏幕数据9 Z) s0 h* S2 D# c7 R7 c5 _: Y
  173. Load_Screen:1 N# e/ A- @* v( P: U& L
  174. LDA #$00
    : P9 L2 B: B" h2 Q, ~
  175. STA $2001
    5 u- Q/ i( C! e, ]1 w5 @$ p
  176. JSR NMI_Wait
    , k/ \. `3 {' l3 d5 @
  177. LDA #$02
    + G$ L) A. }# h0 ~
  178. STA $4014' |! Z' _! k0 @# S# _
  179. JSR Load_Ram
    % c  H9 M: _7 ]* a  t# P
  180. JSR Load_Ppu4 ]2 r& O& P! v
  181. JSR Load_Zero4 x9 X6 d$ t2 N0 Y  e3 r
  182. JSR NMI_Wait: \) b$ A% b& W3 M9 A. e
  183. JSR Load_Palette/ \7 }2 X# J8 R' Q
  184. JSR Screen_On
    / B5 `7 |8 j# P0 G# y) s: X
  185. RTS8 V  ]% ?5 q) p
  186. * U. C( F- R$ e% z
  187. ;==================================================
    ) r+ C+ }$ y0 ~* u+ \
  188. ;关闭屏幕
    , w( C( c0 G$ ^/ V
  189. Screen_Off:) t8 Y3 L! u4 r
  190. LDA Rom_Nmi_Addr' {8 X( ]! H" o
  191. AND #$7F$ U. D: ^' e8 h* u2 I
  192. STA $2000/ N( @: ~, f# M7 y2 w! Y  A
  193. JSR NMI_Wait2 c, _  N* `1 y& }2 n9 x
  194. LDA #$008 n3 G! U. U+ V3 d. M
  195. STA $2000* j) X2 F! L9 @: T" @
  196. STA $2001
    & B8 M* J1 n/ j7 X! ^' L4 m
  197. RTS
    ( R2 v: n/ \( X3 i% I- ~: ^( r! D% J

  198. 3 h6 |% M( ~3 ^! v
  199. ;==================================================
    7 @% {! ^  r% E& ]+ _) [  L( ?/ _4 A# {
  200. ;开启屏幕( U9 }7 d4 H. {& i- D- a3 n7 w9 c
  201. Screen_On:
    1 C7 \) R5 M) A2 @7 y
  202. LDA Rom_Nmi_Addr2 b4 v, g0 A3 w8 M
  203. STA $2000  M3 {6 ^! W1 n9 S0 `& @2 {! N
  204. RTS
    # R6 g. }- E2 n( ^
  205. ; h. ^6 ]% L* O+ s( f+ N: l+ O
  206. ;==================================================
    8 h$ d, W* o2 k& k
  207. ;清空占用RAM
    4 [7 z; c. N4 u% j+ U
  208. Ram_Init:, X4 Y8 E- r- ]; w
  209. LDX #$00
    $ f* L8 E" Y+ p* ?9 M8 b9 ?
  210. LDA #$005 H! x6 s# q1 x8 C; V3 a
  211. Ram_Init_Set:, D0 S: g( h$ \1 e
  212. STA $00,X+ }" \0 k; V+ P; M+ [" x% c9 w/ s
  213. INX# S7 V6 O. n9 |9 a. `
  214. CPX #$40
    / ?8 B: ^5 j, g9 h7 @: L
  215. BCC Ram_Init_Set# w5 I$ X" O& S$ f$ A: o, ?
  216. RTS
    " `9 S3 ^1 C# p3 Y# [8 A

  217. 7 F6 B, m* P' n# {+ x
  218. ;==================================================. V( e6 Y- I. c5 p
  219. ;清空占用RAM8 t9 H! |9 U) B9 w+ q. [
  220. Sprites_Init:
    $ u4 L9 z- x! c3 A" y; Z# `
  221. LDA $2002
    ( b" O5 F3 i1 M: W3 N
  222. LDX #$00
    7 }) x! O& B4 ?. g
  223. STX $2003
    / ]2 V  a2 l4 u: p; a* V- N
  224. LDA #$F8
    9 e6 W* D; Q* j$ b9 O- p, ^
  225. Sprites_Init_Set:8 T6 z+ Q; ?" ?$ q
  226. STA $2004
      q# d" `8 }0 X( Y. @5 A
  227. INX
    - f! ]" F9 ~" f9 L3 w+ Q, S* t
  228. BNE Sprites_Init_Set6 B2 Z! a3 m1 X2 @' L* j% o
  229. RTS
    $ c/ U! z& q0 T8 J0 [: K5 t! g
  230. & t# y& B/ s( i
  231. ;==================================================, }6 i: k- g9 b7 a+ b
  232. ;保存零页数据
    # ]  r6 x# Y% ?3 c
  233. Save_Zero:: o& f9 W: ?$ n* h& A
  234. LDX #$00' b1 c$ p4 W; ^
  235. Save_Zero_Set:( Y( a2 j7 [+ E. A3 x; l
  236. LDA $00,X
    / r) r/ ~1 y$ L! H7 _. g
  237. STA Save_Zero_Addr,X
    : q7 H# L. b$ w  V
  238. INX* i& ^  V$ x/ V& J5 h! c0 N1 U
  239. BNE Save_Zero_Set5 c* |1 R3 h( ]+ h+ q3 M' f1 K
  240. RTS
    ( u) i( o$ I8 o( D
  241.   Q/ X! l" \9 n5 k0 f
  242. ;==================================================, A/ K% S# X$ R8 [, f
  243. ;加载零页数据
    5 Q4 G# X. j* i- i( h- N6 k
  244. Load_Zero:( x( W0 I3 {+ E" S; v
  245. LDX #$00
    9 x% V* {6 D# r2 R* |
  246. Load_Zero_Set:
    ( }9 S! ~" E7 ~; H0 e. ]5 m
  247. LDA Save_Zero_Addr,X
    # f8 M& r7 v4 }+ V
  248. STA $00,X8 N2 g6 r* Q" N! O  W  v2 }% z5 b
  249. INX4 _6 }& E1 o: @, l
  250. BNE Load_Zero_Set! I# b- c0 \, ?7 ?2 i
  251. RTS
    % [, F8 l& Z+ K4 j
  252. , x6 i4 b! ]8 J1 l' V1 n+ J
  253. ;==================================================
    # L0 b; [5 j5 M* q) c8 L) }# i
  254. ;恢复调色板! N5 ~4 c8 Q0 G' ?
  255. Load_Palette:
    - u/ K1 ~8 V9 R. M9 M2 r
  256. LDA #$3F
    0 S( K; [' ^1 O' F6 V
  257. STA $2006* C$ Y- ~) q) W  E
  258. LDA #$001 `$ T& y: o) L. O6 o0 A0 a
  259. STA $2006# Z0 _& q0 ~  [, n* p% T' ?$ l
  260. LDX #$00
    ' E5 j+ o4 [3 i* E
  261. Load_Palette_Set:
    : g; R" K4 l# x7 J1 s) l. F
  262. LDA Rom_Pal_Addr,X
    3 q! Q" _6 V# G. v8 l1 M8 y4 C
  263. STA $2007
    ) y5 h* J) [; C
  264. INX
    9 A9 [3 a  S8 c; i% C
  265. CPX #$20
    5 c/ x0 {! I3 H! K4 t
  266. BCC Load_Palette_Set1 t4 t9 E6 B0 w* M, [8 }5 `* a5 ^
  267. RTS
    ( A) Q  W$ T& Y1 k2 i

  268. + p1 g# U9 G" {# _: O
  269. ;==================================================5 O* j% t1 r" B2 Z. Q
  270. ;==================================================* F9 j6 ^/ t2 t/ _1 E1 n  r/ ~
  271. 8 x7 V! f$ k- M9 |: v
  272. ;==================================================0 L& N; v( }0 a8 k, Q% b/ l
  273. ;程序开始
    & u8 c( O; v8 n2 l5 U
  274. Program_Begin:
    ' @- W- a+ W8 s+ V! g& t# q
  275. ;==================================================
    4 q* j( ]* v. G  J+ T. N) w
  276. ;图形设置" ^" S9 L6 o2 t; E
  277. JSR CHR_Set
    7 P. Z2 K  V. C  S% k% A* D
  278. JSR NMI_Wait/ I; W; T, P' |* s0 v
  279. JSR Palette_Set# L+ e3 m) r+ `: R5 q) k
  280. JSR PPU_Data_Page_Show
    : _, V# {" b' J; s/ e

  281. ! l! r% X4 w7 k
  282. ;==================================================
    ; {  T/ |" d4 L8 }7 T& D2 z
  283. ;开启显示) ^, J% d! z$ f, O
  284. LDA #$1E
    1 w( E2 G, a) I) k; ]4 w- x) S
  285. STA FC_PPU_Status6 }- ]! ]6 V! m( M* c) t! y; K
  286. 1 r9 x& M5 x% a: e, p' R* Z
  287. LDA #BTN_SELECT* e4 K# o5 o! u# T$ o
  288. STA Button_Keep
    " o3 L3 j$ r+ p( j
  289. ;==================================================
    " J- s% p4 J* E( E
  290. ;模拟NMI循环
    4 e" L) ]$ ?( T' P7 \, n
  291. NMI_Loop:8 w0 |/ s$ X% m' r1 g
  292. JSR NMI_Delay. d. `) i( n/ L$ e. h: @5 X
  293. JSR Button_Process
    0 W/ Y6 r* o' z# \, |4 @7 [* G( w4 C) }
  294. JSR Button_Auto_Press
    2 I. _0 n, P1 A7 U1 b& U
  295. JSR Change_Select_Item
    1 y- [$ u* u% q  R
  296. JSR Change_Function
    9 P2 Z* }5 t2 ~5 p
  297. LDA Button_Once
    ' E$ v8 ^3 u4 l1 ?
  298. CMP #BTN_START! Y- t5 g/ R* i) \
  299. BNE NMI_Loop
    4 q/ X4 a9 g+ W/ a' q# H! J
  300. RTS; c; L0 B) h$ E: j3 j
  301. # n& Z- D1 O& |1 |+ o; v0 Z
  302. ;==================================================5 L: a: r+ i4 O/ K
  303. ;模拟NMI中断: [6 i. j. Q% n
  304. NMI_Delay:
    ' e6 b* t- N8 U
  305. JSR NMI_Wait
    ' D8 z7 @; A: l" B' R. r
  306. JSR Show_Select_Cursor
    6 ?5 q+ l/ Q  P: m, V5 w
  307. JSR FC_PPU_Process& x& w$ V9 a* c7 I! p+ O2 R
  308. RTS
    2 [7 }" V) o! M# m' R6 e; a( C
  309. ) E' p( s6 i' y4 m
  310. ;==================================================, t9 D2 Y  `6 X+ @" d
  311. ;等待NMI中断
    8 r# k: d: z( g( d/ T+ ]4 r' p. `
  312. NMI_Wait:
    2 L5 N' u! m" K4 j+ b
  313. LDA $2002; L( p- E' g8 D; A' s
  314. BPL NMI_Wait+ L$ N& I& v; k
  315. DEC FC_Time_Count
      }: S0 O' C2 h7 z) t1 p4 h% k
  316. RTS' _! Y5 v3 r; D! N

  317. % B0 G- t# V9 G0 b+ q- a+ d
  318. ;==================================================* k+ y; b# {2 n5 P: C; s
  319. ;PPU写入模式配置属性
    9 F) r, ~/ L8 ^$ \- e$ B5 M  ~
  320. FC_PPU_MODE_CNTL = $FE               ;带计数行写入; K3 O  H$ v, B! a. n
  321. FC_PPU_MODE_CNTC = $FC               ;带计数行清除
    . n. ]! U; l6 r2 x
  322. ;-------------------------------------------------/ I! K4 |8 a/ l+ `" B
  323. ;PPU处理
    2 l) m% l1 c/ e6 B6 n, Y' ]4 `
  324. FC_PPU_Process:' Y) l* L  B* f  {
  325. LDA FC_PPU_Buffer
    6 K' h! Y7 s9 i- }6 _
  326. BEQ FC_PPU_Process_End
    5 m2 ]5 N6 ^" e9 l
  327. JSR FC_PPU_Process_Beg
    & f4 S5 T% u; J) A+ {( E, P9 n) z* b
  328. FC_PPU_Process_End:) t: j- n& K' k
  329. LDA #$00  c" x4 \. p) ~  n2 n, ^. x
  330. STA FC_PPU_Buffer
    5 c* v- [9 y7 k0 k
  331. STA $2006
    ! `1 h( `* U) C1 E  `6 L0 ^
  332. STA $20067 A$ }, \9 P: }8 H( R) ~
  333. STA $2005
    # v6 w2 s( H* ?2 O
  334. STA $2005
    9 D2 g$ l: Z) {% I) F
  335. LDA FC_PPU_Status( t. X# _, @, X! ^/ U  _
  336. STA $2001! y  D. u' `: E% r
  337. RTS5 Q7 X# c3 e  w$ L# H- P
  338. ;----------------------------------------
    % i) Z8 `$ {, a- R6 ]& C
  339. ;PPU处理开始( Z( `& h4 N/ N0 Q* j4 ~1 D
  340. FC_PPU_Process_Beg:6 Z0 f+ {0 X5 |3 m
  341. LDX FC_PPU_Cursor
    : \' W0 g3 ]$ L! g& @
  342. LDA #$00, G# Z( a: A! j. d7 ]9 v
  343. STA $2001
    % |6 j. S* ?6 E0 U4 \
  344. STA FC_PPU_Buffer,X6 W$ L  J1 Q& ?  M* Q* C4 m, I& c
  345. STA FC_PPU_Cursor
    1 v, n+ }* q$ \. U
  346. LDX #$FF
    / D5 K- B. J0 V
  347. CLV
    0 v) ~& h" y4 `) r3 \
  348. FC_PPU_Process_Mode_Select:, k1 w+ y7 ~% P5 G
  349. INX
    4 \2 ~4 l" v* p5 G9 J6 s1 F
  350. LDA FC_PPU_Buffer,X; y* V* H& p3 m1 @) M- V
  351. CMP #FC_PPU_MODE_CNTL
      k# d, Q* Z- `9 E  M
  352. BEQ FC_PPU_Process_Mode_CountLine
    * n7 k9 f6 p8 f" T3 f4 a
  353. CMP #FC_PPU_MODE_CNTC1 N9 c8 u4 Y/ s4 T
  354. BEQ FC_PPU_Process_Mode_CountClean8 z5 X' T! E2 u
  355. RTS' N9 K4 _* A) F. B) t  A
  356. ;----------------------------------------
    8 Z5 Y% u; L5 L. S+ _! U' A- R
  357. ;计数行写入模式
    - _; D3 w! f* c% M7 E0 |  k. b& U
  358. FC_PPU_Process_Mode_CountLine:
    " ~; R/ _% P# Q4 Y
  359. JSR FC_PPU_Process_Set_Addr_And_Count
    / [2 x: Y1 i6 @: V/ \
  360. FC_PPU_Process_Mode_CountLine_Write:) Z" f, R! R8 y8 X# X
  361. INX
    1 A8 E8 E' `7 c6 H+ H5 A
  362. LDA FC_PPU_Buffer,X* P: g1 \9 z7 n% J
  363. STA $2007
    / X. |- }4 Y% Q+ r4 g+ g8 P
  364. DEY9 f9 j9 S! \5 H' \* M5 _# G3 N
  365. BNE FC_PPU_Process_Mode_CountLine_Write
    + U. P' j3 Q! c) O. l: s( d& v6 a
  366. BVC FC_PPU_Process_Mode_Select
    ! B* P+ N% a: s8 F
  367. ;----------------------------------------
    $ g2 V  @) }/ J
  368. ;计数行清除模式
      f# i3 R  ?  E! `  g7 F
  369. FC_PPU_Process_Mode_CountClean:8 ~5 R3 z8 k0 S, p0 L
  370. JSR FC_PPU_Process_Set_Addr_And_Count
    ' }6 E- i$ ]( n( q4 l4 ^
  371. LDA #$00
    2 M* k8 e2 R) Y  \
  372. FC_PPU_Process_Mode_CountClean_Write:
    % @! X6 w+ S3 T" Y* ]: o+ D( a1 H9 l
  373. STA $2007
    . e7 U7 V6 m8 u' W8 F  M
  374. DEY$ s0 d4 c+ x! n. h2 l7 l" q
  375. BNE FC_PPU_Process_Mode_CountClean_Write
    5 `7 h) Z, z/ y1 u( \$ G9 w1 S
  376. BVC FC_PPU_Process_Mode_Select
    ' F. c  l+ u# [, l
  377. ;----------------------------------------
    ! P5 g: p3 B# J! J$ O& r
  378. ;设置PPU地址和写入计数1 b! W' P3 u% i  z2 i  a8 S
  379. FC_PPU_Process_Set_Addr_And_Count:6 r( v: d% p- B9 @
  380. INX& F- K) X- K9 S; M
  381. LDA FC_PPU_Buffer,X
    7 D) p) m6 X  @  g
  382. STA $2006# b$ q6 W& z4 u+ {
  383. INX
    % e/ Y4 ~4 V0 n
  384. LDA FC_PPU_Buffer,X
    ! p5 s5 f# r4 R8 V6 Y9 s
  385. STA $2006# a7 _" j' A2 n# l  ~% ~; A
  386. INX/ L# F% _/ q+ C" a3 {/ T$ @" \
  387. LDY FC_PPU_Buffer,X4 Q. a6 q5 \2 C7 X+ D/ t
  388. RTS
    0 P& x+ X% {0 C0 Y' y. s) g# Q/ G
  389. 6 [% s! T% r8 r
  390. ;==================================================
    ' S2 D1 O5 o& f& }+ F# ~
  391. ;设置CHR图形
    9 \5 J6 N, W* o5 a* f. U
  392. CHR_Set:  F' V: L# k7 h
  393. LDX #$05
    ( C+ A( T. q/ t+ j( l0 d# f6 H
  394. CHR_Set_Data:
    7 A( S3 W" z; v6 b  Z
  395. STX $8000  K1 m: |4 h4 e5 e! F: f
  396. LDA CHR_Data,x( a, T- `) d, k( Q! W
  397. STA $8001. W* P* o; \6 ^8 b
  398. DEX! z: i  x/ S9 U4 b/ y' y: x8 c
  399. BPL CHR_Set_Data
    ' Q: Q4 M/ ?+ g$ ]
  400. RTS3 Z& T5 X  F, v6 z% C
  401. ;----------------------------------------9 e* H- `7 K6 u" H* J; |! L; `
  402. ;CHR图形bank数据
    4 }0 o) ^! J4 A& @3 M
  403. CHR_Data:* \/ C. t2 l2 \
  404. .BYTE $00,$00,$00,$00,$00,$00
    7 D* e- O4 e( D

  405. 7 R* B5 z' `1 Y" {) X" K
  406. ;==================================================8 R7 I# N( V7 a& [5 l9 t; N& ]
  407. ;背景调色板设置
    ! }; |: i5 |, C9 v; C( e$ L
  408. Palette_Set:; t& F- }. y1 O, s% c; `- R& W2 D
  409. LDA #$3F
      U  G+ L( q1 S
  410. STA $2006* a; a4 G3 s, A  q5 n) s8 O! l7 @
  411. LDA #$00
    & ?* @) L0 Q! P5 H' `  `
  412. STA $2006: a# v3 g8 J' d8 I1 {, u! m
  413. LDX #$00$ _8 M0 K4 \* ~
  414. Palette_Set_Data:+ }  C: F3 |  k7 u5 h
  415. LDA Palette_Data,X. a" o& N& _1 u3 n! d
  416. STA $2007
    * B! j5 J9 c* y, k. j
  417. INX
    4 s" O8 E1 d8 k" K$ Y4 n
  418. CPX #$20+ \: m; ~, r; }7 Y+ @
  419. BCC Palette_Set_Data: C% P+ b1 o8 h  v( [. W( x
  420. RTS9 Q' _) ^9 R2 ^, H" _
  421. ;----------------------------------------: p! x: e& r' W7 V! r
  422. ;背景调色板数据! |0 e( h4 I0 |* `% G
  423. Palette_Data:
    " L5 y4 Y/ J5 S+ ~
  424. .DB $0F,$29,$24,$24,$0F,$20,$20,$20,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    7 T: N1 J! X* b# ]: N* }
  425. .DB $0F,$20,$26,$16,$0F,$24,$24,$24,$0F,$26,$26,$26,$0F,$2A,$2A,$2A9 s6 A& W3 m% m3 h  V: Y
  426. / A, G% C' ~* P  |, z
  427. ' E" \5 c4 g  x: a) l4 n  W
  428. ;==================================================
    7 f* w$ p( v" ?% \9 e. P! z
  429. ;按键扫描3 t  }$ l* H# a
  430. Button_Process:
    * z* k. T  e2 P; I1 z, O* n
  431. LDX #$01
    1 c8 T. ]! a) L% b1 w
  432. Button_Process_Beg:4 W# F& y3 L7 h% [3 t
  433. JSR Button_Scan0 q5 @& b8 o& g' j2 t
  434. LDA Button_Keep,X
    & h- A" x" y) n1 D; m8 N
  435. STA Button_Temp,X& S. u  ~. e5 S4 D, S" C& e
  436. JSR Button_Scan
    ; G! p3 W8 c3 r* ^$ W' o
  437. LDA Button_Keep,X& W- C/ x6 t! k' V: P  ]* u! ~& ~
  438. CMP Button_Temp,X& O* w) o5 C2 T6 a+ S
  439. BEQ Button_Get_Once" J# M, X3 O0 a0 Z% l" D
  440. LDA Button_Buf,X2 Q7 P0 R$ G$ o0 j
  441. STA Button_Keep,X
    , \9 t1 M7 H! o9 F* @1 R2 c5 D
  442. Button_Get_Once:
    1 z- K' r; j5 `
  443. TAY6 f+ ^7 @6 ~/ t3 t5 \' K: z
  444. EOR Button_Buf,X" i$ e! C6 Z! ?( d( H
  445. AND Button_Keep,X' J1 M8 y3 Y9 u# o! ?
  446. STA Button_Once,X" B$ c. d4 J3 H5 P6 N" O
  447. STY Button_Buf,X3 x4 s  ^& N* X! g0 V& s7 K! ^) \
  448. DEX
    - M: X' O* H1 d" I7 K5 q
  449. BPL Button_Process_Beg
    2 o! {& N5 F0 U. i. E  r
  450. RTS" C2 M' ]& h6 Y7 n* X: b4 Z
  451. ;----------------------------------------
    ; q, |7 Z" h- P( |- k& [: V( G! F9 M
  452. Button_Scan:( a& Q9 R- P) ]+ l8 _9 o  @# L. H1 \
  453. LDA #$01
    & r* g% H2 ~" a/ X  r- J* ~
  454. STA $4016" b* r( `8 ^) {0 u; j
  455. LDA #$00
    " l; f: C2 H* W, d& V$ `+ r6 N
  456. STA $4016
    & C1 X. _9 }) ^
  457. LDY #$08
    4 m6 r8 k) }7 g, b
  458. Button_Value:* f" T/ s8 B2 Q, I8 q
  459. LDA $4016,X6 a* \( A3 w" Q. h$ O' h
  460. STA Button_Status,X
    8 o$ p* `; ~0 R0 e+ Q7 B
  461. LSR6 h  C7 O+ v7 j3 j- O6 |) ?
  462. ORA Button_Status,X0 p' ]0 m: X+ t: }
  463. LSR
    $ E: v! \9 z% m7 @
  464. ROL Button_Keep,X" P% |  f7 h) h( X" I% m
  465. DEY
    0 t% d. R' X3 t3 `& W: r" T
  466. BNE Button_Value* F' J) Z3 W& a) r% H, b/ E
  467. RTS
    . V& O/ F" z  V! `( V

  468. - ^, Y0 k4 P1 ^
  469. ;==================================================9 H6 v2 s8 ?  x* u3 M: F
  470. ;按键自动按压
    3 o! N8 l. ]4 _; U; k, G/ _% K
  471. Button_Auto_Press:
    3 x4 Y6 Y/ u* [/ p' N9 F
  472. LDA Button_Keep% T7 `2 V: ]9 Y% @- a1 @
  473. ORA Button_Keep + 1
    # A; n- t3 r) V2 e/ l
  474. BEQ Button_Auto_Press_End
    ) A* V! X) y$ s5 Y9 q1 E/ b
  475. INC Button_Auto_Delay
    8 K/ c- _3 D, t, W' g% i
  476. LDA Button_Auto_Delay' S9 t0 o! |  E9 f
  477. CMP #BUTTON_DELAY_MAX
    7 J& O1 K3 i$ U7 Z; v
  478. BCC Button_Auto_Press_No_Active
    $ A8 v& F9 m+ P& S9 W
  479. LDA Button_Keep
    1 _' V# a0 w3 E$ j! y. V$ J/ g! J' U
  480. STA Button_Once
    3 a, o5 I; G! I& u
  481. LDA Button_Keep + 17 D6 F! h  J) X9 v: Y2 v; g
  482. STA Button_Once + 13 E, e- z) l$ I. W2 N; |
  483. LDA Button_Auto_Delay
    + L+ [1 ~7 G* q1 m
  484. SEC4 ]8 \6 f2 P% [
  485. SBC #BUTTON_DELAY_SPEED7 J# o) i, c  g
  486. STA Button_Auto_Delay6 K) z2 g  t- r. E
  487. Button_Auto_Press_No_Active:
    8 Q  P$ p, B; a3 u
  488. RTS
    ; G4 v# S3 E' u: T' n7 E( r
  489. ;----------------------------------------9 R* U4 Y6 s0 V
  490. ;未按压按键+ B' m" u, S% F1 v/ I
  491. Button_Auto_Press_End:
    ' m2 j3 ]- s1 q
  492. LDA #$00
    8 d8 N& V! Z0 w( B& l4 u! r
  493. STA Button_Auto_Delay
    5 b8 q3 W6 ?; c, ?" d9 x% S
  494. RTS% O6 A8 c4 P" C
  495. / r$ B1 \2 Q( _( C
  496. ;==================================================
    , j: Z6 Q5 o9 X' Y1 T/ ]  R
  497. ;设置PPU写入模式, A) V1 b7 Q) v: l# q0 A
  498. Set_PPU_Mode:
    & |) o( k- @; w( J* g2 X
  499. LDX FC_PPU_Cursor
    2 R0 }$ b. X! E
  500. STA FC_PPU_Buffer,X
    . H7 h5 Z3 u% z% M: ]; D
  501. INX) t8 p# s1 E2 W1 r8 \# O
  502. STX FC_PPU_Cursor
    # q9 G2 |, U9 Q/ @
  503. RTS
    % `# \) S/ t* {+ G& j2 s

  504. ) y+ g% g2 v2 |. ^9 v- O, d3 @2 `9 l
  505. ;==================================================
    9 q: N$ D0 Q( f- y3 ~' k# l
  506. ;写入单独一行文本: y8 A# g* @7 z& V" s- ]4 q4 r% B
  507. Set_Select_Addr:) e- I( _* y; l4 R8 X
  508. LDX FC_PPU_Cursor' t4 C9 X" W% t; s9 }  h
  509. LDA FC_Select_Temp- S" j9 b; d  Z
  510. ASL7 }8 k  L3 Y" ~* k6 ?' e) d. V
  511. TAY
    2 k# l6 @1 p6 Z
  512. INY
    & W/ D( O/ J6 t; i# M# A
  513. LDA Text_PPU_Addr,Y
    ! a7 f$ B0 r! U! F5 |6 b0 I  S
  514. STA FC_PPU_Buffer,X
    - s- `" j# L; l6 a" T$ G
  515. INX
    " U$ A5 ^3 v9 I9 X' t
  516. DEY
    7 g0 `2 V5 L0 M8 |7 o
  517. LDA Text_PPU_Addr,Y
    3 m+ L  m; i9 o0 }2 G& D
  518. STA FC_PPU_Buffer,X/ i6 v' R" @$ m7 M+ P# L
  519. INX
    4 j+ R" N' X/ \
  520. STX FC_PPU_Cursor
    - t3 L0 w/ y( k' X+ z6 t
  521. RTS' d& W, m6 p6 [" p. |
  522. : C7 Q7 ^/ |! d0 O( \( O& i
  523. ;==================================================8 c% }! b# s6 r0 _* Q3 T% p8 e
  524. ;写入单独一行文本
    3 g  C, p- j) H% ^: N
  525. Set_Select_Data:+ |7 l- D5 ^6 \% L+ E. P
  526. LDA FC_Select_Temp  N4 [; G6 p5 Z; Q/ _
  527. CLC6 ?, J  u; }0 I1 H8 E8 `
  528. ADC FC_Page_Cur  R' q4 y2 F+ _3 `! Z5 Z: C
  529. ASL; E! @* [3 T2 @- s4 \' t
  530. TAY
    ( v0 F2 f3 u8 \& S/ l* P0 I0 G
  531. INY& ^- J" e# ]0 t# V/ K, L
  532. LDA Text_Data_Addr,Y6 }" q5 Q0 ~/ k7 W: s7 v
  533. STA FC_Data_Port_A_H
    ! s% @) W7 }- n9 V) i
  534. DEY6 i- R% f% w$ W5 |3 H$ J/ }" D
  535. LDA Text_Data_Addr,Y# F5 d" F( o0 ]
  536. STA FC_Data_Port_A_L
    1 a  j- g0 u2 X1 W5 Y
  537. RTS
    ; O/ h8 M) L3 h) }8 b4 w3 W

  538. 4 x9 g( X2 @; v$ o9 F; J* ^! H5 j
  539. ;==================================================. ]  ~& }0 w* J8 J4 r) y
  540. ;清除旧文本
    ' s; T5 ~; N2 q) L6 o6 [
  541. Set_Select_Data_Clean:% n- C5 ]% z- x( s2 @8 T
  542. LDA FC_Select_Temp  w# r8 q2 v* [  u0 e) E0 Z* l- \
  543. CLC# i4 w$ }# s  b+ L0 _
  544. ADC FC_Page_Old4 q8 {9 L" E# u& c6 M/ L
  545. ASL5 z$ B( E; P/ q/ ~' a2 G; N
  546. TAY3 G' @; M# i* L, e
  547. INY
    2 ?6 p9 K- S" z) [2 L! a3 u. M- J3 m
  548. LDA Text_Data_Addr,Y
    # m. @9 |1 L; h! w
  549. STA FC_Data_Port_A_H+ t& x1 h2 m! Q% a% }9 N
  550. DEY
    ; }4 ]$ \: B2 n8 i$ B
  551. LDA Text_Data_Addr,Y: ]3 o. n# S1 U: i2 O+ o1 K- C
  552. STA FC_Data_Port_A_L0 g- d" q& v" `/ |
  553. RTS
    " B& |5 u" d8 T  y8 y3 o

  554. % W( c7 a+ o5 @( Q; t
  555. ;==================================================# h3 ]  a, W1 a
  556. ;写入单独一行文本
    ! i& C  L% ~+ G# D8 J/ S) I7 G
  557. PPU_Data_Write_Item:
    9 K: C$ n$ S3 D! L
  558. LDA FC_Select_Temp: g6 O8 J7 l  i, p+ v
  559. CLC
    6 ?' a9 C; p: H. _7 H
  560. ADC FC_Page_Cur
    7 Q+ F) ^" u3 y0 U$ o
  561. CMP #FC_ITEM_SUM
    6 Z/ y7 w( _! |0 `6 y. c
  562. BEQ PPU_Data_Write_Item_Set/ K( ~1 ^3 s+ k8 j. g9 B
  563. BCS PPU_Data_Write_Item_End2 M: V/ z' G" d% j
  564. PPU_Data_Write_Item_Set:# H5 k+ q8 f2 L. D3 X. c8 e1 m
  565. LDA #FC_PPU_MODE_CNTL  K+ P2 q) X$ o
  566. JSR Set_PPU_Mode! w! L6 \0 S- {
  567. JSR Set_Select_Addr3 f  Y# ^7 a" l4 V  D; E
  568. JSR Set_Select_Data
    # T- K  m# D9 Z( F& G( d+ g0 z
  569. JSR PPU_Data_Write_Line
    $ d3 Y( s2 `6 ~2 _: t
  570. PPU_Data_Write_Item_End:
    & t+ X! m- A  Q/ E# r' ]
  571. RTS# j7 T# A2 J8 Y5 Z1 Z8 \' k$ w
  572. % \# M4 S( L9 M; r% d, j, V1 \
  573. ;==================================================- N) A4 B+ X1 O  o' `
  574. ;清除单独一行文本
    4 M7 A1 x& B5 s" E* a5 y
  575. PPU_Data_Clean_Item:
    0 b" l( \( @# Q$ k6 q& O
  576. LDA FC_Select_Temp
    % w5 j' |: y6 C- R! A
  577. CLC
    4 L- I$ k. w& e0 h4 Y2 O
  578. ADC FC_Page_Old0 F" ?. U0 P1 n( K. l9 r9 ?5 f
  579. CMP #FC_ITEM_SUM
    * E; t+ |5 D! v3 @; m$ t
  580. BEQ PPU_Data_Clean_Item_Set
    3 J& s8 `# |" I: A# p) }/ C) w, R5 w3 ~
  581. BCS PPU_Data_Clean_Item_End
    3 J% o5 G* ]' b* K7 S' G3 b
  582. PPU_Data_Clean_Item_Set:
    3 @: d+ y: ]/ x. X0 s
  583. LDA #FC_PPU_MODE_CNTC1 q% W) {, c( b
  584. JSR Set_PPU_Mode
    " L& Z0 l2 O! P% @
  585. JSR Set_Select_Addr7 `+ A* S- M; \4 b6 H6 J
  586. JSR Set_Select_Data_Clean" A7 @3 |7 A' P" y
  587. JSR PPU_Data_Clean_Line
    4 G: _3 o5 U2 ~& E5 m- d( K
  588. PPU_Data_Clean_Item_End:
    : {* a& c$ x' o9 f
  589. RTS
    & ]$ Z7 }% n- u6 @
  590. 9 K5 t& ^+ g) |4 O8 V/ ~$ T
  591. ;==================================================
    1 W* S& L* ?3 `7 ?
  592. ;页内容写入! y8 _) R* L# N9 u* C
  593. PPU_Data_Page_Show:
    % H  @/ j) }* p# d  e9 l; ?
  594. LDA #FC_PAGE_SIZE: T# X- h) E- }
  595. STA FC_Page_Item_Count5 z: R+ b1 g8 r" T
  596. LDA #$00
    # ?8 m# V7 K2 J
  597. STA FC_Page_Item_Buffer1 n! W& @1 N' h) Y& j, Z
  598. STA FC_Select_Temp
    7 l! v, F; c1 F1 K7 f; g1 s
  599. PPU_Data_Page_Item_Set:
    - S# q1 e# }' z3 ~5 P
  600. JSR PPU_Data_Clean_Item
    , `5 w% D, W2 I  t, O% K
  601. JSR PPU_Data_Write_Item! [1 |4 g( n$ Z- {3 I& G9 P
  602. JSR Function_Status_Clean
    ' @2 P. Q; S0 E/ C
  603. JSR Function_Status_Show* q8 w5 I8 U, O. Y* `: V
  604. INC FC_Select_Temp7 v* M- J4 a( y. R5 I& T! `3 _
  605. INC FC_Page_Item_Buffer
    3 s& d1 H  p& s; g
  606. LDA FC_Page_Item_Buffer
    ' C) d1 N- [6 V& J. C9 S
  607. CMP #FC_PAGE_BUF_SIZE
    5 U& S6 d# ]2 z/ f5 l0 s
  608. BNE PPU_Data_Page_Item_Set_Check  v$ }7 S1 A1 o& ]8 B
  609. JSR NMI_Delay
    ; Z" m9 N: ?& h* A( M1 k8 K5 {
  610. LDA #$00) g$ i) t0 S+ l0 ?! [( r0 k
  611. STA FC_Page_Item_Buffer
    # P* B% g6 ^0 Q$ S) I5 L
  612. PPU_Data_Page_Item_Set_Check:- T8 |9 E/ d. v& z: M7 F$ {
  613. DEC FC_Page_Item_Count% E4 A: e/ h* O& A. n0 }* \
  614. BNE PPU_Data_Page_Item_Set+ K  H) t3 B) l0 ]0 x9 O" Q
  615. PPU_Data_Page_Show_End_Check:0 s( K) Z. H' I- i7 Q
  616. LDA FC_Page_Item_Buffer
      Y) `' ]9 g& {7 s4 n
  617. BEQ PPU_Data_Page_Show_End
    7 Q0 ]% D! P, R( p% m3 I6 o
  618. JSR NMI_Delay
    / X. Z2 H" }8 s: h6 `! Q7 W8 q
  619. PPU_Data_Page_Show_End:
    ( q1 a, b- ?, h5 G9 D) X+ V
  620. RTS6 o! i* u+ i8 B9 g0 @2 }: J

  621. 5 @+ h7 y- `5 [4 v) C( x; _
  622. ;==================================================( t3 B7 O1 Y+ w9 A( m
  623. ;PPU单行数据写入接口
    " w1 [* a* f- m9 ?7 P' H2 w
  624. PPU_Data_Write_Line:
    + {+ ^: W* P! R& ]. f+ f5 K* `
  625. LDX FC_PPU_Cursor  B# J2 u4 w6 t  z) [
  626. LDY #$00
    1 q6 L8 A! E. k' Z  M4 Q
  627. LDA (FC_Data_Port_A_L),Y: }' N. B7 l# @0 s% I
  628. STA FC_PPU_Buffer,X) O4 J* @  k" G: m1 y) G2 p
  629. STA FC_PPU_Data_Cnt3 O! P1 m; x# K7 v
  630. INX. y0 t6 j3 ^8 Q
  631. STX FC_PPU_Cursor% b3 Y! K2 E. r8 ]5 r. u
  632. INY$ [. V  s' d8 W  g. P
  633. PPU_Data_Write_Line_Set:
    , [. |* }4 g% E' J! i
  634. LDA (FC_Data_Port_A_L),Y( u6 [1 Y! N2 d% _' j. r7 ]
  635. TAX
    / u" Q/ V  Z4 {2 o  Z' H
  636. LDA Char_Rom,X
      W& e* u/ Q& _+ P- A
  637. LDX FC_PPU_Cursor# Z$ r+ d+ `# n) u) k
  638. STA FC_PPU_Buffer,X( D, i/ l. c- O" j- }
  639. INX* J/ @) S" s: W: g% P  O
  640. STX FC_PPU_Cursor, M/ n5 ^  [9 ^6 b/ p! _7 o
  641. INY
    / ]% F' [8 r  N% q, O! [& L
  642. DEC FC_PPU_Data_Cnt* g0 t* o* n+ L& ?  B( r* _
  643. BNE PPU_Data_Write_Line_Set
    5 F& g" r: J2 Z' E5 M# T
  644. STX FC_PPU_Cursor, u6 N+ n* f/ a7 Z! ]6 J" r
  645. RTS( A, H6 s3 D' T2 K* d
  646. 9 u6 z" |) q1 Y- B+ P
  647. ;==================================================0 f, {% _' ^5 J4 x8 J
  648. ;PPU单行数据清空接口" x1 r. M1 s: \9 D" F( s8 i9 k# ?- e
  649. PPU_Data_Clean_Line:
    - H/ b, j1 z. x) F/ K
  650. LDX FC_PPU_Cursor/ W9 r. t4 V9 R9 Z
  651. LDY #$007 K, w; }) F1 S* i
  652. LDA (FC_Data_Port_A_L),Y
    ; F4 S! s' e# B
  653. STA FC_PPU_Buffer,X
    # I3 Y& J% W9 l8 t2 Q
  654. INX2 A8 s7 Q' V% b6 T7 O: K: W
  655. STX FC_PPU_Cursor" l4 m3 y, M: X& U- e2 ]
  656. RTS
    5 X/ I; ~5 b5 G( w+ [2 B% q
  657. ; L6 c3 F* P3 P* L9 w
  658. ;==================================================
    + z9 X) I7 @: G! u6 U8 V- ^0 L3 x
  659. ;更改选择项% _  l* L/ X8 z6 N  c) T
  660. Change_Select_Item:
    4 R: Z6 Q+ P  `$ O5 r3 W/ H# u* a" I* O
  661. Change_Previous_Page:# D. N9 e# Z' ~4 F' o  A7 z1 w# o6 X
  662. LDA Button_Once
    ! n- }4 e* s- W6 `0 A8 d+ Z
  663. ORA Button_Once + 1: z' u0 \, p- ^# p$ e' ?1 x% ]
  664. AND #$02. j/ G/ @( g4 ~
  665. BEQ Change_Next_Page2 x6 Y: p& v9 {. J3 c+ S) ~
  666. JSR Change_To_Previous_Page
    , ^2 ^  U6 X4 P# d) U' J
  667. Change_Next_Page:
    & t, R3 v* S# h7 j- K
  668. LDA Button_Once
    + ]3 v: Q: P' o
  669. ORA Button_Once + 1% i$ W; _3 m* N! h" r3 S
  670. AND #$01' e. p9 \* A' Y2 c2 G9 G
  671. BEQ Change_Previous_Item0 D% Y, C8 Y  G$ t
  672. JSR Change_To_Next_Page
    4 `, @+ h3 H) k& H
  673. Change_Previous_Item:2 T( {7 L) g0 U* O, J& L) B: _, }
  674. LDA Button_Once
    3 Y5 |, o% A/ Q; J* p* d
  675. ORA Button_Once + 1
    2 o6 H0 B/ K. n' g9 o+ x3 W
  676. AND #$086 {( O$ U6 S' O6 P. z* X
  677. BEQ Change_Next_Item( P; L7 S( `8 w0 q' m
  678. JSR Change_To_Previous_Item( I9 y. A7 p7 @, o1 W/ h) l
  679. Change_Next_Item:
    - x! g6 P: x3 G4 g' n8 a
  680. LDA Button_Once
    # ?5 {- l# L' q. |- a. L
  681. ORA Button_Once + 1
    3 x8 @8 P7 t: R, F" }
  682. .IF FC_IS_DOUBLE_PLAYERS
    $ ~( \0 s4 K/ y& y. T9 b+ a7 i
  683. AND #$04
    - [6 F0 N# e& O4 I. {
  684. .ELSE
    & s+ T4 w" c7 F& P- o
  685. AND #$248 J% q2 }; l( [' m1 i" x6 i; c
  686. .ENDIF) |+ U. c4 _# p- x5 X" Y4 u( c
  687. BEQ Change_Select_Item_End
    0 ?$ o, F9 J7 e2 ?# Y2 Z; |0 Z" s( D8 k
  688. JSR Change_To_Next_Item
    ) V% d& z9 Y0 C8 L" \8 \+ r( o# `$ b+ O
  689. Change_Select_Item_End:
    - u. B! b" |# l0 G6 x  M4 ]
  690. RTS. _3 X2 J8 L( m+ Y# `/ A
  691. $ \* `8 o! _9 _( p/ S7 ]8 y! [; b
  692. ;==================================================
    4 z" ?+ }/ h. p* p: O
  693. ;切换到上一个选项9 ]+ P9 Z; _" L  U5 ?2 h- }
  694. Change_To_Previous_Item:
    1 q0 o; n' n$ R5 M. ^8 |, \
  695. LDA FC_Select_Index
    ! X/ ?3 h' l6 l
  696. BNE Change_To_Previous_Item_Set. v* N; y% }: H3 R7 S; H8 a9 U
  697. ;----------------------------------------
    5 }7 ]. N- z) y$ m( s' ]: g
  698. ;切换到末页最后一项# l7 ^* I1 ^& {# p
  699. Change_To_Previous_Item_Set_Last_Page:
    7 R' G) A0 V! ^+ \
  700. JSR Record_Last_Page_Index
    5 T; d: @7 t1 C. c6 r: g! f+ {
  701. LDA #FC_ITEM_SUM
    - @) V' O% s, ?0 e
  702. STA FC_Select_Index8 b* M+ I8 w7 {6 Y- Z$ [2 w$ Q
  703. LDA #FC_PAGE_MAX! J4 k- F- r+ V2 u: ^7 G/ O+ d0 C8 n2 i
  704. STA FC_Page_Cur3 N6 i3 R' I$ ^# t7 a- {
  705. JSR Update_Page_Content
    ' r" U' U% v1 {
  706. RTS! u5 A1 x/ ^; t- T! z
  707. ;----------------------------------------
    & t' Q  N7 Q. g* L3 W
  708. ;切换到上一个
    & w9 W4 ~8 @2 _% E! f/ t
  709. Change_To_Previous_Item_Set:
    : W& `; x# C1 b+ r# M6 p" e
  710. ;检查是否需要换页7 D: z' `. o; _4 a; e( {5 p
  711. LDA FC_Select_Index' u: I# l3 }4 {1 Q. L
  712. CMP FC_Page_Cur6 G& c$ e  W4 e4 _% y' a
  713. BNE Change_To_Previous_Item_Set_No_Page
    ( Q7 b  }. m& G% c( k2 [3 H
  714. ;----------------------------------------3 P% R8 }* r8 J9 X! l0 p
  715. ;切换到上一个(需换页)
    . V, f% h5 P1 n- f- I4 t2 p
  716. Change_To_Previous_Item_Set_Page:% ^) T, O. L1 F- j& [3 ?: P4 n
  717. JSR Record_Last_Page_Index, P' A. Z! y* q0 _
  718. LDA FC_Page_Cur
    3 ]; X5 j; W+ n, @9 k" k+ A$ ~
  719. SEC
    : Q8 E, m4 g4 z) i3 }! u4 {
  720. SBC #FC_PAGE_SIZE; s# ~- _  g4 h% ]7 s; {
  721. STA FC_Page_Cur9 G4 J; B8 w! K) Q* p9 Y
  722. DEC FC_Select_Index& y- C; {- V9 a
  723. JSR Update_Page_Content% m9 K- n* S; i4 ?( j  \; \: j
  724. RTS
    ( n8 h8 b! V5 d8 F4 P) ^. l% S
  725. ;----------------------------------------' l3 S7 n# N& L5 a4 S+ f. u
  726. ;切换到上一个(无换页)" d3 [) q1 P  w4 b& u) U) F: }5 N8 E
  727. Change_To_Previous_Item_Set_No_Page:" ]2 x% @3 Y5 [) W8 ^; Y
  728. DEC FC_Select_Index* d8 y' y8 E0 I4 M# |1 `
  729. RTS
      E* I. c4 P+ m; e) R7 O6 S" x
  730. ' r3 [/ \1 w. c/ L
  731. ;==================================================
    $ N# S6 |4 d+ [: ]
  732. ;切换到下一个选项
    2 N% o$ E+ D" I6 z5 K/ W
  733. Change_To_Next_Item:
    ! E0 }1 `! F: @9 R5 A4 o5 S
  734. LDA FC_Select_Index
    ) g! Y; t9 i' T  I2 }: }" F
  735. CMP #FC_ITEM_SUM' R! S7 e9 e4 t: p5 T$ ~2 V# J
  736. BNE Change_To_Next_Item_Set
    & x. w0 K: ^7 G, T0 U
  737. ;----------------------------------------
    7 b  `" I4 O$ x4 X% |
  738. ;切换到起始页第一个
    - B! }! V+ R0 q. u+ v% f# F
  739. Change_To_Next_Item_Set_Begin_Page:$ ?3 l  l3 c: u/ E
  740. JSR Record_Last_Page_Index
    8 T3 ?! u. ?, ^6 L' v& b' ?
  741. LDA #$002 R. T0 x1 F  D
  742. STA FC_Select_Index1 {; {! G: X* V7 ]( o) Z8 M& N" g! ]
  743. STA FC_Page_Cur/ h) }" s1 G7 l( E! S; B2 J
  744. JSR Update_Page_Content/ ?' ^( ]& E6 G& y( D! E" P
  745. RTS
    8 a$ P5 C1 o4 n8 V* A* A6 T
  746. ;----------------------------------------
    / Z( ]. \4 a2 [; Z) }: P
  747. ;切换到下一个) @% N! R% I/ x! V4 A
  748. Change_To_Next_Item_Set:! m! U9 x2 b1 P* ?  D& }% E! T( U
  749. INC FC_Select_Index
    6 s: y6 g2 E! d  o! m: \9 u4 N7 h
  750. LDA FC_Page_Cur
    5 K# H) S# j6 c9 L6 _0 u
  751. CLC3 T/ f% }8 c/ o
  752. ADC #FC_PAGE_SIZE
    0 q5 L3 ?4 y# T9 _" p5 ?- w
  753. CMP FC_Select_Index
    1 J! N  Y) ?9 m9 ?+ D( v$ }' F
  754. BNE Change_To_Next_Item_Set_End
    * H6 K$ `3 P3 g4 u; ]9 J6 e
  755. ;----------------------------------------
    4 Q3 P2 I/ x" ^/ j! L+ x
  756. ;切换到下一个(需换页)* ]* }" f1 j  T
  757. Change_To_Next_Item_Set_Page
    / d" _- G! ~7 `3 F" y
  758. JSR Record_Last_Page_Index
    ! W) A- p; l; Z$ S; f* Z3 U
  759. LDA FC_Page_Cur4 E5 w7 O- d" L; a
  760. CLC
    & M  F2 `! g2 e2 t+ x/ O1 t( W
  761. ADC #FC_PAGE_SIZE
    * @/ X; `' v! X! P0 o0 o1 ]- _
  762. STA FC_Page_Cur
    ! a& y' d, W# z/ Y
  763. JSR Update_Page_Content
    ! g6 }/ F# ?5 O! B+ O, U
  764. Change_To_Next_Item_Set_End:
    6 V0 Y( d& L- j) \0 D, K0 j
  765. RTS2 C9 J. B6 U9 X. ~; g! |9 f" t
  766. & ?' J1 \9 k( o. h- O8 L$ f
  767. ;==================================================
    " j% {) T, h. U# q' Z
  768. ;切换到上一页- Q5 ]+ P5 v5 c5 F6 ?1 V
  769. Change_To_Previous_Page:/ B% q0 ]3 a- n8 a3 ^
  770. LDA FC_Page_Cur
    ! q: ^) ^  S9 O( B
  771. BEQ Change_To_Previous_Page_Set_Last_Page: Y* K3 R) q" T0 K3 J0 r
  772. JSR Record_Last_Page_Index) d4 m9 T6 Z# T4 t- J
  773. LDA FC_Page_Cur
    6 t0 b* w: V3 p0 Q. }5 J
  774. SEC
    + C9 o" ~+ U9 k% w0 y$ Z) U+ k
  775. SBC #FC_PAGE_SIZE3 i* ?  V2 j8 _6 [4 h  R6 r
  776. STA FC_Page_Cur
    * }1 ]9 @( f+ W1 K3 a
  777. LDA FC_Select_Index, \0 N! O5 h  h& b6 `2 ]
  778. SEC" S7 s8 n; D. A( O' @
  779. SBC #FC_PAGE_SIZE1 C' u/ D! M1 d' i
  780. STA FC_Select_Index
    2 U- |! U( Q2 }( y" I" M
  781. JSR Update_Page_Content
    # c3 D& S3 p8 Y) ~- y
  782. Change_Select_Last_Page_End:
    - |5 C' U3 _9 ~9 M  F
  783. RTS% t- Q. N9 W  d7 D+ m) T) {5 n
  784. ;----------------------------------------
    9 ~7 {- X, D" B! e1 e
  785. ;切换到最后一页
      N8 H& h: O8 c" N$ A. K
  786. Change_To_Previous_Page_Set_Last_Page:& m5 I% m7 g$ Q9 R* X
  787. LDA #FC_PAGE_MAX- j- r* l- K3 Q
  788. BEQ Change_To_Previous_Page_Set_Begin_Item; p, K1 Q! ^; k  ?* m
  789. JSR Record_Last_Page_Index
    * C9 F) {! D4 [8 s" @5 f+ x4 u
  790. LDA FC_Select_Index3 h) O* c, L5 ?; H" p
  791. SEC
    / l- Q7 k+ I) f9 s( S
  792. SBC FC_Page_Cur
    % X2 C* j( _! v4 F" W
  793. CLC
    % {% ~9 m9 @6 [3 n3 q  a
  794. ADC #FC_PAGE_MAX
    ) j7 Q& z/ k8 F
  795. STA FC_Select_Index- n5 L$ r. ~% @( q( Q$ \2 J2 l9 p: p
  796. LDA #FC_PAGE_MAX
    , x& `% }% u+ D( d
  797. STA FC_Page_Cur; Y' H4 F9 z& P
  798. LDA FC_Select_Index
    ! S. d2 g( P, \
  799. CMP #FC_ITEM_SUM
    % b8 ^5 Q9 s/ n: c6 s
  800. BCC Change_To_Previous_Page_Set_Last_Page_End/ I& W) w% c. D7 J4 e- e3 ?  w4 v
  801. ;----------------------------------------
    3 ^+ E$ `; M& c, a: V* N# k. ~
  802. ;切换到最后一项4 z3 ?$ _+ W4 Z- N, W5 g9 f
  803. Change_To_Previous_Page_Set_Last_Item
    6 c1 N+ l2 _6 T% _# |
  804. LDA #FC_ITEM_SUM" m1 R! ^/ P3 x' {. G, n
  805. STA FC_Select_Index
    ( g+ M7 `: i; V' H
  806. Change_To_Previous_Page_Set_Last_Page_End:$ H5 B. I' b7 L
  807. JSR Update_Page_Content5 I) v5 \+ n, F, x, e  `- `# S
  808. RTS
    6 D$ ~4 u) n8 [) u
  809. ;----------------------------------------
    ' V4 [: G( ~9 i' b8 x
  810. ;切换到起始项(最大页只有一页时)% L+ e- V" D( A/ Q
  811. Change_To_Previous_Page_Set_Begin_Item:8 I& ~. \) c1 h$ Z2 M
  812. LDA #$00
    * c' z% z8 D. _( i( ^1 R
  813. STA FC_Select_Index
    , j5 d1 G3 C4 Q, z. H
  814. RTS" I  Z1 [7 x/ G) l: |

  815. ( B2 b1 a! u" w' w, O) ~
  816. ;==================================================
    : l% H3 K+ Q% f- O2 M
  817. ;切换到下一页
    : _+ n4 q" J4 ^# i2 n
  818. Change_To_Next_Page:2 D! X/ U& ?+ D2 i1 e
  819. LDA #FC_PAGE_MAX
    ) E. F, _$ g& X# B
  820. BEQ Change_To_Next_Page_Set_Last_Item
    , [) U# q6 [$ r/ t# b6 g8 E
  821. LDA FC_Page_Cur
    $ B0 |1 N5 u( w7 ~# `" R9 `
  822. CMP #FC_PAGE_MAX
    7 C4 b  \% q& U/ E9 R5 E
  823. BEQ Change_To_Next_Page_Set_Begin_Page
    5 O% c0 R: Y( Y
  824. ;----------------------------------------  u$ n: A: b5 r4 f
  825. ;切换到下一页# d: d* q) \6 F) a1 g4 d
  826. Change_To_Next_Page_Set:
    + P! ~7 V9 Z# i' y7 L
  827. JSR Record_Last_Page_Index- Z; O. V" I6 x4 [3 Y
  828. LDA FC_Page_Cur( R) Q% }2 r- J2 v) \, j
  829. CLC
    , n0 x" u' d$ Z- n, W4 d$ n% A* g5 R
  830. ADC #FC_PAGE_SIZE/ ]' U( ?- q- z, d+ ^- s
  831. STA FC_Page_Cur
    1 }: Z2 i% I' d
  832. LDA FC_Select_Index9 J. \- Z: O7 T) Z' P
  833. CLC8 j9 q- Q8 I1 E$ }; z1 @
  834. ADC #FC_PAGE_SIZE
    6 b5 Q& ~: E' j. [7 N
  835. STA FC_Select_Index. B7 a" _: P5 J; N" r- g
  836. LDA FC_Select_Index' u: ~8 |& y) p/ N2 j
  837. CMP #FC_ITEM_SUM& K9 B  X4 X, L$ s
  838. BCC Change_To_Next_Page_Set_End% z, L, v( F0 a/ Y  g! a: i: F
  839. ;----------------------------------------1 Q5 x0 @' Q8 G! b6 `7 @0 a: I
  840. ;切换到最后一项
    + D3 I" W4 T- t8 b+ n& d; V4 x! Z
  841. LDA #FC_ITEM_SUM
    . M0 M# G9 L. D/ F" U1 _- S2 Z
  842. STA FC_Select_Index
    * U8 @2 m4 P  n6 Q- V8 l; W) L6 C
  843. Change_To_Next_Page_Set_End:3 @- b5 ~/ F+ e# e5 u' M. {
  844. JSR Update_Page_Content
    % A: t/ i0 ]9 \# E* z3 ]; m/ b
  845. RTS4 o4 c# W7 c: K% o+ i
  846. ;----------------------------------------
    8 ]+ s1 v: {, l. S$ w
  847. ;切换到起始页
    4 g) v7 @; u. E4 e7 b
  848. Change_To_Next_Page_Set_Begin_Page:
    % }3 P2 L& ^  Z* l1 B, }: t: {
  849. JSR Record_Last_Page_Index
    ' [- O/ y/ |; s: G* j! A' I4 `6 b
  850. LDA FC_Select_Index% B  v8 b0 `2 S& R+ v1 U1 v% E
  851. SEC# I6 R7 o4 s1 b$ p- {
  852. SBC FC_Page_Cur
    / V( ]( m& ~9 d# Y0 E4 X( i
  853. STA FC_Select_Index$ F3 N. q. z$ t
  854. LDA #$00. {( v0 G3 k# J- X6 b0 o/ h( u
  855. STA FC_Page_Cur5 L+ s8 f5 [) m3 G' \8 e+ q0 x
  856. JSR Update_Page_Content! {+ \  g' J* R. H/ c
  857. RTS! u, @. x( P  ~% _' u/ d
  858. ;----------------------------------------8 `; Y1 H  e, Q* b1 G/ P
  859. ;切换到最后一项(最大页只有一页时)
    ; o: G9 N6 m& a3 I1 ^8 @4 y, `
  860. Change_To_Next_Page_Set_Last_Item:
    ; |0 {4 L: R# }: t
  861. LDA #FC_ITEM_SUM
    ; a5 R* j$ D( I4 i9 n6 i
  862. STA FC_Select_Index$ H6 h9 O) Y# O+ G
  863. JSR Update_Page_Content3 W) {4 C, t! s. `5 t9 P
  864. RTS$ b0 G3 a) s1 Z' O7 F' P& X* O+ J- @

  865. 6 a0 {" q! _! i4 v! S
  866. ;==================================================. t( b- L. L" g6 D- |6 `6 b
  867. ;更新页面内容
    * I# N7 I( \2 \+ A- `& N/ i- j
  868. Update_Page_Content:
    0 G! F! ^6 L# q: T! p
  869. LDA FC_Page_Cur* ~# g! b( q/ Y
  870. CMP FC_Page_Old" t1 P& A, F6 J2 P  t) G6 ^0 _
  871. BEQ Change_Update_Page_End, q% e, {' k! I3 T9 z( ^# j
  872. JSR PPU_Data_Page_Show
    4 H' P2 K7 W% E5 k/ w& ]# ~
  873. Change_Update_Page_End:
    & c- F8 }9 D2 G0 m5 k
  874. RTS2 ~9 _  I9 h) [# {& a. e. `5 u
  875. 5 A0 h9 D9 y* K4 w: s1 y
  876. ;==================================================. F2 T/ _  H& D" m! L) w; u1 J
  877. ;记录上次页索引" z$ ~: T# M% a6 H
  878. Record_Last_Page_Index2 g7 Z1 x* g' ?# |1 f2 |
  879. LDA FC_Page_Cur
    . S2 S6 O" t: a) Y
  880. STA FC_Page_Old
    . g$ m" z, X9 h, }& E
  881. RTS* w0 X1 @) J8 L1 A* e$ t3 _  c
  882. " G/ f5 n1 g0 N& V
  883. ;==================================================7 `' Q2 b0 E  k7 }
  884. ;显示当前选择项光标
    0 ~8 `% U7 P$ T; E: i
  885. Show_Select_Cursor:
    1 M: L4 M6 r2 `; X, a
  886. LDA FC_Select_Index
    6 ]' k# A# X5 B7 ]; v
  887. SEC
    + b* C% v1 W  @
  888. SBC FC_Page_Cur
    ' [4 C: W! J0 e4 c" V
  889. ASL
    + B+ K& y' p# X; ^+ W3 y
  890. TAY2 t3 z! S/ E- D! I1 `
  891. INY. Y5 r& v3 l" s7 ~
  892. LDA Text_PPU_Addr,Y6 r6 R( r4 F; c) n' I; |
  893. AND #$035 g! q2 @, N% d. N9 S
  894. STA FC_Cursor_Addr_H3 d& \) O2 ]9 f3 R
  895. INX
    ; W; T6 A: v, i4 }7 J; X2 {
  896. DEY" s+ e' X" ?6 b; W5 r7 R
  897. LDA Text_PPU_Addr,Y- r9 s' p. _% ~4 a1 i
  898. STA FC_Cursor_Addr_L
    ! R2 b- n+ ~7 f9 Z, s
  899. ;----------------------------------------
    , v( ?7 l0 g+ y. K& I/ I9 N
  900. ;计算光标X坐标
    % y2 Z; \( C0 B9 Y/ ~& o
  901. Show_Select_Cursor_Set_X:
    & _- t. M' Z1 f: v  k$ ]# F
  902. LDA FC_Cursor_Addr_L
    ' Z5 S& }7 H9 m/ d. ]- x* s
  903. AND #$1F
    6 E9 ~5 {) |+ }% I( e6 N
  904. ASL
    6 F  q0 C# _) K  p8 w
  905. ASL
    0 R$ S) ?. A* L! Z0 d
  906. ASL
    0 t0 M; O* A% q# L( }) m' Z) X
  907. STA FC_Cursor_X) @% X; S4 C$ T$ O1 e4 F; }
  908. LDA FC_Cursor_Addr_L/ i# c1 U/ I' ~
  909. AND #$E06 B! W7 f- O5 M8 R
  910. STA FC_Cursor_Addr_L1 j0 X1 K5 A/ R) }
  911. ;----------------------------------------$ W4 I) N; C7 @: F( O
  912. ;计算光标Y坐标
    1 [; @1 o- S* F( ^) T: O
  913. Show_Select_Cursor_Set_Y:) D8 x! y/ v- w) O# }
  914. LDX #$05
    $ h5 j/ f6 \  N  r) X
  915. ROR FC_Cursor_Addr_H
    2 ~- m! ^! U& d% Q9 Y$ R
  916. ROR FC_Cursor_Addr_L8 Z! {0 J& d. y, d% z
  917. ROR FC_Cursor_Addr_H6 i# Y) s. Y! U  p. N7 c# z. x, J
  918. ROR FC_Cursor_Addr_L
    6 J7 ?- T$ E) W7 M/ S- k' K* s8 ]
  919. LDA FC_Cursor_Addr_L1 N9 k& Y* C7 j; M- m8 R
  920. STA FC_Cursor_Y. _! i5 k% l- p4 }4 C/ d% g
  921. ;----------------------------------------3 T; Y) t9 n% _: A2 K/ D" H1 F
  922. ;写入光标/ x5 z4 L2 C' N; Q! D
  923. Show_Select_Cursor_Set:
    " E& T! t3 F& x$ k
  924. LDA #$00+ u! i3 T9 x$ p: Q% T
  925. STA $20033 w1 ?1 L' E- f9 Q% d9 W( _
  926. LDA FC_Cursor_Y  W+ l, e3 l& d! E0 h) c$ @* W
  927. SEC0 \) c3 }0 ]9 {/ g6 r9 z  N
  928. SBC #FC_CURSOR_OFFSET_Y* C: y# Z1 d6 n& F5 [; `! x, m
  929. STA $2004
    * o2 Y7 i6 ]) {0 m: P+ }3 Q. ]
  930. LDA #FC_CURSOR_TILE
    7 y0 |( S3 j$ |7 |) q
  931. STA $2004
    : Y# U. k" A9 |& h0 y
  932. LDA #$00
    ' j  D' F* b/ C% q5 @
  933. STA $20041 x9 `. u& K0 `* ~
  934. LDA FC_Cursor_X/ F) u; h/ L& g1 ]9 v2 S
  935. SEC
    + }5 F, t  C* ?$ _
  936. SBC #FC_CURSOR_OFFSET_X
    9 V6 G& |- v5 D- Y' n1 b
  937. STA $2004
    & O: M. h* b5 f* M; e5 ?
  938. RTS
    5 }9 N5 R6 D' n( x- @
  939. " }, z/ g" m( A8 l( `
  940. ;==================================================/ H* o9 ^9 f' w
  941. ;切换功能
    # Q, z# O( l, G1 R' n5 h! M4 e
  942. Change_Function:
    4 _+ x" i: t  q
  943. ;----------------------------------------
    * I& W- l+ y9 F( a) k& u+ S
  944. ;开启功能A
    ( g/ `) j9 Q' f. g
  945. Change_Function_On_A:
    " g& ^: n& Z4 |7 X* t2 N# s6 h# _
  946. LDA Button_Once$ A# h) _8 O4 ~+ F: |; q
  947. CMP #$40) p: B- m7 B8 D- A' d
  948. BNE Change_Function_On_B
    " p) g7 {3 W$ z
  949. JSR Change_Function_To_On_A
    " \9 s% y$ ?: |* n/ Z
  950. JSR Function_Status_Update' _" ?; ^; v% Q7 g7 u0 z- K/ U
  951. ;----------------------------------------
    ' [9 z* y5 a- X7 E
  952. ;关闭功能B, U" \9 ?" g5 ?( i$ Z
  953. Change_Function_On_B:- E* Y* [3 D+ u0 Y
  954. .IF FC_IS_DOUBLE_PLAYERS+ z" ^7 o! ~' U3 L  m5 }% L4 `
  955. LDA Button_Once + 1- B2 l! X" {: o- j" o, `$ ^& h
  956. CMP #$405 P0 h" J* p$ r/ B9 ~0 ?
  957. BNE Change_Function_Off_A3 n0 z( u, p+ z, X9 \8 x5 u# z
  958. JSR Change_Function_To_On_B
    9 m) M" S3 r- W9 [( j, A* w/ k' q
  959. JSR Function_Status_Update" G; k/ C! L4 W% a
  960. .ENDIF
    2 A# y, A' G+ `( L
  961. ;----------------------------------------
    0 n/ n4 j' z) `8 L
  962. ;关闭功能A
    7 @5 T. q5 J9 C1 [5 h
  963. Change_Function_Off_A:
    , f' h/ z6 P: H/ `0 o  ^
  964. LDA Button_Once
    9 p2 j( W& g! `" e# a; \" v
  965. CMP #$80
    ; g! u# n* E/ R- U
  966. BNE Change_Function_Off_B! d" w1 h0 b. r# h
  967. JSR Change_Function_To_Off_A3 L4 B5 C- |/ X+ W+ V1 [3 G
  968. JSR Function_Status_Update
      {+ o6 E8 c) y2 [! C
  969. ;----------------------------------------0 W) G9 [' ~" S: e2 h
  970. ;关闭功能B
    & q, K: x( P) |
  971. Change_Function_Off_B:
    0 [9 X3 b- m/ x- p. h
  972. .IF FC_IS_DOUBLE_PLAYERS! D) b% V- H+ e  N7 I3 P# G
  973. LDA Button_Once + 1
    * g0 r' S1 @2 a! i0 `9 \  L
  974. CMP #$803 }+ e1 t1 }, y. H
  975. BNE Change_Function_Swap
    * j  d+ |+ F# d6 r4 ^6 S. i
  976. JSR Change_Function_To_Off_B  b* y2 U) j, d9 a' u
  977. JSR Function_Status_Update- e) }5 L" O# z  W* B! f7 W
  978. .ENDIF
    0 I& `1 h; s3 U9 f! J
  979. ;==================================================) f, v' z7 i# ]$ k
  980. ;交换开关$ a3 H( C  F( |" ?5 W+ L4 J+ J
  981. Change_Function_Swap:
    % l2 O. v* c( _# z
  982. .IF FC_IS_DOUBLE_PLAYERS
    5 M9 x# d) h: u! }5 y
  983. LDA Button_Once: Z" l; K2 {) F5 [8 k
  984. ORA Button_Once + 1, [' A) a- P0 C% e, N/ e+ Q) B
  985. CMP #$20
    8 V; ]9 v( A2 Q$ _, {
  986. BNE Change_Function_End
    , R9 p9 D; w# [+ c% c* a
  987. JSR Change_Function_To_Swap5 f5 A- N# f8 s+ v6 Z4 y9 ?4 E" P
  988. JSR Function_Status_Update
    " Z) q. T; s4 B
  989. .ENDIF
    % J# r' U5 n5 w0 Q
  990. Change_Function_End:
    6 K5 J# a. y9 k3 s5 f
  991. RTS
    0 l; T$ W% o! `8 @
  992. * i, m' s- v. ?- o. l$ K( x3 z
  993. ;==================================================& N7 ]. _; U  u' v
  994. ;交换开关状态
    : N) o- |( R% H+ M4 l
  995. Change_Function_To_Swap:! s# Q. }0 @( s. Z# Y
  996. .IF FC_IS_DOUBLE_PLAYERS
    % e9 D7 E! |# n+ k2 b8 x
  997. LDA FC_Select_Index! C. m8 d9 K5 ?, Y5 V4 r
  998. SEC
    % `% l/ Z, H* {3 F/ j. D/ ~) o
  999. SBC FC_Page_Cur; \+ ]2 {- ?. q2 D0 n
  1000. STA FC_Select_Temp
    0 E  p* `. F4 M  B
  1001. JSR Set_Function_Port
    : g8 o7 H* s5 N6 d0 t. q
  1002. LDY #$00
    0 L8 w2 A5 L" N" A
  1003. LDX FC_Select_Index. x# L* r0 W9 K& G) a' g0 R
  1004. LDA (FC_Data_Port_A_L),Y
    $ p) e; P, b; z7 H4 I/ e
  1005. EOR (FC_Data_Port_B_L),Y3 V1 q: q1 I. ~, U; Q
  1006. AND Function_Check,X
    $ u" |, d6 ?: v+ E
  1007. BEQ Change_Function_To_Swap_End
      F6 D( @1 [- U! _
  1008. LDA (FC_Data_Port_A_L),Y6 V+ X6 i  z8 }+ o! }
  1009. EOR Function_Check,X
    . U* J3 V3 ^$ w7 O; A2 v6 p
  1010. STA (FC_Data_Port_A_L),Y. R# k) V/ A4 N! g1 r( s
  1011. LDA (FC_Data_Port_B_L),Y3 O/ c, ~. _6 n, w9 p
  1012. EOR Function_Check,X* `* A4 C7 a9 i  E
  1013. STA (FC_Data_Port_B_L),Y; l/ o  I% g9 n5 {) w
  1014. Change_Function_To_Swap_End:
    " G' K2 t' F; S
  1015. RTS* P, ~$ P5 I" e3 |& e
  1016. .ENDIF6 O9 E* i/ S% ^( H) ]' B

  1017. 4 h  ]& H& j  D. B0 G' _

  1018. + I/ P8 l3 U( z& G1 g; c( W1 R
  1019. ;==================================================
    ; v" K$ D( y% q! r' Z  t2 R
  1020. ;更新功能状态
    5 n) i* E( p9 B
  1021. Function_Status_Update:
    4 i' ^8 r$ B, q1 ]; o7 V
  1022. LDA FC_Select_Index# |8 r4 v. A1 B1 d5 R! U
  1023. SEC
    ' K" [5 K, X" p
  1024. SBC FC_Page_Cur
    2 G+ F0 c( p) J5 l' l+ W
  1025. STA FC_Select_Temp
    ( P0 R% F& U% A- W* l
  1026. JSR Function_Status_Show/ }8 t+ E7 @6 A9 j) S3 x  |1 B5 |
  1027. RTS$ X: T* q- h# t& o0 m( Y- K5 p, t

  1028. ) c: z( i/ n7 ^8 `
  1029. ;==================================================
    $ K) n( B; u  P7 F! ]" e' n
  1030. ;设置功能地址端口! y- {/ Z8 y6 H$ Y- |
  1031. Set_Function_Port:7 V1 p2 Q5 f7 H, G3 \, q7 C' s
  1032. LDA FC_Select_Temp# Y( O) l( i/ h  G1 K
  1033. CLC3 Y- w2 o6 W' c! s2 O: H
  1034. ADC FC_Page_Cur$ J5 p8 {& z& L: r8 @" T
  1035. ASL2 b2 ~( |9 Q  j, h% s
  1036. TAY, U: _2 }6 Q: a+ Z% @9 i  u
  1037. INY( A: g2 \9 C% y7 o9 l  Y0 x  w+ A
  1038. LDA Function_Addr_A,Y5 v: t% W/ u+ U$ K" m+ `1 j
  1039. STA FC_Data_Port_A_H
    ) {! V# S3 b. P& p$ F
  1040. .IF FC_IS_DOUBLE_PLAYERS& ^9 o2 }) ?% N' p- c+ ~
  1041. LDA Function_Addr_B,Y9 A# g. w( O4 X' |
  1042. STA FC_Data_Port_B_H
    : l3 N5 e' Z2 z1 t: U: ^, Q
  1043. .ENDIF
    " b7 W# L, ?1 M  q
  1044. DEY
    ; F2 D; v7 [" G4 ^7 R2 y
  1045. LDA Function_Addr_A,Y
    - ]& l! G' Y. O  Z5 @/ U% Y
  1046. STA FC_Data_Port_A_L* n" q6 y% R0 c7 T2 Q4 Y! s
  1047. .IF FC_IS_DOUBLE_PLAYERS
    . S% f+ t5 n, {1 L6 w1 m$ g
  1048. LDA Function_Addr_B,Y
    ! M6 h2 C% M0 c6 x. }, N
  1049. STA FC_Data_Port_B_L* c% {3 |, x+ |: G, N- i5 T0 ]
  1050. .ENDIF
    : o5 l3 N. k/ _$ O0 I, @( s, C
  1051. RTS
    * [8 T9 U+ G2 a

  1052. 4 }) V! l- I. }! V% a
  1053. ;==================================================! X, y6 P! g) a
  1054. ;设置功能临时索引5 D4 ^) \- }% n5 K4 S  L  ?# g. [3 n
  1055. Set_Function_Temp_Index:
    2 J2 f8 Y) y7 G2 C8 P! S
  1056. LDA FC_Select_Index) B. e; D' }# g: h, Y
  1057. SEC$ h& L# a+ Y* \
  1058. SBC FC_Page_Cur
    ! O- b' w9 U! B# @( P8 Y
  1059. STA FC_Select_Temp
    $ `6 F8 `6 r0 r" W0 A7 l' p
  1060. RTS0 Z; @) [9 o% F$ a
  1061. 5 x  V% S* N  a3 p% g
  1062. ;==================================================) Q; t2 C( F3 n% Y9 y$ a/ J
  1063. ;开启功能A: A  U- c0 H1 n# C1 e& X2 }0 V  P
  1064. Change_Function_To_On_A:
    + }; Y! v/ u& Z, g
  1065. JSR Set_Function_Temp_Index" T3 }5 D) _+ z' W7 p
  1066. JSR Set_Function_Port. m0 l* d( U) [
  1067. LDX FC_Select_Index
    , s0 n. Y% ~. h) V( Q  `2 C
  1068. LDY #$00! R5 T2 C. M( q7 H. a0 r0 v( [
  1069. LDA (FC_Data_Port_A_L),Y
    , z, d$ G& b$ y
  1070. ORA Function_Check,X! C9 C# l- c* ~; H0 b
  1071. STA (FC_Data_Port_A_L),Y
    % h" d7 F4 m9 J" m4 d' \+ u
  1072. RTS) H4 o" k2 s; _! J5 s3 t
  1073. ;----------------------------------------0 A; B. O% E  \7 n' f& `6 p
  1074. ;开启功能B6 f$ c# V/ U0 `. B1 L* l* o
  1075. .IF FC_IS_DOUBLE_PLAYERS
    8 D3 ^9 n& J& N/ Y
  1076. Change_Function_To_On_B:$ S( v: p. x) b* u1 Z* C
  1077. JSR Set_Function_Temp_Index$ D6 B1 i# \( b# E$ v) Y8 s6 d
  1078. JSR Set_Function_Port  q' z  `4 s# h4 L7 v' [
  1079. LDX FC_Select_Index
    " C" |4 b6 I5 w" T, R( I; U# S$ T: ]
  1080. LDY #$00- K4 x% M5 m0 n. y1 f
  1081. LDA (FC_Data_Port_B_L),Y  d8 }+ T& Z9 O( g
  1082. ORA Function_Check,X- }; J; m1 I  {# e
  1083. STA (FC_Data_Port_B_L),Y
    3 D. q8 b: |$ |, C8 m/ i
  1084. RTS
    " w' R( L( E; |- h2 T- I
  1085. .ENDIF" b( D! ?$ y( m- L' v& \" ]
  1086. ;----------------------------------------  F9 ?) t# N. [% P; ]
  1087. ;关闭功能A
    $ V! e( e$ f4 y
  1088. Change_Function_To_Off_A:' C) t9 p+ F" E2 R5 p' _
  1089. JSR Set_Function_Temp_Index
    ) j. F7 S9 s# m# b0 F
  1090. JSR Set_Function_Port  Z0 ]/ ]  @: ?2 J6 B3 B# ]8 U
  1091. LDX FC_Select_Index; o& ~+ I1 l2 h/ i1 `* F7 Y! }
  1092. LDY #$00
    3 F" ~) E0 l2 z* c" X
  1093. LDA Function_Check,X
    8 c. d7 i# `) t: e
  1094. EOR #$FF( S' r" u. b; U& }6 b: F
  1095. AND (FC_Data_Port_A_L),Y4 q0 j+ _5 z# n! n+ Z5 M* q6 d8 o
  1096. STA (FC_Data_Port_A_L),Y. `& s( P* }; k0 t+ G" r
  1097. RTS6 t! U# {+ b+ B$ s
  1098. ;----------------------------------------
    2 k/ |0 d3 z& q) K4 f; J
  1099. ;关闭功能B
    $ z  k% ~8 |) G/ R
  1100. .IF FC_IS_DOUBLE_PLAYERS; ?/ d0 w9 B0 \8 g
  1101. Change_Function_To_Off_B:
    0 K. D! Y  P. w$ o0 M
  1102. JSR Set_Function_Temp_Index
    7 _! _1 e. j5 P! E
  1103. JSR Set_Function_Port
    . U1 U6 P( y. s# ?1 d8 W
  1104. LDX FC_Select_Index9 {; V' j1 Q$ F: s5 Y/ d) I
  1105. LDY #$00- x' d* H# @8 G+ q2 M' s
  1106. LDA Function_Check,X5 E# c! }! H/ x- ^/ r% f, i7 J' r
  1107. EOR #$FF; v. a- A8 d+ }# `0 e# `8 w
  1108. AND (FC_Data_Port_B_L),Y
    3 S% A$ i: g/ J3 |! L1 @/ ]# A# M
  1109. STA (FC_Data_Port_B_L),Y
    9 O4 Y% ~, ]% {! e
  1110. RTS
    4 T. r& k& {& j! H& Z
  1111. .ENDIF: T4 S" X& B# y* i0 i# K
  1112. 3 d$ j7 S; K5 w4 }5 t2 B6 T
  1113. ;==================================================; {5 ]6 _# I9 V' O0 n7 g
  1114. ;设置功能状态PPU地址
    # y& U" |0 ?6 R- x8 \
  1115. Set_Function_Status_Addr:
    " c6 H8 o9 \) t8 X: P$ c( {$ l, Q
  1116. LDX FC_PPU_Cursor
    , [; C7 @! z. ?# A! _( m" b1 v2 |. w3 B) {
  1117. LDA FC_Select_Temp/ K  o$ ^7 w# n
  1118. ASL
    2 {% D7 }& h5 ~
  1119. TAY
    # r& }0 b: n' {
  1120. INY. G, S" s5 U2 w" X9 ^
  1121. LDA Text_PPU_Addr,Y& X2 Z5 t  z6 {# Q" c( F
  1122. STA FC_PPU_Buffer,X9 @9 y6 q. \5 ^
  1123. INX
    1 @3 {* y, s+ z7 J/ i$ H3 R
  1124. DEY0 R$ n3 p; l* J8 h9 m7 `& x
  1125. LDA Text_PPU_Addr,Y
    - g- o+ i: K$ n  S! x% U2 q8 K
  1126. CLC
    " O" o0 j- Z0 X- c
  1127. ADC #FC_FUNCTION_OFFSET9 L, F# L( I- p0 \
  1128. STA FC_PPU_Buffer,X
    : t: Z. ]/ C, ~2 D* q9 q
  1129. INX* ~$ R: q& l4 z6 J7 M
  1130. .IF FC_IS_DOUBLE_PLAYERS
    # N: Y' e4 D  U% {9 U- O4 f
  1131. LDA #$02: e) ]  V6 s+ _; U3 ]7 ?* {
  1132. .ELSE: g. L: [. N6 Z  V, j
  1133. LDA #$01
    ; F" F/ e7 j& [# V% o- ^6 w! ]
  1134. .ENDIF
    6 s" x& Q& n9 _7 Z& ~
  1135. STA FC_PPU_Buffer,X  ?: p% X2 w# ~) u. y$ w
  1136. INX; m% |* i+ }! v# b$ ^
  1137. STX FC_PPU_Cursor4 b+ R; \& m8 w! o( G4 o
  1138. RTS! O0 D5 x' z8 w& p& i) u+ t
  1139. 3 u6 s8 W" c: r1 g
  1140. ;==================================================8 x' @' p8 g3 H- D5 D
  1141. ;获取当前选择索引3 l* U. `6 X7 t+ E" g
  1142. Get_Select_Index:$ t0 b! u1 z1 {% n, W
  1143. LDA FC_Select_Temp
    ( r0 C6 `. _! z
  1144. CLC  {# `7 }0 v& {) Y: Q/ V9 f- Q6 B& t
  1145. ADC FC_Page_Cur
    9 v" `6 v2 g# v% V  }& S' ~, K
  1146. TAX7 u5 G' K4 x, D! W. |7 V0 K9 m
  1147. RTS3 T; I0 L% ]/ v0 f6 j( X; A  q0 E; L

  1148. , m, R& ^$ X: q9 X! D1 a
  1149. ;==================================================4 f" h2 K% B: a, J) J
  1150. ;清除状态文本$ C/ N' ^2 T) ^# R) ^
  1151. Function_Status_Clean:
    ( c: o% v  r& f. m# B8 g
  1152. LDA #FC_PPU_MODE_CNTC: k9 a8 }5 I% b( }. z
  1153. JSR Set_PPU_Mode8 t* |3 `6 @$ N5 u, K5 M
  1154. JSR Set_Function_Status_Addr
    ( x+ f: c9 [5 k- ~6 U# l6 r
  1155. RTS  l+ ^6 _0 ?: e2 s3 K6 |+ b
  1156. 4 V  ^4 Y; }. p5 |  o) v4 D0 H7 I
  1157. ;==================================================
    5 s1 M! R  R) U* w" d4 ?# V! [4 N
  1158. ;显示开关状态2 Q4 c, n1 ]1 Q
  1159. Function_Status_Show:3 X1 d5 ]- `5 d  Z' s( f- z' M/ a
  1160. JSR Get_Select_Index
    5 k, a. X, O  _0 O6 F) x! r
  1161. CPX #FC_ITEM_SUM( s( B. B7 G% G- D; u9 }2 }; ], X8 s
  1162. BEQ Function_Status_Show_Set# [: p+ @) t7 K  \# X% d
  1163. BCS Function_Status_Show_End+ t# \' d6 t3 Y
  1164. Function_Status_Show_Set:9 [7 }" _- h4 ?9 ?: m
  1165. LDA #FC_PPU_MODE_CNTL  m& s  K( T" N5 k! O7 H# I
  1166. JSR Set_PPU_Mode
    8 v' E4 d) j% Z2 d8 ~
  1167. JSR Get_Select_Index9 ?9 ^$ d; b. a
  1168. JSR Set_Function_Status_Addr
    / s; j9 U. f, q2 o% h" w
  1169. JSR Set_Function_Port7 k. m  F# H1 I6 i+ M9 d
  1170. JSR Function_Status_Show_Check_A3 ]: z7 J: \& R7 t( h
  1171. .IF FC_IS_DOUBLE_PLAYERS/ I9 y  x8 F" d( E- ~: z& Q  K
  1172. JSR Function_Status_Show_Check_B
    1 V0 p% }& k% |2 g4 c
  1173. .ENDIF
    " O: p# s+ X3 |7 {5 n
  1174. Function_Status_Show_End:# M- a0 x) E- b' _6 g# q7 {# X
  1175. RTS
    * ?$ c: |! S) e3 M# {
  1176. ;----------------------------------------
    " t/ ?+ ]/ a& |7 w$ g4 N8 X6 K
  1177. ;检查功能A状态
      E5 w) P) U  u' N( b
  1178. Function_Status_Show_Check_A:% t- E0 V" {! Q8 p9 ]0 i+ g
  1179. JSR Get_Select_Index
    5 Q) ]" k4 F# r/ c5 ^
  1180. LDY #$007 u5 Y# K6 W; E: t+ x7 h0 w: C
  1181. LDA (FC_Data_Port_A_L),Y3 p7 b" e, s: X1 n
  1182. AND Function_Check,X0 K2 b, q7 N+ ]* _
  1183. BEQ Show_Function_Status_Off: n: N) G4 ~4 f4 A: R  S) A( d
  1184. JSR Show_Function_Status_On% j. ?1 G8 e5 ]' d  ?; _
  1185. RTS- p  Q. D2 P7 S1 k
  1186. ;----------------------------------------& G0 i9 A; k/ g/ ^( A: ^1 C
  1187. ;检查功能B状态
    . o" u2 d, ]' g( y
  1188. .IF FC_IS_DOUBLE_PLAYERS
    , U4 r% Y2 j* n3 L$ r/ N
  1189. Function_Status_Show_Check_B:
    # H0 Z  L% `7 D& B+ v% x( |
  1190. JSR Get_Select_Index9 m4 Z9 Y% H5 [' U, D- P9 L
  1191. LDY #$00
    ; Z5 T- `# @3 ~: g
  1192. LDA (FC_Data_Port_B_L),Y5 U$ [5 _9 Q, g4 z: z2 {8 G
  1193. AND Function_Check,X
    2 n% U( r6 u  |3 D& \
  1194. BEQ Show_Function_Status_Off
    ' u" M0 [' \8 H! H) K! Q/ S
  1195. JSR Show_Function_Status_On
    5 E# q, ?5 E/ I% F# @, |* y
  1196. RTS0 d3 d. O' V4 l7 v2 J9 q- \
  1197. .ENDIF
    4 U; d( K: u4 s2 X6 r6 r/ h

  1198. ' X/ _5 O- y& ~+ {
  1199. ;----------------------------------------
    ( R4 h% q" [) `& p+ r
  1200. ;显示功能开启状态& ]3 S' C" B0 c1 A% i* @+ \
  1201. Show_Function_Status_On:
    6 }4 g' B6 E( k! D3 \$ D
  1202. LDX FC_PPU_Cursor! J4 F- r! _+ M  ~
  1203. LDA #FC_ON_TILE: j" m, |: y" L! r6 e+ ?
  1204. STA FC_PPU_Buffer,X  r8 h& a" e4 F( X& c# N# E% c
  1205. INX
    ' m7 r! D) L% U2 m0 b+ V% _' F0 D
  1206. STX FC_PPU_Cursor; B% R$ H3 k9 A4 U0 N* z
  1207. RTS( Y4 E7 B5 o( {8 E1 H# Z( Y$ \. {
  1208. ;----------------------------------------& @' @5 ?, y( \) Z* b. Q- i! v
  1209. ;显示功能关闭状态
    $ U0 d4 V  ]7 c) q; c
  1210. Show_Function_Status_Off:
    ( m4 I* ~2 Z6 r# g
  1211. LDX FC_PPU_Cursor
    " e4 n" j8 Q- m7 U
  1212. LDA #FC_OFF_TILE( L2 p  T! Z. c' A+ Q& R0 t
  1213. STA FC_PPU_Buffer,X/ R5 r* i8 ^5 }" ]6 v7 R
  1214. INX$ p) f( e% X9 A5 K) [
  1215. STX FC_PPU_Cursor
    : g$ z' l/ _: q. o. r" o
  1216. RTS
    * F8 w- s& s5 {3 u3 T! M* ?

  1217. : e8 b+ n1 u1 g' M5 D" p
  1218. 5 T7 ?" t3 }' \; l; s  ~6 }
  1219. ;-------------------------------------------------------------3 Z5 N7 Q1 J- `. @+ k
  1220. FC_Data_Copy:    ;数据拷贝参数设置
    ' J/ C  M, @0 ~1 |- ?8 ]' |
  1221. STX FC_Cpy_Port_L
    4 ]+ X' F. p& l8 n( F+ Y% r
  1222. STY FC_Cpy_Port_H
    : u9 l1 d4 p: e0 Z# B* s6 e! z
  1223. LDY #$00
    % r/ ]3 l8 Y1 Z% q) ?5 \
  1224. LDX #$06
    , p8 G2 {$ I$ a% Z$ `
  1225. FC_Data_Copy_Addr_Set:    ;从指定地址读入参数# B: l/ ~2 s# l) e7 o3 |' f
  1226. LDA (FC_Cpy_Port_L),Y. u% |1 r- Y% P% c9 e
  1227. STA FC_Cpy_From_L,Y' F6 Q( H4 U$ b; ?5 c
  1228. INY- b: _* i* y) C
  1229. DEX6 `( ]7 j: C( O
  1230. BNE FC_Data_Copy_Addr_Set
    / G/ O* E& w$ ~! ?' ?1 |# O: B' ~
  1231. LDA (FC_Cpy_Port_L),Y3 X8 D" |' c7 i  Y6 _
  1232. CLV
    - F" G2 ?! I5 N$ }9 E- U$ F8 [9 R0 R
  1233. LDY #$00) N$ w4 ^: w/ [2 Q( h: V
  1234. ;----------------------------------
    ) G4 ^. B; f: R5 Z' |
  1235. FC_Data_Copy_Mode:   ;复制模式校验
    . ?7 M% {$ H( S/ \8 K
  1236. CMP #FC_MODE_RAM_TO_RAM, l* [, u0 f$ O' o0 `3 E/ q
  1237. BEQ FC_Ram_To_Ram_Mode
    8 R( L1 L) T) [3 v6 u# P  p5 V
  1238. CMP #FC_MODE_RAM_TO_PPU
    , u/ W' \; U, [
  1239. BEQ FC_Ram_To_Ppu_Mode
    7 _. N: z+ J# ^/ Y) m; o
  1240. CMP #FC_MODE_PPU_TO_RAM
    $ c" x% o2 I( i/ L6 X3 G- q
  1241. BEQ FC_Ppu_To_Ram_Mode! u4 H' j* E9 z( [6 I( G
  1242. CMP #FC_MODE_PPU_CLEAR& T- K3 O7 M8 j
  1243. BEQ FC_Ppu_Clear_Mode
      ]9 U6 E: p; @' e5 D1 {
  1244. RTS) D2 ?  N8 F9 Y& [
  1245. ;----------------------------------------# a" }; Y% e9 K( B9 \
  1246. FC_Ram_To_Ram_Mode:   ;复制RAM到RAM模式
    ; p9 m. X4 K' t% ]  ~8 q; O
  1247. LDX FC_Cpy_Count_L( U  X, ]6 B9 B
  1248. INX5 _$ s) _+ ^' s$ [9 b
  1249. FC_Ram_To_Ram_Count:   ;剩余计数检查
    ' F4 x' V9 L$ S8 A) W# K+ E: V2 v
  1250. DEX
    & y4 H; M" I1 U6 }
  1251. BNE FC_Ram_To_Ram_Copy) U. G& ~7 ?5 E5 d
  1252. DEC FC_Cpy_Count_H3 E7 }' t" X$ U  q" ^
  1253. BMI FC_Ram_To_Ram_Over+ U5 b2 S* F: E- V4 b: e' Z8 Y; _) l$ O
  1254. FC_Ram_To_Ram_Copy:   ;开始复制数据9 T/ O# n6 q) D0 N9 k% |
  1255. LDA (FC_Cpy_From_L),Y
    3 x' m% b/ E+ |! }+ h# y4 A
  1256. STA (FC_Cpy_To_L),Y
    ' F) ?0 g. y, w; s" K9 x$ O: z6 }
  1257. FC_Ram_To_Ram_From_Set:    ;源地址递增- s5 l0 y+ W# E& f6 I8 q" R" @: t
  1258. INY
    # ?% @% K2 L; ^' ?' _2 ~, ~2 ~* S# P
  1259. BNE FC_Ram_To_Ram_Count
    4 |  \1 \5 z0 n. {6 }' G
  1260. INC FC_Cpy_To_H' n, f9 s3 _& _
  1261. INC FC_Cpy_From_H
    ! B% {8 q0 ~9 h% {: L
  1262. BVC FC_Ram_To_Ram_Count
    " g& z  z5 |# i9 A! Y- K
  1263. FC_Ram_To_Ram_Over:    ;结束数据复制; x) f& f7 V* @" q9 j) h
  1264. RTS
    , b3 ^) d- Z% e: h; V$ O! m3 u& q
  1265. / L' g# L/ \- E$ H/ n# `6 `0 D3 C5 l
  1266. ;----------------------------------------+ v/ ?6 V0 L2 }
  1267. FC_Ram_To_Ppu_Mode:   ;复制RAM到PPU模式4 w( Z; k3 H0 p% A2 e
  1268. LDA FC_Cpy_To_H
    " H6 D9 Y" T2 b) g; Q$ S' \$ y
  1269. STA $2006( T1 H0 l( r  |) K
  1270. LDA FC_Cpy_To_L$ U$ m& l" w) I) q& L
  1271. STA $2006; |: E) e. ?: y! r
  1272. LDX FC_Cpy_Count_L0 U# ]; c* p! c; g# @* [
  1273. INX, M# `5 k8 \/ o* E+ s: x
  1274. FC_Ram_To_Ppu_Count:   ;剩余计数检查
    ) a6 U$ D+ U/ E( d
  1275. DEX  y" R8 u0 ^8 f, d9 j) ?  T
  1276. BNE FC_Ram_To_Ppu_Copy
    - b( d$ v! z/ c3 M' O
  1277. DEC FC_Cpy_Count_H
    # r* N; A. G% j1 ^' w! q9 x9 |
  1278. BMI FC_Ram_To_Ppu_Over! m/ y$ i( }4 h7 L! L6 F$ F
  1279. FC_Ram_To_Ppu_Copy:   ;开始复制数据
    8 e1 u& r, M0 @# L0 z+ s; ^
  1280. LDA (FC_Cpy_From_L),Y
    1 z3 T" N/ I0 I! M. I9 |9 E& l
  1281. STA $2007# K) [. N7 l  h7 t, @
  1282. FC_Ram_To_Ppu_From_Set:    ;源地址递增/ ?7 M3 i8 T0 e/ c/ u
  1283. INY: ^  z) e5 M1 U( k
  1284. BNE FC_Ram_To_Ppu_Count
    8 [% F9 V( b2 o- R2 A
  1285. INC FC_Cpy_From_H. ]5 p! N0 a) R* O' [
  1286. BVC FC_Ram_To_Ppu_Count
    3 O4 M' f. Z7 E5 X6 G  c/ _0 z2 t
  1287. FC_Ram_To_Ppu_Over:    ;结束数据复制
    : W  S5 @' k% s$ U9 r
  1288. RTS: m) Q) |, N. C
  1289. & Z$ G) ?0 ]  w  F5 Z4 x
  1290. ;----------------------------------------* W( d+ ]' h! n: s
  1291. FC_Ppu_To_Ram_Mode:   ;复制PPU到RAM模式7 Z) r5 i0 J7 o: H" I' v) z6 o
  1292. LDA FC_Cpy_From_H
    # F" Z5 ?/ P; W
  1293. STA $2006
    & k8 u0 f0 _( c' p
  1294. LDA FC_Cpy_From_L( Y5 Y8 q- D! h. z1 A
  1295. STA $2006
    , N; q( @; ]9 \8 c8 q8 h5 C8 i! S
  1296. LDA $2007
    7 G* ^: I* ^/ p
  1297. LDX FC_Cpy_Count_L
    ) A! s/ \/ E! b: I$ D2 _2 [' v# {
  1298. INX
    ' ]5 J7 t8 [, `1 V
  1299. FC_Ppu_To_Ram_Count:   ;剩余计数检查( n2 U/ X  @5 J) a: |" ~+ Z! w
  1300. DEX
    6 W+ s) O( ~9 o5 X# w
  1301. BNE FC_Ppu_To_Ram_Copy
    4 ]/ W3 r4 B, N  c7 V
  1302. DEC FC_Cpy_Count_H
    + f4 W& J. G, Z' G8 u5 z1 y* m2 N' e
  1303. BMI FC_Ppu_To_Ram_Over5 L- x2 z0 x; V2 ?6 l6 ^9 J* m
  1304. FC_Ppu_To_Ram_Copy:   ;开始复制数据+ u& d4 y. b$ i( Z- Z
  1305. LDA $20073 O- t4 T: V( ?7 d
  1306. STA (FC_Cpy_To_L),Y
    8 N5 p1 `' S9 P4 e( V. f* h
  1307. FC_Ppu_To_Ram_To_Set:    ;目的地址递增: O, a4 {) I) {* f+ E  z5 O
  1308. INY
    - m5 r. k$ j  p+ o, u* D* D
  1309. BNE FC_Ppu_To_Ram_Count$ b- \# @% u! Y5 A* M
  1310. INC FC_Cpy_To_H
    & s( o) x, g8 _5 q/ ~3 I$ t/ @( f
  1311. BVC FC_Ppu_To_Ram_Count
    ' j1 m4 |+ T  S4 P! [* B  f! \
  1312. FC_Ppu_To_Ram_Over:    ;结束数据复制
    # p  |7 z3 n6 @+ e$ n! P8 n+ o# w
  1313. RTS; E- \1 Z% F2 m" n+ H
  1314. ' i; G4 n, X; s$ U5 }3 J1 ^* }
  1315. ;----------------------------------------
    8 R. O4 p5 X& `
  1316. FC_Ppu_Clear_Mode:   ;清除PPU模式
    3 M& ~# T2 A2 d% Z
  1317. LDA FC_Cpy_To_H
    0 F9 J% X  p' C9 v6 _
  1318. STA $2006
    5 R0 E: x5 l) l
  1319. LDA FC_Cpy_To_L6 s' Z/ R, X; r2 U+ F, z
  1320. STA $20068 f7 Y  p( W8 l  [
  1321. LDX FC_Cpy_Count_H
    9 ^( V9 E0 k: H, Q5 s: k' N$ q
  1322. LDY FC_Cpy_Count_L, u! |; z5 R3 o4 c) \9 Q8 O( \
  1323. LDA FC_Clear_Val
    ! ^5 h8 V3 ?2 n2 Y2 V
  1324. FC_Ppu_Clear_Count:   ;剩余计数检查
    8 g3 \& u. \( B* U- `
  1325. BNE FC_Ppu_Clear_Copy
    ! B0 g, ~* ]% X
  1326. DEX9 Z, r2 H; z# }- t4 I* H6 B4 K
  1327. BMI FC_Ppu_Clear_Over1 \7 k4 U* s* F
  1328. FC_Ppu_Clear_Copy:   ;开始清除PPU# G& a9 k) W% m8 w
  1329. STA $20079 r/ z4 S! A! f& o
  1330. DEY
    7 ]$ b3 e% n6 s  `# d: b
  1331. BVC FC_Ppu_Clear_Count* L' L1 v: |1 {
  1332. FC_Ppu_Clear_Over:    ;结束数据复制* n9 `! e) ]  V; S7 Y5 X' {
  1333. RTS
    ) J  H. q8 J  h) i

  1334. 2 k( N. u6 y. D+ M4 B5 p" I3 a
  1335. ;==================================================
    7 y2 D5 h) l! d( }, G1 l& p
  1336. ;保存RAM数据
    : \3 b$ U" K0 a4 f
  1337. Save_Ram:
    & E, P7 `, V) V) ]3 |) q6 k
  1338. LDX #<Save_Ram_Data" _0 z: h, r( I9 A% ?+ W
  1339. LDY #>Save_Ram_Data% v: {1 I- M2 G% r
  1340. JSR FC_Data_Copy; |) v) E5 O9 b4 G  E
  1341. RTS
    5 w9 ^0 v# P# \) n: H, L

  1342. 7 |8 Q# n9 o1 F
  1343. ;加载RAM数据9 A/ ]6 j4 \/ j0 Z6 Y
  1344. Load_Ram:
    0 _5 O, B( A- A5 ]% ?8 {
  1345. LDX #<Load_Ram_Data
    + G, C3 g# N8 F9 p( G
  1346. LDY #>Load_Ram_Data2 M6 X+ s! N) [, }& b
  1347. JSR FC_Data_Copy7 U% `: ]0 l. F  d: d
  1348. RTS7 f$ y; X  I9 K
  1349. 4 z5 }, t* ~, z/ B* O
  1350. ;保存PPU数据
    + `  r4 {( c4 C" Z' w. M
  1351. Save_Ppu:* q( [. o; C/ N
  1352. LDX #<Save_PPU_Data
    # I/ r. N; G/ L4 |% {' E) A8 z) y
  1353. LDY #>Save_PPU_Data
    1 H5 X" |$ W3 Z
  1354. JSR FC_Data_Copy
    ) L( k6 K& x# U9 `1 {  V
  1355. RTS
    + j% ~& E) U+ c+ S; E3 R- O9 W5 f% P

  1356. 3 a4 U, L1 M& `3 j
  1357. ;加载PPU数据, [3 \5 u0 A1 D* f# r( c
  1358. Load_Ppu:/ r: z3 s+ @& q5 F/ U1 R9 s0 H9 U
  1359. LDX #<Load_PPU_Data4 k. S+ c$ `8 v7 X6 V# N3 T# U
  1360. LDY #>Load_PPU_Data  z! ^6 E5 X7 M6 }5 F$ x' j
  1361. JSR FC_Data_Copy5 t5 z* a# Y+ u3 i; V$ V$ m6 @- F& `
  1362. RTS
    ; t% n3 ^0 j# m0 |7 w
  1363. ! n0 o6 k9 N: r- E- |) \, j( g
  1364. ;清空PPU数据
    ' B4 p2 o& ?/ G- [% v* F5 J
  1365. Clear_Ppu:
    : M7 S! ^2 E6 f5 h# ~
  1366. LDX #<Cln_PPU_Data
    8 S3 ^  N" Y' y9 c! l6 Q0 ^
  1367. LDY #>Cln_PPU_Data- W5 Z1 E0 o) }( B$ i" \0 I
  1368. JSR FC_Data_Copy
    : T1 \  \5 E6 o
  1369. RTS
    4 d' s2 t$ R& R* \3 b. f
  1370. 4 z; y9 Y8 t2 a" O
  1371. ;==================================================
    * z6 C+ D2 v7 o; L) G. B4 U$ @
  1372. ;数据配置- ]# r9 o/ w- Q
  1373. Save_Ram_Data:
    8 }) s8 i7 F2 t  q
  1374. .DB $00,$03,$00,$63,$00,$01,FC_MODE_RAM_TO_RAM5 v9 c# n: r* e. ^, H& f
  1375. Load_Ram_Data:8 s: d( o" `2 c
  1376. .DB $00,$63,$00,$03,$00,$01,FC_MODE_RAM_TO_RAM9 n9 E& L0 N" C+ L  S
  1377. Save_PPU_Data:
      W0 k: A3 X8 [. I1 E4 F7 p# q
  1378. .DB $00,$20,$00,$64,$00,$04,FC_MODE_PPU_TO_RAM
    , b7 u+ o# ^* ]
  1379. Load_PPU_Data:9 @3 B1 m0 ?( c/ R% X7 l4 W
  1380. .DB $00,$64,$00,$20,$00,$04,FC_MODE_RAM_TO_PPU! P' [8 v8 ]. n/ b% p/ ~
  1381. Cln_PPU_Data:: V: j& v, J1 Z& @
  1382. .DB $00,$00,$00,$20,$00,$04,FC_MODE_PPU_CLEAR
    9 Z: x2 S$ @6 }' c0 `; w# o3 ?

  1383.   t) K, y3 z8 M- T, c3 w8 P
  1384. ' z9 U/ V2 Q( x# ]- H$ _6 f
  1385. ;==================================================
    6 a9 W& X) @0 ?' x, W4 Y  l
  1386. ;文本数据PPU显示地址( J5 L  G, z# T# @+ {1 O  M- A3 M
  1387. Text_PPU_Addr:! e- J, A2 a, g6 h  J. K2 S' U; O
  1388. .WORD $20C5
    9 |  |7 c* d# b9 p* \4 h
  1389. .WORD $2105
    $ ~. R6 u$ L, w
  1390. .WORD $2145
    9 b0 d6 I, O: j) P' K" O' e8 K
  1391. .WORD $2185
    " _5 e# M9 S% T$ e( b$ t3 ]! D
  1392. .WORD $21C56 ]1 I( }0 [# S; t! ?
  1393. .WORD $22052 v! n7 y, ?7 C7 o# e4 A3 X' F
  1394. .WORD $2245
    ( k) Y% A. K, x+ U3 C1 S: M8 H
  1395. .WORD $22856 t' M# x1 F  }% @
  1396. .WORD $22C5
    7 x" Q) q3 c1 R; g  d1 z" N& U8 h% u, L
  1397. .WORD $23056 {3 }: c: d8 y6 f3 a/ E
  1398. .WORD $23450 Y3 a2 Q0 I1 _" _( M: F5 L) P
  1399. 2 W, O6 B2 h$ `" C7 ?% U
  1400. ;==================================================
    1 F- I2 A: k) S# v0 `1 u2 p
  1401. ;文本数据PPU数据地址
    * F3 r+ ?1 P6 K# o1 F; I
  1402. Text_Data_Addr:3 Z" i+ t# S, A$ @6 Q
  1403. .WORD Text_Data_01; M# p+ A; X( a- f3 z- Z) @
  1404. .WORD Text_Data_02
    8 D5 V' X! k3 i; {( P$ I0 r
  1405. .WORD Text_Data_031 _8 w% Q# @0 K; W; q
  1406. .WORD Text_Data_048 }" e  t4 |  C  z
  1407. .WORD Text_Data_05* @) A) @6 M0 z8 \
  1408. .WORD Text_Data_06. @- U: b% Q' [/ _, y/ ?& G4 ?
  1409. .WORD Text_Data_07# U0 V4 g% s0 r
  1410. .WORD Text_Data_08
    ( q/ e4 C- [( M& T8 s2 X; i; D1 l
  1411. .WORD Text_Data_09
    ) _" N8 p' j$ \# m  ~; h% a+ {4 N
  1412. .WORD Text_Data_10
    3 f* W! Y! f1 }3 C
  1413. .WORD Text_Data_11
    6 x) U- D2 _( J$ M: a7 a' v
  1414. .WORD Text_Data_12$ y( P$ o; |4 t/ B+ b6 D
  1415. .WORD Text_Data_13
    6 a2 I3 }; b% [' ]5 n9 }
  1416. .WORD Text_Data_147 y* k5 \& C: R7 D
  1417. .WORD Text_Data_15
    6 J9 t5 w% o0 B
  1418. .WORD Text_Data_16
    $ m8 G  Y3 P2 v; y  m0 i
  1419. # P1 [1 q" V; A- f1 H/ Y  ^
  1420. ;==================================================
    & J' r" K; D* R4 _5 K2 X
  1421. ;文本数据$ u4 A( l1 |& K7 B: z" G7 M
  1422. Text_Data:
    : R6 }, A, ^4 t6 u; _& n, O9 \' v
  1423. Text_Data_01:) W  P7 D6 H4 w
  1424. .STR "01.INVINCIBLE"
    0 b& Y( g4 h0 v1 C8 z
  1425. Text_Data_02:
    : e- `: S* N( T; h  Z
  1426. .STR "02.INVINCIBLE PLUS"; [2 m2 K2 P% p5 I3 f
  1427. Text_Data_03:
    : h# e6 s% C5 M# Q, ?/ D: @' K6 n; s
  1428. .STR "03.LOCK LIFE"% O# ?% a4 ]% o9 K4 [$ c+ r
  1429. Text_Data_04:, n& D/ s9 b+ q# g- K4 j: i: M
  1430. .STR "04.LOCK WEAPON"
    4 A8 s1 r/ ?& G5 Y
  1431. Text_Data_05:3 C# K: k& t9 V/ {; g
  1432. .STR "05.SEL CHANGE WEAPON". I( Z" F) i5 e0 y4 I% y
  1433. Text_Data_06:7 h0 o" v% F6 s* l; M& J3 }' V
  1434. .STR "06.UNLIMITED JUMP"1 ^4 L& Z3 [$ k5 ~# n% Z- @9 h! a& f
  1435. Text_Data_07:
    / T4 G  }3 Q. i6 ^0 k
  1436. .STR "07.MOVE FAST"# |% R  V6 c+ ?) O
  1437. Text_Data_08:
    / k& I! t8 j; s- |: q
  1438. .STR "08.SWAP SKIN"
    1 i9 N; L( k$ u* I
  1439. Text_Data_09:8 B. O+ I+ z1 \" u+ [, G; t& _
  1440. .STR "09.EQUAL BULLET"
    : ^8 ~; R: ^* `* Q6 y
  1441. Text_Data_10:( z) n8 B9 v7 z- g+ K7 `' i+ E
  1442. .STR "10.STRONG BULLET"& B# \  V8 ]5 v
  1443. Text_Data_11:
    $ k2 C; v4 p! a7 S5 f/ n. o! {
  1444. .STR "11.KILL BY ONCE"" {% d% h0 ?/ M
  1445. Text_Data_12:/ @" ]4 `5 c  @5 N
  1446. .STR "12.FULL SCREEN KILL"
    $ x0 P) [5 q; _  y8 z+ E! p5 M
  1447. Text_Data_13:/ d+ [  D; a' g& e
  1448. .STR "13.DOUBLE CONTROL"4 N6 M1 N5 N: _4 u
  1449. Text_Data_14:
    ) t% w; V! Q( R
  1450. .STR "14.REMOVE E-GRID"3 T! S5 |' R! _- [5 u  ?6 G
  1451. Text_Data_15:% y* E% _+ p3 k" P
  1452. .STR "15.FALL INVINCIBLE"
    8 A& g, p; I6 J0 M$ I$ j; P3 S" H
  1453. Text_Data_16:' w4 A( Q4 i& @3 d; y2 o, f
  1454. .STR "16.NEXT STAGE"
    # T$ ^" s3 K+ G- E
  1455. 4 x# T! M5 o; ~2 k
  1456. ;==================================================
    . [1 t' `- t0 J, M9 U# {
  1457. ;功能开关检查地址3 c# Y( c+ H3 |2 C1 {/ r! Y
  1458. Function_Addr_A:
    ; \) U: G+ m. A( T$ a; L
  1459. .WORD $01C0+ _7 @/ z0 b" k. O) v; @/ n
  1460. .WORD $01C0/ Z: q# E& m% E  i! Q% p
  1461. .WORD $01C06 }$ I- c! g* v/ i. t0 @
  1462. .WORD $01C0! d9 T& o' n8 W! ?: e
  1463. .WORD $01C0- A$ W4 l% f! N+ ?( \( D; v, h' j
  1464. .WORD $01C0
    + n; D- b3 O' D! |
  1465. .WORD $01C0
    ( ?* _; i( b0 w1 T
  1466. .WORD $01C0
    5 Q( s# ]5 h; k. c" b, U
  1467. .WORD $01C4
    ' {+ W% [; d1 d" L; a
  1468. .WORD $01C4' g4 w5 t$ W2 z; V5 u
  1469. .WORD $01C4" ]9 I: h& v1 X: w
  1470. .WORD $01C4
      b1 x! v& [+ ]2 Q6 S* t. o
  1471. .WORD $01C45 N1 j! J4 _: ]; Y
  1472. .WORD $01C4
    ) w# ^2 b/ s9 [7 H) S" |: V
  1473. .WORD $01C2$ T; O4 }' r+ S
  1474. .WORD $01C4
    9 O1 c! i( g1 Z% O
  1475.   A/ }" E; w0 C
  1476. ;功能开关检查地址. a; y. t- x2 B+ w
  1477. Function_Addr_B:; n& l. a( a6 x' s
  1478. .WORD $01C1
    5 ^* ?  S5 I1 B) O( @4 R5 d
  1479. .WORD $01C1
    $ F* D0 O9 @; ^, n) }
  1480. .WORD $01C1
    1 [3 t" g/ X; o/ W
  1481. .WORD $01C15 D$ u. d  P) U9 k
  1482. .WORD $01C1
    % m8 c4 K. L& ?$ O
  1483. .WORD $01C1
    - }8 ^: t: t" P" f/ e
  1484. .WORD $01C1( _* ~8 v7 e$ ?% |3 L* u* V
  1485. .WORD $01C16 M. g4 |2 ?- n& |- U1 k5 a2 r3 V  M
  1486. .WORD $01C4
    9 \3 l# K, }- H0 Z/ p
  1487. .WORD $01C4
    - |$ Y+ |3 [/ ]7 I% _' K
  1488. .WORD $01C4* L0 x; E* t( y
  1489. .WORD $01C4
    % k9 O6 y3 f& ?' q3 B7 c' X
  1490. .WORD $01C4
    - @+ V2 K3 [, |2 R: |" r- e. x
  1491. .WORD $01C46 L% o& {% _1 D% i& F
  1492. .WORD $01C3, P! f% c% `# J2 r( c/ H
  1493. .WORD $01C4
    / s- W" q- k) ?4 X3 z8 v& J. X; C
  1494. 3 {4 Q2 ?$ ]* }  v! Y; G9 e, ^4 W
  1495. ;==================================================
    % R0 K1 G. T: z3 G! i' [8 \
  1496. ;功能开关检查数据
    ! z; b/ [) X( o( U
  1497. Function_Check:
    . j2 H' P' B! q" X% L. G0 J
  1498. .DB $01" A' U5 k  c3 N' C: b  `3 B$ I' H) m
  1499. .DB $02* N1 \/ Q! c* E  w
  1500. .DB $047 k" g, \. [( K3 p+ D6 M: _
  1501. .DB $08$ F- W+ P6 o/ M- f  E& U' D
  1502. .DB $104 [3 |0 F, F4 w8 ^
  1503. .DB $207 T4 j$ P8 ^6 p2 u6 r
  1504. .DB $40
    & Z5 r) e( p$ q5 ^
  1505. .DB $80
    2 p8 A# H2 y( U3 }0 F
  1506. .DB $01
    / N  y. w/ l) V! i" ]! O9 {3 Y
  1507. .DB $02
    . O$ S' n* n5 @
  1508. .DB $04
    ! R/ N" m* e) M9 V7 |" B
  1509. .DB $08/ L1 P3 _. `/ y6 m; ~* f: {; I
  1510. .DB $10  B! O% m$ H; ]" C! \$ T; I, c
  1511. .DB $20
    : s' e% ~) W3 u* m5 z
  1512. .DB $40
    . G) ]* {4 z% c4 m% y+ o4 H5 [; |
  1513. .DB $80; K# u- B: m& n) G" y3 X+ b8 t. H5 _
  1514. : G0 r! F9 A$ n$ W- m. C+ e
  1515. Char_Rom:
    % m/ @/ G: p. x" y4 S% B+ t: ~, k
  1516. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$003 r4 @, l4 u( ]5 ], o
  1517. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
    7 I$ g$ @. E( K# _+ u# i" ^) @- g  t6 R
  1518. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3B,$25,$00& Y4 W: K4 u* ?) @
  1519. .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$00,$00,$00,$00,$00,$00+ z8 p6 }) T. D, y; \& ~
  1520. .DB $00,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19
    4 `, D: {4 ?% K: F. b% t7 s2 V
  1521. .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$00,$00,$00,$00,$00
    ! C; R$ r( T4 S0 K; \, L
  1522. 2 u! @; w% n! k9 a1 B+ V$ n- ~

  1523. 9 R" W, A* f3 r! x. W7 |5 W- G5 Z* e
复制代码
+ l; a2 O0 s( U& Q3 t/ V2 D. Q
游客,如果您要查看本帖隐藏内容请回复
% e  c8 |8 U8 n! l5 C4 c' n- U
flamecyclone.ys168.com
; a4 [) h7 M" ]/ `7 |4 awww.nesbbs.com

本帖子中包含更多资源

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

×

评分

2

查看全部评分

签到天数: 3008 天

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

使用道具 举报

签到天数: 2523 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1340 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 187 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1766 天

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

使用道具 举报

签到天数: 1195 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 1144 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3450 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1341 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3148 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

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

使用道具 举报

签到天数: 505 天

[LV.9]以坛为家II

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

使用道具 举报

签到天数: 7 天

[LV.3]偶尔看看II

发表于 2020-3-22 14:13:00 | 显示全部楼层
8 C/ U  z' m  {! z* b
Tec.PNG (8.05 KB, 下载次数: 0)
* q; y4 d, g$ c) w
& J. @$ s2 P' f# Y/ l下载附件  保存到相册
' g! r# E0 x) [4 e3 T, \9 s8 h. z9 u, B
+ B6 h6 U8 u8 ?" q* X6 s9 W2020-3-13 13:33 上传3 P" ?) R0 `2 H1 m& i5 ^! Q
得到的文件解压后放在任何FC模拟器即可玩。NES上最优秀的篮球游戏!1 _8 G6 w! F: Z  ^" u7 _) S0 m8 ]) W' A, G0 q" a
修改内容:3 V; S# v, \) \
1)游戏时按START键可以开启或关闭怎样射球都进篮,全场照进!- t9 S2 d" W3 p& \  s
$ k5 U! n3 ]9 K' Y& Q" V4 V3 N' g1 s" S4 N# A* o  K& S. i2 c/ z4 P+ P* n+ w( F  I
不过开启了是双方面的,看到电脑拿着球赶快关闭!(有声音提示)。" p1 M) ?$ I+ `) P* f2
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-17 04:06

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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