Просмотр полной версии : Basic 128 & usr 15619
Alex Rider
15.01.2012, 19:51
Всем привет!
Столкнулся с интересной проблемой, может, на форуме пролетало, но не нашел. Может, кому пригодится.
Итак, дисковал я ленточную прогу, заточенную под 128К. Прока грузила бэйсиком с ленты блоки кодов и закидывала их на RAM-диск 128-го. Чтобы не испытывать проблем с синтаксисом операторов загрузки/записи на RAM-диск, решил переделать бэйсик-загрузчик в редакторе 128К. Заменил всякие LOAD "" CODE на RANDOMIZE USR 15619: REM: LOAD "NAME" CODE, разбил строки с операторами зарузки, сохранил, запустил, и... "C, Nonsense in BASIC"! Бэйсик после первой строки загрузки был испорчен.
Причина тут в том, что редактор BASIC 128 не токеризирует набранные по буквам ключевые слова после REM. А вот TR-DOS при исполнении токенизирует, но не меняет длину строки.
В общем, чтобы работал USR 15619, надо либо править строку в 2 приема (REM добавлять после ввода LOAD "NAME" CODE), либо делать это в BASIC 48.
Вопрос к гуру: если об этои где-то писалось, не подскажете, где можно почитать еще?
REM это коменты. так что 128 их не так использует - это нормально. найди 1 отличие между 128 и 48 бейсиком)))
Alex Rider
15.01.2012, 23:00
Да понятно, что это комменты. Мне интересно почему TR-DOS токенизирует набранные по буквам комманды, но не меняет длину строки.
null_device
15.01.2012, 23:27
Между прочим, набирать строку работы с tr-dos именно токенами, рекомендовали в книжке ".. для пользователей и программистов" - Ларченко-Родионова (правда, там это рекомендовали с иной целью).
Alex Rider
16.01.2012, 00:12
Быть может, есть резон поправить эту проблему в модифицированных прошивках TR-DOS? Правда, вариант токенизации с удалением набора символов и правкой длины строки может привести к другим проблемам. Так что, если уж править, было бы здорово заменять первую букву набранного токена на его код, а остальные - на пробел. Ну или вообще избавиться от токенизации.
null_device
16.01.2012, 00:53
было бы здорово заменять первую букву набранного токена на его код, а остальные - на пробел
Вообще-то, примерно так и происходит. Набрав в 128 бейсике программу, выполните все инструкции tr-dos и сохраните ее. Загрузитесь из 48 режима, посмотрите листинг - какие проблемы?!
Использование токенов, удобно тем, что не нужно "знать" как пишется та или иная команда (также не тратится лишнее время на набор и место в памяти). Логичнее не пользоваться таким "атавизмом", как 128 бейсик.
А изменение содержимого любого из ПЗУ может вызвать "несовместимость" ряда программ. Поэтому, мне не совсем понятна причина недовольства текущим положением вещей.
Alex Rider
16.01.2012, 01:24
Вообще-то, примерно так и происходит. Набрав в 128 бейсике программу, выполните все инструкции tr-dos и сохраните ее. Загрузитесь из 48 режима, посмотрите листинг - какие проблемы?!
Хоть в 128-м, хоть в 48-м одно и то же: токенизация операторов звгрузки после REM без исправления длин строк. Для инструкции LOAD "NAME" CODE 4-х буквенные слова LOAD и CODE, заменяются на односимвольные токены, строка укорачивается на 6 символов, но байты длины строки после ее номера не корректируется. Если посмотреть листинг, будет все, что угодно.
Использование токенов, удобно тем, что не нужно "знать" как пишется та или иная команда (также не тратится лишнее время на набор и место в памяти). Логичнее не пользоваться таким "атавизмом", как 128 бейсик.
Читаем сообщения внимательно - я дисковал программу, рассчитанную на 128-й бэйсик. В частности, использующую команды LOAD ! и SAVE !. Ясно, что в "прогрессивном" BASIC 48 строки с такими командами не введутся.
А изменение содержимого любого из ПЗУ может вызвать "несовместимость" ряда программ.
Я предлагал изменения не в канонические прошивки типа 5.03/5.04Т - их я и сам могу модифицировать и словить несовместимость. Изменения можно внести в уже модифицированные прошивки с поддержкой RAM-диска, фиксами известных багов и т.п., явно на 100% не совместимые с оригиналами.
я дисковал программу, рассчитанную на 128-й бэйсик. В частности, использующую команды LOAD ! и SAVE !
а можно подробней об этом. листинг например
null_device
16.01.2012, 06:29
байты длины строки после ее номера не корректируется
Так что мешает набрать строки tr-dos в 48 бейсике токенами?
в "прогрессивном" BASIC 48 строки с такими командами не введутся.
Опять же, что мешает набрать эти команды уже в 128 бейсике?
вспомнился ещё один баг который не позволяет сделать программу короче - это выполнение команды RUN (загрузка кодового блока и его старт с адреса загрузки). точнее один раз RUN можно выполнить, но корректного возврата в бейсик не получится.
Alex Rider
16.01.2012, 21:47
Да багов там попой кушать можно... Помню, книжка про дизассемблер на каждой странице пестрит словом "Ошибка!!!". В тему парсера, тоже моск съело как-то - если LOAD "NAME" CODE набрать с пробелом между " и CODE (тоже в 128-м бейсике, хотя, это можно и в 48-м набрать), то парсер не распознает команду - пробела быть не должно.
Alex Rider
22.01.2012, 14:54
а можно подробней об этом. листинг например
Сорри, не заметил пост сразу. Тебе листинг того, что дисковал, или можно изобретенный мной искусственно пример, демонстрирующий проблему? Я придумал прогу, которая показывает фокус с самомодифицирующимся на рантайме бэйсиком (при этом остающимся работоспособным), могу поделиться.
---------- Post added at 14:54 ---------- Previous post was at 14:50 ----------
Так что мешает набрать строки tr-dos в 48 бейсике токенами?
Опять же, что мешает набрать эти команды уже в 128 бейсике?
Собственно, уже ничего. Знал бы где падать, постелил бы солому. Надо было в 128-м сделать разбивку строк с кучей LOAD "NAME" CODE и LOAD! с SAVE!, а потом в 48-м ее "TRDOSифицировать" добавлением RANDOMIZE USR 15619:REM: с заменой набранных по буквам команд на токены.
Мне интересно почему TR-DOS токенизирует набранные по буквам команды, но не меняет длину строки.
совсем недавно делая вменяемый исходник TR-DOS я наткнулся на эту процедуру, которая делает "упаковку" бейсик строк. Сначала я не понял для чего оно вообще надо, т.к. 48-й бейсик сразу токенизирует текст и 128-й мне казалось тоже (т.к. я последнее время чаще работал с +3, а там не используется 15619:REM:, а после ввода текста программы без REM - всё прекрасно токенизируется. Так вот, сегодня попробовал набрать примерно то, что написано в самом начале темы и понял, к чему нужен этот "пакер". В 5.03/5.04t корректируется длина бейсик строки, я вводил строку 10 RANDOMIZE USR 15619: REM: cat - проблем не было, запустил - слово cat токенизировалось, команда выполнилась. Может это сработало лишь с одной строкой? Это первое, что хотел сказать. Второе - процедура опознания токена написана очень коряво. Зачем-то каждое слово прописано дважды, номера токенов хранятся отдельно. Переписал сегодня этот кусок. Стало компактнее, пока не проверял, но думаю будет работать.
---------- Post added at 15:01 ---------- Previous post was at 14:49 ----------
Сейчас проверил новую процедуру - работает. Список токенов стал короче в 2 раза
Alex Rider
06.11.2012, 18:28
10 RANDOMIZE USR 15619: REM: cat - проблем не было, запустил - слово cat токенизировалось, команда выполнилась.
Посмотри чему равна длина бейсик-строки 10 до токенизации и после. Несмотря на то, что твоя строка станет на 2 байта короче ("c" от "cat" заменится на токен "CAT", "a" и "t" удалятся), длина этой строки не изменится, останется равной 19 байт. Навскидку по памяти - после выполнения этого оператора любой GO TO на строку после этого оператора тут же покажет дулю.
Только что проверил - работает как нужно. Набрал следующую программку:
1 go to 30
10 randomize usr 15619:rem:cat
20 print
25 stop
30 goto 10
Сохранил ее сразу, CAT ещё посивольное, длина - 64 байта. Запустил, сохранил, длина - 62 байта. GOTO на строку работает. Длина строки откорректирована, проверил. tr-dos 5.03 в спектакуляторе которая. В 5.04T, как и писал выше - тот же самый код. Моя новая процедура тоже работает (я заменил процедуру распознавания токена, она стала занимать меньше и меньше требовать данных)
Alex Rider
06.11.2012, 23:38
Вот так вот воспроизводится.
Ясно, буду проверять код и избавляться от ошибки.
Alex Rider
07.11.2012, 12:36
Чтобы избавиться от этого фокуса, надо в токенизаторе посчитать на сколько байтов сократилась команда, и вычесть это число из байтов длины текущей исполняемой строки (взять из системных переменных номер и посчитать адрес, в SOS ROM есть процедура для этого дела). Если номер равен #FFFE, то можно не править длину - это непосредственная команда, а не строка программы. Если нужна помощь, обращайся.
---------- Post added at 12:36 ---------- Previous post was at 12:33 ----------
Кстати, насколько я помню (сейчас проверить не могу), в TR-DOS есть еще один забавный прикол - если в моей программе перед cat поставить пробел, cat не выполнится (или load "smth" code с пробелом перед code не выполнится). А все потому, что токенизатор должен пропускать незначащие символы (<= 32) при поиске первого символа токена после двоеточия. Если есть возможность, сделай такой фикс тоже.
Если нужна помощь, обращайся.
Там, в токенизаторе всё так и написано. Всё работает нормально. Я проверил. Твой пример не выдает ошибок. Про пропуск символов понял, сделаю. И парсер надо тоже менять. Во вложении пример, как было и как стало. На адреса не смотри, "как стало" это из тестового варианта. Полностью заменена процедура FindZXTalk и данные для неё.
В fzxt1 исправил (не заметил сначала что значение то беру в Б в итоге)
fzxt1: ld b,(hl) ;берем символ слова из нашей строки
res 5,b ;буква заглавная
ld a,(de) ;берем символ из таблицы
cp 0FFh ;end of talk list?
А у меня проблема с загрузкой массива с дискеты TR-DOS под BASIC48.
Записываю массив: RANDOMIZE USR 15619:REM:SAVE "names" DATA n$()
Загружаю так же: RANDOMIZE USR 15619:REM:LOAD "names" DATA n$() - на экране мусорок в верхней строчке, массив не загружен. Причем если загрузить массив в TR-DOS, а уже потом перейти в BASIC48 то все нормально. ЧЯДНТ?
Black Cat / Era CG
10.07.2017, 09:26
Не знаю. У меня все работает.
http://savepic.ru/14777209.png
И если RUN, затем GO TO 80
И если RUN, сброс, потом выполнить то же, что в строках 80-90. Все загружается, выводится. Эмуль это, правда.
Эмуль это, правда.
Вот и у меня эмуль us0.38.1. И в нем если после сброса попытаться загрузить массив из твоего примера, то на экран выводит "264??12345"(не увидел в хелпе как скриншот делать). Видимо дело в эмуле.
Видимо дело в эмуле.
возможно косяк в версии trdos, надо проверять/сравнивать
Black Cat / Era CG
11.07.2017, 11:03
не увидел в хелпе как скриншот делатьAlt-F8
Щас попробую в Анриле.
- - - Добавлено - - -
Ага. Словил.
Портятся системные переменные. Буфер редактирования попадает в область барсик-программы. Чето типа того. Почему? ХЗ.
http://savepic.ru/14863759.png
Ну и да. Variable not found.
- - - Добавлено - - -
В US - TR-DOS 5.04TM, в ZX-Mak'e (в нем глюка нет) - 5.04F.
- - - Добавлено - - -
А вот с 5.03 в том же Анриле - работает.
- - - Добавлено - - -
Забавно то, что сами ромы отличаются не так уж и сильно, но... где-то чето поломалось-таки.
А вот с 5.03 в том же Анриле - работает.
я просто вспомнил что сталкивался с похожими глюками,
только я грузил кодовые блоки типа "name"+str$ a CODE
Black Cat / Era CG
11.07.2017, 12:36
Ну в TR-DOS от TR - все норм, а вот в турбированной от С.С. (судя по содержимому рома) - уже косяк имеется. Возможно он и легко излечим, но загрузку/сохранение array юзает 2,5 (или меньше) серьезные программки, поэтому это никому никогда не было особо нужно.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot