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