tutorial_sms
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
Previous revisionNext revision | |||
— | tutorial_sms [2009/11/29 16:39] – xzakox | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Tutorial de programación de la Sega Master System ====== | ||
+ | |||
+ | No pretendo con esto hacer un tutorial paso a paso de programación de la SMS, sino partir de un programa de ejemplo e ir explicando sobre la marcha el programa y las características de la SMS. | ||
+ | |||
+ | Empezamos con el código fuente de un 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. | ||
+ | |||
+ | ===== Explicación ===== | ||
+ | Vamos diseccionando el programa parte por parte. | ||
+ | Para empezar comentar que en ensamblador, | ||
+ | |||
+ | <code asm> | ||
+ | .MEMORYMAP | ||
+ | DEFAULTSLOT 0 | ||
+ | SLOTSIZE $8000 | ||
+ | SLOT 0 $0000 | ||
+ | .ENDME | ||
+ | |||
+ | .ROMBANKMAP | ||
+ | BANKSTOTAL 1 | ||
+ | BANKSIZE $8000 | ||
+ | BANKS 1 | ||
+ | .ENDRO | ||
+ | |||
+ | |||
+ | ; sdsc tag al inicio de la rom | ||
+ | .sdsctag 1.0," | ||
+ | </ | ||
+ | |||
+ | Primero las directivas .MEMORYMAP y .ROMBANKMAP. Estas son directivas del ensamblador wla-dx que nos permiten definir cuestiones relacionadas con la rom que estamos creando. No es código z80, simplemente le dicen al ensamblador como crear el mapa de memoria y los bancos que vamos a usar en nuestro programa. En este caso, le decimos que solo tenemos un slot, de 0h a 8000h (32K) y solo un banco de memoria, tambien solo de 32K. | ||
+ | Luego el tag .sdsctag nos permite definir una versión un nombre, descripción y autor del programa. Sencillo. | ||
+ | |||
+ | <code asm> | ||
+ | ; Boot | ||
+ | .bank 0 slot 0 | ||
+ | .org $0001 | ||
+ | |||
+ | di | ||
+ | im 1 | ||
+ | jp main | ||
+ | </ | ||
+ | |||
+ | Empezamos, usamos la directiva .bank del compilador para decirle que empezamos a definir el primer banco y el primer slot de memoria. Solo tenemos este, asi que solo nos hará falta definirlo aqui. | ||
+ | Luego con .org le decimos que el programa comienza en 0000h, el primer banco de ROM. | ||
+ | |||
+ | Vamos con las primeras instrucciones de código. di deshabilita las interrupciones, | ||
+ | Y para terminar con jp main, saltamos al inicio del programa, dejando espacio entre aqui y nuestro codigo principal para meter manejo de interrupciones, | ||
+ | |||
+ | <code asm> | ||
+ | ; Pausa | ||
+ | .org $0066 | ||
+ | ; de momento no hacemos nada | ||
+ | retn | ||
+ | </ | ||
+ | |||
+ | Aqui definimos el origen $0066, que es el lugar normal para poner la rutina de interrupción del botón de pausa. De momento no hacemos nada y solo retornamos de la funcion con retn | ||
+ | |||
+ | <code asm> | ||
+ | ; Programa principal | ||
+ | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
+ | main: | ||
+ | ; pila al final de la RAM | ||
+ | ld sp, $dff0 | ||
+ | |||
+ | ; inicializamos el VDP | ||
+ | ld hl, | ||
+ | ld b, | ||
+ | ld c, | ||
+ | otir | ||
+ | </ | ||
+ | |||
+ | Ya empieza lo interesante. Para empezar, apuntamos la pila a una de las ultimas 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 ultimo 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!). | ||
+ | |||
+ | 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. ¿queeee? Bien, en el z80 hay un conjunto de ordenes 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. | ||
tutorial_sms.txt · Last modified: 2013/11/10 18:36 by zako