Previous 199869 Revisions Next

r18678 Tuesday 23rd October, 2012 at 17:15:29 UTC by Curt Coder
(MESS) c128: VDC fixes. (nw)
[src/emu/video]mc6845.c mc6845.h
[src/mess/drivers]c128.c

trunk/src/emu/video/mc6845.c
r18677r18678
3030
3131        - horizontal scroll
3232        - vertical scroll
33        - pixel double width
3433        - bitmap modes
3534        - display enable begin/end
3635
r18677r18678
7877#define HSS_TEXT               BIT(m_horiz_scroll, 7)
7978
8079#define ATTR_COLOR               (attr & 0x0f)
80#define ATTR_BACKGROUND            (attr & 0x0f)
81#define ATTR_FOREGROUND            (attr >> 4)
8182#define ATTR_BLINK               BIT(attr, 4)
8283#define ATTR_UNDERLINE            BIT(attr, 5)
8384#define ATTR_REVERSE            BIT(attr, 6)
r18677r18678
276277WRITE8_MEMBER( mos8563_device::address_w )
277278{
278279   m_register_address_latch = data & 0x3f;
279
280   m_update_ready_bit = 0;
281280}
282281
283282
284283READ8_MEMBER( mos8563_device::status_r )
285284{
286   UINT8 ret = 0;
285   UINT8 ret = m_revision;
287286
288287   /* VBLANK bit */
289288   if (!m_line_enable_ff)
r18677r18678
297296   if (m_update_ready_bit)
298297      ret = ret | 0x80;
299298
300   m_update_ready_bit = 1;
301
302299   return ret;
303300}
304301
r18677r18678
314311      case 0x02:   ret = m_horiz_sync_pos; break;
315312      case 0x03:   ret = m_sync_width; break;
316313      case 0x04:   ret = m_vert_char_total; break;
317      case 0x05:   ret = m_vert_total_adj; break;
314      case 0x05:   ret = m_vert_total_adj | 0xc0; break;
318315      case 0x06:   ret = m_vert_disp; break;
319316      case 0x07:   ret = m_vert_sync_pos; break;
320      case 0x08:   ret = m_mode_control; break;
321      case 0x09:   ret = m_max_ras_addr; break;
322      case 0x0a:   ret = m_cursor_start_ras; break;
323      case 0x0b:   ret = m_cursor_end_ras; break;
317      case 0x08:   ret = m_mode_control | 0xfc; break;
318      case 0x09:   ret = m_max_ras_addr | 0xe0; break;
319      case 0x0a:   ret = m_cursor_start_ras | 0x80; break;
320      case 0x0b:   ret = m_cursor_end_ras | 0xe0; break;
324321      case 0x0c:  ret = (m_disp_start_addr >> 8) & 0xff; break;
325322      case 0x0d:  ret = (m_disp_start_addr >> 0) & 0xff; break;
326323      case 0x0e:  ret = (m_cursor_addr     >> 8) & 0xff; break;
r18677r18678
332329      case 0x14:  ret = (m_attribute_addr  >> 8) & 0xff; break;
333330      case 0x15:  ret = (m_attribute_addr  >> 0) & 0xff; break;
334331      case 0x16:   ret = m_horiz_char; break;
335      case 0x17:   ret = m_vert_char_disp; break;
332      case 0x17:   ret = m_vert_char_disp | 0xe0; break;
336333      case 0x18:   ret = m_vert_scroll; break;
337334      case 0x19:   ret = m_horiz_scroll; break;
338335      case 0x1a:   ret = m_color; break;
339336      case 0x1b:   ret = m_row_addr_incr; break;
340      case 0x1c:   ret = m_char_base_addr; break;
341      case 0x1d:   ret = m_underline_ras; break;
342      case 0x1e:   ret = 0; break;
337      case 0x1c:   ret = m_char_base_addr | 0x1f; break;
338      case 0x1d:   ret = m_underline_ras | 0xe0; break;
339      case 0x1e:   ret = m_word_count; break;
343340      case 0x1f:   ret = read_videoram(m_update_addr++); break;
344341      case 0x20:  ret = (m_block_addr      >> 8) & 0xff; break;
345342      case 0x21:  ret = (m_block_addr      >> 0) & 0xff; break;
346343      case 0x22:  ret = (m_de_begin        >> 8) & 0xff; break;
347344      case 0x23:  ret = (m_de_begin        >> 0) & 0xff; break;
348      case 0x24:   ret = m_dram_refresh; break;
345      case 0x24:   ret = m_dram_refresh | 0xf0; break;
349346      case 0x25:   ret = m_sync_polarity | 0x3f; break;
350347   }
351348
r18677r18678
384381      case 0x16:   m_horiz_char       =   data & 0xff; break;
385382      case 0x17:   m_vert_char_disp   =   data & 0x1f; break;
386383      case 0x18:   m_vert_scroll      =   data & 0xff; break;
387      case 0x19:   m_horiz_scroll      =   data & 0xff; break;
384      case 0x19:
385         {
386         int dbl = HSS_DBL;
387         m_horiz_scroll = data & 0xff;
388         if (dbl && !HSS_DBL) set_clock(m_clock << 1);
389         if (!dbl && HSS_DBL) set_clock(m_clock >> 1);
390         break;
391         }
388392      case 0x1a:   m_color            =   data & 0xff; break;
389393      case 0x1b:   m_row_addr_incr      =   data & 0xff; break;
390      case 0x1c:   m_char_base_addr   =   data & 0xf0; break;
394      case 0x1c:   m_char_base_addr   =   data & 0xe0; break;
391395      case 0x1d:   m_underline_ras    =   data & 0x1f; break;
392396      case 0x1e:
393397         m_word_count = data & 0xff;
394
395         do
396         {
397            UINT8 byte = VSS_COPY ? read_videoram(m_block_addr++) : m_data;
398
399            write_videoram(m_update_addr++, byte);
400         } while (m_word_count-- > 0);
398         m_update_ready_bit = 0;
399         m_block_copy_timer->adjust( attotime::from_ticks( 1, m_clock ) );
401400         break;
402401      case 0x1f:
403402         m_data = data & 0xff;
404
405403         write_videoram(m_update_addr++, m_data);
406404         break;
407405      case 0x20:  m_block_addr      = ((data & 0xff) << 8) | (m_block_addr & 0x00ff); break;
r18677r18678
791789}
792790
793791
792void mos8563_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
793{
794   switch (id)
795   {
796   case TIMER_BLOCK_COPY:
797   {
798      UINT8 data = VSS_COPY ? read_videoram(m_block_addr++) : m_data;
799
800      write_videoram(m_update_addr++, data);
801     
802      if (--m_word_count)
803      {
804         m_block_copy_timer->adjust( attotime::from_ticks( 1, m_clock ) );
805      }
806      else
807      {
808         m_update_ready_bit = 1;
809      }
810      break;
811   }
812   default:
813      mc6845_device::device_timer(timer, id, param, ptr);
814      break;
815   }
816}
817
818
794819UINT16 mc6845_device::get_ma()
795820{
796821   update_counters();
r18677r18678
11861211{
11871212   mc6845_device::device_start();
11881213
1214   /* create the timers */
1215   m_block_copy_timer = timer_alloc(TIMER_BLOCK_COPY);
1216
11891217   m_supports_status_reg_d5 = true;
11901218   m_supports_status_reg_d6 = true;
11911219   m_supports_status_reg_d7 = true;
r18677r18678
12101238   m_de_begin = 0;
12111239   m_dram_refresh = 0;
12121240   m_sync_polarity = 0;
1241   
1242   m_revision = 1;
12131243
1244   // initialize video RAM
1245   UINT8 data = 0xff;
1246   
1247   for (offs_t offset = 0; offset < 0x10000; offset++)
1248   {
1249      write_videoram(offset, data);
1250      data ^= 0xff;
1251   }
1252
12141253   save_item(NAME(m_char_buffer));
12151254   save_item(NAME(m_attr_buffer));
12161255   save_item(NAME(m_attribute_addr));
r18677r18678
12281267   save_item(NAME(m_de_begin));
12291268   save_item(NAME(m_dram_refresh));
12301269   save_item(NAME(m_sync_polarity));
1270   save_item(NAME(m_revision));
12311271}
12321272
12331273
r18677r18678
13821422// VICE palette
13831423static const rgb_t MOS8563_PALETTE[] =
13841424{
1385   MAKE_RGB(0x00, 0x00, 0x00),
1386   MAKE_RGB(0x20, 0x20, 0x20),
1387   MAKE_RGB(0x00, 0x00, 0x80),
1388   MAKE_RGB(0x00, 0x00, 0xff),
1389   MAKE_RGB(0x00, 0x80, 0x00),
1390   MAKE_RGB(0x00, 0xff, 0x00),
1391   MAKE_RGB(0x00, 0x80, 0x80),
1392   MAKE_RGB(0x00, 0xff, 0xff),
1393   MAKE_RGB(0x80, 0x00, 0x00),
1394   MAKE_RGB(0xff, 0x00, 0x00),
1395   MAKE_RGB(0x80, 0x00, 0x80),
1396   MAKE_RGB(0xff, 0x00, 0xff),
1397   MAKE_RGB(0x80, 0x80, 0x00),
1398   MAKE_RGB(0xff, 0xff, 0x00),
1399   MAKE_RGB(0xc0, 0xc0, 0xc0),
1400   MAKE_RGB(0xff, 0xff, 0xff)
1425   RGB_BLACK,
1426   MAKE_RGB(0x55, 0x55, 0x55),
1427   MAKE_RGB(0x00, 0x00, 0xaa),
1428   MAKE_RGB(0x55, 0x55, 0xff),
1429   MAKE_RGB(0x00, 0xaa, 0x00),
1430   MAKE_RGB(0x55, 0xff, 0x55),
1431   MAKE_RGB(0x00, 0xaa, 0xaa),
1432   MAKE_RGB(0x55, 0xff, 0xff),
1433   MAKE_RGB(0xaa, 0x00, 0x00),
1434   MAKE_RGB(0xff, 0x55, 0x55),
1435   MAKE_RGB(0xaa, 0x00, 0xaa),
1436   MAKE_RGB(0xff, 0x55, 0xff),
1437   MAKE_RGB(0xaa, 0x55, 0x00),
1438   MAKE_RGB(0xff, 0xff, 0x55),
1439   MAKE_RGB(0xaa, 0xaa, 0xaa),
1440   RGB_WHITE
14011441};
14021442
14031443
r18677r18678
14361476
14371477void mos8563_device::update_row(bitmap_rgb32 &bitmap, const rectangle &cliprect, UINT16 ma, UINT8 ra, UINT16 y, UINT8 x_count, INT8 cursor_x, void *param)
14381478{
1479   ra += (m_vert_scroll & 0x0f);
1480   ra &= 0x0f;
1481
1482   UINT8 cth = (m_horiz_char >> 4) + (HSS_DBL ? 0 : 1);
1483   UINT8 cdh = (m_horiz_char & 0x0f) + (HSS_DBL ? 0 : 1);
1484   UINT8 cdv = m_vert_char_disp;
1485
14391486   for (int column = 0; column < x_count; column++)
14401487   {
1441      if (HSS_TEXT)
1488      UINT8 code = read_videoram(ma + column);
1489      UINT8 attr = 0;
1490
1491      int fg = m_color >> 4;
1492      int bg = m_color & 0x0f;
1493
1494      if (HSS_ATTR)
14421495      {
1443         // TODO graphics
1496         offs_t attr_addr = m_attribute_addr + ma + column;
1497         attr = read_videoram(attr_addr);
14441498      }
1445      else
1499
1500      if (HSS_TEXT)
14461501      {
1447         UINT16 code = read_videoram(ma + column);
1502         if (HSS_ATTR)
1503         {
1504            fg = ATTR_FOREGROUND;
1505            bg = ATTR_BACKGROUND;
1506         }
14481507
1449         offs_t attr_addr = m_attribute_addr + (ma - m_disp_start_addr) + column;
1450         UINT8 attr = 0;
1508         if (VSS_RVS) code ^= 0xff;
14511509
1452         UINT8 cth = (m_horiz_char >> 4) + 1;
1453         UINT8 cdh = (m_horiz_char & 0x0f) + 1;
1454         UINT8 cdv = m_vert_char_disp;
1510         for (int bit = 0; bit < cdh; bit++)
1511         {
1512            int x = (m_horiz_scroll & 0x0f) - cth + (column * cth) + bit;
1513            if (x < 0) x = 0;
1514            int color = BIT(code, 7) ? fg : bg;
14551515
1456         // attributes
1457         int fg;
1458         int bg = m_color & 0x0f;
1459
1516            bitmap.pix32(y, x) = MOS8563_PALETTE[color];
1517         }
1518      }
1519      else
1520      {
14601521         if (HSS_ATTR)
14611522         {
1462            attr = read_videoram(attr_addr);
14631523            fg = ATTR_COLOR;
14641524         }
1465         else
1466         {
1467            fg = m_color >> 4;
1468         }
14691525
14701526         offs_t font_addr;
14711527
1472         code |= ATTR_ALTERNATE_CHARSET << 8;
1473
14741528         if (m_max_ras_addr < 16)
1475            font_addr = ((m_char_base_addr >> 5) << 13) | (code << 4) | ra;
1529         {
1530            font_addr = ((m_char_base_addr & 0xe0) << 8) | (ATTR_ALTERNATE_CHARSET << 12) | (code << 4) | (ra & 0x0f);   
1531         }
14761532         else
1477            font_addr = ((m_char_base_addr >> 5) << 13) | (code << 5) | ra;
1478
1533         {
1534            font_addr = ((m_char_base_addr & 0xc0) << 8) | (ATTR_ALTERNATE_CHARSET << 13) | (code << 5) | (ra & 0x1f);   
1535         }
1536         
14791537         UINT8 data = read_videoram(font_addr);
14801538
1481         if (column == cursor_x) data = 0xff;
14821539         if (ra >= cdv) data = 0;
14831540         if (ATTR_UNDERLINE && (ra == m_underline_ras)) data = 0xff;
14841541         if (ATTR_BLINK && !m_char_blink_state) data = 0;
1542         if (ATTR_REVERSE) data ^= 0xff;
1543         if (column == cursor_x) data ^= 0xff;
1544         if (VSS_RVS) data ^= 0xff;
14851545
1486         if (ATTR_REVERSE)
1487         {
1488            int temp = bg;
1489            bg = fg;
1490            fg = temp;
1491         }
1492
14931546         for (int bit = 0; bit < cdh; bit++)
14941547         {
1495            int x = (column * cth) + bit;
1548            int x = (m_horiz_scroll & 0x0f) - cth + (column * cth) + bit;
1549            if (x < 0) x = 0;
1550            int color = BIT(data, 7) ? fg : bg;
14961551
1497            bitmap.pix32(y, x) = MOS8563_PALETTE[(BIT(data, 7) ^ VSS_RVS) ? fg : bg];
1552            bitmap.pix32(y, x) = MOS8563_PALETTE[color];
14981553
14991554            if ((bit < 8) || !HSS_SEMI) data <<= 1;
15001555         }
trunk/src/emu/video/mc6845.h
r18677r18678
401401   // device-level overrides
402402   virtual void device_start();
403403   virtual void device_reset();
404   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
404405
405406   const address_space_config      m_videoram_space_config;
406407
r18677r18678
427428   UINT8   m_dram_refresh;         /* 0x24 */
428429   UINT8   m_sync_polarity;      /* 0x25 */
429430
431   int m_revision;
432
430433   virtual void update_cursor_state();
431434   virtual UINT8 draw_scanline(int y, bitmap_rgb32 &bitmap, const rectangle &cliprect, void *param);
435
436   static const device_timer_id TIMER_BLOCK_COPY = 9;
437   
438   emu_timer *m_block_copy_timer;
432439};
433440
434441class mos8568_device : public mos8563_device
trunk/src/mess/drivers/c128.c
r18677r18678
782782
783783
784784//-------------------------------------------------
785//  mc6845_interface vdc_intf
786//-------------------------------------------------
787
788static GFXDECODE_START( c128 )
789   GFXDECODE_ENTRY( "charom", 0x0000, gfx_8x8x1, 0, 1 )
790GFXDECODE_END
791
792static const mc6845_interface vdc_intf =
793{
794   SCREEN_VDC_TAG,
795   8,
796   NULL,
797   NULL,
798   NULL,
799   DEVCB_NULL,
800   DEVCB_NULL,
801   DEVCB_NULL,
802   DEVCB_NULL,
803   NULL
804};
805
806
807//-------------------------------------------------
785808//  MOS8564_INTERFACE( vic_intf )
786809//-------------------------------------------------
787810
r18677r18678
815838
816839
817840//-------------------------------------------------
818//  mc6845_interface vdc_intf
819//-------------------------------------------------
820
821static const mc6845_interface vdc_intf =
822{
823   SCREEN_VDC_TAG,
824   8,
825   NULL,
826   NULL,
827   NULL,
828   DEVCB_NULL,
829   DEVCB_NULL,
830   DEVCB_NULL,
831   DEVCB_NULL,
832   NULL
833};
834
835
836//-------------------------------------------------
837841//  MOS6581_INTERFACE( sid_intf )
838842//-------------------------------------------------
839843
r18677r18678
10941098   data |= m_cassette->sense_r() << 4;
10951099
10961100   // CAPS LOCK
1097   data |= !BIT(ioport("SPECIAL")->read(), 5) << 6;
1101   data |= m_caps_lock << 6;
10981102
10991103   return data;
11001104}
r18677r18678
13801384   // video hardware
13811385   MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, VIC6567_CLOCK*2, vdc_intf, vdc_videoram_map)
13821386   MCFG_MOS8564_ADD(MOS8564_TAG, SCREEN_VIC_TAG, VIC6567_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
1387   MCFG_GFXDECODE(c128)
13831388
13841389   // sound hardware
13851390   MCFG_SPEAKER_STANDARD_MONO("mono")
r18677r18678
14841489   // video hardware
14851490   MCFG_MOS8563_ADD(MOS8563_TAG, SCREEN_VDC_TAG, VIC6569_CLOCK*2, vdc_intf, vdc_videoram_map)
14861491   MCFG_MOS8566_ADD(MOS8564_TAG, SCREEN_VIC_TAG, VIC6569_CLOCK, vic_intf, vic_videoram_map, vic_colorram_map)
1492   MCFG_GFXDECODE(c128)
14871493
14881494   // sound hardware
14891495   MCFG_SPEAKER_STANDARD_MONO("mono")

Previous 199869 Revisions Next


© 1997-2024 The MAME Team