Skip to content

Instantly share code, notes, and snippets.

@MisterTimur
Created June 22, 2015 00:11
Show Gist options
  • Save MisterTimur/146f5ab776cb73cb9e94 to your computer and use it in GitHub Desktop.
Save MisterTimur/146f5ab776cb73cb9e94 to your computer and use it in GitHub Desktop.
Text processor
; 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