// license:BSD-3-Clause
// copyright-holders:Miodrag Milanovic, MetalliC
/***************************************************************************
Vector06c driver by Miodrag Milanovic
10/07/2008 Preliminary driver.
****************************************************************************/
#include "emu.h"
#include "includes/vector06.h"
#include "screen.h"
uint8_t vector06_state::ppi1_portb_r()
{
uint8_t key = 0xff;
for (u8 i = 0; i < 8; i++)
if (BIT(m_keyboard_mask, i))
key &= m_io_keyboard[i]->read();
return key;
}
uint8_t vector06_state::ppi1_portc_r()
{
uint8_t ret = m_io_keyboard[8]->read();
if (m_cassette->input() > 0)
ret |= 0x10;
return ret;
}
void vector06_state::ppi1_porta_w(uint8_t data)
{
m_keyboard_mask = data ^ 0xff;
}
void vector06_state::ppi1_portb_w(uint8_t data)
{
m_color_index = data & 0x0f;
if (BIT(data, 4) != m_video_mode)
{
m_video_mode = BIT(data, 4);
u16 width = m_video_mode ? 512 : 256;
rectangle visarea(0, width+64-1, 0, 256+64-1);
m_screen->configure(width+64, 256+64, visarea, m_screen->frame_period().attoseconds());
}
}
void vector06_state::color_set(uint8_t data)
{
uint8_t r = (data & 7) << 5;
uint8_t g = ((data >> 3) & 7) << 5;
uint8_t b = ((data >>6) & 3) << 6;
m_palette->set_pen_color( m_color_index, rgb_t(r,g,b) );
}
uint8_t vector06_state::ppi2_portb_r()
{
uint16_t addr = ((m_romdisk_msb & 0x7f) << 8) | m_romdisk_lsb;
if ((m_romdisk_msb & 0x80) && m_cart->exists() && addr < m_cart->get_rom_size())
return m_cart->read_rom(addr);
else
return m_ay->data_r();
}
void vector06_state::ppi2_portb_w(uint8_t data)
{
m_aylatch = data;
}
void vector06_state::ppi2_porta_w(uint8_t data)
{
m_romdisk_lsb = data;
}
void vector06_state::ppi2_portc_w (uint8_t data)
{
if (data & 4)
m_ay->address_data_w((data >> 1) & 1, m_aylatch);
m_romdisk_msb = data;
}
IRQ_CALLBACK_MEMBER(vector06_state::irq_callback)
{
// Interrupt is RST 7
return 0xff;
}
INPUT_CHANGED_MEMBER(vector06_state::f11_button)
{
if (newval)
{
m_romen = true;
update_mem();
m_maincpu->reset();
}
}
INPUT_CHANGED_MEMBER(vector06_state::f12_button)
{
if (newval)
{
m_romen = false;
update_mem();
m_maincpu->reset();
}
}
void vector06_state::disc_w(uint8_t data)
{
floppy_image_device *floppy = nullptr;
switch (data & 0x01)
{
case 0: floppy = m_floppy0->get_device(); break;
case 1: floppy = m_floppy1->get_device(); break;
}
m_fdc->set_floppy(floppy);
if (floppy)
{
// something here needs to turn the motor on
floppy->mon_w(0);
floppy->ss_w(!BIT(data, 2));
}
}
void vector06_state::update_mem()
{
if (BIT(m_rambank, 4) && m_stack_state)
{
u8 sentry = ((m_rambank >> 2) & 3) + 1;
m_bank1->set_entry(sentry);
m_bank3->set_entry(sentry);
m_bank2->set_entry(sentry + 1u);
}
else
{
m_bank1->set_entry(0);
u8 ventry = 0;
if (BIT(m_rambank, 5))
ventry = (m_rambank & 3) + 1;
m_bank3->set_entry(ventry);
if (m_romen)
m_bank2->set_entry(0);
else
m_bank2->set_entry(1);
}
}
void vector06_state::ramdisk_w(uint8_t data)
{
const uint8_t oldbank = m_rambank;
m_rambank = data;
if (oldbank != m_rambank)
update_mem();
}
void vector06_state::status_callback(uint8_t data)
{
const bool oldstate = m_stack_state;
m_stack_state = bool(data & i8080_cpu_device::STATUS_STACK);
if ((oldstate != m_stack_state) && BIT(m_rambank, 4))
update_mem();
}
WRITE_LINE_MEMBER(vector06_state::speaker_w)
{
m_speaker->level_w(state);
}
void vector06_state::machine_start()
{
u8 *r = m_ram->pointer();
m_bank1->configure_entries(0, 5, r, 0x10000);
m_bank2->configure_entry(0, m_rom);
m_bank2->configure_entries(1, 5, r, 0x10000);
m_bank3->configure_entries(0, 5, r + 0xa000, 0x10000);
save_item(NAME(m_keyboard_mask));
save_item(NAME(m_color_index));
save_item(NAME(m_romdisk_msb));
save_item(NAME(m_romdisk_lsb));
save_item(NAME(m_vblank_state));
save_item(NAME(m_rambank));
save_item(NAME(m_aylatch));
save_item(NAME(m_video_mode));
save_item(NAME(m_stack_state));
save_item(NAME(m_romen));
}
void vector06_state::machine_reset()
{
m_stack_state = false;
m_rambank = 0;
m_romen = true;
update_mem();
m_keyboard_mask = 0;
m_color_index = 0;
m_video_mode = 0;
m_bank1->set_entry(0);
m_bank2->set_entry(0);
m_bank3->set_entry(0);
}