Previous 199869 Revisions Next

r21305 Friday 22nd February, 2013 at 10:45:32 UTC by Miodrag Milanović
removed some not used folders/files (nw)
[src/emu]audio
[src/mess]messcore.mak
[src/mess/drivers]pet.c
[src/mess/includes]pet.h
[src/mess/machine]pet.c
[src/mess/video]pet.c

trunk/src/mess/machine/pet.c
r21304r21305
1/***************************************************************************
2    commodore pet series computer
3
4    peter.trauner@jk.uni-linz.ac.at
5***************************************************************************/
6
7#include "emu.h"
8#include "cpu/m6502/m6502.h"
9#include "cpu/m6809/m6809.h"
10
11#include "machine/6821pia.h"
12#include "machine/6522via.h"
13#include "machine/ieee488.h"
14
15#include "includes/pet.h"
16
17#include "imagedev/cartslot.h"
18#include "machine/ram.h"
19
20#define VERBOSE_LEVEL 0
21#define DBG_LOG( MACHINE, N, M, A ) \
22   do { \
23      if(VERBOSE_LEVEL >= N) \
24      { \
25         if( M ) \
26            logerror("%11.6f: %-24s", MACHINE.time().as_double(), (char*) M ); \
27         logerror A; \
28      } \
29   } while (0)
30
31
32
33/* pia at 0xe810
34   port a
35    7 sense input (low for diagnostics)
36    6 ieee eoi in
37    5 cassette 2 switch in
38    4 cassette 1 switch in
39    3..0 keyboard line select
40
41  ca1 cassette 1 read
42  ca2 ieee eoi out
43
44  cb1 video sync in
45  cb2 cassette 1 motor out
46*/
47READ8_MEMBER(pet_state::pia0_pa_r)
48{
49   /*
50
51       bit     description
52
53       PA0     KEY A
54       PA1     KEY B
55       PA2     KEY C
56       PA3     KEY D
57       PA4     #1 CASS SWITCH
58       PA5     #2 CASS SWITCH
59       PA6     _EOI IN
60       PA7     DIAG JUMPER
61
62   */
63
64   UINT8 data = 0;
65
66   /* key */
67   data |= m_keyline_select;
68
69   /* #1 cassette switch */
70   data |= m_cassette->sense_r() << 4;
71
72   /* #2 cassette switch */
73   data |= m_cassette2->sense_r() << 5;
74
75   /* end or identify in */
76   data |= m_ieee->eoi_r() << 6;
77
78   /* diagnostic jumper */
79   data |= 0x80;
80
81   return data;
82}
83
84WRITE8_MEMBER(pet_state::pia0_pa_w)
85{
86   /*
87
88       bit     description
89
90       PA0     KEY A
91       PA1     KEY B
92       PA2     KEY C
93       PA3     KEY D
94       PA4     #1 CASS SWITCH
95       PA5     #2 CASS SWITCH
96       PA6     _EOI IN
97       PA7     DIAG JUMPER
98
99   */
100
101   /* key */
102   m_keyline_select = data & 0x0f;
103}
104
105/* Keyboard reading/handling for regular keyboard */
106READ8_MEMBER(pet_state::kin_r)
107{
108   /*
109
110       bit     description
111
112       PB0     KIN0
113       PB1     KIN1
114       PB2     KIN2
115       PB3     KIN3
116       PB4     KIN4
117       PB5     KIN5
118       PB6     KIN6
119       PB7     KIN7
120
121   */
122
123   UINT8 data = 0xff;
124   static const char *const keynames[] = {
125      "ROW0", "ROW1", "ROW2", "ROW3", "ROW4",
126      "ROW5", "ROW6", "ROW7", "ROW8", "ROW9"
127   };
128
129   if (m_keyline_select < 10)
130   {
131      data = machine().root_device().ioport(keynames[m_keyline_select])->read();
132      /* Check for left-shift lock */
133      if ((m_keyline_select == 8) && (machine().root_device().ioport("SPECIAL")->read() & 0x80))
134         data &= 0xfe;
135   }
136   return data;
137}
138
139/* Keyboard handling for business keyboard */
140READ8_MEMBER(pet_state::petb_kin_r)
141{
142   UINT8 data = 0xff;
143   static const char *const keynames[] = {
144      "ROW0", "ROW1", "ROW2", "ROW3", "ROW4",
145      "ROW5", "ROW6", "ROW7", "ROW8", "ROW9"
146   };
147
148   if (m_keyline_select < 10)
149   {
150      data = machine().root_device().ioport(keynames[m_keyline_select])->read();
151      /* Check for left-shift lock */
152      /* 2008-05 FP: For some reason, superpet read it in the opposite way!! */
153      /* While waiting for confirmation from docs, we add a workaround here. */
154      if (m_superpet)
155      {
156         if ((m_keyline_select == 6) && !(machine().root_device().ioport("SPECIAL")->read() & 0x80))
157            data &= 0xfe;
158      }
159      else
160      {
161         if ((m_keyline_select == 6) && (machine().root_device().ioport("SPECIAL")->read() & 0x80))
162            data &= 0xfe;
163      }
164   }
165   return data;
166}
167
168READ8_MEMBER(pet_state::cass1_r)
169{
170   // cassette 1 read
171   return m_cassette->read();
172}
173
174WRITE8_MEMBER(pet_state::cass1_motor_w)
175{
176   m_cassette->motor_w(data);
177}
178
179WRITE_LINE_MEMBER(pet_state::pia0_irq_w)
180{
181   m_pia0_irq = state;
182   int level = (m_pia0_irq | m_pia1_irq | m_via_irq) ? ASSERT_LINE : CLEAR_LINE;
183
184   machine().firstcpu->set_input_line(INPUT_LINE_IRQ0, level);
185}
186
187const pia6821_interface pet_pia0 =
188{
189   DEVCB_DRIVER_MEMBER(pet_state,pia0_pa_r),       /* in_a_func */
190   DEVCB_DRIVER_MEMBER(pet_state,kin_r),           /* in_b_func */
191   DEVCB_DRIVER_MEMBER(pet_state,cass1_r),         /* in_ca1_func */
192   DEVCB_NULL,                     /* in_cb1_func */
193   DEVCB_NULL,                     /* in_ca2_func */
194   DEVCB_NULL,                     /* in_cb2_func */
195   DEVCB_DRIVER_MEMBER(pet_state,pia0_pa_w),       /* out_a_func */
196   DEVCB_NULL,                     /* out_b_func */
197   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, eoi_w),           /* out_ca2_func */
198   DEVCB_DRIVER_MEMBER(pet_state,cass1_motor_w),   /* out_cb2_func */
199   DEVCB_DRIVER_LINE_MEMBER(pet_state,pia0_irq_w),         /* irq_a_func */
200   DEVCB_DRIVER_LINE_MEMBER(pet_state,pia0_irq_w)          /* irq_b_func */
201};
202
203const pia6821_interface petb_pia0 =
204{
205   DEVCB_DRIVER_MEMBER(pet_state,pia0_pa_r),       /* in_a_func */
206   DEVCB_DRIVER_MEMBER(pet_state,petb_kin_r),      /* in_b_func */
207   DEVCB_DRIVER_MEMBER(pet_state,cass1_r),         /* in_ca1_func */
208   DEVCB_NULL,                     /* in_cb1_func */
209   DEVCB_NULL,                     /* in_ca2_func */
210   DEVCB_NULL,                     /* in_cb2_func */
211   DEVCB_DRIVER_MEMBER(pet_state,pia0_pa_w),       /* out_a_func */
212   DEVCB_NULL,                     /* out_b_func */
213   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, eoi_w),           /* out_ca2_func */
214   DEVCB_DRIVER_MEMBER(pet_state,cass1_motor_w),   /* out_cb2_func */
215   DEVCB_DRIVER_LINE_MEMBER(pet_state,pia0_irq_w),         /* irq_a_func */
216   DEVCB_DRIVER_LINE_MEMBER(pet_state,pia0_irq_w)          /* irq_b_func */
217};
218
219/* pia at 0xe820 (ieee488)
220   port a data in
221   port b data out
222  ca1 atn in
223  ca2 ndac out
224  cb1 srq in
225  cb2 dav out
226 */
227
228WRITE_LINE_MEMBER(pet_state::pia1_irq_w)
229{
230   m_pia1_irq = state;
231   int level = (m_pia0_irq || m_pia1_irq || m_via_irq) ? ASSERT_LINE : CLEAR_LINE;
232
233   machine().firstcpu->set_input_line(INPUT_LINE_IRQ0, level);
234}
235
236const pia6821_interface pet_pia1 =
237{
238   DEVCB_DEVICE_MEMBER(IEEE488_TAG, ieee488_device, dio_r),/* in_a_func */
239   DEVCB_NULL,                             /* in_b_func */
240   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, atn_r),   /* in_ca1_func */
241   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, srq_r),   /* in_cb1_func */
242   DEVCB_NULL,                             /* in_ca2_func */
243   DEVCB_NULL,                             /* in_cb2_func */
244   DEVCB_NULL,                             /* out_a_func */
245   DEVCB_DEVICE_MEMBER(IEEE488_TAG, ieee488_device, dio_w),                    /* out_b_func */
246   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, ndac_w),                  /* out_ca2_func */
247   DEVCB_DEVICE_LINE_MEMBER(IEEE488_TAG, ieee488_device, dav_w),                   /* out_cb2_func */
248   DEVCB_DRIVER_LINE_MEMBER(pet_state,pia1_irq_w),                 /* irq_a_func */
249   DEVCB_DRIVER_LINE_MEMBER(pet_state,pia1_irq_w)                  /* irq_b_func */
250};
251
252/* userport, cassettes, rest ieee488
253   ca1 userport
254   ca2 character rom address line 11
255   pa user port
256
257   pb0 ieee ndac in
258   pb1 ieee nrfd out
259   pb2 ieee atn out
260   pb3 userport/cassettes
261   pb4 cassettes
262   pb5 userport/???
263   pb6 ieee nrfd in
264   pb7 ieee dav in
265
266   cb1 cassettes
267   cb2 user port
268 */
269READ8_MEMBER(pet_state::via_pb_r)
270{
271   /*
272
273       bit     description
274
275       PB0     _NDAC IN
276       PB1     _NRFD OUT
277       PB2     _ATN OUT
278       PB3     CASS WRITE
279       PB4     #2 CASS MOTOR
280       PB5     SYNC IN
281       PB6     _NRFD IN
282       PB7     _DAV IN
283
284   */
285
286   UINT8 data = 0;
287
288   /* not data accepted in */
289   data |= m_ieee->ndac_r();
290
291   /* sync in */
292
293   /* not ready for data in */
294   data |= m_ieee->nrfd_r() << 6;
295
296   /* data valid in */
297   data |= m_ieee->dav_r() << 7;
298
299   return data;
300}
301
302READ_LINE_MEMBER(pet_state::cass2_r)
303{
304   return m_cassette2->read();
305}
306
307WRITE8_MEMBER(pet_state::via_pb_w)
308{
309   /*
310
311       bit     description
312
313       PB0     _NDAC IN
314       PB1     _NRFD OUT
315       PB2     _ATN OUT
316       PB3     CASS WRITE
317       PB4     #2 CASS MOTOR
318       PB5     SYNC IN
319       PB6     _NRFD IN
320       PB7     _DAV IN
321
322   */
323
324   /* not ready for data out */
325   m_ieee->nrfd_w(BIT(data, 1));
326
327   /* attention out */
328   m_ieee->atn_w(BIT(data, 2));
329
330   /* cassette write */
331   m_cassette->write(BIT(data, 3));
332   m_cassette2->write(BIT(data, 3));
333
334   /* #2 cassette motor */
335   m_cassette2->motor_w(BIT(data, 4));
336}
337
338WRITE_LINE_MEMBER(pet_state::gb_w)
339{
340   DBG_LOG(machine(), 1, "address line", ("%d\n", state));
341   if (state) m_font |= 1;
342   else m_font &= ~1;
343}
344
345WRITE_LINE_MEMBER(pet_state::via_irq_w)
346{
347   m_via_irq = state;
348   int level = (m_pia0_irq | m_pia1_irq | m_via_irq) ? ASSERT_LINE : CLEAR_LINE;
349
350   machine().firstcpu->set_input_line(INPUT_LINE_IRQ0, level);
351}
352
353const via6522_interface pet_via =
354{
355   DEVCB_NULL,                 /* in_a_func */
356   DEVCB_DRIVER_MEMBER(pet_state,via_pb_r),    /* in_b_func */
357   DEVCB_NULL,                 /* in_ca1_func */
358   DEVCB_DRIVER_LINE_MEMBER(pet_state,cass2_r),        /* in_cb1_func */
359   DEVCB_NULL,                 /* in_ca2_func */
360   DEVCB_NULL,                 /* in_cb2_func */
361   DEVCB_NULL,                 /* out_a_func */
362   DEVCB_DRIVER_MEMBER(pet_state,via_pb_w),    /* out_b_func */
363   DEVCB_NULL,                 /* out_ca1_func */
364   DEVCB_DRIVER_LINE_MEMBER(pet_state,gb_w),           /* out_ca2_func */
365   DEVCB_NULL,                 /* out_ca2_func */
366   DEVCB_NULL,                 /* out_cb2_func */
367   DEVCB_DRIVER_LINE_MEMBER(pet_state,via_irq_w)       /* out_irq_func */
368};
369
370
371static WRITE8_HANDLER( cbm8096_io_w )
372{
373   via6522_device *via_0 = space.machine().device<via6522_device>("via6522_0");
374   pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0");
375   pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1");
376   mc6845_device *mc6845 = space.machine().device<mc6845_device>("crtc");
377
378   if (offset < 0x10) ;
379   else if (offset < 0x14) pia_0->write(space, offset & 3, data);
380   else if (offset < 0x20) ;
381   else if (offset < 0x24) pia_1->write(space, offset & 3, data);
382   else if (offset < 0x40) ;
383   else if (offset < 0x50) via_0->write(space, offset & 0xf, data);
384   else if (offset < 0x80) ;
385   else if (offset == 0x80) mc6845->address_w(space, 0, data);
386   else if (offset == 0x81) mc6845->register_w(space, 0, data);
387}
388
389static READ8_HANDLER( cbm8096_io_r )
390{
391   via6522_device *via_0 = space.machine().device<via6522_device>("via6522_0");
392   pia6821_device *pia_0 = space.machine().device<pia6821_device>("pia_0");
393   pia6821_device *pia_1 = space.machine().device<pia6821_device>("pia_1");
394   mc6845_device *mc6845 = space.machine().device<mc6845_device>("crtc");
395
396   int data = 0xff;
397   if (offset < 0x10) ;
398   else if (offset < 0x14) data = pia_0->read(space, offset & 3);
399   else if (offset < 0x20) ;
400   else if (offset < 0x24) data = pia_1->read(space, offset & 3);
401   else if (offset < 0x40) ;
402   else if (offset < 0x50) data = via_0->read(space, offset & 0xf);
403   else if (offset < 0x80) ;
404   else if (offset == 0x81) data = mc6845->register_r(space, 0);
405   return data;
406}
407
408static WRITE8_HANDLER( pet80_bank1_w )
409{
410   pet_state *state = space.machine().driver_data<pet_state>();
411   state->m_pet80_bank1_base[offset] = data;
412}
413
414/*
41565520        8096 memory control register
416        bit 0    1=write protect $8000-BFFF
417        bit 1    1=write protect $C000-FFFF
418        bit 2    $8000-BFFF bank select
419        bit 3    $C000-FFFF bank select
420        bit 5    1=screen peek through
421        bit 6    1=I/O peek through
422        bit 7    1=enable expansion memory
423
424*/
425WRITE8_HANDLER( cbm8096_w )
426{
427   pet_state *state = space.machine().driver_data<pet_state>();
428   if (data & 0x80)
429   {
430      if (data & 0x40)
431      {
432         space.install_legacy_read_handler(0xe800, 0xefff, FUNC(cbm8096_io_r));
433         space.install_legacy_write_handler(0xe800, 0xefff, FUNC(cbm8096_io_w));
434      }
435      else
436      {
437         space.install_read_bank(0xe800, 0xefff, "bank7");
438         if (!(data & 2))
439            space.install_write_bank(0xe800, 0xefff, "bank7");
440         else
441            space.nop_write(0xe800, 0xefff);
442      }
443
444
445      if ((data & 2) == 0) {
446         space.install_write_bank(0xc000, 0xe7ff, "bank6");
447         space.install_write_bank(0xf000, 0xffef, "bank8");
448         space.install_write_bank(0xfff1, 0xffff, "bank9");
449      } else {
450         space.nop_write(0xc000, 0xe7ff);
451         space.nop_write(0xf000, 0xffef);
452         space.nop_write(0xfff1, 0xffff);
453      }
454
455      if (data & 0x20)
456      {
457         state->m_pet80_bank1_base = state->m_memory + 0x8000;
458         state->membank("bank1")->set_base(state->m_pet80_bank1_base);
459         space.install_legacy_write_handler(0x8000, 0x8fff, FUNC(pet80_bank1_w));
460      }
461      else
462      {
463         if (!(data & 1))
464            space.install_write_bank(0x8000, 0x8fff, "bank1");
465         else
466            space.nop_write(0x8000, 0x8fff);
467      }
468
469      if ((data & 1) == 0 ){
470         space.install_write_bank(0x9000, 0x9fff, "bank2");
471         space.install_write_bank(0xa000, 0xafff, "bank3");
472         space.install_write_bank(0xb000, 0xbfff, "bank4");
473      } else {
474         space.nop_write(0x9000, 0x9fff);
475         space.nop_write(0xa000, 0xafff);
476         space.nop_write(0xb000, 0xbfff);
477      }
478
479      if (data & 4)
480      {
481         if (!(data & 0x20))
482         {
483            state->m_pet80_bank1_base = state->m_memory + 0x14000;
484            state->membank("bank1")->set_base(state->m_pet80_bank1_base);
485         }
486         state->membank("bank2")->set_base(state->m_memory + 0x15000);
487         state->membank("bank3")->set_base(state->m_memory + 0x16000);
488         state->membank("bank4")->set_base(state->m_memory + 0x17000);
489      }
490      else
491      {
492         if (!(data & 0x20))
493         {
494            state->m_pet80_bank1_base = state->m_memory + 0x10000;
495            state->membank("bank1")->set_base(state->m_pet80_bank1_base);
496         }
497         state->membank("bank2")->set_base(state->m_memory + 0x11000);
498         state->membank("bank3")->set_base(state->m_memory + 0x12000);
499         state->membank("bank4")->set_base(state->m_memory + 0x13000);
500      }
501
502      if (data & 8)
503      {
504         if (!(data & 0x40))
505         {
506            state->membank("bank7")->set_base(state->m_memory + 0x1e800);
507         }
508         state->membank("bank6")->set_base(state->m_memory + 0x1c000);
509         state->membank("bank8")->set_base(state->m_memory + 0x1f000);
510         state->membank("bank9")->set_base(state->m_memory + 0x1fff1);
511      }
512      else
513      {
514         if (!(data & 0x40))
515         {
516            state->membank("bank7")->set_base(state->m_memory+ 0x1a800);
517         }
518         state->membank("bank6")->set_base(state->m_memory + 0x18000);
519         state->membank("bank8")->set_base(state->m_memory + 0x1b000);
520         state->membank("bank9")->set_base(state->m_memory + 0x1bff1);
521      }
522   }
523   else
524   {
525      state->m_pet80_bank1_base = state->m_memory + 0x8000;
526      state->membank("bank1")->set_base(state->m_pet80_bank1_base );
527      space.install_legacy_write_handler(0x8000, 0x8fff, FUNC(pet80_bank1_w));
528
529      state->membank("bank2")->set_base(state->m_memory + 0x9000);
530      space.unmap_write(0x9000, 0x9fff);
531
532      state->membank("bank3")->set_base(state->m_memory + 0xa000);
533      space.unmap_write(0xa000, 0xafff);
534
535      state->membank("bank4")->set_base(state->m_memory + 0xb000);
536      space.unmap_write(0xb000, 0xbfff);
537
538      state->membank("bank6")->set_base(state->m_memory + 0xc000);
539      space.unmap_write(0xc000, 0xe7ff);
540
541      space.install_legacy_read_handler(0xe800, 0xefff, FUNC(cbm8096_io_r));
542      space.install_legacy_write_handler(0xe800, 0xefff, FUNC(cbm8096_io_w));
543
544      state->membank("bank8")->set_base(state->m_memory + 0xf000);
545      space.unmap_write(0xf000, 0xffef);
546
547      state->membank("bank9")->set_base(state->m_memory + 0xfff1);
548      space.unmap_write(0xfff1, 0xffff);
549   }
550}
551
552READ8_HANDLER( superpet_r )
553{
554   return 0xff;
555}
556
557WRITE8_HANDLER( superpet_w )
558{
559   pet_state *state = space.machine().driver_data<pet_state>();
560   switch (offset)
561   {
562      case 0:
563      case 1:
564      case 2:
565      case 3:
566         /* 3: 1 pull down diagnostic pin on the userport
567            1: 1 if jumpered programable ram r/w
568            0: 0 if jumpered programable m6809, 1 m6502 selected */
569         break;
570
571      case 4:
572      case 5:
573         state->m_spet.bank = data & 0xf;
574         state->membank("bank1")->configure_entries(0, 16, state->m_supermemory, 0x1000);
575         state->membank("bank1")->set_entry(state->m_spet.bank);
576         /* 7 low writeprotects systemlatch */
577         break;
578
579      case 6:
580      case 7:
581         state->m_spet.rom = data & 1;
582         break;
583   }
584}
585
586TIMER_CALLBACK_MEMBER(pet_state::pet_interrupt)
587{
588   pia6821_device *pia_0 = machine().device<pia6821_device>("pia_0");
589
590   pia_0->cb1_w(m_pia_level);
591   m_pia_level = !m_pia_level;
592}
593
594
595static void pet_common_driver_init( running_machine &machine )
596{
597   int i;
598   pet_state *state = machine.driver_data<pet_state>();
599
600   state->m_font = 0;
601
602   state->m_pet_basic1 = 0;
603   state->m_superpet = 0;
604   state->m_cbm8096 = 0;
605
606   machine.device("maincpu")->memory().space(AS_PROGRAM).install_readwrite_bank(0x0000, machine.device<ram_device>(RAM_TAG)->size() - 1, "bank10");
607   state->membank("bank10")->set_base(state->m_memory);
608
609   if (machine.device<ram_device>(RAM_TAG)->size() < 0x8000)
610   {
611      machine.device("maincpu")->memory().space(AS_PROGRAM).nop_readwrite(machine.device<ram_device>(RAM_TAG)->size(), 0x7FFF);
612   }
613
614   /* 2114 poweron ? 64 x 0xff, 64x 0, and so on */
615   for (i = 0; i < machine.device<ram_device>(RAM_TAG)->size(); i += 0x40)
616   {
617      memset (state->m_memory + i, i & 0x40 ? 0 : 0xff, 0x40);
618   }
619
620   /* pet clock */
621   machine.scheduler().timer_pulse(attotime::from_msec(10), timer_expired_delegate(FUNC(pet_state::pet_interrupt),state));
622}
623
624
625DRIVER_INIT_MEMBER(pet_state,pet2001)
626{
627   m_memory.set_target(machine().device<ram_device>(RAM_TAG)->pointer(),m_memory.bytes());
628   pet_common_driver_init(machine());
629   m_pet_basic1 = 1;
630   pet_vh_init(machine());
631}
632
633DRIVER_INIT_MEMBER(pet_state,pet)
634{
635   m_memory.set_target(machine().device<ram_device>(RAM_TAG)->pointer(),m_memory.bytes());
636   pet_common_driver_init(machine());
637   pet_vh_init(machine());
638}
639
640DRIVER_INIT_MEMBER(pet_state,pet80)
641{
642   m_memory.set_target(memregion("maincpu")->base(),m_memory.bytes());
643
644   pet_common_driver_init(machine());
645   m_cbm8096 = 1;
646   m_videoram.set_target(&m_memory[0x8000],m_videoram.bytes());
647   pet80_vh_init(machine());
648
649}
650
651DRIVER_INIT_MEMBER(pet_state,superpet)
652{
653   m_memory.set_target(machine().device<ram_device>(RAM_TAG)->pointer(),m_memory.bytes());
654   pet_common_driver_init(machine());
655   m_superpet = 1;
656
657   m_supermemory = auto_alloc_array(machine(), UINT8, 0x10000);
658
659   membank("bank1")->configure_entries(0, 16, m_supermemory, 0x1000);
660   membank("bank1")->set_entry(0);
661
662   superpet_vh_init(machine());
663}
664
665void pet_state::machine_reset()
666{
667   if (m_superpet)
668   {
669      m_spet.rom = 0;
670      if (machine().root_device().ioport("CFG")->read() & 0x04)
671      {
672         machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, 1);
673         machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, 0);
674         m_font = 2;
675      }
676      else
677      {
678         machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, 0);
679         machine().device("maincpu")->execute().set_input_line(INPUT_LINE_HALT, 1);
680         m_font = 0;
681      }
682   }
683
684   if (m_cbm8096)
685   {
686      if (machine().root_device().ioport("CFG")->read() & 0x08)
687      {
688         machine().device("maincpu")->memory().space(AS_PROGRAM).install_legacy_write_handler(0xfff0, 0xfff0, FUNC(cbm8096_w));
689      }
690      else
691      {
692         machine().device("maincpu")->memory().space(AS_PROGRAM).nop_write(0xfff0, 0xfff0);
693      }
694      cbm8096_w(machine().device("maincpu")->memory().space(AS_PROGRAM), 0, 0);
695   }
696
697//removed   cbm_drive_0_config (machine().root_device().ioport("CFG")->read() & 2 ? IEEE : 0, 8);
698//removed   cbm_drive_1_config (machine().root_device().ioport("CFG")->read() & 1 ? IEEE : 0, 9);
699   machine().device("maincpu")->reset();
700
701   m_ieee->ren_w(0);
702   m_ieee->ifc_w(0);
703   m_ieee->ifc_w(1);
704}
705
706
707INTERRUPT_GEN_MEMBER(pet_state::pet_frame_interrupt)
708{
709   if (m_superpet)
710   {
711      if (ioport("CFG")->read() & 0x04)
712      {
713         device.execute().set_input_line(INPUT_LINE_HALT, 1);
714         device.execute().set_input_line(INPUT_LINE_HALT, 0);
715         m_font |= 2;
716      }
717      else
718      {
719         device.execute().set_input_line(INPUT_LINE_HALT, 0);
720         device.execute().set_input_line(INPUT_LINE_HALT, 1);
721         m_font &= ~2;
722      }
723   }
724
725   set_led_status (machine(),1, machine().root_device().ioport("SPECIAL")->read() & 0x80 ? 1 : 0);     /* Shift Lock */
726}
727
728
729/***********************************************
730
731    PET Cartridges
732
733***********************************************/
734
735static DEVICE_IMAGE_LOAD(pet_cart)
736{
737   pet_state *state = image.device().machine().driver_data<pet_state>();
738   UINT32 size = image.length();
739   const char *filetype = image.filetype();
740   int address = 0;
741
742   /* Assign loading address according to extension */
743   if (!mame_stricmp(filetype, "90"))
744      address = 0x9000;
745   else if (!mame_stricmp(filetype, "a0"))
746      address = 0xa000;
747   else if (!mame_stricmp(filetype, "b0"))
748      address = 0xb000;
749
750   logerror("Loading cart %s at %.4x size:%.4x\n", image.filename(), address, size);
751
752   image.fread(state->m_memory + address, size);
753
754   return IMAGE_INIT_PASS;
755}
756
757MACHINE_CONFIG_FRAGMENT(pet_cartslot)
758   MCFG_CARTSLOT_ADD("cart1")
759   MCFG_CARTSLOT_EXTENSION_LIST("90,a0,b0")
760   MCFG_CARTSLOT_NOT_MANDATORY
761   MCFG_CARTSLOT_LOAD(pet_cart)
762
763   MCFG_CARTSLOT_ADD("cart2")
764   MCFG_CARTSLOT_EXTENSION_LIST("90,a0,b0")
765   MCFG_CARTSLOT_NOT_MANDATORY
766   MCFG_CARTSLOT_LOAD(pet_cart)
767MACHINE_CONFIG_END
768
769// 2010-08, FP: this is used by CBM40 & CBM80, and I actually have only found .prg files for these... does cart dumps exist?
770MACHINE_CONFIG_FRAGMENT(pet4_cartslot)
771   MCFG_CARTSLOT_MODIFY("cart1")
772   MCFG_CARTSLOT_EXTENSION_LIST("a0")
773   MCFG_CARTSLOT_NOT_MANDATORY
774   MCFG_CARTSLOT_LOAD(pet_cart)
775
776   MCFG_CARTSLOT_MODIFY("cart2")
777   MCFG_CARTSLOT_EXTENSION_LIST("a0")
778   MCFG_CARTSLOT_NOT_MANDATORY
779   MCFG_CARTSLOT_LOAD(pet_cart)
780MACHINE_CONFIG_END
trunk/src/mess/includes/pet.h
r21304r21305
1/***************************************************************************
2    commodore pet series computer
3
4    peter.trauner@jk.uni-linz.ac.at
5***************************************************************************/
6
7#ifndef PET_H_
8#define PET_H_
9
10#include "video/mc6845.h"
11#include "machine/6821pia.h"
12#include "machine/6522via.h"
13#include "machine/ieee488.h"
14#include "imagedev/cartslot.h"
15#include "machine/petcass.h"
16
17struct spet_t
18{
19   int bank; /* rambank to be switched in 0x9000 */
20   int rom; /* rom socket 6502? at 0x9000 */
21};
22
23
24class pet_state : public driver_device
25{
26public:
27   pet_state(const machine_config &mconfig, device_type type, const char *tag)
28      : driver_device(mconfig, type, tag),
29         m_ieee(*this, IEEE488_TAG),
30         m_cassette(*this, PET_DATASSETTE_PORT_TAG),
31         m_cassette2(*this, PET_DATASSETTE_PORT2_TAG),
32      m_videoram(*this, "videoram"),
33      m_memory(*this, "memory")
34   { }
35
36   required_device<ieee488_device> m_ieee;
37   required_device<pet_datassette_port_device> m_cassette;
38   required_device<pet_datassette_port_device> m_cassette2;
39
40   int m_pet_basic1; /* basic version 1 for quickloader */
41   int m_superpet;
42   int m_cbm8096;
43
44   int m_pia0_irq;
45   int m_pia1_irq;
46   int m_via_irq;
47   optional_shared_ptr<UINT8> m_videoram;
48   int m_font;
49   optional_shared_ptr<UINT8> m_memory;
50   UINT8 *m_supermemory;
51   UINT8 *m_pet80_bank1_base;
52   int m_keyline_select;
53   spet_t m_spet;
54   int m_pia_level;
55   DECLARE_DRIVER_INIT(superpet);
56   DECLARE_DRIVER_INIT(pet80);
57   DECLARE_DRIVER_INIT(pet);
58   DECLARE_DRIVER_INIT(pet2001);
59   virtual void machine_reset();
60   virtual void palette_init();
61   DECLARE_VIDEO_START(pet_crtc);
62   UINT32 screen_update_pet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
63   INTERRUPT_GEN_MEMBER(pet_frame_interrupt);
64   TIMER_CALLBACK_MEMBER(pet_interrupt);
65   DECLARE_READ8_MEMBER(pia0_pa_r);
66   DECLARE_WRITE8_MEMBER(pia0_pa_w);
67   DECLARE_READ8_MEMBER(kin_r);
68   DECLARE_READ8_MEMBER(petb_kin_r);
69   DECLARE_READ8_MEMBER(cass1_r);
70   DECLARE_WRITE8_MEMBER(cass1_motor_w);
71   DECLARE_WRITE_LINE_MEMBER(pia0_irq_w);
72   DECLARE_WRITE_LINE_MEMBER(pia1_irq_w);
73   DECLARE_READ8_MEMBER(via_pb_r);
74   DECLARE_READ_LINE_MEMBER(cass2_r);
75   DECLARE_WRITE8_MEMBER(via_pb_w);
76   DECLARE_WRITE_LINE_MEMBER(gb_w);
77   DECLARE_WRITE_LINE_MEMBER(via_irq_w);
78   DECLARE_WRITE_LINE_MEMBER(pet_display_enable_changed);
79};
80
81/*----------- defined in video/pet.c -----------*/
82
83/* call to init videodriver */
84void pet_vh_init (running_machine &machine);
85void pet80_vh_init (running_machine &machine);
86void superpet_vh_init (running_machine &machine);
87
88MC6845_UPDATE_ROW( pet40_update_row );
89MC6845_UPDATE_ROW( pet80_update_row );
90
91
92/*----------- defined in machine/pet.c -----------*/
93
94extern const via6522_interface pet_via;
95extern const pia6821_interface pet_pia0;
96extern const pia6821_interface petb_pia0;
97extern const pia6821_interface pet_pia1;
98
99
100DECLARE_WRITE8_HANDLER(cbm8096_w);
101extern DECLARE_READ8_HANDLER(superpet_r);
102extern DECLARE_WRITE8_HANDLER(superpet_w);
103
104MACHINE_CONFIG_EXTERN( pet_cartslot );
105MACHINE_CONFIG_EXTERN( pet4_cartslot );
106
107#endif /* PET_H_ */
trunk/src/mess/video/pet.c
r21304r21305
1/***************************************************************************
2
3  commodore pet discrete video circuit
4
5  PeT mess@utanet.at
6
7***************************************************************************/
8
9#include "emu.h"
10#include "includes/pet.h"
11
12
13void pet_vh_init (running_machine &machine)
14{
15   UINT8 *gfx = machine.root_device().memregion("gfx1")->base();
16   int i;
17
18   /* inversion logic on board */
19   for (i = 0; i < 0x400; i++)
20   {
21      gfx[0x800+i] = gfx[0x400+i];
22      gfx[0x400+i] = gfx[i]^0xff;
23      gfx[0xc00+i] = gfx[0x800+i]^0xff;
24   }
25}
26
27void pet80_vh_init (running_machine &machine)
28{
29   UINT8 *gfx = machine.root_device().memregion("gfx1")->base();
30   int i;
31
32   /* inversion logic on board */
33   for (i = 0; i < 0x400; i++) {
34      gfx[0x800+i] = gfx[0x400+i];
35      gfx[0x400+i] = gfx[i]^0xff;
36      gfx[0x0c00+i] = gfx[0x800+i]^0xff;
37   }
38   // I assume the hardware logic is not displaying line 8 and 9 of char
39   // I draw it like lines would be 8-15 are black!
40   for (i=511; i>=0; i--) {
41      memcpy(gfx+i*16, gfx+i*8, 8);
42      memset(gfx+i*16+8, 0, 8);
43   }
44}
45
46void superpet_vh_init (running_machine &machine)
47{
48   UINT8 *gfx = machine.root_device().memregion("gfx1")->base();
49   int i;
50
51   for (i=0; i<0x400; i++) {
52      gfx[0x1000+i]=gfx[0x800+i];
53      gfx[0x1800+i]=gfx[0xc00+i];
54      gfx[0x1c00+i]=gfx[0x1800+i]^0xff;
55      gfx[0x1400+i]=gfx[0x1000+i]^0xff;
56      gfx[0x800+i]=gfx[0x400+i];
57      gfx[0xc00+i]=gfx[0x800+i]^0xff;
58      gfx[0x400+i]=gfx[i]^0xff;
59   }
60   // I assume the hardware logic is not displaying line 8 and 9 of char
61   // I draw it like lines 8-15 are black!
62   for (i=1023; i>=0; i--) {
63      memcpy(gfx+i*16, gfx+i*8, 8);
64      memset(gfx+i*16+8, 0, 8);
65   }
66}
67
68//  commodore pet discrete video circuit
69UINT32 pet_state::screen_update_pet(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
70{
71   UINT8 *videoram = m_videoram;
72   int x, y, i;
73
74   for (y=0, i=0; y<25;y++)
75   {
76      for (x=0;x<40;x++, i++)
77      {
78         drawgfx_opaque(bitmap, cliprect,machine().gfx[m_font],
79               videoram[i], 0, 0, 0, 8*x,8*y);
80      }
81   }
82   return 0;
83}
84
85
86MC6845_UPDATE_ROW( pet40_update_row )
87{
88   pet_state *state = device->machine().driver_data<pet_state>();
89   UINT8 *videoram = state->m_videoram;
90   int i;
91
92   for( i = 0; i < x_count; i++ ) {
93      drawgfx_opaque( bitmap, cliprect, device->machine().gfx[state->m_font], videoram[(ma+i)&0x3ff], 0, 0, 0, 8 * i, y-ra );
94   }
95}
96
97MC6845_UPDATE_ROW( pet80_update_row )
98{
99   pet_state *state = device->machine().driver_data<pet_state>();
100   UINT8 *videoram = state->m_videoram;
101   int i;
102
103   for( i = 0; i < x_count; i++ ) {
104      drawgfx_opaque( bitmap, cliprect, device->machine().gfx[state->m_font], videoram[((ma+i)<<1)&0x7ff], 0, 0, 0, 16 * i, y-ra );
105      drawgfx_opaque( bitmap, cliprect, device->machine().gfx[state->m_font], videoram[(((ma+i)<<1)+1)&0x7ff], 0, 0, 0, 16 * i + 8, y-ra );
106   }
107}
108
109WRITE_LINE_MEMBER(pet_state::pet_display_enable_changed)
110{
111}
trunk/src/mess/drivers/pet.c
r21304r21305
1/***************************************************************************
2    commodore pet series computer
3
4    PeT mess@utanet.at
5
6    documentation
7     vice emulator
8     www.funet.fi
9     andre fachat (vice emulator, docu, web site, excellent keyboard pictures)
10
11***************************************************************************/
12
13/*
14
152008 - Driver Updates
16---------------------
17
18(most of the informations are taken from http://www.zimmers.net/cbmpics/ )
19(also, check
20    http://www.6502.org/users/andre/petindex/local/cbm-model-list.1.0.txt
21for a more comprehensive list of models)
22
23[CBM systems which belong to this driver]
24
25* Commodore PET 2001 (1977) - board design 1
26* PET 2001 Series / CBM 20XX Series (1979) - board design 2, upgraded ROMs
27
28  PET 2001, the first of the series came initially with a calculator style
29keyboard, later changed to a larger and better full-stroke one (actually
30it was available in two versions: Businness and Home Computer, the latter
31also containing graphics on the keys). Plenty of models were released in
32this series, depending on the RAM size, the keyboard type and the screen
33dimension (see below).
34
35CPU: MOS 6502 (1 MHz)
36RAM: 4K and 8K early models (Expandable to 32k addressable, more banked);
37    8K, 16K, 32K later models (Expandable again to larger RAM config)
38ROM: 18 kilobytes early models; 20 kilobytes later ones
39Video: MOS Technology 6545 CRTC (9" Monochrome display; 40 columns x 25
40    rows )
41Sound: None ine arlier models; Piezo electronic speaker later ones(One
42    square wave voice; Three octaves)
43Ports: MOS 6520 PIA, MOS 6522 VIA (IEEE-488 edge-connector Port; 2
44    Commodore Datasette ports; 'EXPANSION' port; CBM parallel
45    programmable "User" port
46Keyboard: "Calculator" 69 key QWERTY in early models and Full 69 keys QWERTY
47    in later ones (16 key numeric keypad!; 4 direction 2-key cursor-pad )
48Additional hardware: Datasette
49
50Model Table (*):
51
52PET 2001-4K     Calculator Keyboard, Black Trim
53PET 2001-8K     Calculator Keyboard, Blue Trim, 9" Screen
54PET 2001-8C     Calculator Keyboard, Blue Trim, 9" Screen B&W (**)
55PET 2001B-8     Business Keyboard, 12" Screen
56PET 2001B-16    Business Keyboard, 12" Screen
57PET 2001B-32    Business Keyboard, 12" Screen (***)
58PET 2001N-8     Home Computer Keyboard, 12" Screen
59PET 2001N-16    Home Computer Keyboard, 9" and 12" Screen
60PET 2001N-32    Home Computer Keyboard, BASIC 4.0
61
62Notes:  B&W = Black and White Screen
63        G&W = Green and White Screen
64        Calculator Keyboard models also had a built-in datasette
65        Home Computer Keyboard also features graphics on keys
66
67(*) Models 2001B-XX & 2001-XXB are the same. Same applies to 2001N-XX &
68    2001-XXN
69(**) Also confirmed with Black Trim and 9" Screen G&W
70(***) Also confirmed with Black Trim and 9" Screen B&W
71
72
73* Commodore CBM 3008 / 3016 / 3032 (1979) - board design 2, upgraded ROMs
74
75  In Europe, Philips was already selling a machine called PET, so they
76forced Commodore to change name. The result was the CBM 30XX Series, where
77XX is equal to the RAM size. These were basically PET models with 9" Screen
78and upgraded ROMs. There also existed a German CBM 3001, which was a PET
792001, B or N. Notice that these systems used to boot
80
81CPU: MOS 6502 (1MHz)
82RAM: 8K, 16k, and 32k models (Expandable to even more banked memory)
83ROM: 20 Kilobytes
84Video: MOS Technology 6545 CRTC (9" Monochrome display; 40 columns x 25 rows)
85Sound: Piezo electronic speaker (One square wave voice; Three octaves)
86Ports: MOS 6520 PIA, MOS 6522 VIA (IEEE-488 edge-connector Port; 2 Commodore
87    Datasette ports; 'EXPANSION' port; CBM parallel programmable "User" port)
88Keyboard: Full 69 key QWERTY (16 key numeric keypad!; 4 direction 2-key cursor-pad)
89
90
91* Commodore PET 40XX / CBM 40XX (1980) - board design 2, BASIC 4, 9" Screen
92* Commodore PET 40XX / CBM 40XX (1981) - board design 3, BASIC 4, 12" Screen
93
94  While the 40XX machines (again 4008, 4016, 4032) coming with design 2 were
95quite similar to the previous ones (except for the new BASIC version), the
96machines with design 3 were quite different: there was CRTC support, it was
97possible to upgrade to 80 cols and a piezo beeper.
98
99CPU: MOS 6502 (1 MHz)
100RAM: 8K, 16k, and 32k models (Expandable to even more banked memory)
101ROM: 20 Kilobytes
102Video: MOS Technology 6545 CRTC (9" and 12" Monochrome displays; 40
103    columns x 25 rows)
104Sound: Piezo electronic speaker (One square wave voice; Three octaves)
105Ports: MOS 6520 PIA, MOS 6522 VIA (IEEE-488 edge-connector Port; 2 Commodore
106    Datasette ports; 'EXPANSION' port; CBM parallel programmable "User" port)
107Keyboard: Full 69 key QWERTY (16 key numeric keypad!; 4 direction 2-key cursor-pad)
108
109
110* Commodore PET 8032 / CBM 8032 (1981) - board design 3, BASIC 4, 12" Screen
111
112  Again, 80 columns screen and piezo beeper; BASIC 4 has a 80 columns editor
113ROM. It was possible to expand it to a 8096.
114
115CPU: MOS 6502 (1 MHz)
116RAM: 32k standard (Expandable to even more banked memory)
117ROM: 20 Kilobytes
118Video: MOS Technology 6545 CRTC (12" Monochrome displays; 80 columns x 25 rows)
119Sound: Piezo electronic speaker (One square wave voice; Three octaves)
120Ports: MOS 6520 PIA, MOS 6522 VIA (IEEE-488 edge-connector Port; 2 Commodore
121    Datasette ports; 'EXPANSION' port; CBM parallel programmable "User" port)
122Keyboard: Full 73 key QWERTY (11 key numeric keypad!; 4 direction 2-key cursor-pad)
123
124
125* Commodore PET 8032-SK / CBM 8032-SK - board design 3 & 4, BASIC 4, 12" Screen
126
127  New (smaller) case with detachable keyboard (SK=Separate Keyboard). Board
128with design 3 didn't fit very well the new case and required extra cables.
129It was possible to expand it to a 8096-SK.
130
131CPU: MOS 6502 (1 MHz)
132RAM: 32k standard (8096 expanded to 96k, 64k is banked memory)
133ROM: 20 Kilobytes
134Video: MOS Technology 6545 CRTC (12" Monochrome display; 80 columns x 25 rows)
135Sound: Piezo electronic speaker (One square wave voice; Three octaves)
136Ports: MOS 6520 PIA, MOS 6522 VIA (IEEE-488 square-connector Port; 2 Commodore
137    Datasette ports; 'EXPANSION' port; CBM parallel programmable "User" port)
138Keyboard: Full 73 key QWERTY (11 key numeric keypad!; 4 direction 2-key cursor-pad)
139
140
141* Commodore CBM 200 Series (198?)
142
143  Rebadged CMB 80XX models: the CBM 200 was basically a CBM 8032-SK and the
144CBM 220 was a CBM 8096-SK.
145
146
147* Commodore Super PET / MMF9000 (1981) - BASIC 4, 12" Screen
148
149  Based on PET 8032. Sold in Germany as MMF (MicroMainFrame) 9000. Machines
150sold in Italy had 134kB of RAM.
151
152CPU: MOS Technology 6502 & 6809 (1 MHz clock speeds)
153RAM: 96 kilobytes (64K was contained on an expansion board above the motherboard;
154    Early SP9000 models had two boards above the motherboard; Some models also
155    had 3 or more switches)
156ROM: 48 kilobytes
157Video: MOS Technology 6545 CRTC (12" Monochrome display; 80 columns x 25 rows;
158    3+ character sets, 256 characters each)
159Sound: Piezo electronic speaker (One square wave voice; Three octaves)
160Ports: 6551 ACIA, MOS 6520 PIA, MOS 6522 VIA (IEEE-488 edge-connector Port; 2
161    Commodore Datasette ports; 'EXPANSION' port; RS232 Internal port; CBM
162    parallel programmable "User" port; Memory and Processor selection switches)
163Keyboard: Full-sized 73 key QWERTY (Multi-Font 62 key keyboard; APL Symbols on
164    the front of the keys; 11 key numeric keypad; Editor functions on the front
165    of the keys; 2-key 4-direction cursor-pad)
166
167
168* Commodore CBM SP9000
169
170  Similar to Super PET. Dual uP 6502/6809, 96kB RAM, business keyboard.
171
172
173* Commodore PET 8296 / CBM 8296 (1984) - BASIC 4, 12" Screen
174
175  Shipped with 128k RAM and separate keyboard, it is a complete redesign of the
176PET universal board. It fits into the separate keyboard case, and directly holds
177128k RAM, of which 96k can be used as in the 8096. In addition, using "user
178jumpers" on the motherboard, the ROM can be completely switched off to access
179the RAM "under the ROM", so that the complete 128k RAM are accessible. The "user
180jumpers" could be set to connect to the userport, so this could even be done
181under program control.
182
183CPU: MOS 6502 (1 MHz)
184RAM: 160K (32k standard)
185ROM: 24 Kilobytes
186Video: MOS Technology 6545 CRTC (12" Monochrome displays; 80 columns x 25 rows)
187Sound: Piezo electronic speaker (One square wave voice; Three octaves)
188Ports: MOS 6520 PIA, MOS 6522 VIA (IEEE-488 Port; Commodore Datasette port;
189    'EXPANSION' port; CBM parallel programmable "User" port)
190Keyboard: Full 73 key QWERTY (11 key numeric keypad!; 4 direction 2-key cursor-pad)
191
192see http://www.6502.org/users/andre/petindex/8x96.html and
193http://www.sothius.com/hypertxt/welcome.html?./additional/cbm8296addition.html for
194more informations
195
196
197* Commodore PET 8296D / CBM 8296D (1984) - BASIC 4, 12" Screen
198
199  It was a 8296 with built-in 8250-LP disk drive.
200
201* Commodore CBM 8296GD
202
203  Mentioned at http://www.commodore.ca/products/pet/commodore_pet.htm#Commodore%20PET%20Chronology
204as a 8296 with a high resolution graphics board and drive. No other info available.
205
206[Other models]
207
208
209* Teacher's PET     Simply a PET 2001-N with a different label, due to a
210                    marketing campaign in US schools
211* MDS 6500          Modified 2001N-32 with matching 2040 drive.  500 made.
212* "CASSIE"          Synergistics Inc. rebadged 8032
213
214
215[Board Designs]
216
217All these models can be reduced to four board types (source William Levak's
218doc, layouts from PETFAQ):
219
220Static Board (PET 2001)
221-----------------------
222
223Four variations based on type of RAM(6550 or 2114) and ROM(6540 or 2316B).
2244K or 8K static RAM (selected by jumper).
22540 column display
226A video interrupt interferes with disk drive operation.
227Display timing not compatible with Basic 4.0.
228ROM sockets:  A2  2K character      ROM sockets:  A2  2K character
229 (2316B)      H1  C000-CFFF           (6540)       H1  C000-C7FF
230              H2  D000-DFFF                        H2  D000-D7FF
231              H3  E000-E7FF                        H3  E000-E7FF
232              H4  F000-FFFF                        H4  F000-F7FF
233              H5  C000-CFFF                        H5  C800-CFFF
234              H6  D000-DFFF                        H6  D800-DFFF
235              H7  F000-FFFF                        H7  F800-FFFF
236
237
238           IEEE user tape #2
239     +------####-####--##-+
240     !                    #
241     !                    #
242     !                    # exp
243     !                    # bus
244     !                    #
245     !                    #    2000 Series
246     !                    !       circa 1977/78  Max RAM - 8k
247     !       (2k) ROMS    !       [w/daughter board exp to 32k shown]
248     !      F F E D D C C !
249     !      8 0 0 8 0 8 0 !
250     !                    !
251tape #       RAM MEMORY   !
252 #1  #                    !
253     +--------------------+
254
255
256Dynamic Board (PET/CBM 2001-N/2001-B/4000)
257------------------------------------------
258
2594K, 8K, 16K or 32K dynamic RAM (selected by jumper).
26040 column display
261Can run all versions of 40 column Basic (Basic 1 must be copied to 4K ROMs)
262Can be jumpered to replace the older board.
263ROM sockets:  UD3   9000-9FFF
264              UD4   A000-AFFF
265              UD5   B000-BFFF
266              UD6   C000-CFFF
267              UD7   D000-DFFF
268              UD8   E000-E7FF
269              UD9   F000-FFFF
270              UF10  2K character
271
272
273            IEEE user tape #1
274     +------####-####--##-+
275     !                   #!
276     !                   #!
277     !                   #! exp
278     !        ROMS       #! bus
279     !    F E D C B A 9  #!
280     !                   #!    3000, 4000 Series
281     !                    !       (3000 series is European version)
282     !                    !       circa 1979/80  Max RAM - 32k
283     !                    !
284     !                    !
285     !                    !
286tape #      RAM MEMORY    !
287 #2  #                    !
288     +--------------------+
289
290
29180 Column Board (CBM 8000)
292--------------------------
293
29416K or 32K RAM (selected by jumper).
295Uses CTRC to generate 80 column display.
296Can only run the 80 column version of Basic 4.0.
297Not compatible with older boards.
298ROM sockets:  UA3   2K or 4K character
299              UD6   F000-FFFF
300              UD7   E000-E7FF
301              UD8   D000-DFFF
302              UD9   C000-CFFF
303              UD10  B000-BFFF
304              UD11  A000-AFFF
305              UD12  9000-9FFF
306
307The layout is the same of the one used in Universal Boards below.
308
309
310Universal Board (CBM 8000/PET 4000-12)
311--------------------------------------
312
313This is an 80 column board with jumpers for different configurations.
31416K or 32K RAM (selected by jumper).
315Uses CTRC to generate 40 or 80 column display (selected by jumpers).
316Can only run Basic 4.0 versions that support the CRTC.
317Can be jumpered to replace all older boards.
318ROM sockets:  UA3   2K or 4K character
319              UD6   F000-FFFF
320              UD7   E000-E7FF
321              UD8   D000-DFFF
322              UD9   C000-CFFF
323              UD10  B000-BFFF
324              UD11  A000-AFFF
325              UD12  9000-9FFF
326
327
328           IEEE user tape #1
329     +------####-####--##-+
330     !                  # # tape
331     !                  # #  #2
332     !  R       exp bus # !
333     !  A                #!
334     !  M             9  #!
335     !                A  #!     4000, 8000 Series
336     !  M          R  B   !        circa 1981     Max RAM - 32k*
337     !  E          O  C   !       [8296 layout not shown]
338     !  M          M  D   !
339     !  O          S  E   !
340     !  R             F   !
341     !  Y                 !
342     !                spkr!
343     +--------------------+
344
345
346[TO DO]
347
348* Verify if pre-CRTC models had differences between NTSC & PAL systems.
349If no differences arise we can merge back the following sets:
350+ cbm30 (same as pet2001n) & cbm30b (same as pet2001b)
351+ cbm40o (same as pet40on) & cbm40ob (same as pet40ob)
352
353* Emulate SuperPET / SP9000 / MMF9000 and their differences
354
355* Emulate CBM 8296 & 8296D (basically only a placeholder now)
356
357* Add proper tape support
358
359* Add sound support, for systems which had it
360
361* Find out answers to the following details:
362
363+ Did BASIC 2 also come as upgrade ROMs for PET 2001 with Static Board? If
364this is the case, we need to support the splitted versions of the ROMs as
365an alternative BIOS to pet2001.
366+ Did final PET 40XX & CBM 40XX with 40 Columns & CRTC support had business or
367normal keyboards?
368
369* Find confirmation about some models (which I don't believe ever existed,
370    but...):
371
372+ were there PET 2001-16k & PET 2001-32k with Calculator type keyboard?
373+ were there CBM 20XX in Europe?
374+ what about the following unrealistic RAM configurations: 4004? 8008? 8016?
3758064?
376+ did a CBM 210 exist?
377
378*/
379
380
381#include "emu.h"
382#include "cpu/m6809/m6809.h"
383#include "cpu/m6502/m6502.h"
384
385#include "machine/6821pia.h"
386#include "machine/6522via.h"
387#include "includes/pet.h"
388#include "machine/cbmipt.h"
389#include "video/mc6845.h"
390#include "machine/ram.h"
391
392/* devices config */
393#include "includes/cbm.h"
394#include "formats/cbm_snqk.h"
395#include "machine/ieee488.h"
396
397/*************************************
398 *
399 *  Main CPU memory handlers
400 *
401 *************************************/
402
403static ADDRESS_MAP_START(pet_mem , AS_PROGRAM, 8, pet_state )
404   AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("videoram")
405   AM_RANGE(0xa000, 0xe7ff) AM_ROM
406   AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
407   AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_device, read, write)
408   AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write)
409/*  AM_RANGE(0xe900, 0xe91f) AM_DEVREAD_LEGACY("ieee_bus", cbm_ieee_state)    // for debugging */
410   AM_RANGE(0xf000, 0xffff) AM_ROM
411ADDRESS_MAP_END
412
413static ADDRESS_MAP_START( pet40_mem , AS_PROGRAM, 8, pet_state )
414   AM_RANGE(0x8000, 0x83ff) AM_MIRROR(0x0c00) AM_RAM AM_SHARE("videoram")
415   AM_RANGE(0xa000, 0xe7ff) AM_ROM
416   AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
417   AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_device, read, write)
418   AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write)
419   AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_device, address_w)
420   AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
421   AM_RANGE(0xf000, 0xffff) AM_ROM
422ADDRESS_MAP_END
423
424static ADDRESS_MAP_START( pet80_mem , AS_PROGRAM, 8, pet_state )
425   AM_RANGE(0x8000, 0x8fff) AM_RAMBANK("bank1")
426   AM_RANGE(0x9000, 0x9fff) AM_RAMBANK("bank2")
427   AM_RANGE(0xa000, 0xafff) AM_RAMBANK("bank3")
428   AM_RANGE(0xb000, 0xbfff) AM_RAMBANK("bank4")
429   AM_RANGE(0xc000, 0xe7ff) AM_RAMBANK("bank6")
430#if 1
431   AM_RANGE(0xe800, 0xefff) AM_RAMBANK("bank7")
432#else
433   AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE_LEGACY("pia_0", pia6821_r, pia6821_w)
434   AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE_LEGACY("pia_1", pia6821_r, pia6821_w)
435   AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write)
436   AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_device, address_w)
437   AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
438#endif
439   AM_RANGE(0xf000, 0xffff) AM_READ_BANK("bank8")
440   AM_RANGE(0xf000, 0xffef) AM_WRITE_BANK("bank8")
441   AM_RANGE(0xfff1, 0xffff) AM_WRITE_BANK("bank9")
442ADDRESS_MAP_END
443
444
445/* 0xe880 crtc
446   0xefe0 6702 encoder
447   0xeff0 acia6551
448
449   0xeff8 super pet system latch
45061432        SuperPET system latch
451        bit 0    1=6502, 0=6809
452        bit 1    0=read only
453        bit 3    diagnostic sense: set to 1 to switch to 6502
454
45561436        SuperPET bank select latch
456        bit 0-3  bank
457        bit 7    1=enable system latch
458
459*/
460static ADDRESS_MAP_START( superpet_mem , AS_PROGRAM, 8, pet_state )
461   AM_RANGE(0x0000, 0x7fff) AM_RAM AM_SHARE("memory")
462   AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("videoram")
463   AM_RANGE(0xa000, 0xe7ff) AM_ROM
464   AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
465   AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_device, read, write)
466   AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write)
467   AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_device, address_w)
468   AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
469   /* 0xefe0, 0xefe3, mos 6702 */
470   /* 0xeff0, 0xeff3, acia6551 */
471   AM_RANGE(0xeff8, 0xefff) AM_READWRITE_LEGACY(superpet_r, superpet_w)
472   AM_RANGE(0xf000, 0xffff) AM_ROM
473ADDRESS_MAP_END
474
475static ADDRESS_MAP_START( superpet_m6809_mem, AS_PROGRAM, 8, pet_state )
476   AM_RANGE(0x0000, 0x7fff) AM_RAM AM_SHARE("memory")  /* same memory as m6502 */
477   AM_RANGE(0x8000, 0x87ff) AM_RAM AM_SHARE("videoram")    /* same memory as m6502 */
478   AM_RANGE(0x9000, 0x9fff) AM_RAMBANK("bank1")    /* 64 kbyte ram turned in */
479   AM_RANGE(0xa000, 0xe7ff) AM_ROM
480   AM_RANGE(0xe810, 0xe813) AM_DEVREADWRITE("pia_0", pia6821_device, read, write)
481   AM_RANGE(0xe820, 0xe823) AM_DEVREADWRITE("pia_1", pia6821_device, read, write)
482   AM_RANGE(0xe840, 0xe84f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write)
483   AM_RANGE(0xe880, 0xe880) AM_DEVWRITE("crtc", mc6845_device, address_w)
484   AM_RANGE(0xe881, 0xe881) AM_DEVREADWRITE("crtc", mc6845_device, register_r, register_w)
485   AM_RANGE(0xeff8, 0xefff) AM_READWRITE_LEGACY(superpet_r, superpet_w)
486   AM_RANGE(0xf000, 0xffff) AM_ROM
487ADDRESS_MAP_END
488
489
490
491/*************************************
492 *
493 *  Input Ports
494 *
495 *************************************/
496
497
498static INPUT_PORTS_START( pet )
499   PORT_INCLUDE( pet_keyboard )    /* ROW0 -> ROW9 */
500
501   PORT_INCLUDE( pet_special )     /* SPECIAL */
502
503   PORT_INCLUDE( pet_config )      /* CFG */
504INPUT_PORTS_END
505
506
507static INPUT_PORTS_START( petb )
508   PORT_INCLUDE( pet_business_keyboard )   /* ROW0 -> ROW9 */
509
510   PORT_INCLUDE( pet_special )             /* SPECIAL */
511
512   PORT_INCLUDE( pet_config )              /* CFG */
513
514   PORT_MODIFY("CFG")
515   PORT_BIT( 0x180, 0x000, IPT_UNUSED )
516INPUT_PORTS_END
517
518
519static INPUT_PORTS_START( cbm8096 )
520   PORT_INCLUDE( petb )
521
522   PORT_MODIFY("CFG")
523   PORT_DIPNAME( 0x08, 0x08, "CBM8096, 8296 Expansion Memory")
524   PORT_DIPSETTING(    0x00, DEF_STR( No ) )
525   PORT_DIPSETTING(    0x08, DEF_STR( Yes ) )
526INPUT_PORTS_END
527
528
529static INPUT_PORTS_START (superpet)
530   PORT_INCLUDE( petb )
531
532   PORT_MODIFY("CFG")
533   PORT_DIPNAME( 0x04, 0x04, "CPU Select")
534   PORT_DIPSETTING(    0x00, "M6502" )
535   PORT_DIPSETTING(    0x04, "M6809" )
536INPUT_PORTS_END
537
538
539
540/*************************************
541 *
542 *  Graphics definitions
543 *
544 *************************************/
545
546
547static const unsigned char pet_palette[] =
548{
549   0,0,0, /* black */
550   0,0x80,0, /* green */
551};
552
553static const gfx_layout pet_charlayout =
554{
555   8,8,
556   256,                                    /* 256 characters */
557   1,                      /* 1 bits per pixel */
558   { 0 },                  /* no bitplanes; 1 bit per pixel */
559   /* x offsets */
560   { 0,1,2,3,4,5,6,7 },
561   /* y offsets */
562   { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
563   },
564   8*8
565};
566
567static const gfx_layout pet80_charlayout =
568{
569   8,16,
570   256,                                    /* 256 characters */
571   1,                      /* 1 bits per pixel */
572   { 0 },                  /* no bitplanes; 1 bit per pixel */
573   /* x offsets */
574   { 0,1,2,3,4,5,6,7 },
575   /* y offsets */
576   {
577      0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8,
578      8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, 15*8
579   },
580   8*16
581};
582
583static GFXDECODE_START( pet )
584   GFXDECODE_ENTRY( "gfx1", 0x0000, pet_charlayout, 0, 1 )
585   GFXDECODE_ENTRY( "gfx1", 0x0800, pet_charlayout, 0, 1 )
586GFXDECODE_END
587
588static GFXDECODE_START( pet80 )
589   GFXDECODE_ENTRY( "gfx1", 0x0000, pet80_charlayout, 0, 1 )
590   GFXDECODE_ENTRY( "gfx1", 0x1000, pet80_charlayout, 0, 1 )
591GFXDECODE_END
592
593static GFXDECODE_START( superpet )
594   GFXDECODE_ENTRY( "gfx1", 0x0000, pet80_charlayout, 0, 1 )
595   GFXDECODE_ENTRY( "gfx1", 0x1000, pet80_charlayout, 0, 1 )
596   GFXDECODE_ENTRY( "gfx1", 0x2000, pet80_charlayout, 0, 1 )
597   GFXDECODE_ENTRY( "gfx1", 0x3000, pet80_charlayout, 0, 1 )
598GFXDECODE_END
599
600
601static MC6845_INTERFACE( crtc_pet40 )
602{
603   "screen",
604   false,
605   8,
606   NULL,
607   pet40_update_row,
608   NULL,
609   DEVCB_DRIVER_LINE_MEMBER(pet_state, pet_display_enable_changed),
610   DEVCB_NULL,
611   DEVCB_NULL,
612   DEVCB_NULL,
613   NULL
614};
615
616static MC6845_INTERFACE( crtc_pet80 )
617{
618   "screen",
619   false,
620   16,
621   NULL,
622   pet80_update_row,
623   NULL,
624   DEVCB_DRIVER_LINE_MEMBER(pet_state, pet_display_enable_changed),
625   DEVCB_NULL,
626   DEVCB_NULL,
627   DEVCB_NULL,
628   NULL
629};
630
631void pet_state::palette_init()
632{
633   int i;
634
635   for ( i = 0; i < sizeof(pet_palette) / 3; i++ ) {
636      palette_set_color_rgb(machine(), i, pet_palette[i*3], pet_palette[i*3+1], pet_palette[i*3+2]);
637   }
638}
639
640VIDEO_START_MEMBER(pet_state,pet_crtc)
641{
642}
643
644static IEEE488_INTERFACE( ieee488_intf )
645{
646   DEVCB_NULL,
647   DEVCB_NULL,
648   DEVCB_NULL,
649   DEVCB_NULL,
650   DEVCB_NULL,
651   DEVCB_DEVICE_LINE_MEMBER("pia_1", pia6821_device, cb1_w),
652   DEVCB_DEVICE_LINE_MEMBER("pia_1", pia6821_device, ca1_w),
653   DEVCB_NULL
654};
655
656//-------------------------------------------------
657//  PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
658//-------------------------------------------------
659
660static PET_DATASSETTE_PORT_INTERFACE( datassette_intf )
661{
662   DEVCB_DEVICE_LINE_MEMBER("pia_0", pia6821_device, cb1_w)
663};
664
665//-------------------------------------------------
666//  PET_DATASSETTE_PORT_INTERFACE( datassette2_intf )
667//-------------------------------------------------
668
669static PET_DATASSETTE_PORT_INTERFACE( datassette2_intf )
670{
671   DEVCB_DEVICE_LINE_MEMBER("via6522_0", via6522_device, write_cb1)
672};
673
674
675/*************************************
676 *
677 *  Machine driver
678 *
679 *************************************/
680
681static MACHINE_CONFIG_START( pet_general, pet_state )
682   /* basic machine hardware */
683   MCFG_CPU_ADD("maincpu", M6502, XTAL_8MHz/8)
684   MCFG_CPU_PROGRAM_MAP(pet_mem)
685   MCFG_CPU_VBLANK_INT_DRIVER("screen", pet_state,  pet_frame_interrupt)
686
687
688   /* video hardware */
689   MCFG_SCREEN_ADD("screen", RASTER)
690   MCFG_SCREEN_REFRESH_RATE(60)
691   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
692   MCFG_SCREEN_SIZE(320, 200)
693   MCFG_SCREEN_VISIBLE_AREA(0, 320 - 1, 0, 200 - 1)
694   MCFG_SCREEN_UPDATE_DRIVER(pet_state, screen_update_pet)
695
696   MCFG_GFXDECODE( pet )
697   MCFG_PALETTE_LENGTH(ARRAY_LENGTH(pet_palette) / 3)
698
699   /* cassette */
700   MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT_TAG, datassette_intf, cbm_datassette_devices, "c1530", NULL)
701   MCFG_PET_DATASSETTE_PORT_ADD(PET_DATASSETTE_PORT2_TAG, datassette2_intf, cbm_datassette_devices, NULL, NULL)
702
703   /* via */
704   MCFG_VIA6522_ADD( "via6522_0", 0, pet_via)
705
706   /* pias */
707   MCFG_PIA6821_ADD( "pia_0", pet_pia0)
708   MCFG_PIA6821_ADD( "pia_1", pet_pia1)
709
710   /* software lists */
711   MCFG_SOFTWARE_LIST_ADD("rom_list", "pet_rom")
712   MCFG_SOFTWARE_LIST_ADD("flop_list", "pet_flop")
713MACHINE_CONFIG_END
714
715
716static MACHINE_CONFIG_DERIVED( pet, pet_general )
717   MCFG_QUICKLOAD_ADD("quickload", cbm_pet, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
718   MCFG_FRAGMENT_ADD(pet_cartslot)
719
720   /* internal ram */
721   MCFG_RAM_ADD(RAM_TAG)
722   MCFG_RAM_DEFAULT_SIZE("32K")
723   MCFG_RAM_EXTRA_OPTIONS("8K,16K")
724
725   /* IEEE bus */
726   MCFG_CBM_IEEE488_ADD(ieee488_intf, "c4040")
727MACHINE_CONFIG_END
728
729
730static MACHINE_CONFIG_DERIVED( petb, pet )
731   MCFG_PIA6821_MODIFY( "pia_0", petb_pia0 )
732MACHINE_CONFIG_END
733
734static MACHINE_CONFIG_DERIVED( pet2001, pet_general )
735   MCFG_QUICKLOAD_ADD("quickload", cbm_pet1, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
736   MCFG_FRAGMENT_ADD(pet_cartslot)
737
738   /* internal ram */
739   MCFG_RAM_ADD(RAM_TAG)
740   MCFG_RAM_DEFAULT_SIZE("8K")
741   MCFG_RAM_EXTRA_OPTIONS("4K")
742
743   /* IEEE bus */
744   MCFG_CBM_IEEE488_ADD(ieee488_intf, "c4040")
745MACHINE_CONFIG_END
746
747
748static MACHINE_CONFIG_DERIVED( pet40, pet )
749   MCFG_CPU_MODIFY( "maincpu" )
750   MCFG_CPU_PROGRAM_MAP( pet40_mem)
751
752   MCFG_MC6845_ADD("crtc", MC6845, XTAL_17_73447MHz/3  /* This is a wild guess and mostly likely incorrect */, crtc_pet40)
753
754   MCFG_VIDEO_START_OVERRIDE(pet_state, pet_crtc )
755   MCFG_SCREEN_MODIFY("screen")
756   MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
757
758   MCFG_FRAGMENT_ADD(pet4_cartslot)
759MACHINE_CONFIG_END
760
761
762static MACHINE_CONFIG_DERIVED( pet40pal, pet40 )
763
764   MCFG_SCREEN_MODIFY("screen")
765   MCFG_SCREEN_REFRESH_RATE(50)
766MACHINE_CONFIG_END
767
768
769static MACHINE_CONFIG_DERIVED( pet80, pet_general )
770   MCFG_QUICKLOAD_ADD("quickload", cbm_pet, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
771   MCFG_FRAGMENT_ADD(pet_cartslot)
772
773   MCFG_CPU_MODIFY( "maincpu" )
774   MCFG_CPU_PROGRAM_MAP( pet80_mem)
775
776   /* video hardware */
777   MCFG_SCREEN_MODIFY("screen")
778   MCFG_SCREEN_SIZE(640, 250)
779   MCFG_SCREEN_VISIBLE_AREA(0, 640 - 1, 0, 250 - 1)
780   MCFG_SCREEN_UPDATE_DEVICE( "crtc", mc6845_device, screen_update )
781
782   MCFG_MC6845_ADD("crtc", MC6845, XTAL_12MHz / 2  /* This is a wild guess and mostly likely incorrect */, crtc_pet80)
783
784   MCFG_GFXDECODE( pet80 )
785   MCFG_VIDEO_START_OVERRIDE(pet_state, pet_crtc )
786
787   MCFG_PIA6821_MODIFY( "pia_0", petb_pia0 )
788
789   MCFG_FRAGMENT_ADD(pet4_cartslot)
790
791   /* internal ram */
792   MCFG_RAM_ADD(RAM_TAG)
793   MCFG_RAM_DEFAULT_SIZE("32K")
794
795   /* IEEE bus */
796   MCFG_CBM_IEEE488_ADD(ieee488_intf, "c8050")
797MACHINE_CONFIG_END
798
799
800static MACHINE_CONFIG_DERIVED( pet80pal, pet80 )
801   MCFG_SCREEN_MODIFY("screen")
802   MCFG_SCREEN_REFRESH_RATE(50)
803MACHINE_CONFIG_END
804
805
806static MACHINE_CONFIG_DERIVED( superpet, pet80 )
807   MCFG_CPU_MODIFY( "maincpu" )
808   MCFG_CPU_PROGRAM_MAP( superpet_mem)
809
810   /* m6809 cpu */
811   MCFG_CPU_ADD("m6809", M6809, 1000000)
812   MCFG_CPU_PROGRAM_MAP(superpet_m6809_mem)
813   MCFG_CPU_VBLANK_INT_DRIVER("screen", pet_state,  pet_frame_interrupt)
814
815   MCFG_SCREEN_MODIFY("screen")
816   MCFG_SCREEN_REFRESH_RATE(50)
817   MCFG_GFXDECODE( superpet )
818
819   MCFG_PIA6821_MODIFY( "pia_0", petb_pia0 )
820
821   MCFG_SOFTWARE_LIST_ADD("flop_list2", "superpet_flop")
822MACHINE_CONFIG_END
823
824
825static MACHINE_CONFIG_DERIVED( cbm8296, pet80pal )
826   MCFG_SOFTWARE_LIST_ADD("flop_list2", "cbm8296_flop")
827MACHINE_CONFIG_END
828
829
830
831/*************************************
832 *
833 *  ROM definition(s)
834 *
835 *************************************/
836
837
838/* PET 2001 - Board type 1 (Static Board) */
839/* BASIC 1 - "*** COMMODORE BASIC ***" at boot */
840/* Four board variations depending on
841    ROM sockets: either 6540 or 2316B
842    RAM: either 6550 or 2114
843The ROM content is the same in both cases, but the labels differ. Below we use labels
844from the 2316B version. For documentation sake, these would have been the labels based on
845the board with 6540 ROMs
846
847901439-01.h1 / 901439-09.h1
848901439-05.h5
849901439-02.h2
850901439-06.h6
851901439-03.h3
852901439-04.h4
853901439-07.h7
854901439-08.a2
855
856Also, in some board with 2316B, the location of the ROMs changes h1 <-> h5, h2 <-> h6 and
857h4 <-> h7
858*/
859
860ROM_START( pet2001 )
861   ROM_REGION( 0x10000, "maincpu", 0 )
862   ROM_SYSTEM_BIOS( 0, "basic1", "BASIC 1r" )
863   ROMX_LOAD( "901447-09.h1", 0xc000, 0x800, CRC(03cf16d0) SHA1(1330580c0614d3556a389da4649488ba04a60908), ROM_BIOS(1) )
864   ROM_SYSTEM_BIOS( 1, "basic1o", "BASIC 1" )
865   ROMX_LOAD( "901447-01.h1", 0xc000, 0x800, CRC(a055e33a) SHA1(831db40324113ee996c434d38b4add3fd1f820bd), ROM_BIOS(2) )
866   ROM_LOAD( "901447-02.h5", 0xc800, 0x800, CRC(69fd8a8f) SHA1(70c0f4fa67a70995b168668c957c3fcf2c8641bd) )
867   ROM_LOAD( "901447-03.h2", 0xd000, 0x800, CRC(d349f2d4) SHA1(4bf2c20c51a63d213886957485ebef336bb803d0) )
868   ROM_LOAD( "901447-04.h6", 0xd800, 0x800, CRC(850544eb) SHA1(d293972d529023d8fd1f493149e4777b5c253a69) )
869   ROM_LOAD( "901447-05.h3", 0xe000, 0x800, CRC(9e1c5cea) SHA1(f02f5fb492ba93dbbd390f24c10f7a832dec432a) )
870   ROM_LOAD( "901447-06.h4", 0xf000, 0x800, CRC(661a814a) SHA1(960717282878e7de893d87242ddf9d1512be162e) )
871   ROM_LOAD( "901447-07.h7", 0xf800, 0x800, CRC(c4f47ad1) SHA1(d440f2510bc52e20c3d6bc8b9ded9cea7f462a9c) )
872
873   ROM_REGION( 0x1000, "gfx1", 0 )
874   ROM_LOAD( "901447-08.a2", 0x0000, 0x800, CRC(54f32f45) SHA1(3e067cc621e4beafca2b90cb8f6dba975df2855b) )
875ROM_END
876
877
878/* PET 2001-N / 2001-B / CBM 30XX / PET 40XX (early) / CBM 40XX (early) - Board type 2 (Dynamic Board) */
879/* BASIC 1 upgraded / BASIC 2 - "### COMMODORE BASIC ###" at boot */
880/* Again different kind of ROM sockets can be found. */
881/* These boards would support BASIC 1 as well, if the content would be put on 4K ROMs */
882
883/* BASIC 2 */
884ROM_START( pet2001n )
885   ROM_REGION( 0x10000, "maincpu", 0 )
886   ROM_LOAD( "901465-01.ud6", 0xc000, 0x1000, CRC(63a7fe4a) SHA1(3622111f486d0e137022523657394befa92bde44) )   // BASIC 2
887   ROM_LOAD( "901465-02.ud7", 0xd000, 0x1000, CRC(ae4cb035) SHA1(1bc0ebf27c9bb62ad71bca40313e874234cab6ac) )   // BASIC 2
888   ROM_LOAD( "901447-24.ud8", 0xe000, 0x800,  CRC(e459ab32) SHA1(5e5502ce32f5a7e387d65efe058916282041e54b) )   // Screen Editor (40 columns, no CRTC, Normal Keyb)
889   ROM_LOAD( "901465-03.ud9", 0xf000, 0x1000, CRC(f02238e2) SHA1(38742bdf449f629bcba6276ef24d3daeb7da6e84) )   // Kernal
890
891   ROM_REGION( 0x1000, "gfx1", 0 )
892   ROM_LOAD( "901447-10.uf10", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )   // Character Generator
893ROM_END
894
895/* BASIC 2 - Business Keyboard (Number keys, etc.) */
896ROM_START( pet2001b )
897   ROM_REGION( 0x10000, "maincpu", 0 )
898   ROM_LOAD( "901465-01.ud6", 0xc000, 0x1000, CRC(63a7fe4a) SHA1(3622111f486d0e137022523657394befa92bde44) )   // BASIC 2
899   ROM_LOAD( "901465-02.ud7", 0xd000, 0x1000, CRC(ae4cb035) SHA1(1bc0ebf27c9bb62ad71bca40313e874234cab6ac) )   // BASIC 2
900   ROM_LOAD( "901474-01.ud8", 0xe000, 0x800,  CRC(05db957e) SHA1(174ace3a8c0348cd21d39cc864e2adc58b0101a9) )   // Screen Editor (40 columns, no CRTC, Business Keyb)
901   ROM_LOAD( "901465-03.ud9", 0xf000, 0x1000, CRC(f02238e2) SHA1(38742bdf449f629bcba6276ef24d3daeb7da6e84) )   // Kernal
902
903   ROM_REGION( 0x1000, "gfx1", 0 )
904   ROM_LOAD( "901447-10.uf10", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )   // Character Generator
905ROM_END
906
907#define rom_cbm30       rom_pet2001n
908#define rom_cbm30b      rom_pet2001b
909
910/* BASIC 4, but 40 columns only and no CRTC */
911ROM_START( pet40on )
912   ROM_REGION( 0x10000, "maincpu", 0 )
913   ROM_SYSTEM_BIOS( 0, "basic4", "BASIC 4r" )
914   ROMX_LOAD( "901465-23.ud5", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc), ROM_BIOS(1) ) // BASIC 4
915   ROM_SYSTEM_BIOS( 1, "basic4o", "BASIC 4" )
916   ROMX_LOAD( "901465-19.ud5", 0xb000, 0x1000, CRC(3a5f5721) SHA1(bc2b7c99495fea3eda950ee9e3d6cabe448a452b), ROM_BIOS(2) )
917   ROM_LOAD( "901465-20.ud6", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
918   ROM_LOAD( "901465-21.ud7", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
919   ROM_LOAD( "901447-29.ud8", 0xe000, 0x800,  CRC(e5714d4c) SHA1(e88f56e5c54b0e8d8d4e8cb39a4647c803c1f51c) )   // Screen Editor (40 columns, no CRTC, Normal Keyb)
920   ROM_LOAD( "901465-22.ud9", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
921
922   ROM_REGION( 0x1000, "gfx1", 0 )
923   ROM_LOAD( "901447-10.uf10", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )   // Character Generator
924ROM_END
925
926/* BASIC 4, but 40 columns only and no CRTC - Business Keyboard (Number keys, etc.) */
927ROM_START( pet40ob )
928   ROM_REGION( 0x10000, "maincpu", 0 )
929   ROM_SYSTEM_BIOS( 0, "basic4", "BASIC 4r" )
930   ROMX_LOAD( "901465-23.ud5", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc), ROM_BIOS(1) )
931   ROM_SYSTEM_BIOS( 1, "basic4o", "BASIC 4" )
932   ROMX_LOAD( "901465-19.ud5", 0xb000, 0x1000, CRC(3a5f5721) SHA1(bc2b7c99495fea3eda950ee9e3d6cabe448a452b), ROM_BIOS(2) )
933   ROM_LOAD( "901465-20.ud6", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
934   ROM_LOAD( "901465-21.ud7", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
935   ROM_LOAD( "901474-02.ud8", 0xe000, 0x800,  CRC(75ff4af7) SHA1(0ca5c4e8f532f914cb0bf86ea9900f20f0a655ce) )   // Screen Editor (40 columns, no CRTC, Business Keyb)
936   ROM_LOAD( "901465-22.ud9", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
937
938   ROM_REGION( 0x1000, "gfx1", 0 )
939   ROM_LOAD( "901447-10.uf10", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )   // Character Generator
940ROM_END
941
942#define rom_cbm40o      rom_pet40on
943#define rom_cbm40ob     rom_pet40ob
944
945/* PET 40XX (later) / PET 80XX / CBM 400XX (later) / CBM 80XX - Board type 3 (80 columns Board) & 4 (Universal Board) */
946/* BASIC 4, Board 3: 80 columns only using CRTC - Board 4: 40 or 80 columns using CRTC, changed through a jumper on the board */
947/* Board 3 ones can only run the 80 columns BASIC 4, Board 4 can run all BASIC versions supporting CRTC */
948
949/* 40 columns - 60 Hz */
950ROM_START( pet40n )
951   ROM_REGION( 0x10000, "maincpu", 0 )
952   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
953   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
954   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
955   ROM_LOAD( "901499-01.ud7", 0xe000, 0x800,  CRC(5f85bdf8) SHA1(8cbf086c1ce4dfb2a2fe24c47476dfb878493dee) )   // Screen Editor (40 columns, CRTC 60Hz, Normal Keyb?)
956   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
957
958   ROM_REGION( 0x1000, "gfx1", 0 )
959   ROM_LOAD( "901447-10.ua3", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )    // Character Generator
960ROM_END
961
962/* 40 columns - 50 Hz */
963ROM_START( cbm40n )
964   ROM_REGION( 0x10000, "maincpu", 0 )
965   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
966   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
967   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
968   ROM_LOAD( "901498-01.ud7", 0xe000, 0x800,  CRC(3370e359) SHA1(05af284c914d53a52987b5f602466de75765f650) )   // Screen Editor (40 columns, CRTC 50Hz, Normal Keyb?)
969   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
970
971   ROM_REGION( 0x1000, "gfx1", 0 )
972   ROM_LOAD( "901447-10.ua3", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )    // Character Generator
973ROM_END
974
975/* 80 columns - 60 Hz */
976ROM_START( pet40b )
977   ROM_REGION( 0x10000, "maincpu", 0 )
978   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
979   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
980   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
981   ROM_LOAD( "901474-03.ud7", 0xe000, 0x800,  CRC(5674dd5e) SHA1(c605fa343fd77c73cbe1e0e9567e2f014f6e7e30) )   // Screen Editor (80 columns, CRTC 60Hz, Business Keyb)
982   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
983
984   ROM_REGION( 0x2000, "gfx1", 0 )
985   ROM_LOAD( "901447-10.ua3", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )    // Character Generator
986ROM_END
987
988/* 80 columns - 50 Hz */
989ROM_START( cbm40b )
990   ROM_REGION( 0x10000, "maincpu", 0 )
991   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
992   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
993   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
994   ROM_SYSTEM_BIOS( 0, "default", "BASIC 4" )
995   ROMX_LOAD( "901474-04.ud7", 0xe000, 0x800,  CRC(abb000e7) SHA1(66887061b6c4ebef7d6efb90af9afd5e2c3b08ba), ROM_BIOS(1) ) // Screen Editor (80 columns, CRTC 50Hz, Business Keyb)
996   ROM_SYSTEM_BIOS( 1, "alt", "BASIC 4 (alt Editor)" )
997   ROMX_LOAD( "901474-04a.ud7", 0xe000, 0x800, BAD_DUMP CRC(845a44e6) SHA1(81975eab31a8f4f51ae2a20d099a567c7b3f2dd1), ROM_BIOS(2) )
998   ROM_SYSTEM_BIOS( 2, "old", "BASIC 4 (Editor dated 3681)" )
999   ROMX_LOAD( "901474-04o.ud7", 0xe000, 0x800, CRC(c1ffca3a) SHA1(7040b283ba39e9630e3d147f7d076b7abc39bc70), ROM_BIOS(3) )
1000   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1001
1002   ROM_REGION( 0x2000, "gfx1", 0 )
1003   ROM_LOAD( "901447-10.ua3", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )    // Character Generator
1004ROM_END
1005
1006/* 80 columns - 60 Hz - can be expanded to 96k RAM */
1007ROM_START( pet80 )
1008   ROM_REGION( 0x20000, "maincpu", 0 )
1009   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
1010   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
1011   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
1012   ROM_LOAD( "901474-03.ud7", 0xe000, 0x800,  CRC(5674dd5e) SHA1(c605fa343fd77c73cbe1e0e9567e2f014f6e7e30) )   // Screen Editor (80 columns, CRTC 60Hz, Business Keyb)
1013   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1014
1015   ROM_REGION( 0x2000, "gfx1", 0 )
1016   ROM_LOAD( "901447-10.ua3", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )    // Character Generator
1017ROM_END
1018
1019/* 80 columns - 50 Hz - can be expanded to 96k RAM */
1020ROM_START( cbm80 )
1021   ROM_REGION( 0x20000, "maincpu", 0 )
1022   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
1023   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
1024   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
1025   ROM_SYSTEM_BIOS( 0, "default", "BASIC 4" )
1026   ROMX_LOAD( "901474-04.ud7", 0xe000, 0x800,  CRC(abb000e7) SHA1(66887061b6c4ebef7d6efb90af9afd5e2c3b08ba), ROM_BIOS(1) ) // Screen Editor (80 columns, CRTC 50Hz, Business Keyb)
1027   ROM_SYSTEM_BIOS( 1, "alt", "BASIC 4 (alt Editor)" )
1028   ROMX_LOAD( "901474-04a.ud7", 0xe000, 0x800, BAD_DUMP CRC(845a44e6) SHA1(81975eab31a8f4f51ae2a20d099a567c7b3f2dd1), ROM_BIOS(2) )
1029   ROM_SYSTEM_BIOS( 2, "old", "BASIC 4 (Editor dated 3681)" )
1030   ROMX_LOAD( "901474-04o.ud7", 0xe000, 0x800, CRC(c1ffca3a) SHA1(7040b283ba39e9630e3d147f7d076b7abc39bc70), ROM_BIOS(3) )
1031   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1032
1033   ROM_REGION( 0x2000, "gfx1", 0 )
1034   ROM_LOAD( "901447-10.ua3", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )    // Character Generator
1035ROM_END
1036
1037
1038/* Two different layouts are documented for the m6809 */
1039/* The 2532 EEPROM listed below (2516 for the .u21 one) could have been replaced by three 2764 EEPROM.
1040In this case the labels would have been as follows
1041
1042970018-12.u47 (contents: u17+u18 below)
1043970019-12.u48 (contents: u19+u20 below)
1044970020-12.u49 (contents: u21+u22 below)
1045
1046*/
1047
1048ROM_START( superpet )
1049   ROM_REGION( 0x10000, "maincpu", 0 )
1050   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
1051   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
1052   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
1053   ROM_LOAD( "901474-04.ud7", 0xe000, 0x800,  CRC(abb000e7) SHA1(66887061b6c4ebef7d6efb90af9afd5e2c3b08ba) )   // Screen Editor (80 columns, CRTC 50Hz, Business Keyb)
1054   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1055
1056   ROM_REGION( 0x10000, "m6809", 0 )
1057   ROM_LOAD( "901898-01.u17", 0xa000, 0x1000, CRC(728a998b) SHA1(0414b3ab847c8977eb05c2fcc72efcf2f9d92871) )
1058   ROM_LOAD( "901898-02.u18", 0xb000, 0x1000, CRC(6beb7c62) SHA1(df154939b934d0aeeb376813ec1ba0d43c2a3378) )
1059   ROM_LOAD( "901898-03.u19", 0xc000, 0x1000, CRC(5db4983d) SHA1(6c5b0cce97068f8841112ba6d5cd8e568b562fa3) )
1060   ROM_LOAD( "901898-04.u20", 0xd000, 0x1000, CRC(f55fc559) SHA1(b42a2050a319a1ffca7868a8d8d635fadd37ec37) )
1061   ROM_LOAD( "901897-01.u21", 0xe000, 0x800,  CRC(b2cee903) SHA1(e8ce8347451a001214a5e71a13081b38b4be23bc) )
1062   ROM_LOAD( "901898-05.u22", 0xf000, 0x1000, CRC(f42df0cb) SHA1(9b4a5134d20345171e7303445f87c4e0b9addc96) )
1063
1064   ROM_REGION( 0x4000, "gfx1", 0 )
1065   ROM_LOAD( "901640-01.ub3", 0x0000, 0x1000, CRC(ee8229c4) SHA1(bf346f11595a3e65e55d6aeeaa2c0cec807b66c7) )
1066ROM_END
1067
1068#define rom_sp9000      rom_superpet
1069
1070
1071/* CBM 8296 / 8296D - only ROM loading added */
1072ROM_START( cbm8296 )
1073   ROM_REGION( 0x20000, "maincpu", 0 )
1074   ROM_LOAD( "324746-01.ue7", 0xb000, 0x3000, CRC(7935b528) SHA1(5ab17ee70467152bf2130e3f48a2aa81e9df93c9) )   // BASIC 4 // FIX ME!!
1075   ROM_CONTINUE(              0xf000, 0x1000 )
1076   ROM_LOAD( "901474-04.ue8", 0xe000, 0x800,  CRC(c1ffca3a) SHA1(7040b283ba39e9630e3d147f7d076b7abc39bc70) )   // Dated 0384, coincides with 3681 above according to Andr? Fachat's notes
1077
1078   ROM_REGION( 0x4000, "gfx1", 0 )
1079   ROM_LOAD( "901447-10.uc5", 0x0000, 0x800, CRC(d8408674) SHA1(0157a2d55b7ac4eaeb38475889ebeea52e2593db) )    // Character Generator
1080ROM_END
1081
1082#define rom_cbm8296d    rom_cbm8296
1083
1084
1085/* PAL regional variants */
1086
1087ROM_START( cbm80ger )
1088   ROM_REGION( 0x20000, "maincpu", 0 )
1089   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
1090   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
1091   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
1092   ROM_LOAD( "german.bin",    0xe000, 0x800,  CRC(1c1e597d) SHA1(7ac75ed73832847623c9f4f197fe7fb1a73bb41c) )
1093   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1094
1095   ROM_REGION( 0x2000, "gfx1", 0 )
1096   ROM_LOAD( "chargen.de", 0x0000, 0x800, CRC(3bb8cb87) SHA1(a4f0df13473d7f9cd31fd62cfcab11318e2fb1dc) )
1097ROM_END
1098
1099ROM_START( cbm80swe )
1100   ROM_REGION( 0x20000, "maincpu", 0 )
1101   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
1102   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
1103   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
1104   ROM_LOAD( "swedish.bin",   0xe000, 0x800,  CRC(75901dd7) SHA1(2ead0d83255a344a42bb786428353ca48d446d03) )       // It had a label "8000-UD7, SCREEN-04"
1105   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1106
1107   ROM_REGION( 0x2000, "gfx1", 0 )
1108   ROM_LOAD( "901447-14.ua3", 0x0000, 0x800, CRC(48c77d29) SHA1(aa7c8ff844d16ec05e2b32acc586c58d9e35388c) )    // Character Generator
1109ROM_END
1110
1111/* This had only the CharGen dumped, the editor needs to be dumped as well (and the other ones verified)!!  */
1112ROM_START( cbm30nor )
1113   ROM_REGION( 0x10000, "maincpu", 0 )
1114   ROM_LOAD( "901465-01.ud6", 0xc000, 0x1000, CRC(63a7fe4a) SHA1(3622111f486d0e137022523657394befa92bde44) )   // BASIC 2
1115   ROM_LOAD( "901465-02.ud7", 0xd000, 0x1000, CRC(ae4cb035) SHA1(1bc0ebf27c9bb62ad71bca40313e874234cab6ac) )   // BASIC 2
1116   ROM_LOAD( "901474-01.ud8", 0xe000, 0x800,  BAD_DUMP CRC(05db957e) SHA1(174ace3a8c0348cd21d39cc864e2adc58b0101a9) )  // Screen Editor to be redumped
1117   ROM_LOAD( "901465-03.ud9", 0xf000, 0x1000, CRC(f02238e2) SHA1(38742bdf449f629bcba6276ef24d3daeb7da6e84) )   // Kernal
1118
1119   ROM_REGION( 0x1000, "gfx1", 0 )
1120   ROM_LOAD( "norwegian.uf10", 0x0000, 0x800, CRC(7c00534a) SHA1(2c46bd5f5351530ceb52686e5196de995e28e24f) )   // Character Generator dumped from a CBM 3032 // FIX ME!!
1121ROM_END
1122
1123/* This had only the CharGen dumped, the editor needs to be dumped as well (and the other ones verified)!!  */
1124ROM_START( cbm80hun )
1125   ROM_REGION( 0x20000, "maincpu", 0 )
1126   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
1127   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
1128   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
1129   ROM_LOAD( "901474-04.ud7", 0xe000, 0x800,  BAD_DUMP CRC(abb000e7) SHA1(66887061b6c4ebef7d6efb90af9afd5e2c3b08ba) )  // Screen Editor (80 columns, CRTC 50Hz, Business Keyb)
1130   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1131
1132   ROM_REGION( 0x2000, "gfx1", 0 )
1133   ROM_LOAD( "hungarian.ua3", 0x0000, 0x800, CRC(a02d8122) SHA1(2fedbb59068b457d98f28de79f1817e25f745604) )    // Character Generator // FIX ME!!
1134ROM_END
1135
1136/* Swedish M6809 roms needed */
1137ROM_START( mmf9000s )
1138   ROM_REGION( 0x10000, "maincpu", 0 )
1139   ROM_LOAD( "901465-23.ud10", 0xb000, 0x1000, CRC(ae3deac0) SHA1(975ee25e28ff302879424587e5fb4ba19f403adc) )  // BASIC 4
1140   ROM_LOAD( "901465-20.ud9", 0xc000, 0x1000, CRC(0fc17b9c) SHA1(242f98298931d21eaacb55fe635e44b7fc192b0a) )   // BASIC 4
1141   ROM_LOAD( "901465-21.ud8", 0xd000, 0x1000, CRC(36d91855) SHA1(1bb236c72c726e8fb029c68f9bfa5ee803faf0a8) )   // BASIC 4
1142   ROM_LOAD( "swedish.bin",   0xe000, 0x800,  CRC(75901dd7) SHA1(2ead0d83255a344a42bb786428353ca48d446d03) )
1143   ROM_LOAD( "901465-22.ud6", 0xf000, 0x1000, CRC(cc5298a1) SHA1(96a0fa56e0c937da92971d9c99d504e44e898806) )   // Kernal
1144
1145   ROM_REGION( 0x20000, "m6809", 0 )
1146   ROM_LOAD( "901898-01.u17", 0xa000, 0x1000, BAD_DUMP CRC(728a998b) SHA1(0414b3ab847c8977eb05c2fcc72efcf2f9d92871) )
1147   ROM_LOAD( "901898-02.u18", 0xb000, 0x1000, BAD_DUMP CRC(6beb7c62) SHA1(df154939b934d0aeeb376813ec1ba0d43c2a3378) )
1148   ROM_LOAD( "901898-03.u19", 0xc000, 0x1000, BAD_DUMP CRC(5db4983d) SHA1(6c5b0cce97068f8841112ba6d5cd8e568b562fa3) )
1149   ROM_LOAD( "901898-04.u20", 0xd000, 0x1000, BAD_DUMP CRC(f55fc559) SHA1(b42a2050a319a1ffca7868a8d8d635fadd37ec37) )
1150   ROM_LOAD( "901897-01.u21", 0xe000, 0x800,  BAD_DUMP CRC(b2cee903) SHA1(e8ce8347451a001214a5e71a13081b38b4be23bc) )
1151   ROM_LOAD( "901898-05.u22", 0xf000, 0x1000, BAD_DUMP CRC(f42df0cb) SHA1(9b4a5134d20345171e7303445f87c4e0b9addc96) )
1152
1153   ROM_REGION( 0x4000, "gfx1", 0 )
1154   ROM_LOAD("skand.gen.ub3", 0x0000, 0x1000, CRC(da1cd630) SHA1(35f472114ff001259bdbae073ae041b0759e32cb) )    // Actual label was "901640-01 SKAND.GEN."
1155ROM_END
1156
1157/***************************************************************************
1158
1159  Game driver(s)
1160
1161***************************************************************************/
1162
1163/* YEAR    NAME      PARENT    COMPAT    MACHINE   INPUT     INIT      COMPANY                             FULLNAME */
1164
1165COMP(1977, pet2001,  0,        0,        pet2001,  pet, pet_state,      pet2001, "Commodore Business Machines",  "PET 2001", GAME_NOT_WORKING | GAME_NO_SOUND)
1166COMP(1979, pet2001n, pet2001,  0,        pet,      pet, pet_state,      pet,     "Commodore Business Machines",  "PET 2001-N", GAME_NOT_WORKING | GAME_NO_SOUND)
1167COMP(1979, pet2001b, pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "PET 2001-B", GAME_NOT_WORKING | GAME_NO_SOUND)
1168COMP(1979, cbm30,    pet2001,  0,        pet,      pet, pet_state,      pet,     "Commodore Business Machines",  "CBM 30xx", GAME_NOT_WORKING | GAME_NO_SOUND)
1169COMP(1979, cbm30b,   pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "CBM 30xx (Business keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
1170COMP(1979, cbm30nor, pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "CBM 30xx (Norway, Business keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
1171
1172/* So called, THIN-40 */
1173COMP(1980, pet40on,  pet2001,  0,        pet,      pet, pet_state,      pet,     "Commodore Business Machines",  "PET 40xx (Basic 4, no CRTC, Normal keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
1174COMP(1980, pet40ob,  pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "PET 40xx (Basic 4, no CRTC, Business keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
1175COMP(1980, cbm40o,   pet2001,  0,        pet,      pet, pet_state,      pet,     "Commodore Business Machines",  "CBM 40xx (Basic 4, no CRTC, Normal keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
1176COMP(1980, cbm40ob,  pet2001,  0,        petb,     petb, pet_state,     pet,     "Commodore Business Machines",  "CBM 40xx (Basic 4, no CRTC, Business keyboard)", GAME_NOT_WORKING | GAME_NO_SOUND)
1177
1178COMP(1981, pet80,    0,        0,        pet80,    cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "PET 80xx (Basic 4, CRTC 60Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1179COMP(1981, cbm80,    pet80,    0,        pet80pal, cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "CBM 80xx (Basic 4, CRTC 50Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1180COMP(1981, cbm80ger, pet80,    0,        pet80pal, cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "CBM 80xx (Germany, Basic 4, CRTC 50Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1181COMP(1981, cbm80hun, pet80,    0,        pet80pal, cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "CBM 80xx (Hungary, Basic 4, CRTC 50Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1182COMP(1981, cbm80swe, pet80,    0,        pet80pal, cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "CBM 80xx (Sweden, Basic 4, CRTC 50Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1183
1184/* So called, FAT-40 */
1185COMP(1981, pet40b,   pet80,    0,        pet80,    cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "PET 40xx (Basic 4, CRTC 60Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1186COMP(1981, pet40n,   pet2001,  0,        pet40,    pet, pet_state,      pet,     "Commodore Business Machines",  "PET 40xx (Basic 4, CRTC 60Hz, 40 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1187COMP(1981, cbm40b,   pet80,    0,        pet80pal, cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "CBM 40xx (Basic 4, CRTC 50Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1188COMP(1981, cbm40n,   pet2001,  0,        pet40pal, pet, pet_state,      pet,     "Commodore Business Machines",  "CBM 40xx (Basic 4, CRTC 50Hz, 40 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1189
1190COMP(1981, superpet, 0,        0,        superpet, superpet, pet_state, superpet,"Commodore Business Machines",  "SuperPET (CRTC 50Hz)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_NOT_WORKING)
1191COMP(1981, sp9000,   superpet, 0,        superpet, superpet, pet_state, superpet,"Commodore Business Machines",  "CBM SP9000 / MicroMainFrame 9000 (CRTC 50Hz)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_NOT_WORKING)
1192COMP(198?, mmf9000s, superpet, 0,        superpet, superpet, pet_state, superpet,"Commodore Business Machines",  "MicroMainFrame 9000 (Sweden, CRTC 50Hz)", GAME_NOT_WORKING | GAME_NO_SOUND | GAME_NOT_WORKING)
1193
1194COMP(1984, cbm8296,  pet80,    0,        cbm8296,  cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "CBM 8296 (Basic 4, CRTC 50Hz, 80 columns)", GAME_NOT_WORKING | GAME_NO_SOUND)
1195COMP(1984, cbm8296d, pet80,    0,        cbm8296,  cbm8096, pet_state,  pet80,   "Commodore Business Machines",  "CBM 8296D", GAME_NOT_WORKING | GAME_NO_SOUND)
trunk/src/mess/messcore.mak
r21304r21305
2828EMUOBJ = $(OBJ)/emu
2929
3030# MAME directories
31EMU_AUDIO = $(EMUOBJ)/audio
3231EMU_MACHINE = $(EMUOBJ)/machine
3332EMU_VIDEO = $(EMUOBJ)/video
3433MAME_AUDIO = $(MAMEOBJ)/audio
r21304r21305
4746MESS_VIDEO = $(MESSOBJ)/video
4847
4948OBJDIRS += \
50   $(EMU_AUDIO) \
5149   $(EMU_MACHINE) \
5250   $(EMU_VIDEO) \
5351   $(MAME_AUDIO) \

Previous 199869 Revisions Next


© 1997-2024 The MAME Team