Previous 199869 Revisions Next

r19914 Saturday 29th December, 2012 at 04:25:31 UTC by Carl
i86.c: Fix shift timing
[mess] pc.c: MT 05069 Fix MC1502 floppy interface
[mess] pc.c: Work around pcjx bios bug and fix pcjr nmi (nw)
[mess] pc.c: Support pcjx floppies
[mess] pc_t1t.c: Add support for pcjx text mode and fix pcjr 4bpp mode
[src/emu/cpu/i86]i86time.c instr86.c
[src/mess/drivers]pc.c
[src/mess/includes]pc.h
[src/mess/machine]pc.c tandy1t.c
[src/mess/video]pc_t1t.c

trunk/src/mess/machine/tandy1t.c
r19913r19914
355355   PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Print") /*                             37  B7 */
356356   PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Alt") PORT_CODE(KEYCODE_LALT) /* Left Alt                    38  B8 */
357357   PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) /* Space                       39  B9 */
358   PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE/* Caps Lock                   3A  BA */
358   PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) /* Caps Lock                   3A  BA */
359359   PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) /* F1                          3B  BB */
360360   PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) /* F2                          3C  BC */
361361   PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) /* F3                          3D  BD */
r19913r19914
368368   PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F8") PORT_CODE(KEYCODE_F8) /* F8                          42  C2 */
369369   PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F9") PORT_CODE(KEYCODE_F9) /* F9                          43  C3 */
370370   PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F10") PORT_CODE(KEYCODE_F10) /* F10                         44  C4 */
371   PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) PORT_TOGGLE/* Num Lock                    45  C5 */
371   PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("NumLock") PORT_CODE(KEYCODE_NUMLOCK) /* Num Lock                    45  C5 */
372372   PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Hold") PORT_CODE(KEYCODE_SCRLOCK) /*                           46  C6 */
373373   PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 7 \\") PORT_CODE(KEYCODE_7_PAD) /* Keypad 7                    47  C7 */
374374   PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("KP 8 ~") PORT_CODE(KEYCODE_8_PAD) /* Keypad 8                    48  C8 */
trunk/src/mess/machine/pc.c
r19913r19914
527527
528528WRITE8_MEMBER(pc_state::pc_nmi_enable_w)
529529{
530   logerror( "%08X: changing NMI state to %s\n", space.device().safe_pc(), data & 0x80 ? "enabled" : "disabled" );
530   //logerror( "%08X: changing NMI state to %s\n", space.device().safe_pc(), data & 0x80 ? "enabled" : "disabled" ); // this is clogging up the log
531531
532532   nmi_enabled = data & 0x80;
533533}
r19913r19914
582582READ8_MEMBER(pc_state::pcjr_nmi_enable_r)
583583{
584584   pcjr_keyb.latch = 0;
585
585   machine().firstcpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
586586   return nmi_enabled;
587587}
588588
r19913r19914
602602
603603static void pcjr_set_keyb_int(running_machine &machine, int state)
604604{
605   pc_state *st = machine.driver_data<pc_state>();
606605   if ( state )
607606   {
608607      UINT8   data = pc_keyb_read();
r19913r19914
634633      /* Set timer */
635634      pcjr_keyb.keyb_signal_timer->adjust( attotime::from_usec(220), 0, attotime::from_usec(220) );
636635
637      /* Trigger NMI */
638      if ( ! pcjr_keyb.latch )
639      {
640         pcjr_keyb.latch = 1;
641         if ( nmi_enabled & 0x80 )
642         {
643            st->m_pit8253->machine().firstcpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE );
644         }
645      }
636      pcjr_keyb.latch = 1;
646637   }
638   machine.firstcpu->set_input_line(INPUT_LINE_NMI, pcjr_keyb.latch && nmi_enabled);
647639}
648640
649641
r19913r19914
11811173   logerror("fdc: dor = %02x\n", data);
11821174   UINT8 pdor = m_pcjr_dor;
11831175   upd765a_device *fdc = machine().device<upd765a_device>("upd765");
1184   floppy_image_device *floppy = machine().device<floppy_connector>("upd765:0")->get_device();
1176   floppy_image_device *floppy0 = fdc->subdevice<floppy_connector>("0")->get_device();
1177   floppy_image_device *floppy1 = NULL;
1178
1179   if(fdc->subdevice("1"))
1180      floppy1 = fdc->subdevice<floppy_connector>("1")->get_device();
11851181   m_pcjr_dor = data;
11861182
1187   if(floppy)
1188      floppy->mon_w(!(m_pcjr_dor & 1));
1183   if(floppy0)
1184      floppy0->mon_w(!(m_pcjr_dor & 1));
1185   if(floppy1)
1186      floppy1->mon_w(!(m_pcjr_dor & 2));
11891187
11901188   if(m_pcjr_dor & 1)
1191      fdc->set_floppy(floppy);
1189      fdc->set_floppy(floppy0);
1190   else if(m_pcjr_dor & 2)
1191      fdc->set_floppy(floppy1);
11921192   else
11931193      fdc->set_floppy(NULL);
11941194
r19913r19914
12041204   }
12051205}
12061206
1207// pcjx port 0x1ff, some info from Toshiya Takeda
1208
1209void pc_state::pcjx_set_bank(int unk1, int unk2, int unk3)
1210{
1211   logerror("pcjx: 0x1ff 0:%02x 1:%02x 2:%02x\n", unk1, unk2, unk3);
1212}
1213
1214WRITE8_MEMBER(pc_state::pcjx_port_1ff_w)
1215{
1216   switch(m_pcjx_1ff_count) {
1217   case 0:
1218      m_pcjx_1ff_bankval = data;
1219      m_pcjx_1ff_count++;
1220      break;
1221   case 1:
1222      m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0] = data;
1223      m_pcjx_1ff_count++;
1224      break;
1225   case 2:
1226      m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][1] = data;
1227      m_pcjx_1ff_count = 0;
1228      pcjx_set_bank(m_pcjx_1ff_bankval, m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0], data);
1229      break;
1230   }
1231}
1232
1233
1234READ8_MEMBER(pc_state::pcjx_port_1ff_r)
1235{
1236   if(m_pcjx_1ff_count == 2)
1237      pcjx_set_bank(m_pcjx_1ff_bankval, m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][0], m_pcjx_1ff_bank[m_pcjx_1ff_bankval & 0x1f][1]);
1238
1239   m_pcjx_1ff_count = 0;
1240   return 0x60; // expansion?
1241}
1242
12071243/*
12081244 * MC1502 uses a FD1793 clone instead of uPD765
12091245 */
r19913r19914
14751511   m_pit8253 = machine().device("pit8253");
14761512}
14771513
1478
14791514MACHINE_RESET_MEMBER(pc_state,pcjr)
14801515{
14811516   device_t *speaker = machine().device(SPEAKER_TAG);
r19913r19914
14981533   m_pcjr_dor = 0;
14991534   speaker_level_w( speaker, 0 );
15001535
1536   m_pcjx_1ff_count = 0;
1537   m_pcjx_1ff_val = 0;
1538   m_pcjx_1ff_bankval = 0;
1539   memset(m_pcjx_1ff_bank, 0, sizeof(m_pcjx_1ff_bank));
1540
15011541   pcjr_keyb_init(machine());
15021542}
15031543
trunk/src/mess/includes/pc.h
r19913r19914
4141   UINT8 m_pc_input;
4242   UINT8 m_pcjr_dor;
4343   emu_timer *m_pcjr_watchdog;
44   UINT8 m_pcjx_1ff_count;
45   UINT8 m_pcjx_1ff_val;
46   UINT8 m_pcjx_1ff_bankval;
47   UINT8 m_pcjx_1ff_bank[20][2];
4448
4549   int                  m_ppi_portc_switch_high;
4650   int                  m_ppi_speaker;
r19913r19914
131135   DECLARE_READ8_MEMBER(mc1502_wd17xx_drq_r);
132136   DECLARE_READ8_MEMBER(mc1502_wd17xx_motor_r);
133137   DECLARE_WRITE8_MEMBER(pcjr_fdc_dor_w);
138   DECLARE_READ8_MEMBER(pcjx_port_1ff_r);
139   DECLARE_WRITE8_MEMBER(pcjx_port_1ff_w);
140   void pcjx_set_bank(int unk1, int unk2, int unk3);
134141
135142   void fdc_interrupt(bool state);
136143   void fdc_dma_drq(bool state);
trunk/src/mess/video/pc_t1t.c
r19913r19914
148148   UINT8   display_enable;
149149   UINT8   vsync;
150150   UINT8   palette_base;
151   UINT8   *jxkanji;
151152} pcjr = { 0 };
152153
153154
r19913r19914
225226   }
226227}
227228
229static MC6845_UPDATE_ROW( pcjx_text_update_row )
230{
231   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
232   UINT32  *p = &bitmap.pix32(y);
233   int i;
228234
235   for ( i = 0; i < x_count; i++ )
236   {
237      UINT16 offset = ( ( ma + i ) << 1 ) & 0x3fff;
238      UINT8 chr = pcjr.displayram[ offset ];
239      UINT8 attr = pcjr.displayram[ offset +1 ];
240      UINT16 fg = pcjr.palette_base + ( attr & 0x07 );
241      UINT16 bg = pcjr.palette_base + ( ( attr >> 4 ) & 0x07 );
242      UINT16 code = chr & 0x1f;
243      if((attr & 0x88) == 0x88)
244      {
245         code = pcjr.displayram[ offset - 2 ] & 0x1f;
246         code = (code << 8) + chr;
247      }
248      else if(attr & 0x80)
249         code = (code << 8) + pcjr.displayram[ offset + 2 ];
250      else
251         code = chr;
252
253      UINT8 data;
254      if(ra < 16)
255         data = pcjr.jxkanji[code * 16 * 2 + (ra * 2) + ((attr & 8)?1:0)];
256      else
257         data = ((i == cursor_x) && (pcjr.pc_framecnt & 8)) ? 0xff: 0;
258
259      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
260      *p = palette[( data & 0x40 ) ? fg : bg]; p++;
261      *p = palette[( data & 0x20 ) ? fg : bg]; p++;
262      *p = palette[( data & 0x10 ) ? fg : bg]; p++;
263      *p = palette[( data & 0x08 ) ? fg : bg]; p++;
264      *p = palette[( data & 0x04 ) ? fg : bg]; p++;
265      *p = palette[( data & 0x02 ) ? fg : bg]; p++;
266      *p = palette[( data & 0x01 ) ? fg : bg]; p++;
267   }
268}
269
229270static MC6845_UPDATE_ROW( t1000_gfx_4bpp_update_row )
230271{
231272   const rgb_t *palette = palette_entry_list_raw(bitmap.palette());
r19913r19914
359400      data = vid[ offset + 1 ];
360401
361402      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
362      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
363      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
364      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
365      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
366      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
367      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
368      *p = palette[( data & 0x80 ) ? fg : bg]; p++;
403      *p = palette[( data & 0x40 ) ? fg : bg]; p++;
404      *p = palette[( data & 0x20 ) ? fg : bg]; p++;
405      *p = palette[( data & 0x10 ) ? fg : bg]; p++;
406      *p = palette[( data & 0x08 ) ? fg : bg]; p++;
407      *p = palette[( data & 0x04 ) ? fg : bg]; p++;
408      *p = palette[( data & 0x02 ) ? fg : bg]; p++;
409      *p = palette[( data & 0x01 ) ? fg : bg]; p++;
369410   }
370411}
371412
r19913r19914
474515   switch( pcjr.reg.data[0] & 0x1A )
475516   {
476517   case 0x08:      /* 01x0x */
518      if(pcjr.jxkanji)
519      {
520         pcjr.update_row = pcjx_text_update_row;
521         break;
522      }
477523      if ( pcjr.reg.data[3] & 0x02 )
478524      {
479525         pcjr.update_row = t1000_text_blink_update_row;
r19913r19914
751797   }
752798}
753799
800static void pc_pcjx_bank_w(running_machine &machine, int data)
801{
802   if (pcjr.bank != data)
803   {
804      int dram, vram;
805      pcjr.bank = data;
806      /* this probably isn't right, but otherwise the memory test stomps on the vram */
807      if ((data&0xc0)==0xc0) /* needed for lemmings */
808      {
809         dram = 0x80000 + ((data & 0x06) << 14);
810         vram = 0x80000 + ((data & 0x30) << (14-3));
811      }
812      else
813      {
814         dram = 0x80000 + ((data & 0x07) << 14);
815         vram = 0x80000 + ((data & 0x38) << (14-3));
816      }
817      machine.root_device().membank( "bank14" )->set_base( machine.device<ram_device>(RAM_TAG)->pointer() + vram );
818      pcjr.displayram = machine.device<ram_device>(RAM_TAG)->pointer() + dram;
819      pc_pcjr_mode_switch(machine);
820   }
821}
754822
755823static int pc_t1t_bank_r(void)
756824{
r19913r19914
835903      case 12:
836904         break;
837905      case 15:
838         pc_pcjr_bank_w(space.machine(), data);
906         if(pcjr.jxkanji)
907            pc_pcjx_bank_w(space.machine(), data);
908         else
909            pc_pcjr_bank_w(space.machine(), data);
839910         break;
840911
841912      default:
r19913r19914
844915}
845916
846917
847 READ8_HANDLER ( pc_T1T_r )
918READ8_HANDLER ( pc_T1T_r )
848919{
849920   mc6845_device *mc6845;
850921   int            data = 0xff;
r19913r19914
9601031   pcjr.bank = 0;
9611032   pcjr.mode_control = 0x08;
9621033   pcjr.chr_size = 8;
1034   if(!strncmp(machine.system().name, "ibmpcjx", 7))
1035      pcjr.jxkanji = machine.root_device().memregion("kanji")->base();
1036   else
1037      pcjr.jxkanji = NULL;
9631038
9641039   buswidth = machine.firstcpu->space_config(AS_PROGRAM)->m_databus_width;
9651040   switch(buswidth)
trunk/src/mess/drivers/pc.c
r19913r19914
466466ADDRESS_MAP_END
467467
468468static ADDRESS_MAP_START(ibmpcjx_map, AS_PROGRAM, 8, pc_state )
469   AM_RANGE(0x80000, 0x9ffff) AM_ROM AM_REGION("kanji",0)
469   AM_RANGE(0x80000, 0xb7fff) AM_ROM AM_REGION("kanji",0)
470470   AM_IMPORT_FROM( ibmpcjr_map )
471471ADDRESS_MAP_END
472472
473473static ADDRESS_MAP_START(ibmpcjx_io, AS_IO, 8, pc_state )
474   AM_RANGE(0x01ff, 0x01ff) AM_READWRITE(pcjx_port_1ff_r, pcjx_port_1ff_w)
474475   AM_IMPORT_FROM( ibmpcjr_io )
475476ADDRESS_MAP_END
476477
r19913r19914
858859   DEVCB_CPU_INPUT_LINE("maincpu", 0)
859860};
860861
862static const floppy_interface mc1502_floppy_interface =
863{
864   DEVCB_NULL,
865   DEVCB_NULL,
866   DEVCB_NULL,
867   DEVCB_NULL,
868   DEVCB_NULL,
869   FLOPPY_STANDARD_5_25_DSHD,
870   LEGACY_FLOPPY_OPTIONS_NAME(pc),
871   "floppy_5_25",
872   NULL
873};
874
861875FLOPPY_FORMATS_MEMBER( pc_state::floppy_formats )
862876   FLOPPY_PC_FORMAT
863877FLOPPY_FORMATS_END
864878
865879static SLOT_INTERFACE_START( ibmpc_floppies )
866880    SLOT_INTERFACE( "525dd", FLOPPY_525_DD )
881    SLOT_INTERFACE( "35dd", FLOPPY_35_DD )
867882SLOT_INTERFACE_END
868883
869884SLOT_INTERFACE_START(ibm5150_com)
r19913r19914
13331348   MCFG_CPU_PROGRAM_MAP(ibmpcjx_map)
13341349   MCFG_CPU_IO_MAP(ibmpcjx_io)
13351350
1351   MCFG_DEVICE_REMOVE("upd765:0");   
1352   MCFG_FLOPPY_DRIVE_ADD("upd765:0", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats)
1353   MCFG_FLOPPY_DRIVE_ADD("upd765:1", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats)
1354
13361355   MCFG_GFXDECODE(ibmpcjx)
13371356MACHINE_CONFIG_END
13381357
r19913r19914
13731392   MCFG_CASSETTE_ADD( CASSETTE_TAG, mc1502_cassette_interface )   // has no motor control
13741393
13751394   MCFG_FD1793_ADD( "vg93", default_wd17xx_interface_2_drives )
1376   MCFG_FLOPPY_DRIVE_ADD(FLOPPY_0, ibmpc_floppies, "525dd", 0, pc_state::floppy_formats)
1395   MCFG_LEGACY_FLOPPY_2_DRIVES_ADD(mc1502_floppy_interface)
13771396
13781397   /* internal ram */
13791398   MCFG_RAM_ADD(RAM_TAG)
r19913r19914
18631882
18641883ROM_START( ibmpcjx )
18651884   ROM_REGION(0x100000,"maincpu", ROMREGION_ERASEFF)
1885   ROM_DEFAULT_BIOS("unk")
18661886   ROM_SYSTEM_BIOS( 0, "5601jda", "5601jda" )
18671887   ROMX_LOAD("5601jda.bin", 0xf0000, 0x10000, CRC(b1e12366) SHA1(751feb16b985aa4f1ec1437493ff77e2ebd5e6a6), ROM_BIOS(1))
18681888   ROMX_LOAD("basicjx.rom",   0xe8000, 0x08000, NO_DUMP, ROM_BIOS(1)) // boot fails due of this.
18691889   ROM_SYSTEM_BIOS( 1, "unk", "unk" )
18701890   ROMX_LOAD("ipljx.rom", 0xe0000, 0x20000, CRC(36a7b2de) SHA1(777db50c617725e149bca9b18cf51ce78f6dc548), ROM_BIOS(2))
1891   ROM_FILL(0xff195, 1, 0x20) // the bios has a bug that causes an interrupt
1892   ROM_FILL(0xff196, 1, 0x06) // to arrive before a flag is set causing the boot to hang
1893   ROM_FILL(0xff197, 1, 0x84) // technically this should be fixed in the PIC by delaying
1894   ROM_FILL(0xff198, 1, 0x04) // sending an irq after the mask is changed but there is
1895   ROM_FILL(0xff199, 1, 0xe6) // a strong possiblility that will cause problems with later
1896   ROM_FILL(0xff19a, 1, 0x21) // faster x86 machines.
18711897
18721898   ROM_REGION(0x08100,"gfx1", 0) //TODO: needs a different charset
18731899   ROM_LOAD("cga.chr",     0x00000, 0x01000, BAD_DUMP CRC(42009069) SHA1(ed08559ce2d7f97f68b9f540bddad5b6295294dd)) // from an unknown clone cga card
18741900
1875   ROM_REGION(0x20000,"kanji", 0)
1876   ROM_LOAD("kanji.rom",     0x00000, 0x20000, BAD_DUMP CRC(a313f241) SHA1(c2a4ea7eb38c5ad51e6482abca8f836a2c06e17a)) // hand-made rom
1901   ROM_REGION(0x38000,"kanji", 0)
1902   ROM_LOAD("kanji.rom",     0x00000, 0x38000, BAD_DUMP CRC(eaa6e3c3) SHA1(35554587d02d947fae8446964b1886fff5c9d67f)) // hand-made rom
18771903ROM_END
18781904
18791905#ifdef UNUSED_DEFINITION
trunk/src/emu/cpu/i86/instr86.c
r19913r19914
139139   else
140140   {
141141      int tmpcf = CF;
142      ICOUNT -= (ModRM >= 0xc0) ? timing.rot_reg_base + timing.rot_reg_bit : timing.rot_m8_base + timing.rot_m8_bit;
142      ICOUNT -= (ModRM >= 0xc0) ? timing.rot_reg_base + (timing.rot_reg_bit * count) : timing.rot_m8_base + (timing.rot_m8_bit * count);
143143
144144      switch (ModRM & 0x38)
145145      {
r19913r19914
333333   else
334334   {
335335      int tmpcf = CF;
336      ICOUNT -= (ModRM >= 0xc0) ? timing.rot_reg_base + timing.rot_reg_bit : timing.rot_m8_base + timing.rot_m16_bit;
336      ICOUNT -= (ModRM >= 0xc0) ? timing.rot_reg_base + (timing.rot_reg_bit * count) : timing.rot_m8_base + (timing.rot_m16_bit * count);
337337
338338      switch (ModRM & 0x38)
339339      {
trunk/src/emu/cpu/i86/i86time.c
r19913r19914
279279    2, 2, 7, 7,   /* INC/DEC */
280280    2, 2, 7, 7,   /* NEG/NOT */
281281
282    2, 5, 0,      /* reg shift/rotate */
282    2, 5, 1,      /* reg shift/rotate */
283283    7, 8, 1,      /* m8 shift/rotate */
284284    7, 8, 1,      /* m16 shift/rotate */
285285

Previous 199869 Revisions Next


© 1997-2024 The MAME Team