<-Informática\ensamblador 80x86...
Ejemplo 4 En este último programa nos vamos a centrar en el funcionamiento del controlador alfanumérico para generar los caracteres de barrido. La rutina que vamos a crear simulara este comportamiento mostrando en el centro de la pantalla una secuencia de cuatro cuadros de 8x8 caracteres alfanuméricos que simularan a un atleta corriendo, para ello accederemos a la memoria de video y escribiremos los caracteres a escribir en pantalla.Para la realización de este programa hay que considerar: a)El primer banco de memoria de la memoria de video comienza en la posición B800:0 y el primer byte de este se corresponde con el 1º caracter de la pantalla, posición 0,0 (arriba izquierda) y el 2º su atributo Datos segment man DB 12h, 14h, 78h, 90h, 1ch, 0e3h, 0h, 0h DB 10h, 10h, 3eh, 50h, 10h, 24h, 22h, 42h DB 10h, 10h, 30h, 38h, 34h, 10h, 10h, 28h DB 10h, 10h, 3eh, 50h, 10h, 24h, 22h, 42h Datos ends Pila segment stack db 100 dup (0) Pila Ends Codigo segment Assume ds:datos, ss:pila, cs:codigo ;*********************************************************** ;* Nombre: Ppal * ;* Descripción: visualiza en el medio de la pantalla una * ;* secuencia de 4 cuadrados que se repite 10 veces, en * ;* la que se simula la silueta de un atleta corriendo. * ;*********************************************************** ppal proc far push ds xor ax, ax push ax mov ax, datos mov ds, ax mov ax, 0b800h mov es, ax ;Inicio de la memoria gr fica mov ah, 00010010b ;Atributos mov bh, 10 ;Contador de secuencias secuen: mov si, 0 ;Desplazamiento dentro de los datos mov bl, 4 ;Contador de cuadros cuadro: mov di, 8*160+36*2 ;Posicion dentro de la memoria mov cx, 8 ;Contador de filas linea: mov dl, 8 ;Contador de desplazamientos mov dh, ds:man[si] desp : shl dh, 1 ;Desplazar Dh 1 posición a la izq jnc pintab ;No acarreo = pintar blanco pinta@: mov al, '@' ;Se pintara '@' jmp salta pintab: mov al, ' ' ;Se pintara ' ' salta: mov es:[di], ax ;Pintar en pantalla caracter add di, 2 ;Siguiente posicion en memoria grafica sub dl, 1 ;Decrementar desplazamientos jnz desp ; Si no es cero saltar a desp add di, 144 ;Siguiente pos. en mem. grafica. Linea nueva. inc si ;Nuevo dato loop linea ;Decrementar Cx y saltar a linea si no es 0 jmp espera ;Esperar un momento sub bl, 1 ;Decrementar numero de cuadros jnz cuadro ;Si es 0 saltar a cuadro sub bh, 1 ;Decrementar numero de secuencias jnz secuen ;Si no es 0 saltar a secuen. ret ppal endp ;************************************************* ;* Nombre: espera * ;* Descripción: a partir de dos bucles anidados * ;* creamos una función que pierde tiempo y así * ;* poder ver los cuadros. * ;************************************************* espera proc far push cx push ax mov cx, 1000 bucl2: mov ax, 100 bucl3: dec ax jnz bucl3 dec cx jnz bucl2 pop ax pop cx ret espera endp codigo ends End ppal |