From 18406d4332be6ce3ac44d9d5dbf7e838f47ca9f1 Mon Sep 17 00:00:00 2001 From: Raimon Zamora Date: Mon, 2 Dec 2024 15:32:09 +0100 Subject: [PATCH] =?UTF-8?q?-=20Afegim=20el=20tap=20i=20el=20savestate=20de?= =?UTF-8?q?=20Alien=208=20per=20a=20provar=20-=20Provant=20el=20berserk=20?= =?UTF-8?q?mode=20-=20Medint=20els=20t-states=20de=20altra=20forma=20-=20i?= =?UTF-8?q?ff1,=20iff2=20i=20im=20afegits=20al=20array=20de=20registres=20?= =?UTF-8?q?de=20la=20cpu=20-=20[NEW]=20getRegs()=20del=20modul=20z80=20-?= =?UTF-8?q?=20[NEW]=20loadstate()=20i=20savestate()=20al=20modul=20z80debu?= =?UTF-8?q?g=20-=20[NEW]=20"load=20arxiu"=20i=20"save=20arxiu"=20en=20cons?= =?UTF-8?q?ola=20per=20a=20carregar=20i=20guardar=20savestates=20-=20[ONGO?= =?UTF-8?q?ING]=20"tape=20load=20arxiu"=20i=20"tape=20play"=20per=20a=20ca?= =?UTF-8?q?nviar=20de=20cinta=20i=20playarla=20-=20Buffer=20de=20audio=20m?= =?UTF-8?q?=C3=A9s=20gran.=20Ara=20el=20buffer=20es=20circular.=20Continue?= =?UTF-8?q?m=20intentant=20desfer-se=20del=20jittering?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- alien8.sav | Bin 0 -> 49183 bytes alien8.tap | Bin 0 -> 47264 bytes main.cpp | 16 ++++++++++++++-- z80.cpp | 13 +++++++++++-- z80.h | 3 ++- z80debug.cpp | 48 +++++++++++++++++++++++++++++++++++++++++++----- z80debug.h | 2 ++ zx_screen.cpp | 2 +- zx_ula.cpp | 44 ++++++++++++++++++++++---------------------- 9 files changed, 95 insertions(+), 33 deletions(-) create mode 100644 alien8.sav create mode 100644 alien8.tap diff --git a/alien8.sav b/alien8.sav new file mode 100644 index 0000000000000000000000000000000000000000..fe9641fa6492c6e054285789b690f6d092337034 GIT binary patch literal 49183 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 A3;+NC literal 0 HcmV?d00001 diff --git a/alien8.tap b/alien8.tap new file mode 100644 index 0000000000000000000000000000000000000000..5623d466676b35f6ab5efd8c80411cfa15524392 GIT binary patch literal 47264 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 WJ-esD&fxfg4V15)9tWG9{Q94Rk<_vP literal 0 HcmV?d00001 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