actualiza, actualiza xDD
actualiza, actualiza xDD
El tuto está actualizandose sin parar eh xD
Enseguida termino con los registros básicos de la gameboy, y empiezo con el ensablador y un hola mundo :-)
LADECADENCE.NET GBCartflasher!!!
muy grande xzakox. Asi la gente puede visitar tu enlace y postear por aqui sus pequeñas obras. Estoy actualizando el post incial para incluir nueva información (tmb el enlace a tu página).
espero con ganas ese tuto en ensamblador para GB. por cierto para poder usar los conocimientos adquiridos era necesario el RGBDK, no? hay algun enlace por ahi para poder acceder a el?
Justo ahora que tengo un carchuto recauchutable, me viene de perilla. Gracias.
Aqui ando de nuevo con otro ejemplo. En este caso se trata de una rom para GBA desarrollada con el devkitadv-r5-beta-3 que carga varias imagenes y permite al usuario ir navegando a través de ellas pulsando cualquiera de los diez botones de la consola.
Esta vez ha sido necesario incluir el fichero keypad.h donde se encuentran recodigas las corrrespondencias con los botones de la GameBoy Advance. el fichero keypad.h de la distribución del devkitadv es el siguiente:
una vez incluido este fichero en la carpeta de trabajo junto con el base.h que tmb usabamos en el ejmplo anterior y que recoge la definición del tipo USHORT empleado en las conversiones del PCX2GBA, solo nos queda mapear las imagenes con dicho programa a los correspondientes ficheros .h y generar el programa con el código principal que nos queda como sigue://Key Definitions from Nokturn's key demo
#define KEY_A 1
#define KEY_B 2
#define KEY_SELECT 4
#define KEY_START 8
#define KEY_RIGHT 16
#define KEY_LEFT 32
#define KEY_UP 64
#define KEY_DOWN 128
#define KEY_R 256
#define KEY_L 512
int* KEYS = (int*)0x04000130;
el resultado como siempre lo podeis comprobar vosotros mismos usando el VisualBoy Advance. Agradecría que alguien pudiese probar las roms que voy subiendo por aqui en un flashcart para GBA y me diga que tal van en la maquina original. SALUDOS./*
author: jduranmaster
*/
#include "keypad.h" //definiciones del keypad.
#include "base.h" //definiciones de los tipos de datos que usa el devkitadv.
#include "flcl.h" //bytes de la imagen 1 obtenidos con la herramienta PCX2GBA.
#include "flcl1.h" //bytes de la imagen 2 obtenidos con la herramienta PCX2GBA.
#include "flcl2.h" //bytes de la imagen 3 obtenidos con la herramienta PCX2GBA.
#include "flcl3.h" //bytes de la imagen 4 obtenidos con la herramienta PCX2GBA.
#include "flcl4.h" //bytes de la imagen 5 obtenidos con la herramienta PCX2GBA.
#include "flcl5.h" //bytes de la imagen 6 obtenidos con la herramienta PCX2GBA.
#include "flcl6.h" //bytes de la imagen 7 obtenidos con la herramienta PCX2GBA.
#include "flcl7.h" //bytes de la imagen 8 obtenidos con la herramienta PCX2GBA.
#include "flcl8.h" //bytes de la imagen 9 obtenidos con la herramienta PCX2GBA.
#include "flcl9.h" //bytes de la imagen 10 obtenidos con la herramienta PCX2GBA.
#include "flcl10.h" //bytes de la imagen 11 obtenidos con la herramienta PCX2GBA.
USHORT* ScreenBuffer = (USHORT*)0x6000000;
int main(){
USHORT loop;
SetMode(MODE3 | BG2_ENABLE);//seleccionamos el modo gráfico (MODO 3)
//fijamos la imagen que aparecerá cuando se cargue la ROM por primera vez.
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample0data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
while (1) // bucle infinito
{
// process input
if(!((*KEYS) & KEY_A)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample1data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_B)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample3data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_SELECT)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample5data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_START)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample2data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_R)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample4data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_L)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample6data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_UP)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample7data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_DOWN)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample9data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_LEFT)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample10data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
if(!((*KEYS) & KEY_RIGHT)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sample8data[loop];
}//con el bucle cargamos en el buffer de pantalla los datos de la imagen.
}
}
}//fin de main
http://wiki.ladecadence.net/doku.php...de_ensamblador
Echadle un vistazo, he añadido las herramientas para descargar y ya hay un hola mundo que podeis ensamblar y ejecutar, explicado con comentarios, después lo iré explicando paso a paso con cada instrucción de ensamblador. Por hoy ya vale xD
LADECADENCE.NET GBCartflasher!!!
Continuamos con otro ejemplo que hace uso del modo 3 de GBA para pintar la pantalla de un color concreto. El ejemplo esta tmb realizado con el devkitadv-r5-beta-3.
en este caso me he tenido que definir un fichero denominado screenmode.h donde he definido todas las ctes necesarias para el manejo de los fondos de pantalla:
también he utilizado otro fichero de cabecera llamado "gba.h" que contiene mas definicones de tipos auxiliares./*
author: jduranmaster
*/
#ifndef SCREENMODE_H
#define SCREENMODE_H
/////definicion del REG_DISPCNT
#define MODE_0 0x0
#define MODE_1 0x1
#define MODE_2 0x2
#define MODE_3 0x3
#define MODE_4 0x4
#define MODE_5 0x5
#define BACKBUFFER 0x10
#define H_BLANK_OAM 0x20
#define OBJ_MAP_2D 0x0
#define OBJ_MAP_1D 0x40
#define FORCE_BLANK 0x80
#define BG0_ENABLE 0x100
#define BG1_ENABLE 0x200
#define BG2_ENABLE 0x400
#define BG3_ENABLE 0x800
#define OBJ_ENABLE 0x1000
#define WIN1_ENABLE 0x2000
#define WIN2_ENABLE 0x4000
#define WINOBJ_ENABLE 0x8000
#define SetMode(mode) REG_DISPCNT = (mode)
#endif
y finalmente el código fuente del programa principal:// gba.h by eloist
#ifndef GBA_HEADER
#define GBA_HEADER
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;
typedef signed char s8;
typedef signed short s16;
typedef signed long s32;
typedef unsigned char byte;
typedef unsigned short hword;
typedef unsigned long word;
typedef volatile unsigned char vu8;
typedef volatile unsigned short vu16;
typedef volatile unsigned long vu32;
typedef volatile signed char vs8;
typedef volatile signed short vs16;
typedef volatile signed long vs32;
typedef void (*fp)(void);
#define RGB16(r,g,b) ((r)+(g<<5)+(b<<10))
#define OAMMem ((u32*)0x7000000)
#define VideoBuffer ((u16*)0x6000000)
#define OAMData ((u16*)0x6010000)
#define BGPaletteMem ((u16*)0x5000000)
#define OBJPaletteMem ((u16*)0x5000200)
#define REG_DISPCNT *(vu32*)0x4000000
#define REG_VCOUNT *(vu16*)0x4000006
#define MODE_0 0x0
#define MODE_1 0x1
#define MODE_2 0x2
#define MODE_3 0x3
#define MODE_4 0x4
#define MODE_5 0x5
#define BACKBUFFER 0x10
#define H_BLANK_OAM 0x20
#define OBJ_MAP_2D 0x0
#define OBJ_MAP_1D 0x40
#define FORCE_BLANK 0x80
#define BG0_ENABLE 0x100
#define BG1_ENABLE 0x200
#define BG2_ENABLE 0x400
#define BG3_ENABLE 0x800
#define OBJ_ENABLE 0x1000
#define WIN1_ENABLE 0x2000
#define WIN2_ENABLE 0x4000
#define WINOBJ_ENABLE 0x8000
///////SetMode Macro
#define SetMode(mode) REG_DISPCNT = (mode)
#endif
espero que os sirva para dar los primeros pasos en la programación de GBA. Este programa esta testeado con VisualBoy Advance./*
author: jduranmaster
*/
#include "gba.h"
#include "screenmode.h"
#define RGB(r,g,b) ((r)+(g<<5)+(b<<10))
#define BGR(b,g,r) ((r)+(g<<5)+(b<<10))
typedef u16 unsigned short int;
u16* videoBuffer = (u16*)0x6000000; //dirección de comienzo de la memoria de video.
void PlotPixel (int x, int y, unsigned short int c){videoBuffer[(y)*240 + (x)] = (c);}
int main(void){
int x,y;
SetMode(MODE_3 | BG2_ENABLE);//inicializamos con el MODO 3 de GBA y permitimos el background 2
for(x = 0; x < 240; x++){
for(y = 0; y < 160; y++){
PlotPixel(x,y,RGB(31,0,0));//pintamos el pixel por pantalla
}
}
while(1){}//bucle infinito
}//fin de main
Bueno, estoy añadiendo las primeras explicaciones al código del hola mundo, si podeis ir leyéndolo... más que nada para saber si se entiende bien, o tengo que mejorar las explicaciones, (o si creeis que me paso explicando) xD
Gracias.
http://wiki.ladecadence.net/doku.php...de_ensamblador
LADECADENCE.NET GBCartflasher!!!
Y termino con otro ejemplo desarrollado con el devkitadv-r5-beta-3 para GBA que nos permite conmutar entre colores de pantalla y una imagen predefinida e integrada mediante el PCX2GBA. La conmutación se realiza mediante el uso del keypad.h que como ocurria en uno de los ejemplos anteriores tiene las constantes precisas para mapear los botones (en este ejemplo los botones que reciben los eventos son A, B, R y L). El código fuente del programa principal es:
bueno pues esto es todo por hoy. Ahora estoy trabajando en dos programillas mediante el devkitPRO para GBA: uno que usa los tiles de GBA y otro que usa el apartado de sonido. Según vaya avanzando con ellos, los subire por aqui.SALUDOS./*
author: jduranmaster
*/
#include "gba.h"
#include "screenmode.h"
#include "keypad.h"
#include "base.h"
#include "flcl.h"
#define RGB(r,g,b) ((r)+(g<<5)+(b<<10))
#define BGR(b,g,r) ((r)+(g<<5)+(b<<10))
typedef u16 unsigned short int;
USHORT* ScreenBuffer = (USHORT*)0x6000000;
u16* videoBuffer = (u16*)0x6000000; //dirección de comienzo de la memoria de video.
void PlotPixel (int x, int y, unsigned short int c){videoBuffer[(y)*240 + (x)] = (c);}
int main(void){
int x,y;
SetMode(MODE_3 | BG2_ENABLE);//inicializamos con el MODO 3 de GBA y permitimos el background 2
USHORT loop;
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sampledata[loop];
}
while(1){
if(!((*KEYS) & KEY_A)){
for(x = 0; x < 240; x++){
for(y = 0; y < 160; y++){
PlotPixel(x,y,RGB(31,0,0));//pintamos el pixel por pantalla
}
}
}
if(!((*KEYS) & KEY_B)){
for(x = 0; x < 240; x++){
for(y = 0; y < 160; y++){
PlotPixel(x,y,RGB(0,31,0));//pintamos el pixel por pantalla
}
}
}
if(!((*KEYS) & KEY_L)){
for(x = 0; x < 240; x++){
for(y = 0; y < 160; y++){
PlotPixel(x,y,RGB(0,0,31));//pintamos el pixel por pantalla
}
}
}
if(!((*KEYS) & KEY_R)){
for(loop=0;loop<38400;loop++) {
ScreenBuffer[loop] = sampledata[loop];
}
}
}//bucle infinito
}//fin de main
gracias jduran por los ejemplos para GBA, estan currados con el codigo fuente y todo. y tmb gracias xzakox por el tuto de ensamblador de GB, lo estoy leyendo y esta bastante bien explicado.
me mola bastante el tuto de ensamblador xzakox. muy explicativo, como tiene que ser.
Marcadores