EMU618社区

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

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

[复制链接]

签到天数: 39 天

[LV.5]常住居民I

发表于 2019-11-29 20:25:37 | 显示全部楼层 |阅读模式
本帖最后由 yandagui 于 2019-12-4 21:31 编辑 # Q& x2 l$ E1 P7 s1 H
- G9 p# N' H3 ~- H) q" x- C
[FC][魂斗罗][最佳可视化]" q. o6 y- G$ L0 O- j0 M/ ?' m
时间:2019.11.30
4 S) D" {* l8 n, r) J/ _  Q% C作者:FlameCyclone
' R: Z* S  |3 m$ Z内容:
# E5 L" ?* v$ @& y: m& C 1.可视化:   
9 Q3 @, _2 c5 w! T+ W     (1)暂停时按选择键进入菜单1 P9 \+ X! {4 W/ h6 ^3 [
     (2)方向键选择功能: B键开启: A键关闭: 选择键交换,开始键退出& X/ z  l# Z; r# }# @8 c
     1.1.透明无敌: 透明无敌
0 i7 W* t$ a; d/ I# r3 L     1.2.加强无敌: 金身无敌
* K  Y+ M, `& F- s; I+ ^' l     1.3.生命锁定: 生命锁定3条5 P% W+ Y- F: _1 |3 G
     1.4.武器锁定: 武器保持不变" T, c, x2 ~, e3 \) b
     1.5.武器切换: 游戏时按选择键切换武器- W5 G& Y) g8 k" P
     1.6.无限跳跃: 跳跃无限触发, ?2 l0 B5 r) V9 U1 |
     1.7.快速移动: 行走速度加倍
5 |1 J, f$ W0 s: r0 V     1.8.皮肤切换: 交换玩家肤色/ L. P& z+ }! D8 Q7 C" q
     1.9.公平子弹: 玩家子弹可以与敌人子弹对打* g& l7 |1 b) c3 K! O2 t2 y
     1.10.强力子弹: 子弹打中敌人后继续穿透* Y7 B- U  ^1 ^0 J& G6 a0 `! {& l
     1.11.一击必杀: 敌方中弹一发必死
$ l! r7 k% r. U0 ^& n- M     1.12.全屏击杀: 开枪时全屏可击中目标必死
* ~2 ~! ?  ^% A. I# v     1.13.玩家双控: 两个玩家的任意一方均可同时控制两个玩家
9 f' S* k% u# C4 c$ |     1.14.移除电网: 移除2,4关的电网6 X; w  a: x% c
     1.15.掉坑不死: 掉坑后不会死亡: ^* v4 ?- j: M  g$ {# z; g' {" B
     1.16.跳过关卡: 跳转到下一关- D/ ?  V$ Q4 H7 w
  1. ;[FC][魂斗罗][最佳可视化]2 ?& |! c$ x; `& q. m% I
  2. ;20191129
    0 \6 K3 O* \5 H$ _

  3. 1 d: s' ]7 S! w7 c3 K
  4. ;程序开始地址! x. o  A- ~# ]) e' Z
  5. .ORG $9000
    $ t& O7 S! U8 A5 u2 J9 S! ?

  6. 3 z: z! R' \5 O( I, ?
  7. ;==================================================+ C# I; f& o! u4 g5 y. _
  8. ;==================================================  k* B* K: v  ?7 p
  9. ;是否双人玩家
    + j$ B7 D1 e& @
  10. FC_IS_DOUBLE_PLAYERS = 1
    1 w5 c6 G9 M4 u" `# r% e1 R
  11. + v6 d2 U" f7 R1 X& S: i
  12. ;==================================================8 r8 d1 R9 f% ^& a0 x
  13. ;PPU缓冲地址配置
    4 q( T- k/ j$ F; c" O5 }' J1 H4 J
  14. FC_PPU_Buffer = $03002 u, L4 Q! H/ r
  15. ;PPU地址配置! A) z/ `6 H9 W
  16. FC_PPU_Cursor = $00
    6 _0 ]1 M$ q$ }' a; H: ]
  17. FC_PPU_Status = FC_PPU_Cursor+$01
    1 V8 _9 a0 G# w! l& }
  18. FC_PPU_Data_Cnt = FC_PPU_Status + $01
    2 I% T6 V- X* D  ^2 d: ~
  19. FC_Data_Port_A_L = FC_PPU_Data_Cnt + $01
    5 B! O2 V2 [/ U9 E1 n, J
  20. FC_Data_Port_A_H = FC_Data_Port_A_L + $01
    $ m' s7 t3 O* M9 I6 h. \/ ?0 J" t1 i
  21. FC_Data_Port_B_L = FC_Data_Port_A_H + $01: d5 P8 Y6 ^- n: R. R. b! S" E
  22. FC_Data_Port_B_H = FC_Data_Port_B_L + $01* s$ B$ Z- p0 }# Z: ?4 B7 W
  23. ;==================================================+ T* A/ I( W# t9 d2 `8 r6 J

  24. 3 M) U/ G/ m% S0 D  C' {
  25. ;==================================================1 g5 k  n2 K& H
  26. ;选择项地址配置3 Q9 ?2 v) s3 j+ J( ?) t4 u; q
  27. FC_Select_Index = FC_Data_Port_B_H + $01  g* K5 X6 M. O# C
  28. FC_Select_Temp = FC_Select_Index + $02
    2 E# W/ O8 e) K7 i/ d* S
  29. ;NMI循环计时器0 D! f% g4 ]% s! Z! o8 d
  30. FC_Time_Count = FC_Select_Temp + $01$ _7 ^4 m7 G8 g7 T# a
  31. ;==================================================
    # n1 S) p7 f; Z- C  \4 X

  32. ) r4 V& B# `7 h0 ^! u; j
  33. ;==================================================, }$ U% V' b/ e  P0 r
  34. ;光标配置6 V; A2 q  q& x  B1 v
  35. FC_Cursor_Addr_L = FC_Time_Count + $01/ w( c/ N6 K! p! ]; h
  36. FC_Cursor_Addr_H = FC_Cursor_Addr_L + $01# k  ^  Y5 N* r
  37. FC_Cursor_X = FC_Cursor_Addr_H + $01
    5 \1 \9 f( P, T, M4 R! C: Z8 R
  38. FC_Cursor_Y = FC_Cursor_X + $01
    ! [, |( t8 t3 v1 L1 y9 z3 o+ M- D
  39. ;----------------------------------------% a  \3 w1 t( B$ u! s
  40. ;光标图形号7 K' Z% V8 }* e3 k6 u; \: e
  41. FC_CURSOR_TILE = $3E* L9 e& B+ U/ y# \& G# Q
  42. ;光标偏移像素值0 G3 Q$ q- O( [% m4 B9 y
  43. FC_CURSOR_OFFSET_X = 12- {& S! j  b2 U+ V, I
  44. FC_CURSOR_OFFSET_Y = 1( f, R# I* K& z+ `8 n8 v
  45. FC_FUNCTION_OFFSET = 21
    % W5 ^; c7 v' {4 W2 r3 V
  46. FC_ON_TILE = $3D. p! Q! R7 w- \9 _5 E/ f% o- D
  47. FC_OFF_TILE = $3C- ?0 C+ X' v0 A( W
  48. ;==================================================
    $ l( \# T) r' P
  49. * K% J4 g! b! O2 H- w
  50. ;==================================================
    3 |! o% `9 g& S! f2 J  h6 P4 U
  51. ;翻页配置6 J9 P, n6 |8 h8 s0 T, E- Z: ~
  52. FC_Page_Old = FC_Cursor_Y + $01
    4 g7 Y0 l, ]7 C4 h9 ~
  53. FC_Page_Cur = FC_Page_Old + $012 t: C- k2 X3 f5 b3 _
  54. FC_Page_Item_Count = FC_Page_Cur + $011 T$ R: g  N9 p7 E* r& [- b
  55. FC_Page_Item_Buffer = FC_Page_Item_Count + $010 \+ Z* \6 r: w- B  b# A& @6 _
  56. ;----------------------------------------) v' Q, m/ ~5 s1 C
  57. ;翻页属性) ?% Q+ g% i$ v
  58. FC_PAGE_SIZE = 10
    7 p% Z+ K+ D# J2 T/ T& Q- Q7 u! M
  59. ;PPU单次写入缓冲项数
    % x$ j1 A$ q9 U' O5 L
  60. FC_PAGE_BUF_SIZE = 2+ H$ I% k$ Y- z0 f% Q) R! v
  61. ;----------------------------------------
    ; p, K+ e* U. b+ z" U
  62. ;显示项最大索引属性' L: l( i) U+ M" l1 V# o# g
  63. FC_ITEM_SUM = 16 - 1
    & f5 }+ x* k: Z! i
  64. ;最大页索引属性
    1 f  D, T, ?+ O5 ]9 _$ K
  65. FC_PAGE_MAX = FC_ITEM_SUM/FC_PAGE_SIZE*FC_PAGE_SIZE* e7 L" N! _2 m( o0 b
  66. ;==================================================% A; b3 Q( T5 t1 a; }7 q6 [
  67. 0 w! ~, P$ Q6 \1 c1 _# _6 I( H
  68. ;==================================================: C) o/ ?, r0 i; F  M8 ]* x- K
  69. ;按键配置
    ) F. f  y/ K3 [, d+ {% w
  70. Button_Keep = FC_Page_Item_Buffer + $01, Y- F, e' T2 {# T0 y% p$ w$ F( t
  71. Button_Once = Button_Keep+$02; a: J, b( J# ]7 c( E# }9 h4 u
  72. Button_Temp = Button_Once+$02$ U' H4 o8 H' B  |3 ~
  73. Button_Buf = Button_Temp+$02! ^6 ~5 k5 I3 M3 ^% r/ W# f  G
  74. Button_Status = Button_Buf+$02' g0 v' `) l' ~) {
  75. Button_Auto_Delay = Button_Status+$02( j* o/ q: L# z+ P2 P
  76. ;----------------------------------------
    2 w7 l% {  G% _9 _7 `
  77. BUTTON_DELAY_MAX = $18
    + {6 e' T8 f2 b. f& G4 y
  78. BUTTON_DELAY_SPEED = $08( ^$ m. {6 s8 v/ Y

  79. % X& ]0 p+ `7 x5 c' `
  80. BTN_UP = $08
    : m* Y! s  i+ `
  81. BTN_DOWN = $04
    6 Z1 B6 ^! n) l( S  w, Y* I
  82. BTN_LEFT = $02+ u+ @% X8 v% y- B% `
  83. BTN_RIGHT = $01
    , E9 ^8 k# c. S5 W% U6 B
  84. BTN_SELECT = $20: b: q3 N2 C1 x8 B3 f- F# W: |( m
  85. BTN_START = $10
    ( U6 A( j0 _' B5 w' C
  86. BTN_B = $40
    ! o# {1 j# Z  v3 v" @9 @
  87. BTN_A = $80; U- |/ X3 _! I" q
  88. ;==================================================' S  P; q/ k& [

  89. * G1 |" J9 c# I% E2 G
  90. FC_Copy_Addr = Button_Auto_Delay + $01
    : z* E  A6 c7 p" [
  91. ;----------------------------------------
    0 t* B( o1 u6 l1 x( P5 O# d
  92. FC_Clear_Val   = FC_Copy_Addr+$00      ;清除模式覆盖值
    " G4 M0 d: U2 j$ M
  93. FC_Cpy_From_L   = FC_Copy_Addr+$00     ;复制来源地址低位+ |( ~1 S$ Z0 B8 M& A
  94. FC_Cpy_From_H   = FC_Copy_Addr+$01     ;复制来源地址高位) o7 `% o% c, l6 w% t2 L: x
  95. FC_Cpy_To_L     = FC_Copy_Addr+$02     ;复制目的地址低位
    + f" v! Y1 S5 [9 H3 |
  96. FC_Cpy_To_H     = FC_Copy_Addr+$03     ;复制目的地址高位
    ! }4 {: }" E* u8 g1 k1 k
  97. FC_Cpy_Count_L = FC_Copy_Addr+$04      ;复制长度低位
    7 t, j8 K9 x& P2 o& t
  98. FC_Cpy_Count_H = FC_Copy_Addr+$05      ;复制长度高位
    , Q% t7 W/ W, d' `! I
  99. FC_Cpy_Port_L   = FC_Copy_Addr+$06     ;配置地址低位3 @; ~! o( s  M( j$ y
  100. FC_Cpy_Port_H   = FC_Copy_Addr+$07     ;配置地址高位
    $ _. ]/ m4 l* ?. q
  101. ;----------------------------------------
    : J& m/ E  b  k5 v6 \6 U
  102. FC_MODE_RAM_TO_RAM     = $00  ;复制RAM到RAM模式: `8 t7 f4 r$ Y/ b
  103. FC_MODE_RAM_TO_PPU     = $01  ;复制RAM到PPU模式
    $ g; T* `, A$ b
  104. FC_MODE_PPU_TO_RAM     = $02  ;复制PPU到RAM模式( Y" {' H/ i+ ~- O
  105. FC_MODE_PPU_CLEAR     = $03  ;清除PPU模式
    ' {: w* l# v% l- W' }5 v- w8 U

  106. 1 m+ \3 h- Z" m( `6 `5 `5 c4 U
  107. ;==================================================7 G- B3 h: Y( M' N
  108. Rom_Nmi_Addr = $FF  ~+ E- J/ c. a6 M: s  U. m3 Q" V
  109. Rom_Btn_Once = $F5
    " t: O1 Y5 S% a$ z; ^' M$ h
  110. Rom_Btn_Keep = $F94 b! N+ C1 Y2 s0 q; I
  111. Rom_Pause_Addr = $25
    ( K. ^7 A4 D" m
  112. Rom_Pause_Val = $01
    ( Z/ c/ R7 R9 V, i- O7 j
  113. Rom_Pal_Addr = $07C0# G/ v3 y7 a5 A, K/ _! T* _! {
  114. ;----------------------------------------6 y+ |" m! }, r& m* L" _( G: S
  115. Save_Zero_Addr = $6200/ w2 [+ n- ^# g5 B6 m& |  z
  116. ;==================================================
    ' J+ {" t8 a/ y( \- G1 l6 m/ b
  117. ;==================================================
    + S9 k0 J& ^2 S/ J+ ~0 T/ Y: u# s
  118. 8 x# c4 M" v* ~/ K* B
  119. ;程序入口
    & N1 a8 v0 z9 f, ]1 t! e
  120. Enter:% }: X  h2 A$ J5 x+ l) A2 x: {
  121. LDA Rom_Pause_Addr
    " o  N, L( _' F% f& V8 s, c
  122. AND #Rom_Pause_Val7 V1 R. M. D9 e1 k& c3 K
  123. BEQ Quit_End; C3 O: [# M3 v; w6 }3 q
  124. LDA Rom_Btn_Once
    3 b6 U3 N! V/ v: G$ {7 o9 {
  125. CMP #BTN_SELECT
    % s; `/ v5 j* X8 A
  126. BNE Quit_End6 {# y+ U. l( k) @
  127. PHA' R% T* X3 [( X/ P
  128. TXA0 b- a! O! L& D4 `: x" {
  129. PHA
    / c# \  o8 t5 D/ Y
  130. TYA
    ( k! _9 u# L" c+ Z+ J+ J
  131. PHA
    : [8 ~! @" |# n4 A/ n
  132. JSR Wait_Sound_Stop- \0 N  q, F+ U  z9 @' T9 M
  133. JSR Save_Screen
    : w' y2 s: k) b/ S; j% O
  134. JSR Program_Begin* N: p; B2 A  x" P
  135. JSR Load_Screen
    . A. }. `$ T% a2 d: P
  136. LDA #$10
    / Y  |) C  b2 _. Y. K
  137. STA Rom_Btn_Keep; A, _! s- p$ h* M# y1 V' d& `
  138. LDA #$007 i4 s" ^2 w/ O9 g& r& W8 t
  139. STA Rom_Btn_Once
    * V% }: x6 P; L/ Q$ K# i
  140. Quit:
    3 f4 Q0 U0 a0 M% y9 g" D
  141. PLA
    & E8 L3 b  V+ \' @" {8 C
  142. TAY
    3 _: {! F- V) M- E1 z  w, N5 i
  143. PLA0 [. Y9 K& `" G2 r) V
  144. TAX
    & i. \+ j- ?5 [( g
  145. PLA
    ( b) F& `1 X1 |& B1 e6 T
  146. Quit_End:. O" l% R8 S4 ^' G' I
  147. RTS- y* j) u  d2 `( ^! p
  148. ) ?3 u- K! j& e- a
  149. ;==================================================2 {$ ^+ f1 T5 X5 i; E
  150. ;等待音乐结束) l8 ^; X0 b" y2 O( C+ f7 p
  151. Wait_Sound_Stop:
    : x4 F, q' F( q+ c* g
  152. Wait_Sound_Stop_Check:
    5 R& n! ~! j/ Y
  153. JSR NMI_Wait; w$ Y; Y; q* U6 m
  154. JSR $F825
    3 Q( ?. u1 J: j' q- ]# A) x
  155. LDA $010A( a* U- Y6 E/ w% z& `
  156. BNE Wait_Sound_Stop_Check: y& Y+ y8 i( {2 d# U& R
  157. RTS5 U5 e$ W/ P- R' S  S) w
  158. 7 |- }; I; J4 y, A8 ]
  159. ;==================================================  ~# z+ a% y( k
  160. ;保存屏幕数据5 d  s( h1 w! N$ P! I$ g+ R
  161. Save_Screen:
    ( K! `+ Y( C; m9 [3 c. ]
  162. JSR Screen_Off
    2 |: g; w9 r. M4 T: \0 K' N+ p
  163. JSR Save_Zero
    5 z" e/ z  z6 A
  164. JSR Save_Ram9 u2 V; ]. |0 x* ]$ `3 j
  165. JSR Save_Ppu
    7 @/ ^: N" Z, i5 J" l
  166. JSR Ram_Init$ g& o# q0 u: X" ^: T9 _2 ?
  167. JSR Sprites_Init
    , B6 v: @  B2 @9 k% L3 z- k/ O
  168. JSR Clear_Ppu/ ]8 H1 s/ F$ w0 o- h
  169. RTS. F) d4 L0 Y. ]* a& y0 F
  170. 9 E' {* L/ z. A( s  U+ e
  171. ;==================================================. M! S) s2 W, U+ i* Z- H
  172. ;加载屏幕数据4 e" I# Y8 s: X
  173. Load_Screen:" q( h  E4 b5 P- }4 N
  174. LDA #$00
    * {. U8 G$ v" ~! C, D* D9 R
  175. STA $2001+ c# K8 w6 l2 u3 K3 U9 w
  176. JSR NMI_Wait
      G; @! Z2 T: t
  177. LDA #$02
    7 k8 }! w: T+ B7 Y9 y8 G+ V
  178. STA $4014
    0 }- P, y, b- X2 A
  179. JSR Load_Ram7 K' l( w# o- K
  180. JSR Load_Ppu
    / I! Y. U3 c% K' Q* C) D
  181. JSR Load_Zero: M) \' k  N; T+ R$ d) E# w( M7 ?
  182. JSR NMI_Wait
    6 m' }9 s! P6 F1 d- `
  183. JSR Load_Palette# L! E( ]7 P, B* S
  184. JSR Screen_On  J9 n& X; U2 j1 B
  185. RTS
    5 x, k& f# F& n, v2 ~% X; |! x; h# f9 R
  186.   M7 {4 R% ]1 h7 l$ U/ E# {
  187. ;==================================================, r# w6 b5 ?' V8 n- y1 G5 `5 r
  188. ;关闭屏幕
    - p, \1 s- \) F4 f# M- P
  189. Screen_Off:1 u  K  a- Y$ [/ T: [$ K1 a6 L, F0 R; m
  190. LDA Rom_Nmi_Addr7 t, R3 H; o1 e8 K  W; t8 w" T$ \
  191. AND #$7F
    ( p: E1 ^* k2 f" ^* b5 E
  192. STA $2000
    , S( e: w, q! G' m
  193. JSR NMI_Wait
    3 S$ l* C  ~5 |) s& s) m
  194. LDA #$00. e* c! G" B2 B! n4 K* C7 X( V
  195. STA $2000
    & U- }' r& r; b* B* y! U) ^  H. d
  196. STA $2001( Z2 r! f0 |  c! k! y# v- |! y
  197. RTS
    ( \; ?2 V+ c7 n6 S+ M, L

  198. $ ~) A" Y$ h, l
  199. ;==================================================
    8 o9 L" ^' |& S% y/ {  n) y
  200. ;开启屏幕% k6 F8 C" k1 X* v; v
  201. Screen_On:
    ) G6 ?& w# \8 J5 N
  202. LDA Rom_Nmi_Addr' V4 T7 }8 ]3 G! M! k
  203. STA $2000+ N5 v2 `" q, O
  204. RTS& @" O) \3 s7 I0 Y& y
  205. - ^% z. I* j3 Z" t1 F
  206. ;==================================================( v' C& C- J3 |/ i' W* d
  207. ;清空占用RAM" J- K1 X3 B3 I, h; i
  208. Ram_Init:
    " |+ V) k, z) j$ d7 s; s9 m: B- ?
  209. LDX #$00
    ' E: b7 v0 P, R* i) V6 P
  210. LDA #$008 |3 N' U' q( N' Z" z" b9 Q
  211. Ram_Init_Set:! H' R: i5 f" W% q' g
  212. STA $00,X" {, p% T: r2 }# W) x# }
  213. INX3 U2 t+ B; ^3 [# w( `$ B4 a8 N
  214. CPX #$406 @5 F& Y- i" F+ E
  215. BCC Ram_Init_Set7 J2 f4 h0 h- y: W
  216. RTS
    : l0 G0 Z' i# V1 A& E

  217. 0 s% h! X, N+ K& _. _$ C% l
  218. ;==================================================
    5 S7 z# P! i7 {4 L
  219. ;清空占用RAM
    * {% d3 @" J/ e" b
  220. Sprites_Init:
    0 S$ s  N5 z9 P
  221. LDA $2002
    1 ]( r+ L- Y. N6 C/ v9 Z& c
  222. LDX #$00
    2 e- z. J. P. s' _2 I
  223. STX $2003
      b  W2 w4 n9 K9 c3 ?8 `
  224. LDA #$F8
    2 y0 q5 V8 ^1 o
  225. Sprites_Init_Set:
    0 z) r" ?6 N6 @% M1 d( q0 e
  226. STA $2004' x& ?2 I# E. p! M
  227. INX2 d  s& d4 A3 D9 H
  228. BNE Sprites_Init_Set
    $ x6 i  H/ i$ _( j6 f- u
  229. RTS* ^1 m" C" h2 ?3 A# E
  230. ! I( F+ i9 h& \; u4 |: Z8 T/ r3 b  b
  231. ;==================================================9 z7 d1 r+ k4 T4 e4 H5 ?' }1 V5 ]
  232. ;保存零页数据
    4 n3 b4 r" _0 [$ w( z$ M
  233. Save_Zero:1 Z! ^+ [2 q" C. d6 O/ P  w
  234. LDX #$003 X) c5 h( c* c% @8 Z* p$ B' s
  235. Save_Zero_Set:
    # P) C  L# a/ V3 d. V
  236. LDA $00,X
    . m7 Y1 Q5 g: M0 x3 f
  237. STA Save_Zero_Addr,X' i5 }  j# [5 d, u$ |2 f/ w' r! }
  238. INX
    & I. M8 I5 U5 V, `
  239. BNE Save_Zero_Set
    3 L$ E2 H7 a3 [  y. s6 [- k
  240. RTS
    / \( p$ s! i" {/ R& y, r
  241. ' ]* u9 Y9 H. |. V% W
  242. ;==================================================
    ' }  {9 G9 y0 l: M6 I
  243. ;加载零页数据
    - s, y( A9 ~7 [
  244. Load_Zero:
    7 `) J' F+ g- K# K! m  }
  245. LDX #$00* X8 v, w' B1 `) ?5 o
  246. Load_Zero_Set:; x% k' o; C! w" i: o2 T9 M6 L7 {
  247. LDA Save_Zero_Addr,X3 ]/ t( q' {: x8 o/ v; L% ?
  248. STA $00,X" s0 T- m) ]0 `
  249. INX+ P# t( ^: i8 O# b! i! l, G, |
  250. BNE Load_Zero_Set& j+ X5 r% l9 w# q7 t
  251. RTS; ~3 P; q' E- B0 n) f- G% M7 ?& e
  252. : K; S* z% V. b% r
  253. ;==================================================
    - [( e" W4 c/ k7 J9 B% D  H2 B
  254. ;恢复调色板; l' Y7 P3 ?. V% }4 }' z2 J2 R
  255. Load_Palette:+ E/ B0 v" j$ X( w& G& Q8 b$ s
  256. LDA #$3F& m- x1 k& d- I* U. e
  257. STA $2006; _+ d4 k. e7 h
  258. LDA #$00
    . z& A7 f3 X! z2 r4 S2 |
  259. STA $2006( B) R5 g/ S9 ?7 s8 k/ }
  260. LDX #$00$ R* ^( h& O6 ?* |
  261. Load_Palette_Set:
    # l7 Y7 Y* F1 p7 Z! N) v4 k" Z; Z
  262. LDA Rom_Pal_Addr,X* u( B/ d5 Z( a# |6 y
  263. STA $2007# V* c! H; w- u; X; V$ `
  264. INX) D4 y0 {( a/ k
  265. CPX #$20- x0 ]3 s4 Z' ~8 F2 w/ {$ @. k
  266. BCC Load_Palette_Set
    2 s3 l; ^$ ~; E" W1 |3 P4 e
  267. RTS
    3 r; F+ d3 w( C1 s+ E# v' _' b

  268. * j7 ?& `: o" q
  269. ;==================================================1 X" Z3 K! F5 [8 d5 Q( [# l. P
  270. ;==================================================* L( Y( ?6 B" K
  271. ! Y. {$ @. F$ v. |  l! D
  272. ;==================================================5 n6 z8 {1 S" A3 H) r4 W( [
  273. ;程序开始* u% j- X' ~( @
  274. Program_Begin:) ]2 }9 ?/ Y4 V
  275. ;==================================================
    : i0 x3 b, _# Z7 Y& M# F
  276. ;图形设置, N& ~2 X. `; q( l4 L, ~. |' b
  277. JSR CHR_Set. j3 Y3 ]1 P6 w& n3 w& Z& l  e
  278. JSR NMI_Wait8 G) E/ i/ z; ~% ]. }
  279. JSR Palette_Set7 t, L) _0 \: S/ X* S3 }9 g- B
  280. JSR PPU_Data_Page_Show
    : l, e; ]% H  S+ v" Z  H  L

  281. 4 n) q" ^1 }9 ]4 A! J
  282. ;==================================================1 ^9 j, {+ ~& m
  283. ;开启显示
      {' @: X( x) O8 S8 `
  284. LDA #$1E" c1 e8 ~, R  ?& }, L
  285. STA FC_PPU_Status
    % K2 ?# a7 ]  a2 e" V& i
  286. ( \8 N) Q+ B7 K
  287. LDA #BTN_SELECT
    % a& J- O6 o5 D$ C3 ~
  288. STA Button_Keep* g- G( z  |% E* q
  289. ;==================================================( _+ D- s. ]- G6 R, D
  290. ;模拟NMI循环% D1 ^" k$ U% O1 j; q( R
  291. NMI_Loop:( z- m2 x  z- U- W
  292. JSR NMI_Delay
    1 l% U7 w/ c1 I8 q5 w# C* f
  293. JSR Button_Process
    5 h6 w7 y$ |  Q7 d  {( w! @
  294. JSR Button_Auto_Press- \4 F' H1 I: v( S& A& R7 @" ~4 e
  295. JSR Change_Select_Item7 z4 X. e6 H0 |: \. \7 {0 [( E
  296. JSR Change_Function3 e" w! c% H" Q& Y: i( i" \- F1 r; g
  297. LDA Button_Once
    8 B9 \2 [5 L0 s/ W# E
  298. CMP #BTN_START
    ) H' s" r% b- C9 |+ [. R
  299. BNE NMI_Loop+ P) o3 b: u& [- Z, f* ~( J( G. s) `
  300. RTS( A5 R5 A0 Q. D

  301. . d7 x: }. L3 V& }2 I) V% ?7 G
  302. ;==================================================9 g' a7 q% d; Y3 C  N& A3 _
  303. ;模拟NMI中断
    " g3 ]5 q$ |  b- |6 n: W3 ?( N8 G8 p
  304. NMI_Delay:
    4 Q! \1 Q2 S& Q- M
  305. JSR NMI_Wait
    $ T1 Y) U4 r1 P! G$ y) q: t+ o
  306. JSR Show_Select_Cursor
    & p( x/ q. |/ A1 |* m
  307. JSR FC_PPU_Process) A2 f. w- ~. m% [) u2 u6 R1 Y
  308. RTS
    " T! |: c9 w. d5 u& ~
  309. 2 N/ O3 f( }# r
  310. ;==================================================: S$ Y: C& X4 C' @- `# ?
  311. ;等待NMI中断: N4 M. P9 ]+ q/ `* l9 D2 y) t
  312. NMI_Wait:8 ?' j( U0 I  p7 D8 h3 t2 k
  313. LDA $2002/ A- _) n4 g! h2 \
  314. BPL NMI_Wait
    2 H' d: ]9 C8 ]
  315. DEC FC_Time_Count" ?- _. \4 g2 O/ `2 D2 ?& m
  316. RTS3 ]  e3 T7 U7 G9 M. m! S( F4 H

  317. # K7 B3 i8 k* }' q; L
  318. ;==================================================
    4 c2 @2 x5 c( P5 {0 W. b: ^% D
  319. ;PPU写入模式配置属性8 g. q/ ^. a: o
  320. FC_PPU_MODE_CNTL = $FE               ;带计数行写入5 x8 p9 E6 M- h
  321. FC_PPU_MODE_CNTC = $FC               ;带计数行清除
    ! h1 x; I% D. Y* @
  322. ;-------------------------------------------------* y; r; e- v6 Z8 j
  323. ;PPU处理! Y$ Q# Z! m0 i% O$ h, ]7 Y  P
  324. FC_PPU_Process:
    1 I: D+ n. o# ^  O6 C
  325. LDA FC_PPU_Buffer% `6 F1 J, B/ i3 _+ U5 `+ k
  326. BEQ FC_PPU_Process_End
    4 K  m9 O+ v5 j; G( C. e  M
  327. JSR FC_PPU_Process_Beg
    9 ?8 ~$ C* d3 T  I* h
  328. FC_PPU_Process_End:
    & Z. t3 I& G. \  F' n; a% K
  329. LDA #$00
      E& f; o- e2 J" D! x( X" h
  330. STA FC_PPU_Buffer+ _+ n1 k; d; Q: @# ?
  331. STA $2006
    ' {" w5 E3 f  a( @0 y
  332. STA $20067 F( V* N+ m$ T/ z- u( S( S
  333. STA $2005
    3 H. f5 P1 V! D$ V* x1 ]. u
  334. STA $20050 R0 L$ S& ~; T0 G4 m+ d- P
  335. LDA FC_PPU_Status# C* B- e1 Y& [4 C5 G; A4 Y
  336. STA $2001
    ! k& \8 t( _( l9 n9 z
  337. RTS
    7 n% F5 f; ^; l9 X! U8 f8 s
  338. ;----------------------------------------
    - C: l: q0 i7 u8 n- a
  339. ;PPU处理开始
    # N! @8 ^& i  p+ [
  340. FC_PPU_Process_Beg:
    ! Y; @* \" j6 {, B
  341. LDX FC_PPU_Cursor
    ) p7 b2 v. s1 O! h
  342. LDA #$00
    $ D7 t' b% m' E0 r' Z6 [
  343. STA $20019 l& v3 j, d! c0 \! f9 S; G
  344. STA FC_PPU_Buffer,X
    ; c/ T; H! u# V- ?
  345. STA FC_PPU_Cursor
    - Y2 K; `# Z+ P- ~
  346. LDX #$FF
    * {5 a; X  c7 B
  347. CLV' f9 ^1 |$ K- Y  S6 K1 H
  348. FC_PPU_Process_Mode_Select:  k) a3 W8 t- c* `6 x# W3 I4 Z
  349. INX: u5 Y( N" g: ?" E
  350. LDA FC_PPU_Buffer,X' W1 `& l% x9 G" t* f
  351. CMP #FC_PPU_MODE_CNTL: J' l0 O# f& T. s
  352. BEQ FC_PPU_Process_Mode_CountLine; ]. Q& j0 R; k
  353. CMP #FC_PPU_MODE_CNTC$ g( F$ c2 A7 T- J
  354. BEQ FC_PPU_Process_Mode_CountClean
    % i3 E$ [) @3 H4 X
  355. RTS
    : [. f2 w0 k8 H2 V9 J7 L
  356. ;----------------------------------------9 T& X* h, B  ~' t4 j9 ]- b7 p
  357. ;计数行写入模式8 L4 P) W6 _( \  C+ Z' p& {
  358. FC_PPU_Process_Mode_CountLine:% I. g9 L: e1 K* S' O0 f) ~. a% B
  359. JSR FC_PPU_Process_Set_Addr_And_Count# M, l) Q3 E1 G# M  ^
  360. FC_PPU_Process_Mode_CountLine_Write:
    9 W/ u' Z! S" v
  361. INX3 Q$ L. h+ ~$ T6 G$ n) s
  362. LDA FC_PPU_Buffer,X6 j4 ?3 R0 c. C+ o, W
  363. STA $2007
    7 C( R/ D5 F5 l: o! y; W5 u
  364. DEY
    ! |7 O. V+ E" F! A; }: u, `7 X7 H
  365. BNE FC_PPU_Process_Mode_CountLine_Write
    / C/ h/ L4 G- o# x' L( I  I
  366. BVC FC_PPU_Process_Mode_Select
    + y9 Y6 R( s/ Y* S$ A. W
  367. ;----------------------------------------8 s' J& I8 \% Y# T
  368. ;计数行清除模式6 G, J/ `3 b; m
  369. FC_PPU_Process_Mode_CountClean:
    4 n3 U7 F0 ~$ M1 z; T8 I. m
  370. JSR FC_PPU_Process_Set_Addr_And_Count
    ; ^* M) v; j8 A* h$ e; |
  371. LDA #$006 a; S- b( E( _) t2 k4 R
  372. FC_PPU_Process_Mode_CountClean_Write:. m) b# U: k1 }: P& O: |. k
  373. STA $2007+ X, ]9 Y; c/ I' I3 l! ^4 `6 a
  374. DEY
    3 [/ J2 K6 U9 ]  V+ p
  375. BNE FC_PPU_Process_Mode_CountClean_Write
    - m7 ~2 K: [0 ]& E9 T5 B
  376. BVC FC_PPU_Process_Mode_Select" s8 O. z: S4 U  U6 ]6 V$ U) Z
  377. ;----------------------------------------8 m8 f( }" \( k$ G
  378. ;设置PPU地址和写入计数) E1 h' S4 v0 D" H
  379. FC_PPU_Process_Set_Addr_And_Count:9 c. t0 h! x$ E
  380. INX8 N+ |) L4 f, A4 @! O) R% H2 ^$ X
  381. LDA FC_PPU_Buffer,X' {' @* t- t4 ]* H$ ]1 s
  382. STA $2006+ ]. l0 I) M8 U/ Z
  383. INX
    3 C, Y3 c6 D( C3 D8 g; u# W" H
  384. LDA FC_PPU_Buffer,X
    4 L0 U$ {* b) }1 X  I9 p/ N
  385. STA $2006
    3 J6 T3 n( V- K( u  U
  386. INX
    : z% A! h' M- ~7 v/ \% R
  387. LDY FC_PPU_Buffer,X
    , a( G9 h+ h* c, _* g3 y
  388. RTS* [& v2 M0 q# ?; S3 t
  389. ; d8 u* h2 V; q+ h
  390. ;==================================================0 c! d7 v1 r, Z
  391. ;设置CHR图形
    # Z1 i6 G0 T. m
  392. CHR_Set:
    : Y& B* V* \2 A! J4 [8 o3 w
  393. LDX #$05
    + ^3 \+ Q% O! L$ u- i
  394. CHR_Set_Data:% Y/ Z8 J* A7 b) M
  395. STX $8000+ d! a: l% g" S0 i
  396. LDA CHR_Data,x9 U& {8 W0 G$ p" _1 O5 y1 N8 s
  397. STA $8001; d1 _- L/ m- K8 y3 g
  398. DEX
    + f% D+ e: o7 }8 a/ Q2 H6 G
  399. BPL CHR_Set_Data
      S- {. f" f0 l
  400. RTS" @9 @3 Z& f# V! x4 ?
  401. ;----------------------------------------7 H  e: W* `9 P8 }
  402. ;CHR图形bank数据
    ) T0 G! C% m- D8 V4 f* H( P
  403. CHR_Data:
    9 }. ]  Y) Q9 |
  404. .BYTE $00,$00,$00,$00,$00,$00
    + D8 t* y$ o6 n
  405. ( S* I- E  r9 V
  406. ;==================================================
    ( k! T4 ~6 A1 H% v& I1 c- X
  407. ;背景调色板设置+ J+ {* M1 x0 ?/ _6 A! p% E2 x
  408. Palette_Set:
    3 d' M: [8 D# `; Y8 ^
  409. LDA #$3F
    ( q+ M4 H" f1 N6 N
  410. STA $2006; a% n/ n7 T9 b
  411. LDA #$00
    ) g! j+ Z5 P! x5 H& q+ A4 n
  412. STA $20067 m& S! q* v$ r" ~, c! [& ^' K4 ]
  413. LDX #$00
    ! Q( z! Y/ w7 B
  414. Palette_Set_Data:
    " ]; I# _3 w2 u
  415. LDA Palette_Data,X
    . n( Z8 Y  |! P! g6 c
  416. STA $2007
    + Q$ S0 M: B1 T# J
  417. INX
    ! g$ Q5 D$ K8 ]9 p
  418. CPX #$20( ~4 {* W2 Z( u, |- b" b
  419. BCC Palette_Set_Data
    % W0 i( f0 y, w2 \
  420. RTS9 J; u8 b: b: U! L
  421. ;----------------------------------------' N' }" D8 K$ x$ Y# G8 @% o
  422. ;背景调色板数据5 X2 n. ?2 z, G6 l& ]
  423. Palette_Data:1 m3 h9 h8 x# z3 e7 Z. _
  424. .DB $0F,$29,$24,$24,$0F,$20,$20,$20,$0F,$26,$26,$26,$0F,$2A,$2A,$2A4 U$ P4 N( q- B& Y8 u
  425. .DB $0F,$20,$26,$16,$0F,$24,$24,$24,$0F,$26,$26,$26,$0F,$2A,$2A,$2A
    # D$ ~+ g2 g' ]2 z, _
  426. * a0 Y/ r  a6 H. _# {

  427. 0 R2 s# k, Q4 m- N
  428. ;==================================================9 Z3 r, q: q6 x6 ~! o' W
  429. ;按键扫描& n/ N& p" c  j7 T# [% A  s) [: x* O( h
  430. Button_Process:! ?0 g! _- j  Z) G9 i7 G
  431. LDX #$01- B' ]% g3 [4 z& \1 E% n
  432. Button_Process_Beg:
      a; l* @4 ]8 j5 h1 p1 A
  433. JSR Button_Scan+ u0 |$ }/ c& l; q6 n0 P
  434. LDA Button_Keep,X
    " C+ O/ Q" y" c, f  E
  435. STA Button_Temp,X
    9 N! p$ a" g4 ?/ p3 A
  436. JSR Button_Scan- S/ c. C5 f7 v' o, k
  437. LDA Button_Keep,X
    , h: S4 c* L; v4 ~
  438. CMP Button_Temp,X  w1 v( ]" ^, Z5 Z: N4 P( P
  439. BEQ Button_Get_Once( [# X$ K( }6 g" ~3 @. O
  440. LDA Button_Buf,X0 E2 J" o8 b, m; L
  441. STA Button_Keep,X
    - F. F3 D$ ]$ L$ p- f: f
  442. Button_Get_Once:/ s/ A. Z3 R: b3 q" `
  443. TAY  n. u+ C# e/ }9 s" b# t
  444. EOR Button_Buf,X
    + U  h) ~1 l1 y% z5 Q# u
  445. AND Button_Keep,X' j' q7 Y" z+ a/ O" i% d+ _4 [
  446. STA Button_Once,X
    ' _. O/ p  j% [
  447. STY Button_Buf,X
    5 K' s: X2 }" c& Q8 |4 s+ b
  448. DEX. m3 v' ^$ p( u
  449. BPL Button_Process_Beg' E6 `6 f1 [; }- J$ p
  450. RTS2 W! B3 L# @& i) h! @9 J
  451. ;----------------------------------------
    " A+ }; f7 F; X$ K
  452. Button_Scan:
    7 c2 i- O" L- ]! G3 u% e1 x$ Z/ D
  453. LDA #$01# l! d8 L. o5 n; f  A7 S
  454. STA $40168 x& c; x8 C) L( P; h
  455. LDA #$00
    & e8 t0 [! v  y
  456. STA $40162 H" j4 \' M" `
  457. LDY #$08
    6 h' ]- J- b! I
  458. Button_Value:6 l' x+ l( a* h$ B& `. T
  459. LDA $4016,X5 P1 k$ X6 l, q! l6 H5 }
  460. STA Button_Status,X" r. T5 b% F' D$ h1 X( L
  461. LSR  R1 i# i1 u( Y3 U
  462. ORA Button_Status,X8 c4 F  m: A7 _. I( o
  463. LSR8 S6 |4 _/ s& ]9 u9 C
  464. ROL Button_Keep,X
    2 V8 O" K7 }, j4 v
  465. DEY
    $ R- G2 T* q( |* s7 f3 v% N
  466. BNE Button_Value
    1 x5 M' i* T, j4 t
  467. RTS9 [# K" J- N" B% g8 V8 V

  468. 7 ^0 H8 l) _, q% M- q
  469. ;==================================================$ \6 `" D" Z( ]6 y: x
  470. ;按键自动按压4 b- h9 v2 h- |$ K  _3 l
  471. Button_Auto_Press:
    6 O6 D, t! P7 p3 [8 N8 d& W
  472. LDA Button_Keep
    9 h! u3 s( C3 _4 j4 A$ ^0 Y5 \- t# N
  473. ORA Button_Keep + 1. b. u+ i* h9 v7 f* g! ~' o. V
  474. BEQ Button_Auto_Press_End
    & \* k+ J( M2 Z' r/ v
  475. INC Button_Auto_Delay/ l' b* c; c5 s  [
  476. LDA Button_Auto_Delay
    8 ]4 q3 `. ]1 Z0 s9 ?
  477. CMP #BUTTON_DELAY_MAX( v+ P( [% i2 L
  478. BCC Button_Auto_Press_No_Active
    3 m5 v8 I1 K# @) l& N
  479. LDA Button_Keep
    3 U5 V3 |% _# V1 P
  480. STA Button_Once: x% L5 a5 q$ w2 `' A# g; r
  481. LDA Button_Keep + 1
    . k. r5 K5 O+ t# T0 |- a; T
  482. STA Button_Once + 1
    1 {% P, o  Y+ f' Q
  483. LDA Button_Auto_Delay1 b8 ?, _5 r0 j6 O5 J
  484. SEC
    1 ~2 p. e8 p+ b# n  _
  485. SBC #BUTTON_DELAY_SPEED  a; _+ ^9 O  W
  486. STA Button_Auto_Delay
      ^1 N5 Q6 D$ j5 W. A8 |
  487. Button_Auto_Press_No_Active:
    & l% m4 g% d9 _: W. u; J
  488. RTS
    ) c! U3 o% E1 _7 f/ }. |! V: ~# \
  489. ;----------------------------------------
    " X$ `4 n7 E# @
  490. ;未按压按键
    : B/ _3 ~" o* r4 k
  491. Button_Auto_Press_End:
    0 }6 v5 `& f3 {' q8 h- H/ w
  492. LDA #$005 \6 u1 a9 L, ?+ W& J
  493. STA Button_Auto_Delay
    6 j1 i% u& y* l/ w% ~9 `8 j
  494. RTS( Z* M5 u5 `  z* G& w6 f
  495. . f- h! O) f: J( j9 T1 z
  496. ;==================================================
    ' e5 B, z9 O# A) K
  497. ;设置PPU写入模式
    / E. j/ F! I' t+ l7 m
  498. Set_PPU_Mode:
    % D1 W8 P3 u! a- W% j- @4 U
  499. LDX FC_PPU_Cursor
    / A4 S7 N6 Q2 K
  500. STA FC_PPU_Buffer,X
    & N( t& e& D# V, y+ T, b& A# v/ v5 F
  501. INX4 K2 \0 s' B6 a0 A1 F8 T
  502. STX FC_PPU_Cursor
    8 B) u* x' I# I
  503. RTS
    2 P( H0 E5 J4 K! l
  504. + t% Z3 _# ?; B/ s
  505. ;==================================================! L/ ?7 N8 B" D0 \- z, s9 ]2 Z; [
  506. ;写入单独一行文本# T# v8 L1 W8 }( j  U/ v
  507. Set_Select_Addr:
    % B4 o% _0 o& |
  508. LDX FC_PPU_Cursor7 A- P, Q/ P1 m& x; w2 P
  509. LDA FC_Select_Temp0 \6 n2 e' ~- o: y3 c, c" _/ A
  510. ASL
    ! O0 x- R3 @: n$ |$ o! l) j
  511. TAY2 J! \& t9 M7 `$ c5 y4 @  Y
  512. INY9 D0 r' o  h) H) t, h
  513. LDA Text_PPU_Addr,Y, J5 E, [5 Z  t: U. P* K
  514. STA FC_PPU_Buffer,X  n* @' u* @/ I7 E( |1 [8 V
  515. INX
    $ g4 q* N4 ]/ ]! }& e8 F
  516. DEY# N1 L; a4 ^# d0 p$ x  j  B
  517. LDA Text_PPU_Addr,Y
    : H/ ?0 B3 V$ o, {3 T6 ~
  518. STA FC_PPU_Buffer,X5 i4 d% @. c8 R6 P. p6 D* X
  519. INX
    + f6 p8 k0 y& r$ B2 B: B# B
  520. STX FC_PPU_Cursor6 t2 H' Y5 J/ A" h2 n8 V
  521. RTS
    3 ?( b: X: G' F6 G% G1 o
  522. . q& Q1 O8 f! S6 c  u
  523. ;==================================================- k: d1 H# f# o) [" c7 \7 M4 \  e7 O
  524. ;写入单独一行文本. j4 a0 h# X8 T: m
  525. Set_Select_Data:$ t, x) h  r* O8 g
  526. LDA FC_Select_Temp
    ! y- }0 i1 `. t+ `% n1 D7 [# s
  527. CLC
      n+ {% ~1 A& k
  528. ADC FC_Page_Cur
    6 B) w# F$ L( `' K' I7 ?
  529. ASL
    " s! h- f' {) Y1 q% ~% n* ^' ^% [& T6 S
  530. TAY) k* |  e1 i+ R8 L
  531. INY( R$ ^6 A* Q/ X8 F6 \
  532. LDA Text_Data_Addr,Y
    & j4 \2 _1 c$ c
  533. STA FC_Data_Port_A_H
    $ G; a" m8 S5 Y
  534. DEY
    5 |7 ~; R: k7 f3 V) Q7 h
  535. LDA Text_Data_Addr,Y
    ! @' s% T  g, L' B4 h# A+ G
  536. STA FC_Data_Port_A_L
    & M9 X7 E) B6 x1 ~: C
  537. RTS2 s8 L" o  L8 v1 y* ^3 d

  538. * @# ^7 G) c9 b+ s# }3 ?9 G0 E
  539. ;==================================================, T8 v) l0 v% I! _! H2 U% U
  540. ;清除旧文本
    + g/ \0 P3 ^" }3 I
  541. Set_Select_Data_Clean:; y% t7 l3 S  h0 `2 f0 H
  542. LDA FC_Select_Temp
    , R4 B7 L1 A4 n
  543. CLC
    5 f2 P0 `8 C6 F+ s/ R( |; c
  544. ADC FC_Page_Old! e7 }, u2 s9 n
  545. ASL
      p8 M+ T' E( P7 O! I- J/ I1 w0 m$ b
  546. TAY+ J8 C9 l2 T6 T/ Z, X
  547. INY0 P$ V& V& a, K& X
  548. LDA Text_Data_Addr,Y+ t5 J' o; [% \0 J9 }! C6 R" q% c! ?
  549. STA FC_Data_Port_A_H# Q4 j% s  y/ K* O' E6 h4 z
  550. DEY
    , d) E3 M2 x/ e# M0 B
  551. LDA Text_Data_Addr,Y
    " C" F) K9 K8 y  }$ i  L7 X3 N
  552. STA FC_Data_Port_A_L
    : K+ _0 F* ?! e7 f7 j3 s" v# t3 P& J  t
  553. RTS" ]1 s6 \  E; y1 }+ y( C
  554. 6 L. o4 v! r. N
  555. ;==================================================, x4 D- o$ o' C: I, C9 w! t! X
  556. ;写入单独一行文本
    - _( `1 ?8 @6 Y# B3 l
  557. PPU_Data_Write_Item:8 V# n, M* s5 X$ ^/ m: ]/ ~3 f
  558. LDA FC_Select_Temp: i4 }, q5 U8 y) n$ t& m: K' c3 s
  559. CLC
    1 t4 F2 A' t" M; O# ]0 z) u- x% O! \
  560. ADC FC_Page_Cur- I. w6 o' s2 `) A3 h
  561. CMP #FC_ITEM_SUM
    9 o7 P# `. I  c5 D+ K' ]3 \0 |2 c
  562. BEQ PPU_Data_Write_Item_Set
    / G, |8 j0 u! H+ P$ ~0 A
  563. BCS PPU_Data_Write_Item_End) B/ Q, L- n5 c* @5 e4 ~
  564. PPU_Data_Write_Item_Set:6 L  y$ H" `7 |  Y* [
  565. LDA #FC_PPU_MODE_CNTL
    , l, n: n3 a- N4 x% S
  566. JSR Set_PPU_Mode
    % ^2 E+ [2 j3 |  U0 s
  567. JSR Set_Select_Addr
    0 Y, @$ v# I8 i2 D0 A
  568. JSR Set_Select_Data
    / d* w. H6 R9 m8 a( K
  569. JSR PPU_Data_Write_Line7 z8 E0 N# h; Z5 Q
  570. PPU_Data_Write_Item_End:
    3 m2 l# Y) p/ ]3 d/ `* D, F
  571. RTS; s; @% P4 o5 l4 s9 y0 L1 Z6 J4 G

  572. 7 F; Z% t6 Y1 c& c# J
  573. ;==================================================+ d$ G, X  Z4 O
  574. ;清除单独一行文本
    9 y# x0 n. w- D! t; N
  575. PPU_Data_Clean_Item:# e, }8 w+ k3 G0 X
  576. LDA FC_Select_Temp
    . B1 h+ Q/ U  r" x1 ]! {8 g! E& \! W
  577. CLC
    3 M" P% i4 A8 b9 f6 V, U( f
  578. ADC FC_Page_Old; A' B! [! h% _& R( I
  579. CMP #FC_ITEM_SUM
    & ^. j/ ?& Y  g  k! X( ^" u
  580. BEQ PPU_Data_Clean_Item_Set
    - @- ]/ s. Q# u: p: N; L8 Q
  581. BCS PPU_Data_Clean_Item_End4 C5 F+ l& W9 k7 `& V
  582. PPU_Data_Clean_Item_Set:- t& {( i; {+ L: [% g0 u
  583. LDA #FC_PPU_MODE_CNTC
    0 F$ X! e0 f* a/ Z
  584. JSR Set_PPU_Mode  p4 R# m, Q" F2 q* G0 o7 [
  585. JSR Set_Select_Addr
    : ~, h: E) Z* p( \( i/ O& B6 R$ d9 }
  586. JSR Set_Select_Data_Clean
    # T* |5 u0 H4 j. p0 P" B7 W/ V
  587. JSR PPU_Data_Clean_Line
    , l. l9 T, u; m" I3 W2 t
  588. PPU_Data_Clean_Item_End:
    + F8 D  n2 ?4 b- z
  589. RTS- U" M6 ?0 I; `4 o9 G. ?& E0 W' j

  590. 8 g6 c8 `& U2 x3 u. n" [1 H
  591. ;==================================================  S: T. G# R0 \' a8 `
  592. ;页内容写入
    : H$ a0 r2 ~: j/ K0 j+ C/ Z
  593. PPU_Data_Page_Show:
    ! l0 I; m) Z! ~" e1 Z
  594. LDA #FC_PAGE_SIZE
    4 T, b1 G' B% |* W' h
  595. STA FC_Page_Item_Count
    / m6 P% w( q. E# p# ?3 b
  596. LDA #$00
    / V& D7 O2 e0 C2 a& E4 C
  597. STA FC_Page_Item_Buffer
    ) h$ E7 L3 c+ k/ Y
  598. STA FC_Select_Temp
    ' h+ q" E, k' J8 G7 D
  599. PPU_Data_Page_Item_Set:
    : D3 |0 `9 x# |, A
  600. JSR PPU_Data_Clean_Item
    + S* _, D1 j# `, N. _  C
  601. JSR PPU_Data_Write_Item
      R* h( j& S9 O' R# g3 \
  602. JSR Function_Status_Clean/ m9 J% a! a9 H9 Y& @9 T
  603. JSR Function_Status_Show
    / e/ ]4 @+ u7 b" c, _
  604. INC FC_Select_Temp
    5 ^& n6 X  X+ [! }/ t& K
  605. INC FC_Page_Item_Buffer! F; o% G. [0 ^  e1 T& R* }, `
  606. LDA FC_Page_Item_Buffer
    ; K1 G. ~0 t4 [+ X
  607. CMP #FC_PAGE_BUF_SIZE
    4 r* m/ h7 i( }
  608. BNE PPU_Data_Page_Item_Set_Check. }( t( J7 K6 |
  609. JSR NMI_Delay, S9 G  `3 X' P/ K/ d4 q/ s3 g
  610. LDA #$005 I4 l9 o! G9 Z5 I
  611. STA FC_Page_Item_Buffer$ a' ^/ D, U$ t5 C& q- B
  612. PPU_Data_Page_Item_Set_Check:% V/ _0 W- {+ |
  613. DEC FC_Page_Item_Count
    & @( C, I5 u; }; R! X9 i
  614. BNE PPU_Data_Page_Item_Set
    ; h* ?( E7 F" j
  615. PPU_Data_Page_Show_End_Check:
    0 }* m$ y" Z0 p5 ~  Y7 z6 Y6 f" c
  616. LDA FC_Page_Item_Buffer
    ! y+ F. E0 K" g  D
  617. BEQ PPU_Data_Page_Show_End
    & N  N3 G5 u# y7 A, w" ]
  618. JSR NMI_Delay# D: Z+ U- s; B
  619. PPU_Data_Page_Show_End:
    ' \! F& V; |8 ]( g' ~3 r4 t: f
  620. RTS% Y1 T; d7 z$ r+ t6 C

  621.   h* c5 f' a& c5 ?, |3 e7 |
  622. ;==================================================' |6 K6 P+ W8 m" p% c
  623. ;PPU单行数据写入接口& H  @" s/ n$ v  P. O/ Z+ m2 Y* {
  624. PPU_Data_Write_Line:
    ; X4 R/ N! M3 |- j: Z, u
  625. LDX FC_PPU_Cursor
    7 P4 Z; N* x! J! Q  I
  626. LDY #$00
    ( U0 z- q1 B: W5 t2 o! F
  627. LDA (FC_Data_Port_A_L),Y
    ! D" o/ \8 v' E6 w+ \6 S! j
  628. STA FC_PPU_Buffer,X: Z$ h( v& L2 o2 n" l* {4 F& s4 f: Y
  629. STA FC_PPU_Data_Cnt
    9 ]; b5 _! q+ `( q4 j  q
  630. INX: ]3 u2 {: S) t
  631. STX FC_PPU_Cursor7 o$ p7 F6 V) ^
  632. INY% ~" h1 `/ M3 C* P
  633. PPU_Data_Write_Line_Set:) {3 y$ B& F6 y( @3 C% s
  634. LDA (FC_Data_Port_A_L),Y
    ( r" W- ]7 ?" ~& H
  635. TAX
    - d* N) k# G1 y% N! ^
  636. LDA Char_Rom,X
    * e( v8 E- S% v9 T  C. F& I
  637. LDX FC_PPU_Cursor# r, y/ l$ b. e$ K4 z- u
  638. STA FC_PPU_Buffer,X
    $ S: w! N, V) j4 J9 n  W
  639. INX( Z& l: s5 R* Q4 ?+ r! e. }
  640. STX FC_PPU_Cursor5 S9 E# f/ F* f3 b% }
  641. INY. g7 L2 ^: M4 H) M' E
  642. DEC FC_PPU_Data_Cnt
    & L6 }: L4 H! G6 q. w" Q; B5 u; N
  643. BNE PPU_Data_Write_Line_Set
    8 b& f+ s, J* l- [: T
  644. STX FC_PPU_Cursor& m9 O9 Y  ]% q7 ]* y
  645. RTS
    ) j5 `4 s! L8 m9 O

  646. + t8 ~5 M0 C1 _" W
  647. ;==================================================
    - `% @. A+ J, m- l* f
  648. ;PPU单行数据清空接口4 H/ p) s; q2 L$ A) d
  649. PPU_Data_Clean_Line:  a3 x6 X% j1 _/ Y; ^" k0 x1 t9 k
  650. LDX FC_PPU_Cursor! F1 |( L: `, |) F3 H# B  r
  651. LDY #$008 `0 o" B6 n* R4 V0 i9 B: q2 u
  652. LDA (FC_Data_Port_A_L),Y
    0 [1 v3 O  C1 e' r3 ^! J1 k" q
  653. STA FC_PPU_Buffer,X7 P/ A0 b; _0 U9 Y
  654. INX# ~! J( B5 H5 L- O# F& \# s
  655. STX FC_PPU_Cursor2 [/ @& _( _) B- ]% A# t/ o( z
  656. RTS( {+ n* q+ f( C9 z2 R

  657. # P2 }/ G6 }( W. w9 _: B
  658. ;==================================================
    ) Y6 b, r) |8 Y5 V8 Y, d' v. v
  659. ;更改选择项
    ) E4 u2 F" j) Q3 `4 [1 _$ g; C( R" _
  660. Change_Select_Item:4 U9 Q- g+ w2 H
  661. Change_Previous_Page:
    ; K9 \. P) M: F7 r
  662. LDA Button_Once6 C5 [) F9 B$ E& m
  663. ORA Button_Once + 1
    & D8 j6 X1 m! ^1 z" b$ f( `
  664. AND #$02
    3 D, T( \& b. K0 S3 w$ N7 H
  665. BEQ Change_Next_Page/ ]6 Y4 {3 W1 r8 g
  666. JSR Change_To_Previous_Page& ^3 O# G) @, m/ l
  667. Change_Next_Page:
    - A5 a  H' y$ Q3 J; ?/ L6 p
  668. LDA Button_Once7 @' P# j: E- \: B' b
  669. ORA Button_Once + 11 [# \6 k( @* g' v
  670. AND #$01
    8 D" N3 @) y  z4 ~" S+ Q* o
  671. BEQ Change_Previous_Item! G' ]- t2 D2 z- l  `
  672. JSR Change_To_Next_Page
    * h9 }0 X7 e! a9 W6 u1 o: Q. d
  673. Change_Previous_Item:# r2 A- d# L$ w0 V; {, @! s
  674. LDA Button_Once& ?' A$ A9 Y* L
  675. ORA Button_Once + 1% d: B9 D$ J* S5 a  V: p
  676. AND #$08& l/ [: q) f9 V* c& v$ ~, J
  677. BEQ Change_Next_Item
    : e& |0 r* E* g5 q: m7 E
  678. JSR Change_To_Previous_Item
    - I6 o, C  }$ f; _4 L4 \
  679. Change_Next_Item:
    $ G2 Z  _  C: A6 r" V* B6 q
  680. LDA Button_Once$ y) g- g2 P8 F& Z6 y
  681. ORA Button_Once + 1% R: u7 V# B  w% |# {5 ?" p! {3 i
  682. .IF FC_IS_DOUBLE_PLAYERS8 C9 z6 }& Q3 ?: N/ w" N2 m/ x
  683. AND #$04
    , a- D- [, R9 l  q( ~$ o2 l' |
  684. .ELSE
    7 q, P0 g  {, K; W; i4 ?
  685. AND #$24  j5 p- L  `7 G
  686. .ENDIF  y. f5 G% i  ~) ?* a4 Y/ j: j
  687. BEQ Change_Select_Item_End
    . B9 h/ G% H  v/ t- l; }; P
  688. JSR Change_To_Next_Item. f8 s; h5 a, `$ a4 X
  689. Change_Select_Item_End:
    $ n) r* e$ `" z4 ^( I* l
  690. RTS
    1 E7 l* O2 p' q( c

  691. + M& p& f) F, I1 _& f
  692. ;==================================================+ c0 [2 j9 s. y3 l. L
  693. ;切换到上一个选项" \( m0 w1 n  H4 B7 y. l% @
  694. Change_To_Previous_Item:* t) [9 |$ D' t! |4 N# J
  695. LDA FC_Select_Index! _8 Q, [- J0 T
  696. BNE Change_To_Previous_Item_Set
    + k* S' ?  s. l3 P  F. y
  697. ;----------------------------------------  @/ _" B: D/ U3 Y
  698. ;切换到末页最后一项$ Z8 b, d5 \5 J/ n( g
  699. Change_To_Previous_Item_Set_Last_Page:5 R, w; |: R) G- c. Y6 |$ `
  700. JSR Record_Last_Page_Index
    * z/ N2 E4 |& B1 Z9 {. \  ~
  701. LDA #FC_ITEM_SUM
    ! d) D! W6 p# C- K' ^" m
  702. STA FC_Select_Index
    : ~  z0 ^+ i# p4 N% y) q' E6 ?
  703. LDA #FC_PAGE_MAX
    % k' X& |& j- W) L! J0 Z( `; F: }
  704. STA FC_Page_Cur
    $ A* |( }9 v7 K! `) y0 J8 k
  705. JSR Update_Page_Content
    3 F5 f( O7 o+ I  ]
  706. RTS1 n; l* z, Z: b
  707. ;----------------------------------------% T/ `: k2 X1 ]
  708. ;切换到上一个: K& g& f. a% b' g9 G! Q1 }# i% ~
  709. Change_To_Previous_Item_Set:# N' K, K5 _0 _
  710. ;检查是否需要换页0 G! S$ C9 z( d, m, w  g
  711. LDA FC_Select_Index
    : k7 N) t' t; V, y- n/ n2 C
  712. CMP FC_Page_Cur' H- K4 [! Z; k" y% h$ [. b( p7 y
  713. BNE Change_To_Previous_Item_Set_No_Page
    5 Z+ I; R! U$ f3 a
  714. ;----------------------------------------3 f% X( S# W7 j5 S5 u9 Y7 r
  715. ;切换到上一个(需换页)
    % I* S! S$ m1 p" L
  716. Change_To_Previous_Item_Set_Page:
    5 U0 |4 J) N* S" Y
  717. JSR Record_Last_Page_Index
    2 O) X4 N; _! }  m4 \1 [4 d
  718. LDA FC_Page_Cur
    - u' F+ c9 T* B" E, j: N
  719. SEC
    ) T) ?) Q6 G. G+ H$ W- W5 p0 u3 t& t
  720. SBC #FC_PAGE_SIZE$ A2 V, B- M# r$ ~' m% R, A
  721. STA FC_Page_Cur% x+ b* `* Q2 h6 L$ j2 Z' ~* y0 Q7 R4 H$ I
  722. DEC FC_Select_Index
    - g* m1 A5 d: A
  723. JSR Update_Page_Content, q5 n7 ?! c/ X
  724. RTS
    8 U# K: G2 @" w3 U5 N5 F
  725. ;----------------------------------------
    + s4 |. _& Y7 q! ~, X$ ?/ u
  726. ;切换到上一个(无换页)
    $ N5 ^& S3 n( b  I0 F
  727. Change_To_Previous_Item_Set_No_Page:6 }1 e$ D3 r+ M$ t1 [* n& L
  728. DEC FC_Select_Index
    & @: q/ d7 c* A5 X8 p
  729. RTS0 Z/ u+ F- S' s( ~& e5 j( K' A

  730. ; s# d2 J) ?8 }7 D
  731. ;==================================================
    8 d3 f. y3 k3 x3 X, H. I5 Y# a
  732. ;切换到下一个选项
    2 `9 C6 h) F: S. Q6 g
  733. Change_To_Next_Item:3 L  M% r5 R0 r" j2 S
  734. LDA FC_Select_Index
    # ]  @- f1 u, K7 q
  735. CMP #FC_ITEM_SUM6 D% J' q, b" b% o; m* |( s! }
  736. BNE Change_To_Next_Item_Set: \$ w0 k1 z; ^$ [9 G  T
  737. ;----------------------------------------
    , h5 m% H" z8 E- G
  738. ;切换到起始页第一个( e7 a& e$ n- ~( V
  739. Change_To_Next_Item_Set_Begin_Page:
    1 B6 J1 d1 E' O& N! H! K3 u
  740. JSR Record_Last_Page_Index
    $ N$ V+ ~6 `- O  S3 Z" x
  741. LDA #$00
    ' W/ q5 m- K6 B- [1 u
  742. STA FC_Select_Index
    # v" [3 Z" a: H9 \8 [2 }1 `
  743. STA FC_Page_Cur
    : ~) b! y' j; b) I$ g  ~/ ]2 Z3 s
  744. JSR Update_Page_Content
    : E0 e8 A/ X9 k2 Z) T9 Y6 q% v
  745. RTS: }. b4 X0 j9 j* y
  746. ;----------------------------------------
    6 k( O) t' m3 i5 ]+ T: C0 ^% x9 l
  747. ;切换到下一个- [) T5 L7 @  i
  748. Change_To_Next_Item_Set:% X8 h4 O+ `; _7 |+ u
  749. INC FC_Select_Index7 T! F+ U- m3 W$ ~+ d
  750. LDA FC_Page_Cur3 x" l- G5 e; G& ^& E
  751. CLC
    6 d2 o" _2 u" ?6 ^6 l
  752. ADC #FC_PAGE_SIZE
    * j; c$ u' q( l+ A3 A! o* F- L1 {0 a
  753. CMP FC_Select_Index9 k5 V1 y% C2 m/ [" ]2 e
  754. BNE Change_To_Next_Item_Set_End
    , w8 Z' `# j6 t/ b
  755. ;----------------------------------------# i4 o6 u7 P' E% ?
  756. ;切换到下一个(需换页)
    " V$ q0 Z) e7 `. T. r5 x/ }" E8 R5 Q
  757. Change_To_Next_Item_Set_Page% P+ t6 g: S% ]7 _! }$ e1 N. u
  758. JSR Record_Last_Page_Index
    % }9 @* W! `# E$ _+ s. p1 r
  759. LDA FC_Page_Cur1 {6 }' j  D# v, B. Q' R: s
  760. CLC
    . l& V, i# Y, B1 p
  761. ADC #FC_PAGE_SIZE8 f0 p7 o% h% m$ t2 t& {
  762. STA FC_Page_Cur
    ( Z7 H6 D/ R) C- P* H
  763. JSR Update_Page_Content
    ! P; _% W. F. f) f8 a/ x
  764. Change_To_Next_Item_Set_End:) y4 |4 n* W6 F; O' v
  765. RTS) m  y' R+ \2 i4 Y" n+ g! E! e, H& c5 m
  766. , p  K3 U5 R5 D
  767. ;==================================================- z& D: c0 L+ l) K; c  y
  768. ;切换到上一页
    & z* q( Q9 ^- f2 a7 l5 Z( h
  769. Change_To_Previous_Page:
    + w7 L  o; D* P5 v6 s3 h/ j  R" u
  770. LDA FC_Page_Cur& e% h1 a; ^' w4 O# N
  771. BEQ Change_To_Previous_Page_Set_Last_Page
    ' ~; K/ B* \; O; J+ T, ?
  772. JSR Record_Last_Page_Index
    7 P+ T- U1 i# [/ c0 D) z/ s
  773. LDA FC_Page_Cur
    " q8 O* Y1 z$ A; ]: [, ]
  774. SEC7 k9 C2 ?$ s6 X5 {2 j
  775. SBC #FC_PAGE_SIZE
    8 s3 k; L% Y8 q' k, @* D
  776. STA FC_Page_Cur) F3 J( A; e) @1 g' o  E( s
  777. LDA FC_Select_Index
    . ~& U: Q& }3 J. m: g/ F5 J5 d5 O
  778. SEC
    3 A, p' e/ O: Z+ Q6 C- r5 k3 d
  779. SBC #FC_PAGE_SIZE
    - X" M$ Z3 O, f  b7 [9 Y* |
  780. STA FC_Select_Index
    8 [+ L# O! a: {! {$ _& j
  781. JSR Update_Page_Content
    3 a' t% V* z( B- `, ?1 F. V& u
  782. Change_Select_Last_Page_End:1 t" o7 R& s5 j- d' O# D5 r1 p3 m
  783. RTS$ E3 X. l3 B1 ]! X
  784. ;----------------------------------------1 `0 {5 y( U7 f% d5 S  l6 y2 ?3 q6 f2 f
  785. ;切换到最后一页2 R8 d. K6 {& c2 }  a* R
  786. Change_To_Previous_Page_Set_Last_Page:
    $ W$ d% ]) n3 ?4 d* i$ F" B8 |
  787. LDA #FC_PAGE_MAX9 E1 V5 p: K7 A" c# Z, b. N: ?
  788. BEQ Change_To_Previous_Page_Set_Begin_Item* M0 x  K: \# k: j+ Y9 m4 }: j2 U
  789. JSR Record_Last_Page_Index: `, V! h! d9 {& A; b: f
  790. LDA FC_Select_Index
    ( s. {( ^! |) R
  791. SEC5 e& {6 r% h1 x( }
  792. SBC FC_Page_Cur
    " }& F* P7 N# C; O& D# h/ M$ z2 x1 g
  793. CLC
    ' E2 E& W- S) \! H, |4 i4 T6 r
  794. ADC #FC_PAGE_MAX
    $ V- ?5 `. W6 D
  795. STA FC_Select_Index- D3 \; A0 |6 D
  796. LDA #FC_PAGE_MAX. l9 ?8 [' j6 `
  797. STA FC_Page_Cur
    ! D. D9 x+ g5 {/ D7 ?: v9 ~
  798. LDA FC_Select_Index$ t& r' B9 K# C3 z
  799. CMP #FC_ITEM_SUM
    4 I1 X3 O9 g$ v* V* O4 e
  800. BCC Change_To_Previous_Page_Set_Last_Page_End4 c4 V0 g6 K6 E4 `( [
  801. ;----------------------------------------
    4 _. a9 i. \/ z. V
  802. ;切换到最后一项/ z2 n/ Q- i# ^1 ^$ V  w+ b/ Q( `
  803. Change_To_Previous_Page_Set_Last_Item
    + e6 I" N3 n, ~' W9 H7 ?% d
  804. LDA #FC_ITEM_SUM( j  p8 S/ C2 n0 l
  805. STA FC_Select_Index
    2 f, N+ m2 F* `# a
  806. Change_To_Previous_Page_Set_Last_Page_End:
    $ x6 o' u+ ]; Y: O& n; c! Q! ?
  807. JSR Update_Page_Content7 I) d# f3 e3 A* _" ^4 T3 A
  808. RTS
    - ^# r% O! c8 {& z5 r1 u
  809. ;----------------------------------------$ b& K! X) r" a) F5 S9 e
  810. ;切换到起始项(最大页只有一页时), f: ~3 D/ b, `9 q; F
  811. Change_To_Previous_Page_Set_Begin_Item:
    , Z0 @5 J+ }, H# z+ E
  812. LDA #$00
    7 e0 k% l" N2 }) N" V# \( t
  813. STA FC_Select_Index# i% u+ H3 M4 Q5 R, e  P3 y+ \
  814. RTS
    0 `/ e! d7 E5 f- v& S3 c1 t' I; t* A

  815. & P* h. Y* n+ T3 }
  816. ;==================================================
    * P- ~8 y1 \+ n, [
  817. ;切换到下一页
    8 |$ U7 F7 n5 j+ M
  818. Change_To_Next_Page:
    7 j5 w+ b( x% ~1 }
  819. LDA #FC_PAGE_MAX
    7 o# E) L2 `0 h, S
  820. BEQ Change_To_Next_Page_Set_Last_Item
    2 u  Q  f- I: v$ b' p3 s5 Y/ k3 t- j
  821. LDA FC_Page_Cur3 L$ y) R- ]2 t0 O; `* v6 W+ N
  822. CMP #FC_PAGE_MAX) N" b0 K# g0 H  @; c' ~6 o# l. h$ \
  823. BEQ Change_To_Next_Page_Set_Begin_Page
    " k3 f: b4 E$ I% K; i
  824. ;----------------------------------------
    / l  E% L9 ^+ w5 L
  825. ;切换到下一页4 y3 [5 D6 v  w7 e
  826. Change_To_Next_Page_Set:
    : y: p* r# }0 d8 h8 `
  827. JSR Record_Last_Page_Index
    , I* q+ u3 I( r& P) A) r
  828. LDA FC_Page_Cur, {& E. ]7 y5 h8 G7 e' A
  829. CLC  s$ I5 ?$ T; {, d- P
  830. ADC #FC_PAGE_SIZE7 S4 h; J4 G/ t# |' }
  831. STA FC_Page_Cur6 C$ }% t7 T( U. K
  832. LDA FC_Select_Index2 ]+ ?- y# J4 Z* k
  833. CLC
    3 E8 _8 j4 B1 C8 q, }# v
  834. ADC #FC_PAGE_SIZE$ y# x  Z7 r3 ]! _* a  ]: M. i* y
  835. STA FC_Select_Index3 p' J1 K/ p( d  o
  836. LDA FC_Select_Index
    5 y8 y4 |' V2 O( E2 W* B) |
  837. CMP #FC_ITEM_SUM
    ( `5 G  q9 |- Q' L4 K
  838. BCC Change_To_Next_Page_Set_End) }' e  x+ ]% t: o4 E3 Q
  839. ;----------------------------------------9 V9 J+ O' T: o0 V) k$ t2 W$ l
  840. ;切换到最后一项& W2 W% k. A/ \  T& K
  841. LDA #FC_ITEM_SUM
    6 g* N% S$ G7 M9 g- e1 q- o0 R
  842. STA FC_Select_Index
    , s3 O  e6 U% y
  843. Change_To_Next_Page_Set_End:! ?- u% `# c- G9 t1 L* g2 l" M
  844. JSR Update_Page_Content
    * i3 p; X# m8 c0 z- P( Z  S
  845. RTS* M( E$ G0 X1 X1 J3 u% M& I' z
  846. ;----------------------------------------
      Y- I+ s2 O& ]/ w
  847. ;切换到起始页
    $ E+ n+ D9 c2 ~3 l/ N
  848. Change_To_Next_Page_Set_Begin_Page:& B" @9 q+ c2 e# V3 Y
  849. JSR Record_Last_Page_Index
    + i2 w* _( k8 ~2 f% [$ F
  850. LDA FC_Select_Index
    5 c9 |+ `  B% Z, u; K7 j% ]
  851. SEC
    % I3 a2 f! E9 ?4 H$ \
  852. SBC FC_Page_Cur
    1 y. j& q5 o: V4 m
  853. STA FC_Select_Index
    9 @  Y( w1 ]+ I) o
  854. LDA #$007 V4 G+ x- s2 k) `7 S. K
  855. STA FC_Page_Cur
    / e) y5 \* q9 G) ^7 M- E1 f& j* v" T
  856. JSR Update_Page_Content* B# v6 @; Z$ S; f; O9 R
  857. RTS2 w; V7 f* i9 @; j
  858. ;----------------------------------------. S' f. g% |$ a& u( |6 v$ q# e; B
  859. ;切换到最后一项(最大页只有一页时)
    ; n4 p4 O1 |1 O# Y' V4 T1 P( |) ]! G! V
  860. Change_To_Next_Page_Set_Last_Item:
    2 ]' o3 c1 n: S$ w. K
  861. LDA #FC_ITEM_SUM2 Q/ J8 }  T: I, h# H* h- B; ]
  862. STA FC_Select_Index3 ]- B4 ~! z- J7 ^5 z2 {% t
  863. JSR Update_Page_Content
    % r" c  a* e( p  @$ y" s
  864. RTS
    # j  a7 ?% Y9 n# s* F/ k

  865. * R/ T# k2 v$ }. d1 C. j; h* M: T& T
  866. ;==================================================
    8 L1 {6 R8 P: i
  867. ;更新页面内容
    & d7 j% n# ]6 N0 y4 ?  Z
  868. Update_Page_Content:
    0 k% v7 L  G" W7 ~- }7 n
  869. LDA FC_Page_Cur6 Z& H: O9 ?- H; n
  870. CMP FC_Page_Old
    - L) I9 x- R8 G/ j
  871. BEQ Change_Update_Page_End
      c! ?' i- \' [1 g4 ?3 I) y  u4 G, V
  872. JSR PPU_Data_Page_Show- S5 z  H' W$ v# r! [& y7 ^
  873. Change_Update_Page_End:$ n! m; f( ~, Q/ w, T
  874. RTS
    0 {8 l- W# Q; p9 c

  875. * ~$ P. h* p1 ?% y8 l! W- ^
  876. ;==================================================/ b5 m& Q; a$ m$ s
  877. ;记录上次页索引
    2 z+ S- ~1 e& k% E
  878. Record_Last_Page_Index' x, \) q6 G+ P/ E- u& ^
  879. LDA FC_Page_Cur
    2 o+ X$ d; ?7 v, w) E6 Q: |
  880. STA FC_Page_Old
    ( S; w5 v& G' O& h6 Q8 B( d8 C/ O
  881. RTS2 F9 c* `  l3 v

  882. $ C. j1 O4 K/ ~( F
  883. ;==================================================
      b* a* I% M6 h% m% t0 m
  884. ;显示当前选择项光标
    6 |8 U, ~8 a, n8 Q. @! s& e
  885. Show_Select_Cursor:
    ) Z( {1 W* R( h- K( F  G0 o
  886. LDA FC_Select_Index
    ; Z8 u! d2 n1 [2 N% x
  887. SEC
    3 P4 e4 }) \- [! B+ P
  888. SBC FC_Page_Cur. h5 }/ D0 J( x8 O% T
  889. ASL
    ; }! z, E& l& ?8 M7 d
  890. TAY
    ' P) |; r2 [+ y% R
  891. INY
    0 q( x7 o/ a# {( L: d, K/ A
  892. LDA Text_PPU_Addr,Y
    " K3 y+ [0 g3 F! r" H5 \6 w; O$ \
  893. AND #$03( m: E, k7 x  S0 @8 X
  894. STA FC_Cursor_Addr_H. |! H* b0 a, H4 P) ~5 u# ~* F0 }
  895. INX
    2 C( y- t' h  R( s
  896. DEY
    : Y$ Q2 Z9 q/ F
  897. LDA Text_PPU_Addr,Y
    " B$ Z# k$ K7 O# m8 k! ]# {+ V
  898. STA FC_Cursor_Addr_L
    ! S8 E/ N; @- p, d& |
  899. ;----------------------------------------
    0 j* f! a+ g5 w6 w& K. }
  900. ;计算光标X坐标) K! J8 O2 c1 j# N- }) J, Y3 x
  901. Show_Select_Cursor_Set_X:
    % [4 f2 K# H; d5 \/ p) V" |
  902. LDA FC_Cursor_Addr_L
    ; s) H/ K4 x" }. W" l
  903. AND #$1F
    0 t3 j' S( `0 e+ U4 P3 h" t3 P
  904. ASL/ d) i0 S- D; Q) l3 e) t0 S
  905. ASL. ^- i* a* ]7 q
  906. ASL
    3 v6 B* K2 x: [' s
  907. STA FC_Cursor_X
    ' t; t( t# d* H+ Q. H7 D" i
  908. LDA FC_Cursor_Addr_L) I& Q2 O$ k' O( c
  909. AND #$E07 l/ Q' n* D7 F5 ?4 y
  910. STA FC_Cursor_Addr_L" E! c' h: o) D2 x$ H; k0 p
  911. ;----------------------------------------
    8 d. c" Q, J. n9 S
  912. ;计算光标Y坐标
      q2 g8 Z! \* }, y3 }- ~
  913. Show_Select_Cursor_Set_Y:
    * a/ h* F- B/ Z1 [9 a' t/ r
  914. LDX #$05
    $ A% S" h" E. n2 P
  915. ROR FC_Cursor_Addr_H! d1 C& B5 S$ l# ~- G
  916. ROR FC_Cursor_Addr_L
    8 }. `5 V5 k3 x1 n
  917. ROR FC_Cursor_Addr_H* E( F+ t9 u; M, Q6 g# X
  918. ROR FC_Cursor_Addr_L. t: f, l0 \. R9 x7 m6 Z
  919. LDA FC_Cursor_Addr_L
    ) U; W8 p- U. {) c+ L- P
  920. STA FC_Cursor_Y
    3 S; @, A& G9 w$ w0 K
  921. ;----------------------------------------
    . G& k: d; Y' v9 e" T
  922. ;写入光标
    / Q6 d2 V" ?0 U+ q2 S
  923. Show_Select_Cursor_Set:
    ' o( U% e% i7 A3 x; v" ~# d
  924. LDA #$00/ Y5 i( s. L9 ]3 p
  925. STA $2003
      N7 T3 r1 A; C4 G. Z
  926. LDA FC_Cursor_Y
    + F7 L+ z. Y; t
  927. SEC& Z" z% \' B' f$ p0 F
  928. SBC #FC_CURSOR_OFFSET_Y
    - ~3 A- f( N& s. g
  929. STA $2004% H$ K* e: b" s8 \; M" \& y- W
  930. LDA #FC_CURSOR_TILE
    3 P) ?  a( k; o, a% W. e# }: y4 |
  931. STA $2004. t8 I8 r8 ]3 k' z' W5 r; W
  932. LDA #$00+ w; h$ F6 m/ i/ k" i8 _/ K
  933. STA $2004. k! c6 j6 ^" {- d6 h' p3 Y
  934. LDA FC_Cursor_X+ o, Y  y# \5 w" ~2 O
  935. SEC% W" N) g& q# G; v5 W0 `# l7 ]& j  t
  936. SBC #FC_CURSOR_OFFSET_X9 j0 t6 O4 f  `4 i
  937. STA $2004% u) q4 D3 n. n+ j- U" \  J. t
  938. RTS" g6 E# r3 x3 ~! @! B9 l4 O. ^

  939. ; K+ J. ~. X2 P! W& V& ?% A2 v
  940. ;==================================================
    5 ]. K3 ]2 M" O1 F, a
  941. ;切换功能
    3 x- p$ L1 V' _7 E1 C" }
  942. Change_Function:, n6 [. W0 ~* Y8 u8 l' h  v
  943. ;----------------------------------------
    . e1 g3 M$ E# ^8 \( h
  944. ;开启功能A3 g! [4 }; |9 N
  945. Change_Function_On_A:
    3 w; x$ G+ `9 t4 ^6 @" b& ]2 ^
  946. LDA Button_Once
    9 C4 Y- a) y; r( E
  947. CMP #$40
    ! m. n" a9 y# ]& D/ a/ }0 k9 ?
  948. BNE Change_Function_On_B. O& ]; ~7 y# R5 T7 Z$ r+ ~
  949. JSR Change_Function_To_On_A* O# r, x( ?, \; H* Q; g% s
  950. JSR Function_Status_Update9 J4 J4 D9 {7 D8 d" ?# u
  951. ;----------------------------------------
    # e, m/ ^. |. W1 e: X
  952. ;关闭功能B6 q1 Q+ D: P1 y( p; G9 r
  953. Change_Function_On_B:
    + |! r# m! t9 O
  954. .IF FC_IS_DOUBLE_PLAYERS% q9 M, L; M9 N: s
  955. LDA Button_Once + 13 i) Q9 ]& q- R+ K9 C$ [
  956. CMP #$40- @* l5 H8 {1 p1 @
  957. BNE Change_Function_Off_A
    7 {* k) x; B0 G+ r
  958. JSR Change_Function_To_On_B
    3 h1 v. h* m+ E3 ^7 ?' r- k
  959. JSR Function_Status_Update
      y$ R' ^8 E5 `  Q' c
  960. .ENDIF7 \* F3 j- J, a7 N, A
  961. ;----------------------------------------6 Y/ A4 z3 I  a5 v
  962. ;关闭功能A
    . O6 H+ a9 G" h
  963. Change_Function_Off_A:+ J: D8 @& e4 R7 M1 T& |
  964. LDA Button_Once
    " f& T4 x$ e! ]# [2 c1 K
  965. CMP #$80
    2 h2 p5 v3 P2 @  S- B
  966. BNE Change_Function_Off_B' |3 {/ n3 D* V0 j5 k
  967. JSR Change_Function_To_Off_A5 j9 `* E6 F; a6 d$ z
  968. JSR Function_Status_Update
    * V8 F! v4 q8 W- Q
  969. ;----------------------------------------
    ! r& @, S' O/ x, |; f
  970. ;关闭功能B# I$ O. n$ A: w8 n
  971. Change_Function_Off_B:  W0 }% s5 @9 y4 x$ i4 O) p  c- q
  972. .IF FC_IS_DOUBLE_PLAYERS
      J% y8 n8 k: j6 r) m, i4 O
  973. LDA Button_Once + 1
    % M6 m, Z  T$ W/ y, y6 o; |6 \+ O
  974. CMP #$80
    0 c1 @1 F  w& i5 ]* h8 K. T3 c% _
  975. BNE Change_Function_Swap1 G; o9 ~+ R. A0 V5 J
  976. JSR Change_Function_To_Off_B8 G& ?' P. L% t, o
  977. JSR Function_Status_Update" E. B& v7 c7 k& _. s$ O
  978. .ENDIF. Q! j5 v' E; N5 Q& L* E# ?
  979. ;==================================================3 q* m- i8 `9 Z" ~; r; h% z3 q
  980. ;交换开关2 u" d- I2 R: K; W+ n
  981. Change_Function_Swap:
    6 |. W8 D& O7 x9 e  r8 c
  982. .IF FC_IS_DOUBLE_PLAYERS
    & |1 A% }( M  F. a  ]' Z) N# c
  983. LDA Button_Once& I+ o+ q: H# W% K$ d
  984. ORA Button_Once + 1
    ! h3 n! u( J; ?/ r9 r4 ?! c9 i
  985. CMP #$20
    # c5 F0 N0 J$ @4 t! t
  986. BNE Change_Function_End* }9 ~$ C' b/ D
  987. JSR Change_Function_To_Swap. v/ o6 f, e* D+ k( a
  988. JSR Function_Status_Update
    + x0 C  k/ v2 q4 O
  989. .ENDIF
    $ w# Q& n' h0 J
  990. Change_Function_End:
    . p! J2 M3 @: n6 [5 K5 ]8 g
  991. RTS
    " g2 k5 e8 g5 x  ~0 w$ `
  992. 9 u  f; P# C* A2 }  M( T
  993. ;==================================================/ J9 [1 E1 o+ \7 E) n7 d8 _
  994. ;交换开关状态) P# z1 l, W3 E& p3 \9 s
  995. Change_Function_To_Swap:
    , T) B* J/ W' e6 K- S; m" N7 A! J
  996. .IF FC_IS_DOUBLE_PLAYERS( _- c  J; C/ w% G7 s
  997. LDA FC_Select_Index" d3 a! C( I! }, F
  998. SEC
    $ `, _7 F+ ^4 \' ?, _2 `
  999. SBC FC_Page_Cur0 o5 S/ v0 T7 v" d1 l$ \5 c
  1000. STA FC_Select_Temp
    ( W( m2 D3 v  C! e6 p
  1001. JSR Set_Function_Port
    - ?1 J- d0 q9 D7 H8 o0 G
  1002. LDY #$000 w4 U" L  S7 X' c% g7 |/ L
  1003. LDX FC_Select_Index
    , |% q8 B+ v+ A; l' p' T, ^' R( ]
  1004. LDA (FC_Data_Port_A_L),Y/ n7 w% ~' A1 F
  1005. EOR (FC_Data_Port_B_L),Y* K8 J6 A* s# I# \8 \4 R6 q
  1006. AND Function_Check,X
    . t/ m# m- {0 f3 x
  1007. BEQ Change_Function_To_Swap_End
    6 f% ^& f3 o" ~% x0 q( }
  1008. LDA (FC_Data_Port_A_L),Y6 D2 g+ O; r7 K; w& q
  1009. EOR Function_Check,X4 x$ U$ M3 R  `: \7 q
  1010. STA (FC_Data_Port_A_L),Y; n( K3 `! a2 p' T, x( Z
  1011. LDA (FC_Data_Port_B_L),Y
    ; Q" e  d6 C& S2 V- H  o& Z7 q
  1012. EOR Function_Check,X
    4 \$ F- P" [4 }" g9 E! D2 \, y2 v
  1013. STA (FC_Data_Port_B_L),Y; W$ p9 N5 Q- o) a& q: e$ `
  1014. Change_Function_To_Swap_End:
      U2 X6 h6 z" {$ h* v# {
  1015. RTS
    ) B. Q; D, t9 M
  1016. .ENDIF
    6 M8 i0 s/ `6 F1 {/ a

  1017. ! i# q7 h- R0 Q4 l

  1018. + i* |) ^7 m; h' o+ D
  1019. ;==================================================: [, E) p% g5 B0 U& c0 i. Q) A
  1020. ;更新功能状态) I2 d4 Z! a5 ]5 k; M2 W2 x
  1021. Function_Status_Update:' S: w2 @/ c5 L, e3 y# I* s; c4 R
  1022. LDA FC_Select_Index2 y( S* {" E! j# ^0 ?2 U$ u
  1023. SEC
    + }/ B8 A7 z0 q. h& G
  1024. SBC FC_Page_Cur! l2 s$ a, Y8 g5 X/ @% Z# w9 |
  1025. STA FC_Select_Temp
    # f4 A# r! d2 ]; B
  1026. JSR Function_Status_Show6 q) ?, t" f4 G" ]) b$ _* p" D3 G
  1027. RTS8 ]& n0 t9 O: Z

  1028. / S, c' n, Y4 V* P
  1029. ;==================================================
    6 p& _. r: e$ Y$ z  \
  1030. ;设置功能地址端口- f+ X' o6 o0 S! X- u# l6 G7 ?
  1031. Set_Function_Port:
    & b. S5 M2 W( D4 w
  1032. LDA FC_Select_Temp
    8 @& u' C: W) o9 e* A" L8 _
  1033. CLC
    1 a+ k, D! G3 G
  1034. ADC FC_Page_Cur
    . L5 ~- G1 K4 e- i0 Y7 V" `3 ^
  1035. ASL
    $ M* N4 C/ |3 `5 f6 g, S
  1036. TAY
    $ @/ f# d9 y6 W
  1037. INY  O" e, {9 }+ Q7 g  E' f
  1038. LDA Function_Addr_A,Y# D! U2 L/ b  V  S' o% C
  1039. STA FC_Data_Port_A_H" Q( M* N- @! S- M5 ]
  1040. .IF FC_IS_DOUBLE_PLAYERS/ T+ D/ W8 Z# N- |8 w8 M# q
  1041. LDA Function_Addr_B,Y7 I9 P" q: `4 H+ A. [% m
  1042. STA FC_Data_Port_B_H
    8 {  C$ c" H% g
  1043. .ENDIF
    % i# b9 N$ z" |% D& T4 {
  1044. DEY
    5 Z$ W  n1 t8 g, j% B# |: ?
  1045. LDA Function_Addr_A,Y
    4 l5 U3 D& t  M* l# m3 f; x
  1046. STA FC_Data_Port_A_L& L0 B( w3 e9 B' |% L; ~4 c
  1047. .IF FC_IS_DOUBLE_PLAYERS
    # Y( {/ T$ j" g5 ~
  1048. LDA Function_Addr_B,Y
    6 R, C4 H2 q$ b
  1049. STA FC_Data_Port_B_L
    7 ?" @5 W  F% e5 F+ x; p" Y$ a
  1050. .ENDIF
    + k, j9 ~2 P, |
  1051. RTS: G% }% J/ N$ t+ l% {6 @  g
  1052. 7 L# |& L4 U$ p
  1053. ;==================================================
    1 Q* Z$ r' D, N! m2 R9 q- _
  1054. ;设置功能临时索引( ~9 |* b2 O8 @/ w
  1055. Set_Function_Temp_Index:
    ! X8 T# g4 b  w1 c# e" u$ Z
  1056. LDA FC_Select_Index
      K" d; _' n! ~/ S: U$ e3 H& D
  1057. SEC
    3 G. y) i% V9 m3 K
  1058. SBC FC_Page_Cur# r( c, y, z, N* D$ ^
  1059. STA FC_Select_Temp
    0 F9 `% q6 ?% ]  N* ?9 g9 O2 \* V
  1060. RTS- P% V+ u# y: T; F9 L, s4 g

  1061. $ e7 f7 C& S2 r
  1062. ;==================================================
    ( m4 V: Z$ {1 i- g
  1063. ;开启功能A
    . L! U$ P+ h9 `6 ]
  1064. Change_Function_To_On_A:
    ( P8 ^! j/ S0 a
  1065. JSR Set_Function_Temp_Index8 u% w, m" `, c1 v4 o4 f" i
  1066. JSR Set_Function_Port2 E; Q$ b3 J9 k2 }% E. @
  1067. LDX FC_Select_Index
    2 A+ @) L6 k7 J. R. Q
  1068. LDY #$00
    : v% X$ t7 P- h
  1069. LDA (FC_Data_Port_A_L),Y
    1 r6 s+ Y; t: T) [
  1070. ORA Function_Check,X. \3 I$ C5 S5 b5 g) m8 l" `/ s5 Z
  1071. STA (FC_Data_Port_A_L),Y
    : X+ x9 s- l' K
  1072. RTS4 c! N7 n8 M; T
  1073. ;----------------------------------------" M7 a0 A# A# v# o
  1074. ;开启功能B# x2 i! c7 I7 y% x( E# {4 O8 u
  1075. .IF FC_IS_DOUBLE_PLAYERS
    2 U4 `/ {$ T* R" t
  1076. Change_Function_To_On_B:6 S* h9 U9 y+ c1 h# A
  1077. JSR Set_Function_Temp_Index
    ( g) e. I3 j* N
  1078. JSR Set_Function_Port
    % V0 O( w9 g8 J
  1079. LDX FC_Select_Index
    4 {* b, O- x3 q! E& t% p, B% f
  1080. LDY #$00
    3 t' \8 x0 }3 ]' j7 X0 E& y( M" E
  1081. LDA (FC_Data_Port_B_L),Y& Y5 g, ^9 D  l( j! G5 \
  1082. ORA Function_Check,X5 J$ z- ~( j* n7 X. S9 n  b
  1083. STA (FC_Data_Port_B_L),Y
    ! m2 r# o" z9 r8 T
  1084. RTS; t0 N6 s# k. h2 x( {9 h; i+ o$ Y0 N
  1085. .ENDIF+ {. b1 t8 [6 c* Q/ L6 E
  1086. ;----------------------------------------1 U5 C2 `' ?: C% S( v. o0 q# |
  1087. ;关闭功能A8 a/ K. \: o3 _( Y2 i) K8 A
  1088. Change_Function_To_Off_A:. E- ]  k2 Z! H
  1089. JSR Set_Function_Temp_Index8 ?+ o- X* k9 w5 x
  1090. JSR Set_Function_Port
    " [1 t4 c. ]. k) W
  1091. LDX FC_Select_Index6 X0 {3 v, @) V- ~) i
  1092. LDY #$00: H: v6 c* Z) `) L
  1093. LDA Function_Check,X( v0 S: n" g5 q6 P5 V6 }
  1094. EOR #$FF1 \; i. P5 x9 L* `1 z
  1095. AND (FC_Data_Port_A_L),Y& Y* i: g* y, p2 ^& @' Q' s4 x
  1096. STA (FC_Data_Port_A_L),Y
    6 O; S7 f8 a8 O- b+ c( a
  1097. RTS
    / ]* U% Y7 U" b+ h# S" N' B
  1098. ;----------------------------------------0 B5 l. r: F- N/ q
  1099. ;关闭功能B5 D6 p- `9 W1 P3 U7 Z
  1100. .IF FC_IS_DOUBLE_PLAYERS6 l7 v+ t" V: }2 W  P' b4 G* ~# @
  1101. Change_Function_To_Off_B:6 _4 g; z. s8 d! q' K# Q& \
  1102. JSR Set_Function_Temp_Index+ p' ^8 X" E+ K
  1103. JSR Set_Function_Port$ E6 ?6 i/ F# K
  1104. LDX FC_Select_Index5 o, M- p$ T' `3 b( P  u
  1105. LDY #$00) y4 V  d8 |$ S( l4 u
  1106. LDA Function_Check,X
    5 D1 I( m' V* ]  @
  1107. EOR #$FF
    ( _4 i7 Y8 \6 K: P
  1108. AND (FC_Data_Port_B_L),Y7 @: G7 |. ?% k. C6 M, d6 M5 x5 v
  1109. STA (FC_Data_Port_B_L),Y
      H9 i2 B/ l  K0 E2 u2 m* M
  1110. RTS; B1 E* e, G7 Y' F
  1111. .ENDIF/ m$ U' i# L2 d0 t

  1112. 1 V( @3 G7 `& W8 Y, v4 }, l
  1113. ;==================================================
    5 O5 I4 L" L* n
  1114. ;设置功能状态PPU地址
    $ H. i" N/ Q; C: [' a
  1115. Set_Function_Status_Addr:
    9 L+ ]& d& O0 u. v2 s4 g# \
  1116. LDX FC_PPU_Cursor
    ) V3 b6 G' r1 U
  1117. LDA FC_Select_Temp
    " I* h/ X( @0 H( W: k
  1118. ASL
    7 c5 }! u/ W; ^& M
  1119. TAY: p7 Q& b  _; p0 }" E# k
  1120. INY- W0 e' q3 \8 A( G; c5 U
  1121. LDA Text_PPU_Addr,Y
    + H0 x9 c$ I$ S' {; B! l+ k) Z9 E
  1122. STA FC_PPU_Buffer,X
    7 r9 v# B  q; d: x" A
  1123. INX  F+ ?8 T- c- h
  1124. DEY
    ! ~8 W1 r( X/ l; Y& W  M  w0 v2 Y
  1125. LDA Text_PPU_Addr,Y
    ) H( t) F$ R- r, `
  1126. CLC
    4 p0 C+ F' f1 J' x+ a
  1127. ADC #FC_FUNCTION_OFFSET, g! H8 w4 w# i: h0 i0 G5 }; J
  1128. STA FC_PPU_Buffer,X
    % I4 [8 W2 M3 S0 Y  B
  1129. INX
    9 ~: k! G) O' [
  1130. .IF FC_IS_DOUBLE_PLAYERS
    $ d0 m. v3 o& j9 x* x
  1131. LDA #$02" S$ S/ ^2 f6 H& D: }
  1132. .ELSE- p. g" m1 G* H6 d: d# K
  1133. LDA #$01
    ; s( t* g" o4 q: h3 @
  1134. .ENDIF
    ! B! H6 x% }; G2 L
  1135. STA FC_PPU_Buffer,X
    6 P; |, u. w$ }
  1136. INX0 e# A* ?7 W9 p, U7 Y+ _
  1137. STX FC_PPU_Cursor
    1 p) t) ^7 o. k
  1138. RTS
    5 u4 c# p* P# C1 ?

  1139. - u4 ^9 s, \" L5 m: u; m2 ?
  1140. ;==================================================
    2 B3 _* |6 k* M! e! k8 Q
  1141. ;获取当前选择索引
    * t) B+ Y$ O! v' k# S
  1142. Get_Select_Index:+ H/ N$ F4 e+ ?
  1143. LDA FC_Select_Temp: n, B/ A! t/ K$ ?, u8 l
  1144. CLC
    8 R& ]+ Y8 _" Q7 Q
  1145. ADC FC_Page_Cur7 r% r- p8 H+ W. O) i3 F) g
  1146. TAX
    4 b9 p! _* L9 w/ g% C
  1147. RTS
    ) U" `2 I7 K" g+ e

  1148. 2 x( @2 e! [- o0 G9 A4 s2 L' i
  1149. ;==================================================
    ! T3 k  c( d6 b* D+ l
  1150. ;清除状态文本5 l# s# g& Z: v# o9 J
  1151. Function_Status_Clean:
    % r+ I/ }+ j' t. K- X2 l
  1152. LDA #FC_PPU_MODE_CNTC$ @4 v' o$ g. V' R2 }9 R
  1153. JSR Set_PPU_Mode# z* ]6 }2 s1 g7 k" m
  1154. JSR Set_Function_Status_Addr
    ; P. r$ L  p: @  a0 Y: M
  1155. RTS
    & d6 k* Y7 v6 D
  1156. + \; t& H, [8 H  s
  1157. ;==================================================$ _  [) k$ i% ^3 G
  1158. ;显示开关状态+ w; z  ~! B2 a5 S" p
  1159. Function_Status_Show:, q) |) f- c0 ^* y* t0 Q) y" G3 E
  1160. JSR Get_Select_Index8 @- K% l1 u; t
  1161. CPX #FC_ITEM_SUM. ], i1 ?% L; ^& d7 `
  1162. BEQ Function_Status_Show_Set3 `7 F) r! V$ o' ?5 z
  1163. BCS Function_Status_Show_End
    ; P/ g  L" n1 w  J' z- q" Z& ^; Y
  1164. Function_Status_Show_Set:
    : r. ^, y# N% K& \* G4 L: [7 D
  1165. LDA #FC_PPU_MODE_CNTL8 [* ^* L9 h( b$ H/ z: n! k5 l
  1166. JSR Set_PPU_Mode6 G/ Y9 e& n: }
  1167. JSR Get_Select_Index0 Y6 G; j' W0 R7 C6 x& |2 H
  1168. JSR Set_Function_Status_Addr" ^8 U: T  k. c* S# w5 M# N) r
  1169. JSR Set_Function_Port
    ! y; v8 T$ |$ o; V( }
  1170. JSR Function_Status_Show_Check_A
    ( {0 t" D) x& B% T' E
  1171. .IF FC_IS_DOUBLE_PLAYERS
    0 X( a6 X2 j1 H$ s1 }( w8 d
  1172. JSR Function_Status_Show_Check_B
    ! u5 K1 H9 l% u. @2 _' k5 H
  1173. .ENDIF
    1 f) q7 P" Y* L5 G# r/ a) Z& C
  1174. Function_Status_Show_End:
    . _: R0 U, @: H2 G. Q4 f( m
  1175. RTS  _9 x& y/ `( Q. k5 X3 k  W
  1176. ;----------------------------------------) D+ Y8 b+ R" w3 ~) A
  1177. ;检查功能A状态
    % i- `# n, u* V0 {6 z
  1178. Function_Status_Show_Check_A:" z- t7 q; T' i! z6 [' o# V
  1179. JSR Get_Select_Index
    ! x* _% z5 F" @9 V7 F
  1180. LDY #$00( c% E! z: y. q# C# }, _
  1181. LDA (FC_Data_Port_A_L),Y
    # @9 i, v# U9 [+ q7 z/ r; g# |8 M! G. Y
  1182. AND Function_Check,X
    2 l* l  \- j5 N+ P- b* A" x" Y; ~
  1183. BEQ Show_Function_Status_Off
    , F( k: z6 E0 Z9 @* g* {* V( `! T
  1184. JSR Show_Function_Status_On
      q/ t( r0 j+ r
  1185. RTS6 w4 d& c$ w7 ]& v: F( p
  1186. ;----------------------------------------/ s5 S4 y8 Z2 U) K3 F, w
  1187. ;检查功能B状态
    % t$ |: \0 ^( M
  1188. .IF FC_IS_DOUBLE_PLAYERS
    4 V2 `8 g8 \$ g+ O. r0 L
  1189. Function_Status_Show_Check_B:
    / q4 o# |9 j  D
  1190. JSR Get_Select_Index# O3 b1 ~% [& a; U- S: ]
  1191. LDY #$00
    " \) D4 H+ G% @1 ~; C3 i
  1192. LDA (FC_Data_Port_B_L),Y
    , O& T8 Z: M1 S. _5 H
  1193. AND Function_Check,X
    ' i/ d; w; M/ m
  1194. BEQ Show_Function_Status_Off
    ( n+ a. O; k: w8 D
  1195. JSR Show_Function_Status_On9 @! C' E6 j" r  K
  1196. RTS
    3 P$ J/ u# Y4 R$ M  {1 `7 |
  1197. .ENDIF( S0 m; n0 }" u) z

  1198. ! d7 \/ L4 K" }" z  l
  1199. ;----------------------------------------7 G; G8 i! V3 m5 \5 R: N# o
  1200. ;显示功能开启状态% `/ O9 K7 {! m! }5 p  F# t
  1201. Show_Function_Status_On:1 N4 o, c$ ~3 ~
  1202. LDX FC_PPU_Cursor  r' A' d2 S, f) T' e0 n4 g, c
  1203. LDA #FC_ON_TILE
    - p, h' I( P, p, e  I& A
  1204. STA FC_PPU_Buffer,X7 w* F% j. Y+ j4 [2 R+ {# y, e0 c
  1205. INX
    / f5 g! ?! `+ m2 t/ R! v6 ~
  1206. STX FC_PPU_Cursor
    " B0 r' j5 f! G" |; [1 ^
  1207. RTS
    0 V  ~) H: w% U+ K# f
  1208. ;----------------------------------------/ v& {8 ]' E" R+ l3 x1 T# h* K
  1209. ;显示功能关闭状态- ^7 S# Y7 d/ R! j
  1210. Show_Function_Status_Off:
    5 H/ s8 }& b6 ^. O- ]
  1211. LDX FC_PPU_Cursor- ~9 N5 k1 d0 x* n% K- w0 F" k  e  X
  1212. LDA #FC_OFF_TILE
    6 l7 E( S4 W) O9 `5 Q
  1213. STA FC_PPU_Buffer,X( f+ i  R  G) u/ r- T2 s+ Q
  1214. INX
    3 Q; q8 _7 s% w% S; b
  1215. STX FC_PPU_Cursor
    1 H6 C6 O" U0 J0 E8 y% l8 {3 R
  1216. RTS' R5 t2 V2 g% G+ J6 H3 ]3 r
  1217. % X4 R' k# U) F( _( }
  1218. / i) ^; D( c) A: ]( ]  R1 p
  1219. ;-------------------------------------------------------------- Z6 q" X, F5 B: W2 H
  1220. FC_Data_Copy:    ;数据拷贝参数设置
    4 ~" w/ d( n* Y; \: {; S9 l$ B
  1221. STX FC_Cpy_Port_L
    4 }4 x$ g& G6 a! x
  1222. STY FC_Cpy_Port_H
    8 \: n. w' C/ _0 b4 h) U$ g
  1223. LDY #$003 ?0 S2 [4 o" \4 G1 Z
  1224. LDX #$06
    . K0 f% X. u; e; s  s! K9 H
  1225. FC_Data_Copy_Addr_Set:    ;从指定地址读入参数
    5 Z8 H+ I4 h" s9 N% D: z7 r
  1226. LDA (FC_Cpy_Port_L),Y, z! k) |2 C4 r4 r7 y
  1227. STA FC_Cpy_From_L,Y
    " i: K' P2 L" d3 m6 B4 o
  1228. INY
    & v5 Q- A! S. `& Z5 Y; Z) J
  1229. DEX3 P" _8 k1 Y8 A' j' N- F3 V
  1230. BNE FC_Data_Copy_Addr_Set
    8 V1 a( q& b+ X( b( `  Q
  1231. LDA (FC_Cpy_Port_L),Y
    / H5 C$ z4 O9 I% B/ b$ K
  1232. CLV% p& z9 Y8 O7 U3 a# q( p$ }
  1233. LDY #$00- r2 U7 _& G8 h" V
  1234. ;----------------------------------  \4 W2 j- ^: X! \. c8 E
  1235. FC_Data_Copy_Mode:   ;复制模式校验' c4 g% o  D: h$ A; [: x+ j1 ^
  1236. CMP #FC_MODE_RAM_TO_RAM
    & n! n" I4 H5 n" p( Z1 e8 U' h: Q
  1237. BEQ FC_Ram_To_Ram_Mode
    $ k5 [; ~/ ]6 D) C
  1238. CMP #FC_MODE_RAM_TO_PPU
    % I. e" G/ i4 s2 B1 ^/ n
  1239. BEQ FC_Ram_To_Ppu_Mode8 i+ ~! O4 R: ]7 w) s7 l& w
  1240. CMP #FC_MODE_PPU_TO_RAM" B7 o# s. n8 X6 v. b  v
  1241. BEQ FC_Ppu_To_Ram_Mode
    % k/ {: E6 L4 n. Z
  1242. CMP #FC_MODE_PPU_CLEAR
    ! z0 C& \, {: K. T# `3 J. ]4 ]
  1243. BEQ FC_Ppu_Clear_Mode% ^# V# Q  i) F7 y9 B
  1244. RTS
    8 z' ]! F- q1 z2 ?; o# Z
  1245. ;----------------------------------------
    # r) N8 F; c% x1 J+ @! D, p
  1246. FC_Ram_To_Ram_Mode:   ;复制RAM到RAM模式
    0 c5 }* ?+ @# R
  1247. LDX FC_Cpy_Count_L
    ; T, s5 P# }/ C+ k1 L9 M$ e3 z7 i$ q
  1248. INX
    6 Z1 G- ^% C! q$ ^
  1249. FC_Ram_To_Ram_Count:   ;剩余计数检查# k4 r1 w+ ?& ?7 y
  1250. DEX( a8 h9 e" n0 o# h4 N
  1251. BNE FC_Ram_To_Ram_Copy# V5 x& c' k  l4 z0 B5 p" c
  1252. DEC FC_Cpy_Count_H
    6 {1 V. }0 W0 t- ^
  1253. BMI FC_Ram_To_Ram_Over# v0 _. o! H6 u' R9 _
  1254. FC_Ram_To_Ram_Copy:   ;开始复制数据
    9 y; z8 F$ i6 v. q% R% E  h$ r, Y3 E
  1255. LDA (FC_Cpy_From_L),Y
    / m' ?" x# L! y3 R* c
  1256. STA (FC_Cpy_To_L),Y2 L" U2 g; ^$ t1 ]* i9 {
  1257. FC_Ram_To_Ram_From_Set:    ;源地址递增3 L2 Y7 l  [: ]& x% k7 K# i
  1258. INY' T* X2 o) V% n2 T
  1259. BNE FC_Ram_To_Ram_Count; t; E8 I. ?) {
  1260. INC FC_Cpy_To_H9 q4 Y* W4 i* Q" O
  1261. INC FC_Cpy_From_H
    - q1 I4 T; ]* i, |% \3 V0 |: ]  d
  1262. BVC FC_Ram_To_Ram_Count
    ' F6 {$ V+ n" n; ~1 l& Z
  1263. FC_Ram_To_Ram_Over:    ;结束数据复制
    % R8 r( d, `$ h
  1264. RTS: B/ @) H, M; m0 ]  e. A8 W9 M4 ~
  1265. 6 X8 l* J* i; H) N
  1266. ;----------------------------------------
    + R8 f7 A& Y$ o
  1267. FC_Ram_To_Ppu_Mode:   ;复制RAM到PPU模式
    / n- Q  O* C* S6 R: b
  1268. LDA FC_Cpy_To_H! U( D& H3 _. i, k+ @
  1269. STA $2006+ r/ ]$ v) }, f! m2 M' |6 `
  1270. LDA FC_Cpy_To_L
    2 H6 Y0 G/ p/ w# t& n3 e7 c! Z
  1271. STA $20061 s; Q: E8 M$ T
  1272. LDX FC_Cpy_Count_L7 M' F7 [6 L' f( p
  1273. INX
    1 s! B0 H( z( b4 P& K7 k; ?* C
  1274. FC_Ram_To_Ppu_Count:   ;剩余计数检查
    . ]5 Q4 D* K  }" U1 u6 i. H
  1275. DEX
    " Z- L2 \* {, C5 H
  1276. BNE FC_Ram_To_Ppu_Copy
    ; N" `) a, W: [! m# N9 y$ U5 [
  1277. DEC FC_Cpy_Count_H& g' ]# o  g$ O) r2 f, f
  1278. BMI FC_Ram_To_Ppu_Over& ^: r  x* ]5 B3 K
  1279. FC_Ram_To_Ppu_Copy:   ;开始复制数据
    8 h' c( i+ h% g2 `6 D1 j
  1280. LDA (FC_Cpy_From_L),Y  v2 y" K+ ]! m, U, H
  1281. STA $20070 H! n$ z7 l3 N+ B
  1282. FC_Ram_To_Ppu_From_Set:    ;源地址递增% I: \2 @1 R& O9 ~7 u( n
  1283. INY9 B" h, c; |  K1 W" F( s4 V
  1284. BNE FC_Ram_To_Ppu_Count" m# T1 }& X% T% \
  1285. INC FC_Cpy_From_H
    ! z( V- w% I, Q7 N" B# d
  1286. BVC FC_Ram_To_Ppu_Count0 b, g, @) c/ o/ _6 ]9 k/ ]+ ?
  1287. FC_Ram_To_Ppu_Over:    ;结束数据复制/ C: {. A: o( N) ]
  1288. RTS
    " u9 h* Y# J7 Z6 I( g
  1289. 3 x7 ], e4 w% r" ?; S
  1290. ;----------------------------------------  y/ {; a' n3 u% y: y# P3 q+ S3 ]
  1291. FC_Ppu_To_Ram_Mode:   ;复制PPU到RAM模式
    : E4 l' ^) M& _7 t
  1292. LDA FC_Cpy_From_H- V% t  f( ^7 u$ B( ~3 k. K- \
  1293. STA $2006
    3 L( H6 m. B" z0 _
  1294. LDA FC_Cpy_From_L4 I# H1 H1 Y5 S
  1295. STA $2006
    ' j0 }; j, l  G5 m3 Y& O
  1296. LDA $20070 Z( ]( K* {- |" i6 O: h
  1297. LDX FC_Cpy_Count_L3 h" G- {+ Z' u1 }$ c, g9 Q$ R
  1298. INX
    . h* y* c& L0 j: M9 N8 d
  1299. FC_Ppu_To_Ram_Count:   ;剩余计数检查
    ) t4 ~5 K2 @5 M0 }3 R
  1300. DEX
    / Y; u* h1 D' l+ x
  1301. BNE FC_Ppu_To_Ram_Copy
    % @1 ~9 C* E& z( u; q7 B
  1302. DEC FC_Cpy_Count_H
    7 d' J: W4 Z$ C/ ]
  1303. BMI FC_Ppu_To_Ram_Over8 k" `+ ^- y6 G! ]0 I0 c( _
  1304. FC_Ppu_To_Ram_Copy:   ;开始复制数据
    / }0 X# l1 T" c8 H2 Y. D/ q
  1305. LDA $2007
    " s1 |. F5 l. i" H' h3 b/ b- @
  1306. STA (FC_Cpy_To_L),Y
    3 I; v+ N; D* a) N3 F
  1307. FC_Ppu_To_Ram_To_Set:    ;目的地址递增( L( ~3 H$ M! n$ b! [
  1308. INY
    * q& n4 N2 T. ^/ i+ N; K
  1309. BNE FC_Ppu_To_Ram_Count/ f$ R( d3 D2 W3 F/ v1 Y- Z8 x
  1310. INC FC_Cpy_To_H! r; |0 t( A1 O' g7 X
  1311. BVC FC_Ppu_To_Ram_Count
    ! f6 `; u( b! f. g! j
  1312. FC_Ppu_To_Ram_Over:    ;结束数据复制
    . ^4 p4 D" W1 l! q& T
  1313. RTS
    0 R. r& V0 W3 H& P) O

  1314. ! T2 o/ `8 Z, E- V0 M8 L& w
  1315. ;----------------------------------------
    + y1 Z  e6 @: k% e) W* X
  1316. FC_Ppu_Clear_Mode:   ;清除PPU模式9 B) [( c. x/ e( V. ?/ Q
  1317. LDA FC_Cpy_To_H: o! V8 G0 f7 V, J1 b
  1318. STA $20062 j  x, ~5 |5 V" P% e( w% C! `
  1319. LDA FC_Cpy_To_L
    ( Z6 H5 U8 f5 L' B1 j
  1320. STA $2006
    ' O. M7 ]( ~0 t* y6 Y
  1321. LDX FC_Cpy_Count_H
    / g- f7 S8 {$ a* t; |9 |3 b
  1322. LDY FC_Cpy_Count_L
      f* e, a4 e/ B8 ^$ B6 B
  1323. LDA FC_Clear_Val
    . _0 v0 C- V/ u/ b9 H- O& I9 V. l! G
  1324. FC_Ppu_Clear_Count:   ;剩余计数检查- T0 ?3 K4 X  m) X) u4 P# K+ X
  1325. BNE FC_Ppu_Clear_Copy0 E! @) T. ]3 H  d8 G
  1326. DEX
    8 x1 c3 I( Q8 E# Q
  1327. BMI FC_Ppu_Clear_Over8 @6 X0 d7 ~9 L
  1328. FC_Ppu_Clear_Copy:   ;开始清除PPU
      y( d$ o  p$ Z- b, s4 V; s6 S
  1329. STA $2007
    3 v2 a- j( u5 ~- S3 y
  1330. DEY" X$ H) e* n, P: P: B, }# y  i
  1331. BVC FC_Ppu_Clear_Count
    % X3 d* ^2 C% A7 q. j7 x
  1332. FC_Ppu_Clear_Over:    ;结束数据复制" ~: ?2 h0 q9 H5 k
  1333. RTS. X3 p7 s6 U) K. _7 d% Y5 U

  1334. 1 t; T- `2 E3 }5 o
  1335. ;==================================================
    , W$ ?" K6 i. u9 b' M
  1336. ;保存RAM数据8 i1 W* k5 X! k' v/ b
  1337. Save_Ram:8 U( d+ Z% ^$ G
  1338. LDX #<Save_Ram_Data
    : q" p6 I$ O. N2 |# u# p' ]
  1339. LDY #>Save_Ram_Data
    / q/ L1 u- J! t; Y. j* q6 f
  1340. JSR FC_Data_Copy- O% i+ y; o: k/ T$ T. s/ m
  1341. RTS
      S$ U0 }8 z! v" h+ H& Y$ i6 ^
  1342. 4 i3 S" S% R4 ~) S, F( S
  1343. ;加载RAM数据
    ' F! J5 G# a2 Q$ M$ U
  1344. Load_Ram:
      P* e' l* L% r  s- n& x
  1345. LDX #<Load_Ram_Data/ ^" E' Z0 z- \0 n6 v5 B
  1346. LDY #>Load_Ram_Data
    ( C4 U) |/ H' n: s8 F. k) \
  1347. JSR FC_Data_Copy+ c/ K1 h0 ~2 n5 }
  1348. RTS
    3 n6 v# \+ z& ~. N+ y
  1349. # o9 b$ n- u! f) x: m/ M' L* I
  1350. ;保存PPU数据: ^3 Z8 R$ }8 f1 e- O0 R
  1351. Save_Ppu:8 G9 o+ }% B0 z- }6 n# Y9 b% W7 ?" x& N
  1352. LDX #<Save_PPU_Data
    0 X2 Y4 |7 v8 r- i  W
  1353. LDY #>Save_PPU_Data6 J+ X$ V% \+ q3 m  L
  1354. JSR FC_Data_Copy
    3 ^/ U/ \) l: g
  1355. RTS- _1 U- E( Z8 W. _
  1356. 5 Q" r: H/ B7 o
  1357. ;加载PPU数据' \, L5 L7 U$ d# a* |6 |
  1358. Load_Ppu:
    2 H! g* z8 H# r
  1359. LDX #<Load_PPU_Data
    + A7 ^# L, h5 V6 q' q: ^
  1360. LDY #>Load_PPU_Data1 a8 f  _# @5 u, t6 L# N
  1361. JSR FC_Data_Copy
    ! i. H* A, b  Y
  1362. RTS
    , g5 I+ ?& q- Y/ T: R
  1363. & x  T* Y: y* g) _
  1364. ;清空PPU数据$ K- ]' ^9 @5 ?( D3 n+ ~2 C/ w
  1365. Clear_Ppu:
    ; r1 y  K6 e4 d8 I: T& O& a0 g7 l
  1366. LDX #<Cln_PPU_Data
    ; J; g7 @3 G7 H, `5 ^
  1367. LDY #>Cln_PPU_Data
    9 X2 S6 {% U4 U% W% M! y
  1368. JSR FC_Data_Copy' G: Z9 e; c/ I" c) S0 L* D% }) c. h% e
  1369. RTS: \* E. c' P$ v4 [& K

  1370. * K* P9 y/ U+ h9 ^+ d0 f( \
  1371. ;==================================================
    - J' r3 M- u* G- u( U/ x1 p
  1372. ;数据配置# _# m3 D8 V7 O! ?' u2 y1 V5 M; K
  1373. Save_Ram_Data:+ I) X0 y& [  N/ J& m& z
  1374. .DB $00,$03,$00,$63,$00,$01,FC_MODE_RAM_TO_RAM! M; \% N/ [9 S5 W* l  j
  1375. Load_Ram_Data:
      B5 W4 k% r. q. v
  1376. .DB $00,$63,$00,$03,$00,$01,FC_MODE_RAM_TO_RAM
    0 l2 }0 v9 H) F( m7 {
  1377. Save_PPU_Data:. {* Y# q- T9 I
  1378. .DB $00,$20,$00,$64,$00,$04,FC_MODE_PPU_TO_RAM+ y7 S6 |, l$ Z! t4 g- B. ^
  1379. Load_PPU_Data:
      J4 C" n4 m7 \6 u* P
  1380. .DB $00,$64,$00,$20,$00,$04,FC_MODE_RAM_TO_PPU
    0 d4 ^( ?% R8 |5 O9 L1 L
  1381. Cln_PPU_Data:& F' q) U) H! _7 t& D
  1382. .DB $00,$00,$00,$20,$00,$04,FC_MODE_PPU_CLEAR
    / K# q/ J3 V) i  K3 V7 T

  1383. * G1 D9 x! B5 K& D3 R
  1384. " O# [0 K4 Z3 V. {
  1385. ;==================================================1 D( F% V8 q! H# j- C; N# d: r4 L4 {; {
  1386. ;文本数据PPU显示地址
    ) k/ Y3 Y( f' u& s# h6 b
  1387. Text_PPU_Addr:
    * K  O3 Y  Q9 p; @% H3 R$ J
  1388. .WORD $20C5/ e/ B: b$ R- E& a
  1389. .WORD $21050 q* u6 X8 L* d; e2 d1 Q
  1390. .WORD $2145& E, h% y1 q6 v
  1391. .WORD $2185
    , ?' q$ U8 J" f, P
  1392. .WORD $21C5& o: l: r4 g9 I4 s/ b
  1393. .WORD $2205
    " o7 d8 Z) u$ l! U$ J, J% [
  1394. .WORD $2245* r* s2 g' E9 e8 r- ^! s' d" E+ m( C) c
  1395. .WORD $22853 i; Z% t1 E9 ?) t
  1396. .WORD $22C5
    ; x0 h" s3 F1 j( w3 C/ \* v3 t
  1397. .WORD $2305- p7 T4 ^1 b' W2 M- P3 t) `4 X  c  C
  1398. .WORD $2345
    % O: J3 b6 Z8 F! K+ y( Z
  1399. 8 @$ r, L& c" H% J, c& [# R9 `# Y% G% P
  1400. ;==================================================
    ! B2 E' u( y, P9 [  h% h/ P
  1401. ;文本数据PPU数据地址
    / ]* h8 G2 ]: ~
  1402. Text_Data_Addr:
    3 e' e( i) C, F( }/ G# C4 L3 h
  1403. .WORD Text_Data_01
    3 s5 |' M* Z* D/ a5 g: C1 Y/ v
  1404. .WORD Text_Data_023 `; k5 E4 A& w
  1405. .WORD Text_Data_037 G7 G+ o. x% s1 h' w* G; {
  1406. .WORD Text_Data_04& G* x# a- r& r* k& j
  1407. .WORD Text_Data_05
    ) X2 _+ d4 r- o' }) [* K
  1408. .WORD Text_Data_06
    ; f! [- X% y, p  J/ v- A
  1409. .WORD Text_Data_07
    . I8 y9 x& L( W4 |8 l
  1410. .WORD Text_Data_08
    * I0 g3 I% y8 R
  1411. .WORD Text_Data_09
    8 g8 t2 s# @, q3 H
  1412. .WORD Text_Data_10+ U6 ^8 z$ g- ?. m9 n5 U: v
  1413. .WORD Text_Data_11
    , b4 }4 {4 \4 p4 m( ]5 m' D1 f
  1414. .WORD Text_Data_12
      \; P: h7 e0 h) C; o
  1415. .WORD Text_Data_13
    / m( N+ z5 {1 r& u4 U
  1416. .WORD Text_Data_144 e" Q7 ?- d( u/ H( t; ~5 d
  1417. .WORD Text_Data_15
    5 g9 [8 Q9 a6 _$ R$ S
  1418. .WORD Text_Data_16& c9 E. o+ R4 a
  1419. 9 m1 d1 r& O, S) j5 I# t3 u3 P0 U
  1420. ;==================================================2 n1 H8 e! e& o" C
  1421. ;文本数据5 O" u) ^( m) Z
  1422. Text_Data:: h1 h8 j9 P  U/ J% R/ v, J
  1423. Text_Data_01:
    + z' e4 b5 v0 h7 E  N/ R) Y
  1424. .STR "01.INVINCIBLE"
    & k5 m; H& Z9 q; T* ^0 x0 _8 l; U4 K$ N
  1425. Text_Data_02:/ l5 s* A0 Z* {! N$ Y0 J: Y
  1426. .STR "02.INVINCIBLE PLUS"( u6 c& ~) r) P; p1 x
  1427. Text_Data_03:
    : Y. g5 p/ K3 ^) X, n8 Z) s+ T6 _$ i
  1428. .STR "03.LOCK LIFE"( m* o; r# _- A0 C
  1429. Text_Data_04:' V3 H' w2 O8 ~) |- n7 u
  1430. .STR "04.LOCK WEAPON"
    7 f0 ^7 V8 E8 K1 z. j  S7 ?
  1431. Text_Data_05:7 M2 C" I; H1 d) M. H
  1432. .STR "05.SEL CHANGE WEAPON"0 k8 t; O; q8 b4 k, B
  1433. Text_Data_06:
    " C! Q) T: |4 c2 ~# H& ]
  1434. .STR "06.UNLIMITED JUMP"& V* N( i8 K5 a- z- ~# ^) S/ r
  1435. Text_Data_07:" s/ O( j1 e: e$ w$ b; o
  1436. .STR "07.MOVE FAST"
    5 q- p  R9 R5 A9 U, z
  1437. Text_Data_08:
    6 P( x& Z6 ^% b$ U& W4 n( f
  1438. .STR "08.SWAP SKIN"
    ! j( {9 m3 p! k# O
  1439. Text_Data_09:9 R6 [4 b: o* z! T
  1440. .STR "09.EQUAL BULLET"2 f" o0 |: c% W/ ~- i1 z. g
  1441. Text_Data_10:1 B. q. [& D0 w3 u: e, K; K
  1442. .STR "10.STRONG BULLET"( N5 U; a! {7 O# x( Y& J* T
  1443. Text_Data_11:2 {7 H! t% ?! W
  1444. .STR "11.KILL BY ONCE"
    8 o: o. y$ i# S) P
  1445. Text_Data_12:
    6 x) h. [2 L# }) d
  1446. .STR "12.FULL SCREEN KILL"+ v+ T' i, d. S. I8 G6 z
  1447. Text_Data_13:; w" z6 u# I% U+ }* F& Y
  1448. .STR "13.DOUBLE CONTROL"
    2 t) x6 Z0 g5 f! R7 _- Y
  1449. Text_Data_14:% M/ n- {# [5 X; O
  1450. .STR "14.REMOVE E-GRID"
    4 J) Y3 l* t$ L1 u- R" G
  1451. Text_Data_15:. _+ e  u8 M; o2 E, w+ H
  1452. .STR "15.FALL INVINCIBLE"
    3 Y- U" O5 o6 B6 c0 {! \
  1453. Text_Data_16:
    , S9 I$ W4 `3 I! \6 P7 D' [5 n* n
  1454. .STR "16.NEXT STAGE"# r4 B- V  F3 y6 g8 W( \) E
  1455. ' Q$ ^: J  O# E
  1456. ;==================================================
    / d! y0 l! C* |, B! `$ p
  1457. ;功能开关检查地址& T- b' T$ ]$ {
  1458. Function_Addr_A:8 i- ?" [) `) O
  1459. .WORD $01C0
    / E0 e- I: d# J, d. t5 X
  1460. .WORD $01C0
    9 U( p/ F/ [# Y4 [% z
  1461. .WORD $01C0
      i) F& Y  n1 A2 u; U; k# |
  1462. .WORD $01C0
    & m! n( z3 m) i* w7 k$ F  f
  1463. .WORD $01C0( t9 _9 {, N$ l5 `! Y" ^* }( z: \
  1464. .WORD $01C00 L: ^8 X7 q1 C% z3 V
  1465. .WORD $01C0
    : C" v; [) W5 K
  1466. .WORD $01C0
    * d2 g' Q6 Z4 K, A+ x
  1467. .WORD $01C47 u/ H0 z* A5 h
  1468. .WORD $01C4
    & ^% S9 k$ c9 N5 S
  1469. .WORD $01C40 g( l/ K* B+ S  i- q( _
  1470. .WORD $01C4
    ( l# x5 j4 x. }- R8 N3 X' E4 J# I* O
  1471. .WORD $01C4
    $ S. K0 J; w' y0 z: s! @* o
  1472. .WORD $01C45 U9 E! ^: d3 J, ^3 C
  1473. .WORD $01C2
    ' L8 M. `4 X$ I9 K+ r6 r8 ~
  1474. .WORD $01C4! z; L' F6 W& N5 |0 V
  1475. 5 ~! U8 W, r2 @* U
  1476. ;功能开关检查地址
    ' V' s. }' U) j/ w
  1477. Function_Addr_B:
    ) C0 ^) O* u2 \) z. s9 D- _& I  w
  1478. .WORD $01C10 y7 t$ j2 R0 O; q* N, d
  1479. .WORD $01C1
    . {! i3 Y9 j2 K& h3 t$ a( C5 P
  1480. .WORD $01C15 X4 p. e+ p$ [2 S, [/ Q7 a
  1481. .WORD $01C1# B* K0 ~7 f# x/ d: @- ]
  1482. .WORD $01C15 \" z: j  N$ N9 _. g  e
  1483. .WORD $01C1
    $ g) S; {3 _4 I8 ?7 B) e
  1484. .WORD $01C1
    " N% M5 r6 _3 Z. q% `9 r7 k7 e8 z; l1 {
  1485. .WORD $01C1
    + S3 k6 W/ E7 r" r- k9 L' ^" H
  1486. .WORD $01C4
    * ]; i- q' U7 J; `$ H% }
  1487. .WORD $01C48 `/ X( ~; d8 A3 j( o4 j
  1488. .WORD $01C4/ n0 N0 S3 o7 p: A
  1489. .WORD $01C49 F5 @% p; c6 r
  1490. .WORD $01C4
    ! q8 i/ |1 J) _
  1491. .WORD $01C47 o+ v7 q' Z2 Y2 h
  1492. .WORD $01C3
    8 H* S7 ~: m# e- W8 G
  1493. .WORD $01C4: T& r  O. r8 _1 O7 x1 S

  1494. : v3 ~% ?. F9 m4 N' w" L+ A- S
  1495. ;==================================================
    7 T3 m8 i( e! s$ ~2 j1 H& v4 r
  1496. ;功能开关检查数据- o) G+ P+ d9 ^7 f9 }
  1497. Function_Check:
    7 P3 y: a: _9 Y5 k& G
  1498. .DB $01
      g2 K* s2 n- d, Q
  1499. .DB $02) m7 e1 `" H) K+ R" ], Q
  1500. .DB $04
    + L7 g& Z- X3 E
  1501. .DB $08" j( n$ }- ?& Z( n
  1502. .DB $10' f; ~* c) w8 R6 T: Z- P* v
  1503. .DB $20
    $ }* X% |- ^) b+ Y
  1504. .DB $40* g- t& `! F" R  Z
  1505. .DB $80- z2 Z5 @0 s' B; X# C+ ]. h1 u3 c8 Q9 p
  1506. .DB $01" t1 ]: j% W7 m  X( |5 D5 `
  1507. .DB $02$ h1 {# V9 o1 X2 k) e
  1508. .DB $04/ @" L6 m, N: T9 v; n* }
  1509. .DB $08
    , m: g& ?5 F; A
  1510. .DB $10
    ! }" N0 O1 L- H3 \/ T
  1511. .DB $203 A1 ?9 q  d5 C7 T  a
  1512. .DB $40
    - u( p) \- d; }% f- \  C9 H6 R/ S
  1513. .DB $80
      A% y7 n# o6 y( Y

  1514. ; N) ]9 s2 t6 a. r) |' Q) A0 s" {
  1515. Char_Rom:
    9 o0 m  J3 v' C( X6 Q! m! u8 m1 h
  1516. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00- q6 |/ K/ o2 C& x3 e# s
  1517. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$005 {( T* l+ Y( b6 N4 m, K7 v
  1518. .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3B,$25,$00" Q9 A1 ~/ w! I! [! N
  1519. .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$00,$00,$00,$00,$00,$00* Y" _* Q5 ]1 W- Q" p6 T$ |6 t5 w) H
  1520. .DB $00,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19
    ! e* }9 G  V% M# h- t1 E
  1521. .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$00,$00,$00,$00,$007 ~, B( C. J9 L+ h- ^# N' P  Z, G) o) }
  1522. ; @" `: l6 X! [# ]7 u# u

  1523. 1 h* @( r5 V. A
复制代码
" T6 A/ I9 V6 E8 K( |' Q
游客,如果您要查看本帖隐藏内容请回复
' T# ^- q3 ]) p2 \: A) K' s9 j6 i
flamecyclone.ys168.com3 \" p: L. y$ a) m0 E6 B
www.nesbbs.com

本帖子中包含更多资源

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

x

评分

2

查看全部评分

签到天数: 3090 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 142 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1639 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 39 天

[LV.5]常住居民I

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

使用道具 举报

签到天数: 1764 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 2599 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1412 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 187 天

[LV.7]常住居民III

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

使用道具 举报

签到天数: 1824 天

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

使用道具 举报

签到天数: 1237 天

[LV.10]以坛为家III

发表于 2019-12-5 06:49:43 | 显示全部楼层
樓主的修改一定支持, 魂斗羅是喜欢的系列.! e6 n4 c; a' q3 [% ?" F* F' m1 i. \. P
多谢楼主分享
[发帖际遇]: waikwokt 打扫环境卫生,被奖励 2 个 柠檬. 幸运榜 / 衰神榜
回复 支持 反对

使用道具 举报

签到天数: 1159 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3529 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 1341 天

[LV.10]以坛为家III

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

使用道具 举报

签到天数: 3225 天

[LV.Master]伴坛终老

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

使用道具 举报

签到天数: 5 天

[LV.2]偶尔看看I

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

使用道具 举报

签到天数: 577 天

[LV.9]以坛为家II

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

使用道具 举报

签到天数: 8 天

[LV.3]偶尔看看II

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

% w" f; h2 }- `0 f& |7 N& dTec.PNG (8.05 KB, 下载次数: 0)
8 b8 b2 Z9 X7 W& a$ a/ x9 t
7 |: o1 b) h/ O0 T$ \下载附件  保存到相册: @- p. B1 _  J4 b5 e
2 I# R1 h" v( T& t7 d
2020-3-13 13:33 上传( |  `% Y, a) p0 _* q, o
得到的文件解压后放在任何FC模拟器即可玩。NES上最优秀的篮球游戏!1 _8 G6 w! F: Z  ^" u7 _) S, a( d" X8 s7 b) z
修改内容:
. v3 z: o% g" w# ~1)游戏时按START键可以开启或关闭怎样射球都进篮,全场照进!- t9 S2 d" W3 p& \  s$ D2 e( Q2 ~9 n6 d, [, q) Y( V/ Q
4 N# A* o  K& S. i2 c, u( ?8 `3 B) u, A" c' E8 J( k: ~
不过开启了是双方面的,看到电脑拿着球赶快关闭!(有声音提示)。" p1 M) ?$ I+ `) P* f2
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 20:42 , Processed in 1.114257 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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