Last active
September 14, 2015 01:17
-
-
Save MisterTimur/37ca889200bc327a9566 to your computer and use it in GitHub Desktop.
Tim-Pascal-Lib.asm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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