10 A = 10 20 IF A > 5THENPRINT"BIG" ; 输出: BIG 30 IF A = 5THENPRINT"FIVE" ; 不成立, 跳过 40 IF A < 20THEN60 ; 成立 → 跳到行60 50 PRINT"SKIPPED" 60 PRINT"DONE" ; 输出: DONE 70 END
字符串也能比较(按字典序):
1 2
10 N$ = "APPLE" 20 IF N$ = "APPLE"THENPRINT"MATCH"
注:AND/OR/NOT 逻辑连接符当前版本未实现(规划中)。复合条件可用嵌套 IF 代替:
1
10 IF A > 5THENIF A < 10THENPRINT"IN RANGE"
4.3 ★ IF 结构的 6502 汇编实现
BASIC 程序:
1 2
10 IF A > 5THENPRINT"BIG" 20 PRINT"DONE"
6502 汇编(条件跳转 = 比较指令 + 分支指令):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
; --- 行10: IF A > 5 THEN PRINT "BIG" --- lda VAR_A ; ① 取变量A的值到累加器 (零页寻址) cmp #6 ; ② A - 6, 只设标志不存结果 (A>5 等价于 A>=6) bcc @line20 ; ③ 进位C=0 说明 A<6 → 条件假, 跳过THEN部分
10 DIM A(5) ; 声明数组 A, 下标 0~5 20 FOR I = 1TO5 30 A(I) = I * 10 ; 写数组元素 40 NEXT I 50 PRINT A(3) ; 读数组元素 → 30
7.2 数组求和示例
1 2 3 4 5 6 7
10 DIM S(4) 20 S(1) = 95: S(2) = 88: S(3) = 76: S(4) = 92 30 T = 0 40 FOR I = 1TO4 50 T = T + S(I) 60 NEXT I 70 PRINT"AVG ="; T / 4 ; 87.75
7.3 对应的 6502 汇编
数组的本质是连续内存 + 下标计算,6502 用变址寻址直接支持:
1 2
A(I) = I * 10 ; 写数组 X = A(3) ; 读数组
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
; --- 写: A(I) = I * 10 (8位元素版) --- lda VAR_I ; A = 下标I的值 (零页寻址取变量) asl ; A 左移 = I×2 sta tmp1 ; tmp1 = I×2 (暂存, 后面还要用) asl ; A 左移 = I×4 asl ; A 左移 = I×8 clc; 清进位 (加法前必做) adc tmp1 ; A = I×8 + I×2 = I×10 (乘10 = ×8+×2 分解) ldx VAR_I ; X = 下标 I (变址寄存器装下标) sta ARRAY,X; 内存[ARRAY+I] = A ← 变址寻址一步到位!
; --- 读: X = A(3) --- ldx #$03 ; X = 下标 3 (立即寻址) lda ARRAY,X; A = 内存[ARRAY+3] = A[3] (变址读) sta VAR_X ; 变量X = A[3] (存结果)
关键指令sta ARRAY,X(绝对变址寻址):有效地址 = 数组基址 + X 寄存器。CPU 硬件完成”基址+下标”的加法,这正是数组下标访问的汇编本质。
NES 版数组设计:数组区放在变量表之后,元素为 16 位整数(2 字节),访问时下标 ×2 后变址:
1 2 3 4 5 6 7 8
; 16 位数组: A(I) 的地址 = ARRAY_BASE + I*2 lda VAR_I ; A = 下标 I asl ; A 左移 = I×2 (16位元素占2字节) tax ; X = I×2 (下标换算成字节偏移) lda ARRAY_BASE,X; A = A[I]的低字节 (基址+偏移) sta tmp1 ; tmp1 = 低字节 (暂存) lda ARRAY_BASE+1,X; A = A[I]的高字节 (基址+1+偏移) sta tmp2 ; tmp2 = 高字节 (16位值凑齐)
8. 完整示例程序
综合运用本教程所有特性(可在 JS 版直接运行):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
10 CLS 20 PRINT"=== FBASIC DEMO ===" 30 LET A = 10 40 PRINT"A ="; A 50 FOR I = 1TO5 60 PRINT"I="; I; " A+I="; A + I 70 NEXT I 80 IF A > 5THENPRINT"A IS BIG" 90 IF A < 5THENPRINT"A IS SMALL" 100 GOSUB500 110 N$ = "FAMILY" 120 PRINT"LEN("; N$; ") ="; LEN(N$) 130 PRINT"LEFT$ ="; LEFT$(N$, 3) 140 PRINT"DONE" 150 END 500 PRINT"--- SUBROUTINE ---" 510 RETURN
输出:
1 2 3 4 5 6 7 8 9 10 11 12
=== FBASIC DEMO === A = 10 I=1 A+I=11 I=2 A+I=12 I=3 A+I=13 I=4 A+I=14 I=5 A+I=15 A IS BIG --- SUBROUTINE --- LEN(FAMILY) = 6 LEFT$ = FAM DONE