From: Jordi <jb...@ti...> - 2002-10-10 21:00:55
|
bueno, abusando descaradamente de la mailing list ;) posteo aqui= los cambios mas o menos que tengo en la version de aspectrum de zxdeb= para que funcionen los 128 y los +2 ah, y algunas cosillas mas ;) primero de todo, solo una "apreciacion", y es que ExitEmulator= (en v_alleg.c) deberia llamarse gExitEmulator, pues depende de la libreria que usemos ahora las funciones para emular el 128: de momento usan tamanyo= de pagina fijo de 16 kas, pero pasarlo a 8, 4 o 2 o 1 no deberia ser= dificil (meter un par de defines y ya esta). tampoco esta implementado eso para escribir en ROM sin tener un= if o sea, que tal y como esta aqui funciona, pero se debe pulir: priemro de todo, en z80.h, dentro de Z80regs: byte *RAMbank[MAX_RAM_BANKS]; byte *ROMbank[MAX_ROM_BANKS]; byte *page[4];=09=09=09=09// for each page space, a pointer to its= paged bank int pagenum[4];=09=09=09=09// the same as page, to keep the page number= without comparing pointers int paging_disabled;=09=09=09// outs at 7ffd & 1ffd have no effect int shadow_screen; despues , mi z80initialization queda asi: (basicamente reservo espacio para las paginas de ram) ************************************ int Z80Initialization (void) { FILE *fp; int i; /* we get memory and load font, spectrum ROM and possible snapshots selected by the command line */ printf ("ASpectrum GNU pure C Z80 / Spectrum Emulator V "VERSION"\n" =09=09 "(C) 2000-2001 Santiago Romero (NoP/Compiler).\n" =09=09 "Powered by Allegro 4/3.x WIP -" =09=09 " http://www.talula.demon.co.uk/allegro/\n" =09=09 "Distributed under the terms of GNU Public License V2\n\n"); spectrumZ80.RAM =3D (byte *) malloc( 65536 ); if( spectrumZ80.RAM =3D=3D NULL ) { =09 printf("\n Z80: Error allocating RAM memory,= exiting...\n\n"); =09 return(0); } memset (spectrumZ80.RAM,0,16384*4); // Get memory for RAM banks for (i=3D0;i<MAX_RAM_BANKS;i++) { =09 spectrumZ80.RAMbank[i]=3D(byte *)malloc(16384); =09 if (spectrumZ80.RAMbank[i]=3D=3DNULL) =09 { =09=09=09printf("\n Z80: Error allocating RAM memory,= exiting...\n\n"); =09=09=09return(0); =09 } =09 memset (spectrumZ80.RAMbank[i],0,16384); } // Get memory for ROM banks for (i=3D0;i<MAX_ROM_BANKS;i++) { =09 spectrumZ80.ROMbank[i]=3D(byte *)malloc(16384); =09 if (spectrumZ80.ROMbank[i]=3D=3DNULL) =09 { =09=09=09printf("\n Z80: Error allocating ROM memory,= exiting...\n\n"); =09=09=09return(0); =09 } =09 memset (spectrumZ80.ROMbank[i],0,16384); } init_wrapper(); // abrimos el fichero de letras #ifdef DESTDAT =09if ((fp=3Dfopen( DESTDAT"/font.fnt", "rb" ) )!=3D NULL) =09=09printf("using "DESTDAT"/font.fnt\n"); =09else #endif =09if ((fp=3Dfopen( "font.fnt", "rb" )) !=3DNULL) =09=09printf("using ./font.fnt\n"); =09else =09{ =09=09printf("File font.fnt does not exist...\n"); =09=09return(0); =09 }; =09fread( tfont, 4096, 1, fp ); =09fclose(fp); =09i=3D0; =09// abrimos el fichero de rom =09if (emuopt.romfile[0]!=3D0) =09{ =09=09if ((fp=3Dfopen(emuopt.romfile,"rb"))!=3DNULL ) =09=09=09printf("Using ROM file %s\n",emuopt.romfile); =09=09else =09=09{ =09=09=09printf("The ROM file does not exists.\n"); =09=09=09return(0); =09=09} =09} #ifdef DESTDAT =09else if ((fp=3Dfopen( DESTDAT"/spectrum.rom","rb") )!=3DNULL) =09=09printf("using "DESTDAT"/spectrum.rom\n"); #endif =09else if ((fp=3Dfopen( "spectrum.rom","rb"))!=3DNULL ) =09=09printf("using spectrum.rom\n"); =09else =09{ =09=09 printf("File spectrum.rom does not exist ...\n"); =09=09 return(0); =09}; while( !feof(fp) ) =09 spectrumZ80.RAM[i++]=3Dfgetc(fp); fclose(fp); // =BFNecesario? =BFPara que? //CreateVideoTables(); =09initAYarrays (); =09Z80MachineInitialization(); =09Z80Reset( &spectrumZ80, TSTATES_PER_LINE*(TOP_BORDER_LINES+BOTTOM_BORDER_LINES+SCANLINES)= ); Z80FlagTables(); =09aspectrumInited=3D1; return 1; } ************************************ en macros.cpp tengo esto cambiado: #define Z80ReadMem(A) Z80MemRead (A,regs) #define Z80WriteMem(a,b,c) Z80MemWrite(a,b,c) y z80.c tengo estas funciones cambiadas: (el #ifdef es para= cambiar entre paginacion(128) y no paginacion (48), para debugar, pero= con el metodo de paginacion el modo 48 funciona igualmente (ya digo,= solo debug)) ************************************ #ifdef INLINE_MEMORY inline #endif byte Z80MemRead( register word address, Z80Regs *regs ) { u8 *ptr; int v1,v2; #ifdef NO_PAGING =09return regs->RAM[address]; #else =09ptr=3Dregs->page[(address>>14)&3]; =09v1=3Dptr[address&16383]; //=09v2=3Dregs->RAM[address]; =09return v1; #endif } /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D void Z80MemWrite( register word address, register byte value ) =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D*/ #ifdef INLINE_MEMORY inline #endif void Z80MemWrite( register word address, register byte value,= Z80Regs *regs ) { u8 *ptr; if( address >=3D 16384 ) { #ifdef NO_PAGING =09regs->RAM[address]=3Dvalue; #else =09ptr=3Dregs->page[(address>>14)&3]; =09ptr[address&16383]=3Dvalue; //=09regs->RAM[address]=3Dvalue; #endif } } en z80outport: =09if (port=3D=3D0x7ffd) =09{ =09=09port_7ffd(regs,value); =09} =09if (port=3D=3D0xfffd) =09{ =09=09outport_fffd(regs,value); =09} =09if (port=3D=3D0xbffd) =09{ =09=09outport_bffd(regs,value); =09} y entonces tengo un machines.cpp del que hago attach, que es el= que se encarga de configurar cada una de las futuras maquinas y= emular el port 0x7ffd. los ficheros de rom estan hardcoded y todo eso , se= tiene que hacer mejor para configurar eso por eso en la proxima entrega, intentare adjuntar el sistema de configuracion por fichero ;) venga, ESPERO que este todo (aunque seguro que algo me he= dejado) todo este codigo es criticable y modificable, pero tal y como= esta de momento funciona perfectamente :)_ (lo mejor para probarlo son= los taps, ya que se tendran que modificar las rutinas de sna y z80 bye :) Kak |