mirror of https://github.com/zxdos/zxuno.git
				
				
				
			
		
			
				
	
	
		
			158 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			NASM
		
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			NASM
		
	
	
	
| ;;===================================================================================
 | |
| ;; EJEMPLO
 | |
| ;;
 | |
| ;;    Pintar un pixel de color rojo en la pantalla del Amstrad CPC
 | |
| ;; modificando directamente la memoria de vídeo.
 | |
| ;;
 | |
| ;; * Código para cargar y ejecutar en WinAPE
 | |
| ;; * Explicación del ejemplo, uso, ejercicios y retos después del código.
 | |
| ;;===================================================================================
 | |
| 
 | |
| org &4000         ;; Direccion de memoria &4000 (16384)
 | |
|                   ;; Todo el codigo se guardará a partir de ahi
 | |
| 
 | |
| ld a, %10001000   ;; Poner el valor %10001000 en el registro A (A = %10001000)
 | |
|                   ;; %10001000 es un número binario equivalente al número 132 decimal
 | |
| 
 | |
| ld (&C000), a     ;; Guardar el valor del registro A en la direccion &C000 de memoria
 | |
|                   ;; Después de esta instrucción, la posición &C000 tendrá almacenado
 | |
|                   ;; el valor %10001000, que es lo que hay ahora almacenado en A.
 | |
| 
 | |
| ret               ;; Devolver el control a quien nos haya invocado
 | |
| 
 | |
| ;;===================================================================================
 | |
| ;;
 | |
| ;;;;;;INSTRUCCIONES DE USO
 | |
| ;;
 | |
| ;;    * Ejecuta el emulador WinAPE (http://www.winape.net)
 | |
| ;;    * Pulsa F3 para abrir el editor de código fuente
 | |
| ;;    * Crea un nuevo fichero con File/New y copia el código de este ejemplo
 | |
| ;;       - (Alternativamente, abre este fichero con File/Open)
 | |
| ;;    * Pulsa F9 para ensamblar el código en la dirección &4000 de memoria
 | |
| ;;    * Cierra el editor y teclea CALL &4000 en el Amstrad CPC para ejecutar
 | |
| ;;
 | |
| ;;    NOTAS IMPORTANTES: 
 | |
| ;;
 | |
| ;;       1. Cada vez que modifiques el código en el editor, deberás pulsar F9 
 | |
| ;;       para ensamblar. Si no lo haces, tus cambios no se introducirán en 
 | |
| ;;       la memoria del Amstrad CPC. Presta atención cuando lo hagas porque
 | |
| ;;       si has cometido algún error, aparecerá indicado.
 | |
| ;;
 | |
| ;;       2. Cuando llenes la pantalla poniendo CALL &4000 varias veces, las
 | |
| ;;       letras se desplazarán hacia arriba. En ese momento, escribe MODE 1
 | |
| ;;       para limpiar la pantalla. De lo contrario, la posición de memoria 
 | |
| ;;       &C000 ya no se referirá a los 4 primeros píxeles de pantalla.
 | |
| ;;
 | |
| ;;;;;;EJERCICIOS
 | |
| ;;
 | |
| ;;    1. Cambia la instrucción "ld a, %10001000" por las siguientes variantes
 | |
| ;; y comprueba lo que sucede con el píxel 0 de pantalla en cada caso.
 | |
| ;;
 | |
| ;;       * ld a, %00000000
 | |
| ;;       * ld a, %00001000
 | |
| ;;       * ld a, %10000000
 | |
| ;;       * ld a, %10001000
 | |
| ;;
 | |
| ;;       - Presta atención a los 2 únicos bits que se han modificado en el 
 | |
| ;;       ejercicio anterior. Esos dos bits (el bit 7 y el bit 3) son los que 
 | |
| ;;       almacenan el color del píxel 0. Sólo hay 4 combinaciones para estos
 | |
| ;;       2 bits: 00, 01, 10, 11. Por tanto, sólo hay 4 colores distintos.
 | |
| ;;
 | |
| ;;    2. Siguiendo la lógica del ejercicio 1, los bits 6 y 2 almacenan el 
 | |
| ;; color del píxel 1. Modifica 4 veces el código para conseguir pintar el 
 | |
| ;; píxel 1 de los 4 colores posibles, uno cada vez.
 | |
| ;;
 | |
| ;;    3. Haz pruebas y descubre qué 2 bits guardan el color del píxel 2,
 | |
| ;; y qué otros dos guardan el color del píxel 3.
 | |
| ;;
 | |
| ;;;;;;RETOS INICIALES
 | |
| ;;
 | |
| ;;    1. Pinta 2 píxeles, el 0 y el 3, de distinto color. Los píxeles
 | |
| ;;       1 y 2 deben quedar del color del fondo.
 | |
| ;;    2. Pinta una línea de color amarillo con los 4 primeros píxeles
 | |
| ;;       de pantalla.
 | |
| ;;    3. Pinta los 4 primeros píxeles de pantalla, uno de cada color.
 | |
| ;;
 | |
| ;;;;;;DIRECTIVAS USADAS
 | |
| ;;
 | |
| ;;    - org :DIRECCIÓN:       >> Establece el ORiGen: posición de memoria donde
 | |
| ;;                            el código de este programa se empezará a escribir
 | |
| ;;
 | |
| ;;;;;;INSTRUCCIONES USADAS
 | |
| ;;
 | |
| ;;    - LD  A, :NÚMERO:       >> Introduce un número en el registro A (Acumulador)
 | |
| ;;                            del procesador.
 | |
| ;;
 | |
| ;;    - LD (:DIRECCIÓN:), A   >> Guarda el valor del registro A en la :DIRECCIÓN:
 | |
| ;;                            de memoria indicada.
 | |
| ;;
 | |
| ;;    - RET                   >> Devolver el control al código que nos llamó 
 | |
| ;;                            inicialmente
 | |
| ;;
 | |
| ;;;;;;EXPLICACIÓN
 | |
| ;;
 | |
| ;;    Los monitores de Amstrad CPC se refrescan (cambian su contenido)
 | |
| ;; 50 veces por segundo. Cada vez que lo hacen, leen de la memoria del
 | |
| ;; ordenador qué colores deben ser pintados en cada píxel. 
 | |
| ;;
 | |
| ;;    Pintar un píxel es tan sencillo como modificar la zona de memoria
 | |
| ;; donde se guarda el color que debe tener ese píxel. Esta zona depende
 | |
| ;; del MODO de vídeo en que se encuentre el Amstrad CPC. En MODO 1 (el 
 | |
| ;; modo por defecto) hay 320x200 píxeles y cada píxel utiliza 2 bits
 | |
| ;; de memoria para almacenarse.
 | |
| ;;
 | |
| ;;    La zona de memoria donde se almacenan todos esos colores empieza
 | |
| ;; en la dirección &C000 (49152), y termina en la dirección &FFFF (66535). 
 | |
| ;; Cada posición de memoria tiene 8 bits (1 byte) por lo que guarda 
 | |
| ;; 4 píxeles (2 bits para cada uno). 
 | |
| ;;
 | |
| ;;    Por ejemplo, como hemos visto en el ejercicio, el byte de la 
 | |
| ;; dirección &C000 guarda los 4 primeros píxeles de pantalla. El byte
 | |
| ;; siguiente (dirección &C001) guardará los 4 siguientes, etcétera.
 | |
| ;;
 | |
| ;;    Los bits que corresponden a cada píxel tienen un órden particular,
 | |
| ;; como puede verse en el siguiente diagrama:
 | |
| ;;
 | |
| ;;    1 Byte, 8 bits, 4 píxeles: [########], cada # puede ser un 0 o un 1.
 | |
| ;;                                76543210  <- número de bit
 | |
| ;;
 | |
| ;;       * Píxel 0, bits 3 y 7: [_###_###]
 | |
| ;;       * Píxel 1, bits 2 y 6: [#_###_##]
 | |
| ;;       * Píxel 2, bits 1 y 5: [##_###_#]
 | |
| ;;       * Píxel 3, bits 0 y 4: [###_###_]
 | |
| ;;
 | |
| ;;    Supongamos que guardamos el valor %01011011 en la posición &C000. 
 | |
| ;; ¿Qué color tendrá cada píxel?
 | |
| ;;
 | |
| ;;       * Píxel 0, bits 3 y 7: [0###1###] = %10 = Color 2
 | |
| ;;       * Píxel 1, bits 2 y 6: [#1###0##] = %01 = Color 1
 | |
| ;;       * Píxel 2, bits 1 y 5: [##0###1#] = %10 = Color 2
 | |
| ;;       * Píxel 3, bits 0 y 4: [###1###1] = %11 = Color 3
 | |
| ;;
 | |
| ;;    Es importante indicar que los bits se leen de derecha a izquierda, 
 | |
| ;; y por eso [0###1###] corresponde al valor %10 en binario (2 en decimal).
 | |
| ;;       
 | |
| ;;;;;;RETOS CREATIVOS
 | |
| ;;
 | |
| ;;    1. Prueba a colorear a tu gusto la primera línea de la pantalla.
 | |
| ;;       Necesitarás añadir más código para ir pintando los 160 píxeles
 | |
| ;;       que tiene.
 | |
| ;;
 | |
| ;;    2. Prueba a colorear los píxeles siguientes a la primera línea
 | |
| ;;       de pantalla y observa en qué línea aparecen. 
 | |
| ;;
 | |
| ;;    3. Rellena toda la pantalla de un mismo color (o de varios, a tu
 | |
| ;;       gusto). Recuerda que debes rellenar desde &C000 hasta &FFFF.
 | |
| ;;       Observa cómo se rellena la memoria cuando ejecutes.
 | |
| ;;
 | |
| ;;    4. Ve rellenando las líneas de pantalla una por una y fíjate
 | |
| ;;       en qué posición ocupan. Intenta hacerte un mapa o una tabla
 | |
| ;;       para saber qué direcciones usar cuando quieras pintar en una
 | |
| ;;       línea concreta de la pantalla.
 | |
| ;;
 | |
| ;;    5. Intenta hacer un pequeño dibujo (de 4x4 píxeles o de 8x8, por
 | |
| ;;       ejemplo). Con esto puedes poner a prueba el mapa o tabla que 
 | |
| ;;       has elaborado en el anterior reto.
 | |
| ;;
 | |
| ;;===================================================================================
 |