АБВГДЕ
Код:
ЯСМх86.заголовок = 'ГЗО для ЯЗагрузчика'
ЯСМх86.укладка = простая
ЯСМх86.486 = включить
ЯСМх86.начало= инструктаж
ОТРЫВОК инструктаж ШИФР16
ОТОБРАЗИТСЯ инструктаж в ОИ
ИСТОК 7В00Ш
; ИСТОК 100Ш
Инструктаж:
; ГЗО или MBR предназначен для:
; 1) Сохранения в памяти таблицу разделов
; 2) Загрузить 1 сектор выделенного раздела
; 3) Отослать к нему исполнителя. Передать ему в ЯВА-указатель на выбранный раздел
; Настроить
; ОД=0
; ОИ:УКА указывают на физ адрес 0:7В000Ш
; ЯД.М - номер накопителя, его передаем в функцию чтения ядра с диска
; 4) Дополнительно настроить стопку
; 5) Определить сервис для чтения СТЫК 13Ш функция 02Ш или 42Ш и предать номер сервиса
; Входные параметры MBR
; после перемещения кода из MBR в 7В00Ш
; состояние регистров будет следующее:
; ОИ:УКА указывают на физ адрес 7В00Ш любой комбинацией
; ЯД.М - номер накопителя, его передаем в функцию чтения ядра с диска
; О состоянии склада нам неизвестно, поэтому его надо настроить
ОТМИГ ; Мало вероятно но возможно что стопка не настроен, а прерывания разрешены
КСОР ЯН, ЯН
ПРИС ОС, ЯН ; Так как тут идет установка стопки в 2 инструкции
ПРИС УСА,7В00Ш ; ОТМИГ предотвращает вызов между ними мига
; 4) стопка настроена
ЛОЖИ ЯН
БЕРИ ОВ
ЛОЖИ ОИ
БЕРИ ОД
РАМИГ ; Разрешаем прерывания
ПРИС ЯСУ.Направление, к_старшим ;Настраиваем флаг направления присвоения.
ПРИС ЯВА,смещение @@найти_выделенный_раздел
ПРИС ЯВБ,смещение @@найти_выделенный_раздел - (смещение инструктаж)+600Ш
ЛОЖИ ЯН ; сохраняем адрес для ВОЗ по ДАЛЕЕ
ЛОЖИ ЯВБ
ПРИС ЯС, (смещение инструктаж) - (смещение @@найти_выделеный_раздел)+200Ш
ПОВЕНН ПРИСРБ
; ПРЫГ на @@найти_выделенный_раздел
ВОЗ по ДАЛЕЕ ; Переходим на новое место.
; Теперь регистры ОИ и УКА точно определены
; 1) Таблица разделов сохранена
; И мы можем загрузить ЗО на место MBR 7В00Ш
@@найти_выделенный_раздел:
ЛОЖИ ЯН
БЕРИ ОД
ПРИС ЯВА,07BДШ ; устанавливаем указатель на таблицу разделов
ПРИС ЯС,80Ш
ПРИС ЯС.М,4
@@Круг:
СРАВ [ЯВА], ЯС
ЕРП Прочитать_загрузочный_отрывок
СЛОЖ ЯВА,10Ш
УМЕН ЯС.М
ЕННП на @@Круг
ВЫП стык[19Ш] ; Ошибка нет загрузочного раздела пробуем следующее загр. устройство
Прочитать_загрузочный_отрывок:
ЛОЖИ ОИ
ЛОЖИ смещение напечатать
ВЫП проверить_СТЫК_13Ш
ЛОЖИ ОИ
ЛОЖИ ЯН
ПРИС РЯН,[ЯВА+8]
ПРИС ЯВБ,7В00Ш
ПРИС ЯО,УСА
ВЫП по 4 байта [ЯО] ; 2) Выполняем прочитать_по_ЛАС c параметрами чтения загрузочного отрывка
ЛОЖИ ОД
ЛОЖИ ЯВБ
ВОЗ по ДАЛЕЕ ; 3) Идем выполнять загрузочный отрывок
проверить_СТЫК_13Ш: ; 5) Потом дописать проверку на поддержу 42Ш функции стыка 13Ш
ПРИС ЯН, (смещение прочитать_по_ЛАС) -(смещение инструктаж)+600Ш
ВОЗ
; входные параметры
; РЯН - ЛАС адрес
; ОД:ЯВА - адрес загрузки
прочитать_по_ЛАС:
ЛОЖИ ВСЁ
ЛОЖИ ЯД
ЛОЖИ РЯН
ПРИС ЯН.С,08
ВЫП стык[13Ш] ; ЯН.С - самочувствие 00Ш нет ошибки
; ЯС - с 0 по 6 бит макс. число секторов (от 1 до 63)
; ЯС - с 8 по 15 бит и с 7 по 8 биты макс число цилиндров (от 0 до 3ЕЕДШ)
; +---------+--------+
; |15 8|7 0|
; +---------+--------+
; |876543210|09 |
; +---------+--------+
; |876543210| 543210|
; +---------+--------+
; ЯД.М - число подключенных дисков
; ЯД - макс число головок (от 0Д до 255Д)
ПРИС ЯН.М, ЯС.М
БУЛИ ЯН.М, 111111Б ; число секторов на дорожку (биты 5-0)
РЗНАК по СЛОВО ; переводим Байт в Слово.
ПРИС ЯО.М, ЯД ;
ПРИС ЯО, ЯН.С
УВЕЛ ЯО ; число головок на цилиндр
ОБМ ЯН,ЯО
МНОЖ ЯО ; ЯН:ЯД := (число головок x Сектора)
ПРИС ЯС,ЯН ; ЯС := ЯН (ЯД- всегда ноль)
ЛАС_В_ГАС:
; ЛАС - линейный адрес сектора
; ЛАС = (((Цилиндр * головок_на_цилиндр)+головка)*секторов_на_дорожку)+сектор - 1
; Цилиндр=ЛАС ДЕЛИ (головок_на_цилиндр*секторов_на_дорожку)
; временная_переменная=ЛАС % (головок_на_цилиндр*секторов_на_дорожку)
; головка=временная_переменная ДЕЛИ секторов_на_дорожку
; сектор=временная_переменная ДЕЛИ секторов_на_дорожку +1
БЕРИ РЯН
ПРИС УСБ, УСА
ПРИС ЯД, по СЛОВАМ [УСБ-2]
ДЕЛИ ЯС
ЛОЖИ ЯН
ПРИС ЯН,ЯД
КСОР ЯД,ЯД
ДЕЛИ ЯО
УВЕЛ ЯД
ПРИС ЯС,ЯД
ПРИС ЯД,ЯН.М
БЕРИ ЯН
ПРИС ЯС,ЯН.М
КЛА ЯН.С, 6
БИЛИ ЯС.М,ЯН.С
прочитать_по_ГАС:
ПРИС ЯН.М,1
ПРИС ЯН.С,2
ПРИС УСБ,УСА
ПРИС ЯД.М, по байтам [УСБ]
ПРИС ЯО,ЯВБ
ВЫП СТЫК[13Ш]
ЕПСП на неудачу
БЕРИ ЯД
БЕРИ ВСЁ
ВОЗ по ДАЛЕЕ
неудача:
ПРИС ЯС,(смещение пустота) -(смещение системная_ошибка)
ПРИС УСБ, смещение системная_ошибка
ВЫП по ДАЛЕЕ напечать_строку
ВЫП СТЫК[18Ш] ; Ждём нажатия клавиши
напечать_строку:
ЛОЖИ ВСЁ
ПРИС ЯН,1300Ш
ПРИС ЯО,7
ПРИС ЯД,0
ЛОЖИ ОИ
БЕРИ ОВ
ВЫП СТЫК[10Ш]
БЕРИ ВСЁ
ВОЗ по ДАЛЕЕ
КОНЕЦ иструктожа
ОТРЫВОК данные
системная_ошибка: ДАБ 'System Error'
пустота:
ДАБ (512-2+(смещение инструктаж)-(смещение пустота)-16*4-8) раз (00Ш)
ДАБ 'ПЕРВООСЬ'
таблица_разделов:
раздел0:
ДАБ 80Ш, 00Ш, 00Ш, 00Ш, 00Ш, 00Ш, 00Ш, 00Ш
ДАДС 0063Ш
ДАДС 0001Ш
раздел1:
ДАБ (16) раз (00Ш)
раздел2:
ДАБ (16) раз (00Ш)
раздел3:
ДАБ (16) раз (00Ш)
ярлык:
ДАБ 55Ш, 0ААШ
КОНЕЦ данных