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