Editor de texto em Assembly 2

Editor simples em Assembly que escreve o texto da enter e backspace:

Créditos  ao aluno de ciência da computação Kássio Sousa:


%OUT--------------------------------------------------------------------------
%OUT Editor de texto - Escrever e justificar o texto                         -
%OUT Autor: Kassio Romulo Lima Sousa - CP09126-81 -                          -
%OUT--------------------------------------------------------------------------

.model small  ;tamanho do segmento de dados
.stack 100h   ;tamanho da pilha
.data         ;segmento de dados, com definições de variáveis

inst db "Escreva o texto e aperte ESC para retornar ao menu:$"
Msg    db    "Editor de Texto",0dh,0ah,"Digite a opcao desejada:",0dh,0ah,"1-Digitar o texto",0dh,0ah,"2-Sair",0dh,0ah,'$'

texto DB 1600 DUP ('$')


.code
INICIO PROC                ;Inicia o segmento de dados apontando para o início da área de dados

MENU_REPETIÇAO:
        mov SI,0        ;Inicializa SI com 0h
        mov ax,@data
        mov ds,ax           

        call LIMPATELA

        LEA    DX,Msg        ; obtem o endereço efetivo de Msg
        MOV    AH,09h         ; move valor 09h para o registrador AH (imprime a string na tela)
        INT    21h        

MENU:   
        MOV AH,1H       ;FUNÇÃO PARA LER (O CHAR FICA EM AL)  
        INT 21H
        CMP AL,'1'        ;Compara o caractere lido com '1'
        JE CASE_1        ;Se for igual, da jump para o label CASE_1
        cmp al,'2'
        je SAINDO
        jmp MENU        ;No caso Default, o programa Retorna ao menu

SAINDO: jmp FIM

COMMENT*------------------------------------------------------------------------------
- Caso 1: Utilizado para escrita no editor
-------------------------------------------------------------------------------------*

CASE_1:
        call LIMPATELA          ;Limpa a tela para digitação
        LEA    DX,inst                ; obtem o endereço efetivo de Inst
        MOV    AH,09h                 ; move valor 09h para o registrador AH (imprime a string na tela)
        INT    21h


        CALL ENTER1

LOOP_ESC:                        ;Fica no Loop ateh o usuario pressionar ESC
        MOV AH,1H                 ;FUNÇÃO PARA LER (O CHAR FICA EM AL)  
        INT 21H
        CMP AL,1Bh                ;compara AL com o caractere ESC
        JE    MENU_REPETIÇAO        ;Se a comparacao for verdadeira, efetua um Jump para a parte das opçoes novamente
        CMP AL, 08h                ;Compara o caractere lido com Backspace
        JE    CARAC_BACKSPACE        ;Se a comparacao for verdadeira efetua a ação
        CMP AL,0Dh                ;Compara o caractere lido com enter
        JE CARAC_ENTER            ;Se a comparacao for verdadeira vai para a função de ENTER
        MOV texto[SI],AL        ;Copia o caractere armazenado em AL para o espaco especificado por SI no vetor texto
        INC SI
        push SI
        mov ah,3h              ;Esta função retorna em dl a coluna atual
        int 10h
        cmp dl,79              ;80 é a ultima coluna
        ;je JUSTIFICAR
        jmp LOOP_ESC            ;Efetua o Loop para pedir nova entrada de caractere

CARAC_BACKSPACE:                ;Efetuado quando o usuario digita o caractere "BACKSPACE"
        CMP SI,0                ;Se for o inicio do texto,nao faz nada e pede nova entrada
        JE LOOP_ESC                ;Efetua o Loop para pedir nova entrada de caractere, Sem decrementar o contador CX
        CALL BACKSPACE            ;Pula para o label BACKSPACE       
        DEC SI                    ;Caso nao, decrementa SI
        MOV texto[SI],'$'        ;Coloca ,no espaco do vetor texto especificado por SI, o caractere '$'
        JMP LOOP_ESC            ;Efetua o Loop para pedir nova entrada de caractere,Sem decrementar o contador CX

CARAC_ENTER:                    ;Efetuado quando o usuario digita o caractere "ENTER"
        call ENTER1
        mov texto[SI],AL        ;Copia o caractere armazenado em AL para o espaco especificado por SI no vetor texto
        inc SI                    ;Incrementa SI para apontar para a próxima posicao do Vetor
        loop LOOP_ESC            ;Efetua o Loop para pedir nova entrada de caractere
        jmp MENU_REPETIÇAO        ;mostra o resultado da busca

COMMENT*------------------------------------------------------------------------------
- Funções para justificar
-------------------------------------------------------------------------------------*


COMMENT*------------------------------------------------------------------------------
- Funções complementares de todo o programa
-------------------------------------------------------------------------------------*

LIMPATELA:                    ; Limpa e Ajusta a tela
        PUSH AX                ; Guarda AX na pilha
        MOV AH,0H             ; Ativa a IRQ 10 para a limpeza do vídeo
        MOV AL,3H             ; define o modo de video
        int 10h               ; Habilita a IRQ 10 (video)
        POP AX                ; Recupera AX da pilha
        RET

ENTER1:                     ;Forca o Enter
        PUSH AX             ;Guarda AX na pilha
        MOV DL,0DH          ;Passa para DL o caractere "Retorno de Carro"
          MOV AH,2h           ;Função 2h para imprimir um caracter
          INT 21h             ;Imprime o caracter que está em DL 
        MOV DL,0AH           ;Passa para DL o caractere "Line Feed"
          MOV AH,2h           ;Função 2h para imprimir um caracter
          INT 21h             ;Imprime o caracter que está em DL
        POP AX              ;DEVOLVE VALOR DE AX
        RETN                ;RETORNA PRA ONDE FOI CHAMADO

BACKSPACE:                    ;Forca o BACKSPACE
          MOV DL,32            ;Copia 32 decimal para DL o equivalente a ESPAÇO
          MOV AH,2h           ;Função 2h para imprimir um caracter
          INT 21h             ;Imprime o caracter que está em DL
          MOV DL,08h              ;Copia 08 hexa para DL o equivalente ao retorno de carro
          MOV AH,2h           ;Função 2h para imprimir um caracter
          INT 21h             ;Imprime o caracter que está em DL
           RET                 ;Retorna o controle ao procedimento que o chamou

FIM:
        MOV    ah,4Ch             ; move valor 4ch para o registrador AH (encerra programa)
        INT    21h

INICIO   ENDP
   END   INICIO                ;Finaliza o código do programa