"REDER"



    на главную


                             Что такое 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а
из списка. Эти файлы могут находиться и на жестком диске. Самый первый из них –
библиотека подпрограмм
ZN.SR,
содержащий все необходимое для графики, звука,
расширпамяти, плавающей запятой, клавы и мыши. Сейчас это 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-м.Если это не так, данные
для строки дополняются нулями, которые в изображении игнорируются.




на главную