"Корвет": пересылка кодовых программ
Локальная сеть КУВТ "Корвет" предусматривает пересылку с рабочего места преподавателя (РМП) на рабочее место учащегося (РМУ) программ на Бейсике, программ в машинных кодах и данных. Файлы двух последних типов пересылаются в свободную область ОЗУ РМУ и различаются тем, что программы в кодах после пересылки запускаются на выполнение с указанного адреса. Конфигурация памяти РМУ в базовом варианте предусматривает, что эти программы (как и файлы данных) могут располагаться только в диапазоне адресов 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 ;Запуск, если файл переслан