Previous 15994 Revisions Next

r9388 Friday 15th October, 2010 at 09:13:08 UTC by Curt Coder
Converted all drivers except cosmicos.c to use the new COSMAC CPU. Regressions: studio2 graphics, pecom64 keyboard. These will be fixed later.

[COSMAC] Fixed OUT instruction.
[CDP1869] Added pal_ntsc_r function.
[CDP1871] Added da_r, rpt_r functions and used ASSERT/CLEAR line in interface.
[src/emu/cpu/cosmac]cosmac.c
[src/emu/sound]cdp1869.c cdp1869.h
[src/mess/audio]cdp1863.c vp550.c
[src/mess/drivers]comx35.c elf.c eti660.c pecom.c studio2.c tmc1800.c tmc2000e.c tmc600.c
[src/mess/formats]comx35_comx.c
[src/mess/includes]comx35.h elf.h eti660.h pecom.h studio2.h tmc1800.h tmc600.h vip.h
[src/mess/machine]cdp1871.c cdp1871.h comx35.c pecom.c
[src/mess/video]comx35.c pecom.c tmc1800.c tmc600.c

src/emu/cpu/cosmac/cosmac.c
r9387r9388
332332   : cpu_device(_machine, config),
333333     m_op(0),
334334     m_state(COSMAC_STATE_1_RESET),
335     m_mode(COSMAC_MODE_RESET),
335336     m_irq(0),
336337     m_dmain(0),
337338     m_dmaout(0),
r9387r9388
11491150void cosmac_device::dis()   { return_from_interrupt(false); }
11501151
11511152// input/output byte transfer opcode handlers
1152void cosmac_device::out()   { IO_W(N, RAM_R(R[X]++)); }
1153void cosmac_device::out()   { IO_W(N, RAM_R(R[X])); R[X]++; }
11531154
11541155/*
11551156
src/emu/sound/cdp1869.c
r9387r9388
11#include "emu.h"
22#include "streams.h"
3#include "cpu/cdp1802/cdp1802.h"
3#include "cpu/cosmac/cosmac.h"
44#include "sound/cdp1869.h"
55
66/*
r9387r9388
135135      if (scanline < start)
136136      {
137137         next_scanline = start;
138         level = 0;
138         level = ASSERT_LINE;
139139      }
140140      else if (scanline < end)
141141      {
142142         next_scanline = end;
143         level = 1;
143         level = CLEAR_LINE;
144144      }
145145      else
146146      {
147147         next_scanline = start;
148         level = 0;
148         level = ASSERT_LINE;
149149      }
150150
151151      if (cdp1869->dispoff)
152152      {
153         level = 1;
153         level = CLEAR_LINE;
154154      }
155155
156156      duration = cdp1869->screen->time_until_pos(next_scanline);
r9387r9388
188188
189189static UINT16 cdp1802_get_r_x(cdp1869_t *cdp1869)
190190{
191   return cpu_get_reg(cdp1869->cpu, CDP1802_R0 + cpu_get_reg(cdp1869->cpu, CDP1802_X));
191   return cpu_get_reg(cdp1869->cpu, COSMAC_R0 + cpu_get_reg(cdp1869->cpu, COSMAC_X));
192192}
193193
194194/*-------------------------------------------------
r9387r9388
713713}
714714
715715/*-------------------------------------------------
716    cdp1869_pal_ntsc_r - PAL/NTSC read
717-------------------------------------------------*/
718
719READ_LINE_DEVICE_HANDLER( cdp1869_pal_ntsc_r )
720{
721   cdp1869_t *cdp1869 = get_safe_token(device);
722
723   return devcb_call_read_line(&cdp1869->in_pal_ntsc_func);
724}
725
726/*-------------------------------------------------
716727    cdp1869_update - screen update
717728-------------------------------------------------*/
718729
src/emu/sound/cdp1869.h
r9387r9388
183183/* predisplay */
184184READ_LINE_DEVICE_HANDLER( cdp1869_predisplay_r );
185185
186/* PAL/NTSC */
187READ_LINE_DEVICE_HANDLER( cdp1869_pal_ntsc_r );
188
186189/* screen update */
187190void cdp1869_update(running_device *device, bitmap_t *bitmap, const rectangle *cliprect);
188191
src/mess/audio/vp550.c
r9387r9388
1919
2020#include "emu.h"
2121#include "vp550.h"
22#include "cpu/cdp1802/cdp1802.h"
22#include "cpu/cosmac/cosmac.h"
2323#include "sound/cdp1863.h"
2424
2525/***************************************************************************
r9387r9388
9696{
9797   if (state)
9898   {
99      cpu_set_input_line(device, CDP1802_INPUT_LINE_INT, CLEAR_LINE);
99      cpu_set_input_line(device, COSMAC_INPUT_LINE_INT, CLEAR_LINE);
100100
101101      if (LOG) logerror("VP550 Clear Interrupt\n");
102102   }
r9387r9388
197197
198198static TIMER_DEVICE_CALLBACK( sync_tick )
199199{
200   cpu_set_input_line(timer.machine->firstcpu, CDP1802_INPUT_LINE_INT, ASSERT_LINE);
200   cpu_set_input_line(timer.machine->firstcpu, COSMAC_INPUT_LINE_INT, ASSERT_LINE);
201201
202202   if (LOG) logerror("VP550 Interrupt\n");
203203}
r9387r9388
282282   vp550->sync_timer->enable(0);
283283
284284   /* clear interrupt */
285   cpu_set_input_line(device->machine->firstcpu, CDP1802_INPUT_LINE_INT, CLEAR_LINE);
285   cpu_set_input_line(device->machine->firstcpu, COSMAC_INPUT_LINE_INT, CLEAR_LINE);
286286}
287287
288288/*-------------------------------------------------
src/mess/audio/cdp1863.c
r9387r9388
99
1010#include "emu.h"
1111#include "streams.h"
12#include "cpu/cdp1802/cdp1802.h"
1312#include "audio/cdp1863.h"
1413
1514#define CDP1863_DEFAULT_LATCH   0x35
src/mess/machine/cdp1871.c
r9387r9388
221221         cdp1871->shift = devcb_call_read_line(&cdp1871->in_shift_func);
222222         cdp1871->control = devcb_call_read_line(&cdp1871->in_control_func);
223223         cdp1871->inhibit = 1;
224         cdp1871->next_da = 0;
224         cdp1871->next_da = ASSERT_LINE;
225225      }
226226      else
227227      {
228         cdp1871->next_rpt = 0;
228         cdp1871->next_rpt = ASSERT_LINE;
229229      }
230230   }
231231   else
232232   {
233233      cdp1871->inhibit = 0;
234      cdp1871->next_rpt = 1;
234      cdp1871->next_rpt = CLEAR_LINE;
235235   }
236236}
237237
r9387r9388
264264
265265   // reset DA on next TPB
266266
267   cdp1871->next_da = 1;
267   cdp1871->next_da = CLEAR_LINE;
268268
269269   return CDP1871_KEY_CODES[table][cdp1871->drive][cdp1871->sense];
270270}
271271
272272/*-------------------------------------------------
273    cdp1871_da_r - keyboard data available
274-------------------------------------------------*/
275
276READ_LINE_DEVICE_HANDLER( cdp1871_da_r )
277{
278   cdp1871_t *cdp1871 = get_safe_token(device);
279
280   return cdp1871->da;
281}
282
283/*-------------------------------------------------
284    cdp1871_rpt_r - keyboard repeat
285-------------------------------------------------*/
286
287READ_LINE_DEVICE_HANDLER( cdp1871_rpt_r )
288{
289   cdp1871_t *cdp1871 = get_safe_token(device);
290
291   return cdp1871->rpt;
292}
293
294/*-------------------------------------------------
273295    DEVICE_START( cdp1871 )
274296-------------------------------------------------*/
275297
r9387r9388
297319   devcb_resolve_read_line(&cdp1871->in_alpha_func, &intf->in_alpha_func, device);
298320
299321   /* set initial values */
300   cdp1871->next_da = 1;
301   cdp1871->next_rpt = 1;
322   cdp1871->next_da = CLEAR_LINE;
323   cdp1871->next_rpt = CLEAR_LINE;
302324   change_output_lines(device);
303325
304326   /* create the timers */
r9387r9388
335357      case DEVINFO_FCT_RESET:                     /* Nothing */                        break;
336358
337359      /* --- the following bits of info are returned as NULL-terminated strings --- */
338      case DEVINFO_STR_NAME:                     strcpy(info->s, "RCA CDP1871");               break;
339      case DEVINFO_STR_FAMILY:                  strcpy(info->s, "RCA CDP1800");               break;
340      case DEVINFO_STR_VERSION:                  strcpy(info->s, "1.0");                     break;
341      case DEVINFO_STR_SOURCE_FILE:               strcpy(info->s, __FILE__);                     break;
342      case DEVINFO_STR_CREDITS:                  strcpy(info->s, "Copyright MESS Team");         break;
360      case DEVINFO_STR_NAME:                     strcpy(info->s, "RCA CDP1871");            break;
361      case DEVINFO_STR_FAMILY:                  strcpy(info->s, "RCA CDP1800");            break;
362      case DEVINFO_STR_VERSION:                  strcpy(info->s, "1.0");                  break;
363      case DEVINFO_STR_SOURCE_FILE:               strcpy(info->s, __FILE__);               break;
364      case DEVINFO_STR_CREDITS:                  strcpy(info->s, "Copyright MESS Team");      break;
343365   }
344366}
345367
src/mess/machine/cdp1871.h
r9387r9388
8585/* keyboard data */
8686READ8_DEVICE_HANDLER( cdp1871_data_r );
8787
88/* keyboard status */
89READ_LINE_DEVICE_HANDLER( cdp1871_da_r );
90READ_LINE_DEVICE_HANDLER( cdp1871_rpt_r );
91
8892#endif
src/mess/machine/comx35.c
r9387r9388
115115*/
116116
117117#include "emu.h"
118#include "cpu/cdp1802/cdp1802.h"
118#include "cpu/cosmac/cosmac.h"
119119#include "machine/wd17xx.h"
120120#include "devices/printer.h"
121121#include "devices/snapquik.h"
r9387r9388
134134   PRINTER_PLOTTER
135135};
136136
137static UINT8 read_expansion(running_machine *machine)
137UINT8 comx35_state::read_expansion()
138138{
139139   UINT8 result;
140   switch(machine->phase())
140   switch(m_machine.phase())
141141   {
142142      case MACHINE_PHASE_RESET:
143143      case MACHINE_PHASE_RUNNING:
144         result = input_port_read(machine, "EXPANSION");
144         result = input_port_read(&m_machine, "EXPANSION");
145145         break;
146146
147147      default:
r9387r9388
151151   return result;
152152}
153153
154static running_device *get_printer_device(running_machine *machine)
154bool comx35_state::is_expansion_box_installed()
155155{
156   return machine->device("printer");
156   return (memory_region(&m_machine, CDP1802_TAG)[0xe800] != 0x00);
157157}
158158
159static int expansion_box_installed(running_machine *machine)
159bool comx35_state::is_dos_card_active()
160160{
161   return (memory_region(machine, CDP1802_TAG)[0xe800] != 0x00);
162}
163
164static int dos_card_active(running_machine *machine)
165{
166   comx35_state *state = machine->driver_data<comx35_state>();
167
168   if (expansion_box_installed(machine))
161   if (is_expansion_box_installed())
169162   {
170      return (state->bank == BANK_FLOPPY);
163      return (m_bank == BANK_FLOPPY);
171164   }
172165   else
173166   {
174      return read_expansion(machine) == BANK_FLOPPY;
167      return read_expansion() == BANK_FLOPPY;
175168   }
176169}
177170
r9387r9388
179172static WRITE_LINE_DEVICE_HANDLER( comx35_fdc_intrq_w )
180173{
181174   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
182   driver_state->fdc_irq = state;
175   driver_state->m_fdc_irq = state;
183176}
184177
185178static WRITE_LINE_DEVICE_HANDLER( comx35_fdc_drq_w )
186179{
187180   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
188181
189   if (driver_state->fdc_drq_enable)
190      driver_state->cdp1802_ef4 = state;
182   if (driver_state->m_fdc_drq_enable)
183      driver_state->m_cdp1802_ef4 = state;
191184}
192185
193186const wd17xx_interface comx35_wd17xx_interface =
r9387r9388
195188   DEVCB_NULL,
196189   DEVCB_LINE(comx35_fdc_intrq_w),
197190   DEVCB_LINE(comx35_fdc_drq_w),
198   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
191   { FLOPPY_0, FLOPPY_1, NULL, NULL }
199192};
200193
201static UINT8 fdc_r(address_space *space)
194UINT8 comx35_state::fdc_r()
202195{
203   comx35_state *state = space->machine->driver_data<comx35_state>();
204   running_device *fdc = space->machine->device(WD1770_TAG);
205
206196   UINT8 data;
207197
208   if (state->cdp1802_q)
198   if (m_cdp1802_q)
209199   {
210      data = state->fdc_irq;
200      data = m_fdc_irq;
211201   }
212202   else
213203   {
214      data = wd17xx_r(fdc, state->fdc_addr);
204      data = wd17xx_r(m_fdc, m_fdc_addr);
215205   }
216206
217207   return data;
218208}
219209
220static void fdc_w(address_space *space, UINT8 data)
210void comx35_state::fdc_w(UINT8 data)
221211{
222   running_device *fdc = space->machine->device(WD1770_TAG);
223212   /*
224213
225214        bit     description
r9387r9388
233222
234223    */
235224
236   comx35_state *state = space->machine->driver_data<comx35_state>();
237
238   if (state->cdp1802_q)
225   if (m_cdp1802_q)
239226   {
240227      // latch data to F3
228      m_fdc_addr = data & 0x03;
241229
242      state->fdc_addr = data & 0x03;
243
244230      if (BIT(data, 2))
245231      {
246         wd17xx_set_drive(fdc,0);
232         wd17xx_set_drive(m_fdc, 0);
247233      }
248234      else if (BIT(data, 3))
249235      {
250         wd17xx_set_drive(fdc,1);
236         wd17xx_set_drive(m_fdc, 1);
251237      }
252238
253      state->fdc_drq_enable = BIT(data, 4);
239      m_fdc_drq_enable = BIT(data, 4);
254240
255      if (!state->fdc_drq_enable)
241      if (!m_fdc_drq_enable)
256242      {
257         state->cdp1802_ef4 = 1;
243         m_cdp1802_ef4 = 1;
258244      }
259245
260      wd17xx_set_side(fdc,BIT(data, 5));
246      wd17xx_set_side(m_fdc, BIT(data, 5));
261247   }
262248   else
263249   {
264250      // write data to WD1770
265
266      wd17xx_w(fdc, state->fdc_addr, data);
251      wd17xx_w(m_fdc, m_fdc_addr, data);
267252   }
268253}
269254
270255/* Printer */
271256
272static UINT8 printer_r(running_machine *machine)
257UINT8 comx35_state::printer_r()
273258{
274//  comx35_state *state = machine->driver_data<comx35_state>();
275
276259   int printer = input_port_read(machine, "PRINTER") & 0x07;
277260   UINT8 data = 0;
278261
r9387r9388
310293   return data;
311294}
312295
313static void printer_w(running_machine *machine, UINT8 data)
296void comx35_state::printer_w(UINT8 data)
314297{
315//  comx35_state *state = machine->driver_data<comx35_state>();
316298   int printer = input_port_read(machine, "PRINTER") & 0x07;
317299
318300   switch (printer)
r9387r9388
323305            OUT 2 is used to send a byte to the printer
324306        */
325307
326      printer_output(get_printer_device(machine), data);
308      //printer_output(m_printer, data);
327309      break;
328310
329311   case PRINTER_SERIAL:
r9387r9388
346328
347329/* Read/Write Handlers */
348330
349static void get_active_bank(running_machine *machine, UINT8 data)
331void comx35_state::get_active_bank(UINT8 data)
350332{
351   comx35_state *state = machine->driver_data<comx35_state>();
352333   static const char *const slotnames[] = { "", "SLOT1", "SLOT2", "SLOT3", "SLOT4" };
353334
354   if (expansion_box_installed(machine))
335   if (is_expansion_box_installed())
355336   {
356337      // expansion box
357
358338      int i;
359339
360340      for (i = 1; i < 5; i++)
361341      {
362342         if (BIT(data, i))
363343         {
364            state->slot = i;
344            m_slot = i;
365345            break;
366346         }
367347      }
368348
369      if (state->slot > 0)
370         state->bank = input_port_read(machine, slotnames[state->slot]);
349      if (m_slot > 0)
350         m_bank = input_port_read(&m_machine, slotnames[m_slot]);
371351   }
372352   else
373353   {
374354      // no expansion box
375
376      state->bank = read_expansion(machine);
355      m_bank = read_expansion();
377356   }
378357
379358   // RAM expansion bank
380   state->rambank = (data >> 5) & 0x03;
359   m_rambank = (data >> 5) & 0x03;
381360}
382361
383static void set_active_bank(running_machine *machine)
362void comx35_state::set_active_bank()
384363{
385   comx35_state *state = machine->driver_data<comx35_state>();
386   address_space *program = cputag_get_address_space(machine, CDP1802_TAG, ADDRESS_SPACE_PROGRAM);
387   int bank = state->bank;
364   address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM);
365   int bank = m_bank;
388366
389   switch (state->bank)
367   switch (m_bank)
390368   {
391369   case BANK_NONE:
392370      memory_unmap_readwrite(program, 0xc000, 0xdfff, 0, 0);
r9387r9388
427405
428406   case BANK_80_COLUMNS:
429407      {
430         running_device *mc6845 = machine->device(MC6845_TAG);
431
432408         memory_install_read_bank(program, 0xc000, 0xc7ff, 0, 0, "bank1"); // ROM
433409         memory_unmap_write(program, 0xc000, 0xc7ff, 0, 0); // ROM
434410         memory_unmap_readwrite(program, 0xc800, 0xcfff, 0, 0);
435         memory_install_readwrite8_handler(program, 0xd000, 0xd7ff, 0, 0, comx35_videoram_r, comx35_videoram_w);
411         memory_install_ram(program, 0xd000, 0xd7ff, 0, 0, m_videoram);
436412         memory_unmap_read(program, 0xd800, 0xd800, 0, 0);
437         memory_install_write8_device_handler(program, mc6845, 0xd800, 0xd800, 0, 0, mc6845_address_w);
438         memory_install_readwrite8_device_handler(program, mc6845, 0xd801, 0xd801, 0, 0, mc6845_register_r, mc6845_register_w);
413         memory_install_write8_device_handler(program, m_crtc, 0xd800, 0xd800, 0, 0, mc6845_address_w);
414         memory_install_readwrite8_device_handler(program, m_crtc, 0xd801, 0xd801, 0, 0, mc6845_register_r, mc6845_register_w);
439415         memory_unmap_readwrite(program, 0xd802, 0xdfff, 0, 0);
440416      }
441417      break;
442418
443419   case BANK_RAMCARD:
444420      {
445         bank = BANK_RAMCARD + state->rambank;
421         bank = BANK_RAMCARD + m_rambank;
446422
447423         memory_install_readwrite_bank(program, 0xc000, 0xdfff, 0, 0, "bank1");
448424      }
r9387r9388
452428   memory_set_bank(machine, "bank1", bank);
453429}
454430
455WRITE8_HANDLER( comx35_bank_select_w )
431WRITE8_MEMBER( comx35_state::bank_select_w )
456432{
457   get_active_bank(space->machine, data);
458   set_active_bank(space->machine);
433   get_active_bank(data);
434   set_active_bank();
459435}
460436
461READ8_HANDLER( comx35_io_r )
437READ8_MEMBER( comx35_state::io_r )
462438{
463   comx35_state *state = space->machine->driver_data<comx35_state>();
464
465439   UINT8 data = 0xff;
466440
467   switch (state->bank)
441   switch (m_bank)
468442   {
469443   case BANK_NONE:
470444      break;
471445
472446   case BANK_FLOPPY:
473      data = fdc_r(space);
447      data = fdc_r();
474448      break;
475449
476450   case BANK_PRINTER_PARALLEL:
477451   case BANK_PRINTER_PARALLEL_FM:
478452   case BANK_PRINTER_SERIAL:
479453   case BANK_PRINTER_THERMAL:
480      data = printer_r(space->machine);
454      data = printer_r();
481455      break;
482456
483457   case BANK_JOYCARD:
484      data = input_port_read(space->machine, "JOY1");
458      data = input_port_read(&m_machine, "JOY1");
485459      break;
486460
487461   case BANK_80_COLUMNS:
r9387r9388
494468   return data;
495469}
496470
497READ8_HANDLER( comx35_io2_r )
471READ8_MEMBER( comx35_state::io2_r )
498472{
499   comx35_state *state = space->machine->driver_data<comx35_state>();
500
501473   UINT8 data = 0xff;
502474
503   switch (state->bank)
475   switch (m_bank)
504476   {
505477   case BANK_NONE:
506478      break;
r9387r9388
515487      break;
516488
517489   case BANK_JOYCARD:
518      data = input_port_read(space->machine, "JOY2");
490      data = input_port_read(&m_machine, "JOY2");
519491      break;
520492
521493   case BANK_80_COLUMNS:
r9387r9388
528500   return data;
529501}
530502
531WRITE8_HANDLER( comx35_io_w )
503WRITE8_MEMBER( comx35_state::io_w )
532504{
533   comx35_state *state = space->machine->driver_data<comx35_state>();
534
535   switch (state->bank)
505   switch (m_bank)
536506   {
537507   case BANK_NONE:
538508      break;
539509
540510   case BANK_FLOPPY:
541      fdc_w(space, data);
511      fdc_w(data);
542512      break;
543513
544514   case BANK_PRINTER_PARALLEL:
545515   case BANK_PRINTER_PARALLEL_FM:
546516   case BANK_PRINTER_SERIAL:
547517   case BANK_PRINTER_THERMAL:
548      printer_w(space->machine, data);
518      printer_w(data);
549519      break;
550520
551521   case BANK_JOYCARD:
r9387r9388
565535{
566536   comx35_state *state = machine->driver_data<comx35_state>();
567537
568   state->cdp1802_mode = CDP1802_MODE_RUN;
538   state->m_reset = 1;
569539}
570540
571541DIRECT_UPDATE_HANDLER( comx35_opbase_handler )
572542{
543   comx35_state *state = machine->driver_data<comx35_state>();
544
573545   if (address >= 0x0dd0 && address <= 0x0ddf)
574546   {
575      if (dos_card_active(machine))
547      if (state->is_dos_card_active())
576548      {
577549         // read opcode from DOS ROM
578550         direct.explicit_configure(0x0dd0, 0x0ddf, 0x000f, memory_region(machine, "fdc"));
r9387r9388
585557
586558static STATE_POSTLOAD( comx35_state_save_postload )
587559{
588   set_active_bank(machine);
560   comx35_state *state = machine->driver_data<comx35_state>();
561
562   state->set_active_bank();
589563}
590564
591MACHINE_START( comx35p )
565void comx35_state::machine_start()
592566{
593   comx35_state *state = machine->driver_data<comx35_state>();
594   address_space *program = cputag_get_address_space(machine, CDP1802_TAG, ADDRESS_SPACE_PROGRAM);
567   address_space *program = cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM);
595568
596569   /* opbase handling for DOS Card */
597
598570   program->set_direct_update_handler(direct_update_delegate_create_static(comx35_opbase_handler, *machine));
599571
600572   /* BASIC ROM banking */
601
602573   memory_install_read_bank(program, 0x1000, 0x17ff, 0, 0, "bank2");
603574   memory_unmap_write(program, 0x1000, 0x17ff, 0, 0);
604   memory_configure_bank(machine, "bank2", 0, 1, memory_region(machine, CDP1802_TAG) + 0x1000, 0); // normal ROM
605   memory_configure_bank(machine, "bank2", 1, 1, memory_region(machine, CDP1802_TAG) + 0xe000, 0); // expansion box ROM
575   memory_configure_bank(machine, "bank2", 0, 1, memory_region(&m_machine, CDP1802_TAG) + 0x1000, 0); // normal ROM
576   memory_configure_bank(machine, "bank2", 1, 1, memory_region(&m_machine, CDP1802_TAG) + 0xe000, 0); // expansion box ROM
606577
607   memory_configure_bank(machine, "bank3", 0, 1, memory_region(machine, CDP1802_TAG) + 0xe000, 0);
578   memory_configure_bank(machine, "bank3", 0, 1, memory_region(&m_machine, CDP1802_TAG) + 0xe000, 0);
608579   memory_set_bank(machine, "bank3", 0);
609580
610   if (expansion_box_installed(machine))
581   if (is_expansion_box_installed())
611582   {
612583      memory_install_read_bank(program, 0xe000, 0xefff, 0, 0, "bank3");
613584      memory_unmap_write(program, 0xe000, 0xefff, 0, 0);
r9387r9388
620591   }
621592
622593   /* card slot banking */
594   memory_configure_bank(machine, "bank1", 0, 1, memory_region(&m_machine, CDP1802_TAG) + 0xc000, 0);
595   memory_configure_bank(machine, "bank1", BANK_FLOPPY, 1, memory_region(&m_machine, "fdc"), 0);
596   memory_configure_bank(machine, "bank1", BANK_PRINTER_PARALLEL, 1, memory_region(&m_machine, "printer"), 0);
597   memory_configure_bank(machine, "bank1", BANK_PRINTER_PARALLEL_FM, 1, memory_region(&m_machine, "printer_fm"), 0);
598   memory_configure_bank(machine, "bank1", BANK_PRINTER_SERIAL, 1, memory_region(&m_machine, "rs232"), 0);
599   memory_configure_bank(machine, "bank1", BANK_PRINTER_THERMAL, 1, memory_region(&m_machine, "thermal"), 0);
600   memory_configure_bank(machine, "bank1", BANK_JOYCARD, 1, memory_region(&m_machine, CDP1802_TAG), 0);
601   memory_configure_bank(machine, "bank1", BANK_80_COLUMNS, 1, memory_region(&m_machine, "80column"), 0);
602   memory_configure_bank(machine, "bank1", BANK_RAMCARD, 4, messram_get_ptr(m_ram), 0x2000);
623603
624   memory_configure_bank(machine, "bank1", 0, 1, memory_region(machine, CDP1802_TAG) + 0xc000, 0);
625   memory_configure_bank(machine, "bank1", BANK_FLOPPY, 1, memory_region(machine, "fdc"), 0);
626   memory_configure_bank(machine, "bank1", BANK_PRINTER_PARALLEL, 1, memory_region(machine, "printer"), 0);
627   memory_configure_bank(machine, "bank1", BANK_PRINTER_PARALLEL_FM, 1, memory_region(machine, "printer_fm"), 0);
628   memory_configure_bank(machine, "bank1", BANK_PRINTER_SERIAL, 1, memory_region(machine, "rs232"), 0);
629   memory_configure_bank(machine, "bank1", BANK_PRINTER_THERMAL, 1, memory_region(machine, "thermal"), 0);
630   memory_configure_bank(machine, "bank1", BANK_JOYCARD, 1, memory_region(machine, CDP1802_TAG), 0);
631   memory_configure_bank(machine, "bank1", BANK_80_COLUMNS, 1, memory_region(machine, "80column"), 0);
632   memory_configure_bank(machine, "bank1", BANK_RAMCARD, 4, messram_get_ptr(machine->device("messram")), 0x2000);
633
634604   memory_set_bank(machine, "bank1", 0);
635605
636   if (!expansion_box_installed(machine))
606   if (!is_expansion_box_installed())
637607   {
638      state->bank = read_expansion(machine);
608      m_bank = read_expansion();
639609   }
640610
641611   /* allocate reset timer */
612   m_reset_timer = timer_alloc(machine, reset_tick, NULL);
642613
643   state->reset_timer = timer_alloc(machine, reset_tick, NULL);
644
645   /* screen format */
646
647   state->pal_ntsc = 1;
648
649614   /* register for state saving */
650
651615   state_save_register_postload(machine, comx35_state_save_postload, NULL);
652
653   state_save_register_global(machine, state->cdp1802_mode);
654   state_save_register_global(machine, state->cdp1802_q);
655   state_save_register_global(machine, state->cdp1802_ef4);
656   state_save_register_global(machine, state->iden);
657   state_save_register_global(machine, state->slot);
658   state_save_register_global(machine, state->bank);
659   state_save_register_global(machine, state->rambank);
660   state_save_register_global(machine, state->dma);
661
662   state_save_register_global(machine, state->cdp1871_efxa);
663   state_save_register_global(machine, state->cdp1871_efxb);
664
665   state_save_register_global(machine, state->fdc_addr);
666   state_save_register_global(machine, state->fdc_irq);
667   state_save_register_global(machine, state->fdc_drq_enable);
616   state_save_register_global(machine, m_reset);
617   state_save_register_global(machine, m_cdp1802_q);
618   state_save_register_global(machine, m_cdp1802_ef4);
619   state_save_register_global(machine, m_iden);
620   state_save_register_global(machine, m_slot);
621   state_save_register_global(machine, m_bank);
622   state_save_register_global(machine, m_rambank);
623   state_save_register_global(machine, m_dma);
624   state_save_register_global(machine, m_fdc_addr);
625   state_save_register_global(machine, m_fdc_irq);
626   state_save_register_global(machine, m_fdc_drq_enable);
668627}
669628
670MACHINE_START( comx35n )
629void comx35_state::machine_reset()
671630{
672   comx35_state *state = machine->driver_data<comx35_state>();
673
674   MACHINE_START_CALL(comx35p);
675
676   // screen format
677
678   state->pal_ntsc = 0;
679}
680
681MACHINE_RESET( comx35 )
682{
683   comx35_state *state = machine->driver_data<comx35_state>();
684631   int t = RES_K(27) * CAP_U(1) * 1000; // t = R1 * C1
685632
686   state->cdp1802_mode = CDP1802_MODE_RESET;
687   state->iden = 1;
688   state->cdp1802_ef4 = 1;
633   m_reset = 0;
634   m_iden = 1;
635   m_cdp1802_ef4 = 1;
689636
690   timer_adjust_oneshot(state->reset_timer, ATTOTIME_IN_MSEC(t), 0);
637   timer_adjust_oneshot(m_reset_timer, ATTOTIME_IN_MSEC(t), 0);
691638}
692639
693640INPUT_CHANGED( comx35_reset )
694641{
642   comx35_state *state = field->port->machine->driver_data<comx35_state>();
643
695644   if (BIT(input_port_read(field->port->machine, "RESET"), 0) && BIT(input_port_read(field->port->machine, "D6"), 7))
696645   {
697      running_machine *machine = field->port->machine;
698      MACHINE_RESET_CALL(comx35);
646      state->machine_reset();
699647   }
700648}
src/mess/machine/pecom.c
r9387r9388
77****************************************************************************/
88
99#include "emu.h"
10#include "cpu/cdp1802/cdp1802.h"
10#include "cpu/cosmac/cosmac.h"
1111#include "sound/cdp1869.h"
1212#include "devices/cassette.h"
1313#include "includes/pecom.h"
r9387r9388
2121{
2222   pecom_state *state = machine->driver_data<pecom_state>();
2323
24   state->cdp1802_mode = CDP1802_MODE_RUN;
24   state->reset = 1;
2525}
2626
2727MACHINE_START( pecom )
r9387r9388
5151   pecom_caps_state = 4;
5252   pecom_prev_caps_state = 4;
5353
54   state->cdp1802_mode = CDP1802_MODE_RESET;
54   state->reset = 0;
5555   state->dma = 0;
5656   timer_adjust_oneshot(state->reset_timer, ATTOTIME_IN_MSEC(5), 0);
5757}
r9387r9388
9595       Address is available on address bus during reading of value from port, and that is
9696       used to determine keyboard line reading
9797    */
98   UINT16 addr = cpu_get_reg(space->machine->device("maincpu"), CDP1802_R0 + cpu_get_reg(space->machine->device("maincpu"), CDP1802_X));
98   UINT16 addr = cpu_get_reg(space->machine->device("maincpu"), COSMAC_R0 + cpu_get_reg(space->machine->device("maincpu"), COSMAC_X));
9999   /* just in case somone is reading non existing ports */
100100   if (addr<0x7cca || addr>0x7ce3) return 0;
101101   return input_port_read(space->machine, keynames[addr - 0x7cca]) & 0x03;
102102}
103103
104104/* CDP1802 Interface */
105static CDP1802_MODE_READ( pecom64_mode_r )
105
106static running_device *cassette_device_image(running_machine *machine)
106107{
108   return machine->device("cassette");
109}
110
111
112static READ_LINE_DEVICE_HANDLER( clear_r )
113{
107114   pecom_state *state = device->machine->driver_data<pecom_state>();
108115
109   return (cdp1802_control_mode)state->cdp1802_mode;
116   return state->reset;
110117}
111118
112static running_device *cassette_device_image(running_machine *machine)
119static READ_LINE_DEVICE_HANDLER( ef2_r )
113120{
114   return machine->device("cassette");
121   return cassette_input(device) < 0;
115122}
116123
117static CDP1802_EF_READ( pecom64_ef_r )
124static READ_LINE_DEVICE_HANDLER( ef3_r )
118125{
126   return 0;
127}
128/*
129static COSMAC_EF_READ( pecom64_ef_r )
130{
119131   int flags = 0x0f;
120132   double valcas = cassette_input(cassette_device_image(device->machine));
121133   UINT8 val = input_port_read(device->machine, "CNT");
r9387r9388
134146   flags -= (val & 0x0b) + pecom_caps_state;
135147   return flags;
136148}
137
149*/
138150static WRITE_LINE_DEVICE_HANDLER( pecom64_q_w )
139151{
140152   cassette_output(cassette_device_image(device->machine), state ? -1.0 : +1.0);
141153}
142154
143static CDP1802_SC_WRITE( pecom64_sc_w )
155static COSMAC_SC_WRITE( pecom64_sc_w )
144156{
145   switch (state)
157   switch (sc)
146158   {
147   case CDP1802_STATE_CODE_S0_FETCH:
159   case COSMAC_STATE_CODE_S0_FETCH:
148160      // not connected
149161      break;
150162
151   case CDP1802_STATE_CODE_S1_EXECUTE:
163   case COSMAC_STATE_CODE_S1_EXECUTE:
152164      break;
153165
154   case CDP1802_STATE_CODE_S2_DMA:
166   case COSMAC_STATE_CODE_S2_DMA:
155167      // DMA acknowledge clears the DMAOUT request
156      cputag_set_input_line(device->machine, "maincpu", CDP1802_INPUT_LINE_DMAOUT, CLEAR_LINE);
168      cputag_set_input_line(device->machine, "maincpu", COSMAC_INPUT_LINE_DMAOUT, CLEAR_LINE);
157169      break;
158   case CDP1802_STATE_CODE_S3_INTERRUPT:
170   case COSMAC_STATE_CODE_S3_INTERRUPT:
159171      break;
160172   }
161173}
162174
163CDP1802_INTERFACE( pecom64_cdp1802_config )
175COSMAC_INTERFACE( pecom64_cdp1802_config )
164176{
165   pecom64_mode_r,
166   pecom64_ef_r,
167   pecom64_sc_w,
177   DEVCB_LINE_VCC,
178   DEVCB_LINE(clear_r),
179   DEVCB_NULL,
180   DEVCB_DEVICE_LINE("cassette", ef2_r),
181   DEVCB_LINE(ef3_r),
182   DEVCB_NULL,
168183   DEVCB_LINE(pecom64_q_w),
169184   DEVCB_NULL,
185   DEVCB_NULL,
186   pecom64_sc_w,
187   DEVCB_NULL,
170188   DEVCB_NULL
171189};
src/mess/video/tmc600.c
r9387r9388
22#include "sound/cdp1869.h"
33#include "includes/tmc600.h"
44
5WRITE8_HANDLER( tmc600_vismac_register_w )
5WRITE8_MEMBER( tmc600_state::vismac_register_w )
66{
7   tmc600_state *state = space->machine->driver_data<tmc600_state>();
8
9   state->vismac_reg_latch = data;
7   m_vismac_reg_latch = data;
108}
119
12WRITE8_DEVICE_HANDLER( tmc600_vismac_data_w )
10WRITE8_MEMBER( tmc600_state::vismac_data_w )
1311{
14   tmc600_state *state = device->machine->driver_data<tmc600_state>();
15
16   switch (state->vismac_reg_latch)
12   switch (m_vismac_reg_latch)
1713   {
1814   case 0x20:
1915      // set character color
20      state->vismac_color_latch = data;
16      m_vismac_color_latch = data;
2117      break;
2218
2319   case 0x30:
2420      // write cdp1869 command on the data bus
25      state->vismac_bkg_latch = data & 0x07;
26      cdp1869_out3_w(device, 0, data);
21      m_vismac_bkg_latch = data & 0x07;
22      cdp1869_out3_w(m_vis, 0, data);
2723      break;
2824
2925   case 0x40:
30      cdp1869_out4_w(device, 0, data);
26      cdp1869_out4_w(m_vis, 0, data);
3127      break;
3228
3329   case 0x50:
34      cdp1869_out5_w(device, 0, data);
30      cdp1869_out5_w(m_vis, 0, data);
3531      break;
3632
3733   case 0x60:
38      cdp1869_out6_w(device, 0, data);
34      cdp1869_out6_w(m_vis, 0, data);
3935      break;
4036
4137   case 0x70:
42      cdp1869_out7_w(device, 0, data);
38      cdp1869_out7_w(m_vis, 0, data);
4339      break;
4440   }
4541}
r9387r9388
4844{
4945   tmc600_state *state = timer.machine->driver_data<tmc600_state>();
5046
51   state->blink = !state->blink;
47   state->m_blink = !state->m_blink;
5248}
5349
54static UINT8 tmc600_get_color(running_machine *machine, UINT16 pma)
50UINT8 tmc600_state::get_color(UINT16 pma)
5551{
56   tmc600_state *state = machine->driver_data<tmc600_state>();
57
5852   UINT16 pageaddr = pma & TMC600_PAGE_RAM_MASK;
59   UINT8 color = state->color_ram[pageaddr];
53   UINT8 color = m_color_ram[pageaddr];
6054
61   if (BIT(color, 3) && state->blink)
55   if (BIT(color, 3) && m_blink)
6256   {
63      color = state->vismac_bkg_latch;
57      color = m_vismac_bkg_latch;
6458   }
6559
6660   return color;
r9387r9388
7266
7367   UINT16 addr = offset & TMC600_PAGE_RAM_MASK;
7468
75   return state->page_ram[addr];
69   return state->m_page_ram[addr];
7670}
7771
7872static WRITE8_DEVICE_HANDLER( tmc600_page_ram_w )
r9387r9388
8175
8276   UINT16 addr = offset & TMC600_PAGE_RAM_MASK;
8377
84   state->page_ram[addr] = data;
85   state->color_ram[addr] = state->vismac_color_latch;
78   state->m_page_ram[addr] = data;
79   state->m_color_ram[addr] = state->m_vismac_color_latch;
8680}
8781
8882static CDP1869_CHAR_RAM_READ( tmc600_char_ram_r )
r9387r9388
9084   tmc600_state *state = device->machine->driver_data<tmc600_state>();
9185
9286   UINT16 pageaddr = pma & TMC600_PAGE_RAM_MASK;
93   UINT8 column = state->page_ram[pageaddr];
94   UINT8 color = tmc600_get_color(device->machine, pageaddr);
87   UINT8 column = state->m_page_ram[pageaddr];
88   UINT8 color = state->get_color(pageaddr);
9589   UINT16 charaddr = ((cma & 0x08) << 8) | (column << 3) | (cma & 0x07);
96   UINT8 cdb = state->char_rom[charaddr] & 0x3f;
90   UINT8 cdb = state->m_char_rom[charaddr] & 0x3f;
9791
9892   int ccb0 = BIT(color, 2);
9993   int ccb1 = BIT(color, 1);
r9387r9388
10397
10498static CDP1869_PCB_READ( tmc600_pcb_r )
10599{
100   tmc600_state *state = device->machine->driver_data<tmc600_state>();
101
106102   UINT16 pageaddr = pma & TMC600_PAGE_RAM_MASK;
107   UINT8 color = tmc600_get_color(device->machine, pageaddr);
103   UINT8 color = state->get_color(pageaddr);
108104
109105   return BIT(color, 0);
110106}
r9387r9388
123119   DEVCB_NULL
124120};
125121
126static VIDEO_START( tmc600 )
122void tmc600_state::video_start()
127123{
128   tmc600_state *state = machine->driver_data<tmc600_state>();
129
130124   /* allocate memory */
125   m_page_ram = auto_alloc_array(machine, UINT8, TMC600_PAGE_RAM_SIZE);
126   m_color_ram = auto_alloc_array(machine, UINT8, TMC600_PAGE_RAM_SIZE);
131127
132   state->page_ram = auto_alloc_array(machine, UINT8, TMC600_PAGE_RAM_SIZE);
133   state->color_ram = auto_alloc_array(machine, UINT8, TMC600_PAGE_RAM_SIZE);
134
135   /* find devices */
136
137   state->cdp1869 = machine->device(CDP1869_TAG);
138
139128   /* find memory regions */
129   m_char_rom = memory_region(machine, "chargen");
140130
141   state->char_rom = memory_region(machine, "chargen");
142
143131   /* register for state saving */
132   state_save_register_global_pointer(machine, m_page_ram, TMC600_PAGE_RAM_SIZE);
133   state_save_register_global_pointer(machine, m_color_ram, TMC600_PAGE_RAM_SIZE);
144134
145   state_save_register_global_pointer(machine, state->page_ram, TMC600_PAGE_RAM_SIZE);
146   state_save_register_global_pointer(machine, state->color_ram, TMC600_PAGE_RAM_SIZE);
147
148   state_save_register_global(machine, state->vismac_reg_latch);
149   state_save_register_global(machine, state->vismac_color_latch);
150   state_save_register_global(machine, state->vismac_bkg_latch);
151   state_save_register_global(machine, state->blink);
135   state_save_register_global(machine, m_vismac_reg_latch);
136   state_save_register_global(machine, m_vismac_color_latch);
137   state_save_register_global(machine, m_vismac_bkg_latch);
138   state_save_register_global(machine, m_blink);
152139}
153140
154static VIDEO_UPDATE( tmc600 )
141bool tmc600_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
155142{
156   tmc600_state *state = screen->machine->driver_data<tmc600_state>();
143   cdp1869_update(m_vis, &bitmap, &cliprect);
157144
158   cdp1869_update(state->cdp1869, bitmap, cliprect);
159
160145   return 0;
161146}
162147
r9387r9388
167152   MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
168153   MDRV_PALETTE_LENGTH(8+64)
169154   MDRV_PALETTE_INIT(cdp1869)
170   MDRV_VIDEO_START(tmc600)
171   MDRV_VIDEO_UPDATE(tmc600)
172155   MDRV_SCREEN_RAW_PARAMS(CDP1869_DOT_CLK_PAL, CDP1869_SCREEN_WIDTH, CDP1869_HBLANK_END, CDP1869_HBLANK_START, CDP1869_TOTAL_SCANLINES_PAL, CDP1869_SCANLINE_VBLANK_END_PAL, CDP1869_SCANLINE_VBLANK_START_PAL)
173156
174157   MDRV_SPEAKER_STANDARD_MONO("mono")
src/mess/video/tmc1800.c
r9387r9388
11#include "emu.h"
22#include "includes/tmc1800.h"
3#include "cpu/cdp1802/cdp1802.h"
3#include "cpu/cosmac/cosmac.h"
44#include "video/cdp1861.h"
55#include "sound/cdp1864.h"
66#include "machine/rescap.h"
77
88/* Telmac 1800 */
99
10static WRITE_LINE_DEVICE_HANDLER( tmc1800_efx_w )
11{
12   tmc1800_state *driver_state = device->machine->driver_data<tmc1800_state>();
13
14   driver_state->cdp1861_efx = state;
15}
16
1710static CDP1861_INTERFACE( tmc1800_cdp1861_intf )
1811{
1912   CDP1802_TAG,
2013   SCREEN_TAG,
21   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
22   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
23   DEVCB_LINE(tmc1800_efx_w)
14   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
15   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
16   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1)
2417};
2518
2619static VIDEO_UPDATE( tmc1800 )
r9387r9388
5548   return BIT(state->color, 0);
5649}
5750
58static WRITE_LINE_DEVICE_HANDLER( tmc2000_efx_w )
59{
60   tmc2000_state *driver_state = device->machine->driver_data<tmc2000_state>();
61
62   driver_state->cdp1864_efx = state;
63}
64
6551static CDP1864_INTERFACE( tmc2000_cdp1864_intf )
6652{
6753   CDP1802_TAG,
r9387r9388
7056   DEVCB_LINE(rdata_r),
7157   DEVCB_LINE(bdata_r),
7258   DEVCB_LINE(gdata_r),
73   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
74   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
75   DEVCB_LINE(tmc2000_efx_w),
59   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
60   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
61   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1),
7662   RES_K(1.21),   // RL64
7763   RES_K(2.05),   // RL63
7864   RES_K(2.26),   // RL61
r9387r9388
9076
9177/* OSCOM Nano */
9278
93static WRITE_LINE_DEVICE_HANDLER( oscnano_efx_w )
79static CDP1864_INTERFACE( nano_cdp1864_intf )
9480{
95   oscnano_state *driver_state = device->machine->driver_data<oscnano_state>();
96
97   driver_state->cdp1864_efx = state;
98}
99
100static CDP1864_INTERFACE( oscnano_cdp1864_intf )
101{
10281   CDP1802_TAG,
10382   SCREEN_TAG,
10483   CDP1864_INTERLACED,
10584   DEVCB_LINE_VCC,
10685   DEVCB_LINE_VCC,
10786   DEVCB_LINE_VCC,
108   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
109   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
110   DEVCB_LINE(oscnano_efx_w),
87   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
88   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
89   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1),
11190   RES_K(1.21), // R18 unconfirmed
11291   0, // not connected
11392   0, // not connected
11493   0  // not connected
11594};
11695
117static VIDEO_UPDATE( oscnano )
96static VIDEO_UPDATE( nano )
11897{
119   oscnano_state *state = screen->machine->driver_data<oscnano_state>();
120
98   nano_state *state = screen->machine->driver_data<nano_state>();
99   
121100   cdp1864_update(state->cdp1864, bitmap, cliprect);
122101
123102   return 0;
r9387r9388
172151   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
173152MACHINE_CONFIG_END
174153
175MACHINE_CONFIG_FRAGMENT( oscnano_video )
154MACHINE_CONFIG_FRAGMENT( nano_video )
176155   MDRV_CDP1864_SCREEN_ADD(SCREEN_TAG, XTAL_1_75MHz)
177156
178157   MDRV_PALETTE_LENGTH(8+8)
179   MDRV_VIDEO_UPDATE(oscnano)
158   MDRV_VIDEO_UPDATE(nano)
180159
181160   MDRV_SPEAKER_STANDARD_MONO("mono")
182   MDRV_CDP1864_ADD(CDP1864_TAG, XTAL_1_75MHz, oscnano_cdp1864_intf)
161   MDRV_CDP1864_ADD(CDP1864_TAG, XTAL_1_75MHz, nano_cdp1864_intf)
183162   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
184163MACHINE_CONFIG_END
src/mess/video/comx35.c
r9387r9388
11#include "emu.h"
22#include "rendlay.h"
33#include "includes/comx35.h"
4#include "cpu/cdp1802/cdp1802.h"
4#include "cpu/cosmac/cosmac.h"
55#include "sound/cdp1869.h"
66#include "sound/wave.h"
77#include "video/mc6845.h"
r9387r9388
1414
1515   UINT16 addr = offset & COMX35_PAGERAM_MASK;
1616
17   return state->pageram[addr];
17   return state->m_pageram[addr];
1818}
1919
2020static WRITE8_DEVICE_HANDLER( comx35_pageram_w )
r9387r9388
2323
2424   UINT16 addr = offset & COMX35_PAGERAM_MASK;
2525
26   state->pageram[addr] = data;
26   state->m_pageram[addr] = data;
2727}
2828
2929static CDP1869_CHAR_RAM_READ( comx35_charram_r )
r9387r9388
3131   comx35_state *state = device->machine->driver_data<comx35_state>();
3232
3333   UINT16 pageaddr = pma & COMX35_PAGERAM_MASK;
34   UINT8 column = state->pageram[pageaddr] & 0x7f;
34   UINT8 column = state->m_pageram[pageaddr] & 0x7f;
3535   UINT16 charaddr = (column << 4) | cma;
3636
37   return state->charram[charaddr];
37   return state->m_charram[charaddr];
3838}
3939
4040static CDP1869_CHAR_RAM_WRITE( comx35_charram_w )
r9387r9388
4242   comx35_state *state = device->machine->driver_data<comx35_state>();
4343
4444   UINT16 pageaddr = pma & COMX35_PAGERAM_MASK;
45   UINT8 column = state->pageram[pageaddr] & 0x7f;
45   UINT8 column = state->m_pageram[pageaddr] & 0x7f;
4646   UINT16 charaddr = (column << 4) | cma;
4747
48   state->charram[charaddr] = data;
48   state->m_charram[charaddr] = data;
4949}
5050
5151static CDP1869_PCB_READ( comx35_pcb_r )
r9387r9388
5454
5555   UINT16 pageaddr = pma & COMX35_PAGERAM_MASK;
5656
57   return BIT(state->pageram[pageaddr], 7);
57   return BIT(state->m_pageram[pageaddr], 7);
5858}
5959
6060static WRITE_LINE_DEVICE_HANDLER( comx35_prd_w )
6161{
6262   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
6363
64   if (!driver_state->iden && !state)
64   if (!driver_state->m_iden && !state)
6565   {
66      cputag_set_input_line(device->machine, CDP1802_TAG, CDP1802_INPUT_LINE_INT, ASSERT_LINE);
66      cpu_set_input_line(driver_state->m_maincpu, COSMAC_INPUT_LINE_INT, ASSERT_LINE);
6767   }
6868
69   driver_state->cdp1869_prd = state;
69   cpu_set_input_line(driver_state->m_maincpu, COSMAC_INPUT_LINE_EF1, state);
7070}
7171
7272static CDP1869_INTERFACE( pal_cdp1869_intf )
r9387r9388
9797   DEVCB_LINE(comx35_prd_w)
9898};
9999
100static VIDEO_START( comx35 )
100void comx35_state::video_start()
101101{
102   comx35_state *state = machine->driver_data<comx35_state>();
103
104102   // allocate memory
103   m_pageram = auto_alloc_array(machine, UINT8, COMX35_PAGERAM_SIZE);
104   m_charram = auto_alloc_array(machine, UINT8, COMX35_CHARRAM_SIZE);
105   m_videoram = auto_alloc_array(machine, UINT8, COMX35_VIDEORAM_SIZE);
105106
106   state->pageram = auto_alloc_array(machine, UINT8, COMX35_PAGERAM_SIZE);
107   state->charram = auto_alloc_array(machine, UINT8, COMX35_CHARRAM_SIZE);
108   state->videoram = auto_alloc_array(machine, UINT8, COMX35_VIDEORAM_SIZE);
109
110107   // register for save state
111
112   state_save_register_global(machine, state->pal_ntsc);
113   state_save_register_global(machine, state->cdp1869_prd);
114
115   state_save_register_global_pointer(machine, state->pageram, COMX35_PAGERAM_SIZE);
116   state_save_register_global_pointer(machine, state->charram, COMX35_CHARRAM_SIZE);
117   state_save_register_global_pointer(machine, state->videoram, COMX35_VIDEORAM_SIZE);
108   state_save_register_global_pointer(machine, m_pageram, COMX35_PAGERAM_SIZE);
109   state_save_register_global_pointer(machine, m_charram, COMX35_CHARRAM_SIZE);
110   state_save_register_global_pointer(machine, m_videoram, COMX35_VIDEORAM_SIZE);
118111}
119112
120static VIDEO_UPDATE( comx35 )
113bool comx35_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
121114{
122   screen_device *screen_40 = downcast<screen_device *>(screen->machine->device(SCREEN_TAG));
123
124   if (screen == screen_40)
115   if (screen.width() == CDP1869_SCREEN_WIDTH)
125116   {
126      running_device *cdp1869 = screen->machine->device(CDP1869_TAG);
127
128      cdp1869_update(cdp1869, bitmap, cliprect);
117      cdp1869_update(m_vis, &bitmap, &cliprect);
129118   }
130119   else
131120   {
132      running_device *mc6845 = screen->machine->device(MC6845_TAG);
133
134      mc6845_update(mc6845, bitmap, cliprect);
121      mc6845_update(m_crtc, &bitmap, &cliprect);
135122   }
136123
137124   return 0;
r9387r9388
139126
140127/* MC6845 */
141128
142READ8_HANDLER( comx35_videoram_r )
143{
144   comx35_state *state = space->machine->driver_data<comx35_state>();
145
146   return state->videoram[offset];
147}
148
149WRITE8_HANDLER( comx35_videoram_w )
150{
151   comx35_state *state = space->machine->driver_data<comx35_state>();
152
153   state->videoram[offset] = data;
154}
155
156129static MC6845_UPDATE_ROW( comx35_update_row )
157130{
158131   comx35_state *state = device->machine->driver_data<comx35_state>();
r9387r9388
163136
164137   for (column = 0; column < x_count; column++)
165138   {
166      UINT8 code = state->videoram[((ma + column) & 0x7ff)];
139      UINT8 code = state->m_videoram[((ma + column) & 0x7ff)];
167140      UINT16 addr = (code << 3) | (ra & 0x07);
168141      UINT8 data = charrom[addr & 0x7ff];
169142
r9387r9388
188161{
189162   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
190163
191   driver_state->cdp1802_ef4 = state;
164   driver_state->m_cdp1802_ef4 = state;
192165}
193166
194167static const mc6845_interface comx35_mc6845_interface =
r9387r9388
205178   NULL
206179};
207180
181/* F4 Character Displayer */
182static const gfx_layout comx35_charlayout =
183{
184   8, 8,               /* 8 x 8 characters */
185   256,               /* 256 characters */
186   1,               /* 1 bits per pixel */
187   { 0 },               /* no bitplanes */
188   /* x offsets */
189   { 0, 1, 2, 3, 4, 5, 6, 7 },
190   /* y offsets */
191   { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
192   8*8               /* every char takes 8 bytes */
193};
194
195static GFXDECODE_START( comx35 )
196   GFXDECODE_ENTRY( "chargen", 0x0000, comx35_charlayout, 0, 36 )
197GFXDECODE_END
198
208199/* Machine Drivers */
209200
210201static MACHINE_CONFIG_FRAGMENT( comx35_80_video )
r9387r9388
223214
224215   MDRV_CDP1869_SCREEN_PAL_ADD(SCREEN_TAG, CDP1869_DOT_CLK_PAL)
225216
226   MDRV_VIDEO_START(comx35)
227   MDRV_VIDEO_UPDATE(comx35)
217   MDRV_GFXDECODE(comx35)
228218
229219   /* sound hardware */
230220   MDRV_SPEAKER_STANDARD_MONO("mono")
r9387r9388
243233
244234   MDRV_CDP1869_SCREEN_NTSC_ADD(SCREEN_TAG, CDP1869_DOT_CLK_NTSC)
245235
246   MDRV_VIDEO_START(comx35)
247   MDRV_VIDEO_UPDATE(comx35)
236   MDRV_GFXDECODE(comx35)
248237
249238   /* sound hardware */
250239   MDRV_SPEAKER_STANDARD_MONO("mono")
src/mess/video/pecom.c
r9387r9388
88
99#include "emu.h"
1010#include "sound/cdp1869.h"
11#include "sound/wave.h"
12#include "cpu/cdp1802/cdp1802.h"
11#include "sound/wave.h"   
12#include "cpu/cosmac/cosmac.h"
1313#include "includes/pecom.h"
1414
1515static READ8_DEVICE_HANDLER( pecom_page_ram_r )
r9387r9388
7171   {
7272      driver_state->dma = 0;
7373
74      cputag_set_input_line(device->machine, "maincpu", CDP1802_INPUT_LINE_DMAOUT, HOLD_LINE);
74      cputag_set_input_line(device->machine, "maincpu", COSMAC_INPUT_LINE_DMAOUT, HOLD_LINE);
7575   }
7676   else
7777   {
r9387r9388
109109   state->cdp1869 = machine->device(CDP1869_TAG);
110110
111111   /* register for state saving */
112   state_save_register_global(machine, state->cdp1802_mode);
112   state_save_register_global(machine, state->reset);
113113   state_save_register_global(machine, state->dma);
114114   state_save_register_global_pointer(machine, state->page_ram, PECOM_PAGE_RAM_SIZE);
115115}
src/mess/includes/vip.h
r9387r9388
1#pragma once
2
13#ifndef __VIP__
24#define __VIP__
35
src/mess/includes/elf.h
r9387r9388
1616      : driver_device(machine, config) { }
1717
1818   /* display state */
19   int cdp1861_efx;            /* EFx */
2019   UINT8 data;
2120
2221   /* devices */
src/mess/includes/tmc600.h
r9387r9388
1#pragma once
2
13#ifndef __TMC600__
24#define __TMC600__
35
6#include "cpu/cosmac/cosmac.h"
7
48#define SCREEN_TAG      "screen"
59#define CDP1802_TAG      "cdp1802"
610#define CDP1869_TAG      "cdp1869"
r9387r9388
1418{
1519public:
1620   tmc600_state(running_machine &machine, const driver_device_config_base &config)
17      : driver_device(machine, config) { }
21      : driver_device(machine, config),
22        m_maincpu(*this, CDP1802_TAG),
23        m_vis(*this, CDP1869_TAG),
24        m_cassette(*this, CASSETTE_TAG),
25        m_ram(*this, "messram")
26    { }
1827
28   required_device<cosmac_device> m_maincpu;
29   required_device<running_device> m_vis;
30   required_device<running_device> m_cassette;
31   required_device<running_device> m_ram;
32
33   virtual void machine_start();
34   virtual void machine_reset();
35
36   virtual void video_start();
37   virtual bool video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
38
39   DECLARE_WRITE8_MEMBER(keyboard_latch_w);
40   DECLARE_WRITE8_MEMBER(vismac_register_w);
41   DECLARE_WRITE8_MEMBER(vismac_data_w);
42
43   UINT8 get_color(UINT16 pma);
44
1945   /* video state */
20   int vismac_reg_latch;   /* video register latch */
21   int vismac_color_latch;   /* color latch */
22   int vismac_bkg_latch;   /* background color latch */
23   int blink;            /* cursor blink */
46   int m_vismac_reg_latch;   /* video register latch */
47   int m_vismac_color_latch;   /* color latch */
48   int m_vismac_bkg_latch;   /* background color latch */
49   int m_blink;            /* cursor blink */
2450
25   UINT8 *page_ram;      /* page memory */
26   UINT8 *color_ram;      /* color memory */
27   UINT8 *char_rom;      /* character generator ROM */
51   UINT8 *m_page_ram;      /* page memory */
52   UINT8 *m_color_ram;      /* color memory */
53   UINT8 *m_char_rom;      /* character generator ROM */
2854
2955   /* keyboard state */
30   int keylatch;         /* key latch */
31
32   /* devices */
33   running_device *cdp1869;
34   running_device *cassette;
56   int m_keylatch;         /* key latch */
3557};
3658
3759/* ---------- defined in video/tmc600.c ---------- */
3860
39WRITE8_HANDLER( tmc600_vismac_register_w );
40WRITE8_DEVICE_HANDLER( tmc600_vismac_data_w );
41
4261MACHINE_CONFIG_EXTERN( tmc600_video );
4362
4463#endif
src/mess/includes/eti660.h
r9387r9388
11#ifndef __ETI660__
22#define __ETI660__
33
4#include "cpu/cdp1802/cdp1802.h"
4#include "cpu/cosmac/cosmac.h"
55
66#define SCREEN_TAG      "screen"
77#define CDP1802_TAG      "ic3"
r9387r9388
2121   eti660_state(running_machine &machine, const driver_device_config_base &config)
2222      : driver_device(machine, config) { }
2323
24   /* cpu state */
25   cdp1802_control_mode cdp1802_mode;
26
2724   /* keyboard state */
2825   UINT8 keylatch;
2926
3027   /* video state */
31   int cdp1864_efx;
3228   UINT8 color_ram[0x100];
3329   UINT8 color;
3430
src/mess/includes/studio2.h
r9387r9388
11#ifndef __STUDIO2__
22#define __STUDIO2__
33
4#include "cpu/cdp1802/cdp1802.h"
4#include "cpu/cosmac/cosmac.h"
55
66#define CDP1802_TAG "ic1"
77#define CDP1861_TAG "ic2"
r9387r9388
1212{
1313public:
1414   studio2_state(running_machine &machine, const driver_device_config_base &config)
15      : driver_device(machine, config) { }
15      : driver_device(machine, config),
16        m_maincpu(*this, CDP1802_TAG),
17        m_vdc(*this, CDP1861_TAG),
18        m_cti(*this, CDP1864_TAG)
19   { }
1620
17   /* cpu state */
18   cdp1802_control_mode cdp1802_mode;
21   required_device<cosmac_device> m_maincpu;
22   optional_device<running_device> m_vdc;
23   optional_device<running_device> m_cti;
1924
25   virtual void machine_start();
26   virtual void machine_reset();
27
28   DECLARE_READ8_MEMBER(dispon_r);
29
30   DECLARE_WRITE8_MEMBER(keylatch_w);
31   DECLARE_WRITE8_MEMBER(dispon_w);
32
2033   /* keyboard state */
21   UINT8 keylatch;
34   UINT8 m_keylatch;
2235
2336   /* video state */
24   int cdp1861_efx;
25   int cdp1864_efx;
26   UINT8 *color_ram;
27   UINT8 *color_ram1;
28   UINT8 color;
29
30   /* devices */
31   running_device *cdp1861;
32   running_device *cdp1864;
37   UINT8 *m_color_ram;
38   UINT8 *m_color_ram1;
39   UINT8 m_color;
3340};
3441
3542#endif
src/mess/includes/tmc1800.h
r9387r9388
1313   tmc1800_state(running_machine &machine, const driver_device_config_base &config)
1414      : driver_device(machine, config) { }
1515
16   /* cpu state */
17   int reset;            /* reset activated */
18
19   /* video state */
20   int cdp1861_efx;      /* EFx */
21
2216   /* keyboard state */
2317   int keylatch;         /* key latch */
2418
r9387r9388
3327   osc1000b_state(running_machine &machine, const driver_device_config_base &config)
3428      : driver_device(machine, config) { }
3529
36   /* cpu state */
37   int reset;            /* reset activated */
38
3930   /* keyboard state */
4031   int keylatch;         /* key latch */
4132
r9387r9388
5041      : driver_device(machine, config) { }
5142
5243   /* video state */
53   int cdp1864_efx;      /* EFx */
54   int reset;            /* reset activated */
55
5644   UINT8 *colorram;      /* color memory */
5745   UINT8 color;
5846
r9387r9388
6452   running_device *cassette;
6553};
6654
67class oscnano_state : public driver_device
55class nano_state : public driver_device
6856{
6957public:
70   oscnano_state(running_machine &machine, const driver_device_config_base &config)
58   nano_state(running_machine &machine, const driver_device_config_base &config)
7159      : driver_device(machine, config) { }
7260
73   /* cpu state */
74   int monitor_ef4;      /* EF4 line */
75   int reset;            /* reset activated */
76
77   /* video state */
78   int cdp1864_efx;      /* EFx */
79
8061   /* keyboard state */
8162   int keylatch;         /* key latch */
8263
r9387r9388
9374MACHINE_CONFIG_EXTERN( tmc1800_video );
9475MACHINE_CONFIG_EXTERN( osc1000b_video );
9576MACHINE_CONFIG_EXTERN( tmc2000_video );
96MACHINE_CONFIG_EXTERN( oscnano_video );
77MACHINE_CONFIG_EXTERN( nano_video );
9778
9879#endif
src/mess/includes/comx35.h
r9387r9388
11#ifndef __COMX35__
22#define __COMX35__
33
4#include "cpu/cosmac/cosmac.h"
45#include "devices/snapquik.h"
56#include "machine/wd17xx.h"
67
r9387r9388
4142{
4243public:
4344   comx35_state(running_machine &machine, const driver_device_config_base &config)
44      : driver_device(machine, config) { }
45      : driver_device(machine, config),
46        m_maincpu(*this, CDP1802_TAG),
47        m_vis(*this, CDP1869_TAG),
48        m_crtc(*this, MC6845_TAG),
49        m_fdc(*this, WD1770_TAG),
50        m_kbe(*this, CDP1871_TAG),
51        m_cassette(*this, CASSETTE_TAG),
52        m_ram(*this, "messram")
53   { }
4554
46   /* processor state */
47   int cdp1802_mode;      /* CPU mode */
48   int cdp1802_q;         /* Q flag */
49   int cdp1802_ef4;      /* EF4 flag */
50   int iden;            /* interrupt/DMA enable */
51   int slot;            /* selected slot */
52   int bank;            /* selected device bank */
53   int rambank;         /* selected RAM bank */
54   int dma;            /* memory refresh DMA */
55   required_device<cosmac_device> m_maincpu;
56   required_device<running_device> m_vis;
57   required_device<running_device> m_crtc;
58   required_device<running_device> m_fdc;
59   required_device<running_device> m_kbe;
60   required_device<running_device> m_cassette;
61   required_device<running_device> m_ram;
5562
56   /* video state */
57   int pal_ntsc;         /* PAL/NTSC */
58   int cdp1869_prd;      /* CDP1869 predisplay */
63   virtual void machine_start();
64   virtual void machine_reset();
5965
60   UINT8 *pageram;         /* page memory */
61   UINT8 *charram;         /* character memory */
62   UINT8 *videoram;      /* 80 column video memory */
66   virtual void video_start();
67   virtual bool video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
6368
64   /* keyboard state */
65   int cdp1871_efxa;      /* keyboard data available */
66   int cdp1871_efxb;      /* keyboard repeat */
69   DECLARE_READ8_MEMBER(io_r);
70   DECLARE_READ8_MEMBER(io2_r);
6771
72   DECLARE_WRITE8_MEMBER(bank_select_w);
73   DECLARE_WRITE8_MEMBER(io_w);
74
75   UINT8 read_expansion();
76   bool is_expansion_box_installed();
77   bool is_dos_card_active();
78   UINT8 fdc_r();
79   void fdc_w(UINT8 data);
80   UINT8 printer_r();
81   void printer_w(UINT8 data);
82   void get_active_bank(UINT8 data);
83   void set_active_bank();
84
85   /* processor state */
86   int m_reset;            /* CPU mode */
87   int m_cdp1802_q;         /* Q flag */
88   int m_cdp1802_ef4;         /* EF4 flag */
89   int m_iden;               /* interrupt/DMA enable */
90   int m_slot;               /* selected slot */
91   int m_bank;               /* selected device bank */
92   int m_rambank;            /* selected RAM bank */
93   int m_dma;               /* memory refresh DMA */
94
95   UINT8 *m_pageram;         /* page memory */
96   UINT8 *m_charram;         /* character memory */
97   UINT8 *m_videoram;         /* 80 column video memory */
98
6899   /* floppy state */
69   int fdc_addr;         /* FDC address */
70   int fdc_irq;         /* interrupt request */
71   int fdc_drq_enable;      /* EF4 enabled */
100   int m_fdc_addr;            /* FDC address */
101   int m_fdc_irq;            /* interrupt request */
102   int m_fdc_drq_enable;      /* EF4 enabled */
72103
73104   /* timers */
74   emu_timer *reset_timer;   /* power on reset timer */
75
76   /* devices */
77   running_device *cassette;
105   emu_timer *m_reset_timer;   /* power on reset timer */
78106};
79107
80108/* ---------- defined in machine/comx35.c ---------- */
81
82109extern const wd17xx_interface comx35_wd17xx_interface;
83110
84WRITE8_HANDLER( comx35_bank_select_w );
85READ8_HANDLER( comx35_io_r );
86READ8_HANDLER( comx35_io2_r );
87WRITE8_HANDLER( comx35_io_w );
88
89MACHINE_START( comx35p );
90MACHINE_START( comx35n );
91MACHINE_RESET( comx35 );
92111INPUT_CHANGED( comx35_reset );
93112
94113/* ---------- defined in video/comx35.c ---------- */
95
96WRITE8_HANDLER( comx35_videoram_w );
97READ8_HANDLER( comx35_videoram_r );
98
99114MACHINE_CONFIG_EXTERN( comx35_pal_video );
100115MACHINE_CONFIG_EXTERN( comx35_ntsc_video );
101116
src/mess/includes/pecom.h
r9387r9388
11#ifndef __PECOM__
22#define __PECOM__
33
4#include "cpu/cosmac/cosmac.h"
5
46#define SCREEN_TAG   "screen"
57#define CDP1869_TAG   "cdp1869"
68
r9387r9388
1517
1618   UINT8 *page_ram;      /* page memory */
1719   UINT8 *charram;         /* character generator ROM */
18   int cdp1802_mode;      /* CPU mode */
20   int reset;            /* CPU mode */
1921   int dma;            /* memory refresh DMA */
2022   running_device *cdp1869;
2123
r9387r9388
3133extern WRITE8_HANDLER( pecom_bank_w );
3234extern READ8_HANDLER (pecom_keyboard_r);
3335
34extern const cdp1802_interface pecom64_cdp1802_config;
36extern const cosmac_interface pecom64_cdp1802_config;
3537
3638/* ---------- defined in video/pecom.c ---------- */
3739
src/mess/formats/comx35_comx.c
r9387r9388
99#include "emu.h"
1010#include "imageutl.h"
1111#include "formats/comx35_comx.h"
12#include "cpu/cdp1802/cdp1802.h"
1312#include "devices/messram.h"
1413
1514/***************************************************************************
src/mess/drivers/elf.c
r9387r9388
1414
1515#include "emu.h"
1616#include "includes/elf.h"
17#include "cpu/cdp1802/cdp1802.h"
17#include "cpu/cosmac/cosmac.h"
1818#include "devices/cassette.h"
1919#include "devices/snapquik.h"
2020#include "machine/mm74c922.h"
r9387r9388
100100   if (newval)
101101   {
102102      /* assert DMAIN */
103      cputag_set_input_line(field->port->machine, CDP1802_TAG, CDP1802_INPUT_LINE_DMAIN, ASSERT_LINE);
103      cputag_set_input_line(field->port->machine, CDP1802_TAG, COSMAC_INPUT_LINE_DMAIN, ASSERT_LINE);
104104   }
105105}
106106
r9387r9388
142142
143143/* CDP1802 Configuration */
144144
145static CDP1802_MODE_READ( elf2_mode_r )
145static READ_LINE_DEVICE_HANDLER( wait_r )
146146{
147   cdp1802_control_mode mode = CDP1802_MODE_RESET;
148
149   switch ((RUN(device->machine) << 1) | !LOAD(device->machine))
150   {
151   case 0: mode = CDP1802_MODE_LOAD;   popmessage("LOAD");      break;
152   case 1: mode = CDP1802_MODE_RESET;   popmessage("RESET");   break;
153   case 2: mode = CDP1802_MODE_PAUSE;   popmessage("PAUSE");   break;
154   case 3: mode = CDP1802_MODE_RUN;   popmessage("RUN");      break;
155   }
156
157   return mode;
147   return LOAD(device->machine);
158148}
159149
160static CDP1802_EF_READ( elf2_ef_r )
150static READ_LINE_DEVICE_HANDLER( clear_r )
161151{
162   /*
163        EF1     CDP1861
164        EF2
165        EF3
166        EF4     input switch
167    */
152   return RUN(device->machine);
153}
168154
169   elf2_state *state = device->machine->driver_data<elf2_state>();
170
171   UINT8 flags = 0x0f;
172
173   /* CDP1861 */
174   if (state->cdp1861_efx) flags -= EF1;
175
176   /* input switch */
177   if (!INPUT(device->machine)) flags -= EF4;
178
179   return flags;
155static READ_LINE_DEVICE_HANDLER( ef4_r )
156{
157   return INPUT(device->machine);
180158}
181159
182static CDP1802_SC_WRITE( elf2_sc_w )
160static COSMAC_SC_WRITE( elf2_sc_w )
183161{
184   if (sc1)
162   switch (sc)
185163   {
164   case COSMAC_STATE_CODE_S2_DMA:
165   case COSMAC_STATE_CODE_S3_INTERRUPT:
186166      /* clear DMAIN */
187      cputag_set_input_line(device->machine, CDP1802_TAG, CDP1802_INPUT_LINE_DMAIN, CLEAR_LINE);
167      cpu_set_input_line(device, COSMAC_INPUT_LINE_DMAIN, CLEAR_LINE);
168      break;
169   
170   default:
171      break;
188172   }
189173}
190174
r9387r9388
200184   return state->data;
201185}
202186
203static CDP1802_INTERFACE( elf2_config )
187static COSMAC_INTERFACE( elf2_config )
204188{
205   elf2_mode_r,
206   elf2_ef_r,
207   elf2_sc_w,
189   DEVCB_LINE(wait_r),
190   DEVCB_LINE(clear_r),
191   DEVCB_NULL,
192   DEVCB_NULL,
193   DEVCB_NULL,
194   DEVCB_LINE(ef4_r),
208195   DEVCB_LINE(elf2_q_w),
209196   DEVCB_HANDLER(elf2_dma_r),
210   DEVCB_DEVICE_HANDLER(CDP1861_TAG, cdp1861_dma_w)
197   DEVCB_DEVICE_HANDLER(CDP1861_TAG, cdp1861_dma_w),
198   elf2_sc_w,
199   DEVCB_NULL,
200   DEVCB_NULL
211201};
212202
213203/* MM74C923 Interface */
r9387r9388
254244   return 0;
255245}
256246
257static WRITE_LINE_DEVICE_HANDLER( elf2_efx_w )
258{
259   elf2_state *driver_state = device->machine->driver_data<elf2_state>();
260
261   driver_state->cdp1861_efx = state;
262}
263
264247static CDP1861_INTERFACE( elf2_cdp1861_intf )
265248{
266249   CDP1802_TAG,
267250   SCREEN_TAG,
268   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
269   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
270   DEVCB_LINE(elf2_efx_w)
251   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
252   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
253   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1)
271254};
272255
273256/* Machine Initialization */
r9387r9388
295278   memory_set_bank(machine, "bank1", 0);
296279
297280   /* register for state saving */
298   state_save_register_global(machine, state->cdp1861_efx);
299281   state_save_register_global(machine, state->data);
300282}
301283
r9387r9388
310292};
311293
312294static MACHINE_CONFIG_START( elf2, elf2_state )
313
314295   /* basic machine hardware */
315    MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_3_579545MHz/2)
296    MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_3_579545MHz/2)
316297    MDRV_CPU_PROGRAM_MAP(elf2_mem)
317298    MDRV_CPU_IO_MAP(elf2_io)
318299   MDRV_CPU_CONFIG(elf2_config)
src/mess/drivers/tmc600.c
r9387r9388
7979
8080*/
8181
82#define ADDRESS_MAP_MODERN
83
8284#include "emu.h"
8385#include "machine/ctronics.h"
8486#include "devices/flopdrv.h"
8587#include "formats/basicdsk.h"
8688#include "devices/cassette.h"
8789#include "devices/snapquik.h"
88#include "cpu/cdp1802/cdp1802.h"
90#include "cpu/cosmac/cosmac.h"
8991#include "sound/cdp1869.h"
9092#include "includes/tmc600.h"
9193#include "devices/messram.h"
9294
9395/* Read/Write Handlers */
9496
95static WRITE8_HANDLER( keyboard_latch_w )
97WRITE8_MEMBER( tmc600_state::keyboard_latch_w )
9698{
97   tmc600_state *state = space->machine->driver_data<tmc600_state>();
98
99   state->keylatch = data;
99   m_keylatch = data;
100100}
101101
102102/* Memory Maps */
103103
104static ADDRESS_MAP_START( tmc600_map, ADDRESS_SPACE_PROGRAM, 8 )
104static ADDRESS_MAP_START( tmc600_map, ADDRESS_SPACE_PROGRAM, 8, tmc600_state )
105105   AM_RANGE(0x0000, 0x4fff) AM_ROM
106106   AM_RANGE(0x6000, 0xbfff) AM_RAM
107   AM_RANGE(0xf400, 0xf7ff) AM_DEVREADWRITE(CDP1869_TAG, cdp1869_charram_r, cdp1869_charram_w)
108   AM_RANGE(0xf800, 0xffff) AM_DEVREADWRITE(CDP1869_TAG, cdp1869_pageram_r, cdp1869_pageram_w)
107   AM_RANGE(0xf400, 0xf7ff) AM_DEVREADWRITE_LEGACY(CDP1869_TAG, cdp1869_charram_r, cdp1869_charram_w)
108   AM_RANGE(0xf800, 0xffff) AM_DEVREADWRITE_LEGACY(CDP1869_TAG, cdp1869_pageram_r, cdp1869_pageram_w)
109109ADDRESS_MAP_END
110110
111static ADDRESS_MAP_START( tmc600_io_map, ADDRESS_SPACE_IO, 8 )
111static ADDRESS_MAP_START( tmc600_io_map, ADDRESS_SPACE_IO, 8, tmc600_state )
112112   AM_RANGE(0x03, 0x03) AM_WRITE(keyboard_latch_w)
113   AM_RANGE(0x04, 0x04) AM_DEVWRITE(CENTRONICS_TAG, centronics_data_w)
114   AM_RANGE(0x05, 0x05) AM_DEVWRITE(CDP1869_TAG, tmc600_vismac_data_w)
113   AM_RANGE(0x04, 0x04) AM_DEVWRITE_LEGACY(CENTRONICS_TAG, centronics_data_w)
114   AM_RANGE(0x05, 0x05) AM_WRITE(vismac_data_w)
115115//  AM_RANGE(0x06, 0x06) AM_WRITE(floppy_w)
116   AM_RANGE(0x07, 0x07) AM_WRITE(tmc600_vismac_register_w)
116   AM_RANGE(0x07, 0x07) AM_WRITE(vismac_register_w)
117117ADDRESS_MAP_END
118118
119119/* Input Ports */
r9387r9388
211211
212212/* CDP1802 Interface */
213213
214static CDP1802_MODE_READ( tmc600_mode_r )
214static READ_LINE_DEVICE_HANDLER( clear_r )
215215{
216   if (input_port_read(device->machine, "RUN") & 0x01)
217   {
218      return CDP1802_MODE_RESET;
219   }
220   else
221   {
222      return CDP1802_MODE_RUN;
223   }
216   return BIT(input_port_read(device->machine, "RUN"), 0);
224217}
225218
226static CDP1802_EF_READ( tmc600_ef_r )
219static READ_LINE_DEVICE_HANDLER( ef2_r )
227220{
228   tmc600_state *state = device->machine->driver_data<tmc600_state>();
221   return cassette_input(device) < 0;
222}
229223
230   int flags = 0x0f;
224static READ_LINE_DEVICE_HANDLER( ef3_r )
225{
226   tmc600_state *state = device->machine->driver_data<tmc600_state>();
231227   static const char *const keynames[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" };
228   UINT8 data = ~input_port_read(device->machine, keynames[state->m_keylatch / 8]);
232229
233   /*
234        EF1     ?
235        EF2     tape in
236        EF3     keyboard
237        EF4     ?
238    */
239
240   // tape in
241
242   if (cassette_input(state->cassette) < +0.0) flags -= EF2;
243
244   // keyboard
245
246   flags -= (~input_port_read(device->machine, keynames[state->keylatch / 8]) & (1 << (state->keylatch % 8))) ? EF3 : 0;
247
248   return flags;
230   return BIT(data, state->m_keylatch % 8);
249231}
250232
251233static WRITE_LINE_DEVICE_HANDLER( tmc600_q_w )
252234{
253235   tmc600_state *driver_state = device->machine->driver_data<tmc600_state>();
254236
255   cassette_output(driver_state->cassette, state ? +1.0 : -1.0);
237   cassette_output(driver_state->m_cassette, state ? +1.0 : -1.0);
256238}
257239
258static CDP1802_INTERFACE( tmc600_cdp1802_config )
240static COSMAC_INTERFACE( cosmac_intf )
259241{
260   tmc600_mode_r,
261   tmc600_ef_r,
262   NULL,
242   DEVCB_LINE_VCC,
243   DEVCB_LINE(clear_r),
244   DEVCB_NULL,
245   DEVCB_DEVICE_LINE(CASSETTE_TAG, ef2_r),
246   DEVCB_LINE(ef3_r),
247   DEVCB_NULL,
263248   DEVCB_LINE(tmc600_q_w),
264249   DEVCB_NULL,
250   DEVCB_NULL,
251   NULL,
252   DEVCB_NULL,
265253   DEVCB_NULL
266254};
267255
268256/* Machine Initialization */
269257
270static MACHINE_START( tmc600 )
258void tmc600_state::machine_start()
271259{
272   tmc600_state *state = machine->driver_data<tmc600_state>();
273260   address_space *program = cputag_get_address_space(machine, CDP1802_TAG, ADDRESS_SPACE_PROGRAM);
274261
275   /* find devices */
276   state->cassette = machine->device(CASSETTE_TAG);
277
278262   /* configure RAM */
279   switch (messram_get_size(machine->device("messram")))
263   switch (messram_get_size(m_ram))
280264   {
281265   case 8*1024:
282266      memory_unmap_readwrite(program, 0x8000, 0xbfff, 0, 0);
r9387r9388
288272   }
289273
290274   /* register for state saving */
291   state_save_register_global(machine, state->keylatch);
275   state_save_register_global(machine, m_keylatch);
292276}
293277
294static MACHINE_RESET( tmc600 )
278void tmc600_state::machine_reset()
295279{
296280   cputag_set_input_line(machine, CDP1802_TAG, INPUT_LINE_RESET, PULSE_LINE);
297281}
r9387r9388
305289   (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED),
306290   NULL
307291};
308static FLOPPY_OPTIONS_START(tmc600)
309   // dsk
310FLOPPY_OPTIONS_END
311292
312293static const floppy_config tmc600_floppy_config =
313294{
r9387r9388
317298   DEVCB_NULL,
318299   DEVCB_NULL,
319300   FLOPPY_STANDARD_5_25_DSHD,
320   FLOPPY_OPTIONS_NAME(tmc600),
301   FLOPPY_OPTIONS_NAME(default),
321302   NULL
322303};
323304
r9387r9388
340321GFXDECODE_END
341322
342323static MACHINE_CONFIG_START( tmc600, tmc600_state )
343
344324   // basic system hardware
345
346   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, 3579545)   // ???
325   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, 3579545)   // ???
347326   MDRV_CPU_PROGRAM_MAP(tmc600_map)
348327   MDRV_CPU_IO_MAP(tmc600_io_map)
349   MDRV_CPU_CONFIG(tmc600_cdp1802_config)
328   MDRV_CPU_CONFIG(cosmac_intf)
350329
351   MDRV_MACHINE_START(tmc600)
352   MDRV_MACHINE_RESET(tmc600)
353
354330   // sound and video hardware
355
356331   MDRV_FRAGMENT_ADD(tmc600_video)
357332   MDRV_GFXDECODE(tmc600)
358333
359   /* printer */
334   /* devices */
360335   MDRV_CENTRONICS_ADD(CENTRONICS_TAG, standard_centronics)
361
362   /* cassette */
363336   MDRV_CASSETTE_ADD(CASSETTE_TAG, tmc600_cassette_config)
337   MDRV_FLOPPY_2_DRIVES_ADD(tmc600_floppy_config)
364338
365   MDRV_FLOPPY_4_DRIVES_ADD(tmc600_floppy_config)
366
367339   /* internal ram */
368340   MDRV_RAM_ADD("messram")
369341   MDRV_RAM_DEFAULT_SIZE("8K")
src/mess/drivers/eti660.c
r9387r9388
1111
1212#include "emu.h"
1313#include "includes/eti660.h"
14#include "cpu/cdp1802/cdp1802.h"
14#include "cpu/cosmac/cosmac.h"
1515#include "devices/cassette.h"
1616#include "devices/messram.h"
1717#include "machine/6821pia.h"
1818#include "machine/rescap.h"
1919#include "sound/cdp1864.h"
2020
21static MACHINE_RESET( eti660 );
22
2123#define RX(_machine) \
22   cpu_get_reg(_machine->firstcpu, CDP1802_R0 + cpu_get_reg(_machine->firstcpu, CDP1802_X))
24   cpu_get_reg(_machine->firstcpu, COSMAC_R0 + cpu_get_reg(_machine->firstcpu, COSMAC_X))
2325
2426/* Read/Write Handlers */
2527
r9387r9388
6365
6466/* Input Ports */
6567
66static INPUT_CHANGED( trigger_reset )
68static INPUT_CHANGED( reset_pressed )
6769{
68   eti660_state *state = field->port->machine->driver_data<eti660_state>();
69
70   state->cdp1802_mode = newval ? CDP1802_MODE_RUN : CDP1802_MODE_RESET;
70   if (oldval && !newval)
71   {
72      running_machine *machine = field->port->machine;
73      MACHINE_RESET_CALL(eti660);
74   }
7175}
7276
7377static INPUT_PORTS_START( eti660 )
r9387r9388
96100   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4')
97101
98102   PORT_START("SPECIAL")
99   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("RESET") PORT_CODE(KEYCODE_R) PORT_CHANGED(trigger_reset, 0)
103   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("RESET") PORT_CODE(KEYCODE_R) PORT_CHANGED(reset_pressed, 0)
100104   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("STEP") PORT_CODE(KEYCODE_S)
101105INPUT_PORTS_END
102106
103107/* Video */
104108
105static WRITE_LINE_DEVICE_HANDLER( eti660_efx_w )
106{
107   eti660_state *driver_state = device->machine->driver_data<eti660_state>();
108
109   driver_state->cdp1864_efx = state;
110}
111
112109static READ_LINE_DEVICE_HANDLER( rdata_r )
113110{
114111   eti660_state *state = device->machine->driver_data<eti660_state>();
r9387r9388
138135   DEVCB_LINE(rdata_r),
139136   DEVCB_LINE(bdata_r),
140137   DEVCB_LINE(gdata_r),
141   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
142   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
143   DEVCB_LINE(eti660_efx_w),
138   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
139   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
140   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1),
144141   RES_K(2.2), /* R7 */
145142   RES_K(1),   /* R5 */
146143   RES_K(4.7), /* R6 */
r9387r9388
158155
159156/* CDP1802 Interface */
160157
161static CDP1802_MODE_READ( eti660_mode_r )
158static READ_LINE_DEVICE_HANDLER( clear_r )
162159{
163   eti660_state *state = device->machine->driver_data<eti660_state>();
164
165   return state->cdp1802_mode;
160   return BIT(input_port_read(device->machine, "SPECIAL"), 0);
166161}
167162
168static CDP1802_EF_READ( eti660_ef_r )
163static READ_LINE_DEVICE_HANDLER( ef2_r )
169164{
170   eti660_state *state = device->machine->driver_data<eti660_state>();
165   return cassette_input(device) < 0;
166}
171167
172   int ef = 0x0f;
173
174   /* CDP1864 EFx */
175   if (state->cdp1864_efx) ef -= EF1;
176
177   /* tape input */
178   if (cassette_input(state->cassette) < 0) ef -= EF2;
179
180   /* STEP key */
181   if (!BIT(input_port_read(device->machine, "SPECIAL"), 1)) ef -= EF4;
182
183   return ef;
168static READ_LINE_DEVICE_HANDLER( ef4_r )
169{
170   return BIT(input_port_read(device->machine, "SPECIAL"), 1);
184171}
185172
186173static WRITE_LINE_DEVICE_HANDLER( eti660_q_w )
r9387r9388
208195   cdp1864_dma_w(state->cdp1864, offset, data);
209196}
210197
211static CDP1802_INTERFACE( eti660_config )
198static COSMAC_INTERFACE( eti660_config )
212199{
213   eti660_mode_r,
214   eti660_ef_r,
215   NULL,
200   DEVCB_LINE_VCC,
201   DEVCB_LINE(clear_r),
202   DEVCB_NULL,
203   DEVCB_DEVICE_LINE(CASSETTE_TAG, ef2_r),
204   DEVCB_NULL,
205   DEVCB_LINE(ef4_r),
216206   DEVCB_LINE(eti660_q_w),
217207   DEVCB_NULL,
218   DEVCB_HANDLER(eti660_dma_w)
208   DEVCB_HANDLER(eti660_dma_w),
209   NULL,
210   DEVCB_NULL,
211   DEVCB_NULL
219212};
220213
221214/* PIA6821 Interface */
r9387r9388
288281
289282/* Machine Initialization */
290283
291static TIMER_CALLBACK( set_cpu_mode )
292{
293   eti660_state *state = machine->driver_data<eti660_state>();
294
295   state->cdp1802_mode = CDP1802_MODE_RUN;
296}
297
298284static MACHINE_START( eti660 )
299285{
300286   eti660_state *state = machine->driver_data<eti660_state>();
r9387r9388
302288   /* find devices */
303289   state->cdp1864 = machine->device(CDP1864_TAG);
304290   state->cassette = machine->device(CASSETTE_TAG);
305
306   /* register for state saving */
307   state_save_register_global(machine, state->cdp1802_mode);
308   state_save_register_global(machine, state->cdp1864_efx);
309291}
310292
311293static MACHINE_RESET( eti660 )
312294{
313295   eti660_state *state = machine->driver_data<eti660_state>();
314296
315   /* reset CPU */
316   state->cdp1802_mode = CDP1802_MODE_RESET;
317   timer_set(machine, ATTOTIME_IN_MSEC(0), NULL, 0, set_cpu_mode);
318
319297   /* reset CDP1864 */
320298   state->cdp1864->reset();
321299}
r9387r9388
331309};
332310
333311static MACHINE_CONFIG_START( eti660, eti660_state )
334
335312   /* basic machine hardware */
336   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_8_867238MHz/5)
313   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_8_867238MHz/5)
337314   MDRV_CPU_PROGRAM_MAP(eti660_map)
338315   MDRV_CPU_IO_MAP(eti660_io_map)
339316   MDRV_CPU_CONFIG(eti660_config)
src/mess/drivers/studio2.c
r9387r9388
193193
194194*/
195195
196#define ADDRESS_MAP_MODERN
197
196198#include "emu.h"
197199#include "includes/studio2.h"
198#include "cpu/cdp1802/cdp1802.h"
200#include "cpu/cosmac/cosmac.h"
199201#include "devices/cartslot.h"
200202#include "formats/studio2_st2.h"
201203#include "sound/beep.h"
r9387r9388
205207
206208/* Read/Write Handlers */
207209
208static WRITE8_HANDLER( keylatch_w )
210WRITE8_MEMBER( studio2_state::keylatch_w )
209211{
210   studio2_state *state = space->machine->driver_data<studio2_state>();
211
212   state->keylatch = data & 0x0f;
212   m_keylatch = data & 0x0f;
213213}
214214
215static READ8_DEVICE_HANDLER( studio2_cdp1861_dispon_r )
215READ8_MEMBER( studio2_state::dispon_r )
216216{
217   cdp1861_dispon_w(device, 1);
218   cdp1861_dispon_w(device, 0);
217   cdp1861_dispon_w(m_vdc, 1);
218   cdp1861_dispon_w(m_vdc, 0);
219219
220220   return 0xff;
221221}
222222
223static WRITE8_DEVICE_HANDLER( visicom_cdp1861_dispon_w )
223WRITE8_MEMBER( studio2_state::dispon_w )
224224{
225   cdp1861_dispon_w(device, 1);
226   cdp1861_dispon_w(device, 0);
225   cdp1861_dispon_w(m_vdc, 1);
226   cdp1861_dispon_w(m_vdc, 0);
227227}
228228
229229/* Memory Maps */
230230
231static ADDRESS_MAP_START( studio2_map, ADDRESS_SPACE_PROGRAM, 8 )
231static ADDRESS_MAP_START( studio2_map, ADDRESS_SPACE_PROGRAM, 8, studio2_state )
232232   ADDRESS_MAP_UNMAP_HIGH
233233   AM_RANGE(0x0000, 0x07ff) AM_ROM
234234   AM_RANGE(0x0800, 0x09ff) AM_MIRROR(0xf400) AM_RAM
235235ADDRESS_MAP_END
236236
237static ADDRESS_MAP_START( studio2_io_map, ADDRESS_SPACE_IO, 8 )
237static ADDRESS_MAP_START( studio2_io_map, ADDRESS_SPACE_IO, 8, studio2_state )
238238   ADDRESS_MAP_UNMAP_HIGH
239   AM_RANGE(0x01, 0x01) AM_DEVREAD(CDP1861_TAG, studio2_cdp1861_dispon_r)
239   AM_RANGE(0x01, 0x01) AM_READ(dispon_r)
240240   AM_RANGE(0x02, 0x02) AM_WRITE(keylatch_w)
241241ADDRESS_MAP_END
242242
243static ADDRESS_MAP_START( visicom_map, ADDRESS_SPACE_PROGRAM, 8 )
243static ADDRESS_MAP_START( visicom_map, ADDRESS_SPACE_PROGRAM, 8, studio2_state )
244244   AM_RANGE(0x0000, 0x07ff) AM_ROM
245245   AM_RANGE(0x1000, 0x10ff) AM_RAM
246   AM_RANGE(0x1100, 0x11ff) AM_RAM AM_BASE_MEMBER(studio2_state, color_ram)
247   AM_RANGE(0x1300, 0x13ff) AM_RAM AM_BASE_MEMBER(studio2_state, color_ram1)
246   AM_RANGE(0x1100, 0x11ff) AM_RAM AM_BASE(m_color_ram)
247   AM_RANGE(0x1300, 0x13ff) AM_RAM AM_BASE(m_color_ram1)
248248ADDRESS_MAP_END
249249
250static ADDRESS_MAP_START( visicom_io_map, ADDRESS_SPACE_IO, 8 )
251   AM_RANGE(0x01, 0x01) AM_DEVWRITE(CDP1861_TAG, visicom_cdp1861_dispon_w)
250static ADDRESS_MAP_START( visicom_io_map, ADDRESS_SPACE_IO, 8, studio2_state )
251   AM_RANGE(0x01, 0x01) AM_WRITE(dispon_w)
252252   AM_RANGE(0x02, 0x02) AM_WRITE(keylatch_w)
253253ADDRESS_MAP_END
254254
255static ADDRESS_MAP_START( mpt02_map, ADDRESS_SPACE_PROGRAM, 8 )
255static ADDRESS_MAP_START( mpt02_map, ADDRESS_SPACE_PROGRAM, 8, studio2_state )
256256   AM_RANGE(0x0000, 0x07ff) AM_ROM
257257   AM_RANGE(0x0800, 0x09ff) AM_RAM
258   AM_RANGE(0x0b00, 0x0b3f) AM_RAM AM_BASE_MEMBER(studio2_state, color_ram)
258   AM_RANGE(0x0b00, 0x0b3f) AM_RAM AM_BASE(m_color_ram)
259259   AM_RANGE(0x0c00, 0x0fff) AM_ROM
260260ADDRESS_MAP_END
261261
262static ADDRESS_MAP_START( mpt02_io_map, ADDRESS_SPACE_IO, 8 )
263   AM_RANGE(0x01, 0x01) AM_DEVREADWRITE(CDP1864_TAG, cdp1864_dispon_r, cdp1864_step_bgcolor_w)
262static ADDRESS_MAP_START( mpt02_io_map, ADDRESS_SPACE_IO, 8, studio2_state )
263   AM_RANGE(0x01, 0x01) AM_DEVREADWRITE_LEGACY(CDP1864_TAG, cdp1864_dispon_r, cdp1864_step_bgcolor_w)
264264   AM_RANGE(0x02, 0x02) AM_WRITE(keylatch_w)
265   AM_RANGE(0x04, 0x04) AM_DEVREADWRITE(CDP1864_TAG, cdp1864_dispoff_r, cdp1864_tone_latch_w)
265   AM_RANGE(0x04, 0x04) AM_DEVREADWRITE_LEGACY(CDP1864_TAG, cdp1864_dispoff_r, cdp1864_tone_latch_w)
266266ADDRESS_MAP_END
267267
268268/* Input Ports */
269269
270static INPUT_CHANGED( reset_w )
271{
272   studio2_state *state = field->port->machine->driver_data<studio2_state>();
273
274   if (oldval && !newval)
275   {
276      state->machine_reset();
277   }
278}
279
270280static INPUT_PORTS_START( studio2 )
271281   PORT_START("A")
272282   PORT_BIT( 0x001, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("A 0") PORT_CODE(KEYCODE_LALT)
r9387r9388
291301   PORT_BIT( 0x080, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("B 7") PORT_CODE(KEYCODE_1_PAD)
292302   PORT_BIT( 0x100, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("B 8") PORT_CODE(KEYCODE_2_PAD)
293303   PORT_BIT( 0x200, IP_ACTIVE_HIGH, IPT_KEYPAD ) PORT_NAME("B 9") PORT_CODE(KEYCODE_3_PAD)
304
305   PORT_START("CLEAR")
306   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("Clear") PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CHANGED(reset_w, 0)
294307INPUT_PORTS_END
295308
296309/* Video */
297310
298static WRITE_LINE_DEVICE_HANDLER( studio2_efx_w )
299{
300   studio2_state *driver_state = device->machine->driver_data<studio2_state>();
301
302   driver_state->cdp1861_efx = state;
303}
304
305311static CDP1861_INTERFACE( studio2_cdp1861_intf )
306312{
307313   CDP1802_TAG,
308314   SCREEN_TAG,
309   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
310   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
311   DEVCB_LINE(studio2_efx_w)
315   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
316   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
317   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1)
312318};
313319
314320static VIDEO_UPDATE( studio2 )
315321{
316322   studio2_state *state = screen->machine->driver_data<studio2_state>();
317323
318   cdp1861_update(state->cdp1861, bitmap, cliprect);
324   cdp1861_update(state->m_vdc, bitmap, cliprect);
319325
320326   return 0;
321327}
r9387r9388
328334    palette_set_color_rgb(machine, 3, 0xff, 0x00, 0x00);
329335}
330336
331static WRITE_LINE_DEVICE_HANDLER( mpt02_efx_w )
332{
333   studio2_state *driver_state = device->machine->driver_data<studio2_state>();
334
335   driver_state->cdp1864_efx = state;
336}
337
338337static READ_LINE_DEVICE_HANDLER( rdata_r )
339338{
340339   studio2_state *state = device->machine->driver_data<studio2_state>();
341340
342   return BIT(state->color, 0);
341   return BIT(state->m_color, 0);
343342}
344343
345344static READ_LINE_DEVICE_HANDLER( bdata_r )
346345{
347346   studio2_state *state = device->machine->driver_data<studio2_state>();
348347
349   return BIT(state->color, 1);
348   return BIT(state->m_color, 1);
350349}
351350
352351static READ_LINE_DEVICE_HANDLER( gdata_r )
353352{
354353   studio2_state *state = device->machine->driver_data<studio2_state>();
355354
356   return BIT(state->color, 2);
355   return BIT(state->m_color, 2);
357356}
358357
359358static CDP1864_INTERFACE( mpt02_cdp1864_intf )
r9387r9388
364363   DEVCB_LINE(rdata_r),
365364   DEVCB_LINE(bdata_r),
366365   DEVCB_LINE(gdata_r),
367   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
368   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
369   DEVCB_LINE(mpt02_efx_w),
366   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
367   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
368   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1),
370369   RES_K(2.2),   // unverified
371370   RES_K(1),   // unverified
372371   RES_K(5.1),   // unverified
r9387r9388
377376{
378377   studio2_state *state = screen->machine->driver_data<studio2_state>();
379378
380   cdp1864_update(state->cdp1864, bitmap, cliprect);
379   cdp1864_update(state->m_cti, bitmap, cliprect);
381380
382381   return 0;
383382}
384383
385384/* CDP1802 Configuration */
386385
387static CDP1802_MODE_READ( studio2_mode_r )
386static READ_LINE_DEVICE_HANDLER( clear_r )
388387{
388   return BIT(input_port_read(device->machine, "CLEAR"), 0);
389}
390
391static READ_LINE_DEVICE_HANDLER( ef3_r )
392{
389393   studio2_state *state = device->machine->driver_data<studio2_state>();
390394
391   return state->cdp1802_mode;
395   return BIT(input_port_read(device->machine, "A"), state->m_keylatch);
392396}
393397
394static CDP1802_EF_READ( studio2_ef_r )
398static READ_LINE_DEVICE_HANDLER( ef4_r )
395399{
396400   studio2_state *state = device->machine->driver_data<studio2_state>();
397401
398   int ef = 0x0f;
399
400   if (state->cdp1861_efx) ef -= EF1;
401
402   if (input_port_read(device->machine, "A") & (1 << state->keylatch)) ef -= EF3;
403   if (input_port_read(device->machine, "B") & (1 << state->keylatch)) ef -= EF4;
404
405   return ef;
402   return BIT(input_port_read(device->machine, "B"), state->m_keylatch);
406403}
407404
408405static WRITE_LINE_DEVICE_HANDLER( studio2_q_w )
r9387r9388
411408   beep_set_state(speaker, state);
412409}
413410
414static CDP1802_INTERFACE( studio2_config )
411static COSMAC_INTERFACE( studio2_cosmac_intf )
415412{
416   studio2_mode_r,
417   studio2_ef_r,
418   NULL,
413   DEVCB_LINE_VCC,
414   DEVCB_LINE(clear_r),
415   DEVCB_NULL,
416   DEVCB_NULL,
417   DEVCB_LINE(ef3_r),
418   DEVCB_LINE(ef4_r),
419419   DEVCB_LINE(studio2_q_w),
420420   DEVCB_NULL,
421   DEVCB_DEVICE_HANDLER(CDP1861_TAG, cdp1861_dma_w)
421   DEVCB_DEVICE_HANDLER(CDP1861_TAG, cdp1861_dma_w),
422   NULL,
423   DEVCB_NULL,
424   DEVCB_NULL
422425};
423426
424static CDP1802_EF_READ( mpt02_ef_r )
425{
426   studio2_state *state = device->machine->driver_data<studio2_state>();
427
428   int ef = 0x0f;
429
430   if (state->cdp1864_efx) ef -= EF1;
431
432   if (input_port_read(device->machine, "A") & (1 << state->keylatch)) ef -= EF3;
433   if (input_port_read(device->machine, "B") & (1 << state->keylatch)) ef -= EF4;
434
435   return ef;
436}
437
438427static WRITE8_DEVICE_HANDLER( mpt02_dma_w )
439428{
440429   studio2_state *state = device->machine->driver_data<studio2_state>();
441430   UINT8 addr = ((offset & 0xe0) >> 2) | (offset & 0x07);
442431
443   state->color = state->color_ram[addr];
432   state->m_color = state->m_color_ram[addr];
444433
445   cdp1864_con_w(state->cdp1864, 0); // HACK
446   cdp1864_dma_w(state->cdp1864, offset, data);
434   cdp1864_con_w(state->m_cti, 0); // HACK
435   cdp1864_dma_w(state->m_cti, offset, data);
447436}
448437
449static CDP1802_INTERFACE( mpt02_config )
438static COSMAC_INTERFACE( mpt02_cosmac_intf )
450439{
451   studio2_mode_r,
452   mpt02_ef_r,
453   NULL,
440   DEVCB_LINE_VCC,
441   DEVCB_LINE(clear_r),
442   DEVCB_NULL,
443   DEVCB_NULL,
444   DEVCB_LINE(ef3_r),
445   DEVCB_LINE(ef4_r),
454446   DEVCB_LINE(studio2_q_w),
455447   DEVCB_NULL,
456   DEVCB_HANDLER(mpt02_dma_w)
448   DEVCB_DEVICE_HANDLER(CDP1864_TAG, mpt02_dma_w),
449   NULL,
450   DEVCB_NULL,
451   DEVCB_NULL
457452};
458453
459454/* Machine Initialization */
460455
461static TIMER_CALLBACK( set_cpu_mode )
456void studio2_state::machine_start()
462457{
463   studio2_state *state = machine->driver_data<studio2_state>();
464
465   state->cdp1802_mode = CDP1802_MODE_RUN;
458   // register for state saving
459   state_save_register_global(machine, m_keylatch);
466460}
467461
468static MACHINE_START( studio2 )
462void studio2_state::machine_reset()
469463{
470   studio2_state *state = machine->driver_data<studio2_state>();
471
472   /* find devices */
473   state->cdp1861 = machine->device(CDP1861_TAG);
474
475   /* register for state saving */
476   state_save_register_global(machine, state->cdp1802_mode);
477   state_save_register_global(machine, state->keylatch);
478   state_save_register_global(machine, state->cdp1861_efx);
464   if (m_vdc) m_vdc->reset();
465   if (m_cti) m_cti->reset();
479466}
480467
481static MACHINE_RESET( studio2 )
482{
483   studio2_state *state = machine->driver_data<studio2_state>();
484
485   /* reset CPU */
486   state->cdp1802_mode = CDP1802_MODE_RESET;
487   timer_set(machine, ATTOTIME_IN_MSEC(200), NULL, 0, set_cpu_mode);
488
489   /* reset CDP1861 */
490   state->cdp1861->reset();
491}
492
493static MACHINE_START( mpt02 )
494{
495   studio2_state *state = machine->driver_data<studio2_state>();
496
497   /* find devices */
498   state->cdp1864 = machine->device(CDP1864_TAG);
499
500   /* register for state saving */
501   state_save_register_global(machine, state->cdp1802_mode);
502   state_save_register_global(machine, state->keylatch);
503   state_save_register_global(machine, state->cdp1864_efx);
504}
505
506static MACHINE_RESET( mpt02 )
507{
508   studio2_state *state = machine->driver_data<studio2_state>();
509
510   /* reset CPU */
511   state->cdp1802_mode = CDP1802_MODE_RESET;
512   timer_set(machine, ATTOTIME_IN_MSEC(200), NULL, 0, set_cpu_mode);
513
514   /* reset CDP1864 */
515   state->cdp1864->reset();
516}
517
518468/* Machine Drivers */
519469
520470static MACHINE_CONFIG_FRAGMENT( studio2_cartslot )
r9387r9388
525475MACHINE_CONFIG_END
526476
527477static MACHINE_CONFIG_START( studio2, studio2_state )
528
529478   /* basic machine hardware */
530   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, 1760000) /* the real clock is derived from an oscillator circuit */
479   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, 1760000) /* the real clock is derived from an oscillator circuit */
531480   MDRV_CPU_PROGRAM_MAP(studio2_map)
532481   MDRV_CPU_IO_MAP(studio2_io_map)
533   MDRV_CPU_CONFIG(studio2_config)
482   MDRV_CPU_CONFIG(studio2_cosmac_intf)
534483
535   MDRV_MACHINE_START(studio2)
536   MDRV_MACHINE_RESET(studio2)
537
538484    /* video hardware */
539485   MDRV_CDP1861_SCREEN_ADD(SCREEN_TAG, 1760000)
540486
r9387r9388
553499MACHINE_CONFIG_END
554500
555501static MACHINE_CONFIG_START( visicom, studio2_state )
556
557502   /* basic machine hardware */
558   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_3_579545MHz/2)
503   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_3_579545MHz/2)
559504   MDRV_CPU_PROGRAM_MAP(visicom_map)
560505   MDRV_CPU_IO_MAP(visicom_io_map)
561   MDRV_CPU_CONFIG(studio2_config)
506   MDRV_CPU_CONFIG(studio2_cosmac_intf)
562507
563   MDRV_MACHINE_START(studio2)
564   MDRV_MACHINE_RESET(studio2)
565
566508    /* video hardware */
567509   MDRV_CDP1861_SCREEN_ADD(SCREEN_TAG, XTAL_3_579545MHz/2)
568510
r9387r9388
581523MACHINE_CONFIG_END
582524
583525static MACHINE_CONFIG_START( mpt02, studio2_state )
584
585526   /* basic machine hardware */
586   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, CDP1864_CLOCK)
527   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, CDP1864_CLOCK)
587528   MDRV_CPU_PROGRAM_MAP(mpt02_map)
588529   MDRV_CPU_IO_MAP(mpt02_io_map)
589   MDRV_CPU_CONFIG(mpt02_config)
530   MDRV_CPU_CONFIG(mpt02_cosmac_intf)
590531
591   MDRV_MACHINE_START(mpt02)
592   MDRV_MACHINE_RESET(mpt02)
593
594532    /* video hardware */
595533   MDRV_CDP1864_SCREEN_ADD(SCREEN_TAG, CDP1864_CLOCK)
596534
src/mess/drivers/tmc1800.c
r9387r9388
107107    - tape input/output
108108    - tmc2000: add missing keys
109109    - tmc2000: TOOL-2000 rom banking
110    - oscnano: correct time constant for EF4 RC circuit
110    - nano: correct time constant for EF4 RC circuit
111111
112112*/
113113
114114#include "emu.h"
115115#include "includes/tmc1800.h"
116#include "cpu/cdp1802/cdp1802.h"
116#include "cpu/cosmac/cosmac.h"
117117#include "video/cdp1861.h"
118118#include "sound/cdp1864.h"
119119#include "devices/cassette.h"
r9387r9388
135135
136136static MACHINE_RESET( tmc1800 );
137137static MACHINE_RESET( tmc2000 );
138static MACHINE_RESET( oscnano );
138static MACHINE_RESET( nano );
139139
140140/* Read/Write Handlers */
141141
r9387r9388
168168   state->keylatch = data & 0x3f;
169169}
170170
171static WRITE8_HANDLER( oscnano_keylatch_w )
171static WRITE8_HANDLER( nano_keylatch_w )
172172{
173173   /*
174174
r9387r9388
185185
186186    */
187187
188   oscnano_state *state = space->machine->driver_data<oscnano_state>();
188   nano_state *state = space->machine->driver_data<nano_state>();
189189
190190   state->keylatch = data & 0x0f;
191191}
r9387r9388
235235   cdp1864_tone_latch_w(device, 0, data);
236236}
237237
238static WRITE8_DEVICE_HANDLER( oscnano_bankswitch_w )
238static WRITE8_DEVICE_HANDLER( nano_bankswitch_w )
239239{
240240   /* enable RAM */
241241
r9387r9388
304304
305305// OSCOM Nano
306306
307static ADDRESS_MAP_START( oscnano_map, ADDRESS_SPACE_PROGRAM, 8 )
307static ADDRESS_MAP_START( nano_map, ADDRESS_SPACE_PROGRAM, 8 )
308308   AM_RANGE(0x0000, 0x7fff) AM_RAMBANK("bank1")
309309   AM_RANGE(0x8000, 0x83ff) AM_ROM
310310ADDRESS_MAP_END
311311
312static ADDRESS_MAP_START( oscnano_io_map, ADDRESS_SPACE_IO, 8 )
312static ADDRESS_MAP_START( nano_io_map, ADDRESS_SPACE_IO, 8 )
313313   AM_RANGE(0x01, 0x01) AM_DEVREADWRITE(CDP1864_TAG, cdp1864_dispon_r, cdp1864_step_bgcolor_w)
314   AM_RANGE(0x02, 0x02) AM_WRITE(oscnano_keylatch_w)
315   AM_RANGE(0x04, 0x04) AM_DEVREADWRITE(CDP1864_TAG, cdp1864_dispoff_r, oscnano_bankswitch_w)
314   AM_RANGE(0x02, 0x02) AM_WRITE(nano_keylatch_w)
315   AM_RANGE(0x04, 0x04) AM_DEVREADWRITE(CDP1864_TAG, cdp1864_dispoff_r, nano_bankswitch_w)
316316ADDRESS_MAP_END
317317
318318/* Input Ports */
r9387r9388
406406   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYBOARD )
407407INPUT_PORTS_END
408408
409static INPUT_PORTS_START( oscnano )
409static INPUT_CHANGED( run_pressed )
410{
411   if (oldval && !newval)
412   {
413      running_machine *machine = field->port->machine;
414      MACHINE_RESET_CALL(nano);
415   }
416}
417
418static INPUT_CHANGED( monitor_pressed )
419{
420   running_machine *machine = field->port->machine;
421   nano_state *state = machine->driver_data<nano_state>();
422
423   if (oldval && !newval)
424   {
425      MACHINE_RESET_CALL(nano);
426
427      cputag_set_input_line(machine, CDP1802_TAG, COSMAC_INPUT_LINE_EF4, CLEAR_LINE);
428   }
429   else if (!oldval && newval)
430   {
431      // TODO: what are the correct values?
432      int t = RES_K(27) * CAP_U(1) * 1000; // t = R26 * C1
433      timer_adjust_oneshot(state->ef4_timer, ATTOTIME_IN_MSEC(t), 0);
434   }
435}
436
437static INPUT_PORTS_START( nano )
410438   PORT_START("IN0")
411439   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_0) PORT_CODE(KEYCODE_0_PAD) PORT_CHAR('0')
412440   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_1) PORT_CODE(KEYCODE_1_PAD) PORT_CHAR('1')
r9387r9388
428456   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_CODE(KEYCODE_F) PORT_CHAR('F')
429457
430458   PORT_START("RUN")
431   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("RUN") PORT_CODE(KEYCODE_R)
459   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("RUN") PORT_CODE(KEYCODE_R) PORT_CHANGED(run_pressed, 0)
432460
433461   PORT_START("MONITOR")
434   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("MONITOR") PORT_CODE(KEYCODE_M)
462   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYPAD ) PORT_NAME("MONITOR") PORT_CODE(KEYCODE_M) PORT_CHANGED(monitor_pressed, 0)
435463INPUT_PORTS_END
436464
437465/* CDP1802 Interfaces */
438466
439467// Telmac 1800
440468
441static CDP1802_MODE_READ( tmc1800_mode_r )
469static READ_LINE_DEVICE_HANDLER( clear_r )
442470{
443   tmc1800_state *state = device->machine->driver_data<tmc1800_state>();
471   return BIT(input_port_read(device->machine, "RUN"), 0);
472}
444473
445   if (input_port_read(device->machine, "RUN") & 0x01)
446   {
447      if (state->reset)
448      {
449         running_machine *machine = device->machine;
450         MACHINE_RESET_CALL(tmc2000);
451
452         state->reset = 0;
453      }
454
455      return CDP1802_MODE_RUN;
456   }
457   else
458   {
459      state->reset = 1;
460
461      return CDP1802_MODE_RESET;
462   }
474static READ_LINE_DEVICE_HANDLER( ef2_r )
475{
476   return cassette_input(device) < 0;
463477}
464478
465static CDP1802_EF_READ( tmc1800_ef_r )
479static READ_LINE_DEVICE_HANDLER( ef3_r )
466480{
467481   tmc1800_state *state = device->machine->driver_data<tmc1800_state>();
468
469   UINT8 flags = 0x0f;
470482   static const char *const keynames[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" };
483   UINT8 data = ~input_port_read(device->machine, keynames[state->keylatch / 8]);
471484
472   /*
473        EF1     CDP1861
474        EF2     tape in
475        EF3     keyboard
476        EF4     ?
477    */
478
479   /* CDP1861 */
480   if (state->cdp1861_efx) flags -= EF1;
481
482   /* tape input */
483   if (cassette_input(state->cassette) < 0) flags -= EF2;
484
485   /* keyboard */
486   if (~input_port_read(device->machine, keynames[state->keylatch / 8]) & (1 << (state->keylatch % 8))) flags -= EF3;
487
488   return flags;
485   return BIT(data, state->keylatch % 8);
489486}
490487
491488static WRITE_LINE_DEVICE_HANDLER( tmc1800_q_w )
r9387r9388
496493   cassette_output(driver_state->cassette, state ? 1.0 : -1.0);
497494}
498495
499static CDP1802_INTERFACE( tmc1800_config )
496static COSMAC_INTERFACE( tmc1800_config )
500497{
501   tmc1800_mode_r,
502   tmc1800_ef_r,
503   NULL,
498   DEVCB_LINE_VCC,
499   DEVCB_LINE(clear_r),
500   DEVCB_NULL,
501   DEVCB_DEVICE_LINE(CASSETTE_TAG, ef2_r),
502   DEVCB_LINE(ef3_r),
503   DEVCB_NULL,
504504   DEVCB_LINE(tmc1800_q_w),
505505   DEVCB_NULL,
506   DEVCB_DEVICE_HANDLER(CDP1861_TAG, cdp1861_dma_w)
506   DEVCB_DEVICE_HANDLER(CDP1861_TAG, cdp1861_dma_w),
507   NULL,
508   DEVCB_NULL,
509   DEVCB_NULL
507510};
508511
509static CDP1802_INTERFACE( osc1000b_config )
512static COSMAC_INTERFACE( osc1000b_config )
510513{
511   tmc1800_mode_r,
512   tmc1800_ef_r,
513   NULL,
514   DEVCB_LINE_VCC,
515   DEVCB_LINE(clear_r),
516   DEVCB_NULL,
517   DEVCB_DEVICE_LINE(CASSETTE_TAG, ef2_r),
518   DEVCB_LINE(ef3_r),
519   DEVCB_NULL,
514520   DEVCB_LINE(tmc1800_q_w),
515521   DEVCB_NULL,
522   DEVCB_NULL,
523   NULL,
524   DEVCB_NULL,
516525   DEVCB_NULL
517526};
518527
519528// Telmac 2000
520529
521static CDP1802_MODE_READ( tmc2000_mode_r )
522{
523   tmc2000_state *state = device->machine->driver_data<tmc2000_state>();
524
525   if (input_port_read(device->machine, "RUN") & 0x01)
526   {
527      if (state->reset)
528      {
529         running_machine *machine = device->machine;
530         MACHINE_RESET_CALL(tmc2000);
531
532         state->reset = 0;
533      }
534
535      return CDP1802_MODE_RUN;
536   }
537   else
538   {
539      state->reset = 1;
540
541      return CDP1802_MODE_RESET;
542   }
543}
544
545static CDP1802_EF_READ( tmc2000_ef_r )
546{
547   tmc2000_state *state = device->machine->driver_data<tmc2000_state>();
548
549   int flags = 0x0f;
550   static const char *const keynames[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" };
551
552   /*
553        EF1     CDP1864
554        EF2     tape in
555        EF3     keyboard
556        EF4     ?
557    */
558
559   /* CDP1864 */
560   if (state->cdp1864_efx) flags -= EF1;
561
562   /* tape input */
563   if (cassette_input(state->cassette) < 0) flags -= EF2;
564
565   /* keyboard */
566   if (~input_port_read(device->machine, keynames[state->keylatch / 8]) & (1 << (state->keylatch % 8))) flags -= EF3;
567
568   return flags;
569}
570
571530static WRITE_LINE_DEVICE_HANDLER( tmc2000_q_w )
572531{
573532   tmc2000_state *driver_state = device->machine->driver_data<tmc2000_state>();
r9387r9388
592551   cdp1864_dma_w(state->cdp1864, offset, data);
593552}
594553
595static CDP1802_INTERFACE( tmc2000_config )
554static COSMAC_INTERFACE( tmc2000_config )
596555{
597   tmc2000_mode_r,
598   tmc2000_ef_r,
599   NULL,
556   DEVCB_LINE_VCC,
557   DEVCB_LINE(clear_r),
558   DEVCB_NULL,
559   DEVCB_DEVICE_LINE(CASSETTE_TAG, ef2_r),
560   DEVCB_LINE(ef3_r),
561   DEVCB_NULL,
600562   DEVCB_LINE(tmc2000_q_w),
601563   DEVCB_NULL,
602   DEVCB_HANDLER(tmc2000_dma_w)
564   DEVCB_HANDLER(tmc2000_dma_w),
565   NULL,
566   DEVCB_NULL,
567   DEVCB_NULL
603568};
604569
605570// OSCOM Nano
606571
607static TIMER_CALLBACK( oscnano_ef4_tick )
572static TIMER_CALLBACK( nano_ef4_tick )
608573{
609   oscnano_state *state = machine->driver_data<oscnano_state>();
610
611   /* assert EF4 */
612   state->monitor_ef4 = 1;
574   cputag_set_input_line(machine, CDP1802_TAG, COSMAC_INPUT_LINE_EF4, ASSERT_LINE);
613575}
614576
615static CDP1802_MODE_READ( oscnano_mode_r )
577static READ_LINE_DEVICE_HANDLER( nano_clear_r )
616578{
617   oscnano_state *state = device->machine->driver_data<oscnano_state>();
579   int run = BIT(input_port_read(device->machine, "RUN"), 0);
580   int monitor = BIT(input_port_read(device->machine, "MONITOR"), 0);
618581
619   int run = input_port_read(device->machine, "RUN") & 0x01;
620   int monitor = input_port_read(device->machine, "MONITOR") & 0x01;
621
622   if (run && monitor)
623   {
624      if (state->reset)
625      {
626         running_machine *machine = device->machine;
627         MACHINE_RESET_CALL(oscnano);
628
629         state->reset = 0;
630      }
631
632      return CDP1802_MODE_RUN;
633   }
634   else
635   {
636      state->reset = 1;
637
638      if (!monitor)
639      {
640         // TODO: what are the correct values?
641         int t = RES_K(27) * CAP_U(1) * 1000; // t = R26 * C1
642
643         /* clear EF4 */
644         state->monitor_ef4 = 0;
645
646         /* set EF4 timer */
647         timer_adjust_oneshot(state->ef4_timer, ATTOTIME_IN_MSEC(t), 0);
648      }
649
650      return CDP1802_MODE_RESET;
651   }
582   return run & monitor;
652583}
653584
654static CDP1802_EF_READ( oscnano_ef_r )
585static READ_LINE_DEVICE_HANDLER( nano_ef2_r )
655586{
656   oscnano_state *state = device->machine->driver_data<oscnano_state>();
587   return cassette_input(device) < 0;
588}
657589
590static READ_LINE_DEVICE_HANDLER( nano_ef3_r )
591{
592   nano_state *state = device->machine->driver_data<nano_state>();
658593   static const char *const keynames[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" };
594   UINT8 data = ~input_port_read(device->machine, keynames[state->keylatch / 8]);
659595
660   int flags = 0x0f;
661
662   /*
663        EF1     CDP1864
664        EF2     tape in
665        EF3     keyboard
666        EF4     monitor
667    */
668
669   /* CDP1864 */
670   if (state->cdp1864_efx) flags -= EF1;
671
672   /* tape input */
673   if (cassette_input(state->cassette) < 0) flags -= EF2;
674
675   /* keyboard */
676   if (~input_port_read(device->machine, keynames[state->keylatch / 8]) & (1 << (state->keylatch % 8))) flags -= EF3;
677
678   /* monitor */
679   if (state->monitor_ef4) flags -= EF4;
680
681   return flags;
596   return BIT(data, state->keylatch % 8);
682597}
683598
684static WRITE_LINE_DEVICE_HANDLER( oscnano_q_w )
599static WRITE_LINE_DEVICE_HANDLER( nano_q_w )
685600{
686   oscnano_state *driver_state = device->machine->driver_data<oscnano_state>();
601   nano_state *driver_state = device->machine->driver_data<nano_state>();
687602
688603   /* CDP1864 audio output enable */
689604   cdp1864_aoe_w(driver_state->cdp1864, state);
r9387r9388
695610   cassette_output(driver_state->cassette, state ? 1.0 : -1.0);
696611}
697612
698static CDP1802_INTERFACE( oscnano_config )
613static COSMAC_INTERFACE( nano_config )
699614{
700   oscnano_mode_r,
701   oscnano_ef_r,
615   DEVCB_LINE_VCC,
616   DEVCB_LINE(nano_clear_r),
617   DEVCB_NULL,
618   DEVCB_DEVICE_LINE(CASSETTE_TAG, nano_ef2_r),
619   DEVCB_LINE(nano_ef3_r),
620   DEVCB_NULL,
621   DEVCB_LINE(nano_q_w),
622   DEVCB_NULL,
623   DEVCB_DEVICE_HANDLER(CDP1864_TAG, cdp1864_dma_w),
702624   NULL,
703   DEVCB_LINE(oscnano_q_w),
704625   DEVCB_NULL,
705   DEVCB_DEVICE_HANDLER(CDP1864_TAG, cdp1864_dma_w)
626   DEVCB_NULL
706627};
707628
708629/* Machine Initialization */
r9387r9388
718639   state->cassette = machine->device(CASSETTE_TAG);
719640
720641   /* register for state saving */
721   state_save_register_global(machine, state->cdp1861_efx);
722642   state_save_register_global(machine, state->keylatch);
723   state_save_register_global(machine, state->reset);
724643}
725644
726645static MACHINE_RESET( tmc1800 )
r9387r9388
742661
743662   /* register for state saving */
744663   state_save_register_global(machine, state->keylatch);
745   state_save_register_global(machine, state->reset);
746664}
747665
748666static MACHINE_RESET( osc1000b )
r9387r9388
778696
779697   /* register for state saving */
780698   state_save_register_global_pointer(machine, state->colorram, TMC2000_COLORRAM_SIZE);
781   state_save_register_global(machine, state->cdp1864_efx);
782699   state_save_register_global(machine, state->keylatch);
783   state_save_register_global(machine, state->reset);
784700}
785701
786702static MACHINE_RESET( tmc2000 )
r9387r9388
803719
804720// OSCOM Nano
805721
806static MACHINE_START( oscnano )
722static MACHINE_START( nano )
807723{
808   oscnano_state *state = machine->driver_data<oscnano_state>();
724   nano_state *state = machine->driver_data<nano_state>();
809725
810726   /* RAM/ROM banking */
811727   memory_configure_bank(machine, "bank1", 0, 2, memory_region(machine, CDP1802_TAG), 0x8000);
812728
813729   /* allocate monitor timer */
814   state->ef4_timer = timer_alloc(machine, oscnano_ef4_tick, NULL);
730   state->ef4_timer = timer_alloc(machine, nano_ef4_tick, NULL);
815731
816   /* initialize variables */
817   state->monitor_ef4 = 1;
818
819732   /* find devices */
820733   state->cdp1864 = machine->device(CDP1864_TAG);
821734   state->cassette = machine->device(CASSETTE_TAG);
822735
823736   /* register for state saving */
824   state_save_register_global(machine, state->monitor_ef4);
825   state_save_register_global(machine, state->cdp1864_efx);
826737   state_save_register_global(machine, state->keylatch);
827   state_save_register_global(machine, state->reset);
828738}
829739
830static MACHINE_RESET( oscnano )
740static MACHINE_RESET( nano )
831741{
832   oscnano_state *state = machine->driver_data<oscnano_state>();
742   nano_state *state = machine->driver_data<nano_state>();
833743
744   /* assert EF4 */
745   cputag_set_input_line(machine, CDP1802_TAG, COSMAC_INPUT_LINE_EF4, ASSERT_LINE);
746
834747   /* reset CDP1864 */
835748   state->cdp1864->reset();
836749
r9387r9388
850763};
851764
852765static MACHINE_CONFIG_START( tmc1800, tmc1800_state )
853
854766   // basic system hardware
855   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_1_75MHz)
767   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_1_75MHz)
856768   MDRV_CPU_PROGRAM_MAP(tmc1800_map)
857769   MDRV_CPU_IO_MAP(tmc1800_io_map)
858770   MDRV_CPU_CONFIG(tmc1800_config)
r9387r9388
880792MACHINE_CONFIG_END
881793
882794static MACHINE_CONFIG_START( osc1000b, osc1000b_state )
883
884795   // basic system hardware
885   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_1_75MHz)
796   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_1_75MHz)
886797   MDRV_CPU_PROGRAM_MAP(osc1000b_map)
887798   MDRV_CPU_IO_MAP(osc1000b_io_map)
888799   MDRV_CPU_CONFIG(osc1000b_config)
r9387r9388
910821MACHINE_CONFIG_END
911822
912823static MACHINE_CONFIG_START( tmc2000, tmc2000_state )
913
914824   // basic system hardware
915   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_1_75MHz)
825   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_1_75MHz)
916826   MDRV_CPU_PROGRAM_MAP(tmc2000_map)
917827   MDRV_CPU_IO_MAP(tmc2000_io_map)
918828   MDRV_CPU_CONFIG(tmc2000_config)
r9387r9388
933843   MDRV_RAM_EXTRA_OPTIONS("16K,32K")
934844MACHINE_CONFIG_END
935845
936static MACHINE_CONFIG_START( oscnano, oscnano_state )
937
846static MACHINE_CONFIG_START( nano, nano_state )
938847   // basic system hardware
939   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_1_75MHz)
940   MDRV_CPU_PROGRAM_MAP(oscnano_map)
941   MDRV_CPU_IO_MAP(oscnano_io_map)
942   MDRV_CPU_CONFIG(oscnano_config)
848   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_1_75MHz)
849   MDRV_CPU_PROGRAM_MAP(nano_map)
850   MDRV_CPU_IO_MAP(nano_io_map)
851   MDRV_CPU_CONFIG(nano_config)
943852
944   MDRV_MACHINE_START(oscnano)
945   MDRV_MACHINE_RESET(oscnano)
853   MDRV_MACHINE_START(nano)
854   MDRV_MACHINE_RESET(nano)
946855
947856   // video hardware
948   MDRV_FRAGMENT_ADD(oscnano_video)
857   MDRV_FRAGMENT_ADD(nano_video)
949858
950859   // devices
951860   MDRV_QUICKLOAD_ADD("quickload", tmc1800, "bin", 0)
r9387r9388
1024933COMP( 1977, tmc1800,    0,      0,      tmc1800,    tmc1800,    tmc1800,   "Telercas Oy",   "Telmac 1800",  GAME_NOT_WORKING )
1025934COMP( 1977, osc1000b,   tmc1800,0,      osc1000b,   tmc1800,    tmc1800,    "OSCOM Oy",      "OSCOM 1000B",  GAME_NOT_WORKING )
1026935COMP( 1980, tmc2000,    0,      0,      tmc2000,    tmc2000,    0,          "Telercas Oy",  "Telmac 2000",  GAME_SUPPORTS_SAVE )
1027COMP( 1980, nano,      tmc2000,0,      oscnano,   oscnano,   0,         "OSCOM Oy",      "OSCOM Nano",   GAME_SUPPORTS_SAVE )
936COMP( 1980, nano,      tmc2000,0,      nano,      nano,   0,         "OSCOM Oy",      "OSCOM Nano",   GAME_SUPPORTS_SAVE )
src/mess/drivers/comx35.c
r9387r9388
1010
1111*/
1212
13#define ADDRESS_MAP_MODERN
14
1315#include "emu.h"
1416#include "includes/comx35.h"
15#include "cpu/cdp1802/cdp1802.h"
17#include "cpu/cosmac/cosmac.h"
1618#include "sound/cdp1869.h"
1719#include "sound/wave.h"
1820#include "devices/flopdrv.h"
r9387r9388
2830
2931/* Memory Maps */
3032
31static ADDRESS_MAP_START( comx35_map, ADDRESS_SPACE_PROGRAM, 8 )
33static ADDRESS_MAP_START( comx35_map, ADDRESS_SPACE_PROGRAM, 8, comx35_state )
3234   ADDRESS_MAP_UNMAP_HIGH
3335   AM_RANGE(0x0000, 0x3fff) AM_ROM
3436   AM_RANGE(0x1000, 0x17ff) AM_ROMBANK("bank2")
r9387r9388
3638   AM_RANGE(0x4000, 0xbfff) AM_RAM
3739   AM_RANGE(0xc000, 0xdfff) AM_RAMBANK("bank1")
3840   AM_RANGE(0xe000, 0xefff) AM_ROMBANK("bank3")
39   AM_RANGE(0xf400, 0xf7ff) AM_DEVREADWRITE(CDP1869_TAG, cdp1869_charram_r, cdp1869_charram_w)
40   AM_RANGE(0xf800, 0xffff) AM_DEVREADWRITE(CDP1869_TAG, cdp1869_pageram_r, cdp1869_pageram_w)
41   AM_RANGE(0xf400, 0xf7ff) AM_DEVREADWRITE_LEGACY(CDP1869_TAG, cdp1869_charram_r, cdp1869_charram_w)
42   AM_RANGE(0xf800, 0xffff) AM_DEVREADWRITE_LEGACY(CDP1869_TAG, cdp1869_pageram_r, cdp1869_pageram_w)
4143ADDRESS_MAP_END
4244
43static ADDRESS_MAP_START( comx35_io_map, ADDRESS_SPACE_IO, 8 )
45static ADDRESS_MAP_START( comx35_io_map, ADDRESS_SPACE_IO, 8, comx35_state )
4446   ADDRESS_MAP_UNMAP_HIGH
45   AM_RANGE(0x01, 0x01) AM_WRITE(comx35_bank_select_w)
46   AM_RANGE(0x02, 0x02) AM_READWRITE(comx35_io_r, comx35_io_w)
47   AM_RANGE(0x03, 0x03) AM_DEVREAD(CDP1871_TAG, cdp1871_data_r) AM_DEVWRITE(CDP1869_TAG, cdp1869_out3_w)
48   AM_RANGE(0x04, 0x04) AM_READ(comx35_io2_r) AM_DEVWRITE(CDP1869_TAG, cdp1869_out4_w)
49   AM_RANGE(0x05, 0x05) AM_DEVWRITE(CDP1869_TAG, cdp1869_out5_w)
50   AM_RANGE(0x06, 0x06) AM_DEVWRITE(CDP1869_TAG, cdp1869_out6_w)
51   AM_RANGE(0x07, 0x07) AM_DEVWRITE(CDP1869_TAG, cdp1869_out7_w)
47   AM_RANGE(0x01, 0x01) AM_WRITE(bank_select_w)
48   AM_RANGE(0x02, 0x02) AM_READWRITE(io_r, io_w)
49   AM_RANGE(0x03, 0x03) AM_DEVREAD_LEGACY(CDP1871_TAG, cdp1871_data_r) AM_DEVWRITE_LEGACY(CDP1869_TAG, cdp1869_out3_w)
50   AM_RANGE(0x04, 0x04) AM_READ(io2_r) AM_DEVWRITE_LEGACY(CDP1869_TAG, cdp1869_out4_w)
51   AM_RANGE(0x05, 0x05) AM_DEVWRITE_LEGACY(CDP1869_TAG, cdp1869_out5_w)
52   AM_RANGE(0x06, 0x06) AM_DEVWRITE_LEGACY(CDP1869_TAG, cdp1869_out6_w)
53   AM_RANGE(0x07, 0x07) AM_DEVWRITE_LEGACY(CDP1869_TAG, cdp1869_out7_w)
5254ADDRESS_MAP_END
5355
5456/* Input Ports */
r9387r9388
201203
202204/* CDP1802 Interface */
203205
204static CDP1802_MODE_READ( comx35_mode_r )
206static READ_LINE_DEVICE_HANDLER( clear_r )
205207{
206208   comx35_state *state = device->machine->driver_data<comx35_state>();
207209
208   return (cdp1802_control_mode)state->cdp1802_mode;
210   return state->m_reset;
209211}
210212
211static CDP1802_EF_READ( comx35_ef_r )
213static READ_LINE_DEVICE_HANDLER( ef2_r )
212214{
213215   comx35_state *state = device->machine->driver_data<comx35_state>();
214216
215   int flags = 0x0f;
216
217   /*
218        EF1     predis
219        EF2     on power up: 1=PAL/0=NTSC, after toggle Q: _EFXB
220        EF3     _EFXA
221        EF4     cassette in (ear)
222    */
223
224   // CDP1869 predisplay
225   if (!state->cdp1869_prd) flags -= EF1;
226
227   if (state->iden)
217   if (state->m_iden)
228218   {
229219      // interrupts disabled: PAL/NTSC
230      if (!state->pal_ntsc) flags -= EF2;
220      return cdp1869_pal_ntsc_r(state->m_vis);
231221   }
232222   else
233223   {
234224      // interrupts enabled: keyboard repeat
235      if (!state->cdp1871_efxb) flags -= EF2;
225      return cdp1871_rpt_r(state->m_kbe);
236226   }
227}
237228
238   // keyboard data available
239   if (!state->cdp1871_efxa) flags -= EF3;
229static READ_LINE_DEVICE_HANDLER( ef4_r )
230{
231   comx35_state *state = device->machine->driver_data<comx35_state>();
240232
241   // cassette input, expansion device flag
242   if ((state->cassette && (cassette_input(state->cassette) < +0.0)) || !state->cdp1802_ef4) flags -= EF4;
243
244   return flags;
233   return (cassette_input(device) < 0) | state->m_cdp1802_ef4;
245234}
246235
247static CDP1802_SC_WRITE( comx35_sc_w )
236static COSMAC_SC_WRITE( comx35_sc_w )
248237{
249   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
238   comx35_state *state = device->machine->driver_data<comx35_state>();
250239
251   switch (state)
240   switch (sc)
252241   {
253   case CDP1802_STATE_CODE_S0_FETCH:
242   case COSMAC_STATE_CODE_S0_FETCH:
254243      // not connected
255244      break;
256245
257   case CDP1802_STATE_CODE_S1_EXECUTE:
246   case COSMAC_STATE_CODE_S1_EXECUTE:
258247      // every other S1 triggers a DMAOUT request
259      if (driver_state->dma)
248      if (state->m_dma)
260249      {
261         driver_state->dma = 0;
250         state->m_dma = 0;
262251
263         if (!driver_state->iden)
252         if (!state->m_iden)
264253         {
265            cputag_set_input_line(device->machine, CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT, HOLD_LINE);
254            cpu_set_input_line(device, COSMAC_INPUT_LINE_DMAOUT, ASSERT_LINE);
266255         }
267256      }
268257      else
269258      {
270         driver_state->dma = 1;
259         state->m_dma = 1;
271260      }
272261      break;
273262
274   case CDP1802_STATE_CODE_S2_DMA:
263   case COSMAC_STATE_CODE_S2_DMA:
275264      // DMA acknowledge clears the DMAOUT request
276      cputag_set_input_line(device->machine, CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT, CLEAR_LINE);
265      cpu_set_input_line(device, COSMAC_INPUT_LINE_DMAOUT, CLEAR_LINE);
277266      break;
278267
279   case CDP1802_STATE_CODE_S3_INTERRUPT:
268   case COSMAC_STATE_CODE_S3_INTERRUPT:
280269      // interrupt acknowledge clears the INT request
281      cputag_set_input_line(device->machine, CDP1802_TAG, CDP1802_INPUT_LINE_INT, CLEAR_LINE);
270      cpu_set_input_line(device, COSMAC_INPUT_LINE_INT, CLEAR_LINE);
282271      break;
283272   }
284273}
r9387r9388
287276{
288277   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
289278
290   driver_state->cdp1802_q = state;
279   driver_state->m_cdp1802_q = state;
291280
292   if (driver_state->iden && state)
281   if (driver_state->m_iden && state)
293282   {
294283      // enable interrupts
295      driver_state->iden = 0;
284      driver_state->m_iden = 0;
296285   }
297286
298287   // cassette output
299   if (driver_state->cassette) cassette_output(driver_state->cassette, state ? +1.0 : -1.0);
288   cassette_output(driver_state->m_cassette, state ? +1.0 : -1.0);
300289}
301290
302static CDP1802_INTERFACE( comx35_cdp1802_config )
291static COSMAC_INTERFACE( cosmac_intf )
303292{
304   comx35_mode_r,
305   comx35_ef_r,
306   comx35_sc_w,
307   DEVCB_LINE(comx35_q_w),
308   DEVCB_NULL,
309   DEVCB_NULL
293   DEVCB_LINE_VCC,                        // wait
294   DEVCB_LINE(clear_r),                  // clear
295   DEVCB_NULL,                           // EF1
296   DEVCB_LINE(ef2_r),                     // EF2
297   DEVCB_NULL,                           // EF3
298   DEVCB_DEVICE_LINE(CASSETTE_TAG, ef4_r),      // EF4
299   DEVCB_LINE(comx35_q_w),                  // Q
300   DEVCB_NULL,                           // DMA in
301   DEVCB_NULL,                           // DMA out
302   comx35_sc_w,                        // SC
303   DEVCB_NULL,                           // TPA
304   DEVCB_NULL                           // TPB
310305};
311306
312307/* CDP1871 Interface */
313308
314static WRITE_LINE_DEVICE_HANDLER( comx35_da_w )
315{
316   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
317
318   driver_state->cdp1871_efxa = state;
319}
320
321static WRITE_LINE_DEVICE_HANDLER( comx35_rpt_w )
322{
323   comx35_state *driver_state = device->machine->driver_data<comx35_state>();
324
325   driver_state->cdp1871_efxb = state;
326}
327
328309static READ_LINE_DEVICE_HANDLER( comx35_shift_r )
329310{
330311   return BIT(input_port_read(device->machine, "MODIFIERS"), 0);
r9387r9388
351332   DEVCB_LINE(comx35_shift_r),
352333   DEVCB_LINE(comx35_control_r),
353334   DEVCB_NULL,
354   DEVCB_LINE(comx35_da_w),
355   DEVCB_LINE(comx35_rpt_w)
335   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF3),
336   DEVCB_NULL // polled
356337};
357338
358339/* Machine Drivers */
r9387r9388
377358   NULL
378359};
379360
380/* F4 Character Displayer */
381static const gfx_layout comx35_charlayout =
382{
383   8, 8,               /* 8 x 8 characters */
384   256,               /* 256 characters */
385   1,               /* 1 bits per pixel */
386   { 0 },               /* no bitplanes */
387   /* x offsets */
388   { 0, 1, 2, 3, 4, 5, 6, 7 },
389   /* y offsets */
390   { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
391   8*8               /* every char takes 8 bytes */
392};
393
394static GFXDECODE_START( comx35 )
395   GFXDECODE_ENTRY( "chargen", 0x0000, comx35_charlayout, 0, 36 )
396GFXDECODE_END
397
398
399static MACHINE_CONFIG_START( comx35_pal, comx35_state )
400
361static MACHINE_CONFIG_START( pal, comx35_state )
401362   /* basic system hardware */
402   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, CDP1869_CPU_CLK_PAL)
363   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, CDP1869_CPU_CLK_PAL)
403364   MDRV_CPU_PROGRAM_MAP(comx35_map)
404365   MDRV_CPU_IO_MAP(comx35_io_map)
405   MDRV_CPU_CONFIG(comx35_cdp1802_config)
366   MDRV_CPU_CONFIG(cosmac_intf)
406367
407   MDRV_MACHINE_START(comx35p)
408   MDRV_MACHINE_RESET(comx35)
409
410368   /* sound and video hardware */
411369   MDRV_FRAGMENT_ADD(comx35_pal_video)
412   MDRV_GFXDECODE(comx35)
413370
414371   /* peripheral hardware */
415372   MDRV_CDP1871_ADD(CDP1871_TAG, comx35_cdp1871_intf, CDP1869_CPU_CLK_PAL / 8)
r9387r9388
425382   MDRV_RAM_DEFAULT_SIZE("32K")
426383MACHINE_CONFIG_END
427384
428static MACHINE_CONFIG_START( comx35_ntsc, comx35_state )
429
385static MACHINE_CONFIG_START( ntsc, comx35_state )
430386   /* basic system hardware */
431   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, CDP1869_CPU_CLK_NTSC)
387   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, CDP1869_CPU_CLK_NTSC)
432388   MDRV_CPU_PROGRAM_MAP(comx35_map)
433389   MDRV_CPU_IO_MAP(comx35_io_map)
434   MDRV_CPU_CONFIG(comx35_cdp1802_config)
390   MDRV_CPU_CONFIG(cosmac_intf)
435391
436   MDRV_MACHINE_START(comx35n)
437   MDRV_MACHINE_RESET(comx35)
438
439392   /* sound and video hardware */
440393   MDRV_FRAGMENT_ADD(comx35_ntsc_video)
441   MDRV_GFXDECODE(comx35)
442394
443395   /* peripheral hardware */
444396   MDRV_CDP1871_ADD(CDP1871_TAG, comx35_cdp1871_intf, CDP1869_CPU_CLK_NTSC / 8)
r9387r9388
498450/* System Drivers */
499451
500452//    YEAR  NAME        PARENT  COMPAT  MACHINE     INPUT     INIT  COMPANY                       FULLNAME            FLAGS
501COMP( 1983, comx35p,   0,      0,      comx35_pal,   comx35,   0,   "Comx World Operations Ltd",   "COMX 35 (PAL)",   GAME_IMPERFECT_SOUND )
502COMP( 1983, comx35n,   comx35p,0,      comx35_ntsc,comx35,   0,   "Comx World Operations Ltd",   "COMX 35 (NTSC)",   GAME_IMPERFECT_SOUND )
453COMP( 1983, comx35p,   0,      0,      pal,      comx35,   0,   "Comx World Operations Ltd",   "COMX 35 (PAL)",   GAME_IMPERFECT_SOUND )
454COMP( 1983, comx35n,   comx35p,0,      ntsc,      comx35,   0,   "Comx World Operations Ltd",   "COMX 35 (NTSC)",   GAME_IMPERFECT_SOUND )
src/mess/drivers/tmc2000e.c
r9387r9388
3131
3232#include "emu.h"
3333#include "includes/tmc2000e.h"
34#include "cpu/cdp1802/cdp1802.h"
34#include "cpu/cosmac/cosmac.h"
3535#include "devices/printer.h"
3636#include "devices/flopdrv.h"
3737#include "formats/basicdsk.h"
r9387r9388
147147   return BIT(state->color, 0);
148148}
149149
150static WRITE_LINE_DEVICE_HANDLER( tmc2000e_efx_w )
151{
152   tmc2000e_state *driver_state = device->machine->driver_data<tmc2000e_state>();
153
154   driver_state->cdp1864_efx = state;
155}
156
157150static CDP1864_INTERFACE( tmc2000e_cdp1864_intf )
158151{
159152   CDP1802_TAG,
r9387r9388
162155   DEVCB_LINE(rdata_r),
163156   DEVCB_LINE(bdata_r),
164157   DEVCB_LINE(gdata_r),
165   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_INT),
166   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, CDP1802_INPUT_LINE_DMAOUT),
167   DEVCB_LINE(tmc2000e_efx_w),
158   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_INT),
159   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_DMAOUT),
160   DEVCB_CPU_INPUT_LINE(CDP1802_TAG, COSMAC_INPUT_LINE_EF1),
168161   RES_K(2.2),   // unverified
169162   RES_K(1),   // unverified
170163   RES_K(5.1),   // unverified
r9387r9388
182175
183176/* CDP1802 Interface */
184177
185static CDP1802_MODE_READ( tmc2000e_mode_r )
178static READ_LINE_DEVICE_HANDLER( clear_r )
186179{
187   if (input_port_read(device->machine, "RUN") & 0x01)
188   {
189      return CDP1802_MODE_RUN;
190   }
191   else
192   {
193      return CDP1802_MODE_RESET;
194   }
180   return BIT(input_port_read(device->machine, "RUN"), 0);
195181}
196182
197static CDP1802_EF_READ( tmc2000e_ef_r )
183static READ_LINE_DEVICE_HANDLER( ef2_r )
198184{
199   tmc2000e_state *state = device->machine->driver_data<tmc2000e_state>();
185   return cassette_input(device) < 0;
186}
200187
201   UINT8 flags = 0x0f;
188static READ_LINE_DEVICE_HANDLER( ef3_r )
189{
190   tmc2000e_state *state = device->machine->driver_data<tmc2000e_state>();
202191   static const char *const keynames[] = { "IN0", "IN1", "IN2", "IN3", "IN4", "IN5", "IN6", "IN7" };
192   UINT8 data = ~input_port_read(device->machine, keynames[state->keylatch / 8]);
203193
204   /*
205        EF1     CDP1864
206        EF2     tape in/floppy
207        EF3     keyboard
208        EF4     I/O port
209    */
210
211   // CDP1864
212
213   if (!state->cdp1864_efx) flags -= EF1;
214
215   // tape in
216
217   if (cassette_input(state->cassette) > +1.0) flags -= EF2;
218
219   // keyboard
220
221   if (~input_port_read(device->machine, keynames[state->keylatch / 8]) & (1 << (state->keylatch % 8))) flags -= EF3;
222
223   return flags;
194   return BIT(data, state->keylatch % 8);
224195}
225196
226197static WRITE_LINE_DEVICE_HANDLER( tmc2000e_q_w )
r9387r9388
252223   cdp1864_dma_w(state->cdp1864, offset, data);
253224}
254225
255static CDP1802_INTERFACE( tmc2000e_config )
226static COSMAC_INTERFACE( tmc2000e_config )
256227{
257   tmc2000e_mode_r,
258   tmc2000e_ef_r,
259   NULL,
228   DEVCB_LINE_VCC,
229   DEVCB_LINE(clear_r),
230   DEVCB_NULL,
231   DEVCB_DEVICE_LINE(CASSETTE_TAG, ef2_r),
232   DEVCB_LINE(ef3_r),
233   DEVCB_NULL,
260234   DEVCB_LINE(tmc2000e_q_w),
261235   DEVCB_NULL,
262   DEVCB_HANDLER(tmc2000e_dma_w)
236   DEVCB_HANDLER(tmc2000e_dma_w),
237   NULL,
238   DEVCB_NULL,
239   DEVCB_NULL
263240};
264241
265242/* Machine Initialization */
r9387r9388
287264
288265   state->cdp1864->reset();
289266
290   cputag_set_input_line(machine, CDP1802_TAG, INPUT_LINE_RESET, PULSE_LINE);
291
292267   // reset program counter to 0xc000
293268}
294269
r9387r9388
301276   (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_MUTED),
302277   NULL
303278};
304static FLOPPY_OPTIONS_START(tmc2000e)
305   // dsk
306FLOPPY_OPTIONS_END
307279
308280static const floppy_config tmc2000e_floppy_config =
309281{
r9387r9388
312284   DEVCB_NULL,
313285   DEVCB_NULL,
314286   DEVCB_NULL,
315   FLOPPY_STANDARD_5_25_DSHD,
316   FLOPPY_OPTIONS_NAME(tmc2000e),
287   FLOPPY_STANDARD_5_25_DSDD,
288   FLOPPY_OPTIONS_NAME(default),
317289   NULL
318290};
319291
320292static MACHINE_CONFIG_START( tmc2000e, tmc2000e_state )
321
322293   // basic system hardware
323   MDRV_CPU_ADD(CDP1802_TAG, CDP1802, XTAL_1_75MHz)
294   MDRV_CPU_ADD(CDP1802_TAG, COSMAC, XTAL_1_75MHz)
324295   MDRV_CPU_PROGRAM_MAP(tmc2000e_map)
325296   MDRV_CPU_IO_MAP(tmc2000e_io_map)
326297   MDRV_CPU_CONFIG(tmc2000e_config)
r9387r9388
343314   MDRV_PRINTER_ADD("printer")
344315   MDRV_CASSETTE_ADD("cassette", tmc2000_cassette_config)
345316
346   MDRV_FLOPPY_4_DRIVES_ADD(tmc2000e_floppy_config)
317   MDRV_FLOPPY_2_DRIVES_ADD(tmc2000e_floppy_config)
347318
348319   /* internal ram */
349320   MDRV_RAM_ADD("messram")
src/mess/drivers/pecom.c
r9387r9388
77****************************************************************************/
88
99#include "emu.h"
10#include "cpu/cdp1802/cdp1802.h"
10#include "cpu/cosmac/cosmac.h"
1111#include "sound/cdp1869.h"
1212#include "sound/wave.h"
1313#include "devices/cassette.h"
r9387r9388
175175static MACHINE_CONFIG_START( pecom64, pecom_state )
176176
177177    /* basic machine hardware */
178   MDRV_CPU_ADD("maincpu", CDP1802, CDP1869_DOT_CLK_PAL/3)
178   MDRV_CPU_ADD("maincpu", COSMAC, CDP1869_DOT_CLK_PAL/3)
179179   MDRV_CPU_PROGRAM_MAP(pecom64_mem)
180180   MDRV_CPU_IO_MAP(pecom64_io)
181181   MDRV_CPU_CONFIG(pecom64_cdp1802_config)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team