<-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