ASM/LETRERO.ASM
2021-09-03 17:40:06 +02:00

205 lines
6.1 KiB
NASM

Codigo segment
assume cs:Codigo, ds:Datos, ss:Pila
display_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,4c00h ;no exit back to DOS
int 21h ;DOS interrupt
display_frase endp ;--------------------------------------------
; Funci¢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¢n X
; 2 posici¢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¢n dentro de la cadena
; 1 posici¢n en el byte
; 8 FUTURA AMPLIACIàN
;
; AX si 1, inicializa nuestra informacion
;
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¢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 BP, [ SI + F6h ] ; posicion dentro de la cadena
add BP, SI ; posicion del digito a procesar
mov AL, [BP] ; 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:
; **************************
mov DH, 0
mov DL, CH
add AX, DX
; 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 BP, [ SI + F6h ] ; posicion dentro de la cadena
add BP, SI ; posicion del digito a procesar
mov AL, [BP] ; 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
Codigo ends
Datos segment para public 'data'
dir_fuentes qb FFFF0000h
mi_estruct db 'Esto solo es una prueba, de mi primer programa en Assembly JD $ 000018000000000000'
Datos ends
Pila segment stack 'stack'
db 1000 dup (0)
Pila ends
end