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