Previous 15994 Revisions Next

r9329 Wednesday 6th October, 2010 at 12:08:48 UTC by Curt Coder
[POFO] Added keyboard.
[src/mess/drivers]portfoli.c
[src/mess/includes]portfoli.h
[src/mess/video]hd61830.c hd61830.h

src/mess/video/hd61830.c
r9328r9329
1212    TODO:
1313
1414    - external ROM
15    - text mode
16
15   - slave mode
16   
1717*/
1818
1919#include "emu.h"
r9328r9329
3838   HD61830_INSTRUCTION_CURSOR_ADDRESS_HIGH,
3939   HD61830_INSTRUCTION_DISPLAY_DATA_WRITE,
4040   HD61830_INSTRUCTION_DISPLAY_DATA_READ,
41   HD61830_INSTRUCTION_CLEAR_BIT,               /* not supported */
42   HD61830_INSTRUCTION_SET_BIT                  /* not supported */
41   HD61830_INSTRUCTION_CLEAR_BIT,
42   HD61830_INSTRUCTION_SET_BIT
4343};
4444
4545static const int HD61830_CYCLES[] = {
r9328r9329
4747};
4848
4949#define HD61830_MODE_EXTERNAL_CG   0x01   /* not supported */
50#define HD61830_MODE_GRAPHIC      0x02   /* text mode not supported */
51#define HD61830_MODE_CURSOR         0x04   /* not supported */
52#define HD61830_MODE_BLINK         0x08   /* not supported */
50#define HD61830_MODE_GRAPHIC      0x02
51#define HD61830_MODE_CURSOR         0x04
52#define HD61830_MODE_BLINK         0x08
5353#define HD61830_MODE_MASTER         0x10   /* not supported */
5454#define HD61830_MODE_DISPLAY_ON      0x20
5555
r9328r9329
6060typedef struct _hd61830_t hd61830_t;
6161struct _hd61830_t
6262{
63   address_space *space;   /* memory space */
63   address_space *ram;         /* video RAM memory space */
64   address_space *rom;         /* character ROM memory space */
6465
6566   int bf;                  /* busy flag */
6667
r9328r9329
7778   int nx;                  /* number of time divisions */
7879   int cp;                  /* cursor position */
7980
80    int blink;               /* blinking */
81    UINT8 blink;            /* blinking */
8182
8283   /* devices */
8384   screen_device *screen;
r9328r9329
169170
170171   if (LOG) logerror("HD61380 '%s' Display Data Read %02x\n", device->tag(), hd61830->dor);
171172
172   hd61830->dor = hd61830->space->read_byte(hd61830->cac);
173   hd61830->dor = hd61830->ram->read_byte(hd61830->cac);
173174
174175   hd61830->cac++;
175176
r9328r9329
183184WRITE8_DEVICE_HANDLER( hd61830_data_w )
184185{
185186   hd61830_t *hd61830 = get_safe_token(device);
187
186188   switch (hd61830->ir)
187189   {
188190   case HD61830_INSTRUCTION_MODE_CONTROL:
r9328r9329
257259      break;
258260
259261   case HD61830_INSTRUCTION_DISPLAY_DATA_WRITE:
260      hd61830->space->write_byte(hd61830->cac, data);
262      hd61830->ram->write_byte(hd61830->cac, data);
261263
262264      if (LOG) logerror("HD61380 '%s' Display Data Write %02x -> %04x row %u col %u\n", device->tag(), data, hd61830->cac, hd61830->cac / 40, hd61830->cac % 40);
263265
r9328r9329
267269   case HD61830_INSTRUCTION_CLEAR_BIT:
268270      {
269271      int nb = data & 0x07;
270      UINT8 data_ = hd61830->space->read_byte(hd61830->cac);
272      UINT8 data_ = hd61830->ram->read_byte(hd61830->cac);
271273
272274      data_ &= ~(2 << nb);
273275
274276      if (LOG) logerror("HD61380 '%s' Clear Bit %u at %04x\n", device->tag(), nb + 1, hd61830->cac);
275277
276      hd61830->space->write_byte(hd61830->cac, data_);
278      hd61830->ram->write_byte(hd61830->cac, data_);
277279
278280      hd61830->cac++;
279281      }
r9328r9329
282284   case HD61830_INSTRUCTION_SET_BIT:
283285      {
284286      int nb = data & 0x07;
285      UINT8 data_ = hd61830->space->read_byte(hd61830->cac);
287      UINT8 data_ = hd61830->ram->read_byte(hd61830->cac);
286288
287289      data_ |= 2 << nb;
288290
289291      if (LOG) logerror("HD61380 '%s' Set Bit %u at %04x\n", device->tag(), nb + 1, hd61830->cac);
290292
291      hd61830->space->write_byte(hd61830->cac, data_);
293      hd61830->ram->write_byte(hd61830->cac, data_);
292294
293295      hd61830->cac++;
294296      }
r9328r9329
310312static void draw_scanline(running_device *device, bitmap_t *bitmap, const rectangle *cliprect, int y, UINT16 ra)
311313{
312314   hd61830_t *hd61830 = get_safe_token(device);
313   int sx, x;
314315
315   for (sx = 0; sx < hd61830->hn; sx++)
316   for (int sx = 0; sx < hd61830->hn; sx++)
316317   {
317      UINT8 data = hd61830->space->read_byte(ra++);
318      UINT8 data = hd61830->ram->read_byte(ra++);
318319
319      for (x = 0; x < hd61830->hp; x++)
320      for (int x = 0; x < hd61830->hp; x++)
320321      {
321322         *BITMAP_ADDR16(bitmap, y, (sx * hd61830->hp) + x) = BIT(data, 0);
322323         data >>= 1;
r9328r9329
331332static void update_graphics(running_device *device, bitmap_t *bitmap, const rectangle *cliprect)
332333{
333334   hd61830_t *hd61830 = get_safe_token(device);
334   int y;
335335
336   for (y = 0; y < hd61830->nx; y++)
336   for (int y = 0; y < hd61830->nx; y++)
337337   {
338338      UINT16 rac1 = hd61830->dsa + (y * hd61830->hn);
339339      UINT16 rac2 = rac1 + (hd61830->nx * hd61830->hn);
r9328r9329
357357   if (char_code < 0x20 || char_code > 0x7f)
358358      return;
359359
360   for(int cl = 0; cl < 7; cl++)
360   for (int cl = 0; cl < 7; cl++)
361361   {
362      for(int cr = 0; cr < 5; cr++)
362      for (int cr = 0; cr < 5; cr++)
363363      {
364         if (hd61830->screen->height() > y * hd61830->vp + cl && hd61830->screen->width() > x * hd61830->hp + cr )
364         if ((hd61830->screen->height() > y * hd61830->vp + cl) && (hd61830->screen->width() > x * hd61830->hp + cr))
365         {
365366            *BITMAP_ADDR16(bitmap, y * hd61830->vp + cl, x * hd61830->hp + cr) = device->subregion("hd61830")->u8(((char_code - 0x20) * 7 + cl)) & (1<<(4 - cr)) ? 1 : 0;
367         }
366368      }
367369   }
368370}
r9328r9329
375377{
376378   hd61830_t *hd61830 = get_safe_token(device);
377379
378   if (hd61830->blink < 0xff)
379      hd61830->blink++;
380   else
381      hd61830->blink = 0;
380   hd61830->blink++;
382381
383   for(int y = 0; y < 8; y++)
384      for(int x = 0; x < hd61830->hn; x++)
382   for (int y = 0; y < 8; y++)
383   {
384      for (int x = 0; x < hd61830->hn; x++)
385385      {
386         UINT8 char_code = hd61830->space->read_byte(y * hd61830->hn + x);
386         UINT8 char_code = hd61830->ram->read_byte(y * hd61830->hn + x);
387387
388388         if (hd61830->cac == y * hd61830->hn + x)
389389         {
390390            /* update cursor */
391391            switch ((hd61830->mcr >> 2) & 0x03)
392392            {
393               case 0: //cursor OFF
393            case 0: //cursor OFF
394               draw_char(device, bitmap, cliprect, x, y, char_code);
395               break;
396
397            case 1:  //cursor ON
398               if (hd61830->blink & 0x20)
399               {
400                  for(int cr = 0; cr < hd61830->hp; cr++)
401                  {
402                     *BITMAP_ADDR16(bitmap, y * hd61830->vp + (hd61830->cp - 1), x * hd61830->hp + cr) = 1;
403                  }
404               }
405               else
406               {
394407                  draw_char(device, bitmap, cliprect, x, y, char_code);
395                  break;
396               case 1:  //cursor ON
397                  if (hd61830->blink & 0x20)
398                     for(int cr = 0; cr < hd61830->hp; cr++)
399                        *BITMAP_ADDR16(bitmap, y * hd61830->vp + (hd61830->cp - 1), x * hd61830->hp + cr) = 1;
400                  else
401                     draw_char(device, bitmap, cliprect, x, y, char_code);
402                  break;
403               case 2: //cursor OFF character blink
404               case 3: //cursor blank
405                  if (hd61830->blink & 0x20)
406                     draw_char(device, bitmap, cliprect, x, y, 0x20);
407                  else
408                     draw_char(device, bitmap, cliprect, x, y, char_code);
409                  break;
408               }
409               break;
410
411            case 2: //cursor OFF character blink
412            case 3: //cursor blank
413               if (hd61830->blink & 0x20)
414               {
415                  draw_char(device, bitmap, cliprect, x, y, 0x20);
416               }
417               else
418               {
419                  draw_char(device, bitmap, cliprect, x, y, char_code);
420               }
421               break;
410422            }
411423         }
412424         else
425         {
413426            draw_char(device, bitmap, cliprect, x, y, char_code);
427         }
414428      }
429   }
415430}
416431
417432/*-------------------------------------------------
r9328r9329
464479    ADDRESS_MAP( hd61830 )
465480-------------------------------------------------*/
466481
467static ADDRESS_MAP_START( hd61380, 0, 8 )
482static ADDRESS_MAP_START( hd61380_ram, 0, 8 )
468483   AM_RANGE(0x0000, 0xffff) AM_RAM
469484ADDRESS_MAP_END
470485
486static ADDRESS_MAP_START( hd61380_rom, 1, 8 )
487   AM_RANGE(0x0000, 0xffff) AM_UNMAP
488ADDRESS_MAP_END
489
471490/*-------------------------------------------------
472491    DEVICE_START( hd61830 )
473492-------------------------------------------------*/
r9328r9329
481500   hd61830->screen = device->machine->device<screen_device>(config->screen_tag);
482501   assert(hd61830->screen != NULL);
483502
484   hd61830->space = device_get_space(device, ADDRESS_SPACE_0);
503   hd61830->ram = device_get_space(device, ADDRESS_SPACE_0);
504   hd61830->rom = device_get_space(device, ADDRESS_SPACE_1);
485505
486506   /* create the busy timer */
487507   hd61830->busy_timer = timer_alloc(device->machine, busy_tick, (void *)device);
r9328r9329
490510   state_save_register_device_item(device, 0, hd61830->bf);
491511   state_save_register_device_item(device, 0, hd61830->ir);
492512   state_save_register_device_item(device, 0, hd61830->mcr);
493   state_save_register_device_item(device, 0, hd61830->dor);
513    state_save_register_device_item(device, 0, hd61830->dor);
494514   state_save_register_device_item(device, 0, hd61830->cac);
495515   state_save_register_device_item(device, 0, hd61830->dsa);
496516   state_save_register_device_item(device, 0, hd61830->vp);
r9328r9329
526546      case DEVINFO_INT_DATABUS_WIDTH_0:            info->i = 8;                              break;
527547      case DEVINFO_INT_ADDRBUS_WIDTH_0:            info->i = 16;                              break;
528548      case DEVINFO_INT_ADDRBUS_SHIFT_0:            info->i = 0;                              break;
549      case DEVINFO_INT_DATABUS_WIDTH_1:            info->i = 8;                              break;
550      case DEVINFO_INT_ADDRBUS_WIDTH_1:            info->i = 16;                              break;
551      case DEVINFO_INT_ADDRBUS_SHIFT_1:            info->i = 0;                              break;
529552
530553      /* --- the following bits of info are returned as pointers --- */
531554      case DEVINFO_PTR_ROM_REGION:               info->romregion = ROM_NAME(hd61830);            break;
532555
533556      /* --- the following bits of info are returned as pointers to data --- */
534      case DEVINFO_PTR_DEFAULT_MEMORY_MAP_0:         info->default_map8 = ADDRESS_MAP_NAME(hd61380);      break;
557      case DEVINFO_PTR_DEFAULT_MEMORY_MAP_0:         info->default_map8 = ADDRESS_MAP_NAME(hd61380_ram);   break;
558      case DEVINFO_PTR_DEFAULT_MEMORY_MAP_1:         info->default_map8 = ADDRESS_MAP_NAME(hd61380_rom);   break;
535559
536560      /* --- the following bits of info are returned as pointers to functions --- */
537561      case DEVINFO_FCT_START:                     info->start = DEVICE_START_NAME(hd61830);         break;
src/mess/video/hd61830.h
r9328r9329
2525   MDRV_DEVICE_ADD(_tag, HD61830, _clock) \
2626   MDRV_DEVICE_CONFIG_DATAPTR(hd61830_config, screen_tag, _screen)
2727
28#define MDRV_HD61830_CGROM_ADD(_tag, _clock, _screen, _cgrom_map) \
29   MDRV_DEVICE_ADD(_tag, HD61830, _clock) \
30   MDRV_DEVICE_CONFIG_DATAPTR(hd61830_config, screen_tag, _screen) \
31   MDRV_DEVICE_ADDRESS_MAP(1, _cgrom_map)
32
2833/***************************************************************************
2934    TYPE DEFINITIONS
3035***************************************************************************/
src/mess/includes/portfoli.h
r9328r9329
11#pragma once
22
3#ifndef __CGC7900__
4#define __CGC7900__
3#ifndef __PORTFOLIO__
4#define __PORTFOLIO__
55
66#define SCREEN_TAG      "screen"
77#define M80C88A_TAG      "u1"
r9328r9329
1010#define HD61830_TAG      "hd61830"
1111#define CENTRONICS_TAG   "centronics"
1212#define SPEAKER_TAG      "speaker"
13#define TIMER_TICK_TAG   "tick"
1314
1415class portfolio_state : public driver_device
1516{
r9328r9329
1718   portfolio_state(running_machine &machine, const driver_device_config_base &config)
1819      : driver_device(machine, config) { }
1920
21   /* interrupt state */
22   UINT8 ip;                  /* interrupt pending */
23   UINT8 ie;                  /* interrupt enable */
24
25   /* counter state */
26   UINT16 counter;
27
28   /* keyboard state */
29   UINT8 keylatch;
30
2031   /* video state */
2132   UINT8 contrast;
2233
r9328r9329
2738   running_device *hd61830;
2839   running_device *centronics;
2940   running_device *speaker;
41   timer_device *timer_tick;
3042};
3143
3244#endif
src/mess/drivers/portfoli.c
r9328r9329
55   http://portfolio.wz.cz/
66   http://www.pofowiki.de/doku.php
77   http://www.best-electronics-ca.com/portfoli.htm
8   http://www.atari-portfolio.co.uk/pfnews/pf9.txt
89
9*/
10
11/*
12
1310   Undumped cartridges:
1411
1512   Utility-Card            HPC-701
r9328r9329
3229
3330   TODO:
3431
35   - ERROR: Low Battery
36   - main RAM is non-volatile
32   - boot is always cold
33   - memory error interrupt vector
34   - i/o port 8051
3735   - screen contrast
38   - interrupts
39   - system tick
36   - system tick frequency selection (1 or 128 Hz)
4037   - speaker
4138   - serial interface
4239   - parallel interface
43   - credit card memory
40   - credit card memory (A:/B:)
41   - software list
4442
4543*/
4644
r9328r9329
5351#include "machine/ctronics.h"
5452#include "machine/i8255a.h"
5553#include "machine/ins8250.h"
54#include "machine/nvram.h"
5655#include "sound/speaker.h"
5756#include "video/hd61830.h"
5857
58//**************************************************************************
59//   MACROS / CONSTANTS
60//**************************************************************************
61
62enum
63{
64   INT_TICK = 0,
65   INT_KEYBOARD,
66   INT_ERROR,
67   INT_EXTERNAL
68};
69
70static UINT8 INTERRUPT_VECTOR[] = { 0x08, 0x09, 0x00 };
71
72//**************************************************************************
73//   INTERRUPTS
74//**************************************************************************
75
76//-------------------------------------------------
77//  check_interrupt - check interrupt status
78//-------------------------------------------------
79
80static void check_interrupt(running_machine *machine)
81{
82   portfolio_state *state = machine->driver_data<portfolio_state>();
83
84   int level = (state->ip & state->ie) ? ASSERT_LINE : CLEAR_LINE;
85   
86   cputag_set_input_line(machine, M80C88A_TAG, INPUT_LINE_INT0, level);
87}
88
89//-------------------------------------------------
90//  trigger_interrupt - trigger interrupt request
91//-------------------------------------------------
92
93static void trigger_interrupt(running_machine *machine, int level)
94{
95   portfolio_state *state = machine->driver_data<portfolio_state>();
96
97   // set interrupt pending bit
98   state->ip |= 1 << level;
99
100   check_interrupt(machine);
101}
102
103//-------------------------------------------------
104//  irq_mask_w - interrupt enable mask
105//-------------------------------------------------
106
107static WRITE8_HANDLER( irq_mask_w )
108{
109   portfolio_state *state = space->machine->driver_data<portfolio_state>();
110
111   state->ie = data;
112   //logerror("IE %02x\n", data);
113
114   check_interrupt(space->machine);
115}
116
117//-------------------------------------------------
118//  sivr_w - serial interrupt vector register
119//-------------------------------------------------
120
121static WRITE8_HANDLER( sivr_w )
122{
123   portfolio_state *state = space->machine->driver_data<portfolio_state>();
124
125   state->sivr = data;
126}
127
128//-------------------------------------------------
129//  IRQ_CALLBACK( portfolio_int_ack )
130//-------------------------------------------------
131
132static IRQ_CALLBACK( portfolio_int_ack )
133{
134   portfolio_state *state = device->machine->driver_data<portfolio_state>();
135
136   UINT8 vector = state->sivr;
137   
138   for (int i = 0; i < 4; i++)
139   {
140      if (BIT(state->ip, i))
141      {
142         // clear interrupt pending bit
143         state->ip &= ~(1 << i);
144
145         if (i == 3)
146            vector = state->sivr;
147         else
148            vector = INTERRUPT_VECTOR[i];
149
150         break;
151      }
152   }
153
154   check_interrupt(device->machine);
155
156   return vector;
157}
158
159//**************************************************************************
160//   KEYBOARD
161//**************************************************************************
162
163//-------------------------------------------------
164//  scan_keyboard - scan keyboard
165//-------------------------------------------------
166
167static void scan_keyboard(running_machine *machine)
168{
169   portfolio_state *state = machine->driver_data<portfolio_state>();
170
171   UINT8 keycode = 0xff;
172
173   static const char *const keynames[] = { "ROW0", "ROW1", "ROW2", "ROW3", "ROW4", "ROW5", "ROW6", "ROW7" };
174
175   for (int row = 0; row < 8; row++)
176   {
177      UINT8 data = input_port_read(machine, keynames[row]);
178
179      if (data != 0xff)
180      {
181         for (int col = 0; col < 8; col++)
182         {
183            if (!BIT(data, col))
184            {
185               keycode = (row * 8) + col;
186            }
187         }
188      }
189   }
190
191   if (keycode != 0xff)
192   {
193      // key pressed
194      if (keycode != state->keylatch)
195      {
196         state->keylatch = keycode;
197
198         trigger_interrupt(machine, INT_KEYBOARD);
199      }
200   }
201   else
202   {
203      // key released
204      if (state->keylatch != 0xff)
205      {
206         state->keylatch |= 0x80;
207
208         trigger_interrupt(machine, INT_KEYBOARD);
209      }
210   }
211}
212
213//-------------------------------------------------
214//  TIMER_DEVICE_CALLBACK( keyboard_tick )
215//-------------------------------------------------
216
217static TIMER_DEVICE_CALLBACK( keyboard_tick )
218{
219   scan_keyboard(timer.machine);
220}
221
222//-------------------------------------------------
223//  keyboard_r - keyboard scan code register
224//-------------------------------------------------
225
226static READ8_HANDLER( keyboard_r )
227{
228   portfolio_state *state = space->machine->driver_data<portfolio_state>();
229
230   return state->keylatch;
231}
232
233//**************************************************************************
234//   INTERNAL SPEAKER
235//**************************************************************************
236
237//-------------------------------------------------
238//  speaker_w - internal speaker output
239//-------------------------------------------------
240
241static WRITE8_HANDLER( speaker_w )
242{
243   /*
244
245      bit      description
246
247      0     
248      1     
249      2     
250      3     
251      4     
252      5     
253      6     
254      7      speaker level
255
256   */
257
258   portfolio_state *state = space->machine->driver_data<portfolio_state>();
259
260   speaker_level_w(state->speaker, !BIT(data, 7));
261
262   //logerror("SPEAKER %02x\n", data);
263}
264
265//**************************************************************************
266//   POWER MANAGEMENT
267//**************************************************************************
268
269//-------------------------------------------------
270//  power_w - power management
271//-------------------------------------------------
272
273static WRITE8_HANDLER( power_w )
274{
275   /*
276
277      bit      description
278
279      0     
280      1     
281      2     
282      3     
283      4     
284      5     
285      6     
286      7     
287
288   */
289
290   //logerror("POWER %02x\n", data);
291}
292
293//-------------------------------------------------
294//  battery_r - battery status
295//-------------------------------------------------
296
297static READ8_HANDLER( battery_r )
298{
299   /*
300
301      bit      description
302
303      0     
304      1     
305      2     
306      3     
307      4     
308      5     
309      6      0=battery low
310      7     
311
312   */
313
314   return 0xc2;
315}
316
317//**************************************************************************
318//   SYSTEM TIMERS
319//**************************************************************************
320
321//-------------------------------------------------
322//  TIMER_DEVICE_CALLBACK( system_tick )
323//-------------------------------------------------
324
325static TIMER_DEVICE_CALLBACK( system_tick )
326{
327   trigger_interrupt(timer.machine, INT_TICK);
328}
329
330//-------------------------------------------------
331//  TIMER_DEVICE_CALLBACK( counter_tick )
332//-------------------------------------------------
333
334static TIMER_DEVICE_CALLBACK( counter_tick )
335{
336   portfolio_state *state = timer.machine->driver_data<portfolio_state>();
337
338   state->counter++;
339}
340
341//-------------------------------------------------
342//  counter_r - counter register read
343//-------------------------------------------------
344
345static READ8_HANDLER( counter_r )
346{
347   portfolio_state *state = space->machine->driver_data<portfolio_state>();
348
349   UINT8 data = 0;
350
351   switch (offset)
352   {
353   case 0:
354      data = state->counter & 0xff;
355      break;
356
357   case 1:
358      data = state->counter >> 1;
359      break;
360   }
361
362   return data;
363}
364
365//-------------------------------------------------
366//  counter_w - counter register write
367//-------------------------------------------------
368
369static WRITE8_HANDLER( counter_w )
370{
371   portfolio_state *state = space->machine->driver_data<portfolio_state>();
372
373   switch (offset)
374   {
375   case 0:
376      state->counter = (state->counter & 0xff00) | data;
377      break;
378
379   case 1:
380      state->counter = (data << 8) | (state->counter & 0xff);
381      break;
382   }
383}
384
385//**************************************************************************
386//   EXPANSION
387//**************************************************************************
388
389//-------------------------------------------------
390//  ncc1_w - credit card memory select
391//-------------------------------------------------
392
59393static WRITE8_HANDLER( ncc1_w )
60394{
61395   address_space *program = cputag_get_address_space(space->machine, M80C88A_TAG, ADDRESS_SPACE_PROGRAM);
r9328r9329
71405      // credit card memory
72406      memory_unmap_readwrite(program, 0xc0000, 0xdffff, 0, 0);
73407   }
408
409   //logerror("NCC %02x\n", data);
74410}
75411
412//-------------------------------------------------
413//  pid_r - peripheral identification
414//-------------------------------------------------
415
76416static READ8_HANDLER( pid_r )
77417{
78418   /*
r9328r9329
94434   return 0xff;
95435}
96436
97static WRITE8_HANDLER( sivr_w )
98{
99   portfolio_state *state = space->machine->driver_data<portfolio_state>();
437//**************************************************************************
438//   ADDRESS MAPS
439//**************************************************************************
100440
101   state->sivr = data;
102}
441//-------------------------------------------------
442//  ADDRESS_MAP( portfolio_mem )
443//-------------------------------------------------
103444
104445static ADDRESS_MAP_START( portfolio_mem, ADDRESS_SPACE_PROGRAM, 8 )
105   AM_RANGE(0x00000, 0x3efff) AM_RAM
106   AM_RANGE(0x3f000, 0x9efff) AM_RAM // expansion
107   AM_RANGE(0xb0000, 0xb0fff) AM_MIRROR(0xf000) AM_RAM // video RAM
446   AM_RANGE(0x00000, 0x1efff) AM_RAM AM_SHARE("nvram1")
447   AM_RANGE(0x1f000, 0x9efff) AM_RAM // expansion
448   AM_RANGE(0xb0000, 0xb0fff) AM_MIRROR(0xf000) AM_RAM AM_SHARE("nvram2") // video RAM
108449   AM_RANGE(0xc0000, 0xdffff) AM_ROM AM_REGION(M80C88A_TAG, 0) // or credit card memory
109450   AM_RANGE(0xe0000, 0xfffff) AM_ROM AM_REGION(M80C88A_TAG, 0x20000)
110451ADDRESS_MAP_END
111452
453//-------------------------------------------------
454//  ADDRESS_MAP( portfolio_io )
455//-------------------------------------------------
456
112457static ADDRESS_MAP_START( portfolio_io, ADDRESS_SPACE_IO, 8 )
113//   AM_RANGE(0x8000, 0x800f) Keyboard
458   AM_RANGE(0x8000, 0x8000) AM_READ(keyboard_r)
114459   AM_RANGE(0x8010, 0x8010) AM_DEVREADWRITE(HD61830_TAG, hd61830_data_r, hd61830_data_w)
115460   AM_RANGE(0x8011, 0x8011) AM_DEVREADWRITE(HD61830_TAG, hd61830_status_r, hd61830_control_w)
116//   AM_RANGE(0x8020, 0x8020) Speaker
461   AM_RANGE(0x8020, 0x8020) AM_WRITE(speaker_w)
462   AM_RANGE(0x8030, 0x8030) AM_WRITE(power_w)
463   AM_RANGE(0x8040, 0x8041) AM_READWRITE(counter_r, counter_w)
464   AM_RANGE(0x8050, 0x8050) AM_WRITE(irq_mask_w)
465   AM_RANGE(0x8051, 0x8051) AM_READ(battery_r)
117466   AM_RANGE(0x8060, 0x8060) AM_RAM AM_BASE_MEMBER(portfolio_state, contrast)
118467//   AM_RANGE(0x8070, 0x8077) AM_DEVREADWRITE(M82C50A_TAG, ins8250_r, ins8250_w) Serial Interface
119468//   AM_RANGE(0x8078, 0x807b) AM_DEVREADWRITE(M82C55A_TAG, i8255a_r, i8255a_w) Parallel Interface
r9328r9329
121470   AM_RANGE(0x807f, 0x807f) AM_READWRITE(pid_r, sivr_w)
122471ADDRESS_MAP_END
123472
473//-------------------------------------------------
474//  ADDRESS_MAP( portfolio_lcdc )
475//-------------------------------------------------
476
477static ADDRESS_MAP_START( portfolio_lcdc, 0, 8 )
478   AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION(HD61830_TAG, 0)
479ADDRESS_MAP_END
480
481//**************************************************************************
482//   INPUT PORTS
483//**************************************************************************
484
485//-------------------------------------------------
486//  INPUT_PORTS( portfolio )
487//-------------------------------------------------
488
124489static INPUT_PORTS_START( portfolio )
490   PORT_START("ROW0")
491   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Atari") PORT_CODE(KEYCODE_TILDE)
492   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_UNUSED)
493   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
494   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
495   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
496   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
497   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
498   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
499
500   PORT_START("ROW1")
501   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del Ins") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(DEL))
502   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
503   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
504   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
505   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
506   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
507   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
508   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
509
510   PORT_START("ROW2")
511   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(TAB))
512   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
513   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
514   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
515   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
516   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
517   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Enter") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
518   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
519
520   PORT_START("ROW3")
521   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
522   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
523   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
524   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Left Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
525   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
526   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x91") PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
527   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('"') PORT_CHAR('`')
528   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
529
530   PORT_START("ROW4")
531   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
532   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
533   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
534   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
535   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Right Shift") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
536   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x93") PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
537   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
538   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
539
540   PORT_START("ROW5")
541   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
542   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
543   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
544   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x90") PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
545   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\xE2\x86\x92") PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
546   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Lock") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK))
547   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('8')
548   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
549
550   PORT_START("ROW6")
551   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|')
552   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
553   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
554   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
555   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
556   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
557   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Fn") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1))
558   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
559
560   PORT_START("ROW7")
561   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
562   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
563   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
564   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
565   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
566   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
567   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
568   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
125569INPUT_PORTS_END
126570
571//**************************************************************************
572//   VIDEO
573//**************************************************************************
574
575//-------------------------------------------------
576//  PALETTE_INIT( portfolio )
577//-------------------------------------------------
578
127579static PALETTE_INIT( portfolio )
128580{
129581   palette_set_color(machine, 0, MAKE_RGB(138, 146, 148));
130582   palette_set_color(machine, 1, MAKE_RGB(92, 83, 88));
131583}
132584
585//-------------------------------------------------
586//  VIDEO_UPDATE( portfolio )
587//-------------------------------------------------
588
133589static VIDEO_UPDATE( portfolio )
134590{
135591   portfolio_state *state = screen->machine->driver_data<portfolio_state>();
r9328r9329
139595   return 0;
140596}
141597
598//**************************************************************************
599//   DEVICE CONFIGURATION
600//**************************************************************************
601
602//-------------------------------------------------
603//  I8255A_INTERFACE( ppi_intf )
604//-------------------------------------------------
605
142606static WRITE8_DEVICE_HANDLER( ppi_pb_w )
143607{
144608   /*
r9328r9329
220684   DEVCB_NULL                                       // Port C write
221685};
222686
687//-------------------------------------------------
688//  ins8250_interface i8250_intf
689//-------------------------------------------------
690
223691static INS8250_INTERRUPT( i8250_intrpt_w )
224692{
225   // connected to EINT
693   trigger_interrupt(device->machine, INT_EXTERNAL);
226694}
227695
228696const ins8250_interface i8250_intf =
r9328r9329
234702   NULL
235703};
236704
705//**************************************************************************
706//   IMAGE LOADING
707//**************************************************************************
708
709//-------------------------------------------------
710//  DEVICE_IMAGE_LOAD( portfolio_cart )
711//-------------------------------------------------
712
237713static DEVICE_IMAGE_LOAD( portfolio_cart )
238714{
239715   return IMAGE_INIT_FAIL;
240716}
241717
718//**************************************************************************
719//   MACHINE INITIALIZATION
720//**************************************************************************
721
722//-------------------------------------------------
723//  MACHINE_START( portfolio )
724//-------------------------------------------------
725
242726static MACHINE_START( portfolio )
243727{
244728   portfolio_state *state = machine->driver_data<portfolio_state>();
245729   address_space *program = cputag_get_address_space(machine, M80C88A_TAG, ADDRESS_SPACE_PROGRAM);
246730
731   /* set CPU interrupt vector callback */
732   cpu_set_irq_callback(machine->device(M80C88A_TAG), portfolio_int_ack);
733
247734   /* find devices */
248735   state->hd61830 = machine->device(HD61830_TAG);
249736   state->centronics = machine->device(CENTRONICS_TAG);
250737   state->speaker = machine->device(SPEAKER_TAG);
738   state->timer_tick = machine->device<timer_device>(TIMER_TICK_TAG);
251739
252740   /* memory expansions */
253741   switch (messram_get_size(machine->device("messram")))
254742   {
255743   case 128 * 1024:
256      memory_unmap_readwrite(program, 0x3f000, 0x9efff, 0, 0);
744      memory_unmap_readwrite(program, 0x1f000, 0x9efff, 0, 0);
257745      break;
258746
259747   case 384 * 1024:
260748      memory_unmap_readwrite(program, 0x5f000, 0x9efff, 0, 0);
261749      break;
262750   }
751
752   /* set initial values */
753   state->keylatch = 0xff;
754   state->sivr = 0x2a;
263755}
264756
757//**************************************************************************
758//   MACHINE CONFIGURATION
759//**************************************************************************
760
761//-------------------------------------------------
762//  MACHINE_CONFIG( portfolio )
763//-------------------------------------------------
764
265765static MACHINE_CONFIG_START( portfolio, portfolio_state )
266766    /* basic machine hardware */
267767    MDRV_CPU_ADD(M80C88A_TAG, I8088, XTAL_4_9152MHz)
r9328r9329
284784
285785   MDRV_VIDEO_UPDATE(portfolio)
286786
287   MDRV_HD61830_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, SCREEN_TAG)
787   MDRV_HD61830_CGROM_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, SCREEN_TAG, portfolio_lcdc)
288788
289789   /* sound hardware */
290790   MDRV_SPEAKER_STANDARD_MONO("mono")
r9328r9329
295795   MDRV_I8255A_ADD(M82C55A_TAG, ppi_intf)
296796   MDRV_CENTRONICS_ADD(CENTRONICS_TAG, standard_centronics)
297797   MDRV_INS8250_ADD(M82C50A_TAG, i8250_intf) // should be MDRV_INS8250A_ADD
798   MDRV_TIMER_ADD_PERIODIC("counter", counter_tick, HZ(XTAL_32_768kHz/16384))
799   MDRV_TIMER_ADD_PERIODIC(TIMER_TICK_TAG, system_tick, HZ(XTAL_32_768kHz/32768))
298800
801   /* fake keyboard */
802   MDRV_TIMER_ADD_PERIODIC("keyboard", keyboard_tick, USEC(2500))
803
299804   /* cartridge */
300805   MDRV_CARTSLOT_ADD("cart")
301806   MDRV_CARTSLOT_EXTENSION_LIST("bin")
302807   MDRV_CARTSLOT_INTERFACE("portfolio_cart")
303808   MDRV_CARTSLOT_LOAD(portfolio_cart)
304809
810   /* memory card */
811/*   MDRV_MEMCARD_ADD("memcard_a")
812   MDRV_MEMCARD_EXTENSION_LIST("bin")
813   MDRV_MEMCARD_LOAD(portfolio_memcard)
814   MDRV_MEMCARD_SIZE_OPTIONS("32K,64K,128K")
815
816   MDRV_MEMCARD_ADD("memcard_b")
817   MDRV_MEMCARD_EXTENSION_LIST("bin")
818   MDRV_MEMCARD_LOAD(portfolio_memcard)
819   MDRV_MEMCARD_SIZE_OPTIONS("32K,64K,128K")*/
820
305821   /* software lists */
306822//   MDRV_SOFTWARE_LIST_ADD("cart_list", "pofo")
307823
r9328r9329
309825   MDRV_RAM_ADD("messram")
310826   MDRV_RAM_DEFAULT_SIZE("128K")
311827   MDRV_RAM_EXTRA_OPTIONS("384K,640K")
828
829   MDRV_NVRAM_ADD_RANDOM_FILL("nvram1")
830   MDRV_NVRAM_ADD_RANDOM_FILL("nvram2")
312831MACHINE_CONFIG_END
313832
833//**************************************************************************
834//   ROMS
835//**************************************************************************
836
837//-------------------------------------------------
838//  ROM( pofo )
839//-------------------------------------------------
840
314841ROM_START( pofo )
315842    ROM_REGION( 0x40000, M80C88A_TAG, 0 )
316   ROM_LOAD( "rom b.u4", 0x00000, 0x20000, BAD_DUMP CRC(c9852766) SHA1(c74430281bc717bd36fd9b5baec1cc0f4489fe82) ) // dumped with debug.com
317   ROM_LOAD( "rom a.u3", 0x20000, 0x20000, BAD_DUMP CRC(b8fb730d) SHA1(1b9d82b824cab830256d34912a643a7d048cd401) ) // dumped with debug.com
843   ROM_SYSTEM_BIOS( 0, "dip1072", "DIP DOS 1.072" )
844   ROMX_LOAD( "rom b.u4", 0x00000, 0x20000, BAD_DUMP CRC(c9852766) SHA1(c74430281bc717bd36fd9b5baec1cc0f4489fe82), ROM_BIOS(1) ) // dumped with debug.com
845   ROMX_LOAD( "rom a.u3", 0x20000, 0x20000, BAD_DUMP CRC(b8fb730d) SHA1(1b9d82b824cab830256d34912a643a7d048cd401), ROM_BIOS(1) ) // dumped with debug.com
846
847   ROM_REGION( 0x800, HD61830_TAG, 0 )
848   ROM_LOAD( "hd61830 external character generator", 0x000, 0x800, NO_DUMP )
318849ROM_END
319850
851//**************************************************************************
852//   SYSTEM DRIVERS
853//**************************************************************************
854
320855/*    YEAR  NAME    PARENT  COMPAT  MACHINE     INPUT       INIT    COMPANY     FULLNAME        FLAGS */
321COMP( 1989, pofo,   0,      0,      portfolio,   portfolio,   0,      "Atari",   "Portfolio",   GAME_NOT_WORKING | GAME_NO_SOUND )
856COMP( 1989, pofo,   0,      0,      portfolio,   portfolio,   0,      "Atari",   "Portfolio",   GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team