Можно ли сохранить любой символ PETSCII в строке оператора DATA в Commodore BASIC?

Я хотел бы сохранить некоторые двоичные данные в программе BASIC на Commodore 64 в виде операторов DATA. Чтобы сэкономить место, я бы предпочел хранить в виде строки, а не в виде последовательности чисел.

Можно ли сохранить любой символ от CHR$(0) до CHR$(255) в операторе DATA, или определенные символы невозможно представить таким образом? Каков полный список символов, которые не могут быть представлены в операторе DATA (если есть)?

Меня особенно интересуют CHR$(0), двойные кавычки ("), перевод строки и возврат каретки. Если их можно представить, то как?


person Laurence Gonsalves    schedule 02.02.2017    source источник
comment
Это возможно, но вам нужно будет написать HEX-редактор и в вашей строке изменить 2-символьные значения на их HEX-значения, например, пробел равен 20 в шестнадцатеричном формате и так далее. Это создаст вашу строку. Мне пришлось бы найти HEX-редактор на своем iPad, чтобы создать такую ​​строку, а затем поставить запятую после каждой пары чисел. С помощью некоторого тестирования я мог бы дать вам ваш ответ, или кто-то там мог бы создать вашу строковую инструкцию DATA быстрее. Тогда READ A$ и A=CHR$(VAL(A$)) могут это сделать. Я набрал следующее: ГОТОВО. PRINT CHR$(VAL(80)), и он напечатал P.   -  person George McGinn    schedule 10.03.2017
comment
@GeorgeMcGinn Вы предлагаете вместо этого хранить данные в шестнадцатеричном формате, используя два символа для каждого байта вместо одного? Я знаю, что могу это сделать, но это удваивает объем необходимого пространства.   -  person Laurence Gonsalves    schedule 14.03.2017
comment
Не совсем. Каждый символ состоит из двух шестнадцатеричных битов (вместо байтов). Если вы посмотрите на шестнадцатеричное значение ПРОБЕЛа, это будет x20. Проверьте мой ответ ниже, потому что, когда я даже ввожу x169, он печатает ©, один символ. Мой оператор данных ниже показывает, что происходит, когда вы используете шестнадцатеричный код в операторе DATA. C64 BASIC поддерживает только 255 значений. Таким образом, последние два в моем выражении DATA превышают 4000. Тем не менее они все равно дали вам один байт. В противном случае, если вы не храните данные в шестнадцатеричном формате (который преобразует их в символ, который они представляют), вам лучше сохранить строку чисел, так как другого способа сделать это нет.   -  person George McGinn    schedule 15.03.2017


Ответы (3)


Краткий ответ: Нет. И вы сказали, почему: символ двойной кавычки внутри строки генерирует ошибку: нет символов, экранирующих кавычки. Для каждого значения «Другое» вы могли бы вставить что-то в свои строки оператора DATA, а затем просто никогда больше не трогать эти строки с помощью редактора C64 BASIC, но двойные кавычки вас убьют.

Лучшее и самое быстрое решение, которое мне еще предстоит придумать, - это проклятие бедняка. Это работает следующим образом:

  1. Возьмите каждый двоичный байт. Разделите его на две шестнадцатеричные цифры (/16 и сохраните остаток для второй цифры).
  2. Для каждой шестнадцатеричной цифры возьмите двоичное значение и добавьте 48.
  3. Теперь у вас есть два символа в наборе (0,1,2,3,4,5,6,7,8,9,:,;,‹,=,>,?), которые представляют один байт.
  4. Эти два символа входят в строку оператора данных.

Обратный процесс, чтобы прочитать их и вытолкнуть их.

person Bo Zimmerman    schedule 25.08.2017
comment
Нулевой байт также является проблемой, потому что он имеет особое значение в токенизированной строке BASIC, а точнее в конце: он отмечает конец строки. - person BlackJack; 26.10.2017

Есть способ сделать это, вы можете POKE байт прямо в ОЗУ. Однако это немного далеко, и вам нужно знать, куда вы 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 нет понятия экранирования строки.

Я бы лично просто использовал цифры.

person Shaun Bebbers    schedule 09.05.2017

Я сохранил следующий оператор данных, каждый элемент в виде строки, в программе 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 вы либо должны использовать строку чисел, либо вам придется использовать шестнадцатеричные значения и сохранять фактические символы, как я сделал в своем исходном операторе C64 DATA.

Я не знаю точно, сколько места, по вашему мнению, вы собираетесь сэкономить, но в лучшем случае это будет минимально, поскольку C64 не может превысить CHR$ (255).

Однако на другом диалекте, который я использовал, SmartBASIC, я вышел за пределы CHR$(20480).

Надеюсь, это поможет.

person George McGinn    schedule 10.03.2017