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