Previous 15994 Revisions Next

r9364 Tuesday 12th October, 2010 at 10:36:07 UTC by Curt Coder
[POFO] Typed in chargen ROM from technical manual, now showing proper characters.
[HD61830] Added support for external character generator ROM.
[docs]messnew.txt
[src/mess/drivers]kyocera.c micronic.c portfoli.c
[src/mess/video]hd61830.c hd61830.h kyocera.c

src/mess/video/kyocera.c
r9363r9364
5656   return 0;
5757}
5858
59static HD61830_INTERFACE( lcdc_intf )
60{
61   SCREEN_TAG,
62   NULL
63};
64
5965MACHINE_CONFIG_FRAGMENT( kc85_video )
6066   MDRV_SCREEN_ADD(SCREEN_TAG, LCD)
6167   MDRV_SCREEN_REFRESH_RATE(44)
r9363r9364
101107   MDRV_VIDEO_START(tandy200)
102108   MDRV_VIDEO_UPDATE(tandy200)
103109
104   MDRV_HD61830_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, SCREEN_TAG)
110   MDRV_HD61830_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, lcdc_intf)
105111MACHINE_CONFIG_END
src/mess/video/hd61830.c
r9363r9364
77
88**********************************************************************/
99
10/*
11
12    TODO:
13
14    - external ROM
15   - slave mode
16   
17*/
18
1910#include "emu.h"
2011#include "hd61830.h"
2112
r9363r9364
4637   4, 4, 4, 4, 4, -1, -1, -1, 4, 4, 4, 4, 6, 6, 36, 36
4738};
4839
49#define HD61830_MODE_EXTERNAL_CG   0x01   /* not supported */
40#define HD61830_MODE_EXTERNAL_CG   0x01
5041#define HD61830_MODE_GRAPHIC      0x02
5142#define HD61830_MODE_CURSOR         0x04
5243#define HD61830_MODE_BLINK         0x08
53#define HD61830_MODE_MASTER         0x10   /* not supported */
44#define HD61830_MODE_MASTER         0x10
5445#define HD61830_MODE_DISPLAY_ON      0x20
5546
5647/***************************************************************************
r9363r9364
6152struct _hd61830_t
6253{
6354   address_space *ram;         /* video RAM memory space */
64   address_space *rom;         /* character ROM memory space */
55   hd61830_rd_read   rd_r;
6556
6657   int bf;                  /* busy flag */
6758
r9363r9364
7869   int nx;                  /* number of time divisions */
7970   int cp;                  /* cursor position */
8071
81    UINT8 blink;            /* blinking */
72    int blink;               /* blinking */
73   int cursor;
8274
8375   /* devices */
8476   screen_device *screen;
r9363r9364
9486INLINE hd61830_t *get_safe_token(running_device *device)
9587{
9688   assert(device != NULL);
89   assert(device->type() == HD61830);
9790   return (hd61830_t *)downcast<legacy_device_base *>(device)->token();
9891}
9992
100INLINE hd61830_config *get_safe_config(running_device *device)
93INLINE const hd61830_interface *get_interface(running_device *device)
10194{
10295   assert(device != NULL);
10396   assert(device->type() == HD61830);
104   return (hd61830_config *)downcast<const legacy_device_config_base &>(device->baseconfig()).inline_config();
97   return (const hd61830_interface *) device->baseconfig().static_config();
10598}
10699
107100/***************************************************************************
r9363r9364
319312
320313      for (int x = 0; x < hd61830->hp; x++)
321314      {
322         *BITMAP_ADDR16(bitmap, y, (sx * hd61830->hp) + x) = BIT(data, 0);
323         data >>= 1;
315         *BITMAP_ADDR16(bitmap, y, (sx * hd61830->hp) + x) = BIT(data, x);
324316      }
325317   }
326318}
r9363r9364
350342    draw_char - draw a char
351343-------------------------------------------------*/
352344
353static void draw_char(running_device *device, bitmap_t *bitmap, const rectangle *cliprect, int x, int y, UINT8 char_code)
345static void draw_char(running_device *device, bitmap_t *bitmap, const rectangle *cliprect, UINT16 ma, int x, int y, UINT8 md)
354346{
355347   hd61830_t *hd61830 = get_safe_token(device);
356348
357   if (char_code < 0x20 || char_code > 0x7f)
358      return;
359
360   for (int cl = 0; cl < 7; cl++)
349   for (int cl = 0; cl < hd61830->vp; cl++)
361350   {
362      for (int cr = 0; cr < 5; cr++)
351      for (int cr = 0; cr < hd61830->hp; cr++)
363352      {
364         if ((hd61830->screen->height() > y * hd61830->vp + cl) && (hd61830->screen->width() > x * hd61830->hp + cr))
353         int sy = y * hd61830->vp + cl;
354         int sx = x * hd61830->hp + cr;
355         UINT8 data = 0;
356
357         if (hd61830->mcr & HD61830_MODE_EXTERNAL_CG)
365358         {
366            *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;
359            data = hd61830->rd_r(device, (cl << 12) | (ma & 0xfff), md);
367360         }
361         else
362         {
363            UINT16 addr = 0;
364
365            if (md >= 0x20 && md < 0x80 && cl < 7)
366            {
367               // 5x7 characters 0x20..0x7f
368               addr = (md - 0x20) * 7 + cl;
369            }
370            else if (md >= 0xa0 && md < 0xe0 && cl < 7)
371            {
372               // 5x7 characters 0xa0..0xdf
373               addr = 96*7 + (md - 0xa0) * 7 + cl;
374            }
375            else if (md >= 0xe0 && cl < 11)
376            {
377               // 5x11 characters 0xe0..0xff
378               addr = 160*7 + (md - 0xe0) * 11 + cl;
379            }
380
381            data = device->subregion("hd61830")->u8(addr);
382         }
383
384         int cursor = hd61830->mcr & HD61830_MODE_CURSOR;
385         int blink = hd61830->mcr & HD61830_MODE_BLINK;
386
387         // cursor off
388         int pixel = BIT(data, cr);
389
390         if (blink && (ma == hd61830->cac))
391         {
392            // cursor off, character blink
393            if (!cursor)
394               pixel = hd61830->cursor ? pixel : 0;
395
396            // cursor blink
397            if (cursor && (cl == hd61830->cp))
398               pixel = hd61830->cursor;
399         }
400         else
401         {
402            // cursor on
403            if (cursor && (cl == hd61830->cp))
404               pixel = hd61830->cursor;
405         }
406
407         *BITMAP_ADDR16(bitmap, sy, sx) = pixel;
368408      }
369409   }
370410}
371411
372412/*-------------------------------------------------
373    update_text- draw text mode screen
413    update_text - draw text mode screen
374414-------------------------------------------------*/
375415
376416static void update_text(running_device *device, bitmap_t *bitmap, const rectangle *cliprect)
377417{
378418   hd61830_t *hd61830 = get_safe_token(device);
379419
380   hd61830->blink++;
381
382   for (int y = 0; y < 8; y++)
420   for (int y = 0; y < (hd61830->nx / hd61830->vp); y++)
383421   {
384422      for (int x = 0; x < hd61830->hn; x++)
385423      {
386         UINT8 char_code = hd61830->ram->read_byte(y * hd61830->hn + x);
424         UINT16 ma = y * hd61830->hn + x;
425         UINT8 md = hd61830->ram->read_byte(ma);
387426
388         if (hd61830->cac == y * hd61830->hn + x)
389         {
390            /* update cursor */
391            switch ((hd61830->mcr >> 2) & 0x03)
392            {
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               {
407                  draw_char(device, bitmap, cliprect, x, y, char_code);
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;
422            }
423         }
424         else
425         {
426            draw_char(device, bitmap, cliprect, x, y, char_code);
427         }
427         draw_char(device, bitmap, cliprect, ma, x, y, md);
428428      }
429429   }
430430}
r9363r9364
437437{
438438   hd61830_t *hd61830 = get_safe_token(device);
439439
440   if (hd61830->mcr & HD61830_MODE_GRAPHIC)
440   if (hd61830->mcr & HD61830_MODE_DISPLAY_ON)
441441   {
442      update_graphics(device, bitmap, cliprect);
442      if (hd61830->mcr & HD61830_MODE_GRAPHIC)
443      {
444         update_graphics(device, bitmap, cliprect);
445      }
446      else
447      {
448         update_text(device, bitmap, cliprect);
449      }
443450   }
444451   else
445452   {
446      update_text(device, bitmap, cliprect);
453      bitmap_fill(bitmap, cliprect, 0);
447454   }
455
456   hd61830->blink++;
457
458   if (hd61830->blink == 0x20)
459   {
460      hd61830->blink = 0;
461      hd61830->cursor = !hd61830->cursor;
462   }
448463}
449464
450465/*-------------------------------------------------
r9363r9364
470485-------------------------------------------------*/
471486
472487ROM_START( hd61830 )
473   ROM_REGION( 0x398, "hd61830", ROMREGION_LOADBYNAME )
474   /* this is a fake charset used only for testing, the internal charset is still not dumped */
475   ROM_LOAD( "hd61830.bin", 0x000, 0x2a0, BAD_DUMP CRC(8faff7b9) SHA1(9626d4ace32d495f9840e456a501845fe60ad64c) ) /* internal 7360-bit chargen ROM */
488   ROM_REGION( 0x5c0, "hd61830", ROMREGION_LOADBYNAME ) // internal 7360-bit chargen ROM
489   ROM_LOAD( "hd61830.bin", 0x000, 0x5c0, BAD_DUMP CRC(06a934da) SHA1(bf3f074db5dc92e6f530cb18d6c013563099a87d) ) // typed in from manual
476490ROM_END
477491
478492/*-------------------------------------------------
r9363r9364
483497   AM_RANGE(0x0000, 0xffff) AM_RAM
484498ADDRESS_MAP_END
485499
486static ADDRESS_MAP_START( hd61380_rom, 1, 8 )
487   AM_RANGE(0x0000, 0xffff) AM_UNMAP
488ADDRESS_MAP_END
489
490500/*-------------------------------------------------
491501    DEVICE_START( hd61830 )
492502-------------------------------------------------*/
r9363r9364
494504static DEVICE_START( hd61830 )
495505{
496506   hd61830_t *hd61830 = get_safe_token(device);
497   const hd61830_config *config = get_safe_config(device);
507   const hd61830_interface *intf = get_interface(device);
498508
509   hd61830->rd_r = intf->rd_r;
510
499511   /* get the screen device */
500   hd61830->screen = device->machine->device<screen_device>(config->screen_tag);
512   hd61830->screen = device->machine->device<screen_device>(intf->screen_tag);
501513   assert(hd61830->screen != NULL);
502514
503515   hd61830->ram = device_get_space(device, ADDRESS_SPACE_0);
504   hd61830->rom = device_get_space(device, ADDRESS_SPACE_1);
505516
506517   /* create the busy timer */
507518   hd61830->busy_timer = timer_alloc(device->machine, busy_tick, (void *)device);
r9363r9364
518529   state_save_register_device_item(device, 0, hd61830->hn);
519530   state_save_register_device_item(device, 0, hd61830->nx);
520531   state_save_register_device_item(device, 0, hd61830->cp);
532   state_save_register_device_item(device, 0, hd61830->blink);
533   state_save_register_device_item(device, 0, hd61830->cursor);
521534}
522535
523536/*-------------------------------------------------
r9363r9364
542555   {
543556      /* --- the following bits of info are returned as 64-bit signed integers --- */
544557      case DEVINFO_INT_TOKEN_BYTES:               info->i = sizeof(hd61830_t);                  break;
545      case DEVINFO_INT_INLINE_CONFIG_BYTES:         info->i = sizeof(hd61830_config);               break;
558      case DEVINFO_INT_INLINE_CONFIG_BYTES:         info->i = 0;                              break;
546559      case DEVINFO_INT_DATABUS_WIDTH_0:            info->i = 8;                              break;
547560      case DEVINFO_INT_ADDRBUS_WIDTH_0:            info->i = 16;                              break;
548561      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;
552562
553563      /* --- the following bits of info are returned as pointers --- */
554564      case DEVINFO_PTR_ROM_REGION:               info->romregion = ROM_NAME(hd61830);            break;
555565
556566      /* --- the following bits of info are returned as pointers to data --- */
557567      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;
559568
560569      /* --- the following bits of info are returned as pointers to functions --- */
561570      case DEVINFO_FCT_START:                     info->start = DEVICE_START_NAME(hd61830);         break;
src/mess/video/hd61830.h
r9363r9364
2121
2222DECLARE_LEGACY_MEMORY_DEVICE(HD61830, hd61830);
2323
24#define MDRV_HD61830_ADD(_tag, _clock, _screen) \
24#define MDRV_HD61830_ADD(_tag, _clock, _config) \
2525   MDRV_DEVICE_ADD(_tag, HD61830, _clock) \
26   MDRV_DEVICE_CONFIG_DATAPTR(hd61830_config, screen_tag, _screen)
26   MDRV_DEVICE_CONFIG(_config)
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)
28#define HD61830_INTERFACE(name) \
29   const hd61830_interface (name) =
3230
3331/***************************************************************************
3432    TYPE DEFINITIONS
3533***************************************************************************/
3634
37typedef struct _hd61830_config hd61830_config;
38struct _hd61830_config
35typedef UINT8 (*hd61830_rd_read)(running_device *device, UINT16 ma, UINT8 md);
36#define HD61830_RD_READ(name)   UINT8 name(running_device *device, UINT16 ma, UINT8 md)
37
38typedef struct _hd61830_interface hd61830_interface;
39struct _hd61830_interface
3940{
4041   const char *screen_tag;      /* screen we are acting on */
42
43   hd61830_rd_read   rd_r;
4144};
4245
4346/***************************************************************************
src/mess/drivers/kyocera.c
r9363r9364
13271327}
13281328
13291329static MACHINE_CONFIG_START( kc85, kc85_state )
1330
13311330   /* basic machine hardware */
13321331   MDRV_CPU_ADD(I8085_TAG, I8085A, XTAL_4_9152MHz)
13331332   MDRV_CPU_PROGRAM_MAP(kc85_mem)
r9363r9364
13661365MACHINE_CONFIG_END
13671366
13681367static MACHINE_CONFIG_START( pc8201, kc85_state )
1369
13701368   /* basic machine hardware */
13711369   MDRV_CPU_ADD(I8085_TAG, I8085A, XTAL_4_9152MHz)
13721370   MDRV_CPU_PROGRAM_MAP(pc8201_mem)
r9363r9364
14051403MACHINE_CONFIG_END
14061404
14071405static MACHINE_CONFIG_DERIVED( trsm100, kc85 )
1408
14091406   /* basic machine hardware */
14101407   MDRV_CPU_MODIFY(I8085_TAG)
14111408   MDRV_CPU_IO_MAP(trsm100_io)
r9363r9364
14221419MACHINE_CONFIG_END
14231420
14241421static MACHINE_CONFIG_DERIVED( tandy102, trsm100 )
1425
14261422   MDRV_RAM_MODIFY("messram")
14271423   MDRV_RAM_DEFAULT_SIZE("24K")
14281424   MDRV_RAM_EXTRA_OPTIONS("32K")
r9363r9364
14301426
14311427
14321428static MACHINE_CONFIG_START( tandy200, tandy200_state )
1433
14341429   /* basic machine hardware */
14351430   MDRV_CPU_ADD(I8085_TAG, I8085A, XTAL_4_9152MHz)
14361431   MDRV_CPU_PROGRAM_MAP(tandy200_mem)
src/mess/drivers/portfoli.c
r9363r9364
513513   AM_RANGE(0x807f, 0x807f) AM_READWRITE(pid_r, sivr_w)
514514ADDRESS_MAP_END
515515
516//-------------------------------------------------
517//  ADDRESS_MAP( portfolio_lcdc )
518//-------------------------------------------------
519
520static ADDRESS_MAP_START( portfolio_lcdc, 0, 8 )
521   AM_RANGE(0x0000, 0x07ff) AM_ROM AM_REGION(HD61830_TAG, 0)
522ADDRESS_MAP_END
523
524516//**************************************************************************
525517//   INPUT PORTS
526518//**************************************************************************
r9363r9364
649641   return 0;
650642}
651643
644//-------------------------------------------------
645//  HD61830_INTERFACE( lcdc_intf )
646//-------------------------------------------------
647
648static HD61830_RD_READ( hd61830_rd_r )
649{
650   UINT16 address = (md << 3) | ((ma >> 12) & 0x07);
651   UINT8 data = memory_region(device->machine, HD61830_TAG)[address];
652
653   return data;
654}
655
656static HD61830_INTERFACE( lcdc_intf )
657{
658   SCREEN_TAG,
659   hd61830_rd_r
660};
661
662//-------------------------------------------------
663//  gfx_layout charlayout
664//-------------------------------------------------
665
666static const gfx_layout charlayout =
667{
668   6, 8,
669   256,
670   1,
671   { 0 },
672   { 7, 6, 5, 4, 3, 2 },
673   { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8 },
674   8*8
675};
676
677//-------------------------------------------------
678//  GFXDECODE( portfolio )
679//-------------------------------------------------
680
681static GFXDECODE_START( portfolio )
682   GFXDECODE_ENTRY( HD61830_TAG, 0, charlayout, 0, 2 )
683GFXDECODE_END
684
652685//**************************************************************************
653686//   DEVICE CONFIGURATION
654687//**************************************************************************
r9363r9364
884917   MDRV_PALETTE_INIT(portfolio)
885918
886919   MDRV_VIDEO_UPDATE(portfolio)
920   MDRV_GFXDECODE(portfolio)
887921
888   MDRV_HD61830_CGROM_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, SCREEN_TAG, portfolio_lcdc)
922   MDRV_HD61830_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, lcdc_intf)
889923
890924   /* sound hardware */
891925   MDRV_SPEAKER_STANDARD_MONO("mono")
r9363r9364
946980   ROMX_LOAD( "rom a.u3", 0x20000, 0x20000, BAD_DUMP CRC(b8fb730d) SHA1(1b9d82b824cab830256d34912a643a7d048cd401), ROM_BIOS(1) ) // dumped with debug.com
947981
948982   ROM_REGION( 0x800, HD61830_TAG, 0 )
949   ROM_LOAD( "hd61830 external character generator", 0x000, 0x800, NO_DUMP )
983   ROM_LOAD( "hd61830 external character generator", 0x000, 0x800, BAD_DUMP CRC(747a1db3) SHA1(a4b29678fdb43791a8ce4c1ec778f3231bb422c5) ) // typed in from manual
950984ROM_END
951985
952986//**************************************************************************
r9363r9364
954988//**************************************************************************
955989
956990/*    YEAR  NAME    PARENT  COMPAT  MACHINE     INPUT       INIT    COMPANY     FULLNAME        FLAGS */
957COMP( 1989, pofo,   0,      0,      portfolio,   portfolio,   0,      "Atari",   "Portfolio",   GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
991COMP( 1989, pofo,   0,      0,      portfolio,   portfolio,   0,      "Atari",   "Portfolio",   GAME_NOT_WORKING | GAME_IMPERFECT_SOUND | GAME_SUPPORTS_SAVE )
src/mess/drivers/micronic.c
r9363r9364
445445   return 0;
446446}
447447
448static HD61830_INTERFACE( lcdc_intf )
449{
450   SCREEN_TAG,
451   NULL
452};
453
448454static MACHINE_START( micronic )
449455{
450456   micronic_state *state = machine->driver_data<micronic_state>();
r9363r9364
464470//  state_save_register_global(machine, state->);
465471}
466472
467
468473static MACHINE_RESET( micronic )
469474{
470475   memory_set_bank(machine, "bank1", 0);
r9363r9364
472477}
473478
474479static MACHINE_CONFIG_START( micronic, micronic_state )
475
476480   /* basic machine hardware */
477481    MDRV_CPU_ADD(Z80_TAG, Z80, XTAL_3_579545MHz)
478482    MDRV_CPU_PROGRAM_MAP(micronic_mem)
r9363r9364
496500    MDRV_VIDEO_START(micronic)
497501    MDRV_VIDEO_UPDATE(micronic)
498502
499   MDRV_HD61830_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, SCREEN_TAG)
503   MDRV_HD61830_ADD(HD61830_TAG, XTAL_4_9152MHz/2/2, lcdc_intf)
500504
501505   /* sound hardware */
502506   MDRV_SPEAKER_STANDARD_MONO( "mono" )
docs/messnew.txt
r9363r9364
104104  the DRQ. All of the other functionality (for reading) will be omitted.
105105  [tim lindner]
106106
107- Added support for external character generator ROM to HD61830 LCDC. [Curt Coder]
107108
108109
110
1091110.139
110112
111113New System Drivers Supported:

Previous 15994 Revisions Next


© 1998-2018 The MESS Team