我想将一些二进制数据以DATA
语句的形式存储在Commodore 64上。为了节省空间,我希望将其作为字符串而不是数字序列进行存储。
是否可以在DATA
语句中存储从CHR$(0)
到CHR$(255)
的任何字符?或者说,有些字符不能以这种方式表示吗?如果有,请提供完整的无法在DATA
语句中表示的字符列表。
我特别关注的是CHR$(0)
、双引号("
)、换行符和回车符。如果这些可以被表示,如何表示?
我想将一些二进制数据以DATA
语句的形式存储在Commodore 64上。为了节省空间,我希望将其作为字符串而不是数字序列进行存储。
是否可以在DATA
语句中存储从CHR$(0)
到CHR$(255)
的任何字符?或者说,有些字符不能以这种方式表示吗?如果有,请提供完整的无法在DATA
语句中表示的字符列表。
我特别关注的是CHR$(0)
、双引号("
)、换行符和回车符。如果这些可以被表示,如何表示?
有一种方法可以实现这个,你可以直接将字节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" "," "," "," "," "
然后使用一个你认识的字符在2050或2051周围POKE
然后列出它。如果你在双引号之间看到添加的字符,那么你就赢了。当然,然后你需要计算引号之间的每个位置。完成后,重新编号您的行号并继续编程。 我不确定如何在Commodore BASIC中逃逸字符串,因此不确定如何在两个双引号之间POKE
另一个双引号。
我个人只是用数字。
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)。
我希望这可以帮助到您。