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