Из журнала Info Guide #7, Рязань, 06.2005 Программирование смены диска/дисковода Для того,чтобы прошивка Скорпиона могла выполнять вашу программу с жёсткого диска правильно (с возможностью менять образы на лету), нужно при смене диска исполнять не только #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