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