在Commodore BASIC中,是否有可能将任何PETSCII字符存储在DATA语句字符串中?

4

我想将一些二进制数据以DATA语句的形式存储在Commodore 64上。为了节省空间,我希望将其作为字符串而不是数字序列进行存储。

是否可以在DATA语句中存储从CHR$(0)CHR$(255)的任何字符?或者说,有些字符不能以这种方式表示吗?如果有,请提供完整的无法在DATA语句中表示的字符列表。

我特别关注的是CHR$(0)、双引号(")、换行符和回车符。如果这些可以被表示,如何表示?


可以实现,但您需要编写一个十六进制编辑器,并在字符串中将2个字符值更改为它们的十六进制值,例如空格在十六进制中是20,依此类推。这将创建您的字符串。我需要在我的iPad上找到一个十六进制编辑器来创建这样的字符串,然后在每对数字后面加上逗号。通过一些测试,我可以为您提供答案,或者可能有人能够更快地创建您的字符串DATA语句。然后使用READ A$和A=CHR$(VAL(A$))即可完成。我输入了以下内容:READY. PRINT CHR$(VAL("80")),它打印出了一个P。 - George McGinn
@GeorgeMcGinn 你是建议将数据以十六进制存储,每个字节使用两个字符而不是一个吗?我知道我可以这样做,但需要的空间量会增加一倍。 - Laurence Gonsalves
不完全是这样。每个字符由两个十六进制位组成(而不是字节)。如果您查看空格的十六进制值,它是x20。请查看我的下面的答案,即使我输入x169,它也会打印©,一个单独的字符。我的数据语句显示了在使用十六进制时发生的情况。C64 BASIC仅到255个值。因此,我DATA语句中的最后两个超过了4000。但它们仍然只给了你一个字节。否则,如果您不将数据存储为十六进制(这将将其转换为表示的符号),则最好将数字字符串存储为没有其他方法可以完成此操作。 - George McGinn
3个回答

1
简短回答:不行。你说的原因是字符串中的双引号字符会生成错误:没有引号转义字符。对于其他每个值,您可能可以将内容插入DATA语句字符串中,然后再也不用使用C64 BASIC编辑器触碰这些行,但双引号会使您失败。
我想到的最好和最快的解决方案是穷人十六进制。它的工作原理如下:
1.取每个二进制字节。将其分成两个十六进制数字(/16并保留第二个数字的余数)。
2.对于每个十六进制数字,取其二进制值并加上48。
3.现在,您有了一组字符(0,1,2,3,4,5,6,7,8,9,:,;,<,=,>,?)来表示一个字节。
4.这两个字符放入您的数据声明字符串中。
反转该过程以读取并poke它们。

零字节也是一个问题,因为在标记化的BASIC行中它具有特殊含义,或者更确切地说,在行末:它标志着该行的结束。 - BlackJack

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另一个双引号。

我个人只是用数字。


-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)。

我希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接