From 1410c438b782920378ccfec56f04c0b0ddb86ea3 Mon Sep 17 00:00:00 2001 From: "therealmogminer@gmail.com" Date: Wed, 21 Dec 2016 20:27:42 +0100 Subject: -hazeltin: Added netlist-based video board emulation. [Ryan Holtz] --- scripts/target/mame/arcade.lua | 2 + scripts/target/mame/nl.lua | 2 + src/mame/drivers/hazeltin.cpp | 622 +++++++++++++++++++-------------------- src/mame/machine/nl_hazelvid.cpp | 244 +++++++++++++++ src/mame/machine/nl_hazelvid.h | 4 + 5 files changed, 558 insertions(+), 316 deletions(-) create mode 100644 src/mame/machine/nl_hazelvid.cpp create mode 100644 src/mame/machine/nl_hazelvid.h diff --git a/scripts/target/mame/arcade.lua b/scripts/target/mame/arcade.lua index 99fe1a83c53..9a072eb8b62 100644 --- a/scripts/target/mame/arcade.lua +++ b/scripts/target/mame/arcade.lua @@ -1094,6 +1094,8 @@ files { MAME_DIR .. "src/mame/machine/nl_pongd.h", MAME_DIR .. "src/mame/machine/nl_breakout.cpp", MAME_DIR .. "src/mame/machine/nl_breakout.h", + MAME_DIR .. "src/mame/machine/nl_hazelvid.cpp", + MAME_DIR .. "src/mame/machine/nl_hazelvid.h", MAME_DIR .. "src/mame/drivers/poolshrk.cpp", MAME_DIR .. "src/mame/includes/poolshrk.h", MAME_DIR .. "src/mame/audio/poolshrk.cpp", diff --git a/scripts/target/mame/nl.lua b/scripts/target/mame/nl.lua index 8242f67c38e..b37e599613d 100644 --- a/scripts/target/mame/nl.lua +++ b/scripts/target/mame/nl.lua @@ -112,6 +112,8 @@ files{ MAME_DIR .. "src/mame/machine/nl_pongd.h", MAME_DIR .. "src/mame/machine/nl_breakout.cpp", MAME_DIR .. "src/mame/machine/nl_breakout.h", + MAME_DIR .. "src/mame/machine/nl_hazelvid.cpp", + MAME_DIR .. "src/mame/machine/nl_hazelvid.h", MAME_DIR .. "src/mame/drivers/1942.cpp", MAME_DIR .. "src/mame/includes/1942.h", diff --git a/src/mame/drivers/hazeltin.cpp b/src/mame/drivers/hazeltin.cpp index b820ca20a3c..b8f1ff8ee03 100644 --- a/src/mame/drivers/hazeltin.cpp +++ b/src/mame/drivers/hazeltin.cpp @@ -7,8 +7,16 @@ perliminary driver by Ryan Holtz -TODO: - - pretty much everything +TODO (roughly in order of importance): + - Figure out the correct keyboard decoding. + - Proper RS232 hookup. + - Iron out proper horizontal and vertical start/end values. + - Hook up /FGBIT, REV FLD FRAME, and REV VIDEO SELECT lines on video + board. + - Reimplement logic probe (since removed) as a netlist device so other + devs can use it. + - Implement /BRESET line in netlist to possibly smooth out some sync + issues. References: [1]: Hazeltine_1500_Series_Maintenance_Manual_Dec77.pdf, on Bitsavers @@ -17,64 +25,35 @@ References: #include "emu.h" #include "cpu/i8085/i8085.h" -#include "machine/7400.h" -#include "machine/7404.h" -#include "machine/7474.h" -#include "machine/74161.h" -#include "machine/74175.h" -#include "machine/82s129.h" -#include "machine/am2847.h" #include "machine/ay31015.h" #include "machine/clock.h" #include "machine/com8116.h" -#include "machine/dm9334.h" #include "machine/kb3600.h" +#include "machine/netlist.h" +#include "machine/nl_hazelvid.h" +#include "netlist/devices/net_lib.h" #define CPU_TAG "maincpu" +#define NETLIST_TAG "videobrd" #define UART_TAG "uart" #define BAUDGEN_TAG "baudgen" #define KBDC_TAG "ay53600" -#define CHARRAM_TAG "chrram" #define CHARROM_TAG "chargen" #define BAUDPORT_TAG "baud" #define MISCPORT_TAG "misc" #define MISCKEYS_TAG "misc_keys" #define SCREEN_TAG "screen" -#define TMS3409A_TAG "u67" -#define TMS3409B_TAG "u57" -#define DOTCLK_TAG "dotclk" -#define DOTCLK_DISP_TAG "dotclk_dispatch" -#define CHAR_CTR_CLK_TAG "ch_bucket_ctr_clk" -#define U58_TAG "u58" -#define U59_TAG "u59" -#define VID_PROM_ADDR_RESET_TAG "u59_y5" -#define U61_TAG "u61" -#define U68_TAG "u68" -#define U69_PROMMSB_TAG "u69" -#define U70_PROMLSB_TAG "u70" -#define U70_TC_LINE_TAG "u70_tc" -#define U71_PROM_TAG "u71" -#define U72_PROMDEC_TAG "u72" -#define U81_TAG "u81" -#define U83_TAG "u83" -#define U84_DIV11_TAG "u84" -#define U85_VERT_DR_UB_TAG "u85" -#define U87_TAG "u87" -#define U88_DIV9_TAG "u88" -#define U90_DIV14_TAG "u90" #define BAUD_PROM_TAG "u39" +#define NL_PROM_TAG "videobrd:u71" +#define NL_EPROM_TAG "videobrd:u78" +#define VIDEO_PROM_TAG "u71" +#define CHAR_EPROM_TAG "u78" +#define VIDEO_OUT_TAG "videobrd:video_out" +#define VBLANK_OUT_TAG "videobrd:vblank" +#define TVINTERQ_OUT_TAG "videobrd:tvinterq" -// Number of cycles to burn when fetching the next row of characters into the line buffer: -// CPU clock is 18MHz / 9 -// Dot clock is 33.264MHz / 2 -// 9 dots per character -// 80 visible characters per line -// Total duration of fetch: 1440 33.264MHz clock cycles -// -// 2*9*80 1 1440 * XTAL_2MHz -// -------------- divided by --------- = ---------------- = 86.5 main CPU cycles per line fetch -// XTAL_33_264MHz XTAL_2MHz XTAL_33_264MHz -#define LINE_FETCH_CYCLES (87) +#define VIDEO_CLOCK (XTAL_33_264MHz/2) +#define VIDEOBRD_CLOCK (XTAL_33_264MHz*30) #define SR2_FULL_DUPLEX (0x01) #define SR2_UPPER_ONLY (0x08) @@ -91,9 +70,7 @@ References: #define SCREEN_VTOTAL (28*11) #define SCREEN_VDISP (24*11) -#define SCREEN_VSTART (0) - -#define VERT_UB_LINE (24*11+8) +#define SCREEN_VSTART (3*11) class hazl1500_state : public driver_device { @@ -101,53 +78,70 @@ public: hazl1500_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, CPU_TAG) - , m_uart(*this, UART_TAG) + , m_video_board(*this, NETLIST_TAG) + , m_u71(*this, NL_PROM_TAG) + , m_u78(*this, NL_EPROM_TAG) + , m_u9(*this, "videobrd:u9") + , m_u10(*this, "videobrd:u10") + , m_u11(*this, "videobrd:u11") + , m_u12(*this, "videobrd:u12") + , m_u13(*this, "videobrd:u13") + , m_u14(*this, "videobrd:u14") + , m_u15(*this, "videobrd:u15") + , m_u16(*this, "videobrd:u16") + , m_u22(*this, "videobrd:u22") + , m_u23(*this, "videobrd:u23") + , m_u24(*this, "videobrd:u24") + , m_u25(*this, "videobrd:u25") + , m_u26(*this, "videobrd:u26") + , m_u27(*this, "videobrd:u27") + , m_u28(*this, "videobrd:u28") + , m_u29(*this, "videobrd:u29") + , m_cpu_db0(*this, "videobrd:cpu_db0") + , m_cpu_db1(*this, "videobrd:cpu_db1") + , m_cpu_db2(*this, "videobrd:cpu_db2") + , m_cpu_db3(*this, "videobrd:cpu_db3") + , m_cpu_db4(*this, "videobrd:cpu_db4") + , m_cpu_db5(*this, "videobrd:cpu_db5") + , m_cpu_db6(*this, "videobrd:cpu_db6") + , m_cpu_db7(*this, "videobrd:cpu_db7") + , m_cpu_ba4(*this, "videobrd:cpu_ba4") + , m_cpu_iowq(*this, "videobrd:cpu_iowq") + , m_video_out(*this, VIDEO_OUT_TAG) + , m_vblank_out(*this, VBLANK_OUT_TAG) + , m_tvinterq_out(*this, TVINTERQ_OUT_TAG) + , m_uart(*this, UART_TAG) , m_kbdc(*this, KBDC_TAG) , m_baud_dips(*this, BAUDPORT_TAG) , m_baud_prom(*this, BAUD_PROM_TAG) , m_misc_dips(*this, MISCPORT_TAG) , m_kbd_misc_keys(*this, MISCKEYS_TAG) - , m_char_ram(*this, CHARRAM_TAG) - , m_char_rom(*this, CHARROM_TAG) - , m_line_buffer_lsb(*this, TMS3409A_TAG) - , m_line_buffer_msb(*this, TMS3409B_TAG) - , m_dotclk(*this, DOTCLK_TAG) - , m_vid_prom_msb(*this, U69_PROMMSB_TAG) - , m_vid_prom_lsb(*this, U70_PROMLSB_TAG) - , m_vid_prom(*this, U71_PROM_TAG) - , m_u59(*this, U59_TAG) - , m_u83(*this, U83_TAG) - , m_char_y(*this, U84_DIV11_TAG) - , m_char_x(*this, U88_DIV9_TAG) - , m_vid_div14(*this, U90_DIV14_TAG) - , m_vid_decode(*this, U72_PROMDEC_TAG) - , m_u58(*this, U58_TAG) - , m_u68(*this, U68_TAG) - , m_u81(*this, U81_TAG) - , m_u87(*this, U87_TAG) - , m_u61(*this, U61_TAG) , m_screen(*this, SCREEN_TAG) - , m_hblank_timer(nullptr) - , m_scanline_timer(nullptr) - , m_status_reg_3(0) + , m_iowq_timer(nullptr) + , m_status_reg_3(0) , m_kbd_status_latch(0) , m_refresh_address(0) - , m_vpos(0) - , m_hblank(false) - , m_vblank(false) - , m_delayed_vblank(false) - { + , m_screen_buf(nullptr) + , m_last_beam(0.0) + , m_last_hpos(0) + , m_last_vpos(0) + , m_last_fraction(0.0) + { } - //m_maincpu->adjust_icount(-14); - virtual void machine_start() override; virtual void machine_reset() override; + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - uint32_t screen_update_hazl1500(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + static const device_timer_id TIMER_IOWQ = 0; + + uint32_t screen_update_hazl1500(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(com5016_fr_w); + DECLARE_READ8_MEMBER(ram_r); + DECLARE_WRITE8_MEMBER(ram_w); + DECLARE_READ8_MEMBER(system_test_r); // noted as "for use with auto test equip" in flowchart on pg. 30, ref[1], jumps to 0x8000 if bit 0 is unset DECLARE_READ8_MEMBER(status_reg_2_r); DECLARE_WRITE8_MEMBER(status_reg_3_w); @@ -162,101 +156,96 @@ public: DECLARE_WRITE_LINE_MEMBER(ay3600_data_ready_w); DECLARE_WRITE8_MEMBER(refresh_address_w); - virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override; - static const device_timer_id TIMER_HBLANK = 0; - static const device_timer_id TIMER_SCANLINE = 1; + NETDEV_ANALOG_CALLBACK_MEMBER(video_out_cb); + NETDEV_ANALOG_CALLBACK_MEMBER(vblank_cb); + NETDEV_ANALOG_CALLBACK_MEMBER(tvinterq_cb); private: - void check_tv_interrupt(); - void update_tv_unblank(); - void scanline_tick(); - void draw_scanline(uint32_t *pix); - required_device m_maincpu; - required_device m_uart; + required_device m_video_board; + required_device m_u71; + required_device m_u78; + required_device m_u9; + required_device m_u10; + required_device m_u11; + required_device m_u12; + required_device m_u13; + required_device m_u14; + required_device m_u15; + required_device m_u16; + required_device m_u22; + required_device m_u23; + required_device m_u24; + required_device m_u25; + required_device m_u26; + required_device m_u27; + required_device m_u28; + required_device m_u29; + required_device m_cpu_db0; + required_device m_cpu_db1; + required_device m_cpu_db2; + required_device m_cpu_db3; + required_device m_cpu_db4; + required_device m_cpu_db5; + required_device m_cpu_db6; + required_device m_cpu_db7; + required_device m_cpu_ba4; + required_device m_cpu_iowq; + required_device m_video_out; + required_device m_vblank_out; + required_device m_tvinterq_out; + required_device m_uart; required_device m_kbdc; required_ioport m_baud_dips; required_region_ptr m_baud_prom; required_ioport m_misc_dips; required_ioport m_kbd_misc_keys; - required_shared_ptr m_char_ram; - required_region_ptr m_char_rom; - required_device m_line_buffer_lsb; - required_device m_line_buffer_msb; - required_device m_dotclk; - required_device m_vid_prom_msb; - required_device m_vid_prom_lsb; - required_device m_vid_prom; - required_device m_u59; - required_device m_u83; - required_device m_char_y; - required_device m_char_x; - required_device m_vid_div14; - required_device m_vid_decode; - required_device m_u58; - required_device m_u68; - required_device m_u81; - required_device m_u87; - required_device m_u61; - required_device m_screen; - std::unique_ptr m_screen_pixbuf; - - emu_timer *m_hblank_timer; - emu_timer *m_scanline_timer; + emu_timer* m_iowq_timer; - uint8_t m_status_reg_3; + uint8_t m_status_reg_3; uint8_t m_kbd_status_latch; uint8_t m_refresh_address; - uint16_t m_vpos; - bool m_hblank; - bool m_vblank; - bool m_delayed_vblank; + + std::unique_ptr m_screen_buf; + + double m_last_beam; + int m_last_hpos; + int m_last_vpos; + double m_last_fraction; }; void hazl1500_state::machine_start() { - m_hblank_timer = timer_alloc(TIMER_HBLANK); - m_hblank_timer->adjust(attotime::never); + m_screen_buf = std::make_unique(SCREEN_HTOTAL * SCREEN_VTOTAL); - m_scanline_timer = timer_alloc(TIMER_SCANLINE); - m_scanline_timer->adjust(attotime::never); + m_iowq_timer = timer_alloc(TIMER_IOWQ); + m_iowq_timer->adjust(attotime::never); - m_screen_pixbuf = std::make_unique(SCREEN_HTOTAL * SCREEN_VTOTAL); - - save_item(NAME(m_status_reg_3)); + save_item(NAME(m_status_reg_3)); save_item(NAME(m_kbd_status_latch)); save_item(NAME(m_refresh_address)); - save_item(NAME(m_vpos)); - save_item(NAME(m_hblank)); - save_item(NAME(m_vblank)); - save_item(NAME(m_delayed_vblank)); + save_item(NAME(m_last_beam)); + save_item(NAME(m_last_hpos)); + save_item(NAME(m_last_vpos)); + save_item(NAME(m_last_fraction)); } void hazl1500_state::machine_reset() { m_status_reg_3 = 0; m_kbd_status_latch = 0; - - m_refresh_address = 0; - m_screen->reset_origin(0, 0); - m_vpos = m_screen->vpos(); - m_vblank = (m_vpos >= SCREEN_VDISP); - m_delayed_vblank = m_vpos < VERT_UB_LINE; - if (!m_vblank) - m_kbd_status_latch |= KBD_STATUS_TV_UB; - m_hblank = true; - m_hblank_timer->adjust(m_screen->time_until_pos(m_vpos, SCREEN_HSTART)); - m_scanline_timer->adjust(m_screen->time_until_pos(m_vpos + 1, 0)); - - m_vid_prom_lsb->p_w(generic_space(), 0, 0); - m_vid_prom_msb->p_w(generic_space(), 0, 0); } +void hazl1500_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + m_cpu_iowq->write(1); + m_cpu_ba4->write(1); +} WRITE_LINE_MEMBER( hazl1500_state::com5016_fr_w ) { @@ -266,10 +255,65 @@ WRITE_LINE_MEMBER( hazl1500_state::com5016_fr_w ) uint32_t hazl1500_state::screen_update_hazl1500(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { - memcpy(&bitmap.pix32(0), &m_screen_pixbuf[0], sizeof(uint32_t) * SCREEN_HTOTAL * SCREEN_VTOTAL); + int last_index = m_last_vpos * SCREEN_HTOTAL + m_last_hpos; + while (last_index < SCREEN_HTOTAL * SCREEN_VTOTAL) + { + m_screen_buf[last_index++] = m_last_beam; + } + m_last_hpos = 0; + m_last_vpos = 0; + + uint32_t pixindex = 0; + for (int y = 0; y < SCREEN_VTOTAL; y++) + { + uint32_t *scanline = &bitmap.pix32(y); + pixindex = y * SCREEN_HTOTAL; + for (int x = 0; x < SCREEN_HTOTAL; x++) + //*scanline++ = 0xff000000 | (uint8_t(m_screen_buf[pixindex++] * 0.5) * 0x010101); + *scanline++ = 0xff000000 | (uint8_t(m_screen_buf[pixindex++] * 63.0) * 0x010101); + } + return 0; } +READ8_MEMBER( hazl1500_state::ram_r ) +{ + const uint8_t* chips[2][8] = + { + { m_u29->ptr(), m_u28->ptr(), m_u27->ptr(), m_u26->ptr(), m_u25->ptr(), m_u24->ptr(), m_u23->ptr(), m_u22->ptr() }, + { m_u16->ptr(), m_u15->ptr(), m_u14->ptr(), m_u13->ptr(), m_u12->ptr(), m_u11->ptr(), m_u10->ptr(), m_u9->ptr() } + }; + + int bank = ((offset & 0x400) != 0 ? 1 : 0); + const int byte_pos = (offset >> 3) & 0x7f; + const int bit_pos = offset & 7; + + uint8_t ret = 0; + for (std::size_t bit = 0; bit < 8; bit++) + ret |= ((chips[bank][bit][byte_pos] >> bit_pos) & 1) << bit; + + return ret; +} + +WRITE8_MEMBER( hazl1500_state::ram_w ) +{ + uint8_t* chips[2][8] = + { + { m_u29->ptr(), m_u28->ptr(), m_u27->ptr(), m_u26->ptr(), m_u25->ptr(), m_u24->ptr(), m_u23->ptr(), m_u22->ptr() }, + { m_u16->ptr(), m_u15->ptr(), m_u14->ptr(), m_u13->ptr(), m_u12->ptr(), m_u11->ptr(), m_u10->ptr(), m_u9->ptr() } + }; + + int bank = ((offset & 0x400) != 0 ? 1 : 0); + const int byte_pos = (offset >> 3) & 0x7f; + const int bit_pos = offset & 7; + + for (std::size_t bit = 0; bit < 8; bit++) + { + chips[bank][bit][byte_pos] &= ~(1 << bit_pos); + chips[bank][bit][byte_pos] |= ((data >> bit) & 1) << bit_pos; + } +} + READ8_MEMBER( hazl1500_state::system_test_r ) { return 0xff; @@ -305,7 +349,6 @@ WRITE8_MEMBER( hazl1500_state::uart_w ) READ8_MEMBER( hazl1500_state::kbd_status_latch_r ) { - //printf("m_kbd_status_latch r: %02x\n", m_kbd_status_latch); return m_kbd_status_latch; } @@ -343,124 +386,94 @@ WRITE_LINE_MEMBER(hazl1500_state::ay3600_data_ready_w) m_kbd_status_latch &= ~KBD_STATUS_KBDR; } -void hazl1500_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +NETDEV_ANALOG_CALLBACK_MEMBER(hazl1500_state::vblank_cb) { - switch(id) - { - case TIMER_HBLANK: - if (m_hblank) - { - m_hblank_timer->adjust(m_screen->time_until_pos(m_vpos, SCREEN_HSTART + SCREEN_HDISP)); - } - else - { - m_hblank_timer->adjust(m_screen->time_until_pos((m_vpos + 1) % SCREEN_VTOTAL, SCREEN_HSTART)); - } - m_hblank ^= 1; - break; - - case TIMER_SCANLINE: - { - scanline_tick(); - break; - } - } + synchronize(); + if (int(data) > 1) + { + m_kbd_status_latch &= ~KBD_STATUS_TV_UB; + } + else + { + m_kbd_status_latch |= KBD_STATUS_TV_UB; + } } -WRITE8_MEMBER(hazl1500_state::refresh_address_w) +NETDEV_ANALOG_CALLBACK_MEMBER(hazl1500_state::tvinterq_cb) { - m_refresh_address = data; - //printf("m_refresh_address %x, vpos %d, screen vpos %d\n", m_refresh_address, m_vpos, m_screen->vpos()); + synchronize(); + if (int(data) > 1) + { + m_kbd_status_latch &= ~KBD_STATUS_TV_INT; + m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE); + } + else + { + m_kbd_status_latch |= KBD_STATUS_TV_INT; + m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE); + } } -void hazl1500_state::check_tv_interrupt() +NETDEV_ANALOG_CALLBACK_MEMBER(hazl1500_state::video_out_cb) { - uint8_t char_row = m_vpos % 11; - bool bit_match = char_row == 2 || char_row == 3; - bool tv_interrupt = bit_match && !m_delayed_vblank; - //printf("interrupt for line %d (%d): %s\n", m_vpos, char_row, tv_interrupt ? "yes" : "no"); - - m_kbd_status_latch &= ~KBD_STATUS_TV_INT; - m_kbd_status_latch |= tv_interrupt ? KBD_STATUS_TV_INT : 0; - - m_maincpu->set_input_line(INPUT_LINE_IRQ0, tv_interrupt ? ASSERT_LINE : CLEAR_LINE); -} - -void hazl1500_state::update_tv_unblank() -{ - if (!m_vblank) - { - m_kbd_status_latch |= KBD_STATUS_TV_UB; - } - else + synchronize(); + attotime second_fraction(0, time.attoseconds()); + attotime frame_fraction(0, (second_fraction * 60).attoseconds()); + attotime pixel_time = frame_fraction * (SCREEN_HTOTAL * SCREEN_VTOTAL); + int32_t pixel_index = (frame_fraction * (SCREEN_HTOTAL * SCREEN_VTOTAL)).seconds(); + double pixel_fraction = ATTOSECONDS_TO_DOUBLE(pixel_time.attoseconds()); + + pixel_index -= 16; // take back 16 clock cycles to honor the circuitry god whose ark this is + if (pixel_index < 0) { - m_kbd_status_latch &= ~KBD_STATUS_TV_UB; + m_last_beam = float(data); + m_last_hpos = 0; + m_last_vpos = 0; + m_last_fraction = 0.0; + return; } -} - -void hazl1500_state::scanline_tick() -{ - uint16_t old_vpos = m_vpos; - m_vpos = (m_vpos + 1) % SCREEN_VTOTAL; - m_vblank = (m_vpos >= SCREEN_VDISP); - m_delayed_vblank = m_vpos >= VERT_UB_LINE; - check_tv_interrupt(); - update_tv_unblank(); + const int hpos = pixel_index % SCREEN_HTOTAL;//m_screen->hpos(); + const int vpos = pixel_index / SCREEN_HTOTAL;//m_screen->vpos(); + const int curr_index = vpos * SCREEN_HTOTAL + hpos; - draw_scanline(&m_screen_pixbuf[old_vpos * SCREEN_HTOTAL + SCREEN_HSTART]); + int last_index = m_last_vpos * SCREEN_HTOTAL + m_last_hpos; + if (last_index != curr_index) + { + m_screen_buf[last_index] *= m_last_fraction; + m_screen_buf[last_index] += float(m_last_beam * (1.0 - m_last_fraction)); + last_index++; + while (last_index <= curr_index) + m_screen_buf[last_index++] = float(m_last_beam); + } - m_scanline_timer->adjust(m_screen->time_until_pos((m_vpos + 1) % SCREEN_VTOTAL, 0)); + m_last_beam = float(data); + m_last_hpos = hpos; + m_last_vpos = vpos; + m_last_fraction = pixel_fraction; } -void hazl1500_state::draw_scanline(uint32_t *pix) +WRITE8_MEMBER(hazl1500_state::refresh_address_w) { - static const uint32_t palette[4] = { 0xff000000, 0xff006000, 0xff000000, 0xff00c000 }; - - uint16_t ram_offset = m_refresh_address << 4; - uint8_t char_row = m_vpos % 11; - uint8_t recycle = (char_row != 10 ? 0xff : 0x00); - m_line_buffer_lsb->rc_w(recycle & 0xf); - m_line_buffer_msb->rc_w(recycle >> 4); - - if (recycle == 0) - m_maincpu->adjust_icount(-LINE_FETCH_CYCLES); - - for (uint16_t x = 0; x < 80; x++) - { - uint8_t in = 0; - if (!m_vblank) - in = m_char_ram[ram_offset + x]; - - m_line_buffer_lsb->in_w(in & 0xf); - m_line_buffer_lsb->cp_w(1); - m_line_buffer_lsb->cp_w(0); - - m_line_buffer_msb->in_w(in >> 4); - m_line_buffer_msb->cp_w(1); - m_line_buffer_msb->cp_w(0); - - const uint8_t chr = (m_line_buffer_msb->out_r() << 4) | m_line_buffer_lsb->out_r(); - const uint16_t chr_addr = (chr & 0x7f) << 4; - const uint8_t gfx = m_char_rom[chr_addr | char_row]; - const uint8_t bright = (chr & 0x80) >> 6; - - *pix++ = palette[0]; - *pix++ = palette[BIT(gfx, 6) | bright]; - *pix++ = palette[BIT(gfx, 5) | bright]; - *pix++ = palette[BIT(gfx, 4) | bright]; - *pix++ = palette[BIT(gfx, 3) | bright]; - *pix++ = palette[BIT(gfx, 2) | bright]; - *pix++ = palette[BIT(gfx, 1) | bright]; - *pix++ = palette[BIT(gfx, 0) | bright]; - *pix++ = palette[0]; - } + synchronize(); + //printf("refresh: %02x, %d, %d\n", data, m_screen->hpos(), m_screen->vpos()); + m_iowq_timer->adjust(attotime::from_hz(XTAL_18MHz/9)); + m_cpu_iowq->write(0); + m_cpu_ba4->write(0); + m_cpu_db0->write((data >> 0) & 1); + m_cpu_db1->write((data >> 1) & 1); + m_cpu_db2->write((data >> 2) & 1); + m_cpu_db3->write((data >> 3) & 1); + m_cpu_db4->write((data >> 4) & 1); + m_cpu_db5->write((data >> 5) & 1); + m_cpu_db6->write((data >> 6) & 1); + m_cpu_db7->write((data >> 7) & 1); } static ADDRESS_MAP_START(hazl1500_mem, AS_PROGRAM, 8, hazl1500_state) ADDRESS_MAP_UNMAP_HIGH AM_RANGE(0x0000, 0x07ff) AM_ROM - AM_RANGE(0x3000, 0x377f) AM_RAM AM_SHARE(CHARRAM_TAG) + AM_RANGE(0x3000, 0x377f) AM_READWRITE(ram_r, ram_w) AM_RANGE(0x3780, 0x37ff) AM_RAM ADDRESS_MAP_END @@ -668,7 +681,7 @@ static const gfx_layout hazl1500_charlayout = }; static GFXDECODE_START( hazl1500 ) - GFXDECODE_ENTRY( "chargen", 0x0000, hazl1500_charlayout, 0, 1 ) + GFXDECODE_ENTRY( CHAR_EPROM_TAG, 0x0000, hazl1500_charlayout, 0, 1 ) GFXDECODE_END static MACHINE_CONFIG_START( hazl1500, hazl1500_state ) @@ -679,11 +692,14 @@ static MACHINE_CONFIG_START( hazl1500, hazl1500_state ) MCFG_QUANTUM_PERFECT_CPU(CPU_TAG) /* video hardware */ - MCFG_SCREEN_ADD_MONOCHROME(SCREEN_TAG, RASTER, rgb_t::green()) + MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) MCFG_SCREEN_UPDATE_DRIVER(hazl1500_state, screen_update_hazl1500) - MCFG_SCREEN_RAW_PARAMS(XTAL_33_264MHz/2, - SCREEN_HTOTAL, SCREEN_HSTART, SCREEN_HSTART + SCREEN_HDISP, - SCREEN_VTOTAL, SCREEN_VSTART, SCREEN_VSTART + SCREEN_VDISP); + //MCFG_SCREEN_RAW_PARAMS(XTAL_33_264MHz / 2, + // SCREEN_HTOTAL, SCREEN_HSTART, SCREEN_HSTART + SCREEN_HDISP, + // SCREEN_VTOTAL, SCREEN_VSTART, SCREEN_VSTART + SCREEN_VDISP); // TODO: Figure out exact visibility + MCFG_SCREEN_RAW_PARAMS(XTAL_33_264MHz / 2, + SCREEN_HTOTAL, 0, SCREEN_HTOTAL, + SCREEN_VTOTAL, 0, SCREEN_VTOTAL); MCFG_PALETTE_ADD_MONOCHROME("palette") MCFG_GFXDECODE_ADD("gfxdecode", "palette", hazl1500) @@ -693,74 +709,46 @@ static MACHINE_CONFIG_START( hazl1500, hazl1500_state ) MCFG_DEVICE_ADD(UART_TAG, AY51013, 0) - MCFG_TMS3409_ADD(TMS3409A_TAG) - MCFG_TMS3409_ADD(TMS3409B_TAG) - - MCFG_CLOCK_ADD(DOTCLK_TAG, XTAL_33_264MHz/2) - MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE(DOTCLK_DISP_TAG, devcb_line_dispatch_device<2>, in_w)) - - MCFG_LINE_DISPATCH_ADD(DOTCLK_DISP_TAG, 2) - MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(U81_TAG, ttl74175_device, clock_w)) - MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(U88_DIV9_TAG, ttl74161_device, clock_w)) - - MCFG_74161_ADD(U70_PROMLSB_TAG) - MCFG_7416x_QA_CB(DEVWRITELINE(U71_PROM_TAG, prom82s129_device, a0_w)) - MCFG_7416x_QB_CB(DEVWRITELINE(U71_PROM_TAG, prom82s129_device, a1_w)) - MCFG_7416x_QC_CB(DEVWRITELINE(U71_PROM_TAG, prom82s129_device, a2_w)) - MCFG_7416x_QD_CB(DEVWRITELINE(U71_PROM_TAG, prom82s129_device, a3_w)) - MCFG_7416x_TC_CB(DEVWRITELINE(U70_TC_LINE_TAG, devcb_line_dispatch_device<2>, in_w)) - - MCFG_LINE_DISPATCH_ADD(U70_TC_LINE_TAG, 2) - MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(U69_PROMMSB_TAG, ttl74161_device, cet_w)) - MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(U69_PROMMSB_TAG, ttl74161_device, cep_w)) - - MCFG_74161_ADD(U69_PROMMSB_TAG) - MCFG_7416x_QA_CB(DEVWRITELINE(U71_PROM_TAG, prom82s129_device, a4_w)) - MCFG_7416x_QB_CB(DEVWRITELINE(U71_PROM_TAG, prom82s129_device, a5_w)) - MCFG_7416x_QC_CB(DEVWRITELINE(U71_PROM_TAG, prom82s129_device, a6_w)) - - //MCFG_LINE_DISPATCH_ADD(CHAR_LINE_CNT_CLK_TAG, 3) - //MCFG_LINE_DISPATCH_FWD_CB(0, 3, DEVWRITELINE(U85_VERT_DR_UB_TAG, ttl7473_device, clk1_w)) - //MCFG_LINE_DISPATCH_FWD_CB(1, 3, DEVWRITELINE(U85_VERT_DR_UB_TAG, ttl7473_device, clk2_w)) - //MCFG_LINE_DISPATCH_FWD_CB(2, 3, DEVWRITELINE(U84_DIV11_TAG, ttl74161_device, clock_w)) - - MCFG_7400_ADD(U83_TAG) - //MCFG_7400_Y1_CB(DEVWRITELINE(CHAR_LINE_CNT_CLK_TAG, devcb_line_dispatch_device<4>, in_w)) - - MCFG_74161_ADD(U84_DIV11_TAG) - MCFG_74161_ADD(U90_DIV14_TAG) - - MCFG_74161_ADD(U88_DIV9_TAG) - MCFG_7416x_QC_CB(DEVWRITELINE(U81_TAG, ttl74175_device, d4_w)) - MCFG_7416x_TC_CB(DEVWRITELINE(U81_TAG, ttl74175_device, d1_w)) - - MCFG_LINE_DISPATCH_ADD(CHAR_CTR_CLK_TAG, 2) - MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(U70_PROMLSB_TAG, ttl74161_device, clock_w)) - MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(U69_PROMMSB_TAG, ttl74161_device, clock_w)) - - MCFG_74175_ADD(U58_TAG) - MCFG_74175_ADD(U68_TAG) - MCFG_74175_ADD(U81_TAG) - MCFG_74175_Q1_CB(DEVWRITELINE(U81_TAG, ttl74175_device, d2_w)) - MCFG_74175_NOT_Q2_CB(DEVWRITELINE(CHAR_CTR_CLK_TAG, devcb_line_dispatch_device<2>, in_w)) - - MCFG_DM9334_ADD(U72_PROMDEC_TAG) - MCFG_DM9334_Q4_CB(DEVWRITELINE(U83_TAG, ttl7400_device, b1_w)) - - MCFG_82S129_ADD(U71_PROM_TAG) - MCFG_82S129_O1_CB(DEVWRITELINE(U72_PROMDEC_TAG, dm9334_device, a0_w)) - MCFG_82S129_O2_CB(DEVWRITELINE(U72_PROMDEC_TAG, dm9334_device, a1_w)) - MCFG_82S129_O3_CB(DEVWRITELINE(U72_PROMDEC_TAG, dm9334_device, a2_w)) - MCFG_82S129_O4_CB(DEVWRITELINE(U72_PROMDEC_TAG, dm9334_device, d_w)) - - MCFG_7404_ADD(U61_TAG) - MCFG_7404_ADD(U87_TAG) - MCFG_7404_ADD(U59_TAG) - MCFG_7404_Y5_CB(DEVWRITELINE(VID_PROM_ADDR_RESET_TAG, devcb_line_dispatch_device<2>, in_w)) - - MCFG_LINE_DISPATCH_ADD(VID_PROM_ADDR_RESET_TAG, 2) - MCFG_LINE_DISPATCH_FWD_CB(0, 2, DEVWRITELINE(U70_PROMLSB_TAG, ttl74161_device, pe_w)) - MCFG_LINE_DISPATCH_FWD_CB(1, 2, DEVWRITELINE(U69_PROMMSB_TAG, ttl74161_device, pe_w)) + MCFG_DEVICE_ADD(NETLIST_TAG, NETLIST_CPU, VIDEOBRD_CLOCK) + MCFG_NETLIST_SETUP(hazelvid) + + MCFG_NETLIST_ROM_REGION(NETLIST_TAG, VIDEO_PROM_TAG, VIDEO_PROM_TAG, VIDEO_PROM_TAG) + MCFG_NETLIST_ROM_REGION(NETLIST_TAG, CHAR_EPROM_TAG, CHAR_EPROM_TAG, CHAR_EPROM_TAG) + + // First 1K + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u22", "u22") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u23", "u23") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u24", "u24") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u25", "u25") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u26", "u26") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u27", "u27") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u28", "u28") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u29", "u29") + + // Second 1K + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u9", "u9") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u10", "u10") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u11", "u11") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u12", "u12") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u13", "u13") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u14", "u14") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u15", "u15") + MCFG_NETLIST_RAM_POINTER(NETLIST_TAG, "u16", "u16") + + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_iowq", "cpu_iowq.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_ba4", "cpu_ba4.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db0", "cpu_db0.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db1", "cpu_db1.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db2", "cpu_db2.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db3", "cpu_db3.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db4", "cpu_db4.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db5", "cpu_db5.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db6", "cpu_db6.IN", 0) + MCFG_NETLIST_LOGIC_INPUT(NETLIST_TAG, "cpu_db7", "cpu_db7.IN", 0) + + MCFG_NETLIST_ANALOG_OUTPUT(NETLIST_TAG, "video_out", "video_out", hazl1500_state, video_out_cb, "") + MCFG_NETLIST_ANALOG_OUTPUT(NETLIST_TAG, "vblank", "vblank", hazl1500_state, vblank_cb, "") + MCFG_NETLIST_ANALOG_OUTPUT(NETLIST_TAG, "tvinterq", "tvinterq", hazl1500_state, tvinterq_cb, "") /* keyboard controller */ MCFG_DEVICE_ADD(KBDC_TAG, AY3600, 0) @@ -780,16 +768,18 @@ MACHINE_CONFIG_END ROM_START( hazl1500 ) + ROM_REGION( 0x10000, NETLIST_TAG, ROMREGION_ERASE00 ) + ROM_REGION( 0x10000, CPU_TAG, ROMREGION_ERASEFF ) ROM_LOAD( "h15s-00I-10-3.bin", 0x0000, 0x0800, CRC(a2015f72) SHA1(357cde517c3dcf693de580881add058c7b26dfaa)) - ROM_REGION( 0x800, CHARROM_TAG, ROMREGION_ERASEFF ) + ROM_REGION( 0x800, CHAR_EPROM_TAG, ROMREGION_ERASEFF ) ROM_LOAD( "u83_chr.bin", 0x0000, 0x0800, CRC(e0c6b734) SHA1(7c42947235c66c41059fd4384e09f4f3a17c9857)) ROM_REGION( 0x100, BAUD_PROM_TAG, ROMREGION_ERASEFF ) ROM_LOAD( "u43_702129_82s129.bin", 0x0000, 0x0100, CRC(b35aea2b) SHA1(4702620cdef72b32a397580c22b75df36e24ac74)) - ROM_REGION( 0x100, U71_PROM_TAG, ROMREGION_ERASEFF ) + ROM_REGION( 0x100, VIDEO_PROM_TAG, ROMREGION_ERASEFF ) ROM_LOAD( "u90_702128_82s129.bin", 0x0000, 0x0100, CRC(277bc424) SHA1(528a0de3b54d159bc14411961961706bf9ec41bf)) ROM_END diff --git a/src/mame/machine/nl_hazelvid.cpp b/src/mame/machine/nl_hazelvid.cpp new file mode 100644 index 00000000000..64f2f4294d4 --- /dev/null +++ b/src/mame/machine/nl_hazelvid.cpp @@ -0,0 +1,244 @@ +// license:BSD-3-Clause +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +/*************************************************************************** + + Netlist (hazelvid) included from hazeltin.cpp + +***************************************************************************/ + +#include "netlist/devices/net_lib.h" + +#define FAST_CLOCK (1) + +#ifndef __PLIB_PREPROCESSOR__ +#endif + +NETLIST_START(hazelvid) + + SOLVER(Solver, 48000) + PARAM(Solver.PARALLEL, 0) // Don't do parallel solvers + PARAM(Solver.ACCURACY, 1e-4) // works and is sufficient + PARAM(NETLIST.USE_DEACTIVATE, 1) + + ANALOG_INPUT(V5, 5) + + TTL_INPUT(high, 1) + TTL_INPUT(low, 0) + + MAINCLOCK(video_clk, 16632000.0) + + /* Character line counter, divide-by-9 */ + TTL_74161(u88, high, high, high, low, high, u87_6.Q, video_clk, high, high) + + TTL_7404_INVERT(u87_6, u88.RCO) + + TTL_74175(u81, video_clk, u88.RCO, u81.Q1, low, u88.QC, high) + + TTL_7404_INVERT(u87_5, u81.Q1) + ALIAS(ndot, u87_5.Q) + TTL_7404_INVERT(u59_4, u81.Q1Q) + ALIAS(dot, u59_4.Q) + + /* Character bucket counter */ + + /* least significant 4 bits */ + TTL_74161(u70, low, low, low, low, high, u59_5.Q, u81.Q2Q, high, high) + + /* most significant 4 bits */ + TTL_74161(u69, low, low, low, low, high, u59_5.Q, u81.Q2Q, u70.RCO, u70.RCO) + /* Horizontal/Vertical timing signals */ + + /* signal lookup PROM */ + TTL_82S126(u71, high, high, u70.QA, u70.QB, u70.QC, u70.QD, u69.QA, u69.QB, u69.QC, low) + + /* signal decoding */ + TTL_DM9334(u72, high, u81.Q1Q, u71.O4, u71.O1, u71.O2, u71.O3) + ALIAS(hms, u72.Q1) + ALIAS(hmsd, u72.Q2) + ALIAS(hblank, u72.Q3) + ALIAS(vstrobe, u72.Q4) + ALIAS(hdriveq, u72.Q5) + ALIAS(vidbus, u72.Q6) + TTL_7404_INVERT(u59_5, u72.Q7) + + TTL_7400_NAND(u83_1, high, vstrobe) + ALIAS(char_line_clk, u83_1.Q) + + /* Character line counter */ + TTL_74161(u84, low, low, low, low, high, u83_3.Q, char_line_clk, high, high) + ALIAS(lc20, u84.QA) + ALIAS(lc21, u84.QB) + ALIAS(lc22, u84.QC) + ALIAS(lc23, u84.QD) + TTL_7400_NAND(u83_3, u84.QB, u84.QD) + TTL_7404_INVERT(u92_5, u90.QD) + + TTL_7410_NAND(u89_3, u90.QD, u90.QC, u90.QA) + + /* Character row counter */ + TTL_74161(u90, low, low, low, low, high, u89_3.Q, u92_3.Q, high, high) + TTL_7404_INVERT(u92_3, u84.QD) + TTL_7404_INVERT(u92_1, u90.QB) + + TTL_7474(u95_2, u92_5.Q, u95_2.QQ, high, high) + + TTL_7411_AND(u91_3, u84.QA, u84.QD, u90.QB) + TTL_7411_AND(u91_1, u92_1.Q, u90.QA, u84.QC) + + TTL_7404_INVERT(u92_2, u90.QC) + TTL_7411_AND(u91_2, u95_2.QQ, u92_2.Q, u92_5.Q) + TTL_7404_INVERT(u92_6, u91_2.Q) + + /* Vertical blanking and drive */ + TTL_7473(u85_vdrive, char_line_clk, u91_1.Q, u91_3.Q, u85_vblankq.QQ) + TTL_7473(u85_vblankq, char_line_clk, u92_6.Q, u91_2.Q, high) + + /* Outgoing signals */ + TTL_7404_INVERT(u73_4, hdriveq) + ALIAS(hdrive, u73_4.Q) + + TTL_7404_INVERT(u61_6, hmsd) + TTL_7402_NOR(u60_1, u61_6.Q, u81.Q4) + ALIAS(lbc, u60_1.Q) + + TTL_7404_INVERT(u74_1, u84.QB) + TTL_7410_NAND(u89_2, vidbus, vidbus, u82_2.Q) + ALIAS(ncntbenq, u89_2.Q) + + TTL_7410_NAND(u89_1, u81.Q2, hmsd, u82_2.Q) + TTL_7400_NAND(u83_4, u89_1.Q, high) + ALIAS(cntclk, u83_4.Q) + + TTL_7402_NOR(u60_2, hblank, u85_vblankq.QQ) + ALIAS(clr_vid_sr, u60_2.Q) + + TTL_7404_INVERT(u92_4, u84.QB) + TTL_74260_NOR(u82_2, u85_vblankq.QQ, u92_3.Q, u84.QC, u92_4.Q, u84.QA) + TTL_7400_NAND(u83_2, vstrobe, u82_2.Q) + ALIAS(sync_bus_disable_q, u83_2.Q) + + ALIAS(vdrive, u85_vdrive.Q) + TTL_7404_INVERT(u73_5, vdrive) + ALIAS(vdriveq, u73_5.Q) + + TTL_7474(u95_1, u84.QD, u85_vblankq.QQ, high, high) + ALIAS(vblank, u95_1.Q) + + TTL_74260_NOR(u82_1, u85_vblankq.QQ, u92_4.Q, u84.QD, u84.QC, low) + TTL_7404_INVERT(u61_3, u82_1.Q) + ALIAS(tvinterq, u61_3.Q) + + TTL_INPUT(cpu_iowq, 1) + TTL_INPUT(cpu_ba4, 1) + TTL_7432_OR(u36_1, cpu_iowq, cpu_ba4) + + /* Character address counter */ + TTL_74193(u7, low, low, low, low, low, u36_1.Q, cntclk, high) + TTL_74193(u5, cpu_db0, cpu_db1, cpu_db2, cpu_db3, low, u36_1.Q, u7.CARRYQ, u7.BORROWQ) + TTL_74193(u3, cpu_db4, cpu_db5, cpu_db6, cpu_db7, low, u36_1.Q, u5.CARRYQ, u5.BORROWQ) + + TTL_74365(u6, low, ncntbenq, u7.QA, u7.QB, u7.QC, u7.QD, u5.QA, u5.QB) + TTL_74365(u4, low, ncntbenq, u5.QC, u5.QD, u3.QA, u3.QB, u3.QC, low) + ALIAS(ba0, u6.Y1) + ALIAS(ba1, u6.Y2) + ALIAS(ba2, u6.Y3) + ALIAS(ba3, u6.Y4) + ALIAS(ba4, u6.Y5) + ALIAS(ba5, u6.Y6) + ALIAS(ba6, u4.Y1) + ALIAS(ba7, u4.Y2) + ALIAS(ba8, u4.Y3) + ALIAS(ba9, u4.Y4) + ALIAS(ba10, u4.Y5) + + /* Video RAM */ + TTL_INPUT(memwq, 1) + TTL_INPUT(mrq, 1) + TTL_INPUT(ba13, 0) + + TTL_7432_OR(u36_2, memwq, memwq) + TTL_7400_NAND(u37_2, u36_2.Q, mrq) + TTL_7400_NAND(u37_3, u37_2.Q, ba13) + TTL_7400_NAND(u37_4, u37_3.Q, ncntbenq) + TTL_7404_INVERT(u17_2, u4.Y5) + TTL_7400_NAND(u30_2, u17_2.Q, u37_4.Q) + TTL_7400_NAND(u37_1, u4.Y5, u37_4.Q) + TTL_INPUT(rwq, 1) + + /* Lower 1K */ + RAM_2102A(u22, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u22.DO) + RAM_2102A(u23, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u23.DO) + RAM_2102A(u24, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u24.DO) + RAM_2102A(u25, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u25.DO) + RAM_2102A(u26, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u26.DO) + RAM_2102A(u27, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u27.DO) + RAM_2102A(u28, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u28.DO) + RAM_2102A(u29, u30_2.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u29.DO) + + /* Upper 1K */ + RAM_2102A(u9, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u9.DO) + RAM_2102A(u10, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u10.DO) + RAM_2102A(u11, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u11.DO) + RAM_2102A(u12, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u12.DO) + RAM_2102A(u13, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u13.DO) + RAM_2102A(u14, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u14.DO) + RAM_2102A(u15, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u15.DO) + RAM_2102A(u16, u37_1.Q, ba0, ba1, ba2, ba3, ba4, ba5, ba6, ba7, ba8, ba9, rwq, u16.DO) + + TTL_INPUT(cpu_db0, 0) + TTL_INPUT(cpu_db1, 0) + TTL_INPUT(cpu_db2, 0) + TTL_INPUT(cpu_db3, 0) + TTL_INPUT(cpu_db4, 0) + TTL_INPUT(cpu_db5, 0) + TTL_INPUT(cpu_db6, 0) + TTL_INPUT(cpu_db7, 0) + + TTL_TRISTATE(db0, u30_2.Q, u29.DO, u37_1.Q, u16.DO) + TTL_TRISTATE(db1, u30_2.Q, u28.DO, u37_1.Q, u15.DO) + TTL_TRISTATE(db2, u30_2.Q, u27.DO, u37_1.Q, u14.DO) + TTL_TRISTATE(db3, u30_2.Q, u26.DO, u37_1.Q, u13.DO) + TTL_TRISTATE(db4, u30_2.Q, u25.DO, u37_1.Q, u12.DO) + TTL_TRISTATE(db5, u30_2.Q, u24.DO, u37_1.Q, u11.DO) + TTL_TRISTATE(db6, u30_2.Q, u23.DO, u37_1.Q, u10.DO) + TTL_TRISTATE(db7, u30_2.Q, u22.DO, u37_1.Q, u9.DO) + + /* Character generation */ + TTL_74175(u68, dot, db0.Q, db1.Q, db2.Q, db3.Q, high) // least significant 4 bits of each character + TTL_AM2847(u67, lbc, u68.Q1, u68.Q2, u68.Q3, u68.Q4, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q) + + TTL_74175(u58, dot, db4.Q, db5.Q, db6.Q, db7.Q, high) // most signifcant 4 bits of each character + TTL_AM2847(u57, lbc, u58.Q1, u58.Q2, u58.Q3, u58.Q4, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q, sync_bus_disable_q) + + TTL_74174(u66, ndot, u67.OUTA, u67.OUTB, u67.OUTC, u67.OUTD, u57.OUTA, u57.OUTB, high) + TTL_74175(u56, ndot, u57.OUTC, clr_vid_sr, u79_1.Q, u57.OUTD, high) + TTL_7400_NAND(u79_1, u56.Q4, clr_vid_sr) + ALIAS(fgbit_q, u56.Q3Q) + + EPROM_2716(u78, low, low, lc20, lc21, lc22, lc23, u66.Q1, u66.Q2, u66.Q3, u66.Q4, u66.Q5, u66.Q6, u56.Q1) + + TTL_74166(u77, video_clk, low, ndot, low, u78.D0, u78.D1, u78.D2, u78.D3, u78.D4, u78.D5, u78.D6, low, clr_vid_sr) + ALIAS(raw_dot, u77.QH) + + TTL_7400_NAND(u79_4, fgbit_q, fgbit_q) + ALIAS(highlight, u79_4.Q) + + ALIAS(video_out, raw_dot) + + /* Highlight and contrast - not yet hooked up */ + RES(R40, 160) + RES(R41, 270) + POT(R21_POT, 500) + + NET_C(R40.1, V5) + NET_C(R40.2, R21_POT.1) + NET_C(raw_dot, R21_POT.1) + NET_C(highlight, R41.1) + NET_C(R41.2, R21_POT.1) + + NET_C(R21_POT.3, GND) + NET_C(R21_POT.2, GND) + +NETLIST_END() diff --git a/src/mame/machine/nl_hazelvid.h b/src/mame/machine/nl_hazelvid.h new file mode 100644 index 00000000000..ff436aa1f8d --- /dev/null +++ b/src/mame/machine/nl_hazelvid.h @@ -0,0 +1,4 @@ +// license:BSD-3-Clause +// copyright-holders:Ryan Holtz + +NETLIST_EXTERNAL(hazelvid) -- cgit v1.2.3