Programación de la Neogeo

Pues a raíz de ver el Fast Striker me ha dado el gusanillo de buscar info sobre la programación de la negrita. Por ahora voy a ir investigando el fuente del juego frogfest:

http://frogfeast.rastersoft.net/NeoGeoSrc.html

Ahi viene las instrucciones de lo que hay que bajarse y como configurarlo, en resumen es:

- Te bajas esto (compilador) y lo descomprimes en C:

http://frogfeast.rastersoft.net/Files/NeoDev.zip

- Si no usas visual studio 6 debes bajar el nmake de microsoft:

http://support.microsoft.com/default.as ... us;Q132084

- Creas el directorio 'mutnat' en 'C:\MAME\ROMS\', tb necesitarás la rom del mutation nation y la bios de neogeo dentro de la carpeta roms, lo que compilemos le copiará a la carpeta 'mutnat' y mame cargará esas roms en vez de las del zip del juego.

- Añades 'c:\NeoDev\bin' al path o ejecutas setmvs.bat.

- Te bajas el fuente del juego de la rana de aquí:

http://frogfeast.rastersoft.net/Files/NeoGeoSrc.zip

- Y para compilarlo desde msdos y en la carpeta del fuente haces ' nmake FrogDebug.mak' o lo compilas desde visual studio.

Por si estais perrongos, he subido este zip con la carpeta neodev lista para compilar el frogfest junto con el pack de las neolib que subió ulmez en speksnk. Para compilar primero debéis ejecutar el setmvs.bat o añadir el path a mano. Luego en la carpeta tutos, entrais al que os interese, ejecutáis el compile.bat, si no ha habido errores podréis ejecutar el go.bat que abrirá el mame y probará la rom resultante. Tb incluye los tutos 1 y 2, si se le puede llamar tutos [+risas]

http://rapidshare.com/files/382400537/NeoDev.zip.html

TUTO 1 - Hola Mundo

- Un hola mundo básico sería sustituyendo el main.c por:

#include "Defines.h"
#include "Main.h"
#include "Routines.h"
#include "Sprites.h"

extern WORD FontPal[];

#define FONTPAL 2

int main()
{
LoadPalette(FontPal, 0x400040, 0x20);

DrawString( "HOLA MUNDO", FONTPAL, 15, 15);
DrawString("neogeo forever", FONTPAL, 13, 17);

while (TRUE)
WaitVBlank();

return 0;
}

Imagen

TUTO 2 - Controles

Para probar los controles tendriamos un main.c como el siguiente:

#include "Defines.h"
#include "Main.h"
#include "Routines.h"
#include "Sprites.h"

extern WORD FontPal[];

#define FONTPAL 2

DWORD OldJoyVal1;
DWORD OldJoyVal2;

int main()
{
DWORD JoyVal1;
DWORD JoyVal2;

LoadPalette(FontPal, 0x400040, 0x20);

DrawString( "PRUEBA PAD", FONTPAL, 15, 3);
DrawString("neogeo forever", FONTPAL, 13, 5);

while (TRUE)
{
WaitVBlank();

JoyVal1 = ReadJoystickA();
JoyVal2 = ReadJoystickB();

if (JoyVal1 != OldJoyVal1)
OldJoyVal1 = JoyVal1;

if (JoyVal2 != OldJoyVal2)
OldJoyVal2 = JoyVal2;

DrawString("J1 A: ", FONTPAL, 3, 8);
DrawNumber(((OldJoyVal1 & JOYA_A)!= 0), FONTPAL, 14, 8);
DrawString("J1 B: ", FONTPAL, 3, 10);
DrawNumber(((OldJoyVal1 & JOYA_B)!= 0), FONTPAL, 14, 10);
DrawString("J1 C: ", FONTPAL, 3, 12);
DrawNumber(((OldJoyVal1 & JOYA_C)!= 0), FONTPAL, 14, 12);
DrawString("J1 D: ", FONTPAL, 3, 14);
DrawNumber(((OldJoyVal1 & JOYA_D)!= 0), FONTPAL, 14, 14);
DrawString("J1 START: ", FONTPAL, 3, 16);
DrawNumber(((OldJoyVal1 & JOYA_START)!= 0), FONTPAL, 14, 16);
DrawString("J1 SELECT: ", FONTPAL, 3, 18);
DrawNumber(((OldJoyVal1 & JOYA_SELECT)!= 0), FONTPAL, 14, 18);
DrawString("J1 UP: ", FONTPAL, 3, 20);
DrawNumber(((OldJoyVal1 & JOYA_UP)!= 0), FONTPAL, 14, 20);
DrawString("J1 DOWN: ", FONTPAL, 3, 22);
DrawNumber(((OldJoyVal1 & JOYA_DOWN)!= 0), FONTPAL, 14, 22);
DrawString("J1 LEFT: ", FONTPAL, 3, 24);
DrawNumber(((OldJoyVal1 & JOYA_LEFT)!= 0), FONTPAL, 14, 24);
DrawString("J1 RIGHT: ", FONTPAL, 3, 26);
DrawNumber(((OldJoyVal1 & JOYA_RIGHT)!= 0), FONTPAL, 14, 26);


DrawString("J2 A: ", FONTPAL, 19, 8);
DrawNumber(((OldJoyVal2 & JOYA_A)!= 0), FONTPAL, 30, 8);
DrawString("J2 B: ", FONTPAL, 19, 10);
DrawNumber(((OldJoyVal2 & JOYA_B)!= 0), FONTPAL, 30, 10);
DrawString("J2 C: ", FONTPAL, 19, 12);
DrawNumber(((OldJoyVal2 & JOYA_C)!= 0), FONTPAL, 30, 12);
DrawString("J2 D: ", FONTPAL, 19, 14);
DrawNumber(((OldJoyVal2 & JOYA_D)!= 0), FONTPAL, 30, 14);
DrawString("J2 START: ", FONTPAL, 19, 16);
DrawNumber(((OldJoyVal2 & JOYA_START)!= 0), FONTPAL, 30, 16);
DrawString("J2 SELECT: ", FONTPAL, 19, 18);
DrawNumber(((OldJoyVal2 & JOYA_SELECT)!= 0), FONTPAL, 30, 18);
DrawString("J2 UP: ", FONTPAL, 19, 20);
DrawNumber(((OldJoyVal2 & JOYA_UP)!= 0), FONTPAL, 30, 20);
DrawString("J2 DOWN: ", FONTPAL, 19, 22);
DrawNumber(((OldJoyVal2 & JOYA_DOWN)!= 0), FONTPAL, 30, 22);
DrawString("J2 LEFT: ", FONTPAL, 19, 24);
DrawNumber(((OldJoyVal2 & JOYA_LEFT)!= 0), FONTPAL, 30, 24);
DrawString("J2 RIGHT: ", FONTPAL, 19, 26);
DrawNumber(((OldJoyVal2 & JOYA_RIGHT)!= 0), FONTPAL, 30, 26);

}

return 0;
}

Imagen

Bueno, vamos al tema con lo que he ido investigando de las NEOLIB

Gráficamente la consola tiene un plano que no puede hacer scroll, sirve para puntuaciones, text, etc. Se llama capa 'fix' y puede tener hasta 16 paletas de 16 colores. Luego están los sprites (no hay planos como en megadrive, super nintendo etc.), concretamente son 384, que pueden estar formados por 1 tile (16x16 pixels) hasta 1 x 32 tiles en vertical (16x512 pixels), cada tile puede tener 16 colores. Esto se ve fácil en el shot factory de nebula, cuando vamos desactivando sprites, 'desaparecen' tiras verticales. Los sprites pueden reducirse verticalmente y horizontalmente (no es zoom tipo super nintendo) y unir varios para que se comporten como uno solo ( por eso, por ejemplo, el fondo del art of fighting se reduce entero del tirón). Existen 2 bancos de 256 paletas de 16 colores cada una (256 x 16 = 4096 colores en pantalla).

Un 'juego' para neogeo (más o menos) se corresponde de las roms:

-s1 que contiene los tiles de la capa fix. Se compone de 16 mapas de 128x128 pixels, cada mapa puede tener una paleta de 16 colores (16 paletas de 16 colores = 256 colores). El texto de max 330 mega... y logo de snk de la bios está en esta rom, por lo que si cambiamos esta rom nos saldrá la bios corrupta. Después de pelearme con ella he logrado que salga más o menos, lo único que el logo de snk me sale en gris. Se puede desactivar esa secuencia de la bios cambiando en el common_crt0_cart.s sustituir:

.word 0x0
.word LOGO_START

por

.word 0x0000
.word 0x0138

Así es como deberia verse:
Imagen

Así es como sale si tocamos la rom s al tuntun:
Imagen

Y así se está ahora mismo las imagenes que he metido yo en mi rom s, lo del logo de neogeo es por las roms c. Están en la carpeta src/shared:
Imagen


- roms c1,c2... que tienen los tiles para los sprites, ahi tb se guarda el logo de neogeo del arranque de la bios, todavia no he llegado a eso [+risas]

- Las roms p1, p2... son el código del programa del 68000.

- El m1 es el programa del z80, el driver para el sonido, ahi se ejecuta el programa que llama al yamaha.

- Las v1, v2... son las roms que tienen los samplers y las notas de las canciones.

El hola mundo con las neolib sería así:

#include <stdlib.h>
#include <video.h>

extern PALETTE palettes;

int main(void)
{

// void setpalette(int npal, int nb, const PPALETTE palette);
setpalette(0, 1, (const PPALETTE)&palettes); // empezando en ‘npal’, crea ‘nb’ paletas, usando la definicion de colores guardada en ‘palette’

// void textout(int x, int y, int pal, int bank, const char *txt);
textout(14, 10, 0, 0, "HOLA MUNDO"); // muestra una cadena en x,y usando una paleta y en un banco 'fix'especifico
textout(12, 12, 0, 0, "neogeo forever");

while(1)
{
// void wait_vbl(void);
wait_vbl(); // espera el refresco vertical

// void textoutf(int x, int y, int pal, int bank, const char *fmt, ...);
textoutf(12, 20, 0, 0, "Vbl Counter:%d", _vbl_count); // similar al textout pero con formato printf
}
}

Imagen


Para el tema de los controles hay varios métodos, por bios o directamente del hardware:

#include <stdlib.h>
#include <video.h>
#include <input.h>

extern PALETTE palettes[];

const char * const pos_names[] = {
"UP ",
"DOWN ",
"LEFT ",
"RIGHT ",
"A ",
"B ",
"C ",
"D ",
"START ",
"SELECT"
};

static const DWORD pos_masks[10] = {
JOY_UP,
JOY_DOWN,
JOY_LEFT,
JOY_RIGHT,
JOY_A,
JOY_B,
JOY_C,
JOY_D,
JOY_START,
JOY_SELECT
};

int main(void)
{
DWORD direct, bios, onchange, repeat, line, i, j;

// void setpalette(int npal, int nb, const PPALETTE palette);
setpalette(0, 1, (const PPALETTE)&palettes); // empezando en ‘npal’, crea ‘nb’ paletas, usando la definicion de colores guardada en ‘palette’

textout(11, 0, 0, 0, "prueba controles"); // muestra una cadena en x,y usando una paleta y en un banco 'fix'especifico

while(1){

// espera el refresco vertical
wait_vbl();

line = 2;

// para ambos puertos
for(i=0;i<2;i++)
{
textoutf(1, line++, 0, 0, "<PORT%d> DIRECT BIOS ONCHANGE REPEAT",
i+1);

// lee el estado del control del puerto especificado (0,1) por el metodo indicado
// DWORD poll_joystick(DWORD port, DWORD flags);
direct = poll_joystick(i, READ_DIRECT); // directamente a traves del hardware
bios = poll_joystick(i, READ_BIOS); // a traves de la bios
onchange = poll_joystick(i, READ_BIOS_CHANGE); // a traves de la bios solo si cambia
repeat = poll_joystick(i, READ_BIOS_REPEAT); // a traves de la bios a intervales regulares

line++;

for(j=0;j<10;j++)
{
textoutf(1, line++, 0, 0, "%s %d %d %d %d",
pos_names[j],
(direct & pos_masks[j]) ? 1 : 0,
(bios & pos_masks[j]) ? 1 : 0,
(onchange & pos_masks[j]) ? 1 : 0,
(repeat & pos_masks[j]) ? 1 : 0);
}

line++;
}
}
}


// void setpalette(int npal, int nb, const PPALETTE palette);
setpalette(0, 1, (const PPALETTE)&palettes); // empezando en ‘npal’, crea ‘nb’ paletas, usando la definicion de colores guardada en ‘palette’

// void textout(int x, int y, int pal, int bank, const char *txt);
textout(14, 10, 0, 0, "HOLA MUNDO"); // muestra una cadena en x,y usando una paleta y en un banco 'fix'especifico
textout(12, 12, 0, 0, "neogeo forever");

while(1)
{
// void wait_vbl(void);
wait_vbl(); // espera el refresco vertical

// void textoutf(int x, int y, int pal, int bank, const char *fmt, ...);
textoutf(12, 20, 0, 0, "Vbl Counter:%d", _vbl_count); // similar al textout pero con formato printf
}
}

Imagen

Para los sprites valdría con:

extern PALETTE palettes[];
extern TILEMAP mysprite[];
int sprite_num_player1; // numero del sprite

int main(void)
{

while(1) {
setpalette(0, 2, (const PPALETTE)&palettes);
set_current_sprite(2);
sprite_num_player1 = write_sprite_data(100, 100, 15, 255, 3, 3, (const PTILEMAP)&mysprite);
}
return 0;
}

Pero no me funciona muy bien la cosa (las paletas por ejemplo), si alguno tiene un ratito y puede ayudarme con esto se lo agardecería [+risas]

Aquí os dejo el zip con todo listo para compilar, primero en C:\NeoDev\src ejecutais build-libs.bat para compilar las librerias, luego podeis hacer build-samples para ver si todo funciona.

En C:\NeoDev\src\samples teneis los fuentes, se tiene que hacer compile.bat (compila), makeroms.bat (crea las roms), go.bat (renombra las roms, las copia en C:\mame\roms\puzzledp y ejecuta mame). Recordad bajaros mame, el juego puzzle de pon y la bios de neogeo.

http://rapidshare.com/files/385386345/NeoDev.zip.html







ANEXO - INFO TECNICA

Neo Geo

System Information:
Resolution: 320(304?)x224
Color Palette: 65,536
Maximum Colors On-Screen: 4,096
Maximum Sprites On-Screen: 380
Minimum Sprite Size: 1x2
Maximum Sprite Size: 16x512
Maximum Amount of Game Planes: 3(?)
Sound Channels: 4-FM synthesis, 7-Digital, 3-PSG, 1-Noise channel
Yamaha 2610 sound chip.
Internal RAM: Work RAM: 64Kb
58MBit DRAM, 512KBit VRAM and 64KBit SRAM (CD version only).
512KBit DRAM, 512KBit VRAM (Cartridge version).

Graphics information:
$00000 - $DFFF: Blocks of sprite data, each $80 bytes:
Each $80 block is made up of $20 double words, their format is:
Word: Sprite number (16 bits)
Byte: Palette number (8 bits)
Byte: Bit 0: X flip
Bit 1: Y flip
Bit 2: Automatic animation flag (4 tiles?)
Bit 3: Automatic animation flag (8 tiles?)
Bit 4: MSB of sprite number (confirmed, Karnov_r, Mslug). See note.
Bit 5: MSB of sprite number (MSlug2)
Bit 6: MSB of sprite number (Kof97)
Bit 7: Unknown for now

Each double word sprite is drawn directly underneath the previous one,
based on the starting coordinates.

$7000 - $7a00 : Front plane fix tiles (8*8), 2 bytes each

$8000: Control for sprites banks, arranged in words
Bit 0 to 3 - Y zoom LSB
Bit 4 to 7 - Y zoom MSB (ie, 1 byte for Y zoom).
Bit 8 to 11 - X zoom, $f is full size (no scale).
Bit 12 to 15 - Unknown, probably unused

$8200: Control for sprite banks, arranged in words
Bit 0 to 5: Number of sprites in this bank (see note below).
Bit 6 - If set, this bank is placed to right of previous bank
(same Y-coord).
Bit 7 to 15 - Y position for sprite bank.

$8400: Control for sprite banks, arranged in words
Bit 0 to 5: Unknown
Bit 7 to 15 - X position for sprite bank.

Memory Locations:
$00 Stack pointer
$04 Initial PC ($C11002)
$10 Pointer to debug dip switches (Dword)
$64 VBlank pointer
$100 "NEO-GEO", 0
$108 NGH Number, a unique number assigned to each cart. (Word) (Thanks to Apollo69
for this info.)
$10A ?
$10E Pointer to debug dip switches (Dword)
$112 ?
$114 Starting Sprite Number / $100 for the Neo Geo logo.
Logo is (64 x 64 chars. 4096 bytes total in each bank).
$116 Pointer to Japanese configuration
configuration:
"Name " 16 bytes
? (Dword)
$0364 (?) Dword
$14132401(?) Word
$11A Pointer to English configuration
$11E Pointer to Spanish(?) configuration
$122 Entry point of the software
$182 Pointer to security code.
$10F6EE (DWORD) Contains a copy of 68000 (IRQ Vector).
$10FD83 Nationality of the machine (0 = Japanese / 1 & 2 = English)
$10FDAE Set to zero before booting to force complete initialization.
$10FE80 Set to FF to activate debug mode.
$300000 (Write) Watchdog Reset
$300001
$300000 Controller #1
bit 7 : Button D
bit 6 : Button C
bit 5 : Button B
bit 4 : button A
bit 3 : Right
bit 2 : Left
bit 1 : Down
bit 0 : Up

$300001 Dipswitches
bit 0 : Selftest
bit 1 : Unknown (Unused ?) \ something to do with
bit 2 : Unknown (Unused ?) / auto repeating keys ?
bit 3 : \
bit 4 : | communication setting ?
bit 5 : /
bit 6 : free play
bit 7 : stop mode ?

$300080 Controller #4 - Test switch in here
$300081
$31001c Unknown (ghost pilots)
$320000 Sound CPU
$320001
$320001
The Neo Geo contains an NEC 4990 Serial I/O calendar & clock accesed
through $320001, $380050, $280050 (shadow adress). A schematic
for this device can be found on the NEC webpages.
bit 0 : COIN 1
bit 1 : COIN 2
bit 2 : SERVICE
bit 3 : UNKNOWN
bit 4 : UNKNOWN
bit 5 : UNKNOWN
bit 6 : 4990 test pulse bit.
bit 7 : 4990 data bit.


$340000 Controller #2 (same bits as $300000)
$380000 Status byte
0 PAD1 START
1 PAD1 SELECT
2 PAD2 START
3 PAD2 SELECT
4 --\ MEMORY CARD
5 --/ INSERTED
6 MEMORY CARD WRITE PROTECTION
7 UNUSED (?)
$380011 Backup bank select
$380051 4990 control write register
bit 0: C0
bit 1: C1
bit 2: C2
bit 3-7: unused.

$00 = register hold.
$02 = shift.
$03 = time read (reset register).
$04 = ????.

$3a0001 Enable display.
$3a0003 Swap in Bios ($80 bytes vector table of BIOS)
$3a000a Select board FIX char rom
$3a000b
$3a000c Neogeo Sram Lock
$3a000d
$3a000e Neogeo Setpalbank1
$3a000f
$3a001a Select game FIX char rom
$3a001b
$3a001c Neogeo Sram Unlock
$3a001d
$3a001e Neogeo SetPalbank0 Palette banking
$3a001f
$3a0011 Disable display
$3a001b set bios vector table (?) mirror ?
$3a001d unlock backup ram
$3a0013 Swap in Rom ($80 bytes vector table of ROM bank)
$3c000c IRQ acknowledge
4 = IRQ 1
2 = IRQ 2
1 = IRQ 3 (does any game use this?)

$3c000e $3c000f Control R
The format of this very important location is: AAAA AAAA B??? CDDD

A is most likely the video beam line, however from how it is used it
doesn't seem to be a 0-255 direct map: the top bit is often masked out.

I think the top bit of A is: (vblank OR irq2). sdodgeb loops waiting for
it to be 1; zedblade heavily depends on it to work correctly.

B is used together with A in one place, so most likely video beam position

Maybe AAAAAAAAB is a 9-bit video line counter.
It is tested individually in many cases (e.g. samsho3) so it might not be
the low bit of the raster line.

C is definitely a PAL/NTSC flag. Evidence:
1) trally changes the position of the speed indicator depending on
it (0 = lower 1 = higher).
2) samsho3 sets a variable to 60 when the bit is 0 and 50 when
it's 1. This is obviously the video refresh rate in Hz.
3) samsho3 sets another variable to 256 or 307. This could be the
total screen height (including vblank), or close to that.
Some game (e.g. lstbld2, samsho3) do this (or similar):
bclr #$0, $3c000e.l
when the bit is set, so 3c000e (whose function is unknown) has to
be related
D is unknown (counter of some kind, used in a couple of places).
in blazstar, this controls the background speed in level 2.

IO addresses
$3c0000 Read/Write location in VRAM.
$3c0002 Read/Write into VRAM
$3c0004 Value to increment VRAM address by (based on words)
$3c0006 Unknown, set vblank counter (?)
$3c0008 shadow adress for $3c0000.
$3c000a shadow adress for $3c0002.

68k Addresses
$000000 $0fffff Rom bank 1
$100000 $10ffff Ram bank 1
$200000 $2fffff Rom bank 2
$2ffff0 $2fffff Neo Bankswitch Write
$400000 $401fff Neogeo Palette Ram Read
$800000 $800fff NeoGeo Memcard Read
Memory card is a 2kb battery backed RAM.
It is accessed thru $800000-$800FFF.
Even bytes are always $FF
Odd bytes are memcard data ($800 bytes)

$c00000 $c1ffff System Bios Rom
$d00000 $d0ffff 64k battery backed SRAM

trally writes to 200000-200003 as well, probably looking for a serial
link both games write to 0000fe before writing to 200000. The two
things could be related. Sidekicks reads and writes to several
addresses in this range, using this for copy protection.

BIOS Routines/Locations (Thanks to Fabrice Martinez for these)
After calling $C0044A during the VBlank interrupt the following locations will be set:
$10FD95 Controller 1
$10FD96 Copy of 10FD95 (for comparison)
$10FD97 Impulse
$10FD98 Auto-repeat

$10FD9B Controller 2
$10FD9C Copy of 10FD9C
$10FD9D Impulse
$10FD9E Auto-Repeat

Z80 Addresses
$0000 $7fff Rom
$8000 $bfff Bank 5
$c000 $dfff Bank 6
$e000 $efff Bank 7
$f000 $f7ff Bank 8
$f800 $ffff Ram

Character layout
8 x 8 chars
4096 in total
4 bits per pixel (planes are packed in a nibble)
32 bytes per char

Sprite Layout
16 x 16
4 bits per pixel
128 bytes per sprite
socram8888 está baneado por "incumplimiento términos y condiciones de uso"
Es que no hay nada más XD . La NeoGeo no tiene planos, usa un montón de sprites juntos para similarlos.
Hola, buen trabajo.

Hace algunos años atras, habia programado unas demos para NeoGeo y NeoGeo CD, no se si aun tendre el codigo en algun CD o disco duro, lo buscare.

Era poca cosa, un sprite, un fondo y algo de scroll

Hace poco volvi a revisar la documentacion de la NeoGeo, para poder hacer el demo del Metal Slug para megadrive, asi que aun tengo algunas cosas en la cabeza

Si te puedo ayudar en algo, encantado, aunque no esperes mucho



Es que no hay nada más XD . La NeoGeo no tiene planos, usa un montón de sprites juntos para similarlos.


La consola perfecta..jeje..para portar el Sonic ;) [ironico]
¿en serio no tiene planos? (si quitamos la capa de texto claro). Por lo que he leido los sprites no tienen zoom sino escalado, es decir, se coge un sprite muy grande y se encoje, no como se haría en la super, toda la vida engañado [+risas]

Pues encajar todos mientras los reduces por ejemplo en un art of fighting tela.
A ver si os animáis y programáis un tetris para neogeo, es uno de los juegos que se echa en falta en la bestia negra :D
Hace tiempo publiqué esto:

viewtopic.php?f=80&t=1357524&p=1718610112#p1718610112

No se si servirá de ayuda :)



Me acuerdo del post, habia comentado de las pocas herramientas que existen para neogeo, en comparacion, para megadrive por ejemplo

Justamente en NeoDev creo q habia programado algo, pero alli por el 2005?¿ por eso q ya ni recuerde el que.. XD
Me parece cojonudo, aunque no puedas realizar grandes modificaciones, quizás puedan servir para lo tipico de traducciones, cambios de color de trajes y tal, no?

Mucha gente no es consciente del curro que hay detrás de estas cosas, y yo que lo viví en la ingeniería, lo valoro mucho.
Enhorabuena!
Muchas gracias a todos por los enlaces, ahora mismo estoy investigando a partir del fuente del juego ese de la rana, que no se de donde ha sacado las librerias pq las neolib exactamente no son. En principio son más simples, en cuanto acabe con ellas miraré el pack de ulmez de speksnk.

Hoy me he puesto con los controles:

Imagen

La pega es que el botón select solo funciona en modo consola, en modo arcade no equivale al moneda. Si alguien quiere el fuente o algo yo se lo pongo, en cuanto los pase a limpio, lo entienda xD y lo comente lo subo.
Muchas gracias a todos por los enlaces, ahora mismo estoy investigando a partir del fuente del juego ese de la rana, que no se de donde ha sacado las librerias pq las neolib exactamente no son.


Si hablas del Neo Geo Frog Feast, usa las NeoDev. Si tienes el Visual studio 6 bien armado, compila a la primera.

Fue uno de los ejemplos que investige cuando me dio la curiosidad de programar para la neogeo, hace algunos años atras
como de costumbre en estos temas, impresionante!!! haber si podemos ver avances pronto.
y nadie nunca se ha animado a programar para la neo geo pocket color?
Hola amigos en este foro estan programando sus propios juegos neo geo

http://www.neogeofans.com/leforum/showt ... 11&page=38

aqui un video del juego NeoPang Demo
http://www.youtube.com/watch?v=DsYsQtxH ... r_embedded

:) saludos ;)
haber si encontramos mas juegos de usuarios y hacemos un recopilatorio,que esta muy bien ese tema.
haber si encontramos mas juegos de usuarios y hacemos un recopilatorio,que esta muy bien ese tema.


Personalmente creo que con esta webhttp://arcadedev.emuvibes.com/#Games , ya es mas q suficiente para comenzar

Lo que hay q tener es ganas y tiempo, para revisar los manuales, codigo, etc y sacar algo en claro

Estuve revisando un poco el hardware de la NeoGeo, y comparandolo con la Megadrive

NeoGeo
CPU: Motorola 68000 12mhz / Co-procesador: Zilog Z80 4mhz
Memoria: 64kb
Vram: 74kb [amor]
Sonido: Yamaha YM2610

Megadrive
CPU: Motorola 68000 7.67mhz / Co-procesador: Zilog Z80 3.58mhz
Memoria: 64kb
Vram: 64kb
Sonido: Yamaha YM2612


Mas alla de las diferencias, creo que hay muchas cosas en comun, asi q no deveria ser tan dificil ponerse a hacer cosas relativamente "serias" si ya se programa para megadrive (que es bastante facil)

Al menos, no se tendran tantos problemas de memoria!! que llevo dias amargados por unos miserables 640bits (0,6kb) que me desbordan la vram de la megadrive...
Yo si colaboramos entre varios perfecto pero yo solo no tengo tiempo material para meterme en cosas serias, ya lo intenté en la ds y como que no [+risas]
Lamentablemente hay que dedicarle tiempo. Yo entre mi negocio, y la familia, me falta, pero si no le dedico 1 o 2 horas al dia a la programacion, no termino mas los proyectos

Ahora estoy con megadrive a full, cuando encuentre algo de tiempo, veo neogeo a ver si saco algo en claro y lo posteo
Bueno, he editado el post de inicio con el fuente, links de descarga, instrucciones... En el zip hay una mezcla de las neodev que puso ulmez en speksnk y la que usa el frogfest. Lo que no he metido es el mame, ni la rom de mutation nation ni la bios de neogeo aunque recuerdo a la señora ministra que poseo varias neogeos y el cartucho fisico del mutation nation y puedo usar las roms legalmente XD

Por cierto ulmez, una vez compiladas las demos de las neolib con tu pack, ¿como las prueba en nebula?

Si alguien se anima a seguir con los sprites mejor que mejor [+risas]

Ah, las funciones que usa el frogfest son en ensamblador y estan en routines.h/.s, son:

/////////////////////////
// carga la paleta
extern void LoadPalette(WORD *Source, DWORD Dest, DWORD Length);

/////////////////////////
// configura el tilemap
extern void SetupTilemap(DWORD y, DWORD Tile);

/////////////////////////
// carga el tilemap
extern void LoadTilemap(WORD *Source, DWORD Dest, DWORD Width, DWORD Height, DWORD Tile);

/////////////////////////
// rellena el tilemap
extern void FillTilemap(DWORD Dest, DWORD Width, DWORD Height, DWORD Tile);


/////////////////////////
// limpia el texto
extern void ClearText();

/////////////////////////
// lee el joystick A
extern DWORD ReadJoystickA();

/////////////////////////
// lee el joystick B
extern DWORD ReadJoystickB();

/////////////////////////
// espera el VBlank
extern void WaitVBlank();


/////////////////////////
// añade un sprite
extern DWORD AddSprite(DWORD x, DWORD y, DWORD Width, DWORD Height, DWORD Tile, DWORD Palette);

/////////////////////////
// borra un sprite
extern void RemoveSprite(DWORD Sprite);

///////////////////////////////////
// cambia la posicion de un sprite
extern void SetSpritePosition(DWORD Sprite, DWORD x, DWORD y);

//////////////////////////////
// cambia el tile del sprite
extern void SetSpriteTile(DWORD Sprite, DWORD Tile);

//////////////////////////////
// limpia la lista de sprites
extern void ClearSpriteList(DWORD NumSprites);

///////////////////////////
// cambia la paleta a rojo
extern void SetPaletteRed(DWORD Dest, DWORD Red);

///////////////////////////
// cambia la paleta a verde
extern void SetPaletteGreen(DWORD Dest, DWORD Green);

///////////////////////////
// cambia la paleta a azul
extern void SetPaletteBlue(DWORD Dest, DWORD Blue);

///////////////////////////
// dibuja un numero
extern void DrawNumber(DWORD Value, DWORD Palette, DWORD x, DWORD y);

///////////////////////////
// dibuja una cadena
extern void DrawString(char *String, DWORD Palette, DWORD x, DWORD y);

///////////////////////////
// reproduce audio
extern void PlayAudio(DWORD Track);

///////////////////////////
// para el audio

extern void StopAudio();

///////////////////////////
// inicia el sonido
extern void InitSound();

///////////////////////////
// reproduce un sonido
extern void PlaySound(DWORD SoundID);

///////////////////////////
// obtiene un nmero random
extern DWORD Random(DWORD Limit);
A mí me gustaría un remake para Neo-Geo del mítico JET PAC de Spectrum.

Una sola pantalla, muchos colorines... podría hacerse un remake fabuloso.
A mí me gustaría un remake para Neo-Geo del mítico JET PAC de Spectrum.

Una sola pantalla, muchos colorines... podría hacerse un remake fabuloso.


Pues no parece un juego complicado, supongo que si te pones una semana a estudiar el codigo del frog, lo podrias hacer
O un astromash con los graficos del pulstar , la musica de los king of fighters y las explosiones de los metal slug... ummm pagaria por ello xD

PD: Para el pobre ignorante que no lo sepa el astromash es un juego de intellivision tremendamente viciante y a la vez supersencillo , una nave a ras de suelo , un monton de asteroides y naves alienigenas que intentan llegar al suelo , multiplicadores , muchas vidas , muchos puntos y mucho vicio ... arf... es una mezcla de asteroids, missil command y mucha mala leche xD
socram8888 está baneado por "incumplimiento términos y condiciones de uso"
Si no recuerdo mal, la NeoGeo lleva un procesador 68000. Si es así, yo puedo ayudar desde nivel de Ensamblador de 68k :-|
socram8888 escribió:Si no recuerdo mal, la NeoGeo lleva un procesador 68000. Si es así, yo puedo ayudar desde nivel de Ensamblador de 68k :-|



Estás en lo cierto, un motorola 68000 de cpu principal y un z80 para el sonido, ambos chips bastante bien documentados.

Saludos!
pocket_lucho escribió:Por cierto ulmez, una vez compiladas las demos de las neolib con tu pack, ¿como las prueba en nebula?


Ni idea. El pack no lo monté yo, sino mi colega g0en¡tz de SpekSNK XD Le diré que se pasa por aquí a ver si puede aclararlo :P
pocket_lucho escribió: ni la rom de mutation nation ni la bios de neogeo aunque recuerdo a la señora ministra que poseo varias neogeos y el cartucho fisico del mutation nation y puedo usar las roms legalmente XD


Solo vale con el Mutation Nation ? no sirve uno que sea más barato en cartucho ?
Vas a distribuir juegos homebrew FFantasy XD?
jean la montard escribió:Vas a distribuir juegos homebrew FFantasy XD?


[+risas]

No, pero haría gracia ver los logros de pocket_lucho en un cartucho XD
Hombre, tu dime que mvs te viene bien y lo adapto xD

Estoy empezando con los sprites, a ver si para el finde puedo poner otro tuto.
pocket_lucho escribió:Hombre, tu dime que mvs te viene bien y lo adapto xD


Creo que tengo el SuperSideKicks repetido XD
no me jodas q te vas a cargar un super sidekicks 1!?¿!! uy q me da algo, q es uno de esos juegos q aun no pude conseguir para la AES!! :(
joder ffantasy usa samurai shodown o art of fighting que los regalan con los cereales xD
xDD Pobrecillo cartucho ;) ¿se podria poner un zócalo en vez de la eprom para ir haciendo pruebas?

Yo he mandado a tomar por saco las librerias en ensamblador del frogfest pq simplemente su creador sabrá como sortear sus bugs pq vamos, me está volviendo loco, si pongo sprites y texto, o se reinicia, o se cuelga, etc etc [+risas]

Así que me he puesto con las neolib, que serán en C pero al menos parece que van. Ya he compilado todos los ejemplos, así que este finde subo otro zip con todo preparado, listo para compilar el frogfest y los ejemplos de las neolib con sus bat preparaditos. Esta vez será necesarío la rom del puzzle de pon, más que nada pq ocupa poco. Valdría cualquier juego pequeño (no te preocupes ffantasy6), ya que lo se hace es sustituir la rom s1 (que la que lleva la fuente de las letras), la p1 (que lleva el programa) y la c1 y c2 (que llevan los gráficos). Digo yo que cuando más le metas pues más roms tipo c3, c4 se usará (las v son el sonido).
pocket_lucho escribió:xDD Pobrecillo cartucho ;) ¿se podria poner un zócalo en vez de la eprom para ir haciendo pruebas?


Lo que hay arriba a la derecha es un zocalo, bueno, una tira de pins que salia mucho más barato XD
kanyero escribió:A ver si os animáis y programáis un tetris para neogeo, es uno de los juegos que se echa en falta en la bestia negra :D



La neogeo tiene ya un tetris...
exacto el tetris de neogeo se llama joy joy kid,muy entretenido por cierto.
En algun foro en ingles, lei una discucion, sobre si la neogeo seria capaz de hacer un port del sonic, buena oportunidad para probarlo!!
Si, pero me refiero al tetris de toda la vida, el joy joy kid lo que hace es meter bloques adicionales, yo lo que quiero es un calco del tretris de toda la vida.

Saludos.
theelf escribió:En algun foro en ingles, lei una discucion, sobre si la neogeo seria capaz de hacer un port del sonic, buena oportunidad para probarlo!!


¿Se duda?, ¿y eso?.
¿Se duda?, ¿y eso?.


Por como funcionan una y otra consola. Mientras megadrive practicamente puede cargar el mapa entero en memoria, neogeo tendria que irlo generando a medida que el personaje avanza

Entonces la discucion, era si, el CPU de la neogeo seria lo suficientemente rapida, para alcanzar al sonic XD
Bueno, vamos al tema con lo que he ido investigando.

Gráficamente la consola tiene un plano que no puede hacer scroll, sirve para puntuaciones, text, etc. Se llama capa 'fix' y puede tener hasta 16 paletas de 16 colores. Luego están los sprites (no hay planos como en megadrive, super nintendo etc.), concretamente son 384, que pueden estar formados por 1 tile (16x16 pixels) hasta 1 x 32 tiles en vertical (16x512 pixels), cada tile puede tener 16 colores. Esto se ve fácil en el shot factory de nebula, cuando vamos desactivando sprites, 'desaparecen' tiras verticales. Los sprites pueden reducirse verticalmente y horizontalmente (no es zoom tipo super nintendo) y unir varios para que se comporten como uno solo ( por eso, por ejemplo, el fondo del art of fighting se reduce entero del tirón). Existen 2 bancos de 256 paletas de 16 colores cada una (256 x 16 = 4096 colores en pantalla).

Un 'juego' para neogeo (más o menos) se corresponde de las roms:

-s1 que contiene los tiles de la capa fix. Se compone de 16 mapas de 128x128 pixels, cada mapa puede tener una paleta de 16 colores (16 paletas de 16 colores = 256 colores). El texto de max 330 mega... y logo de snk de la bios está en esta rom, por lo que si cambiamos esta rom nos saldrá la bios corrupta. Después de pelearme con ella he logrado que salga más o menos, lo único que el logo de snk me sale en gris. Se puede desactivar esa secuencia de la bios cambiando en el common_crt0_cart.s sustituir:

.word 0x0
.word LOGO_START

por

.word 0x0000
.word 0x0138

Así es como deberia verse:
Imagen

Así es como sale si tocamos la rom s al tuntun:
Imagen

Y así se está ahora mismo las imagenes que he metido yo en mi rom s, lo del logo de neogeo es por las roms c. Están en la carpeta src/shared:
Imagen


- roms c1,c2... que tienen los tiles para los sprites, ahi tb se guarda el logo de neogeo del arranque de la bios, todavia no he llegado a eso [+risas]

- Las roms p1, p2... son el código del programa del 68000.

- El m1 es el programa del z80, el driver para el sonido, ahi se ejecuta el programa que llama al yamaha.

- Las v1, v2... son las roms que tienen los samplers y las notas de las canciones.

El hola mundo con las neolib sería así:

#include <stdlib.h>
#include <video.h>

extern PALETTE palettes;

int main(void)
{

// void setpalette(int npal, int nb, const PPALETTE palette);
setpalette(0, 1, (const PPALETTE)&palettes); // empezando en ‘npal’, crea ‘nb’ paletas, usando la definicion de colores guardada en ‘palette’

// void textout(int x, int y, int pal, int bank, const char *txt);
textout(14, 10, 0, 0, "HOLA MUNDO"); // muestra una cadena en x,y usando una paleta y en un banco 'fix'especifico
textout(12, 12, 0, 0, "neogeo forever");

while(1)
{
// void wait_vbl(void);
wait_vbl(); // espera el refresco vertical

// void textoutf(int x, int y, int pal, int bank, const char *fmt, ...);
textoutf(12, 20, 0, 0, "Vbl Counter:%d", _vbl_count); // similar al textout pero con formato printf
}
}

Imagen


Para el tema de los controles hay varios métodos, por bios o directamente del hardware:

#include <stdlib.h>
#include <video.h>
#include <input.h>

extern PALETTE palettes[];

const char * const pos_names[] = {
"UP ",
"DOWN ",
"LEFT ",
"RIGHT ",
"A ",
"B ",
"C ",
"D ",
"START ",
"SELECT"
};

static const DWORD pos_masks[10] = {
JOY_UP,
JOY_DOWN,
JOY_LEFT,
JOY_RIGHT,
JOY_A,
JOY_B,
JOY_C,
JOY_D,
JOY_START,
JOY_SELECT
};

int main(void)
{
DWORD direct, bios, onchange, repeat, line, i, j;

// void setpalette(int npal, int nb, const PPALETTE palette);
setpalette(0, 1, (const PPALETTE)&palettes); // empezando en ‘npal’, crea ‘nb’ paletas, usando la definicion de colores guardada en ‘palette’

textout(11, 0, 0, 0, "prueba controles"); // muestra una cadena en x,y usando una paleta y en un banco 'fix'especifico

while(1){

// espera el refresco vertical
wait_vbl();

line = 2;

// para ambos puertos
for(i=0;i<2;i++)
{
textoutf(1, line++, 0, 0, "<PORT%d> DIRECT BIOS ONCHANGE REPEAT",
i+1);

// lee el estado del control del puerto especificado (0,1) por el metodo indicado
// DWORD poll_joystick(DWORD port, DWORD flags);
direct = poll_joystick(i, READ_DIRECT); // directamente a traves del hardware
bios = poll_joystick(i, READ_BIOS); // a traves de la bios
onchange = poll_joystick(i, READ_BIOS_CHANGE); // a traves de la bios solo si cambia
repeat = poll_joystick(i, READ_BIOS_REPEAT); // a traves de la bios a intervales regulares

line++;

for(j=0;j<10;j++)
{
textoutf(1, line++, 0, 0, "%s %d %d %d %d",
pos_names[j],
(direct & pos_masks[j]) ? 1 : 0,
(bios & pos_masks[j]) ? 1 : 0,
(onchange & pos_masks[j]) ? 1 : 0,
(repeat & pos_masks[j]) ? 1 : 0);
}

line++;
}
}
}


// void setpalette(int npal, int nb, const PPALETTE palette);
setpalette(0, 1, (const PPALETTE)&palettes); // empezando en ‘npal’, crea ‘nb’ paletas, usando la definicion de colores guardada en ‘palette’

// void textout(int x, int y, int pal, int bank, const char *txt);
textout(14, 10, 0, 0, "HOLA MUNDO"); // muestra una cadena en x,y usando una paleta y en un banco 'fix'especifico
textout(12, 12, 0, 0, "neogeo forever");

while(1)
{
// void wait_vbl(void);
wait_vbl(); // espera el refresco vertical

// void textoutf(int x, int y, int pal, int bank, const char *fmt, ...);
textoutf(12, 20, 0, 0, "Vbl Counter:%d", _vbl_count); // similar al textout pero con formato printf
}
}

Imagen

Para los sprites valdría con:

extern PALETTE palettes[];
extern TILEMAP mysprite[];
int sprite_num_player1; // numero del sprite

int main(void)
{

while(1) {
setpalette(0, 2, (const PPALETTE)&palettes);
set_current_sprite(2);
sprite_num_player1 = write_sprite_data(100, 100, 15, 255, 3, 3, (const PTILEMAP)&mysprite);
}
return 0;
}

Pero no me funciona muy bien la cosa (las paletas por ejemplo), si alguno tiene un ratito y puede ayudarme con esto se lo agardecería [+risas]

Aquí os dejo el zip con todo listo para compilar, primero en C:\NeoDev\src ejecutais build-libs.bat para compilar las librerias, luego podeis hacer build-samples para ver si todo funciona.

En C:\NeoDev\src\samples teneis los fuentes, se tiene que hacer compile.bat (compila), makeroms.bat (crea las roms), go.bat (renombra las roms, las copia en C:\mame\roms\puzzledp y ejecuta mame). Recordad bajaros mame, el juego puzzle de pon y la bios de neogeo.

http://rapidshare.com/files/385386345/NeoDev.zip.html
Buen curro, ojala alguien te de una mano, asi puedes avanzar mas.Yo hasta que no domine la Megadrive al limite de mi capacidad, no me cambiare a otra consola

En todo caso, llevo meses investigando la neogeo, para poder mejorar mis ejemplos, porque casi todos son basados en algun juego de Neogeo, asi q en algun punto, me pondre a programar algo para la aes

suerte


Ah, por cierto, ya que estoy y el tema tiene algo que ver, en algun tiempo libre que tuve estos dias, avanze un poco mas mi ejemplo del metal slug de megadrive, a alguien le interesa? porque si no, me ahorro de compilarlo
Yo cambio de canal, que en la Neo Geo sueltan mucha publicidad JO JO JO JO JO JO



Imagen
theelf escribió:Ah, por cierto, ya que estoy y el tema tiene algo que ver, en algun tiempo libre que tuve estos dias, avanze un poco mas mi ejemplo del metal slug de megadrive, a alguien le interesa? porque si no, me ahorro de compilarlo


A mi me parece interesante, no se que es lo que quieres hacer pero si necesitas ayuda para adaptar los graficos/optimizar para que queden 'bonitos' avisa que yo con eso soy bastante bueno xD
pocket_lucho escribió:Por cierto ulmez, una vez compiladas las demos de las neolib con tu pack, ¿como las prueba en nebula?


Llego un poco tarde y supongo que ya lo habrás visto, pero en el pack que pusimos para descargar en Spek había un par de bats para generar y ejecutar las roms. Al generarlas rellenaba los "huecos" con el Puzzle de Pon! (como veo más arriba que también has puesto en tu pack), y las metía en un zip. Para arrancar simplemente había otro bat que ejecutaba el nebula pasándole la rom a arrancar por linea de comandos.

Lástima que el curro no me deje mucho tiempo para trastear con estas cosas, porque es relativamente sencillo de usar y molaría pillar un cartucho de esos con roms grabables para probar las demos en la máquina original... xD
46 respuestas