Files
z80/zx_system.cpp
Raimon Zamora 40c825cdb9 - [NEW] [zx_disk] SPECIFY command (0x03)
- [NEW] [zx_disk] SENSE DRIVE STATUS command (0x04)
2025-08-05 11:31:36 +02:00

124 lines
3.3 KiB
C++

#include "zx_system.h"
#include "z80.h"
#include "zx_mem.h"
#include "zx_ula.h"
#include "zx_screen.h"
#include "zx_tape.h"
#include "zx_speaker.h"
#include "ay-3-8912.h"
#include "zx_disk.h"
#include <vector>
namespace zx_system
{
bool resetting = true;
bool shutting_down = false;
uint8_t current_mode = ZX_48K;
uint8_t new_mode = ZX_48K;
std::vector<void(*)(uint32_t)> updatables;
int init(const uint8_t mode)
{
updatables.clear();
z80::clearPorts();
resetting = false;
switch(mode)
{
case ZX_NOCHANGE:
{
z80::reset();
break;
}
case ZX_48K:
{
const uint32_t clock = 3500000;
z80::init(clock);
z80::connect_port(0xfe, 0x0001, zx_ula::port_in, zx_ula::port_out);
mem::init(ZX_48K);
zxscreen::init(SCREEN_MODE_48K);
speaker::init();
speaker::register_source(zx_ula::get_sample);
registerUpdatable(zx_tape::update);
registerUpdatable(speaker::update);
//registerUpdatable(zxscreen::refresh);
return clock / 10;
break;
}
case ZX_128K:
{
const uint32_t clock = 3546900;
z80::init(clock);
z80::connect_port(0xfe, 0x0001, zx_ula::port_in, zx_ula::port_out);
mem::init(ZX_128K);
zxscreen::init(SCREEN_MODE_128K);
audio::init();
speaker::init();
speaker::register_source(zx_ula::get_sample);
speaker::register_source(audio::get_sample);
registerUpdatable(zx_tape::update);
registerUpdatable(audio::update);
registerUpdatable(speaker::update);
//registerUpdatable(zxscreen::refresh);
return clock / 10;
break;
}
case ZX_PLUS3:
{
const uint32_t clock = 3546900;
z80::init(clock);
z80::connect_port(0xfe, 0x0001, zx_ula::port_in, zx_ula::port_out);
mem::init(ZX_PLUS3);
zxscreen::init(SCREEN_MODE_128K);
audio::init();
speaker::init();
speaker::register_source(zx_ula::get_sample);
speaker::register_source(audio::get_sample);
zx_disk::init();
registerUpdatable(zx_tape::update);
registerUpdatable(audio::update);
registerUpdatable(speaker::update);
//registerUpdatable(zxscreen::refresh);
return clock / 10;
break;
}
}
return 0;
}
void reset(const uint8_t mode)
{
new_mode = mode;
resetting = true;
}
void shutdown()
{
shutting_down = true;
}
const bool shuttingDown()
{
if (resetting) init(new_mode);
return shutting_down;
}
void registerUpdatable(void(*callback)(uint32_t))
{
updatables.push_back(callback);
}
void update(uint32_t dt)
{
for (auto& call : updatables) call(dt);
}
}