PDA

Просмотр полной версии : Почему не стартует TR-DOS если только она и зашита в ПЗУ?



idc
11.03.2021, 17:49
В рамках "научного эксперимента" установил в ZX "Львов-48к" ПЗУ с прошитой TR-DOS 5.03 (вместо BASIC 48). Больше никакого железа не подключал (в этом суть эксперимента). Надеялся получить заставку TR-DOS, а по факту получил цветную мозаику после теста памяти:

https://youtu.be/muRY1sgi1ZA

Вопрос: ПОЧЕМУ?:) Ведь с точки зрения работы TR-DOS не знает, что кроме нее ничего больше нет в смысле ПЗУ.
Или это такая реакция на недоступный ВГ93?

SAM style
11.03.2021, 17:58
тр-дос вовсю использует части 48-го бейсика, так что один он работать не будет. соответственно, без механизма переключения этих пзу тоже.

goodboy
11.03.2021, 18:03
с точки зрения работы TR-DOS не знает, что кроме нее ничего больше нет в смысле ПЗУ.
ошибочное мнение. TRdos вызывает подпрограммы из основного ПЗУ

idc
11.03.2021, 18:47
А как она это делает? Т.е. как потом возвращается "в свое" ПЗУ? В стек адрес возврата кладет из "точки входа"? Надо будет посмотреть дизассемблер, спасибо за идею...

solegstar
11.03.2021, 20:57
А как она это делает?
как только вы делаете запрос в озу, то защелка трдос (почитайте про нее) тут же переключает пзу на бейсик 48. также проанализируйте как происходит переключение на пзу трдос, схему контроллера дисковода на дискретных элементах. ваши суждения в корне ошибочны.

goodboy
11.03.2021, 21:28
как только вы делаете запрос в озу
скорее выполнение кода за рамками диапазона

IanPo
12.03.2021, 10:50
Вход в TR-DOS из SOS начинается с прыжка на 15616. А Z80 начинает исполнение с 0 адреса (после ресета).
Если через меню, то заход в TRDOS все равно должен быть через окно адресов #3Dxx

goodboy
12.03.2021, 11:08
на многих контроллерах (для 48ой модели) можно было выставить тумблером запуск trdos сразу после подачи питания.

idc
12.03.2021, 18:25
как только вы делаете запрос в озу, то защелка трдос (почитайте про нее) тут же переключает пзу на бейсик 48.
Согласен, понимаю. Это если запрос в ОЗУ. Но если TR-DOS вызывает подпрограмму из ПЗУ 48К, то "в одну сторону" оно переключить защелку может сама, но вот обратно, когда подпрограмма ПЗУ 48К отработает и сделает RET - управление перейдет туда, куда укажет адрес, взятый из вершины стека. И если там не адрес из диапазона #3Dxx, то "некому будет переключать обратно защелку". Поэтому в TR-DOS мы уже не вернемся. Или я неправ?


также проанализируйте как происходит переключение на пзу трдос, схему контроллера дисковода на дискретных элементах. ваши суждения в корне ошибочны.
Я вполне осознаю их ошибочность :) Меня "академическая голая теория" интересует... сферическая TR-DOS, короче... :)

- - - Добавлено - - -


скорее выполнение кода за рамками диапазона

Это ответ на вопрос "как выйти из TR-DOS", отменить теневое ПЗУ. А меня волнует "как оно потом возвращается, когда отработала процедура из ПЗУ 48К?"

- - - Добавлено - - -


Вход в TR-DOS из SOS начинается с прыжка на 15616. А Z80 начинает исполнение с 0 адреса (после ресета).
Если через меню, то заход в TRDOS все равно должен быть через окно адресов #3Dxx

А вот с этим не очень согласен, глядя на дизассемблер TR-DOS. С адреса 0 там как раз полноценный полный запуск, с тестом RAM (который у меня проходит - см.видео)... т.е. высталение ША >=15616 <16384 - это способ переключить ПЗУ, но с адреса 15616, по цепочке JP, после 15665 имеем безусловный переход практически "в начало" - JP 569 - вход в TR-DOS

- - - Добавлено - - -


на многих контроллерах (для 48ой модели) можно было выставить тумблером запуск trdos сразу после подачи питания.

Именно так. И старт начинается с 0.

- - - Добавлено - - -

А вот, собтвенно, и ответ на вопрос "как они это делают" (из книги Федина Павла Юрьевича "ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ TR-DOS 5.04T (5.03) ДЛЯ ПРОФЕССИОНАЛОВ, А ТАКЖЕ ДЛЯ ТЕХ, КТО ХОЧЕТ ИМИ СТАТЬ.")



Адрес 32. Переход к подпрограмме вызова подпрограмм из ПЗУ бей-
сика. Адрес вызываемой подпрограммы поместите в двух байтах пос-
ле команды RST 32. Например:
RST 32
DEFW #0D6B

32 JP 12146
──────────────── ──────────────── ──────────────── ──────────────


Адрес 12146. Вызов подпрограмм из пзу бейсика. Адрес задайте в
двух байтах после CALL 12146:
CALL 12146
DEFW #0D6B

12146 LD (23810),HL;сохранение HL и DE
LD (23812),DE
POP HL ;снятие со стека адреса двух байтов с адресом подпрограммы
LD E,(HL) ;берем адрес подпрограммы
INC HL
LD D,(HL)
INC HL
PUSH HL ;помещение на стек адреса возврата в программу, вызвавшую 12146
LD HL,15663 ;помещение на стек адреса переключателя пзу на TR-DOS
PUSH HL
PUSH DE ;помещение на стек адреса вызываемой подпрограммы
LD HL,23746 ;помещение на стек адреса команды RET в озу
PUSH HL
LD HL,(23810);восстановление HL и DE
LD DE,(23812)
RET ;переход к команде RET в озу


Теперь все стало на свои места: когда TR-DOS вызывает ПЗУ 48К, перед вызовом она "подстилает себе соломы" в виде адреса возврата в стеке (15663), куда вернется, после того, как отработает процедура из ПЗУ 48К. А возврат к 15663 как раз и обеспечит обратное переключение защелки.

А теперь вопрос №2:
В уже упомянутой книге читаем:

Способы обращения к ПЗУ TR-DOS
ПЗУ TR-DOS является теневым, поэтому к нему нельзя обратиться
непосредственно при помощи CALL. Но для того, чтобы оно было
доступно для использования, существуют адреса, при переходе на
которые включается ПЗУ TR-DOS. В ПЗУ бейсика-48 в этих адресах
находится знакогенератор, следовательно обычно управление туда
никогда не передается. Внимание!!! В ПЗУ бейсика-128 в этих ад-
ресах находится программа, поэтому при включенном ПЗУ бейси-
ка-128 ПЗУ TR-DOS блокируется полностью. Ниже вы видите список
точек входа, переключающих ПЗУ.

При том, что в самой TR-DOS, если верить Ларченко и Родионову, есть даже отдельный блок "согласования синтаксиса" - мнемоник ключевых слов из 48К и посимвольных команд 128К.
http://zxpress.ru/chapters_images/trdosspec/trdosspec-83.png
Вопрос - так как же все-таки из Бейсика-128 попасть в TR-DOS? Где-то (https://zx-pk.ru/threads/8345-ustrojstvo-kontrollera-tr-dos.html) на форуме уже видел подобный вопрос, но там, кажется, так ни до чего не договорились...

goodboy
12.03.2021, 18:42
само понятие `бейсик128` довольно расплывчатое.
это скорее надстройка/редактор который передаёт полученный результат в 48ой бейсик.
исполнение строки "usr 15616" набранной в 128ом бейсике будет выполнено из 48ого

idc
12.03.2021, 19:28
И тогда "блок согласования синтаксиса" (а он вроде реально присутствует в коде, но внимательно еще не смотрел)-бесполезная штука? Т.е.всегда будут в TR-DOS прилетать токены 48-го?
Какая-то "мутная тема" с этим "Basic 128", и вправду... опять же, а если в ходе работы basic 128 дойдет в ПЗУ до 15616, железу ничего не останется, как вывалиться в TR-DOS. Вполне аппаратно заменив ПЗУ...

SAM style
12.03.2021, 19:47
Какая-то "мутная тема" с этим "Basic 128", и вправду... опять же, а если в ходе работы basic 128 дойдет в ПЗУ до 15616, железу ничего не останется, как вывалиться в TR-DOS. Вполне аппаратно заменив ПЗУ...А вот для этого как раз переключение пзу на трдос должно быть из 48-го бейсика - в проверке участвует сигнал ROM из регистра порта 7FFD

MetalliC
12.03.2021, 20:41
собственно по этой причине контроллеры версии 5.x и называются "BETA 128", т.к. совместимы со 128К моделями спектрумов, в отличие от предыдущих версий железа и софта (TR-DOSа) версий 4 и ниже.

idc
12.03.2021, 21:06
А можно уточнить, по какой "по этой"? Контроль сигнала ROM, подключающего 128ПЗУ?

Есть у меня "умная мысль", но пока негде попробовать... возможно, есть разница между непосредственной отработкой команды в редакторе 128, т.е.когда по буквам пишешь RANDOMIZE USR 15616 без номера строки и нажимаешь ENTER - и переключение произойдет, т.к.команда отработается через 48К, а другой вариант-это когда в редакторе 128 пишешь программу с номером строки: 10 RANDOMIZE USR 15616, ENTER, она записывается в память.
А потом пишешь RUN-то вот тут не произойдет переключения.

Если есть у кого-то возможность проверить такое на железе-сообщите результат.

Интересует 2 действия:

1.В редакторе 128 просто набрать (без номера строки)
2.В редакторе 128 набрать с номером строки, ввести, как программу, а потом запустить её RUN

goodboy
12.03.2021, 21:30
Есть у меня "умная мысль"
на самом деле она глупая.
usr addr выполняется из 48ого бейсика !!!
и неважно в каком виде это представлено.

idc
12.03.2021, 22:15
Ну ок, глупая-так глупая...:) Значит не зря в кавычках написал. Я эту мысль "притянул за уши" из статьи в Радиолюбителе 3/94 "Драйвер EPSON-совместимого принтера для ZX-SPECTRUM"
Там автор пишет о разнице обработчиков команд непосредстенного режима редактора и вызывающихся из программы-у него его реализация LLIST из редактора нормально печатает токены в виде слов, а из программы-печатаются коды токенов. Это вообще всё не про TR-DOS ни разу, но мысль навеяло...

idc
13.03.2021, 00:43
Вроде бы проясняется... термин BASIC 128 не очень удачный. Уместнее говорить, что пока выбрано ROM-0 запустить TR-DOS нельзя и это реализовано аппаратной дешифрацией с учетом 5-го разряда порта 0x7FFD. Когда именно выбрано ROM-0, а когда - ROM-1 - дело "очень тонкое"... и к интерператору языка программирования БЕЙСИК отношение напрямую не имеющее, хоть 128К, хоть 48К версии. В ROM-0 по адресам входа в TR-DOS находится, начиная с 0x3CFE, процедура разбора строки, введенной в редактор-128 на соответствие синтаксису. Т.е. если гипотетичски некоторый код попытается, не переключив страницу ПЗУ, обратиться к 15616 и далее-вызов TR-DOS действительно не произойдет, т.к. 5-й разряд порта не даст.
Другое дело, что обработка команд при работе интерпретатора БЕЙСИК сопряжена с переключениями страниц ПЗУ между ROM-0(там, откуда стартовали, где меню, 128К редактор и т.д.) и ROM-1(где немного изменённый традиционный 48К, который в основном команды и выполняет)
Таким образом в момент выполнения любой команды даже из редактора 128 фактически, на момент работы, выбирается ROM-1, а 5-й разряд порта (регистра) дает затенять ROM-1 на TR-DOS.
Для чего в самом коде TR-DOS обработка посимвольных команд и как они могут туда попасть-не очень пока понятно.

Посмотрел прошивку ROM-0 Pentagon, там где TR-DOS в главном меню. Реализовано так: по адресу 0x3C16 (15382) в ROM-0 (т.е.той же странице, где меню и откуда стартуем) хранится строка в виде токенов RANDOMIZE USR VAL "15616". Эта строка после выбора пункта меню "TR-DOS" передается на исполнение интерпретатору, вызывая переключение страниц ПЗУ и разрешение затенения ROM-1. Вот это и имелось в виду, когда говорилось, что из BASIC 128 невозможно вызвать TR-DOS...

goodboy
13.03.2021, 00:51
Для чего в самом коде TR-DOS обработка посимвольных команд и как они могут туда попасть-не очень пока понятно.
при наборе программы с вызовом из строки (в 128ом редакторе) после REM будут как раз символы, а не токены.

Kalantaj
13.03.2021, 05:49
при наборе программы с вызовом из строки (в 128ом редакторе) после REM будут как раз символы, а не токены. Я бы сказал что не совсем так. При вводе строки бейсик программы в 128к редакторе, в отличии от 48к редактора, причем неважно с номером она идет (для сохранения) или без номера (для непосредственного выполнения после нажатия Enter), ДО нажатия на ENTER вводимый текст никак не воспринимается как программа. Это обычный текст, который только при нажатии ENTER, перед сохранением или непосредственным выполнением будет "переведен" в программу, с проверкой синтаксиса и токенезированием. Текст идущий после команды REM останется в том виде, в котором он введён. Т.е. токенезации (преобразования текста в команду бейсика) происходить не будет. И команда бейсика LOAD будет храниться не одним байтом, а 5ю (с пробелом). Вот в ПЗУ trdos и предусмотрен этот момент- неважно в каком виде придет команда - в виде текста или в виде токена - она будет выполняться. Кстати в прошивке 5.04TM какой то косяк с выполнением нетокенезированных команд. Приходилось сохранять программу, загружать её в 48к и токенезировать все команды после REM и потом пересохранять, чтобы избежать "косяков". И да - проявляется это в том случае, если программы ещё и работают с RAM-диском 128к бейсика.
Причем неважно есть 128к в компе или только 48 - посимвольно команды работают так же как и набранные токеном. Напимер находясь в trdos поставьте точку, потом наберите по буквам RUN и удалив точку впереди RUN нажмите ENTER - отработает компнда как обычно.

goodboy
13.03.2021, 10:09
в прошивке 5.04TM какой то косяк с выполнением нетокенезированных команд. Приходилось сохранять программу, загружать её в 48к и токенезировать все команды после REM и потом пересохранять, чтобы избежать "косяков". И да - проявляется это в том случае, если программы ещё и работают с RAM-диском 128к бейсика.
я помнится (с 5.04) на ровном месте столкнулся с отказом работы примерно такого загрузчика
https://b.radikal.ru/b05/2103/f9/e96e8ac98f07.png (https://radikal.ru)
файлы на дискете
NAME0
NAME1
.....
NAME7

Kalantaj
13.03.2021, 11:48
я помнится (с 5.04) на ровном месте столкнулся с отказом работы примерно такого загрузчика
https://b.radikal.ru/b05/2103/f9/e96e8ac98f07.png (https://radikal.ru)
файлы на дискете
NAME0
NAME1
.....
NAME7

Разобрался почему так было?

idc
13.03.2021, 12:02
Напимер находясь в trdos поставьте точку, потом наберите по буквам RUN и удалив точку впереди RUN нажмите ENTER - отработает компнда как обычно.
Отдельное спасибо за наглядный пример!

idc
13.04.2021, 22:15
Разобрался почему так было?
Если я правильно понял, то STR$(A-16) было интерпретировано не как вызов функции STR$, а как собственно токен. Верно понимаю?
Хотя,как вариант, еще вычитал в примечании на стр.137 3-го издания "ZX Spectrum & TR-DOS для пользователей и программистов" Ларченко и Родионова: "...из-за этого в строках TR-DOS недопустимо применение имен переменных, совпадающих по написанию с ключевыми словами, используемыми в TR-DOS."
А здесь "А" как раз, возможно, такая переменная, т.к. есть *А выбор дисковода А...

Kalantaj
13.04.2021, 22:52
Если я правильно понял, то STR$(A-16) было интерпретировано не как вызов функции STR$, а как собственно токен. Верно понимаю?
Хотя,как вариант, еще вычитал в примечании на стр.137 3-го издания "ZX Spectrum & TR-DOS для пользователей и программистов" Ларченко и Родионова: "...из-за этого в строках TR-DOS недопустимо применение имен переменных, совпадающих по написанию с ключевыми словами, используемыми в TR-DOS."
А здесь "А" как раз, возможно, такая переменная, т.к. есть *А выбор дисковода А...

А я на 99% уверен что набирался текст в 128 бейсике и tr-dos версии 5.04ТМ Именно эта версия не дружит с командами tr-dos написанными не токенами а посимвольно в 128 бейсике
Да и вообще tr-dos формально должен без проблем работать как с командами записанными (хранящимися) после после randomize usr 15619: rem : в виде токенов так и в посимвольном виде. Но на практике, чтобы избежать возможных "косяков" в работе все команды обращения к TR-DOS набирать в 48к бейсике - так они сохранятся именно в виде токенов.

Black Cat / Era CG
14.04.2021, 18:43
Но на практике, чтобы избежать возможных "косяков" в работе все команды обращения к TR-DOS набирать в 48к бейсике - так они сохранятся именно в виде токенов.Можно пофиксить потом напрямую в хекс-редакторе. Работать должно.

Kalantaj
14.04.2021, 19:02
Можно. Я делал. Но проще вывалиться в 48к и там написать команды. Если в хекс редакторе править - пробелы в конце строки будут. Они то в принципе игнорируются досом, но лучше чтоб всё "правильно" было , я думаю.