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