Закрыть окно Список других документов библиотеки Серкова
.цв .шп72 ФОРМАТ ТРЕКА. .лв .шп0 --------------------------------------------------------------- !*****! С Е К Т О Р #0 !*****! С Е К Т О Р #1 !*****! --------------------------------------------------------------- !Зазор!Адрес-!Зазор! Поле !Зазор!Адрес-!Зазор! Поле !Зазор! ! 1 ! ное ! 2 !данных! 3 ! ное ! 2 !данных! 3 ! ! ! поле ! ! ! ! поле ! ! ! ! ! ! #0 ! ! #0 ! ! #1 ! ! #1 ! ! --------------------------------------------------------------- ! / !*************************! / \ !**** ! / \***********************/ / \ \*** ! / \__________________***/ / \___ \** ! / \*! / \ \* !!1-3 4-5 6-7 8-9 A-B C-E \! / \!* !!----------------------------------! / 347-!!* !!про-!номер!адрес! адрес !К.С!эпи-!! /1-3 4-345 346 349!!* !!лог ! тома!трека!сектора! !лог !!!----------------------!!* !!----------------------------------!!про-!342байта!К.С!эпи-!!* ! \********************************/ !лог ! данных ! !лог !!* ! \******************************/ !----------------------!!* ! \****************************/ !**********************!!* ! \**************************/ !******************___/ !* ! \************************/ !*****************/ !* ! \**********************/ !****************/ !* !--------********************---------***************---------* !синхро-!********************!синхро-!***************!синхро-!* ! байты !********************! байты !***************! байты !* ! ¤FF !********************! ¤FF !***************! ¤FF !* ! 40-95 !********************! 5-10 !***************! 14-24 !* ---------********************---------***************---------* <------------------------------ (197-203) мс -----------....--> Номера секторов в диапазоне от #0 до #F. Пролог адресного поля: ¤D5 AA 96 Эпилог адресного поля: ¤DE AA EB Пролог поля данных : ¤D5 AA AD Эпилог поля данных : ¤DE AA EB СТРУКТУРА БАЙТА НА ДИСКЕ. _ ___ _ _ ___ _ _ _!C!_!D=1!__!C!_D=0_!C!_!D=1!_!C!_D=0_!C!_!D=1!_!C!_D=0_!C!_!D=1!_!C!_D=0_!C!_ < 4 мкс > < бит 7 Х бит 6 Х бит 5 Х бит 4 Х бит 3 Х бит 2 Х бит 1 Х бит 0 > <---------------------------- Б А Й Т ¤AA ------------------------------> ! 1 ! 0 ! 1 ! 0 ! 1 ! 0 ! 1 ! 0 ! <________________________________ 32 мкс ________________________________> C - бит синхронизации. D - бит данных. .цв .шп8 ЧЕРЕДОВАНИЕ СЕКТОРОВ. .шп0 .лв Физический Сектор Сектор Сектор сектор DOS3.3 Паскаля CP/M ------------------------------------------------------- 0 0 0 0 1 D 2 3 2 B 4 6 3 9 6 9 4 7 8 C 5 5 A F 6 3 C 2 7 1 E 5 8 E 1 8 9 C 3 B A A 5 E B 8 7 1 C 6 9 4 D 4 B 7 E 2 D A F F F D .цв .шп8 КОДИРОВАНИЕ ПОЛЯ ДАННЫХ. .шп0 .лв ----------- /-------\ ----------- /-------\ -------- !страница ! /программа\ !первичный! /программа\ !сектор! ! данных !-><кодирования>->! буфер !->< записи >->! на ! !пользова-! \ / ! данных ! \ сектора / !диске ! ! теля ! \-------/ !---------! \-------/ -------- ----------- !вторичный! ! ^ ! буфер ! Y ! ! данных ! ------------ ----------- ! таблица ! !трансляции! ! записи ! ------------ -------- /-------\ ----------- /-------\ ----------- !сектор! /программа\ !первичный! /программа\ !страница ! ! на !->< чтения >->! буфер !->< декоди- >->! данных ! !диске ! \ сектора / ! данных ! \ рования / !пользова-! -------- \-------/ !---------! \-------/ ! теля ! ! ^ !вторичный! ----------- Y ! ! буфер ! ------------ ! данных ! ! таблица ! ----------- !трансляции! ! чтения ! ------------ .цв .шп72 Обращение к DOS на языке Ассемблера. .шп8 АППАРАТНЫЕ АДРЕСА DOS. .шп0 .лв Адрес Метка О П И С А Н И Е ¤C080 PHASEOFF Выключение фазы 0 шагового двигателя; ¤C081 PHASEON Включение фазы 0 шагового двигателя; ¤C082 PHASE1OFF Выкл. ----"---- 1 ----"----"----"---; ¤C083 PHASE1ON Вкл. ----"---- 1 ----"----"----"---; ¤C084 PHASE2OFF Выкл. ----"---- 2 ----"----"----"---; ¤C085 PHASE2ON Вкл. ----"---- 2 ----"----"----"---; ¤C086 PHASE3OFF Выкл. ----"---- 3 ----"----"----"---; ¤C087 PHASE3ON Вкл. ----"---- 3 ----"----"----"---; ¤C088 MOTOROFF Выключение двигателя вращения; ¤C089 MOTORON Включение двигателя вращения; ¤C08A DRV0EN Выбор НГМД1; ¤C08B DRV1EN Выбор НГМД2; ¤C08C Q6L Стробирование регистра данных для ввода/вывода; ¤C08D Q6H Загрузка регистра данных; ¤C08E Q7L Подготовка регистра данных для ввода; ¤C08F Q7H Подготовка регистра данных для вывода. ПРИМЕЧАНИЕ: 1. Действительный адрес зависит от номера разъема, на котором установлен требуемый контроллер НГМД, и вычисляется путем увеличения адреса, указанного в таблице, на величину X=номер разъема * 16. 2. Q7L вместе с Q6L = Режим ЧТЕНИЕ; Q7L вместе с Q6H = Проверка защиты от записи; Q7H вместе с Q6L = Режим ЗАПИСЬ; Q7H вместе с Q6H = Загрузка регистра записи. .цв ВКЛ/ВЫКЛ ДВИГАТЕЛЯ ВРАЩЕНИЯ. .шп0 .лв LDA ¤C089,X Включить двигатель. После этого рекомендуется выдержать паузу в 1 секунду, однако можно сократить эту задержку до минимально необходимой, наблюдая за содержимым регистра данных в режиме ЧТЕНИЕ до тех пор, пока данные в нем не начнут изменяться. LDA ¤C088,X Выключить двигатель. .цв ВЫБОР НГМД1/НГМД2. .лв LDA ¤C08A,X Выбрать НГМД1. LDA ¤C08B,X Выбрать НГМД2. Одновременно может быть выбран только один из двух НГМД, а именно тот, который был выбран последним. .цв ВКЛ/ВЫКЛ ФАЗ ШАГОВОГО ДВИГАТЕЛЯ. .лв Вообще говоря, каждую из четырех фаз нужно включить, а затем выключить вновь. Если делать это в порядке возростания номеров фаз, привод будет перемещаться к центру диска, а если в порядке убывания номеров фаз, то - к внешнему краю диска. Величина временной задержки от включения до выключения фазы критична, так что это упражнение не является тривиальным. Для управления перемещением привода головки рекомендуется использо- вать программу SEEK из RWTS. .цв ЧТЕНИЕ БАЙТА С ДИСКА. .лв LDA ¤C08E,X Включение режима чтения. ... ... READ LDA ¤C08C,X Чтение регистра данных. BPL READ Если старший бит =0, то повторить чтение регистра данных, так байт с диска еще не действителен. ... ... В аккумуляторе действительный байт с диска. .цв ПРОВЕРКА ЗАЩИТЫ ОТ ЗАПИСИ. .лв LDA ¤C08D,X LDA ¤C08E,X Проверить защиту от записи. BMI ERRDR Если старший бит =1, то запись невозможна. WRITE ... ... Запись. ... ... ERRDR ... ... Ошибка WRITE PROTECTED. .цв ЗАПИСЬ БАЙТА НА ДИСК. .лв LDA ¤C08F,X Вкл. режима ЗАПИСЬ. JSR WAIT100 Задержка на 100 мкс. ... ... LDA DATA Загрузка байта в аккумулятор. LDA ¤C08D,X Загрузка регистра данных. LDA ¤C08C,X Запись байта на диск. Из-за аппаратных ограничений запись байтов на диск должна производится в циклах длительностью 32 такта. .цв .шп72 Простые алгоритмы. .шп8 ПОИСК СВОБОДНОГО БУФЕРА DOS. .шп0 .лв FBUFF LDA ¤3D2 Определить точку загрузки DOS. STA ¤01 LDY #¤00 STY ¤00 GBUF0 LDA (¤00),Y Найти следующий буфер DOS. PHA INY LDA (¤00),Y STA ¤01 PLA STA ¤00 BNE GBUF Один найден. LDA ¤01 BEQ NBUF Нет свободных буферов. GBUF LDY #¤00 Получить имя файла. LDA (¤00),Y BEQ GOTBUF Буфер свободен. LDY #36 Буфер занят. BNE GBUF0 Перейти к поиску следующего буфера. GOTBUF CLC Индикация - найден свободный буфер. RTS Возврат в вызывающую программу. NBUF SEC Индикация - нет свободных буферов. RTS .цв ЕСТЬ ЛИ DOS В ОЗУ ? .лв LDA ¤3D0 Получить "векторную" команду JMP. CMP #¤4C Это безусловный переход ? BNE NODOS Нет, DOS не загружена. ... ... Да, DOS загружена. .цв КАКАЯ ВЕРСИЯ DOS АКТИВНА ? .лв CLC LDA #0 Прибавить ¤16BE к адресу загрузки DOS. ADC #¤BE STA ¤00 LDA ¤3D2 ADC #¤16 STA ¤01 LDY #0 LDA (¤00),Y Получить номер версии DOS (2 или 3). .цв КАКОЙ ИЗ БЕЙСИКОВ ВЫБРАН ? .лв Чтобы определить, какое из ПЗУ (INTEGER BASIC ROM или APPLESOFT BASIC ROM)активно, и подключить нужное, можно вызвать следующую далее подпрограмму. Сначала в регистр A загружается код, указы- вающий, какой Бейсик требуется. Для INTEGER BASIC используется код ¤20, а для APPLESOFT BASIC - ¤4C. LDA #¤4C Код для APPLESOFT BASIC. JSR SETBSC Вызвать подпрограмму. BNE ERROR LANGUAGE NOT AVAILABLE (Язык недоступен). ... ... SETBSC CMP ¤E000 Есть требуемый Бейсик ? BEQ RTSS Да. STA ¤C080 Нет. Выбрать плату ПЗУ. CMP ¤E000 Есть ли теперь ? BEQ RTSS Да. STA ¤C081 Нет. Проверить еще одно ПЗУ. CMP ¤E000 Получен Бейсик ? RTSS RTS В любом случае возврат в вызывающую программу. .цв ВЫПОЛНЯЕТСЯ ЛИ БЕЙСИК-ПРОГРАММА ? .лв Для целочисленного Бейсика: LDA ¤D9 BMI EXEC Программа выполняется. BPL NOEXEC Бейсик находится в диалоговом командном режиме. Для APPLESOFT BASIC: LDX ¤76 Получить номер строки. INX BEQ NOEXEC Программа не выполняется. LDX ¤33 Получить символ-подсказку. CPX #¤DD Подсказка - "]" ? BEQ NOEXEC Да. Программа не выполняется. BNE EXEC Нет. Программа выполняется. .цв .шп72 Доработка DOS. .шп8 НАЛОЖЕНИЕ "ЗАПЛАТ". .шп0 .ов
Изменения в DOS можно вводить на трех уровнях:
1 - "Заплата" может быть наложена на DOS в ОЗУ. Последующая перезагрузка исходной DOS приведет к потере "заплаты".
2 - "Заплату" первого типа можно "зафиксировать" на новой дискете путем ее инициализации во время работы измененной DOS.
3 - "Заплата" накладывается прямо на дискете, содержащей копию исходной DOS. Для этого можно использовать программу ZAP.
Можно использовать программу MASTER CREATE для записи измененной DOS на новую дискету. Для этого нужно использовать следующую процедуру:
]BLOAD MASTER KREATE Загрузить программу. ]CALL-151 Выйти в Монитор. *80D:4C Записать ¤4C в яч. ¤80D. *800G Запустить MASTER CREATE.
По окончании загрузки копии исходной DOS выполняется выход из MASTER CREATE. Копия DOS загружена с адреса ¤1200, причем Загрузчик 2 (RWTS) загружен первым, а основная часть DOS размещена вслед за ним, начиная с адреса ¤1C00. Используя команды Монитора, наложите "заплаты" и запустите MASTER CREATE вновь:
*82DG
По завершении работы программы выходная дискета будет содержать измененную DOS. Данная процедура будет работать с версиями DOS 3.2, 3.2.1 и 3.3.
.цв ВСТАВКА ПРОГРАММ МЕЖДУ DOS И ЕЕ БУФЕРАМИ. .ов
Иногда бывает полезным найти "безопасное" место для загрузки программы на машинном языке(например, драйвера принтера), где ни Бейсик, ни DOS не смогли бы испортить ее, даже при "холодном" старте DOS. Если длина программы меньше 200 байтов, то удачным будет адрес ¤0300. Для загрузки программы большей длины лучше разместить ее между DOS и ее буферами (предполагается, что программа является переместимой и будет работать на этом месте). Для этого загрузите программу в область ОЗУ, непосредственно примыкающую снизу к ячейке ¤9D00 (для 48 Кбайтной машины), измените адрес первого буфера DOS в ячейке ¤9D00 так, чтобы он указывал на точку "ниже" вашей программы (не забудьте оставить 38 дополнительных байтов для имени файла и цепочечных указателей), и выполните безусловный переход по адресу ¤3D3 (DOS COLDSTART - "холодный" старт DOS). Это заставит DOS построить вновь свои буфера "ниже" вашей программы и "забыть" о существовании памяти, которую занимает эта программа. Бейсик, конечно, также не сможет "добраться" до этой памяти, поскольку DOS установит HIMEM "ниже" буферов DOS.
.цв ЗАПУСК ФАЙЛА HELLO КОМАНДАМИ BRUN ИЛИ EXEC. .ов
В общем случае, когда DOS заканчивает начальную загрузку в память, она выполняет команду RUN HELLO. Чтобы заменить команду RUN на BRUN или EXEC, наложите "заплату" (для 48 К APPLE):
*9E42:34 для BRUN; *9E42:14 для EXEC.