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