В. Пугачев

"Корвет": пересылка кодовых программ

Локальная сеть КУВТ "Корвет" предусматривает пересылку с рабочего места преподавателя (РМП) на рабочее место учащегося (РМУ) программ на Бейсике, программ в машинных кодах и данных. Файлы двух последних типов пересылаются в свободную область ОЗУ РМУ и различаются тем, что программы в кодах после пересылки запускаются на выполнение с указанного адреса. Конфигурация памяти РМУ в базовом варианте предусматривает, что эти программы (как и файлы данных) могут располагаться только в диапазоне адресов 6800H-F5FFH; диапазон 0-5FFFH занимает ППЗУ. Таким образом, программы в машинных кодах должны разрабатываться с учетом указанной адресации.

В то же время существует большая группа программ в машинных кодах, предназначенных для работы на РМП (файлы типа .СОМ; пересылаемые программы в кодах имеют, как правило, тип .BIN), которые загружаются и запускаются на выполнение с адреса 100Н. Конфигурация памяти РМП допускает это: свободная область ОЗУ (область транзитных программ) располагается от адреса 100Н до BFFFH. Попытка переслать такой файл в РМУ успеха иметь не будет: область, занимаемая ППЗУ в РМУ, недоступна для записи.

Для пересылки и работы с файлами типа .СОМ на РМУ (без их переделки) можно применить следующий способ. Файл пересылается как файл данных в доступную область ОЗУ РМУ. Целесообразно пересылать его в начало этой области (с адреса 6800Н). При пересылке по сети на вопрос STS.COM "ПРОГРАММА (Д/Н)?" следует дать отрицательный ответ. При этом файл будет размещен начиная с указанного адреса, но запускаться на выполнение не будет.

Теперь надо переслать файл внутри ОЗУ в область, начинающуюся с адреса 100Н, и запустить его на выполнение с этого адреса. Это делает специальная программа (назовем ее загрузчиком), листинг которой приведен ниже. Загрузчик пересылается, как правило, в верхнюю часть свободной области ОЗУ (например, с адреса F500H) и запускается на выполнение, как обычная программа в кодах.

Длину файла можно посмотреть в любом отладчике (например, DDT.COM в МикроДос, XSID.COM в СР/М).

Все это относится только к случаю, если пересылаемый файл при своей работе не обращается к подпрограммам системной области ОЗУ. В противном случае в РМУ необходимо предварительно переслать те используемые операционной системой части ОЗУ РМП, к которым происходит обращение.

          ORG   ....    ;Начальный адрес загрузки и запуска программы-загрузчика
          MVI   A,1C    ;Переключение конфигурации памяти РМУ (отключается ППЗУ и
          STA   FA7F    ;подключается свободная область ОЗУ, доступная для записи)
          LXI   H,6800  ;В пару регистров HL заносится адрес, начиная с которого загружен файл данных
          LXI   D,0100  ;В пару регистров DE заносится адрес начала рабочей области (в которую будет переписываться файл данных)
          LXI   B,....  ;В пару регистров ВС заносится длина файла в байтах (шестнадцатеричное число)
          XRA   A       ;Очистка аккумулятора
    LOOP: MOV   A,M     ;Пересылка в аккумулятор содержимого ячейки, адрес которой находится в HL (очередного байта файла)
          PUSH  H       ;Сохранение в стеке содержимого HL
          MOV   H,D     ;Пересылка в HL из DE адреса очередной ячейки рабочей области, в которую следует переслать байт
          MOV   M,A     ;Пересылка из аккумулятора очередного байта файла в очередную ячейку рабочей области
          POP   H       ;Восстановление HL из стека
          INX   H       ;Увеличение HL (адреса очередного байта файла) на 1
          INX   D       ;Увеличение DE (адреса очередной ячейки рабочей области) на 1
          DCX   В       ;Уменьшение на 1 длины оставшейся части файла
          MOV   A,В     ;Проверка достижения
          ORA   C       ;конца пересылаемого
          JNZ   LOOP    ;файла
          CALL  0100    ;Запуск, если файл переслан