Закрыть окно Список других документов библиотеки Серкова
.шп8 .цв Программная логика DOS. .шп0 .лв ЗАГРУЗЧИК 0 - ПЗУ на плате КНГМД. C600-C65B Эта программа получает управление при включении питания, по командам PR#6, C600G или 6 УПР-P. Динамически создает в яч.¤356-3FF таблицу трансляции дисковых байт. Вызывает команду RTS и извлекает адрес возврата из стека, для того чтобы определить номер разъема, в котором она установлена. Сохраняет номер разъема, умноженный на 16 в регистре X, очищает дисковые регистры в/в, устанавливает режим чтения, выбирает НГМД 1, запускает двигатель. Устанавливает головку на трек 0, устанавливает параметры для считывания сектора 0 трека 0. C65C-C6FA Считывает сектор, номер которого в яч.¤3D, номер трека в яч.¤41, адрес буфера данных в яч.¤26-27. Ищет адресное поле сектора. C683 Обрабатывает адресное поле сектора. Сохраняет прочитанный номер трека в яч.¤40 и сравнивает с содержимым яч.¤41. C6A6 Обрабатывает поле данных сектора. Читает 85 байт вторичных данных в яч.¤300-355. Читает 256 байт первичных данных в буфер с адресом в яч.¤26-27. Проверяет контрольную сумму. "Складывает" вторичные и первичные данные в буфере первичных данных. Ваполняет инкремент яч.¤27 и ¤3D, сравнивает с содержимым яч.¤0800, чтобы определить, нужно ли считывать другие сектора. Если да, то вновь загрузить в регистр X номер разъема и вернуться по адресу ¤C65C для чтения следующего сектора. Передает управление на ЗАГРУЗЧИК 1 по адресу ¤0801. ЗАГРУЗЧИК 1.(Сектор 0, Трек 0). 0801-084C Она загружает программу загрузки ОЗУ, ЗАГРУЗЧИК 2, содержащий RWTS, и выполняет безусловный переход на него. (Загружаются сектора 1-9 трека 0). Если это первый вход в Загрузчик 1, то перейти на ¤081F. Создает адрес ПП чтения сектора (¤C65C в нашем случае) и сохранить его в яч.¤3E-3F. Извлекает из яч.¤08FF адрес первой страницы памяти для Загрузчика 2, прибавить его длину (в секторах) из яч.¤08FF и установить это значение в качестве начального адреса загрузки. 081F Получить номер сектора, который следует прочитать; если он нулевой, то перейти на ¤0839. Перевести теоретический номер сектора в физический, используя первый в качестве индекса в "преломляющей" таблице по адресу ¤084D. Выполнить декремент теоре- тического номера сектора в яч. ¤08FF для следующей итерации. Установить параметры для чтения очередного сектора и передать управление на ¤C65C. Когда сектор будет прочитан, управление на ¤0801. 0839 Установить в яч.¤08FE номер страницы для определения точки входа в Загрузчик 2. Выполняются команды PR#0 и IN#0, вызывая Монитор. Инициализирует Монитор (текстовый режим, стандартное окно и т.д.) Получает номер разъема и переходит на Загрузчик 2 (адрес ¤3700 для основного диска, ¤8700 - в окончательно перемещенном положении). В составе Загрузчика 2 в "нижней" его части загру- жается копия Загрузчика 1 для будущей разметки дискет. ЗАГРУЗЧИК 2 (сектора 1-9 трека 0). .ов
Загрузчик 2 состоит из 2-х частей: загрузочной "основной" программы и пакета RWTS. Первая из них, опираясь на RWTS, находит трек 2 сектор 4 и считывает подряд 27 секторов (сектора 0-4 трека 2, трек 1 полностью и сектора A-F трека 0) в область ОЗУ, непосредственно примыкающую снизу к Загрузчику 2. Последний сектор (сектор A трек 0) попадает по адресу ¤1B00 для основной дискеты. Таким образом загружаются основные ПП DOS и мененджер файлов.
В этой точке процесс начальной загрузки дублирующей дискеты оакончен, после чего предпринимается безусловный переход по адресу "холодного" старта DOS.
В случае основной дискеты осуществляется переход к специальной перемещающей программе по адресу ¤1B03. Эта программа имеет длину 512 байт(в случае дублирующей дискеты в этой области 0000).
Перемещающая программа определяет размер памяти компьютера путем записи и чтения на старших страницах ОЗУ, пока не будет найдена действительная старшая страница ОЗУ. Затем она перемещает копию DOS с адреса ¤1D00 на ее окончательное место(¤9D00 для 48К) и используя таблицы, встроенные в программу, модифицирует машинные коды таким образом, чтобы они правильно выполнялись на новом месте. Потом перемещающая программа выполняет безусловный переход к копии DOS в области старших адресов, а старая копия забывается.
Загрузка DOS завершается программой "холодного" старта DOS. Эта программа инициализирует DOS, отводит место под буферы файлов, устанавливает HIMEM, строит таблицу векторов на странице 3 и запускает программу HELLO.
.шп8 .цв Основные программы DOS 3.3. .шп0 .лв 9D00-9D0F Переместимые адресные констнты: 9D00 Адрес первого буфера файла, а именно, поле имени файла; 9D02 Адрес программы клавиатурного перехвата DOS; 9D04 Адрес программы видеоперехвата DOS; 9D06 Адрес буфера первого имени файла; 9D08 Адрес буфера второго(RENAME) имени файла; 9D0A Адрес параметра длины ряда(использует LOAD); 9D0C Адрес ячейки, содержащей адрес загрузки DOS(¤9D00); 9D0E Адрес списка параметров мененджера файлов. 9D10-9D1C Таблица адресов программ обработки состояний видео- перехвата DOS (CSWL). Состояния используются для управления обработкой команд DOS, как выходных строк оператора PRINT (номера состояний 0-6). 9D1E-9D55 Таблица точек входа в программы обслуживания команд: INIT ¤A54F LOAD ¤A413 SAVE ¤A397 RUN ¤A4D1 CHAIN ¤A4F0 DELETE ¤A263 LOCK ¤A271 UNLOCK ¤A275 CLOSE ¤A2EA READ ¤A51B EXEC ¤A5C6 WRITE ¤A510 OPEN ¤A2A3 APPEND ¤A298 RENAME ¤A281 CATALOG ¤A56E MON ¤A233 NOMON ¤A23D PR# ¤A229 IN# ¤A22E MAXFILES ¤A251 FP ¤A57A INT ¤A59E BSAVE ¤A331 BLOAD ¤A35D BRUN ¤A38E VERIFY ¤A27D. 9D56-9D61 Таблица входных векторов активного Бейсика: 9D56 Адрес точки входа в Бейсик для команды CHAIN; 9D58 Адрес RUN; 9D5A Адрес программы обработки ошибок; 9D5C Адрес "холодного" старта Бейсика; 9D5E Адрес "теплого" старта Бейсика; 9D60 Адрес перемещенного Бейсика(только для типа APPLESOFT). 9D62-9D6B Таблица входных векторов целочисленного Бейсика. 9D6C-9D77 Таблица входных векторов для ПЗУ-версии Бейсика. 9D78-9D83 Таблица входных векторов для ОЗУ-версии Бейсика. 9D84-9DBE Входная программа "холодного" старта DOS. Сохранить номер разъема и НГМД в качестве величин, принятых по умолчанию для командных ключевых слов. Запомнить какой Бейсик активен и продублировать его входной вектор. Перейти на ¤9DD1. 9DBF-9DE9 Входная программа "теплого" старта DOS. Получить сохраненный в памяти тип Бейсика и привести плату ПЗУ в необходимое состояние(вызывается ¤A5BD): 9DD1 Запомнить тип старта DOS. Вызвать ¤A851 для замещения программ клавиатурного и видеоперехвата. Установить NOMON C,I,O. Установить состояние видеоперехвата 0. Выполнить соответствующий тип старта текущего Бейсика. (Выйти из DOS. DOS вновь получит управление, когда Бейсик выведет свой символ-подсказку). 9DEA-9E50 Первая программа обработки ввода для DOS. Она вызывается программой обслуживания клавиатурного перехвата, когда Бейсик выполняет первый после "холодного" старта опрос клавиатуры. Если активна ОЗУ-версия Бейсика, скопировать ее таблицу входных векторов в таблицу входных векторов активного Бейсика и очистить буфер первого имени файла, так что файл HELLO не запустится. Установить MAXFILES=3. Вызвать ¤A7D4 для построения буферов файлов DOS. Если была активна команда EXEC, то закрыть исполняемый файл. Установить состояние видеоперехвата 0 и сигнализировать о состоянии "теплого" старта, вызывая ¤A75B. Если последняя выполненная команда не INIT(DOS не была только что загружена), перейти на ¤9E45. В противном случае продублировать в яч.¤3D0-3FF копию векторов DOS. Поместить в яч. ¤3F2-3F3 указатель на программу "теплого" старта DOS. Установить байт включения питания ПЗУ Автостарта, поскольку адрес обработки RESET изменился. Установить индекс команды RUN (для запуска HELLO) и перейти на ¤A180. 9E45 Проверить, нет ли отсроченной команды. Если да, то то перейти на ¤A180, в противном случае вернуться в вызывающую программу. 9E51-9E7F Копия векторов DOS страницы 3, которые программа, описанная выше, дублирует в ячейках ¤03D0-03FF. 9E81-9EB9 Программа клавиатурного перехвата DOS. Вызвать ¤9ED1 для сохранения регистров при входе в DOS. Если выполняется не "холодный" старт или не чтение дискового файла, то перейти на ¤9E9E. Взять значение, полученное в регистре A при входе в программу, и отобразить его на экране. Если работает режим чтения файла, то перейти на ¤A626 для получения следующего байта. В противном случае вызвать ¤9DEA для исполнения первой обработки ввода. Поместить курсор в следующую позицию экрана. 9E9E Если исполняется команда EXEC, то вызвать ¤A682 для получения следующего байта из исполняемого файла. Установить видеоперехват в состояние 3(отображение ввода). Вызвать ¤9FBA для восстановления содержимого регистров. Вызвать действительную программу ввода с клавиатуры. Сохранить введенный символ так, чтобы он в последующем восстановился в регистре A при восстановлении регистров. Проделать то же самое с новым содержимым регистра X. Выйти из DOS через ¤9FB3. 9EBA-9EBC Безусловный переход к действительной программе обработки KSWL. 9EBD-9ED0 Программа видеоперехвата DOS. Вызвать ¤9ED1 для сохранения регистров при входе в DOS. Получить номер состояния видеоперехвата и, используя его в качестве индекса в таблице адресов программ обработки состояний(¤9D10), перейти к соответствующей программе, передавая ей выводимый символ. 9ED1-9EEA Обобщенная программа сохранения регистров для перехвата. Сохранить содержимое регистров A,X,Y,S в яч.¤AA59-AA5C. Пока работает DOS, восстановить адреса действительных программ обслуживания в/вывода (KSWL и CSWL) в яч.¤36-39. Вернуться в вызывающую программу. 9EEB-9F11 Программа обслуживания 0-состояния вывода. -- Начало строки --. Если команда RUN была прервана (загрузкой ОЗУ-версии Бейсика), то перейти на ¤9F78 для ее завершения. Если флажок чтения установлен(идет чтение файла) и на вывод передан символ "?"(из оператора INPUT), то перейти к состоянию 6, чтобы пропустить его. Если флажок чтения установлен и на вывод передан символ-подсказка из яч.¤33, то перейти к состоянию 2 для игнорирования данной строки. В любом случае установить состояние 2(игнорирование несистемной команды). Если выводимый символ не УПР-D, то перейти к состоянию 2. В противном случае установить строчный индекс равным 0 и войти в состояние 1 (накопление возможной команды DOS). 9F12-9F22 Программа обслуживания 1-состояния вывода. -- Накопление команды DOS --. Используя строчный индекс, записать символ в буфер ввода(¤0200). Инкремент строчного индекса. Если символ не "возврат каретки", то выйти из DOS через ¤9F95(с отображением символа на экране, если установлен MON I). В противном случае перейти к сканеру команд по адресу ¤9FCD. 9F23-9F2E Программа обслуживания 2-состояния вывода. -- Игнорирование несистемной команды --. Если символ не "возврат каретки", то выйти из DOS через ¤9FA4(с отображением символа на экране). В противном случае ввести состояние 0 и выйти из DOS через ¤9FA4. 9F2F-9F51 Программа обслуживания 3-состояния вывода. -- Обработка оператора Бейсика INPUT --. Установить состояние 0, если INPUT завершен(¤8D). Если символ не "возврат каретки", то отобразить его на экране, если только не действует команда EXEC вместе с режимом NOMON I, и выйти из DOS в любом случае.(KSWL установит состояние 3). В противном случае вызвать ¤A65E, чтобы проверить, выполняет ли Бейсик программу или находится в диалоговом режиме. Если действует команда EXEC или Бейсик находится в диалоговом режиме, то перейти к состоянию 1 для накопления возможной команды DOS. В противном случае выйти из DOS, отображая символ соответствующим образом. 9F52-9F60 Программа обслуживания 4-состояния вывода. -- Запись(WRITE) данных в файл --. Если символ - "возврат каретки", то установить состояние 5(начало записи строки данных). Вызвать ¤A60E для записи байта в файл. Выйти из DOS с отображением на экране, если установлен MON O. 9F61-9F70 Программа обслуживания 5-состояния вывода. -- Начало записи(WRITE) строки данных --. Если символ - УПР-D, то перейти к состоянию 0 для немедленного выхода из режима записи. Если символ - прогон строки, то записать его и выйти, оставаясь в состоянии 5. В противном случае перейти к состоянию 4. 9F71-9F77 Программа обслуживания 6-состояния вывода. -- Пропуск символа-подсказки --. Выйти из DOS через ¤9F9D(с отображением, если включен MON I). .ст DOS (логика)2