4

我想将一些二进制数据作为DATA语句存储在 Commodore 64 上的 BASIC 程序中。为了节省空间,我更喜欢存储为字符串,而不是数字序列。

是否可以在语句中存储任何字符,从CHR$(0)through ,或者某些字符不可能以这种方式表示?不能在语句中表示的字符的完整列表(如果有的话)是什么?CHR$(255)DATADATA

我特别想知道CHR$(0)双引号(")、换行符和回车符。如果这些可以表示,如何表示?

4

3 回答 3

1

简短的回答:不。您说原因:字符串中的双引号字符会产生错误:没有引号转义字符。对于每个 Other 值,您可能能够将内容插入您的 DATA 语句字符串,然后再使用 C64 BASIC 编辑器不再触及这些行,但是双引号会杀死您。

我还没有想到的最好和最快的解决方案是穷人十六进制。它是这样工作的:

  1. 取每个二进制字节。将其分成两个十六进制数字(/16 并保留第二个数字的余数)。
  2. 对于每个十六进制数字,取二进制值并加上 48。
  3. 现在您在集合中有两个字符 (0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?) 代表一个字节。
  4. 这两个字符进入您的数据语句字符串。

反向阅读它们并将它们戳出来。

于 2017-08-25T07:23:13.757 回答
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" "," "," "," "," "

然后POKE在 2050 或 2051 年左右有一个你会认出的字符,然后列出它。如果您看到在双引号之间添加的字符,那么您就赢了。当然,之后您需要计算引号之间的每个位置。完成后,重新编号行号并继续编程。我不确定你如何POKE在双引号之间加上双引号,因为据我所知,在 Commodore BASIC 中没有转义字符串的概念。

我个人只是使​​用数字。

于 2017-05-09T09:54:21.467 回答
-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 方言,一种更现代且在过去几年中编写的方言,这是我输出 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)。

我希望这有帮助。

于 2017-03-10T21:48:48.137 回答