Программирование смены диска/дисковода
Для того,чтобы прошивка Скорпиона могла
выполнять вашу программу с жёсткого диска
правильно (с возможностью менять образы на
лету), нужно при смене диска исполнять не
только #3d13 C=#1 (выбор дисковода), но и
потом #3d13 C=#18 (настройка на дискету).
Однако последняя функция открывает проме─
жуточный буфер длиной 257 байт для чтения
служебного сектора дискеты,т.е. нужно сле─
дить за распределением памяти. Переделать
ACE,ZXRar и ZXUnRar удалось только прошлой
осенью,при помощи Amonik'a (Николая Амосо─
ва).
Привожу фрагмент диалога,когда мы обсу─
ждали вопрос:почему после тупого (т.е.идём
напролом, больше ничего в программа не
меняем) добавления "LD C,#18: CALL #3d13"
ZXRar не работает?
Сначала догадка была неправильная...
AmoNik>
После петляния по процедурке в конце
концов набредаем на такой кусочек, который
проверяет возможность выделения буфера:
#19FD RST #32
DEFW #1F05
RET
Это обращение к ПЗУ Бейсик. Осуществля─
ется переход на адрес #1F05.
В ПЗУ Бейсика по этому адресу находится
процедурка проверки:
#1F05 LD HL,(#5C65) адрес вершины стека
калькулятора
ADD HL,BC в BC длина буфера:
257 байт #101
JR C,#1F15 если вылезли за ПЗУ
EX DE,HL
LD HL,#0050 не знаю, зачем ещё
80 байт требуется
ADD HL,DE
но в результате HL=SP!!!
──────────────────────────────────────────
Alone Coder>
Наверно,случайно совпало!Там как раз не
хватало одного байта, как я выяснил после
кучи опытов по методу дихотомии. Но одного
- это при записи файла целиком. При записи
по частям стек ниже, и не хватало очень
много байт...
──────────────────────────────────────────
JR C,#1F15
SBC HL,SP Получили 0
RET C и не вышли из процедурки
#1F15 LD L,3 Сообщение Out of memory
JP #55
#0055 LD (IY),L Код ошибки
LD SP,(#5C3D)
JP #16C5
#16C5 LD HL,(#5C63) адрес начала стека
калькулятора
LD (#5C65),HL адрес вершины стека
калькулятора
PUSH HL
LD HL,#5C92
LD (#5C68),HL адрес памяти,
используемой калькулятором
POP HL
RET ушли в TR-DOS
В общем,исправить глюк мне удалось,при─
нудительно занеся в #5C65 то же, что и в
#5C63.
Alone Coder>
Так ты убьёшь инфу о длинах файлов пос─
ле 64-го помеченного при первой же смене
диска.На #5c63 IMHO вообще можно наплевать
(калькулятор нам не нужен).
Amonik>
Разберись, пожалуйста,почему у тебя ад─
рес вершины стека калькулятора сдвигается.
Alone Coder>
Чтобы при удалении файла (#12) не уби─
вался конец буфера длин файлов ( 512 байт
с адреса #5d3b )
И вот, наконец, ошибка найдена:
Alone Coder>
В итоге я сделал так:ещё больше сдвинул
SP вверх,на минимум,ниже которого начинаю─
тся глюки; #5c65 опустил на пару байт - на
минимум,ниже которого начинается запарыва─
ние; потом подумал и поднял SP ещё на 16
байт для глючных досов (мало ли что там).
IMHO народ в других прогах ВООБЩЕ не
проверяет, сколько памяти осталось между
STKEND и SP. А видимо, надо, и даже очень.
AmoNik предложил и альтернативный
способ переключения дисков:
AmoNik>
Мне стало интересно,почему же тр-дос не
работает с диском без инициализации. Срав─
нил переменные тр-дос до и после инициали─
зации дисковода и выяснил,что за это отве─
чает "Режим работы дисковода".
До инициализации После иниц-и B: и C:
#5CC8 #83 #83
#5CC9 #82 #83 !
#5CCA #00 #03 !
#5CCB #00 #00
Здесь дисковод A - виртуальный, B - ре─
альный, C, D - виртуальные.
Пояснение: с диска A я загрузился, поэ─
тому он уже проинициализирован.Обращался к
дискете B и к диску C. Hа скорпе предпола─
гается, что максимум может быть только два
дисковода, а диски C и D могут быть только
виртуальные. Отсюда, наверно,такая разница
в значениях после инициализации.
Таким образом, если принять, что у всех
дисководы двухсторонние восьмидесятидоро─
жечные,то можно перед переключением диско─
вода вручную вносить в соответствующую
ячейку #83 и обходиться без функции #18.
Если я поменяю виртуальный диск,а прог─
рамма обратится к нему без #1, #18, то те─
невик продолжит работать с диском, который
был подключён до этого. Hа реальном диске
вообще затык после чтения нулевой дорожки,
так как #82 означает использовать дисковод
на 80 дорожек как дисковод на 40 дорожек,
т.е. через дорожку перепрыгивает и уже не
находит нужный номер трека.Hачинает гонять
голову в начало диска и обратно.
Alone Coder>
При смене вирт. дискеты в ячейку снова
записывается #82? или #00?
AmoNik>
После смены виртуальной дискеты значе─
ние ячеек не изменяется, т. е. что было до
переключения диска,то и осталось.Если диск
перед этим уже инициализировался, то будет
#03 для драйвов C и D.
Alone Coder>
Так инициализация ещё должна прописать
какой-нибудь переменной адрес образа на
диске (странно, что менюшка выбора образа
этого не делает). Даже не верю,что #83 по─
может от глюков при смене...
Лучше вообще не трогать эти ячейки. Я
их больше не трогаю.В некоторых программах
только заношу тип в дисководы A,B (надо бы
только в B, ведь у тебя A слишком часто
виртуальный). Не вносить - ругаются поль─
зователи TR-DOS5.03/5.04em(не T) / 6.08(не
6.05) - эти несчастные ещё есть! Альтерна─
тива - #3d13 #1, потом #18.
P.S.: Оказалось,что при выполнении опе─
раций #3d13 недопустимо, чтобы ERR_SP был
равен #AAxx! А ещё #0a #3d13 портит коман─
дную строку...
A. Coder