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