Previous 15994 Revisions Next

r14880 Monday 9th April, 2012 at 06:04:10 UTC by Robbbert
SPECIAL - modernised.
[src/mess/audio]special.c
[src/mess/drivers]special.c
[src/mess/includes]special.h
[src/mess/machine]special.c
[src/mess/video]special.c

src/mess/audio/special.c
r14879r14880
77
88****************************************************************************/
99
10#include "emu.h"
11#include "machine/pit8253.h"
1210#include "includes/special.h"
1311
1412typedef struct _specimx_sound_state specimx_sound_state;
src/mess/machine/special.c
r14879r14880
88****************************************************************************/
99
1010
11#include "emu.h"
12#include "cpu/i8085/i8085.h"
13#include "sound/dac.h"
14#include "imagedev/cassette.h"
15#include "machine/i8255.h"
16#include "machine/pit8253.h"
17#include "machine/wd17xx.h"
11
1812#include "includes/special.h"
19#include "machine/ram.h"
20#include "imagedev/flopdrv.h"
2113
2214
23
2415/* Driver initialization */
2516DRIVER_INIT(special)
2617{
r14879r14880
3122   memory_configure_bank(machine, "bank1", 0, 2, RAM, 0xc000);
3223}
3324
34static READ8_DEVICE_HANDLER (specialist_8255_porta_r )
25READ8_MEMBER( special_state::specialist_8255_porta_r )
3526{
36   if (input_port_read(device->machine(), "LINE0")!=0xff) return 0xfe;
37   if (input_port_read(device->machine(), "LINE1")!=0xff) return 0xfd;
38   if (input_port_read(device->machine(), "LINE2")!=0xff) return 0xfb;
39   if (input_port_read(device->machine(), "LINE3")!=0xff) return 0xf7;
40   if (input_port_read(device->machine(), "LINE4")!=0xff) return 0xef;
41   if (input_port_read(device->machine(), "LINE5")!=0xff) return 0xdf;
42   if (input_port_read(device->machine(), "LINE6")!=0xff) return 0xbf;
43   if (input_port_read(device->machine(), "LINE7")!=0xff) return 0x7f;
27   if (input_port_read(machine(), "LINE0")!=0xff) return 0xfe;
28   if (input_port_read(machine(), "LINE1")!=0xff) return 0xfd;
29   if (input_port_read(machine(), "LINE2")!=0xff) return 0xfb;
30   if (input_port_read(machine(), "LINE3")!=0xff) return 0xf7;
31   if (input_port_read(machine(), "LINE4")!=0xff) return 0xef;
32   if (input_port_read(machine(), "LINE5")!=0xff) return 0xdf;
33   if (input_port_read(machine(), "LINE6")!=0xff) return 0xbf;
34   if (input_port_read(machine(), "LINE7")!=0xff) return 0x7f;
4435   return 0xff;
4536}
4637
47static READ8_DEVICE_HANDLER (specialist_8255_portb_r )
38READ8_MEMBER( special_state::specialist_8255_portb_r )
4839{
49   special_state *state = device->machine().driver_data<special_state>();
50
51   int dat = 0;
40   UINT8 dat = 0;
5241   double level;
5342
54   if ((state->m_specialist_8255_porta & 0x01)==0) dat ^= (input_port_read(device->machine(), "LINE0") ^ 0xff);
55   if ((state->m_specialist_8255_porta & 0x02)==0) dat ^= (input_port_read(device->machine(), "LINE1") ^ 0xff);
56   if ((state->m_specialist_8255_porta & 0x04)==0) dat ^= (input_port_read(device->machine(), "LINE2") ^ 0xff);
57   if ((state->m_specialist_8255_porta & 0x08)==0) dat ^= (input_port_read(device->machine(), "LINE3") ^ 0xff);
58   if ((state->m_specialist_8255_porta & 0x10)==0) dat ^= (input_port_read(device->machine(), "LINE4") ^ 0xff);
59   if ((state->m_specialist_8255_porta & 0x20)==0) dat ^= (input_port_read(device->machine(), "LINE5") ^ 0xff);
60   if ((state->m_specialist_8255_porta & 0x40)==0) dat ^= (input_port_read(device->machine(), "LINE6") ^ 0xff);
61   if ((state->m_specialist_8255_porta & 0x80)==0) dat ^= (input_port_read(device->machine(), "LINE7") ^ 0xff);
62   if ((state->m_specialist_8255_portc & 0x01)==0) dat ^= (input_port_read(device->machine(), "LINE8") ^ 0xff);
63   if ((state->m_specialist_8255_portc & 0x02)==0) dat ^= (input_port_read(device->machine(), "LINE9") ^ 0xff);
64   if ((state->m_specialist_8255_portc & 0x04)==0) dat ^= (input_port_read(device->machine(), "LINE10") ^ 0xff);
65   if ((state->m_specialist_8255_portc & 0x08)==0) dat ^= (input_port_read(device->machine(), "LINE11") ^ 0xff);
43   if ((m_specialist_8255_porta & 0x01)==0) dat ^= (input_port_read(machine(), "LINE0") ^ 0xff);
44   if ((m_specialist_8255_porta & 0x02)==0) dat ^= (input_port_read(machine(), "LINE1") ^ 0xff);
45   if ((m_specialist_8255_porta & 0x04)==0) dat ^= (input_port_read(machine(), "LINE2") ^ 0xff);
46   if ((m_specialist_8255_porta & 0x08)==0) dat ^= (input_port_read(machine(), "LINE3") ^ 0xff);
47   if ((m_specialist_8255_porta & 0x10)==0) dat ^= (input_port_read(machine(), "LINE4") ^ 0xff);
48   if ((m_specialist_8255_porta & 0x20)==0) dat ^= (input_port_read(machine(), "LINE5") ^ 0xff);
49   if ((m_specialist_8255_porta & 0x40)==0) dat ^= (input_port_read(machine(), "LINE6") ^ 0xff);
50   if ((m_specialist_8255_porta & 0x80)==0) dat ^= (input_port_read(machine(), "LINE7") ^ 0xff);
51   if ((m_specialist_8255_portc & 0x01)==0) dat ^= (input_port_read(machine(), "LINE8") ^ 0xff);
52   if ((m_specialist_8255_portc & 0x02)==0) dat ^= (input_port_read(machine(), "LINE9") ^ 0xff);
53   if ((m_specialist_8255_portc & 0x04)==0) dat ^= (input_port_read(machine(), "LINE10") ^ 0xff);
54   if ((m_specialist_8255_portc & 0x08)==0) dat ^= (input_port_read(machine(), "LINE11") ^ 0xff);
6655
6756   dat = (dat  << 2) ^0xff;
68   if (input_port_read(device->machine(), "LINE12")!=0xff) dat ^= 0x02;
57   if (input_port_read(machine(), "LINE12")!=0xff) dat ^= 0x02;
6958
70   level = (device->machine().device<cassette_image_device>(CASSETTE_TAG)->input());
59   level = m_cass->input();
7160   if (level >=  0)
72   {
7361         dat ^= 0x01;
74   }
75   return dat & 0xff;
62
63   return dat;
7664}
7765
78static READ8_DEVICE_HANDLER (specialist_8255_portc_r )
66READ8_MEMBER( special_state::specialist_8255_portc_r )
7967{
80   if (input_port_read(device->machine(), "LINE8")!=0xff) return 0x0e;
81   if (input_port_read(device->machine(), "LINE9")!=0xff) return 0x0d;
82   if (input_port_read(device->machine(), "LINE10")!=0xff) return 0x0b;
83   if (input_port_read(device->machine(), "LINE11")!=0xff) return 0x07;
68   if (input_port_read(machine(), "LINE8")!=0xff) return 0x0e;
69   if (input_port_read(machine(), "LINE9")!=0xff) return 0x0d;
70   if (input_port_read(machine(), "LINE10")!=0xff) return 0x0b;
71   if (input_port_read(machine(), "LINE11")!=0xff) return 0x07;
8472   return 0x0f;
8573}
8674
87static WRITE8_DEVICE_HANDLER (specialist_8255_porta_w )
75WRITE8_MEMBER( special_state::specialist_8255_porta_w )
8876{
89   special_state *state = device->machine().driver_data<special_state>();
90   state->m_specialist_8255_porta = data;
77   m_specialist_8255_porta = data;
9178}
9279
93static WRITE8_DEVICE_HANDLER (specialist_8255_portb_w )
80WRITE8_MEMBER( special_state::specialist_8255_portb_w )
9481{
95   special_state *state = device->machine().driver_data<special_state>();
96   state->m_specialist_8255_portb = data;
82   m_specialist_8255_portb = data;
9783}
98static WRITE8_DEVICE_HANDLER (specialist_8255_portc_w )
84
85WRITE8_MEMBER( special_state::specialist_8255_portc_w )
9986{
100   special_state *state = device->machine().driver_data<special_state>();
101   device_t *dac_device = device->machine().device("dac");
87   m_specialist_8255_portc = data;
10288
103   state->m_specialist_8255_portc = data;
89   m_cass->output(BIT(data, 7) ? 1 : -1);
10490
105   device->machine().device<cassette_image_device>(CASSETTE_TAG)->output(data & 0x80 ? 1 : -1);
106
107   dac_data_w(dac_device, data & 0x20); //beeper
108
91   dac_data_w(m_dac, BIT(data, 5)); //beeper
10992}
11093
11194I8255_INTERFACE( specialist_ppi8255_interface )
11295{
113   DEVCB_HANDLER(specialist_8255_porta_r),
114   DEVCB_HANDLER(specialist_8255_porta_w),
115   DEVCB_HANDLER(specialist_8255_portb_r),
116   DEVCB_HANDLER(specialist_8255_portb_w),
117   DEVCB_HANDLER(specialist_8255_portc_r),
118   DEVCB_HANDLER(specialist_8255_portc_w)
96   DEVCB_DRIVER_MEMBER(special_state, specialist_8255_porta_r),
97   DEVCB_DRIVER_MEMBER(special_state, specialist_8255_porta_w),
98   DEVCB_DRIVER_MEMBER(special_state, specialist_8255_portb_r),
99   DEVCB_DRIVER_MEMBER(special_state, specialist_8255_portb_w),
100   DEVCB_DRIVER_MEMBER(special_state, specialist_8255_portc_r),
101   DEVCB_DRIVER_MEMBER(special_state, specialist_8255_portc_w)
119102};
120103
121104static TIMER_CALLBACK( special_reset )
r14879r14880
134117/*
135118     Specialist MX
136119*/
137
138static WRITE8_HANDLER( video_memory_w )
120WRITE8_MEMBER( special_state::video_memory_w )
139121{
140   special_state *state = space->machine().driver_data<special_state>();
141   space->machine().device<ram_device>(RAM_TAG)->pointer()[0x9000 + offset] = data;
142   state->m_specimx_colorram[offset]  = state->m_specimx_color;
122   machine().device<ram_device>(RAM_TAG)->pointer()[0x9000 + offset] = data;
123   m_specimx_colorram[offset] = m_specimx_color;
143124}
144125
145WRITE8_HANDLER (specimx_video_color_w )
126WRITE8_MEMBER( special_state::specimx_video_color_w )
146127{
147   special_state *state = space->machine().driver_data<special_state>();
148   state->m_specimx_color = data;
128   m_specimx_color = data;
149129}
150130
151READ8_HANDLER (specimx_video_color_r )
131READ8_MEMBER( special_state::specimx_video_color_r )
152132{
153   special_state *state = space->machine().driver_data<special_state>();
154   return state->m_specimx_color;
133   return m_specimx_color;
155134}
156135
157static void specimx_set_bank(running_machine &machine, int i,int data)
136void special_state::specimx_set_bank(offs_t i, UINT8 data)
158137{
159   address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM);
160   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
138   address_space *space = m_maincpu->memory().space(AS_PROGRAM);
139   UINT8 *ram = machine().device<ram_device>(RAM_TAG)->pointer();
161140
162141   space->install_write_bank(0xc000, 0xffbf, "bank3");
163142   space->install_write_bank(0xffc0, 0xffdf, "bank4");
164   memory_set_bankptr(machine, "bank4", ram + 0xffc0);
143   memory_set_bankptr(machine(), "bank4", ram + 0xffc0);
165144   switch(i)
166145   {
167146      case 0 :
168            space->install_write_bank(0x0000, 0x8fff, "bank1");
169            space->install_legacy_write_handler(0x9000, 0xbfff, FUNC(video_memory_w));
147         space->install_write_bank(0x0000, 0x8fff, "bank1");
148         //space->install_legacy_write_handler(0x9000, 0xbfff, FUNC(video_memory_w));
149         space->install_write_handler(0x9000, 0xbfff, write8_delegate(FUNC(special_state::video_memory_w), this));
170150
171            memory_set_bankptr(machine, "bank1", ram);
172            memory_set_bankptr(machine, "bank2", ram + 0x9000);
173            memory_set_bankptr(machine, "bank3", ram + 0xc000);
174            break;
151         memory_set_bankptr(machine(), "bank1", ram);
152         memory_set_bankptr(machine(), "bank2", ram + 0x9000);
153         memory_set_bankptr(machine(), "bank3", ram + 0xc000);
154         break;
175155      case 1 :
176            space->install_write_bank(0x0000, 0x8fff, "bank1");
177            space->install_write_bank(0x9000, 0xbfff, "bank2");
156         space->install_write_bank(0x0000, 0x8fff, "bank1");
157         space->install_write_bank(0x9000, 0xbfff, "bank2");
178158
179            memory_set_bankptr(machine, "bank1", ram + 0x10000);
180            memory_set_bankptr(machine, "bank2", ram + 0x19000);
181            memory_set_bankptr(machine, "bank3", ram + 0x1c000);
182            break;
159         memory_set_bankptr(machine(), "bank1", ram + 0x10000);
160         memory_set_bankptr(machine(), "bank2", ram + 0x19000);
161         memory_set_bankptr(machine(), "bank3", ram + 0x1c000);
162         break;
183163      case 2 :
184            space->unmap_write(0x0000, 0x8fff);
185            space->unmap_write(0x9000, 0xbfff);
164         space->unmap_write(0x0000, 0x8fff);
165         space->unmap_write(0x9000, 0xbfff);
186166
187            memory_set_bankptr(machine, "bank1", machine.region("maincpu")->base() + 0x10000);
188            memory_set_bankptr(machine, "bank2", machine.region("maincpu")->base() + 0x19000);
189            if (data & 0x80)
190            {
191               memory_set_bankptr(machine, "bank3", ram + 0x1c000);
192            }
193            else
194            {
195               memory_set_bankptr(machine, "bank3", ram + 0xc000);
196            }
197            break;
167         memory_set_bankptr(machine(), "bank1", machine().region("maincpu")->base() + 0x10000);
168         memory_set_bankptr(machine(), "bank2", machine().region("maincpu")->base() + 0x19000);
169
170         if (data & 0x80)
171            memory_set_bankptr(machine(), "bank3", ram + 0x1c000);
172         else
173            memory_set_bankptr(machine(), "bank3", ram + 0xc000);
174
175         break;
198176   }
199177}
200WRITE8_HANDLER( specimx_select_bank )
178
179WRITE8_MEMBER( special_state::specimx_select_bank )
201180{
202   specimx_set_bank(space->machine(), offset, data);
181   specimx_set_bank(offset, data);
203182}
204183
205static WRITE_LINE_DEVICE_HANDLER( specimx_pit8253_out0_changed )
184WRITE_LINE_MEMBER( special_state::specimx_pit8253_out0_changed )
206185{
207   special_state *drvstate = device->machine().driver_data<special_state>();
208   specimx_set_input( drvstate->m_specimx_audio, 0, state );
186   specimx_set_input( m_specimx_audio, 0, state );
209187}
210188
211
212
213static WRITE_LINE_DEVICE_HANDLER(specimx_pit8253_out1_changed)
189WRITE_LINE_MEMBER( special_state::specimx_pit8253_out1_changed )
214190{
215   special_state *drvstate = device->machine().driver_data<special_state>();
216   specimx_set_input( drvstate->m_specimx_audio, 1, state );
191   specimx_set_input( m_specimx_audio, 1, state );
217192}
218193
219
220
221static WRITE_LINE_DEVICE_HANDLER(specimx_pit8253_out2_changed)
194WRITE_LINE_MEMBER( special_state::specimx_pit8253_out2_changed )
222195{
223   special_state *drvstate = device->machine().driver_data<special_state>();
224   specimx_set_input( drvstate->m_specimx_audio, 2, state );
196   specimx_set_input( m_specimx_audio, 2, state );
225197}
226198
227199
r14879r14880
232204      {
233205         2000000,
234206         DEVCB_NULL,
235         DEVCB_LINE(specimx_pit8253_out0_changed)
207         DEVCB_DRIVER_LINE_MEMBER(special_state, specimx_pit8253_out0_changed)
236208      },
237209      {
238210         2000000,
239211         DEVCB_NULL,
240         DEVCB_LINE(specimx_pit8253_out1_changed)
212         DEVCB_DRIVER_LINE_MEMBER(special_state, specimx_pit8253_out1_changed)
241213      },
242214      {
243215         2000000,
244216         DEVCB_NULL,
245         DEVCB_LINE(specimx_pit8253_out2_changed)
217         DEVCB_DRIVER_LINE_MEMBER(special_state, specimx_pit8253_out2_changed)
246218      }
247219   }
248220};
r14879r14880
265237MACHINE_RESET( specimx )
266238{
267239   special_state *state = machine.driver_data<special_state>();
268   specimx_set_bank(machine, 2,0x00); // Initiali load ROM disk
240   state->specimx_set_bank(2, 0); // Initiali load ROM disk
269241   state->m_specimx_color = 0x70;
270242   machine.scheduler().timer_set(attotime::zero, FUNC(setup_pit8253_gates));
271243   device_t *fdc = machine.device("wd1793");
r14879r14880
273245   wd17xx_dden_w(fdc, 0);
274246}
275247
276READ8_HANDLER ( specimx_disk_ctrl_r )
248READ8_MEMBER( special_state::specimx_disk_ctrl_r )
277249{
278250   return 0xff;
279251}
280252
281WRITE8_HANDLER( specimx_disk_ctrl_w )
253WRITE8_MEMBER( special_state::specimx_disk_ctrl_w )
282254{
283   device_t *fdc = space->machine().device("wd1793");
284
285255   switch(offset)
286256   {
287257      case 2 :
288            wd17xx_set_side(fdc,data & 1);
258            wd17xx_set_side(m_fdc, data & 1);
289259            break;
290260      case 3 :
291            wd17xx_set_drive(fdc,data & 1);
261            wd17xx_set_drive(m_fdc, data & 1);
292262            break;
293
294263   }
295264}
296265
r14879r14880
298267    Erik
299268*/
300269
301static void erik_set_bank(running_machine &machine)
270void special_state::erik_set_bank()
302271{
303   special_state *state = machine.driver_data<special_state>();
304   UINT8 bank1 = (state->m_RR_register & 3);
305   UINT8 bank2 = ((state->m_RR_register >> 2) & 3);
306   UINT8 bank3 = ((state->m_RR_register >> 4) & 3);
307   UINT8 bank4 = ((state->m_RR_register >> 6) & 3);
308   UINT8 *mem = machine.region("maincpu")->base();
309   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
310   address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM);
272   UINT8 bank1 = m_RR_register & 3;
273   UINT8 bank2 = (m_RR_register >> 2) & 3;
274   UINT8 bank3 = (m_RR_register >> 4) & 3;
275   UINT8 bank4 = (m_RR_register >> 6) & 3;
276   UINT8 *mem = machine().region("maincpu")->base();
277   UINT8 *ram = machine().device<ram_device>(RAM_TAG)->pointer();
278   address_space *space = m_maincpu->memory().space(AS_PROGRAM);
311279
312280   space->install_write_bank(0x0000, 0x3fff, "bank1");
313281   space->install_write_bank(0x4000, 0x8fff, "bank2");
r14879r14880
321289      case   1:
322290      case   2:
323291      case   3:
324                  memory_set_bankptr(machine, "bank1", ram + 0x10000*(bank1-1));
325                  break;
292         memory_set_bankptr(machine(), "bank1", ram + 0x10000*(bank1-1));
293         break;
326294      case   0:
327                  space->unmap_write(0x0000, 0x3fff);
328                  memory_set_bankptr(machine, "bank1", mem + 0x10000);
329                  break;
295         space->unmap_write(0x0000, 0x3fff);
296         memory_set_bankptr(machine(), "bank1", mem + 0x10000);
297         break;
330298   }
331299   switch(bank2)
332300   {
333301      case   1:
334302      case   2:
335303      case   3:
336                  memory_set_bankptr(machine, "bank2", ram + 0x10000*(bank2-1) + 0x4000);
337                  break;
304         memory_set_bankptr(machine(), "bank2", ram + 0x10000*(bank2-1) + 0x4000);
305         break;
338306      case   0:
339                  space->unmap_write(0x4000, 0x8fff);
340                  memory_set_bankptr(machine, "bank2", mem + 0x14000);
341                  break;
307         space->unmap_write(0x4000, 0x8fff);
308         memory_set_bankptr(machine(), "bank2", mem + 0x14000);
309         break;
342310   }
343311   switch(bank3)
344312   {
345313      case   1:
346314      case   2:
347315      case   3:
348                  memory_set_bankptr(machine, "bank3", ram + 0x10000*(bank3-1) + 0x9000);
349                  break;
316         memory_set_bankptr(machine(), "bank3", ram + 0x10000*(bank3-1) + 0x9000);
317         break;
350318      case   0:
351                  space->unmap_write(0x9000, 0xbfff);
352                  memory_set_bankptr(machine, "bank3", mem + 0x19000);
353                  break;
319         space->unmap_write(0x9000, 0xbfff);
320         memory_set_bankptr(machine(), "bank3", mem + 0x19000);
321         break;
354322   }
355323   switch(bank4)
356324   {
357325      case   1:
358326      case   2:
359327      case   3:
360                  memory_set_bankptr(machine, "bank4", ram + 0x10000*(bank4-1) + 0x0c000);
361                  memory_set_bankptr(machine, "bank5", ram + 0x10000*(bank4-1) + 0x0f000);
362                  memory_set_bankptr(machine, "bank6", ram + 0x10000*(bank4-1) + 0x0f800);
363                  break;
328         memory_set_bankptr(machine(), "bank4", ram + 0x10000*(bank4-1) + 0x0c000);
329         memory_set_bankptr(machine(), "bank5", ram + 0x10000*(bank4-1) + 0x0f000);
330         memory_set_bankptr(machine(), "bank6", ram + 0x10000*(bank4-1) + 0x0f800);
331         break;
364332      case   0:
365                  space->unmap_write(0xc000, 0xefff);
366                  memory_set_bankptr(machine, "bank4", mem + 0x1c000);
367                  space->unmap_write(0xf000, 0xf7ff);
368                  space->nop_read(0xf000, 0xf7ff);
369                  i8255_device *ppi = machine.device<i8255_device>("ppi8255");
370                  space->install_readwrite_handler(0xf800, 0xf803, 0, 0x7fc, read8_delegate(FUNC(i8255_device::read), (i8255_device*)ppi), write8_delegate(FUNC(i8255_device::write), (i8255_device*)ppi));
371                  break;
333         space->unmap_write(0xc000, 0xefff);
334         memory_set_bankptr(machine(), "bank4", mem + 0x1c000);
335         space->unmap_write(0xf000, 0xf7ff);
336         space->nop_read(0xf000, 0xf7ff);
337         space->install_readwrite_handler(0xf800, 0xf803, 0, 0x7fc, read8_delegate(FUNC(i8255_device::read), (i8255_device*)m_ppi), write8_delegate(FUNC(i8255_device::write), (i8255_device*)m_ppi));
338         break;
372339   }
373340}
374341
r14879r14880
385352   special_state *state = machine.driver_data<special_state>();
386353   state->m_RR_register = 0x00;
387354   state->m_RC_register = 0x00;
388   erik_set_bank(machine);
355   state->erik_set_bank();
389356}
390357
391READ8_HANDLER ( erik_rr_reg_r )
358READ8_MEMBER( special_state::erik_rr_reg_r )
392359{
393   special_state *state = space->machine().driver_data<special_state>();
394   return state->m_RR_register;
360   return m_RR_register;
395361}
396WRITE8_HANDLER( erik_rr_reg_w )
362
363WRITE8_MEMBER( special_state::erik_rr_reg_w )
397364{
398   special_state *state = space->machine().driver_data<special_state>();
399   state->m_RR_register = data;
400   erik_set_bank(space->machine());
365   m_RR_register = data;
366   erik_set_bank();
401367}
402368
403READ8_HANDLER ( erik_rc_reg_r )
369READ8_MEMBER( special_state::erik_rc_reg_r )
404370{
405   special_state *state = space->machine().driver_data<special_state>();
406   return state->m_RC_register;
371   return m_RC_register;
407372}
408373
409
410WRITE8_HANDLER( erik_rc_reg_w )
374WRITE8_MEMBER( special_state::erik_rc_reg_w )
411375{
412   special_state *state = space->machine().driver_data<special_state>();
413   state->m_RC_register = data;
414   state->m_erik_color_1 =  state->m_RC_register & 7;
415   state->m_erik_color_2 =  (state->m_RC_register >> 3) & 7;
416   state->m_erik_background = ((state->m_RC_register  >> 6 ) & 1) + ((state->m_RC_register  >> 7 ) & 1) * 4;
376   m_RC_register = data;
377   m_erik_color_1 = m_RC_register & 7;
378   m_erik_color_2 = (m_RC_register >> 3) & 7;
379   m_erik_background = BIT(m_RC_register, 6) + BIT(m_RC_register, 7) * 4;
417380}
418381
419READ8_HANDLER ( erik_disk_reg_r )
382READ8_MEMBER( special_state::erik_disk_reg_r )
420383{
421384   return 0xff;
422385}
423386
424WRITE8_HANDLER( erik_disk_reg_w )
387WRITE8_MEMBER( special_state::erik_disk_reg_w )
425388{
426   device_t *fdc = space->machine().device("wd1793");
427
428   wd17xx_set_side (fdc,data & 1);
429   wd17xx_set_drive(fdc,(data >> 1) & 1);
430   wd17xx_dden_w(fdc, BIT(data, 2));
431   floppy_mon_w(floppy_get_device(space->machine(), (data >> 1) & 1), 0);
432   floppy_mon_w(floppy_get_device(space->machine(), ((data >> 1) & 1) ? 0 : 1), 1);
433   floppy_drive_set_ready_state(floppy_get_device(space->machine(), (data >> 1) & 1), 1, 1);
434
389   wd17xx_set_side (m_fdc,data & 1);
390   wd17xx_set_drive(m_fdc,(data >> 1) & 1);
391   wd17xx_dden_w(m_fdc, BIT(data, 2));
392   floppy_mon_w(floppy_get_device(machine(), BIT(data, 1)), 0);
393   floppy_mon_w(floppy_get_device(machine(), BIT(data, 1) ^ 1), 1);
394   floppy_drive_set_ready_state(floppy_get_device(machine(), BIT(data, 1)), 1, 1);
435395}
src/mess/includes/special.h
r14879r14880
77#ifndef SPECIAL_H_
88#define SPECIAL_H_
99
10#include "emu.h"
11#include "cpu/z80/z80.h"
12#include "cpu/i8085/i8085.h"
13#include "sound/dac.h"
14#include "sound/wave.h"
1015#include "machine/i8255.h"
1116#include "machine/pit8253.h"
17#include "imagedev/cassette.h"
18#include "imagedev/flopdrv.h"
19#include "formats/basicdsk.h"
20#include "formats/rk_cas.h"
21#include "formats/smx_dsk.h"
22#include "machine/wd17xx.h"
23#include "machine/ram.h"
1224
25
1326class special_state : public driver_device
1427{
1528public:
1629   special_state(const machine_config &mconfig, device_type type, const char *tag)
17      : driver_device(mconfig, type, tag) { }
30      : driver_device(mconfig, type, tag),
31   m_maincpu(*this, "maincpu"),
32   m_ppi(*this, "ppi8255"),
33   m_fdc(*this, "wd1793"),
34   m_dac(*this, "dac"),
35   m_cass(*this, CASSETTE_TAG)
36   { }
1837
38   DECLARE_WRITE8_MEMBER(specimx_select_bank);
39   DECLARE_WRITE8_MEMBER(video_memory_w);
40   DECLARE_WRITE8_MEMBER(specimx_video_color_w);
41   DECLARE_READ8_MEMBER(specimx_video_color_r);
42   DECLARE_READ8_MEMBER(specimx_disk_ctrl_r);
43   DECLARE_WRITE8_MEMBER(specimx_disk_ctrl_w);
44   DECLARE_READ8_MEMBER(erik_rr_reg_r);
45   DECLARE_WRITE8_MEMBER(erik_rr_reg_w);
46   DECLARE_READ8_MEMBER(erik_rc_reg_r);
47   DECLARE_WRITE8_MEMBER(erik_rc_reg_w);
48   DECLARE_READ8_MEMBER(erik_disk_reg_r);
49   DECLARE_WRITE8_MEMBER(erik_disk_reg_w);
50   DECLARE_READ8_MEMBER(specialist_8255_porta_r);
51   DECLARE_READ8_MEMBER(specialist_8255_portb_r);
52   DECLARE_READ8_MEMBER(specialist_8255_portc_r);
53   DECLARE_WRITE8_MEMBER(specialist_8255_porta_w);
54   DECLARE_WRITE8_MEMBER(specialist_8255_portb_w);
55   DECLARE_WRITE8_MEMBER(specialist_8255_portc_w);
56   DECLARE_WRITE_LINE_MEMBER(specimx_pit8253_out0_changed);
57   DECLARE_WRITE_LINE_MEMBER(specimx_pit8253_out1_changed);
58   DECLARE_WRITE_LINE_MEMBER(specimx_pit8253_out2_changed);
59   void specimx_set_bank(offs_t i, UINT8 data);
60   void erik_set_bank();
1961   UINT8 *m_specimx_colorram;
2062   UINT8 m_erik_color_1;
2163   UINT8 m_erik_color_2;
2264   UINT8 m_erik_background;
23   UINT8 *m_specialist_video_ram;
65   UINT8 *m_p_videoram;
2466   UINT8 m_specimx_color;
2567   device_t *m_specimx_audio;
2668   int m_specialist_8255_porta;
r14879r14880
2870   int m_specialist_8255_portc;
2971   UINT8 m_RR_register;
3072   UINT8 m_RC_register;
73   required_device<cpu_device> m_maincpu;
74   optional_device<i8255_device> m_ppi;
75   optional_device<device_t> m_fdc;
76   optional_device<device_t> m_dac;
77   optional_device<cassette_image_device> m_cass;
3178};
3279
3380
r14879r14880
4289MACHINE_RESET( specimx );
4390MACHINE_START ( specimx );
4491
45WRITE8_HANDLER( specimx_select_bank );
46
47READ8_HANDLER ( specimx_video_color_r );
48WRITE8_HANDLER( specimx_video_color_w );
49
50READ8_HANDLER ( specimx_disk_ctrl_r );
51WRITE8_HANDLER( specimx_disk_ctrl_w );
52
5392DRIVER_INIT( erik );
5493MACHINE_RESET( erik );
5594
56READ8_HANDLER ( erik_rr_reg_r );
57WRITE8_HANDLER( erik_rr_reg_w );
58READ8_HANDLER ( erik_rc_reg_r );
59WRITE8_HANDLER( erik_rc_reg_w );
60READ8_HANDLER ( erik_disk_reg_r );
61WRITE8_HANDLER( erik_disk_reg_w );
62
6395/*----------- defined in video/special.c -----------*/
6496
6597VIDEO_START( special );
src/mess/video/special.c
r14879r14880
77****************************************************************************/
88
99
10#include "emu.h"
1110#include "includes/special.h"
12#include "machine/ram.h"
1311
1412
15
1613VIDEO_START( special )
1714{
1815}
r14879r14880
2017SCREEN_UPDATE_IND16( special )
2118{
2219   special_state *state = screen.machine().driver_data<special_state>();
23  UINT8 code;
20   UINT8 code;
2421   int y, x, b;
2522
2623   for (x = 0; x < 48; x++)
2724   {
2825      for (y = 0; y < 256; y++)
2926      {
30         code = state->m_specialist_video_ram[y + x*256];
27         code = state->m_p_videoram[y + x*256];
3128         for (b = 7; b >= 0; b--)
32         {
3329            bitmap.pix16(y, x*8+(7-b)) =  (code >> b) & 0x01;
34         }
3530      }
3631   }
3732   return 0;
r14879r14880
4338SCREEN_UPDATE_IND16( specialp )
4439{
4540   special_state *state = screen.machine().driver_data<special_state>();
46  UINT8 code;
41   UINT8 code;
4742   int y, x, b;
4843
4944   for (x = 0; x < 64; x++)
5045   {
5146      for (y = 0; y < 256; y++)
5247      {
53         code = state->m_specialist_video_ram[y + x*256];
48         code = state->m_p_videoram[y + x*256];
5449         for (b = 7; b >= 0; b--)
55         {
5650            bitmap.pix16(y, x*8+(7-b)) =  (code >> b) & 0x01;
57         }
5851      }
5952   }
6053   return 0;
r14879r14880
7770   MAKE_RGB(0xff, 0x55, 0x55), // C
7871   MAKE_RGB(0xff, 0x55, 0xff), // D
7972   MAKE_RGB(0xff, 0xff, 0x55), // E
80   MAKE_RGB(0xff, 0xff, 0xff)   // F
73   MAKE_RGB(0xff, 0xff, 0xff)  // F
8174};
8275
8376PALETTE_INIT( specimx )
r14879r14880
10699         code = screen.machine().device<ram_device>(RAM_TAG)->pointer()[0x9000 + y + x*256];
107100         color = state->m_specimx_colorram[y + x*256];
108101         for (b = 7; b >= 0; b--)
109         {
110
111102            bitmap.pix16(y, x*8+(7-b)) =  ((code >> b) & 0x01)==0 ? color & 0x0f : (color >> 4)& 0x0f ;
112         }
113103      }
114104   }
115105   return 0;
r14879r14880
139129SCREEN_UPDATE_IND16( erik )
140130{
141131   special_state *state = screen.machine().driver_data<special_state>();
142  UINT8 code1;
143  UINT8 code2;
144  UINT8 color1,color2;
132   UINT8 code1;
133   UINT8 code2;
134   UINT8 color1,color2;
145135   int y, x, b;
146136   UINT8 *erik_video_ram_p1;
147137   UINT8 *erik_video_ram_p2;
r14879r14880
166156   }
167157   return 0;
168158}
169
170
src/mess/drivers/special.c
r14879r14880
88****************************************************************************/
99
1010
11#include "emu.h"
12#include "cpu/z80/z80.h"
13#include "cpu/i8085/i8085.h"
14#include "sound/dac.h"
15#include "sound/wave.h"
1611#include "includes/special.h"
17#include "machine/i8255.h"
18#include "machine/pit8253.h"
19#include "imagedev/cassette.h"
20#include "imagedev/flopdrv.h"
21#include "formats/basicdsk.h"
22#include "formats/rk_cas.h"
23#include "formats/smx_dsk.h"
24#include "machine/wd17xx.h"
25#include "machine/ram.h"
2612
13
2714/* Address maps */
2815static ADDRESS_MAP_START(specialist_mem, AS_PROGRAM, 8, special_state )
2916   AM_RANGE( 0x0000, 0x2fff ) AM_RAMBANK("bank1") // First bank
30    AM_RANGE( 0x3000, 0x8fff ) AM_RAM  // RAM
31    AM_RANGE( 0x9000, 0xbfff ) AM_RAM  AM_BASE(m_specialist_video_ram) // Video RAM
32    AM_RANGE( 0xc000, 0xf000 ) AM_ROM  // System ROM
33    AM_RANGE( 0xf000, 0xf700 ) AM_NOP
34    AM_RANGE( 0xf800, 0xf803 ) AM_MIRROR(0x7fc) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
17   AM_RANGE( 0x3000, 0x8fff ) AM_RAM  // RAM
18   AM_RANGE( 0x9000, 0xbfff ) AM_RAM  AM_BASE(m_p_videoram) // Video RAM
19   AM_RANGE( 0xc000, 0xf000 ) AM_ROM  // System ROM
20   AM_RANGE( 0xf000, 0xf700 ) AM_NOP
21   AM_RANGE( 0xf800, 0xf803 ) AM_MIRROR(0x7fc) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
3522ADDRESS_MAP_END
3623
3724static ADDRESS_MAP_START(specialp_mem, AS_PROGRAM, 8, special_state )
3825   AM_RANGE( 0x0000, 0x2fff ) AM_RAMBANK("bank1") // First bank
39    AM_RANGE( 0x3000, 0x7fff ) AM_RAM  // RAM
40    AM_RANGE( 0x8000, 0xbfff ) AM_RAM  AM_BASE(m_specialist_video_ram) // Video RAM
41    AM_RANGE( 0xc000, 0xf000 ) AM_ROM  // System ROM
42    AM_RANGE( 0xf000, 0xf700 ) AM_NOP
43    AM_RANGE( 0xf800, 0xf803 ) AM_MIRROR(0x7fc) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
26   AM_RANGE( 0x3000, 0x7fff ) AM_RAM  // RAM
27   AM_RANGE( 0x8000, 0xbfff ) AM_RAM  AM_BASE(m_p_videoram) // Video RAM
28   AM_RANGE( 0xc000, 0xf000 ) AM_ROM  // System ROM
29   AM_RANGE( 0xf000, 0xf700 ) AM_NOP
30   AM_RANGE( 0xf800, 0xf803 ) AM_MIRROR(0x7fc) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
4431ADDRESS_MAP_END
4532
4633static ADDRESS_MAP_START(erik_mem, AS_PROGRAM, 8, special_state )
47    AM_RANGE( 0x0000, 0x3fff ) AM_RAMBANK("bank1")
48    AM_RANGE( 0x4000, 0x8fff ) AM_RAMBANK("bank2")
49    AM_RANGE( 0x9000, 0xbfff ) AM_RAMBANK("bank3")
50    AM_RANGE( 0xc000, 0xefff ) AM_RAMBANK("bank4")
51    AM_RANGE( 0xf000, 0xf7ff ) AM_RAMBANK("bank5")
52    AM_RANGE( 0xf800, 0xffff ) AM_RAMBANK("bank6")
34   AM_RANGE( 0x0000, 0x3fff ) AM_RAMBANK("bank1")
35   AM_RANGE( 0x4000, 0x8fff ) AM_RAMBANK("bank2")
36   AM_RANGE( 0x9000, 0xbfff ) AM_RAMBANK("bank3")
37   AM_RANGE( 0xc000, 0xefff ) AM_RAMBANK("bank4")
38   AM_RANGE( 0xf000, 0xf7ff ) AM_RAMBANK("bank5")
39   AM_RANGE( 0xf800, 0xffff ) AM_RAMBANK("bank6")
5340ADDRESS_MAP_END
5441
5542static ADDRESS_MAP_START( erik_io_map, AS_IO, 8, special_state )
5643   ADDRESS_MAP_GLOBAL_MASK(0xff)
57   AM_RANGE(0xf1, 0xf1) AM_READWRITE_LEGACY(erik_rr_reg_r, erik_rr_reg_w)
58   AM_RANGE(0xf2, 0xf2) AM_READWRITE_LEGACY(erik_rc_reg_r, erik_rc_reg_w)
59   AM_RANGE(0xf3, 0xf3) AM_READWRITE_LEGACY(erik_disk_reg_r, erik_disk_reg_w)
44   AM_RANGE(0xf1, 0xf1) AM_READWRITE(erik_rr_reg_r, erik_rr_reg_w)
45   AM_RANGE(0xf2, 0xf2) AM_READWRITE(erik_rc_reg_r, erik_rc_reg_w)
46   AM_RANGE(0xf3, 0xf3) AM_READWRITE(erik_disk_reg_r, erik_disk_reg_w)
6047   AM_RANGE(0xf4, 0xf4) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_status_r, wd17xx_command_w)
6148   AM_RANGE(0xf5, 0xf5) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_track_r, wd17xx_track_w)
6249   AM_RANGE(0xf6, 0xf6) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_sector_r, wd17xx_sector_w)
r14879r14880
6552
6653static ADDRESS_MAP_START(specimx_mem, AS_PROGRAM, 8, special_state )
6754   ADDRESS_MAP_UNMAP_HIGH
68    AM_RANGE( 0x0000, 0x8fff ) AM_RAMBANK("bank1")
55   AM_RANGE( 0x0000, 0x8fff ) AM_RAMBANK("bank1")
6956   AM_RANGE( 0x9000, 0xbfff ) AM_RAMBANK("bank2")
7057   AM_RANGE( 0xc000, 0xffbf ) AM_RAMBANK("bank3")
71    AM_RANGE( 0xffc0, 0xffdf ) AM_RAMBANK("bank4")
72    AM_RANGE( 0xffe0, 0xffe3 ) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
73    AM_RANGE( 0xffe4, 0xffe7 ) AM_RAM //external 8255
74    AM_RANGE( 0xffe8, 0xffe8 ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_status_r,wd17xx_command_w)
75    AM_RANGE( 0xffe9, 0xffe9 ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_track_r,wd17xx_track_w)
76    AM_RANGE( 0xffea, 0xffea ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_sector_r,wd17xx_sector_w)
77    AM_RANGE( 0xffea, 0xffeb ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_data_r,wd17xx_data_w)
78    AM_RANGE( 0xffec, 0xffef ) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w)
79    AM_RANGE( 0xfff0, 0xfff3 ) AM_READWRITE_LEGACY(specimx_disk_ctrl_r, specimx_disk_ctrl_w)
80    AM_RANGE( 0xfff8, 0xfff8 ) AM_READWRITE_LEGACY(specimx_video_color_r,specimx_video_color_w)
81    AM_RANGE( 0xfffc, 0xfffe ) AM_WRITE_LEGACY(specimx_select_bank)
58   AM_RANGE( 0xffc0, 0xffdf ) AM_RAMBANK("bank4")
59   AM_RANGE( 0xffe0, 0xffe3 ) AM_DEVREADWRITE("ppi8255", i8255_device, read, write)
60   AM_RANGE( 0xffe4, 0xffe7 ) AM_RAM //external 8255
61   AM_RANGE( 0xffe8, 0xffe8 ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_status_r,wd17xx_command_w)
62   AM_RANGE( 0xffe9, 0xffe9 ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_track_r,wd17xx_track_w)
63   AM_RANGE( 0xffea, 0xffea ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_sector_r,wd17xx_sector_w)
64   AM_RANGE( 0xffea, 0xffeb ) AM_DEVREADWRITE_LEGACY("wd1793", wd17xx_data_r,wd17xx_data_w)
65   AM_RANGE( 0xffec, 0xffef ) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w)
66   AM_RANGE( 0xfff0, 0xfff3 ) AM_READWRITE(specimx_disk_ctrl_r, specimx_disk_ctrl_w)
67   AM_RANGE( 0xfff8, 0xfff8 ) AM_READWRITE(specimx_video_color_r,specimx_video_color_w)
68   AM_RANGE( 0xfffc, 0xfffe ) AM_WRITE(specimx_select_bank)
8269ADDRESS_MAP_END
8370
8471/* Input ports */
r14879r14880
413400
414401/* Machine driver */
415402static MACHINE_CONFIG_START( special, special_state )
416    /* basic machine hardware */
417    MCFG_CPU_ADD("maincpu", I8080, 2000000)
418    MCFG_CPU_PROGRAM_MAP(specialist_mem)
419    MCFG_MACHINE_RESET( special )
403   /* basic machine hardware */
404   MCFG_CPU_ADD("maincpu", I8080, 2000000)
405   MCFG_CPU_PROGRAM_MAP(specialist_mem)
406   MCFG_MACHINE_RESET( special )
420407
421   MCFG_PIT8253_ADD( "pit8253", specimx_pit8253_intf )
422
423   MCFG_I8255_ADD( "ppi8255", specialist_ppi8255_interface )
424
425    /* video hardware */
408   /* video hardware */
426409   MCFG_SCREEN_ADD("screen", RASTER)
427410   MCFG_SCREEN_REFRESH_RATE(50)
428411   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
429412   MCFG_SCREEN_SIZE(384, 256)
430413   MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 256-1)
431    MCFG_SCREEN_UPDATE_STATIC(special)
432
414   MCFG_VIDEO_START(special)
415   MCFG_SCREEN_UPDATE_STATIC(special)
433416   MCFG_PALETTE_LENGTH(2)
434417   MCFG_PALETTE_INIT(black_and_white)
435418
436    MCFG_VIDEO_START(special)
437
438    /* audio hardware */
419   /* audio hardware */
439420   MCFG_SPEAKER_STANDARD_MONO("mono")
440421   MCFG_SOUND_ADD("dac", DAC, 0)
441   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
422   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
442423   MCFG_SOUND_WAVE_ADD(WAVE_TAG, CASSETTE_TAG)
443424   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
444425
426   /* Devices */
445427   MCFG_CASSETTE_ADD( CASSETTE_TAG, special_cassette_interface )
446
428   MCFG_PIT8253_ADD( "pit8253", specimx_pit8253_intf )
429   MCFG_I8255_ADD( "ppi8255", specialist_ppi8255_interface )
447430MACHINE_CONFIG_END
448431
449432static MACHINE_CONFIG_DERIVED( specialp, special )
450
451433   /* basic machine hardware */
452    MCFG_CPU_MODIFY("maincpu")
453    MCFG_CPU_PROGRAM_MAP(specialp_mem)
434   MCFG_CPU_MODIFY("maincpu")
435   MCFG_CPU_PROGRAM_MAP(specialp_mem)
454436
455    MCFG_SCREEN_MODIFY("screen")
456    MCFG_SCREEN_UPDATE_STATIC(specialp)
437   MCFG_SCREEN_MODIFY("screen")
438   MCFG_SCREEN_UPDATE_STATIC(specialp)
457439   MCFG_SCREEN_SIZE(512, 256)
458440   MCFG_SCREEN_VISIBLE_AREA(0, 512-1, 0, 256-1)
459
460    MCFG_VIDEO_START(specialp)
441   MCFG_VIDEO_START(specialp)
461442MACHINE_CONFIG_END
462443
463444static MACHINE_CONFIG_DERIVED( specimx, special )
464    MCFG_CPU_MODIFY("maincpu")
445   MCFG_CPU_MODIFY("maincpu")
465446   MCFG_CPU_PROGRAM_MAP(specimx_mem)
466447
467448   MCFG_MACHINE_START ( specimx )
468449   MCFG_MACHINE_RESET ( specimx )
469450
470    /* video hardware */
451   /* video hardware */
471452   MCFG_SCREEN_MODIFY("screen")
472453   MCFG_SCREEN_UPDATE_STATIC(specimx)
473
474454   MCFG_VIDEO_START(specimx)
475
476455   MCFG_PALETTE_LENGTH(16)
477456   MCFG_PALETTE_INIT( specimx )
478457
479    /* audio hardware */
458   /* audio hardware */
480459   MCFG_SOUND_ADD("custom", SPECIMX, 0)
481460   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
482461
462   /* Devices */
483463   MCFG_FD1793_ADD("wd1793", default_wd17xx_interface_2_drives )
484
485464   MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(specimx_floppy_interface)
486465
487466   /* internal ram */
r14879r14880
491470MACHINE_CONFIG_END
492471
493472static MACHINE_CONFIG_START( erik, special_state )
494    /* basic machine hardware */
495    MCFG_CPU_ADD("maincpu", Z80, 4000000)
496    MCFG_CPU_PROGRAM_MAP(erik_mem)
497    MCFG_CPU_IO_MAP(erik_io_map)
473   /* basic machine hardware */
474   MCFG_CPU_ADD("maincpu", Z80, 4000000)
475   MCFG_CPU_PROGRAM_MAP(erik_mem)
476   MCFG_CPU_IO_MAP(erik_io_map)
477   MCFG_MACHINE_RESET( erik )
498478
499    MCFG_MACHINE_RESET( erik )
500
501   MCFG_I8255_ADD( "ppi8255", specialist_ppi8255_interface )
502
503    /* video hardware */
479   /* video hardware */
504480   MCFG_SCREEN_ADD("screen", RASTER)
505481   MCFG_SCREEN_REFRESH_RATE(50)
506482   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
507483   MCFG_SCREEN_SIZE(384, 256)
508484   MCFG_SCREEN_VISIBLE_AREA(0, 384-1, 0, 256-1)
509    MCFG_SCREEN_UPDATE_STATIC(erik)
510
485   MCFG_VIDEO_START(erik)
486   MCFG_SCREEN_UPDATE_STATIC(erik)
511487   MCFG_PALETTE_LENGTH(8)
512488   MCFG_PALETTE_INIT(erik)
513489
514    MCFG_VIDEO_START(erik)
515    /* audio hardware */
490   /* audio hardware */
516491   MCFG_SPEAKER_STANDARD_MONO("mono")
517492   MCFG_SOUND_ADD("dac", DAC, 0)
518   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
493   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
519494   MCFG_SOUND_WAVE_ADD(WAVE_TAG, CASSETTE_TAG)
520495   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
521496
497   /* Devices */
522498   MCFG_CASSETTE_ADD( CASSETTE_TAG, special_cassette_interface )
523
524499   MCFG_FD1793_ADD("wd1793", default_wd17xx_interface_2_drives )
525
526500   MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(specimx_floppy_interface)
501   MCFG_I8255_ADD( "ppi8255", specialist_ppi8255_interface )
527502
528503   /* internal ram */
529504   MCFG_RAM_ADD(RAM_TAG)
r14879r14880
533508
534509/* ROM definition */
535510ROM_START( special )
536    ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
511   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
537512   ROM_SYSTEM_BIOS(0, "2nd", "2nd rev.")
538513   ROMX_LOAD( "monitor2_1.rom", 0xc000, 0x0800, CRC(52abde77) SHA1(66ba2ef9eac14a5c0df510224ea25fd5745399cd), ROM_BIOS(1))
539514   ROMX_LOAD( "monitor2_2.rom", 0xc800, 0x0800, CRC(c425f719) SHA1(1c322591b4e5c8b01b81362c6801aa6fd9fc1492), ROM_BIOS(1))
r14879r14880
549524   ROMX_LOAD( "pzu4.rom", 0xd800, 0x0800, CRC(6793ba23) SHA1(3a27b5dbc6561ea7af5fb30513dc83ec64f1d94c), ROM_BIOS(3))
550525   ROMX_LOAD( "pzu5.rom", 0xe000, 0x0800, CRC(13a1a0dc) SHA1(3a0818cb8f36c2c5a9b9916669538ad1702a7710), ROM_BIOS(3))
551526   ROM_SYSTEM_BIOS(3, "1st", "1st rev.")
552    ROMX_LOAD( "special1.rom", 0xc000, 0x1000, CRC(217414BD) SHA1(345cd1410fbca8f75421d12d1419f27f81cd35d6), ROM_BIOS(4))
527   ROMX_LOAD( "special1.rom", 0xc000, 0x1000, CRC(217414BD) SHA1(345cd1410fbca8f75421d12d1419f27f81cd35d6), ROM_BIOS(4))
553528   ROM_SYSTEM_BIOS(4, "2col", "2nd rev. color")
554529   ROMX_LOAD( "col_mon2.rom",   0xc000, 0x0800, CRC(8cebb1b5) SHA1(0c912a25220de8c5135e16c443e4796e6bb6f805), ROM_BIOS(5))
555530   ROMX_LOAD( "monitor2_2.rom", 0xc800, 0x0800, CRC(c425f719) SHA1(1c322591b4e5c8b01b81362c6801aa6fd9fc1492), ROM_BIOS(5))
r14879r14880
557532ROM_END
558533
559534ROM_START( specialm )
560    ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
535   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
561536   ROM_LOAD( "pzu1-m.rom", 0xc000, 0x0800, CRC(61e94485) SHA1(dbe212dcd377cb8cd16000516cd4b3b760ce779e))
562537   ROM_LOAD( "pzu2-m.rom", 0xc800, 0x0800, CRC(83d76815) SHA1(9d139eaa6ca6b241fa9fac94ede72abb56d83674))
563538   ROM_LOAD( "pzu3-m.rom", 0xd000, 0x0800, CRC(2121ad65) SHA1(b43811d058d818f8c1cee59b405b515f96958656))
r14879r14880
565540ROM_END
566541
567542ROM_START( specialp )
568    ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
569    ROM_LOAD( "special6.rom", 0xc000, 0x1000, CRC(f0c5a0ac) SHA1(50b53bd7c05117930aa84653a9ea0fc0c6f0f496) )
543   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
544   ROM_LOAD( "special6.rom", 0xc000, 0x1000, CRC(f0c5a0ac) SHA1(50b53bd7c05117930aa84653a9ea0fc0c6f0f496) )
570545ROM_END
571546
572547ROM_START( lik )
573    ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
574    ROM_SYSTEM_BIOS(0, "1st", "1st rev.")
575    ROMX_LOAD( "lik.rom",   0xc000, 0x3000, CRC(705BB3A0) SHA1(f90b009ec9d3303bbda228714dd24de057e744b6), ROM_BIOS(1))
576    ROM_SYSTEM_BIOS(1, "2nd", "2nd rev.")
577    ROMX_LOAD( "lik2.rom",   0xc000, 0x3000, CRC(71820E43) SHA1(a85b4fc33b1ea96a1b8fe0c791f1aab8e967bb44), ROM_BIOS(2))
548   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
549   ROM_SYSTEM_BIOS(0, "1st", "1st rev.")
550   ROMX_LOAD( "lik.rom",   0xc000, 0x3000, CRC(705BB3A0) SHA1(f90b009ec9d3303bbda228714dd24de057e744b6), ROM_BIOS(1))
551   ROM_SYSTEM_BIOS(1, "2nd", "2nd rev.")
552   ROMX_LOAD( "lik2.rom",   0xc000, 0x3000, CRC(71820E43) SHA1(a85b4fc33b1ea96a1b8fe0c791f1aab8e967bb44), ROM_BIOS(2))
578553ROM_END
579554
580555ROM_START( specimx )
581    ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASEFF )
582    ROM_SYSTEM_BIOS(0, "FOS", "ROM FOS")
583    ROMX_LOAD( "specimx.rom", 0x10000, 0xb800,  CRC(DB68F9B1) SHA1(c79888449f8a605267ec3e10dcc8e6e6f43b3a95), ROM_BIOS(1))
584    ROM_SYSTEM_BIOS(1, "NC", "NC")
585    ROMX_LOAD( "ncrdy.rom",   0x10000, 0x10000, CRC(5D04C522) SHA1(d7daa7fe14cd8e0c6f87fd6453ec3e94ea2c259f) ,ROM_BIOS(2))
556   ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASEFF )
557   ROM_SYSTEM_BIOS(0, "FOS", "ROM FOS")
558   ROMX_LOAD( "specimx.rom", 0x10000, 0xb800,  CRC(DB68F9B1) SHA1(c79888449f8a605267ec3e10dcc8e6e6f43b3a95), ROM_BIOS(1))
559   ROM_SYSTEM_BIOS(1, "NC", "NC")
560   ROMX_LOAD( "ncrdy.rom",   0x10000, 0x10000, CRC(5D04C522) SHA1(d7daa7fe14cd8e0c6f87fd6453ec3e94ea2c259f) ,ROM_BIOS(2))
586561   ROM_SYSTEM_BIOS(2, "RAMFOS", "RAMFOS")
587562   ROMX_LOAD( "ramfos.rom",  0x10000, 0x3000, CRC(83e19df4) SHA1(20e5e53eb45729a24c1c7c63e114dbd14e3c4184) ,ROM_BIOS(3))
588563ROM_END
589564
590565ROM_START( erik )
591    ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASEFF )
592    ROM_LOAD( "erik.bin", 0x10000, 0x10000, CRC(6F3208F4) SHA1(41f6e2763ef60d3c7214c98893e580d25346fa2d))
566   ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASEFF )
567   ROM_LOAD( "erik.bin", 0x10000, 0x10000, CRC(6F3208F4) SHA1(41f6e2763ef60d3c7214c98893e580d25346fa2d))
593568ROM_END
594569
595570ROM_START( pioner )
596571   // Ukranian clone with 16KB RAM
597    ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
572   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
598573   ROM_LOAD( "pioner.rf2", 0xc000, 0x0800, CRC(d6250ab2) SHA1(b953517d883c64857e63139fed52436f77d371cb))
599574ROM_END
600575
601576/* Driver */
602577
603/*    YEAR  NAME        PARENT  COMPAT   MACHINE    INPUT       INIT        COMPANY              FULLNAME       FLAGS */
604COMP( 1985, special,    0,     0,      special,   special,   special,    "<unknown>",             "Specialist",      0)
605COMP( 1985, specialm,   special,0,      special,   special,   special,    "<unknown>",             "Specialist M",      0)
606COMP( 1985, pioner,     special,0,      special,   special,   special,    "<unknown>",             "Pioner",      0)
607COMP( 1985, specialp,   special,0,      specialp,   specialp,   special,    "<unknown>",             "Specialist + hires graph",      0)
608COMP( 1985, lik,       special,0,      special,   lik,      special,    "<unknown>",             "Lik",            0)
609COMP( 1985, specimx,   special,0,      specimx,   specimx,   0,         "<unknown>",             "Specialist MX",   0)
610COMP( 1994, erik,      special,0,      erik,      special,   erik,      "<unknown>",             "Erik",   0)
578/*    YEAR  NAME        PARENT    COMPAT   MACHINE    INPUT       INIT        COMPANY      FULLNAME       FLAGS */
579COMP( 1985, special,    0,        0,       special,   special,    special,   "<unknown>", "Specialist", GAME_NOT_WORKING )
580COMP( 1985, specialm,   special,  0,       special,   special,    special,   "<unknown>", "Specialist M", GAME_NOT_WORKING )
581COMP( 1985, pioner,     special,  0,       special,   special,    special,   "<unknown>", "Pioner", GAME_NOT_WORKING )
582COMP( 1985, specialp,   special,  0,       specialp,  specialp,   special,   "<unknown>", "Specialist + hires graph", GAME_NOT_WORKING )
583COMP( 1985, lik,        special,  0,       special,   lik,        special,   "<unknown>", "Lik", GAME_NOT_WORKING )
584COMP( 1985, specimx,    special,  0,       specimx,   specimx,    0,         "<unknown>", "Specialist MX", 0)
585COMP( 1994, erik,       special,  0,       erik,      special,    erik,      "<unknown>", "Erik", GAME_NOT_WORKING )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team