Previous 15994 Revisions Next

r2129 Friday 28th March, 2008 at 17:42:48 UTC by PeT
thanks Guru and Ranger Lennier basic KOEI PasoGo driver, more when new dumps and screenshots available
[src/mess]mess.mak messdriv.c
[src/mess/drivers]pasogo.c*

src/mess/messdriv.c
r2128r2129
191191   /* EPOCH */
192192   DRIVER( gamepock )   /* Epoch Game Pocket Computer                  */
193193
194   /* KOEI */
195   DRIVER( pasogo )   /* KOEI PasoGo */
194196
197
195198/****************COMPUTERS***************************************************/
196199    /* ACORN */
197200   DRIVER( acrnsys1 )  /* 1979 Acorn System 1 (Microcomputer Kit)          */
src/mess/mess.mak
r2128r2129
369369   $(MESSOBJ)/gce.a \
370370   $(MESSOBJ)/glasgow.a \
371371   $(MESSOBJ)/gmaster.a \
372   $(MESSOBJ)/pasogo.a \
372373   $(MESSOBJ)/hp48.a \
373374   $(MESSOBJ)/intv.a \
374375   $(MESSOBJ)/jupiter.a \
r2128r2129
11821183   $(MESS_DRIVERS)/gmaster.o   \
11831184   $(MESS_AUDIO)/gmaster.o
11841185
1186$(MESSOBJ)/pasogo.a:         \
1187   $(MESS_DRIVERS)/pasogo.o   \
1188
11851189$(MESSOBJ)/ut88.a:      \
11861190   $(MESS_DRIVERS)/ut88.o \
11871191   $(MESS_MACHINE)/ut88.o \
src/mess/drivers/pasogo.c
r0r2129
1/******************************************************************************
2 PeT mess@utanet.at march 2008
3
4
5 vadem vg230 (single chip pc) based handheld
6
7although it is very related to standard pc hardware, it is different enough
8to make the standard pc driver one level more complex, so own driver
9
10******************************************************************************/
11
12#include "driver.h"
13#include "deprecat.h"
14//#include "vidhrdw/generic.h"
15#include "devices/cartslot.h"
16#include "machine/pic8259.h"
17#include "machine/pit8253.h"
18/*
19  rtc interrupt irq 2
20 */
21
22static struct {
23  UINT8 index;
24  UINT8 data[0x100];
25  struct {
26    UINT16 data;
27  } bios_timer; // 1.19mhz tclk signal
28  struct {
29    int seconds, minutes, hours, days;
30    int alarm_seconds, alarm_minutes, alarm_hours, alarm_days;
31
32    int onehertz_interrupt_on;
33    int onehertz_interrupt_request;
34    int alarm_interrupt_on;
35    int alarm_interrupt_request;
36  } rtc;
37  struct {
38    int write_protected;
39  } pmu;
40} vg230;
41
42
43static TIMER_CALLBACK( vg230_timer )
44{
45  vg230.rtc.seconds+=1;
46  if (vg230.rtc.seconds>=60)
47    {
48      vg230.rtc.seconds=00;
49      vg230.rtc.minutes+=1;
50      if (vg230.rtc.minutes>=60) {
51   vg230.rtc.minutes=0;
52   vg230.rtc.hours+=1;
53   if (vg230.rtc.hours>=24) {
54     vg230.rtc.hours=0;
55     vg230.rtc.days=(vg230.rtc.days+1)&0xfff;
56   }
57      }
58    }
59  if (vg230.rtc.seconds==vg230.rtc.alarm_seconds
60      && vg230.rtc.minutes==vg230.rtc.alarm_minutes
61      && vg230.rtc.hours==vg230.rtc.alarm_hours
62      && (vg230.rtc.days&0x1f)==vg230.rtc.alarm_hours) {
63    // generate alarm
64  }
65}
66
67void vg230_reset(void)
68{
69  mame_system_time systime;
70
71  memset(&vg230, 0, sizeof(vg230));
72  vg230.pmu.write_protected=TRUE;
73  timer_pulse(ATTOTIME_IN_HZ(1), NULL, 0, vg230_timer);
74
75
76  mame_get_base_datetime(Machine, &systime);
77 
78  vg230.rtc.seconds= systime.local_time.second;
79  vg230.rtc.minutes= systime.local_time.minute;
80  vg230.rtc.hours = systime.local_time.hour;
81  vg230.rtc.days = 0;
82
83  vg230.bios_timer.data=0x7200; // HACK
84}
85
86void vg230_init(void)
87{
88  vg230_reset();
89}
90
91
92static READ8_HANDLER( vg230_io_r )
93{
94  int log=TRUE;
95    UINT8 data=0;
96    vg230.bios_timer.data+=0x100; //HACK
97    if (offset&1) {
98      data=vg230.data[vg230.index];
99      switch (vg230.index) {
100      case 0x09: break;
101      case 0x0a:
102   if (vg230.data[9]&1) {
103     data=readinputport(0);
104   } else {
105     data=0xff;
106   }
107   break;
108      case 0x30:
109   data=vg230.bios_timer.data&0xff;
110   break;
111      case 0x31:
112   data=vg230.bios_timer.data>>8;
113   log=FALSE;
114   break;
115      case 0x70: data=vg230.rtc.seconds; log=FALSE; break;
116      case 0x71: data=vg230.rtc.minutes; log=FALSE; break;
117      case 0x72: data=vg230.rtc.hours; log=FALSE; break;
118      case 0x73: data=vg230.rtc.days; break;
119      case 0x74: data=vg230.rtc.days>>8; break;
120      case 0x79: /*rtc status*/log=FALSE; break;
121      case 0x7a:
122   data&=~3;
123   if (vg230.rtc.alarm_interrupt_request) data|=1<<1;
124   if (vg230.rtc.onehertz_interrupt_request) data|=1<<0;
125   break;
126      case 0xc1:
127   data&=~1;
128   if (vg230.pmu.write_protected) data|=1;
129   vg230.pmu.write_protected=FALSE;
130   log=FALSE;
131   break;
132      }
133      if (log)
134   logerror("%.5x vg230 %02x read %.2x\n",(int)activecpu_get_pc(),vg230.index,data);
135      //   data=memory_region(REGION_CPU1)[0x4000+offset];
136    } else {     
137      data=vg230.index;
138    }
139    return data;
140}
141
142static WRITE8_HANDLER( vg230_io_w )
143{
144  int log=TRUE;
145    if (offset&1) {
146      //   memory_region(REGION_CPU1)[0x4000+offset]=data;
147      vg230.data[vg230.index]=data;
148      switch (vg230.index) {
149      case 0x09: break;
150      case 0x70: vg230.rtc.seconds=data&0x3f; break;
151      case 0x71: vg230.rtc.minutes=data&0x3f; break;
152      case 0x72: vg230.rtc.hours=data&0x1f;break;
153      case 0x73: vg230.rtc.days=(vg230.rtc.days&~0xff)|data; break;
154      case 0x74: vg230.rtc.days=(vg230.rtc.days&0xff)|((data&0xf)<<8); break;
155      case 0x75: vg230.rtc.alarm_seconds=data&0x3f; break;
156      case 0x76: vg230.rtc.alarm_minutes=data&0x3f; break;
157      case 0x77: vg230.rtc.alarm_hours=data&0x1f; break;
158      case 0x78: vg230.rtc.days=data&0x1f; break;
159      case 0x79:
160   vg230.rtc.onehertz_interrupt_on=data&1;
161   vg230.rtc.alarm_interrupt_on=data&2;
162   log=FALSE;
163   break;
164      case 0x7a:
165   if (data&2) { vg230.rtc.alarm_interrupt_request=FALSE; vg230.rtc.onehertz_interrupt_request=FALSE; /* update interrupt */ }
166   break;
167      }
168      if (log)
169   logerror("%.5x vg230 %02x write %.2x\n",(int)activecpu_get_pc(),vg230.index,data);
170    } else {
171      vg230.index=data;
172    }
173}
174
175struct {
176  UINT8 data;
177  int index;
178  struct {
179    UINT8 data[2];
180    int address;
181    int type;
182    int on;
183  } mapper[26];
184} ems/*?*/;
185
186static READ8_HANDLER( ems_r )
187{
188  UINT8 data=0;
189  switch (offset) {
190  case 0: data=ems.data; break;
191  case 2: case 3: data=ems.mapper[ems.index].data[offset&1]; break;
192  }
193  return data;
194}
195
196static WRITE8_HANDLER( ems_w )
197{
198  switch (offset) {
199  case 0:
200    ems.data=data;
201    switch (data&~3) {
202    case 0x80: ems.index=0; break;
203    case 0x84: ems.index=1; break;
204    case 0x88: ems.index=2; break;
205    case 0x8c: ems.index=3; break;
206    case 0x90: ems.index=4; break;
207    case 0x94: ems.index=5; break;
208    case 0x98: ems.index=6; break;
209    case 0x9c: ems.index=7; break;
210    case 0xa0: ems.index=8; break;
211    case 0xa4: ems.index=9; break;
212    case 0xa8: ems.index=10; break;
213    case 0xac: ems.index=11; break;
214    case 0xb0: ems.index=12; break;
215    case 0xb4: ems.index=13; break;
216      //  case 0xb8: ems.index=14; break;
217      //  case 0xbc: ems.index=15; break;
218    case 0xc0: ems.index=14; break;
219    case 0xc4: ems.index=15; break;
220    case 0xc8: ems.index=16; break;
221    case 0xcc: ems.index=17; break;
222    case 0xd0: ems.index=18; break;
223    case 0xd4: ems.index=19; break;
224    case 0xd8: ems.index=20; break;
225    case 0xdc: ems.index=21; break;
226    case 0xe0: ems.index=22; break;
227    case 0xe4: ems.index=23; break;
228    case 0xe8: ems.index=24; break;
229    case 0xec: ems.index=25; break;
230    }
231    break;
232  case 2:
233  case 3:
234    ems.mapper[ems.index].data[offset&1]=data;
235    ems.mapper[ems.index].address=(ems.mapper[ems.index].data[0]<<14)|((ems.mapper[ems.index].data[1]&0xf)<<22);
236    ems.mapper[ems.index].on=ems.mapper[ems.index].data[1]&0x80;
237    ems.mapper[ems.index].type=(ems.mapper[ems.index].data[1]&0x70)>>4;
238    logerror("%.5x ems mapper %d(%05x)on:%d type:%d address:%07x\n",(int)activecpu_get_pc(),ems.index, ems.data<<12,
239        ems.mapper[ems.index].on, ems.mapper[ems.index].type, ems.mapper[ems.index].address );
240    switch (ems.mapper[ems.index].type) {
241    case 0: /*external*/
242    case 1: /*ram*/
243      memory_set_bankptr( ems.index+1, memory_region(REGION_CPU1) + (ems.mapper[ems.index].address&0xfffff) );
244      break;
245    case 3: /* rom 1 */
246    case 4: /* pc card a */
247    case 5: /* pc card b */
248    default:
249      break;
250    case 2:
251      memory_set_bankptr( ems.index+1, memory_region(REGION_USER1) + (ems.mapper[ems.index].address&0x7ffff) );
252      break;
253    }
254    break;
255  }
256}
257
258static ADDRESS_MAP_START( pasogo_mem, ADDRESS_SPACE_PROGRAM, 8 )
259//     AM_RANGE(0x00000, 0xfffff) AM_UNMAP AM_MASK(0xfffff)
260//      AM_RANGE( 0x4000, 0x7fff) AM_READWRITE(gmaster_io_r, gmaster_io_w)
261   ADDRESS_MAP_GLOBAL_MASK(0xffFFF)
262     AM_RANGE(0x00000, 0x7ffff) AM_RAM
263AM_RANGE(0x80000, 0x83fff) AM_RAMBANK(1)
264AM_RANGE(0x84000, 0x87fff) AM_RAMBANK(2)
265AM_RANGE(0x88000, 0x8bfff) AM_RAMBANK(3)
266AM_RANGE(0x8c000, 0x8ffff) AM_RAMBANK(4)
267AM_RANGE(0x90000, 0x93fff) AM_RAMBANK(5)
268AM_RANGE(0x94000, 0x97fff) AM_RAMBANK(6)
269AM_RANGE(0x98000, 0x9bfff) AM_RAMBANK(7)
270AM_RANGE(0x9c000, 0x9ffff) AM_RAMBANK(8)
271AM_RANGE(0xa0000, 0xa3fff) AM_RAMBANK(9)
272AM_RANGE(0xa4000, 0xa7fff) AM_RAMBANK(10)
273AM_RANGE(0xa8000, 0xabfff) AM_RAMBANK(11)
274AM_RANGE(0xac000, 0xaffff) AM_RAMBANK(12)
275AM_RANGE(0xb0000, 0xb3fff) AM_RAMBANK(13)
276AM_RANGE(0xb4000, 0xb7fff) AM_RAMBANK(14)
277//AM_RANGE(0xb8000, 0xbffff) AM_RAM
278     AM_RANGE(0xb8000, 0xbffff) AM_RAMBANK(28)
279AM_RANGE(0xc0000, 0xc3fff) AM_RAMBANK(15)
280AM_RANGE(0xc4000, 0xc7fff) AM_RAMBANK(16)
281AM_RANGE(0xc8000, 0xcbfff) AM_RAMBANK(17)
282AM_RANGE(0xcc000, 0xcffff) AM_RAMBANK(18)
283AM_RANGE(0xd0000, 0xd3fff) AM_RAMBANK(19)
284AM_RANGE(0xd4000, 0xd7fff) AM_RAMBANK(20)
285AM_RANGE(0xd8000, 0xdbfff) AM_RAMBANK(21)
286AM_RANGE(0xdc000, 0xdffff) AM_RAMBANK(22)
287AM_RANGE(0xe0000, 0xe3fff) AM_RAMBANK(23)
288AM_RANGE(0xe4000, 0xe7fff) AM_RAMBANK(24)
289AM_RANGE(0xe8000, 0xebfff) AM_RAMBANK(25)
290AM_RANGE(0xec000, 0xeffff) AM_RAMBANK(26)
291
292AM_RANGE(0xf0000, 0xfffff) AM_ROMBANK(27)
293ADDRESS_MAP_END
294
295static ADDRESS_MAP_START(pasogo_io, ADDRESS_SPACE_IO, 8)
296//   ADDRESS_MAP_GLOBAL_MASK(0xfFFF)
297   AM_RANGE(0x0020, 0x0021) AM_READWRITE(pic8259_0_r,         pic8259_0_w)
298     AM_RANGE(0x26, 0x27) AM_READWRITE(vg230_io_r, vg230_io_w )
299   AM_RANGE(0x0040, 0x0043) AM_READWRITE(pit8253_0_r,         pit8253_0_w)
300     AM_RANGE(0x6c, 0x6f) AM_READWRITE(ems_r, ems_w )
301ADDRESS_MAP_END
302
303static INPUT_PORTS_START( pasogo )
304    PORT_START
305//     PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_SELECT)  PORT_NAME("select")
306//     PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_START) PORT_NAME("start")
307     PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_NAME("O") /*?*/
308     PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_BUTTON2) PORT_NAME("X") /*?*/
309    PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_UP   )
310    PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )
311    PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT)
312    PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )
313   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("a") PORT_CODE(KEYCODE_A)
314   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("b") PORT_CODE(KEYCODE_B)
315INPUT_PORTS_END
316
317/* palette in red, green, blue tribles */
318static unsigned char pasogo_palette[][3] =
319{
320  { 0, 0, 0 },
321    { 45,45,43 },
322    { 130, 159, 166 },
323    { 255,255,255 }
324};
325
326static PALETTE_INIT( pasogo )
327{
328   int i;
329
330   for ( i = 0; i < ARRAY_LENGTH(pasogo_palette); i++ ) {
331      palette_set_color_rgb(machine, i, pasogo_palette[i][0], pasogo_palette[i][1], pasogo_palette[i][2]);
332   }
333}
334
335static VIDEO_UPDATE( pasogo )
336{
337  static int width=-1, height=-1;
338  UINT8 *rom = memory_region(REGION_CPU1)+0xb8000;
339  UINT16 c[]={ 3, 0 };
340    int x,y;
341//    plot_box(bitmap, 0, 0, 64/*bitmap->width*/, bitmap->height, 0);
342    int w=640;
343    int h=240;
344    if (0) {
345      w=320;
346      h=240;
347      for (y=0;y<h; y++) {
348   for (x=0;x<w;x+=4) {
349     int a=(y&1)*0x2000;
350     UINT8 d=rom[a+(y&~1)*80/2+x/4];
351     UINT16 *line=BITMAP_ADDR16(bitmap, y, x);
352     *line++=(d>>6)&3;
353     *line++=(d>>4)&3;
354     *line++=(d>>2)&3;
355     *line++=(d>>0)&3;
356   }
357      }
358    } else {
359      for (y=0;y<h; y++) {
360   for (x=0;x<w;x+=8) {
361     int a=(y&3)*0x2000;
362     UINT8 d=rom[a+(y&~3)*80/4+x/8];
363     UINT16 *line=BITMAP_ADDR16(bitmap, y, x);
364     *line++=c[(d>>7)&1];
365     *line++=c[(d>>6)&1];
366     *line++=c[(d>>5)&1];
367     *line++=c[(d>>4)&1];
368     *line++=c[(d>>3)&1];
369     *line++=c[(d>>2)&1];
370     *line++=c[(d>>1)&1];
371     *line++=c[(d>>0)&1];
372   }
373      }
374    }
375    if (w!=width || h!=height) {
376      width=w; height=h;
377      //      video_screen_set_visarea(machine->primary_screen, 0, width-1, 0, height-1);
378      video_screen_set_visarea(screen, 0, width-1, 0, height-1);
379    }
380    return 0;
381}
382
383static INTERRUPT_GEN( pasogo_interrupt )
384{
385  //  cpunum_set_input_line(machine, 0, UPD7810_INTFE1, PULSE_LINE);
386}
387
388#if 0
389static const struct CustomSound_interface gmaster_sound_interface =
390{
391   gmaster_custom_start
392};
393#endif
394
395static int pasogo_irq_callback(int irqline)
396{
397   return pic8259_acknowledge(0);
398}
399
400static MACHINE_RESET( pasogo )
401{
402  pit8253_reset(0);
403  cpunum_set_irq_callback(0, pasogo_irq_callback);
404}
405
406//static const unsigned i86_address_mask = 0x000fffff;
407
408static MACHINE_DRIVER_START( pasogo )
409     MDRV_CPU_ADD_TAG("main", I80188/*V30HL in vadem vg230*/, 10000000/*?*/)
410MDRV_CPU_PROGRAM_MAP(pasogo_mem, 0)
411MDRV_CPU_IO_MAP( pasogo_io, 0 )
412MDRV_CPU_VBLANK_INT("main", pasogo_interrupt)
413//   MDRV_CPU_CONFIG(i86_address_mask)
414   MDRV_MACHINE_RESET( pasogo )
415
416
417     MDRV_SCREEN_ADD("main", LCD)
418     MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
419     MDRV_SCREEN_REFRESH_RATE(60)
420     MDRV_SCREEN_SIZE(640, 400)
421     MDRV_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1)
422  MDRV_PALETTE_LENGTH(ARRAY_LENGTH(pasogo_palette))
423  MDRV_VIDEO_UPDATE(pasogo)
424     MDRV_PALETTE_INIT(pasogo)
425#if 0
426     MDRV_SPEAKER_STANDARD_MONO("gmaster")
427     MDRV_SOUND_ADD(CUSTOM, 0)
428     MDRV_SOUND_CONFIG(gmaster_sound_interface)
429     MDRV_SOUND_ROUTE(0, "gmaster", 0.50)
430#endif
431MACHINE_DRIVER_END
432
433
434ROM_START(pasogo)
435     ROM_REGION(0x100000,REGION_CPU1, 0) // 1 megabyte dram?
436//     ROM_LOAD("gmaster.bin", 0x0000, 0x1000, CRC(05cc45e5) SHA1(05d73638dea9657ccc2791c0202d9074a4782c1e) )
437//     ROM_CART_LOAD(0, "bin", 0x8000, 0x8000, 0)
438   ROM_REGION(0x80000,REGION_USER1, 0)
439ROM_END
440
441static void pc_timer0_w(int state)
442{
443   pic8259_set_irq_line(0, 0, state);
444}
445
446static const struct pit8253_config pc_pit8254_config =
447{
448   TYPE8254,
449   {
450      {
451         4772720/4,            /* heartbeat IRQ */
452         pc_timer0_w,
453         NULL
454      }, {
455         4772720/4,            /* dram refresh */
456         NULL,
457         NULL
458      }, {
459         4772720/4,            /* pio port c pin 4, and speaker polling enough */
460         NULL,
461         //         pc_sh_speaker_change_clock
462      }
463   }
464};
465
466static void pasogo_pic_set_int_line(int which, int interrupt)
467{
468  cpunum_set_input_line(Machine, 0, 0, interrupt ? HOLD_LINE : CLEAR_LINE);
469}
470
471static DRIVER_INIT( pasogo )
472{
473  vg230_init();
474  memset(&ems, 0, sizeof(ems));
475  memory_set_bankptr( 27, memory_region(REGION_USER1) + 0x00000 );
476  memory_set_bankptr( 28, memory_region(REGION_CPU1) + 0xb8000/*?*/ );
477  pit8253_init(1, &pc_pit8254_config);
478  pic8259_init(1, pasogo_pic_set_int_line);
479}
480
481
482static int device_load_pasogo_cart(mess_image *image)
483{
484   UINT8 *user = memory_region(REGION_USER1);
485   int size;
486   size = image_length(image);
487
488   if (image_fread(image, user, size) != size)
489   {
490      logerror("%s load error\n", image_filename(image));
491      return 1;
492   }
493
494   return 0;
495}
496
497static void pasogo_cartslot_getinfo(const mess_device_class *devclass, UINT32 state, union devinfo *info)
498{
499   /* cartslot */
500   switch(state)
501   {
502      /* --- the following bits of info are returned as 64-bit signed integers --- */
503      case MESS_DEVINFO_INT_COUNT:                     info->i = 1; break;
504
505      /* --- the following bits of info are returned as pointers to data or functions --- */
506      case MESS_DEVINFO_PTR_LOAD:                     info->load = device_load_pasogo_cart; break;
507
508      /* --- the following bits of info are returned as NULL-terminated strings --- */
509      case MESS_DEVINFO_STR_FILE_EXTENSIONS:            strcpy(info->s = device_temp_str(), "bin"); break;
510
511      default:                              cartslot_device_getinfo(devclass, state, info); break;
512   }
513}
514
515SYSTEM_CONFIG_START(pasogo)
516     CONFIG_DEVICE(pasogo_cartslot_getinfo)
517SYSTEM_CONFIG_END
518
519/*    YEAR      NAME            PARENT  MACHINE   INPUT     INIT               
520     COMPANY                 FULLNAME */
521CONS( 1996, pasogo,       0,          0, pasogo,  pasogo,    pasogo,   pasogo, "KOEI", "PasoGo", GAME_NO_SOUND|GAME_NOT_WORKING)
522

Previous 15994 Revisions Next


© 1998-2018 The MESS Team