#include #include #include "z80.h" #include "z80dis.h" #include "z80debug.h" #include "zx_ula.h" #include "zx_screen.h" #include #include SDL_AudioDeviceID sdlAudioDevice; uint8_t memory[65536]; uint32_t t = 0; uint16_t ts = 0; uint8_t ft = 0; uint32_t fps=0; uint32_t fps_time=0; uint8_t sound_buffer[1024]; uint16_t sound_pos; void audioCallback(void * userdata, uint8_t * stream, int len) { uint16_t top = len; if (sound_pos < len) { top = sound_pos; //printf("buffer underrun!\n"); } memcpy(stream, sound_buffer, top); sound_pos=0; } uint8_t test = 0; int main(int argc, char *argv[]) { FILE* f = fopen("48.rom", "rb"); fread(memory, 1024, 16, f); fclose(f); z80::reset(memory); z80::connect_port(0xfe, zx_ula::port_in, zx_ula::port_out); SDL_Init(SDL_INIT_EVERYTHING); z80debug::show(); zxscreen::show(); SDL_AudioSpec audioSpec{11025, AUDIO_U8, 1, 0, 220, 0, 0, &audioCallback, NULL}; sdlAudioDevice = SDL_OpenAudioDevice(NULL, 0, &audioSpec, NULL, 0); SDL_PauseAudioDevice(sdlAudioDevice, 0); bool should_exit = false; SDL_Event e; while (!should_exit) { while (SDL_PollEvent(&e)) { if (e.type == SDL_QUIT) { should_exit=true; break; } if (z80debug::debugging()) { if ((e.type==SDL_WINDOWEVENT) && ((e.window.event==SDL_WINDOWEVENT_SHOWN) || (e.window.event==SDL_WINDOWEVENT_EXPOSED))) { z80debug::refresh(); zxscreen::refresh(); } if (e.type == SDL_KEYDOWN) { if (e.key.keysym.scancode==SDL_SCANCODE_ESCAPE) { should_exit=true; break; } else if (e.key.keysym.scancode==SDL_SCANCODE_F10) { t += z80::step(); if (t>=69888) { t=0; z80::interrupt(); } z80debug::refresh(); zxscreen::refresh(); } else if (e.key.keysym.scancode==SDL_SCANCODE_F11) { z80debug::next(); //t += z80::step(); fps=0; fps_time = SDL_GetTicks(); zxscreen::refresh(); } else if (e.key.keysym.scancode==SDL_SCANCODE_F5) { z80::step(); z80debug::cont(); fps=0; fps_time = SDL_GetTicks(); zxscreen::refresh(); } else if (e.key.keysym.scancode==SDL_SCANCODE_RETURN) { z80debug::executeConsole(); } else if (e.key.keysym.scancode==SDL_SCANCODE_BACKSPACE) { z80debug::DeleteCharConsole(); } } if (e.type == SDL_TEXTINPUT) { z80debug::sendToConsole(e.text.text); } } else { if (e.type == SDL_KEYDOWN) { if (e.key.keysym.scancode==SDL_SCANCODE_F8) { z80debug::stop(); zxscreen::refresh(); } } } } if (!z80debug::debugging()) { if (z80debug::isbreak(z80::getPC(), 9)) { z80debug::stop(); zxscreen::refresh(); } else { uint8_t t_states = z80::step(); t += t_states; ts += t_states; if (ts>=400) { ts-=400; uint8_t ear = zx_ula::get_ear(); //if (ear) sound_buffer[sound_pos++] = ear*128; //SDL_QueueAudio(sdlAudioDevice, &beep[ear], 1); //else //SDL_ClearQueuedAudio(sdlAudioDevice); } if (t>=69888) { ft++; if (ft==16) { ft=0; zxscreen::flash(); } /* fps++; if (SDL_GetTicks() - fps_time >= 1000) { printf("FPS: %i\n", fps); fps = 0; fps_time = SDL_GetTicks(); } */ t=0; zxscreen::refresh(); z80::interrupt(); } } } } return 0; }