Fixed SNA, Z80 loading, added load"" in F9, remapped sinclair Joysticks

This commit is contained in:
fabio.olimpieri 2012-04-14 07:37:39 +00:00
parent ec7dbc28ae
commit c8973f8493
8 changed files with 97 additions and 25 deletions

View File

@ -117,12 +117,14 @@ dist: $(BUILD)
mkdir -p $@/fbzx-wii/tapes mkdir -p $@/fbzx-wii/tapes
mkdir -p $@/fbzx-wii/snapshots mkdir -p $@/fbzx-wii/snapshots
mkdir -p $@/fbzx-wii/microdrives mkdir -p $@/fbzx-wii/microdrives
mkdir -p $@/fbzx-wii/pixmaps
mkdir -p $@/apps/fbzx-wii/doc mkdir -p $@/apps/fbzx-wii/doc
cp fbzx.dol $@/apps/fbzx-wii/boot.dol cp fbzx.dol $@/apps/fbzx-wii/boot.dol
cp spectrum-roms/* $@/fbzx-wii/spectrum-roms cp spectrum-roms/* $@/fbzx-wii/spectrum-roms
cp keymap.bmp $@/fbzx-wii/fbzx cp keymap.bmp $@/fbzx-wii/fbzx
cp AMSTRAD CAPABILITIES COPYING FAQ README README.TZX VERSIONS $@/apps/fbzx-wii/doc cp AMSTRAD CAPABILITIES COPYING FAQ README README.TZX VERSIONS $@/apps/fbzx-wii/doc
touch $@/fbzx-wii/tapes/dummy
touch $@/fbzx-wii/snapshots/dummy
touch $@/fbzx-wii/microdrives/dummy
cd $@ && tar -czf ../fbzx-wii-bin.tar.gz * cd $@ && tar -czf ../fbzx-wii-bin.tar.gz *
#--------------------------------------------------------------------------------- #---------------------------------------------------------------------------------

View File

@ -97,8 +97,6 @@ int save_z80(char *filename) {
if(ordenador.mode128k==0) // 48K if(ordenador.mode128k==0) // 48K
fprintf(fichero,"%c%c",(byte)(procesador.PC&0x0FF),(byte)((procesador.PC>>8)&0xFF)); // PC fprintf(fichero,"%c%c",(byte)(procesador.PC&0x0FF),(byte)((procesador.PC>>8)&0xFF)); // PC
//Endian?
//fprintf(fichero,"%c%c",(byte)(procesador.PC&0x0FF),(byte)((procesador.PC<<8)&0xFF)); // PC
else else
fprintf(fichero,"%c%c",0,0); // 128K fprintf(fichero,"%c%c",0,0); // 128K
@ -161,7 +159,7 @@ int save_z80(char *filename) {
int load_z80(char *filename) { int load_z80(char *filename) {
struct z80snapshot snap; static struct z80snapshot snap;
unsigned char tempo[30],tempo2[56],memo[49152],type,compressed,page,byte_read[3]; unsigned char tempo[30],tempo2[56],memo[49152],type,compressed,page,byte_read[3];
FILE *fichero; FILE *fichero;
int longitud=0,longitud2,bucle,retval; int longitud=0,longitud2,bucle,retval;
@ -427,10 +425,16 @@ int load_sna(char *filename) {
unsigned char tempo2[98308]; unsigned char tempo2[98308];
unsigned char type=0; unsigned char type=0;
FILE *fichero; FILE *fichero;
struct z80snapshot snap; static struct z80snapshot snap;
unsigned char v1,v2; unsigned char v1,v2;
int addr,loop; int addr,loop;
//Some inits
for(loop=0;loop<16;loop++)
snap.ay_regs[loop]=0;
snap.ay_latch=0;
snap.issue=3;
snap.joystick=0;
printf("Loading SNA file\n"); printf("Loading SNA file\n");
@ -568,7 +572,7 @@ void load_snap(struct z80snapshot *snap) {
procesador.Rm.br.E=snap->E; procesador.Rm.br.E=snap->E;
procesador.Rm.br.H=snap->H; procesador.Rm.br.H=snap->H;
procesador.Rm.br.L=snap->L; procesador.Rm.br.L=snap->L;
printf("A:%d F:%d B:%d C:%d D:%d E:%d H:%d L:%d\n",snap->A,snap->F,snap->B,snap->C,snap->D,snap->E,snap->H,snap->L); printf("A:%x F:%x B:%x C:%x D:%x E:%x H:%x L:%x\n",snap->A,snap->F,snap->B,snap->C,snap->D,snap->E,snap->H,snap->L);
procesador.Ra.br.A=snap->AA; procesador.Ra.br.A=snap->AA;
procesador.Ra.br.F=snap->FF; procesador.Ra.br.F=snap->FF;
procesador.Ra.br.B=snap->BB; procesador.Ra.br.B=snap->BB;
@ -577,16 +581,16 @@ void load_snap(struct z80snapshot *snap) {
procesador.Ra.br.E=snap->EE; procesador.Ra.br.E=snap->EE;
procesador.Ra.br.H=snap->HH; procesador.Ra.br.H=snap->HH;
procesador.Ra.br.L=snap->LL; procesador.Ra.br.L=snap->LL;
printf("A:%d F:%d B:%d C:%d D:%d E:%d H:%d L:%d\n",snap->AA,snap->FF,snap->BB,snap->CC,snap->DD,snap->EE,snap->HH,snap->LL); printf("A:%x F:%x B:%x C:%x D:%x E:%x H:%x L:%x\n",snap->AA,snap->FF,snap->BB,snap->CC,snap->DD,snap->EE,snap->HH,snap->LL);
procesador.Rm.wr.IX=snap->IX; procesador.Rm.wr.IX=snap->IX;
procesador.Rm.wr.IY=snap->IY; procesador.Rm.wr.IY=snap->IY;
procesador.Rm.wr.SP=snap->SP; procesador.Rm.wr.SP=snap->SP;
procesador.PC=snap->PC; procesador.PC=snap->PC;
printf("IX:%d IY:%d SP:%d PC:%d\n",snap->IX,snap->IY,snap->SP,snap->PC); printf("IX:%x IY:%x SP:%x PC:%x\n",snap->IX,snap->IY,snap->SP,snap->PC);
procesador.I=snap->I; procesador.I=snap->I;
procesador.R=snap->R; procesador.R=snap->R;
procesador.R2=snap->R; procesador.R2=snap->R;
printf("I:%d R:%d\n",snap->I,snap->R); printf("I:%x R:%x\n",snap->I,snap->R);
if(snap->IFF1) { if(snap->IFF1) {
procesador.IFF1=1; procesador.IFF1=1;
@ -598,8 +602,9 @@ void load_snap(struct z80snapshot *snap) {
} else { } else {
procesador.IFF2=0; procesador.IFF2=0;
} }
printf("IFF1:%x IFF2:%x\n",snap->IFF1,snap->IFF1);
procesador.IM=snap->Imode; procesador.IM=snap->Imode;
printf("IM:%x\n",snap->Imode);
Z80free_Out(0xFFFE,((snap->border&0x07)|0x10)); Z80free_Out(0xFFFE,((snap->border&0x07)|0x10));
switch(snap->type) { switch(snap->type) {

View File

@ -29,7 +29,7 @@ struct z80snapshot {
byte border; // border color byte border; // border color
byte pager; // content of pagination register in 128K mode byte pager; // content of pagination register in 128K mode
unsigned char page[12][16384]; unsigned char page[12][16384];
unsigned int found_pages; // bit=1: page exists. bit=0: page don't exists. //unsigned int found_pages; // bit=1: page exists. bit=0: page don't exists.
unsigned char ay_regs[16]; unsigned char ay_regs[16];
unsigned char ay_latch; unsigned char ay_latch;
unsigned char joystick; unsigned char joystick;

View File

@ -123,6 +123,7 @@ void computer_init () {
ordenador.ay_envel_way = 0; ordenador.ay_envel_way = 0;
ordenador.tape_loop_counter = 0; ordenador.tape_loop_counter = 0;
ordenador.kbd_buffer_pointer = 0;
} }
void computer_set_palete() { void computer_set_palete() {
@ -696,7 +697,30 @@ inline void read_keyboard (SDL_Event *pevento2) {
SDL_Event evento,evento2,*pevento; SDL_Event evento,evento2,*pevento;
Sint16 valor; Sint16 valor;
Uint8 eje; Uint8 eje;
static int countdown;
if (ordenador.kbd_buffer_pointer)
{
if (countdown)
countdown--;
else
{
if (ordenador.kbd_buffer_pointer != 1)
{
SDL_PushEvent(&ordenador.keyboard_buffer[ordenador.kbd_buffer_pointer-2]);
ordenador.kbd_buffer_pointer--;
countdown=5;
}
else
{
ordenador.kbd_buffer_pointer = 0;
if ((ordenador.tape_fast_load == 0) || (ordenador.tape_file_type==TAP_TZX))
ordenador.pause = 0;
}
}
}
if (pevento2==NULL) { if (pevento2==NULL) {
pevento=&evento; pevento=&evento;
if (!SDL_PollEvent (&evento)) if (!SDL_PollEvent (&evento))
@ -868,7 +892,43 @@ inline void read_keyboard (SDL_Event *pevento2) {
break; break;
case SDLK_F9: case SDLK_F9:
SDL_Fullscreen_Switch(); //SDL_Fullscreen_Switch();
//Emulate load ""
ordenador.keyboard_buffer[9].key.keysym.sym=SDLK_j;
ordenador.keyboard_buffer[9].type=SDL_KEYDOWN;
ordenador.keyboard_buffer[8].key.keysym.sym=SDLK_j;
ordenador.keyboard_buffer[8].type=SDL_KEYUP;
ordenador.keyboard_buffer[7].key.keysym.sym=SDLK_RCTRL;
ordenador.keyboard_buffer[7].type=SDL_KEYDOWN;
ordenador.keyboard_buffer[6].key.keysym.sym=SDLK_p;
ordenador.keyboard_buffer[6].type=SDL_KEYDOWN;
ordenador.keyboard_buffer[5].key.keysym.sym=SDLK_p;
ordenador.keyboard_buffer[5].type=SDL_KEYUP;
ordenador.keyboard_buffer[4].key.keysym.sym=SDLK_p;
ordenador.keyboard_buffer[4].type=SDL_KEYDOWN;
ordenador.keyboard_buffer[3].key.keysym.sym=SDLK_p;
ordenador.keyboard_buffer[3].type=SDL_KEYUP;
ordenador.keyboard_buffer[2].key.keysym.sym=SDLK_RCTRL;
ordenador.keyboard_buffer[2].type=SDL_KEYUP;
ordenador.keyboard_buffer[1].key.keysym.sym=SDLK_RETURN;
ordenador.keyboard_buffer[1].type=SDL_KEYDOWN;
ordenador.keyboard_buffer[0].key.keysym.sym=SDLK_RETURN;
ordenador.keyboard_buffer[0].type=SDL_KEYUP;
ordenador.kbd_buffer_pointer=11;
countdown=5;
break; break;
case SDLK_F10: // Reset emulator case SDLK_F10: // Reset emulator
@ -932,7 +992,7 @@ inline void read_keyboard (SDL_Event *pevento2) {
break; break;
case 3: // sinclair 2 case 3: // sinclair 2
temporal_io = SDLK_7; temporal_io = SDLK_9;
break; break;
} }
break; break;
@ -968,11 +1028,11 @@ inline void read_keyboard (SDL_Event *pevento2) {
break; break;
case 2: // sinclair 1 case 2: // sinclair 1
temporal_io = SDLK_1; temporal_io = SDLK_2;
break; break;
case 3: // sinclair 2 case 3: // sinclair 2
temporal_io = SDLK_9; temporal_io = SDLK_7;
break; break;
} }
@ -989,11 +1049,11 @@ inline void read_keyboard (SDL_Event *pevento2) {
break; break;
case 2: // sinclair 1 case 2: // sinclair 1
temporal_io = SDLK_2; temporal_io = SDLK_1;
break; break;
case 3: // sinclair 2 case 3: // sinclair 2
temporal_io = SDLK_0; temporal_io = SDLK_6;
break; break;
} }
break; break;
@ -1018,7 +1078,7 @@ inline void read_keyboard (SDL_Event *pevento2) {
break; break;
case 3: // sinclair 2 case 3: // sinclair 2
temporal_io = SDLK_6; temporal_io = SDLK_0;
break; break;
} }
break; break;

View File

@ -193,6 +193,8 @@ struct computer {
unsigned char other_ret; // 0=no change; 1=memory returns RET (201) unsigned char other_ret; // 0=no change; 1=memory returns RET (201)
unsigned char turbo; unsigned char turbo;
SDL_Event keyboard_buffer[10];
unsigned int kbd_buffer_pointer;
}; };
void computer_init(); void computer_init();

View File

@ -430,7 +430,7 @@ void load_config(struct computer *object) {
continue; continue;
} }
if (!strncmp(line,"mode=",5)) { if (!strncmp(line,"mode=",5)) {
printf("Cambio a modo %c\n",line[5]-'0'); printf("Cambio a modo %c\n",line[5]);
mode128k=line[5]-'0'; mode128k=line[5]-'0';
continue; continue;
} }
@ -636,7 +636,7 @@ int main(int argc,char *argv[]) {
argumento++; argumento++;
} else if(0==strncmp(argv[argumento],"-jump",5)) { } else if(0==strncmp(argv[argumento],"-jump",5)) {
jump_frames=(int)(argv[argumento][5]); jump_frames=(int)(argv[argumento][5]);
jump_frames-=48; jump_frames-=48;//???
argumento++; argumento++;
printf ("Jump %d\n",jump_frames); printf ("Jump %d\n",jump_frames);
} else { } else {

View File

@ -284,10 +284,13 @@ void settings_menu() {
if(ordenador.turbo){ if(ordenador.turbo){
ordenador.tst_sample=3500000/ordenador.freq; ordenador.tst_sample=3500000/ordenador.freq;
ordenador.turbo = 0; ordenador.turbo = 0;
jump_frames=0;
} else { } else {
ordenador.tst_sample=100000000/ordenador.freq; ordenador.tst_sample=12000000/ordenador.freq; //5,0 MHz max emulation speed for wii
ordenador.turbo = 1; ordenador.turbo = 1;
jump_frames=3;
} }
break;
} }
} while(fin); } while(fin);
@ -334,7 +337,7 @@ void help_menu() {
print_string(fbuffer,"tools",382,280,15,0,ancho); print_string(fbuffer,"tools",382,280,15,0,ancho);
print_string(fbuffer,"F9:",14,320,12,0,ancho); print_string(fbuffer,"F9:",14,320,12,0,ancho);
print_string(fbuffer,"Toggle fullscreen",62,320,15,0,ancho); print_string(fbuffer,"load",62,320,15,0,ancho);
print_string(fbuffer,"F10:",336,320,12,0,ancho); print_string(fbuffer,"F10:",336,320,12,0,ancho);
print_string(fbuffer,"reset spectrum",398,320,15,0,ancho); print_string(fbuffer,"reset spectrum",398,320,15,0,ancho);

View File

@ -499,8 +499,8 @@ void sound_play() {
ordenador.volume, ordenador.volume, callback); ordenador.volume, ordenador.volume, callback);
started_sound_asnd = 1; started_sound_asnd = 1;
} }
//Double buffer
while (!ASND_TestVoiceBufferReady(1)){}; while (!ASND_TestVoiceBufferReady(1)){}; //Wait for one buffer to be free
if (!ASND_TestPointer (1, sound[0])) if (!ASND_TestPointer (1, sound[0]))
{ASND_AddVoice(1,sound[0],ordenador.buffer_len); {ASND_AddVoice(1,sound[0],ordenador.buffer_len);
ordenador.current_buffer = sound[0]; } ordenador.current_buffer = sound[0]; }