Changeset 78572 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- May 17, 2019 2:27:50 PM (6 years ago)
- Location:
- trunk/src/VBox/Devices/PC
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS/ata.c
r78571 r78572 638 638 fdpt = ebda_seg :> &EbdaData->fdpt1; 639 639 640 #if 1640 #if 0 641 641 /* Place the FDPT outside of conventional memory. Needed for 642 642 * 286 XENIX 2.1.3/2.2.1 because it completely wipes out -
trunk/src/VBox/Devices/PC/BIOS/disk.c
r78571 r78572 162 162 dpt->heads = bios_dsk->devices[device].pchs.heads; 163 163 dpt->spt = bios_dsk->devices[device].pchs.spt; 164 #if 1165 164 lba = bios_dsk->devices[device].sectors; 166 #else167 // Makes PC DOS 7.1 FDISK32 happy168 lba = (uint32_t)dpt->cylinders * dpt->heads * dpt->spt;169 #endif170 165 dpt->sector_count1 = lba; 171 166 dpt->sector_count2 = lba >> 32; … … 400 395 break; 401 396 402 #ifdef VBOX_WITH_SCSIz403 case 0x06: /* identify SCSI devices */404 if (VBOX_IS_SCSI_DEVICE(device)|| 1) {405 BX_INFO("%s: AX=%04x BX=%04x CX=%04x DX=%04x ES=%04x\n", __func__, AX, BX, CX, DX, ES);406 BX_INFO("%s: function %02xh detected SCSI drive\n", __func__, GET_AH());407 SET_BH(0);408 SET_BL(0);409 SET_AL(0x80);410 goto int13_success;411 }412 BX_INFO("%s no SCSI drives, returns fail\n", __func__);413 goto int13_fail;414 break;415 #endif416 397 case 0x08: /* read disk drive parameters */ 417 398 418 399 /* Get the logical geometry from internal table. */ 419 #if 0420 /* Windows 3.1 FastDisk (wdctrl) insists on this */421 nlc = bios_dsk->devices[device].lchs.cylinders - 1;422 #else423 400 nlc = bios_dsk->devices[device].lchs.cylinders; 424 #endif425 401 nlh = bios_dsk->devices[device].lchs.heads; 426 402 nlspt = bios_dsk->devices[device].lchs.spt; -
trunk/src/VBox/Devices/PC/BIOS/makefile
r78571 r78572 47 47 48 48 vbxbios.rom : vbxbios.bin 49 !if $(CPU) > 28650 49 biossums $< $@ 51 !else52 cp $< $@53 !endif54 50 55 51 vbxbios.bin : $(OBJS) $(__MAKEFILES__) -
trunk/src/VBox/Devices/PC/DevDMA.cpp
r78571 r78572 99 99 #define DMA_SAVESTATE_OLD 1 /* The original saved state. */ 100 100 #define DMA_SAVESTATE_CURRENT 2 /* The new and improved saved state. */ 101 #define DMA_FIXES102 101 103 102 /* State information for a single DMA channel. */ … … 267 266 else 268 267 ch->u16BaseAddr = RT_MAKE_U16(ch->u16BaseAddr, u32); 268 269 ch->u16CurCount = 0; 270 ch->u16CurAddr = ch->u16BaseAddr; 269 271 } 270 272 else … … 276 278 ch->u16BaseAddr = RT_MAKE_U16(u32, RT_HIBYTE(ch->u16BaseAddr)); 277 279 } 278 /*279 * Update the current count/address.280 *281 * NB: The current count actually counts from zero up, while the base count282 * uses the the 8257 semantics and counts down. The guest never sees the283 * current count directly.284 */285 if (is_count)286 ch->u16CurCount = 0;287 else288 ch->u16CurAddr = ch->u16BaseAddr;289 290 280 Log2(("dmaWriteAddr: port %#06x, chidx %d, data %#02x\n", 291 281 port, chidx, u32)); … … 322 312 val = ch->u16BaseCount - ch->u16CurCount; 323 313 else 324 #ifdef DMA_FIXES325 val = ch->u16CurAddr;326 #else327 314 val = ch->u16CurAddr + ch->u16CurCount * dir; 328 #endif329 315 330 316 bptr = dmaReadBytePtr(dc); … … 615 601 DMAChannel *ch = &dc->ChState[chidx]; 616 602 uint32_t start_cnt, end_cnt; 617 int uDelta;618 603 int opmode; 619 604 … … 631 616 end_cnt = ch->pfnXferHandler(pThis->pDevIns, ch->pvUser, (ctlidx * 4) + chidx, 632 617 start_cnt, (ch->u16BaseCount + 1) << dc->is16bit); 633 uDelta = (end_cnt - start_cnt) >> dc->is16bit;634 618 ch->u16CurCount = end_cnt >> dc->is16bit; 635 #ifdef DMA_FIXES // Necessary, but currently upsets SB16.636 int dir = IS_MODE_DEC(ch->u8Mode) ? -1 : 1;637 ch->u16CurAddr += uDelta * dir;638 #endif639 619 /* Set the TC (Terminal Count) bit if transfer was completed. */ 640 620 if (ch->u16CurCount == ch->u16BaseCount + 1) … … 644 624 case DMODE_SINGLE: 645 625 case DMODE_BLOCK: 646 dc->u8Status |= RT_BIT(chidx); /* Set the TC status bit. */ 647 Log3(("TC set for DMA channel %d, auto-init %s\n", (ctlidx * 4) + chidx, IS_MODE_AI(ch->u8Mode) ? "on" : "off")); 648 if (IS_MODE_AI(ch->u8Mode)) 649 { 650 /* Auto-init DMA, resets the current address/count. */ 651 #ifdef DMA_FIXES // Necessary, but currently upsets SB16. 652 ch->u16CurAddr = ch->u16BaseAddr; 653 ch->u16CurCount = 0; 654 #endif 655 } 656 else 657 dc->u8Mask |= RT_BIT(chidx); /* No auto-init, mask channel. */ 626 dc->u8Status |= RT_BIT(chidx); 627 Log3(("TC set for DMA channel %d\n", (ctlidx * 4) + chidx)); 658 628 break; 659 629 default: … … 685 655 { 686 656 mask = 1 << chidx; 687 /* Run channel if not masked and its DREQ is active. */688 657 if (!(dc->u8Mask & mask) && (dc->u8Status & (mask << 4))) 689 658 dmaRunChannel(pThis, ctlidx, chidx);
Note:
See TracChangeset
for help on using the changeset viewer.