STACK SEGMENT STACK
db 256 dup (0)
STACK ENDS
DATA SEGMENT
copyrigth db 'Programa Desarrollado por Guillermo Stortoni y Hernan Escalante, UCINF 2006',13,'$'
letra_enviada db 1
letra_recibida db 1
letra_enviada_ok db 1
letra_recibida_ok db 1
ren_limpio_rec db 1
ren_limpio db 1
renglon_limpio db ' ',13,'$'
renglon_envia db 5
renglon_recibe db 5
columna_envia db 5
columna_recibe db 5
viejoip8 dw 0
viejocs8 dw 0
cartel1 db '...Me estan Diciendo:',10,13,'$'
cartel2 db '...Estoy Escribiendo:',10,13,'$'
intro db 10,'$'
DATA ENDS
;Definicion de macros a utilizar
;///////////////////////////////////////////////////////////////
PONVECTOR MACRO TIPO, SUBRUTINA
push di
mov di,0
mov es,di
mov di, tipo*4
cli
mov word ptr es:[di],offset subrutina
mov word ptr es:[di+2],seg subrutina
sti
pop di
ENDM
GUARDAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS
mov di,0
mov es,di
mov di, tipo*4
cli
mov ax,data
mov ds,ax
mov ax,es:[di]
mov VIEJOIP,ax
mov ax,es:[di+2]
mov VIEJOCS,ax
sti
ENDM
RESTAURAVECTOR MACRO TIPO, VIEJOIP, VIEJOCS
mov di,0
mov es,di
mov di, tipo*4
cli
mov ax,data
mov ds,ax
mov ax,VIEJOCS
mov es:[di+2],ax
mov ax,VIEJOIP
mov es:[di],ax
sti
ENDM
CODE SEGMENT
MiProg proc FAR
assume cs:code,ds:data
mov ax,data
mov ds,ax
;inicializo la variable letra_recibida_ok con un 0, para iniciar la transmision.
mov letra_recibida_ok,0
mov renglon_recibe,1
mov renglon_envia,13
mov columna_envia,0
mov columna_recibe,0
mov ren_limpio,0
mov ren_limpio_rec,0
;limpio la pantalla :D
mov ax,0600h
mov bh,17h
mov cx,0000h
mov dx,184fh
int 10h
;muevo el cursor a la posicion renglon 0, columna 1: con el mensaje "aca se recibe";)
MOV ah,02h
MOV bh,00h
MOV dh,00
MOV dl,01
INT 10h
lea dx,cartel1
mov ah,09h
int 21h
;muevo el cursor a la posicion renglon 12, columna 1: con el mensaje "aca se envia";)
MOV ah,02h
MOV bh,00h
MOV dh,12
MOV dl,01
INT 10h
lea dx,cartel2
mov ah,09h
int 21h
; pongo el copyrigth
MOV ah,02h
MOV bh,00h
MOV dh,24
MOV dl,00
INT 10h
lea dx,copyrigth
mov ah,09h
int 21h
;Inhabilito interrupcion
cli
;////////// PROGRAMACION DEL PUERTO SERIE//////////////////////////
;;;;;;;;;;;;;;;;;;;;;;;;;; Registro de línea de control
Mov Dx,3FBH
Mov AL,10000000b
Out Dx, AL
;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la veloidad en bauidos (byte alto)
Mov DX,3F9H
Mov AL,0
Out Dx, AL
;;;;;;;;;;;;;;;;;;;;;;;;;; Divisor de la velocidad en baudios (byte bajo)
Mov Dx,3F8H
Mov AL,12H
Out DX,AL
;;;;;;;;;;;;;;;;;;;;;;;;;; Longuitud de los caracteres los bits 0 y 1 deben estar en 1para que sea de 8 bit
Mov AL,00000011b
Mov DX,3FBH
Out DX, AL
;;;;;;;;;;;;;;;;;;;;;;;;;; INSTRUCCION DEL PROFE
Mov DX,3FCH
Mov AL,03h
Out DX,AL
;;;;;;;;;;;;;;;;;;;;;;;;;; Habilito dicho por el profe
Mov DX,3F9H
Mov AL,1
Out Dx, AL
;////////////////////////////
GUARDAVECTOR 8, VIEJOIP8, VIEJOCS8
PONVECTOR 12, recibe
;Desenmascaro la IRQ4
in al,21h ;Leo el regístro de mascara
and al,11101111b ;Solo altero el bit 5 perteneciente a la IRQ4
out 21h,al ;Modifico el registro de mascara con el IRQ4 desenmascarado
;Habilito interrupcion
sti
jmp escribe
;######################### ACA RECIBO, MUESTRO EN PANTALLA Y ACTUALIZO EL RENGLON ##########################
;# #
;# #
recibir: MOV ah,02h ;peticion para colocar el cursor
MOV bh,00h ;numero de pagina 0
MOV dh,renglon_recibe ;la ultima posicion donde se escribio una letra
MOV dl,columna_recibe ;la columna, la incrementa automaticamente la interrupcion RECIBE
INT 10h
CMP letra_recibida,0Dh ;me llego un enter?
JNE sigue
mov columna_recibe,0
cmp renglon_recibe,9
jne sigue
mov ren_limpio_rec,1
mov renglon_recibe,1
jmp sigue
sigue: cmp ren_limpio_rec,1
jne continua
lea dx,renglon_limpio
mov ah,09h
int 21h
jmp continua
continua: mov dl,letra_recibida
MOV ah,06h ; la funcion 06h, me sirve para mostrar 1 caracter
INT 21h
MOV letra_recibida_ok,0
INC columna_recibe
JMP escribe
;######################### ACA ESCRIBO Y ENVIO POR PUERTO ##########################
;#
;#
escribe: CMP letra_recibida_ok,1; si la interrupcion hizo que me cayera una letra, dejo que se escriba la letra que llego
je recibir ;le doy la posibilidad de que la escriba, antes de yo seguir escribiendo
MOV ah,02h ;peticion para colocar el cursor
MOV bh,00h ;numero de pagina 0
MOV dh,renglon_envia ;uso el ultimo renglon que me quedo, para seguir escribiendo en la misma posicion;)
MOV dl,columna_envia ;uso la ultima columna que me quedo, para seguir escribiendo en la misma posicion;)
INT 10h ;interrupcion del bios
CMP ren_limpio,1 ;esta variable, si esta en 1, me indica que ya he escrito 10 renglones, por lo tanto borra el primer renglon
jne repite ;si no he escrito aun 10 renglones, sigue con el codigo normalmente
lea dx, renglon_limpio;si no es asi, borra el primer renglon utilizado para poder escribir libremente
mov ah,09h ;muestra el ' '
int 21h ;DOS
repite: MOV ah,01h ;pido solo 1 caracter el cual se despliega en pantalla y se guarda en al
INT 21h ;DOS
cmp al,1Bh ;comparo si el caracter presionado es 'esc' si es asi, se terminará el programa, de lo contrar continua
je salir_programa ; esta esta clara cierto?
MOV letra_enviada,al ;guardo la tecla presionada en la variable tecla_enviada
MOV letra_enviada_ok,0;con esto pongo una bandera de que he escrito una letra
MOV DX,0000 ;puerto COM1
MOV AH,01 ; funcion 01h-enviando un caracter al COM
MOV AL,letra_enviada ;caracter a ser enviado
INT 14
;MOV dx,3F8h ; llamo al puerto COM1
;out dx,al ; escribo el caracter presionado por el puerto
inc columna_envia ; si escribi una tecla, debo moverme un espacio, para eso incremento la columna
cmp letra_enviada,0dh ;comparo si la tecla presionada fue enter, de ser asi, necesitare hacer un salto de linea
jne repite ;sino, sigue escribiendo
mov columna_envia,0 ;si aprete enter, retorno el carro
inc renglon_envia ;salto 1 renglon
lea dx,intro ;cargo un mensaje que lo unico que tiene es 1 espacio vacio
mov ah,09h ;lo muestro en pantalla
int 21h ;DOS
cmp renglon_envia,23 ;esto es para contar si ya mi cursor esta en el renglon 23
je mod_renglon_envia ;y si es asi, lo reinicio al 13
jne escribe ; sino, sigo escribiendo
mod_renglon_envia: mov renglon_envia,13
mov ren_limpio,1 ;pongo una bandera avisando que y he escrito 23 renglones
jmp escribe ;sigo escribiendo
RESTAURAVECTOR 8, VIEJOIP8, VIEJOCS8
;Enmascaro la IRQ4 en el controlador de interrupciones, y la restauro
in al,21h
or al,00010000b
out 21h,al
salir_programa: mov ax,4c00h
int 21h
;/////////INTERRUPICON PARA RECIBIR////////////
recibe:
push ax
push dx
push ds
mov ax,data
mov ds,ax
mov dx,3f8h
in al,dx
mov letra_recibida,al
mov letra_recibida_ok,1
inc renglon_recibe
mov al,20h
out 20h,al
pop ds
pop dx
pop ax
IRET
MiProg ENDP
CODE ENDS
END MiProg