summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/imm6_76.h
blob: e004f3b234af8f1d323a7a75ee341d61c44c3666 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
// license:BSD-3-Clause
// copyright-holders:Vas Crabb
/*
Intel imm6-76 PROM programmer

Simple programmer for 1602/1702 and 1602A/1702A 256x8 static PMOS
UVEPROMs (1602/1602A have a metal lid preventing erasure but are
otherwise identical to 1702/1702A). Used in the INTELLEC® 4 and
INTELLEC® 8 development systems.

P1 universal edge connector (only used for power)

                  1    2
           GND    3    4  GND
                  5    6
                  7    8
                  9   10
                 11   12
                 13   14
                 15   16
                 17   18
                 19   20
                 21   22
                 23   24
                 25   26
                 27   28
                 29   30
                 31   32
                 33   34
                 35   36
                 37   38
                 39   40
                 41   42
          -10V   43   44  -10V
                 45   46
                 47   48
                 49   50
                 51   52
                 53   54
                 55   56
                 57   58
                 59   60
                 61   62
                 63   64
                 65   66
                 67   68
                 69   70
                 71   72
                 73   74
                 75   76
                 77   78
                 79   80
                 81   82
                 83   84
                 85   86
                 87   88
                 89   90
                 91   92
                 93   94
                 95   96
                 97   98
           +5V   99  100  +5V


J1 40-pin IDC connector (data/control)

           DI1    1    2  A0
           DI2    3    4  A1
           DI3    5    6  A2
           DI4    7    8  A3
           DI5    9   10  A4
           DI6   11   12  A5
           DI7   13   14  A6
           DI8   15   16  A7
           DO1   17   18
           DO2   19   20
           DO3   21   22
           DO4   23   24  DATA OUT ENABLE
           DO5   25   26  DATA IN + TRUE
           DO6   27   28  /DATA OUT + TRUE
           DO7   29   30  R/W (1702)
           DO8   31   32  R/W A (1702A)
           GND   33   34  GND
           GND   35   36  GND
           GND   37   38  GND
           GND   39   40  GND


J2 40-pin IDC connector (to PROM socket)

            D1    1    2  A0
            D2    3    4  A1
            D3    5    6  A2
            D4    7    8  A3
            D5    9   10  A4
            D6   11   11  A5
            D7   13   12  A6
            D8   15   16  A7
           GND   17   18  GND
          Vccs   19   20  Vccs
           Vdd   21   22  Vdd
           Vgg   23   24  /CS
           Vbb   25   26  PRGM
                 27   28
                 29   30
                 31   32
           GND   33   34  GND
                 35   36
                 37   38
                 39   40


J3 Six-pin connector on flying leads

        50V AC    1    2
        50V AC    3    4  +80V DC
/PRGM PROM PWR    5    6  GND


DO are open-collector TTL outputs with 5.6kΩ pullups.

DATA OUT ENABLE has an onboard 5.6kΩ pullup. Driving it low disables DO
outputs.

DATA IN + TRUE (if jumpered in) has a 5.6kΩ pullup and is XORed with the
DI inputs.  It should be pulled low in systems that use negative logic.
It is not jumpered in when used with INTELLEC 4 or INTELLEC 8 systems.

/DATA OUT + TRUE (if jumpered in) has a 5.6kΩ and is XORed with the PROM
data outputs.  It should be pulled low in systems that use positive
logic.  It is not jumpered in when used with INTELLEC 4 or INTELLEC 8
systems, the line is tied low with an onboard jumper.

/PRGM PROM PWR has a 27kΩ pullup to +80V DC and must be pulled low (to
GND) for programming voltage to be applied to the PROM.

When pulled low, R/W initiates a 2% programming duty cycle for writing
to a 1602 or 1702 PROM (150 millisecond cycle time).

When pulled low, RW A initiates a 20% programming duty cycle for writing
to a 1602A or 1702A PROM (15 millisecond cycle time).
*/
#ifndef MAME_MACHINE_IMM6_76_H
#define MAME_MACHINE_IMM6_76_H

#pragma once


class intel_imm6_76_device : public device_t, public device_image_interface
{
public:
	intel_imm6_76_device(machine_config const &mconfig, char const *tag, device_t *owner, uint32_t clock);

	// device_image_interface implementation
	virtual image_init_result call_load() override;
	virtual image_init_result call_create(int format_type, util::option_resolution *format_options) override;
	virtual void call_unload() override;

	// device_image_interface static info
	virtual iodevice_t  image_type()                            const noexcept override { return IO_ROM; }
	virtual bool        is_readable()                           const noexcept override { return true; }
	virtual bool        is_writeable()                          const noexcept override { return true; }
	virtual bool        is_creatable()                          const noexcept override { return true; }
	virtual bool        must_be_loaded()                        const noexcept override { return false; }
	virtual bool        is_reset_on_load()                      const noexcept override { return false; }
	virtual bool        support_command_line_image_creation()   const noexcept override { return true; }
	virtual char const *file_extensions()                       const noexcept override { return "rom,bin"; }
	virtual char const *custom_instance_name()                  const noexcept override { return "promimage"; }
	virtual char const *custom_brief_instance_name()            const noexcept override { return "prom"; }

	void di_w(u8 data);
	void a_w(u8 data);
	u8 do_r() const;
	DECLARE_WRITE_LINE_MEMBER(data_out_enable);     // 1 = asserted
	DECLARE_WRITE_LINE_MEMBER(data_in_positive);    // 1 = asserted
	DECLARE_WRITE_LINE_MEMBER(data_out_positive);   // 0 = asserted
	DECLARE_WRITE_LINE_MEMBER(r_w);                 // 1 = read, 0 = write
	DECLARE_WRITE_LINE_MEMBER(r_w_a);               // 1 = read, 0 = write
	DECLARE_WRITE_LINE_MEMBER(prgm_prom_pwr);       // 0 = asserted

protected:
	// device_t implementation
	virtual void device_start() override;

private:
	TIMER_CALLBACK_MEMBER(cycle_expired);
	TIMER_CALLBACK_MEMBER(cycle_a_expired);
	TIMER_CALLBACK_MEMBER(prg_expired);

	void trigger_prg();

	emu_timer   *m_cycle_tmr, *m_cycle_a_tmr, *m_prg_tmr;

	u8      m_data[256];
	u8      m_di, m_a;
	bool    m_do_enable, m_di_pos, m_do_pos;
	bool    m_r_w, m_r_w_a;
	bool    m_prgm_pwr;
	bool    m_cycle, m_cycle_a, m_prg;
};

DECLARE_DEVICE_TYPE(INTEL_IMM6_76, intel_imm6_76_device)

#endif // MAME_MACHINE_IMM6_76_H