City #17
06 июля 1999

Ликбез - полное описание и дизассемблер ПЗУ (часть 12).

---------------------------------------------------
                     ЛИКБЕЗ
---------------------------------------------------

(c) П.Ю.Федин

╔═════════════════════════════════════════════════╗
║                                                 ║
║    ПОЛHОЕ ОПИСАHИЕ + ПОЛHЫЙ ДИЗАССЕМБЛЕP ПЗУ    ║
║                                                 ║
║              TR-DOS 5.04T (5.03)                ║
║                                                 ║
║              ДЛЯ ПРОФЕССИОНАЛОВ,                ║
║                                                 ║
║               А ТАКЖЕ ДЛЯ ТЕХ,                  ║
║                                                 ║
║             КТО ХОЧЕТ ИМИ СТАТЬ.                ║
║                                                 ║    
╚═════════════════════════════════════════════════╝

                    пpодолжение

Адрес 688.  Перенос  трех  байтов  из адреса  HL по
адресу DE.
688   LD B,3   ;количество байтов
690   LD A,(HL);перенос байта
      LD (DE),A
      INC HL   ;адреса следующих байтов
      INC DE
      DJNZ 690 ;повтор до конца
      RET      ;возврат
───────────────────────────────────────────────────
Адрес 697.  Остановка дисковода. В A поместите зна-
чение системного регистра.
697   LD B,32    ;32 повтора
699   PUSH BC    ;сохранение количества повторов
      XOR 8      ;переключение бита 3
      OUT (255),A;загрузка системного регистра
      PUSH AF    ;сохранение   значения  системного
                  регистра
      LD A,5     ;задержка в 17962 такта
      CALL 15871
      POP AF     ;восстановление значения системно-
                  го регистра
      POP BC     ;и количества повторов
      DJNZ 699   ;повтор до конца
      RET        ;возврат
───────────────────────────────────────────────────
Адрес 715. Командный процессор.  Используется также
с адресов:
751 - исполнение команды.  Сжатую команду поместите
в буфер командной строки;
778 - исполнение  команды.  Установите все для 467,
23825 и загрузите из 23825 HL.
715   LD HL,(23836);очистка стека
      DEC HL
      DEC HL
      LD SP,HL
      CALL 8433    ;изменение памяти
      CALL 7555    ;открытие потока 0
      LD A,(23830) ;выбор дисковода D:
      OR 3
      CALL 697     ;остановка его
      LD A,(23830) ;остановка текущего дисковода
      CALL 697
      XOR A        ;сообщения об ошибках печатать
      LD (23829),A
      CALL 8501    ;принятие команды
      CALL 12338   ;сжатие командной строки
751   CALL 7583    ;очистка низа экрана
      LD HL,715    ;возвращаться  в командный  про-
                    цессор
      LD (23834),HL
      XOR A        ;ошибок не было
      LD (23823),A
      LD HL,(23641);берем адрес командной строки
      PUSH HL      ;сохраняем его
      LD DE,23840  ;адрес буфера
      CALL 688     ;сохранение трех первых символов
                    строки
      POP HL       ;восстановление адреса строки
      LD (23825),HL;установка    адреса   командной
                    строки
778   LD A,(HL)    ;берем первый символ строки
      LD B,A       ;сохраняем его
      AND 128      ;его код меньше 128 ?
      LD A,B       ;восстановление символа
      JR Z,794     ;если его код меньше 128, то ди-
                    сковод не устанавливать
      CP 254       ;это RETURN ?
      JR Z,794     ;если да, то дисковод не устана-
                    вливать
      PUSH AF      ;сохранение символа
      CALL 15816   ;активизация  дисковода по умол-
                    чанию
      POP AF       ;восстановление символа
794   LD HL,12275  ;адрес таблицы команд
      DEC HL
      LD C,0       ;проверка первой команды
800   INC C
      LD D,A       ;сохранение символа
      LD A,21      ;пройдена вся таблица ?
      CP C
      JP C,467     ;если да, то завершение
Лучше было бы поставить здесь JP C,7450 для  выдачи
сообщения "*ERROR*".
      LD A,D       ;восстановление символа
      INC HL       ;адрес  следующей команды в таб-
                    лице
      CP (HL)      ;символы совпали ?
      JR NZ,800    ;если нет, то повтор
      CP 254       ;введена команда RETURN ?
      CALL NZ,10570;если нет, то создание буфера
      LD A,9       ;поиск файла вести по 9 байтам
      LD (23814),A
      XOR A        ;ошибок не было
      LD (23823),A
      LD (23766),A ;расширение файла принимать
      LD (23824),A ;на случай загрузки  или верифи-
                    кации файла
      LD HL,23611  ;проверка строки на синтаксис
      RES 7,(HL)
      LD B,0       ;перевод  номера команды в двух-
                    байтную форму
      LD HL,12296  ;адрес  таблицы адресов подпрог-
                    рамм
      DEC C        ;команды считать с нуля
      SLA C        ;умножение  номера  подпрограммы
                    на 2
      ADD HL,BC    ;определение адреса в таблице
      LD E,(HL)    ;берем адрес подпрограммы
      INC HL
      LD D,(HL)
      EX DE,HL     ;переносим его в HL
      PUSH HL      ;сохраняем его
      LD DE,857    ;возврат будет в 857
      PUSH DE
      JP (HL)      ;вызов подпрограммы
857   LD HL,23611  ;выполнение команды
      SET 7,(HL)
      POP HL       ;восстановление адреса  подпрог-
                    раммы
      JP (HL)      ;вызов подпрограммы

               пpодолжение следует ...




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

Похожие статьи:
Открытые письма Nemo №5.2
Металлолом - Эмуляция контроллера дисковода 1818ВГ93.
Полезное - лексикон хороших манер. Проблемы этикета.

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