tutorial_sms
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
tutorial_sms [2009/11/29 17:26] – xzakox | tutorial_sms [2013/11/10 18:36] (current) – [Explicación] zako | ||
---|---|---|---|
Line 5: | Line 5: | ||
Empezamos con el código fuente de nuestro pequeño programa de ejemplo: | Empezamos con el código fuente de nuestro pequeño programa de ejemplo: | ||
{{: | {{: | ||
- | |||
Que muestra por pantalla el logo de vieju.net, espera que pulsemos el boton 1 del pad y borra la pantalla. | Que muestra por pantalla el logo de vieju.net, espera que pulsemos el boton 1 del pad y borra la pantalla. | ||
+ | |||
+ | Para generar una rom binaria a partir de este código, con el wla-dx: | ||
+ | |||
+ | < | ||
+ | wla-z80 -oi prueba.asm | ||
+ | wlalink prueba.link prueba.sms | ||
+ | </ | ||
+ | |||
+ | Necesitaremos un archivo prueba.link con el siguiente contenido: | ||
+ | < | ||
+ | [objects] | ||
+ | prueba.o | ||
+ | </ | ||
+ | |||
+ | Además necesitaremos los archivos de tiles, mapa y paleta: {{: | ||
===== Explicación ===== | ===== Explicación ===== | ||
Vamos diseccionando el programa parte por parte. | Vamos diseccionando el programa parte por parte. | ||
- | Para empezar, comentar que en ensamblador los numeros decimales se escriben tal cual, los hexadecimales precedidos por $ ($12he) y los binarios precedidos por % (%10011011). | + | Para empezar, comentar que en ensamblador los numeros decimales se escriben tal cual, los hexadecimales precedidos por $ ($12fe) y los binarios precedidos por % (%10011011). |
<code asm> | <code asm> | ||
Line 73: | Line 87: | ||
Ya empieza lo interesante. Para comenzar, apuntamos la pila a una de las últimas direcciones de la RAM interna. La SMS tiene 8KB ($1fff) de RAM entre las direcciones $c000-$dfff. Asi que apuntamos la pila a $dff0, dejando 16 bytes al final para otras cosas. //sp// es el registro de pila, que contiene la dirección actual del último elemento apuntado en la pila. | Ya empieza lo interesante. Para comenzar, apuntamos la pila a una de las últimas direcciones de la RAM interna. La SMS tiene 8KB ($1fff) de RAM entre las direcciones $c000-$dfff. Asi que apuntamos la pila a $dff0, dejando 16 bytes al final para otras cosas. //sp// es el registro de pila, que contiene la dirección actual del último elemento apuntado en la pila. | ||
- | Como la pila es decreciente (cuando insertas un valor, SP decrece), no tendremos problemas en que se desborde (a no ser que metamos mas de 8192-8 bytes en ella!). | + | Como la pila es decreciente (cuando insertas un valor, SP decrece), no tendremos problemas en que se desborde (a no ser que metamos mas de 8192-16 bytes en ella!). |
- | Ahora vamos con algo más complicado. Inicializar el VDP, el chip gráfico de la SMS. Al final del programa tenemos una tabla con los valores de configuración del VDP entre dos etiquetas, vdp_data y vdp_data_end, | + | Ahora vamos con algo más complicado. Inicializar el VDP, el chip gráfico de la SMS. Al final del programa tenemos una tabla con los valores de configuración del VDP entre dos etiquetas, vdp_data y vdp_data_end, |
Y ahora vamos con una compleja instrucción del z80, //otir//. //otir// es una instrucción de salida de bloque con incremento. ¿quéeee? Bien, en el z80 hay un conjunto de órdenes para usar los puertos de entrada/ | Y ahora vamos con una compleja instrucción del z80, //otir//. //otir// es una instrucción de salida de bloque con incremento. ¿quéeee? Bien, en el z80 hay un conjunto de órdenes para usar los puertos de entrada/ | ||
Cuando termina esta instrucción ya hemos enviado todos los datos de configuración al VDP, vamos a por acción. | Cuando termina esta instrucción ya hemos enviado todos los datos de configuración al VDP, vamos a por acción. | ||
Line 89: | Line 103: | ||
Entonces lo primero que hacemos es limpiarla | Entonces lo primero que hacemos es limpiarla | ||
Para ello vamos a usar dos rutinas que están definidias más adelante, asi que tocará explicarlas también. | Para ello vamos a usar dos rutinas que están definidias más adelante, asi que tocará explicarlas también. | ||
- | Por lo que se ve en el código, cargamos el registro //hl// con el valor $4000 y luego llamamos a dos rutinas con la instrucción //call//. Las rutinas se llaman | + | Por lo que se ve en el código, cargamos el registro //hl// con el valor $4000 y luego llamamos a dos rutinas con la instrucción //call//. Las rutinas se invocan |
Vamos entonces a explicar las subrutinas: | Vamos entonces a explicar las subrutinas: | ||
Line 104: | Line 118: | ||
</ | </ | ||
- | Esta rutina es muy útil, como veremos. El VDP, no está mapeado en la memoria principal, y como vimos antes, nos comunicamos con él usando los puertos de entrada y salida del z80. Como las instrucciones de E/S son limitadas, se puede hacer tedioso escribir ciertos bloques de código por ejemplo este caso. Quememos decirle al VDP que vamos a usar la dirección $4000 de la VRAM. Para ello, usando la instrucción normal de salida, out (puerto), a, tenemos que cargar en a, el valor $00 (el byte menos significativo), | + | Esta rutina es muy útil, como veremos. El VDP no está mapeado en la memoria principal, y como vimos antes, nos comunicamos con él usando los puertos de entrada y salida del z80. Al ser las instrucciones de E/S limitadas |
- | Ahora vamos con la siguiente | + | Ahora vamos con la siguiente: |
<code asm> | <code asm> | ||
; limpia la vram | ; limpia la vram |
tutorial_sms.1259511998.txt.gz · Last modified: 2009/11/29 17:26 by xzakox