Skip to content

Instantly share code, notes, and snippets.

@MisterTimur
Last active September 14, 2015 01:17
Show Gist options
  • Save MisterTimur/37ca889200bc327a9566 to your computer and use it in GitHub Desktop.
Save MisterTimur/37ca889200bc327a9566 to your computer and use it in GitHub Desktop.
Tim-Pascal-Lib.asm
ORG 100h;{Абдулов Тимур Рифович 2015 год Email hostingurifa@gmail.com .
;INFO Кодировка файла должна быть CP 866
;Site https://sites.google.com/site/timpascallib/
;Youtube https://www.youtube.com/channel/UCUhQNuTAQ933YBTy6awC0Pw
;Google+ https://plus.google.com/u/0/+%D0%A2%D0%B8%D0%BC%D1%83%D1%80%D0%90%D0%B1%D0%B4%D1%83%D0%BB%D0%BE%D0%B2/posts
;GIST https://gist.github.com/MisterTimur/37ca889200bc327a9566
;------------------------------------------------------------------------------}
use16;
;{ ОСНОВНОЕ ТЕЛО ПРОГРАММЫ .
;---------------------;
Call ПОДГОТОВКА_К_ЗАПУСКУ;// Очистка видеобуфера полготовка диспетчера памяти и тд и тп
;---------------------;
MOV DI,[КОР_ЭЛЕМ] ;
mov SI,.ИМЯ_ОКНА1 ;
call ОКНО_СОЗДАТЬ1 ;// Создает начальные окна для отладки
;call ВЫПОЛНИТЬ_ОК ;
mov SI,.ИМЯ_ОКНА2 ;
call ОКНО_СОЗДАТЬ2 ;
;---------------------;
mov ax,КВАНТ ;
call ДОБАВИТЬ_ПРОЦЕС ;
.ОСНОВНОЙ_ЦИКЛ: ;
call ПРЕРЫВАНИЕ ;
jmp .ОСНОВНОЙ_ЦИКЛ;
.ЗАВЕРШЕНИЕ_РАБОТЫ:
;-----------------------;
MOV DI,[КОР_ЭЛЕМ] ;
;call ЭЛЕ_ПРОСМОТР ;
;---------------------;
Call ОЖИДАНИЕ_НАЖАТИЯ_ЛЮБОЙ_КНОПКИ ;
;---------------------;
ret ;
.ИМЯ_ОКНА1: DB 'ОКНО1',0,0;
.ИМЯ_ОКНА2: DB 'ОКНО2',0,0;
ПОДГОТОВКА_К_ЗАПУСКУ :;{ ПОдготовка всего того что нужно для работы
pushad;
call БИОС_ВКЛЮЧИТЬ_ПАМЯТЬ;// ПОдготовка памяти для работы системы
Call ПОДГОТОВКА_СЛОВАРЯ ;// Выделяет память под словарь
call МЫШКА_ВКЛЮЧИТЬ ;// Включаем мышку
call ЭКРАН_ПОДГОТОВИТЬ ;// Подготовка Экрана для работы
call СОЗДАТЬ_КОРНЕВОЙ_ЭЛЕМЕНТ;// Включение корневого элемента
call СОЗДАТЬ_ТАБЛИЦУ_ПОТОКОВ;
popad;
ret;
;========================================================================================}
БИОС_ИНФОРМАЦИЯ :;{ Вывод информации о БИОС
pushad;
;------------------------; Устновка курсора в левый верхний угол экрана
mov cx,0 ;
mov dx,0 ;
call ЭКРАН_КУРСОР_XY ;
;------------------------;
;------------------------;
mov di,.ТЕКСТ_АДРНАЧКУ ; Выводим надпись (Адрес начала кучи)
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov ax,[НАЧ_КУЧИ] ;
call ЭКРАН_ВЫВОД_ЧИСЛА ; Выводи адрес начала кучи на экран
call ЭКРАН_ВЫВОД_ПРОБЕЛА; Промежуток пере след записю на экране
;------------------------;
;------------------------;
mov di,.ТЕКСТ_АДРКОНКУ ; Выводим надпись (Адрес Окончания кучи)
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov ax,[КОН_КУЧИ] ;
call ЭКРАН_ВЫВОД_ЧИСЛА ; Выводим адрес окончания кучи на экран
call ЭКРАН_ВЫВОД_ПРОБЕЛА; промежуточный пробел
;------------------------; МАК_КУЧИ
;------------------------;
mov di,.ТЕКСТ_АДРМАККУ ; Выводим надпись (Адрес Окончания кучи)
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov ax,[МАК_КУЧИ] ;
call ЭКРАН_ВЫВОД_ЧИСЛА ; Выводим адрес окончания кучи на экран
call ЭКРАН_ВЫВОД_ПРОБЕЛА; промежуточный пробел
;------------------------; МАК_КУЧИ
;------------------------;
mov di,.ТЕКСТ_АДРЭКРАН ; Выводим надпись (адрес виде буфера)
call ЭКРАН_ВЫВОД_СТРОКИ ;
Call ЭКРАН_АДРЕС_В_AX ; ПОлучаем адрес Видеобуфера в регист AX
call ЭКРАН_ВЫВОД_ЧИСЛА ; Выводим вдрес видео буфера на экран
call ЭКРАН_ВЫВОД_ПРОБЕЛА; Выводим промежуточный пробел
;------------------------;
;------------------------;
mov di,.ТЕКСТ_АДРКОРЭЛ ; Выводим надпись (Адрес корневого Элемента)
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov ax,[КОР_ЭЛЕМ] ; Читаем дарес корневого Элемента
call ЭКРАН_ВЫВОД_ЧИСЛА ; Выводим адрес корневого элемента на экран
call ЭКРАН_ВЫВОД_ПЕРСТРО; промежуточный пробел
;------------------------;
;------------------------;
mov di,.ТЕКСТ_ИНФМЫШКА ; Выводим надпись (информации о мышке) о нажатых кнопках координатах и тд и тп
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov ax,[МЫШ_КООX1] ; Вывод координаты по X
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov ax,[МЫШ_КООY1] ; Вывод координаты по Y
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov ax,[МЫШ_КНОП1] ; Вывод информации о нажатых кнопках
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov ax,[МЫШ_ВЫДЕ1] ; Вывод информации об обьекте по котрому нажата мышка
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov ax,[МЫШ_КООX2] ; Вывод предыдущей координаты по X
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov ax,[МЫШ_КООY2] ; Вывод Предыдущей координаты по Y
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov ax,[МЫШ_КНОП2] ; Вывод предыдущей нажатой кнопки
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov ax,[МЫШ_ВЫДЕ2] ; Вывод предыдущего обекта по котрому нажаты была кнопка
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;------------------------;
;------------------------;
mov di,.ТЕКСТ_ТИППЕРЕМ ; Вывод типа перемещения обьекта мышкой
call ЭКРАН_ВЫВОД_СТРОКИ ; Завиист от того места по котрому была нажата мышка
mov ax,[МЫШ_ТИППЕ] ;
call ЭКРАН_ВЫВОД_ЧИСЛА ;
;------------------------;
;------------------------;
mov di,.ТЕКСТ_КОДКНОПК ; Выводт код нажатой кнопки
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov ax,[НАЖ_КНОПК] ;
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПЕРСТРО;
;------------------------
;------------------------; Скрываем курсор
mov cl,25 ;
mov dl,25 ;
call ЭКРАН_КУРСОР_XY ;
;------------------------;
popad;
ret;
.ТЕКСТ_АДРКОРЭЛ: DB 'Адр Кор эле = ',0,0;
.ТЕКСТ_АДРНАЧКУ: DB 'Нач куч = ',0,0;
.ТЕКСТ_АДРКОНКУ: DB 'Кон куч = ',0,0;
.ТЕКСТ_АДРМАККУ: DB 'Мак куч = ',0,0;
.ТЕКСТ_АДРЭКРАН: DB 'Адр экр буфера = ',0,0;
.ТЕКСТ_ИНФМЫШКА: DB 'ИНФОРМАЦИЯ О МЫШКЕ = ',0,0;
.ТЕКСТ_ТИППЕРЕМ: DB 'ТИП ПЕРЕМЕЩЕНИЯ = ',0,0;
.ТЕКСТ_КОДКНОПК: DB 'Код кнопки = ',0,0;
;==============================================================================}
ДОБАВИТЬ_ПРОЦЕС:;{
PUSHAD ;
mov bx,di ;
Mov di,1024 ;
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI
mov dx,di;
add di,1022 ;
;--------------;
mov [di],dx ; // Указываем адрес выделеного участка
sub di ,2 ; 1020
mov cx,СТОП ;
mov [di],cx ; // Указываем адрес остановки потока
sub di ,2 ; 1018
mov [di],ax ; // Указываем адрес с которого нужно запустить поток
sub di,32 ; // 1012 pushad 16
mov [di],bx ;
;--------------;
;--------------;
mov dx,di ;
mov di,[ПОТОКИ]; // Читаю адрес списка потоков
;--------------;
;--------------;
.ЦИКЛ: mov cx,[di] ; // запоминаю адрес котрый был первым в списке
mov [di],dx ; // Записываю поток в очередь
test cx,cx ; // Если это последний поток в списке
jz .КЦИКЛ ; // Выходим из цикла
mov dx,cx ; //
add di,2 ; // Переходим к следующему потоку
jmp .ЦИКЛ ;
;--------------;
.КЦИКЛ:
POPAD;
RET;}
ПРЕРЫВАНИЕ:;{
pushad ;
;--------------;
mov cx,sp ; // Запоминаем адрес текущего потока
;--------------;
;--------------;
mov si,[ПОТОКИ]; // Читаю адрес списка потоков
mov di,[ПОТОКИ]; // Читаю адрес списка потоков
add di,2 ; // В DI переходим к следующему в списке
MOV dx,[SI] ; // Читаю адрес первого потока в DX
;--------------;
test dx,dx ; // Если это единственный поток то идем на выход
jz .ВЫХОД ;
;--------------;
.ЦИКЛ: mov AX,[DI] ; // Читаю адрес следующего потока
mov [SI],AX ; // Записываем на место предыдущего
test AX,AX ; // Если больше в списке нет потоков
jz .КЦИКЛ ; // Выходим из цикла
ADD SI,2 ; // Переходим к следующему потоку
ADD DI,2 ; // Переходим к следующему потоку
jmp .ЦИКЛ ;
;--------------;
.КЦИКЛ:
mov [SI],CX ; // Записываем текущий поток как последний в списке
;--------------;
mov sp,dx ;
.ВЫХОД:
popad ;
ret ;
;--------------;}
СТОП:;{
pop di ; // Читаем адрес участка выделеного под стек потока
mov ax,[ПОТОКИ];
add ax,1022;
mov sp,ax;
call ОСВОБОЖДЕНИЕ_УЧАСТКА_ПАМЯТИ_DI;
MOV SI,[ПОТОКИ]; // Читаю адрес списка потоков
mov DI,[ПОТОКИ]; // Читаю адрес списка потоков
add DI,2 ;
MOV dx,[SI] ; // Читаю адрес первого потока
.ЦИКЛ: MOV AX,[DI] ;
MOV [SI],AX ;
TEST AX,AX ;
jz .КЦИКЛ ;
add si,2 ;
add di,2 ;
jmp .ЦИКЛ ;
.КЦИКЛ:
;--------------;
mov sp,dx ;
popad ;
ret ;
;--------------;
;}
КВАНТ:;{
pushad;
.ЦИКЛ:
call ПРЕРЫВАНИЕ ;
MOV DI,[КОР_ЭЛЕМ] ;
call МЫШКА_ЧИТАТЬ ;// Читает координаты мышки
call КЛАВИАТУРА_ЧИТАТЬ ;// Читает клавиатуру
call СИСТЕМНЫЕ_КНО ;// Читает системные кнопки
call КНОПКИ ;//
call ОКНО_ПЕРЕМЕЩЕ ;// Перемещает окна процеду отвечает за перемещение окошек
call ЭКРАН_ОЧИСТКА ;// Очитка видеобуфера для рисования
call ОКНО_РИСО_ВСЕ ;// Рисует окна в видеобуфере
call МЫШКА_НАРИСОВАТЬ ;// РИсует мышку
Call БИОС_ИНФОРМАЦИЯ ;// Выводит отладочную информацию
call ЭКРАН_ВЫВОД ;// Вывод содержимого видеобуфера на экран
call БИОС_ПАУЗА ;// Пауза
jmp .ЦИКЛ;
popad;
ret;
;}
;==============================================================================}
;{ ФУНКЦИИ ДЛЯ РАБОТЫ C ЯЗЫКОМ ПРОГРАМИРОВАНИЯ -ПРОГРАМИРОВАНИЕ .
;-ЖШРИФТ:
;-clGreen:
РАЗ_НА_СЛОВА:;{ Разбивает строку DI указатель на окно с программой на слова возврвщет элемнт DI со списком слов
pushad;
call ОКНО_ТЕК ; // Запоминаем текст программы
mov cx,ax ;
;---------------------;
mov al,0 ; // Создаем элемент содержащий структуру программы
mov ah,1 ;
mov si,.ИМЯ ;
mov bx,0 ;
call ЭЛЕ_СОЗДАТЬ ;
;---------------------;
mov si,cx ; // Вотстанавливаем адрес текста исполнгяемой программы
mov dx,DI ; // Запоминаем элемент в котром храниться структура будующей программы
;---------------------;
.ЦИКЛ:
;---------------------;
mov al,[si] ; // ПРоверяем если ноль значит текст программы кончился
test al,al ;
jZ .КЦИКЛ ;
;---------------------;
;---------------------;
mov al,ТИП_СТРО ;
call ЧИТАЕТ_СЛОВО_С_АДР_SI_ВОЗ_СЛОВО_DI;
jnz .ДОБАВИТЬ ; // Если вернул не нуль значит слово удалося прочитать
mov al,ТИП_ЧИСЛ ;
call ЧИТАЕТ_ЧИСЛО_С_АДР_SI_ВОЗ_СЛОВО_DI;
jnz .ДОБАВИТЬ ; // Если вернул не нуль значит Число удалося прочитать
mov al,ТИП_СТРО ;
call ЧИТАЕТ_ЗНАК_С_АДР_SI_ВОЗ_СЛОВО_DI;
jnz .ДОБАВИТЬ ; // Если вернул не нуль значит Число удалося прочитать
;---------------------;
inc SI ; // Если ничего прочитать не удалося просто пропускаем символ
jmp .ЦИКЛ ;
;---------------------;
.ДОБАВИТЬ:
;---------------------;
call ЭЛЕ_СОЗДАТЬ2 ; // AL- ТИП DI-СТРОКА DX - РОДИТЕЛЬ ничего не возвращает
call ВОЗАРАЩАЕТ_В_DI_ДЛИНУ_СТРОКИ_DI; // Получаем длину прочитаного слова
add si,di ; // Добавляем к позици начала слва длину прочитаного слова
jmp .ЦИКЛ ;
;---------------------;
.КЦИКЛ:
pop si;
push dx;
popad ;
ret ;
.ИМЯ: db "PROG",0;
;==============================================================================}
ДОП_ТИП_СЛОВ:;{ Определяет доп типы слов в списке элемента DI
pushad;
call ЭЛЕ_ВЛО;
.ЦИКЛ: test ax,ax ;
jz .ВЫХОД ;
mov di,ax ;
call ЭЛЕ_СЛЕ ;
mov bx,ax ;
call ЭЛЕ_КОД ;
mov si,.ЛОГИЧ ;
call ПОИСК_ДВОЙНОЙ_ЦИФРЫ_AX_В_СТРОКЕ_SI;
jnz .ЭТО_ЛОГИКА ;
mov si,.УДАЛЯЕМЫЕ ;
call ПОИСК_ДВОЙНОЙ_ЦИФРЫ_AX_В_СТРОКЕ_SI;
jnz .ЭТО_УДАЛЯЕМЫЕ ;
;-----------------------;
.ДАЛЕЕ: call ЭЛЕ_СЛЕ ;
jmp .ЦИКЛ ;
.ЭТО_УДАЛЯЕМЫЕ:
call ЭЛЕ_УДАЛИТЬ ;
mov ax,bx ;
jmp .ЦИКЛ ;
.ЭТО_ЛОГИКА:;-----------------------;
Mov si,DI ;
add SI,ЭЛ_ТИП ;
mov Byte [si],ТИП_ЧИСЛ ;
mov dx,0 ;
CALL ЭЛЕ_КОД ;
cmp ax,КОД_КОМ_ЛОЖ ;
jz .ЭТО_ЛОЖ ;
Mov dx,1 ;
.ЭТО_ЛОЖ:
call ЭЛЕ_ЗНА ;
call УДАЛИТЬ_СТРОКУ_AX ;
mov si,Di ;
add si,ЭЛ_ЗНА ;
mov word [si],dx ;
jmp .ДАЛЕЕ ;
;-----------------------;
.ВЫХОД:
popad ;
ret ;
.ЗНАКИ : DW КОД_КОМ_ЛОГИ,КОД_КОМ_ЛОГИЛИ,0;
.ЛОГИЧ : DW КОД_КОМ_ПРАВДА,КОД_КОМ_ЛОЖ,0;
.УДАЛЯЕМЫЕ: DW КОД_КОМ_НА,0;
;==============================================================================}
ВЛО_СКО :;{ Вкладывание скобок (SI)(SI+1) в списке элемента DI
pushad ;
mov dx,di ; // Запоминаем адрес элемента котирый сканируем
mov cx,DI ; // По умолчани. контенер равен сканируемуму элемегту
Call ЭЛЕ_ВЛО ; // Читаем первый вложеный Элемент в списке
.ЦИКЛ: ;-----------------;
test ax,ax ; // ПРоверяем есть ли элемент ил элементы кончилися
JZ .КЦИКЛ ;
mov di,ax ;
;-----------------;
call ЭЛЕ_СЛЕ ; // ПОлучаем следующий элемент списка и запоминаем его на всяк случай
mov bx,ax ;
;-----------------;
call ЭЛЕ_КОД ; // Читаем Код имени элемента
;-----------------;
cmp cx,dx ; // Провека что бы контенер не был равен сканируемому элемнту в таком случае мы в него складываем даллее идущие элементы
jz .НЕДОБАВЛЯЕМ;
call .ДОБ_DI_В_CX ; // добавить элмент DI(Сканируемый элеминт) в элемент CX(Коннтенер )
;-----------------;
.НЕДОБАВЛЯЕМ:
;-----------------;
cmp ax,SI;
JNZ .ДАЛЕЕ2 ;
mov cx,di ;
;-----------------;
.ДАЛЕЕ2: ;-----------------;
dec ax ; // SI+1 код закрывающейся скобки
cmp aX,SI ;
JNZ .ДАЛЕЕ ;
call .ЭЛЕ_Р_CX ; // Назначаем родительский элемнт CX в CX перемещаеимся в конетенере в родительский элемнт
;-----------------;
.ДАЛЕЕ: ;-----------------;
mov ax,bx ;
jmp .ЦИКЛ ;
;-----------------;
.КЦИКЛ:
popad ;
ret ;
.ЭЛЕ_Р_CX:
;----------------;
push di ;
mov di,cx ;
call ЭЛЕ_РОДИТЕЛЬ;
mov cx,DI ;
pop DI ;
ret ;
;----------------;
.ДОБ_DI_В_CX:
;----------------;
pushad ;
call ЭЛЕ_КОД ; // ЧИтаем код элемента
cmp ax,КОД_КОМ_ЗСКОБКА;
jz .ПРОСТО_УДА ;
mov dx,di ;
mov di,CX ;
Call ДОБ_ЭЛЕ_DX_В_ЭЛЕ_DI;
jmp .КВЫХОДУ ;
.ПРОСТО_УДА:
call ЭЛЕ_УДАЛИТЬ ;
.КВЫХОДУ:
popad ;
ret ;
;----------------;
;==============================================================================}
ВЛО_МАТ :;{ Вкладываени мат Si операций в списке DI
pushad
call ЭЛЕ_ВЛО ; // Читаем первый вложеный элемент в элементе адрес котрого указан в регистре DI возврашает AX
.ЦИКЛ: ;---------------------;
test ax,ax ;
jz .ВЫХОД ; // ПРоверяем если элемнты кончилися то выход
mov di,ax ;
;---------------------;
call ВЛО_МАТ ;
;---------------------;
call ЭЛЕ_ПРЕ ; // Проверяем наличае следующего элемнета
jz .ДАЛЕЕ ;
mov cx,ax ; // Запоминаем предыдущий элемент в CX
;---------------------;
call ЭЛЕ_СЛЕ ; // Проверяем наличае следующего элемнета
jz .ВЫХОД ;
mov dx,ax ; // Запоминаем следующий элемент в DX
;---------------------;
call ЭЛЕ_КОД ; // Читаем адрес строки имени элемнта DI вовращает в AX
call ПОИСК_ДВОЙНОЙ_ЦИФРЫ_AX_В_СТРОКЕ_SI;
jnz .ВЛОЖИТЬ ;
;---------------------;
jmp .ДАЛЕЕ ;
;---------------------;
.ВЛОЖИТЬ:
;---------------------;
push di ;
call ДОБ_ЭЛЕ_СX_В_ЭЛЕ_DI; // Добавляем предыдущий элемент
call ДОБ_ЭЛЕ_DX_В_ЭЛЕ_DI; // Добаавляем следующий элемнт
mov di,dx ;
call ВЛО_МАТ ;
pop di ;
;---------------------;
.ДАЛЕЕ: call ЭЛЕ_СЛЕ ;
jmp .ЦИКЛ ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЛО_ПАР :;{ Вложение параметров или блоков начинающихся с символа cx=(или фигурная скобка summa(a,b)
pushad;
call ЭЛЕ_ВЛО ; // Читаем первый вложеный элемнт
.ЦИКЛ: ;---------------------;
test ax,ax ;
jz .ВЫХОД ;
mov di,ax ;
;---------------------;
call ВЛО_ПАР ;
;---------------------;
call ЭЛЕ_СЛЕ ; // Проверяем наличае следующего элемнета
mov dx,ax ; // Запоминаем следующий элемент в DX
test dx,dx ; // Если нет Следующего элемнта то пропускаем
jz .ВЫХОД ;
;---------------------;
call ЭЛЕ_ТИП ; // Во первых это дожэно быть слово
cmp ax,ТИП_СТРО ;
jnz .ДАЛЕЕ ;
call ЭЛЕ_КОД ; // Во первых это дожэно быть слово
cmp ax,МАКС_РЕЗЕРВ_СЛОВО;
jbE .ДАЛЕЕ ;
;----------------------;
push di ;
mov di,dx ;
call ЭЛЕ_КОД ; // Читаем код следующего элемента
cmp ax,cx ;
pop di ;
jnz .ДАЛЕЕ ;
;----------------------;
call ДОБ_ЭЛЕ_DX_В_ЭЛЕ_DI; // Добаавляем следующий элемнт
cmp ax,КОД_КОМ_НАЧАЛО ; // Сравниваем первую букву вкладываемого элемента с началом блока
jnz .ЭТО_НЕ_ФУН ;
call ЭЛЕ_КОД ;
mov si,.УСЛОВИЕ_ЦИИКЛЫ;
call ПОИСК_ДВОЙНОЙ_ЦИФРЫ_AX_В_СТРОКЕ_SI;
jnz .ЭТО_НЕ_ФУН ;
mov si,di ;
add si,ЭЛ_ФУН ;
mov byte[si],1 ;
.ЭТО_НЕ_ФУН:
mov ax,di ;
jmp .ЦИКЛ ;
.ДАЛЕЕ: ;----------------------;
call ЭЛЕ_СЛЕ ;
;----------------------;
jmp .ЦИКЛ ;
.КЦИКЛ:
.ВЫХОД:
popad;
ret;
.УСЛОВИЕ_ЦИИКЛЫ: DW КОД_КОМ_ЕСЛИ,КОД_КОМ_ПОКА,0;
;==============================================================================}
КОРРЕКЦИЯ :;{ Корреекция cтруктуры
pushad;
popad ;
ret ;
;==============================================================================}
ВЫПОЛНИТЬ_ЭЛ:;{ Запускает элемнт на выполнение
pushad ;
call ЭЛЕ_КОД ;
cmp ax,КОД_КОМ_ВЫВОД ;
jnz .ДАЛЕЕ010 ;
call ВЫПОЛНИТЬ_ВЫВОД ; // Операция вывода на экран
jmp .ВЫХОД ;
.ДАЛЕЕ010:
cmp ax,КОД_КОМ_СЛОЖЕНИЕ;
jnz .ДАЛЕЕ020 ;
call ВЫПОЛНИТЬ_МАТОП ; // Операция сложения
jmp .ВЫХОД ;
.ДАЛЕЕ020:
cmp ax,КОД_КОМ_ВЫЧИТАНИЕ;
jnz .ДАЛЕЕ021 ;
call ВЫПОЛНИТЬ_МАТОП ; // Операция сложения
jmp .ВЫХОД ;
.ДАЛЕЕ021:
cmp ax,КОД_КОМ_УМНОЖЕНИЕ ;
jnz .ДАЛЕЕ022 ;
call ВЫПОЛНИТЬ_МАТОП ; // Операция Присвоения
jmp .ВЫХОД ;
.ДАЛЕЕ022:
cmp ax,КОД_КОМ_ПРИСВОЕНИЕ ;
jnz .ДАЛЕЕ024 ;
call ВЫПОЛНИТЬ_МАТОП ; // Операция Присвоения
jmp .ВЫХОД ;
.ДАЛЕЕ024:
cmp ax,КОД_КОМ_БОЛЬШЕ ;
jnz .ДАЛЕЕ026 ;
call ВЫПОЛНИТЬ_МАТОП ; // Операция Присвоения
jmp .ВЫХОД ;
.ДАЛЕЕ026:
cmp ax,КОД_КОМ_МЕНЬШЕ ;
jnz .ДАЛЕЕ030 ;
call ВЫПОЛНИТЬ_МАТОП ; // Операция Присвоения
jmp .ВЫХОД ;
.ДАЛЕЕ030:
cmp ax,КОД_КОМ_ОСКОБКА ;
jnz .ДАЛЕЕ040 ;
call ВЫПОЛНИТЬ_СКОБКУ ; // Операция параметры в скобках
jmp .ВЫХОД ;
.ДАЛЕЕ040:
cmp ax,КОД_КОМ_НАЧАЛО ;
jnz .ДАЛЕЕ050 ;
call ВЫПОЛНИТЬ_БЛОК ; // Операция исполнительный блок
jmp .ВЫХОД ;
.ДАЛЕЕ050:
cmp ax,КОД_КОМ_ПОКА ;
jnz .ДАЛЕЕ060 ;
call ВЫПОЛНИТЬ_ЦИКЛ_ПОКА; // Операция Цикл Пока
jmp .ВЫХОД ;
.ДАЛЕЕ060:
cmp ax,КОД_КОМ_ЕСЛИ ;
jnz .ДАЛЕЕ070 ;
call ВЫПОЛНИТЬ_УСЛОВИЕ ; // Операция Условие
jmp .ВЫХОД ;
.ДАЛЕЕ070:
Call ВЫПОЛНИТЬ_ФУНКЦИЮ ;
;-----------------------;
.ВЫХОД :
popad ;
ret ;
.PRINT:DB 'PRINT',0;
.CONSOL:DB 'CONSOL',0;
;==============================================================================}
ВЫПОЛНИТЬ_ВЛ:;{ Выполняет вложеные элемнты элемнета DI
pushad;
call ЭЛЕ_ВЛО;
.ЦИКЛ: ;----------------;
call ПРЕРЫВАНИЕ ;
test ax,ax ;
jz .КЦИКЛ ;
mov di,ax ;
call ЭЛЕ_ФУН ;
jnz .ДАЛЕЕ ;
call ВЫПОЛНИТЬ_ЭЛ;
.ДАЛЕЕ: call ЭЛЕ_СЛЕ ;
Call ПРЕРЫВАНИЕ ;
Jmp .ЦИКЛ ;
.КЦИКЛ: ;----------------;
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_ПЕРВЫЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI:;{
pushad;
call ЭЛЕ_ВЛО;
mov di,ax;
call ВЫПОЛНИТЬ_ЭЛ;
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_ВТОРОЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI:;{
pushad;
call ЭЛЕ_ВЛО;
mov di,ax;
call ЭЛЕ_СЛЕ;
mov di,ax;
call ВЫПОЛНИТЬ_ЭЛ;
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_ОК:;{ Выполняет программу в окне SI
pushad;
call ОКНО_МОНИТОР ;
;----------------------------------------------
call РАЗ_НА_СЛОВА ; // Разбивка текста окна на слова
call ДОП_ТИП_СЛОВ ; // Дополнительные типы
mov SI, КОД_КОМ_ОСКОБКА
call ВЛО_СКО ; // Вложене скобок
mov SI,КОД_КОМ_НАЧАЛО
call ВЛО_СКО ; // Вложене скобок
mov si,.ПЛЮСМИНУС ;
call ВЛО_МАТ ; // Вложение математических операций
mov si,.УМНОЖДЕЛЕ ;
call ВЛО_МАТ ; // Вложение математических операций
mov si,.ЛОГИЧОПЕР ;
call ВЛО_МАТ ; // Вложение математических операций
mov si,.ПРИСВАИВА ;
call ВЛО_МАТ ; // Вложение математических операций
mov cx,КОД_КОМ_ОСКОБКА ;
Call ВЛО_ПАР ; // Вложеие параметрво
mov cx,КОД_КОМ_НАЧАЛО ; //
Call ВЛО_ПАР ; // Вложеие параметрво
;----------------------------------------------
;call ВЫПОЛНИТЬ_ВЛ;
mov ax,ВЫПОЛНИТЬ_ВЛ ;
call ДОБАВИТЬ_ПРОЦЕС ;
;// Добавить ПРоцесс (СОСТОЯНИЕ РЕГИСТРОВ АДР)
;call ЭЛЕ_ПРОСМОТР;
;call БИОС_ОЖИДАНИЕ;
popad;
ret;
.ПЛЮСМИНУС: DW КОД_КОМ_СЛОЖЕНИЕ,КОД_КОМ_ВЫЧИТАНИЕ,0;
.УМНОЖДЕЛЕ: DW КОД_КОМ_УМНОЖЕНИЕ,КОД_КОМ_ДЕЛЕНИЕ,0;
.ЛОГИЧОПЕР: DW КОД_КОМ_БОЛЬШЕ,КОД_КОМ_МЕНЬШЕ,КОД_КОМ_РАВНО,КОД_КОМ_НЕРАВНО,КОД_КОМ_МЕНРА,КОД_КОМ_БОЛРА,0;
.ПРИСВАИВА: DW КОД_КОМ_ПРИСВОЕНИЕ,0;
;==============================================================================}
ВЫПОЛНИТЬ_БЛОК :;{ Выполняет блок
pushad;
call ВЫПОЛНИТЬ_ВЛ;
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_МАТОП :;{ Выполняет МАТ операцию
pushad;
;-------------------;
call ТИП_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI ;
cmp ax,КОД_КОМ_ПРИСВОЕНИЕ;
jz .НЕ_ПРИСВОЕНИЕ ;
call ВЫПОЛНИТЬ_ПЕРВЫЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
.НЕ_ПРИСВОЕНИЕ:call ВЫПОЛНИТЬ_ВТОРОЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
;-------------------;
CALL ТИП_ОПЕРАЦИИ_EL_DI ;
cmp ax,КОМ_СТР_ЧИС_ЧИС ;
jz .СТР_ЧИС_ЧИС ;
cmp ax,КОМ_СТР_ЧИС_СТР ;
jz .СТР_ЧИС_СТР ;
cmp ax,КОМ_СТР_СТР_ЧИС ;
jz .СТР_СТР_ЧИС ;
cmp ax,КОМ_СТР_СТР_СТР ;
jz .СТР_СТР_СТР ;
jmp .ВЫХОД
.СТР_ЧИС_ЧИС:;{
call ВЫПОЛНИТЬ_СТР_ЧИС_ЧИС ;
jmp .ВЫХОД ;
;--------------------------}
.СТР_ЧИС_СТР:;{
call ВЫПОЛНИТЬ_СТР_ЧИС_СТР ;
jmp .ВЫХОД ;
;--------------------------}
.СТР_СТР_ЧИС:;{
call ВЫПОЛНИТЬ_СТР_СТР_ЧИС ;
jmp .ВЫХОД ;
;--------------------------}
.СТР_СТР_СТР:;{
call ВЫПОЛНИТЬ_СТР_СТР_СТР ;
jmp .ВЫХОД ;
;--------------------------}
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_ВЫВОД :;{ Выполняет операцияю ВЫВОДА В КОНСОЛЬ
pushad;
mov bx,di;
call ВЫПОЛНИТЬ_ВЛ ; // Запускаем элемнт на вполнение
mov cx,КОД_ОКН_МОНИТОР ;
Call ПОИСК_ЭЛЕМЕНТА_ПО_КОДУ_CX_С_ЭЛЕМЕНТА_DI;
mov cx,КОД_ПАР_ТЕКС;
call ЭЛЕ_ПОИСК_ВН_ПО_КОДУ_CX;
jz .ВЫХОД
mov cx,di;
mov di,bx;
call ЭЛЕ_ВЛО;
mov dx,ax;
call ДОБ_ЗНА_В_ЭЛЕ_CX_ИЗ_ЭЛЕ_DX;
mov di,cx;
call ЭЛЕ_ЗНА;
mov di,ax;
mov al,13;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI
.ПОВТОР: mov di,cx;
call ЭЛЕ_ЗНА;
mov di,ax;
call ВОЗАРАЩАЕТ_В_DI_ДЛИНУ_СТРОКИ_DI;
cmp di,20;
jb .ДАЛЕЕ;
mov di,cx;
call ЭЛЕ_ЗНА;
mov di,ax;
call УДАЛИТЬ_БУКВУ_В_НАЧАЛЕ_СТРОКИ;
jmp .ПОВТОР;
.ДАЛЕЕ:
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_СКОБКУ :;{ Выполняет операцияю СКОБКА
pushad;
;----------------;
push di ;
call ЭЛЕ_РОДИТЕЛЬ;
call ЭЛЕ_ФУН ;
pop di ;
jnz .ВЫХОД ;
;----------------;
call ВЫПОЛНИТЬ_ВЛ;
mov cx,di;
call ЭЛЕ_ЗНА ;
mov si,ax;
mov Byte[si],0
call ЭЛЕ_ВЛО ;
.ЦИКЛ:
test ax,ax ;
jz .ВЫХОД ;
mov di,ax ;
mov dx,ax ;
call ДОБ_ЗНА_В_ЭЛЕ_CX_ИЗ_ЭЛЕ_DX;
call ЭЛЕ_СЛЕ ;
jmp .ЦИКЛ;
.КЦИКЛ:
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_ФУНКЦИЮ :;{ Выполняет ФУНКЦИЮ
pushad;
mov dx,di ; // Сохраняем адрес выполняемого элмента
call ЭЛЕ_КОД ; // Читаем его имя
mov cx,ax ;
call ПОИСК_ЭЛЕМЕНТА_ПО_КОДУ_CX_С_ЭЛЕМЕНТА_DI ; // Производим поиск элемнета (функция процедура или параметр )
jz .ВЫХОД;
call ЭЛЕ_КОПИЯ_ВС ; // Создаем экземпляр функции
mov bx,DI ; // Запоминаем адрес выполненгого экземплярпа функции
call ЭЛЕ_КОПИЯ_ПА ; // Копируем параметры
call ЭЛЕ_ВЛО;
jz .ДАЛЕЕ;
mov di,ax;
call ЭЛЕ_СЛЕ;
jz .ДАЛЕЕ;
mov di,ax;
call ВЫПОЛНИТЬ_ЭЛ ; // Выполняем
.ДАЛЕЕ:
call КОП_ЗНА_В_ЭЛЕ_DX_ИЗ_ЭЛЕ_BX;
mov di,bx
call ЭЛЕ_ОСВОБОДИ ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_ЦИКЛ_ПОКА :;{ Выполняет ЦПОКА
pushad;
.ПОВТОРИТЬ: call ВЫПОЛНИТЬ_ПЕРВЫЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
call ТИП_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI;
cmp ax,ТИП_СТРО ;
jz .ЭТО_СТРОКА ;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX ;
test ax,ax ;
jz .ВЫХОД ;
call ВЫПОЛНИТЬ_ВТОРОЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
jmp .ПОВТОРИТЬ ;
;-------------------------------------------------;
.ЭТО_СТРОКА: call ЭКРАН_ВЫВОД_ПРОВЕРКА;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX ; ;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЛОГИКУ_DX;
test dx,dx ;
jz .ВЫХОД ;
call ВЫПОЛНИТЬ_ВТОРОЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
jmp .ПОВТОРИТЬ ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_УСЛОВИЕ :;{ Выполняет УСЛОВИЕ
pushad;
call ВЫПОЛНИТЬ_ПЕРВЫЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
call ТИП_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI;
cmp ax,ТИП_СТРО ;
jz .ЭТО_СТРОКА ;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX ;
test ax,ax ;
jz .ВЫХОД ;
call ВЫПОЛНИТЬ_ВТОРОЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
jmp .ВЫХОД ;
;-------------------------------------------------;
.ЭТО_СТРОКА:
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX ;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЛОГИКУ_DX ;
test dx,dx ;
jz .ВЫХОД ;
call ВЫПОЛНИТЬ_ВТОРОЙ_ВЛОЖЕНЫЙ_ЭЛЕМЕНТ_ЭЛЕМЕНТА_DI;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ТИП_ОПЕРАЦИИ_EL_DI :;{ ОПРЕДЕЛЯЕТ Тип ОПерации для знака DI
push di;
push dx;
push cx;
mov dx,0
call ЭЛЕ_ТИП ;
mov cl,100 ;
mul cl ;
add dx,ax ;
Call ТИП_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI;
mov cl,10 ;
mul cl ;
add dx,ax ;
Call ЗАПИСАТЬ_В_AX_ТИП_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_В_ЭЛЕМЕНТ_DI ;
add dx,ax ;
mov ax,dx ;
pop cx
pop dx ;
pop di ;
ret;
;==============================================================================}
ТИП_ОПЕРАЦИИ_DI_BX :;{ ОПРЕДЕЛЯЕТ Тип ОПерации для DI BX
push di;
push dx;
mov dx,0
call ЭЛЕ_ТИП ; // Определяем тип результата
mov cl,10 ;
mul cl ;
add dx,ax ;
mov di,bx ;
call ЭЛЕ_ТИП ; // Определяем тип результата
add dx,ax ;
mov ax,dx ;
pop dx ;
pop di ;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_СТР_ЧИС_ЧИС :;{
pushad;
call ЭЛЕ_КОД;
cmp ax,КОД_КОМ_ПРИСВОЕНИЕ ;
jnz .ДАЛЕЕ01;
call ПРИСВОЕНИЕ_СТР_ЧИС_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ01:
cmp ax,КОД_КОМ_СЛОЖЕНИЕ ;
jnz .ДАЛЕЕ02;
call СЛОЖЕНИЕ_СТР_ЧИС_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ02:
cmp ax,КОД_КОМ_ВЫЧИТАНИЕ ;
jnz .ДАЛЕЕ03;
call ВЫЧИТАНИЕ_СТР_ЧИС_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ03:
cmp ax,КОД_КОМ_УМНОЖЕНИЕ ;
jnz .ДАЛЕЕ04;
call УМНОЖЕНИЕ_СТР_ЧИС_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ04:
cmp ax,КОД_КОМ_БОЛЬШЕ ;
jnz .ДАЛЕЕ05;
call БОЛЬШЕ_СТР_ЧИС_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ05:
cmp ax,КОД_КОМ_МЕНЬШЕ ;
jnz .ДАЛЕЕ06;
call МЕНЬШЕ_СТР_ЧИС_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ06:
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_СТР_ЧИС_СТР :;{
pushad;
call ЭЛЕ_КОД;
cmp ax,КОД_КОМ_ПРИСВОЕНИЕ ;
jnz .ДАЛЕЕ01;
call ПРИСВОЕНИЕ_СТР_ЧИС_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ01:
cmp ax,КОД_КОМ_СЛОЖЕНИЕ ;
jnz .ДАЛЕЕ02;
call СЛОЖЕНИЕ_СТР_ЧИС_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ02:
cmp ax,КОД_КОМ_ВЫЧИТАНИЕ ;
jnz .ДАЛЕЕ03;
call ВЫЧИТАНИЕ_СТР_ЧИС_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ03:
cmp ax,КОД_КОМ_УМНОЖЕНИЕ ;
jnz .ДАЛЕЕ04;
call УМНОЖЕНИЕ_СТР_ЧИС_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ04:
cmp ax,КОД_КОМ_БОЛЬШЕ ;
jnz .ДАЛЕЕ05;
call БОЛЬШЕ_СТР_ЧИС_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ05:
cmp ax,КОД_КОМ_МЕНЬШЕ ;
jnz .ДАЛЕЕ06;
call МЕНЬШЕ_СТР_ЧИС_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ06:
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_СТР_СТР_ЧИС :;{
pushad;
call ЭЛЕ_КОД;
cmp ax,КОД_КОМ_ПРИСВОЕНИЕ ;
jnz .ДАЛЕЕ01;
call ПРИСВОЕНИЕ_СТР_СТР_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ01:
cmp ax,КОД_КОМ_СЛОЖЕНИЕ ;
jnz .ДАЛЕЕ02;
call СЛОЖЕНИЕ_СТР_СТР_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ02:
cmp ax,КОД_КОМ_ВЫЧИТАНИЕ ;
jnz .ДАЛЕЕ03;
call ВЫЧИТАНИЕ_СТР_СТР_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ03:
cmp ax,КОД_КОМ_УМНОЖЕНИЕ ;
jnz .ДАЛЕЕ04;
call УМНОЖЕНИЕ_СТР_СТР_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ04:
cmp ax,КОД_КОМ_БОЛЬШЕ ;
jnz .ДАЛЕЕ05;
call БОЛЬШЕ_СТР_СТР_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ05:
cmp ax,КОД_КОМ_МЕНЬШЕ ;
jnz .ДАЛЕЕ06;
call МЕНЬШЕ_СТР_СТР_ЧИС;
jmp .ВЫХОД;
.ДАЛЕЕ06:
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫПОЛНИТЬ_СТР_СТР_СТР :;{
pushad;
call ЭЛЕ_КОД;
cmp ax,КОД_КОМ_ПРИСВОЕНИЕ ;
jnz .ДАЛЕЕ01;
call ПРИСВОЕНИЕ_СТР_СТР_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ01:
cmp ax,КОД_КОМ_СЛОЖЕНИЕ ;
jnz .ДАЛЕЕ02;
call СЛОЖЕНИЕ_СТР_СТР_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ02:
cmp ax,КОД_КОМ_ВЫЧИТАНИЕ ;
jnz .ДАЛЕЕ03;
call ВЫЧИТАНИЕ_СТР_СТР_СТР;
jmp .ДАЛЕЕ03;
.ДАЛЕЕ03:
cmp ax,КОД_КОМ_УМНОЖЕНИЕ ;
jnz .ДАЛЕЕ04;
call УМНОЖЕНИЕ_СТР_СТР_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ04:
cmp ax,КОД_КОМ_БОЛЬШЕ ;
jnz .ДАЛЕЕ05;
call БОЛЬШЕ_СТР_СТР_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ05:
cmp ax,КОД_КОМ_МЕНЬШЕ ;
jnz .ДАЛЕЕ06;
call МЕНЬШЕ_СТР_СТР_СТР;
jmp .ВЫХОД;
.ДАЛЕЕ06:
.ВЫХОД:
popad;
ret;
;==============================================================================}
ПРИСВОЕНИЕ_СТР_ЧИС_ЧИС:;{
pushad;
popad;
ret;
;==============================================================================}
ПРИСВОЕНИЕ_СТР_ЧИС_СТР:;{
pushad;
popad;
ret;
;==============================================================================}
ПРИСВОЕНИЕ_СТР_СТР_ЧИС:;{
pushad;
mov bx,di;
call ПОЛУЧИТЬ_КОД_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_В_ЭЛЕМЕНТ_DI;
mov cx,ax;
call ПОИСК_ЭЛЕМЕНТА_ПО_КОДУ_CX_С_ЭЛЕМЕНТА_DI;
jz .ВЫХОД;
mov cx,di; // ПОлучаем адрес элемента куда нужно записать результат
mov di,bx;
call ЗАПИСЫВАЕТ_В_DI_АДРЕС_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI;
mov dx,di;
Call КОП_ЗНА_В_ЭЛЕ_CX_ИЗ_ЭЛЕ_DX
.ВЫХОД:
popad;
ret;
;==============================================================================}
ПРИСВОЕНИЕ_СТР_СТР_СТР:;{
pushad
mov bx,di;
call ПОЛУЧИТЬ_КОД_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_В_ЭЛЕМЕНТ_DI;
mov cx,ax;
call ПОИСК_ЭЛЕМЕНТА_ПО_КОДУ_CX_С_ЭЛЕМЕНТА_DI;
jz .ВЫХОД;
mov cx,di;
mov di,bx;
call ЗАПИСЫВАЕТ_В_DI_АДРЕС_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI;
mov dx,di;
Call КОП_ЗНА_В_ЭЛЕ_CX_ИЗ_ЭЛЕ_DX
.ВЫХОД:
popad;
ret;
;==============================================================================}
СЛОЖЕНИЕ_СТР_ЧИС_ЧИС :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX
add dx,cx;
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret;
;==============================================================================}
СЛОЖЕНИЕ_СТР_ЧИС_СТР :;{
pushad;
mov bx,di ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .СУМ_ЧИС_СТР ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
mov cx,ax;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
add dx,cx;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ;
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
Jmp .ВЫХОД ;
;-------------------;
.СУМ_ЧИС_СТР:
;-------------------;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov si,ax ;
mov Byte [si],0 ;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_SI_СТРОКУ_AX;
;-------------------;
.ВЫХОД:
popad;
ret
;==============================================================================}
СЛОЖЕНИЕ_СТР_СТР_ЧИС :;{
pushad;
call ЭЛЕ_ЗНА;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX
call ЕСЛИ_СТРОКА_CX_ЧИСЛО_ФЛАГ_Z_1;
jz .СУМ_СТР_ЧИС ;
;--------------------;
call ПЕРЕВОДИТ_СТРОКУ_CX_В_ЧИСЛО_CX
add dx,cx;
call ЗАПИСАТЬ_ЧИСЛО_DX_В_СТРОКУ_AX
Jmp .ВЫХОД ;
;--------------------;
.СУМ_СТР_ЧИС:
call ЗАПИСАТЬ_СТРОКУ_CX_В_СТРОКУ_AX
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_AX
;-------------------;
.ВЫХОД:
popad;
ret
;==============================================================================}
СЛОЖЕНИЕ_СТР_СТР_СТР :;{
pushad;
call ЭЛЕ_ЗНА;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX
call ЕСЛИ_СТРОКА_CX_ЧИСЛО_ФЛАГ_Z_1;
jz .СУМ_СТР ;
call ЕСЛИ_СТРОКА_DX_ЧИСЛО_ФЛАГ_Z_1;
jz .СУМ_СТР ;
;-------------------;
call ПЕРЕВОДИТ_СТРОКУ_CX_В_ЧИСЛО_CX
call ПЕРЕВОДИТ_СТРОКУ_DX_В_ЧИСЛО_DX
add dx,cx;
call ЗАПИСАТЬ_ЧИСЛО_DX_В_СТРОКУ_AX
Jmp .ВЫХОД ;
;-------------------;
.СУМ_СТР:
;-------------------;
call ЗАПИСАТЬ_СТРОКУ_CX_В_СТРОКУ_AX;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_AX_СТРОКУ_DX;
;-------------------;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫЧИТАНИЕ_СТР_ЧИС_ЧИС :;{
pushad;
popad;
ret;
;==============================================================================}
ВЫЧИТАНИЕ_СТР_ЧИС_СТР :;{
pushad;
mov bx,di ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
mov cx,ax;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
sub cx,dx;
mov dx,cx;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ;
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
Jmp .ВЫХОД ;
;-------------------;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ВЫЧИТАНИЕ_СТР_СТР_ЧИС :;{
pushad;
mov bx,di ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
mov dx,ax;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
sub dx,ax;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ;
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
Jmp .ВЫХОД ;
;-------------------;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ВЫЧИТАНИЕ_СТР_СТР_СТР :;{
pushad;
mov bx,di;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
mov cx,dx;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
SUB cx,dx ;
mov dx,cx ;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ;
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
;-------------------;
.ВЫХОД:
popad;
ret;
;==============================================================================}
УМНОЖЕНИЕ_СТР_ЧИС_ЧИС :;{
pushad;
mov bx,di;
;-------------------;
mov bx,DI ; // Запоминаем адрес корневого элемната Имя (+)
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
mov dx,ax ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
mul dx;
mov dx,ax;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ; // Обнуляем строку CX
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
popad;
ret;
;==============================================================================}
УМНОЖЕНИЕ_СТР_ЧИС_СТР :;{
pushad;
mov bx,di ;
;-------------------;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
mov cx,ax;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
mov ax,cx;
mul dx;
mov dx,ax;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ;
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
Jmp .ВЫХОД ;
;-------------------;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
УМНОЖЕНИЕ_СТР_СТР_ЧИС :;{
pushad;
mov bx,di ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
mov dx,ax;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
mul dx;
mov dx,ax;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ;
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
Jmp .ВЫХОД ;
;-------------------;
.ВЫХОД:
popad;
ret;
;==============================================================================}
УМНОЖЕНИЕ_СТР_СТР_СТР :;{
pushad;
mov bx,di;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1;
jz .ВЫХОД ;
;-------------------;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
mov ax,dx ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX
mul dx ;
mov dx,ax ;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ;
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
;-------------------;
.ВЫХОД:
popad;
ret;
;==============================================================================}
БОЛЬШЕ_СТР_ЧИС_ЧИС :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
cmp cx,dx;
ja .БОЛЬШЕ ;
.МЕНЬШЕ: mov dx,0 ;
JMP .ДАЛЕЕ ;
.БОЛЬШЕ: mov dx,1 ;
jmp .ДАЛЕЕ ;
.ДАЛЕЕ:
Call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret;
;==============================================================================}
БОЛЬШЕ_СТР_ЧИС_СТР :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
call ЧИСЛО_CX_БОЛЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1
jnz .БОЛЬШЕ ;
.МЕНЬШЕ: mov dx,0 ;
jmp .ДАЛЕЕ ;
.БОЛЬШЕ: mov dx,1 ;
jmp .ДАЛЕЕ ;
.ДАЛЕЕ:
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret
;==============================================================================}
БОЛЬШЕ_СТР_СТР_ЧИС :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
call СТРОКА_CX_БОЛЬШЕ_ЧИСЛА_DX_ФЛАГ_Z_1;
jnz .БОЛЬШЕ ;
.МЕНЬШЕ: mov dx,0 ;
jmp .ДАЛЕЕ ;
.БОЛЬШЕ: mov dx,1 ;
jmp .ДАЛЕЕ ;
.ДАЛЕЕ:
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret
;==============================================================================}
БОЛЬШЕ_СТР_СТР_СТР :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
call СТРОКА_CX_БОЛЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1;
jnz .БОЛЬШЕ ;
.МЕНЬШЕ: mov dx,0 ;
jmp .ДАЛЕЕ ;
.БОЛЬШЕ: mov dx,1 ;
jmp .ДАЛЕЕ ;
.ДАЛЕЕ:
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret
;==============================================================================}
МЕНЬШЕ_СТР_ЧИС_ЧИС :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
cmp dx,cx;
jB .МЕНЬШЕ ;
.БОЛЬШЕ: mov dx,0 ;
JMP .ДАЛЕЕ ;
.МЕНЬШЕ: mov dx,1 ;
jmp .ДАЛЕЕ ;
.ДАЛЕЕ:
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret;
;==============================================================================}
МЕНЬШЕ_СТР_ЧИС_СТР :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
call ЧИСЛО_CX_МЕНЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1
jnz .МЕНЬШЕ ;
.БОЛЬШЕ: mov dx,0 ;
jmp .ДАЛЕЕ ;
.МЕНЬШЕ: mov dx,1 ;
jmp .ДАЛЕЕ ;
.ДАЛЕЕ:
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret
;==============================================================================}
МЕНЬШЕ_СТР_СТР_ЧИС :;{
pushad ;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
call СТРОКА_CX_МЕНЬШЕ_ЧИСЛА_DX_ФЛАГ_Z_1;
jnz .МЕНЬШЕ ;
.БОЛЬШЕ: mov dx,0 ;
jmp .ДАЛЕЕ ;
.МЕНЬШЕ: mov dx,1 ;
.ДАЛЕЕ:
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad ;
ret ;
;==============================================================================}
МЕНЬШЕ_СТР_СТР_СТР :;{
pushad;
call ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX;
call СТРОКА_CX_МЕНЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1;
jnz .МЕНЬШЕ ;
.БОЛЬШЕ: mov dx,0 ;
jmp .ДАЛЕЕ ;
.МЕНЬШЕ: mov dx,1 ;
jmp .ДАЛЕЕ ;
.ДАЛЕЕ:
call ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ
popad;
ret
;==============================================================================}
;==============================================================================}
;{ ФУНКЦИИ ДЛЯ РАБОТЫ C ЭЛЕМЕНТАМИ .
;---{ Чтение значения полей элементов
ЭЛЕ_ТИП:;{ Возвращает в AX Тип элемента DI
push di ;
xor ax,ax ;
add DI,ЭЛ_ТИП;
mov al,[di] ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_ФУН:;{ Возвращает в AX Являеться ли элемента DI функцией устанавливает флаг Z если это функция
push di ;
xor ax,ax ;
add DI,ЭЛ_ФУН;
mov al,[di] ;
test al,al ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_ИМЯ:;{ Возвращает в AX ИМЯ элемента DI
push di ;
add DI,ЭЛ_ИМЯ;
mov ax,[di] ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_БУК:;{ Возвращает в AX первую букву ИМЯ элемента DI
push si ;
call ЭЛЕ_ИМЯ;
mov si,ax ;
mov al,[si];
pop si ;
ret;
;==============================================================================}
ЭЛЕ_ЗНА:;{ Возвращает в AX Значение элемента DI
push di ;
add DI,ЭЛ_ЗНА;
mov ax,[di] ;
test ax,ax ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_ПРЕ:;{ Возвращает в AX Предыдущий элемент элемента DI
push di ;
add DI,ЭЛ_ПРЕ;
mov ax,[di] ;
test ax,ax ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_СЛЕ:;{ Возвращает в AX Следующий элемент элемента DI
push di ;
add DI,ЭЛ_СЛЕ;
mov ax,[di] ;
test ax,ax ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_РОД:;{ Возвращает в AX Родительский элемент элемента DI
push di ;
add DI,ЭЛ_РОД;
mov ax,[di] ;
test ax,ax ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_ВЛО:;{ Возвращает в AX Первый вложеный элемент элемента DI
push di ;
add DI,ЭЛ_ВЛО;
mov ax,[di] ;
test ax,ax ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_КОД:;{ Возвращает в AX Код элемент элемента DI
push di ;
add DI,ЭЛ_КОД;
mov ax,[di] ;
test ax,ax ;
pop di ;
ret ;
;==============================================================================}
;---}
СОЗДАТЬ_КОРНЕВОЙ_ЭЛЕМЕНТ:;{ Создание коневого элемента
pushad;
mov SI,ИМЯ_КОР ;// Указывает адрес строки с именем котрое нужно присвоимть элементу
mov DI,0 ;// Указывает в каком элементе создаем элемент
mov al,0 ;
mov AH,0 ;// Указываем Являетсья ли элмеент функцией
mov bx,0 ;// Указываем значение
Call ЭЛЕ_СОЗДАТЬ ;// Создаем элемент
mov [КОР_ЭЛЕМ],di;// Записываем адрес созданого элемента
popad;
ret;
ИМЯ_КОР: DB "КОР_ЭЛЕ",0,0;
;==============================================================================}
СОЗДАТЬ_ТАБЛИЦУ_ПОТОКОВ:;{ Создание ТАБЛИЦУ ПОТОКОВ
pushad;
mov di,1024;
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI;
mov [ПОТОКИ],di;
popad;
ret;
;==============================================================================}
ВЫВОД_ИМЕНИ_ЭЛЕМЕНТА_DI:;{ Выводит имя элемнта адрес котрого в DI на экран
push di;
call ЭЛЕ_ИМЯ;
call СТРОКАAX
pop di;
ret;
;===}
ЭЛЕ_СОЗДАТЬ : СОЗ_ЭЛЕ_DI_ИМЯ_SI_ТИП_AL_ФУН_AH_ЗНА_BX_РОД_DI :;{ возвращает адрес внось созданого элемента в DI Создание элемента с именем SI-адрес строки с именем элемента AL - Тип элемента Ah Показатель функции DI- адрес того элемента в котрый добвавлем BX- Значение
pushad
;--------------------;
mov CX,DI ;// Запоминаем дарес того элемента в котирый нужно добавить Созданый элемент
mov DI,16 ;// Выделяем участок памяти под элемент
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI;
mov DX,DI; ;// Указываем новый элемент то что его нужно добавить
mov DI,CX ;// Указываем родительский элемент
call ДОБ_ЭЛЕ_DX_В_ЭЛЕ_DI;// Добавляем
;--------------------;
;--------------------;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_16_БАЙТ;// Создаем строку с именем элемента
mov cx,di ;// Запоминаем адрес созданой строки
mov di,si ;
mov si,cx ;
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI;// в CX АДРЕС НОВОЙ строки с именем
mov si,dx ;
add si,ЭЛ_ИМЯ ;
mov [si],cx ;
;----------------------;
call СЛО_В_КОДCX ;
mov si,dx ;
add si,ЭЛ_КОД ;
mov [si],cx ;
;----------------------;
mov si,dx ;
add si,ЭЛ_ЗНА ;
mov [si],bx ;
;----------------------;
mov si,dx ;// Указываем тип элемента
add si,ЭЛ_ТИП ;
mov [si],al ;
;--------------------;
mov si,dx ;// Указываем являеться ли элемент функцией
add si,ЭЛ_ФУН ;
mov [si],ah ;
;--------------------;
pop SI ;
push dX ;
popad ;
ret ;
;==============================================================================}
ЭЛЕ_СОЗДАТЬ2: СОЗ_ЭЛЕ_DI_ИМЯ_DI_ТИП_AL__ЗНА_DI_РОД_DX :;{ AL- ТИП DI-СТРОКА DX - РОДИТЕЛЬ Создаем элемен Из строки DI Не являеться функцией
pushad;
mov ah,0 ; // Не являеться функцией просто оператор
mov si,di ; // Имя элемента если это словол и занчкение однаквое
cmp al,ТИП_ЧИСЛ ;
jNz .ЭТО_СТРОКА ;
call ПЕРЕВОДИТ_СТРОКУ_DI_В_ЧИСЛО_BX;
jmp .ДАЛЕЕ;
.ЭТО_СТРОКА: mov bx,di ; // в DI содержиться адрес строки содержащей прочитаное слово
.ДАЛЕЕ: mov di,dx ; // Указываем родительский элемент для создаваемого
call ЭЛЕ_СОЗДАТЬ ;
popad;
ret;
;==============================================================================}
ЭЛЕ_КОПИЯ_ПА:;{ Копирвоание параметров Функции DX В DI
pushad;
;-----------;
mov ax,dx ;
call ЭЛЕ_ЧИТ_СКО_ИЗ_ЭЛЕ_AX;
jz .ВЫХОД ;
mov bx,ax ;
;-----------;
mov ax,di ;
call ЭЛЕ_ЧИТ_СКО_ИЗ_ЭЛЕ_AX;
jz .ВЫХОД ;
mov di,ax ;
.ЦИКЛ:
test di,di ;
jz .ВЫХОД ;
test bx,bx ;
jz .ВЫХОД ;
call КОП_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_BX;
call ЭЛЕ_СЛЕ ;
mov di,ax;
push di;
mov di,bx;
call ЭЛЕ_СЛЕ ;
mov bx,ax;
pop di;
jmp .ЦИКЛ;
.КЦИКЛА:
.ВЫХОД:
popad;
ret;
;==============================================================================}
ЭЛЕ_РОДИТЕЛЬ:;{ Возвращает в регистре DI Адрес родительского элемента в DI сразу устанавливает флаг Z=0 если NIL
add DI,ЭЛ_РОД;// ПРибавляем к адресу элемента DI смещение для чтения РОдителя
mov DI,[DI] ;// ЧИтаем адрес родителя
test DI,DI ;// ПРоверяем есть ли родитель устанавливаем флаг
ret ;// Сразу устанвливает флаг если NIL
;==============================================================================}
ЭЛЕ_ПОСЛЕД :;{ Находит последний элемент в списке элемента DI
pushad ;
mov si,0 ;// ПО умолчанию резальтат равен 0 то биш нету вложеных елемнтов а следователоьно и нету последнего элемента
call ЭЛЕ_ВЛО ;// открываем первый элемент вложеного списка в элементе Di В регистр AX
.ЦИКЛ:
TEST AX,AX ;// Проверяем не достигли ли мы нулевого элемента
JZ .КЦИКЛ ;// Если дрстигли нулевой элемент то выходим из списка
Mov Si,ax ;// Запоминаем последний не нуллевой элемент в списке
Mov di,ax ;
call ЭЛЕ_СЛЕ ;// Переходим к следующему элементу
Jmp .ЦИКЛ ;
.КЦИКЛ:
pop di ;
test si,si ;
push SI ;// Возврвщаемый элемент храниться в SI но возвпращаеться в регистре DI
popad ;
ret ;
;==============================================================================}
ЭЛЕ_ИМЯ_РАВ :;{ Сравнивает имя элемента с строкой CX
pushad;
call ЭЛЕ_ИМЯ ;
mov SI,AX ;
mov DI,CX ;
call СРАВНИТЬ_СТРОКИ_SI_DI;
popad ;
ret;
;==============================================================================}
ЭЛЕ_ИМЯ_РАВФ:;{ Сравнивает имя элемента с строкой CX и проверяет являеться ли функцией элемент
pushad ;
call ЭЛЕ_ФУН ;// Устанавливает флаг Z если это функция возвращает в AX значение поля Функция элемента
jz .ВЫХОД ;// Если не функцуия то выход
call ЭЛЕ_ИМЯ_РАВ ;// сравниаем имена Устанвливает флаг Z если равн имена
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ЭЛЕ_ПОИСК_ПР:;{ ПОиск элемента с именем CX в предыдущих элементах элемента DI возвращает результат в DI
pushad;
mov si,0 ;// По умолчанию резльутат равен 0 то есть не нашел
.ЦИКЛ:
;-----------------
call ЭЛЕ_ПРЕ ;
JZ .ВЫХОД ;
mov DI,AX ;
CALL ЭЛЕ_ИМЯ_РАВФ;
JNZ .НАШОЛ ;
jmp .ЦИКЛ ;
;-----------------
.НАШОЛ: mov si,DI ;
.ВЫХОД:
test si,si ;
pop ax;
push si;
popad ;
ret ;
;==============================================================================}
ЭЛЕ_ПОИСК_ПА:;{ ПОиск элемента с именем CX в параметрах элемента DI
PUSHAD;
mov si,0 ; ПО умолчанию результат равен 0 то есть не нашли
call ЭЛЕ_ФУН ; // ПРоверяем функция ли это
jz .ВЫХОД ;
;-----------------
Call ЭЛЕ_ВЛО ; ПРоверяем еть ли вообще параметры внутри элемента
JZ .ВЫХОД ;
mov di,ax ;
call ЭЛЕ_КОД ;
cmp ax,КОД_КОМ_ОСКОБКА;// проверяем что это скобка
jnz .ВЫХОД ;
Call ЭЛЕ_ВЛО ; ПРоверяем еть ли элемнет внтури скобки
.ЦИКЛ:
test ax,ax ;
jz .ВЫХОД ;
mov di,ax ;
call ЭЛЕ_ИМЯ_РАВ ;
jnz .НАШЛИ ; Еслти это элемент с с искомым именем идем на выход элемент найден
;-----------------
call ЭЛЕ_СЛЕ ;
Jmp .ЦИКЛ ;
;-----------------
.НАШЛИ: mov SI,DI ;
.ВЫХОД:
test si,si ;
pop di ;
push si ;
popad ;
ret ;
;==============================================================================}
ЭЛЕ_ПОИСК :;{ Поиск элемента по имени наружу ищит елемнт с именем CX с элемента DI элемент DI не участвует в поиске
push ax;
;----------------;
mov ax,di ;// Запоминаем элемент с котрого ведем поиск
;----------------;
call ЭЛЕ_ИМЯ_РАВФ ;
jz .ДАЛЕЕ ;
jmp .ВЫХОД ;
.ДАЛЕЕ:
;----------------;
mov di,ax ;
call ЭЛЕ_ПОИСК_ПР ;// Ищим в предыдущих элементах
jnz .ВЫХОД ;
;----------------;
mov di,ax ;
call ЭЛЕ_ПОИСК_ПА ;// Ищим в параметрах
jnz .ВЫХОД ;
;----------------;
mov di,ax ;
call ЭЛЕ_РОДИТЕЛЬ ; Ищитм в родительском элементе
jz .ВЫХОД ;
;----------------;
call ЭЛЕ_ПОИСК ;
.ВЫХОД:
test di,di ;
pop ax ;
ret ;
;==============================================================================}
ЭЛЕ_УДАЛИТЬ :;{ Удаяляет элемент DI из списка
pushad
;-----------;
call ЭЛЕ_ПРЕ ;// CX Запоминаем предыдущий элемент удаляемлого элемента в регистр
mov cx,ax; ;
;-----------;
;-----------;
call ЭЛЕ_СЛЕ ;// DX Запоминаем предыдущий элемент удаляемлого элемента в регистр
mov Dx,ax; ;
;-----------;
;------------
test cx,cx ;// Записываем в предыдущем элементе следуюший элемент
jz .НЕТУ1 ;// Проверяем есть ли вообще предыдущий элмеент
Mov Si,Cx ;
add Si,ЭЛ_СЛЕ;
Mov [si],dx ;
;------------
.НЕТУ1: ;------------
test dx,dx ;// Записываем в Cледующем элементе предыдущимй
jz .НЕТУ2 ;// ПРоверяем если вообще следующий элемент
mov si,dx ;
add si,ЭЛ_ПРЕ;
mov [si],cx ;
;------------
.НЕТУ2: ;-------------// Настройка родительского элемента
call ЭЛЕ_РОД ;// Читаем адрес родительского эдемента
test ax,ax ;// Проверяем есть ли вобще родительский элемент
Jz .НЕТУ3 ;// Если нету родительского элемента то идем дальше
add ax,ЭЛ_ВЛО ;// Читем поле блок родительского элменета
mov si,ax ;
mov ax,[si] ;// ПРочитали значение поля BLO родительского элменета
cmp ax,di ;// ПРоверяем не являемся ли мы первым элментом вложеного спсика в родительском элементе
Jnz .НЕТУ3 ;// Если мы не указаны в родительском элементе идем дальше
mov [si],dx ;// сли указаны то записываем след элемент вместо себя
.НЕТУ3: ;// Отстыковка элемнта
mov Si,di ;// Востанавливаем значение удаляемог элмента
add SI,ЭЛ_РОД ;
mov word[si],0 ;// остоеденяем родительский элемент
inc Si ;
inc si ;// Переходим к полю предыдущий элемент
mov word[si],0 ;// остоеденяем предыдущий элемент
inc Si ;
inc si ;// Переходим к полю следующий элемент
mov word[si],0 ;// остоеденяем Следующий элемент
.ВЫХОД:
popad
ret;
;==============================================================================}
ЭЛЕ_КОПИЯ_ВС:;{ Копию элемнта Di и всех вложеных элемнтов и назначать родителя DX созданая копия возвращеться в DI
pushad
test di,di ;
jnz .ДАЛЕЕ ;
mov dx,0 ;
jmp .ВЫХОД ;
.ДАЛЕЕ:
push di ;
call ЭЛЕ_КОПИЯ;
mov dx,di ;
pop di ;
call ЭЛЕ_ВЛО ;
.ЦИКЛ:
test ax,ax ;
jz .КЦИКЛ ;
mov di,ax ;
push di ;
call ЭЛЕ_КОПИЯ_ВС;
pop di ;
call ЭЛЕ_СЛЕ ;
jmp .ЦИКЛ ;
.КЦИКЛ:
.ВЫХОД:
pop si ;
push dx ;
popad;
ret;
;==============================================================================}
ЭЛЕ_КОПИЯ :;{ Копию элемнта Di и назначать родителя DX созданая копия возвращеться в DI
pushad;
call ЭЛЕ_ТИП ; // Возвращет тип элемнта в AX
cmp al,ТИП_СТРО ; // Если занчение строка то
jz .ЭТО_СТРОКА ;
call ЭЛЕ_ЗНА ; // Читаем значе в AX
mov bx,ax ; // bx-значение
jmp .ДАЛЕЕ ;
.ЭТО_СТРОКА:
;----------------------;
mov cx,di ;
call ЭЛЕ_ЗНА ;
mov di,ax ;
dec di ;
dec di ;
mov ax,[dI] ;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_AX_БАЙТ ; // Возвращет в DI АДРЕС Созданой СТРОКИ
mov si,di ;
mov di,cx ;
call ЭЛЕ_ЗНА ; // Возвращает значение адрес строки
mov di,ax ;
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI;
mov di,cx ;
mov bx,si ; // bx-значение
jmp .ДАЛЕЕ ;
;----------------------;
.ДАЛЕЕ:
call ЭЛЕ_ИМЯ ; // Возвращет адрес строки с именем элемнта в AX
mov si,ax ; // Si-Имя элемнат
call ЭЛЕ_ТИП ; // Возвращет тип элемнта в AX
mov cl,al ; // al-ТИп
call ЭЛЕ_ФУН ; // Возвращет тип элемнта в AX
mov ch,al ; // ah-показат фун
mov ax,cx ;
mov di,dx ;
call ЭЛЕ_СОЗДАТЬ ; // Создает элемент и возвращает его дарес в DI
pop si ;
push di ;
popad ;
ret ;
;==============================================================================}
ЭЛЕ_УСТ_ПАР :;{ Функция устанавливает параметр CX В значение AX В элементе DI
pushad ;
call ЭЛЕ_ПОСЛЕД;// перемщаемся к последнему элементу
call ЭЛЕ_ПОИСК ;// производим поиск нужного нам параметра
jz .ВЫХОД ;
ADD DI,ЭЛ_ЗНА ;
mov [DI],AX ;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ЭЛЕ_ПАРСУМ :;{ Складывает параметр с именем CX Во всех родительских элементах DI возвращает AX
push di;
push dx;
push bx;
mov dx,di ;// ЗАпоминаем адрес элемента
mov AX,0 ;// по умолчанию результат равен 0
;---------------
mov di,dx ;
Call ЭЛЕ_ПОИСК ;
JZ .ВЫХОД ;
call ЭЛЕ_ЗНА ;// Чтение значения искомого поля
mov bx,ax ;// Запоминаем найденое значение
;---------------
mov di,dx ;
Call ЭЛЕ_РОДИТЕЛЬ;// Смотрим есть ли родитель у этого элемента
JZ .ВЫХОД ;
;---------------// Если есть родитель складываем с его значением параметра
Call ЭЛЕ_ПАРСУМ ;// Складываем анологичный параметр родительского элемента
add bx,ax ;
mov ax,bx ;
;---------------
.ВЫХОД:
pop bx;
pop dx
pop di;
ret;
;==============================================================================}
ЭЛЕ_ОСВОБОДИ:;{ Освобождает память занимаемую элементом DI;
pushad;
mov bx,DI ;// Запоминаем свой адрес
.ЦИКЛ: Call ЭЛЕ_ВЛО ;// Пытаемся прочитать первый вложеный элемент ;
mov di,ax ;
test di,di ;
jz .КЦИКЛ ;
call ЭЛЕ_УДАЛИТЬ ;
call ЭЛЕ_ОСВОБОДИ ;
mov di,bx ;// Востанавливаем адерс
jmp .ЦИКЛ ;
.КЦИКЛ: mov di,bx ;// Востанавливаем адерс
;---------------------;
call ЭЛЕ_ТИП ;
cmp ax,ТИП_СТРО ;
JNZ .НЕ_СТРОКА ;
;---------------------;
call ЭЛЕ_ЗНА;
mov di,ax;
call ОСВОБОЖДЕНИЕ_УЧАСТКА_ПАМЯТИ_DI;
mov di,bx ;
;---------------------;
.НЕ_СТРОКА:
;---------------------;
call ЭЛЕ_ИМЯ ;
mov di,ax ;
call ОСВОБОЖДЕНИЕ_УЧАСТКА_ПАМЯТИ_DI;
mov di,bx ;
;---------------------;
call ЭЛЕ_УДАЛИТЬ ; // Отстыковывает элемент
call ОСВОБОЖДЕНИЕ_УЧАСТКА_ПАМЯТИ_DI;
popad ;
ret ;
;==============================================================================}
ДОБ_ЭЛЕ_DX_В_ЭЛЕ_DI:;{ Добавляем элемент DX в элмеент DI
pushad ;
mov cx,di ;//сохраняем адрес родительского элемента в котрый нужно доавить
test DI,DI ;
jz .NEX ;// Если нету родительского элемента просто пишем 0 в родитель в конце процедуры
;--------------
MOV DI,DX ;
CALL ЭЛЕ_УДАЛИТЬ;// Удаляеи элемент из предыдущего списка если он там был
;--------------
;------------
mov DI,CX ;
Call ЭЛЕ_ПОСЛЕД;// Ощим последний элемент в родительском элементе
jnz .ADDNEX ;// Если есть хоть один вложенй элемент присоеденяем к последнему элемнту
;// Если нет не одного вложеного элемента то присоеденяем к родителю как первый вложенй элемент
MOV Si,cx ;
ADD SI,ЭЛ_ВЛО ;
Mov [Si],DX ;// ПРисоеденяем в родительском элементе добавляемый элемент как первый элемент вложеного списка
Jmp .NEX ;
;------------
.ADDNEX: ;------------
mov SI,DI ;// В DI находиться адрес последнего элемента в списке куда добавляем элмент
add SI,ЭЛ_СЛЕ ;// ПРисоеденяем добавляемый элмент в конец спсика
mov [SI],DX ;// Записываем добавляемый элемент DX
mov Si,DX ;
add si,ЭЛ_ПРЕ ;// Указывем в добавлемом элементе предыдущий
mov [si],di ;
;------------
.NEX: MOV Si,DX ;// Указываем родительский элемент
add si,ЭЛ_РОД ;//
mov [SI],cx ;//
popad;
ret;
;==============================================================================}
ДОБ_ЭЛЕ_СX_В_ЭЛЕ_DI:;{ Добавляем элемент DX в элмеент DI
push dx;
mov dx,cx;
call ДОБ_ЭЛЕ_DX_В_ЭЛЕ_DI
pop dx;
ret;
;==============================================================================}
ЭЛЕ_ПРОСМОТР:;{ Просмотр элемента и его характеристик DI
pushad ;
;-----------------------;
mov cx,DI ;// Запоминаем адрес просматриваемого элемента ;
;-----------------------;
;-----------------------;// Печатаем пробелы равное количесвту элемнтов предков
mov SI,Di ;// Печать отступов в количестве предков сколько предков стока и отступов
ADD SI,ЭЛ_РОД ;
mov ax,[si] ;
.ЦИКЛ: ;
test ax,ax ;
jz .КЦИКЛ ;
;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
mov si,ax ;
add si,ЭЛ_РОД ;
mov ax,[si] ;
jmp .ЦИКЛ ;
.КЦИКЛ: ;-----------------------;
;-----------------------;
MOV DI,.ТЕКСТ_АДР_ЭЛ ;// Печать надписи (адреса элемента)
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov si,cx ;
mov ax,si ;
call ЭКРАН_ВЫВОД_ЧИСЛА ;// печать адреса расположения элемента
call ЭКРАН_ВЫВОД_ПРОБЕЛА;// Пробел разделитель что бы не слипалися надпси
;-----------------------;
;-----------------------;
MOV DI,.ТЕКСТ_ТИП_ЭЛ ;// Печать надпсии (ТИП ЭЛЕМЕНТА)
Call ЭКРАН_ВЫВОД_СТРОКИ ;
mov DI,CX ;
Call ЭЛЕ_ТИП ;
call ЭКРАН_ВЫВОД_ЧИСЛА ;// Печать самого типа ввиде числа типы описаны в разделе типы элементов
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;-----------------------;
;-----------------------;
MOV DI,.ТЕКСТ_ФУН_ЭЛ ;// Печать слова (Являеться ли функцией)
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov DI,CX ;
Call ЭЛЕ_ФУН ;
call ЭКРАН_ВЫВОД_ЧИСЛА ;// Вывод являеться ли функцией в виде числа если 1 то являеться
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;-----------------------;
;-----------------------;
MOV DI,.ТЕКСТ_КОД_ЭЛ ;// Печать надпсии кода элемента каждому слову сосотвествет код из словаря
call ЭКРАН_ВЫВОД_СТРОКИ ;// Коды предназначены для быстрого поиска нужных элементов
mov DI,CX ;
Call ЭЛЕ_КОД ;
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;-----------------------;
;------------------------;
;MOV DI,.ТЕКСТ_РОД_ЭЛ ;// Печать адреса родительского элемента
;call ЭКРАН_ВЫВОД_СТРОКИ ;
;mov DI,CX ;
;Call ЭЛЕ_РОД ;
;call ЭКРАН_ВЫВОД_ЧИСЛА ;
;call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;------------------------;
;------------------------;
;MOV DI,.ТЕКСТ_ПРЕ_ЭЛ ;// Печать адреса Предудыдущего элемента
;call ЭКРАН_ВЫВОД_СТРОКИ ;
;mov DI,CX ;
;Call ЭЛЕ_ПРЕ ;
;call ЭКРАН_ВЫВОД_ЧИСЛА ;
;call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;------------------------;
;------------------------;
;MOV DI,.ТЕКСТ_СЛЕ_ЭЛ ;// Печать адреса следующего элемента
;call ЭКРАН_ВЫВОД_СТРОКИ ;
;mov DI,CX ;
;Call ЭЛЕ_СЛЕ ;
;call ЭКРАН_ВЫВОД_ЧИСЛА ;
;call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;------------------------;
;------------------------;
;MOV DI,.ТЕКСТ_ВЛО_ЭЛ ;// Печать адреса Первго вложеного эелемента
;call ЭКРАН_ВЫВОД_СТРОКИ ;
;mov DI,CX ;
;Call ЭЛЕ_ВЛО ;
;call ЭКРАН_ВЫВОД_ЧИСЛА ;
;call ЭКРАН_ВЫВОД_ПРОБЕЛА;
;------------------------;
;------------------------;
MOV DI,.ТЕКСТ_ИМЯ_ЭЛ ;// Печать Имени элемента
call ЭКРАН_ВЫВОД_СТРОКИ ;
mov di,cx ;
call ЭЛЕ_ИМЯ ;
mov di,ax ;
call ЭКРАН_ВЫВОД_СТРОКИ ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА ;
;------------------------;
;------------------------;
MOV DI,.ТЕКСТ_ЗНА_ЭЛ ;// Печать Значеия элемента
call ЭКРАН_ВЫВОД_СТРОКИ ;// Вывод значения зависитт от типа элемента
mov di,cx ;
call ЭЛЕ_ТИП ;
cmp al,ТИП_СТРО ;// Если тип элемента строка то вывод как строки
jz .ВСТРО ;
cmp al,ТИП_ЧИСЛ ;// Если элемент число то вывод как число .... и атк далее в дальнейшем буду отписаны и другие типы эелемнтов
jz .ВЧИСЛ ;
;------------------------;
mov di,.ТЕК_НЕИЗВЕСТНО ;// Если такой тип не известен то выводиться надпист что тип элемента не известен
call ЭКРАН_ВЫВОД_СТРОКИ ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА ;
jmp .НЕИЗВЕСТНО ;
;------------------------;
.ВЧИСЛ:
;------------------------;
mov di,cx ;
call ЭЛЕ_ЗНА ;
call ЭКРАН_ВЫВОД_ЧИСЛА ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА ;
jmp .НЕИЗВЕСТНО ;
;------------------------;
.ВСТРО:
;------------------------;
mov di,cx ;
call ЭЛЕ_ЗНА ;
mov di,ax ;
call ЭКРАН_ВЫВОД_СТРОКИ ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА ;
;------------------------;
.НЕИЗВЕСТНО: ;// Тут завершение вывода знчения почему называеться неизвестно не помню ))) поф
;-----------------------;
mov SI,CX ;// Востанавливаем адрес просматриваемого элемента
ADD Si,ЭЛ_ВЛО ;// ПРоверяем если в нем вложеные элементы
mov si,[si] ;
test si,si ;
jz .ВЫХОД ;
mov DI,CX ;
Call ЭЛЕ_ПРОС_ВЛО ;// ПРосмотр Вложеных Элементов
;-----------------------;
.ВЫХОД:
popad;
ret;
.ТЕКСТ_АДР_ЭЛ: db "АДР=",0,0;
.ТЕКСТ_ТИП_ЭЛ: db "ТИП=",0,0;
.ТЕКСТ_ФУН_ЭЛ: db "ФУН=",0,0;
.ТЕКСТ_РОД_ЭЛ: db "РОД=",0,0;
.ТЕКСТ_ПРЕ_ЭЛ: db "ПРЕ=",0,0;
.ТЕКСТ_СЛЕ_ЭЛ: db "СЛЕ=",0,0;
.ТЕКСТ_ВЛО_ЭЛ: db "ВЛО=",0,0;
.ТЕКСТ_ИМЯ_ЭЛ: db "ИМЯ=",0,0;
.ТЕКСТ_ЗНА_ЭЛ: db "ЗНА=",0,0;
.ТЕКСТ_КОД_ЭЛ: db "КОД=",0,0;
.ТЕК_НЕИЗВЕСТНО: db "НЕИЗВЕСТНО",0,0;
;==============================================================================}
ЭЛЕ_ПРОС_ВЛО:;{ ПРосмотр волженых элементов DI используеться функцией ЭЛЕ_ПРОСМОТР
pushad;
add DI,ЭЛ_ВЛО ;
mov ax,[DI] ;// Читаем первый вложеный эелемнт
.ЦИКЛ: ;-----------------------;
test ax,ax ;// Роверяем наличае певого вложеного элемента
JZ .ВЫХОД ;
call ЭКРАН_ВЫВОД_ПЕРСТРО;
mov di,ax ;
call ЭЛЕ_ПРОСМОТР ;
add di,ЭЛ_СЛЕ ;// Переходим к следующему элементу
mov ax,[di] ;
jmp .ЦИКЛ ;
;-----------------------;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ЭЛЕ_ПОИСК_ВН_ПО_КОДУ_CX :;{ Поиск внутри элемента элемнта с кодом CX
PUSHAD;
mov si,0 ; ПО умолчанию результат равен 0 то есть не нашли
call ЭЛЕ_ПОСЛЕД ;
JZ .ВЫХОД ;
.ЦИКЛ:
test di,di ;
jz .ВЫХОД ;
call ЭЛЕ_КОД_РАВ ;
jnz .НАШЛИ ; Еслти это элемент с с искомым именем идем на выход элемент найден
;-----------------
call ЭЛЕ_ПРЕ ;
mov di,ax ;
Jmp .ЦИКЛ ;
;-----------------
.НАШЛИ: mov SI,DI ;
.ВЫХОД:
test si,si ;
pop di ;
push si ;
popad ;
ret ;
;==============================================================================}
ЭЛЕ_КОД_РАВ :;{ Сравнивает имя элемента с строкой CX
pushad;
call ЭЛЕ_КОД;
CMP ax,cx ;
jz .РАВНО ;
mov al,0 ;
test al,al ;
Jmp .ВЫХОД ;
.РАВНО: mov al,1 ;
test al,al ;
.ВЫХОД:
popad
ret;
;==============================================================================}
ЭЛЕ_КОД_РАВФ :;{ Сравнивает имя элемента с строкой CX и проверяет являеться ли функцией элемент
pushad ;
call ЭЛЕ_ФУН ;// Устанавливает флаг Z если это функция возвращает в AX значение поля Функция элемента
jz .ВЫХОД ;// Если не функцуия то выход
call ЭЛЕ_КОД_РАВ ;// сравниаем имена Устанвливает флаг Z если равн имена
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ЭЛЕ_ПОИСК_ПР_ПО_КОДУ_CX :;{ ПОиск элемента с Кодом CX в предыдущих элементах элемента DI возвращает результат в DI
pushad;
mov si,0 ;// По умолчанию резльутат равен 0 то есть не нашел
.ЦИКЛ:
;-----------------
call ЭЛЕ_ПРЕ ;
JZ .ВЫХОД ;
mov DI,AX ;
CALL ЭЛЕ_КОД_РАВФ;
JNZ .НАШОЛ ;
jmp .ЦИКЛ ;
;-----------------
.НАШОЛ: mov si,DI ;
.ВЫХОД:
test si,si ;
pop ax;
push si;
popad ;
ret ;
;==============================================================================}
ЭЛЕ_ПОИСК_ПА_ПО_КОДУ_CX :;{ ПОиск элемента с Кодом CX в параметрах элемента DI
PUSHAD;
mov si,0 ; ПО умолчанию результат равен 0 то есть не нашли
call ЭЛЕ_ФУН ; // ПРоверяем функция ли это
jz .ВЫХОД ;
;-----------------
Call ЭЛЕ_ВЛО ; ПРоверяем еть ли вообще параметры внутри элемента
JZ .ВЫХОД ;
mov di,ax ;
call ЭЛЕ_КОД ;
cmp ax,КОД_КОМ_ОСКОБКА;// проверяем что это скобка
jnz .ВЫХОД ;
Call ЭЛЕ_ВЛО ; ПРоверяем еть ли элемнет внтури скобки
.ЦИКЛ:
test ax,ax ;
jz .ВЫХОД ;
mov di,ax ;
call ЭЛЕ_КОД_РАВ ;
jnz .НАШЛИ ; Еслти это элемент с с искомым именем идем на выход элемент найден
;-----------------
call ЭЛЕ_СЛЕ ;
Jmp .ЦИКЛ ;
;-----------------
.НАШЛИ: mov SI,DI ;
.ВЫХОД:
test si,si ;
pop di ;
push si ;
popad ;
ret ;
;==============================================================================}
ПОИСК_ЭЛЕМЕНТА_ПО_КОДУ_CX_С_ЭЛЕМЕНТА_DI :;{ Поиск элемента по Коду наружу ищит елемнт с Кодом CX с элемента DI элемент DI не участвует в поиске возвращает Арес элемента в DI
push ax;
;----------------;
mov ax,di ;// Запоминаем элемент с котрого ведем поиск
;----------------;
call ЭЛЕ_КОД_РАВФ ;
jz .ДАЛЕЕ ;
jmp .ВЫХОД ;
.ДАЛЕЕ:
;----------------;
mov di,ax ;
call ЭЛЕ_ПОИСК_ПР_ПО_КОДУ_CX ;// Ищим в предыдущих элементах
jnz .ВЫХОД ;
;----------------;
mov di,ax ;
call ЭЛЕ_ПОИСК_ПА_ПО_КОДУ_CX ;// Ищим в параметрах
jnz .ВЫХОД ;
;----------------;
mov di,ax ;
call ЭЛЕ_РОДИТЕЛЬ ; Ищитм в родительском элементе
jz .ВЫХОД ;
;----------------;
call ПОИСК_ЭЛЕМЕНТА_ПО_КОДУ_CX_С_ЭЛЕМЕНТА_DI;
.ВЫХОД:
test di,di ;
pop ax ;
ret ;
;==============================================================================}
ЭЛЕ_ПОИСК_ПО_КОДУ_AX :;{
pushad;
mov cx,ax;
call ПОИСК_ЭЛЕМЕНТА_ПО_КОДУ_CX_С_ЭЛЕМЕНТА_DI;
pop si;
push di;
popad;
ret;
;==============================================================================}
ЗАПИСЫВАЕТ_В_DI_АДРЕС_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI:;{
push ax;
call ЭЛЕ_ВЛО;
mov di,ax;
call ЭЛЕ_СЛЕ;
mov di,ax;
pop ax;
ret;
;==============================================================================}
ПОЛУЧИТЬ_КОД_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_В_ЭЛЕМЕНТ_DI:;{
push di;
call ЭЛЕ_ВЛО;
mov di,ax;
call ЭЛЕ_КОД;
pop di;
ret;
;==============================================================================}
ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX:;{ Записывает в решистр Ax значение вложеного элемента
push di;
call ЭЛЕ_ВЛО;
mov di,ax ;
call ЭЛЕ_ЗНА;
pop di;
ret;
;==============================================================================}
ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX:;{ Записывает в решистр Ax значение следующего вложеного элемента
push di;
call ЭЛЕ_ВЛО;
mov di,ax ;
call ЭЛЕ_СЛЕ;
mov di,ax ;
call ЭЛЕ_ЗНА;
pop di;
ret;
;==============================================================================}
КОП_ЗНА_В_ЭЛЕ_CX_ИЗ_ЭЛЕ_DX :;{ Копировать значение элемента в CX из элемнета DX
pushad;
mov bx,dx;
mov di,cx;
call КОП_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_BX;
popad;
ret;
;==============================================================================}
КОП_ЗНА_В_ЭЛЕ_DX_ИЗ_ЭЛЕ_BX :;{ Копировать значение элемента в CX из элемнета DX
pushad;
; // ИЗ BX Источник
mov di,DX; // В DX Приемник
call КОП_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_BX;
popad;
ret;
;==============================================================================}
КОП_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_BX :;{ Копировать значение элемента в DI из элемнета BX
pushad;
call ТИП_ОПЕРАЦИИ_DI_BX;
cmp ax,КОМ_ЧИС_ЧИС;
jz .ЧЧ;
cmp ax,КОМ_СТР_СТР;
jz .CC;
cmp ax,КОМ_ЧИС_СТР;
jz .ЧС;
cmp ax,КОМ_СТР_ЧИС;
jz .СЧ;
jmp .ВЫХОД;
.ЧЧ: ;{ЧИСЛО<ЧИСЛО ;
push di;
mov di,bx ;
call ЭЛЕ_ЗНА ;
pop di ;
mov si,di ;
add SI,ЭЛ_ЗНА ;
mov [si],ax ;
jmp .ВЫХОД ;
;-----------------}
.CC: ;{СТРОКА<СТРОКА ;
call ЭЛЕ_ЗНА ;
mov dx,ax ;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
call ЗАПИСАТЬ_СТРОКУ_CX_В_СТРОКУ_DX;
jmp .ВЫХОД ;
;-----------------}
.ЧС: ;{ЧИСЛО<СТРОКА ;
push di;
mov di,bx;
call ЭЛЕ_ЗНА;
pop di;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_BX;
add di,ЭЛ_ЗНА ;
mov [di],bx ;
jmp .ВЫХОД ;
;-----------------}
.СЧ: ;{СТРОКА<ЧИСЛО ;
call ЭЛЕ_ЗНА;
mov si,ax;
push di;
mov di,bx;
call ЭЛЕ_ЗНА;
pop di;
mov byte[si],0
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI;
jmp .ВЫХОД ;
;-----------------}
.ВЫХОД:
popad;
ret;
;==============================================================================}
ДОБ_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_BX :;{ Копировать значение элемента в DI из элемнета BX
pushad;
call ТИП_ОПЕРАЦИИ_DI_BX;
cmp ax,КОМ_ЧИС_ЧИС;
jz .ЧЧ;
cmp ax,КОМ_ЧИС_СТР;
jz .ЧС;
cmp ax,КОМ_СТР_ЧИС;
jz .СЧ;
cmp ax,КОМ_СТР_СТР;
jz .СС;
jmp .ВЫХОД;
.ЧЧ: ;{ЧИСЛО<ЧИСЛО ;
push di;
mov di,bx ;
call ЭЛЕ_ЗНА ;
Mov dx,ax ;
pop di ;
call ЭЛЕ_ЗНА ;
add ax,dx;
mov si,di ;
add SI,ЭЛ_ЗНА ;
mov [si],ax ;
jmp .ВЫХОД ;
;-----------------}
.СС: ;{СТРОКА<СТРОКА ;
call ЭЛЕ_ЗНА ;
mov dx,ax ;
mov di,bx ;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_DX_СТРОКУ_CX;
jmp .ВЫХОД ;
;-----------------}
.ЧС: ;{ЧИСЛО<СТРОКА ;
call ЭЛЕ_ЗНА;
call СОЗДАТЬ_СТРОКУ_DX_ДЛИНОЙ_16_БАЙТ;
call ЗАПИСАТЬ_ЧИСЛО_AX_В_СТРОКУ_DX
mov si,di ;
add SI,ЭЛ_ТИП ;
mov byte[si],ТИП_СТРО;
mov si,di ;
add SI,ЭЛ_ЗНА ;
mov WORD[si],DX ;
mov di,BX ;
call ЭЛЕ_ЗНА ;
mov cx,ax;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_DX_СТРОКУ_CX
jmp .ВЫХОД ;
;-----------------}
.СЧ: ;{СТРОКА<ЧИСЛО ;
call ЭЛЕ_ЗНА;
mov si,ax;
mov di,bx;
call ЭЛЕ_ЗНА;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI
jmp .ВЫХОД ;
;-----------------}
.ВЫХОД:
popad;
ret;
;==============================================================================}
ДОБ_ЗНА_В_ЭЛЕ_CX_ИЗ_ЭЛЕ_DX:;{ Добавить в значение элемента CX значеие элемента DX
pushad;
mov di,cx;
mov bx,dx;
call ДОБ_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_BX
popad ;
ret;
;==============================================================================}
ДОБ_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_AX:;{ Добавить в значение элемента CX значеие элемента DX
pushad;
mov bx,ax;
call ДОБ_ЗНА_В_ЭЛЕ_DI_ИЗ_ЭЛЕ_BX
popad ;
ret;
;==============================================================================}
ЭЛЕ_ЗНА_CX:;{ Возвращает в CX Значение элемента DI
push di ;
add DI,ЭЛ_ЗНА;
mov Cx,[di] ;
test Cx,Cx ;
pop di ;
ret ;
;==============================================================================}
ТИП_AX_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_ЭЛЕМЕНТА_DI:;{ Записывает в решистр Ax тип вложеного элемента
push di;
call ЭЛЕ_ВЛО;
mov di,ax ;
call ЭЛЕ_ТИП;
pop di;
ret;
;==============================================================================}
ЗАПИСАТЬ_В_AX_ТИП_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_В_ЭЛЕМЕНТ_DI:;{ Записывает в решистр Ax тип следующего вложеного элемента
push di;
call ЭЛЕ_ВЛО;
mov di,ax ;
call ЭЛЕ_СЛЕ;
mov di,ax ;
call ЭЛЕ_ТИП;
pop di;
ret;
;==============================================================================}
ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_DX:;{ Читает значение Следующего вложеного элемента в регистр DX
push di ;
push ax ;
call ЭЛЕ_ВЛО;
mov di,ax ;
call ЭЛЕ_СЛЕ;
mov di,ax ;
call ЭЛЕ_ЗНА;
mov dx,ax ;
pop ax ;
pop di ;
ret ;
;==============================================================================}
ЭЛЕ_ЧИТ_СКО_ИЗ_ЭЛЕ_AX:;{ Читает скобку из элемента AX
push di ;
mov di,ax ;
call ЭЛЕ_ВЛО;
jz .НЕТУ ;
mov di,ax ;
call ЭЛЕ_КОД;
cmp ax,КОД_КОМ_ОСКОБКА;
jnz .НЕТУ ;
call ЭЛЕ_ВЛО; // Читаем первый вложеный элмент внтури скобки
jmp .ВЫХОД ;
.НЕТУ: mov ax,0 ;
.ВЫХОД:
test ax,ax ;
pop di;
ret
;==============================================================================}
ЧИТАТЬ_ВЛОЖЕНЫЕ_ЗНАЧЕНИЯ_В_CX_DX:;{
push ax;
call ЗНАЧЕНИЕ_ПЕРВОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
mov Cx,ax ;
call ЗНАЧЕНИЕ_ВТОРОГО_ВЛОЖЕНОГО_ЭЛЕМЕНТА_DI_В_AX;
MOV Dx,ax
POP ax;
RET;
;==============================================================================}
ЗАПИСАТЬ_В_ЗНАЧЕНИЕ_ЭЛЕМЕНТА_DI_СОДЕРЖИМОЕ_DX_КАК_СТРОКУ:;{
pushad;
call ЭЛЕ_ЗНА ;
mov cx,ax ;
mov si,ax ;
mov Byte [si],0 ; // Обнуляем строку CX
call ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX
popad;
ret;
;==============================================================================}
;==============================================================================}
;{ ФУНКЦИИ ДЛЯ РАБОТЫ C МЫШКОЙ .
МЫШКА_НАРИСОВАТЬ:;{
pushad;
mov cl,[МЫШ_КООX1];
mov dl,[МЫШ_КООY1];
mov al,0;
mov ah,[МЫШ_ЦВЕТА];
call ЭКРАН_ВЫВОД_AX_CX_DX;// Вывод Символа Al с атрибутами AH на экран в координатах x-CX,y-DX так как AL=0 символна экране не затираеться выводяться тока атрибуты
popad;
;==============================================================================}
;==============================================================================}
;{ ФУНКЦИИ ДЛЯ РАБОТЫ C ОКНАМИ .
;---{ Параметры окна
ОКНО_ПАР:;{ Чтение параметра окна DI с именем CX
Push DI ;
mov ax,0 ;// ПО умолчанию результат 0
call ЭЛЕ_ПОСЛЕД;// Ищим последний элемент в окне
JZ .ВЫХОД ;// Если нет такого элемента выход
call ЭЛЕ_ПОИСК ;// Ищим элемент с таким именем
JZ .ВЫХОД ;// Если нет такого элемента выход
ADD DI,ЭЛ_ЗНА ;// достаем значение этого поля WIN_LEF
mov AX,[DI] ;// Достаем значение
test ax,ax ;
.ВЫХОД:
pop DI;
ret;
;==============================================================================}
ОКНО_ЛЕВ:;{ Чтение координат по X для окна DI возвращает AX
push CX;
mov CX,ПАР_ЛЕВО;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_ВЕР:;{ Чтение координат по Y для окна DI возвращает AX
push CX;
mov CX,ПАР_ВЕРХ;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР;
POP CX;
ret;
;==============================================================================}
ОКНО_ШИР:;{ Чтение ширину окна по X для окна DI возвращает AX
push CX ;
mov CX,ПАР_ШИРИ;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX ;
ret ;
;==============================================================================}
ОКНО_ВЫС:;{ Чтение Высоту окна по Y для окна DI возвращает AX
push CX;
mov CX,ПАР_ВЫСО;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР;
POP CX;
ret;
;==============================================================================}
ОКНО_ТСX:;{ Чтение смещение текста X нутри окна DI возвращает AX
push CX ;
mov CX,ПАР_ТСМX;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX ;
ret ;
;==============================================================================}
ОКНО_ТСY:;{ Чтение смещение текста Y нутри окна DI возвращает AX
push CX;
mov CX,ПАР_ТСМY;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_ТКX:;{ Чтение координат курсора X нутри окна DI возвращает AX
push CX;
mov CX,ПАР_ТКУX;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_ТКY:;{ Чтение координат курсора Y нутри окна DI возвращает AX
push CX;
mov CX,ПАР_ТКУY;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_АТР:;{ Читает атрибуты окна DI возвращает AX
push CX;
mov CX,ПАР_АТРИ;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_АКУ:;{ Читает атрибуты курсора DI возвращает AX
push CX;
mov CX,ПАР_АКУР;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_ТЕК:;{ Читает адреса текста окна DI возвращает AX
push CX;
mov CX,ПАР_ТЕКС;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_АЛЕ:;{ Чтение абсолютных координат по X для окна возвращает в AX
push cx ;
push di ;
push dx ;
call ОКНО_ЛЕВ ;// Теперь в AX WIN_LEF окна DI;
mov dx,ax ;
MOV cx,ПАР_ЛЕВО;// Указываем что будеи искать WIN_LEF
call ЭЛЕ_ПАРСУМ ;// Находим сумму всех окон с параметром WIN_LEF;
add ax,dx ;// Прибавляем сумму всех параметров WIN_LEF в предках
pop dx ;
pop di ;
pop cx ;
ret ;
;==============================================================================}
ОКНО_АВЕ:;{ Чтение абсолютных координат по Y для окна возвращает в AX
push cx ;
push di ;
push dx ;
call ОКНО_ВЕР ;// Теперь в AX WIN_TOP окна DI;
mov dx,ax;
MOV cx,ПАР_ВЕРХ;// Указываем что будеи искать WIN_TOP
call ЭЛЕ_ПАРСУМ;// Находим сумму всех окон с параметром WIN_TOP;
add ax,dx ;// Прибавляем сумму всех параметров WIN_TOP в предках
pop dx ;
pop di ;
pop cx ;
ret ;
;==============================================================================}
ОКНО_АПР:;{ Вычисление Абсолютных координат правой стороны окна DI в AX X2 Right
push cx;
Call ОКНО_АЛЕ;
Mov CX,ax;
Call ОКНО_ШИР;
Add Ax,CX;
pop cx;
ret;
;==============================================================================}
ОКНО_АНИ:;{ Вычисление Абсолютных координат нижней стороны окна Y2 Bootom
push cx;
Call ОКНО_АВЕ;
Mov CX,ax;
Call ОКНО_ВЫС;
Add Ax,CX;
pop cx;
ret;
;==============================================================================}
ОКНО_АКX:;{ Чтение абсолютных координат курсора X нутри окна DI возвращает AX
push CX;
push DX;
mov CX,ПАР_ТКУX;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
mov dx,ax ;
mov CX,ПАР_ТСМX;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
add ax,Dx;
POP DX;
POP CX;
ret;
;==============================================================================}
ОКНО_АКY:;{ Чтение координат курсора Y нутри окна DI возвращает AX
push CX;
push dx;
mov CX,ПАР_ТКУY;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
mov dx,ax;
mov CX,ПАР_ТСМY;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
add ax,dx;
pop dx;
POP CX;
ret;
;==============================================================================}
ОКНО_КСК:;{ Количество символов в строке с курсром окна DI возвращает AX
push CX;
mov CX,ПАР_КССК;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_КСТ:;{ Чтение Реального количества строк текста Окно DI возвращает AX Количество строк
push CX;
mov CX,ПАР_КОСТ;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_ПАС:;{ окна DI возвращает AX
push CX;
mov CX,ПАР_ПАВС;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
ОКНО_ДПС:;{ возвращает длину строки над курсором в окне DI возвращает AX
push CX;
mov CX,ПАР_ДПСТ;// Указываем имя элемиента котрый будем искать
call ОКНО_ПАР ;
POP CX;
ret;
;==============================================================================}
;---}
;---{ Перемещения курсора внутри окна и обработка нажатия кнопок
ОКНО_КУР_ВПРА:;{ Перемещение крусора окна DI влево
pushad;
call ОКНО_ТКX ;// читаем кординату курсора
mov cx,ax ;// Запоминаем координату курсорпа
Call ОКНО_ШИР ;// Читаем ширину окна
dec ax;
cmp cx,ax ; // сравниваем координату крусора и ширину окна
JAE .ДАЛЕЕ ;
INC CX ;// Сдвиагем курсор впрво
mov ax,cx ;
mov cx,ПАР_ТКУX;
call ЭЛЕ_УСТ_ПАР;
jmp .ВЫХОД ;
.ДАЛЕЕ:
call ОКНО_ТСX ;// Читаем смещенеи внутри текста
inc ax ;// Увеличиваем смещение внтури текста
mov cx,ПАР_ТСМX;
call ЭЛЕ_УСТ_ПАР;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_КУР_ВЛЕВ:;{ Перемещение крусора окна DI влево
pushad;
call ОКНО_ТКX ;// читаем кординату курсора
mov cx,ax ;// Запоминаем координату курсорпа
test cx,cx ; // сравниваем координату крусора если ноль то некст
JZ .ДАЛЕЕ ;
DEC CX ;// Сдвиагем курсор Влево
mov ax,cx ;
mov cx,ПАР_ТКУX ;
call ЭЛЕ_УСТ_ПАР ;
jmp .ВЫХОД ;
.ДАЛЕЕ:
call ОКНО_ТСX ;// Читаем смещенеи внутри текста
test ax,ax ;
jz .ПЕРЕХОД ;
dec ax ;// Увеличиваем смещение внтури текста
mov cx,ПАР_ТСМX ;
call ЭЛЕ_УСТ_ПАР ;
JMP .ВЫХОД ;
.ПЕРЕХОД:
call ОКНО_АКY ;// Читаем координату курсора по Y
test ax,ax ;
jz .ВЫХОД ;
call ОКНО_ШИР ;// Читаем ширину окна
mov dl,al ;// Запоминиаем ширну окна
call ОКНО_ДПС ;// Читаем длиину предыдущей строки
DIv dl ;// Делем на ширину окна
mov bx,ax ;// Запоминаем рещультат деления
xor ax,ax ;
mov al,bh ;// остаток от деления будет координатой курсора в окне
mov cx,ПАР_ТКУX ;
call ЭЛЕ_УСТ_ПАР ;
mov al,bl ;// количество смещений в тексте размером в ширину окна
mul dl ;// Умножаем на ширину окна
mov cx,ПАР_ТСМX;
call ЭЛЕ_УСТ_ПАР ;
call ОКНО_КУР_ВВЕР;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_КУР_ВНИЗ:;{ Перемещение крусора окна DI влево
pushad;
call ОКНО_ТКY ;// читаем кординату курсора
mov cx,ax ;// Запоминаем координату курсорпа
Call ОКНО_ВЫС ;// Читаем высоту окна
dec ax ;
cmp cx,ax ; // сравниваем координату крусора и высоту окна
JAE .ДАЛЕЕ ;
INC CX ;// Сдвиагем курсор вниз
mov ax,cx ;
mov cx,ПАР_ТКУY;
call ЭЛЕ_УСТ_ПАР;
jmp .ВЫХОД ;
.ДАЛЕЕ:
call ОКНО_ТСY ;// Читаем смещенеи внутри текста
inc ax ;// Увеличиваем смещение внтури текста
mov cx,ПАР_ТСМY;
call ЭЛЕ_УСТ_ПАР;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_КУР_ВВЕР:;{ Перемещение крусора окна DI влево
pushad;
call ОКНО_ТКY ;// читаем кординату курсора
mov cx,ax ;// Запоминаем координату курсорпа
JZ .ДАЛЕЕ ;
DEC CX ;// Сдвиагем курсор вверх
mov ax,cx ;
mov cx,ПАР_ТКУY;
call ЭЛЕ_УСТ_ПАР;
jmp .ВЫХОД ;
.ДАЛЕЕ:
call ОКНО_ТСY ;// Читаем смещенеи внутри текста
jz .ВЫХОД ;
dec ax ;// уменьшаем смещение внтури текста
mov cx,ПАР_ТСМY;
call ЭЛЕ_УСТ_ПАР;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_КНО_УДЛЕ:;{ Удаление символа слева от курсора
pushad;
call ОКНО_ПАС;
mov si,ax;
Call УДАЛЕНИЕ_ИЗ_АДРЕСА_SI_СИМВОЛА_ДО_0;
Call ОКНО_КУР_ВЛЕВ;
popad;
ret;
;==============================================================================}
ОКНО_КНО_БУКВ:;{ Обработка нажатия кнопок окна DI
pushad;
mov di,[МЫШ_ВЫДЕ2] ;// Указываем активное окно
mov bx,ax ;
call ОКНО_ПАС ;// Читаем предположительный адрес в строке куда нужно добавить символ сформированый в ОКНО_ВЫВОД_ТЕ
mov si,ax ;
;// Дописываем не достающие переводы строки
call ОКНО_КСТ ;// Читаем количество строк в тексте окна
mov cx,ax ;// теперь в CX Количество строк в тексте
call ОКНО_АКY ;// Читаем Абсолютную позицию курсора в тексте
mov dx,ax ;// теперь в DX абсолютная координата курсора в тексте по Y
.ЦИКЛ2: CMP cx,dx ;
JA .КЦИКЛ2 ;
call НАЙТИ_КОНЕЦ_СТРОКИ_С_АДРЕСА_SI;
mov al,13 ;
call ВСТАВКА_СИМВОЛА_AL_ПО_АДРЕСУ_SI_ДО_0;
inc CX ;
JMP .ЦИКЛ2 ;
.КЦИКЛ2:
;// Дписываем не достающие пробелы если это необходимо
call ОКНО_КСК ;// Читаем правй край в тексте где расположен курсор
mov dx,ax ;// Запоминаем
call ОКНО_АКX ;// Читаем абсолютную координату курсора по X
mov cx,ax;
.ЦИКЛ: cmp dx,cx ;// Сравниваем правй край строки в котрой расположен курсор и координату курсора по X
jae .ДАЛЕЕ ;
; Дописываем необходимое количество пробелов
mov al,' ' ;
call ВСТАВКА_СИМВОЛА_AL_ПО_АДРЕСУ_SI_ДО_0;
inc SI ;
inc dx ;
jmp .ЦИКЛ ;
;----------------------
.ДАЛЕЕ:
mov ax,bx ;
cmp ax,3592 ;
jz .ПРОПУСТИТЬ ;
call ВСТАВКА_СИМВОЛА_AL_ПО_АДРЕСУ_SI_ДО_0;
call ОКНО_КУР_ВПРА ;
.ПРОПУСТИТЬ:
mov ax,si;
mov cx,ПАР_ПАВС ;
call ЭЛЕ_УСТ_ПАР ;
popad ;
ret ;
;==============================================================================}
ОКНО_КНО_ЕНТЕ:;{ ОБработка нажатия Энтер
pushad;
mov cx,ПАР_ТСМX;
mov ax,0;
call ЭЛЕ_УСТ_ПАР;
mov cx,ПАР_ТКУX;
mov ax,0;
call ЭЛЕ_УСТ_ПАР;
call ОКНО_КУР_ВНИЗ;
popad;
ret;
;---}
;==============================================================================}
КНОПКИ :;{ Обработка Нажатия кнопок
pushad;
mov di,[МЫШ_ВЫДЕ2];// Читаем активный эллемнт
test di,di ;// проверяем на ноль
jZ .ВЫХОД ;
mov ax,[НАЖ_КНОПК];
;----------------;
cmp ax,19712 ; // Кнопка вправо
jnz .КЛЕВ ;
Call ОКНО_КУР_ВПРА ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
;-------------
.КЛЕВ:
;------------------;
cmp ax,19200 ;// Кнопка Влево
jnz .КВНИ ;
Call ОКНО_КУР_ВЛЕВ ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
;------------------;
.КВНИ:
;------------------;
cmp ax,20480 ; // Кнопка Влево
jnz .КВЕР ;
Call ОКНО_КУР_ВНИЗ ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
;------------------;
.КВЕР:
;------------------;
cmp ax,18432 ; // Кнопка Влево
jnz .КБУКВ ;
Call ОКНО_КУР_ВВЕР ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax ;
;------------------;
.КБУКВ:
;------------------;
call ЕСЛИ_В_AL_НЕ_СИМВОЛ_ФЛАГ_Z_0;
jz .КУДЛ
mov cx,[РАС_КЛАВ];
test cx,cx ;
jnz .АНГ_РАС ;
Call ПРЕОБРАЗУЕТ_АНГ_БУК_AL_В_РУС;
.АНГ_РАС:
call ОКНО_КНО_БУКВ ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
;------------------;
.КУДЛ:
;----------------;
cmp ax,3592 ; // Кнопка кдаление символа слева от курсора
jnz .КЕНТ ;
call ОКНО_КНО_БУКВ ;
Call ОКНО_КНО_УДЛЕ ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax ;
;----------------;
.КЕНТ:
;----------------;
cmp ax,7181 ; // Кнопка Влево
jnz .ДАЛЕЕ ;
call ОКНО_КНО_БУКВ ;
call ОКНО_КНО_ЕНТЕ ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax ;
;----------------;
.ДАЛЕЕ:
.ВЫХОД:
popad;
ret;
;==============================================================================}
КНОП_УДА_ОКНА:;{ Унопка Удаление окна
pushad;
mov di,[МЫШ_ВЫДЕ2];// Читаем активное окно
call ЭЛЕ_ОСВОБОДИ ;
popad;
ret;
;=============================================================================}
КНОП_СОЗ_ОКНА:;{ Унопка создания окна
pushad;
mov di,[МЫШ_ВЫДЕ2];// Читаем активное окно
call .СОЗ_ТЕК ; // Создаем строку с текстом окна заносим в BX её адрес
mov CL,10 ; // Указываем координату окна по X
mov CH,10 ; // Указываем координату окна по Y
mov DL,10 ; // Указываем Ширину окна
mov DH,10 ; // Указываем Указываем высоту окна
call ОКНО_СОЗДАТЬ ;
mov cx,ПАР_АТРИ ;
mov ax,11110000b ;
call ЭЛЕ_УСТ_ПАР ;
pop si ;
Push di ;
popad ;
ret ;
.СОЗ_ТЕК:
push si;
push di;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_1024_БАЙТ; // Выделяем участок памяти для текста результат возвращеться адрес DI
mov si,di ; // Указывапем куда копировать то есть в новую строку
mov di,.ТЕКС_ОКНА1 ; // Указывапем откудвава копировать
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI; // Копируем
mov bx,si ; // Заном адрес строки в BX
pop di;
pop si;
ret;
.ТЕКС_ОКНА1: db "НОВОЕ ОКНО",13,'СТРОКА 2 тестовая ',13,'Строка 3 ',0; popad;
ret;
;=============================================================================}
КНОП_ПОМ_ОКНА:;{ Унопка создания окна
pushad;
mov di,[МЫШ_ВЫДЕ2];// Читаем активное окно
call .СОЗ_ТЕК ; // Создаем строку с текстом окна заносим в BX её адрес
mov CL,10 ; // Указываем координату окна по X
mov CH,10 ; // Указываем координату окна по Y
mov DL,10 ; // Указываем Ширину окна
mov DH,10 ; // Указываем Указываем высоту окна
call ОКНО_СОЗДАТЬ ;
mov cx,ПАР_АТРИ ;
mov ax,11110000b ;
call ЭЛЕ_УСТ_ПАР ;
pop si ;
Push di ;
popad ;
ret ;
.СОЗ_ТЕК:
push si;
push di;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_1024_БАЙТ; // Выделяем участок памяти для текста результат возвращеться адрес DI
mov si,di ; // Указывапем куда копировать то есть в новую строку
mov di,.ТЕКС_ОКНА1 ; // Указывапем откудвава копировать
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI; // Копируем
mov bx,si ; // Заном адрес строки в BX
pop di;
pop si;
ret;
.ТЕКС_ОКНА1:
db " Управляющие кнопки ",13;
db " --------------------------",13;
db " F1 - Окно помощи",13;
db " F3 - Создать окно",13;
db " F9 - Запуск программы",13;
db " F2 - ОСтановка программы",13;
db " F4 - Закрыть окно",13;
db " --------------------------",13;
db " Среда разработки Тимур Email hostingurifa@gmail.com",13;
db " https://sites.google.com/site/timpascallib/",13;
db " --------------------------",13,0;
;=============================================================================}
СИСТЕМНЫЕ_КНО:;{ ОБработка системных кнопок
pushad;
mov ax,[НАЖ_КНОПК];
;------------------;
cmp ax,17408 ; // Кнопка f10 переключения раскладки
jnz .УНОПКА_ВПРАВО ;
mov ax,[РАС_КЛАВ] ;
test ax,ax ;
jz .УСТ_АНГ ;
mov si,РАС_КЛАВ ;
mov word [si],0 ;
jmp .КОН_УСТ_РАС ;
.УСТ_АНГ:
mov si,РАС_КЛАВ ;
mov word [si],1 ;
jmp .КОН_УСТ_РАС ;
.КОН_УСТ_РАС:
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
jmp .ДАЛЕЕ ;
;------------------;
.УНОПКА_ВПРАВО:
;------------------;
cmp ax,15616 ; // Кнопка вправо
jnz .УНОПКА_УДАЛЕ ;
Call КНОП_СОЗ_ОКНА ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
jmp .ДАЛЕЕ ;
;------------------;
.УНОПКА_УДАЛЕ:
;------------------;
cmp ax,15872 ; // Кнопка помощи
jnz .КНОПКА_ПОМОЩ ;
Call КНОП_УДА_ОКНА ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
jmp .ДАЛЕЕ ;
;------------------;
.КНОПКА_ПОМОЩ:
;------------------;
cmp ax,15104 ; // Кнопка вправо
jnz .КНОПКА_ЗАПУС ;
Call КНОП_ПОМ_ОКНА ;
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
jmp .ДАЛЕЕ ;
;------------------;
.КНОПКА_ЗАПУС:
;------------------;
cmp ax,17152 ; // Кнопка Запруска программы
jnz .ДАЛЕЕ ;
mov di,[МЫШ_ВЫДЕ2];
mov ax,0 ;
mov [НАЖ_КНОПК],ax;
call ВЫПОЛНИТЬ_ОК ;
jmp .ДАЛЕЕ ;
;------------------;
.ДАЛЕЕ:
popad;
ret;
;==============================================================================}
ОКНО_ПРЕДЕЛЫ :;{ Проверка вхождение координат CL-X,DL-Y в пространство окна
pushad;
;--------------;// Проверка вхождения сммвола по X
Call ОКНО_АЛЕ ;// Получаем абсолютные координаты левого угла окна
Cmp Cl,AL ;// Сравниваем с левым краем окна координату символа по X
jb .НЕВХОДИТ ;
Call ОКНО_АПР ;// Читаем абсолютнуюю координату правой стороны окна
cmp cl,al ;// Сравниваем
JAE .НЕВХОДИТ ;// Если Правый край окна оказался больше либо равен Координате символа рисовать ненада
;--------------;
;--------------;// Проверка вхождения сммвола по Y
Call ОКНО_АВЕ ;// Получаем абсолютные координаты левого верхнего угла окна
Cmp dl,AL ;// Сравниваем с левым верхним углом окна координату символа по Y
jb .НЕВХОДИТ ;
Call ОКНО_АНИ ;// Читаем абсолютнуюю координату правой нижней стороны окна
cmp dl,al ;// Сравниваем
JAE .НЕВХОДИТ ;// Если Правый край окна оказался больше либо равен Координате символа рисовать ненада
;--------------;
.ВХОДИТ:
mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
.НЕВХОДИТ:
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_ВЫВОД_XY:;{ Вывод символа в окно Di-si Cl-X DL-Y AX-Символ и атрибуты
pushad;
mov bx,Ax ;// Запоминаем Символ и атрибуты
;----------------
call ЭЛЕ_ТИП ;
cmp ax,ТИП_ОКНО ;
jnz .ДАЛЕЕ ;// Если элемент не являетсья окном то пропускам проверку пределов
;----------------
;----------------
call ОКНО_ПРЕДЕЛЫ ;
jz .ВЫХОД ;// ПРоверка предлов
;----------------
.ДАЛЕЕ:
;----------------
Call ЭЛЕ_РОДИТЕЛЬ ;// Переходим в родительский элемент
JZ .РИСОВАТЬ ;// Символ рисовать если больше родителей нету
;----------------
;----------------
mov ax,bx ;
call ОКНО_ВЫВОД_XY;
Jmp .ВЫХОД ;
;----------------
.РИСОВАТЬ:
;----------------------
mov ax,Bx ;// Востанавливаем сивмол и атрибуты
call ЭКРАН_ВЫВОД_AX_CX_DX ;// Выводи символ на экран
;----------------------
cmp cl,[МЫШ_КООX2];
jnz .ВЫХОД;
cmp dl,[МЫШ_КООY2];
jnz .ВЫХОД;
;----------------------
call МЫШКА_ЩЕЛЧЕК ;// Установка активного элемента по щелчку мышки
jz .ВЫХОД ;// Если мышка не нажата то выход
;----------------------
mov di,SI ;// Востанавливаем элемент источник печати символа
mov [МЫШ_ВЫДЕ2],di ;// Записываем дарес элемента по котрому нажата кнопка
;----------------------
mov bx,1 ;// Устанавливаем Режим перемещени окна
mov [МЫШ_ТИППЕ],bx ;// ПО умолчанию режим перемесчения окна
;--------------------
;--------------------
call ОКНО_АЛЕ ;// Читаем Абсолютный Левый край окна
mov cx,[МЫШ_КООX2] ;
SUB cx,ax ;
mov [МЫШ_СМЕЩX],CX ;// Записываем смещеие ОТ левого края окна до координаты нажатия мышки
mov ax,cx ;
mov cx,ПАР_ТКУX ;// Установка текст курсор X
call ЭЛЕ_УСТ_ПАР ;
;--------------------
;-----------------------
call ОКНО_АВЕ ;// Читаем Абсолюиный Верхний край окна
mov cx,[МЫШ_КООY2] ;
SUB cx,ax ;
mov [МЫШ_СМЕЩY],CX ;
mov ax,cx ;
mov cx,ПАР_ТКУY ;// Установка текст курсор Y
call ЭЛЕ_УСТ_ПАР ;
;-----------------------
;--------------------;// Вычисление правой кооррдинаты окна
call ОКНО_АПР ;// Читаем правый край окна
mov cx,ax ;// cx вычислили правый край окна
dec cx;
;-----------------------
;--------------------;// Вычисление нижней кооррдинаты окна
call ОКНО_АНИ ;// Читаем нижний край окна
mov Dx,ax ;// cx вычислили нижений край окна
dec dx;
;-----------------------
;-----------------------
cmp [МЫШ_КООX2],CX ;// Если мышка нажата по правому краю окна то
jnz .ДАЛЕЕ3 ;
add bx,1 ;// Если нажато по правому краю окна то BX=2;
;-----------------------
.ДАЛЕЕ3:
;-----------------------
cmp [МЫШ_КООY2],DX ;// Если нажато по нижнему краю окна
JNZ .ДАЛЕЕ4 ;
ADD BX,2 ;если нажата по нижнему краю то равно BX=3; либо 4 если по нижнему краю и правому краю
;-----------------------
.ДАЛЕЕ4: MOV [МЫШ_ТИППЕ],BX ;// Записываем типи дейтсвия над окощком
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_ОЧИСТКА :;{ Очищает участок экрана для рисования окна DI-SI
pushad;
;------------------ Читаем XY
Call ОКНО_АЛЕ ;// Возвращает Координаты по X абсолютные AX для окна DI X1
MOV CL,AL ;
;------------------
Call ОКНО_АВЕ ;// Возвращает Координаты по Y абсолютные AX для окна DI Y1
MOV DL,AL ;
;------------------ Расчитываем X2
Call ОКНО_АПР ;// Возвращает ширину окна в регистре AX для окна DI
MOV CH,AL ;
;------------------ Расчитываем Y2
Call ОКНО_АНИ ;// Возвращает Высоту окна в регистре AX для окна DI
MOV DH,AL ;
;------------------ Читаем атрибуты
Call ОКНО_АТР ;// Возвращает атрибуты окна в регистре AH для окна DI;
mov AH,AL ;
mov AL,' ' ;// Заноим пробел для затирания экрана
;------------------
mov bl,cl ;// Запоминаем координату X1
.ЦИКЛ: ;------------------
cmp dl,dh ;// ПРоверяем не достигли ли нижней границы окна
JAE .ВЫХОД ;// Если достигли то очистка закончена
CMP CL,CH ;//
JAE .СЛЕДСТРО ;// Если X>=X2 то переходим на след строку для очистки
mov si,di;
call ОКНО_ВЫВОД_XY;
INC CL ;// В противном случае сдвигаемся в право X:=X+1;
JMP .ЦИКЛ ;
.СЛЕДСТРО:
MOV CL,Bl ;// Перемещаемся к левому краю
INC DL ;// Увеличиваем координату по Y
jmp .ЦИКЛ ;
;-----------------
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ОКНО_ВЫВОД_XY2:;{ Вывод символа в окно Di-si Cl-X DL-Y AX-Символ и атрибуты
pushad;
mov bx,Ax ;// Запоминаем Символ и атрибуты
;----------------
call ЭЛЕ_ТИП ;
cmp ax,ТИП_ОКНО ;
jnz .ДАЛЕЕ ;// Если элемент не являетсья окном то пропускам проверку пределов
;----------------
;----------------
call ОКНО_ПРЕДЕЛЫ ;
jz .ВЫХОД ;// ПРоверка предлов
;----------------
.ДАЛЕЕ:
;----------------
Call ЭЛЕ_РОДИТЕЛЬ ;// Переходим в родительский элемент
JZ .РИСОВАТЬ ;// Символ рисовать если больше родителей нету
;----------------
;----------------
mov ax,bx ;
call ОКНО_ВЫВОД_XY2;
Jmp .ВЫХОД ;
;----------------
.РИСОВАТЬ:
;----------------------
mov ax,Bx ;// Востанавливаем сивмол и атрибуты
call ЭКРАН_ВЫВОД_AX_CX_DX ;// Выводи символ на экран
;----------------------
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_РАМКА :;{ Очищает участок экрана для рисования окна DI-SI
pushad;
;------------------ Читаем XY
Call ОКНО_АЛЕ ;// Возвращает Координаты по X абсолютные AX для окна DI X1
MOV CL,AL ;
;------------------
Call ОКНО_АВЕ ;// Возвращает Координаты по Y абсолютные AX для окна DI Y1
MOV DL,AL ;
;------------------ Расчитываем X2
Call ОКНО_АПР ;// Возвращает ширину окна в регистре AX для окна DI
MOV CH,AL ;
;------------------ Расчитываем Y2
Call ОКНО_АНИ ;// Возвращает Высоту окна в регистре AX для окна DI
MOV DH,AL ;
;------------------ Читаем атрибуты
Call ОКНО_АТР ;// Возвращает атрибуты окна в регистре AH для окна DI;
mov AH,AL ;
mov AL,' ' ;// Заноим пробел для затирания экрана
;------------------
mov bl,cl ;// Запоминаем координату X1
pushad
mov al,218;
call ОКНО_ВЫВОД_XY2;
popad;
pushad
mov al,192;
mov dl,dh;
dec dl;
call ОКНО_ВЫВОД_XY2;
popad;
pushad
mov cl,ch;
dec cl;
mov al,191;
call ОКНО_ВЫВОД_XY2;
popad
pushad
mov cl,ch;
dec cl;
mov dl,dh;
dec dl;
mov al,217;
call ОКНО_ВЫВОД_XY2;
popad
pushad
mov al,196;
inc cl;
dec ch;
.ЦИКЛ:
cmp cl,ch;
jae .КЦИКЛ;
call ОКНО_ВЫВОД_XY2;
push dx;
mov dl,dh;
dec dl;
call ОКНО_ВЫВОД_XY2;
pop dx;
inc cl;
jmp .ЦИКЛ;
.КЦИКЛ:
popad;
mov al,179;
inc dl;
dec dh;
.ЦИКЛ2:
cmp dl,dh;
jae .КЦИКЛ2;
call ОКНО_ВЫВОД_XY2;
push cx;
mov cl,ch;
dec cl;
call ОКНО_ВЫВОД_XY2;
pop cx;
inc dl;
jmp .ЦИКЛ2;
.КЦИКЛ2:
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ОКНО_ВЫВОД_ТЕ:;{ Выводит текста окна di
pushad;
;---------------;
mov cx,ПАР_КССК ;// Указываем количество символов в строке с курсором равно 0
mov ax,0 ;
Call ЭЛЕ_УСТ_ПАР ;
;---------------;
mov cx,ПАР_КОСТ ;// Указываем количество символов в строке с курсором равно 0
mov ax,0 ;
Call ЭЛЕ_УСТ_ПАР ;
;---------------;
mov cx,ПАР_ПАВС ;// Указываем предположительный адрес для вставки символа
call ОКНО_ТЕК ;// Читаем адрес текста
Call ЭЛЕ_УСТ_ПАР ;
test ax,ax ;
jz .ВЫХОД ;// если текст отсуствует тто выход
;------------------
Mov si,ax ;// Сохраняем адрес выводимого текста в регистр SI
mov cx,0 ;// Координата в тексте X
mov dx,0 ;// Координата в тексте Y
.ЦИКЛ:
;-------------------
call ОКНО_АКY ;
cmp dx,ax ;
jae .ДАЛЕЕ2 ;
mov bx,cx ;// Сохраняем содержимое регистра CX - X
mov ax,cx ;
mov cx,ПАР_ДПСТ ;
call ЭЛЕ_УСТ_ПАР ;
mov cx,bx ;// Востанавливаем содержимое CX
;-------------------
.ДАЛЕЕ2:
;----------------;
call ОКНО_АКY ;// Получаем абсолютные координаты курсора по Y в тексте
cmp dx,ax ;
jnz .ДАЛЕЕ ;
call ОКНО_АКX ;// Получаем абсолютные координаты курсора по X в тексте
cmp cx,ax ;
ja .ДАЛЕЕ ;
mov bx,cx ;// Сохраняем значение регистра CX
mov ax,cx ;// Сохраняем правый край строки в месте где расположен курсор
mov cx,ПАР_КССК ;
Call ЭЛЕ_УСТ_ПАР ;
mov ax,si ;
mov cx,ПАР_ПАВС ;// сохраняем адрес символа в тексте окна где расположен правый крвй строки в месте где располен край строки
Call ЭЛЕ_УСТ_ПАР ;
mov cx,bx ;// Востанавливаем значение регистра CX
;----------------;
.ДАЛЕЕ:
;----------------;
mov al,[si] ;// Читаем символ из текста
test al,al ;// Проверяем на звершение текста 0
jz .ВЫХОД ;
;----------------;
;----------------;
cmp al,13 ;// ПРоверка на перевод каретки перевод строки
jZ .ENTER ;// Если первод строки то переходим к .ENTER
;----------------;
call .OUTCHA ;// Вывод символа
inc cx ;// Сдвигаем символ в право
inc si ;
jmp .ЦИКЛ ;
;----------------;
.ENTER:
;----------------;
inc si ;
mov cx,0 ;
inc Dx ;
;----------------; Запоминаем количество строк в тексте
mov bx,cx ; Сохраняем значение регистра CX
mov cx,ПАР_КОСТ ;
mov ax,dx ;
call ЭЛЕ_УСТ_ПАР ;
mov cx,bx ; Востанавливаем значение CX
JMP .ЦИКЛ ;
;----------------;
.ВЫХОД:
popad ;
ret ;
.OUTCHA:
pushad;
mov si,ax ;// Сохраняем выводимый символ d BL
call ОКНО_ТСX;// Читаем смещение внтури текста X
cmp cx,ax ;// проверяем что выводимый символ больше либо равно смещения в тексте
jb .ВЫХОД2 ;// Если меньше смещения то выход
mov bx,ax ;// Запоминаем смещение внтури текста
call ОКНО_ШИР;// Читаем ширину окна
add ax,bx ;// складываем смещенеи внтури текста и ширину окна
cmp cx,ax ;// Сравниаем с X
JA .ВЫХОД2 ;// если оказалася больше то выход
call ОКНО_ТСY;// Читаем смещение внтури текста Y
cmp dx,ax ;// проверяем что выводимый символ больше либо равно смещения в тексте
jb .ВЫХОД2 ;// Если меньше смещения то выход
mov bx,ax ;// Запоминаем смещение внтури текста
call ОКНО_ВЫС;// Читаем Dscjnt jryf окна
add ax,bx ;// складываем смещенеи внтури текста и Высотук окна
cmp dx,ax ;// Сравниаем с Y
JA .ВЫХОД2 ;// если оказалася больше то выход
call ОКНО_ТСX;// Вычитаем из координаты символа смещене внутри текста
SUB cx,AX ;
call ОКНО_АЛЕ;// прибавляем абсолютную координату окнга слева
add cx,ax;
call ОКНО_ТСY;// Вычитаем из координаты символа смещене внутри текста
SUB dx,AX ;
call ОКНО_АВЕ;// прибавляем абсолютную координату окнга слева
add Dx,ax;
call ОКНО_АТР ;// читем атрибуты окна
mov bl,al ;
mov ax,si ;// Востанавлвиаем печатаемый символ
mov ah,bl ;
mov si,di;
call ОКНО_ВЫВОД_XY;// Выводим символ в окно
.ВЫХОД2:
popad;
ret;
;==============================================================================}
ОКНО_ВЫВОД_КУ:;{ РИсует курсор Окна Di
pushad
cmp di,[МЫШ_ВЫДЕ2];// сравниваем с активным окном
jnz .ВЫХОД ;// Если окно не активно рисовать курсор ненадаь
;--------------------
Call ОКНО_ТКX ;// Вычисление абсолютных координат курсора на экране
mov CX,ax ;
call ОКНО_АЛЕ ;
add cx,ax ;
;--------------------
;--------------------
Call ОКНО_ТКY ;// Вычисление абсолюной коорднаты Y на экране
mov DX,ax ;
call ОКНО_АВЕ ;
add dx,ax ;
;--------------------
call ОКНО_АКУ
mov ah,al;
mov al,0;
mov si,di;
Call ОКНО_ВЫВОД_XY ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_РИСОВАТЬ:;{ Пытаеться нарисовать Элемент DI как окно
pushad;
call ОКНО_ОЧИСТКА;// ПОдгатавливает место под рисование текста окна
Call ЭЛЕ_ТИП;
cmp ax,ТИП_ОКНО;
jnz .ДАЛЕЕ
Call ОКНО_РАМКА;
.ДАЛЕЕ:
call ОКНО_ВЫВОД_ТЕ;// Выводит текст окна di
call ОКНО_ВЫВОД_КУ;// Выводит курсора окна di
popad;
ret;
;==============================================================================}
ОКНО_РИСО_ВСЕ:;{ РИсует окно DI и все вложеные окна
pushad;
call ОКНО_РИСОВАТЬ;// РИсуем коно DI
Call ЭЛЕ_ПОСЛЕД ;// Перемещаемся к последнему вложену элементу в окне
.ЦИКЛ: test DI,DI ;// ПРоверка на NIL
jz .КЦИКЛ ;// Если окно не существует закончить рисование
call ЭЛЕ_ТИП ;// ПРоверяем являеться ли элемент Окном
cmp al,ТИП_ОКНО ;
jnz .ДАЛЕЕ ;// Если элемент не окно то просто пропускаем его
Call ОКНО_РИСО_ВСЕ;// Если элемент это окно то рисукм его рекурсия
.ДАЛЕЕ: ADD DI,ЭЛ_ПРЕ ;// Переходим к предыдущему элементу
mov di,[di] ;
Jmp .ЦИКЛ ;
.КЦИКЛ:
popad;
ret;
;==============================================================================}
ОКНО_ПЕРЕМЕЩЕ:;{ Функция для перемещения окон на экране
pushad;
;-------------------
call МЫШКА_НАЖАТА ;
JZ .ВЫХОД ;// Если мышка не нажата перемещение не осуществляеться
;-------------------
;-------------------
mov ax,[МЫШ_ВЫДЕ1]; ПРоверяем наличае элемента по котрому была нажата кнопка прошлый раз
test ax,ax ;
JZ .ВЫХОД ;
mov ax,[МЫШ_ВЫДЕ2]; ПРоверяем наличае элемента по котрому была нажата кнопка щас
test ax,ax ;
JZ .ВЫХОД ;
mov ax,[МЫШ_ВЫДЕ1];// ПРоверяем что реч идет об одном и том же элементе что и в прошлый рас нажатия кнопки
cmp ax,[МЫШ_ВЫДЕ2];
JNZ .ВЫХОД ;
;-------------------
mov DI,[МЫШ_ВЫДЕ2] ;// Проверяем что элемент являеться имиено окошком
Mov Si,DI ;
add si,ЭЛ_ТИП ;
MOV al,[si] ;
CMP al,ТИП_ОКНО ;
JNZ .ВЫХОД ;
mov ax,[МЫШ_ТИППЕ];// СМотрим тип перемещения
cmp ax,1 ;
JZ .ОКПЕР ;// Просто перемещение окна
cmp ax,2 ;
JZ .ОКШИР ;// Изменение ширины окна
cmp ax,3 ;
JZ .ОКВЫС ;// Изменение ВЫСОТЫ окна
cmp ax,4 ;
JZ .ОКРАЗ ;// Изменеине размера окна
Jmp .ВЫХОД ;
.ОКПЕР:;{ НЕпосредственно перемещение
call ОКНО_АЛЕ ;// Читаем абсолютные координаты по Х окна котрое нужно подвинуть
add ax,[МЫШ_СМЕЩX] ;
cmp [МЫШ_КООX2],ax ;// Сравниваем с координатами мышки координату окна по Х
JA .XБОЛ ;// Если координата мышки оказалася больше координаты окна
JB .XМЕН ;// Если координата мышки оказалася Меньше координаты окна
JMP .ДАЛЕЕ ;
.XБОЛ: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ЛЕВ ;// Читаем локальную координату окна
inc ax ;// и увеличиваем её
mov CX,ПАР_ЛЕВО ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Устанавливаем значения параметра окна левый край
JMP .ДАЛЕЕ ;
.XМЕН: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ЛЕВ ;// Читаем локальную координату окна
test ax,ax ;// Ниже нудя нельзя
jz .ДАЛЕЕ ;
dec ax ;// и увеличиваем её
mov CX,ПАР_ЛЕВО ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Устанавлвиаем значение параметра окна
JMP .ДАЛЕЕ ;
.ДАЛЕЕ:
call ОКНО_АВЕ ;// Читаем абсолютные координаты по Х окна котрое нужно подвинуть
add ax,[МЫШ_СМЕЩY] ;
cmp [МЫШ_КООY2],ax ;// Сравниваем с координатами мышки координату окна по Х
JA .YБОЛ ;// Если координата мышки оказалася больше координаты окна
JB .YМЕН ;// Если координата мышки оказалася Меньше координаты окна
JMP .ВЫХОД ;
.YБОЛ: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ВЕР ;// Читаем локальную координату окна
inc ax ;// и увеличиваем её
mov CX,ПАР_ВЕРХ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР;// Элемент сет параметр
JMP .ВЫХОД ;
.YМЕН: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ВЕР ;// Читаем локальную координату окна
test ax,ax ;// Ниже нудя нельзя
jz .ВЫХОД
dec ax ;// и увеличиваем её
mov CX,ПАР_ВЕРХ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР;// Элемент сет параметр
JMP .ВЫХОД ;
;}
.ОКШИР:;{ изменение шинрины окна
call ОКНО_АПР ;// Читаем абсолютные координаты по Х окна котрое нужно подвинуть
cmp [МЫШ_КООX2],ax;// Сравниваем с координатами мышки координату окна по Х
JA .ПРXБОЛ ;// Если координата мышки оказалася больше координаты окна
JB .ПРXМЕН ;// Если координата мышки оказалася Меньше координаты окна
JMP .ПРДАЛЕЕ ;
.ПРXБОЛ: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ШИР ;// Читаем локальную координату окна
inc ax ;// и увеличиваем её
mov CX,ПАР_ШИРИ ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .ПРДАЛЕЕ ;
.ПРXМЕН: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ШИР ;// Читаем локальную координату окна
cmp ax,1 ;// Ниже нудя нельзя
jbe .ПРДАЛЕЕ ;
dec ax ;// и увеличиваем её
mov CX,ПАР_ШИРИ ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .ПРДАЛЕЕ ;
.ПРДАЛЕЕ:
JMP .ВЫХОД ;
;}
.ОКВЫС:;{ изменение Высота окна
call ОКНО_АНИ ;// Читаем абсолютные координаты по Х окна котрое нужно подвинуть
cmp [МЫШ_КООY2],ax;// Сравниваем с координатами мышки координату окна по Х
JA .ВЫYБОЛ ;// Если координата мышки оказалася больше координаты окна
JB .ВЫYМЕН ;// Если координата мышки оказалася Меньше координаты окна
JMP .ВЫYДАЛЕЕ ;
.ВЫYБОЛ: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ВЫС ;// Читаем локальную координату окна
inc ax ;// и увеличиваем её
mov CX,ПАР_ВЫСО ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .ВЫYДАЛЕЕ ;
.ВЫYМЕН: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ВЫС ;// Читаем локальную координату окна
cmp ax,1 ;// Ниже нудя нельзя
jbe .ВЫYДАЛЕЕ ;
dec ax ;// и увеличиваем её
mov CX,ПАР_ВЫСО ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .ВЫYДАЛЕЕ ;
.ВЫYДАЛЕЕ:
JMP .ВЫХОД ;
;}
.ОКРАЗ:;{ Изменение разммера окошка
call ОКНО_АПР ;// Читаем абсолютные координаты по Х окна котрое нужно подвинуть
cmp [МЫШ_КООX2],ax;// Сравниваем с координатами мышки координату окна по Х
JA .РАXBOL ;// Если координата мышки оказалася больше координаты окна
JB .РАXMEN ;// Если координата мышки оказалася Меньше координаты окна
JMP .РАXДАЛЕЕ ;
.РАXBOL:;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ШИР ;// Читаем локальную координату окна
inc ax ;// и увеличиваем её
mov CX,ПАР_ШИРИ ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .РАXДАЛЕЕ ;
.РАXMEN: ;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ШИР ;// Читаем локальную координату окна
cmp ax,1 ;// Ниже нудя нельзя
jbe .РАXДАЛЕЕ
dec ax ;// и увеличиваем её
mov CX,ПАР_ШИРИ ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .РАXДАЛЕЕ ;
.РАXДАЛЕЕ:
call ОКНО_АНИ ;// Читаем абсолютные координаты по Х окна котрое нужно подвинуть
cmp [МЫШ_КООY2],ax;// Сравниваем с координатами мышки координату окна по Х
JA .РАYБОЛ ;// Если координата мышки оказалася больше координаты окна
JB .РАYМЕН ;// Если координата мышки оказалася Меньше координаты окна
JMP .ВЫХОД ;
.РАYБОЛ:;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ВЫС ;// Читаем локальную координату окна
inc ax ;// и увеличиваем её
mov CX,ПАР_ВЫСО ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .ВЫХОД ;
.РАYМЕН:;// Если координата мышки оказалася больше двигаем окно по х к мышке
CAll ОКНО_ВЫС ;// Читаем локальную координату окна
cmp ax,1 ;// Ниже нудя нельзя
jbe .ВЫХОД
dec ax ;// и увеличиваем её
mov CX,ПАР_ВЫСО ;// и сохраняем значение
call ЭЛЕ_УСТ_ПАР ;// Элемент сет параметр
JMP .ВЫХОД ;
;}
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОКНО_СОЗДАТЬ :;{ Создает окно с координами Cx-x Ch-Y Ширина Dl - Высота dh с именем SI внутри элемента DI Текст окна BX
pushad;
;--------------------;
; // В SI Имя окна
; // В BX значение окна
mov al,ТИП_ОКНО ; // Создаем элемент с именем SI В Элементе DI в AL тип элемента ТИП_ОКНО
mov ah,1 ; // Заполняем поле функция чтор означает что элемент участвует в поиске
call ЭЛЕ_СОЗДАТЬ ; // Создаем элемент получаем его адрес в DI
;--------------------; // SI Теперь свободно для использования
;--------------------;
mov SI,ПАР_ТЕКС ; // Создаем параметро Смещене текста по Y
mov AL,ТИП_СТРО ; // Тип элемента текст то есть строка заканчивающаяся нулем
mov ah,1 ; // Участвует в поиске
; // В BX Содержиться адрес текста окна
call .ПАР_СОЗДАТЬ ; //
;--------------------; // Регистр BX Свободен для использолвания
;-----------------------;
mov SI,ПАР_ЛЕВО ; // Создаем параметро имя=ЛЕВО Координата окна по X
mov AL,ТИП_ЧИСЛ ; // Указываем ТИп Число
mov ah,1 ; // Указываем что это функция
xor bx,bx ;
mov Bl,Cl ; // Указываем значение
call .ПАР_СОЗДАТЬ ; // Создание эелемнта внутри элемента DI
;-----------------------;
mov SI,ПАР_ВЕРХ ; // Создаем параметро ВЕРХ
mov AL,ТИП_ЧИСЛ ; //
mov ah,1 ; //
xor bx,bx ;
mov Bl,Ch ; //
call .ПАР_СОЗДАТЬ ;
;-----------------------
mov SI,ПАР_ШИРИ ; //
mov AL,ТИП_ЧИСЛ ; //
mov ah,1 ; //
xor bx,bx ;
mov Bl,dl ; //
call .ПАР_СОЗДАТЬ ;
;-----------------------
mov SI,ПАР_ВЫСО ; //
mov AL,ТИП_ЧИСЛ ; //
mov ah,1 ; //
xor bx,bx ;
mov Bl,Dh ; //
call .ПАР_СОЗДАТЬ ;
;--------------------;
; Смещение окна внутри текста мыже через окно видим только кусочек текста
;--------------------;
mov SI,ПАР_ТСМX ; // Создаем параметро Смещене текста по X
mov AL,ТИП_ЧИСЛ ; //
mov ah,1 ; //
mov Bx,0 ; //
call .ПАР_СОЗДАТЬ ; //
;-----------------------
mov SI,ПАР_ТСМY ; // Создаем параметро Смещене текста по Y
mov AL,ТИП_ЧИСЛ ; //
mov ah,1 ; //
mov Bx,0 ; //
call .ПАР_СОЗДАТЬ ; //
;--------------------;
; Координаты курсора внутри текста
;-----------------------
mov SI,ПАР_ТКУX ; // Создаем параметро координаат курсора по X в окне
mov AL,ТИП_ЧИСЛ ; //
mov ah,1 ; //
mov Bx,0 ; //
call .ПАР_СОЗДАТЬ ; //
;-----------------------
mov SI,ПАР_ТКУY ; // Создаем параметро координаат курсора по Y в окне
mov AL,ТИП_ЧИСЛ ; //
mov ah,1 ; //
mov Bx,0 ; //
call .ПАР_СОЗДАТЬ ; //
;---------------------
; Параметр Атрибуты Цвет Фона и текста окна и Цвет фона и цвет текста курсора
;--------------------;
mov SI,ПАР_АТРИ ;// Атрибуты окна
mov AL,ТИП_ЧИСЛ ;//
mov ah,1 ;//
mov Bx,11001111b ;//
call .ПАР_СОЗДАТЬ ;//
;---------------------
mov SI,ПАР_АКУР ;// Атрибуты курсора
mov AL,ТИП_ЧИСЛ ;//
mov ah,1 ;//
mov Bx,10111111b ;//
call .ПАР_СОЗДАТЬ ;//
;--------------------;
; Дополнительные параметры для работы с текстом
;------------------------------------------
mov SI,ПАР_ДПСТ ;// Создаем параметро Длина последней строки до курсора по Y длина строки над курсором Количества символов в встроке с курсором
mov AL,ТИП_ЧИСЛ ;// Указываем ТИп Параметр
mov ah,1 ;// Указываем что это функция
mov Bx,0 ;// Указываем значение
call .ПАР_СОЗДАТЬ ;
;------------------------------------------
mov SI,ПАР_КССК ;// Создаем параметро Количества символов в встроке с курсором
mov AL,ТИП_ЧИСЛ ;// Указываем ТИп Параметр
mov ah,1 ;// Указываем что это функция
mov Bx,0 ;// Указываем значение
call .ПАР_СОЗДАТЬ ;
;------------------------------------------
mov SI,ПАР_ПАВС ;// Создаем параметро Предположительный адрес для вставки символа
mov AL,ТИП_ЧИСЛ ;// Указываем ТИп Параметр
mov ah,1 ;// Указываем что это функция
mov Bx,0 ;// Указываем значение
call .ПАР_СОЗДАТЬ ;
;------------------------------------------
mov SI,ПАР_КОСТ ;// Создаем параметро Количество строк в тексте
mov AL,ТИП_ЧИСЛ ;// Указываем ТИп Параметр
mov ah,1 ;// Указываем что это функция
mov Bx,0 ;// Указываем значение
call .ПАР_СОЗДАТЬ ;
;-------------------------------------------
pop si ;
Push di ;
popad ;
ret ;
.ПАР_СОЗДАТЬ:; ДЛя создания параметров
push di ;
call ЭЛЕ_СОЗДАТЬ ;
pop di ;
ret ;
;==============================================================================}
ОКНО_СОЗДАТЬ1:;{ Создает окно с именем SI внутри элемента DI
pushad;
call .СОЗ_ТЕК ; // Создаем строку с текстом окна заносим в BX её адрес
mov CL,10 ; // Указываем координату окна по X
mov CH,10 ; // Указываем координату окна по Y
mov DL,10 ; // Указываем Ширину окна
mov DH,10 ; // Указываем Указываем высоту окна
call ОКНО_СОЗДАТЬ ;
pop si ;
Push di ;
popad ;
ret ;
.СОЗ_ТЕК:
push si;
push di;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_1024_БАЙТ; // Выделяем участок памяти для текста результат возвращеться адрес DI
mov si,di ; // Указывапем куда копировать то есть в новую строку
mov di,.ТЕКС_ОКНА1 ; // Указывапем откудвава копировать
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI; // Копируем
mov bx,si ; // Заном адрес строки в BX
pop di;
pop si;
ret;
.ТЕКС_ОКНА1: db ' ',13,' x(){};',13,' x:=1;',13,' while (x<20) ',13,'{',13,' ВЫВОД(x);',13,' x:=x+1;',13,' ЛЕВО:=x; };',13,' ',0; //;
;.ТЕКС_ОКНА1: db 'x(){}; x:=1; while (x<4) {ВЫВОД(x);x:=x+1;} ',0; ;ЛЕВО:=x;
;.ТЕКС_ОКНА1: db 'FUNCTION SUMMA(A,B)',13,'{ SUMMA=A+B } ',13,'ВЫВОД(SUMMA(5,6));',0;
;.ТЕКС_ОКНА1: db 'SUMMA(a){b}',0;
;.ТЕКС_ОКНА1: db 'PRINT(2+4)',13,0;
;==============================================================================}
ОКНО_СОЗДАТЬ2:;{ Создает окно с именем CX внутри элемента DI
pushad;
call .СОЗ_ТЕК ; // Создаем строку с текстом окна заносим в BX её адрес
mov CL,1 ; // Указываем координату окна по X
mov CH,1 ; // Указываем координату окна по Y
mov DL,3 ; // Указываем Ширину окна
mov DH,3 ; // Указываем Указываем высоту окна
call ОКНО_СОЗДАТЬ ;
mov cx,ПАР_АТРИ ;
mov ax,10110000b ;
call ЭЛЕ_УСТ_ПАР ;
pop si ;
Push di ;
popad ;
ret ;
.СОЗ_ТЕК:
push si;
push di;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_1024_БАЙТ; // Выделяем участок памяти для текста результат возвращеться адрес DI
mov si,di ; // Указывапем куда копировать то есть в новую строку
mov di,.ТЕКС_ОКНА1 ; // Указывапем откудвава копировать
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI; // Копируем
mov bx,si ; // Заном адрес строки в BX
pop di;
pop si;
ret;
.ТЕКС_ОКНА1: db "ПРОВЕРОЧНЫЙ 111 ТЕКСТ",13,'СТРОКА 22222 тестовая ',13,'Стро1111ка 3 ',0;
;==============================================================================}
ОКНО_МОНИТОР :;{ Создает окно МОНИТОР внутри элемента DI
pushad;
call .СОЗ_ТЕК ; // Создаем строку с текстом окна заносим в BX её адрес
mov SI,МОНИТОР ;
mov CL,1 ; // Указываем координату окна по X
mov CH,1 ; // Указываем координату окна по Y
mov DL,10 ; // Указываем Ширину окна
mov DH,10 ; // Указываем Указываем высоту окна
call ОКНО_СОЗДАТЬ ;
mov cx,ПАР_АТРИ ;
mov ax,00001111b ;
call ЭЛЕ_УСТ_ПАР ;
popad ;
ret ;
.СОЗ_ТЕК:
push si ;
push di ;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_1024_БАЙТ; // Выделяем участок памяти для текста результат возвращеться адрес DI
mov si,di ; // Указывапем куда копировать то есть в новую строку
mov di,.ТЕКС_ОКНА1 ; // Указывапем откудвава копировать
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI; // Копируем
mov bx,si ; // Заном адрес строки в BX
pop di ;
pop si ;
ret;
.ТЕКС_ОКНА1: db 'МОНИТОР',13,0;
;==============================================================================}
;==============================================================================}
;{ ФУНКЦИИ ДЛЯ РАБОТЫ C СЛОВАРЕМ .
СЛО_В_КОД :;{ ПРеаобразует слово DI в уникальный код DI если слова нету то присваевает ему код BX если BX=0 ТО генериует код сама
pushad;
call СОЗДАТЬ_СТРОКУ_SI_ДЛИНОЙ_1024_БАЙТ ;
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI;
call ПЕРЕВОДИТ_СТРОКУ_SI_В_БОЛЬШИЕ_БУКВЫ;
mov cx,0 ;
mov di,[СЛОВАРЬ] ;
.ЦИКЛ: mov al,[di] ;
test al,al ;
jz .ДОБАВИТЬ ;
call СРАВНИТЬ_СТРОКИ_SI_DI;
JNZ .НАШОЛ ;
add di,16 ;
inc cx ;
jmp .ЦИКЛ ;
.ДОБАВИТЬ:
mov ax,cx;
mov dx,si ;
mov cx,di ;
call ЗАПИСАТЬ_СТРОКУ_DX_В_СТРОКУ_CX;
mov cx,ax;
add di,14 ;
test bx,bx ;
jnz .ЗАПКОД ;
mov [di],cx ;
jmp .ВЫХОД ;
.ЗАПКОД: mov [di],bx ;
mov cx,bx ;
jmp .ВЫХОД ;
.НАШОЛ:
add di,14 ;
mov cx,[di] ;
.ВЫХОД:
mov di,si;
call УДАЛИТЬ_СТРОКУ_DI;
pop si;
push cx;
popad;
ret
;==============================================================================}
СЛО_В_КОДCX:;{ ПРеаобразует слово CX в уникальный код CX
push di ;
push bx ;
mov bx,0 ;
mov di,cx ;
call СЛО_В_КОД ;
mov cx,di ;
pop bx ;
pop di ;
ret ;
;==============================================================================}
ДОБАВИТЬ_СЛОВО:;{ Добавляет слово SI назначает код CX возвращает длину добавленого слова в DX
push di;
push bx;
mov di,si;
mov bx,cx;
call СЛО_В_КОД;
mov di,si;
call ВОЗАРАЩАЕТ_В_DI_ДЛИНУ_СТРОКИ_DI;
mov dx,di;
pop bx;
pop di;
ret;
;==============================================================================}
ПРОСМОТР_СЛОВАРЯ:;{ ПРОСМОТР СЛОВАРЯ
pushad;
mov di,[СЛОВАРЬ];
.ЦИКЛ: mov al,[di];
test al,al;
jz .КЦИКЛ;
call ЭКРАН_ВЫВОД_СТРОКИ;
call ЭКРАН_ВЫВОД_ПЕРСТРО;
add di,16;
jmp .ЦИКЛ;
.КЦИКЛ:
call ОЖИДАНИЕ_НАЖАТИЯ_ЛЮБОЙ_КНОПКИ;
popad;
ret;
;==============================================================================}
ПОДГОТОВКА_СЛОВАРЯ :;{ подготавливает словарь для работы
pushad;
mov DI,4000 ;// Указываем размер запрашиваемого участка памяти для буфера экрана
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI;// Выделяем участок
mov [СЛОВАРЬ],di;
mov si,СПИСОК_СЛОВ;
mov cx,1;
.ЦИКЛ:
mov al,[si];
test al,al ;
jz .КЦИКЛ ;
Call ДОБАВИТЬ_СЛОВО ; // Добавляет слово SI в словарь назначает номер CX в DX возвращает длину добавленого слова
add si,dx ;
inc si;
mov al,[si];
cmp al,1 ;
jnz .ДАЛЕЕ ;
inc cx ;
inc si ;
.ДАЛЕЕ:
jmp .ЦИКЛ ;
.КЦИКЛ:
popad;
ret;
;==============================================================================}
СЛОВАРЬ: DW 0 ; // Адрес участка в памяти выделеного под словарь
;==============================================================================}
;{ ПЕРЕМЕННЫЕ .
МЫШ_ВЫДЕ1: DW 0 ;// Адрес елемнта по котрому нажата предыдущий раз мышка
МЫШ_ВЫДЕ2: DW 0 ;// Адрес елемнта по котрому нажата последний раз кнопка
МЫШ_СМЕЩX: DW 0 ;// Координаты смещения мышки внтри окна принажатии абсолютная коордиана окна + смещение = кооордината нажатия мышки
МЫШ_СМЕЩY: DW 0 ;// Координаты смещения внтри окна по y
МЫШ_ТИППЕ: DW 0 ;// 1 пермещение 2 изменение ширины 3 изменение высоты и 4 изменение размера окошка
КОР_ЭЛЕМ : DW 0 ;// Адрес корневого элемента
ПОТОКИ : DW 0 ;// Адреса потоков
ЭКР_ЦВЕТ : DW 0 ;// Цветовая гамма экрана
РАС_КЛАВ : DW 0 ;// Раскладка клавиатуры
СПИСОК_СЛОВ:
КОД_ТЕК_СЛОЖЕНИЕ : DB '+' ,0,'ПРИБАВИТЬ' ,0,1;
КОД_ТЕК_ВЫЧИТАНИЕ : DB '-' ,0,'ОТНЯТЬ' ,0,1;
КОД_ТЕК_УМНОЖЕНИЕ : DB '*' ,0,'УМНОЖИТЬ' ,0,1;
КОД_ТЕК_ДЕЛЕНИЕ : DB '/' ,0,'ПОДЕЛИТЬ' ,0,1;
КОД_ТЕК_ПРИСВОЕНИЕ : DB ':=' ,0,'ПРИСВОИТЬ' ,0,1;
КОД_ТЕК_РАВНО : DB '=' ,0,'РАВНО' ,0,'==' ,0,1;
КОД_ТЕК_НЕРАВНО : DB '<>' ,0,'!=' ,0,1;
КОД_ТЕК_БОЛЬШЕ : DB '>' ,0,'БОЛЬШЕ' ,0,1;
КОД_ТЕК_МЕНЬШЕ : DB '<' ,0,'МЕНШЕ' ,0,1;
КОД_ТЕК_МЕНРА : DB '<=' ,0,1;
КОД_ТЕК_БОЛРА : DB '>=' ,0,1;
КОД_ТЕК_ЛОГИ : DB 'И' ,0,'AND' ,0,'&&' ,0,1;
КОД_ТЕК_ЛОГИЛИ : DB 'ИЛИ' ,0,'OR' ,0,'||' ,0,1;
КОД_ТЕК_ОСКОБ : DB '(' ,0,1;
КОД_ТЕК_ЗСКОБ : DB ')' ,0,1;
КОД_ТЕК_НАЧАЛО : DB 'НАЧАЛО' ,0,'BEGIN' ,0,'{' ,0,1;
КОД_ТЕК_КОНЕЦ : DB 'КОНЕЦ' ,0,'END' ,0,'}' ,0,1;
КОД_ТЕК_ЕСЛИ : DB 'ЕСЛИ' ,0,'IF' ,0,1;
КОД_ТЕК_ПОКА : DB 'ПОКА' ,0,'WHILE' ,0,1;
КОД_ТЕК_ВЫВОД : DB 'ВЫВОД' ,0,'PRINT' ,0,'WRITE' ,0,1;
КОД_ТЕК_ВЫВОДСТ : DB 'ВЫВОДСТ' ,0,'PRINTLN' ,0,'WRITELN' ,0,1;
КОД_ТЕК_ЦИКЛ : DB 'ЦИКЛ' ,0,'ПОВТОРЯТЬ' ,0,'FOR' ,0,1;
КОД_ТЕК_ВВОД : DB 'ВВОД' ,0,'INPUT' ,0,'READ' ,0,1;
КОД_ТЕК_ВВОДСТ : DB 'ВВОДСТ' ,0,'INPUTLN' ,0,'READLN' ,0,1;
КОД_ТЕК_ПРАВДА : DB 'ПРАВДА' ,0,'TRUE' ,0,1;
КОД_ТЕК_ЛОЖ : DB 'ЛОЖ' ,0,'FALSE' ,0,1;
ПАР_ЛЕВО : db 'ПАР_ЛЕВО' ,0,'ЛЕВО' ,0,1; // Left координата по X отображемого окна
ПАР_ВЕРХ : db 'ПАР_ВЕРХ' ,0,'ВЕРХ' ,0,1; // Top координата по Y отображемого окна
ПАР_ШИРИ : db 'ПАР_ШИРИ' ,0,'ШИРИНА' ,0,1; // Width Ширина отображемого окна
ПАР_ВЫСО : db 'ПАР_ВЫСО' ,0,'ВЫСОТА' ,0,1; // HEight Высота отображемого окна
ПАР_АТРИ : db 'ПАР_АТРИ' ,0,'ФОН' ,0,1; // Атрибуты окна
ПАР_АКУР : db 'ПАР_АКУР' ,0,'КУРСОР' ,0,1; // Атрибуты Курсора
ПАР_ТСМX : db 'ПАР_ТСМX' ,0,'СМЕЩЕНИЕ_X' ,0,1; // Смещение видимого текста внтури текста по X
ПАР_ТСМY : db 'ПАР_ТСМY' ,0,'СМЕЩЕНИЕ_Y' ,0,1; // Смещение видимого текста внтури текста по Y
ПАР_ТКУX : db 'ПАР_ТКУX' ,0,'КУРСОР_X' ,0,1; // координаты текстового курсора по X
ПАР_ТКУY : db 'ПАР_ТКУY' ,0,'КУРСОР_Y' ,0,1; // координаты текстового курсора по Y
ПАР_ТЕКС : db 'ПАР_ТЕКС' ,0,'ТЕКСТ' ,0,1; // Текст окна для редактирования
ПАР_КССК : db 'ПАР_КССК' ,0,1 ; // Количество символов в строке с курсором
ПАР_КОСТ : db 'ПАР_КОСТ' ,0,'КОЛ_СТРОК' ,0,1; // Реальное количество строк в тексте окна
ПАР_ПАВС : db 'ПАР_ПАВС' ,0,1 ; // Предположительный адрес для вставки символа
ПАР_ДПСТ : db 'ПАР_ДПСТ' ,0,1 ; // Длина предыдущей строки до курсора
МОНИТОР : db 'МОНИТОР' ,0,1 ; // Окно монитора
КОД_ТЕК_НА : db 'НА' ,0,0 ; // Окно монитора
КОД_КОМ_СЛОЖЕНИЕ = 1;
КОД_КОМ_ВЫЧИТАНИЕ = 2;
КОД_КОМ_УМНОЖЕНИЕ = 3;
КОД_КОМ_ДЕЛЕНИЕ = 4;
КОД_КОМ_ПРИСВОЕНИЕ = 5;
КОД_КОМ_РАВНО = 6;
КОД_КОМ_НЕРАВНО = 7;
КОД_КОМ_БОЛЬШЕ = 8;
КОД_КОМ_МЕНЬШЕ = 9;
КОД_КОМ_МЕНРА = 10;
КОД_КОМ_БОЛРА = 11;
КОД_КОМ_ЛОГИ = 12;
КОД_КОМ_ЛОГИЛИ = 13;
КОД_КОМ_ОСКОБКА = 14; // Внимание скобки должны идти подряд
КОД_КОМ_ЗСКОБКА = 15; // Внимание скобки должны идти подряд
КОД_КОМ_НАЧАЛО = 16; // Внимание скобки должны идти подряд
КОД_КОМ_КОНЕЦ = 17; // Внимание скобки должны идти подряд
КОД_КОМ_ЕСЛИ = 18;
КОД_КОМ_ПОКА = 19;
КОД_КОМ_ВЫВОД = 20;
КОД_КОМ_ВЫВОДСТ = 21;
КОД_КОМ_ЦИКЛ = 22;
КОД_КОМ_ВВОД = 23;
КОД_КОМ_ВВОДСТ = 24;
КОД_КОМ_ПРАВДА = 25;
КОД_КОМ_ЛОЖ = 26;
КОД_ПАР_ЛЕВО = 27;
КОД_ПАР_ВЕРХ = 28;
КОД_ПАР_ШИРИ = 29;
КОД_ПАР_ВЫСО = 30;
КОД_ПАР_АТРИ = 31;
КОД_ПАР_АКУР = 32;
КОД_ПАР_ТСМX = 33;
КОД_ПАР_ТСМY = 34;
КОД_ПАР_ТКУX = 35;
КОД_ПАР_ТКУY = 36;
КОД_ПАР_ТЕКС = 37;
КОД_ПАР_КССК = 38;
КОД_ПАР_КОСТ = 39;
КОД_ПАР_ПАВС = 40;
КОД_ПАР_ДПСТ = 41;
КОД_ОКН_МОНИТОР = 42;
КОД_КОМ_НА = 43;
МАКС_РЕЗЕРВ_СЛОВО = 17;
;==============================================================================}
;{ СТРУКТУРА ЭЛЕМЕНТА .
ЭЛ_ТИП = 0 ;// ТИп элементы
ЭЛ_ФУН = 1 ;// Если это функция Участвует ли в поиске
ЭЛ_ИМЯ = 2 ;// Название элемента
ЭЛ_ЗНА = 4 ;// Адрес значения
ЭЛ_КОД = 6 ;// Код имени элемента
ЭЛ_РОД = 8 ;// Адрес родительского элемента
ЭЛ_ПРЕ = 10;// Адрес предыдущего элемента
ЭЛ_СЛЕ = 12;// Адрес Следующего элемента
ЭЛ_ВЛО = 14;// Адрес первого элемента вложеного списка
;==============================================================================}
;{ ТИПЫ ЭЛЕМЕНТОВ .
ТИП_ПУСТ = 0; // ТИП Корневой элемент
ТИП_ЧИСЛ = 1; // Число 2 байтовое
ТИП_СТРО = 2; // Адрес короткой строки заканчиваеющейся нулем
ТИП_ОКНО = 5;
КОМ_ЧИС_ЧИС = ТИП_ЧИСЛ*10+ТИП_ЧИСЛ;
КОМ_ЧИС_СТР = ТИП_ЧИСЛ*10+ТИП_СТРО;
КОМ_СТР_ЧИС = ТИП_СТРО*10+ТИП_ЧИСЛ;
КОМ_СТР_СТР = ТИП_СТРО*10+ТИП_СТРО;
КОМ_СТР_ЧИС_ЧИС = ТИП_СТРО*100+ТИП_ЧИСЛ*10+ТИП_ЧИСЛ;
КОМ_СТР_ЧИС_СТР = ТИП_СТРО*100+ТИП_ЧИСЛ*10+ТИП_СТРО;
КОМ_СТР_СТР_ЧИС = ТИП_СТРО*100+ТИП_СТРО*10+ТИП_ЧИСЛ;
КОМ_СТР_СТР_СТР = ТИП_СТРО*100+ТИП_СТРО*10+ТИП_СТРО;
;==============================================================================}
;{ Tim-Pascal-Lib БИБЛИОТЕКА .
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С СТРОКАМИ
ЗАПИСАТЬ_ЧИСЛО_AX_В_СТРОКУ_DX:;{
pushad;
mov si,dx;
mov byte [si],0;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI;
popad;
ret;
;==============================================================================}
ЗАПИСАТЬ_ЧИСЛО_DX_В_СТРОКУ_AX:;{
pushad;
mov si,ax;
mov byte [si],0;
mov ax,dx;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI;
popad;
ret;
;==============================================================================}
ЗАПИСАТЬ_ЧИСЛО_DX_В_СТРОКУ_CX:;{
pushad;
mov si,cx;
mov byte [si],0;
mov ax,dx;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI;
popad;
ret;
;==============================================================================}
ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_DI :;{
pushad
mov si,di;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI;
popad
ret;
;==============================================================================}
ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI :;{
pushad
MOV BX,10 ;// 10 система счисления
xor cx,cx ;
.ЦИКЛ1: ;------------
xor DX,DX ;
DIV BX ;
push dx ;// Сохраняем остаток от деления в стек
inc cx ;
test ax,ax ;
jnz .ЦИКЛ1 ;
;------------
.ЦИКЛ2: ;---------;
pop dx ;
add dl,'0' ;
mov al,dl;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_SI;
dec cx ;
test cx,cx ;
jnz .ЦИКЛ2 ;
;---------;
popad
ret;
;==============================================================================}
ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_CX :;{
pushad
mov si,cx;
mov ax,dx;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI;
popad
ret;
;==============================================================================}
ДОБАВИТЬ_ЧИСЛО_DX_В_КОНЕЦ_СТРОКИ_AX :;{
pushad
mov si,ax;
mov ax,dx;
call ДОБАВИТЬ_ЧИСЛО_AX_В_КОНЕЦ_СТРОКИ_SI;
popad
ret;
;==============================================================================}
ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_AX_СТРОКУ_DX:;{
pushad;
mov cx,ax;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_CX_СТРОКУ_DX;
popad;
ret;
;}
ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_CX_СТРОКУ_DX:;{
pushad
mov si,dx;
mov di,cx;
.ЦИКЛ:
mov al,[si];
test al,al
jz .КЦИКЛ;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI;
inc sI ;
jmp .ЦИКЛ ;
.КЦИКЛ:
popad;
ret;
;==============================================================================}
ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_DX_СТРОКУ_CX:;{
pushad;
mov bx,cx;
mov cx,dx;
mov dx,bx;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_CX_СТРОКУ_DX;
popad;
ret;
;}
ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_SI_СТРОКУ_AX:;{
pushad;
mov cx,SI;
mov dx,ax;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_CX_СТРОКУ_DX;
popad;
ret;
;}
ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_SI_СТРОКУ_CX:;{
pushad;
mov dx,CX;
mov cx,SI;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_CX_СТРОКУ_DX;
popad;
ret;
;}
ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_SI_СТРОКУ_DX:;{
pushad;
mov cx,SI;
call ДОБАВИТЬ_В_КОНЕЦ_СТРОКИ_CX_СТРОКУ_DX;
popad;
ret;
;}
ПЕРЕВОДИТ_СТРОКУ_AX_В_ЛОГИКУ_DX :;{
push cx ;
;------------------------------------;
call ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1 ;
jz .ДАЛЕЕ ;
call ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX ;
jmp .ВЫХОД ;
;------------------------------------;
.ДАЛЕЕ: mov cx,ax ;
call СЛО_В_КОДCX ;
cmp cx,КОД_КОМ_ПРАВДА ;
mov dx,0 ;
jnz .ВЫХОД ;
mov dx,1 ;
.ВЫХОД:
pop cx;
ret;
;==============================================================================}
СРАВНИТЬ_СТРОКИ_CX_DX_РЕЗУЛЬТАТ_DI :;{ 1 МЕНЬШЕ 0 РАВНЫ 2 БОЛЬШЕ
pushad;
mov si,cx;
mov di,dx;
xor cx,cx;
xor dx,dx;
.ЦИКЛ:
mov cl,[si];
mov dl,[di];
mov ax,cx;
add ax,dx;
test ax,ax;
jz .РАВНЫ;
test cx,cx;
jz .МЕНЬШЕ;
test dx,dx;
jz .БОЛЬШЕ;
cmp cx,dx; // НЕ смешно !
jb .МЕНЬШЕ ;
ja .БОЛЬШЕ ;
inc si;
inc di;
jmp .ЦИКЛ;
.КЦИКЛА:
.БОЛЬШЕ:
mov ax,2;
jmp .ВЫХОД;
.МЕНЬШЕ:
mov ax,1;
jmp .ВЫХОД;
.РАВНЫ:
mov ax,0;
jmp .ВЫХОД;
.ВЫХОД:
pop si;
push ax;
popad;
ret;
;==============================================================================}
СТРОКА_CX_БОЛЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1 :;{
pushad;
call СРАВНИТЬ_СТРОКИ_CX_DX_РЕЗУЛЬТАТ_DI;
cmp di,2 ;
jz .НЕ_БОЛЬШЕ;
mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
.НЕ_БОЛЬШЕ: mov al,0 ;
test al,al ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
СТРОКА_CX_МЕНЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1 :;{
pushad;
call СРАВНИТЬ_СТРОКИ_CX_DX_РЕЗУЛЬТАТ_DI;
cmp di,2 ;
jz .НЕ_МЕНЬШЕ;
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
.НЕ_МЕНЬШЕ: mov al,1 ;
test al,al ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
СТРОКА_CX_РАВНА_СТРОКИ_DX_ФЛАГ_Z_1 :;{
pushad;
call СРАВНИТЬ_СТРОКИ_CX_DX_РЕЗУЛЬТАТ_DI;
cmp di,0 ;
jz .НЕ_РАВНО ;
mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
.НЕ_РАВНО: mov al,0 ;
test al,al ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
СТРОКА_CX_БОЛЬШЕ_ЧИСЛА_DX_ФЛАГ_Z_1 :;{
pushad;
;--------------------------------------;
call ЕСЛИ_СТРОКА_CX_ЧИСЛО_ФЛАГ_Z_1 ;
jz .СТР_ЧИС ;
;--------------------------------------;
call ПЕРЕВОДИТ_СТРОКУ_CX_В_ЧИСЛО_CX ;
cmp cx,dx ;
ja .БОЛЬШЕ ;
jmp .НЕ_БОЛЬШЕ ;
;--------------------------------------;
.СТР_ЧИС:
;--------------------------------------;
mov ax,dx ;
call СОЗДАТЬ_СТРОКУ_DX_ДЛИНОЙ_16_БАЙТ ;
call ЗАПИСАТЬ_ЧИСЛО_AX_В_СТРОКУ_DX ;
call СРАВНИТЬ_СТРОКИ_CX_DX_РЕЗУЛЬТАТ_DI;
call УДАЛИТЬ_СТРОКУ_DX ;
;--------------------------------------;
cmp di,2 ;
jnz .НЕ_БОЛЬШЕ ;
.БОЛЬШЕ: mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
.НЕ_БОЛЬШЕ: mov al,0 ;
test al,al ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
СТРОКА_CX_МЕНЬШЕ_ЧИСЛА_DX_ФЛАГ_Z_1 :;{
pushad;
;--------------------------------------;
call ЕСЛИ_СТРОКА_CX_ЧИСЛО_ФЛАГ_Z_1 ;
jz .СТР_ЧИС ;
;--------------------------------------;
call ПЕРЕВОДИТ_СТРОКУ_CX_В_ЧИСЛО_CX ;
cmp cx,dx ;
jb .МЕНЬШЕ ;
jmp .НЕ_МЕНЬШЕ ;
;--------------------------------------;
.СТР_ЧИС:
;--------------------------------------;
mov ax,dx ;
call СОЗДАТЬ_СТРОКУ_DX_ДЛИНОЙ_16_БАЙТ ;
call ЗАПИСАТЬ_ЧИСЛО_AX_В_СТРОКУ_DX ;
call СРАВНИТЬ_СТРОКИ_CX_DX_РЕЗУЛЬТАТ_DI;
call УДАЛИТЬ_СТРОКУ_DX ;
;--------------------------------------;
cmp di,1 ;
jnz .НЕ_МЕНЬШЕ ;
.МЕНЬШЕ: mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
.НЕ_МЕНЬШЕ: mov al,0 ;
test al,al ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
СТРОКА_CX_РАВНА_ЧИСЛУ_DX_ФЛАГ_Z_1 :;{
pushad;
;--------------------------------------;
call ЕСЛИ_СТРОКА_CX_ЧИСЛО_ФЛАГ_Z_1 ;
jz .СТР_ЧИС ;
;--------------------------------------;
call ПЕРЕВОДИТ_СТРОКУ_CX_В_ЧИСЛО_CX ;
cmp cx,dx ;
jz .РАВНО ;
jmp .НЕ_РАВНО ;
;--------------------------------------;
.СТР_ЧИС:
;--------------------------------------;
mov ax,dx ;
call СОЗДАТЬ_СТРОКУ_DX_ДЛИНОЙ_16_БАЙТ ;
call ЗАПИСАТЬ_ЧИСЛО_AX_В_СТРОКУ_DX ;
call СРАВНИТЬ_СТРОКИ_CX_DX_РЕЗУЛЬТАТ_DI;
call УДАЛИТЬ_СТРОКУ_DX ;
;--------------------------------------;
cmp di,0 ;
jnz .НЕ_РАВНО ;
.РАВНО: mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
.НЕ_РАВНО: mov al,0 ;
test al,al ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ЧИСЛО_CX_БОЛЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1 :;{
pushad;
mov bx,cx;
moV cx,dx;
mov dx,bx;
call СТРОКА_CX_МЕНЬШЕ_ЧИСЛА_DX_ФЛАГ_Z_1;
mov ax,0;
jz .МЕНЬШЕ;
mov ax,1;
.МЕНЬШЕ:
test ax,ax;
popad;
ret;
;==============================================================================}
ЧИСЛО_CX_МЕНЬШЕ_СТРОКИ_DX_ФЛАГ_Z_1 :;{
pushad;
mov bx,cx;
mov cx,dx;
mov dx,bx;
call СТРОКА_CX_БОЛЬШЕ_ЧИСЛА_DX_ФЛАГ_Z_1;// СТРОКА DX>ЧИС CX
mov ax,0;
jz .БОЛЬШЕ;
mov ax,1;
.БОЛЬШЕ:
test ax,ax;
popad;
ret;
;==============================================================================}
ЧИСЛО_CX_РАВНО_СТРОКИ_DX_ФЛАГ_Z_1 :;{
pushad;
mov bx,cx;
mov cx,dx;
mov dx,bx;
call СТРОКА_CX_РАВНА_ЧИСЛУ_DX_ФЛАГ_Z_1;
mov ax,0;
jz .НЕ_РАВНО;
mov ax,1;
.НЕ_РАВНО:
test ax,ax;
popad;
ret;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_DI_В_ЧИСЛО_BX :;{
push ax;
push si;
mov si,di;
call ПЕРЕВОДИТ_СТРОКУ_SI_В_ЧИСЛО_AX;
mov bx,ax;
pop si;
pop ax;
ret;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_SI_В_ЧИСЛО_AX :;{
push dx;
push si;
xor dx,dx
.ЦИКЛ: xor ax,ax
lodsb
test al,al
jz .КЦИКЛ
sub ax,'0'
shl dx,1
add ax,dx
shl dx,2
add dx,ax
jmp .ЦИКЛ
.КЦИКЛ: mov ax,dx
pop si;
pop dx;
ret;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_DX :;{
push ax;
push si;
mov si,ax;
call ПЕРЕВОДИТ_СТРОКУ_SI_В_ЧИСЛО_AX;
mov dx,ax;
pop si;
pop ax;
ret;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_AX_В_ЧИСЛО_BX :;{
push ax;
push si;
mov si,ax;
call ПЕРЕВОДИТ_СТРОКУ_SI_В_ЧИСЛО_AX;
mov bx,ax;
pop si;
pop ax;
ret;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_CX_В_ЧИСЛО_CX :;{
push ax;
push si;
mov si,cx;
call ПЕРЕВОДИТ_СТРОКУ_SI_В_ЧИСЛО_AX;
mov cx,ax;
pop si;
pop ax;
ret;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_DX_В_ЧИСЛО_DX :;{
push ax;
push si;
mov si,dx;
call ПЕРЕВОДИТ_СТРОКУ_SI_В_ЧИСЛО_AX;
mov dx,ax;
pop si;
pop ax;
ret;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_DI_В_БОЛЬШИЕ_БУКВЫ :;{
pushad;
.ЦИКЛ: mov al,[di];
test al,al ;// Если конец строки то выход
JZ .КЦИКЛ ;
call ПРЕОБРАЗУЕТ_МАЛ_БУК_AL_В_БОЛ;
mov [di],al;
inc DI ;// Увеличиывкем указатель на читаемый символ
Jmp .ЦИКЛ ;
.КЦИКЛ:
popad ;
ret ;
;==============================================================================}
ПЕРЕВОДИТ_СТРОКУ_SI_В_БОЛЬШИЕ_БУКВЫ :;{
push di;
mov di,SI
call ПЕРЕВОДИТ_СТРОКУ_DI_В_БОЛЬШИЕ_БУКВЫ;
pop di;
ret;
;==============================================================================}
ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI :;{
push di ;
Call ВОЗВРАЩАЕТ_АДРЕС_DI_0БАЙТА_СТРОКИ_DI;// Перемещаемся в конец строки
mov [DI],AL ;// Записываем символ вместо 0 конца строки
inc DI ;// Увеличиваем указатель на читаемый символ
mov byte [DI],0 ;// Дописываем ноль в конец строки
pop di ;
ret ;
;==============================================================================}
ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_SI :;{
push Si ;
Call ВЕРНУТЬ_КОНЕЦ_СТРОКИ_SI_В_SI;// Перемещаемся в конец строки
mov [SI],AL ;// Записываем символ вместо 0 конца строки
inc SI ;// Увеличиваем указатель на читаемый символ
mov byte [SI],0 ;// Дописываем ноль в конец строки
pop Si ;
ret ;
;==============================================================================}
СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_1024_БАЙТ :;{
mov di,1024;
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI;
ret;
;==============================================================================}
СОЗДАТЬ_СТРОКУ_SI_ДЛИНОЙ_1024_БАЙТ :;{
push di;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_16_БАЙТ;
mov si,di;
pop di;
ret;
;==============================================================================}
СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_AX_БАЙТ :;{
mov di,ax;
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI;
ret;
;==============================================================================}
СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_16_БАЙТ :;{
mov di,16;
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI;
ret;
;==============================================================================}
СОЗДАТЬ_СТРОКУ_DX_ДЛИНОЙ_16_БАЙТ :;{
push di;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_16_БАЙТ;
mov DX,di;
pop di;
ret;
;==============================================================================}
УДАЛИТЬ_СТРОКУ_DI :;{
call ОСВОБОЖДЕНИЕ_УЧАСТКА_ПАМЯТИ_DI;
ret;
;==============================================================================}
УДАЛИТЬ_СТРОКУ_AX :;{
pushad;
mov di,ax;
call УДАЛИТЬ_СТРОКУ_DI;
popad;
ret;
;==============================================================================}
УДАЛИТЬ_СТРОКУ_DX :;{
pushad;
mov di,Dx;
call УДАЛИТЬ_СТРОКУ_DI;
popad;
ret;
;==============================================================================}
ЗАПИСАТЬ_СТРОКУ_CX_В_СТРОКУ_DX :;{
pushad;
mov di,Cx;
mov si,Dx;
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI;
popad;
ret;
;==============================================================================}
ЗАПИСАТЬ_СТРОКУ_CX_В_СТРОКУ_AX :;{
pushad;
mov di,Cx;
mov si,ax;
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI;
popad;
ret;
;==============================================================================}
ЗАПИСАТЬ_СТРОКУ_DX_В_СТРОКУ_CX :;{
pushad;
mov di,dx;
mov si,cx;
call ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI;
popad;
ret;
;==============================================================================}
ЗАПИСАТЬ_СТРОКУ_DI_В_СТРОКУ_SI :;{
pushad;
;-----------------
mov CX,DI ;// Запоминаем адрес строки DI в CX
CALL ВОЗАРАЩАЕТ_В_DI_ДЛИНУ_СТРОКИ_DI;// ПОлучаем длину строки DI
mov AX,DI ;// Записываем длину строки DI В AX
mov DI,CX ;// Востаналвиаем адерс строки DI
;-----------------
.ЦИКЛ:
test ax,ax ;// Проверяем длину строки
JZ .КЦИКЛ ;// Если счетчик равн нулю выход;
mov CL,[DI] ;// Читаем символ из строки DI
mov [SI],CL ;// Записываем символ в строку SI
inc DI ;// Увеличиваем указатель строки DI
INC SI ;// Увеличиваем указатель строки SI
DEC AX ;// Уменьшаем счетчик количества скопированых букв
JMP .ЦИКЛ ;
.КЦИКЛ:
mov Byte [SI],0 ;
popad ;
ret ;
;==============================================================================}
ЕСЛИ_СТРОКА_AX_ЧИСЛО_ФЛАГ_Z_1 :;{
push si;
mov si,ax;
call ЕСЛИ_СТРОКА_SI_ЧИСЛО_ФЛАГ_Z_1;
pop si;
ret ;
;==============================================================================}
ЕСЛИ_СТРОКА_CX_ЧИСЛО_ФЛАГ_Z_1 :;{
push si;
mov si,Cx;
call ЕСЛИ_СТРОКА_SI_ЧИСЛО_ФЛАГ_Z_1;
pop si;
ret ;
;==============================================================================}
ЕСЛИ_СТРОКА_DX_ЧИСЛО_ФЛАГ_Z_1 :;{
push si;
mov si,Dx;
call ЕСЛИ_СТРОКА_SI_ЧИСЛО_ФЛАГ_Z_1;
pop si;
ret ;
;==============================================================================}
ЕСЛИ_СТРОКА_SI_ЧИСЛО_ФЛАГ_Z_1 :;{
pushad;
.ЦИКЛ:
mov al,[si];
test al,al ;
jz .ЧИСЛО;
call ЕСЛИ_В_AL_ЦИФРА_ФЛАГ_Z_1
jz .НЕ_ЧИСЛО;
inc si;
jmp .ЦИКЛ;
.НЕ_ЧИСЛО:
mov al,0;
test al,al;
jmp .ВЫХОД;
.ЧИСЛО:
mov al,1;
test al,al;
.ВЫХОД:
popad;
ret;
;==============================================================================}
УДАЛИТЬ_БУКВУ_В_НАЧАЛЕ_СТРОКИ :;{
pushad ;
mov si,di ;
inc di ;
mov al,[si] ;
jz .КЦИКЛ ;
.ЦИКЛ: mov al,[di] ;
mov [SI],Al ;
test al,al ;
jz .КЦИКЛ ;
inc di ;
inc si ;
jmp .ЦИКЛ ;
.КЦИКЛ:
popad ;
ret ;
;}
УДАЛИТЬ_БУКВУ_В_КОНЦЕ_СТРОКИ :;{
push di ;
Call ВОЗВРАЩАЕТ_АДРЕС_DI_0БАЙТА_СТРОКИ_DI;// Перемещаемся в конец строки
dec DI ;// перемещаемся на 1 символ назад
mov byte [DI],0 ;// Записываем символ 0 вместо последней буквы в строке
pop di ;
ret ;
;==============================================================================}
ВЕРНУТЬ_КОНЕЦ_СТРОКИ_SI_В_SI :;{
push cx;
.ЦИКЛ: mov cl,[si];
test cl,cl ;// Если конец строки то выход
JZ .КЦИКЛ ;
inc sI ;// Увеличиывкем указатель на читаемый символ
Jmp .ЦИКЛ ;
.КЦИКЛ:
pop cx;
ret ;
;==============================================================================}
СРАВНИТЬ_СТРОКИ_SI_DI :;{
pushad;
.ЦИКЛ: mov al,[di] ;
mov ah,[si] ;
cmp al,ah ;
jnz .НЕРАВНО ;
TEST al,al ;
JZ .РАВНО ;
INC SI ;
INC DI ;
JMP .ЦИКЛ ;
.РАВНО:
mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
.НЕРАВНО:
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
.ВЫХОД:
popad ;
ret ;
;{ ОПИСАНИЕ
;}
;==============================================================================}
ВСТАВКА_СИМВОЛА_AL_ПО_АДРЕСУ_SI_ДО_0:;{
pushad ; Вставляет символ в строку позиция
mov cl,[si] ;
mov [si],al ;
.ЦИКЛ: inc si ;
mov al,[si] ;
mov [si],cl ;
mov cl,al ;
test cl,cl ;
jz .КЦИКЛА ;
jmp .ЦИКЛ ;
.КЦИКЛА: inc si ;
mov byte[si],0 ;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
УДАЛЕНИЕ_ИЗ_АДРЕСА_SI_СИМВОЛА_ДО_0 :;{
pushad ; Удаляет символ из строки указатель на удаляемый символ SI
mov al,[si] ;
test al,al ;
JZ .КЦИКЛ ;
dec si ;
mov di,si ;
inc si ;
.ЦИКЛ: mov al,[si] ;
mov [di],al ;
inc si ;
inc di ;
test al,al ;
jnz .ЦИКЛ ;
.КЦИКЛ:
popad ;
ret ;
;==============================================================================}
НАЙТИ_КОНЕЦ_СТРОКИ_С_АДРЕСА_SI :;{
push cx;
.ЦИКЛ: mov cl,[si];
test cl,cl ;// Если конец строки то выход
JZ .КЦИКЛ ;
inc sI ;// Увеличиывкем указатель на читаемый символ
Jmp .ЦИКЛ ;
.КЦИКЛ:
pop cx;
ret ;
;==============================================================================}
ПОИСК_БУКВЫ_AL_В_СТРОКЕ_SI :;{
pushad;
.ЦИКЛ: mov ah,[si];
test ah,ah ;
jz .КЦИКЛ ;
cmp al,ah ;
jz .ЕСТЬ ;
inc SI ;
jmp .ЦИКЛ ;
.КЦИКЛ:
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
.ЕСТЬ:
mov al,1 ;
test al,al ;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ПОИСК_ДВОЙНОЙ_БУКВЫ_AX_В_СТРОКЕ_SI :;{
pushad;
.ЦИКЛ: mov cx,[si];
test cx,cx ;
jz .КЦИКЛ ;
test ch,ch ;
jz .КЦИКЛ ;
cmp ax,cx ;
jz .ЕСТЬ ;
inc SI ;
inc SI ;
jmp .ЦИКЛ ;
.КЦИКЛ:
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
.ЕСТЬ:
mov al,1 ;
test al,al ;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ПОИСК_ДВОЙНОЙ_ЦИФРЫ_AX_В_СТРОКЕ_SI :;{
pushad;
.ЦИКЛ: mov cx,[si];
test cx,cx ;
jz .КЦИКЛ ;
cmp ax,cx ;
jz .ЕСТЬ ;
inc SI ;
inc SI ;
jmp .ЦИКЛ ;
.КЦИКЛ:
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
.ЕСТЬ:
mov al,1 ;
test al,al ;
.ВЫХОД:
popad ;
ret ;
;==============================================================================}
ВОЗАРАЩАЕТ_В_DI_ДЛИНУ_СТРОКИ_DI :;{
push ax;
mov ax,DI;
Call ВОЗВРАЩАЕТ_АДРЕС_DI_0БАЙТА_СТРОКИ_DI;// Перемещаемся в конец строки
sub DI,ax;
pop ax ;
ret ;
;==============================================================================}
ВОЗВРАЩАЕТ_АДРЕС_DI_0БАЙТА_СТРОКИ_DI:;{
push cx;
.ЦИКЛ: mov cl,[di];
test cl,cl ;// Если конец строки то выход
JZ .КЦИКЛ ;
inc DI ;// Увеличиывкем указатель на читаемый символ
Jmp .ЦИКЛ ;
.КЦИКЛ:
pop cx;
ret ;
;==============================================================================}
ЧИТАЕТ_СЛОВО_С_АДР_SI_ВОЗ_СЛОВО_DI :;{
pushad;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_16_БАЙТ; // Создаем строку с ответом DI
mov cx,si ; // Запоминаем то место с котрого начали читать слово
.ЦИКЛ:
mov al,[si];
;---------------------;
call ЕСЛИ_В_AL_НЕ_БУКВА_ФЛАГ_Z_0 ; // Проыерка являеться ли символ буквой
jz .КЦИКЛ ;
;---------------------;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI; // Добавляем буку AL в конец строки DI
inc SI ; // Увеличиваем читемый символ
;---------------------;
jmp .ЦИКЛ ;
;---------------------;
.КЦИКЛ:
cmp si,cx ;
jnz .ВЫХОД ;
call УДАЛИТЬ_СТРОКУ_DI;
mov di,0 ;
.ВЫХОД:
test di,di ;
pop si ;
push di ;
popad ;
ret ;
;==============================================================================}
ЧИТАЕТ_ЧИСЛО_С_АДР_SI_ВОЗ_СЛОВО_DI :;{
pushad;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_16_БАЙТ; // Создаем строку с ответом DI
mov cx,si ; // Запоминаем то место с котрого начали читать слово
.ЦИКЛ:
mov al,[si];
;---------------------;
call ЕСЛИ_В_AL_ЦИФРА_ФЛАГ_Z_1 ; // Проыерка являеться ли символ буквой
jz .КЦИКЛ ;
;-------------------;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI; // Добавляем буку AL в конец строки DI
inc SI ; // Увеличиваем читемый символ
;-------------------;
jmp .ЦИКЛ ;
;-------------------;
.КЦИКЛ:
cmp si,cx ;
jnz .ВЫХОД ;
call УДАЛИТЬ_СТРОКУ_DI;
mov di,0 ;
.ВЫХОД:
test di,di ;
pop si ;
push di ;
popad ;
ret ;
;==============================================================================}
ЧИТАЕТ_ЗНАК_С_АДР_SI_ВОЗ_СЛОВО_DI :;{
pushad;
call СОЗДАТЬ_СТРОКУ_DI_ДЛИНОЙ_16_БАЙТ; // Создаем строку с ответом DI
mov cx,si ; // Запоминаем то место с котрого начали читать слово
mov ax,[si] ;
mov si,.Т_ЗНАК2 ;
call ПОИСК_ДВОЙНОЙ_БУКВЫ_AX_В_СТРОКЕ_SI
jnz .ЗНАК2 ;
mov si,.Т_ЗНАК1 ;
call ПОИСК_БУКВЫ_AL_В_СТРОКЕ_SI;
jnz .ЗНАК1 ;
call УДАЛИТЬ_СТРОКУ_DI; // Чтение не удалося
mov di,0 ;
jnz .ВЫХОД ;
;---------------------;
.ЗНАК1: ;---------------------;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI; // Чтение Удалося
jmp .ВЫХОД ;
.ЗНАК2: ;---------------------;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI; // Чтение Удалося
mov al,ah ;
call ДОБАВИТЬ_БУКВУ_AL_В_КОНЕЦ_СТРОКИ_DI; // Чтение Удалося
;---------------------;
.ВЫХОД:
test di,di ;
pop si ;
push di ;
popad ;
ret ;
.Т_ЗНАК1: DB '+-*/{}()=<>',0;
.Т_ЗНАК2: DB ':===<=>=<>!=<<>>>&&||',0,0;
;==============================================================================}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С БУКВАМИ
ЕСЛИ_В_AL_НЕ_БУКВА_ФЛАГ_Z_0 :;{ БУКВЫ это a-z A-Z а-я А-Я
pushad ;
.МАЛ_АНГ_БУК:
;------------------;
cmp al,'z' ; // Кнопка МАленькие буквы
ja .БОЛ_АНГ_БУК ;
cmp al,'a' ; // Кнопка МАленькие буквы
jb .БОЛ_АНГ_БУК ;
jmp .ЭТО_БУК ;
;------------------;
.БОЛ_АНГ_БУК:
;------------------;
cmp al,'Z' ; // Кнопка МАленькие буквы
ja .БОЛ_РУС_БУК ;
cmp al,'A' ; // Кнопка МАленькие буквы
jb .БОЛ_РУС_БУК ;
jmp .ЭТО_БУК ;
;------------------;
.БОЛ_РУС_БУК:
;------------------;
cmp al,'Я' ; // Кнопка МАленькие буквы
ja .МАЛ_РУС_БУК1 ;
cmp al,'А' ; // Кнопка МАленькие буквы
jb .МАЛ_РУС_БУК1 ;
jmp .ЭТО_БУК ;
;------------------;
.МАЛ_РУС_БУК1:
;------------------;
cmp al,'п' ; // Кнопка МАленькие буквы
ja .МАЛ_РУС_БУК2 ;
cmp al,'а' ; // Кнопка МАленькие буквы
jb .МАЛ_РУС_БУК2 ;
jmp .ЭТО_БУК ;
;------------------;
.МАЛ_РУС_БУК2:
;------------------;
cmp al,'я' ; // Кнопка МАленькие буквы
ja .ЁЁЁЁЁ ;
cmp al,'р' ; // Кнопка МАленькие буквы
jb .ЁЁЁЁЁ ;
jmp .ЭТО_БУК ;
;------------------;
.ЁЁЁЁЁ:
;------------------;
cmp al,'ё' ; // Кнопка МАленькие буквы
jNZ .ДАЛЕЕ ;
cmp al,'Ё' ; // Кнопка МАленькие буквы
jNz .ДАЛЕЕ ;
jmp .ЭТО_БУК ;
;------------------;
.ДАЛЕЕ:
jmp .ЭТО_НЕ_БУКВА ;
;------------------;
.ЭТО_БУК:
;----------------;
mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
;-----------------
.ЭТО_НЕ_БУКВА:
;----------------;
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
;-----------------
.ВЫХОД:
popad;
ret;
;==============================================================================}
ЕСЛИ_В_AL_НЕ_СИМВОЛ_ФЛАГ_Z_0:;{ ПРоверяет являеться ли символ AL Буквой или (){}если это буква устанавливает флаг Z
pushad ;
mov si,.ДОПЗНАК;
call ПОИСК_БУКВЫ_AL_В_СТРОКЕ_SI;
jnz .ЭТО_БУК ;
.КМБУК:
;------------------;
cmp al,'z' ; // Кнопка МАленькие буквы
ja .КББУК ;
cmp al,'a' ; // Кнопка МАленькие буквы
jb .КББУК ;
jmp .ЭТО_БУК ;
;------------------;
.КББУК:
;------------------;
cmp al,'Z' ; // Кнопка МАленькие буквы
ja .ДАЛЕЕ ;
cmp al,'A' ; // Кнопка МАленькие буквы
jb .ДАЛЕЕ ;
jmp .ЭТО_БУК ;
;------------------;
.ДАЛЕЕ:
jmp .ЭТО_НЕ_БУКВА ;
;------------------;
.ЭТО_БУК:
;----------------;
mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
;-----------------
.ЭТО_НЕ_БУКВА:
;----------------;
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
;-----------------
.ВЫХОД:
popad;
ret;
.ДОПЗНАК: DB ' <>?,./[]{};:`~()+-_""0123456789',39,0;
;==============================================================================}
ЕСЛИ_В_AL_ЦИФРА_ФЛАГ_Z_1 :;{ ПРоверяет являеться ли символ AL Буквой если это буква устанавливает флаг Z
pushad;
;----------------;
cmp al,'9' ; // Если Больше '9' Это не фифра
ja .ЭТО_НЕ_ЦИФ ;
cmp al,'0' ; // Если меньше '0' Это не фифра
jb .ЭТО_НЕ_ЦИФ ;
mov al,1 ;
test al,al ;
jmp .ВЫХОД ;
;-----------------
.ЭТО_НЕ_ЦИФ:
;----------------;
mov al,0 ;
test al,al ;
jmp .ВЫХОД ;
;-----------------
.ВЫХОД:
popad;
ret;
;==============================================================================}
ПРЕОБРАЗУЕТ_АНГ_БУК_AL_В_РУС:;{ Преобразет Анл букву в руску
push si;
push cx;
mov cx,ax;
mov ch,cl;
mov ah,0;
cmp al,32
jb .ВЫХОД;
cmp al,127
ja .ВЫХОД;
sub al,32
mov si,ax;
mov si,ax ;
add si,.ТАБ02;
mov cl,[si] ;
cmp cl,' ' ;
jz .ВЫХОД2 ;
mov al,cl ;
jmp .ВЫХОД ;
.ВЫХОД2: mov al,ch ;
.ВЫХОД:
mov ah,ch;
pop cx;
pop si;
ret;
.ТАБ02:DB ' Э э б ю ЖжБ Ю ';
.ТАБ03:DB ' ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯx ъ ';
.ТАБ04:DB 'ёфисвуапршолдьтщзйкыегмцчняX ЪЁ ';
;==============================================================================}
ПРЕОБРАЗУЕТ_МАЛ_БУК_AL_В_БОЛ:;{ Преобразет все буквы в большие
push si;
cmp al,97 ;
jb .ДАЛЕЕ;
cmp al,122;
ja .ДАЛЕЕ;
sub al,32;
jmp .ВЫХОД;
.ДАЛЕЕ:
cmp al,160 ;
jb .ДАЛЕЕ2;
cmp al,175;
ja .ДАЛЕЕ2;
sub al,32;
jmp .ВЫХОД;
.ДАЛЕЕ2:
cmp al,224 ;
jb .ДАЛЕЕ3;
cmp al,239;
ja .ДАЛЕЕ3;
sub al,80;
jmp .ВЫХОД;
.ДАЛЕЕ3: cmp al,241;
jnz .ДАЛЕЕ4;
dec al;
.ДАЛЕЕ4:
.ВЫХОД:
pop si;
ret;
;==============================================================================}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С ЭКРАНОМ
ЧИСЛОAX:;{ Вывод содержимого регистра AX как число на экран
pushad;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
call ЭКРАН_ВЫВОД_ЧИСЛА;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
popad;
ret;
;=====================}
ЧИСЛОBX:;{ Вывод содержимого регистра BX как число на экран
push ax;
mov ax,bx;
call ЧИСЛОAX;
pop ax;
ret;
;=====================}
ЧИСЛОCX:;{ Вывод содержимого регистра CX как число на экран
push ax;
mov ax,cx;
call ЧИСЛОAX;
pop ax;
ret;
;=====================}
ЧИСЛОDX:;{ Вывод содержимого регистра DX как число на экран
push ax;
mov ax,dx;
call ЧИСЛОAX;
pop ax;
ret;
;=====================}
ЧИСЛОDI:;{ Вывод содержимого регистра DI как число на экран
push ax;
mov ax,di;
call ЧИСЛОAX;
pop ax;
ret;
;=====================}
ЧИСЛОSI:;{ Вывод содержимого регистра SI как число на экран
push ax;
mov ax,Si;
call ЧИСЛОAX;
pop ax;
ret;
;=====================}
СТРОКАAX:;{ Вывод строки адрес котрой в AX на экран
push di;
mov di,ax;
call СТРОКАDI;
pop di;
ret;
;=====================}
СТРОКАBX:;{ Вывод строки адрес котрой в BX на экран
push di;
mov di,bx;
call СТРОКАDI;
pop di;
ret;
;=====================}
СТРОКАCX:;{ Вывод строки адрес котрой в CX на экран
push di;
mov di,cx;
call СТРОКАDI;
pop di;
ret;
;=====================}
СТРОКАDX:;{ Вывод строки адрес котрой в DX на экран
push di;
mov di,dx;
call СТРОКАDI;
pop di;
ret;
;=====================}
СТРОКАDI:;{ Вывод строки адрес котрой в SI на экран
pushad;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
call ЭКРАН_ВЫВОД_СТРОКИ;
call ЭКРАН_ВЫВОД_ПРОБЕЛА;
popad;
ret;
;=====================}
СТРОКАSI:;{ Вывод строки адрес котрой в DI на экран
push di;
mov di,si;
call СТРОКАDI;
pop di;
ret;
;=====================}
ВЫВОД_СЛОВА_РАВНО :;{ Функция печати слова РАВНО
pushad
mov di,.ТЕКС_РАВНО;
call ЭКРАН_ВЫВОД_СТРОКИ;
popad
ret;
.ТЕКС_РАВНО: db 'РАВНО',0,0;
;==============================================================================}
ВЫВОД_СЛОВА_НЕРАВНО :;{ Функция печати слова НЕРАВНО
pushad
mov di,.ТЕКС_НЕРАВНО;
call ЭКРАН_ВЫВОД_СТРОКИ;
popad
ret;
.ТЕКС_НЕРАВНО: db 'НЕРАВНО',0,0;
;==============================================================================}
ЭКРАН_ВЫВОД_СТРОКИ_AX :;{
pushad;
mov di,ax;
call ЭКРАН_ВЫВОД_СТРОКИ;
popad;
ret;
;==============================================================================}
ЭКРАН_ВЫВОД_ПРОВЕРКА :;{ Функция печати слова ПРОВЕРКА
pushad
mov di,.ТЕКС_ПРОВЕРКА;
call ЭКРАН_ВЫВОД_СТРОКИ;
popad
ret;
.ТЕКС_ПРОВЕРКА: db 'ПРОВЕРКА',0,0;
;==============================================================================}
ЭКРАН_ВЫВОД_ПРОБЕЛА :;{ Функция печати пробела
pushad
mov di,.ТЕКС_ПРОБЕЛ ;
call ЭКРАН_ВЫВОД_СТРОКИ;
popad
ret;
.ТЕКС_ПРОБЕЛ: db ' ',0,0;
;==============================================================================}
ЭКРАН_ВЫВОД_ПЕРСТРО :;{ Функция печати перевода строки
pushad
mov di,.ТЕКС_ПЕРЕВОД_СТРОКИ;
call ЭКРАН_ВЫВОД_СТРОКИ ;
popad
ret;
.ТЕКС_ПЕРЕВОД_СТРОКИ: db 13,10,0,0;
;==============================================================================}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С МЫШКОЙ
МЫШКА_ВКЛЮЧИТЬ :;{ Инициализация мышки установка атрибутов мышки AX в
pushad;
mov ax,0;
int 33h ;
mov ax,10010000b;
mov [МЫШ_ЦВЕТА],ax;
popad;
ret;
;==============================================================================}
МЫШКА_ЧИТАТЬ :;{ Читает коррдинату мышки и номер нажатой кнопки все нижеследующие переменные
pushad;
Mov cx,[МЫШ_КООX2];
Mov dx,[МЫШ_КООY2];
Mov bx,[МЫШ_КНОП2];
Mov [МЫШ_КООX1],CX;
Mov [МЫШ_КООY1],DX;
Mov [МЫШ_КНОП1],BX;
mov ax,[МЫШ_ВЫДЕ2];
mov [МЫШ_ВЫДЕ1],ax;
mov ax,3;// Чтения состояния мышки
int 33h ;
SHR cx,3;
SHR dx,3;
Mov [МЫШ_КООX2],CX;
Mov [МЫШ_КООY2],DX;
Mov [МЫШ_КНОП2],BX;
popad;
ret;
;==============================================================================}
МЫШКА_СОСТОЯНИЕ:;{ ПРоверяет на сосотвествее нажатия кнопок предыдущий состояние должно быть cl в след состояние ch
pushad;
;----------------------
mov al,[МЫШ_КНОП1] ;// ПРедыдущие состояние кнопки не нажата
cmp al,cl ;
JNZ .НЕПОДХОДИТ ;
;----------------------
mov al,[МЫШ_КНОП2] ;// новое состояние кнопки нажата
cmp al,ch ;
JNZ .НЕПОДХОДИТ ;
;----------------------
mov al,1 ;
test al,al ;
JMP .ВЫХОД ;
.НЕПОДХОДИТ:
mov al,0 ;
test al,al ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
МЫШКА_ЩЕЛЧЕК :;{ ПРоверяет была ли щас нажата мышка
pushad;
mov cl,0 ;// ПРедыдущие состояне не нажата никакая кнопка
mov ch,1 ;// Новое состояние нажата левая кнопка мышки
call МЫШКА_СОСТОЯНИЕ;// Проверка на соотвествие указаным выше условиям
popad;
ret;
;==============================================================================}
МЫШКА_НАЖАТА :;{ ПРоверяет нажата ли щас нажата мышка
pushad;
mov cl,1 ;// ПРедыдущие состояние нажата левая кнопка мышки
mov ch,1 ;// Новое состояние нажата левая кнопка мышки
call МЫШКА_СОСТОЯНИЕ;// Проверка на соотвествие указаным выше условиям
popad;
ret;
;==============================================================================}
МЫШ_КООX1: DW 0 ;// предыдущая Координаты мышки для X
МЫШ_КООY1: DW 0 ;// предыдущая Координаты мышки для Y
МЫШ_КНОП1: DW 0 ;// предыдущая Нажатая кнопка на мышке
МЫШ_КООX2: DW 0 ;// Координаты мышки для X
МЫШ_КООY2: DW 0 ;// Координаты мышки для Y
МЫШ_КНОП2: DW 0 ;// Нажатая кнопка на мышке
МЫШ_ЦВЕТА: DW 0 ;// Атрибуты мышки 10010000b
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С КЛВИАТУРОЙ
КЛАВИАТУРА_ЧИТАТЬ :;{ Читаем код нажатой кнопки В [НАЖ_КНОПК]
pushad;
mov ah,01h;// ПРоверяет готовность символа
int 16h ;
jz .ВЫХОД ;
mov ah,00h;// Если кнопка готова читаем код
int 16h ;
mov [НАЖ_КНОПК],AX;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ОЖИДАНИЕ_НАЖАТИЯ_ЛЮБОЙ_КНОПКИ:;{ Ожидание нажатия любой кнопки паузка
pushad;
mov ah,8h;
int 21h;
popad;
ret;
;==============================================================================}
НАЖ_КНОПК: DW 0 ;// Последняя нажатая кнопка
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ С ПАМЯТЬЮ
БИОС_ВКЛЮЧИТЬ_ПАМЯТЬ:;{ Инициализация памяти
pushad;
MOV AX,КОНЕЦ_ПРОГРАММЫ;
MOV [НАЧ_КУЧИ],AX ;// Установка адреса начала кучи
mov AX,65000 ;
MOV [КОН_КУЧИ],AX ;// Установка Окончания Кучи
MOV SI,[НАЧ_КУЧИ] ;
MOV DI,[КОН_КУЧИ] ;
call ОЧИСТКА_ПАМЯТИ_С_SI_ДО_DI;// Производим очистку памяти
popad;
ret;
;==============================================================================}
ОЧИСТКА_ПАМЯТИ_С_SI_ДО_DI :;{ Очистка памяти с адреса SI до адреса DI Уже не входит в очистку
pushad ;// Сохранение содержимого всех регистров
.ЦИКЛ:;-----------------
CMP SI,DI ;// Чтение адрсеа окончания кучи
JAE .КЦИК ;// Если SI>DI то выход
mov Byte [SI],0 ;// Запись нуля по адресу SI
INC SI ;// Увеличиываем SI
JMP .ЦИКЛ ;// Повторить
.КЦИК:;-----------------
popad ;// Вотсановление всех регистров
ret ;// Выход из подпрограммы
;==============================================================================}
ОСВОБОЖДЕНИЕ_УЧАСТКА_ПАМЯТИ_DI :;{ Освобождение участка памяти DI Адрес полученый ранее например с помощбю функции ПАМЯТЬ_ВЫДЕЛИТЬ
pushad;
SUB DI,3 ;// Переходим к байту занятости
MOV Byte [DI],0 ;// И обнуляем его
inc di;
mov cx,[di] ; // Читаем размер участка
add di,2 ; // Переходим к первому байту участка памяти
mov si,di ; //устанавливаем начало стираемого участка памяти
add di,CX ; // устанавливаем конец стираемого участка памяти
call ОЧИСТКА_ПАМЯТИ_С_SI_ДО_DI;
popad;
RET;
;==============================================================================}
ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI:;{ Выделяет участок памяти размером DI Возвращает адрес выделеного участка в DI
PUSHAD;
MOV SI,[НАЧ_КУЧИ]; Читаем адрес начала кучи
.ЦИКЛ: ;//---------------
MOV AL,[SI] ; Читаем флаг занятости
INC SI ; Увеличиваем указатель
MOV CX,[SI] ; Читаем размер участка памяти
TEST AL,AL ; Проверка флага занятости
JNZ .СЛЕ_УЧА ; Если не равно нулю переходим к следующему участку
TEST CX,CX ;
JZ .СВОБ ; Участок подходит если это последний участок в куче с нулевым размерм
CMP CX,DI ; Сравниваем размер участка CX и размер запрашиваемого участка DI
JZ .СВОБ ; Участок подходит если размер участка соотвествующий
.СЛЕ_УЧА:
ADD CX,2 ; Переход к след участку размер этого участка + 2 байта попадаем на байт занятости следующего участка
ADD SI,CX ;
JMP .ЦИКЛ ;
.СВОБ: ;//---------------
DEC SI ;
MOV byte [SI],1 ; // Устанавливаем флаг занятости
INC SI ; // Переходим к указанию размера учатка
MOV [SI],DI ; // Записываем размер участка
ADD SI,2 ; // прибавляем 2 получаем адрес Выделеного участка
MOV DI,SI ; // Возвращаем адрес выделеного участка в регистсре DI
;//---------------
pushad;
cmp di,[МАК_КУЧИ]
jb .ДАЛЕЕ;
mov [МАК_КУЧИ],DI;
.ДАЛЕЕ:
popad;
POP SI ;
PUSH DI ; // DI на вершие стека всегда
POPAD ;
RET ;
;==============================================================================}
НАЧ_КУЧИ : DW 0 ;// Адрес начала кучи
КОН_КУЧИ : DW 0 ;// Адрес Окончания Кучи
МАК_КУЧИ : DW 0 ;// Максимальный адрес в куче
;---}
;---{ ФУНКЦИB ДЛЯ РАБОТЫ С ПАУЗАМИ
БИОС_ПАУЗА :;{ Пауза в микросекундах
pushad;
MOV CX,0000h;// Старшие разряды количества микросек
MOV DX,3333h;// Младшие разряды количесвтва микросекунд
MOV AH,86H ;// Номер Функции DELAY паузы в DOS
INT 15h ;// Прервыание для функции
popad;
ret;
;==============================================================================}
;---}
;---{ ФУНКЦИИ ДЛЯ РАБОТЫ НА НИЗКОМ УРОВНЕ
ЭКРАН_КУРСОР_10_10 :;{
pushad;
mov dx,10;
mov cx,10;
call ЭКРАН_КУРСОР_XY
popad;
ret
;}
ЭКРАН_ПОДГОТОВИТЬ :;{ ПОдготовка видео буфера и экрана
pushad;
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;---------------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;---------------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;---------------------------;
call ЭКРАН_80_25_ПОДГОТОВИТЬ;// ПОдготовка ВИДЕОРЕЖИМА 80 на 25 тектовый;
jmp .ВЫХОД ;
;---------------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;---------------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;---------------------------;
.ВЫХОД: popad ;
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; ПРоцедура очистки экрана в заыисимости от установлденого
; видеорежима
;
;
;}
;}
ЭКРАН_ОЧИСТКА :;{ Очистка экрана
pushad;
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;-----------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;-----------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;-----------------------;
call ЭКРАН_80_25_ОЧИСТКА;// УСТНОВКА ВИДЕОРЕЖИМА 80 на 25 тектовый;
jmp .ВЫХОД ;
;-----------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-----------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-----------------------;
.ВЫХОД: popad ;
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; ПРоцедура очистки экрана в заыисимости от установлденого
; видеорежима
;
;
;}
;}
ЭКРАН_ВЫВОД :;{ Выводит содержимое видеобуфера на реальный экран
pushad;
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;---------------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;---------------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;---------------------------;
call ЭКРАН_80_25_ЭКРАН_ВЫВОД;// вывод на экран буфера в режиме 80 на 25 тектовый;
jmp .ВЫХОД ;
;---------------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;---------------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;---------------------------;
.ВЫХОД: popad ;
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; Вывод видео буфера на экран в заыисимости от установлденого
; видеорежима
;
;
;}
;}
ЭКРАН_КУРСОР_XY :;{ Устанавливает курсор в заданую позицю
pushad;
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;----------------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;----------------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;----------------------------;
call ЭКРАН_80_25_КУРСОР_CX_DX;// Установка курсора на экране в режиме 80 на 25 тектовый;
jmp .ВЫХОД ;
;----------------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;----------------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;----------------------------;
.ВЫХОД: popad ;
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; Устнвоока курсора в заданую позицю в заыисимости от установлденого
; видеорежима
;
;
;}
;}
ЭКРАН_ВЫВОД_СТРОКИ :;{ Выводит строку DI на экран
pushad;
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;-------------------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;-------------------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;-------------------------------;
mov si,di ;// перемещение DI в SI
call ЭКРАН_80_25_ВЫВОД_СТРОКИ_SI;// вывод на экран строки SI в режиме 80 на 25 тектовый;
jmp .ВЫХОД ;
;-------------------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-------------------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-------------------------------;
.ВЫХОД: popad ;
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; Вывод Строки DI на экран в заыисимости от установлденого
; видеорежима
;
;
;}
;}
ЭКРАН_ВЫВОД_ЧИСЛА :;{ Вывод числа в консоль в 10 системе счисления AX
pushad;
mov bx,ax ;// Запоминаем выводимое число
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;-------------------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;-------------------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;-------------------------------;
mov ax,bx ;// перемещение bx в ax
call ЭКРАН_80_25_ВЫВОД_ЧИСЛА_AX ;// вывод на экран числа AX в режиме 80 на 25 тектовый;
jmp .ВЫХОД ;
;-------------------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-------------------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-------------------------------;
.ВЫХОД: popad ;
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; Вывод Числа AX на экран в заыисимости от установлденого
; видеорежима
;
;
;}
;}
ЭКРАН_АДРЕС_В_AX :;{ ПОмещает в регистр AX Адрес Видеобуфера
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;-------------------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;-------------------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;-------------------------------;
mov ax,[ЭКРАН_80_25_АДРЕС] ;// ПОмещает адрес видеобуфера в регистр AX
jmp .ВЫХОД ;
;-------------------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-------------------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;-------------------------------;
.ВЫХОД:
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; ПОмещает в регистр AX Адрес Видеобуфера в заыисимости от установлденого
; видеорежима
;
;
;}
;}
ЭКРАН_ВЫВОД_AX_CX_DX:;{Функция Вывод Символ AL с атрибутами AH если AL=0 то выводит тока атрибуты
pushad;
mov bx,ax;
mov al,[РЕЖИМ_ЭКРАНА] ;// Читем режжим работы экрана
;------------------------------;
cmp al,0 ;
jz .НЕ_ВЫБРАН ;// Если видеорежим не выбран
;------------------------------;
cmp al,1 ;// Если режим тектовый 80 на 25
jnz .НЕТ_ТАКОГО ;// НЕизвестный видеорежим нет такого видеорежима
;------------------------------;
mov ax,bx;
call ЭКРАН_80_25_ВЫВОД_AX_CX_DX;// Выводим символ Al С Атрибутами AH на экран X-CX y-DX в режиме 80 на 25 тектовый;
jmp .ВЫХОД ;
;------------------------------;
.НЕ_ВЫБРАН: MOV AX,1 ;// КРИТИЧЕСКАЯ ОШИБКА №1 НЕ ВЫБРАН ВИДОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;------------------------------;
.НЕТ_ТАКОГО:MOV AX,2 ;// КРИТИЧЕСКАЯ ОШИБКА №2 НЕ ИЗВЕТНЫЙ ВИДЕОРЕЖИМ
Call КРИТИЧЕСКАЯ_ОШИБКА ;
jmp .ВЫХОД ;
;------------------------------;
.ВЫХОД: popad ;
ret ;
;{ОПИСАНИЕ ПРОЦЕДУРЫ
; Функция Вывод Символ AL с атрибутами AH если AL=0 то выводит тока атрибуты в заыисимости от установлденого
; видеорежима
; координата X это CX
; координата Y это DX
;}
;}
КРИТИЧЕСКАЯ_ОШИБКА:;{ Обработка критических ошибок
pushad;
popad;
ret;
;}
РЕЖИМ_ЭКРАНА: DB 1 ; // Режим работы Экрана 1 - 80x25 Текстовый
;{ Автономные Функции для работы с экраном в текстовом режиме 80 на 25 в 16 битном режиме
ЭКРАН_80_25_ПОДГОТОВИТЬ :;{ ПОдготовка экрана к работе
pushad ;
;-------------------;
mov ax,00h ; Функуия устновки видео режима
mov al,03h ; текстовый режим 80 X 25
int 10h ; Прервывание биос
;-------------------;
mov ah,05H ; Устновка видео страницы
mov al,0 ; нулевая
int 10h ;
;-------------------;
mov ah,2 ;// Функция Скрыть Курсор
mov bh,0 ;// номер видо страницы
mov dh,25 ;// координаты курсора по Y Установка в 25 строку скрывает курсор
mov dl,0 ;// координаты курсора по X
int 10h ;
;-------------------;
;// Выделение памяти под видеобуфера
mov DI,4000 ;// Указываем размер запрашиваемого участка памяти для буфера экрана
call ВЫДЕЛИТЬ_УЧАСТОК_ПАМЯТИ_DI_РАЗ_DI;// Выделяем участок
mov [ЭКРАН_80_25_АДРЕС],DI ;// Сохраняем адрес выделеного участка для буфера экрана
mov word [ЭКРАН_80_25_ФОН],00111111b;
popad ;
ret ;
;==============================================================================}
ЭКРАН_80_25_КУРСОР_CX_DX :;{ Устанавливает курсор в заданую позицию
pushad;
cmp cx,79;
jb .ДАЛЕЕ1;
mov cx,0;
.ДАЛЕЕ1:
cmp dx,24;
jb .ДАЛЕЕ2;
mov dx,0;
.ДАЛЕЕ2:
mov [ЭКРАН_80_25_КУРСОР_X],cx;
mov [ЭКРАН_80_25_КУРСОР_Y],Dx;
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ОЧИСТКА :;{ Очистка экрана
pushad
;------------------------;
mov ecx,2000 ; // Для счета заполняемых символов
mov al,' ' ; // Записываем символ
mov ah,[ЭКРАН_80_25_ФОН]; // Атрибуты экрана
;------------------------;
mov DI,[ЭКРАН_80_25_АДРЕС];
;------------------------;
.ЦИКЛ: test cx,cx ; // Проверяем на 0 пока CX<>0
jz .КЦИКЛ ; // Если CX=0 ВЫход
MOV [DI],al ; // Записываем код выводимого символа
inc DI ; // Увеличиваем адрес
MOV [DI],ah ; // Записываем атрибуты
inc DI ; // Увеличиваем адрес
dec cx ; // Уменьшаем счетчик
jmp .ЦИКЛ ; // Повторить
.КЦИКЛ: ;------------------------;
popad ;
ret ;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_AX_CX_DX :;{ Функция Вывод Символ AL с атрибутами AH если AL=0 то выводит тока атрибуты
pushad;
mov bx,ax ; // Сохраняю выводимый символ и атрибуты в регистр BX
;-------------------;
mov DI,[ЭКРАН_80_25_АДРЕС] ; Настраиваем регистр DI на началово Адреса видео буфера
;-------------------;
mov ch,0;
cmp cx,79;
ja .ВЫХОД;
mov dh,0;
cmp dx,24;
ja .ВЫХОД;
;-------------------;
mov ax,2 ; (КОД,АТРИБУТ) 2 байта на 1 символ
mul cl ; Умнажем координату по X на 2
mov cx,ax ; Запоминаем
mov ax,160 ; Помещаем в регистр AX длину 1 строки на экране
mul dl ;
ADD AX,CX ;
ADD DI,ax ;
test bl,bl ;
;jz .ДАЛЕЕ ;
MOV byte[DI],bl ; (Символ)
.ДАЛЕЕ: inc DI ;
MOV byte[DI],bh ; (Цвет Атрибут)
;-------------------;
.ВЫХОД: ;
popad ;
ret ;
;==============================================================================}
ЭКРАН_80_25_СЛЕД_ПОЗИЦИЯ :;{ Перевод курсора в следующию позицию
pushad;
mov cx,[ЭКРАН_80_25_КУРСОР_X];
mov Dx,[ЭКРАН_80_25_КУРСОР_Y];
cmp cx,79 ;
jae .СЛЕД_СТРОКА;
inc cx ;
jmp .ВЫХОД;
.СЛЕД_СТРОКА: mov cx,0;
inc dx;
cmp dx,24;
jb .ВЫХОД;
mov cx,0;
mov dx,0;
.ВЫХОД:
mov [ЭКРАН_80_25_КУРСОР_X],cx;
mov [ЭКРАН_80_25_КУРСОР_Y],Dx;
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_СЛЕД_СТРОКА :;{ Перевод курсора НА следующию строку
pushad;
mov cx,[ЭКРАН_80_25_КУРСОР_X];
mov Dx,[ЭКРАН_80_25_КУРСОР_Y];
.СЛЕД_СТРОКА: mov cx,0;
inc dx;
cmp dx,24;
jb .ВЫХОД;
mov cx,0;
mov dx,0;
.ВЫХОД:
mov [ЭКРАН_80_25_КУРСОР_X],cx;
mov [ЭКРАН_80_25_КУРСОР_Y],Dx;
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_БУКВЫ_AL :;{ Выводит символ в консоль
pushad;
cmp al,13;
jnz .ДАЛЕЕ;
call ЭКРАН_80_25_СЛЕД_СТРОКА;
jmp .ВЫХОД;
.ДАЛЕЕ:
cmp al,' ';
jb .ВЫХОД;
mov cx,[ЭКРАН_80_25_КУРСОР_X];
mov dx,[ЭКРАН_80_25_КУРСОР_Y];
call ЭКРАН_80_25_ВЫВОД_AX_CX_DX;
call ЭКРАН_80_25_СЛЕД_ПОЗИЦИЯ;
.ВЫХОД:
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_СТРОКИ_SI :;{ Выводит строку в консоль
pushad;
mov ah,[ЭКРАН_80_25_ФОН];
.ЦИКЛ: mov al,[si];
test al,al;
jz .КЦИКЛ;
call ЭКРАН_80_25_ВЫВОД_БУКВЫ_AL;
inc si;
jmp .ЦИКЛ;
.КЦИКЛ:
popad;
ret;
;==============================================================================}
ЭКРАН_80_25_ВЫВОД_ЧИСЛА_AX :;{ Выводит строку в консоль
pushad;
MOV BX,10 ;// 10 система счисления
xor cx,cx ;
.ЦИКЛ1: ;------------
xor DX,DX ;
DIV BX ;
push dx ;// Сохраняем остаток от деления в стек
inc cx ;
test ax,ax ;
jnz .ЦИКЛ1 ;
;------------
.ЦИКЛ2: ;---------;
pop dx ;
add dl,'0' ;
mov al,dl;
mov ah,[ЭКРАН_80_25_ФОН];
call ЭКРАН_80_25_ВЫВОД_БУКВЫ_AL;
dec cx ;
test cx,cx ;
jnz .ЦИКЛ2 ;
;---------;
popad;
ret;
.БУФФЕР: DB ' ',0;
;==============================================================================}
ЭКРАН_80_25_ЭКРАН_ВЫВОД :;{ Функция для вывода содержимого фидео буфер ана экран
pushad ;
mov AX,0B800h ; Настраиваем регистр ES на началово видеопаямити
mov ES,AX ;
mov si,0 ;
mov di,[ЭКРАН_80_25_АДРЕС];
mov cx,4000 ;
.ЦИКЛ: test cx,cx ;
jz .КЦИКЛ ;
mov al,[di] ;
test al,al ;
jz .ПРОПУСТИТЬ ;
MOV [ES:SI],al ;
.ПРОПУСТИТЬ:
dec cx ;
inc si ;
inc di ;
jmp .ЦИКЛ ;
.КЦИКЛ:
popad ;
ret ;
;==============================================================================}
ЭКРАН_80_25_АДРЕС : DW 0;
ЭКРАН_80_25_КУРСОР_X : DW 0;
ЭКРАН_80_25_КУРСОР_Y : DW 0;
ЭКРАН_80_25_ФОН : DB 01011111b;
;}
;---}
;==============================================================================}
;{ МНЕМОНИКИ -МНЕМОНИКИ: .
;-ЖШРИФТ:
;-clBlack:
;MOV:
;ADD:
;SUB:
;CALL:
;JMP:
;JZ:
;JNZ:
;JA:
;JB:
;JAE:
;JBE:
;RET:
;PUSHAD:
;POPAD:
;POP:
;PUSH:
;TEST:
;CMP:
;INC:
;DEC:
;ORG:
;BYTE:
;WORD:
;XOR:
;SHL:
;SHR:
;-КОНЕЦ:
;==============================================================================}
;{ РЕГИСТРЫ -РЕГИСТРЫ: .
;-ЖШРИФТ:
;-clBlue:
;AL:
;AH:
;AX:
;BL:
;BH:
;BX:
;CL:
;CH:
;CX:
;DL:
;DH:
;DX:
;SI:
;DI:
;ES:
;-КОНЕЦ:
;==============================================================================}
КОНЕЦ_ПРОГРАММЫ:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment