205 lines
6.1 KiB
NASM
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
|
|
|