Skip to content

Instantly share code, notes, and snippets.

@dutchand
Created February 15, 2021 18:49
Show Gist options
  • Save dutchand/8c81998b7aeb58ba33b5ef6f42be1923 to your computer and use it in GitHub Desktop.
Save dutchand/8c81998b7aeb58ba33b5ef6f42be1923 to your computer and use it in GitHub Desktop.
CONTROL REMOTO DE UNA RESISTENCIA ELECTRICA
STACK SEGMENT PARA STACK 'STACK'
DB 256 DUP(00H)
STACK ENDS
;---------------------------------------------------------------------------------------------------------------------------------------
DATA SEGMENT PARA PUBLIC 'DATA'
TRAMA_ENQ DB 55H,55H,16H,16H,05H,0FFH
TRAMA_ACK DB 55H,55H,16H,16H,06H,0FFH
TRAMA_NAK DB 55H,55H,16H,16H,15H,0FFH
TRAMA_EOT DB 55H,55H,16H,16H,04H,0FFH
TRAMA_RECIBIDA DB 6 DUP(00H)
TRAMA_TEXTO DB 12 DUP(00H)
BLOQUE_TEXTO DB 2 DUP(00H)
TAMAÑO_BLOQUE DB 2
BANDERA DB 17H
TEXTO1 DB 'CONTROL REMOTO DE UNA RESISTENCIA ELECTRICA', '$'
TEXTO2 DB 'TECLEE 1 PARA TRANSMITIR, 2 PARA RECIBIR O ENTER PARA TERMINAR', '$'
TEXTO3 DB 'TRANSMICION (PC CONTROL DEL PROCESO) ', '$'
TEXTO4 DB 'RECEPCION (PC A CONTROL REMOTO) ', '$'
TEXTO5 DB 'COMUNICACION TERMINADA', '$'
TEXTO6 DB 'PROCESO ENCENDIDO', '$'
TEXTO7 DB 'PROCESO APAGADO', '$'
TEXTO8 DB 'TECLEE "e" PARA ENCENDER Y "a" PARA APAGAR, SEGUIDO DE "x" PARA CONFIRMAR', '$'
TEXTO9 DB ' ', '$'
DATA ENDS
;---------------------------------------------------------------------------------------------------------------------------------------
CODE SEGMENT PARA PUBLIC 'CODE'
PRINCIPAL PROC FAR
ASSUME CS: CODE
MOV AX, DATA
MOV DS, AX
ASSUME DS: DATA
;INIC UART
;RAZON EN BAUDIO (9600 BAUDIOS)
MOV DX,03FBH
MOV AL,80H
OUT DX,AL
;BIT mS
MOV DX,03F8H
MOV AL,0CH
OUT DX,AL
;BIT MS
MOV DX,03F9H
MOV AL,00H
OUT DX,AL
;CARACTERISTICAS DEL CARACTER A TRANSMITIR
MOV DX,03FBH
MOV AL,1BH
OUT DX,AL
;CREAR VISTA PRINCIPAL
;MODO DE VIDEO
MOV AH, 00H
MOV AL, 18
INT 10H
MOV SI, OFFSET TEXTO2
CALL CREAR_VISTA
MOV DX, 0503H
CALL MOVER_CURSOR
MOV SI, OFFSET TEXTO9
CALL MOSTRAR_TEXTO
;TRANSMITIR O RECIBIR?
INICIO: MOV AH, 00H
INT 16H
CMP AL, '1'
JZ TR
CMP AL, '2'
JZ RE
CMP AL, 0DH
JZ FIN
JMP INICIO
;TRANSMITIR DATO
TR: MOV SI, OFFSET TEXTO3
CALL CREAR_VISTA
CALL TRANSMICION
JMP FIN
;RECIBIR DATO
RE: MOV SI, OFFSET TEXTO4
CALL CREAR_VISTA
CALL RECEPCION
;TERMINAR COMUNICACIÓN
FIN: CALL LIMPIAR_PANTALLA
MOV DH, 0EH
MOV DL, 30
CALL MOVER_CURSOR
MOV SI, OFFSET TEXTO5
CALL MOSTRAR_TEXTO
;ESPERAR INTERRUPCION DE TECLADO
MOV AH, 00H
INT 16H
;REGRESA EL CONTROL AL DOS
MOV AH, 4CH
MOV AL, 00H
INT 21H
PRINCIPAL ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
TRANSMICION PROC NEAR
PUSH AX
PUSH BX
PUSH DI
;ENVIAR TRAMA_ENQ
N1: MOV BX, OFFSET TRAMA_ENQ
CALL ENVIA_TRAMA
;VERIFICAR SI SE RECIBIO LA TRAMA_ENQ
;RECIBIR TRAMA_ACK
MOV BX, OFFSET TRAMA_RECIBIDA
CALL RECIBE_TRAMA
MOV BX, OFFSET TRAMA_RECIBIDA
MOV AL, [BX+4]
CMP AL, 06H ;ACK
JNZ N1
;CREAR BLOQUE DE TEXTO CON CARACTER LEIDO DEL TECLADO
N2: MOV DX, 0603H
CALL MOVER_CURSOR
MOV BX, OFFSET BLOQUE_TEXTO
CALL CREAR_BLOQUE_TEXTO
;CREAR TRAMA_TEXTO
MOV BX, OFFSET TRAMA_TEXTO
MOV DI, OFFSET BLOQUE_TEXTO
CALL CREAR_TRAMA_TEXTO
;ENVIAR TRAMA_TEXTO
N3: MOV BX, OFFSET TRAMA_TEXTO
CALL ENVIA_TRAMA
;VERIFICAR SI SE RECIBIO LA TRAMA_TEXTO
;RECIBIR TRAMA_ACK
MOV BX, OFFSET TRAMA_RECIBIDA
CALL RECIBE_TRAMA
MOV BX, OFFSET TRAMA_RECIBIDA
MOV AL, [BX+4]
CMP AL, 06H ;ACK
JNZ N3
;MOSTRAR ORDEN DADA AL PROCESO
MOV SI, OFFSET BLOQUE_TEXTO
CALL BUSCAR_SECUENCIA_DE_CARACTERES
CMP AL, 01H
JZ MOSTRAR_ENCENDER
CMP AL, 00H
JZ MOSTRAR_APAGAR
JMP CONTINUAR1
MOSTRAR_ENCENDER: MOV SI, OFFSET TEXTO6
CALL CREAR_MENSAJE
JMP CONTINUAR1
MOSTRAR_APAGAR: MOV SI, OFFSET TEXTO7
CALL CREAR_MENSAJE
;COMPROBANDO SI ES LA ULTIMA TRAMA DE TEXTO
CONTINUAR1: CMP BANDERA, 03H ; ETX
JNZ N2
;ENVIAR TRAMA EOT
MOV BX, OFFSET TRAMA_EOT
CALL ENVIA_TRAMA
POP DI
POP BX
POP AX
RET
TRANSMICION ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
RECEPCION PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH SI
;RECIBIR TRAMA_ENQ
Q1: MOV BX, OFFSET TRAMA_RECIBIDA
CALL RECIBE_TRAMA
MOV BX, OFFSET TRAMA_RECIBIDA
MOV AL, [BX+4]
CMP AL, 05H ;ENQ
JNZ Q1
;ENVIAR TRAMA_ACK
MOV BX, OFFSET TRAMA_ACK
CALL ENVIA_TRAMA
;RECIBIR TRAMA_TEXTO
Q2: MOV BX, OFFSET TRAMA_TEXTO
CALL RECIBE_TRAMA
;COMPROBANDO ERRORES
MOV BX, OFFSET TRAMA_TEXTO
MOV AH, [BX+7+TAMAÑO_BLOQUE+1] ;CCB RECIBIDO
ADD BX, 07H
CALL CALCULAR_CCB
CMP AH, AL
JZ Q3
;ENVIAR TRAMA_NAK
MOV BX, OFFSET TRAMA_NAK
CALL ENVIA_TRAMA
JMP Q2
Q3: ;ENVIAR TRAMA_ACK
MOV BX, OFFSET TRAMA_ACK
CALL ENVIA_TRAMA
;MOSTRAR ORDEN DADA AL PROCESO
MOV SI, OFFSET BLOQUE_TEXTO
CALL BUSCAR_SECUENCIA_DE_CARACTERES
CMP AL, 01H
JZ ENCENDER
CMP AL, 00H
JZ APAGAR
JMP CONTINUAR
ENCENDER: CALL ENCENDER_PROCESO
MOV SI, OFFSET TEXTO6
CALL CREAR_MENSAJE
JMP CONTINUAR
APAGAR: CALL APAGAR_PROCESO
MOV SI, OFFSET TEXTO7
CALL CREAR_MENSAJE
;COMPROBANDO SI ES ULTIMA TRAMA
CONTINUAR: MOV BX, OFFSET TRAMA_TEXTO
MOV AH, [BX+7+TAMAÑO_BLOQUE]
CMP AH, 03H ;ETX
JNZ Q2
POP SI
POP CX
POP BX
POP AX
RET
RECEPCION ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
RUTTX PROC NEAR
PUSH DX
PUSH AX
;PUEDO TRANSMITIR DATO?
MOV DX, 03FDH
R1: IN AL, DX
TEST AL, 20H
JZ R1
POP AX
;ESCRIBIR REGISTRO TX
MOV DX, 03F8H
OUT DX, AL
POP DX
RET
RUTTX ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
RUTRX PROC NEAR
PUSH DX
;HAY DATO RECIBIDO?
MOV DX, 03FDH
R2: IN AL, DX
TEST AL, 01H
JZ R2
;LEER REGISTRO RX
MOV DX, 03F8H
IN AL, DX
POP DX
RET
RUTRX ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
ENVIA_TRAMA PROC NEAR
push ax
A: MOV AL, [BX]
CALL RUTTX
MOV AL, [BX]
CMP AL, 0FFH
JZ B
INC BX
JMP A
B: pop ax
RET
ENVIA_TRAMA ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
RECIBE_TRAMA PROC NEAR
PUSH AX
PUSH CX
MOV CX, 05
C: CALL RUTRX
MOV [BX], AL
INC BX
LOOP C
CMP AL, 01H ;SOH
JZ D
MOV AL, 0FFH
MOV [BX], AL
D: CALL RUTRX
MOV [BX], AL
INC BX
CMP AL, 0FFH
JNZ D
POP CX
POP AX
RET
RECIBE_TRAMA ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
CREAR_BLOQUE_TEXTO PROC NEAR
PUSH AX
PUSH CX
MOV CL, TAMAÑO_BLOQUE
MOV CH, 00H
T1: MOV AH, 00H
INT 16H
MOV [BX], AL
;IMPRIMIENDO EL TEXTO LEIDO
MOV AH, 0EH
INT 10H
CMP AL, 0DH
JZ T2
INC BX
LOOP T1
JMP FT
T2: MOV BANDERA, 03H
CMP CX, 02H
JNZ FT
INC BX
MOV AL, 00H
MOV [BX], AL
FT: POP CX
POP AX
RET
CREAR_BLOQUE_TEXTO ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
CALCULAR_CCB PROC NEAR
PUSH CX
MOV CL, TAMAÑO_BLOQUE
MOV CH, 00H
MOV AL, [BX]
DEC CX
C1: INC BX
XOR AL, [BX]
LOOP C1
POP CX
RET
CALCULAR_CCB ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
CREAR_TRAMA_TEXTO PROC NEAR
PUSH AX
PUSH CX
;FIL
MOV AL, 55H
MOV[BX], AL
MOV[BX+1], AL
;SYNC
MOV AL, 16H
MOV[BX+2], AL
MOV[BX+3], AL
;SOH
MOV AL, 01H
MOV[BX+4], AL
;ENCABEZAMIENTO
MOV AL, TAMAÑO_BLOQUE
MOV[BX+5], AL
;STX
MOV AL, 02H
MOV[BX+6], AL
;TEXTO
MOV CL, TAMAÑO_BLOQUE
MOV CH, 00H
PUSH BX
ADD BX, 7
E1: MOV AL, [DI]
MOV[BX], AL
INC DI
INC BX
LOOP E1
POP BX
CMP BANDERA, 03H
JZ E2
MOV AL, 17H
MOV[BX+7+TAMAÑO_BLOQUE], AL
JMP E3
E2: MOV AL, 03H
MOV[BX+7+TAMAÑO_BLOQUE], AL
E3: ;CALCULAR CCB
PUSH BX
ADD BX, 7
CALL CALCULAR_CCB
POP BX
MOV[BX+7+TAMAÑO_BLOQUE+1], AL
MOV AL, 0FFH
MOV[BX+7+TAMAÑO_BLOQUE+2], AL
POP CX
POP AX
RET
CREAR_TRAMA_TEXTO ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
MOSTRAR_TEXTO PROC NEAR
PUSH AX
PUSH BX
PUSH CX
MO: MOV AL, [SI]
CMP AL, '$'
JZ THEEND
MOV AH, 09H
MOV BH, 00H
MOV BL, 0FH
MOV CX, 1
INT 10H
MOV AH, 03H
MOV BH, 00H
INT 10H
INC DL
CALL MOVER_CURSOR
INC SI
JMP MO
THEEND: POP CX
POP BX
POP AX
RET
MOSTRAR_TEXTO ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
MOVER_CURSOR PROC NEAR
PUSH AX
PUSH BX
MOV AH, 02H
MOV BH, 00H
INT 10H
POP BX
POP AX
RET
MOVER_CURSOR ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
CREAR_VISTA PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;DISEÑANDO VISTA
;IMPRIMIR CARTEL2
MOV DX, 0403H
CALL MOVER_CURSOR
CALL MOSTRAR_TEXTO
;IMPRIMIR CARTEL1
MOV DX, 0103H
CALL MOVER_CURSOR
MOV SI, OFFSET TEXTO1
CALL MOSTRAR_TEXTO
;IMPRIMIR CARTEL3
MOV DX, 0503H
CALL MOVER_CURSOR
MOV SI, OFFSET TEXTO8
CALL MOSTRAR_TEXTO
;IMPRIMIR LINEA SUPERIOR1
MOV DH, 00H
MOV DL, 00H
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 0DFH
MOV BH, 00H
MOV BL, 0EH
MOV CX, 79
INT 10H
;IMPRIMIR LINEA SUPERIOR2
MOV DH, 02H
MOV DL, 00H
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 0DCH
MOV BH, 00H
MOV BL, 0EH
MOV CX, 79
INT 10H
;IMPRIMIR LINEA INFERIOR
MOV DH, 29
MOV DL, 00H
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 0DCH
MOV BH, 00H
MOV BL, 0EH
MOV CX, 79
INT 10H
;IMPRIMIR LINEA IZQUIERDA
MOV DH, 0
MOV DL, 0
CALL MOVER_CURSOR
MOV CX, 30
V3: MOV AH, 09H
MOV AL, 0DDH
MOV BH, 00H
MOV BL, 0EH
PUSH CX
MOV CX, 1
INT 10H
MOV AH, 03H
MOV BH, 00H
INT 10H
INC DH
CALL MOVER_CURSOR
POP CX
LOOP V3
;IMPRIMIR LINEA DERECHA
MOV DH, 0
MOV DL, 79
CALL MOVER_CURSOR
MOV CX, 30
V4: MOV AH, 09H
MOV AL, 0DEH
MOV BH, 00H
MOV BL, 0EH
PUSH CX
MOV CX, 1
INT 10H
MOV AH, 03H
MOV BH, 00H
INT 10H
INC DH
CALL MOVER_CURSOR
POP CX
LOOP V4
POP DX
POP CX
POP BX
POP AX
RET
CREAR_VISTA ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
CREAR_MENSAJE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;DISEÑANDO VISTA
;IMPRIMIR CARTEL1
MOV DH, 14
MOV DL, 32
CALL MOVER_CURSOR
CALL MOSTRAR_TEXTO
;IMPRIMIR LINEA SUPERIOR
MOV DH, 10
MOV DL, 20
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 0DFH
MOV BH, 00H
MOV BL, 0CH
MOV CX, 40
INT 10H
;IMPRIMIR LINEA INFERIOR
MOV DH, 17
MOV DL, 20
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 0DCH
MOV BH, 00H
MOV BL, 0CH
MOV CX, 40
INT 10H
;IMPRIMIR LINEA IZQUIERDA
MOV DH, 10
MOV DL, 20
CALL MOVER_CURSOR
MOV CX, 8
VM3: MOV AH, 09H
MOV AL, 0DDH
MOV BH, 00H
MOV BL, 0CH
PUSH CX
MOV CX, 1
INT 10H
MOV AH, 03H
MOV BH, 00H
INT 10H
INC DH
CALL MOVER_CURSOR
POP CX
LOOP VM3
;IMPRIMIR LINEA DERECHA
MOV DH, 10
MOV DL, 60
CALL MOVER_CURSOR
MOV CX, 8
VM4: MOV AH, 09H
MOV AL, 0DEh
MOV BH, 00H
MOV BL, 0CH
PUSH CX
MOV CX, 1
INT 10H
MOV AH, 03H
MOV BH, 00H
INT 10H
INC DH
CALL MOVER_CURSOR
POP CX
LOOP VM4
;LAZO DE TIEMPO
MOV AX, 60000
LT2: MOV CX, 60000
LT1:
LOOP LT1
DEC AX
CMP AX, 0
JNZ LT2
POP DX
POP CX
POP BX
POP AX
CALL LIMPIAR_MENSAJE
RET
CREAR_MENSAJE ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
LIMPIAR_PANTALLA PROC NEAR
PUSH AX
PUSH CX
PUSH DX
MOV DX, 00H
CALL MOVER_CURSOR
MOV AH, 0EH
MOV AL, 20H
MOV CX, 2400
LI: INT 10H
LOOP LI
MOV DX, 00H
CALL MOVER_CURSOR
POP DX
POP CX
POP AX
RET
LIMPIAR_PANTALLA ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
LIMPIAR_MENSAJE PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
;IMPRIMIR CARTEL1
MOV DH, 14
MOV DL, 32
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 20H
MOV BH, 00H
MOV BL, 0CH
MOV CX, 40
INT 10H
;IMPRIMIR LINEA SUPERIOR
MOV DH, 10
MOV DL, 20
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 20H
MOV BH, 00H
MOV BL, 0CH
MOV CX, 40
INT 10H
;IMPRIMIR LINEA INFERIOR
MOV DH, 17
MOV DL, 20
CALL MOVER_CURSOR
MOV AH, 09H
MOV AL, 20H
MOV BH, 00H
MOV BL, 0CH
MOV CX, 40
INT 10H
;IMPRIMIR LINEA IZQUIERDA
MOV DH, 10
MOV DL, 20
CALL MOVER_CURSOR
MOV CX, 8
LM3: MOV AH, 09H
MOV AL, 20H
MOV BH, 00H
MOV BL, 0CH
PUSH CX
MOV CX, 1
INT 10H
MOV AH, 03H
MOV BH, 00H
INT 10H
INC DH
CALL MOVER_CURSOR
POP CX
LOOP LM3
;IMPRIMIR LINEA DERECHA
MOV DH, 10
MOV DL, 60
CALL MOVER_CURSOR
MOV CX, 8
LM4: MOV AH, 09H
MOV AL, 20h
MOV BH, 00H
MOV BL, 0CH
PUSH CX
MOV CX, 1
INT 10H
MOV AH, 03H
MOV BH, 00H
INT 10H
INC DH
CALL MOVER_CURSOR
POP CX
LOOP LM4
POP DX
POP CX
POP BX
POP AX
RET
LIMPIAR_MENSAJE ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
ENCENDER_PROCESO PROC NEAR
PUSH DX
PUSH AX
;PALABRA DE CONTROL AL TEMPORIZADOR 8255
MOV DX, 0303H
MOV AL, 80H
OUT DX, AL
;HABILITAR (PC0)
MOV DX, 0303H
MOV AL, 01H
OUT DX, AL
;ACTIVAR RESISTENCIA (PC1)
MOV DX, 0303H
MOV AL, 03H
OUT DX, AL
;PONER SIEMPRE EN CERO (PC3)
MOV DX, 0303H
MOV AL, 06H
OUT DX, AL
;GENERAR UN PULSO PARA ESTABLECER LOS VALORES (PC2)
MOV DX, 0303H
MOV AL, 05H
OUT DX, AL
;
MOV DX, 0303H
MOV AL, 04H
OUT DX, AL
PUSH AX
PUSH DX
RET
ENCENDER_PROCESO ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
APAGAR_PROCESO PROC NEAR
PUSH DX
PUSH AX
;PALABRA DE CONTROL AL TEMPORIZADOR 8255
MOV DX, 0303H
MOV AL, 80H
OUT DX, AL
;DESHABILITAR (PC0)
MOV DX, 0303H
MOV AL, 00H
OUT DX, AL
;ACTIVAR RESISTENCIA (PC1)
MOV DX, 0303H
MOV AL, 03H
OUT DX, AL
;PONER SIEMPRE EN CERO (PC3)
MOV DX, 0303H
MOV AL, 06H
OUT DX, AL
;GENERAR UN PULSO PARA ESTABLECER LOS VALORES (PC2)
MOV DX, 0303H
MOV AL, 05H
OUT DX, AL
;
MOV DX, 0303H
MOV AL, 04H
OUT DX, AL
PUSH AX
PUSH DX
RET
APAGAR_PROCESO ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
BUSCAR_SECUENCIA_DE_CARACTERES PROC NEAR
INC SI
MOV AL, [SI]
CMP AL, 'x'
JNZ BSCF
DEC SI
MOV AL, [SI]
CMP AL, 'a'
JZ BSCA
MOV AL, [SI]
CMP AL, 'e'
JZ BSCE
JMP BSCF
BSCA: MOV AL, 00H
RET
BSCE: MOV AL, 01H
RET
BSCF: MOV AL, 03H
RET
BUSCAR_SECUENCIA_DE_CARACTERES ENDP
;---------------------------------------------------------------------------------------------------------------------------------------
CODE ENDS
END PRINCIPAL
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment