|
本帖最后由 yandagui 于 2019-12-4 21:31 编辑 0 b6 U6 p5 H. V& A* |
- |" ~0 f$ D" k0 g+ |
[FC][魂斗罗][最佳可视化]
& y6 A7 K- W# n时间:2019.11.30' D3 n" P7 ^8 ?1 i$ F" Q# I
作者:FlameCyclone: v2 K' u! T/ _, l u5 x
内容: s0 ]# Q8 J- v3 f+ J
1.可视化: ' D% E( b$ h# M& J6 W9 T( N/ ^4 x3 \
(1)暂停时按选择键进入菜单
: W3 c( J) i+ U5 k c (2)方向键选择功能: B键开启: A键关闭: 选择键交换,开始键退出
' [; v* z' |6 d2 M( o 1.1.透明无敌: 透明无敌
' |1 R* V5 y. v9 i6 Q7 x/ S, r 1.2.加强无敌: 金身无敌* L- D. G, U9 M/ \: @* F( q7 K
1.3.生命锁定: 生命锁定3条
2 w0 R# a' u1 n' o1 B: b 1.4.武器锁定: 武器保持不变
" S; f {/ {9 B5 v7 N 1.5.武器切换: 游戏时按选择键切换武器
6 P+ G P0 D8 K8 E l$ X) | ^$ F3 ` 1.6.无限跳跃: 跳跃无限触发
: `' `7 [1 l0 h% E 1.7.快速移动: 行走速度加倍
s8 X7 G. T5 V7 G" x/ w6 ]$ B) t 1.8.皮肤切换: 交换玩家肤色
4 h7 C6 Z1 q; e, p 1.9.公平子弹: 玩家子弹可以与敌人子弹对打$ @# C9 I, \ s5 d! v: n9 S
1.10.强力子弹: 子弹打中敌人后继续穿透, ~ S' ^, a( D) T1 v/ [- w
1.11.一击必杀: 敌方中弹一发必死
% S! k$ p& Q$ D/ M* j0 n, L0 x 1.12.全屏击杀: 开枪时全屏可击中目标必死
& c% T8 J" j; ]0 s 1.13.玩家双控: 两个玩家的任意一方均可同时控制两个玩家* s5 \2 Y! p8 c# S' |' g$ B
1.14.移除电网: 移除2,4关的电网* {; x4 B4 t3 o4 i d: j$ E7 d
1.15.掉坑不死: 掉坑后不会死亡
( [% n! J. e7 y( z$ @$ T 1.16.跳过关卡: 跳转到下一关8 a/ p* M+ A3 I, l( n0 @
- ;[FC][魂斗罗][最佳可视化]
7 T# b2 d" Q/ ? - ;20191129; x9 a' v1 t1 j: i2 j! v* T
2 Q" `% F" k! @# f( n8 y- ;程序开始地址
! _, [7 Y/ ? q7 e/ z; W! ] - .ORG $9000. [) n$ v: L; R* I8 B' ?" j8 [$ c
- 7 s! H1 q! Q: N+ E
- ;==================================================9 ?' ] k, ]) E' F! t' C5 W
- ;==================================================6 u7 j6 [3 G/ w' d; d
- ;是否双人玩家1 B$ [; N, e" s3 W8 o
- FC_IS_DOUBLE_PLAYERS = 1- }1 _- T8 x" y! A7 ]
- # K# p3 ~, ~: }3 L2 G' i
- ;==================================================
5 C2 M3 }: g4 {4 D* L - ;PPU缓冲地址配置( D8 a: R3 t }2 p/ w; C
- FC_PPU_Buffer = $0300
( t$ s3 ?: e+ s3 u& W0 n - ;PPU地址配置
/ e# B* T. Z6 C - FC_PPU_Cursor = $00
, O2 Y9 J5 D" }, o2 O/ X1 N8 r9 c - FC_PPU_Status = FC_PPU_Cursor+$01! C I2 s) u& j+ L u
- FC_PPU_Data_Cnt = FC_PPU_Status + $01' d3 H+ n! n' G0 X* c, ^9 d) F
- FC_Data_Port_A_L = FC_PPU_Data_Cnt + $019 E( M1 u# h0 z- o: A0 m% }
- FC_Data_Port_A_H = FC_Data_Port_A_L + $01
0 u3 r p/ Y$ |/ g7 h2 S& D" U8 ~ - FC_Data_Port_B_L = FC_Data_Port_A_H + $01, V- Z% V( i/ b* q# \- W, ~
- FC_Data_Port_B_H = FC_Data_Port_B_L + $01' s' L6 L! f2 k2 x3 v! x
- ;==================================================/ d+ d }# o1 Y1 I
8 _: V" Z+ |' }- ;==================================================
/ V j4 R. ?0 \; {0 W! l! C - ;选择项地址配置
' W, ]* i: j+ O5 ^' j8 Q/ q5 G- s - FC_Select_Index = FC_Data_Port_B_H + $017 y! n& u2 k9 l/ t3 ]" G
- FC_Select_Temp = FC_Select_Index + $02" p$ ?7 a. b. Z( p, C+ }8 q
- ;NMI循环计时器
. E9 d/ l0 I# ]8 ^ - FC_Time_Count = FC_Select_Temp + $01 m* |( }2 l$ g# q. F
- ;==================================================
7 s! l4 i6 Q% c( j+ R# q$ u7 _4 y8 y } - " P9 P9 N7 s7 f3 i* [9 G
- ;==================================================
2 ^' d9 R, W$ j% B - ;光标配置8 p( p# a: |3 I- G W x
- FC_Cursor_Addr_L = FC_Time_Count + $01
2 }0 I; i% u8 e. G% I - FC_Cursor_Addr_H = FC_Cursor_Addr_L + $01
# {0 s# s K" V, y& F - FC_Cursor_X = FC_Cursor_Addr_H + $01
$ y! N; ]& N1 B/ l/ j0 _. @, P8 d - FC_Cursor_Y = FC_Cursor_X + $01- W+ v" U9 C" `* J
- ;----------------------------------------
+ ~) ]8 ]5 i+ ~4 ], m - ;光标图形号; m3 J" e3 @( h! n3 Q0 f8 P9 x' s
- FC_CURSOR_TILE = $3E5 ]: @- L/ ?, ~( o$ i& R+ B
- ;光标偏移像素值8 Y0 |. N* Q( d' G1 s
- FC_CURSOR_OFFSET_X = 12
6 f; {6 o( S) D6 ?8 }3 Q& N$ j - FC_CURSOR_OFFSET_Y = 1
k: R6 F2 `) @# i5 O' K; h - FC_FUNCTION_OFFSET = 21$ F% v+ ]' ]* L. }2 V7 D. a2 m: B
- FC_ON_TILE = $3D2 x$ f E. o- P- \' z
- FC_OFF_TILE = $3C& f& X* [1 G6 B( j% U. q( {1 S+ W4 d
- ;==================================================/ z& ]$ @& }3 V2 P/ q9 `" u8 {
# B$ i) E6 B4 H- ;==================================================
9 o# _! g9 J8 |, p; Q - ;翻页配置% @0 }2 y, N! I. K( F; u
- FC_Page_Old = FC_Cursor_Y + $01 @8 c4 ?1 g p/ f9 p2 o4 K
- FC_Page_Cur = FC_Page_Old + $01. i+ \# U; D* I1 d; s0 D
- FC_Page_Item_Count = FC_Page_Cur + $01
' {+ Q3 x- e4 Y1 z" c0 T- Y - FC_Page_Item_Buffer = FC_Page_Item_Count + $018 t) d8 K% p7 W' }& A
- ;----------------------------------------' G/ P" v, F" Q, R
- ;翻页属性, X) L) @( r, V0 \4 c/ r( |' U6 T
- FC_PAGE_SIZE = 103 O. G p$ A! {( i9 `3 s. C/ [
- ;PPU单次写入缓冲项数: s* i( \* u: d4 ?9 H
- FC_PAGE_BUF_SIZE = 2
/ U" v; Y! X8 U/ e - ;----------------------------------------9 C7 c$ V7 g- D% q* O2 K) |
- ;显示项最大索引属性. i4 s) }8 B3 M, m
- FC_ITEM_SUM = 16 - 1/ v0 M8 A; `0 o0 p+ q* c1 K
- ;最大页索引属性
% U* N* M* v8 {3 r E9 s# k5 y - FC_PAGE_MAX = FC_ITEM_SUM/FC_PAGE_SIZE*FC_PAGE_SIZE
7 C+ C1 L0 b/ \* ^7 n) @5 _ - ;==================================================
4 W8 E3 s( O$ q2 x* m& t' P, e8 k - 8 S( `- ?- G. d; W+ ]8 T, @# o
- ;==================================================7 b; k1 f' r# D ?) s: \
- ;按键配置
. ~+ e2 r) X+ {# ~ - Button_Keep = FC_Page_Item_Buffer + $01
! F/ H. ?+ ]# |. u+ j4 l6 ] - Button_Once = Button_Keep+$028 }( O: J) B6 [
- Button_Temp = Button_Once+$027 v& r6 k! T5 p+ S# E7 _8 m# x
- Button_Buf = Button_Temp+$02
, [/ A$ S$ l$ H" y - Button_Status = Button_Buf+$02
7 m' \( |( | Z E8 N4 t - Button_Auto_Delay = Button_Status+$02
# j2 G2 y$ C# N1 Y. X$ ^6 ~5 `" a! { - ;----------------------------------------8 k7 h' z7 Z8 E
- BUTTON_DELAY_MAX = $18, J1 [9 c" }& h. R: ]+ j, c
- BUTTON_DELAY_SPEED = $08
- i4 ~3 R9 w$ m5 h$ R& V% }+ H+ \
. g* n& _ G3 Y7 |- BTN_UP = $08" @( V7 i3 @* h. `! p
- BTN_DOWN = $04
" ^: d7 W" ]# G8 B1 ?1 g1 R - BTN_LEFT = $024 W, z' t% ]: @0 t6 z& I; [
- BTN_RIGHT = $01
" K# B t6 D _, N - BTN_SELECT = $20
, r9 m: J1 Z- s! m# e - BTN_START = $10
1 Z- ^( t# x5 ?& m" ` - BTN_B = $40
8 b& d( T" z' Z; C& ~ - BTN_A = $80
: j2 J0 V$ Q3 D, d0 Y2 ^7 L - ;==================================================6 n! z, D* `8 w
- ' u( ?- [7 } f: S1 f6 Q/ _
- FC_Copy_Addr = Button_Auto_Delay + $01& l! j" j8 }; ^9 u
- ;----------------------------------------( s9 k, o( F; [
- FC_Clear_Val = FC_Copy_Addr+$00 ;清除模式覆盖值
/ u* g& O' ]9 v - FC_Cpy_From_L = FC_Copy_Addr+$00 ;复制来源地址低位# A# M3 C! m3 I9 E0 S8 v
- FC_Cpy_From_H = FC_Copy_Addr+$01 ;复制来源地址高位
5 A8 N8 ?* y }) V9 b3 O8 | - FC_Cpy_To_L = FC_Copy_Addr+$02 ;复制目的地址低位$ g$ ^* x8 s9 `& z c
- FC_Cpy_To_H = FC_Copy_Addr+$03 ;复制目的地址高位, }3 Q, h( O8 w. B& o$ Z* L* E
- FC_Cpy_Count_L = FC_Copy_Addr+$04 ;复制长度低位2 g$ Y- R: {0 h7 Z% w
- FC_Cpy_Count_H = FC_Copy_Addr+$05 ;复制长度高位
. f) f& Y) J5 Q0 S - FC_Cpy_Port_L = FC_Copy_Addr+$06 ;配置地址低位
$ F' t' d$ J- }7 e; Y - FC_Cpy_Port_H = FC_Copy_Addr+$07 ;配置地址高位/ Z0 J- }. w# c. U/ `
- ;----------------------------------------
$ ^- B# U. k4 U2 |* F0 T - FC_MODE_RAM_TO_RAM = $00 ;复制RAM到RAM模式
X! Q4 p4 m: {) Q- I - FC_MODE_RAM_TO_PPU = $01 ;复制RAM到PPU模式- {) ?8 a* K( ?! A# R7 D5 ~
- FC_MODE_PPU_TO_RAM = $02 ;复制PPU到RAM模式* B9 N- o# L7 ?9 B& r, ]
- FC_MODE_PPU_CLEAR = $03 ;清除PPU模式
! [' O& ?+ h/ x: g; D. }/ c
5 N" L' y0 e0 c0 Z7 c- ;==================================================
; y' ?" b% [; h - Rom_Nmi_Addr = $FF
8 O2 m' k" O$ ]# C - Rom_Btn_Once = $F5/ O! c: D* ~" |$ r6 D" k( G" D
- Rom_Btn_Keep = $F9
& h, d+ ]% G# m6 R, g0 T" y) I - Rom_Pause_Addr = $25
) O) p R) l; C* j, O0 u3 V - Rom_Pause_Val = $01- b" ^& Z' E) L- @* T
- Rom_Pal_Addr = $07C0+ n e% A$ m; Y# K* V! y
- ;----------------------------------------
f) j& p, u2 _ - Save_Zero_Addr = $6200
2 ~9 h# O% R0 l! g4 \% a - ;==================================================# D/ A3 i" Q, x# u: G3 H J
- ;==================================================) T! G& l( i! b' k- m
, V$ c8 D9 z2 |# c- j" H. ?7 _- ;程序入口, m& \% _, ]% A& b
- Enter:
4 E3 h% {) Q0 p' t7 g4 U- p% m - LDA Rom_Pause_Addr
% t1 @# K, c+ E ~ - AND #Rom_Pause_Val
% m7 c7 {5 f p: `4 t% ] - BEQ Quit_End
' C3 A1 v" N' M - LDA Rom_Btn_Once+ p& E) h+ y) m4 K& y
- CMP #BTN_SELECT
# s1 u! v4 e; w0 w/ e- ^ - BNE Quit_End4 k0 E' w9 C7 o$ t
- PHA/ D6 W, ~" n3 ~ L* F" P
- TXA
% a1 s J, S5 i- D - PHA0 h/ k2 j. M7 n2 u p/ d$ B) B
- TYA& g/ d1 i( r% A! s( ?
- PHA7 g* q3 f0 U6 V! I+ D
- JSR Wait_Sound_Stop6 D% [% P! F1 q# r& k/ ` [
- JSR Save_Screen
% p9 E% r% \" b' {( d9 } - JSR Program_Begin5 k0 u9 \& B( }
- JSR Load_Screen" n' t' S7 x" a, i& R% L/ h+ n
- LDA #$10* K7 T8 U" t4 V9 M# o0 d: z I/ k
- STA Rom_Btn_Keep
* S# z, G& Z) p, y; U# k& ] - LDA #$00
( w* e, A) o* q$ E# [) \) q1 ~6 d. H - STA Rom_Btn_Once% t" J$ p. }" Q- g# V- |
- Quit:6 x1 e4 g$ r0 Z$ l* k
- PLA
+ S! P: g5 o: } - TAY: p6 a, H# i3 u1 A z# c8 J
- PLA
7 z5 |9 }1 C. q9 a! X. R - TAX
/ V* j1 Y6 t" x/ ^7 S - PLA) Q0 L6 v1 j' e% ~9 r
- Quit_End:1 a7 z6 x) X1 Z/ \6 l$ R
- RTS5 _: N$ u4 A4 h, W2 F/ \. N( o
- ! F6 b$ ?, L. Q; {- Z
- ;==================================================
{$ M c$ u3 f+ W0 L) N3 C( p - ;等待音乐结束
8 t: [; I' u/ H+ O S+ w - Wait_Sound_Stop:
& u. m) ]1 m7 v2 X - Wait_Sound_Stop_Check:+ _( a; F7 p# I! X5 b; i
- JSR NMI_Wait- j: }3 {4 e. Q6 D$ U: C7 f a$ G
- JSR $F825- Z% x; }7 J( U9 i I
- LDA $010A
! Y7 X" a: H2 R7 B9 j8 W% R8 ^+ G; }$ |7 s - BNE Wait_Sound_Stop_Check# X. c" I9 H. x( ~/ z( J7 u
- RTS/ d& _' y6 \1 K) ]
! B( [! M# f# H: F& X1 Y- ;==================================================& w( H7 |: q5 _3 a7 W; ?& v
- ;保存屏幕数据
- p! V) [9 {& f - Save_Screen:! t& m3 t% D1 f! Y
- JSR Screen_Off- b5 ]8 w' B7 b; H) z+ J
- JSR Save_Zero
9 g/ X1 |' l- k4 n- F% b' a - JSR Save_Ram
! W: @- C* U+ ^ - JSR Save_Ppu
3 O1 y. E$ D; W1 {* Z8 K) n( a1 p - JSR Ram_Init
N! S# X$ [7 v% g - JSR Sprites_Init
8 W: _: m$ d" T2 [ - JSR Clear_Ppu
8 ]0 R0 h! S6 c$ z ~/ `6 ` - RTS7 C/ Q: c$ X) P2 O
- ) \1 F/ Z% P- a$ B" U) ]0 i8 f3 {
- ;==================================================4 u3 D# g1 z# ?9 q: Y
- ;加载屏幕数据
1 L9 N8 L& `# S+ Q" Q* V - Load_Screen:
5 e6 A) g/ p7 N# a - LDA #$00+ B) ~) Y' R0 L$ u" E
- STA $2001
: Q0 j- I* M) ~ - JSR NMI_Wait
1 l; M* v* g4 w3 v. C - LDA #$02" Z3 _# G& \# X/ R8 s$ @
- STA $4014/ T( w9 G8 o8 w3 O; t' K7 x8 R# R# {
- JSR Load_Ram5 g" Q. z1 S3 s& }
- JSR Load_Ppu2 V, K8 A2 s" j% T+ F
- JSR Load_Zero; b& y. O3 N5 w& K( ^5 e
- JSR NMI_Wait0 |) a& a1 {3 f- ^
- JSR Load_Palette4 i0 O2 p1 h) b# j
- JSR Screen_On/ j3 v9 S' v, _7 T4 ?2 u
- RTS
3 I2 A' ^ j3 i* ]
+ a7 I6 R, `* h: `8 w- ;==================================================
& ]: Q$ ~0 Z! j$ j i - ;关闭屏幕& i$ @1 H6 a+ @; x0 m/ E
- Screen_Off:5 C& D v, a: ^7 }
- LDA Rom_Nmi_Addr
4 l, c2 e; b' [/ @( g8 } - AND #$7F9 C2 I6 }, K$ ^8 q0 r b J
- STA $20001 P/ Y: o: w% F, Y$ Z7 p
- JSR NMI_Wait) U* C. c) U+ ~# e
- LDA #$00
, s% {# ]3 y: R7 H, H - STA $2000! F' P. Y* S3 K+ l# l
- STA $2001
6 G; E% N5 o; j0 _% X$ Q; c - RTS6 |6 A) T6 n+ E
- ! e) G. x$ M8 p3 E
- ;==================================================1 S! Q' ~- T. c2 X$ u
- ;开启屏幕" _. Y2 B, M2 F
- Screen_On:
0 Q1 |! Y4 X. B1 p; z( h6 i5 n - LDA Rom_Nmi_Addr
P, e6 w6 ]1 L1 m5 { - STA $20002 {, i0 {) @- Y* u# f r2 m+ D, j
- RTS
9 T2 j) x& J7 E& H' L9 l. ^) s
! |: R" {, x4 C X/ T1 M* i( q" w- ;==================================================
1 Q( P8 ]( |; P3 A4 Y5 e& m - ;清空占用RAM
3 O: T# u0 Q/ Y9 A - Ram_Init:: E& C3 ^" _' ?4 Z* E! X
- LDX #$00
) t- U" h. M M2 t! N - LDA #$00
, V- [' H- ] [ - Ram_Init_Set:- s& \9 v5 \8 a9 z
- STA $00,X; p; J2 E5 w7 K3 K) {5 o( n+ p
- INX; P. `" i, x" t# ~' Y
- CPX #$40# `+ @' e L M4 ?& X% _
- BCC Ram_Init_Set
4 f# Y) D; E7 e/ ` - RTS
, g& ~% F% M! J N1 r. E) _+ L# t! {7 L - 5 E T- x3 F( t) T9 }6 Q% A
- ;==================================================+ d# _' T% Q+ {# }. C; Z6 t$ L
- ;清空占用RAM# z7 h" x/ w! \! y2 M( [/ o
- Sprites_Init:- b: j4 S$ k$ H) Z
- LDA $2002 P1 E/ x7 w- o/ u- S5 K" X
- LDX #$00" U" O$ r1 l* b! f# H) Z' i
- STX $2003
8 Z$ a0 }$ p& U) o2 g - LDA #$F8- B3 i" ^+ B/ j0 v9 f- H$ w
- Sprites_Init_Set:
t! L% j6 v6 E; L - STA $2004
* I* `# z& ^' C5 [ - INX/ Q0 K* f! y y8 G6 p
- BNE Sprites_Init_Set
; f5 F, _1 D( J5 g j: s8 `, O - RTS
1 b, t+ j) \' r! A5 A# ?* ~7 e$ x
M# _4 r# u p4 p* |7 \, \- ;==================================================
( U( j7 i3 a' L - ;保存零页数据8 c9 V5 @3 \6 }; M
- Save_Zero:! g5 B/ T8 g) e: f3 u
- LDX #$00* B) m! n" g8 W7 K, c+ A5 ]
- Save_Zero_Set:
4 I" h5 X- B( I" Y8 a& I - LDA $00,X; w2 e6 u7 U* r6 n% c8 L
- STA Save_Zero_Addr,X
. h( L6 J: P) F' P - INX$ Q: E' i: d+ p, S M8 a0 e' T" [0 H
- BNE Save_Zero_Set
4 @" f7 M! j5 k: l - RTS1 r1 V: ?, `3 X# I3 |+ r
. `! s; U' x+ S2 f; x2 D- ;==================================================
9 o9 {$ E, e9 c, ^, s( e. i - ;加载零页数据( S7 p) s# j0 \, {0 G
- Load_Zero:
9 x4 [) i1 l: o - LDX #$006 m# D" z3 b+ U2 @# L6 h
- Load_Zero_Set:+ V" I& q/ I; O$ G+ S2 y" _
- LDA Save_Zero_Addr,X
7 h3 I) g! z/ b3 T) J" {$ O9 u- [ - STA $00,X O3 h& Z3 A) I9 y0 {) t0 A
- INX
: z3 n `( n C/ f' `+ |) [ - BNE Load_Zero_Set5 g, V# G' B% A: c) G; h
- RTS
& q/ ^" l! d4 w" F. \( O - 5 R" b1 u% r8 z8 [! a a
- ;==================================================
- m, S) N) K7 c: H - ;恢复调色板
" \# o' V, z8 h - Load_Palette:4 T/ ~6 V8 l( e
- LDA #$3F. f C9 i3 b7 g5 D9 v
- STA $2006
0 f J9 k7 C4 Z: N8 G- [7 w - LDA #$00
U! H: x& [$ g# p! V - STA $2006
8 I' B8 Q; N* V - LDX #$00 |$ f& V7 w5 M7 l4 U
- Load_Palette_Set:7 K6 t0 v! Q" d- S2 C
- LDA Rom_Pal_Addr,X
, j! y# F3 P# }2 e - STA $20070 S9 V( |" }0 d( d. r3 S) p1 u4 |& h0 `! ^
- INX/ N& v$ D* W3 ]% a9 S: L7 M3 Q
- CPX #$20! o2 f$ W9 t8 p% i% v
- BCC Load_Palette_Set
1 D2 h! t: V0 u - RTS
6 c# Z# h6 ]2 _2 I+ u3 a | - / Z- [% c6 \3 H3 w6 Z' _
- ;==================================================
$ a, Y9 [- e$ c/ O, o - ;==================================================& u8 {. P/ ]. A" H* F
. A% P- `3 Q0 t3 R- ;==================================================% s6 V; v& k' V6 R# J- X5 I/ k- S
- ;程序开始8 d5 j, o7 L T n
- Program_Begin:
. F, h v" ~$ F" X0 D1 _( \& n - ;==================================================
, Y5 r2 O6 Z# J& E% @2 Q - ;图形设置
0 J: x# h$ B1 [& h6 r3 r) s - JSR CHR_Set
% Z+ }, |8 \0 q - JSR NMI_Wait
2 J$ z( u7 N& |. v' C8 X - JSR Palette_Set
; W7 Q$ `9 i2 k. F" n - JSR PPU_Data_Page_Show$ [, M2 o) c$ G$ b' q
-
. Z- K! n0 ^7 U- { - ;==================================================6 ~. W' k0 {8 Q1 }; O0 A9 b; A4 M
- ;开启显示
1 B7 c0 a) z1 Z9 M; m/ O - LDA #$1E6 I& I; I& b; }3 V! Q( ]
- STA FC_PPU_Status5 v9 V2 Q! [6 i6 b5 Z
- " q- C% }4 Z! o/ L) {
- LDA #BTN_SELECT/ l2 s3 u7 V2 P8 B2 b8 T
- STA Button_Keep' P- R/ `8 z7 D0 v
- ;==================================================% i2 ?0 g, @" I) q0 p* U5 ~* H. _+ `
- ;模拟NMI循环
" b; d9 a2 f) O+ c" ~ - NMI_Loop:+ k4 K9 _$ A) j$ f V
- JSR NMI_Delay
2 K4 D7 d, D: n$ k% u, X - JSR Button_Process% z" N0 g4 k* f# N- t
- JSR Button_Auto_Press& m! u x# y# x# U. G
- JSR Change_Select_Item. F6 [! r0 a5 x
- JSR Change_Function
' u, L* v: d5 X" w- b - LDA Button_Once
% I; [+ y5 L) h" c: A7 I - CMP #BTN_START
+ o8 v. B7 ~( t# z" e7 y - BNE NMI_Loop
: ]/ W6 J) f$ o3 j/ {5 ?/ h* q( O - RTS
. w7 F0 c6 p: B- b7 q
c: \) t3 N: N! A g! S% f- ;==================================================
, E- u+ q& Y" L) t3 G - ;模拟NMI中断1 Z6 P+ K: ?' ~7 r( R
- NMI_Delay:6 N f1 `) n) U# N' T l
- JSR NMI_Wait
+ K- F- i7 l/ i$ I% P - JSR Show_Select_Cursor4 t* [) x# M+ e& g6 {# _
- JSR FC_PPU_Process
! A& A4 G) @6 j1 l, P - RTS
, U9 l0 L; K* X. H/ {& D _, V8 x5 F - + l( m' C) Z D: g2 J% a
- ;==================================================
/ b; v* b5 A) D( U- [& J7 Q! Q - ;等待NMI中断
! A+ G3 B2 c3 F - NMI_Wait:+ D7 a z# O+ M
- LDA $2002+ E8 y" _ U b7 Z+ _0 Y
- BPL NMI_Wait
4 G! e, u" b! |3 b; h - DEC FC_Time_Count! A8 {4 w& b+ ?, E& [2 R% E
- RTS' z. I4 ]2 i' a, Y. @
- & W3 }9 Z- U3 B
- ;==================================================
0 I3 }4 ^0 ?+ B5 R. B* S - ;PPU写入模式配置属性
: A, L" Q! o% Z7 F - FC_PPU_MODE_CNTL = $FE ;带计数行写入8 f" D2 Q# K; M [1 t
- FC_PPU_MODE_CNTC = $FC ;带计数行清除
6 \/ F) v" Y2 _ - ;-------------------------------------------------0 _$ b6 A- H5 I) m4 m- B% Y
- ;PPU处理) q) z! F; A Q, ~+ h+ b+ N
- FC_PPU_Process:5 V B4 W+ v* a! ]
- LDA FC_PPU_Buffer
/ K3 _9 p$ a! q: Q ^1 D; w - BEQ FC_PPU_Process_End: I$ V; B. }! v+ T5 O% R
- JSR FC_PPU_Process_Beg
* c4 ^. E! E: ~' { - FC_PPU_Process_End:( v7 ^% S( [# Y: t7 q
- LDA #$00
/ |1 D1 _ u$ |2 j/ n - STA FC_PPU_Buffer
4 w0 N6 O- k2 E/ C- k; O2 l( m - STA $2006
/ H0 e4 ?2 w6 f! Z - STA $2006
( V4 N4 m+ d4 k6 ^! p2 ?, K - STA $20054 _1 }3 H+ Z2 L! Y5 a
- STA $2005
' M2 M; I( y! {; c7 ` - LDA FC_PPU_Status
+ t: z! L' B! h" U( B7 V - STA $2001/ O8 P# P; g# U$ a% o1 U
- RTS# g5 F+ ^. ~) @& D
- ;----------------------------------------
3 c; q' }9 w( c+ J8 K/ n- w - ;PPU处理开始
! N$ w) c$ @: N' B. [ - FC_PPU_Process_Beg:% E/ c' C q6 r* j, @
- LDX FC_PPU_Cursor* C* T8 D, Q5 |+ c& ?; G
- LDA #$00: S% |) N* n+ e f' @
- STA $2001
$ I* p- B- A" E! q - STA FC_PPU_Buffer,X g+ t. f! e6 |- D; c$ ~: p$ v' g
- STA FC_PPU_Cursor
( K+ E( L. X4 k9 h) {5 \& ~; a% ~9 ^ - LDX #$FF$ p* E/ p. R5 S$ M( c
- CLV1 d/ p. s7 B! r1 J; S5 F
- FC_PPU_Process_Mode_Select:
) h' K, a9 |% l3 h - INX9 j" Y4 R9 u2 t+ A8 v: u
- LDA FC_PPU_Buffer,X) J* i, v* }* J
- CMP #FC_PPU_MODE_CNTL" H. `! v) Q, N. x
- BEQ FC_PPU_Process_Mode_CountLine. T' U* c+ g6 M
- CMP #FC_PPU_MODE_CNTC9 g% N/ {: m$ A2 A! A
- BEQ FC_PPU_Process_Mode_CountClean8 \) d% l3 n' ?1 M
- RTS
! y/ X) v/ K) a4 h3 a8 A- d - ;----------------------------------------" ]* R5 H: P, v9 C) h
- ;计数行写入模式
+ b4 [8 x9 N) H, P - FC_PPU_Process_Mode_CountLine:
6 F2 U9 v6 [( R- G( h+ M - JSR FC_PPU_Process_Set_Addr_And_Count9 c6 z& C8 M# t2 ?
- FC_PPU_Process_Mode_CountLine_Write:
) u; X! g' q6 K L4 T. m - INX, ^+ c0 b1 p- m8 N
- LDA FC_PPU_Buffer,X
: K8 A& l6 @9 \" V - STA $2007
! E, d- I6 o6 B, n$ i0 X - DEY1 r9 r+ N9 d! M
- BNE FC_PPU_Process_Mode_CountLine_Write
" A/ G' i+ d* _# D/ M5 x( k - BVC FC_PPU_Process_Mode_Select+ {6 C l) v! U1 B1 _7 X$ M' v! I
- ;----------------------------------------
+ n5 z, P- j" v6 K; G4 _1 z& j. i, q7 a - ;计数行清除模式: F, L3 A% P! F* \
- FC_PPU_Process_Mode_CountClean:
, Q" [7 r% D1 [( q0 ?9 q" m7 c6 U$ p - JSR FC_PPU_Process_Set_Addr_And_Count' h1 j8 Z2 g4 }% l
- LDA #$00
/ T$ |3 ?- ~. C) X1 B - FC_PPU_Process_Mode_CountClean_Write:4 { s- u7 q0 c4 {: ]! V, {' p
- STA $20075 _6 W3 l& m# e3 ~1 }; l
- DEY
% O" A& h; Y& Z0 `1 A8 W# i% T* ^ - BNE FC_PPU_Process_Mode_CountClean_Write
6 t* S4 Y1 a& ?1 J( i; K# Y - BVC FC_PPU_Process_Mode_Select
% A- {1 l' K" t! p# s/ z# X - ;----------------------------------------
$ v$ l5 j/ r% t f - ;设置PPU地址和写入计数
0 k7 B9 x3 h# l; T. ` - FC_PPU_Process_Set_Addr_And_Count:
' g' H n* p8 | - INX/ B; c4 d" B8 g1 C8 @& v) N0 H
- LDA FC_PPU_Buffer,X' ~3 e2 v. ~% `" f# ^5 h
- STA $2006
$ c. W+ k% x) w/ l: q8 \/ K - INX; q. B* O: N$ |6 B0 s9 z
- LDA FC_PPU_Buffer,X* k8 S d9 A$ ? |2 n/ `6 r
- STA $2006# X5 D* x) S$ L: i1 u& U
- INX
7 H( q* h* N1 ~* Z; u# E - LDY FC_PPU_Buffer,X% U9 a7 [+ i! A0 y, a
- RTS2 |4 j6 b2 V% ?) x
- 8 K3 ?. R. b( p( g9 z
- ;==================================================7 ?. h% u, r. h! N
- ;设置CHR图形
0 Q( F. Q h) X" g - CHR_Set:
4 A$ H! Z; X7 [ - LDX #$052 O) M) N( l( M( P( X
- CHR_Set_Data:7 ^3 o T) z4 ~3 t7 f7 K e8 r
- STX $8000
* k; b. j/ N6 U: s- t! u - LDA CHR_Data,x
+ p" G- |1 |9 \ - STA $80012 i% d! x9 p2 T
- DEX# q. c) Z# ?) a8 X- P y* J8 l* t
- BPL CHR_Set_Data
6 g7 y" I0 f6 P6 L! D% u/ r - RTS! A+ |5 z6 k/ m
- ;----------------------------------------. x5 ` N$ [4 Z7 X2 S8 C
- ;CHR图形bank数据
, w7 ^3 F! [) T$ \1 R0 S) c" F - CHR_Data:
& N5 P1 q" A' G9 p1 _ - .BYTE $00,$00,$00,$00,$00,$00
; P. E# m& q q: o) j' ` -
' y+ u5 [" D) c9 i5 i6 ?! o - ;==================================================
1 A8 K: ~+ d8 r& _ - ;背景调色板设置+ e$ ~5 v L6 V: t2 |& u/ n8 u2 I
- Palette_Set:
+ ~- |+ d l# }. [* ]5 r - LDA #$3F( O' Y' T/ q- E2 k7 g( v2 q5 S
- STA $2006
2 c- t! }, T0 N$ O - LDA #$00( e. Y. e% L! C) p$ Q" l7 R* E1 M" i
- STA $20064 g7 s/ Z2 V" s S! [5 Y' [. {
- LDX #$00, J4 d$ W7 e" a! p. }3 E6 R5 {
- Palette_Set_Data:
8 r' ?, R3 ]2 ] h - LDA Palette_Data,X7 Y8 ~! J& [ N: v: _' R- n
- STA $2007
: `, G. @4 D2 g1 x% F - INX4 t1 _ ~4 L' M9 A
- CPX #$209 |4 H1 A. K3 q1 E: f0 D7 |' H
- BCC Palette_Set_Data0 v9 U9 q6 c" l0 q9 Y! `5 `
- RTS
0 B. G: s- F4 l, U3 V7 j - ;----------------------------------------
0 v8 ^7 C& B p! J - ;背景调色板数据5 a2 S4 i& L3 ~) b$ r
- Palette_Data:
% l1 c6 S% j! x! w# @* p: N - .DB $0F,$29,$24,$24,$0F,$20,$20,$20,$0F,$26,$26,$26,$0F,$2A,$2A,$2A0 t) ^7 D" q& C$ Y! _
- .DB $0F,$20,$26,$16,$0F,$24,$24,$24,$0F,$26,$26,$26,$0F,$2A,$2A,$2A( v4 V2 w9 u9 G
- k( _7 l% y: R
- & g+ T" c/ |5 T. p4 S: h* e
- ;==================================================
* ?0 }3 q% U7 o/ P) C# f* ? - ;按键扫描2 N4 D, g E* @/ k+ J* h1 Q
- Button_Process:
8 s3 U8 G- B- \# u - LDX #$01& ]# R8 k0 R f! J
- Button_Process_Beg:/ }1 J% N7 Y& e( R7 n# ]) u
- JSR Button_Scan
9 b& b! U/ d, u - LDA Button_Keep,X8 X# j- q( @6 p& `, G, \
- STA Button_Temp,X
$ V; _) [9 N P. B - JSR Button_Scan
% ^+ e5 J& ^- [: i - LDA Button_Keep,X% y9 H/ M6 c6 A$ q
- CMP Button_Temp,X( y, s8 C" V* L! \
- BEQ Button_Get_Once2 }7 N. [- F, T; L
- LDA Button_Buf,X
, Z$ U4 a& j7 n - STA Button_Keep,X& x5 X0 d% q9 O9 w
- Button_Get_Once:* v, o5 u1 A0 o( {! X$ _: R
- TAY
' f8 S2 |6 D+ |8 ?9 p' T( @! P1 @ - EOR Button_Buf,X: i( h4 A3 \5 e
- AND Button_Keep,X3 W4 ~3 }( \1 P# y9 S7 C
- STA Button_Once,X
/ N$ o; a5 h6 W1 n* x6 `' ~1 w+ Q - STY Button_Buf,X! X+ a" n1 { D x) N4 _" i
- DEX/ F: {$ x9 F% `* _
- BPL Button_Process_Beg
) l, G/ v* F; x4 l - RTS: q+ j s2 [+ q. A
- ;----------------------------------------; n. x( y" p% r# V: e- L, C
- Button_Scan:; f1 U% ~* r7 r, C. a8 |
- LDA #$01
+ p* V% i( ~8 d1 y - STA $4016& @5 ?9 k i9 J
- LDA #$00
7 j4 C& m' \ s% h2 j - STA $4016: V' B- w3 Z, K2 O4 X9 y2 Q& p
- LDY #$08( ]3 k8 A4 t n% d
- Button_Value:
# e: n* A7 {6 O7 G1 [! ^ - LDA $4016,X
! b' J% p4 B6 A+ J' ~! ^' Z1 e I - STA Button_Status,X0 Y! L' C6 [; D+ }- |5 h' M/ g
- LSR/ i6 a" K# D4 a' o" P
- ORA Button_Status,X
0 Y6 ?8 b, Q7 @$ A. U% V) }3 F# r- L1 ~ - LSR! U8 ~; _) I8 R; u' C* J- X: L
- ROL Button_Keep,X
8 u2 a# f+ k% z% a - DEY9 A6 X- H+ K1 w* ^3 q
- BNE Button_Value5 M5 u' P' {0 T5 o
- RTS
& c6 m) I8 `( K) ]3 `: } - 8 f; C0 K% x# |3 d Q h
- ;==================================================& H/ E1 q- \, ~9 N: m. z
- ;按键自动按压: e2 D( f# [7 t- u
- Button_Auto_Press:
c3 z% H4 \0 g6 o3 x8 ^ - LDA Button_Keep
9 u6 [- o& Q& E( H1 J3 C: Q7 ^* U - ORA Button_Keep + 1- b4 L* J( M0 t9 h B# J4 [& I
- BEQ Button_Auto_Press_End
7 e' w8 `9 D" m" U6 ]% z+ s% O - INC Button_Auto_Delay. @" k2 E ?6 O3 C
- LDA Button_Auto_Delay
4 b+ A# d& q2 h! d5 ?0 J - CMP #BUTTON_DELAY_MAX
! _2 v# |4 } I. |( ] - BCC Button_Auto_Press_No_Active: \( u' T* I. Y/ ?' w+ N
- LDA Button_Keep
4 O7 E% j4 g& j. C8 f; h7 ? - STA Button_Once9 w1 e r# W$ o
- LDA Button_Keep + 1
- A6 E3 k* l* K5 L- J - STA Button_Once + 1- |1 W# Y3 E( P' Y9 V
- LDA Button_Auto_Delay. [: V% A( K& Z
- SEC2 e, a& E- f ^) T) [) _
- SBC #BUTTON_DELAY_SPEED( o8 w9 }0 I9 E+ h5 k6 v4 h
- STA Button_Auto_Delay
" v' E1 ?# S. ?4 o) v; m - Button_Auto_Press_No_Active:
6 F5 K. p/ m+ j B3 A ]% x - RTS: j$ W% A/ D& }) i: e
- ;----------------------------------------1 c# z* H% q4 k5 C3 h& a
- ;未按压按键# I9 s* K2 ]0 e0 T0 C
- Button_Auto_Press_End:
9 z# m' ^* Y1 w9 P4 r* D: n2 N - LDA #$00
4 p9 e7 `* M3 U6 h& _! |- g R - STA Button_Auto_Delay J- ~7 o, G. X q2 l
- RTS
: m* p' g0 r, k2 G' _4 v9 y - 1 G1 r, D2 e" O( ?
- ;==================================================
5 P) a( _8 r) J6 a# b, w' Q - ;设置PPU写入模式2 m! K/ G: o- l! c3 H. K
- Set_PPU_Mode:. R- q& H1 T. Q5 i0 `, T) ?
- LDX FC_PPU_Cursor
1 {5 ]! K; U/ @ \5 K - STA FC_PPU_Buffer,X( i9 Q8 u$ ]2 S5 h
- INX+ E0 }, u' d% i7 i$ @
- STX FC_PPU_Cursor
0 f9 P1 Z7 D+ v) ^" H - RTS$ R/ J2 }& s7 u- c, B
% y9 n+ D; p, A- ;==================================================
# h9 I: r% t+ S8 b - ;写入单独一行文本
$ O5 e2 N2 B9 ^4 p4 m+ b( f1 l - Set_Select_Addr:
$ b9 Z4 J% k% k* _: R2 {7 r - LDX FC_PPU_Cursor
! q+ T: A r, o6 W - LDA FC_Select_Temp/ w( P; n! i# m, k6 `9 q+ M' i# M D7 R
- ASL% @# _$ h/ W5 D- C7 M
- TAY( _# a. Z6 _- n
- INY% C* }# A7 L: q4 v# j% m
- LDA Text_PPU_Addr,Y$ {9 J5 d7 o; d2 h# T* u6 G
- STA FC_PPU_Buffer,X' a2 o O( G1 H( J0 \
- INX+ I, n1 _ M& Y3 J& k g9 F; _
- DEY+ N T5 d. r8 @) J; I# L3 M/ p
- LDA Text_PPU_Addr,Y
& ]0 {4 i5 M# F7 y0 R0 E - STA FC_PPU_Buffer,X. G0 f9 t& ]8 K
- INX
9 K3 U3 J' o& h( {0 v6 j/ }( {! ]/ j - STX FC_PPU_Cursor! _+ h+ U8 z% `$ `: H
- RTS
3 b7 I" t8 e! m, q" @# J - ; x6 ^. T' F' J2 c# v8 w
- ;==================================================
0 c5 c- ^+ ~3 o" E& V! o7 b! P - ;写入单独一行文本
0 r* U0 a e6 X# n, l+ t, P - Set_Select_Data:+ M/ ]% a! E" b, K9 K4 l
- LDA FC_Select_Temp' }- B: ]& [. I9 `
- CLC. }) A6 H/ v! w" I
- ADC FC_Page_Cur
, i" e7 s4 e( P. ?$ t - ASL5 `4 N+ ~* u6 q+ t
- TAY3 ?0 j5 J6 l( a$ ]7 |
- INY
; o( n* C- ?$ b0 q: @$ j - LDA Text_Data_Addr,Y" z7 u% q# P, o2 o8 x( a8 k
- STA FC_Data_Port_A_H4 [: [; S# @ V$ C) K: h
- DEY8 e! E8 v- b3 d9 _
- LDA Text_Data_Addr,Y( [# h% t! ?( {2 F) S. v8 h5 f, X
- STA FC_Data_Port_A_L
0 E$ P5 [& \- R4 v C - RTS6 L/ F4 { U# U+ Y
- 9 h: d0 a% g# y4 j, a
- ;==================================================
7 g# z6 S* Y( }. Y; g3 Y, A - ;清除旧文本
# ^, O4 y; b0 m - Set_Select_Data_Clean:
7 s3 d/ L% R! O, W+ I" M. W' D S - LDA FC_Select_Temp
7 Q5 M! `, c- D$ b8 R - CLC# v) X& r6 L' x+ E( Z
- ADC FC_Page_Old$ i z' }1 a2 I+ h! L
- ASL$ R% T8 J4 G2 p G; u9 {
- TAY
6 S3 s4 a: Y% g X - INY
* `- b4 Y" U! H! b8 w/ v6 Q( b - LDA Text_Data_Addr,Y1 j/ o3 s* U# M, {
- STA FC_Data_Port_A_H
6 U4 L% Q' T' g. w' l; b$ C - DEY
: T9 s2 |2 p- T. {1 _* t - LDA Text_Data_Addr,Y& ^6 @" i5 O7 i# Q6 j
- STA FC_Data_Port_A_L
: Y& }/ H9 K" @ T$ i K* g - RTS
' }- a: ~8 p1 b" F6 z K
1 i% v7 `# G5 Y/ Q5 K3 V1 T4 k- ;==================================================* i2 V; r- |8 I% z* j3 J8 _/ `
- ;写入单独一行文本
$ [* r' [+ x0 W - PPU_Data_Write_Item:
" F7 r. w% ^ ] - LDA FC_Select_Temp
5 v5 v# e: D/ s4 E - CLC
1 ?1 g1 }, Z* k! j/ E0 | - ADC FC_Page_Cur& V$ L- v5 @' N, x6 {- t
- CMP #FC_ITEM_SUM
( G9 z1 g, ?( Q( S5 H% P- Z" ` - BEQ PPU_Data_Write_Item_Set
; g6 u/ ^/ U! a7 R( I) D - BCS PPU_Data_Write_Item_End
" q5 W- ?( u5 N; w - PPU_Data_Write_Item_Set:
7 }# j- F, } \9 w* {, S5 N& H - LDA #FC_PPU_MODE_CNTL+ q% {, A# o7 b2 m6 V3 D- N
- JSR Set_PPU_Mode
" ^4 V8 c% e" o - JSR Set_Select_Addr
* z. N0 r5 j* z - JSR Set_Select_Data4 g8 k6 ? @$ v4 `
- JSR PPU_Data_Write_Line- I8 f3 l; K# X& N2 K3 Y9 v/ L0 P2 w% v
- PPU_Data_Write_Item_End:
5 o; h- g i0 }% v9 L# V- o" A1 I* w - RTS9 K' i. v; [/ I" Y& u9 Y& Z9 \
- $ J8 a! Y- b0 v
- ;==================================================* J9 g. o; l- [, N6 z- e3 Z
- ;清除单独一行文本
^! p' W( {. H) r - PPU_Data_Clean_Item:2 \1 x" U! A8 F. x M7 ]0 e
- LDA FC_Select_Temp' K; F8 E8 `$ C( V8 S
- CLC4 M8 ^5 K/ ]/ l+ f6 e, A
- ADC FC_Page_Old- N2 q( o" K3 }& s0 v. Y* |3 f
- CMP #FC_ITEM_SUM
: I" E; b" n2 y# V& g7 l+ N; Z Y, R) V - BEQ PPU_Data_Clean_Item_Set1 p8 k s% P; P! J, i
- BCS PPU_Data_Clean_Item_End
- l/ ?& b4 [* U- U - PPU_Data_Clean_Item_Set: a6 G! M: {" l6 q5 u
- LDA #FC_PPU_MODE_CNTC3 Z: s4 S$ Z( B% s/ _9 x
- JSR Set_PPU_Mode
- l( x0 x, q: w/ x, v( p% X; g - JSR Set_Select_Addr5 a! F+ F! Q+ ~3 Q
- JSR Set_Select_Data_Clean
" h3 s7 i9 d+ }4 W# I - JSR PPU_Data_Clean_Line. R+ z, Q8 H$ n f5 g6 A) O
- PPU_Data_Clean_Item_End:
3 @, E8 X8 N% W+ C, n: r3 g - RTS& v% L$ k# j% t3 A' W" t% y0 o
0 k6 U" |* l# y4 f+ |- ;==================================================, S2 N! l4 m3 ?. U2 g% S, T6 v- {( K# }
- ;页内容写入
i! y1 O1 U) b! m& ^% E - PPU_Data_Page_Show:
- v$ [3 V$ a5 b$ Z& \# U - LDA #FC_PAGE_SIZE/ z( `4 L4 G" e% J, o
- STA FC_Page_Item_Count6 d" M' ~) O j) d
- LDA #$00+ o$ M# I1 Z( ?" ]+ D
- STA FC_Page_Item_Buffer" k: Q. y1 V; W7 C3 b( P
- STA FC_Select_Temp. H! O& ]( I. n* Y. W
- PPU_Data_Page_Item_Set:
* K8 F# z6 J. X+ k/ G( J3 t R; J - JSR PPU_Data_Clean_Item1 x& c/ y, ~! C1 i8 f, l
- JSR PPU_Data_Write_Item1 ?4 s4 G; r) J; x0 a
- JSR Function_Status_Clean
0 Q; @5 b! l% i# F. d, Y7 H, K! t - JSR Function_Status_Show1 j/ r% T$ U. H+ n; q
- INC FC_Select_Temp. U9 K- f. @9 L
- INC FC_Page_Item_Buffer d, a/ a+ S" m+ a/ U' `4 `
- LDA FC_Page_Item_Buffer5 t7 E# s; Y6 \% s( {
- CMP #FC_PAGE_BUF_SIZE. i& I8 A! j% q3 J, `6 v
- BNE PPU_Data_Page_Item_Set_Check v# P! |* W/ s/ V2 Q9 g( c
- JSR NMI_Delay0 [% u* L- ~4 E0 i1 w- {+ u( j
- LDA #$00. Z, |$ z# J5 v6 [8 o. ~3 p% c4 S
- STA FC_Page_Item_Buffer
% w- W1 }7 v2 J' [( p - PPU_Data_Page_Item_Set_Check:
' f6 w3 u* f* b0 ]! Y - DEC FC_Page_Item_Count9 {2 S8 p7 F. H5 Z* \5 G
- BNE PPU_Data_Page_Item_Set8 f. D1 e) A0 T- h
- PPU_Data_Page_Show_End_Check:9 u J) ` O: b" j: T" t6 f! I* _/ n
- LDA FC_Page_Item_Buffer7 s# M- j! _* A1 X+ e
- BEQ PPU_Data_Page_Show_End, M8 { U! q, {
- JSR NMI_Delay( L3 s1 r( s- {. W3 N b
- PPU_Data_Page_Show_End:
7 H# q. ^; h) N - RTS
8 S' o, _. P8 s; p A& X5 j, ~ - & w" P" a' z2 \. ]
- ;==================================================$ i/ u0 s) i% k# N
- ;PPU单行数据写入接口/ j: O2 J: M$ J, k. I i
- PPU_Data_Write_Line:
% Z5 ?. c/ U, n5 Z$ l- d6 b - LDX FC_PPU_Cursor
# U J( L6 E* r- P' e! z - LDY #$005 N6 ^$ P! _4 n; F! z# m
- LDA (FC_Data_Port_A_L),Y9 q! g; W: a" E" _5 t
- STA FC_PPU_Buffer,X
# u# ]$ Y8 Q6 n3 x - STA FC_PPU_Data_Cnt
% k t! p+ }7 p - INX( {" O/ p- T: H4 T1 P5 c1 n9 m! c. K
- STX FC_PPU_Cursor
8 M4 E G& I( k+ ]( @: X - INY" b5 t3 W6 L6 \% O
- PPU_Data_Write_Line_Set:
8 T$ K: j W" [4 J; c$ k - LDA (FC_Data_Port_A_L),Y8 D: b2 O) S6 ^) B
- TAX
7 j$ x! }7 x/ J( g# O - LDA Char_Rom,X 6 I* J7 y5 j! S* C3 ]' J) ?+ q( |
- LDX FC_PPU_Cursor
+ l0 x. s+ \: W% | - STA FC_PPU_Buffer,X
9 l* z4 C& J2 Z; e) k h0 N - INX
X" c* B3 f# h3 U3 B/ I/ |+ \ Q - STX FC_PPU_Cursor
6 G: \* _/ K _# c- F2 }3 @* W0 X - INY
8 ^/ e/ _/ w, g" r" B4 A - DEC FC_PPU_Data_Cnt* p5 I! T/ O6 ^/ Q% o8 M! k8 c
- BNE PPU_Data_Write_Line_Set; c& {4 d# T+ H; p$ d% _
- STX FC_PPU_Cursor( \/ G" Y- b, p+ M
- RTS6 N; f" r8 {9 j0 e
-
: [4 S9 v; Y# ^- e( g8 i - ;==================================================
: \9 e% i9 r# ?* E, H - ;PPU单行数据清空接口0 Q1 h+ D4 o6 x' S. f* a( n m
- PPU_Data_Clean_Line: [9 g, z; W5 ^- f
- LDX FC_PPU_Cursor$ K. L& R+ m; A; s( `% d
- LDY #$00
; U5 S2 u1 }7 b; ~. d) d - LDA (FC_Data_Port_A_L),Y
9 q' K& D i" G! |1 v - STA FC_PPU_Buffer,X3 M! O# u2 l" r- b. e
- INX
3 W) o7 u7 }9 @7 Y7 _; E; }- u; d; q - STX FC_PPU_Cursor" ?" X. L7 G( w
- RTS5 c! m5 o+ u3 W ?* h* [* W
O+ j' J9 O, J# J! N5 x- ;==================================================
" W% U6 t7 R) M9 d - ;更改选择项
8 @ c' d1 d# j - Change_Select_Item:1 H6 D- g J/ t7 ~6 R, S
- Change_Previous_Page:
$ |6 J9 U2 i+ o5 E6 f - LDA Button_Once
: n. q+ s B" r2 Q0 ^6 f - ORA Button_Once + 1
* R: |9 a" |# b" q - AND #$02
: V4 W% N1 _6 d2 J8 k - BEQ Change_Next_Page+ y( u4 C5 S, V o5 \# F# G
- JSR Change_To_Previous_Page9 ~7 b1 ], r9 D. Y* d$ ~
- Change_Next_Page:
+ _/ X9 O6 t' V9 }: t - LDA Button_Once1 C: H8 @! `3 |! ]" D1 s+ H4 k
- ORA Button_Once + 1
: a& y u" C- w- d* M - AND #$01' d! c. O# C# F4 M M
- BEQ Change_Previous_Item i) S4 W1 Q# e. R" i
- JSR Change_To_Next_Page" t) M7 C5 O4 c+ F6 i- D5 |1 |
- Change_Previous_Item:8 F5 t$ ]6 E# m0 |9 O( E/ p
- LDA Button_Once- O( y$ B, y, Y- f- P& Q
- ORA Button_Once + 1/ q1 B, ]% q* i9 V3 V* U$ R
- AND #$08. y# o0 J# p8 p* A
- BEQ Change_Next_Item, x/ j( f+ u2 X, C$ K' |
- JSR Change_To_Previous_Item0 i) f' z% m" u$ B0 @( X: }
- Change_Next_Item:
, }; [7 ^7 c$ c9 Y7 z3 O! p - LDA Button_Once; }8 ~7 M+ e2 C; T/ C" m
- ORA Button_Once + 1
$ N* v% B0 X5 [ m: v - .IF FC_IS_DOUBLE_PLAYERS
. r; @ n, m4 x1 Z; ^9 w - AND #$049 n. n1 u4 a! S3 q
- .ELSE
$ I7 Y' [1 G5 h, B! E2 c% X E - AND #$24 y3 ~8 \# X9 q7 k4 a9 I8 C/ ?
- .ENDIF
! b/ C# D% y' Y. ~ - BEQ Change_Select_Item_End2 n! F: V$ H2 D3 j' K
- JSR Change_To_Next_Item. w7 y( c( k% T
- Change_Select_Item_End:3 z% g+ }' v+ y; b& k, G
- RTS
, Y: Q( g' ^8 c m/ ~6 ^, o - ' ?9 v0 @- z+ V# |
- ;==================================================
5 |+ B3 z! b: A% {8 W6 h - ;切换到上一个选项2 @" G$ N f1 j4 d9 u& A
- Change_To_Previous_Item:
! ?) l4 ]5 ^* b; k - LDA FC_Select_Index8 ]7 u( W# u: a+ Q$ E9 P
- BNE Change_To_Previous_Item_Set
! A4 m* [; ~& k3 u# m - ;---------------------------------------- r4 q8 x! @7 X2 U, V& y
- ;切换到末页最后一项8 |' w% g( i/ z# f, j2 @
- Change_To_Previous_Item_Set_Last_Page:
9 B/ V6 _# a$ H: c0 p - JSR Record_Last_Page_Index2 ~4 G$ \/ C0 U
- LDA #FC_ITEM_SUM
# a7 A3 M+ N& x8 F - STA FC_Select_Index
; N6 I3 O6 s! }- l( K5 N/ A9 X% x - LDA #FC_PAGE_MAX
% h3 g% v8 ^5 y: N8 n - STA FC_Page_Cur
- r P$ Q% b- A( S - JSR Update_Page_Content9 b7 x0 u+ i. K. w' E: h+ N* b3 X F! p
- RTS
{* [$ V* h$ P& q: f1 y - ;----------------------------------------
! M& p! M) N8 e& @- E- v9 l! _0 @ - ;切换到上一个! j0 O x* R) m; t
- Change_To_Previous_Item_Set:
: i. ^+ S/ r# y; s - ;检查是否需要换页
' a* A3 E2 `$ J) P& y - LDA FC_Select_Index+ B) O( L" q: c' G! L% U' o3 L
- CMP FC_Page_Cur5 |% C2 p& a5 R0 |
- BNE Change_To_Previous_Item_Set_No_Page
' |; k2 V7 E) U( z9 F4 N - ;----------------------------------------9 X& f3 Z2 u* l* p
- ;切换到上一个(需换页)- W! a P0 j$ l$ ], |' _
- Change_To_Previous_Item_Set_Page:0 m4 C/ r: k, [. n+ r
- JSR Record_Last_Page_Index
3 ?* V# Q, B# Z( n0 P& w - LDA FC_Page_Cur
' X0 E( N }( d8 q - SEC
* J' B6 D% N/ ]: c - SBC #FC_PAGE_SIZE
6 h6 {+ _7 O) m( j, \ - STA FC_Page_Cur
( R( U) H& S: Y4 l8 s - DEC FC_Select_Index3 }$ |: ~8 ^$ R. t. |" V
- JSR Update_Page_Content8 N9 S3 g7 r/ z4 J4 F' Y
- RTS
. z5 h! h- L# h" U - ;----------------------------------------
7 T( k7 j! h& i2 I* Q- m - ;切换到上一个(无换页)
. f/ ~; ]$ L/ u3 v: ? - Change_To_Previous_Item_Set_No_Page:$ f1 T; b5 n8 ~7 v. E4 p
- DEC FC_Select_Index
- H0 a% T/ H9 C4 r$ i - RTS
* G S. S+ @; L" |6 l2 o# y( L
6 u- u4 S) ]& g2 G0 s- o- ;==================================================
* ~- ]6 C9 Y4 ~) [ - ;切换到下一个选项5 n: P8 E7 y0 E
- Change_To_Next_Item:) T# N& s% r+ T6 t1 \; d
- LDA FC_Select_Index4 F) g& [5 `/ }* X9 r: l2 S, K
- CMP #FC_ITEM_SUM7 R, V( {. {) s, N- K4 B" }; @6 S
- BNE Change_To_Next_Item_Set
2 A. q$ }1 f0 v- s - ;----------------------------------------
% c$ j* b+ M# ]$ Z: j+ _ - ;切换到起始页第一个% |2 n6 c' C' M# h
- Change_To_Next_Item_Set_Begin_Page:
3 e& ~ E T: \ - JSR Record_Last_Page_Index
! l, z3 j& k3 J# S8 f3 ^ - LDA #$00, {- l5 s* v; u \$ E6 Y% F3 m+ o
- STA FC_Select_Index7 C2 `4 z; L1 H& ^" U* I) L% {
- STA FC_Page_Cur' \$ ]) r8 S$ T2 b
- JSR Update_Page_Content3 M* ^! Q0 i) r! Q$ `! X( h
- RTS
' b5 |' X: T- }/ I6 X: h( i - ;----------------------------------------! j0 R0 N" j: X" O; U% ^& s
- ;切换到下一个
- o: Q% a1 B2 `& v" N - Change_To_Next_Item_Set:8 v0 B4 F( x* D$ U) r
- INC FC_Select_Index
' O0 r- `: y8 l - LDA FC_Page_Cur
* z* j$ ]$ a: ]# s: C( T7 e - CLC1 v9 Y$ g# k- c3 `2 s
- ADC #FC_PAGE_SIZE' o% ~0 } m+ z
- CMP FC_Select_Index
3 R- a" y1 _: e! f' [- H% U - BNE Change_To_Next_Item_Set_End/ N% b3 g# O9 ?5 \, S" I
- ;----------------------------------------
$ ?& \ K* \( q/ I# f& C - ;切换到下一个(需换页)
( a" ^4 h( @, b6 I1 } - Change_To_Next_Item_Set_Page4 p6 @1 i: L' O4 B; Z) D( c
- JSR Record_Last_Page_Index% F7 c' l- k( M, ]& y) e
- LDA FC_Page_Cur# l Q+ s; e3 C: S; j7 l3 E
- CLC2 _' `: L7 K9 b7 W9 S7 L
- ADC #FC_PAGE_SIZE0 a9 |1 `4 v- B+ A' H
- STA FC_Page_Cur4 j9 Y7 _; M' B" W( m- {
- JSR Update_Page_Content
4 I: m4 `% W+ w: ] - Change_To_Next_Item_Set_End:
& L# \% |* B0 D* P4 u - RTS8 ?$ ?5 `1 x% e' ?- |2 y! X
s0 U4 [$ ~ ~$ y" n- ;==================================================/ I8 s# V# g2 {, D' i
- ;切换到上一页; j2 T8 o. `0 G- C3 ]
- Change_To_Previous_Page:
5 n# |, R5 G U, R5 I7 p: s; M - LDA FC_Page_Cur+ ]. e% b" U" |
- BEQ Change_To_Previous_Page_Set_Last_Page
1 x3 r* T0 u% G9 J: Y1 K$ a - JSR Record_Last_Page_Index
8 b9 R5 V7 S" k& j4 k5 y" V2 N - LDA FC_Page_Cur
! A5 D7 g: t8 n9 Q - SEC
" H+ q# c- B& w* k - SBC #FC_PAGE_SIZE
, S x- g( f: E2 Y0 K - STA FC_Page_Cur
% O$ }0 K7 A' z Q" j% F% o - LDA FC_Select_Index
/ M5 r4 `9 J5 n' e# o - SEC
& A. `# @+ _* A& j# G - SBC #FC_PAGE_SIZE+ ?' H! Y5 y0 T& Z# C9 r- s
- STA FC_Select_Index. g) P4 z$ Q0 u+ X% o% X
- JSR Update_Page_Content t3 G+ h1 Y4 q
- Change_Select_Last_Page_End:
" O% C4 ?2 E7 r5 U - RTS8 o; n; M, ^ Q4 K1 O
- ;----------------------------------------
4 {, m! w: K+ r+ w/ J, N! v0 w `2 a$ V - ;切换到最后一页& `6 _, i5 P+ [7 L+ n5 A
- Change_To_Previous_Page_Set_Last_Page:% X; E3 k' D% Z3 f; a, N
- LDA #FC_PAGE_MAX
1 A3 a8 l; @5 n - BEQ Change_To_Previous_Page_Set_Begin_Item
: H, \5 {2 O, K0 D - JSR Record_Last_Page_Index
" T9 k r6 I! J! F: r( o - LDA FC_Select_Index3 P/ U1 f5 ?7 G0 w8 S' [
- SEC/ M; w% K/ V0 y; q: g) |
- SBC FC_Page_Cur
3 `1 k4 Q9 Q# | - CLC# M+ Z" Z4 @9 `# A9 z! C7 d0 o9 q4 I
- ADC #FC_PAGE_MAX$ S; s: k4 Z' q5 V9 @
- STA FC_Select_Index
: ^( X" p+ v2 A( R' l- _ - LDA #FC_PAGE_MAX# s% l4 ]1 c, l& }; ~
- STA FC_Page_Cur8 _& `1 W* M+ k! C7 n& ~
- LDA FC_Select_Index
; x- X) D+ k e9 h* v8 P2 T9 ~0 I - CMP #FC_ITEM_SUM k0 L- R p1 M( n+ r* P) ?
- BCC Change_To_Previous_Page_Set_Last_Page_End
( Y0 V7 ]: y0 O1 q - ;----------------------------------------
1 T0 H0 ]- i! } - ;切换到最后一项
, _: S; E: o. \# i. X - Change_To_Previous_Page_Set_Last_Item
; K9 K! Z5 ~$ k, k- } k" x - LDA #FC_ITEM_SUM' l7 B& p, S, _
- STA FC_Select_Index
4 S9 e; U: x( k6 [) S: a; \3 G - Change_To_Previous_Page_Set_Last_Page_End:
& @2 s2 \# D- F1 q* ?: o$ ] - JSR Update_Page_Content
1 p/ S* q( W1 G - RTS* |3 d. ~/ J8 |2 M
- ;----------------------------------------
% @1 u: x; f9 i8 O! U - ;切换到起始项(最大页只有一页时)
3 X @& O) a0 z4 H, Z3 s' | - Change_To_Previous_Page_Set_Begin_Item:
; y5 X4 l# N$ ? - LDA #$00
* a5 F' \( ~( M7 N- _/ t3 D - STA FC_Select_Index
2 P9 G9 I( E9 K& D0 t - RTS
% y# n! y) W# d0 u' s# S
: B0 ?# [" e5 V' E! i: i- ;==================================================' c% R& n: M# |8 R7 H( t! V. }/ J1 v$ d& M
- ;切换到下一页
* t% p5 c8 j2 p9 {; T - Change_To_Next_Page:
! o5 q# G, I+ H3 o - LDA #FC_PAGE_MAX
5 r0 g7 J, h" T: }8 R - BEQ Change_To_Next_Page_Set_Last_Item* Y, ]) Z x: T
- LDA FC_Page_Cur
4 ]6 y8 e4 h+ y - CMP #FC_PAGE_MAX+ w9 P0 V) e1 O& X' y1 U9 p0 s; f. }
- BEQ Change_To_Next_Page_Set_Begin_Page4 O$ |7 K5 n- y/ t' S$ y, s
- ;----------------------------------------
7 G+ z6 T( m* Y, V* X* f2 t - ;切换到下一页
6 ^2 h) J3 _; @ - Change_To_Next_Page_Set: E. N3 a' Z- B/ Z+ G4 u
- JSR Record_Last_Page_Index, f6 U. y" ?% j: N6 |0 J1 o
- LDA FC_Page_Cur2 _' |1 w. `2 k. z
- CLC
8 p8 N/ a$ F% C: \6 s - ADC #FC_PAGE_SIZE
" ?# r/ v- ]* g - STA FC_Page_Cur( m9 H, e5 z- H% E" r( K
- LDA FC_Select_Index
0 [/ l4 \9 R% D" O+ @3 h - CLC: k8 k1 m9 z' Q' K0 _; X# n
- ADC #FC_PAGE_SIZE8 N9 s# r3 N+ f
- STA FC_Select_Index
: C! X7 M" q( k$ e! R% ~2 ? - LDA FC_Select_Index1 H5 C; x1 W- D8 {& N4 A
- CMP #FC_ITEM_SUM
+ w; Q# N( r+ @! n - BCC Change_To_Next_Page_Set_End" M! {9 |( z( U. f1 o
- ;----------------------------------------6 l2 Y) O4 Z2 P
- ;切换到最后一项$ \+ u( E# E8 N# b: u- o4 w& o
- LDA #FC_ITEM_SUM, ?) S5 O' T6 T! i, r
- STA FC_Select_Index
" y6 P+ a; \% u - Change_To_Next_Page_Set_End:
9 I7 B( @1 ^! T% ? - JSR Update_Page_Content
U) c+ c) k( \ - RTS/ S' j+ ?" R. K; y: ~$ E) i
- ;----------------------------------------
! n' Q7 y3 x. a/ ^/ o! \ - ;切换到起始页
# ~+ B" D4 I* b - Change_To_Next_Page_Set_Begin_Page:
- B/ I# i& R; z) ^* E - JSR Record_Last_Page_Index
; ]- B5 r4 ~ ^2 y$ M) b- z - LDA FC_Select_Index
5 H: J" G$ [1 \- a+ u. ?+ j: U - SEC
" z( ]& w; D: M& v7 X - SBC FC_Page_Cur
; S' B/ M! c/ O# Z1 o - STA FC_Select_Index; \0 R' ]" B: }" f5 J
- LDA #$00# Z5 x- W$ k8 w) [4 u
- STA FC_Page_Cur
& q7 [5 n% V, f9 T - JSR Update_Page_Content
8 h# k2 i9 X! x; @$ _9 ?0 R- L, w - RTS, V* R J' f0 ~) [! A/ |7 l
- ;----------------------------------------
7 v8 |& F, y. I Q& r" h' `8 p - ;切换到最后一项(最大页只有一页时)
1 f0 F3 u/ r! t* } - Change_To_Next_Page_Set_Last_Item:- G ^6 |9 M& n" k$ [3 N4 q$ p1 x
- LDA #FC_ITEM_SUM& X7 m& Y& E" ?+ u" z& C7 m* W4 \) @
- STA FC_Select_Index' |+ \ m& ^: Y! w. d3 u! R
- JSR Update_Page_Content9 A) `+ @9 F: H# [
- RTS
1 R0 m- I- q1 x0 }4 f) W, i) j - . C( B0 ~, T; ]/ |& s q
- ;==================================================
! Y; z$ h' [ B* A1 A9 J - ;更新页面内容
) [, Z4 k" |( `( g n6 m - Update_Page_Content: Y5 @: A% C* ]' d% y$ P- }/ d7 S
- LDA FC_Page_Cur7 ], o# j& Q9 A# I% |# A& d3 ]
- CMP FC_Page_Old
2 c. x2 ~4 c$ ?: ?1 S8 @ - BEQ Change_Update_Page_End
% N9 g1 G& {) d7 p$ V - JSR PPU_Data_Page_Show
% P; r5 {; Z2 U5 J2 u" n" r - Change_Update_Page_End:1 E8 b& g. G: z4 ]1 Y6 M
- RTS
' ?# R, S" I( r - , A2 v& i9 K k* @
- ;==================================================
: k! ]# m0 U. G' S; {* Z* L - ;记录上次页索引
% U, _' E* i& l# E" {) ] q - Record_Last_Page_Index: c, u2 P4 p5 C7 q8 [3 o
- LDA FC_Page_Cur
+ _' K( R4 J$ o3 V - STA FC_Page_Old
& ?: p0 R- z* P3 A - RTS
" ^; Q0 y9 ?& L2 ~2 H - 6 A# V, F6 f: y& p4 I1 i# K
- ;==================================================2 l2 ]1 ~- F4 k
- ;显示当前选择项光标# f* h( o. L- ^+ p
- Show_Select_Cursor:4 Y% x' `; ~% |: c7 S O
- LDA FC_Select_Index
3 `3 U6 h4 p9 _, L: _! R; q - SEC
2 O7 w! g2 l2 ] - SBC FC_Page_Cur
! V C( Z+ d. X6 g* }8 `$ b6 X$ o z$ C - ASL
0 ^/ Z2 P9 w* n - TAY
0 j+ a0 f7 n7 A2 A4 \4 | - INY7 G8 e- t' ^( u
- LDA Text_PPU_Addr,Y; N: L" K- ?# h f- y, e
- AND #$03
9 A9 h& s& |5 i+ O - STA FC_Cursor_Addr_H
, X* m" ?6 J# m. p" o; s7 h - INX& }6 h. M7 j: ?8 S" K0 U
- DEY1 K" `2 \/ G k: Z
- LDA Text_PPU_Addr,Y, y3 u Y! H" ], A# m( ~; a
- STA FC_Cursor_Addr_L
2 J9 { b4 y& s j, w' r - ;----------------------------------------
( j4 w8 D% v& S0 O - ;计算光标X坐标/ s7 I; n1 a! I6 ?- O
- Show_Select_Cursor_Set_X:, O3 @& J# ?8 J
- LDA FC_Cursor_Addr_L4 A/ x% R2 K: p1 i: T. j
- AND #$1F
: }" W7 @# Q! G. o h3 H - ASL
; m+ p4 a/ \/ ~+ {# m& s3 b - ASL7 ]( v& g ` \
- ASL
) j* F1 i; m: h) X* r; C! w - STA FC_Cursor_X" q9 h( z/ }5 N7 x! Z; h
- LDA FC_Cursor_Addr_L4 p0 C; A+ g4 Q. }0 s& [/ T
- AND #$E0
* ?/ K8 T2 o4 L3 X! V2 D. q - STA FC_Cursor_Addr_L
3 V& h5 B- _) c' V - ;----------------------------------------
/ V8 n: ^7 U# N7 V7 j - ;计算光标Y坐标
; u; x2 H, ?/ h" v7 a - Show_Select_Cursor_Set_Y:4 j5 |0 s! G* x9 s/ e/ S: P
- LDX #$057 U! z. R6 o* j
- ROR FC_Cursor_Addr_H; i# c2 o- w5 z3 ]! t: ]- G
- ROR FC_Cursor_Addr_L
7 g0 i+ S/ G) y1 n% r9 I) `0 x - ROR FC_Cursor_Addr_H* O' D4 K! W0 V- o0 J! e
- ROR FC_Cursor_Addr_L
( h5 o& I- O# E; _1 T D - LDA FC_Cursor_Addr_L
d k1 G3 z$ e6 K4 x/ P7 V - STA FC_Cursor_Y
+ z4 S. U6 y" s% y6 m - ;----------------------------------------2 v# t: F" {* B) q# _2 u0 a
- ;写入光标
/ O5 |3 ]) e" T; H4 I- x - Show_Select_Cursor_Set:7 c3 A$ Q, q- Y) u6 ]# \
- LDA #$00
# `6 P; k8 Y# _! I) Y - STA $2003' |# z9 x' R7 V# X
- LDA FC_Cursor_Y6 c: @5 t/ q* l+ N! W0 X
- SEC
& q- y/ r* D. V/ e6 R: a1 z' v) E" X - SBC #FC_CURSOR_OFFSET_Y6 {% a% @; x+ m3 x9 y0 E
- STA $2004! K, f3 \& w \; O; }
- LDA #FC_CURSOR_TILE
/ @' ~7 s H2 T! ?0 l - STA $2004. X. t( o6 f1 R) r \" b3 w
- LDA #$007 z5 F" |6 F6 i5 q/ ~( ?
- STA $20042 d4 K$ ?' B- ~$ O; n
- LDA FC_Cursor_X2 \( k; r0 D5 S t R+ Z; ~
- SEC# j+ O$ m& w/ ]1 R
- SBC #FC_CURSOR_OFFSET_X+ O4 `% Z j/ |3 B2 S5 |) r" P9 g4 u
- STA $2004
+ f$ C( t& A( v1 Y2 `- d - RTS
# Z t X7 U9 s) e" b4 t - " D% X* L# u4 o
- ;==================================================
% G/ ^9 S( o2 X$ @3 u' |+ | - ;切换功能3 K; { |5 R: L3 [* k
- Change_Function:
5 G# W) N {- I2 w - ;----------------------------------------) c0 {2 N, J4 N) f
- ;开启功能A
3 a* B) }/ M1 c5 r - Change_Function_On_A:9 s* Q$ a, p9 n0 S! i7 k$ v0 N
- LDA Button_Once$ T; f+ F0 F( h4 d7 ?. P
- CMP #$40
( ?) P) Z& L& X. H - BNE Change_Function_On_B& v% N9 u7 [1 B# g* I( S' P* i1 Q
- JSR Change_Function_To_On_A: s5 o! w2 N n9 i# w; y
- JSR Function_Status_Update
P! x+ a- M5 x- n- J7 @, } - ;----------------------------------------
) W- E% a# ~; Y" E - ;关闭功能B
5 S; f1 B- b5 z ~& u! u. k8 u& U - Change_Function_On_B:
- N H8 `% @* n: @6 t0 I) @( N& ` - .IF FC_IS_DOUBLE_PLAYERS
! B5 V/ D" h; [4 x7 _* ]% E+ g - LDA Button_Once + 1) k4 Q. x. \3 L* B2 @3 @
- CMP #$40
4 g9 v- n1 s+ }# x' n' ? J: x - BNE Change_Function_Off_A* |" f- \* \! Z+ E
- JSR Change_Function_To_On_B! }, S% V3 e" i, z1 q
- JSR Function_Status_Update# ~6 T& @$ Y" {" J& I9 S
- .ENDIF$ I3 S: k2 s0 v" o
- ;----------------------------------------
6 q9 L/ p- z D* w& l: w# d+ _ - ;关闭功能A8 K( B* Q: r/ b* [/ H h' Z
- Change_Function_Off_A:
# l4 q2 d& s S7 ^ - LDA Button_Once
) i6 d4 C3 x& `- i# q; s - CMP #$80$ v2 G( h$ a G+ q$ {( U o
- BNE Change_Function_Off_B
6 M/ l. v i# _% k - JSR Change_Function_To_Off_A. T. S! d# c$ v9 {0 N1 d% n1 ^
- JSR Function_Status_Update) K |) J, Y! Y7 t1 X- h0 g
- ;----------------------------------------
9 A& F3 [% m+ G$ K. L' [ - ;关闭功能B+ E# K2 U5 W( P s( S4 \
- Change_Function_Off_B:6 {% O6 P* Y I7 x+ H; w3 h- y
- .IF FC_IS_DOUBLE_PLAYERS3 G) O0 j( N. S& v' C
- LDA Button_Once + 1
5 E9 z5 l: }6 X; ?( S, b+ p - CMP #$80
5 m2 I4 R: m# {7 N7 P9 U2 D K/ Z - BNE Change_Function_Swap: R( A/ x* E0 X2 Q' l: n
- JSR Change_Function_To_Off_B
. a, Y, S/ o" R9 H" Q - JSR Function_Status_Update; p# ?9 J! A% M/ e. v# u6 o
- .ENDIF- V+ R2 Q7 p; e" Y
- ;==================================================( q) J; T0 q" q& m2 a! ~
- ;交换开关. H2 q. q8 [& h" I5 i. @* C
- Change_Function_Swap:
% \: T! z9 m: U0 |+ V - .IF FC_IS_DOUBLE_PLAYERS
h+ r4 `2 d" ~& a2 s - LDA Button_Once. Q. M- E9 X; W' a, O+ {1 f+ u0 W
- ORA Button_Once + 1 Z9 g6 B% D) s1 P3 {- ?6 G% i
- CMP #$208 b) p: m3 b' l$ r' ?3 O2 X
- BNE Change_Function_End# n7 A! A# f9 r; B- s" m+ c
- JSR Change_Function_To_Swap; s. m0 D, n2 a+ j8 ?) @$ @* p0 q p7 R
- JSR Function_Status_Update
9 G. ]7 O) {+ u1 n - .ENDIF8 C* S2 R7 k8 z& L
- Change_Function_End:2 \. [+ @4 \# l8 i
- RTS9 y( B. ^0 @; O+ L( Q7 ]$ [+ ^
- ; |; n4 r6 Z" v" t2 H% F
- ;==================================================
% _$ o3 z" G' | - ;交换开关状态* s' \/ l1 S' w D3 o/ c F& v
- Change_Function_To_Swap:
) h( y6 V2 Y# y1 ~$ q8 m: T - .IF FC_IS_DOUBLE_PLAYERS
- B3 A2 z s4 j! ?" K; V1 ] P- O3 w - LDA FC_Select_Index K$ B$ c ]2 E4 b* G
- SEC8 s; s4 [8 D* y$ t
- SBC FC_Page_Cur/ D" a% Q/ c8 x7 e
- STA FC_Select_Temp
% n# T2 ^: O8 ` - JSR Set_Function_Port. H7 Z! f+ ^. w+ f" M1 j
- LDY #$00
! w; J+ Q$ A' T - LDX FC_Select_Index9 ?; B# I$ k0 g; R: ~! I
- LDA (FC_Data_Port_A_L),Y
0 ?, C F+ E$ i* ]8 K- F - EOR (FC_Data_Port_B_L),Y
& A4 t% E* p% B8 r - AND Function_Check,X
8 r/ b G& I; G+ [6 C. I - BEQ Change_Function_To_Swap_End0 o2 C4 k% c7 `: {/ @) ~7 L
- LDA (FC_Data_Port_A_L),Y) |; R0 a, g" G8 c. l# F$ k7 b/ m
- EOR Function_Check,X4 u2 Y2 L4 g- Z
- STA (FC_Data_Port_A_L),Y' a, U. w; g; w
- LDA (FC_Data_Port_B_L),Y
1 O) }0 z: B, Q( p/ Y2 B - EOR Function_Check,X
& k* a" u- l. O/ \; x8 y% K5 h - STA (FC_Data_Port_B_L),Y
0 x ?" o8 v: _ - Change_Function_To_Swap_End:
( h' T4 x% d, E2 p - RTS
+ @! j5 e9 b' X9 Z. A" d - .ENDIF
+ G: D# D" C3 \! m3 U& ?) B - 5 Q; b! X$ ~3 p% f; V9 z! N
- 9 _$ A! |5 l5 W! e I
- ;==================================================
! _3 O+ U6 Z: M5 U - ;更新功能状态
. n# l7 p, y* ~ - Function_Status_Update:
+ a8 F' x3 z- n6 C; c! t - LDA FC_Select_Index
* X: v6 X: e& C7 n% S# u; x/ _ - SEC/ i+ R4 I/ H. D5 c' x' ] P8 ^# z
- SBC FC_Page_Cur
& u& C2 U ?2 U7 v- L2 Q" N9 A. \- K - STA FC_Select_Temp
$ u/ B9 J8 J$ u% @1 C; c5 \ - JSR Function_Status_Show
1 v9 R# `, W% l X, A9 g - RTS
9 T' f% V9 ~/ P2 d - 2 q U' l8 b- g. A# M& @. V0 W
- ;==================================================
8 r# j- O' U" R" O - ;设置功能地址端口+ k J! g8 G( Q( m; x8 P; |9 f
- Set_Function_Port:
3 p0 M; e j9 o5 [: ? - LDA FC_Select_Temp
+ A: P8 X& k% j, @. v! k8 C - CLC
3 c; O I" m/ T$ p J& O2 Q) Z - ADC FC_Page_Cur
# ^$ |) S5 }$ ? z4 O0 x - ASL- @& \4 M$ H2 P# T2 X. S# r% `3 t0 x/ C) ~
- TAY
# J8 m5 G, _2 Y3 ] - INY
, L0 ?8 e: \- x5 ^ - LDA Function_Addr_A,Y9 D2 E# b2 d% k G* d+ r9 f- y, F
- STA FC_Data_Port_A_H
; H, ^5 @" k: @2 d% s: ]* [ - .IF FC_IS_DOUBLE_PLAYERS; f# Z h( g4 ^! Q6 ?. S. h0 L
- LDA Function_Addr_B,Y
* I4 _ X* f, x( Y+ e - STA FC_Data_Port_B_H
* d* S7 n, o. T0 m6 w - .ENDIF
8 a2 z* T% t d5 B5 M( L3 h8 ^ - DEY
?$ M/ T; H+ S, Y - LDA Function_Addr_A,Y( f* D& o; j# z" ^) F# ]0 x
- STA FC_Data_Port_A_L% t' I0 V7 \' w" N% c( n& I! \
- .IF FC_IS_DOUBLE_PLAYERS
, _" V; U v! k/ v2 S! {/ d - LDA Function_Addr_B,Y: O3 P# k4 y' Q8 I/ D
- STA FC_Data_Port_B_L! j$ n+ R- q. L6 _9 s7 O3 L C
- .ENDIF
! b% P9 k, ^2 u( g - RTS0 K M, Z: z# i" B
4 C4 |3 m7 [8 ~* M0 d/ [) }- ;==================================================
5 q$ o% \. N6 C5 M - ;设置功能临时索引) n" q, C* m. n. w2 j5 [; a, _* v
- Set_Function_Temp_Index:6 ^" K8 b5 r2 @; P5 g
- LDA FC_Select_Index
' h( h* j0 m( } - SEC
. D! O: r. t d# w" S% ~" r - SBC FC_Page_Cur3 G+ t, u8 ^+ }9 ^
- STA FC_Select_Temp7 E) i4 c8 S% |; V
- RTS
0 c8 N3 F$ y, C; c- f - 8 d8 L3 D; O7 m4 l9 d; [- _; c
- ;==================================================' `5 @- Z3 e7 d" _1 e4 v
- ;开启功能A
, L- {, l1 o& H7 B% @ - Change_Function_To_On_A:4 E: s: q3 L+ t) Y
- JSR Set_Function_Temp_Index
1 Y0 v: K5 z% o9 B% l# S2 X1 e8 x - JSR Set_Function_Port
$ ~$ p5 k }8 x" h - LDX FC_Select_Index
5 R7 T% o8 ] Z1 A6 ]% X ~ - LDY #$006 @" U8 Y) T% U
- LDA (FC_Data_Port_A_L),Y' X" i, d" ^: R0 Y9 Z- }+ `! j& R
- ORA Function_Check,X
8 C( d) G! F N' d" z - STA (FC_Data_Port_A_L),Y g4 e+ m. H! B- J1 n: _$ {
- RTS
) T6 J' U! X% r7 z - ;----------------------------------------
9 ~1 c8 Z% H z: w% O/ h - ;开启功能B
, K/ q0 }7 Z! p* Y' z! t - .IF FC_IS_DOUBLE_PLAYERS
3 [, n# e5 I5 M ~% V$ m - Change_Function_To_On_B:3 ?2 z5 k9 y4 P# l+ D% x; E ]
- JSR Set_Function_Temp_Index
4 m$ M2 g4 H3 Z7 t; [! D - JSR Set_Function_Port
. M8 ?4 r3 Z. B; O) ]& y$ N* m - LDX FC_Select_Index
" `) T- S2 @6 T5 M J3 N6 w - LDY #$00) j4 m. y+ c f3 C% l- q
- LDA (FC_Data_Port_B_L),Y9 u4 l& J) K8 p$ j! R* k: m0 N
- ORA Function_Check,X
( r D+ Q2 m+ b$ Y& ]$ X - STA (FC_Data_Port_B_L),Y
6 _4 F+ z4 Q3 K - RTS) i& Z' J5 C# R
- .ENDIF0 v. c- d3 k1 w: k/ b
- ;----------------------------------------# t( M @8 `+ [$ E+ {7 @" `
- ;关闭功能A$ G) C* v8 ^+ H+ m$ U
- Change_Function_To_Off_A:
5 C6 u6 Q0 T' G( | - JSR Set_Function_Temp_Index4 `# _ _8 n! ]/ j {* v9 u8 @
- JSR Set_Function_Port
( t j0 a& e% k2 w6 r$ Q - LDX FC_Select_Index5 c8 T( F7 |, c
- LDY #$00
- x ~$ L3 `) e1 W9 ?" E - LDA Function_Check,X; t" C/ R/ H( R: C
- EOR #$FF/ Z4 ~/ l2 ?/ e4 O
- AND (FC_Data_Port_A_L),Y" R v) P' F7 q7 h- k. h. a
- STA (FC_Data_Port_A_L),Y: D. a7 P" c: M! c# f+ o
- RTS" \7 o2 S2 V; f' r( y! r8 r
- ;----------------------------------------
, F+ Z0 h/ h8 h4 A1 ]& d" H0 u - ;关闭功能B
# \6 d- S& N. \( R - .IF FC_IS_DOUBLE_PLAYERS- X* t) _: n$ m: r. k8 c( z
- Change_Function_To_Off_B:, C% \5 Z, n/ f2 _, Y1 j
- JSR Set_Function_Temp_Index4 ~7 C* A9 A3 N5 G$ B7 v5 D
- JSR Set_Function_Port
8 T. S& D( L' K. ? @6 T - LDX FC_Select_Index
* O7 \- j. n/ A U4 \! n% D* G0 L. O - LDY #$00
D. i- ?7 W' U) L, X' c - LDA Function_Check,X+ R9 t9 g6 h! A4 u
- EOR #$FF' h' H5 ~, @3 h! C) D6 e
- AND (FC_Data_Port_B_L),Y
1 T5 E. p, y/ s; E6 } - STA (FC_Data_Port_B_L),Y7 H" `1 X- @% c
- RTS- M' S7 t# b: r0 a! P a
- .ENDIF# {6 {, d3 i7 P6 r( i
- 0 w. M4 S0 `9 H, Z x
- ;==================================================9 t3 A; W' b& f8 e/ T* A! W5 w% f
- ;设置功能状态PPU地址( a% V9 B/ B' J% V
- Set_Function_Status_Addr:
' W, R# Z0 S0 A0 f. v: v J - LDX FC_PPU_Cursor
( X2 Q5 j0 a6 c9 y0 K9 O4 r" t8 T - LDA FC_Select_Temp
( M" S+ I# q0 u% L - ASL
) \# N" {' s% p! V/ h2 S - TAY
7 n4 |0 E; z( \: `3 x - INY& r) O9 d% k# q4 ^& Y0 m; V
- LDA Text_PPU_Addr,Y' q5 D) ?, U' p
- STA FC_PPU_Buffer,X
, S: N' z1 S! c8 Z8 M- J - INX
3 h, y5 d+ { R+ O - DEY
; E! P5 R% U/ ~) s! T, B" x1 x& f - LDA Text_PPU_Addr,Y
$ T" K0 {! J" R7 j8 S - CLC
2 @6 q8 N8 E4 ~* I3 u: v, b - ADC #FC_FUNCTION_OFFSET
% |. B! ]9 x7 y. l( A2 F1 q& p4 p - STA FC_PPU_Buffer,X
& h; S9 I a: [# [ - INX2 r7 z3 |$ n! e; d. e& t
- .IF FC_IS_DOUBLE_PLAYERS
, a' [1 N/ C# t% I5 [5 u3 s - LDA #$02
. g1 D5 i) G; O3 K# D - .ELSE6 v* @7 N* n9 \1 D( Z. \7 E
- LDA #$016 f2 F2 I. B& R+ Y- {( `
- .ENDIF r7 [; q5 _4 S2 `3 V9 h( X
- STA FC_PPU_Buffer,X% f& c8 t u- G2 ~; B/ T# O5 M
- INX
8 t8 ]: b- {! n+ G5 n - STX FC_PPU_Cursor
1 j6 W, e. @6 l- B - RTS
; ]! p# M+ C7 Z1 e+ M5 {2 v - - Y0 ^ B9 G+ x) ^
- ;==================================================; n# X. P! E! R, n
- ;获取当前选择索引/ r; G ^ \, K% } ~6 q
- Get_Select_Index:, K3 H2 T7 N, ]9 u
- LDA FC_Select_Temp
; [+ Y% c" K2 H. y- ~7 c4 V& Z5 v - CLC5 w |. t, G5 ?( a+ P
- ADC FC_Page_Cur
7 u9 S5 S& h- }& t6 t0 z+ `& g4 } - TAX6 Z8 _. p1 E* T& }% `, x; g
- RTS
& p! Y( ?5 S! P! F/ ? -
! z7 r- R( }+ d: S - ;==================================================
+ {5 n- |. x( r( V: x, | - ;清除状态文本( E$ v+ e0 P$ }4 n4 z
- Function_Status_Clean:
/ T% T9 P! X9 F2 f - LDA #FC_PPU_MODE_CNTC1 o$ U! ?5 j) U
- JSR Set_PPU_Mode
0 U: H+ Z3 U c, m5 O$ w7 M - JSR Set_Function_Status_Addr x' _6 D& X- k# W6 r$ `
- RTS1 y% _& z4 U% C2 s1 `
, H; S$ }9 }7 d- |0 O, p- ;==================================================
/ B+ ~' q1 L0 b2 u# j0 N - ;显示开关状态$ N# D$ n# V) A6 {1 [4 d/ i
- Function_Status_Show:
0 P/ }/ ~' l! v' I4 B; q - JSR Get_Select_Index6 o3 [& M& }' c) `( C8 j @
- CPX #FC_ITEM_SUM
" q% A d6 `: o! y# C - BEQ Function_Status_Show_Set( ]4 _1 _) ]* X" G) |- s) q, D
- BCS Function_Status_Show_End3 _' h3 h: F1 V/ |6 Z# \
- Function_Status_Show_Set:" y1 N. a3 ~; V9 k( R% |
- LDA #FC_PPU_MODE_CNTL
( `6 o% V% ?; `1 w. b9 Z0 | - JSR Set_PPU_Mode
d+ N0 \) i/ a" I5 {! i1 c - JSR Get_Select_Index8 j8 `( u* y$ C' C7 W- v; |" ?
- JSR Set_Function_Status_Addr
( E7 I& M: Q% Y+ c3 z* \; _ - JSR Set_Function_Port
4 u' L; r* [5 U - JSR Function_Status_Show_Check_A
2 [# [: E. q* o9 ?, D - .IF FC_IS_DOUBLE_PLAYERS
! J2 h5 E# G+ h - JSR Function_Status_Show_Check_B
9 Y: W$ R% ]8 h4 f* P" C+ f0 C - .ENDIF
6 J# Q4 ~8 Q' g( {+ R - Function_Status_Show_End:
7 m E0 M, n) ?7 I' \ - RTS1 }1 G3 D7 [. j
- ;----------------------------------------' n" e; F& [! e% A% R- {
- ;检查功能A状态
6 X4 e3 T" L! `. \5 ?: R - Function_Status_Show_Check_A:
* k1 |5 S1 Y# ?) f3 m- n - JSR Get_Select_Index
% ^" x( P1 c5 p. g3 B$ G - LDY #$009 H& p9 l6 {" v+ J. _0 T
- LDA (FC_Data_Port_A_L),Y
8 d2 V% u7 g2 A6 N" m: c: ` - AND Function_Check,X
4 a4 D4 |. m( i( s) {, e - BEQ Show_Function_Status_Off! I. K- x# B+ [% Z+ ^
- JSR Show_Function_Status_On
; {/ P2 r- T) C9 n( P' W$ a! ^ - RTS
, `% F9 e% R! _: p5 k I - ;----------------------------------------; j: Q: J/ Y0 D9 ]* L7 a
- ;检查功能B状态
8 c2 ] J8 q2 k8 R1 r/ Z - .IF FC_IS_DOUBLE_PLAYERS
, {# ]4 P2 b6 n4 B* c7 J% \- | - Function_Status_Show_Check_B:6 |0 X4 N6 \) }5 i Q0 c6 b2 V d
- JSR Get_Select_Index
" b' @4 T9 F+ x, C) t - LDY #$00
# N/ g+ J0 y8 w1 q9 V* m - LDA (FC_Data_Port_B_L),Y- m; ^7 I! x& V; u, M
- AND Function_Check,X
- D6 p" c7 \. K5 Z2 b: X% j' e$ j - BEQ Show_Function_Status_Off+ k0 U. t7 N c
- JSR Show_Function_Status_On7 T( o" T( t* C; r1 u% K
- RTS
) K( e8 b G, [# ?2 P, u' m - .ENDIF
0 ]* _4 U5 G. j# D -
& { [4 G6 t' f a4 ]6 ~" g6 ^3 ] - ;----------------------------------------, o# W$ m: D& ?; @# }: D J$ v
- ;显示功能开启状态
3 O$ u& G2 A3 {% m8 i$ E - Show_Function_Status_On:
$ s' y) F- H5 x' K/ s+ J5 M5 s) ^2 m - LDX FC_PPU_Cursor: Z0 T' t e2 K" p7 Z: W
- LDA #FC_ON_TILE# D! l, I5 \* n, v
- STA FC_PPU_Buffer,X
% R+ t1 O& @% P! ~2 T - INX
% x; f! D% T/ i; z4 z4 | - STX FC_PPU_Cursor6 j% D+ y+ p) I0 S9 x/ W' k
- RTS. R2 u$ g6 r$ e
- ;----------------------------------------) g" G1 j8 V c: T7 c- K4 {0 ?
- ;显示功能关闭状态
; h, m. ]( z. n8 n) Y; p" Q - Show_Function_Status_Off:
o* [5 @" O, r/ |7 |1 ^ - LDX FC_PPU_Cursor( s4 ~1 B# X- X3 p1 e
- LDA #FC_OFF_TILE" g# `& {' T- M
- STA FC_PPU_Buffer,X p3 f9 g4 V B* L) ~. v, [4 L8 D
- INX
9 t: i2 |' D4 r$ w - STX FC_PPU_Cursor5 z [' f4 T# Q
- RTS
2 B( j, W, D6 n% D8 S
. ?' T: t1 }4 Z6 @% v6 n) M9 Z6 m- , n0 B) c# m# i
- ;-------------------------------------------------------------
5 [! k4 R* A+ [' `: ]' @ - FC_Data_Copy: ;数据拷贝参数设置
5 g9 O V1 r6 R6 l7 u4 e - STX FC_Cpy_Port_L
4 F3 F8 G9 S' i( y. X - STY FC_Cpy_Port_H+ o# ]) F( k4 s. ~: y5 u# L+ k
- LDY #$00
0 N2 u8 l0 U6 F) ]# N& W - LDX #$06" Q+ A: F, R- `
- FC_Data_Copy_Addr_Set: ;从指定地址读入参数% {3 @* t8 `& ^* m' ?% t2 }5 |
- LDA (FC_Cpy_Port_L),Y
5 \6 ?/ G/ |5 L# _8 e) p - STA FC_Cpy_From_L,Y8 u! p1 Z8 M3 ~9 w, P1 s0 G
- INY
: v) ~; d% S$ H. T - DEX/ ^1 p% U, I& F8 ~' f/ R5 B5 j
- BNE FC_Data_Copy_Addr_Set) Q1 m, O9 E+ ~( Q: P6 e! n) ?. D
- LDA (FC_Cpy_Port_L),Y/ w1 ?, k3 }( e1 c- F/ d
- CLV
# a$ l: X; y9 `& _+ y, g - LDY #$009 w _9 ^( H0 i9 G$ `! |
- ;----------------------------------0 T. z2 S- L( _( }7 k+ }# V, a# F
- FC_Data_Copy_Mode: ;复制模式校验
, ?7 t6 f4 g8 Y - CMP #FC_MODE_RAM_TO_RAM; [1 J$ N7 d7 j3 ]
- BEQ FC_Ram_To_Ram_Mode- Z" P& i$ H4 S0 }* X D& C7 ^1 Q
- CMP #FC_MODE_RAM_TO_PPU
# N g+ T7 Y* ?% X - BEQ FC_Ram_To_Ppu_Mode9 K2 k' _ ~" X7 J/ d- L# l+ J
- CMP #FC_MODE_PPU_TO_RAM6 p$ f6 n$ e5 P2 y! [9 V
- BEQ FC_Ppu_To_Ram_Mode! l/ ?: F# b+ e% W. ^
- CMP #FC_MODE_PPU_CLEAR
e% t) h L1 U- R5 |; [" i2 `0 h7 K7 j7 a - BEQ FC_Ppu_Clear_Mode& V& y# v( o& n- f$ @, ^# s: t3 O
- RTS
$ a/ k; j" u6 S8 V - ;----------------------------------------. J/ i1 @3 l+ a) S4 R, G
- FC_Ram_To_Ram_Mode: ;复制RAM到RAM模式
9 D# h! C, g, a0 v - LDX FC_Cpy_Count_L
" |: ~: J7 ]0 u$ h. B @9 H - INX
7 `* G& Z( Z9 S; u6 O5 s0 x - FC_Ram_To_Ram_Count: ;剩余计数检查
% u2 y9 D9 E$ j- S3 q/ k) C8 p* g0 d - DEX) I; t! b) K# _2 U
- BNE FC_Ram_To_Ram_Copy4 r* c3 Q4 L* | k* R
- DEC FC_Cpy_Count_H% f- E& {, R$ r2 m* R
- BMI FC_Ram_To_Ram_Over. w* l( O) z% L9 m
- FC_Ram_To_Ram_Copy: ;开始复制数据. U* t# w, A0 n* U1 ]7 f2 `& \
- LDA (FC_Cpy_From_L),Y# W. W- ~. G3 n/ o/ r
- STA (FC_Cpy_To_L),Y& \( V1 ?8 Q v+ Z4 X
- FC_Ram_To_Ram_From_Set: ;源地址递增; l3 X+ i; Z- U+ S% z- e! Z( j
- INY+ x/ m$ @- s0 E2 L: s4 e
- BNE FC_Ram_To_Ram_Count
" r+ I2 {' p0 k; n- b1 v/ ~ - INC FC_Cpy_To_H
: q7 p1 x- ]& r6 `& ]2 s# A - INC FC_Cpy_From_H0 w6 Y+ h6 l1 z! q# G, r @
- BVC FC_Ram_To_Ram_Count- S1 H$ |+ k. m- I$ f
- FC_Ram_To_Ram_Over: ;结束数据复制: j% Z2 \: N& ? V+ S8 u* s
- RTS
7 o Q, h9 F; t& }0 s
" | d8 S- \; b: d, t6 ]& f- ;----------------------------------------
1 ^; x1 W1 F# C, Z/ F* G. [ - FC_Ram_To_Ppu_Mode: ;复制RAM到PPU模式
5 e6 b0 L4 D3 T* j/ K# N - LDA FC_Cpy_To_H
" b' @- ^; |) H+ u+ x - STA $2006
5 x% u+ l* W! T6 W! @% h" }8 u - LDA FC_Cpy_To_L5 T1 v/ H1 r! k3 _% t+ W) _( R
- STA $2006
. w- w. ^3 T) }3 B/ r - LDX FC_Cpy_Count_L5 e* F* n3 Q2 J. R( ?
- INX/ H) n O2 l) V- V
- FC_Ram_To_Ppu_Count: ;剩余计数检查
( ^! J4 ]* s' P7 r. @# v - DEX' J: c* |. }% K+ ?) U- X
- BNE FC_Ram_To_Ppu_Copy k, s" C+ x# w6 a8 P# G
- DEC FC_Cpy_Count_H
0 f x( n: C) m/ l6 h6 C - BMI FC_Ram_To_Ppu_Over
o i6 ^8 G: s2 G - FC_Ram_To_Ppu_Copy: ;开始复制数据3 A+ e7 s9 b F/ u/ }; b. y, [
- LDA (FC_Cpy_From_L),Y
" r$ D$ d2 s' a/ x - STA $2007
! y: u$ s- t/ r" ~' e - FC_Ram_To_Ppu_From_Set: ;源地址递增# O8 k0 W' s) [) v) F
- INY8 \% F# s. H/ z, r0 V4 C o- t
- BNE FC_Ram_To_Ppu_Count
o- b6 X# q$ {7 C1 I - INC FC_Cpy_From_H% t; }5 C/ j# A5 Z: q0 l
- BVC FC_Ram_To_Ppu_Count* N% K2 z. t# p$ t. j: l/ p% i7 G
- FC_Ram_To_Ppu_Over: ;结束数据复制
5 x/ y' F# h3 x; D7 H2 t6 V. h - RTS0 R0 ?% q R$ R. R& H" q' ?
- ) L/ v* S$ Q, W. c/ @" v1 T; x! x
- ;----------------------------------------2 v' J# c/ Y# C7 z$ N3 T
- FC_Ppu_To_Ram_Mode: ;复制PPU到RAM模式+ i- k* V! t# n4 K
- LDA FC_Cpy_From_H
- c& O7 o1 B! b% a8 Y' B" Y( T7 V - STA $2006) v' R5 Q' R( _7 [4 C
- LDA FC_Cpy_From_L& r K; x/ h+ z
- STA $20060 C/ [2 o& c1 p0 G, }
- LDA $20077 ^/ S2 A2 k) w. w" Q" {
- LDX FC_Cpy_Count_L5 p' V7 n8 b3 e" o* m9 O0 z* ^" ^
- INX1 Q- c' V8 ]+ ~; d/ s, |
- FC_Ppu_To_Ram_Count: ;剩余计数检查: @4 h* v/ v( I& V b/ r1 e( [
- DEX
( k+ I& W# y" b `" x5 h - BNE FC_Ppu_To_Ram_Copy7 |( P4 V& j* n8 L" B
- DEC FC_Cpy_Count_H
8 F& X6 m5 f) D* W5 D - BMI FC_Ppu_To_Ram_Over1 ~9 n7 v7 N" j7 T) }, [! |
- FC_Ppu_To_Ram_Copy: ;开始复制数据
% W! u) Z! ] d8 W - LDA $2007
' Q! m- Z, O' l+ m* r - STA (FC_Cpy_To_L),Y P& V! z& T/ w7 Q
- FC_Ppu_To_Ram_To_Set: ;目的地址递增
8 s7 F& T. C- o, f2 t - INY
* @# l: V8 |% U: D1 y1 A - BNE FC_Ppu_To_Ram_Count) K, u8 K. F; J0 ~
- INC FC_Cpy_To_H
" `9 T% W, _: O4 ]+ C( w8 m - BVC FC_Ppu_To_Ram_Count
3 S8 k1 S; W# }+ u* u - FC_Ppu_To_Ram_Over: ;结束数据复制
: m0 X. q0 b: U6 [* z - RTS
G- a4 n. C0 A: \1 [! |) l; C/ v
4 f; w- Y7 g3 @. C- ;---------------------------------------- E8 V b. s+ C3 ` ^
- FC_Ppu_Clear_Mode: ;清除PPU模式
+ ]- S. t5 R$ s1 Q* [- G0 z) Q - LDA FC_Cpy_To_H k, ~0 y# d% L7 y0 w
- STA $2006! a' C5 w, }$ j+ \) U0 ~
- LDA FC_Cpy_To_L! F' r- x7 D; r
- STA $2006 N; D& B2 E% R) l5 W. c5 ~
- LDX FC_Cpy_Count_H
, n7 q% S l: V* Z - LDY FC_Cpy_Count_L+ ]/ l2 X+ H. p' H, z
- LDA FC_Clear_Val x5 d/ G$ u% z' i" ?
- FC_Ppu_Clear_Count: ;剩余计数检查
+ X. d3 M" N4 V - BNE FC_Ppu_Clear_Copy c6 h1 O+ x( ]$ o
- DEX
6 |# J0 C y8 t6 i - BMI FC_Ppu_Clear_Over. J0 ]9 i5 x# i* Y
- FC_Ppu_Clear_Copy: ;开始清除PPU2 W) M5 D1 O' U% b
- STA $2007/ N; R' q9 I% U9 S! w$ z; g/ B1 S
- DEY
- x+ p4 Y( Y2 j, w1 } - BVC FC_Ppu_Clear_Count
; F/ O+ y2 v* j* B# ~& X - FC_Ppu_Clear_Over: ;结束数据复制- F8 U i/ q8 O0 u
- RTS8 ?2 b' f1 W/ D; j* q2 {9 e
- 3 L. O8 d9 |7 C/ ]
- ;==================================================
8 ?( R# d8 ` w4 x6 Y4 U - ;保存RAM数据
+ P' w7 [, G: W4 P0 `2 b M' |) { - Save_Ram:
& J+ c/ ]# k: `' a - LDX #<Save_Ram_Data9 W% S* \/ P: x: ~& u0 |
- LDY #>Save_Ram_Data9 m9 v2 B( ~& h8 O0 a& X
- JSR FC_Data_Copy
& @- ?& E2 N F" { - RTS
/ `" z7 Y3 ]% ?( L) q
: c. v3 l) f$ E4 y* R+ m3 Z- ;加载RAM数据
! P! \4 s D$ f( n' V - Load_Ram:
$ ~+ h9 A ]( T - LDX #<Load_Ram_Data
/ @. s! i& d. a* g - LDY #>Load_Ram_Data5 V( z6 P# O6 K/ u, s' m. b
- JSR FC_Data_Copy
4 r7 i- |4 \% q) G - RTS
1 M$ D' T/ @' i1 y- K) L2 }
: b/ v }% a* u- ;保存PPU数据
; U, a" ?) _& d* w. U* e - Save_Ppu:# @( B8 i2 b2 o6 [2 O. F
- LDX #<Save_PPU_Data, @3 M( w/ s9 t
- LDY #>Save_PPU_Data
; }$ ^* Z. V- t7 h2 J - JSR FC_Data_Copy
2 I" G6 |; Q8 i9 A# j - RTS
4 ^& E1 Z* s& g5 C7 R
9 Y* R( f$ |% b: a, o* K2 Q- ;加载PPU数据
4 q: E8 E: D% m( f) u7 t - Load_Ppu:
' y: k. |. F1 k5 m: Q4 I$ z - LDX #<Load_PPU_Data2 C1 ^, c: Z/ N6 E4 |3 c9 B
- LDY #>Load_PPU_Data+ x9 ^8 y" t( ^8 ~' f
- JSR FC_Data_Copy5 U6 U- ~5 s2 V# y: z
- RTS
' i& D" R% U$ H - / E( Q. {) ?$ k c9 n2 U! t
- ;清空PPU数据1 D6 A8 Y) n- ~
- Clear_Ppu:
- L2 f9 \; g j3 \ - LDX #<Cln_PPU_Data
x5 B4 y' |, ~ - LDY #>Cln_PPU_Data4 x0 c) p' c/ j
- JSR FC_Data_Copy/ b# g; d8 q2 `( f9 x& c* x
- RTS
- x$ g; s, K, s/ {0 e, ^1 E8 A
, L2 ~. H( R- B- ;==================================================
2 {* c* V" z' @) A4 c- m' d - ;数据配置
2 j4 I$ o4 w. K( {- ], O9 d2 n: |( @+ M - Save_Ram_Data:
5 P% m. c! ?6 c - .DB $00,$03,$00,$63,$00,$01,FC_MODE_RAM_TO_RAM
2 | H) Q0 @% k1 Y3 Q - Load_Ram_Data:! t0 T, a$ g1 _7 d2 F" x
- .DB $00,$63,$00,$03,$00,$01,FC_MODE_RAM_TO_RAM2 @4 r7 l. U8 X2 w' x
- Save_PPU_Data:- @9 u+ K7 ` E7 X, Y+ x% e ]
- .DB $00,$20,$00,$64,$00,$04,FC_MODE_PPU_TO_RAM/ w$ X' p6 r/ T3 L& Y
- Load_PPU_Data:* }( l) A- a$ ?! K% N2 A
- .DB $00,$64,$00,$20,$00,$04,FC_MODE_RAM_TO_PPU
# p7 y' l0 o8 A) U - Cln_PPU_Data:9 b! e6 R3 Y" h E
- .DB $00,$00,$00,$20,$00,$04,FC_MODE_PPU_CLEAR% t6 F. b. d; N2 J! ?1 T' E
- 7 x& [! M" a8 x: b' e
- 5 {0 H* I3 V8 o; d
- ;==================================================
2 g6 K: W. m7 _; S% X - ;文本数据PPU显示地址) c# d$ _5 {0 K9 I1 y: ?
- Text_PPU_Addr:1 }* i/ R/ n% B9 B$ ?0 d7 x) l
- .WORD $20C5
7 X) ]! z* m z$ n5 V- \ - .WORD $21052 M( ^, n: v W# j! _* g" ~
- .WORD $2145
4 ~2 Z2 M# T# c" k) A0 V - .WORD $21858 n: L* u L. E' n, q* i+ R. m
- .WORD $21C52 I+ x) e2 l& w$ n; q1 [/ k
- .WORD $2205
* w5 J2 A; ]! } T) E - .WORD $2245
' q6 Y3 m1 \$ a - .WORD $2285; t' E' ]# }+ g$ B2 Q
- .WORD $22C5& e" E) J; Z: \# U
- .WORD $23051 l& \& `& t0 w: @( e
- .WORD $2345
8 N9 R6 t' E# u7 G$ X$ k9 r- D8 ` - ) U! k3 e5 y: G* b( f6 y% q: t
- ;==================================================) D Y2 ^! `) p; c
- ;文本数据PPU数据地址1 Q& z! _ Q H: [+ Z5 q4 H
- Text_Data_Addr:
4 z* [5 Z7 y9 T5 D# B) P - .WORD Text_Data_01; S! Y3 X( u$ e0 s& I& v
- .WORD Text_Data_02: Y2 O" X' L! J5 o1 C4 q6 ]* n1 X
- .WORD Text_Data_03# c0 y+ W" i6 [9 ~3 N, F: V7 s
- .WORD Text_Data_04
5 t- A$ ~1 ^5 o7 C) O) ]! R - .WORD Text_Data_058 }: d8 t9 m7 O; i
- .WORD Text_Data_06
- E( R& ^7 v' n! X - .WORD Text_Data_071 @0 Z7 R/ N8 V. `3 r% A- m
- .WORD Text_Data_086 B" ^- _* a# p2 b& k! m
- .WORD Text_Data_09+ _7 h) P5 c: F$ R4 o# T" S
- .WORD Text_Data_100 A: k* `, l9 \# U
- .WORD Text_Data_114 Q( x' `. }( j6 [' N0 i; j
- .WORD Text_Data_12* K- _1 f% I0 Q& p. z
- .WORD Text_Data_13) m: j& B, A: l
- .WORD Text_Data_14
- E( B k( A6 F) p$ V' W# W - .WORD Text_Data_15
* v- t7 G1 g, m3 E x! j3 S' l% M - .WORD Text_Data_16- P+ O8 X( L. }2 F* e3 X
3 K P) d4 b% ?- ;==================================================
5 O0 Q5 b8 R% K" T4 j - ;文本数据
& W( L* d8 {- B5 [# P - Text_Data:
8 U8 u5 H9 S+ I$ H: f* w* S: N6 v p - Text_Data_01:
5 O0 @5 C0 y8 `; V' \ - .STR "01.INVINCIBLE"' Z: n- q7 r! W$ |1 n4 n* c3 I4 P
- Text_Data_02:
9 u/ O4 O- Q+ _$ O0 k* t - .STR "02.INVINCIBLE PLUS" `1 v2 Y- K C& S
- Text_Data_03:8 S! B% x y8 b c$ I
- .STR "03.LOCK LIFE"
7 o0 x: j- g: ?- _% Y. }/ y: M. Q# t - Text_Data_04:
& q% F: e8 X* [" C* Z - .STR "04.LOCK WEAPON"
8 q8 S, U, E; k1 I - Text_Data_05:
* c) [1 j1 [& g/ @* { - .STR "05.SEL CHANGE WEAPON"
$ M* L) ~; Y3 | [ - Text_Data_06:+ Y7 Q; P. _* {7 m
- .STR "06.UNLIMITED JUMP"# b! U y6 [6 S& H- D* i
- Text_Data_07:$ Z+ S) H/ x% W: [ D! M7 a
- .STR "07.MOVE FAST"2 N' }/ |0 n4 ]) ]- M' F
- Text_Data_08:
/ s4 l- H1 |8 i( Q& \+ s - .STR "08.SWAP SKIN"
" M1 r3 y" f5 B: ` - Text_Data_09:
- R2 ?9 w, K1 S - .STR "09.EQUAL BULLET"* P- }# z0 Z. d2 ?& D
- Text_Data_10:# b8 A$ m* g! w5 b$ ^
- .STR "10.STRONG BULLET") R" g# h+ X6 N3 y9 W
- Text_Data_11:; ]% f- K$ g M: p
- .STR "11.KILL BY ONCE"7 B$ m( L2 @* S
- Text_Data_12:
9 Y/ m9 F1 _ r5 m3 v - .STR "12.FULL SCREEN KILL"% v8 y4 @5 ]# z# O; x1 a$ c
- Text_Data_13:
! E* m% m) V) Z9 z - .STR "13.DOUBLE CONTROL"" T0 W' e" Q1 R6 M$ p
- Text_Data_14:
8 w* [# Z8 |0 K/ f# r - .STR "14.REMOVE E-GRID"
1 u- b* s5 Z" }5 Q# _( ~2 _ - Text_Data_15:, Z/ R4 g9 H f% Z& Z$ n
- .STR "15.FALL INVINCIBLE"
3 u+ w$ H7 Z' @ b/ L - Text_Data_16:6 { T: {- Z* r; q) W
- .STR "16.NEXT STAGE"2 E. W w! B! T1 x- a7 h
- # A0 d, T7 t& r; D- w
- ;==================================================
# R2 h5 R& p D4 `: U - ;功能开关检查地址
+ N9 }0 D9 l/ G! A( M( X/ ^ - Function_Addr_A:
& V# A" B5 t/ C- y7 f - .WORD $01C06 B* Z* r+ o$ p1 K
- .WORD $01C0
" f0 `+ g/ P. x6 E/ n - .WORD $01C0
8 V/ W! y6 o% A& J% {/ O - .WORD $01C0" |3 ^+ ?; j# x' w; o0 }1 i% Z# {
- .WORD $01C0 F l$ n L8 m: F% k
- .WORD $01C0' e; V" X( x1 H5 N' G
- .WORD $01C0, i/ l+ [- [& B( w$ ]7 _! u
- .WORD $01C0
3 c1 W. g2 a8 @3 d$ @2 f# W8 p; f - .WORD $01C4- |' u% u& u; r1 Y2 D; B
- .WORD $01C4 b* B }; T0 ?9 d8 T4 O1 P
- .WORD $01C4( [$ D1 p6 W- r
- .WORD $01C4
* R+ R' h- i( Z% J4 u - .WORD $01C4; n# C# ^- h; G7 ]- l6 E
- .WORD $01C4 P' u3 J' M+ N4 @. B, t
- .WORD $01C26 L( c: N3 [: O' B8 W" M6 G
- .WORD $01C4
8 k( M% y6 A: _( ` - ; z- g7 s! C$ f7 J- Z5 M
- ;功能开关检查地址
) P o+ M9 \2 h8 `+ L! s* q! t - Function_Addr_B:, Q) e- O! S& j z
- .WORD $01C1# u+ z# l; D) q- {! n7 M' b
- .WORD $01C15 b. e4 `! s: y+ e" a5 }
- .WORD $01C13 I4 M5 ?$ k# r- \/ Y) ^. t
- .WORD $01C1; ]8 k7 J$ i. U! d# _2 M" I* K
- .WORD $01C1
D1 }3 T4 P6 n! f - .WORD $01C1
* n) ^% i( ?4 K$ w% g. n - .WORD $01C11 N2 b- P: s; v6 V& d5 Y8 ]* ~! z
- .WORD $01C1( Z; d( A/ t0 I7 x; E! J
- .WORD $01C4
: o5 B: K, A+ q% r9 |; m - .WORD $01C4
" I* Z# a" f4 {5 B( H4 V - .WORD $01C42 f! K2 T: K2 P5 J
- .WORD $01C4
5 H6 F5 K, n" o& U - .WORD $01C46 I1 w+ u+ o+ P: X
- .WORD $01C4
. s4 f" S4 K- a1 @" Q0 W0 \ - .WORD $01C3
& R A* X0 \) x- D6 R; E - .WORD $01C4
9 z9 J' w4 A. ]7 `; p" [ -
$ s( R6 X0 ^! w/ J6 E) U: u - ;================================================== x' r8 t# w8 L, J4 o
- ;功能开关检查数据 w( b& f9 C+ Y' d3 ?
- Function_Check:
1 n6 V& f% n( s5 o - .DB $013 e9 k, l" N- H
- .DB $02
9 Y: h$ M1 }8 W7 h4 N3 ? - .DB $04
2 [2 [2 f/ V) k8 D- r - .DB $08) a+ K5 ?) p# J4 i; {: q
- .DB $10' G( f9 J8 m/ ?
- .DB $20
! p' V! Q9 x* m. Z - .DB $40
( h. I! B2 ]: U m0 K7 d5 E& d% l* v - .DB $80
2 I+ Q9 F" K# D8 W - .DB $017 o) y6 g9 ~: Z, y c
- .DB $02
' y* P' T( j0 J. a% h - .DB $04$ @6 `' ^ N9 Y+ \* V3 l; W
- .DB $08
# T7 `7 U6 _) S7 m# d2 V! J4 M - .DB $10
7 F1 z1 @" U3 p, m6 t/ e5 Z - .DB $203 a- B- F" s+ I) L1 q. S
- .DB $40
( u1 q+ O7 y2 K2 w& F" U - .DB $80
( Y3 h" s1 |; l. D8 X! f - ; R8 ]* @6 U, ]' u5 M0 S5 o
- Char_Rom:
3 D/ C" a# x* X6 A - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
N! u# M0 m, {3 M - .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$003 {! | m8 P6 x
- .DB $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$3B,$25,$00# [/ e7 l! ~1 m; O
- .DB $01,$02,$03,$04,$05,$06,$07,$08,$09,$0A,$00,$00,$00,$00,$00,$00
2 O7 t% Z7 ~/ {1 }- F - .DB $00,$0B,$0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19% c8 ]' @3 v7 s$ m) K3 Z( s
- .DB $1A,$1B,$1C,$1D,$1E,$1F,$20,$21,$22,$23,$24,$00,$00,$00,$00,$007 x* B) S, v9 U6 {4 u m
- 6 }4 n$ }# U8 e- y `$ {
-
9 q; k( W3 G: [7 _ -
复制代码 % Z. O( G }6 F
& C( N$ W( Z) s" H7 Q, o0 j
flamecyclone.ys168.com
{5 t" F( B! O. n! z: Bwww.nesbbs.com |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
评分
-
2
查看全部评分
-
|