Ensamblador - Reloj Ensamblador

 
Vista:

Reloj Ensamblador

Publicado por yo (1 intervención) el 15/05/2006 17:34:34
hola, tengo que entregar una practica el miercoles en la universidad en ensamblador, la tengo hecha a falta de implementar el reloj interno del sistema para que se vea en el programa, teneis idea de como se hace en ensamblador.
gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 1
Ha aumentado su posición en 2 puestos en Ensamblador (en relación al último mes)
Gráfica de Ensamblador

RE:Reloj Ensamblador

Publicado por walter (19 intervenciones) el 19/05/2006 16:42:23
La verdad no lo pude probar aún por razones de tiempo pero igual te paso el código que tengo.

; reloj25.asm: Reloj Gigante

main mov ah, 0fh ; get video mode
int 10h
push ax ; al=current video mode
call video ; video en pag #1 sin cursor
call loc_rom_chr ; apuntador a bitmap de digitos 0-9
call paint ; dibuja reloj hasta pulsar tecla 'esc'
pop ax
mov modo, al ; restablece modo video
mov pag, 0 ; restablece pag #0
mov cursor, 0607h ; restablece cursor
call video ; .. en rutina video
mov ax, 4c00h
int 21h ; fin: regresa a DOS

video mov ah, 00h ; set video mode
mov al, [offset(modo)] ; modo=80x25x16 p/reloj
int 10h
mov ah, 05h ; select page
mov al, [offset(pag)] ; no. pag.
int 10h
mov ah, 01h ; set cursor type (Jump-274)
mov cx, [offset(cursor)] ; ch=inicio, cl=final
int 10h
ret

loc_rom_chr ; out: cx=bytes/chr, dl=rows/chr,
es:bp=inicio-bitmap
mov ah, 11h ; (Brey-721)
mov al, 30h
mov bh, 3 ; bitmap 8x8 / chr
int 10h
ret

paint cld ; auto-incremento(si)
add bp, 180h ; start='0'=es:bp+(48*8=180h)
mov digitos, bp ; graba loc. inicio bitmap-digitos
@again call delay ; retardo < 1 seg
call gettime ; lee reloj del sistema
call prtdig ; imprime digitos del reloj
call getch
jnz @again
ret

prtdig mov count, 0 ; Imprime reloj gigante (99:99:99)
mov lim_x, pos_x ; pos-x inicial
@30 mov si, [offset(count)] ; digito a imprimir en BCD
mov al, 8 ; factor multiplicativo (8 bytes/chr)
mul byte [si+offset(hr)] ; ax=[hr+count]*8
mov si, [offset(digitos)] ; apunta a inicio de bitmap
add si, ax ; si=digitos+dig*8
dec si ; ajuste(-1): extra-renglon-0
mov ycoord, pos_y-2 ; ajuste(-2): extra-renglon-0
call pr1dig ; imprime un digito de reloj
inc count ; sig. digito
cmp count, no_digitos ; mas digitos?
jb @30
ret

@40 sub lim_x, 8 ; ajuste para obtener min-x
pr1dig mov al, [offset(lim_x)] ; imprime un digito a la vez
mov xcoord, al ; xcoord = min-x
add lim_x, 8 ; max-x = min-x + 8
es:
lodsb ; al=bitmap(es:si++)
mov pels, al ; pels = 8 pixeles
@50 call gotoxy ; posiciona cursor
mov al, [offset(pels)] ; recarga bitmap
and al, pos ; z=0 si bit(pos)=1 en al
ror pos, 1 ; prepara siguiente bit
mov al, pixel ; si bit=1 imprime ascii(178)
jnz @60 ; bit=1?
mov al, 32 ; si bit=o imprime espacio
@60 push ax
call putch ; imprime pixel-gigante
inc ycoord ; inicia: renglon-doble
call gotoxy
pop ax
call putch
dec ycoord ; termina: renglon-doble
inc xcoord ; sig. columna
mov dl, lim_x ; ultima columna?
cmp xcoord, dl
jb @50
add ycoord, 2 ; sig. renglon
cmp ycoord, pos_y+16 ; ultimo renglon?
jb @40
ret

gotoxy mov ah, 02h ; input: coord(x=dl,y=dh)
mov bh, [offset(pag)] ; pag
mov dl, xcoord
mov dh, ycoord
int 10h
ret

putch mov ah, 09h ; al=ascii
mov bl, color
mov bh, [offset(pag)] ; pag
mov cx, 1 ; repeticiones
int 10h
ret

getch mov ah, 0bh ; keyb status: al=ff/00=key/no-key (Jump-53)
int 21h
cmp al, ffh ; tecla plusada?
jnz @nokey
mov ah, 10h ; out: al=ASCII (Abel-188)
int 16h
cmp al, escape ; terminar?
@nokey ret

delay mov cx, 1fffh ; OJO: Retardo sensitivo a velocidad del CPU!!
@70 push cx
@80 loop @80
pop cx
loop @70
ret

gettime mov ah, 2ch ; out: hr, min, seg
int 21h ; out: ch=hr, cl=min, dh=seg,
dl=1/100seg
mov al, ch ; get hr
aam ; a BCD (ah=centenas, al=decenas)
mov [offset(hr)+0], ah ; set hr
mov [offset(hr)+1], al
mov al, cl ; get min
aam ; a BCD
mov [offset(min)+0], ah ; set min
mov [offset(min)+1], al
mov al, dh ; get seg
aam ; a BCD
mov [offset(seg)+0], ah ; set seg
mov [offset(seg)+1], al
ret

escape equ 27 ; tecla 'esc' para finalizar programa
pixel equ 178 ; 15,178,224 caracter ascii a imprimir si pixel=1
color equ 00011110b ; color: fondo=azul, letra=amarilla
pos_x equ 7 ; columna inicial
pos_y equ 5 ; renglon inicial
no_digitos equ 8 ; numero de digitos gigantes del reloj '99:99:99'

modo db 3 ; Texto: 80x25x16
cursor dw ffffh ; cursor-off
pag db 1 ; pagina #1

digitos dw ? ; offset del apuntador a bitmap del 0-9 en ROM-BIOS
count dw ? ; contador de digitos del reloj impresos
pels db ? ; mapa de 8 bits (un renglon de un caracter)
pos db 10000000b ; mascara para sensar un bit en una posicion dada

lim_x db ? ; posicion x-inicial y x-final del cursor
xcoord db ? ; posicion-x actual del cursor
ycoord db ? ; posicion-y actual del cursor

hr dw ? ; Horas (BCD)
sep1 db 10 ; ':' = BCD a ASCII = 10+48 = 58
min dw ? ; Minutos (BCD)
sep2 db 10 ; ':'
seg dw ? ; Segundos (BCD)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar