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