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