Previous 15994 Revisions Next

r15340 Monday 28th May, 2012 at 18:44:12 UTC by R. Belmont
Bugfixed and modularized the new Ensoniq VFD emulation [R. Belmont]
[src/mess]mess.mak
[src/mess/drivers]esq5505.c
[src/mess/layout]esq1by22.lay*
[src/mess/machine]esqvfd.c esqvfd.h

src/mess/machine/esqvfd.c
r15339r15340
44*/
55
66#include "esqvfd.h"
7#include "esq1by22.lh"
78#include "esq2by40.lh"
89
10const device_type ESQ1x22 = &device_creator<esq1x22_t>;
911const device_type ESQ2x40 = &device_creator<esq2x40_t>;
12const device_type ESQ2x40_SQ1 = &device_creator<esq2x40_sq1_t>;
1013
1114// adapted from bfm_bd1, rearranged to work with ASCII data used by the Ensoniq h/w
1215static const UINT16 font[]=
r15339r15340
8992void esqvfd_t::device_reset()
9093{
9194    m_cursx = m_cursy = 0;
92    memset(m_chars, ' ', sizeof(m_chars));
95    m_curattr = AT_NORMAL;
96    memset(m_chars, 0, sizeof(m_chars));
9397    memset(m_attrs, 0, sizeof(m_attrs));
98    memset(m_dirty, 1, sizeof(m_attrs));
9499}
95100
96101void esqvfd_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
r15339r15340
121126    return segout;
122127}
123128
129// generic display update; can override from child classes if not good enough
130void esqvfd_t::update_display()
131{
132    for (int row = 0; row < m_rows; row++)
133    {
134        for (int col = 0; col < m_cols; col++)
135        {
136            if (m_dirty[row][col])
137            {
138                UINT32 segdata = conv_segments(font[m_chars[row][col]]);
139
140                output_set_indexed_value("vfd", (row*m_cols) + col, segdata);
141
142                m_dirty[row][col] = 0;
143            }
144        }
145    }
146}
147
148/* 2x40 VFD display used in the ESQ-1, VFX-SD, SD-1, and others */
149
124150static MACHINE_CONFIG_FRAGMENT(esq2x40)
125151   MCFG_DEFAULT_LAYOUT(layout_esq2by40)
126152MACHINE_CONFIG_END
r15339r15340
141167    {
142168        switch (data)
143169        {
170            case 0xd0:  // blink start
171                m_curattr = AT_BLINK;
172                break;
173
174            case 0xd1:  // blink stop
175                m_curattr &= ~AT_BLINK;
176                break;
177
144178            case 0xd6:  // clear screen
145179                m_cursx = m_cursy = 0;
146180                memset(m_chars, 0, sizeof(m_chars));
r15339r15340
155189    }
156190    else
157191    {
158        if (data == 'f')   // EPS-16 clear screen (HACK!)
192        if ((data >= 0x20) && (data <= 0x5f))
159193        {
160            m_cursx = m_cursy = 0;
161            memset(m_chars, 0, sizeof(m_chars));
162            memset(m_attrs, 0, sizeof(m_attrs));
163            memset(m_dirty, 1, sizeof(m_dirty));
164        }
165        else if ((data >= 0x20) && (data <= 0x5f))
166        {
167194            m_chars[m_cursy][m_cursx] = data - ' ';
195            m_attrs[m_cursy][m_cursx] = m_curattr;
168196            m_dirty[m_cursy][m_cursx] = 1;
169197            m_cursx++;
170198
r15339r15340
178206    update_display();
179207}
180208
181void esq2x40_t::update_display()
209esq2x40_t::esq2x40_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : esqvfd_t(mconfig, ESQ2x40, "Ensoniq 2x40 VFD", tag, owner, clock)
182210{
183    for (int row = 0; row < 2; row++)
211    m_rows = 2;
212    m_cols = 40;
213}
214
215/* 1x22 display from the VFX (not right, but it'll do for now) */
216
217static MACHINE_CONFIG_FRAGMENT(esq1x22)
218   MCFG_DEFAULT_LAYOUT(layout_esq1by22)
219MACHINE_CONFIG_END
220
221machine_config_constructor esq1x22_t::device_mconfig_additions() const
222{
223    return MACHINE_CONFIG_NAME( esq1x22 );
224}
225
226void esq1x22_t::write_char(int data)
227{
228    if (data >= 0x60)
184229    {
185        for (int col = 0; col < 40; col++)
230        switch (data)
186231        {
187            if (m_dirty[row][col])
188            {
189                UINT32 segdata = conv_segments(font[m_chars[row][col]]);
232            case 'f':   // clear screen
233                m_cursx = m_cursy = 0;
234                memset(m_chars, 0, sizeof(m_chars));
235                memset(m_attrs, 0, sizeof(m_attrs));
236                memset(m_dirty, 1, sizeof(m_dirty));
237                break;
190238
191                output_set_indexed_value("vfd", (row*40) + col, segdata);
239            default:
240                printf("Unhandled control code %02x\n", data);
241                break;
242        }
243    }
244    else
245    {
246        if ((data >= 0x20) && (data <= 0x5f))
247        {
248            m_chars[0][m_cursx] = data - ' ';
249            m_dirty[0][m_cursx] = 1;
250            m_cursx++;
192251
193                m_dirty[row][col] = 0;
252            if (m_cursx >= 23)
253            {
254                m_cursx = 23;
194255            }
195256        }
196257    }
258
259    update_display();
197260}
198261
199esq2x40_t::esq2x40_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : esqvfd_t(mconfig, ESQ2x40, "Ensoniq 2x40 VFD", tag, owner, clock)
262esq1x22_t::esq1x22_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : esqvfd_t(mconfig, ESQ1x22, "Ensoniq 1x22 VFD", tag, owner, clock)
200263{
264    m_rows = 1;
265    m_cols = 22;
201266}
202267
268/* SQ-1 display, I think it's really an LCD but we'll deal with it for now */
269machine_config_constructor esq2x40_sq1_t::device_mconfig_additions() const
270{
271    return MACHINE_CONFIG_NAME( esq2x40 );  // we use the normal 2x40 layout
272}
203273
274void esq2x40_sq1_t::write_char(int data)
275{
276    if ((data >= 0x20) && (data <= 0x5f))
277    {
278        m_chars[m_cursy][m_cursx] = data - ' ';
279        m_attrs[m_cursy][m_cursx] = m_curattr;
280        m_dirty[m_cursy][m_cursx] = 1;
281        m_cursx++;
282
283        if (m_cursx >= 39)
284        {
285            m_cursx = 39;
286        }
287
288        update_display();
289    }
290    else
291    {
292//        printf("SQ-1 unhandled display char %02x\n", data);
293    }
294}
295
296esq2x40_sq1_t::esq2x40_sq1_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : esqvfd_t(mconfig, ESQ2x40_SQ1, "Ensoniq 2x40 VFD (SQ-1 variant)", tag, owner, clock)
297{
298    m_rows = 2;
299    m_cols = 40;
300}
301
src/mess/machine/esqvfd.h
r15339r15340
33
44#include "emu.h"
55
6#define MCFG_ESQ1x22_ADD(_tag)   \
7   MCFG_DEVICE_ADD(_tag, ESQ1x22, 60)
8
9#define MCFG_ESQ1x22_REMOVE(_tag) \
10    MCFG_DEVICE_REMOVE(_tag)
11
612#define MCFG_ESQ2x40_ADD(_tag)   \
713   MCFG_DEVICE_ADD(_tag, ESQ2x40, 60)
814
15#define MCFG_ESQ2x40_REMOVE(_tag) \
16    MCFG_DEVICE_REMOVE(_tag)
17
18#define MCFG_ESQ2x40_SQ1_ADD(_tag)   \
19   MCFG_DEVICE_ADD(_tag, ESQ2x40_SQ1, 60)
20
21#define MCFG_ESQ2x40_SQ1_REMOVE(_tag) \
22    MCFG_DEVICE_REMOVE(_tag)
23
924class esqvfd_t : public device_t {
1025public:
1126   typedef delegate<void (bool state)> line_cb;
r15339r15340
1530   DECLARE_WRITE8_MEMBER( write ) { write_char(data); }
1631
1732    virtual void write_char(int data) = 0;
18    virtual void update_display() = 0;
33    virtual void update_display();
1934
2035    UINT32 conv_segments(UINT16 segin);
2136
r15339r15340
2439    static const UINT8 AT_BOLD        = 0x01;
2540    static const UINT8 AT_UNDERLINE   = 0x02;
2641    static const UINT8 AT_BLINK       = 0x04;
42    static const UINT8 AT_BLINKED     = 0x80;   // set when character should be blinked off
2743
2844   virtual void device_start();
2945   virtual void device_reset();
3046   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
3147
3248    int m_cursx, m_cursy;
49    int m_rows, m_cols;
50    UINT8 m_curattr;
3351    UINT8 m_chars[2][40];
3452    UINT8 m_attrs[2][40];
3553    UINT8 m_dirty[2][40];
3654};
3755
56class esq1x22_t : public esqvfd_t {
57public:
58   esq1x22_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
59
60   virtual void write_char(int data);
61
62protected:
63    virtual machine_config_constructor device_mconfig_additions() const;
64
65private:
66};
67
3868class esq2x40_t : public esqvfd_t {
3969public:
4070   esq2x40_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
4171
4272   virtual void write_char(int data);
43    virtual void update_display();
4473
4574protected:
4675    virtual machine_config_constructor device_mconfig_additions() const;
r15339r15340
4877private:
4978};
5079
80class esq2x40_sq1_t : public esqvfd_t {
81public:
82   esq2x40_sq1_t(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
83
84   virtual void write_char(int data);
85
86protected:
87    virtual machine_config_constructor device_mconfig_additions() const;
88
89private:
90};
91
92extern const device_type ESQ1x22;
5193extern const device_type ESQ2x40;
94extern const device_type ESQ2x40_SQ1;
5295
5396#endif
src/mess/layout/esq1by22.lay
r0r15340
1<!-- esq1by24.lay -->
2<!-- 2012-05-27: Initial version.  [R. Belmont / VFDGen 0.1] -->
3
4<mamelayout version="2">
5
6   <element name="vfd0" defstate="0">
7      <led14segsc>
8         <color red="0.45" green="1.0" blue="0.95" />
9      </led14segsc>
10   </element>
11
12   <element name="background">
13      <rect>
14         <bounds left="0" top="0" right="1" bottom="1" />
15         <color red="0.0" green="0.0" blue="0.0" />
16      </rect>
17   </element>
18
19   <view name="Default Layout">
20
21      <!-- Background -->
22      <backdrop element="background">
23         <bounds left="0" top="0" right="455" bottom="23" />
24      </backdrop>
25
26      <!-- VFDs -->
27      <bezel name="vfd0" element="vfd0">
28         <bounds left="0" top="0" right="18" bottom="23" />
29      </bezel>
30      <bezel name="vfd1" element="vfd0">
31         <bounds left="19" top="0" right="37" bottom="23" />
32      </bezel>
33      <bezel name="vfd2" element="vfd0">
34         <bounds left="38" top="0" right="56" bottom="23" />
35      </bezel>
36      <bezel name="vfd3" element="vfd0">
37         <bounds left="57" top="0" right="75" bottom="23" />
38      </bezel>
39      <bezel name="vfd4" element="vfd0">
40         <bounds left="76" top="0" right="94" bottom="23" />
41      </bezel>
42      <bezel name="vfd5" element="vfd0">
43         <bounds left="95" top="0" right="113" bottom="23" />
44      </bezel>
45      <bezel name="vfd6" element="vfd0">
46         <bounds left="114" top="0" right="132" bottom="23" />
47      </bezel>
48      <bezel name="vfd7" element="vfd0">
49         <bounds left="133" top="0" right="151" bottom="23" />
50      </bezel>
51      <bezel name="vfd8" element="vfd0">
52         <bounds left="152" top="0" right="170" bottom="23" />
53      </bezel>
54      <bezel name="vfd9" element="vfd0">
55         <bounds left="171" top="0" right="189" bottom="23" />
56      </bezel>
57      <bezel name="vfd10" element="vfd0">
58         <bounds left="190" top="0" right="208" bottom="23" />
59      </bezel>
60      <bezel name="vfd11" element="vfd0">
61         <bounds left="209" top="0" right="227" bottom="23" />
62      </bezel>
63      <bezel name="vfd12" element="vfd0">
64         <bounds left="228" top="0" right="246" bottom="23" />
65      </bezel>
66      <bezel name="vfd13" element="vfd0">
67         <bounds left="247" top="0" right="265" bottom="23" />
68      </bezel>
69      <bezel name="vfd14" element="vfd0">
70         <bounds left="266" top="0" right="284" bottom="23" />
71      </bezel>
72      <bezel name="vfd15" element="vfd0">
73         <bounds left="285" top="0" right="303" bottom="23" />
74      </bezel>
75      <bezel name="vfd16" element="vfd0">
76         <bounds left="304" top="0" right="322" bottom="23" />
77      </bezel>
78      <bezel name="vfd17" element="vfd0">
79         <bounds left="323" top="0" right="341" bottom="23" />
80      </bezel>
81      <bezel name="vfd18" element="vfd0">
82         <bounds left="342" top="0" right="360" bottom="23" />
83      </bezel>
84      <bezel name="vfd19" element="vfd0">
85         <bounds left="361" top="0" right="379" bottom="23" />
86      </bezel>
87      <bezel name="vfd20" element="vfd0">
88         <bounds left="380" top="0" right="398" bottom="23" />
89      </bezel>
90      <bezel name="vfd21" element="vfd0">
91         <bounds left="399" top="0" right="417" bottom="23" />
92      </bezel>
93      <bezel name="vfd22" element="vfd0">
94         <bounds left="418" top="0" right="436" bottom="23" />
95      </bezel>
96      <bezel name="vfd23" element="vfd0">
97         <bounds left="437" top="0" right="455" bottom="23" />
98      </bezel>
99   </view>
100
101</mamelayout>
src/mess/drivers/esq5505.c
r15339r15340
1212    Memory map:
1313 
1414    0x000000-0x00ffff   work RAM low
15    0x200000-0x20001f   OTTO (5505) regs
15    0x200000-0x20001f   OTTO(5505) regs
1616    0x240000-0x24003f   ??? regs
1717    0x260000-0x2601ff   ESP (5510) regs
1818    0x280000-0x28001f   DUART (68681) regs
r15339r15340
4040
4141#include "machine/esqvfd.h"
4242
43#define GENERIC (0)
44#define EPS16   (1)
45#define SQ1     (2)
46
4347class esq5505_state : public driver_device
4448{
4549public:
r15339r15340
4852        m_maincpu(*this, "maincpu"),
4953        m_duart(*this, "duart"),
5054        m_fdc(*this, "wd1772"),
55        m_epsvfd(*this, "epsvfd"),
56        m_sq1vfd(*this, "sq1vfd"),
5157        m_vfd(*this, "vfd")
5258    { }
5359
5460    required_device<device_t> m_maincpu;
5561    required_device<device_t> m_duart;
5662    optional_device<wd1772_t> m_fdc;
63    optional_device<esq1x22_t> m_epsvfd;
64    optional_device<esq2x40_sq1_t> m_sq1vfd;
5765    optional_device<esq2x40_t> m_vfd;
5866
5967    virtual void machine_reset();
r15339r15340
6371    DECLARE_READ16_MEMBER(mc68681_r);
6472    DECLARE_WRITE16_MEMBER(mc68681_w);
6573
66    bool m_bIsEPS16;
74    int m_system_type;
6775    UINT8 m_duart_io;
6876    bool  m_bCalibSecondByte;
6977
r15339r15340
185193}
186194
187195static ADDRESS_MAP_START( vfx_map, AS_PROGRAM, 16, esq5505_state )
188   AM_RANGE(0x000000, 0x03ffff) AM_RAM AM_SHARE("osram")
196   AM_RANGE(0x000000, 0x00ffff) AM_RAM AM_MIRROR(0x30000) AM_SHARE("osram")
189197   AM_RANGE(0x200000, 0x20001f) AM_DEVREADWRITE_LEGACY("ensoniq", es5505_r, es5505_w)
190198   AM_RANGE(0x260000, 0x2601ff) AM_READWRITE(es5510_dsp_r, es5510_dsp_w)
191199    AM_RANGE(0x280000, 0x28001f) AM_DEVREADWRITE8_LEGACY("duart", duart68681_r, duart68681_w, 0x00ff)
192200    AM_RANGE(0xc00000, 0xc1ffff) AM_ROM AM_REGION("osrom", 0)
193    AM_RANGE(0xfc0000, 0xffffff) AM_RAM AM_SHARE("osram")
201    AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_SHARE("osram")
194202ADDRESS_MAP_END
195203
196204static ADDRESS_MAP_START( vfxsd_map, AS_PROGRAM, 16, esq5505_state )
r15339r15340
264272{
265273    esq5505_state *state = device->machine().driver_data<esq5505_state>();
266274
267//    printf("ch %d: [%02x]\n", channel, data);
268
269275    if (channel == 1)
270276    {
271        state->m_vfd->write_char(data);
277//        printf("ch %d: [%02x] (PC=%x)\n", channel, data, cpu_get_pc(state->m_maincpu));
278        switch (state->m_system_type)
279        {
280            case GENERIC:
281                state->m_vfd->write_char(data);
282                break;
272283
273        // c023ea = Rx B on vfxsd calib at c033ba
284            case EPS16:
285                state->m_epsvfd->write_char(data);
286                break;
287
288            case SQ1:
289                state->m_sq1vfd->write_char(data);
290                break;
291        }
292
274293        if (state->m_bCalibSecondByte)
275294        {
276//            printf("Calibrate second byte %02x\n", data);
277            duart68681_rx_data(state->m_duart, 1, (UINT8)(FPTR)0xff);   // this is the correct response for "calibration OK"
295//            printf("KPC second byte %02x\n", data);
296            if (data == 0xfd)   // calibration request
297            {
298                duart68681_rx_data(state->m_duart, 1, (UINT8)(FPTR)0xff);   // this is the correct response for "calibration OK"
299            }
278300            state->m_bCalibSecondByte = false;
279301        }
280302        else if (data == 0xfb)   // request calibration
281303        {
282//            printf("KPC command, waiting on second byte (PC=%x)\n", cpu_get_pc(state->m_maincpu));
283304            state->m_bCalibSecondByte = true;
284305        }
285306        else
286307        {
287308            // EPS-16+ wants a throwaway reply byte for each byte sent to the KPC
288309            // VFX-SD and SD-1 definitely don't :)
289            if (state->m_bIsEPS16)
310            if (state->m_system_type == EPS16)
290311            {
291312                // 0xe7 must respond with any byte that isn't 0xc8 or the ROM dies.
292313                // 0x71 must respond with anything (return not checked)
293
294314                duart68681_rx_data(state->m_duart, 1, (UINT8)(FPTR)0x00);   // actual value of response is never checked
295315            }
296316        }
297
298317    }
299318}
300319
r15339r15340
318337};
319338
320339static MACHINE_CONFIG_START( vfx, esq5505_state )
321   MCFG_CPU_ADD("maincpu", M68000, 8000000)
340   MCFG_CPU_ADD("maincpu", M68000, 16000000)
322341   MCFG_CPU_PROGRAM_MAP(vfx_map)
323342
324343    MCFG_ESQ2x40_ADD("vfd")
r15339r15340
332351   MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
333352MACHINE_CONFIG_END
334353
354static MACHINE_CONFIG_DERIVED(sq1, vfx)
355    MCFG_ESQ2x40_REMOVE("vfd")
356    MCFG_ESQ2x40_SQ1_ADD("sq1vfd")
357MACHINE_CONFIG_END
358
335359static MACHINE_CONFIG_DERIVED(eps16, vfx)
336360   MCFG_CPU_MODIFY( "maincpu" )
337361   MCFG_CPU_PROGRAM_MAP(eps16_map)
338362
363    MCFG_ESQ2x40_REMOVE("vfd")
364    MCFG_ESQ1x22_ADD("epsvfd")
365
339366    MCFG_WD1772x_ADD("wd1772", 8000000)
340367   MCFG_FLOPPY_DRIVE_ADD("fd0", ensoniq_floppies, "35dd", 0, esq5505_state::floppy_formats)
341368MACHINE_CONFIG_END
r15339r15340
406433    ROM_LOAD16_BYTE( "eps-l.bin",    0x000000, 0x008000, CRC(382beac1) SHA1(110e31edb03fcf7bbde3e17423b21929e5b32db2) )
407434    ROM_LOAD16_BYTE( "eps-h.bin",    0x000001, 0x008000, CRC(d8747420) SHA1(460597751386eb5f08465699b61381c4acd78065) )
408435
409    ROM_REGION(0x200000, "waverom", ROMREGION_ERASE00)      // did the EPS-16 have ROM sounds or is it a pure sampler?
436    ROM_REGION(0x200000, "waverom", ROMREGION_ERASE00)  // EPS-16 has no ROM sounds
410437ROM_END
411438
412439static DRIVER_INIT(common)
413440{
414441    esq5505_state *state = machine.driver_data<esq5505_state>();
415442
416    state->m_bIsEPS16 = false;
443    state->m_system_type = GENERIC;
417444    state->m_duart_io = 0;
418445
419446   floppy_connector *con = machine.device<floppy_connector>("fd0");
r15339r15340
430457    esq5505_state *state = machine.driver_data<esq5505_state>();
431458
432459    DRIVER_INIT_CALL(common);
433    state->m_bIsEPS16 = true;
460    state->m_system_type = EPS16;
434461}
435462
463static DRIVER_INIT(sq1)
464{
465    esq5505_state *state = machine.driver_data<esq5505_state>();
466
467    DRIVER_INIT_CALL(common);
468    state->m_system_type = SQ1;
469}
470
436471CONS( 1989, vfx,   0, 0, vfx,   vfx, common, "Ensoniq", "VFX", GAME_NOT_WORKING )       // 2x40 VFD
437472CONS( 1989, vfxsd, 0, 0, vfxsd, vfx, common, "Ensoniq", "VFX-SD", GAME_NOT_WORKING )    // 2x40 VFD
438473CONS( 1990, sd1,   0, 0, vfxsd, vfx, common, "Ensoniq", "SD-1", GAME_NOT_WORKING )      // 2x40 VFD
439474CONS( 1990, sd132, 0, 0, vfxsd, vfx, common, "Ensoniq", "SD-1 32", GAME_NOT_WORKING )   // 2x40 VFD
440CONS( 1990, sq1,   0, 0, vfx,   vfx, common, "Ensoniq", "SQ-1", GAME_NOT_WORKING )      // LCD of some sort
441CONS( 1990, eps16, 0, 0, eps16, vfx, eps16,  "Ensoniq", "EPS-16 Plus", GAME_NOT_WORKING )   // 1x40? (20? 32?) VFD
475CONS( 1990, sq1,   0, 0, sq1,   vfx, sq1,    "Ensoniq", "SQ-1", GAME_NOT_WORKING )      // LCD of some sort
476CONS( 1990, eps16, 0, 0, eps16, vfx, eps16,  "Ensoniq", "EPS-16 Plus", GAME_NOT_WORKING )   // custom VFD: one alphanumeric 22-char row, one graphics-capable row (alpha row can also do bar graphs)
442477
src/mess/mess.mak
r15339r15340
20742074$(MESS_DRIVERS)/eacc.o:      $(MESS_LAYOUT)/eacc.lh
20752075$(MESS_DRIVERS)/elf.o:      $(MESS_LAYOUT)/elf2.lh
20762076$(MESS_DRIVERS)/elekscmp.o:   $(MESS_LAYOUT)/elekscmp.lh
2077$(MESS_MACHINE)/esqvfd.o:   $(MESS_LAYOUT)/esq2by40.lh
2077$(MESS_MACHINE)/esqvfd.o:   $(MESS_LAYOUT)/esq2by40.lh \
2078                            $(MESS_LAYOUT)/esq1by22.lh
20782079$(MESS_DRIVERS)/et3400.o:   $(MESS_LAYOUT)/et3400.lh
20792080$(MESS_DRIVERS)/ex800.o:   $(MESS_LAYOUT)/ex800.lh
20802081$(MESS_DRIVERS)/fidelz80.o:   $(MESS_LAYOUT)/fidelz80.lh \

Previous 15994 Revisions Next


© 1998-2018 The MESS Team