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