gigatron: some more work (#6940)

* gigatron: some more work

cleanup, more callbacks, start on video generation logic

* gigatron: some more video work

(nw)

* gigatron: remove random

(nw)
This commit is contained in:
Sterophonick 2020-07-10 20:16:06 -07:00 committed by GitHub
parent 631d4901a3
commit b25fb2d37b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 104 additions and 35 deletions

View File

@ -13,7 +13,7 @@
#include "gigatrondasm.h"
DEFINE_DEVICE_TYPE(GTRON, gigatron_cpu_device, "gigatron_cpu", "Gigatron")
DEFINE_DEVICE_TYPE(GTRON, gigatron_cpu_device, "gigatron_cpu", "Gigatron CPU")
/* FLAGS */
@ -89,19 +89,6 @@ void gigatron_cpu_device::device_start()
m_program = &space(AS_PROGRAM);
m_data = &space(AS_DATA);
init();
}
void gigatron_cpu_device::init()
{
m_ac = 0;
m_x = 0;
m_y = 0;
m_pc = 0;
m_npc = (m_pc + 1) & m_romMask;
m_ppc = 0;
m_inReg = 0xFF;
state_add(GTRON_PC, "PC", m_pc);
state_add(GTRON_NPC, "NPC", m_npc);
state_add(STATE_GENPC, "GENPC", m_pc).noshow();
@ -110,6 +97,8 @@ void gigatron_cpu_device::init()
state_add(GTRON_X, "X", m_x);
state_add(GTRON_Y, "Y", m_y);
state_add(GTRON_IREG, "IREG", m_inReg);
state_add(GTRON_OUTX, "OUTX", m_outx);
state_add(GTRON_OUT, "OUT", m_out);
set_icountptr(m_icount);
@ -120,9 +109,27 @@ void gigatron_cpu_device::init()
save_item(NAME(m_ppc));
save_item(NAME(m_inReg));
save_item(NAME(m_pc));
save_item(NAME(m_outx));
save_item(NAME(m_out));
m_outx_cb.resolve_safe();
m_out_cb.resolve_safe();
m_ir_cb.resolve_safe(0);
reset_cpu();
}
void gigatron_cpu_device::reset_cpu()
{
m_ac = 0;
m_x = 0;
m_y = 0;
m_pc = 0;
m_npc = (m_pc + 1) & m_romMask;
m_ppc = 0;
m_inReg = 0xFF;
m_outx = 0;
m_out = 0;
}
void gigatron_cpu_device::branchOp(uint8_t op, uint8_t mode, uint8_t bus, uint8_t d)
@ -220,6 +227,10 @@ void gigatron_cpu_device::aluOp(uint8_t op, uint8_t mode, uint8_t bus, uint8_t d
case 6:
case 7:
uint16_t rising = ~(m_out & b);
m_out = b;
m_out_cb(0, m_out, 0xFF);
// rising edge of out[6] registers outx from ac
if (rising & 0x40)
{
m_outx = m_ac;
@ -276,6 +287,9 @@ void gigatron_cpu_device::storeOp(uint8_t op, uint8_t mode, uint8_t bus, uint8_t
case 0:
b = d;
break;
case 1:
b = 0;
break;
case 2:
b = m_ac;
break;
@ -292,7 +306,7 @@ void gigatron_cpu_device::storeOp(uint8_t op, uint8_t mode, uint8_t bus, uint8_t
switch (mode)
{
case 4:
case 4: // XXX not clear whether x++ mode takes priority
m_x = b;
break;
case 5:
@ -303,6 +317,7 @@ void gigatron_cpu_device::storeOp(uint8_t op, uint8_t mode, uint8_t bus, uint8_t
void gigatron_cpu_device::device_reset()
{
reset_cpu();
}
void gigatron_cpu_device::execute_set_input(int irqline, int state)
@ -323,6 +338,7 @@ gigatron_cpu_device::gigatron_cpu_device(const machine_config &mconfig, const ch
, m_program_config("program", ENDIANNESS_BIG, 16, 14, -1)
, m_data_config("data", ENDIANNESS_BIG, 8, 15, 0)
, m_outx_cb(*this)
, m_out_cb(*this)
, m_ir_cb(*this)
{
}

View File

@ -16,7 +16,8 @@
enum
{
GTRON_PC, GTRON_NPC,
GTRON_AC, GTRON_X, GTRON_Y, GTRON_IREG
GTRON_AC, GTRON_X, GTRON_Y, GTRON_IREG,
GTRON_OUTX, GTRON_OUT
};
@ -26,6 +27,7 @@ public:
// construction/destruction
gigatron_cpu_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
auto outx_cb() { return m_outx_cb.bind(); }
auto out_cb() { return m_out_cb.bind(); }
auto ir_cb() { return m_ir_cb.bind(); }
protected:
@ -48,6 +50,8 @@ protected:
// device_memory_interface overrides
virtual space_config_vector memory_space_config() const override;
void reset_cpu();
void branchOp(uint8_t op, uint8_t mode, uint8_t bus, uint8_t d);
void aluOp(uint8_t op, uint8_t mode, uint8_t bus, uint8_t d);
@ -63,10 +67,8 @@ protected:
uint8_t m_inReg;
uint16_t m_ramMask;
uint16_t m_romMask;
uint16_t m_out;
uint16_t m_outx;
virtual void init();
uint8_t m_out;
uint8_t m_outx;
private:
address_space_config m_program_config;
@ -81,6 +83,7 @@ private:
void gigatron_illegal();
devcb_write8 m_outx_cb;
devcb_write8 m_out_cb;
devcb_read8 m_ir_cb;
};

View File

@ -16,6 +16,8 @@
#include "speaker.h"
#define MAIN_CLOCK 6250000
#define VSYNC 0x80
#define HSYNC 0x40
class gigatron_state : public driver_device
{
@ -36,24 +38,70 @@ private:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
void prog_map(address_map &map);
void data_map(address_map &map);
uint16_t lights_changed;
uint8_t gigatron_random()
{
return machine().rand() & 0xff;
}
//Video Generation stuff
uint8_t machineOut;
uint8_t row;
uint8_t col;
uint8_t pixel;
void blinkenlights(uint8_t data);
void video_draw(u8 data);
uint8_t inputs();
std::unique_ptr<bitmap_ind16> m_bitmap_render;
std::unique_ptr<bitmap_ind16> m_bitmap_buffer;
required_device<gigatron_cpu_device> m_maincpu;
required_ioport m_io_inputs;
};
void gigatron_state::video_start()
{
m_bitmap_render = std::make_unique<bitmap_ind16>(640, 480);
m_bitmap_buffer = std::make_unique<bitmap_ind16>(640, 480);
}
void gigatron_state::video_draw(u8 data)
{
uint8_t out = data;
uint8_t falling = machineOut & ~out;
if (falling & VSYNC)
{
row = 0;
pixel = 0;
}
if (falling & HSYNC)
{
col = 0;
row++;
}
machineOut = out;
if ((out & (VSYNC | HSYNC)) != (VSYNC | HSYNC))
{
return;
}
if((row >= 0 && row < 480) && (col >= 0 && col < 640))
{
//uint16_t *dest;
//uint8_t tPixel = pixel;
//uint8_t r = (out << 6) & 0xC0;
//uint8_t g = (out << 4) & 0xC0;
//uint8_t b = (out << 2) & 0xC0;
}
}
uint32_t gigatron_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
return 0;
@ -106,6 +154,7 @@ void gigatron_state::gigatron(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &gigatron_state::prog_map);
m_maincpu->set_addrmap(AS_DATA, &gigatron_state::data_map);
m_maincpu->outx_cb().set(FUNC(gigatron_state::blinkenlights));
m_maincpu->out_cb().set(FUNC(gigatron_state::video_draw));
m_maincpu->ir_cb().set(FUNC(gigatron_state::inputs));
/* video hardware */
@ -120,15 +169,16 @@ void gigatron_state::gigatron(machine_config &config)
}
ROM_START( gigatron )
ROM_REGION( 0x20000, "maincpu", 0 )
ROM_SYSTEM_BIOS(0, "v4", "Gigatron ROM V4")
ROMX_LOAD( "gigrom4.rom", 0x0000, 0x20000, CRC(78995109) SHA1(2395fc48e64099836111f5aeca39ddbf4650ea4e),ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "v3", "Gigatron ROM V3")
ROMX_LOAD( "gigrom3.rom", 0x0000, 0x20000, CRC(1536efbe) SHA1(959268069e761a01d620396eedb9abc1ee63c421),ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "v2", "Gigatron ROM V2")
ROMX_LOAD( "gigrom2.rom", 0x0000, 0x20000, CRC(b4a3d936) SHA1(c93f417d589144b912c79f85b9e942d66242c2c3),ROM_BIOS(2))
ROM_SYSTEM_BIOS(3, "v1", "Gigatron ROM V1")
ROMX_LOAD( "gigrom1.rom", 0x0000, 0x20000, CRC(8ea5a2af) SHA1(e5758d5cc467c3476bd8f992fd45dfcdf06d0430),ROM_BIOS(3))
ROM_SYSTEM_BIOS(0, "v5a", "Gigatron ROM V5a")
ROMX_LOAD( "gigrom5a.rom", 0x0000, 0x20000, CRC(DCC071A6) SHA1(F82059BA0227FF48E4C687B90C8445DA30213EE2),ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "v4", "Gigatron ROM V4")
ROMX_LOAD( "gigrom4.rom", 0x0000, 0x20000, CRC(78995109) SHA1(2395fc48e64099836111f5aeca39ddbf4650ea4e),ROM_BIOS(1))
ROM_SYSTEM_BIOS(2, "v3", "Gigatron ROM V3")
ROMX_LOAD( "gigrom3.rom", 0x0000, 0x20000, CRC(1536efbe) SHA1(959268069e761a01d620396eedb9abc1ee63c421),ROM_BIOS(2))
ROM_SYSTEM_BIOS(3, "v2", "Gigatron ROM V2")
ROMX_LOAD( "gigrom2.rom", 0x0000, 0x20000, CRC(b4a3d936) SHA1(c93f417d589144b912c79f85b9e942d66242c2c3),ROM_BIOS(3))
ROM_SYSTEM_BIOS(4, "v1", "Gigatron ROM V1")
ROMX_LOAD( "gigrom1.rom", 0x0000, 0x20000, CRC(8ea5a2af) SHA1(e5758d5cc467c3476bd8f992fd45dfcdf06d0430),ROM_BIOS(4))
ROM_END
COMP(2018, gigatron, 0, 0, gigatron, gigatron, gigatron_state, empty_init, "Marcel van Kervinck", "Gigatron TTL Microcomputer", MACHINE_IS_SKELETON)
COMP(2018, gigatron, 0, 0, gigatron, gigatron, gigatron_state, empty_init, "Marcel van Kervinck / Walter Belgers", "Gigatron TTL Microcomputer", MACHINE_IS_SKELETON)