Previous 199869 Revisions Next

r20287 Tuesday 15th January, 2013 at 23:41:07 UTC by Angelo Salese
(MESS) Made major clean-ups to NEC PC-8801, Sharp MZ-2500, Sharp X1 and Sony SMC-777 drivers. This gives a nice speed boost to them [Angelo Salese]
[src/mess/drivers]pc8801.c

trunk/src/mess/drivers/pc8801.c
r20286r20287
299299public:
300300   pc8801_state(const machine_config &mconfig, device_type type, const char *tag)
301301      : driver_device(mconfig, type, tag),
302         m_maincpu(*this, "maincpu"),
302303         m_fdccpu(*this, "fdccpu"),
303304         m_pic(*this, I8214_TAG),
304305         m_rtc(*this, UPD1990A_TAG),
305306         m_cassette(*this, CASSETTE_TAG)
306307   { }
307308
309   required_device<cpu_device> m_maincpu;
308310   required_device<cpu_device> m_fdccpu;
309311   optional_device<i8214_device> m_pic;
310312   required_device<upd1990a_device> m_rtc;
311313   required_device<cassette_image_device> m_cassette;
314   UINT8 *m_work_ram;
315   UINT8 *m_hi_work_ram;
316   UINT8 *m_ext_work_ram;
317   UINT8 *m_gvram;
318   UINT8 *m_n80rom;
319   UINT8 *m_n88rom;
320   UINT8 *m_kanji_rom;
321   UINT8 *m_cg_rom;
322
312323   UINT8 m_i8255_0_pc;
313324   UINT8 m_i8255_1_pc;
314325   UINT8 m_fdc_irq_opcode;
r20286r20287
520531{
521532   int x,y,xi;
522533   UINT32 count;
523   UINT8 *gvram = machine().root_device().memregion("gvram")->base();
524534   UINT16 y_size;
525535   UINT16 y_double;
526536
r20286r20287
540550            pen = 0;
541551
542552            /* note: layer masking doesn't occur in 3bpp mode, Bug Attack relies on this */
543            pen |= ((gvram[count+0x0000] >> (7-xi)) & 1) << 0;
544            pen |= ((gvram[count+0x4000] >> (7-xi)) & 1) << 1;
545            pen |= ((gvram[count+0x8000] >> (7-xi)) & 1) << 2;
553            pen |= ((m_gvram[count+0x0000] >> (7-xi)) & 1) << 0;
554            pen |= ((m_gvram[count+0x4000] >> (7-xi)) & 1) << 1;
555            pen |= ((m_gvram[count+0x8000] >> (7-xi)) & 1) << 2;
546556
547557            if(y_double)
548558            {
r20286r20287
568578{
569579   int x,y,xi;
570580   UINT32 count;
571   UINT8 *gvram = machine().root_device().memregion("gvram")->base();
572581   UINT8 color;
573582   UINT8 is_cursor;
574583
r20286r20287
587596         {
588597            int pen;
589598
590            pen = ((gvram[count+0x0000] >> (7-xi)) & 1);
599            pen = ((m_gvram[count+0x0000] >> (7-xi)) & 1);
591600            if(is_cursor)
592601               pen^=1;
593602
r20286r20287
625634            {
626635               int pen;
627636
628               pen = ((gvram[count+0x4000] >> (7-xi)) & 1);
637               pen = ((m_gvram[count+0x4000] >> (7-xi)) & 1);
629638               if(is_cursor)
630639                  pen^=1;
631640
r20286r20287
667676
668677UINT8 pc8801_state::extract_text_attribute(UINT32 address,int x, UINT8 width, UINT8 &non_special)
669678{
670   UINT8 *vram = machine().root_device().memregion("wram")->base();
679   UINT8 *vram = m_work_ram;
671680   int i;
672681   int fifo_size;
673682   int offset;
r20286r20287
706715void pc8801_state::pc8801_draw_char(bitmap_ind16 &bitmap,int x,int y,int pal,UINT8 gfx_mode,UINT8 reverse,UINT8 secret,UINT8 blink,UINT8 upper,UINT8 lower,int y_size,int width, UINT8 non_special)
707716{
708717   int xi,yi;
709   UINT8 *vram = machine().root_device().memregion("wram")->base();
710   UINT8 *gfx_rom = machine().root_device().memregion("gfx1")->base();
718   UINT8 *vram = m_work_ram;
711719   UINT8 is_cursor;
712720   UINT8 y_height, y_double;
713721   UINT8 y_step;
r20286r20287
757765               if(yi >= (1 << (y_double+3)) || secret || blink_mask)
758766                  char_data = 0;
759767               else
760                  char_data = (gfx_rom[tile*8+(yi >> y_double)] >> (7-xi)) & 1;
768                  char_data = (m_cg_rom[tile*8+(yi >> y_double)] >> (7-xi)) & 1;
761769
762770               if(yi == 0 && upper)
763771                  char_data = 1;
r20286r20287
874882READ8_MEMBER(pc8801_state::pc8801_alu_r)
875883{
876884   int i;
877   UINT8 *gvram = memregion("gvram")->base();
878885   UINT8 b,r,g;
879886
880887   /* store data to ALU regs */
881888   for(i=0;i<3;i++)
882      m_alu_reg[i] = gvram[i*0x4000 + offset];
889      m_alu_reg[i] = m_gvram[i*0x4000 + offset];
883890
884   b = gvram[offset + 0x0000];
885   r = gvram[offset + 0x4000];
886   g = gvram[offset + 0x8000];
891   b = m_gvram[offset + 0x0000];
892   r = m_gvram[offset + 0x4000];
893   g = m_gvram[offset + 0x8000];
887894   if(!(m_alu_ctrl2 & 1)) { b^=0xff; }
888895   if(!(m_alu_ctrl2 & 2)) { r^=0xff; }
889896   if(!(m_alu_ctrl2 & 4)) { g^=0xff; }
r20286r20287
894901WRITE8_MEMBER(pc8801_state::pc8801_alu_w)
895902{
896903   int i;
897   UINT8 *gvram = memregion("gvram")->base();
898904
899905   switch(m_alu_ctrl2 & 0x30) // alu write mode
900906   {
r20286r20287
908914
909915            switch(logic_op)
910916            {
911               case 0x00: { gvram[i*0x4000 + offset] &= ~data; } break;
912               case 0x01: { gvram[i*0x4000 + offset] |= data; } break;
913               case 0x10: { gvram[i*0x4000 + offset] ^= data; } break;
917               case 0x00: { m_gvram[i*0x4000 + offset] &= ~data; } break;
918               case 0x01: { m_gvram[i*0x4000 + offset] |= data; } break;
919               case 0x10: { m_gvram[i*0x4000 + offset] ^= data; } break;
914920               case 0x11: break; // NOP
915921            }
916922         }
r20286r20287
920926      case 0x10: // restore data from ALU regs
921927      {
922928         for(i=0;i<3;i++)
923            gvram[i*0x4000 + offset] = m_alu_reg[i];
929            m_gvram[i*0x4000 + offset] = m_alu_reg[i];
924930      }
925931      break;
926932
927933      case 0x20: // swap ALU reg 1 into R GVRAM
928         gvram[0x0000 + offset] = m_alu_reg[1];
934         m_gvram[0x0000 + offset] = m_alu_reg[1];
929935         break;
930936
931937      case 0x30: // swap ALU reg 0 into B GVRAM
932         gvram[0x4000 + offset] = m_alu_reg[0];
938         m_gvram[0x4000 + offset] = m_alu_reg[0];
933939         break;
934940   }
935941}
r20286r20287
937943
938944READ8_MEMBER(pc8801_state::pc8801_wram_r)
939945{
940   UINT8 *work_ram = memregion("wram")->base();
941
942   return work_ram[offset];
946   return m_work_ram[offset];
943947}
944948
945949WRITE8_MEMBER(pc8801_state::pc8801_wram_w)
946950{
947   UINT8 *work_ram = memregion("wram")->base();
948
949   work_ram[offset] = data;
951   m_work_ram[offset] = data;
950952}
951953
952954READ8_MEMBER(pc8801_state::pc8801_ext_wram_r)
953955{
954   UINT8 *ext_work_ram = memregion("ewram")->base();
955
956956   if(offset < m_extram_size)
957      return ext_work_ram[offset];
957      return m_ext_work_ram[offset];
958958
959959   return 0xff;
960960}
961961
962962WRITE8_MEMBER(pc8801_state::pc8801_ext_wram_w)
963963{
964   UINT8 *ext_work_ram = memregion("ewram")->base();
965
966964   if(offset < m_extram_size)
967      ext_work_ram[offset] = data;
965      m_ext_work_ram[offset] = data;
968966}
969967
970968READ8_MEMBER(pc8801_state::pc8801_nbasic_rom_r)
971969{
972   UINT8 *n80_rom = memregion("n80rom")->base();
973
974   return n80_rom[offset];
970   return m_n80rom[offset];
975971}
976972
977973READ8_MEMBER(pc8801_state::pc8801_n88basic_rom_r)
978974{
979   UINT8 *n88_rom = memregion("n88rom")->base();
980
981   return n88_rom[offset];
975   return m_n88rom[offset];
982976}
983977
984978READ8_MEMBER(pc8801_state::pc8801_gvram_r)
985979{
986   UINT8 *gvram = memregion("gvram")->base();
987
988   return gvram[offset];
980   return m_gvram[offset];
989981}
990982
991983WRITE8_MEMBER(pc8801_state::pc8801_gvram_w)
992984{
993   UINT8 *gvram = memregion("gvram")->base();
994
995   gvram[offset] = data;
985   m_gvram[offset] = data;
996986}
997987
998988READ8_MEMBER(pc8801_state::pc8801_high_wram_r)
999989{
1000   UINT8 *hi_work_ram = memregion("hiwram")->base();
1001
1002   return hi_work_ram[offset];
990   return m_hi_work_ram[offset];
1003991}
1004992
1005993WRITE8_MEMBER(pc8801_state::pc8801_high_wram_w)
1006994{
1007   UINT8 *hi_work_ram = memregion("hiwram")->base();
1008
1009   hi_work_ram[offset] = data;
995   m_hi_work_ram[offset] = data;
1010996}
1011997
1012998READ8_MEMBER(pc8801_state::pc8801ma_dic_r)
r20286r20287
13411327      m_vrtc_irq_latch = 0;
13421328
13431329   if(m_timer_irq_latch == 0 && m_vrtc_irq_latch == 0 && m_sound_irq_latch == 0)
1344      machine().device("maincpu")->execute().set_input_line(0,CLEAR_LINE);
1330      m_maincpu->set_input_line(0,CLEAR_LINE);
13451331
13461332//  IRQ_LOG(("%02x MASK (%02x %02x)\n",data,m_timer_irq_latch,m_vrtc_irq_latch));
13471333
r20286r20287
13891375      m_sound_irq_latch = 0;
13901376
13911377   if(m_timer_irq_latch == 0 && m_vrtc_irq_latch == 0 && m_sound_irq_latch == 0)
1392      machine().device("maincpu")->execute().set_input_line(0,CLEAR_LINE);
1378      m_maincpu->set_input_line(0,CLEAR_LINE);
13931379
13941380   if(m_sound_irq_mask && m_sound_irq_pending)
13951381   {
1396      machine().device("maincpu")->execute().set_input_line(0,HOLD_LINE);
1382      m_maincpu->set_input_line(0,HOLD_LINE);
13971383      m_sound_irq_latch = 1;
13981384      m_sound_irq_pending = 0;
13991385   }
r20286r20287
16081594
16091595READ8_MEMBER(pc8801_state::pc8801_kanji_r)
16101596{
1611   UINT8 *knj_rom = memregion("kanji")->base();
16121597   if((offset & 2) == 0)
1613      return knj_rom[m_knj_addr[0]*2+((offset & 1) ^ 1)];
1598      return m_kanji_rom[m_knj_addr[0]*2+((offset & 1) ^ 1)];
16141599
16151600   return 0xff;
16161601}
r20286r20287
16231608
16241609READ8_MEMBER(pc8801_state::pc8801_kanji_lv2_r)
16251610{
1626   UINT8 *knj_rom = memregion("kanji")->base() + 0x20000;
16271611   if((offset & 2) == 0)
1628      return knj_rom[m_knj_addr[1]*2+((offset & 1) ^ 1)];
1612      return m_kanji_rom[m_knj_addr[1]*2+((offset & 1) ^ 1)];
16291613
16301614   return 0xff;
16311615}
r20286r20287
17401724         m_sound_irq_latch = 0;
17411725
17421726      if(m_timer_irq_latch == 0 && m_vrtc_irq_latch == 0 && m_sound_irq_latch == 0)
1743         machine().device("maincpu")->execute().set_input_line(0,CLEAR_LINE);
1727         m_maincpu->set_input_line(0,CLEAR_LINE);
17441728
17451729      if(m_sound_irq_mask && m_sound_irq_pending)
17461730      {
1747         machine().device("maincpu")->execute().set_input_line(0,HOLD_LINE);
1731         m_maincpu->set_input_line(0,HOLD_LINE);
17481732         m_sound_irq_latch = 1;
17491733         m_sound_irq_pending = 0;
17501734      }
r20286r20287
22532237
22542238/* debugging only */
22552239static GFXDECODE_START( pc8801 )
2256   GFXDECODE_ENTRY( "gfx1", 0, char_layout,  0, 8 )
2240   GFXDECODE_ENTRY( "cgrom", 0, char_layout,  0, 8 )
22572241   GFXDECODE_ENTRY( "kanji", 0, kanji_layout, 0, 8 )
22582242GFXDECODE_END
22592243
r20286r20287
22922276
22932277      drvstate->m_pic->r_w(~irq);
22942278
2295      machine.device("maincpu")->execute().set_input_line(0,ASSERT_LINE);
2279      m_maincpu->set_input_line(0,ASSERT_LINE);
22962280   }
22972281   else
22982282   {
22992283      //drvstate->m_int_state &= ~irq;
23002284
2301      //machine.device("maincpu")->execute().set_input_line(0,CLEAR_LINE);
2285      //m_maincpu->set_input_line(0,CLEAR_LINE);
23022286   }
23032287}
23042288
r20286r20287
23302314   UINT8 vector = (7 - state->m_pic->a_r());
23312315
23322316   state->m_int_state &= ~(1<<vector);
2333   device->machine().device("maincpu")->execute().set_input_line(0,CLEAR_LINE);
2317   m_maincpu->set_input_line(0,CLEAR_LINE);
23342318
23352319   return vector << 1;
23362320}
r20286r20287
24112395   {
24122396      m_timer_irq_latch = 1;
24132397      //IRQ_LOG(("timer\n"));
2414      machine().device("maincpu")->execute().set_input_line(0,HOLD_LINE);
2398      m_maincpu->set_input_line(0,HOLD_LINE);
24152399   }
24162400}
24172401
r20286r20287
24212405   {
24222406      m_vrtc_irq_latch = 1;
24232407      //IRQ_LOG(("vrtc\n"));
2424      device.execute().set_input_line(0,HOLD_LINE);
2408      m_maincpu->set_input_line(0,HOLD_LINE);
24252409   }
24262410}
24272411#endif
24282412
24292413void pc8801_state::machine_start()
24302414{
2431   machine().device("maincpu")->execute().set_irq_acknowledge_callback(pc8801_irq_callback);
2415   m_maincpu->set_irq_acknowledge_callback(pc8801_irq_callback);
24322416   machine().device<upd765a_device>("upd765")->setup_intrq_cb(upd765a_device::line_cb(FUNC(pc8801_state::fdc_irq_w), this));
24332417
24342418   machine().device<floppy_connector>("upd765:0")->get_device()->set_rpm(300);
r20286r20287
24372421
24382422   m_rtc->cs_w(1);
24392423   m_rtc->oe_w(1);
2424
2425   m_work_ram = auto_alloc_array_clear(machine(), UINT8, 0x10000);
2426   m_hi_work_ram = auto_alloc_array_clear(machine(), UINT8, 0x1000);
2427   m_ext_work_ram = auto_alloc_array_clear(machine(), UINT8, 0x8000*0x100);
2428   m_gvram = auto_alloc_array_clear(machine(), UINT8, 0xc000);
2429   m_n80rom = memregion("n80rom")->base();
2430   m_n88rom = memregion("n88rom")->base();
2431   m_kanji_rom = memregion("kanji")->base();
2432   m_cg_rom = memregion("cgrom")->base();
2433
2434   state_save_register_global_pointer(machine(), m_work_ram, 0x10000);
2435   state_save_register_global_pointer(machine(), m_hi_work_ram, 0x1000);
2436   state_save_register_global_pointer(machine(), m_ext_work_ram, 0x8000*0x100);
2437   state_save_register_global_pointer(machine(), m_gvram, 0xc000);
24402438}
24412439
24422440void pc8801_state::machine_reset()
r20286r20287
25302528   m_has_clock_speed = 1;
25312529   m_clock_setting = machine().root_device().ioport("CFG")->read() & 0x80;
25322530
2533   machine().device("maincpu")->set_unscaled_clock(m_clock_setting ?  XTAL_4MHz : XTAL_8MHz);
2534   machine().device("fdccpu")->set_unscaled_clock(m_clock_setting ?  XTAL_4MHz : XTAL_8MHz); // correct?
2531   m_maincpu->set_unscaled_clock(m_clock_setting ?  XTAL_4MHz : XTAL_8MHz);
2532   m_fdccpu->set_unscaled_clock(m_clock_setting ?  XTAL_4MHz : XTAL_8MHz); // correct?
25352533   m_baudrate_val = 0;
25362534}
25372535
r20286r20287
27322730MACHINE_CONFIG_END
27332731
27342732
2735/* ROMs */
2733/* TODO: clean this up */
27362734#define PC8801_MEM_LOAD \
2737   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) \
2738   ROM_REGION( 0x10000, "wram", ROMREGION_ERASE00 ) \
2739   ROM_REGION( 0x1000, "hiwram", ROMREGION_ERASE00 ) \
2740   ROM_REGION( 0x8000*0x100, "ewram", ROMREGION_ERASE00 ) \
2741   ROM_REGION( 0xc000, "gvram", ROMREGION_ERASE00 ) \
27422735   ROM_REGION( 0x100000, "opna", ROMREGION_ERASE00 )
27432736
27442737
r20286r20287
27582751   ROM_REGION( 0x40000, "kanji", ROMREGION_ERASEFF)
27592752   ROM_LOAD_OPTIONAL( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
27602753
2761   ROM_REGION( 0x800, "gfx1", 0)
2754   ROM_REGION( 0x800, "cgrom", 0)
27622755   ROM_LOAD( "font.rom", 0x0000, 0x0800, CRC(56653188) SHA1(84b90f69671d4b72e8f219e1fe7cd667e976cf7f) )
27632756ROM_END
27642757
r20286r20287
27802773   ROM_REGION( 0x40000, "kanji", ROMREGION_ERASEFF)
27812774   ROM_LOAD_OPTIONAL( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
27822775
2783   ROM_REGION( 0x800, "gfx1", 0)
2776   ROM_REGION( 0x800, "cgrom", 0)
27842777   ROM_COPY( "kanji", 0x1000, 0x0000, 0x800 )
27852778ROM_END
27862779
r20286r20287
28082801   ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
28092802   ROM_LOAD( "kanji2.rom", 0x20000, 0x20000, CRC(154803cc) SHA1(7e6591cd465cbb35d6d3446c5a83b46d30fafe95) )    // it should not be here
28102803
2811   ROM_REGION( 0x800, "gfx1", 0)
2804   ROM_REGION( 0x800, "cgrom", 0)
28122805   ROM_COPY( "kanji", 0x1000, 0x0000, 0x800 )
28132806ROM_END
28142807
r20286r20287
28352828   ROM_REGION( 0x40000, "kanji", 0)
28362829   ROM_LOAD( "kanji1.rom", 0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
28372830
2838   ROM_REGION( 0x800, "gfx1", 0)
2831   ROM_REGION( 0x800, "cgrom", 0)
28392832   ROM_COPY( "kanji", 0x1000, 0x0000, 0x800 )
28402833ROM_END
28412834
r20286r20287
28632856   ROM_LOAD( "kanji1.rom",      0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
28642857   ROM_LOAD( "m2mr_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
28652858
2866   ROM_REGION( 0x800, "gfx1", 0)
2859   ROM_REGION( 0x800, "cgrom", 0)
28672860   ROM_COPY( "kanji", 0x1000, 0x0000, 0x800 )
28682861ROM_END
28692862
r20286r20287
28912884   ROM_LOAD( "kanji1.rom",    0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
28922885   ROM_LOAD( "mh_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
28932886
2894   ROM_REGION( 0x800, "gfx1", 0)
2887   ROM_REGION( 0x800, "cgrom", 0)
28952888   ROM_COPY( "kanji", 0x1000, 0x0000, 0x0800 )
28962889ROM_END
28972890
r20286r20287
29192912   ROM_LOAD( "kanji1.rom",    0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
29202913   ROM_LOAD( "fa_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
29212914
2922   ROM_REGION( 0x800, "gfx1", 0)
2915   ROM_REGION( 0x800, "cgrom", 0)
29232916   ROM_COPY( "kanji", 0x1000, 0x0000, 0x0800 )
29242917ROM_END
29252918
r20286r20287
29472940   ROM_LOAD( "kanji1.rom",    0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
29482941   ROM_LOAD( "ma_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
29492942
2950   ROM_REGION( 0x800, "gfx1", 0)
2943   ROM_REGION( 0x800, "cgrom", 0)
29512944   ROM_COPY( "kanji", 0x1000, 0x0000, 0x0800 )
29522945
29532946   /* 32 banks, to be loaded at 0xc000 - 0xffff */
r20286r20287
29792972   ROM_LOAD( "kanji1.rom",     0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
29802973   ROM_LOAD( "ma2_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
29812974
2982   ROM_REGION( 0x800, "gfx1", 0)
2975   ROM_REGION( 0x800, "cgrom", 0)
29832976   ROM_COPY( "kanji", 0x1000, 0x0000, 0x0800 )
29842977
29852978   ROM_REGION( 0x80000, "dictionary", 0 )
r20286r20287
30133006   ROM_LOAD( "kanji1.rom",    0x00000, 0x20000, CRC(6178bd43) SHA1(82e11a177af6a5091dd67f50a2f4bafda84d6556) )
30143007   ROM_LOAD( "mc_kanji2.rom", 0x20000, 0x20000, CRC(376eb677) SHA1(bcf96584e2ba362218b813be51ea21573d1a2a78) )
30153008
3016   ROM_REGION( 0x800, "gfx1", 0)
3009   ROM_REGION( 0x800, "cgrom", 0)
30173010   ROM_COPY( "kanji", 0x1000, 0x0000, 0x0800 )
30183011
30193012   ROM_REGION( 0x80000, "dictionary", 0 )

Previous 199869 Revisions Next


© 1997-2024 The MAME Team