Что такое REDER?
Это я просто написал для себя операционную систему, когда у меня ничего не было,
кроме DOSи и «Волкова», и достать негде было. А хотелось программировать.
Ни для кого REDER не представляет никакого интереса! Написать и запустить
на нем можно только программу, написанную под него. И могу это только я.
Удобств – никаких. Но доступен любой участок памяти, диск или порт (если известно
как до него добраться). Все пишется просто и быстро (если знакОм с ассемблером,
командами интеловских процессоров и всеми хитростями с ними связанными). Вся система
запускается с мягкого диска, занимает 60 кб, под данные требует 130 кб. Команды
языка имеют минимальную длину записи, пишутся через пробел, или даже без него.
Собственно, это было главной моей задачей – избавиться от длиннющих англических
слов, гигантского количества строк в простенькой программе, чтобы на экране сразу
было видно до двухсот ассемблерных команд, чтобы одним взглядом можно было оценить
ситуацию (я помню, где-то читал, как создатели первых OS на коленках лазили по
распечаткам в поисках ошибок – двадцать тысяч строк – 400 листов А4 – такой текст
запросто умещается даже не в расширенной памяти REDERа). А еще - я не завишу от
чужой программы: все, что я пишу, будет или не будет работать только благодаря мне.
Ни одного бита из других операционных систем в REDERе нет. Но! Из-за медлительности
BIOS-прерываний мне пришлось почти все драйвера переписать под конкретную машину.
А их уже было три. И на всех - материнские платы играют по своим правилам. Будет
новая машина - будет новый REDER. Так что, при всем желании, не имеет смысла выставлять
все файлы для общего пользования. Маловероятно, что REDER у Вас заработает.
Книги, которыми я пользовался:
1- Т. Хоган. Аппаратные и программные средства персональных компьютеров.
1995г. 2 тома.
2- Р. Лей и «Уэйт-Груп». Написание драйверов для MS-DOS. 1995г.
3- В.Л. Григорьев. Микропроцессор i486. Архитектура и программирование (в 4-х
книгах).
4- Видеосистемы.
5- Цифровая обработка цветных изображений.
REDER содержит загрузочную на мягком диске, которая загружает и запускает файл
управления файлами, который в свою очередь загружает и запускает файлы REDERа
из списка. Эти файлы могут находиться и на жестком диске. Самый первый из них –
библиотека подпрограмм
содержащий все необходимое для графики, звука,
расширпамяти, плавающей запятой, клавы и мыши. Сейчас это 80 прерываний на любой
вкус и цвет и таблица символов кириллицы, сворованная мною из KEYRUS.COM.
Второй файл – транслятор с языка REDER.
Третий – файл табличек и окошек. Здесь есть таблички знаков, цветов, окошки каталога
дисков, окошко управления часами, калькулятор, 16-ричный редактор памяти, система
экранных кнопочек и даже система автоматического программирования окошек и кнопочек
(мышкой указываете левую верхнюю точку окошка или кнопки и нижнюю правую, пишете текст,
определяете его цвет, толщину границы окна).
Последний файл (если в списке больше нет ничего) должен быть редактор тестов.
Команды редактора REDERа:
Scroll Lock -выход при зависании с помощью прерывания таймера, если прерывания
разрешены
F1 -знаки,время,цвета,скандиск,каталог,команды,будильник,
калькулятор (Писать командную строку чисел и операций
+,-,*,/.<ВК> -исполнить. Числа могут быть десятичными, если поставит за ними
"Д",и могут быть преобразованы в 16-ричные,если поставить за ними "Ш".
В конце строки может стоять "д", если надо распечатать десятичный целый
результат. Строка сохраняется в памяти, поэтому при следующем вызове
калькулятора стрелками можно ее вызвать.)
Esc или щелчок мыши по экрану -выход,
F2 -выбор из списка открытых текстов визуально,
F4 --"- по памяти,
F3 -выбор знака (например, стрелочки) из таблицы мышкой, будет тут же вписан на курсор,
F5 -пуск оттран-ной программы (если при тр-ции обнаружены ошибки - не запустишь),
F6 -переименовать текст,
F7 -запомнить страницу и положение курсора (2 ступени),
F8 -вспомнить запомненную страницу,
F9 -в начало текста,
F10 -в конец текста,
F11 - выдать знак, запомненный с помощью правой кнопки мыши (первое нажатие -
стандартный, второе - из второго набора),
F12 -восстановить строку после ввода символов и удаления (любая другая
команда запоминает изменения в основном буфере, и восстановление не получится),
TAB –трансляция текста программы в программу,
INS -разделить строку,
DELETE -удалить символ со сдвижкой,
HOME -в начало строки,
END -в конец строки,
P-Uр -страница назад,
P-Down -страница вперед,
Левая кн мыши -поставить курсор,
Прав кн мыши -запомнить знак,
код`24 -конец текста,
код`B2 -метка,
знак`1E (или`0D`0A в виде знака '1F) -конец строки,
Ctrl -переключение алфавита с переключением Caрs Lock,
[ALT]+[Y] -новый текст,
[ALT]+[Q] -перезапуск REDERа с диска в случае незначительной потери его работоспособности,
для спасения данных,
[ALT]+[W] -контроль расширпамяти (таблица занятости),
[ALT]+[E] –кодирование (чтоб никто не прочитал),
[ALT]+[R] -раскод,
[ALT]+[U] -удалить от метки `B3 до курсора,
[ALT]+[I] -читать с диска,
[ALT]+[O] -запись на диск,
[ALT]+[P] -текст на принтер от метки до курсора (за знаком амперсанд (код`26)
можно указать управляющий код для принтера; если выводится управляющая
последовательность, ряд амперсанды-коды должен быть без посторонних знаков,
переносов и пробелов),
[ALT]+[T] -поставить оттранслир файл на на диск,
[ALT]+[L] или [K] -поиск слова до конца текста (оператор комстроки),
[ALT]+[D] -продолжить поиск,
[ALT]+[F] -поставить метку`B2,
[ALT]+[A] -смена закраски знака,
[ALT]+[Z] -закраска знака,
[ALT]+[S] -отменить закраску,
[ALT]+[J] -выкл/вкл монитор,
[ALT]+[C] -запомнить текст от метки`B2 до курсора в буфере фрагмента текста,
[ALT]+[V] -вспомнить фрагмент,
[ALT]+[N] -стереть текст ниже курсора,
[ALT]+[M]+(0-9) -поиск свободной метки,
[ALT]+[H] -16-ричный редактор,
[ALT]+[X] -трансл с распеч меток,
[ALT]+[B] -замена слова на слово (оператор комстроки - все знаки,кроме '0D),
[ALT]+[-] -подчеркивание,
[ALT]+[=] -зачеркивание
[ALT]+[0] -отмена подч/зач
[ALT]+[G] -переход на адрес.
Распределение памяти:
500-10000 -система,
10000-10200 -рабстрока,
10200-10300 -список открытых текстов,
10300-10340 -данные рабтекста,
80000-90000 -буфер трансляции,
90000-91CF0 -буф R и r-чисел,
91CF0-92B70 -буф графтекста.
92B70-92F70 -список блоков расширпамяти,
92F70-92F74 -для поиска своб метки,
92F74-93000 -свободны,
93000-9F000 -диски-файлы,
95700-95EFF -таблица кнопок,
9F000-A0000 -стек,
за текстом -таблица меток.
буфер фрагмента текста в расширпамяти,
В начале всех текстов - данные:
опознаватель (0)=72,74(rt), имя (2),расшир (A),длина текста (D)=41,
адр листа (11),курсора (15),AL1 (19),AK1 (1D),AL2 (21),AK2 (25)=40.
При запуске редактора текст загружается именно по этим данным.
На экране в предпоследней строке - исполняемые команды,
в последней строке: адр конца текста, адрес листа, адр курсора,
длина строки с курсором,
в конце последней строки - имя рабочего текста (не файла).
Команды языка.
Трансляция текста программы проходит в два прохода. Первым проходом составляется
таблица адресов меток. Метка записывается как Mxxx (M с трехзначным шестнадцатеричным
числом; их может быть 4096 штук). Вторым проходом пишется сама программа.
Имеются такие регистры процессора:
AX,CX,DX,BX,SP,b,c,d -шестнадцатиразрядные,
AL,AH,CL,CH,DL,DH,BL,BH -восьмиразрядные,
:D, :C, :E, :F, :G, :S – сегментные,
Чтобы получить 32-разрядные, перед операцией с данными 16-разрядных регистров
поставить код `66 или знак “,
R-числа всегда 32-разрядные, с именами от R00 до RZZ,
r-числа – вещественные, одинарной точности.
sh1234 - означает содержимое памяти в ячейке 1234,
sMxxx - содержимое памяти на метке Mxxx,
Операции с регистрами и R-числами:
[A [B [C [D [:E [b [c - в стек (R-числа не используют),
]A ]c ]:D -из стека,
(AX (AL )AH (sM000 -увеличить-уменьшить на 1,
Jxxx -переход на метку с номером xxx +/-32000кб,
jxxxx:xxxx -переход далеко (первые 4 цифры - смещение, вторые - сегмент),
Pxxx -в подпрограмму,
pMxxx - вызов программы, сделанной под прерывание как подпрограммы,
pxxxx:xxxx - в далекую подпр (первые 4 цифры - смещение, вторые -сегмент),
=xxx -переход, если равно,
#xxx -не равно,
>xxx -больше, или равно (флаг CF=0 - нет переполнения),
<xxx -меньше (флаг CF=1 - переполнение: можно использовать при любых
переполнениях при вычитаниях и сложениях (но не инкр и декр)),
Mxxx -метка с шестнадцатеричным номером; при трансляции повторяющиеся метки и метки
данных, используемые, как адрес перехода, считаются ошибкой,
AX,BX CX,shEB12 sh1234,b -передача,
AX,H1234 BL,h12 -положить равным числу (надо было бы писать ax=h1234, но у меня тогда
«равно» было под другим соусом),
BL,'Ё sM000,"ЧУ -положить равным коду знаков,
c,Д12345 -положить равным десятичному числу (5 знаков не более 65535),
AL?AH -сравнение,
c+H1234 -сумма,
sd-h05 -разность,
sM123%DH -обмен (sM, sh - всегда первые),
DS,AX -передача в сегментный регистр,
:E :C :D :S :F :G -префиксы замены,
sh1234oHF000 -оставить в первом операнде биты второго операнда (логическая команда),
AXoAX -проверяет регистр на 0,можно переходить, если =# 0.
AXtb -тестирование бит (если в первом операнде есть хотя бы один бит второго,
можно переходить по #),
CLiCH -инверсия в первом операнде всех бит, установленных во втором,
AXiAX -обнуление операнда,
AXdM123 -дополнение бит первого операнда битами второго,
CX{h01 -сдвиг влево не циклический (умножение на 2^n),
b}h55 -сдвиг вправо,
sM000[h12 -сдвиг влево цикл,
AL]h05 -сдвиг вправо цикл,
c}CL -сдвиг не цикл вправо на CL бит,
AH[CL -сдвиг цикл влево на CL бит,
sM123}h10 -сдвиг вправо не циклический (деление на 2^n),
ALрDX , AXрDX -из порта в DX,
DXрAL , DXрAX -в порт в DX,
Дальше идут часто используемые подпрограммы, оформленные, как прерывания:
K -выдает в AX скенкод и код нажатой клавиши,
W -выход из программы в REDER с проверкой стека, при выходе курсор стоит там,
где был до пуска программы, чтобы выйти с изменением положения курсора,
укажите адрес курсора в RAK; если стек при работе программы изменился, будет
выдано предупреждение,
L1 -печать на мигающем курсоре содержимого AL,
L2 - -"- AX,
L4 - -"- EAX,
LA - -"- знака в AL для текстрежимов, BL - цвет знака в графрежимах
(для графрежей лучше воспользоваться VA).
La - -"- знаков в AL с атрибутом в AH в кол-ве в CX,
LB - -"- AL побитово,
LД - -"- AX десятичное,
Lд - -"- -"-,
LT -печать текста с адреса в AX до точки, смотрите оператор T,
Lt -распечатать текст по адр d:G,
LP -выдать код в AL на принтер,
LF -распечатать на принтере число в AL,
Ld -распечатать число в AL по адресу E:d.
LO -очистить экран,в AX,BL - цвет экрана.
Lo -очистить строку от курсора и до конца; курс не долж стоять в нач строки.
LRXX -распечатать число R,
LИ -распечатать число И,
!xxxx -смещение меток относительно начала программы в текущем сегменте
(иногда надо сместить абсолютное значение меток);
@ -отмена выравнивания по адресу (транслятор автоматически ставит метки на
четные адреса, вставляя, если надо, перед ними `90 (NOP). Иногда, если метка
находится внутри данных, выравнивание испортит данные.Поэтому вводится команда
отмены выравнивания, которая действует только на одну следующую за ней метку),
T -в программу впечатывается текст, идущий далее до точки (T Привет!.),
можно вместо знаков вписать коды со знаком "`" (`0D -в начало строки,
`0A -в следующую строку,`08 -на шаг назад,`0C -очистка до конца строки,
`0B -в начало следующей строки,`07 -звонок,`09 -впечатывает 8 пробелов,
`0E -шаг вперед,`0F -вверх,`06 -под начало предыдущей строки)
знак конца строки тоже будет впечатан, а если надо от него избавиться,
после него поставить`08 и нужный знак), этот текст выводится на экран с помощью
оператора LT,
t -печать на экране текста, следующего дальше до точки (см. оператор T),
* -умножение AX на DX, результат в DX(старшие 2 байта):AX(младшие 2 байта),
/ -деление DX:AX на CX, AX -частное от деления ,DX -остаток; частное должно
уместиться в AX, иначе -прерывание по переполнению,
UR -растяжка (длина в AX),
Uр -просмотр текста (E:BX - начало, все сохраняется),
Uk -очистка буфера клавиатуры,
UH -пошагово; после него указать переход на проверяемую программу;
ставит пошаговый флаг, который вызывает прер 3 (см. команду n);
при :S sh30BF=0, каждый шаг идет через клавиатуру;
при :S sh30BF=1, без задержек,
при :S sh30BF=2, шаги - без остановки до появления обращений к портам и
прерываниям с растяжкой 2 секунды,
при :S sh30BF>=3, остановка через клаву при обращении к портам и прерываниям;
в районе h30000 записываются все операции по 4 байта на каждую;
(Пример пошагового просмотра чтения с диска через`CD`13:
UH [:E[F[:C AX,M000 [A
:S sh30BF,h00 AX,H5000 ES,AX AX,H0201 BXiBX CX,H4001 DX,H0000
`EA`14`94`00`F0
M000 ]:E]F W
Можно трассировать коды любой программы;
первая строка -адрес, вторая -ближайшие коды, третья -дизассемблер,
дальше - регистры; стрелками вправо и влево можно двигаться по программе;
нажатие любой приводит к выполнению одного кода; выход "S",
US -случайное; вход - RSL, выход RSL и "AX,
UM -получить в c и d смещение мышки соотв по X и Y знаковое,
в b - флаг клавиш мыши: b=1 -левая клавиша нажата,b=2 -правая нажата,
b=4 -центральная клавиша нажата,b=0 -клавиши не нажаты.
Ur -расширенная память (R00 -откуда, R01 -куда, R02 -сколько переслать в
абсолютных величинах),
-последующий текст программы транслируется под защищенный режим;
-отмена трансляции под защищ реж;
Us -командная строка (в районе по умолчании=95F0)
можно редактировать строку длиной не более h20 символов
клавишами-стрелками, DEL, <забой>, автораздвижка,
<F12> -новая запись, клавишами <вверх><вниз> можно вызывать команды, записанные
в комстроку раньше, при повторном вызове комстроки оператором Us все команды
(7 первых) сдвигаются вверх на h20 адресов),
<F2> -дисковый каталог (код кнопки D1); <F3> -таблица символов;
выход Ok - при нажатии <ВК> (на выходе AH=0; код кнопки D0),
выход Esc - при нажатии <Esc> (на выходе AH=1; код кнопки D2);
UT -таймер; CL -команда (00 -поставить период: AX -период прерывания в сек,
01 -поставить будильник: AH -часы, AL -минуты,
02 -снять разрешение прерыв CMOS), E:BX -обработчик прерыв.
Ut -пересылка из c:E, в d:G, b(32) сколько; автоматически изменяет направление
пересылки, если области совпадают; b не изм, c:E и d:G в концах пересылки.
UK -записать в буфер клавиатуры скенкод (AH) и код символа клавиши (AL),
если на выходе AL=01, буфер заполнен.
UP -выделение памяти объемом RRR; на выходе если AH=0, AL -номер блока (0-7F),
RRP - его адрес; если AH#0, AH -номер ошибки.
UU -удаление блока выделенной памяти с номером AL; AH -номер ошибки, если AH#0.
Up -показать значения блока памяти с номером AL; на выходе RRP -адр, RRR -объем,
UI -чтение файла с именем по адресу 95F00 в расширпамять;
если прочитал - AH=0, AL - номер блока выделения памяти;
если нет - в AH номер ошибки,
UO -запись файла с именем по адресу 95F00 из блока AL расширпамяти;
если записал - AH=0,если нет - в AH номер ошибки,
UZ –системный динамик; AX -частота, RZZ -длина (10000000 соответствует 15
секундам),
UG -джойстик; c,d -X,Y; b -акселератор; биты 0-3 в AL - кнопки - соотв
задняя, нижняя, верхлев и верхправ,
UW -вставить текст c:E до b в текст редактора с курсора с раздвижкой;
курсор за вставкой,
UF -RELPHI, создание объектов, требующих выбора местоположения на
экране: окон, кнопок, рамок и обращений к файлам; находится с адр h70000;
после создания любого объекта выходит в Редактор,
ZA -чтение знака и атрибута на курсоре в AX в текстрежимах,
AL- код знака в графрежимах,
Zk -чтение положения курсора в DX и его положения в матрице в CX,
ZK -проверка нажатой клавиши (тоже, что K, но без остановки),
Zs -сканер Genius (CX -кол-во байт пересылки, BX -смещение,
AL -страница (0-9),AH -режим:
00 -в строке памяти 80 байт для любого режима,
04 -включить прерывание,10 и 20 -в строке 40 байт,
30 -в строке 1C8 байт (полное окно в режиме 400 dpi),
80 -в строке 9E байт (см подпр сканера),
Можно нажать любую клав для выхода. В CX будет остаток счетчика байт.
k -вывод текстового курсора в позицию DH -строка (0-3C), DL -столбец (0-79),
ZC -чтение из c:E 2-х текстовых цифр в CL, если AH=0, число считано правильно.
Zc -чтение из c:E 4-х текстовых цифр в CX, если AH=0, число считано правильно.
ud -чтение-запись файла по имени по адр c:F на адр BX:E CX (32) байт;
команда в AH:
бит 0 (1): 0 - с начала,1 - продолжить (после чтения в b - номер
следующего кластера; если продолжить запись - идет поиск последнего кластера
программы, а затем дописывание своб кластеров);
бит 1 (2): 0 - чтение,1 - запись;
бит 2 (4): 1 - удалить файл;
бит 3 (8): 1 - записать только текущий каталог (DL -ном диска);
если AH=0 - выполнено, если нет - в AH код ошибки, d:G - адрес расшифровки кода
ошибки, в CX - остаток, в BX:E - адр за блоком пересылки, в b - следующий
кластер, если не закончено или 0,если закончил;
в :G sh009A хранится адрес записи файла; 9309E -номер текущего диска;
стек каталогов хранится в блоке данных системы с 93040 и 96040 для м и
ждисков, при увеличении числа вложенных подкаталогов их адреса (в сегментах
93000 и 96000 соответственно) записываются в следующий адрес и этот адр
становится адр текущего каталога, стек 16-местный,
номер места хранится в 93080 и 96080,буфер имен нах 93000/93040 и
96000/96040 (64 знака на имя); для всех дисков ограничение на корнкаталог
1200h байт (90h записей); сумарно на всю цепочку подкаталогов для ждиска
дается 8700h байт (до адреса 9FE00) (438h записей, т.е. 1080 штук);
uD -длинное чтение-запись; команда в DH, AX секторов с CX (32) сектора диска
с номером в DL на адрес BX:E; если получилось - AH=0;
в BX:E - адр за концом блока.
ur - чтение r-числа из текста в c:E до любого не цыфрового знака в r<> не
более 6 знаков; если получилось AH=0; c:E - на последнем считанном знаке.
Y -поиск ( с GS:[0000] до <ВК> -слово, с ES:c EBX байт -область поиска,
нашел, если EBX#0, ES:c -адр найденного слова, в EBX -сколько осталось
до конца),
N -вписывает код 90 (NOP),
n -вписать код CC ( прерывание по вектору 3, распечатывает состояние регистров
в данном месте); если :S sh30BF=0 (по умолчанию),- режим с остановкой, иначе -
остановки после печати не происходит; можно ставить в любом месте программы для
просмотра состояния системы; ничего не меняет ни в регистрах, ни во флагах,
VG1 -в реж 12,640*480*16.
во все режимах ставится ES=A000,
930A6 -номер режима,930C8 -число точек по горизонтали,
930CA -число точек по вертикали,930CC -кол-во цветов,
устанавливаются константы для объемного рисования.
VG2 -в реж 58,800*600*16.
VG7 -в реж 22,800*600*16000000, :S sh30CC=CCCC.
VG8 -в реж 21,640*480*16000000, :S sh30CC=CCCC.
VT0 -текстовый реж 3 - 80 (h4F) знаков в строке, 25 (h19) строк,
VT1 -т реж 1 - 40 (h28) знаков в строке, 25 строк,
VT2 -т реж 23 - 132 (h84) знаков в строке, 60 (h3C) строк,
VP -запись пикселя в любом режиме, CX - X, DX - Y,
AL -цвет 0-0F для 16-цветного,0-FF для 256-цветного;
AX -цвет для 64000-цветного; AX и BL для 16000000-цветного режимов.
VS -чтение пиксела в любом реж (см. предыдущее).
Vk -вписать в яч экрана с коорд в DX знак в AL с цветом AH (текстрежимы),
VK – окно каталога; двойной щелчек по файлу вызывает закрытие окна и записывание
в буф комстроки имени файла; двойной щелчок по подкаталогу открывает
подкаталог;
выход из подкат -дв щелчок по файлу . или ..;
выход - щелчок лев кн мыши за окном или Esc;
F1 и правая кн мыши -сервис; требует для работы 1 страницу памяти..
VC -установить цвета фона (AX,BL по адр 930F4-F6)
и знака (CX,BH по адр 930F7-F9); для 10-цветного реж дост указать AL и CL,
VV -точка в объеме: Указать на входе rXV, rYV, rZV -коорд точки.
На выходе в DX -строка, CX -столбец точки на экране, можно сразу применять VP.
rXG и rYG - коэф центра (горизонт) указывается автоматически при запуске
графрежима (центр экрана); rZG -расстояние от экрана до глаз =3*rYG;
VL -начертить линию, RX1 и RY1, RX2 и RY2 -коорд начала и конца, в AX-BL цвет,
VZ -закраска области (только 24-битный цвет); CX-DX -коорд точки;
AX-BL -цвет закраски; b-BH -цвет границы; требует 1 страницу памяти.
VA -распечатка знака в AL в графрежимах: на графкурсоре с коорд в 930FA,
930AE - адрес буфера страницы; цвет фона и знака определяется командой VC,
VO -запись рис BMP (16,256,64000 или 16млн цв) в файл с именем по адр 95F00,
DX(y)-CX(x) - лев верхний угол, d-c - высота и длина рисунка;
требует для работы 1 страницу памяти.
VI -чтение рисунка BMP из файла с именем по адр 95F00;
DX(y)-CX(x) - лев верхний угол;
если получилось, на выходе AH=0, AL -число цветов, c/d -длина/высота изобр;
требует для работы 1 страницу памяти.
VM - вывод на экран объекта, записанного по адресу c:F, первые 2 слова которого
означают высоту и ширину объекта, затем -сам объект
с числом байт=длина*ширина*3, а сразу за ним помещается буфер равный объему
объекта для запоминания фона, который при сдвиге объекта тут же вернется на
место, CX и DX - новый адрес верхнего левого угла объекта,
RVM=(CX)(DX);
Пример:
Ug VG7 AX,H8888 BL,h88 LO AX,H5555 BX,HFFFF CX,HFFFF VC
DX,H0010 CX,DX UM
M000 UM DX+d CX+c c,M001 AX,CS FS,AX VM J000
M001`05`00`05`00
`FF`FF`FF`FF`FF`FF`0F`0F`0F`FF`FF`FF`FF`FF`FF
`FF`FF`FF`FF`FF`FF`0F`0F`0F`FF`FF`FF`FF`FF`FF
`0F`0F`0F`0F`0F`0F`0F`0F`0F`0F`0F`0F`0F`0F`0F
`FF`FF`FF`FF`FF`FF`0F`0F`0F`FF`FF`FF`FF`FF`FF
`FF`FF`FF`FF`FF`FF`0F`0F`0F`FF`FF`FF`FF`FF`FF Точки с цветом FF (AL=FF для
многоцветных) не запоминаются и не выводятся на экран.
Объект лучше всего рисовать в графредакторе ГРАФ на фоне FF с увеличением.
После последнего включения VM в RVM останется адрес последнего положения
объекта. Перед новым запуском VM для профилактики надо унести RVM куда-нибудь
подальше с экрана: RVM=55555555 VM.
VW -окно; DX -верхлев угол (как курсор), CX -(высота, длина) в знаках,
VC -цвет знака и фона, AX:D -адр текста;
на выходе -AL -номер окна (не больше 4); требует для работы 1 страницу памяти.
Vw -убрать верхнее окно; на выходе -AL -номер убранного окна;
требует для работы 1 страницу памяти..
VЦ – выбор цвета в спецокне; выбор цвета мышкой или клавишами 1-2-3 (уменьшить),
4-5-6 (увеличить);
в AH- зеленый, AL- синий, BL- красный;
прав кл мыши выбирает цвет, но не выходит из выбора; лев кл мыши выбирает и
выходит; Esc и <ВК>-выход; требует для работы 1 страницу памяти.
VЗ -выбор знака мышкой; на выходе (Esc и <ВК>) -в AL код 1-й таблицы, если
AH#00, и код 2-й таблицы, если AH=0; требует для работы 1 страницу памяти..
Vm -ожидание нажатия клавиши или кнопки мыши; выдает в AX клавишу, в b кнопку,
если AX=0; в DX -координаты текстового знака (Y,X),над которым находится мышь;
RMM=(X)(Y) (чтение/запись) - коорд мыши в пикселях.
VU -поворот координат rXV, rYV и rZV вокруг оси X (если AH=0), оси Y (если
AH=1), оси Z (если AH=2) со смещением по двум другим осям rYS или rXS,или rZS
на угол rUG (в радианах); если AH>3, поворота нет; изменяет только rXV,rYV и
rZV; необходимо после вывода точки возвращать старое значение этих чисел;
применяется перед VV,
VB -кнопка; на входе: AL- ее индивидномер; AH- команда: 0- инициализация
(DX,CX- коорд верхлев угла, d,c- длины вертик, горизонт), 1- свободна, 2-
нажата, 3- удалить, 4- удалить все кнопки, 5- строковая кнопка ;
использует память h95700-95EFF,
Vb –проверка нажатия кнопки мышкой; на входе: RMM=(X)(Y); на выходе: AL- номер
нажатой кнопки при AH=0,
VQ -рамка; DX,CX -верхлевугол (Y,X), c,d -длина и ширина,
R-числа:
RXX=RYY+RFF-RBB*RCC/RDD}RTT()%REEoRUUdRKKiRWW[01=12345678
и тд, как и для обычных регистров, но в одной строке, без разрывов, все операции
производятся над EAX, так что после любой операции в EAX находится результат,
при этом изменено будет только первое число R в ряду,
сначала указать в GS буфер для R-чисел; числа могут быть с кодами от `30
до `7F в номере, т.е. R00-RZZ, ^ -корень кв ,увеличение и уменьшение на 1 ()
производятся только над предыдущим числом R,
распечатка оператором LRxx,
RXX=c -положить число равным c (с c можно делать все операции R-чисел),
\ -деление без обнуления EDX, / -деление с обнулением EDX,
после любого корня кв, деления и умножения EDX теряется,
корень кв -подпрограмма REDERа и в самом REDERе использоваться не может,
остальные операции независимы,
s -синус:
при R00=0 с периодом h44000 R00s=0, при R00=22000
с периодом h44000 R00s=8400, чтобы получить косинус, достаточно к R00+h11000,
RCO=RCOs RSI=RSI+00011000s R00=RY0*RSI/00004200-RY0
в R00 будет произведение числа RY0 и синуса числа RSI,
Д -преобразование R-числа в десятичное: R00Д,
Ш -преобр R-числа в 16-ричное: R00Ш,
И -R-числа с адресом в BX, подчиняются всем правилам R-чисел: И=12345678 И^
И=И*55555555; распечатка оператором LИ,
90000-91CF0 -буф R и r-чисел,
R-числа занимают те же адреса памяти, что и соответствующие им r-числа,например:
R00 занимает те же 4 байта, что и r00. В программах нельзя использовать
системные R-числа: RAK,RAL,RKT,RBT,RRR,RRP,RVM,RMM,RXG,RYG,RZG,RVG,
RXG,RYG,RZG,RSH и числа с именами, состоящими из комбинаций знаков <>?:=;_][^\.
Имена ZZ,SL,SH,XS,YS,ZS,XV,YV,ZV,UG,00,01,02,X1,X2,Y1,Y2
используются для связи с подпрограммами.
r00-rZZ - вещественные числа FPU:
rAX=r01+123.5e05*R55/p-b?r12btasc|zk^(1+(1+(1+r00^)))d^L
90000-91CF0 -буф R и r-чисел,
r-числа занимают те же адреса памяти, что и соответствующие им R-числа,
например: R00 занимает те же 4 байта, что и r00. В программах нельзя использовать
системные r-числа:
rAK,rAL,rKT,rBT,rRR,rRP,rVM,rMM,rXG,rYG,rZG,rVG,
rXG,rYG,rZG,rSH и числа с именами,состоящими из комбинаций знаков <>?:=;_][^\.
Имена ZZ,SL,SH,XS,YS,ZS,XV,YV,ZV,UG,00,01,02,X1,X2,Y1,Y2
используются для связи с подпрограммами.
Число может быть представлено 6-ю значащими 16-ричными цыфрами со знаком "-"
и без, со степенью после e не более 1Fh и со знаком "-" и без, с точкой и без,
с целым нулем перед точкой и без,одной точкой.
Операции выполняются последовательно, без приоритетов, если нет скобок.
Например, r00=r01+r02*r03 означает r00=(r01+r02)*r03
Операции могут производиться с другими r-числами и с целыми R-числами и
32-битным содержимым регистра b (команда b после операнда загружает b
результатом, а b после знака операции +,-,*,/,? служит операндом),с числом PI
(операнд p), с числом log(2)e (v), со случайным (S (+/-1)).
Без операнда обходятся операции sin (s),cos (c),tg(t),
art (a),корень кв (^),модуль (|),изменение знака (z),квадрат (k),
округление (o),представление числа дробью (d), команда 2A-1 (w),
команда Y*log(2)X (l).
Операция FYLXX (l) Y*log(2)X: r02=1 r00=r01l, где r01 - X (положит), r02 - Y;
Y (r02) обязательно должен быть установлен перед операцией.
Чтобы извлечь из r01 натурлогарифм log(e)X: r02=1 r00=r01l/v;
или положить r02=1/v r00=r01l.
Возведение любого числа в любую степень XB: X - rXX, Y - rYY,
rYY=хх r00=rXXlb-b CX,b "b,H0001`00`00 "b{CL r00w+1*b .
Случайное <1 плохо получается, если вписать функцию типа
r00=r00skd| .Первое r00 не должно равняться 0. Операнд S дает неравномерное
распределение +/-1 (выпадают все числа от -0.1 до +0.1. Избавиться от этого
можно с помощью ряда -0.1*1.1 .В этом операнде применяется команда представления
числа дробью, которая одробляет все предыдущие вычисления в формуле. Поэтому
лучше применять S в скобках: r00=88*(S).
Знак конца строки или пробел являются концом формулы.
После них идут другие команды программы, в т.ч. переходы по условию.
Все значение в скобках является операндом для предыдущей операции. Вложение
скобок может быть не более 6-ти. Если производится сравнение результата со
скобкой, отношение будет повернуто, необходимо будет изменить условие перехода
на противоположное.
Распечатка r-числа L и его чтение из текста Zr входят в строку как обычные
команды.
ПОДПРОГРАММЫ для примера.
'очистка буфера клавиатуры.
M000 AH,h01`CD`16 =001 AH,h00`CD`16 J000 M001.
'выдать код в AL на курсор.
[A[c[d[b[B`B4`0E`BB`07`00`CD`10 ]B]b]d]c]A.
или: AH,h0E BX,H0007`CD`10.
'звук.
'установить верхнюю границу частоты. AL,hB6 `E6`43
'установить частоту.AL,h00`E6`42 AL,h04`E6`42
'поставить биты 0 и 1 порта 61- включить динамик и таймер. `E4`61 ALdh03`E6`61
'длительность. AX,H01FF M000 )AX AX?H0000#000
'выключить. ALohFC`E6`61.
(книга 1, стр. 332, тбл 8.22 и 8.24)
'диск (прерывание 13 BIOS): AH-команда (2-чтение,3-запись,4-проверка секторов,5-форматир),
AL-число читаемых секторов (1-9), DL-номер дисковода (0-1),
DH-номер головки (0-1),
CL-первый сектор (1-9), CH-дорожка (0-4F), ES:BX-область передачи,`CD`13
AH=00, если все в порядке.
'порты.
ALрDX (EC), AXрDX (ED) -из порта в DX; DXрAL (EE), DXрAX (EF) -в порт в DX.
`E4`60 -'AL из порта 60. `E5`F8`03 -'AX из порта 3F8.
`E6`61 -'AL в порт 61. `E7`F8`03 -'AX в порт 3F8.
'джойстик.
Записать в любой из портов 200-207 (все одинаковые) любое AL и циклом ждать
исчезновения битов в этом порту. Бит 0 - X, 1 - Y, 2 - мой дж не использует,
4 - акселератор. Число циклов ожидания определяет величину отклонения оси.
Кнопки ожидания не требуют и определяются битами 4-7 того же порта.
'мышка COM1 (книга 1 т.2, стр 285).
AX,H0000 ES,AX c,H0030 :E AX,sc :E sc,M000
:C sM010,AX (c(c :E AX,sc :C sM011,AX AX,CS :E sc,AX
DX,H03FB AL,h82 DXрAL DX,H03F8 AX,H0060 DXрAX
DX,H03FB AL,h02 DXрAL DX,H03FD AL,h60 DXрAL
DX,H03FA AL,h01 DXрAL DX,H03F9 AL,h01 DXрAL
DX,H03FC AL,h0B DXрAL DX,H03FE AL,h00 DXрAL `E4`21 ALohA8`E6`21
M001 `E4`60 AL?h39#001
AX,H0000 ES,AX c,H0030 :C AX,sM010 :E sc,AX (c(c :C AX,sM011 :E sc,AX W
'адр прер мышки.M000 [D[A DX,H03F8 ALрDX L1 DX,H03FD AL,h60 DXрAL
AL,hF0`E6`20 ]A]D`CF M010NN M011NN
Порт 21h, прикрывает прерывания внешних портов. Например, один из
установленных битов затрудняет связь с флоппи, а другой - с клавиатурой.
COM1 прикрывается битом 10h. Достаточно снять его, чтобы мышка ожила.
В MOUSE.COM все гораздо сложнее: начиная с порта A01h вверх ищется порт,
который после передачи 91h в порт +2 и 11h в него самого выдает обратно 11h.
Первый такой -EF9.
Потом FF в 21-й порт. Потом последовательно в 21-й порт передаются,F8,F4,EC,DC,
а в EFA -80h с большой растяжкой, пока не появится прерывание из COM1,а когда
появится, в 21-й возвращается его прежнее значение B8h,а в порт 20 -20h.
Мышка COM1
при движении выдает прерывания, по 3 штуки в серии, но не более 80 штук
в секунду. При быстром движении второе и третье прерывания служат для указания
кол-ва сдвигов мышки, произошедших за 1/25 секунды. Если в первом байте (первое
прерывание) есть только бит 6 (h40) и третий байт (третье прерывание) равно
нулю, мышка движется вправо медленно. Второй байт (второе прерывание) дает число
сдвигов. Если второй байт равен нулю, а третий нет - мышка движется медленно
вниз, и третий байт показывает число сдвигов. Если в первом байте есть биты 0 и 1 (h43),
мышка движется влево. Показания второго байта вычесть из h40 - это число сдвигов влево.
Если в первом байте есть биты 2 и 3 (h4C),мышка движется вверх, содержимое третьего байта
вычесть из h40 - сдвиг мышки вверх. Если в первом байте из двух нижних бит есть
бит 0 (h41),мышка движется вправо быстро.
Прибавить к сдвигу мышки вправо h40 и значение 2-го байта.
Тоже сделать, если из 2-х верхних бит 1-го байта есть только 2-й (h44)
при движении мыши вниз. Если есть только биты 1 или 3 (h2 или h8) 1-го байта,
мышка движется влево или вверх слишком быстро. Отнять от нужного байта смещения
h80, получится нужное отрицательное смещение. Если есть бит 4 (h10) 1-го байта,
нажата правая кнопка мыши. Если есть бит 5 (h20) 1-го байта, нажата
левая кнопка. Средняя кнопка ставит бит 6 (h40),поэтому ее можно отличить от
сдвигов только, если мышь не движется (2-й и 3-й байты нулевые),нет сдвиговых
прерываний. При отпускании все 3 кнопки ставят только бит 6,что тоже можно
определить при неподвижном шаре. Все эти операции делает оператор UM REDERа.
Мышка PS/2: инициализация вектора 74:
[:E c,CS ES,c BX,M034 AX,HC207`CD`15 ]:E
AX,HC200 BH,h01`CD`15 sh01D0,M034 sh01D2,CS
На метке M034 пишем обработчик прерывания, в котором обязательные компоненты:
`FA"[V`E4`60 'данные прерывания.
AL,h60`E6`64 AX,H4000 M122 )AX#122 AL,h47`E6`60 AL,h20`E6`A0`E6`20"]V`FB`CF
Выдается сериями по 3 прерывания. В первом - биты 0,1 и 2 - кнопки мыши
(соотв левая, правая и средняя), бит 3 - флаг движения, бит 4 - движение влево,
бит 5 - движение вниз. Второе и третье прерывание дают смещение
(см.M034 в ZN.T). Скорость и точность можно установить через прерывание `15 BIOS.
'изменение цвета окаймления без прерывания (книга 4,стр 31).
`FA DX,H03DA ALрDX DX,H03C0 AL,h11 DXрAL J000 M000 AL,h01 DXрAL
DX,H03DA ALрDX DX,H03C0 AL,h20 DXрAL `F1
Странное J000 M000 означает сброс очереди в видеопроцессоре.
'видео.
VG0 (реж 13) соответствует: [A[D AX,H0013`CD`10 DX,H03CE :C shE076,h00
AX,H4005 DXрAX AX,H0003 DXрAX AX,H0000 DXрAX AX,H0001 DXрAX AX,H0002 DXрAX
AX,H0004 DXрAX AX,H0506 DXрAX AX,H0F07 DXрAX AX,HFF08 DXрAX ]D]A`CB
VG1 (реж 12): [A AX,H0012`CD`10 :C shE076,h01 ]A`CB
VT0 (реж 3): [A AX,H0003`CD`10 :C shE076,h02 ]A`CB
VT1 (реж 1): [A AX,H0001`CD`10 :C shE076,h03 ]A`CB
VP0 (запись пиксела в реж 13): [A[B[D[c BL,AL DX?H00C8>496 CX?H0140>496
AX,H0140 * AX+CX c,AX :E sc,BL M496]c]D]B]A`CB
VP1 (запись пиксела в реж 12): [B AH,h0C BH,h00`CD`10 ]B`CB
VL0 (чтение пиксела в реж 13): [D[c AX,H0140 * AX+CX c,AX :E AL,sc ]c]D`CB
VL1 (чтение в реж 12): [B AH,h0D BH,h00`CD`10 ]B`CB
'Расширенная память.
'включить активность линии A20. DX,H0092 ALpDX ALdh02 DXpAL
'отправить смещение в шлюз прерываний. AX,M009 :C sM008,AX
'составить табл прерыв. AX,H3000 GS,AX c,H0000
M020 :C AX,sM008 :G sc,AX (c(c :C AX,sM010 :G sc,AX (c(c
:C AX,sM011 :G sc,AX (c(c :C AX,sM012 :G sc,AX (c(c c?H0900<020
'составит табл дескрипторов. AX,H2000 GS,AX c,H0008 BX,M000
M021 :C AX,sB :G sc,AX (BX(BX(c(c BX?M006<021
'запретить прерывания.`FA
'загрузить регистр глоб дескр табл. BX,M006 :C`0F`01`17
'загрузить регистр глоб дескр табл прерываний. BX,M007 :C`0F`01`1F
'войти в защищенный режим.`0F`20`C0 AXdH0001`0F`22`C0 J013N
'сброс очереди,перезагрузка сегментных регистров.
M013 AX,H0008 DS,AX AX,H0018 SS,AX
`66 c,H0000`20`00 `66 d,H0000`00`00 'c не может быть меньше 1C0000.
M016'переслать в расш память. `67 `8B`07 `67 `89`06 `66(d`66(d`66(c`66(c
`66 c?HF000`3F`00 <016
M017 BX,M015 :C`0F`01`1F `0F`20`C0 AXiH0001`0F`22`C0 `FB KW
M000'дескр сегм данных. `E8`03 'предел.
M001 `00`00 'база.
M002 `00 'база.`92 'байт прав доступа для сегмента данных R/W.
M003 `80 'предел и GDXU. `00 'база.
M004'дескриптор сегмента кода. `E8`03`00`00`00`9E`80`00
M005'дескриптор сегмента стека.`E8`03`00`00`00`96`00`00
M014'дескриптор сегмента кода. `10`00`00`00`00`9E`80`00
M006'GDTR. `27`00`00`00`02`00
M007'IDTR. `FF`07`00`00`03`00
M008'шлюз прерывания. NN 'смещение.
M010 `10`00 'селектор для сегмента кода.
M011 `00`EE 'права.
M012 `06`00 'смещение.
M009'обработчик прерываний.`CF
M015'IDTR для выхода. `FF`07`00`00`00`00
Часы:
Реального времени:
В порт 70 подается адрес (номер) рабочих портов, а из порта 71 получают (или
передают) данные в рабочий порт.
Список и назначение рабочих портов смотри в справочнике "Средств" таблицу 7.49.
Для адреса в порту 70 используется только 6 первых бит (0-5), 6-й бит
резервирован, 7-й - маска немаскируемого прерывания NMI (0 - маскировано,
1 - разрешено.
Через порт 71 можно поставить будильник, провести диагностику CMOS и всей
машины, определить оборудование и память.
Прерывание часов реального времени:
Засылка в порты 20 и A0 перед прерыванием от устройств и в обработчике
прерываний числа 20 разрешает дальнейшие прерывания от устройств;
бит 10 в порту 0B CMOS разрешает прерывания при изменении (модификации)
времени (секунд), но прерывание состоится только после чтения порта 0C CMOS;
следующая программа каждую секунду выводит на курсор букву C.
AX,H0000 ES,AX `FA c,H0070 c{h02 :E sc,M000 AX,CS (c(c :E sc,AX`FB
AL,h20`E6`20`E6`A0
DX,H0070 AL,h8B DXpAL (DX AL,h12 DXpAL )DX AL,h8C DXpAL (DX ALpDX
K DX,H0070 AL,h8B DXpAL (DX AL,h02 DXpAL W
M000 AL,'C LA DX,H0070 AL,h8C (DX ALpDX AL,h20 `E6`A0`E6`20`CF
Системные часы:
Таймер прерывается каждые 55мс (18.2 раза в сек).
По адресу 006C:0040 хранится младшее слово,а по адресу 006E:0040 -старшее
слово системных часов,складывающих прерывания таймера.Их значения можно
получить прерыванием`CD`1A при AH=0 - CX -старшее,DX -младшее слово.
Запретить прер таймера можно установив 1 в порт 20.
Порты A0 и A1 - маска IRQ-прерываний от внешних устройств. Каждый бит этих
портов соответствует своему прерыванию. И если он стоит, то прерывание от соотв
устр-ва невозможно.
Команда прерывания INT (CD) сохраняет в стеке последовательно FL,CS,IP.
Команда IRET (CF) выход из прерывания извлекает в обратном порядке.
Дальний вызов подпр (9A) сохраняет CS и IP, а RET (CB) извлекает их в обратном
порядке.
Двигатели дисков C: и D: можно отключить, заслав код E0 в порты 1F7 (для C:)
и 177 (для D:). Тоже делает и код E2. Какой лучше - не знаю. Включаются диски
самостоятельно при вызове.
Программа сканера Genius с выводом на экран в режиме 640*480:
(сделана после пошаговой прогонки `CD`13 и с помощью таблиц 8.20 и 8.21
для DMA "Средств").
AL,h00`E6`08
AL,h45`E6`0C NNN `E6`0B NNN 'выбор записи для 1-го канала DMA.
AL,h10`E6`02 NNN AL,h00`E6`02 NNN 'смещение начала буфера записи.
AL,h02`E6`83 NNN 'страница буфера записи (20000).
AL,h00`E6`03 NNN AL,hF0`E6`03 NNN 'кол-во байт записи F000.
AL,h01`E6`0A NNN 'снять маску.
DX,H02E3 AL,h01 DXpAL 'включить сканер. `FB
M002 `E4`08 ALth02#003 J002 M003 DX,H02E3 AL,h00 DXpAL
'перегнать содержимое буфера 20000 в видеобуфер; сканер присваивает каждому
биту точку на экране; в одной строке 80 байт для любой точности.
BXiBX VG1 AX,HA000 ES,AX cic M000 :E sc,H0000 (c(c c?HF000<000
AX,H2000 GS,AX c,H003F did BX,H0000 M004 CX,H0040
M001 :G AX,sc :E sd,AX (c(c(d(d c?HF000>005 )CX#001 BX+H0050 d,BX
d?HF000<004
M005 KW
'Замена палитры.
VG0 AX,H2000 ES,AX cic M012 :E sc,h00 (c c?H0400<012
cic :E sc,H0000 (c(c :E sc,h00 (c
BL,h03 BHiBH CLiCL P011 (BH P011 (BH P011 (BH P011 BHiBH (CL P011 (BH P011
(BH P011 (BH P011 BHiBH (CL P011 (BH P011 (BH P011 (BH P011 BHiBH (CL P011
(BH P011 (BH P011 (BH P011 BLiBL CLiCL P011 (BL P011 (BL P011
(CL BLiBL P011 (BL P011 (BL P011 (CL BLiBL P011 (BL P011 (BL P011
(CL BLiBL P011 (BL P011 (BL P011 BXiBX P011 (BL P011 (BL P011 BLiBL (BH P011
(BL P011 (BL P011 BLiBL (BH P011 (BL P011 (BL P011
AX,H1012 BX,H0000 CX,H0100 DXiDX`CD`10 AX,HA000 ES,AX
'подпр вывода на экран BH строк квадратов цветов по BL штук в строке,
с промежутком b,высотой d,длиной c,с началом в точке DX/CX.
DX,H0018 CX,H0010 c,H0010 d,H0008 BX,H1010 b,H0002 P000 KW
M000 ALiAL M004 [D[C[B M003 [d[D M002 [c[C M001 VP0 (CX )c#001 ]C]c
(DX )d#002 ]D]d (AL CX+c CX+b )BL#003 ]B]C]D DX+d DX+b )BH#004.
M011 AX,BX DX,H0003 * b,AX AL,CL AHiAH DX,H0003 * DL,AL d,H0007 AX,b DH,DL
M005 :E sc,AL (c :E sc,AH (c :E sc,DH (c AX+b DH+DL )d#005.
VGA
Если в установках BIOSа после включения компьютера в строке Video ROM Shadow
установлено Enabled,то видеопрограмма BIOS копируется в ОЗУ. При этом,
вывод на экран становится быстрее,тк ОЗУ работает быстрее ПЗУ.
Через порт данных видеоконтроллера H3D4 можно переводить монитор на
пониженное энергопотребление. Этот порт содержит H19 регистров управления
разными параметрами развертки. Регистр H17 при 1600000 цветах имеет родное
значение E3.Любое малое значение ~0 отключает монитор за 4 секунды.
А родное E3 мгновенно оживляет.
При выборе видеорежима с помощью`CD`10 при установленном 7-м бите AL видеобуфер
не очищается.
В графрежимах (кроме 256-цветных) фон знака установить нельзя.При установленном
бите 7 BL фоном будет цвет экрана,а при не установленном бите 7 - цвет 0.
ЧТЕНИЕ цвета точки
прерыванием`CD`10 AH=0D в режиме 640*480 на старой машине:
AX,HA000 ES,AX c,CX c}h03 AX,H0050 * c+AX CLoh07 AH,CL AL,h09 DX,H03CE DXpAX
:E AL,sc AL,h0A DXpAL (DX ALpDX - в AL - цвет точки CX/DX.
на новой для 16-цветных режимов (12,2B,30,36):
AX,HA000 ES,AX c,CX c}h03 AX,shE07A (кол-во пиксел по горизонтали) AX}h03 *Vc+AX
AL,h00`10`D0 DX,H03D7 DXpAL CLoh07 DX,H03CE AX,H0709 AH-CL DXpAX
:E AL,sc AL,h0A DXpAL (DX ALpDX.
(`10`D0 - AL+DL+переносы)
на новой для 256-цветных режимов 13 и 31 (после умножения shE07A на DX,
'при входе в графрежим. DX,H03CE AX,H4005 DXpAX AX,HA000 ES,AX
'в подпрограмме.
[d[D AX,shE07A * AX+CX d,AX AL,h00`10`D0 AL,DL DX,H03D7 DXpAL
:E AL,sd (байт цвета) ]D]d.
64000-цветные режимы 42 и 43:
'при входе в графрежим. DX,H03CE AX,H4005 DXpAX AX,HA000 ES,AX
'в подпрограмме.
[d[D AX,shE07A AX{h01 *
d,CX d{h01 d+AX AL,h00`10`D0 DX,H03D7 DXpAL :E AX,sd (два байта цвета)]D]d.
16000000-цветный режим 48:
'при входе в графрежим. DX,H03CE AX,H4005 DXpAX AX,HA000 ES,AX
'в подпрограмме.
[d[D AX,shE07A AX{h01 AX+shE07A *
d,CX d{h01 d+CX d+AX AL,h00`10`D0 DX,H03D7 DXpAL :E AX,sd (d(d :E BL,sd
(3 байта цвета) ]D]d.
ЗАПИСЬ точки для старой и новой машин:
16-цветные режимы 12,2B,30,36:
'при входе в графрежим.AX,HA000 ES,AX
BX,CX BX}h03 AX,H0050 * BX+AX AL,h00`10`D0 DX,H03D7 DXpAL
CLoh07 AX,H8008 AH}CL DX,H03CE DXpAX AX,H0205 DXpAX :E AL,sB
AL,h0F'цвет. :E sB,AL AX,HFF08 DXpAX AX,H0005 DXpAX.
256-цветные режимы 13 и 31:
'при входе в графрежим. DX,H03CE AX,H4005 DXpAX AX,HA000 ES,AX
'в подпрограмме.
[d[A[D AX,shE07A * AX+CX d,AX AL,h00`10`D0 DX,H03D7 DXpAL ]D]A :E sd,AL (байт
цвета)]d.
64000-цветные режимы 42 и 43 (AX: первые 5 бит (001F) -синий,
следующие 6 бит (07E0) -зеленый,последние 5 бит (F8) -красный):
'при входе в графрежим. DX,H03CE AX,H4005 DXpAX AX,HA000 ES,AX
'в подпрограмме.
[d[A[D AX,shE07A AX{h01 *
d,CX d{h01 d+AX AL,h00`10`D0 DX,H03D7 DXpAL ]D]A :E sd,AX (два байта цвета)]d.
16000000-цветный режим 48 (AL -синий,AH -зеленый,BL -красный):
'при входе в графрежим. DX,H03CE AX,H4005 DXpAX AX,HA000 ES,AX
'в подпрограмме.
[d[A[D AX,Д00683 d,AX AX{h01 AX+d )AX *
d,CX d{h01 d+CX d+AX AL,h00`10`D0 DX,H03D7 DXpAL ]D]A
:E sd,AX (d(d :E sd,BL (3 байта цвета) ]d.
Плавающая точка:
Вещественные двойной точности имеют 8 байт, из которых 7 бит последнего байта
и 4 старших бита предпоследнего - степень. Нулевая =1023 (3FF).Одинарной имеют
всего 4 байта, из них 7 бит последнего - это старшие 7 бит степени, и 1 старший
предпоследнего - это самый младший бит степени.
Нулевая =127 (7F).Последний бит последнего байта -знак (1=минус).Все остальные
биты -мантисса без первой единицы (эта единица есть в вещественных расширенной
точности).
0 -во всех битах 0.
Сначала номера регистра уменьшается, а потом загружается. Сначала выгружается,
а потом увеличивается его номер.
ST(0) -текущий, ST(1) -предыдущий включенный в стек.
Перед операциями, производящими загрузку в стек, необходимо очистить регистр
ST7 FPU командой`DD`C7.
Команда WAIT`9B (ожидание) необходима только для некоторых команд управления
(см таб 1.9 на стр 171 книги 2 i486).Остальные делают останов до результата
автоматически.
Команда сравнения требует после себя сохранение слова состояния в AX
(`9B`DF`E0) и сохранение AH во флагах процессора (`9E).
Объем (старый):
X=xg+A(x-xg)/(z+A)
Y=yK-(yg+A(y-yg)/(z+A)), где xg и yg -горизонты (коор точки схождения на
экране: xg=shE07A/2, yg=shE07C*.A),
x,y,z -абсолютные коорд в обьеме,
A -расстояние до экрана в пикселях (~shE07A*3).
yK -переворачивающий коэффициент (yK=shE07C-1) нужен, т.к. начало коорд по Y
находится в верхнем левом углу.
Чтобы сместить любую координату в отрицательную сторону, необходимо
отнять величину от абсолютного значения нужной координаты.
Звуковая карта SB16:
Порт 22C - командный порт - через него все команды и данные;
Порт 226 - порт сброса - через него идет первоначальная инициализация карты:
сначала заслать туда 01,потом через 3 миллисекунды 00,потом ждать пока в порту
статуса микросхемы 22E не появится бит 7 (h80) - инициализация проведена
успешно;
"Сюда" Теперь для воспроизведения готового блока звуков (файлы WAV) заслать в порт
22C команду чтения h10 и ждать пока в том же 22C не исчезнет бит 7 (h80);
Теперь заслать первый байт из записанного блока звуков и поставить растяжку;
Каждый такой байт - уровень звукового давления; Нулевой байт считается концом
потока;
Потом GOTO "Сюда".
DX,H0226 AL,h01 DXpAL AX,H0110 UR AL,h00 DXpAL AX,H0010 UR L1
M000 DX,H022E ALpDX ALth80=000 M008 AX,H1000 DS,AX c,H0400
M004 DX,H022C ALpDX AL,h10 DXpAL M001 DX,H022C ALpDX ALth80#001
DX,H022C AL,sc AL?h00=007 (c#005 c,DS c+H1000 c?H6000<006 c,H1000
M006 DS,c [A AX,c L2 ]A cic
M005 DXpAL AX,H0020 UR J004
M007 DXpAL AX,H0020 UR J008
Для синтеза звуков (я плохо разобрался) можно использовать порты 388 и 389.
При засылке в порт 388 кода 01 в порту 389 открывается регистр управления. Как
он работает - для меня полная загадка, но звук начинает получаться при засылке в
него кода h11, а затем, через растяжку (которую надо определить опытным путем),
в него же надо заслать 0. Теперь можно баловаться. Карта имеет 32 независимых
каналов звуков (инструментов). Настройку i-того инструмента производят соответственно
в регистрах (их номера надо заслать в порт h388) 20+i, 40+i, 60+i, 80+i, A0+i, BD,
C0+I, E0+i (регистры A0+i и BD непонятно зависимы). Код звука засылается в порт h389.
Поэспериментируйте сами - очень интересные звуки получаются! Там - и рояль,
и скрипка, и флейта, и "ЭХ!". Где-то здесь должен быть таймер для точного указания
длины звука (целая, четверть и т.д.). Но я его не нашел.
Флаги процессора:
Состояния:
CF -(0001) перенос (при переносе или заеме в арифмоперациях из старш бита),
PF -(0004) четность (паритет) числа единичных бит в младших 8 битах,
AF -(0010) вспомогат перенос из 3 бита в арифм опер (прим для 10-чных чисел),
ZF -(0040) ноль в арифм операциях,
SF -(0080) знак (старший бит числа после арифм операции),
OF -(0800) переполнение (для знаковых операций),
IOPL -(2-1000) уровень привилегий доступа к вводу/выводу в P-режиме,
NT -(4000) вложенная задача при переключениях в P-режиме,
Управления:
TF -(0100) покомандное (ловушка),
IF -(0200) прерывание разрешены при =1 (команды `FA и `FB),
DF -(0400) направление обработки цепочек,
RF -(10000) рестарт (возобновление) после особого случая,
VM -(20000) виртуальный режим (V-режим),
AC -(40000) контроль выровн (вызыв особ случай, если данные не выровнены).
DOS
Описание загрузчика, FAT и каталога (книга 2).
Начальный загрузчик занимает 1 сектор, расположен в 1-м секторе
0-дорожки,0-стороны (сектор не может быть 0).Загружается по адресу 7C00:0000.
В области нач загрузки сначала идет команда безусл перехода на саму программу
загрузки (2 байта - `EB`3C),потом код 90 (почему-то без него BIOS считает диск
односторонним),потом идентификатор диска (имя производителя) 8 байт, потом
блок параметров BIOS (19 байтов) и в конце - сам загрузчик (482 байта).
Блок параметров диска начинается с адр 000B:
Описание Начало : Длина (байт) : 720кб : 1440кб
Разм сектора в байтах B 2 200
Разм кластера в секторах D 1 1-2
Число резервн сек-ов (в тч под загрузчик) E 2 1
Число копий FAT 10 1 2
Число файлов в корневом каталоге 11 2 70 E0
Общее число секторов на диске 13 2 5A0 B40
Дескиптор (байт) носителя (код типа диска)15 1 F9 F0
Число секторов на каждой FAT 16 2 5 9
Число секторов на дорожке с одной стороны 18 2 9 12
Число головок 1A 2 2
Число скрытых секторов 1C 4 0
Длинный счетчик секторов 1E 4 0
Физический номер диска 22 2 0
Расширенная сигнатура загрузчика 24 1 29
Серийный номер тома 25 4 12345678
Метка тома 29 11 NO NAME
Идентификатор файлсистемы 34 8 FAT12
Начало загрузчика 3C
Начиная с физномера диска, данные абсолютно необязательные.
Длинный счетчик применяется в жестких дисках.
Первый резервный сектор содержит загрузчик. Остальные иногда применяются для
увеличения загрузочной записи.
На жестком диске в скрытых секторах хранится раздел диска.
Дескриптор жесткого диска - F8.
Загрузчик ищет файлы IO.SYS и MSDOS.SYS операционной сист DOS.Это скрытые
файлы. Пользователь не может оперировать ними, но команда FORMAT с ключем /S
копирует их на системный диск.
Записи в FAT (указатель номера следующего кластера файла):
Для дисков до 10Мб длина записи FAT имеет 12 бит, а свыше - 16 бит.
Описание 12-разрядов 16-разрядов
Не занят 000 0000
Занят 001-FEF 0001-FFEF
Зарезервирован FF0-FF6 FFF0-FFF6
Дефектный FF7 FFF7
Конец цепочки FF8-FFF FFF8-FFFF
Первый кластер файла указан в поле 1A записи в корневом каталоге.
Две первых записи в FAT (нулевая и первая) DOS резервируются и кластерам
не принадлежат.Т.е.3-я запись FAT принадлежит первому кластеру.
Поля записи корневого каталога файлов:
Каждому файлу выделяется 32 (20h) байтов в корневом каталоге.
Описание Начало Длина
Имя файла 0 8
Расширение 8 3
Байт атрибутов файла B 1
Резерв C A
Время последн обновления 16 2
Дата посл обновления 18 2
Номер первого кластера 1A 2
Размер файла 1C 4
Если имя файла меньше 8 байт, или расширение меньше 3-х,лишние заполняются
пробелами. При уничтожении файла первый байт имени заменяется на E5h,FAT не
изменяется, поэтому, можно легко восстановить файл. Если первый байт имени
00, значит раньше эта запись не использовалась.
Биты атрибута файла:
Описание Бит
Обычный файл 00
Только для чтения 01
Скрытый файл 02
Системный 04
Метка тома 08
Подкаталог 10
Архивный 20
Метка тома - не запись файла, а имя диска.
Архивный - файл, с которого не снималась копия.
Два байта время в записи файла:
Часы 15-11 биты
Минуты 10-5
Секунды 4-0
Два байта даты в записи файла:
Год 15-9 биты (начало отсчета с 1980 года)
Месяц 8-5
День 4-0
Скенкоды клавиатуры (прямое чтение порта `60):
0 1 2 3 4 5 6 7 8 9 A B C D E F
0: Q D B F6 d2 Print
1:Esc W F N F7 d3 Pause
2: 1 E G M F8 d0
3: 2 R H < F9 d.
4: 3 T J > F10
5: 4 Y K ?d/ Num
6: 5 U L Shi-пр Scroll
7: 6 I : d* d7 F11
8: 7 O " Alt d8 F12
9: 8 P ~ проб d9
A: 9 { Shi-лв Caps d-
B: 0 } \ F1 d4
C: _ вк Z F2 d5
D: + Ctrl X F3 d6
E:заб A C F4 d+
F:Tab S V F5 d1
Дополнительная клавиатура обозначена d.
Ins,Home,Page,Del,End и стрелки - соответствуют дополнительной клавиатуре.
При отжатии все клавиши дают код на 80h больший. Shift,Ctrl,Alt при
одновременном нажатии на код клавиш не влияют.
16-битная адресация с байтом ModR/M:
-------------------------------------------------------------------------------
r8 AL CL DL BL AH CH DH BH
r16 AX CX DX BX SP b c d
r32 EAX ECX EDX EBX ESP Eb Ec Ed
/(KOP) 0 1 2 3 4 5 6 7
REG 000 001 010 011 100 101 110 111
-------------------------------------------------------------------------------
Эфф.адрес Mod R/M ModR/M
-------------------------------------------------------------------------------
[BX+c] 00 000 00 08 10 18 20 28 30 38
[BX+d] 001 01 09 11 19 21 29 31 39
[b+c] 010 02 0A 12 1A 22 2A 32 3A
[b+d] 011 03 0B 13 1B 23 2B 33 3B
[c] 100 04 0C 14 1C 24 2C 34 3C
[d] 101 05 0D 15 1D 25 2D 35 3D
disp16 110 06 0E 16 1E 26 2E 36 3E
[BX] 111 07 0F 17 1F 27 2F 37 3F
[BX+c]+disp8 01 000 40 48 50 58 60 68 70 78
[BX+d]+disp8 001 41 49 51 59 61 69 71 79
[b+c]+disp8 010 42 4A 52 5A 62 6A 72 7A
[b+d]+disp8 011 43 4B 53 5B 63 6B 73 7B
[c]+disp8 100 44 4C 54 5C 64 6C 74 7C
[d]+disp8 101 45 4D 55 5D 65 6D 75 7D
[b]+disp8 110 46 4E 56 5E 66 6E 76 7E
[BX]+disp8 111 47 4F 57 5F 67 6F 77 7F
[BX+c]+disp16 10 000 80 88 90 98 A0 A8 B0 B8
[BX+d]+disp16 001 81 89 91 99 A1 A9 B1 B9
[b+c]+disp16 010 82 8A 92 9A A2 AA B2 BA
[b+d]+disp16 011 83 8B 93 9B A3 AB B3 BB
[c]+disp16 100 84 8C 94 9C A4 AC B4 BC
[d]+disp16 101 85 8D 95 9D A5 AD B5 BD
[b]+disp16 110 86 8E 96 9E A6 AE B6 BE
[BX]+disp16 111 87 8F 97 9F A7 AF B7 BF
EAX/AX/AL 11 000 C0 C8 D0 D8 E0 E8 F0 F8
ECX/CX/CL 001 C1 C9 D1 D9 E1 E9 F1 F9
EDX/DX/DL 010 C2 CA D2 DA E2 EA F2 FA
EBX/BX/BL 011 C3 CB D3 DB E3 EB F3 FB
ESP/SP/AH 100 C4 CC D4 DC E4 EC F4 FC
Eb/b/CH 101 C5 CD D5 DD E5 ED F5 FD
Ec/c/DH 110 C6 CE D6 DE E6 EE F6 FE
Ed/d/BH 111 C7 CF D7 DF E7 EF F7 FF
-------------------------------------------------------------------------------
32-битная адресация с байтом ModR/M:
-------------------------------------------------------------------------------
r8 AL CL DL BL AH CH DH BH
r16 AX CX DX BX SP b c d
r32 EAX ECX EDX EBX ESP Eb Ec Ed
/(KOP) 0 1 2 3 4 5 6 7
REG 000 001 010 011 100 101 110 111
-------------------------------------------------------------------------------
Эфф.адрес Mod R/M ModR/M
-------------------------------------------------------------------------------
[EAX] 00 000 00 08 10 18 20 28 30 38
[ECX] 001 01 09 11 19 21 29 31 39
[EDX] 010 02 0A 12 1A 22 2A 32 3A
[EBX] 011 03 0B 13 1B 23 2B 33 3B
[..][..] 100 04 0C 14 1C 24 2C 34 3C
disp32 101 05 0D 15 1D 25 2D 35 3D
[Ec] 110 06 0E 16 1E 26 2E 36 3E
[Ed] 111 07 0F 17 1F 27 2F 37 3F
disp8[EAX] 01 000 40 48 50 58 60 68 70 78
disp8[ECX] 001 41 49 51 59 61 69 71 79
disp8[EDX] 010 42 4A 52 5A 62 6A 72 7A
disp8[EBX] 011 43 4B 53 5B 63 6B 73 7B
disp8[..][..] 100 44 4C 54 5C 64 6C 74 7C
disp8[Eb] 101 45 4D 55 5D 65 6D 75 7D
disp8[Ec] 110 46 4E 56 5E 66 6E 76 7E
disp8[Ed] 111 47 4F 57 5F 67 6F 77 7F
disp32[EAX] 10 000 80 88 90 98 A0 A8 B0 B8
disp32[ECX] 001 81 89 91 99 A1 A9 B1 B9
disp32[EDX] 010 82 8A 92 9A A2 AA B2 BA
disp32[EBX] 011 83 8B 93 9B A3 AB B3 BB
disp32[..][..] 100 84 8C 94 9C A4 AC B4 BC
disp32[Eb] 101 85 8D 95 9D A5 AD B5 BD
disp32[Ec] 110 86 8E 96 9E A6 AE B6 BE
disp32[Ed] 111 87 8F 97 9F A7 AF B7 BF
EAX/AX/AL 11 000 C0 C8 D0 D8 E0 E8 F0 F8
ECX/CX/CL 001 C1 C9 D1 D9 E1 E9 F1 F9
EDX/DX/DL 010 C2 CA D2 DA E2 EA F2 FA
EBX/BX/BL 011 C3 CB D3 DB E3 EB F3 FB
ESP/SP/AH 100 C4 CC D4 DC E4 EC F4 FC
Eb/b/CH 101 C5 CD D5 DD E5 ED F5 FD
Ec/c/DH 110 C6 CE D6 DE E6 EE F6 FE
Ed/d/BH 111 C7 CF D7 DF E7 EF F7 FF
-------------------------------------------------------------------------------
Прерывания:
00-Деление на ноль
01-Пошаговое
02-Немаскируемое
03-Контрольная точка
04-Переполнение
05-Печать экрана
06-Неверный код операции
07-Резерв
08-(IRQ 0)-Таймер
09-(IRQ 1)-Клавиатура (KEYRUS)
0A-(IRQ 2)-Резерв
0B-(IRQ 3)-COM 2 (последовательный 2)
0C-(IRQ 4)-COM 1 (последовательный 1)-Мышь
0D-(IRQ 5)-Резерв
0E-(IRQ 6)-М-диск
0F-(IRQ 7)-Принтер
10-Видео
11-Опред оборудования
12-Обьем памяти
13-Диски
14-Асинхроника
15-Сервис
16-Клавиатура
17-Принтер
18-Системный BASIC
19-Перезагрузка
1A-Часы
1B-Стоп с клавиатуры
1C-Таймер
----
70-(IRQ 8)-Прерывание от секундомера
71-(IRQ 9)-Резерв
72-(IRQ 10)-Резерв
73-(IRQ 11)-Резерв
74-(IRQ 12)-Резерв
75-(IRQ 13)-NMI
76-(IRQ 14)-Ж-диск
77-(IRQ 15)-Резерв
--------------------------------------------
Формат видеофайлов BMP (книга 5):
Применяется для простейших графредакторов.
Простое классическое построение, мало возможностей описания данных, редко
подвергаются сжатию. Заголовок имеет три части:
Основной заголовок (Core-Header) длиной 14 байт:
0-1 - Опознавание (D42 или BM)
2-5 - Обьем файла в байтах
6-9 - Резерв
A-D - Смещение данных в файле (начало)
Информзаголовок (Info-Header) длиной 16 байт:
E-11 - Длина информ и необязат заголовков
12-15 - Длина изобр
16-19 - Высота
1A-1B - Плоскости (всегда=1)
1C-1D - Число бит на элем изобр (1,2,4,8 или 24,что соотв 2,4,16,256
или 16млн цв)
1E-21 - Схема сжатия (если не сжато =0)
22-25 - Число байт данных изображения
26-29 - Горизонтал разрешение (число элем на метр - абсолютно не нужные данные)
2A-2D - Вертикал разрешение (-"-)
2E-31 - Число применяемых цветов (для палитровый изобр)
32-35 - Число важных цветов (для Windows, сколько цветов действительно важно)
Необязательный заголовок (для возможного будущего применения) 24 байта.
Значения палитры выводятся непосредственно после заголовков.В каждое знач цвета
входит 4 байта: синяя составл, зеленая, красная и 4 байт всегда =0. Для 2-цветн
изображ указывается 2 четверки. Для 16-цветн изобр - 16 четверок. Для 256 цв -
256 четверок. Для 16млн цв палитры не применяются, но может быть указана.
Описание изображения:
Данные начинаются с первого эл нижней строки, которому принадлежит старшее
значения байта (для 2-цв 7-й бит, для 16-цв - 4 старших бита, и тд).Данные для
каждой строки должны иметь целое число байт, кратное 4-м.Если это не так, данные
для строки дополняются нулями, которые в изображении игнорируются.