Created
June 22, 2015 00:11
-
-
Save MisterTimur/146f5ab776cb73cb9e94 to your computer and use it in GitHub Desktop.
Text processor
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
; Abdulov Timur 2015 Text processor Free Soft Текстовый процессор | |
;========================================================================================================== | |
ORG 100h; | |
Call INIT ; Инициализация установка в ES адреса начала видеопамяти | |
.CIK: call CLEAR ; Очистка окна возможно и его вырисовка в будущем | |
call SCRE ; Отображение редактируемого текста в окошке | |
Call CUSROS ; Вывод курсора | |
Call KLAV ; ОБработка нажатых кнопоук | |
Jmp .CIK ; Повтор предыдущих действий операции в цикле | |
;========================================================================================================== | |
INIT: ; Инициализация | |
pushad ; Запоминаем состояние регистров | |
mov ax, 0003h ; текстовый видеорежим - 80х25 символов. | |
int 10h ; Установка текстового режима | |
mov ax,0B800h ; и установка адреса видеобуфера | |
mov es,ax ; Записываем Адрес видерпаамяти в регистр ES | |
popad ; Востанавливаем состояние регистров | |
Ret ; | |
;========================================================================================================== | |
SCRE: pushad ; Выод текста | |
;-------------------- | |
MOV DX,0 ; Устанавливаем коодинаты в тексте X в 0 | |
MOV CX,0 ; Устанавливаем коодинаты в тексте Y в 0 | |
Mov SI,TEXT ; Устанавлвиаем адрес тескта выводимого | |
;-------------------- | |
;-------------------- | |
.CIK: MOV Al,[SI] ; Читаем символ | |
test Al,Al ; ОБычно нуль встречаеться в конце строки | |
JZ .VIHOD ; Если нуль то выход текст закончился | |
;-------------------- | |
cmp Al,13 ; | |
JZ .ENTER ; Если 13 передсти к след строке | |
Mov ah,[ATRI] ; | |
Call OUTCHA ; вывести символ на экран код символа в регистре AL координаты в CX-x DX-Y проверка на видимость внутри функ outchar | |
inc cx ; Увелчить координату X В тексте | |
jmp .NEX ; | |
.ENTER: ;-------------------- | |
call CurTex ; ищим кончание строки на корой находиться курсор | |
INC DX ; Увеличть координату Y в тексте | |
MOV CX,0 ; Сбрасываем координау Х В тексте | |
.NEX: ;-------------------- | |
INC SI ; Переди к след символу в тексте | |
jmp .CIK ; | |
;-------------------- | |
.VIHOD: | |
popad ; | |
ret ; | |
;==================================================================================== | |
CurTex: push ax ; [ATEX] адрес окончания строки на котрой курсор находиться прибавляя координату по X получаем адрес в строке куда нужно вставить символ | |
mov ax,[CURY] ; Вычисляем глобальную координату курсора координата в окне | |
add ax,[SMEY] ; + смещенеи в тексте | |
cmp dx,ax ; если совпадает с выводимой строкой запомнить в итоге | |
jnz .NSO ; останеьтся тока координата конца строки | |
mov [ATEX],SI ; | |
.NSO: | |
dec ax ; Запоминаем вдрес адрес конца строки котрая выше курсора | |
cmp dx,ax ; | |
jnz .NSO2 ; | |
mov [ATEP],cx ; | |
.NSO2: | |
pop ax ; | |
ret ; | |
;========================================================================================================== | |
CLEAR: pushad ; ;Очистка экрана | |
MOV CX,[SMEX] ; | |
MOV DX,[SMEY] ; просто закрашивает участок экрана согластно координатам | |
Mov AH,[ATRI] ; ширине и высоте окна | |
Mov AL,' ' ; | |
;-------------------- | |
.CIK: Call OUTCHA ; | |
mov bx,[LENX] ; | |
add bx,[SMEX] ; | |
cmp cx,bx ; | |
JNZ .Nex ; | |
mov Cx,0 ; | |
inc dx ; | |
mov bx,[LENY] ; | |
add bx,[SMEY] ; | |
cmp dx,bx ; | |
JA .Vihod ; | |
jmp .CIK ; | |
;-------------------- | |
.Nex: inc cx ; | |
jmp .CIK ; | |
;-------------------- | |
.Vihod: popad | |
ret | |
;========================================================================================================== | |
CUSROS:;Вывод курсора на экран | |
pushad | |
;-------------------- | |
MOV CX,[CURX] ; просто устанавливает атрибуты текста по заданым координатам | |
MOV DX,[CURY] ; | |
;------------------- | |
add cx,[ECRX] ; | |
add dx,[ECRY] ; | |
;-------------------- | |
mov ax,2 ; | |
mul cl ; | |
mov cx,ax ; | |
mov ax,160 ; | |
mul DX ; | |
add AX,CX ; | |
mov si,ax ; | |
inc si ; | |
mov al,[CATR] ; | |
mov [es:si],al ; | |
.VIHOD: popad | |
ret; | |
;========================================================================================================== | |
OUTCHA: ;Вывод символа на печать CX - DX x,y Координаты в тексте Al Символ если символ 0 выводит тока аотрибуты | |
pushad | |
Call VISI ; Проверяем видно ли символ на экране | |
JZ .VIHOD ; Если не видно выход | |
;--------------------------------------------------------- | |
SUB CX,[SMEX] ; Отнимаем смещение в тексте по X | |
SUB DX,[SMEY] ; Отнимаем смешение в тексте по Y | |
;--------------------------------------------------------- | |
add cx,[ECRX] ; Прибавляем координату по X окна | |
add dx,[ECRY] ; Прибавляем координату по Y окна | |
;--------------------------------------------------------- | |
Mov bx,ax ; Запоминаем выводимый символ | |
mov ax,2 ; Заносим в AX 2 | |
mul cl ; Умножаем на Младшый байт Координаты по Х так как на 1 символ 2 байта () | |
mov cx,ax ; Получаем преобразованые координаты по Х | |
mov ax,160 ; Теперь считаем по координате Y | |
mul DX ; Умножаем Y на 160 Так как в 1 строке 160 байт 80 тбайт знаков и 80 байт атрибутов | |
add AX,CX ; Складываем то что получилось при умножении координаты Y и координаты X | |
mov si,ax ; Записываем в регистр SI для записи в видео память уже готовой коордианты | |
mov [es:si],bx ; Записываем символ в видео память SI адрес в видеопамяти ES адрес видо памяти | |
.VIHOD: popad | |
ret; | |
;========================================================================================================== | |
VISI: ;ПРоверка видимости CX - DX x,y Координаты | |
;-------------------- | |
mov bx,[SMEX] ; Проверка Ч входит ли символ в окно | |
cmp cx,bx ; если координаты меньше смещения в тексте | |
Jb .NEVI ; по Х то То символ не видно | |
add bx,[LENX] ; Прибавляем ширину окна к Смещению в тексте | |
cmp cx,bx ; Если Х оказалася больше этого числа то символ не видно | |
Ja .NEVI ; | |
;-------------------- | |
;-------------------- | |
mov bX,[SMEY] ; Проверка Y входит ли символ в окно | |
cmp dx,bx ; Если координаты меньше смещения в тексте | |
Jb .NEVI ; по Y то То символ не видно | |
add bx,[LENY] ; Прибавляем ширину окна к Смещению в тексте | |
cmp dx,bx ; Если Y оказалася больше этого числа то символ не видно | |
Ja .NEVI ; | |
;-------------------- | |
;-------------------- | |
mov bx,1 ; Символ видать | |
test bx,bx ; | |
jmp .VIHOD ; Возвращает 1 | |
;-------------------- | |
.NEVI: | |
;-------------------- | |
mov bx,0 ; Символ не видать | |
test bx,bx ; Возвращает 0 | |
;-------------------- | |
.VIHOD: | |
ret ; | |
;========================================================================================================== | |
KLAV: pushad ; Чтение нажатой кнопки | |
mov ah,00h ; | |
int 16h ; | |
mov [SIM],ax ; Запоминаем нажатую кнопку | |
;-------------------- | |
.RIG: cmp ah,77 ; Кнопка Вправо | |
jnz .LEF ; | |
Call RIG ; | |
jmp .Vih ; | |
;-------------------- | |
;-------------------- | |
.LEF: cmp ah,75 ; Кнопка Влево | |
jnz .TOP ; | |
Call LEF ; | |
jmp .Vih ; | |
;-------------------- | |
;-------------------- | |
.TOP: cmp ah,72 ; Кнопка Вверх | |
jnz .BOT ; | |
Call TOP ; | |
jmp .Vih ; | |
;-------------------- | |
;-------------------- | |
.BOT: cmp ah,80 ; Кнопка Вверх | |
jnz .BUK ; | |
Call BOT ; | |
jmp .Vih ; | |
;-------------------- | |
.BUK: Call BUK ; Буквы цыфры | |
.Vih: popad ; | |
Ret ; | |
;========================================================================================================== | |
BUK: pushad ;Ввод букв символовс всего такого | |
;-------------------- | |
Mov Di,SYSS ; ПРедварительный фильтр на ввод | |
call PREDEL ; ПРверка букава ли это для этого смотрим список читаемых знаков | |
jnz .Rea ; | |
Mov Di,NUKV ; | |
call PREDEL ; ПРверка букава ли это для этого смотрим список читаемых знаков | |
jz .Vih ; Если это не буква то выход | |
;-------------------- | |
.Rea: | |
;-------------------- | |
mov si,[ATEX] ; Находим начало строки | |
.CIK2: cmp si,TEXT ; | |
jz .ECIK2 ; | |
dec si ; Функуция двигаеться в начало строки пока не встретить перевод карретки 13 | |
cmp byte [si],13 ; либо не дойдет до точки начала редактируемого текста TEXT | |
jz .ECIK2 ; | |
jmp .CIK2 ; | |
;-------------------- | |
.ECIK2: ;-------------------- | |
mov Dx,[SMEX] ; Перебираем символы до конца строки в поисках нужной позиции | |
add Dx,[CURX] ; Функция вдигаеться в конец строки пока SI в тексте не станет совпадать с координами курсора по X смещение текста +координата курсора на экране | |
mov di,0 ; Получем кординату крусора в строке текста | |
; | |
cmp byte [si],13 ; Читаем позиции с начала строки пока не совпадут с DX- счетсик от начала строки в тексте | |
jnz .CIK3 ; Если это не перевод каретки значит его нету и мы в начале всего текста INC SI значит ненужжеен | |
inc si ; Переходим к след символу так как пред цикл дошел до 13 перевода карретки | |
.CIK3: mov bl,[si] ; | |
test bl,bl ; если кончился текст | |
jz .ECIK3 ; | |
cmp bl,13 ; если кончилася строка | |
jz .ECIK3 ; | |
cmp di,dx ; Если найдена позиция куда устанавливаеться символ | |
jz .ADDSIM ; Добавляем символ в остальных случаях наад буит добавить еще пробелы | |
inc di ; | |
inc si ; | |
jmp .CIK3 ; | |
;-------------------- | |
.ECIK3: | |
;-------------------- | |
.CIK4: cmp di,Dx ; Добавляем пробелы если это необходимо | |
jz .ADDSIM ; | |
mov bx,[SIM] ; | |
mov byte[SIM],' ' ; | |
call InsSim ; | |
mov [SIM],bx ; | |
inc di ; | |
inc si ; | |
jmp .CIK4 ; | |
;-------------------- | |
.ADDSIM: | |
call InsSim ; Добавлем символ | |
;-------------------- | |
Mov Di,NUKV ; | |
call PREDEL ; ПРверка букава ли это для этого смотрим список читаемых знаков | |
jz .DEL ; Если это не буква то проверяем может DEL | |
CALL RIG ; | |
jmp .Vih ; | |
;-------------------- | |
;-------------------- | |
.DEL: cmp al,8 ; | |
jnz .ENT ; сдвиаем курсор в лево | |
call DelSim ; | |
call DelSim ; | |
CALL LEF ; | |
jmp .Vih; | |
;-------------------- | |
;-------------------- | |
.ENT: cmp al,13 ; Обработка кнопки Enter | |
jnz .Vih ; сдвиаем курсор в Низ | |
CALL BOT ; | |
Mov Word[CURX],0 ; | |
Mov Word[SMEX],0 ; | |
jmp .Vih ; | |
;-------------------- | |
.Vih: | |
;----------------- ; | |
mov byte [SIM],0 ; Символ обработан | |
popad ; | |
Ret ; | |
;========================================================================================================== | |
PREDEL: push DI ; | |
push CX ; ПРоверяет явлеться ли СИмвол буквой символ должен находиться в регистре AL | |
push AX ; | |
;-------------------- | |
.CIK: mov CX,[DI] ; Ссылка на cписок букв в DI находиться список пределов | |
test cx,cx ; | |
jz .NEBUK ; Если не входит в заданые пределы выход вот от сюда флаг Z=0 | |
cmp al,cl ; Нижний предел | |
jb .Nex ; | |
cmp al,ch ; Больший предел | |
ja .Nex ; | |
jmp .BUK ; | |
.Nex: inc di ; Переход к след паре символов | |
inc di ; | |
jmp .CIK ; | |
;-------------------- | |
.BUK: | |
;-------------------- | |
mov al,1 ; Усли входит в заданые пределы | |
test al,al ; | |
;-------------------- | |
.NEBUK: | |
pop AX ; | |
pop CX ; | |
pop DI ; | |
ret ; | |
;========================================================================================================== | |
InsSim: pushad ; Вставляет символ в строку позиция SI | |
mov al,[SIM] ; | |
mov cl,[si] ; | |
mov [si],al ; | |
.Cik: inc si ; | |
mov al,[si] ; | |
mov [si],cl ; | |
mov cl,al ; | |
test cl,cl ; | |
jz .ECik ; | |
jmp .Cik ; | |
.ECik: inc si ; | |
mov byte[si],0 ; | |
.Vihod: | |
popad ; | |
ret ; | |
;========================================================================================================== | |
DelSim: pushad ; Удаляет символ из строки указатель на удаляемый символ SI | |
cmp si,TEXT ; | |
JZ .ECik ; | |
dec si ; | |
mov di,si ; | |
inc si ; | |
.Cik: mov al,[si] ; | |
mov [di],al ; | |
inc si ; | |
inc di ; | |
test al,al ; | |
jnz .Cik ; | |
.ECik: | |
popad ; | |
ret ; | |
;========================================================================================================== | |
RIG: pushad ; Передвижение курсора вправо | |
mov cx,[CURX] ; | |
cmp cx,[LENX] ; | |
JAE .RI1 ; | |
Inc word [CURX] ; | |
jmp .Vih ; | |
.RI1: MOV CX,[SMEX] ; | |
CMP CX,[MAXX] ; | |
JA .Vih ; | |
Inc word[SMEX] ; | |
.Vih: | |
popad ; | |
Ret ; | |
;========================================================================================================== | |
LEF: pushad ; Перемещение курсора влево | |
mov cx,[CURX] ; Читаем координуту курсора в окне | |
;-------------------- | |
cmp CX,0 ; если курсор можно сдвинуть просто изменением координаты курсора | |
JZ .LE1 ; | |
Dec word [CURX] ; | |
jmp .Vih ; | |
;------------------- | |
;-------------------- | |
.LE1: MOV CX,[SMEX] ; Если можно сдвинуть смещением внтури текста влево | |
test cx,cx ; | |
JZ .LE2 ; | |
Dec word[SMEX] ; | |
jmp .Vih ; | |
;-------------------- | |
;-------------------- | |
.LE2: call TOP ; Сдвигаем курсор вверхъ | |
mov ax,[ATEP] ; Расчет новой коо после смещения координаты | |
mov dx,0 ; конца верхней стролки в [ATEP] | |
div Word[LENX] ; делим на ширину окна | |
Mov word[CURX],dx ; В сотатке координата курсора в окне | |
mov dx,0 ; | |
mul Word [LENX] ; умножаем полученое в рез деления число на ширину окна | |
Mov word[SMEX],ax ; записываем смещене внутри текста | |
;------------------- | |
.Vih: | |
popad ; | |
Ret ; | |
;========================================================================================================== | |
TOP: pushad ; Сдвиг курсора вверх | |
mov dx,[CURY] ; | |
CMP DX,0 ; | |
Jz .TO1 ; | |
Dec word [CURY] ; | |
jmp .Vih ; | |
.TO1: MOV DX,[SMEY] ; | |
CMP DX,0 ; | |
JZ .Vih ; | |
Dec word [SMEY] ; | |
.Vih: | |
popad ; | |
Ret ; | |
;========================================================================================================== | |
BOT: pushad ; Сдвиг Курсора вниз | |
mov dx,[CURY] ; | |
cmp DX,[LENY] ; | |
JAE .BO1 ; | |
INC word [CURY] ; | |
jmp .Vih ; | |
.BO1: MOV DX,[SMEY] ; | |
CMP Dx,[MAXY] ; | |
JAE .Vih ; | |
INC word[SMEY] ; | |
.Vih: | |
popad ; | |
Ret ; | |
;========================================================================================================== | |
PAUS: pushad ; задержка вывода до нажатия кнопки | |
mov ah,10h ; | |
int 16h ; | |
popad ; | |
ret ; | |
;========================================================================================================== | |
EXIT: mov ah,4Ch ; выход из подпрограммы | |
int 21h ; | |
ret ; | |
;========================================================================================================== | |
NUKV: db 'azAZаяАЯ09 ',0,0; | |
SYSS: db 13,13,8,8,0,0; | |
; Переменные -------------------------------------------------------------------------------------------- | |
ATEX: DW 0; Адрес конца строки в тексте на котрой расположен курсор | |
ATEP: DW 0; Адрес конца строки в тексте ниже котрой расположен курсор | |
; Нажатая кнопка | |
SIM : DW 0; | |
; Позиция курсора | |
CURX: DW 0; | |
CURY: DW 0; | |
GURX: DW 0; | |
GURY: DW 0; | |
; Координату окна в тексте | |
SMEX: DW 0; | |
SMEY: DW 0; | |
; Координаты окна на экране | |
ECRX: DW 30; | |
ECRY: DW 10; | |
; Ширина и высота окна на экране | |
LENX: DW 30; | |
LENY: DW 10; | |
; Максимальная Ширина | |
MAXX: DW 1000; | |
MAXY: DW 1000; | |
; Цвета | |
ATRI: DB 00110001b; Цвет фона и шрифта | |
CATR: DB 11010001b; Цвтовая настройка Кусрсора | |
; Редактируемый текст | |
TEXT: DB '0123456789',13,'Programm TEST;',13,'Var',13,'x:longint;',13,'Begin',13,'x:=x+1',13,'Writeln(x);',13,'End;',0 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment