fidelity: add printer port [hap, Golden Child]

This commit is contained in:
hap 2025-05-29 22:34:20 +02:00
parent e53572e70b
commit ead01ec367
5 changed files with 49 additions and 16 deletions

View File

@ -158,6 +158,11 @@ The lone LED is connected to digit 1 common
All three of the above are called "segment H". All three of the above are called "segment H".
Printer:
--------
It's the same printer port as VSC. It expects a baud rate of 600, 7 data bits,
1 stop bit, and no parity.
================================================================================ ================================================================================
Elite Champion Challenger (ELITE) Elite Champion Challenger (ELITE)
@ -210,6 +215,7 @@ that are on the board by clicking while holding ALT.
#include "emu.h" #include "emu.h"
#include "bus/rs232/rs232.h"
#include "cpu/m6502/m6502.h" #include "cpu/m6502/m6502.h"
#include "machine/6821pia.h" #include "machine/6821pia.h"
#include "machine/clock.h" #include "machine/clock.h"
@ -295,7 +301,6 @@ protected:
void pia1_pa_w(u8 data); void pia1_pa_w(u8 data);
void pia1_pb_w(u8 data); void pia1_pb_w(u8 data);
u8 pia1_pb_r(); u8 pia1_pb_r();
void pia1_ca2_w(int state);
}; };
void csc_state::machine_start() void csc_state::machine_start()
@ -488,7 +493,7 @@ void csc_state::pia1_pb_w(u8 data)
u8 csc_state::pia1_pb_r() u8 csc_state::pia1_pb_r()
{ {
// d2: printer? // d2: printer busy?
u8 data = 0x04; u8 data = 0x04;
// d3: S14001A busy pin // d3: S14001A busy pin
@ -502,11 +507,6 @@ u8 csc_state::pia1_pb_r()
return data | (*m_language << 6 & 0xc0); return data | (*m_language << 6 & 0xc0);
} }
void csc_state::pia1_ca2_w(int state)
{
// printer?
}
/******************************************************************************* /*******************************************************************************
@ -641,7 +641,9 @@ void csc_state::csc(machine_config &config)
m_pia[1]->readpb_handler().set(FUNC(csc_state::pia1_pb_r)); m_pia[1]->readpb_handler().set(FUNC(csc_state::pia1_pb_r));
m_pia[1]->writepa_handler().set(FUNC(csc_state::pia1_pa_w)); m_pia[1]->writepa_handler().set(FUNC(csc_state::pia1_pa_w));
m_pia[1]->writepb_handler().set(FUNC(csc_state::pia1_pb_w)); m_pia[1]->writepb_handler().set(FUNC(csc_state::pia1_pb_w));
m_pia[1]->ca2_handler().set(FUNC(csc_state::pia1_ca2_w)); m_pia[1]->ca2_handler().set("rs232", FUNC(rs232_port_device::write_txd)).invert();
RS232_PORT(config, "rs232", default_rs232_devices, nullptr);
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));

View File

@ -17,6 +17,7 @@ Hardware notes (6085):
This is on the SC12B board, with enough modifications to support more leds and This is on the SC12B board, with enough modifications to support more leds and
magnetic chess board sensors. See sc12.cpp for a more technical description. magnetic chess board sensors. See sc12.cpp for a more technical description.
Like SC12, the printer expects a baud rate of 600, and 7 data bits.
The first RAM chip is low-power, and battery-backed with a capacitor. This is The first RAM chip is low-power, and battery-backed with a capacitor. This is
also mentioned in the manual. Maybe it does not apply to older PCBs. also mentioned in the manual. Maybe it does not apply to older PCBs.
@ -35,6 +36,7 @@ TODO:
#include "bus/generic/carts.h" #include "bus/generic/carts.h"
#include "bus/generic/slot.h" #include "bus/generic/slot.h"
#include "bus/rs232/rs232.h"
#include "cpu/m6502/r65c02.h" #include "cpu/m6502/r65c02.h"
#include "machine/clock.h" #include "machine/clock.h"
#include "machine/nvram.h" #include "machine/nvram.h"
@ -58,6 +60,7 @@ class elegance_state : public fidel_clockdiv_state
public: public:
elegance_state(const machine_config &mconfig, device_type type, const char *tag) : elegance_state(const machine_config &mconfig, device_type type, const char *tag) :
fidel_clockdiv_state(mconfig, type, tag), fidel_clockdiv_state(mconfig, type, tag),
m_rs232(*this, "rs232"),
m_board(*this, "board"), m_board(*this, "board"),
m_display(*this, "display"), m_display(*this, "display"),
m_dac(*this, "dac"), m_dac(*this, "dac"),
@ -75,6 +78,7 @@ protected:
private: private:
// devices/pointers // devices/pointers
required_device<rs232_port_device> m_rs232;
required_device<sensorboard_device> m_board; required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display; required_device<pwm_display_device> m_display;
required_device<dac_1bit_device> m_dac; required_device<dac_1bit_device> m_dac;
@ -132,7 +136,10 @@ void elegance_state::control_w(u8 data)
// 74245 Q9: speaker out // 74245 Q9: speaker out
m_dac->write(BIT(sel, 9)); m_dac->write(BIT(sel, 9));
// d4,d5: printer? // d4: set when reading printer busy flag from 0xa000
// d5: printer port data
m_rs232->write_txd(BIT(~data, 5));
// d6,d7: N/C? // d6,d7: N/C?
} }
@ -235,6 +242,8 @@ void elegance_state::feleg(machine_config &config)
NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(150)); m_board->set_delay(attotime::from_msec(150));

View File

@ -40,7 +40,7 @@ Hardware notes:
- TSI S14001A + speech ROM - TSI S14001A + speech ROM
- I/O with 8255 PPI and bunch of TTL - I/O with 8255 PPI and bunch of TTL
- 8*8 magnet sensors, 11 buttons, 8*(8+1) LEDs + 4*7seg LEDs - 8*8 magnet sensors, 11 buttons, 8*(8+1) LEDs + 4*7seg LEDs
- module slot and printer port - module slot and printer port (600 baud, 7 data bits, 1 stop bit, no parity)
*: In West Germany, some distributors released it with overclocked CPUs, *: In West Germany, some distributors released it with overclocked CPUs,
advertised as 3.2, 3.6, or 4MHz. Unmodified EAS PCB photos show only a 3MHz XTAL. advertised as 3.2, 3.6, or 4MHz. Unmodified EAS PCB photos show only a 3MHz XTAL.
@ -99,6 +99,7 @@ version of Prestige, it only works on level A3 or higher.
#include "bus/generic/carts.h" #include "bus/generic/carts.h"
#include "bus/generic/slot.h" #include "bus/generic/slot.h"
#include "bus/rs232/rs232.h"
#include "cpu/m6502/r65c02.h" #include "cpu/m6502/r65c02.h"
#include "machine/clock.h" #include "machine/clock.h"
#include "machine/i8255.h" #include "machine/i8255.h"
@ -129,6 +130,7 @@ public:
fidel_clockdiv_state(mconfig, type, tag), fidel_clockdiv_state(mconfig, type, tag),
m_ppi8255(*this, "ppi8255"), m_ppi8255(*this, "ppi8255"),
m_rombank(*this, "rombank"), m_rombank(*this, "rombank"),
m_rs232(*this, "rs232"),
m_board(*this, "board"), m_board(*this, "board"),
m_display(*this, "display"), m_display(*this, "display"),
m_dac(*this, "dac"), m_dac(*this, "dac"),
@ -158,6 +160,7 @@ protected:
// devices/pointers // devices/pointers
optional_device<i8255_device> m_ppi8255; optional_device<i8255_device> m_ppi8255;
optional_memory_bank m_rombank; optional_memory_bank m_rombank;
required_device<rs232_port_device> m_rs232;
required_device<sensorboard_device> m_board; required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display; required_device<pwm_display_device> m_display;
required_device<dac_1bit_device> m_dac; required_device<dac_1bit_device> m_dac;
@ -282,7 +285,8 @@ void elite_state::ppi_porta_w(u8 data)
m_speech->data_w(data & 0x3f); m_speech->data_w(data & 0x3f);
m_speech->start_w(BIT(data, 6)); m_speech->start_w(BIT(data, 6));
// d7: printer? (black wire to LED pcb) // d7: printer port data
m_rs232->write_txd(BIT(~data, 7));
} }
void elite_state::ppi_portc_w(u8 data) void elite_state::ppi_portc_w(u8 data)
@ -308,7 +312,7 @@ void elite_state::ppi_portc_w(u8 data)
u8 elite_state::ppi_portb_r() u8 elite_state::ppi_portb_r()
{ {
// d0: printer? white wire from LED pcb // d0: printer busy?
u8 data = 1; u8 data = 1;
// d1: S14001A busy pin // d1: S14001A busy pin
@ -483,6 +487,8 @@ void elite_state::pc(machine_config &config)
irq_clock.set_pulse_width(attotime::from_nsec(13700)); // active for 13.7us irq_clock.set_pulse_width(attotime::from_nsec(13700)); // active for 13.7us
irq_clock.signal_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); irq_clock.signal_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS); SENSORBOARD(config, m_board).set_type(sensorboard_device::MAGNETS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(100)); m_board->set_delay(attotime::from_msec(100));

View File

@ -8,7 +8,7 @@ Fidelity Sensory 12 Chess Challenger (SC12, SE12, 6086)
RE information from netlist by Berger RE information from netlist by Berger
8*(8+1) buttons, 8+8+2 red LEDs 8*(8+1) buttons, 8+8+2 red LEDs
DIN 41524C printer port DIN 41524C printer port (600 baud, 7 data bits, 1 stop bit, no parity)
36-pin edge connector 36-pin edge connector
CPU is a R65C02P4, running at 4MHz* CPU is a R65C02P4, running at 4MHz*
@ -60,6 +60,7 @@ TODO:
#include "bus/generic/carts.h" #include "bus/generic/carts.h"
#include "bus/generic/slot.h" #include "bus/generic/slot.h"
#include "bus/rs232/rs232.h"
#include "cpu/m6502/r65c02.h" #include "cpu/m6502/r65c02.h"
#include "machine/clock.h" #include "machine/clock.h"
#include "machine/sensorboard.h" #include "machine/sensorboard.h"
@ -82,6 +83,7 @@ class sc12_state : public fidel_clockdiv_state
public: public:
sc12_state(const machine_config &mconfig, device_type type, const char *tag) : sc12_state(const machine_config &mconfig, device_type type, const char *tag) :
fidel_clockdiv_state(mconfig, type, tag), fidel_clockdiv_state(mconfig, type, tag),
m_rs232(*this, "rs232"),
m_board(*this, "board"), m_board(*this, "board"),
m_display(*this, "display"), m_display(*this, "display"),
m_dac(*this, "dac"), m_dac(*this, "dac"),
@ -99,6 +101,7 @@ protected:
private: private:
// devices/pointers // devices/pointers
required_device<rs232_port_device> m_rs232;
required_device<sensorboard_device> m_board; required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display; required_device<pwm_display_device> m_display;
required_device<dac_1bit_device> m_dac; required_device<dac_1bit_device> m_dac;
@ -148,8 +151,9 @@ void sc12_state::control_w(u8 data)
// d6,d7: led select (active low) // d6,d7: led select (active low)
m_display->matrix(~data >> 6 & 3, sel & 0x1ff); m_display->matrix(~data >> 6 & 3, sel & 0x1ff);
// d4,d5: printer // d4: set when reading printer busy flag from 0xa000
//.. // d5: printer port data
m_rs232->write_txd(BIT(~data, 5));
} }
u8 sc12_state::input_r(offs_t offset) u8 sc12_state::input_r(offs_t offset)
@ -242,6 +246,8 @@ void sc12_state::sc12(machine_config &config)
irq_clock.set_pulse_width(attotime::from_nsec(15250)); // active for 15.25us irq_clock.set_pulse_width(attotime::from_nsec(15250)); // active for 15.25us
irq_clock.signal_handler().set_inputline(m_maincpu, M6502_IRQ_LINE); irq_clock.signal_handler().set_inputline(m_maincpu, M6502_IRQ_LINE);
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(200)); m_board->set_delay(attotime::from_msec(200));

View File

@ -145,10 +145,13 @@ chess computers also have support for it. Two models were released:
FP: Challenger Printer - thermal printer, MCU=D8048C243 FP: Challenger Printer - thermal printer, MCU=D8048C243
IFP: Impact Printer - also compatible with C64 apparently. IFP: Impact Printer - also compatible with C64 apparently.
The printer expects a baud rate of 600, 7 data bits, 1 stop bit, and no parity.
*******************************************************************************/ *******************************************************************************/
#include "emu.h" #include "emu.h"
#include "bus/rs232/rs232.h"
#include "cpu/z80/z80.h" #include "cpu/z80/z80.h"
#include "machine/i8255.h" #include "machine/i8255.h"
#include "machine/clock.h" #include "machine/clock.h"
@ -173,6 +176,7 @@ public:
m_maincpu(*this, "maincpu"), m_maincpu(*this, "maincpu"),
m_z80pio(*this, "z80pio"), m_z80pio(*this, "z80pio"),
m_ppi8255(*this, "ppi8255"), m_ppi8255(*this, "ppi8255"),
m_rs232(*this, "rs232"),
m_board(*this, "board"), m_board(*this, "board"),
m_display(*this, "display"), m_display(*this, "display"),
m_speech(*this, "speech"), m_speech(*this, "speech"),
@ -191,6 +195,7 @@ private:
required_device<cpu_device> m_maincpu; required_device<cpu_device> m_maincpu;
required_device<z80pio_device> m_z80pio; required_device<z80pio_device> m_z80pio;
required_device<i8255_device> m_ppi8255; required_device<i8255_device> m_ppi8255;
required_device<rs232_port_device> m_rs232;
required_device<sensorboard_device> m_board; required_device<sensorboard_device> m_board;
required_device<pwm_display_device> m_display; required_device<pwm_display_device> m_display;
required_device<s14001a_device> m_speech; required_device<s14001a_device> m_speech;
@ -293,7 +298,7 @@ u8 vsc_state::pio_porta_r()
u8 vsc_state::pio_portb_r() u8 vsc_state::pio_portb_r()
{ {
// d4: S14001A busy pin // d4: S14001A busy pin / printer busy
return (m_speech->busy_r()) ? 0 : 0x10; return (m_speech->busy_r()) ? 0 : 0x10;
} }
@ -303,6 +308,9 @@ void vsc_state::pio_portb_w(u8 data)
// d5: enable language jumpers // d5: enable language jumpers
m_kp_mux = data; m_kp_mux = data;
// d3: printer port data
m_rs232->write_txd(BIT(~data, 3));
// d7: speech ROM A12 // d7: speech ROM A12
m_speech->set_rom_bank(BIT(data, 7)); m_speech->set_rom_bank(BIT(data, 7));
@ -407,6 +415,8 @@ void vsc_state::vsc(machine_config &config)
m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r)); m_z80pio->in_pb_callback().set(FUNC(vsc_state::pio_portb_r));
m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w)); m_z80pio->out_pb_callback().set(FUNC(vsc_state::pio_portb_w));
RS232_PORT(config, m_rs232, default_rs232_devices, nullptr);
SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS); SENSORBOARD(config, m_board).set_type(sensorboard_device::BUTTONS);
m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess)); m_board->init_cb().set(m_board, FUNC(sensorboard_device::preset_chess));
m_board->set_delay(attotime::from_msec(250)); m_board->set_delay(attotime::from_msec(250));