我想将一些二进制数据作为DATA
语句存储在 Commodore 64 上的 BASIC 程序中。为了节省空间,我更喜欢存储为字符串,而不是数字序列。
是否可以在语句中存储任何字符,从CHR$(0)
through ,或者某些字符不可能以这种方式表示?不能在语句中表示的字符的完整列表(如果有的话)是什么?CHR$(255)
DATA
DATA
我特别想知道CHR$(0)
双引号("
)、换行符和回车符。如果这些可以表示,如何表示?
简短的回答:不。您说原因:字符串中的双引号字符会产生错误:没有引号转义字符。对于每个 Other 值,您可能能够将内容插入您的 DATA 语句字符串,然后再使用 C64 BASIC 编辑器不再触及这些行,但是双引号会杀死您。
我还没有想到的最好和最快的解决方案是穷人十六进制。它是这样工作的:
反向阅读它们并将它们戳出来。
有一种方法可以做到这一点,您可以将POKE
字节直接写入 RAM。不过,这有点远,您需要知道POKE
将字节发送到哪里。不过,您可以否定DATA
语句中需要大量零,如下所示:
0 FOR I=0 TO 7
1 READ A(I)
2 NEXT I
3 PRINT A(0), A(4)
63998 PRINT "FIN"
63999 DATA ,,,,4,,7,8
我们知道 2048 是 BASIC 区域的开始(除非您移动了指针),所以猜测一下,可以这样做:
0 DATA" "," "," "," "," "
然后POKE
在 2050 或 2051 年左右有一个你会认出的字符,然后列出它。如果您看到在双引号之间添加的字符,那么您就赢了。当然,之后您需要计算引号之间的每个位置。完成后,重新编号行号并继续编程。我不确定你如何POKE
在双引号之间加上双引号,因为据我所知,在 Commodore BASIC 中没有转义字符串的概念。
我个人只是使用数字。
我在 C64 程序中存储了以下数据语句,每个元素作为字符串。我选择了 CHR$(172) - CHR$(190) 和两个 CHR$(4000) 以上。
100 data "©","ª","«","¬"," ","®","¯","¶","¼","½","¾","™","ח","⦁"
我运行了以下代码:
10 FOR X=1 TO 14
20 READ A$
30 PRINT ASC(A$)
40 NEXT X
100 data "©","ª","«","¬"," ","®","¯","¶","¼","½","¾","™","ח","⦁"
结果好坏参半。我知道它不会识别高于 255 的任何东西。但是 CHR$(173) 打印为 32 代替:
RUN
169
170
171
172
32
174
175
182
188
189
190
?SYNTAX ERROR IN 100
READY.
我拒绝了这个程序,我的 DATA 语句现在看起来像这样:
100 DATA "©","ª","«","¬"," ","®","¯","¶","¼","½","¾",""","",""
使用另一种 BASIC 方言,一种更现代且在过去几年中编写的方言,这是我输出 172 到 190 的 CHR$:
The ASCII value of A is: 65
The ASCII value of A should be 65, like it is on a PC.
If it is not 65, then a conversion table must be loaded
and the results converted to match the PC so code
CHR$ VALUES
—————————————————
CHR$(169)=© CHR$(170)=ª CHR$(171)=« CHR$(172)=¬ CHR$(173)=
CHR$(174)=® CHR$(175)=¯ CHR$(176)=° CHR$(177)=± CHR$(178)=²
CHR$(179)=³ CHR$(180)=´ CHR$(181)=µ CHR$(182)=¶ CHR$(183)=·
CHR$(184)=¸ CHR$(185)=¹ CHR$(186)=º CHR$(187)=» CHR$(188)=¼
CHR$(189)=½ CHR$(190)=¾
对于 C64 BASIC,您要么必须使用数字字符串,要么必须使用 HEX 值并存储实际字符,就像我在原始 C64 DATA 语句中所做的那样。
我不知道你认为你会节省多少空间,但它充其量是最小的,因为 C64 不能超过 CHR$(255)。
但是,我使用的另一种方言 SmartBASIC 超过了 CHR$(20480)。
我希望这有帮助。