ibm6580: patch out video timing tests, move "Memory Record" button to keyboard (#9158)

This commit is contained in:
shattered 2022-01-22 03:16:59 +00:00 committed by GitHub
parent 2be02d9622
commit 0274763955
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 126 additions and 42 deletions

View File

@ -9,7 +9,7 @@ disks. It could have up to 224k of ram. Consists of:
Electronics Module 6580
Display 3300
Keyboard 5330 [a "beamspring"-type]
Dual Diskette Unit 6360
Diskette Unit 6360
Optional:
Printers: 5215, 5218, 5228
Printer Sharing feature
@ -18,7 +18,8 @@ Optional:
66-line display and adapter (800x1056 px, 8x16 character cell)
All chips have IBM part numbers on them. F.e. on system board:
All chips have IBM part numbers on them. F.e. on system board:
8493077 - 8086
4178619 - 8251A
4178617 - 8257-5
@ -27,7 +28,14 @@ All chips have IBM part numbers on them. F.e. on system board:
4178625 - 8253-5
IRQ levels per PSM p. 6-5
Useful parts of PSM Feb83 (document / PDF page numbers):
- 6-3/87 -- bus buffers ... separate ... into four sections during BAT
- 6-5/89 -- irq levels
- 6-6/90 -- timer tick is 50ms
IRQ levels:
0 incoming data for printer sharing/3277 DE
1 transfer data to commo data link
2 printer and mag card data xfer
@ -36,10 +44,11 @@ IRQ levels per PSM p. 6-5
5 (not in use)
6 software timer [50 ms period]
7 error on commo data link
nmi "or when a dump switch operation is initiated" ["memory record" button]
NMI "when a dump switch operation is initiated" ["memory record" button]
To do:
- verify all frequency sources, document ROM revisions
- memory size options
- bus errors, interrupts
@ -47,13 +56,12 @@ To do:
- 92-key keyboard variant, keyboard click/beep, keyboard layouts
- 25-line video board (instant scroll, sub/superscripts, graphics mode)
- 66-line video board
- 66-line video board (apparently requires 'new' ROM)
- either emulate floppy board, or complete its HLE (drive select, etc.)
- add support for 8" drives with no track 0 sensor
(recalibrate command is expected to return 0x70 in ST0)
- double density floppies
- floppy adapter board, single and double density floppies
- "memory record" (system dump) generation to floppies
- printer
- speaker
- pass BAT with no errors (Basic Assurance Test)
- pass RNA with no errors (Resident Non-Automatic Test)
@ -79,6 +87,64 @@ Displaywriter System Manual S544-2023-0 (?) -- mentioned in US patents 4648071 a
"IBM Displaywriter System Printer Guide," Order No. S544-0861-2, Copyright 1980.
"Displaywriter System Product Support Manual," Order No. S241-6248-1, Copyright 1980
Notes on floppy drive:
Diskette Unit 6360 models -010, -011 have Type 1D (SS/SD) drives;
models -020, -021 -- Type 2D (DS/DD). Each drive has "file control card".
Useful parts of PSM Feb83 (pdf page numbers):
- 6-7/91 -- brief description
- 7-14..20/116..122 -- more detailed description
- 8-13/161 -- S1 (internal diskette signal cable), system board side
- 8-16/164 -- 5 (internal diskette signal cable), panel side
- 8-32/180 -- B1 (diskette signal cable), diskette adapter side
- 9-10..12/202..204 -- description of RNA tests
S1 connector has more signals than B1. Only these are present in B1:
Address Bit 1-4 -- from host
Data Bus Bit 0-7 -- bidirectional
Interrupt 4 -- to host
I/O Read -- from host
I/O Write -- from host
DMA Request -- to host
DMA Acknowledge -- from host
Terminal Count -- from host
Interface Ready -- to host
Diskette Select -- from host
Signals between adapter board and file control cards:
from/to 765:
write data, inner tracks, write gate, erase gate ->
write/erase enable, file data <-
from/to MCU:
drive present -> ground
diskette sense <- always ground on 1D; 2D disk index hole sends +5V
head engage ->
index (1.5 to 3.0 ms pulse) <-
select head, switch filter (2D drive) ->
RNA test L performs in the following sequence:
1. PORs the Diskette Adapter Cards
2. Samples the Diskette Index Pulse
3. Checks the Drive Set Ready Signal
4. Engages the Read/Write Head
5. Checks the Write/Erase Enable Line (This ensures the system will not write on the customer's diskette.)
6. Reads the Track ID
7. Disengages the Head.
****************************************************************************/
#include "emu.h"
@ -147,7 +213,6 @@ public:
, m_fdc(*this, UPD765_TAG)
, m_flop(*this, UPD765_TAG ":%u", 0U)
, m_p_chargen(*this, "chargen")
, m_io_dump(*this, "DUMP")
, m_leds(*this, "led%u", 5U)
{ }
@ -156,7 +221,6 @@ public:
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
virtual void video_start() override;
private:
void pic_latch_w(uint16_t data);
@ -197,7 +261,7 @@ private:
uint16_t m_gate;
uint8_t m_p40, m_p4a, m_p50, m_e000;
uint8_t m_kb_data, m_ppi_c;
uint8_t m_kb_data, m_ppi_c, m_led_state;
bool m_kb_data_bit, m_kb_strobe, m_kb_clock;
util::fifo<uint8_t, 4> m_floppy_mcu_sr, m_floppy_mcu_cr;
@ -222,7 +286,6 @@ private:
required_device<upd765a_device> m_fdc;
required_device_array<floppy_connector, 2> m_flop;
required_region_ptr<u8> m_p_chargen;
required_ioport m_io_dump;
output_finder<4> m_leds;
};
@ -334,9 +397,13 @@ void ibm6580_state::video_w(offs_t offset, uint8_t data)
switch (offset)
{
// some kind of gate
case 2:
// some kind of gate
m_e000 = data;
m_e000 = true;
break;
case 4:
m_e000 = false;
break;
}
}
@ -348,12 +415,13 @@ uint8_t ibm6580_state::video_r(offs_t offset)
switch (offset)
{
case 8:
data = 1; // 25-line video board ID. 66-line is 0x40.
data |= (m_screen->hblank() ? 8 : 0);
data |= (m_screen->vblank() ? 4 : 0);
// pure guesswork. 0x2, 0x10 and 0x20 are unknown video signals.
// 0x20 cannot be zero when 0x10 is zero.
data |= ((m_screen->vpos() < 2) ? 2 : 0);
// 25-line video board ID. 66-line is 0x40.
data = 1;
// pure guesswork. 0x20 cannot be zero when 0x10 is zero. 0x2 is unknown, may be vsync.
data |= (m_screen->hblank() ? 4 : 0);
data |= (m_screen->vblank() ? 8 : 0);
data |= ((m_screen->frame_number() & 1) ? 6 : 0);
data |= ((m_screen->vpos() > 196) ? 0x80 : 0);
if (m_e000) {
data |= (m_screen->vblank() ? 0x20 : 0);
data |= (m_screen->vblank() ? 0 : 0x10);
@ -372,8 +440,7 @@ WRITE_LINE_MEMBER(ibm6580_state::vblank_w)
// if (state)
// m_pic8259->ir6_w(state);
if (m_io_dump->read())
m_p40 |= 4;
m_p40 |= m_kbd->memory_record_r();
}
void ibm6580_state::pic_latch_w(uint16_t data)
@ -413,6 +480,12 @@ void ibm6580_state::led_w(uint8_t data)
if (data & 0xf)
return;
if (data == m_led_state)
return;
m_led_state = data;
#ifdef VERBOSE
switch (data >> 4)
{
case 0x1:
@ -463,6 +536,7 @@ void ibm6580_state::led_w(uint8_t data)
// printf ("LED 0x%08x: unknown\n", data);
break;
}
#endif
}
void ibm6580_state::ppi_c_w(uint8_t data)
@ -781,13 +855,6 @@ void ibm6580_state::ibm6580_io(address_map &map)
}
/* Input ports */
static INPUT_PORTS_START( ibm6580 )
PORT_START("DUMP")
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Memory Record") PORT_CODE(KEYCODE_PRTSCR) PORT_CHAR(UCHAR_MAMEKEY(PRTSCR))
INPUT_PORTS_END
uint32_t ibm6580_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
uint16_t sy=0,ma=25;
@ -857,7 +924,7 @@ uint32_t ibm6580_state::screen_update(screen_device &screen, bitmap_ind16 &bitma
if (attr & 0x20)
ca |= (ra < 13) ? ra + 3 : 0;
// subscript
if (attr & 0x20)
if (attr & 0x40)
ca |= (ra > 2) ? ra - 3 : 0;
#endif
@ -901,14 +968,16 @@ void ibm6580_state::machine_start()
{
m_maincpu->space(AS_PROGRAM).install_ram(0, m_ram->size() - 1, m_ram->pointer());
m_fdc->set_rate(500000); // XXX workaround
m_fdc->set_rate(500000); // FIXME: workaround
m_leds.resolve();
memset(m_p_videoram, 0x0, 0x1000);
}
void ibm6580_state::machine_reset()
{
m_p40 = m_p4a = m_p50 = m_gate = m_e000 = m_ppi_c = m_floppy_sr = 0;
m_p40 = m_p4a = m_p50 = m_gate = m_e000 = m_ppi_c = m_floppy_sr = m_led_state = 0;
m_kb_data_bit = false;
m_kb_clock = false;
m_kb_strobe = true;
@ -917,8 +986,7 @@ void ibm6580_state::machine_reset()
m_pit8253->set_clockin(0, 0.0);
if (m_io_dump->read())
m_p40 |= 4;
m_p40 |= m_kbd->memory_record_r();
m_flop[0]->get_device()->mon_w(!m_flop[0]->get_device()->exists());
m_flop[1]->get_device()->mon_w(!m_flop[1]->get_device()->exists());
@ -928,11 +996,6 @@ void ibm6580_state::machine_reset()
m_floppy_mcu_cr_fifo = 0;
}
void ibm6580_state::video_start()
{
memset(m_p_videoram, 0x0, 0x1000);
}
static void dw_floppies(device_slot_interface &device)
{
device.option_add("8sssd", IBM_6360);
@ -971,6 +1034,7 @@ void ibm6580_state::ibm6580(machine_config &config)
m_ppi8255->tri_pc_callback().set_constant(0);
PIT8253(config, m_pit8253, 0);
m_pit8253->out_handler<0>().set([this] (int state) { m_p40 = (m_p40 & ~1) | state; });
DW_KEYBOARD(config, m_kbd, 0);
m_kbd->out_data_handler().set(FUNC(ibm6580_state::kb_data_w));
@ -1028,6 +1092,19 @@ ROM_START( ibm6580 )
ROMX_LOAD("8493823_8k.bin", 0x0001, 0x2000, CRC(aa5524c0) SHA1(9938f2a82828b17966cb0be7fdbf73803c1f10d3), ROM_SKIP(1) | ROM_BIOS(0))
ROMX_LOAD("8493822_8k.bin", 0x0000, 0x2000, CRC(90e7e73a) SHA1(d3ee7a4d2cb8f4920b5d95e8c7f4fef06599d24e), ROM_SKIP(1) | ROM_BIOS(0))
// disable halts in video test
ROM_FILL(0x501,1,0x90)
ROM_FILL(0x51b,1,0x90)
ROM_FILL(0x52f,1,0x90)
ROM_FILL(0x587,1,0x90)
ROM_FILL(0x5a0,1,0x90)
ROM_FILL(0x5a6,1,0x90)
ROM_FILL(0x5f4,1,0x90)
ROM_FILL(0x609,1,0x90)
// disable rom checksum halt
ROM_FILL(0x2027,1,0x01)
ROM_SYSTEM_BIOS(1, "new", "new bios - 1983?")
// was downloaded via DDT86
ROMX_LOAD( "dwrom16kb.bin", 0x0000, 0x4000, BAD_DUMP CRC(ced87929) SHA1(907a46f288809bc93a1f59f3fbef18bd44be42d9), ROM_BIOS(1))
@ -1038,5 +1115,5 @@ ROM_END
/* Driver */
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP( 1980, ibm6580, 0, 0, ibm6580, ibm6580, ibm6580_state, empty_init, "IBM", "IBM 6580 Displaywriter", MACHINE_IS_SKELETON)
/* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */
COMP( 1980, ibm6580, 0, 0, ibm6580, 0, ibm6580_state, empty_init, "IBM", "IBM 6580 Displaywriter", MACHINE_IS_SKELETON)

View File

@ -169,6 +169,9 @@ INPUT_PORTS_START( dw_keyboard )
PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Reqst")
PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("MR")
PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Memory Record") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
INPUT_PORTS_END
@ -180,6 +183,7 @@ ioport_constructor dw_keyboard_device::device_input_ports() const
dw_keyboard_device::dw_keyboard_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, DW_KEYBOARD, tag, owner, clock)
, m_kbd(*this, "COL.%u", 0)
, m_mr(*this, "MR")
, m_out_data(*this)
, m_out_clock(*this)
, m_out_strobe(*this)

View File

@ -16,6 +16,8 @@ public:
auto out_clock_handler() { return m_out_clock.bind(); }
auto out_strobe_handler() { return m_out_strobe.bind(); }
int memory_record_r() { return m_mr->read(); }
DECLARE_WRITE_LINE_MEMBER(reset_w);
DECLARE_WRITE_LINE_MEMBER(ack_w);
@ -33,6 +35,7 @@ private:
int m_keylatch, m_ack;
required_ioport_array<12> m_kbd;
required_ioport m_mr;
devcb_write_line m_out_data;
devcb_write_line m_out_clock;
devcb_write_line m_out_strobe;