Previous 15994 Revisions Next

r6014 Thursday 8th October, 2009 at 08:44:31 UTC by Curt Coder
[UPD7220] Fixed several small bugs.
[src/mess/drivers]mikromik.c
[src/mess/video]upd7220.c

src/mess/video/upd7220.c
r6013r6014
149149
150150   UINT8 sr;                  /* status register */
151151   UINT8 cr;                  /* command register */
152   UINT8 pr[16];               /* parameter byte register */
152   UINT8 pr[17];               /* parameter byte register */
153153   int param_ptr;               /* parameter pointer */
154154
155155   UINT8 fifo[16];               /* FIFO data queue */
r6013r6014
195195{
196196   assert(device != NULL);
197197   assert(device->token != NULL);
198   assert((device->type == UPD7220));
198199   return (upd7220_t *)device->token;
199200}
200201
r6013r6014
215216      upd7220->fifo_flag[i] = FIFO_EMPTY;
216217   }
217218
218   upd7220->fifo_ptr = 0;
219   upd7220->fifo_ptr = -1;
219220
220221   upd7220->sr &= ~UPD7220_SR_DATA_READY;
221222   upd7220->sr |= UPD7220_SR_FIFO_EMPTY;
r6013r6014
246247
247248INLINE void queue(upd7220_t *upd7220, UINT8 data, int flag)
248249{
249   if (upd7220->fifo_ptr < 16)
250   if (upd7220->fifo_ptr < 15)
250251   {
252      upd7220->fifo_ptr++;
253
251254      upd7220->fifo[upd7220->fifo_ptr] = data;
252255      upd7220->fifo_flag[upd7220->fifo_ptr] = flag;
253256
254      upd7220->fifo_ptr++;
255
256257      if (upd7220->fifo_ptr == 16)
257258      {
258259         upd7220->sr |= UPD7220_SR_FIFO_FULL;
r6013r6014
411412{
412413   upd7220_t *upd7220 = get_safe_token(device);
413414
414   int horiz_pix_total = upd7220->hs + upd7220->hbp + upd7220->aw + upd7220->hfp;
415   int horiz_pix_total = (upd7220->hs + upd7220->hbp + upd7220->aw + upd7220->hfp) * 16;
415416   int vert_pix_total = upd7220->vs + upd7220->vbp + upd7220->al + upd7220->vfp;
416417
417   attoseconds_t refresh = HZ_TO_ATTOSECONDS(upd7220->clock) / horiz_pix_total / vert_pix_total;
418   attoseconds_t refresh = HZ_TO_ATTOSECONDS(device->clock) * horiz_pix_total * vert_pix_total;
418419   
419420   rectangle visarea;
420421
421   visarea.min_x = upd7220->hs + upd7220->hbp;
422   visarea.min_x = (upd7220->hs + upd7220->hbp) * 16;
422423   visarea.min_y = upd7220->vs + upd7220->vbp;
423   visarea.max_x = horiz_pix_total - upd7220->hfp - 1;
424   visarea.max_x = horiz_pix_total - (upd7220->hfp * 16) - 1;
424425   visarea.max_y = vert_pix_total - upd7220->vfp - 1;
425426
426427   if (LOG)
427428   {
428      logerror("uPD7220 '%s' Screen: width %u height x %u\n", device->tag, horiz_pix_total, vert_pix_total);
429      logerror("uPD7220 '%s' Screen: width %u height %u refresh %f\n", device->tag, horiz_pix_total, vert_pix_total, 1 / ATTOSECONDS_TO_DOUBLE(refresh));
429430      logerror("uPD7220 '%s' Visible Area: (%u, %u) - (%u, %u)\n", device->tag, visarea.min_x, visarea.min_y, visarea.max_x, visarea.max_y);
430431   }
431432
r6013r6014
554555         switch (data & 0xf0)
555556         {
556557         case UPD7220_COMMAND_PRAM:
558            command = COMMAND_PRAM;
559            break;
557560         default:
558561            switch (data & 0xe4)
559562            {
r6013r6014
592595   if (flag == FIFO_COMMAND)
593596   {
594597      upd7220->cr = data;
595      upd7220->param_ptr = 0;
598      upd7220->param_ptr = 1;
596599   }
597600   else
598601   {
r6013r6014
607610      break;
608611
609612   case COMMAND_RESET: /* reset */
610      if (LOG) logerror("uPD7220 '%s' RESET\n", device->tag);
611
612613      switch (upd7220->param_ptr)
613614      {
614615      case 0:
616         if (LOG) logerror("uPD7220 '%s' RESET\n", device->tag);
617
615618         upd7220->de = 0;
616619         upd7220->ra[0] = upd7220->ra[1] = upd7220->ra[2] = 0;
617620         upd7220->ra[3] = 0x19;
r6013r6014
620623         upd7220->mask = 0;
621624         break;
622625
623      case 8:
626      case 9:
624627         upd7220->mode = upd7220->pr[1];
625628         upd7220->aw = upd7220->pr[2] + 2;
626629         upd7220->hs = (upd7220->pr[3] & 0x1f) + 1;
627         upd7220->vs = ((upd7220->pr[4] & 0x03) << 2) | (upd7220->pr[3] >> 5);
630         upd7220->vs = ((upd7220->pr[4] & 0x03) << 3) | (upd7220->pr[3] >> 5);
628631         upd7220->hfp = (upd7220->pr[4] >> 2) + 1;
629632         upd7220->hbp = (upd7220->pr[5] & 0x3f) + 1;
630633         upd7220->vfp = upd7220->pr[6] & 0x3f;
631         upd7220->al = ((upd7220->pr[8] & 0x03) << 8) | upd7220->pr[7];
634         upd7220->al = ((upd7220->pr[8] & 0x03) << 8) | upd7220->pr[7]; // TODO wrong!
632635         upd7220->vbp = upd7220->pr[8] >> 2;
633636
634637         upd7220->pitch = upd7220->aw;
635638
639         if (LOG)
640         {
641            logerror("uPD7220 '%s' Mode: %02x\n", device->tag, upd7220->mode);
642            logerror("uPD7220 '%s' AW: %u\n", device->tag, upd7220->aw);
643            logerror("uPD7220 '%s' HS: %u\n", device->tag, upd7220->hs);
644            logerror("uPD7220 '%s' VS: %u\n", device->tag, upd7220->vs);
645            logerror("uPD7220 '%s' HFP: %u\n", device->tag, upd7220->hfp);
646            logerror("uPD7220 '%s' HBP: %u\n", device->tag, upd7220->hbp);
647            logerror("uPD7220 '%s' VFP: %u\n", device->tag, upd7220->vfp);
648            logerror("uPD7220 '%s' AL: %u\n", device->tag, upd7220->al);
649            logerror("uPD7220 '%s' VBP: %u\n", device->tag, upd7220->vbp);
650            logerror("uPD7220 '%s' PITCH: %u\n", device->tag, upd7220->pitch);
651         }
652
636653         recompute_parameters(device);
637654         break;
638655      }
639656      break;
640657
641658   case COMMAND_SYNC: /* sync format specify */
642      if (upd7220->param_ptr == 8)
659      if (upd7220->param_ptr == 9)
643660      {
644661         upd7220->mode = upd7220->pr[1];
645662         upd7220->aw = upd7220->pr[2] + 2;
646663         upd7220->hs = (upd7220->pr[3] & 0x1f) + 1;
647         upd7220->vs = ((upd7220->pr[4] & 0x03) << 2) | (upd7220->pr[3] >> 5);
664         upd7220->vs = ((upd7220->pr[4] & 0x03) << 3) | (upd7220->pr[3] >> 5);
648665         upd7220->hfp = (upd7220->pr[4] >> 2) + 1;
649666         upd7220->hbp = (upd7220->pr[5] & 0x3f) + 1;
650667         upd7220->vfp = upd7220->pr[6] & 0x3f;
r6013r6014
653670
654671         upd7220->pitch = upd7220->aw;
655672
673         if (LOG)
674         {
675            logerror("uPD7220 '%s' Mode: %02x\n", device->tag, upd7220->mode);
676            logerror("uPD7220 '%s' AW: %u\n", device->tag, upd7220->aw);
677            logerror("uPD7220 '%s' HS: %u\n", device->tag, upd7220->hs);
678            logerror("uPD7220 '%s' VS: %u\n", device->tag, upd7220->vs);
679            logerror("uPD7220 '%s' HFP: %u\n", device->tag, upd7220->hfp);
680            logerror("uPD7220 '%s' HBP: %u\n", device->tag, upd7220->hbp);
681            logerror("uPD7220 '%s' VFP: %u\n", device->tag, upd7220->vfp);
682            logerror("uPD7220 '%s' AL: %u\n", device->tag, upd7220->al);
683            logerror("uPD7220 '%s' VBP: %u\n", device->tag, upd7220->vbp);
684            logerror("uPD7220 '%s' PITCH: %u\n", device->tag, upd7220->pitch);
685         }
686
656687         recompute_parameters(device);
657688      }
658689      break;
r6013r6014
666697      break;
667698
668699   case COMMAND_CCHAR: /* cursor & character characteristics */
669      if (upd7220->param_ptr == 3)
700      if (upd7220->param_ptr == 4)
670701      {
671702         upd7220->lr = (upd7220->pr[1] & 0x1f) + 1;
672703         upd7220->dc = BIT(upd7220->pr[1], 7);
r6013r6014
701732      break;
702733
703734   case COMMAND_CURS: /* cursor position specify */
704      if (upd7220->param_ptr == 3)
735      if (upd7220->param_ptr == 4)
705736      {
706737         upd7220->ead = ((upd7220->pr[3] & 0x03) << 16) | (upd7220->pr[2] << 8) | upd7220->pr[1];
707738         upd7220->dad = upd7220->pr[3] >> 4;
r6013r6014
735766      {
736767         upd7220->pitch = data;
737768
738         if (LOG) logerror("uPD7220 '%s' PITCH: %02x\n", device->tag, upd7220->pitch);
769         if (LOG) logerror("uPD7220 '%s' PITCH: %u\n", device->tag, upd7220->pitch);
739770      }     
740771      break;
741772
r6013r6014
749780      break;
750781
751782   case COMMAND_MASK: /* mask register load */
752      if (upd7220->param_ptr == 2)
783      if (upd7220->param_ptr == 3)
753784      {
754785         upd7220->mask = (upd7220->pr[2] << 8) | upd7220->pr[1];
755786
r6013r6014
930961//   int im2 = BIT(upd7220->ra[7], 6);
931962   int wd2 = BIT(upd7220->ra[7], 7);
932963
933   int x, y;
964   int sx, y;
934965
935966   /* display partition area 1 */
936967   for (y = 0; y < len1; y++)
937968   {
938969      UINT32 addr = sad1 + (y * upd7220->pitch);
939970     
940      for (x = 0; x < (upd7220->aw + 2); x += 16)
971      for (sx = 0; sx < upd7220->aw; sx++)
941972      {
942         UINT16 data = memory_raw_read_word(upd7220->vram, addr & 0x3ffff);
943         upd7220->display_func(device, bitmap, y, x, addr, data);
973         UINT16 data = memory_raw_read_word(device->space[0], addr & 0x3ffff);
974         upd7220->display_func(device, bitmap, y, sx << 4, addr, data);
944975         if (wd1) addr += 2; else addr++;
945976      }
946977   }
r6013r6014
950981   {
951982      UINT32 addr = sad2 + (y * upd7220->pitch);
952983     
953      for (x = 0; x < (upd7220->aw + 2); x += 16)
984      for (sx = 0; sx < upd7220->aw; sx++)
954985      {
955         UINT16 data = memory_raw_read_word(upd7220->vram, addr);
956         upd7220->display_func(device, bitmap, y, x, addr, data);
986         UINT16 data = memory_raw_read_word(device->space[0], addr);
987         upd7220->display_func(device, bitmap, y, sx << 4, addr, data);
957988         if (wd2) addr += 2; else addr++;
958989      }
959990   }
r6013r6014
965996
966997void upd7220_update(const device_config *device, bitmap_t *bitmap, const rectangle *cliprect)
967998{
968   // TODO check mode
969   update_graphics(device, bitmap, cliprect);
999   upd7220_t *upd7220 = get_safe_token(device);
1000
1001   if (upd7220->de)
1002   {
1003      // TODO check mode
1004      update_graphics(device, bitmap, cliprect);
1005   }
9701006}
9711007
9721008/*-------------------------------------------------
r6013r6014
10151051   upd7220->blank_timer = timer_alloc(device->machine, blank_tick, (void *)device);
10161052
10171053   /* set initial values */
1054   upd7220->fifo_ptr = -1;
10181055   upd7220->sr = UPD7220_SR_FIFO_EMPTY;
10191056
10201057   for (i = 0; i < 16; i++)
r6013r6014
10761113      case DEVINFO_INT_DATABUS_WIDTH_0:            info->i = 16;                              break;
10771114      case DEVINFO_INT_ADDRBUS_WIDTH_0:            info->i = 18;                              break;
10781115      case DEVINFO_INT_ADDRBUS_SHIFT_0:            info->i = 0;                              break;
1079      case DEVINFO_INT_INLINE_CONFIG_BYTES:         info->i = 0;                              break;
10801116      case DEVINFO_INT_CLASS:                     info->i = DEVICE_CLASS_PERIPHERAL;               break;
10811117
10821118      /* --- the following bits of info are returned as pointers --- */
src/mess/drivers/mikromik.c
r6013r6014
1616
1717   TODO:
1818
19   - floppy access violation
2019   - add HRTC/VRTC output to i8275
2120   - NEC uPD7220 GDC
2221   - accurate video timing
r6013r6014
131130   AM_RANGE(0x0000, 0x0fff) AM_RAMBANK(1)
132131   AM_RANGE(0x1000, 0xfeff) AM_RAM
133132   AM_RANGE(0xff00, 0xff0f) AM_MIRROR(0x80) AM_DEVREADWRITE(I8237_TAG, dma8237_r, dma8237_w)
134   AM_RANGE(0xff10, 0xff13) AM_MIRROR(0x8c) AM_DEVREADWRITE(UPD7201_TAG, upd7201_cd_ba_r, upd7201_cd_ba_w)
133//   AM_RANGE(0xff10, 0xff13) AM_MIRROR(0x8c) AM_DEVREADWRITE(UPD7201_TAG, upd7201_cd_ba_r, upd7201_cd_ba_w)
135134    AM_RANGE(0xff20, 0xff21) AM_MIRROR(0x8e) AM_DEVREADWRITE(I8275_TAG, i8275_r, i8275_w)
136135   AM_RANGE(0xff30, 0xff33) AM_MIRROR(0x8c) AM_DEVREADWRITE(I8253_TAG, pit8253_r, pit8253_w)
137136   AM_RANGE(0xff40, 0xff40) AM_MIRROR(0x8f) AM_DEVREADWRITE(I8212_TAG, i8212_r, i8212_w)
r6013r6014
323322
324323   for (i = 0; i < 16; i++)
325324   {
326      int color = BIT(data, i);
327     
328      *BITMAP_ADDR16(bitmap, y, x + i) = color;
325      if (BIT(data, i)) *BITMAP_ADDR16(bitmap, y, x + i) = 1;
329326   }
330327}
331328
r6013r6014
358355   copybitmap(bitmap, tmpbitmap, 0, 0, 0, 0, cliprect);
359356
360357   /* graphics */
361   //upd7220_update(state->i8275, bitmap, cliprect);
358   upd7220_update(state->upd7220, bitmap, cliprect);
362359
363360   return 0;
364361}
r6013r6014
804801
805802   /* basic system hardware */
806803   MDRV_CPU_MODIFY(I8085A_TAG)
807   MDRV_CPU_PROGRAM_MAP(mm1_map)
804   MDRV_CPU_PROGRAM_MAP(mm1m6_map)
808805
809806   /* video hardware */
810807   MDRV_UPD7220_ADD(UPD7220_TAG, XTAL_18_720MHz/8, mm1_upd7220_intf, mm1_upd7220_map)

Previous 15994 Revisions Next


© 1998-2018 The MESS Team