First commit 06/07/1996
This commit is contained in:
200
LETRERO.JD
Normal file
200
LETRERO.JD
Normal file
@ -0,0 +1,200 @@
|
||||
NAME JD
|
||||
PAGE 60, 130
|
||||
TITLE 'MI PRIMER PROGRAMA EN ASM -->JD'
|
||||
|
||||
|
||||
UNICO SEGMENT PARA PUBLIC 'CODE'
|
||||
|
||||
ORG 0100H
|
||||
|
||||
ASSUME CS:UNICO, DS:UNICO, ES:UNICO, SS:UNICO
|
||||
|
||||
|
||||
|
||||
mi_estruct db "Esto solo es una prueba, de mi primer programa en Assembly JD $ 000018000000000000"
|
||||
|
||||
|
||||
diplay_frase PROC near
|
||||
|
||||
mov AX, 1
|
||||
mov SI, OFFSET mi_estruct
|
||||
CALL letrero_digital
|
||||
|
||||
mov CX, FFFFh
|
||||
|
||||
continua_un_rato:
|
||||
|
||||
push CX
|
||||
|
||||
mov AX, 0
|
||||
CALL letrero_digital
|
||||
|
||||
pop CX
|
||||
|
||||
loop continua_un_rato
|
||||
|
||||
mov AX, 04c00h
|
||||
int 21h
|
||||
|
||||
display_frase endp
|
||||
|
||||
|
||||
; Funci<63>n para generar un letrero digital 100 % ASM
|
||||
;
|
||||
; Entradas:
|
||||
; SI ptr a las estructura de datos 256 bytes
|
||||
;
|
||||
; 237 cadena a mostrar en el letrero: el final es $
|
||||
; 2 posici<63>n X
|
||||
; 2 posici<63>n Y
|
||||
; 1 (1nibble Escala X | 2nibble Escala Y )
|
||||
; 1 n<>mero de d<>gitos a mostrar en pantalla
|
||||
; 1 color de fondo
|
||||
; 1 color principal
|
||||
; -----------------------------------------------
|
||||
; 1 posici<63>n dentro de la cadena
|
||||
; 1 posici<63>n en el byte
|
||||
; 8 FUTURA AMPLIACI<43>N
|
||||
;
|
||||
; AX si 1, inicializa nuestra informacion
|
||||
;
|
||||
|
||||
dir_fuentes db 4 DUP (0)
|
||||
|
||||
|
||||
letrero_digital PROC near
|
||||
|
||||
|
||||
cmp AX, 1 ; si no hay que inicializar nada,
|
||||
jne generar_digitos ; empezamos a generar los d<>gitos
|
||||
|
||||
mov AX, 1130h ; obtenemos la direccion del juego
|
||||
mov BH, 03h ; de caracteres 8x8 de la ROM ( 0 - 127 )
|
||||
int 10h ; Funci<63>n de video 10h
|
||||
|
||||
mov dir_fuentes, ES ; guardamos el segmento en dir_fuentes
|
||||
mov dir_fuentes+2, BP ; guardamos el offset en dir_fuentes
|
||||
|
||||
mov [SI + F6h], 0 ; posicion dentro de la cadena <-- 0
|
||||
mov [SI + F7h], 0 ; posicion dentro del byte <------ 0
|
||||
|
||||
generar_digitos:
|
||||
|
||||
|
||||
mov BH, [ SI + F3h ] ; n<> de digitos a mostar
|
||||
|
||||
push [ SI + F6h ] ; guardo el contenido original de la pos.
|
||||
|
||||
mov AX, [ SI + F6h ] ; posicion dentro de la cadena
|
||||
add AX, SI ; posicion del digito a procesar
|
||||
mov AL, [AX] ; digito a procesar
|
||||
|
||||
nuevo_digito:
|
||||
|
||||
mov AH, 0
|
||||
mov CL, 3 ; multiplico por 8 AX para tener la
|
||||
shl AX, CL ; posicion dentro de la ROM
|
||||
|
||||
add AX, dir_fuentes+2 ; cargo AX con la direccion de la letra
|
||||
|
||||
mov CH, 0 ; recorre las 8 filas ( 0 - 7 )
|
||||
|
||||
siguiente_fila:
|
||||
|
||||
add AX, CH ; direccion por fila de la letra a recorrer
|
||||
mov BL, dir_fuentes:[AX]; colocamos en BL la fila del digito a tratar
|
||||
|
||||
mov CL, 8 ; recorre los 8 puntos horizontales
|
||||
|
||||
sigue_horizontal:
|
||||
|
||||
; ************************** muestro en (x,y) un punto o un espacio
|
||||
push AX push BX push CX
|
||||
|
||||
mov DH, [SI+238] ; coordenada x inicial
|
||||
mov DL, [SI+240] ; coordenada y inicial
|
||||
|
||||
add DL, CH ; coordenada y final
|
||||
|
||||
mov AL, [SI+F3] ; n<> de digitos a mostar
|
||||
sub AL, BH ; ndm - digitos que quedan = digitos mostrados
|
||||
|
||||
mov CL, 3 ;
|
||||
shl AL, CL ; multiplico por 8 los digitos mostrados
|
||||
|
||||
add DH, AL ; coordenada y final
|
||||
|
||||
mov AH, 02h
|
||||
mov BH, 1h
|
||||
int 10h
|
||||
|
||||
pop CX pop BX pop AX
|
||||
; ************************** muestro en (x,y) un punto o un espacio
|
||||
; ************************** muestro en (x,y) un punto o un espacio
|
||||
push AX push BX push CX
|
||||
|
||||
shl BL, 1 ; dezplaza 1 bit a la izquierda
|
||||
|
||||
jc punto_letrero_on
|
||||
|
||||
mov AL, 32d
|
||||
|
||||
jmp fin_punto
|
||||
|
||||
punto_letrero_on:
|
||||
|
||||
mov AL, 43d
|
||||
|
||||
fin_punto:
|
||||
|
||||
mov AH, 0Ah
|
||||
mov BH, 1h
|
||||
mov CX, 1h
|
||||
int 10h
|
||||
|
||||
pop CX pop BX pop AX
|
||||
; ************************** muestro en (x,y) un punto o un espacio
|
||||
|
||||
dec CL ;
|
||||
jnz sigue_horizontal ; continua hasta los 8 bit's
|
||||
|
||||
inc CH ;
|
||||
cmp CH, 8 ;
|
||||
jne siguiente_fila ; procesa las 8 filas
|
||||
|
||||
inc [ SI + F6h ] ; inc el puntero de posicion
|
||||
|
||||
mov AX, [ SI + F6h ] ; posicion dentro de la cadena
|
||||
add AX, SI ; posicion del digito a procesar
|
||||
mov AL, [AX] ; digito a procesar
|
||||
|
||||
|
||||
inc [SI + F6h] ; inc la posicion dentro de la frase
|
||||
cmp AL, '$' ; si no fin de frase continuo normalmente
|
||||
jne es_fin_frase ;
|
||||
mov [SI + F6h], 0 ; si no, posicion de frase == 0
|
||||
|
||||
es_fin_frase:
|
||||
|
||||
dec BH ; solo visualiza los digitos que manda el
|
||||
jnz nuevo_digito ; usuario.
|
||||
|
||||
pop [ SI + F6h ] ; restauro el contenido original de la pos.
|
||||
|
||||
inc [ SI + F6h ] ; actualizo la rotacion para la proxima vez
|
||||
cmp AL, '$' ;
|
||||
je frase_rotada ;
|
||||
mov [ SI + F6h ], 0 ;
|
||||
|
||||
frase_rotada:
|
||||
|
||||
RET ; regreso de la llamada
|
||||
|
||||
letrero_digital endp
|
||||
|
||||
|
||||
|
||||
|
||||
UNICO ends
|
||||
|
||||
end
|
Reference in New Issue
Block a user