我想将一些二进制数据存储在Commodore 64上的BASIC程序中,作为DATA
语句。为了节省空间,我宁愿存储为字符串,而不是数字序列。
是否可以将CHR$(0)
到CHR$(255)
中的任何字符存储在DATA
语句中,或者某些字符无法以这种方式表示?什么是无法在DATA
语句中表示的完整字符列表(如果有)?
我特别想知道CHR$(0)
,双引号("
),换行符和回车符。如果可以表示这些,怎么做?
答案 0 :(得分:1)
简短回答:不。你说的原因是:字符串中的双引号字符会产生错误:没有引号转义字符。对于其他每个值,您可能可以将东西戳入DATA语句字符串,然后再使用C64 BASIC编辑器再次触摸这些行,但双引号会杀死您。
我还没有想到的最好,最快的解决方案就是穷人。它的工作原理如下:
反转过程以阅读它们并将它们戳出来。
答案 1 :(得分:0)
有一种方法可以做到这一点,你可以POKE
字节直接进入RAM。虽然这有点长的路要走,但你需要知道你在哪里{{}}字节。您可以在POKE
语句中否定对大量零的需求,例如:
DATA
我们知道2048是BASIC区域的开始(除非你已经移动了指针),所以猜测一下,可以做到这一点:
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
然后在{20}或2051年左右 0 DATA" "," "," "," "," "
使用您认出的字符然后将其列出。如果你看到双引号之间添加了字符,那么你就赢了。当然,那么你需要计算之后报价之间的每个位置。完成后,重新编号您的行号并继续编程。我不确定你是如何在双引号之间引用双引号的,因为据我所知,在Commodore BASIC中没有逃避字符串的概念。
我个人只是使用数字。
答案 2 :(得分:-1)
我已将以下数据语句(每个元素作为字符串)存储在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方言,在过去的几年中更加现代和写作,这是我对CHR $的输出为172到190:
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)。
我希望这会有所帮助。