Inferno #07
31 мая 2005

For Coderz - Программирование смены диска/дисковода на Скорпионе.

  Программирование смены диска/дисковода
 

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




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Scene - Бунтующий демосценер.
PC ASM - ассемблер для X86.
Проза - Моя любовь.

В этот день...   18 ноября