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

时间:2017-02-02 18:35:06

标签: basic c64 commodore

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

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

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

3 个答案:

答案 0 :(得分:1)

简短回答:不。你说的原因是:字符串中的双引号字符会产生错误:没有引号转义字符。对于其他每个值,您可能可以将东西戳入DATA语句字符串,然后再使用C64 BASIC编辑器再次触摸这些行,但双引号会杀死您。

我还没有想到的最好,最快的解决方案就是穷人。它的工作原理如下:

  1. 取每个二进制字节。将它分成两个十六进制数字(/ 16并保留第二个数字的余数)。
  2. 对于每个十六进制数字,取二进制值并添加48.
  3. 现在你在集合中有两个字符(0,1,2,3,4,6,6,7,8,9,:,;,<,=,>,?)代表一个字节
  4. 这两个字符会进入您的数据语句字符串。
  5. 反转过程以阅读它们并将它们戳出来。

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

我希望这会有所帮助。