diff --git a/alien8.sav b/alien8.sav new file mode 100644 index 0000000..fe9641f Binary files /dev/null and b/alien8.sav differ diff --git a/alien8.tap b/alien8.tap new file mode 100644 index 0000000..5623d46 Binary files /dev/null and b/alien8.tap differ diff --git a/main.cpp b/main.cpp index 9c9685c..25320ce 100644 --- a/main.cpp +++ b/main.cpp @@ -28,7 +28,7 @@ int main(int argc, char *argv[]) zx_ula::sound_init(); - zx_tape::load("abusimbel.tap"); + zx_tape::load("alien8.tap"); if (argc==3) { z80debug::loadngo(argv[1], argv[2]); } @@ -80,6 +80,7 @@ int main(int argc, char *argv[]) zxscreen::redraw(); } if (e.key.keysym.scancode==SDL_SCANCODE_F12) { + zx_tape::go_berserk(); zx_tape::play(); } if (e.key.keysym.scancode==SDL_SCANCODE_F11) { @@ -98,11 +99,22 @@ int main(int argc, char *argv[]) uint8_t dt = z80::step(); t_states += dt; zx_tape::update(dt); + + while (zx_tape::berserk()) + { + zx_tape::update(z80::step()); + } + zx_ula::sound_update(dt); zxscreen::refresh(dt); - if (t_states>=350000) + if (t_states>=3500000) { + //if (SDL_GetTicks()>=time+1000) + //printf("%i\n", SDL_GetTicks()-(time+1000)); + //else + // printf("%i\n", SDL_GetTicks()-(time+1000)); + //t_states = 0; while (SDL_GetTicks()65536) { strcpy(console_error, "Illegal memory address"); return; } mem_viewer_pos = address; + } else if (strcmp(cmd, "st")==0 || strcmp(cmd, "save")==0) { + getcmd(); + char filename[256]; + strcpy(filename, cmd); + savestate(filename); } else if (strcmp(cmd, "l")==0 || strcmp(cmd, "load")==0) { getcmd(); char filename[256]; strcpy(filename, cmd); + //getcmd(); + //char address[256]; + //strcpy(address, cmd); + //loadngo(filename, address); + loadstate(filename); + } else if (strcmp(cmd, "t")==0 || strcmp(cmd, "tape")==0) { getcmd(); - char address[256]; - strcpy(address, cmd); - loadngo(filename, address); - } - } + if (strcmp(cmd, "load")==0) { + getcmd(); + char filename[256]; + strcpy(filename, cmd); + zx_tape::load(filename); + } else if (strcmp(cmd, "play")==0) { + zx_tape::play(); + } + + } + } const bool isbreak(const uint16_t address, const uint8_t type) { @@ -465,4 +483,24 @@ namespace z80debug z80::setPC(address); is_debugging = false; } + + void savestate(const char *filename) + { + uint8_t *regs = z80::getRegs(); + uint8_t *memory = z80::getMem(); + FILE *f = fopen(filename, "wb"); + fwrite(regs, 31, 1, f); + fwrite(&memory[16*1024], 48*1024, 1, f); + fclose(f); + } + + void loadstate(const char *filename) + { + uint8_t *regs = z80::getRegs(); + uint8_t *memory = z80::getMem(); + FILE *f = fopen(filename, "rb"); + fread(regs, 31, 1, f); + fread(&memory[16*1024], 48*1024, 1, f); + fclose(f); + } } \ No newline at end of file diff --git a/z80debug.h b/z80debug.h index 15eeec9..20d17af 100644 --- a/z80debug.h +++ b/z80debug.h @@ -18,5 +18,7 @@ namespace z80debug const bool isbreak(const uint16_t address, const uint8_t type=1); uint32_t next(); + void savestate(const char *filename); + void loadstate(const char *filename); void loadngo(const char* filename, const char* addr); } \ No newline at end of file diff --git a/zx_screen.cpp b/zx_screen.cpp index 168de53..b16d4a8 100644 --- a/zx_screen.cpp +++ b/zx_screen.cpp @@ -85,7 +85,7 @@ namespace zxscreen { if (win) return; win = SDL_CreateWindow("ZX Spectrum Screen", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 352, 296, SDL_WINDOW_SHOWN); - ren = SDL_CreateRenderer(win, -1, 0); + ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED); tex = SDL_CreateTexture(ren, SDL_PIXELFORMAT_ARGB8888, SDL_TEXTUREACCESS_STREAMING, 352, 296); create_tables(); redraw(); diff --git a/zx_ula.cpp b/zx_ula.cpp index e7b764d..dcbe561 100644 --- a/zx_ula.cpp +++ b/zx_ula.cpp @@ -1,6 +1,8 @@ #include "zx_ula.h" #include +#define AUDIO_BUFFER_SIZE 2048 + namespace zx_ula { #define KEY_SHIFT 0 @@ -218,17 +220,22 @@ namespace zx_ula SDL_AudioDeviceID sdlAudioDevice; - uint8_t sound_buffer[1024]; - uint16_t sound_pos; + uint8_t sound_buffer[AUDIO_BUFFER_SIZE]; + uint16_t sound_pos=0; + uint16_t sound_start=0; uint16_t t_sound=0; void audioCallback(void * userdata, uint8_t * stream, int len) { - const uint16_t top = sound_pos < len ? sound_pos : len; - printf("top: %i, len: %i, pos: %i\n", top, len, sound_pos); - memcpy(stream, sound_buffer, top); - if (toptop) { @@ -244,12 +251,12 @@ namespace zx_ula else { sound_pos=last_1=0; - } + }*/ } void sound_init() { - SDL_AudioSpec audioSpec{11025, AUDIO_U8, 1, 0, 220, 0, 0, &audioCallback, NULL}; + SDL_AudioSpec audioSpec{11025, AUDIO_U8, 1, 0, AUDIO_BUFFER_SIZE>>2, 0, 0, &audioCallback, NULL}; sdlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &audioSpec, NULL, 0); sound_enable(); } @@ -267,22 +274,15 @@ namespace zx_ula void sound_update(const uint8_t dt) { t_sound += dt; - if (t_sound>=316) { - t_sound-=316; + if (t_sound>=317) { + t_sound-=317; //sound_pos = (sound_pos+1) & 0x3ff; //sound_buffer[sound_pos] = ear*128; - if (sound_pos<1024) - { - sound_buffer[sound_pos++] = ear*128; - if (ear) last_1 = sound_pos; - } - else - { - //for now, drop then buffer - sound_pos = last_1 = 0; - //printf("WARNING! Sound buffer overflow!\n"); - } + //if (sound_pos>=AUDIO_BUFFER_SIZE) sound_pos = last_1 = 0; + + sound_buffer[(sound_pos++)&(AUDIO_BUFFER_SIZE-1)] = ear*128; + //if (ear) last_1 = sound_pos; } } } \ No newline at end of file