2017-02-02 13 views
3

Я хотел бы сохранить некоторые двоичные данные в программе BASIC на Commodore 64 как DATA операторов. Чтобы сэкономить место, я предпочитаю хранить как строку, а не как последовательность чисел.Возможно ли сохранить любой символ PETSCII в строке инструкции DATA в Commodore BASIC?

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

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

+0

Возможно, но вам нужно будет написать HEX-редактор, а в вашей строке изменить значения из 2 символов на их значение HEX, например пробел 20 в шестнадцатеричном формате и так далее. Это создаст вашу строку. Мне нужно было бы найти HEX-редактор на моем iPad, чтобы создать такую ​​строку, а затем поместить запятую после каждой пары чисел. При некоторых тестах я мог бы получить ваш ответ, или кто-то, возможно, сможет быстрее создать оператор своей строки DATA. Тогда это может сделать READ A $ и A = CHR $ (VAL (A $)). Я набрал следующее: ГОТОВ. PRINT CHR $ (VAL («80»)), и он напечатал P. –

+0

@GeorgeMcGinn. Вы предлагаете хранить данные как шестнадцатеричные вместо этого, используя два символа для каждого байта вместо одного? Я знаю, что могу это сделать, но он удваивает объем необходимого пространства. –

+0

Не совсем. Каждый символ состоит из двух шестнадцатеричных битов (вместо байтов). Если вы посмотрите на шестнадцатеричное значение SPACE, оно равно x20. Проверьте мой ответ ниже, поскольку, когда я даже помещаю x169, он печатает ©, один символ. В приведенном ниже описании данных показано, что происходит, когда вы используете hex в инструкции DATA. C64 BASIC принимает только 255 значений. Итак, последние два в моем заявлении DATA находятся за 4000. Однако они все равно дали вам один байт. В противном случае, если вы не храните данные в шестнадцатеричном формате (который преобразует его в символ, который он представляет), вам лучше хранить строку чисел, так как нет другого способа сделать это. –

ответ

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

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

0

Есть способ сделать это, вы можете 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 является началом основной зоны (если вы не переместили указатели), так что на догадке , можно было бы сделать это:

0 DATA" "," "," "," "," " 

Тогда POKE около 2050 или 2051 с характером, который вы бы признать, а затем перечисляют его. Если вы видите символ, добавленный между двойными кавычками, тогда вы выигрываете. Конечно, тогда вам нужно вычислить каждую позицию между кавычками после этого. Когда вы закончите, перенумеруйте номер своей строки и продолжайте программирование.Я не уверен, как бы вы делали двойную кавычку между двойной цитатой, поскольку, как я знаю, нет понятия побега строки в Commodore BASIC.

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

1

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

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

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

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

+0

Нулевой байт также является проблемой, поскольку он имеет особое значение в токенированной строке BASIC, а точнее в конце: он отмечает конец строки. – BlackJack