Previous 15994 Revisions Next

r1978 Thursday 13th March, 2008 at 05:58:40 UTC by Robbbert
[MBEE] Added Microbee Standard 16k
[src/mess]messdriv.c
[src/mess/drivers]mbee.c
[src/mess/includes]mbee.h
[src/mess/machine]mbee.c
[src/mess/video]mbee.c

src/mess/includes/mbee.h
r1977r1978
1212
1313MACHINE_RESET( mbee );
1414MACHINE_START( mbee );
15MACHINE_START( mbee56 );
1615
1716extern UINT8 *mbee_workram;
1817READ8_HANDLER( mbee_lowram_r );
r1977r1978
5352 READ8_HANDLER ( mbee_pcg_color_r );
5453WRITE8_HANDLER ( mbee_pcg_color_w );
5554
55 READ8_HANDLER ( mbee_pcg_r );
56WRITE8_HANDLER ( mbee_pcg_w );
57
5658VIDEO_START( mbee );
5759VIDEO_UPDATE( mbee );
5860
61VIDEO_START( mbeeic );
62VIDEO_UPDATE( mbeeic );
5963
64
6065#endif /* MBEE_H_ */
src/mess/video/mbee.c
r1977r1978
6060
6161 READ8_HANDLER ( mbee_pcg_color_latch_r )
6262{
63   int data = mbee_pcg_color_latch;
64   return data;
63   return mbee_pcg_color_latch;
6564}
6665
6766WRITE8_HANDLER ( mbee_videoram_w )
r1977r1978
7170
7271 READ8_HANDLER ( mbee_videoram_r )
7372{
74   int data;
7573   if( m6545_video_bank & 0x01 )
76   {
77      data = pcgram[offset];
78   }
74      return pcgram[offset];
7975   else
80   {
81      data = videoram[offset];
76      return videoram[offset];
77}
78
79WRITE8_HANDLER ( mbee_pcg_w )
80{
81   if( pcgram[0x0800+offset] != data )
82          {
83      int chr = 0x80 + offset / 16;
84      pcgram[0x0800+offset] = data;
85      /* decode character graphics again */
86      decodechar(machine->gfx[0], chr, pcgram);
8287   }
83   return data;
8488}
8589
90 READ8_HANDLER ( mbee_pcg_r )
91{
92   return pcgram[0x0800+offset];
93}
94
8695WRITE8_HANDLER ( mbee_pcg_color_w )
8796{
8897   if( (m6545_video_bank & 0x01) || (mbee_pcg_color_latch & 0x40) == 0 )
r1977r1978
219228   {
220229/* These are write only on a Rockwell 6545 */
221230#if 0
222    case 0:
231   case 0:
223232      return crt.horizontal_total;
224233   case 1:
225234      return crt.horizontal_displayed;
r1977r1978
257266   case 16:
258267//      logerror("6545 lpen_hi_r $%02X (lpen:%d upd:%d)\n", crt.lpen_hi, crt.lpen_strobe, crt.update_strobe);
259268      crt.lpen_strobe = 0;
260        crt.update_strobe = 0;
269      crt.update_strobe = 0;
261270      data = crt.lpen_hi;
262271      break;
263272   case 17:
264273//      logerror("6545 lpen_lo_r $%02X (lpen:%d upd:%d)\n", crt.lpen_lo, crt.lpen_strobe, crt.update_strobe);
265        crt.lpen_strobe = 0;
274      crt.lpen_strobe = 0;
266275      crt.update_strobe = 0;
267276      data = crt.lpen_lo;
268277      break;
r1977r1978
276285      break;
277286   case 31:
278287      /* shared memory latch */
279      addr = crt.transp_hi * 256 + crt.transp_lo;
288      addr = (crt.transp_hi << 8) | crt.transp_lo;
280289//      logerror("6545 transp_latch $%04X\n", addr);
281290      m6545_update_strobe(addr);
282291      break;
r1977r1978
304313      m6545_offset_xy();
305314      break;
306315   case 1:
307      if( crt.horizontal_displayed == data )
308         break;
309316      crt.horizontal_displayed = data;
310317      break;
311318   case 2:
r1977r1978
330337      m6545_offset_xy();
331338      break;
332339   case 6:
333      if( crt.vertical_displayed == data )
334         break;
335340      crt.vertical_displayed = data;
336341      break;
337342   case 7:
r1977r1978
361366      m6545_offset_xy();
362367      break;
363368   case 10:
364      if( crt.cursor_top == data )
365         break;
366369      crt.cursor_top = data;
367      addr = 256 * crt.cursor_address_hi + crt.cursor_address_lo;
368370      break;
369371   case 11:
370      if( crt.cursor_bottom == data )
371         break;
372372      crt.cursor_bottom = data;
373      addr = 256 * crt.cursor_address_hi + crt.cursor_address_lo;
374373      break;
375374   case 12:
376375      data &= 63;
r1977r1978
391390      break;
392391   case 14:
393392      data &= 63;
394      if( crt.cursor_address_hi == data )
395         break;
396393      crt.cursor_address_hi = data;
397      addr = 256 * crt.cursor_address_hi + crt.cursor_address_lo;
398394      break;
399395   case 15:
400      if( crt.cursor_address_lo == data )
401         break;
402396      crt.cursor_address_lo = data;
403      addr = 256 * crt.cursor_address_hi + crt.cursor_address_lo;
404397      break;
405398   case 16:
406399      /* lpen hi is read only */
r1977r1978
410403      break;
411404   case 18:
412405      data &= 63;
413      if( crt.transp_hi == data )
414         break;
415406      crt.transp_hi = data;
416407//      logerror("6545 transp_hi_w $%02X\n", data);
417408      break;
418409   case 19:
419      if( crt.transp_lo == data )
420         break;
421410      crt.transp_lo = data;
422411//      logerror("6545 transp_lo_w $%02X\n", data);
423412      break;
424413   case 31:
425414      /* shared memory latch */
426      addr = crt.transp_hi * 256 + crt.transp_lo;
415      addr = (crt.transp_hi << 8) | crt.transp_lo;
427416//      logerror("6545 transp_latch $%04X\n", addr);
428417      m6545_update_strobe(addr);
429418      break;
r1977r1978
435424VIDEO_START( mbee )
436425{
437426   videoram = auto_malloc(0x800);
427   pcgram = memory_region(REGION_CPU1)+0xf000;
428}
429
430VIDEO_START( mbeeic )
431{
432   videoram = auto_malloc(0x800);
438433   colorram = auto_malloc(0x800);
439434   pcgram = memory_region(REGION_CPU1)+0xf000;
440435}
r1977r1978
448443
449444   framecnt++;
450445
451   cursor = crt.cursor_address_hi * 256 + crt.cursor_address_lo;
452   screen_ = (crt.screen_address_hi & 7) * 256 + crt.screen_address_lo;
446   cursor = (crt.cursor_address_hi << 8) | crt.cursor_address_lo;
447   screen_ = ((crt.screen_address_hi & 7) << 8) | crt.screen_address_lo;
453448   for( offs = screen_; offs < crt.horizontal_displayed * crt.vertical_displayed + screen_; offs++ )
454449   {
450      int sx, sy, code;
451      sy = off_y - 9 + ((offs - screen_) / crt.horizontal_displayed) * (crt.scan_lines + 1);
452      sx = (off_x + 3 + ((offs - screen_) % crt.horizontal_displayed)) << 3;
453      code = videoram[offs];
454      drawgfx( bitmap,machine->gfx[0],code,0,0,0,sx,sy,
455         &machine->screen[0].visarea,TRANSPARENCY_NONE,0);
456
457      if( offs == cursor && (crt.cursor_top & 0x60) != 0x20 )
458      {
459         if( (crt.cursor_top & 0x60) == 0x60 || (framecnt & 16) == 0 )
460         {
461            int x, y;
462                      for( y = (crt.cursor_top & 31); y <= (crt.cursor_bottom & 31); y++ )
463            {
464               if( y > crt.scan_lines )
465                  break;
466               for( x = 0; x < 8; x++ )
467                  *BITMAP_ADDR16(bitmap, sy+y, sx+x) = 1;
468            }
469         }
470      }
471   }
472   return 0;
473}
474
475VIDEO_UPDATE( mbeeic )
476{
477   int offs, cursor, screen_;
478
479   for( offs = 0x000; offs < 0x380; offs += 0x10 )
480      keyboard_matrix_r(offs);
481
482   framecnt++;
483
484   cursor = (crt.cursor_address_hi << 8) | crt.cursor_address_lo;
485   screen_ = ((crt.screen_address_hi & 7) << 8) | crt.screen_address_lo;
486   for( offs = screen_; offs < crt.horizontal_displayed * crt.vertical_displayed + screen_; offs++ )
487   {
455488      int sx, sy, code, color;
456489      sy = off_y + ((offs - screen_) / crt.horizontal_displayed) * (crt.scan_lines + 1);
457      sx = (off_x + ((offs - screen_) % crt.horizontal_displayed)) * 8;
490      sx = (off_x + ((offs - screen_) % crt.horizontal_displayed)) << 3;
458491      code = videoram[offs];
459492      color = colorram[offs];
460493      drawgfx( bitmap,machine->gfx[0],code,color,0,0,sx,sy,
src/mess/messdriv.c
r1977r1978
542542TESTDRIVER( kc85_4d )   /* VEB KC 85/4 with disk interface               */
543543
544544   /* MICROBEE SYSTEMS */
545   DRIVER( mbee )      /* Microbee 32 IC                           */
545   DRIVER( mbee )      /* Microbee 16 Standard or Plus                        */
546   DRIVER( mbeeic )   /* Microbee 32 IC                           */
546547   DRIVER( mbeepc )   /* Microbee 32 PC                           */
547548   DRIVER( mbeepc85 )   /* Microbee 32 PC85                           */
548549   DRIVER( mbee56 )   /* Microbee 56K (CP/M)                        */
src/mess/machine/mbee.c
r1977r1978
5050/*
5151  On reset or power on, a circuit forces rom 8000-8FFF to appear at 0000-0FFF, while ram is disabled.
5252  It gets set back to normal on the first attempt to write to memory. (/WR line goes active).
53  The previous code caused the debugger to show $FF always in RAM, soft reset to hang, and many games to not work.
5453*/
5554
5655
src/mess/drivers/mbee.c
r1977r1978
99    Microbee memory map (preliminary)
1010
1111        0000-7FFF RAM
12        8000-BFFF SYSTEM roms (bas510a.rom, bas510b.rom)
13        C000-DFFF Edasm or WBee (edasm.rom or wbeee12.rom, optional)
14        E000-EFFF Telcom (tecl321.rom; optional)
15        F000-F7FF Video RAM
16        F800-FFFF PCG RAM (graphics)
17
18    Microbee IC memory map (preliminary)
19
20        0000-7FFF RAM
1221        8000-BFFF SYSTEM roms (bas522a.rom, bas522b.rom)
1322        C000-DFFF Edasm or WBee (edasm.rom or wbeee12.rom, optional)
1423        E000-EFFF Telcom (tecl321.rom; optional)
r1977r1978
4453#include "devices/cassette.h"
4554#include "devices/z80bin.h"
4655
56static READ8_HANDLER( mbee_read_ff ) { return 0xff; }   /* returns the true state of unmapped memory */
57
4758static ADDRESS_MAP_START(mbee_mem, ADDRESS_SPACE_PROGRAM, 8)
4859   AM_RANGE(0x0000, 0x0fff) AM_RAMBANK(1)
60   AM_RANGE(0x1000, 0x3fff) AM_RAM
61   AM_RANGE(0x4000, 0x7fff) AM_READWRITE(mbee_read_ff, MWA8_NOP)
62   AM_RANGE(0x8000, 0xefff) AM_ROM
63   AM_RANGE(0xf000, 0xf7ff) AM_READWRITE(mbee_videoram_r, mbee_videoram_w) AM_BASE(&pcgram) AM_SIZE(&videoram_size)
64   AM_RANGE(0xf800, 0xffff) AM_READWRITE(mbee_pcg_r, mbee_pcg_w)
65ADDRESS_MAP_END
66
67static ADDRESS_MAP_START(mbeeic_mem, ADDRESS_SPACE_PROGRAM, 8)
68   AM_RANGE(0x0000, 0x0fff) AM_RAMBANK(1)
4969   AM_RANGE(0x1000, 0x7fff) AM_RAM
50   AM_RANGE(0x8000, 0xbfff) AM_ROM
51   AM_RANGE(0xc000, 0xdfff) AM_ROM
52   AM_RANGE(0xe000, 0xefff) AM_ROM
70   AM_RANGE(0x8000, 0xefff) AM_ROM
5371   AM_RANGE(0xf000, 0xf7ff) AM_READWRITE(mbee_videoram_r, mbee_videoram_w) AM_BASE(&pcgram) AM_SIZE(&videoram_size)
5472   AM_RANGE(0xf800, 0xffff) AM_READWRITE(mbee_pcg_color_r, mbee_pcg_color_w)
5573ADDRESS_MAP_END
5674
57
5875static ADDRESS_MAP_START(mbee56_mem, ADDRESS_SPACE_PROGRAM, 8)
5976   AM_RANGE(0x0000, 0x0fff) AM_RAMBANK(1)
6077   AM_RANGE(0x1000, 0xdfff) AM_RAM
r1977r1978
6784static ADDRESS_MAP_START(mbee_ports, ADDRESS_SPACE_IO, 8)
6885   ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
6986   AM_RANGE(0x00, 0x03) AM_MIRROR(0x10) AM_READWRITE(mbee_pio_r, mbee_pio_w)
87   AM_RANGE(0x0b, 0x0b) AM_MIRROR(0x10) AM_READWRITE(mbee_video_bank_r, mbee_video_bank_w)
88   AM_RANGE(0x0c, 0x0c) AM_MIRROR(0x10) AM_READWRITE(m6545_status_r, m6545_index_w)
89   AM_RANGE(0x0d, 0x0d) AM_MIRROR(0x10) AM_READWRITE(m6545_data_r, m6545_data_w)
90ADDRESS_MAP_END
91
92static ADDRESS_MAP_START(mbeeic_ports, ADDRESS_SPACE_IO, 8)
93   ADDRESS_MAP_FLAGS( AMEF_ABITS(8) )
94   AM_RANGE(0x00, 0x03) AM_MIRROR(0x10) AM_READWRITE(mbee_pio_r, mbee_pio_w)
7095   AM_RANGE(0x08, 0x08) AM_MIRROR(0x10) AM_READWRITE(mbee_pcg_color_latch_r, mbee_pcg_color_latch_w)
7196   // AM_RANGE(0x09, 0x09) AM_MIRROR(0x10)  Listed as "Colour Wait Off" but doesn't appear in the schematics
7297   AM_RANGE(0x0a, 0x0a) AM_MIRROR(0x10) AM_READWRITE(mbee_color_bank_r, mbee_color_bank_w)
r1977r1978
262287
263288static MACHINE_DRIVER_START( mbee )
264289   /* basic machine hardware */
265   MDRV_CPU_ADD_TAG("main", Z80, 3375000)         /* 3.37500 Mhz */
290   MDRV_CPU_ADD_TAG("main", Z80, XTAL_12MHz / 6)         /* 2 Mhz */
266291   MDRV_CPU_PROGRAM_MAP(mbee_mem, 0)
267292   MDRV_CPU_IO_MAP(mbee_ports, 0)
268293   MDRV_CPU_CONFIG(mbee_daisy_chain)
269294   MDRV_CPU_VBLANK_INT("main", mbee_interrupt)
295
296   MDRV_MACHINE_RESET( mbee )
297
298   MDRV_GFXDECODE(mbee)
299   MDRV_SCREEN_ADD("main", RASTER)
300   MDRV_SCREEN_REFRESH_RATE(50)
301   MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250)) /* not accurate */
302   MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
303   MDRV_SCREEN_SIZE(64*8, 16*16)
304   MDRV_SCREEN_VISIBLE_AREA(0*8, 64*8-1, 0, 16*16-1)
305   MDRV_PALETTE_LENGTH(2)
306   MDRV_PALETTE_INIT(black_and_white)
307
308   MDRV_VIDEO_START(mbee)
309   MDRV_VIDEO_UPDATE(mbee)
310
311   /* sound hardware */
312   MDRV_SPEAKER_STANDARD_MONO("mono")
313   MDRV_SOUND_ADD(WAVE, 0)
314   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
315   MDRV_SOUND_ADD(SPEAKER, 0)
316   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
317MACHINE_DRIVER_END
318
319
320static MACHINE_DRIVER_START( mbeeic )
321   /* basic machine hardware */
322   MDRV_CPU_ADD_TAG("main", Z80, 3375000)         /* 3.37500 Mhz */
323   MDRV_CPU_PROGRAM_MAP(mbeeic_mem, 0)
324   MDRV_CPU_IO_MAP(mbeeic_ports, 0)
325   MDRV_CPU_CONFIG(mbee_daisy_chain)
326   MDRV_CPU_VBLANK_INT("main", mbee_interrupt)
270327   MDRV_INTERLEAVE(1)
271328
272329   MDRV_MACHINE_RESET( mbee )
r1977r1978
275332   MDRV_GFXDECODE(mbee)
276333   MDRV_SCREEN_ADD("main", RASTER)
277334   MDRV_SCREEN_REFRESH_RATE(50)
278   MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
335   MDRV_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(250)) /* not accurate */
279336   MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
280337   MDRV_SCREEN_SIZE(70*8, 310)
281338   MDRV_SCREEN_VISIBLE_AREA(0*8, 70*8-1, 0, 19*16-1)
282339   MDRV_PALETTE_LENGTH(256*2)
283340   MDRV_PALETTE_INIT(mbee)
284341
285   MDRV_VIDEO_START(mbee)
286   MDRV_VIDEO_UPDATE(mbee)
342   MDRV_VIDEO_START(mbeeic)
343   MDRV_VIDEO_UPDATE(mbeeic)
287344
288345   /* sound hardware */
289346   MDRV_SPEAKER_STANDARD_MONO("mono")
r1977r1978
295352
296353
297354static MACHINE_DRIVER_START( mbee56 )
298   MDRV_IMPORT_FROM( mbee )
355   MDRV_IMPORT_FROM( mbeeic )
299356   MDRV_CPU_MODIFY( "main" )
300357   MDRV_CPU_PROGRAM_MAP(mbee56_mem, 0)
301358MACHINE_DRIVER_END
r1977r1978
314371
315372ROM_START( mbee )
316373   ROM_REGION(0x18000,REGION_CPU1,0)
374   ROM_LOAD("bas510a.ic25",  0x8000, 0x1000, CRC(2ca47c36) SHA1(f36fd0afb3f1df26edc67919e78000b762b6cbcb) )
375   ROM_LOAD("bas510b.ic27",  0x9000, 0x1000, CRC(a07a0c51) SHA1(dcbdd9df78b4b6b2972de2e4050dabb8ae9c3f5a) )
376   ROM_LOAD("bas510c.ic28",  0xa000, 0x1000, CRC(906ac00f) SHA1(9b46458e5755e2c16cdb191a6a70df6de9fe0271) )
377   ROM_LOAD("bas510d.ic30",  0xb000, 0x1000, CRC(61727323) SHA1(c0fea9fd0e25beb9faa7424db8efd07cf8d26c1b) )
378   ROM_LOAD("edasma.ic31",   0xc000, 0x1000, CRC(120c3dea) SHA1(32c9bb6e54dd50d5218bb43cc921885a0307161d) )
379   ROM_LOAD("edasmb.ic33",   0xd000, 0x1000, CRC(a23bf3c8) SHA1(73a57c2800a1c744b527d0440b170b8b03351753) )
380   ROM_LOAD("charrom.ic13",  0xf000, 0x0800, CRC(b149737b) SHA1(a3cd4f5d0d3c71137cd1f0f650db83333a2e3597) )
381   ROM_RELOAD( 0x17000, 0x0800 )
382ROM_END
383
384ROM_START( mbeeic )
385   ROM_REGION(0x18000,REGION_CPU1,0)
317386   ROM_LOAD("bas522a.rom",  0x8000, 0x2000, CRC(7896a696) SHA1(a158f7803296766160e1f258dfc46134735a9477))
318387   ROM_LOAD("bas522b.rom",  0xa000, 0x2000, CRC(b21d9679) SHA1(332844433763331e9483409cd7da3f90ac58259d))
319388   ROM_LOAD("edasm.rom",    0xc000, 0x2000, CRC(1af1b3a9) SHA1(d035a997c2dbbb3918b3395a3a5a1076aa203ee5))
r1977r1978
445514SYSTEM_CONFIG_START(mbee)
446515   CONFIG_DEVICE(mbee_cassette_getinfo)
447516   CONFIG_DEVICE(mbee_cartslot_getinfo)
517   CONFIG_DEVICE(mbee_quickload_getinfo)
518SYSTEM_CONFIG_END
519
520SYSTEM_CONFIG_START(mbeeic)
521   CONFIG_DEVICE(mbee_cassette_getinfo)
522   CONFIG_DEVICE(mbee_cartslot_getinfo)
448523   CONFIG_DEVICE(mbee_floppy_getinfo)
449524   CONFIG_DEVICE(mbee_quickload_getinfo)
450525SYSTEM_CONFIG_END
451526
452527/*    YEAR  NAME      PARENT    COMPAT  MACHINE   INPUT     INIT      CONFIG    COMPANY   FULLNAME */
453COMP( 1982, mbee,     0,   0,   mbee,     mbee,     mbee,     mbee,      "Applied Technology",  "Microbee 32 IC" , 0)
454COMP( 1982, mbeepc,   mbee,   0,   mbee,     mbee,     mbee,     mbee,      "Applied Technology",  "Microbee 32 PC" , 0)
455COMP( 1985?,mbeepc85, mbee,   0,   mbee,     mbee,     mbee,     mbee,      "Applied Technology",  "Microbee 32 PC85" , 0)
456COMP( 1983, mbee56,   mbee,   0,   mbee56,   mbee,     mbee56,   mbee,      "Applied Technology",  "Microbee 56" , 0)
528COMP( 1982, mbee,     0,   0,   mbee,     mbee,     mbee,     mbee,      "Applied Technology",  "Microbee 16 Standard" , 0)
529COMP( 1982, mbeeic,   mbee,   0,   mbeeic,   mbee,     mbee,     mbeeic,      "Applied Technology",  "Microbee 32 IC" , 0)
530COMP( 1982, mbeepc,   mbee,   0,   mbeeic,   mbee,     mbee,     mbeeic,      "Applied Technology",  "Microbee 32 PC" , 0)
531COMP( 1985?,mbeepc85, mbee,   0,   mbeeic,   mbee,     mbee,     mbeeic,      "Applied Technology",  "Microbee 32 PC85" , 0)
532COMP( 1983, mbee56,   mbee,   0,   mbee56,   mbee,     mbee56,   mbeeic,      "Applied Technology",  "Microbee 56" , 0)
457533

Previous 15994 Revisions Next


© 1998-2018 The MESS Team