【问题标题】:Is it possible to store any PETSCII character in a DATA statement string in Commodore BASIC?是否可以在 Commodore BASIC 的 DATA 语句字符串中存储任何 PETSCII 字符?
【发布时间】:2017-06-19 23:20:59
【问题描述】:

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

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

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

【问题讨论】:

  • 这是可能的,但是您需要编写一个 HEX 编辑器,并在您的字符串中将 2 个字符的值更改为它们的 HEX 值,例如一个空格是 20 十六进制,等等。这将创建您的字符串。我必须在我的 iPad 上找到一个 HEX 编辑器来创建这样一个字符串,然后在每对数字后加上一个逗号。通过一些测试,我可以得到你的答案,或者有人可以更快地创建你的字符串 DATA 语句。然后 READ A$ 和 A=CHR$(VAL(A$)) 可能会这样做。我输入了以下内容:READY。 PRINT CHR$(VAL("80")),它打印了一个 P。
  • @GeorgeMcGinn 您是否建议将数据存储为十六进制,每个字节使用两个字符而不是一个字符?我知道我可以做到这一点,但它需要的空间量会增加一倍。
  • 并非如此。每个字符由两个十六进制位(而不是字节)组成。如果您查看 SPACE 的十六进制值,它是 x20。在下面检查我的答案,因为当我输入 x169 时,它会打印 ©,一个字符。下面的数据语句显示了在 DATA 语句中使用十六进制时会发生什么。 C64 BASIC 只能达到 255 个值。因此,我的 DATA 语句中的最后两个已超过 4000。但它们仍然给了您一个字节。否则,如果您不以十六进制存储数据(将其转换为它所代表的符号),则最好存储一串数字,因为没有其他方法可以做到这一点。

标签: basic c64 commodore


【解决方案1】:

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

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

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

逆向读取它们并将它们戳出来。

【讨论】:

  • 零字节也是一个问题,因为它在标记化的 BASIC 行中具有特殊含义,或者更确切地说在末尾:它标志着行的结尾。
【解决方案2】:

有一种方法可以做到这一点,您可以将POKE 字节直接写入RAM。不过,这还有很长的路要走,你需要知道你在哪里 POKEing 字节。不过,您可以在 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 中没有转义字符串的概念。

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

【讨论】:

    【解决方案3】:

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

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-24
      • 2021-07-25
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 1970-01-01
      相关资源
      最近更新 更多