Overhauled and unified CD-ROM emulation;

Four CD-ROM drives are now emulated;
ATAPI DMA is now emulated;
Unified CD-ROM pass through to host drive handling;
Applied all (applicable) mainline PCem commits.
This commit is contained in:
OBattler
2017-01-16 01:49:19 +01:00
parent 0a11edd343
commit 4f7fd84229
41 changed files with 5953 additions and 5129 deletions

View File

@@ -4,13 +4,13 @@ CC = gcc.exe
WINDRES = windres.exe
CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -fpeel-loops -ftracer -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -mssse3 -mfpmath=sse -mstackrealign
DFLAGS = -O3 -march=i686 -fomit-frame-pointer -msse2 -mstackrealign
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom-ioctl.o cdrom-iso.o \
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86.o compaq.o config.o cpu.o dac.o \
device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o rom.o rtc.o \
scat.o scsi.o scsi_cdrom.o serial.o sis496.o sis85c471.o sio.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_cms.o \
scat.o scsi.o serial.o sis496.o sis85c471.o sio.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_cms.o \
sound_dbopl.o sound_emu8k.o sound_gus.o sound_mpu401_uart.o sound_opl.o sound_pas16.o sound_ps1.o sound_pssj.o sound_resid.o \
sound_sb.o sound_sb_dsp.o sound_sn76489.o sound_speaker.o sound_ssi2001.o sound_wss.o sound_ym7128.o \
soundopenal.o tandy_eeprom.o tandy_rom.o timer.o um8669f.o vid_ati_eeprom.o vid_ati_mach64.o vid_ati18800.o \

View File

@@ -4,13 +4,13 @@ CC = gcc.exe
WINDRES = windres.exe
CFLAGS = -O3 -march=native -mtune=native -fbranch-probabilities -fvpt -fpeel-loops -ftracer -fomit-frame-pointer -ffast-math -msse -msse2 -msse3 -mssse3 -mfpmath=sse -mstackrealign
DFLAGS = -O3 -fomit-frame-pointer -msse2 -mstackrealign
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom-ioctl.o cdrom-iso.o \
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o ali1429.o amstrad.o buslogic.o cdrom.o cdrom-ioctl.o cdrom-iso.o \
cdrom-null.o codegen.o codegen_ops.o codegen_timing_486.o codegen_timing_686.o codegen_timing_pentium.o codegen_timing_winchip.o codegen_x86-64.o compaq.o config.o cpu.o dac.o \
device.o disc.o disc_86f.o disc_fdi.o disc_imd.o disc_img.o disc_random.o disc_td0.o dma.o fdc.o fdc37c665.o fdc37c932fr.o fdd.o fdi2raw.o gameport.o headland.o i430hx.o i430lx.o i430fx.o \
i430nx.o i430vx.o i440fx.o ide.o intel.o intel_flash.o io.o jim.o joystick_ch_flightstick_pro.o joystick_standard.o joystick_sw_pad.o joystick_tm_fcs.o keyboard.o keyboard_amstrad.o keyboard_at.o \
keyboard_olim24.o keyboard_pcjr.o keyboard_xt.o lpt.o mcr.o mem.o memregs.o model.o mouse.o mouse_ps2.o \
mouse_serial.o ne2000.o neat.o nethandler.o nmi.o nvr.o olivetti_m24.o opti495.o pc.o pc87306.o pci.o pic.o piix.o pit.o ppi.o ps1.o rom.o rtc.o \
scat.o scsi.o scsi_cdrom.o serial.o sis496.o sis85c471.o sio.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_cms.o \
scat.o scsi.o serial.o sis496.o sis85c471.o sio.o sound.o sound_ad1848.o sound_adlib.o sound_adlibgold.o sound_cms.o \
sound_dbopl.o sound_emu8k.o sound_gus.o sound_mpu401_uart.o sound_opl.o sound_pas16.o sound_ps1.o sound_pssj.o sound_resid.o \
sound_sb.o sound_sb_dsp.o sound_sn76489.o sound_speaker.o sound_ssi2001.o sound_wss.o sound_ym7128.o \
soundopenal.o tandy_eeprom.o tandy_rom.o timer.o um8669f.o vid_ati_eeprom.o vid_ati_mach64.o vid_ati18800.o \
@@ -33,7 +33,6 @@ LIBS = -mwindows -lwinmm -lopenal -lddraw -ldinput8 -ldxguid -ld3d9 -ld3dx9 -lws
86Box64.exe: $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ)
$(CC) $(OBJ) $(DBOBJ) $(LZFOBJ) $(SIDOBJ) $(SLIRPOBJ) -o "86Box64.exe" $(LIBS)
strip "86Box64.exe"
peflags --bigaddr=false 86Box64.exe
all : 86Box64.exe

View File

@@ -3,6 +3,7 @@
*/
/*Buslogic SCSI emulation (including Adaptec 154x ISA software backward compatibility) and the Adaptec 154x itself*/
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -517,12 +518,13 @@ int scsi_base = 0x330;
int scsi_dma = 6;
int scsi_irq = 11;
int buslogic_do_log = 0;
int buslogic_do_log = 1;
static void BuslogicStartMailbox(Buslogic_t *Buslogic);
void BuslogicLog(const char *format, ...)
{
#ifdef ENABLE_BUSLOGIC_LOG
if (buslogic_do_log)
{
va_list ap;
@@ -531,6 +533,7 @@ void BuslogicLog(const char *format, ...)
va_end(ap);
fflush(stdout);
}
#endif
}
static void BuslogicClearInterrupt(Buslogic_t *Buslogic)
@@ -678,6 +681,8 @@ static void BuslogicReadSGEntries(int Is24bit, uint32_t SGList, uint32_t Entries
void BuslogicDataBufferAllocate(BuslogicRequests_t *BuslogicRequests, int Is24bit)
{
uint32_t DataPointer, DataLength;
if (Is24bit)
{
DataPointer = ADDR_TO_U32(BuslogicRequests->CmdBlock.old.DataPointer);
@@ -728,8 +733,8 @@ void BuslogicDataBufferAllocate(BuslogicRequests_t *BuslogicRequests, int Is24bi
BuslogicLog("Data to transfer (S/G) %d\n", DataToTransfer);
SCSIDevices[scsi_cdrom_id].InitLength = DataToTransfer;
SCSIDevices[scsi_cdrom_id].CmdBuffer[SCSIDevices[scsi_cdrom_id].pos++] = SCSIDevices[scsi_cdrom_id].InitLength;
SCSIDevices[BuslogicRequests->TargetID].InitLength = DataToTransfer;
SCSIDevices[BuslogicRequests->TargetID].CmdBuffer[SCSIDevices[BuslogicRequests->TargetID].pos++] = SCSIDevices[BuslogicRequests->TargetID].InitLength;
//If the control byte is 0x00, it means that the transfer direction is set up by the SCSI command without
//checking its length, so do this procedure for both no read/write commands.
@@ -754,7 +759,7 @@ void BuslogicDataBufferAllocate(BuslogicRequests_t *BuslogicRequests, int Is24bi
Address = ScatterGatherBuffer[ScatterEntry].SegmentPointer;
DataToTransfer = ScatterGatherBuffer[ScatterEntry].Segment;
DMAPageRead(Address, SCSIDevices[scsi_cdrom_id].CmdBuffer, DataToTransfer);
DMAPageRead(Address, SCSIDevices[BuslogicRequests->TargetID].CmdBuffer, DataToTransfer);
}
ScatterGatherAddrCurrent += ScatterGatherRead * (Is24bit ? sizeof(SGE) : sizeof(SGE32));
@@ -765,14 +770,26 @@ void BuslogicDataBufferAllocate(BuslogicRequests_t *BuslogicRequests, int Is24bi
BuslogicRequests->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND_RES)
{
uint32_t Address = DataPointer;
SCSIDevices[scsi_cdrom_id].InitLength = DataLength;
SCSIDevices[scsi_cdrom_id].CmdBuffer[SCSIDevices[scsi_cdrom_id].pos++] = SCSIDevices[scsi_cdrom_id].InitLength;
SCSIDevices[BuslogicRequests->TargetID].InitLength = DataLength;
SCSIDevices[BuslogicRequests->TargetID].CmdBuffer[SCSIDevices[BuslogicRequests->TargetID].pos++] = SCSIDevices[BuslogicRequests->TargetID].InitLength;
DMAPageRead(Address, SCSIDevices[scsi_cdrom_id].CmdBuffer, SCSIDevices[scsi_cdrom_id].InitLength);
DMAPageRead(Address, SCSIDevices[BuslogicRequests->TargetID].CmdBuffer, SCSIDevices[BuslogicRequests->TargetID].InitLength);
}
}
}
uint32_t BuslogicGetDataLength(BuslogicRequests_t *BuslogicRequests)
{
if (BuslogicRequests->Is24bit)
{
return ADDR_TO_U32(BuslogicRequests->CmdBlock.old.DataLength);
}
else
{
return BuslogicRequests->CmdBlock.new.DataLength;
}
}
void BuslogicDataBufferFree(BuslogicRequests_t *BuslogicRequests)
{
if (BuslogicRequests->Is24bit)
@@ -822,7 +839,7 @@ void BuslogicDataBufferFree(BuslogicRequests_t *BuslogicRequests)
Address = ScatterGatherBuffer[ScatterEntry].SegmentPointer;
DataToTransfer = ScatterGatherBuffer[ScatterEntry].Segment;
DMAPageWrite(Address, SCSIDevices[scsi_cdrom_id].CmdBuffer, DataToTransfer);
DMAPageWrite(Address, SCSIDevices[BuslogicRequests->TargetID].CmdBuffer, DataToTransfer);
}
ScatterGatherAddrCurrent += ScatterGatherRead * (BuslogicRequests->Is24bit ? sizeof(SGE) : sizeof(SGE32));
@@ -832,11 +849,11 @@ void BuslogicDataBufferFree(BuslogicRequests_t *BuslogicRequests)
BuslogicRequests->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND_RES)
{
uint32_t Address = DataPointer;
DMAPageWrite(Address, SCSIDevices[scsi_cdrom_id].CmdBuffer, SCSIDevices[scsi_cdrom_id].InitLength);
DMAPageWrite(Address, SCSIDevices[BuslogicRequests->TargetID].CmdBuffer, SCSIDevices[BuslogicRequests->TargetID].InitLength);
}
}
SCSIDevices[scsi_cdrom_id].InitLength = 0;
SCSIDevices[BuslogicRequests->TargetID].InitLength = 0;
}
uint8_t BuslogicRead(uint16_t Port, void *p)
@@ -885,8 +902,29 @@ uint8_t BuslogicRead(uint16_t Port, void *p)
return Temp;
}
int buslogic_scsi_drive_is_cdrom(uint8_t id)
{
if (scsi_cdrom_drives[id] >= CDROM_NUM)
{
return 0;
}
else
{
if (cdrom_drives[scsi_cdrom_drives[id]].enabled && cdrom_drives[scsi_cdrom_drives[id]].bus_type && (cdrom_drives[scsi_cdrom_drives[id]].bus_mode & 2))
{
return 1;
}
else
{
return 0;
}
}
}
void BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
{
int i = 0;
Buslogic_t *Buslogic = (Buslogic_t *)p;
BuslogicRequests_t *BuslogicRequests = &Buslogic->BuslogicRequests;
BuslogicLog("Buslogic: Write Port 0x%02X, Value %02X\n", Port, Val);
@@ -910,7 +948,13 @@ void BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
case 1:
if ((Val == 0x02) && (Buslogic->Command == 0xFF))
{
SCSICallback[scsi_cdrom_id] = 1;
for (i = 0; i < CDROM_NUM; i++)
{
if (buslogic_scsi_drive_is_cdrom(cdrom_drives[i].scsi_device_id))
{
SCSICallback[cdrom_drives[i].scsi_device_id] = 1;
}
}
break;
}
@@ -1047,10 +1091,10 @@ void BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
break;
case 0x0A:
if (scsi_cdrom_id < 8)
for (i = 0; i < 8; i++)
{
if (SCSIDevices[scsi_cdrom_id].LunType == SCSI_CDROM)
Buslogic->DataBuf[scsi_cdrom_id] = 1;
if (buslogic_scsi_drive_is_cdrom(i))
Buslogic->DataBuf[i] = 1;
Buslogic->DataBuf[7] = 0;
Buslogic->DataReplyLeft = 8;
@@ -1091,10 +1135,10 @@ void BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
case 0x23:
if (scsi_cdrom_id >= 8)
for (i = 0; i < 8; i++)
{
if (SCSIDevices[scsi_cdrom_id].LunType == SCSI_CDROM)
Buslogic->DataBuf[scsi_cdrom_id] = 1;
if (buslogic_scsi_drive_is_cdrom(i))
Buslogic->DataBuf[i] = 1;
Buslogic->DataReplyLeft = 8;
}
@@ -1337,7 +1381,7 @@ static uint8_t BuslogicConvertSenseLength(uint8_t RequestSenseLength)
{
if (RequestSenseLength == 0)
RequestSenseLength = 14;
else if (RequestSenseLength == 1)
else if ((RequestSenseLength >= 1) && (RequestSenseLength < 8))
RequestSenseLength = 0;
BuslogicLog("Request Sense length %i\n", RequestSenseLength);
@@ -1376,7 +1420,8 @@ static void BuslogicSenseBufferFree(BuslogicRequests_t *BuslogicRequests, int Co
BuslogicLog("Request Sense address: %02X\n", SenseBufferAddress);
DMAPageWrite(SenseBufferAddress, BuslogicRequests->RequestSenseBuffer, SenseLength);
// DMAPageWrite(SenseBufferAddress, BuslogicRequests->RequestSenseBuffer, SenseLength);
DMAPageWrite(SenseBufferAddress, cdrom[BuslogicRequests->TargetID].sense, SenseLength);
}
//Free the sense buffer when needed.
free(BuslogicRequests->RequestSenseBuffer);
@@ -1387,6 +1432,11 @@ static void BuslogicSCSIRequestSetup(Buslogic_t *Buslogic, uint32_t CCBPointer,
BuslogicRequests_t *BuslogicRequests = &Buslogic->BuslogicRequests;
uint8_t Id, Lun;
uint8_t cdrom_id;
uint8_t cdrom_phase;
uint32_t temp = 0;
//Fetch data from the Command Control Block.
DMAPageRead(CCBPointer, &BuslogicRequests->CmdBlock, sizeof(CCB32));
@@ -1399,8 +1449,10 @@ static void BuslogicSCSIRequestSetup(Buslogic_t *Buslogic, uint32_t CCBPointer,
BuslogicLog("Scanning SCSI Target ID %i\n", Id);
//Only SCSI CD-ROMs are supported at the moment, SCSI hard disk support will come soon.
if (Id == scsi_cdrom_id && Lun == 0)
if (buslogic_scsi_drive_is_cdrom(Id) && Lun == 0)
{
cdrom_id = scsi_cdrom_drives[Id];
BuslogicLog("SCSI Target ID %i detected and working\n", Id);
BuslogicRequests->CCBPointer = CCBPointer;
@@ -1425,60 +1477,17 @@ static void BuslogicSCSIRequestSetup(Buslogic_t *Buslogic, uint32_t CCBPointer,
//This not ready/unit attention stuff below is only for the Buslogic!
//The Adaptec one is in scsi_cdrom.c.
if (scsi_model)
if (!cdrom_drives[cdrom_id].check_on_execution)
{
if ((BuslogicRequests->CmdBlock.common.ControlByte != 0x03) && (BuslogicRequests->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND))
{
if (cdrom->medium_changed())
if (!cdrom_pre_execution_check(cdrom_id, BuslogicRequests->CmdBlock.common.Cdb))
{
pclog("Media changed\n");
SCSICDROM_Insert();
}
if (!cdrom->ready() && SCSISense.UnitAttention)
{
/* If the drive is not ready, there is no reason to keep the
UNIT ATTENTION condition present, as we only use it to mark
disc changes. */
SCSISense.UnitAttention = 0;
}
/* If the UNIT ATTENTION condition is set and the command does not allow
execution under it, error out and report the condition. */
if (SCSISense.UnitAttention == 1)
{
SCSISense.UnitAttention = 2;
if (!(SCSICommandTable[BuslogicRequests->CmdBlock.common.Cdb[0]] & ALLOW_UA))
{
SCSISenseCodeError(SENSE_UNIT_ATTENTION, ASC_MEDIUM_MAY_HAVE_CHANGED, 0);
SCSIStatus = SCSI_STATUS_CHECK_CONDITION;
SCSICallback[Id]=50*SCSI_TIME;
BuslogicMailboxIn(Buslogic, BuslogicRequests->CCBPointer, &BuslogicRequests->CmdBlock, CCB_COMPLETE, SCSI_STATUS_CHECK_CONDITION, MBI_ERROR);
return;
}
}
else if (SCSISense.UnitAttention == 2)
{
if (BuslogicRequests->CmdBlock.common.Cdb[0]!=GPCMD_REQUEST_SENSE)
{
SCSISense.UnitAttention = 0;
}
}
/* Unless the command is REQUEST SENSE, clear the sense. This will *NOT*
clear the UNIT ATTENTION condition if it's set. */
if (BuslogicRequests->CmdBlock.common.Cdb[0]!=GPCMD_REQUEST_SENSE)
{
SCSIClearSense(BuslogicRequests->CmdBlock.common.Cdb[0], 0);
}
/* Next it's time for NOT READY. */
if ((SCSICommandTable[BuslogicRequests->CmdBlock.common.Cdb[0]] & CHECK_READY) && !cdrom->ready())
{
pclog("Not ready\n");
SCSISenseCodeError(SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT, 0);
SCSIStatus = SCSI_STATUS_CHECK_CONDITION;
SCSICallback[Id]=50*SCSI_TIME;
SCSIDevices[BuslogicRequests->TargetID].InitLength = 0;
if (BuslogicRequests->RequestSenseBuffer)
BuslogicSenseBufferFree(BuslogicRequests, 1);
BuslogicMailboxIn(Buslogic, BuslogicRequests->CCBPointer, &BuslogicRequests->CmdBlock, CCB_COMPLETE, SCSI_STATUS_CHECK_CONDITION, MBI_ERROR);
return;
}
@@ -1488,61 +1497,73 @@ static void BuslogicSCSIRequestSetup(Buslogic_t *Buslogic, uint32_t CCBPointer,
//First, get the data buffer otherwise putting it after the
//exec function results into not getting read/write commands right and
//failing to detect the device.
if (BuslogicRequests->CmdBlock.common.ControlByte == CCB_DATA_XFER_IN)
{
SCSIRead(Id, SCSIDevices[Id].CmdBuffer, SCSIDevices[Id].CmdBuffer, SCSIDevices[Id].InitLength);
}
else if (BuslogicRequests->CmdBlock.common.ControlByte == CCB_DATA_XFER_OUT)
{
SCSIWrite(Id, SCSIDevices[Id].CmdBuffer, SCSIDevices[Id].CmdBuffer, SCSIDevices[Id].InitLength);
}
/* Note by Tohka: After looking at the code, both functions do a copy of one part of the buffer to another,
with no purpose, whatsoever, and then end up with SCSIDevices.pos being equal to the InitLength.
SCSIReadData does not use pos at all, and the write code does, but in a useless way, therefore that
variable is going away.
All I am going to do at this point is zero the buffer.
Also, instead of directly calling SCSIReadData from here, this will be modified to call the CD-ROM
callback for the correct CD-ROM drive, and make that call SCSIReadData.
Since the new code will have the target ID and LUN inside the cdrom struct, as well as a copy of the Cdb
and the InitLength (in cdrom[id].request_length), it can be called from there and do everything needed. */
memset(SCSIDevices[Id].CmdBuffer, 0, 390144);
//Finally, execute the SCSI command immediately and get the transfer length.
SCSIPhase = SCSI_PHASE_COMMAND;
SCSIExecCommand(Id, SCSIDevices[Id].CmdBuffer, BuslogicRequests->CmdBlock.common.Cdb);
SCSIGetLength(Id, &SCSIDevices[Id].InitLength);
if (SCSIPhase == SCSI_PHASE_DATAIN)
cdrom_command(cdrom_id, BuslogicRequests->CmdBlock.common.Cdb);
// SCSIDevices[Id].InitLength = cdrom[cdrom_id].0;
// SCSIGetLength(Id, &SCSIDevices[Id].InitLength);
SCSIStatus = cdrom_CDROM_PHASE_to_scsi(cdrom_id);
if (SCSIStatus == SCSI_STATUS_OK)
{
SCSIReadData(Id, BuslogicRequests->CmdBlock.common.Cdb, SCSIDevices[Id].CmdBuffer, SCSIDevices[Id].InitLength);
}
else if (SCSIPhase == SCSI_PHASE_DATAOUT)
{
if (BuslogicRequests->CmdBlock.common.Cdb[0] == GPCMD_MODE_SELECT_6 ||
BuslogicRequests->CmdBlock.common.Cdb[0] == GPCMD_MODE_SELECT_10)
cdrom_phase = cdrom_atapi_phase_to_scsi(cdrom_id);
if (cdrom_phase == 2)
{
//Mode Sense/Select stuff
if ((SCSIDevices[Id].pos >= prefix_len+4) && (page_flags[page_current] & PAGE_CHANGEABLE))
{
mode_pages_in[page_current][SCSIDevices[Id].pos - prefix_len - 4] = SCSIDevices[Id].CmdBuffer[SCSIDevices[Id].pos - 2];
mode_pages_in[page_current][SCSIDevices[Id].pos - prefix_len - 3] = SCSIDevices[Id].CmdBuffer[SCSIDevices[Id].pos - 1];
}
/* Command completed - call the phase callback to complete the command. */
cdrom_phase_callback(cdrom_id);
}
else
{
/* Command first phase complete - call the callback to execute the second phase. */
cdrom_phase_callback(cdrom_id);
SCSIStatus = cdrom_CDROM_PHASE_to_scsi(cdrom_id);
/* Command second phase complete - call the callback to complete the command. */
cdrom_phase_callback(cdrom_id);
}
}
else
{
/* Error (Check Condition) - call the phase callback to complete the command. */
cdrom_phase_callback(cdrom_id);
}
SCSICallback[Id] = cdrom[cdrom_id].callback;
BuslogicDataBufferFree(BuslogicRequests);
if (BuslogicRequests->RequestSenseBuffer)
BuslogicSenseBufferFree(BuslogicRequests, (SCSIStatus != SCSI_STATUS_OK));
BuslogicSenseBufferFree(BuslogicRequests, (SCSIStatus != SCSI_STATUS_OK));
}
pclog("Request complete\n");
pclog("SCSI Status %02X, Sense %02X, Asc %02X, Ascq %02X\n", SCSIStatus, SCSISense.SenseKey, SCSISense.Asc, SCSISense.Ascq);
pclog("SCSI Status %02X, Sense %02X, Asc %02X, Ascq %02X\n", SCSIStatus, cdrom[cdrom_id].sense[2], cdrom[cdrom_id].sense[12], cdrom[cdrom_id].sense[13]);
if (BuslogicRequests->CmdBlock.common.Opcode == SCSI_INITIATOR_COMMAND_RES ||
BuslogicRequests->CmdBlock.common.Opcode == SCATTER_GATHER_COMMAND_RES)
{
temp = BuslogicGetDataLength(BuslogicRequests);
temp -= SCSIDevices[Id].InitLength;
if (BuslogicRequests->Is24bit)
{
U32_TO_ADDR(BuslogicRequests->CmdBlock.old.DataLength, SCSIDevices[Id].InitLength);
U32_TO_ADDR(BuslogicRequests->CmdBlock.old.DataLength, temp);
BuslogicLog("24-bit Residual data length for reading: %d\n", ADDR_TO_U32(BuslogicRequests->CmdBlock.old.DataLength));
}
else
{
BuslogicRequests->CmdBlock.new.DataLength = SCSIDevices[Id].InitLength;
BuslogicRequests->CmdBlock.new.DataLength = temp;
BuslogicLog("32-bit Residual data length for reading: %d\n", BuslogicRequests->CmdBlock.new.DataLength);
}
}
@@ -1634,17 +1655,37 @@ static void BuslogicStartMailbox(Buslogic_t *Buslogic)
}
}
void BuslogicCommandCallback(void *p)
void BuslogicCommandCallback(int Id, void *p)
{
Buslogic_t *Buslogic = (Buslogic_t *)p;
SCSICallback[scsi_cdrom_id] = 0;
SCSICallback[Id] = 0;
if (Buslogic->MailboxCount)
{
BuslogicStartMailbox(Buslogic);
}
}
void BuslogicCommandCallback0(void *p)
{
BuslogicCommandCallback(cdrom_drives[0].scsi_device_id, p);
}
void BuslogicCommandCallback1(void *p)
{
BuslogicCommandCallback(cdrom_drives[1].scsi_device_id, p);
}
void BuslogicCommandCallback2(void *p)
{
BuslogicCommandCallback(cdrom_drives[2].scsi_device_id, p);
}
void BuslogicCommandCallback3(void *p)
{
BuslogicCommandCallback(cdrom_drives[3].scsi_device_id, p);
}
void *BuslogicInit()
{
Buslogic_t *Buslogic = malloc(sizeof(Buslogic_t));
@@ -1654,7 +1695,29 @@ void *BuslogicInit()
Buslogic->DmaChannel = scsi_dma;
io_sethandler(scsi_base, 0x0004, BuslogicRead, NULL, NULL, BuslogicWrite, NULL, NULL, Buslogic);
timer_add(BuslogicCommandCallback, &SCSICallback[scsi_cdrom_id], &SCSICallback[scsi_cdrom_id], Buslogic);
build_scsi_cdrom_map();
if (buslogic_scsi_drive_is_cdrom(cdrom_drives[0].scsi_device_id))
{
SCSIDevices[cdrom_drives[0].scsi_device_id].LunType == SCSI_CDROM;
timer_add(BuslogicCommandCallback0, &SCSICallback[cdrom_drives[0].scsi_device_id], &SCSICallback[cdrom_drives[0].scsi_device_id], Buslogic);
}
if (buslogic_scsi_drive_is_cdrom(cdrom_drives[1].scsi_device_id))
{
SCSIDevices[cdrom_drives[1].scsi_device_id].LunType == SCSI_CDROM;
timer_add(BuslogicCommandCallback1, &SCSICallback[cdrom_drives[1].scsi_device_id], &SCSICallback[cdrom_drives[1].scsi_device_id], Buslogic);
}
if (buslogic_scsi_drive_is_cdrom(cdrom_drives[2].scsi_device_id))
{
SCSIDevices[cdrom_drives[2].scsi_device_id].LunType == SCSI_CDROM;
timer_add(BuslogicCommandCallback2, &SCSICallback[cdrom_drives[2].scsi_device_id], &SCSICallback[cdrom_drives[2].scsi_device_id], Buslogic);
}
if (buslogic_scsi_drive_is_cdrom(cdrom_drives[3].scsi_device_id))
{
SCSIDevices[cdrom_drives[3].scsi_device_id].LunType == SCSI_CDROM;
timer_add(BuslogicCommandCallback3, &SCSICallback[cdrom_drives[3].scsi_device_id], &SCSICallback[cdrom_drives[3].scsi_device_id], Buslogic);
}
BuslogicLog("Buslogic on port 0x%04X\n", scsi_base);

File diff suppressed because it is too large Load Diff

View File

@@ -9,9 +9,9 @@
extern uint32_t cdrom_capacity;
extern int ioctl_open(char d);
extern void ioctl_reset();
extern int ioctl_open(uint8_t id, char d);
extern void ioctl_reset(uint8_t id);
extern void ioctl_close(void);
extern void ioctl_close(uint8_t id);
#endif /* ! CDROM_IOCTL_H */

View File

@@ -10,104 +10,71 @@
static CDROM iso_cdrom;
uint32_t last_block = 0;
static uint64_t image_size = 0;
static int iso_inited = 0;
char iso_path[1024];
void iso_close(void);
static FILE* iso_image;
static int iso_changed = 0;
int cdrom_iso_do_log = 1;
static uint32_t lba = 0;
void cdrom_iso_log(const char *format, ...)
{
#ifdef ENABLE_CDROM_ISO_LOG
if (cdrom_do_log)
{
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
fflush(stdout);
}
#endif
}
static uint32_t iso_cd_pos = 0, iso_cd_end = 0;
void iso_close(uint8_t id);
void iso_audio_callback(int16_t *output, int len)
void iso_audio_callback(uint8_t id, int16_t *output, int len)
{
memset(output, 0, len * 2);
return;
}
void iso_audio_stop()
void iso_audio_stop(uint8_t id)
{
// pclog("iso_audio_stop stub\n");
// cdrom_iso_log("iso_audio_stop stub\n");
}
static int get_track_nr(uint32_t pos)
static int iso_ready(uint8_t id)
{
// pclog("get_track_nr stub\n");
return 0;
}
static void iso_playaudio(uint32_t pos, uint32_t len, int ismsf)
{
// pclog("iso_playaudio stub\n");
return;
}
static void iso_pause(void)
{
// pclog("iso_pause stub\n");
return;
}
static void iso_resume(void)
{
// pclog("iso_resume stub\n");
return;
}
static void iso_stop(void)
{
// pclog("iso_stop stub\n");
return;
}
static void iso_seek(uint32_t pos)
{
// pclog("iso_seek stub\n");
lba = pos;
return;
}
static int iso_ready(void)
{
if (strlen(iso_path) == 0)
if (strlen(cdrom_iso[id].iso_path) == 0)
{
return 0;
}
if (old_cdrom_drive != cdrom_drive)
if (cdrom_drives[id].prev_host_drive != cdrom_drives[id].host_drive)
{
// old_cdrom_drive = cdrom_drive;
return 1;
}
if (iso_changed)
if (cdrom_iso[id].iso_changed)
{
iso_changed = 0;
cdrom_iso[id].iso_changed = 0;
return 1;
}
return 1;
}
/* Always return 0, because there is no way to change the ISO without unmounting and remounting it. */
static int iso_medium_changed(void)
static int iso_medium_changed(uint8_t id)
{
if (strlen(iso_path) == 0)
if (strlen(cdrom_iso[id].iso_path) == 0)
{
return 0;
}
if (old_cdrom_drive != cdrom_drive)
if (cdrom_drives[id].prev_host_drive != cdrom_drives[id].host_drive)
{
old_cdrom_drive = cdrom_drive;
cdrom_drives[id].prev_host_drive = cdrom_drives[id].host_drive;
return 1;
}
if (iso_changed)
if (cdrom_iso[id].iso_changed)
{
iso_changed = 0;
cdrom_iso[id].iso_changed = 0;
return 1;
}
@@ -122,11 +89,11 @@ static void lba_to_msf(uint8_t *buf, int lba)
buf[2] = lba % 75;
}
static uint8_t iso_getcurrentsubchannel(uint8_t *b, int msf)
static uint8_t iso_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
{
long size;
int pos=0;
if (strlen(iso_path) == 0)
if (strlen(cdrom_iso[id].iso_path) == 0)
{
return 0;
}
@@ -135,7 +102,7 @@ static uint8_t iso_getcurrentsubchannel(uint8_t *b, int msf)
b[pos++]=0;
b[pos++]=0;
int32_t temp = lba;
int32_t temp = cdrom[id].seek_pos;
if (msf)
{
memset(&(b[pos]), 0, 8);
@@ -156,48 +123,35 @@ static uint8_t iso_getcurrentsubchannel(uint8_t *b, int msf)
b[pos++] = temp;
}
return 0x13;
return 0x15;
}
static void iso_eject(void)
static void iso_eject(uint8_t id)
{
// pclog("iso_eject stub\n");
// cdrom_iso_log("iso_eject stub\n");
}
static void iso_load(void)
static void iso_load(uint8_t id)
{
// pclog("iso_load stub\n");
// cdrom_iso_log("iso_load stub\n");
}
static int iso_sector_data_type(int sector, int ismsf)
static int iso_sector_data_type(uint8_t id, int sector, int ismsf)
{
return 2; /* Always Mode 1 */
}
static void iso_readsector_raw(uint8_t *b, int sector, int ismsf)
static void iso_readsector(uint8_t id, uint8_t *b, int sector)
{
uint32_t temp;
uint64_t file_pos = sector;
if (!cdrom_drive) return;
if (!cdrom_drives[id].host_drive) return;
file_pos <<= 11;
memset(b, 0, 2856);
if (ismsf)
{
int m = (sector >> 16) & 0xff;
int s = (sector >> 8) & 0xff;
int f = sector & 0xff;
sector = (m * 60 * 75) + (s * 75) + f;
if (sector < 150)
{
memset(b, 0, 2856);
return;
}
sector -= 150;
}
iso_image = fopen(iso_path, "rb");
fseeko64(iso_image, file_pos, SEEK_SET);
fread(b + 16, 2048, 1, iso_image);
fclose(iso_image);
cdrom_iso[id].iso_image = fopen(cdrom_iso[id].iso_path, "rb");
fseeko64(cdrom_iso[id].iso_image, file_pos, SEEK_SET);
fread(b + 16, 2048, 1, cdrom_iso[id].iso_image);
fclose(cdrom_iso[id].iso_image);
/* sync bytes */
b[0] = 0;
@@ -213,7 +167,185 @@ static void iso_readsector_raw(uint8_t *b, int sector, int ismsf)
memset(b, 0, 392);
}
static int iso_readtoc(unsigned char *buf, unsigned char start_track, int msf, int maxlen, int single)
typedef struct __attribute__((packed))
{
uint8_t user_data[2048];
uint8_t ecc[288];
} m1_data_t;
typedef struct __attribute__((packed))
{
uint8_t sub_header[8];
uint8_t user_data[2328];
} m2_data_t;
typedef union __attribute__((packed))
{
m1_data_t m1_data;
m2_data_t m2_data;
uint8_t raw_data[2352];
} sector_data_t;
typedef struct __attribute__((packed))
{
uint8_t sync[12];
uint8_t header[4];
sector_data_t data;
uint8_t c2[296];
uint8_t subchannel_raw[96];
uint8_t subchannel_q[16];
uint8_t subchannel_rw[96];
} cdrom_sector_t;
typedef union __attribute__((packed))
{
cdrom_sector_t cdrom_sector;
uint8_t buffer[2856];
} sector_buffer_t;
sector_buffer_t cdrom_sector_buffer;
int cdrom_sector_size;
static int iso_readsector_raw(uint8_t id, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, int cdrom_sector_flags, int *len)
{
int real_sector_type;
uint8_t *b;
uint8_t *temp_b;
int is_audio;
int real_pos;
b = temp_b = buffer;
*len = 0;
if (ismsf)
{
real_pos = cdrom_lba_to_msf_accurate(sector);
}
else
{
real_pos = sector;
}
memset(cdrom_sector_buffer.buffer, 0, 2856);
if ((cdrom_sector_type == 1) || (cdrom_sector_type > 2))
{
if (cdrom_sector_type == 1)
{
cdrom_iso_log("CD-ROM %i: Attempting to read an audio sector from an ISO\n", id);
}
if (cdrom_sector_type >= 2)
{
cdrom_iso_log("CD-ROM %i: Attempting to read a non-mode 1 data sector from an ISO\n", id);
}
return 0;
}
if (!(cdrom_sector_flags & 0xf0)) /* 0x00 and 0x08 are illegal modes */
{
cdrom_iso_log("CD-ROM %i: 0x00 and 0x08 are illegal modes\n", id);
return 0;
}
if ((cdrom_sector_flags & 0x06) == 0x06)
{
cdrom_iso_log("CD-ROM %i: Invalid error flags\n", id);
return 0;
}
if (((cdrom_sector_flags & 0x700) == 0x300) || ((cdrom_sector_flags & 0x700) > 0x400))
{
cdrom_iso_log("CD-ROM %i: Invalid subchannel data flags (%02X)\n", id, cdrom_sector_flags & 0x700);
return 0;
}
if ((cdrom_sector_flags & 0x18) == 0x08) /* EDC/ECC without user data is an illegal mode */
{
cdrom_iso_log("CD-ROM %i: EDC/ECC without user data is an illegal mode\n", id);
return 0;
}
iso_readsector(id, cdrom_sector_buffer.buffer, real_pos);
cdrom_sector_size = 0;
if (cdrom_sector_flags & 0x80) /* Sync */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.sync, 12);
cdrom_sector_size += 12;
temp_b += 12;
}
if (cdrom_sector_flags & 0x20) /* Header */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.header, 4);
cdrom_sector_size += 4;
temp_b += 4;
}
/* Mode 1 sector, expected type is 1 type. */
if (cdrom_sector_flags & 0x40) /* Sub-header */
{
if (!(cdrom_sector_flags & 0x10)) /* No user data */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m1_data.user_data, 8);
cdrom_sector_size += 8;
temp_b += 8;
}
}
if (cdrom_sector_flags & 0x10) /* User data */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m1_data.user_data, 2048);
cdrom_sector_size += 2048;
temp_b += 2048;
}
if (cdrom_sector_flags & 0x08) /* EDC/ECC */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m1_data.ecc, 288);
cdrom_sector_size += 288;
temp_b += 288;
}
cdrom_iso_log("CD-ROM sector size: %i (%i, %i) [%04X]\n", cdrom_sector_size, cdrom_sector_type, real_sector_type, cdrom_sector_flags);
if ((cdrom_sector_flags & 0x06) == 0x02)
{
/* Add error flags. */
memcpy(b + cdrom_sector_size, cdrom_sector_buffer.cdrom_sector.c2, 294);
cdrom_sector_size += 294;
}
else if ((cdrom_sector_flags & 0x06) == 0x04)
{
/* Add error flags. */
memcpy(b + cdrom_sector_size, cdrom_sector_buffer.cdrom_sector.c2, 296);
cdrom_sector_size += 296;
}
if ((cdrom_sector_flags & 0x700) == 0x100)
{
memcpy(b + cdrom_sector_size, cdrom_sector_buffer.cdrom_sector.subchannel_raw, 96);
cdrom_sector_size += 96;
}
else if ((cdrom_sector_flags & 0x700) == 0x200)
{
memcpy(b + cdrom_sector_size, cdrom_sector_buffer.cdrom_sector.subchannel_q, 16);
cdrom_sector_size += 16;
}
else if ((cdrom_sector_flags & 0x700) == 0x400)
{
memcpy(b + cdrom_sector_size, cdrom_sector_buffer.cdrom_sector.subchannel_rw, 96);
cdrom_sector_size += 96;
}
memcpy(buffer, b, cdrom_sector_size);
*len = cdrom_sector_size;
return 1;
}
static int iso_readtoc(uint8_t id, unsigned char *buf, unsigned char start_track, int msf, int maxlen, int single)
{
uint8_t *q;
int len;
@@ -245,16 +377,16 @@ static int iso_readtoc(unsigned char *buf, unsigned char start_track, int msf, i
*q++ = 0x16; /* ADR, control */
*q++ = 0xaa; /* track number */
*q++ = 0; /* reserved */
last_block = image_size >> 11;
cdrom_iso[id].last_block = cdrom_iso[id].image_size >> 11;
if (msf) {
*q++ = 0; /* reserved */
lba_to_msf(q, last_block);
lba_to_msf(q, cdrom_iso[id].last_block);
q += 3;
} else {
*q++ = last_block >> 24;
*q++ = last_block >> 16;
*q++ = last_block >> 8;
*q++ = last_block;
*q++ = cdrom_iso[id].last_block >> 24;
*q++ = cdrom_iso[id].last_block >> 16;
*q++ = cdrom_iso[id].last_block >> 8;
*q++ = cdrom_iso[id].last_block;
}
len = q - buf;
if (len > maxlen)
@@ -266,7 +398,7 @@ static int iso_readtoc(unsigned char *buf, unsigned char start_track, int msf, i
return len;
}
static int iso_readtoc_session(unsigned char *buf, int msf, int maxlen)
static int iso_readtoc_session(uint8_t id, unsigned char *buf, int msf, int maxlen)
{
uint8_t *q;
@@ -290,7 +422,7 @@ static int iso_readtoc_session(unsigned char *buf, int msf, int maxlen)
return 12;
}
static int iso_readtoc_raw(unsigned char *buf, int msf, int maxlen)
static int iso_readtoc_raw(uint8_t id, unsigned char *buf, int msf, int maxlen)
{
uint8_t *q;
int len;
@@ -330,20 +462,20 @@ static int iso_readtoc_raw(unsigned char *buf, int msf, int maxlen)
*q++ = 0; /* min */
*q++ = 0; /* sec */
*q++ = 0; /* frame */
last_block = image_size >> 11;
cdrom_iso[id].last_block = cdrom_iso[id].image_size >> 11;
/* this is raw, must be msf */
if (msf)
{
*q++ = 0; /* reserved */
lba_to_msf(q, last_block);
lba_to_msf(q, cdrom_iso[id].last_block);
q += 3;
}
else
{
*q++ = (last_block >> 24) & 0xff;
*q++ = (last_block >> 16) & 0xff;
*q++ = (last_block >> 8) & 0xff;
*q++ = last_block & 0xff;
*q++ = (cdrom_iso[id].last_block >> 24) & 0xff;
*q++ = (cdrom_iso[id].last_block >> 16) & 0xff;
*q++ = (cdrom_iso[id].last_block >> 8) & 0xff;
*q++ = cdrom_iso[id].last_block & 0xff;
}
*q++ = 1; /* session number */
@@ -378,72 +510,71 @@ static int iso_readtoc_raw(unsigned char *buf, int msf, int maxlen)
return len;
}
static uint32_t iso_size()
static uint32_t iso_size(uint8_t id)
{
uint64_t iso_size;
iso_image = fopen(iso_path, "rb");
fseeko64(iso_image, 0, SEEK_END);
iso_size = ftello64(iso_image);
cdrom_iso[id].iso_image = fopen(cdrom_iso[id].iso_path, "rb");
fseeko64(cdrom_iso[id].iso_image, 0, SEEK_END);
iso_size = ftello64(cdrom_iso[id].iso_image);
iso_size >>= 11;
fclose(iso_image);
fclose(cdrom_iso[id].iso_image);
return (uint32_t) (iso_size);
}
static int iso_status()
static int iso_status(uint8_t id)
{
if (!(iso_ready()) && (cdrom_drive != 200)) return CD_STATUS_EMPTY;
if (!(iso_ready(id)) && (cdrom_drives[id].host_drive != 200)) return CD_STATUS_EMPTY;
return CD_STATUS_DATA_ONLY;
}
void iso_reset()
void iso_reset(uint8_t id)
{
}
int iso_open(char *fn)
int iso_open(uint8_t id, char *fn)
{
struct stat st;
if (strcmp(fn, iso_path) != 0)
if (strcmp(fn, cdrom_iso[id].iso_path) != 0)
{
iso_changed = 1;
cdrom_iso[id].iso_changed = 1;
}
/* Make sure iso_changed stays when changing from ISO to another ISO. */
if (!iso_inited && (cdrom_drive != 200)) iso_changed = 0;
if (!iso_inited || iso_changed)
if (!cdrom_iso[id].iso_inited && (cdrom_drives[id].host_drive != 200)) cdrom_iso[id].iso_changed = 0;
if (!cdrom_iso[id].iso_inited || cdrom_iso[id].iso_changed)
{
sprintf(iso_path, "%s", fn);
// pclog("Path is %s\n", iso_path);
sprintf(cdrom_iso[id].iso_path, "%s", fn);
// cdrom_iso_log("Path is %s\n", cdrom_iso[id].iso_path);
}
iso_image = fopen(iso_path, "rb");
cdrom = &iso_cdrom;
if (!iso_inited || iso_changed)
cdrom_iso[id].iso_image = fopen(cdrom_iso[id].iso_path, "rb");
cdrom_drives[id].handler = &iso_cdrom;
if (!cdrom_iso[id].iso_inited || cdrom_iso[id].iso_changed)
{
if (!iso_inited) iso_inited = 1;
fclose(iso_image);
if (!cdrom_iso[id].iso_inited) cdrom_iso[id].iso_inited = 1;
fclose(cdrom_iso[id].iso_image);
}
stat(iso_path, &st);
image_size = st.st_size;
stat(cdrom_iso[id].iso_path, &st);
cdrom_iso[id].image_size = st.st_size;
return 0;
}
void iso_close(void)
void iso_close(uint8_t id)
{
if (iso_image) fclose(iso_image);
memset(iso_path, 0, 1024);
if (cdrom_iso[id].iso_image) fclose(cdrom_iso[id].iso_image);
memset(cdrom_iso[id].iso_path, 0, 1024);
}
static void iso_exit(void)
static void iso_exit(uint8_t id)
{
// iso_stop();
iso_inited = 0;
cdrom_iso[id].iso_inited = 0;
}
static int iso_is_track_audio(uint32_t pos, int ismsf)
static int iso_is_track_audio(uint8_t id, uint32_t pos, int ismsf)
{
return 0;
}
@@ -452,26 +583,23 @@ static CDROM iso_cdrom =
{
iso_ready,
iso_medium_changed,
NULL,
NULL,
iso_readtoc,
iso_readtoc_session,
iso_readtoc_raw,
iso_getcurrentsubchannel,
NULL,
NULL,
NULL,
NULL,
NULL,
iso_sector_data_type,
iso_readsector_raw,
iso_playaudio,
iso_seek,
NULL,
iso_load,
iso_eject,
iso_pause,
iso_resume,
NULL,
NULL,
iso_size,
iso_status,
iso_is_track_audio,
iso_stop,
NULL,
iso_exit
};

View File

@@ -7,13 +7,9 @@
/* this header file lists the functions provided by
various platform specific cdrom-ioctl files */
extern uint32_t last_block;
extern char iso_path[1024];
extern int iso_open(uint8_t id, char *fn);
extern void iso_reset(uint8_t id);
extern int iso_open(char *fn);
extern void iso_reset();
extern void iso_close(void);
extern void iso_close(uint8_t id);
#endif /* ! CDROM_ISO_H */

View File

@@ -5,121 +5,97 @@
#include "cdrom.h"
#include "cdrom-ioctl.h"
int cdrom_drive;
static CDROM null_cdrom;
void cdrom_null_audio_callback(int16_t *output, int len)
{
memset(output, 0, len * 2);
}
void cdrom_null_audio_stop()
{
}
static void null_playaudio(uint32_t pos, uint32_t len, int ismsf)
{
}
static void null_pause(void)
{
}
static void null_resume(void)
{
}
static void null_stop(void)
{
}
static void null_seek(uint32_t pos)
{
}
static int null_ready(void)
static int null_ready(uint8_t id)
{
return 0;
}
/* Always return 0, the contents of a null CD-ROM drive never change. */
static int null_medium_changed(void)
static int null_medium_changed(uint8_t id)
{
return 0;
}
static uint8_t null_getcurrentsubchannel(uint8_t *b, int msf)
static uint8_t null_getcurrentsubchannel(uint8_t id, uint8_t *b, int msf)
{
return 0x13;
}
static void null_eject(void)
static void null_eject(uint8_t id)
{
}
static void null_load(void)
static void null_load(uint8_t id)
{
}
static int null_sector_data_type(int sector, int ismsf)
static int null_sector_data_type(uint8_t id, int sector, int ismsf)
{
return 0;
}
static void null_readsector_raw(uint8_t *b, int sector, int ismsf)
static int null_readsector_raw(uint8_t id, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, int cdrom_sector_flags, int *len)
{
*len = 0;
return 0;
}
static int null_read_track_information(uint8_t *in_cdb, uint8_t *b)
static int null_read_track_information(uint8_t id, uint8_t *in_cdb, uint8_t *b)
{
return 0;
}
static int null_readtoc(unsigned char *b, unsigned char starttrack, int msf, int maxlen, int single)
static int null_readtoc(uint8_t id, unsigned char *b, unsigned char starttrack, int msf, int maxlen, int single)
{
return 0;
}
static int null_readtoc_session(unsigned char *b, int msf, int maxlen)
static int null_readtoc_session(uint8_t id, unsigned char *b, int msf, int maxlen)
{
return 0;
}
static int null_readtoc_raw(unsigned char *b, int msf, int maxlen)
static int null_readtoc_raw(uint8_t id, unsigned char *b, int msf, int maxlen)
{
return 0;
}
static uint32_t null_size()
static uint32_t null_size(uint8_t id)
{
return 0;
}
static int null_status()
static int null_status(uint8_t id)
{
return CD_STATUS_EMPTY;
}
void cdrom_null_reset()
void cdrom_null_reset(uint8_t id)
{
}
int cdrom_null_open(char d)
int cdrom_null_open(uint8_t id, char d)
{
cdrom = &null_cdrom;
cdrom_drives[id].handler = &null_cdrom;
return 0;
}
void null_close(void)
void null_close(uint8_t id)
{
}
static void null_exit(void)
static void null_exit(uint8_t id)
{
}
static int null_is_track_audio(uint32_t pos, int ismsf)
static int null_is_track_audio(uint8_t id, uint32_t pos, int ismsf)
{
return 0;
}
static int null_pass_through(uint8_t id, uint8_t *in_cdb, uint8_t *b, uint32_t *len)
{
return 0;
}
@@ -128,26 +104,23 @@ static CDROM null_cdrom =
{
null_ready,
null_medium_changed,
NULL,
NULL,
null_readtoc,
null_readtoc_session,
null_readtoc_raw,
null_getcurrentsubchannel,
NULL,
NULL,
NULL,
NULL,
NULL,
null_pass_through,
null_sector_data_type,
null_readsector_raw,
null_playaudio,
null_seek,
NULL,
null_load,
null_eject,
null_pause,
null_resume,
NULL,
NULL,
null_size,
null_status,
null_is_track_audio,
null_stop,
NULL,
null_exit
};

View File

@@ -7,8 +7,8 @@
/* this header file lists the functions provided by
various platform specific cdrom-ioctl files */
extern int cdrom_null_open(char d);
extern void cdrom_null_reset();
extern void null_close();
extern int cdrom_null_open(uint8_t id, char d);
extern void cdrom_null_reset(uint8_t id);
extern void null_close(uint8_t id);
#endif /* ! CDROM_IOCTL_H */

2867
src/cdrom.c Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2,34 +2,203 @@
#define __CDROM_H__
/*CD-ROM stuff*/
#define CDROM_NUM 4
#define CDROM_PHASE_IDLE 0
#define CDROM_PHASE_COMMAND 1
#define CDROM_PHASE_COMPLETE 2
#define CDROM_PHASE_DATA_IN 3
#define CDROM_PHASE_DATA_IN_DMA 4
#define CDROM_PHASE_DATA_OUT 5
#define CDROM_PHASE_DATA_OUT_DMA 6
#define CDROM_PHASE_ERROR 0x80
#define BUF_SIZE 32768
#define CDROM_ISO 200
#define IDE_TIME (5 * 100 * (1 << TIMER_SHIFT))
#define CDROM_TIME (5 * 100 * (1 << TIMER_SHIFT))
typedef struct CDROM
{
int (*ready)(void);
int (*medium_changed)(void);
int (*readtoc)(uint8_t *b, uint8_t starttrack, int msf, int maxlen, int single);
int (*readtoc_session)(uint8_t *b, int msf, int maxlen);
int (*readtoc_raw)(uint8_t *b, int msf, int maxlen);
uint8_t (*getcurrentsubchannel)(uint8_t *b, int msf);
void (*read_capacity)(uint8_t *b);
void (*read_subchannel)(uint8_t *in_cdb, uint8_t *b);
void (*read_header)(uint8_t *in_cdb, uint8_t *b);
void (*read_disc_information)(uint8_t *b);
int (*read_track_information)(uint8_t *in_cdb, uint8_t *b);
int (*sector_data_type)(int sector, int ismsf);
void (*readsector_raw)(uint8_t *b, int sector, int ismsf);
void (*playaudio)(uint32_t pos, uint32_t len, int ismsf);
void (*seek)(uint32_t pos);
void (*load)(void);
void (*eject)(void);
void (*pause)(void);
void (*resume)(void);
uint32_t (*size)(void);
int (*status)(void);
int (*is_track_audio)(uint32_t pos, int ismsf);
void (*stop)(void);
void (*exit)(void);
int (*ready)(uint8_t id);
int (*medium_changed)(uint8_t id);
void (*audio_callback)(uint8_t id, int16_t *output, int len);
void (*audio_stop)(uint8_t id);
int (*readtoc)(uint8_t id, uint8_t *b, uint8_t starttrack, int msf, int maxlen, int single);
int (*readtoc_session)(uint8_t id, uint8_t *b, int msf, int maxlen);
int (*readtoc_raw)(uint8_t id, uint8_t *b, int msf, int maxlen);
uint8_t (*getcurrentsubchannel)(uint8_t id, uint8_t *b, int msf);
int (*pass_through)(uint8_t id, uint8_t *in_cdb, uint8_t *b, uint32_t *len);
int (*sector_data_type)(uint8_t id, int sector, int ismsf);
int (*readsector_raw)(uint8_t id, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, int cdrom_sector_flags, int *len);
void (*playaudio)(uint8_t id, uint32_t pos, uint32_t len, int ismsf);
void (*load)(uint8_t id);
void (*eject)(uint8_t id);
void (*pause)(uint8_t id);
void (*resume)(uint8_t id);
uint32_t (*size)(uint8_t id);
int (*status)(uint8_t id);
int (*is_track_audio)(uint8_t id, uint32_t pos, int ismsf);
void (*stop)(uint8_t id);
void (*exit)(uint8_t id);
} CDROM;
extern CDROM *cdrom;
typedef struct __attribute__((__packed__))
{
uint8_t previous_command;
int toctimes;
int is_dma;
int requested_blocks; /* This will be set to something other than 1 when block reads are implemented. */
int current_page_code;
int current_page_len;
int current_page_pos;
int mode_select_phase;
int total_length;
int written_length;
int do_page_save;
uint8_t error;
uint8_t features;
uint16_t request_length;
uint8_t status;
uint8_t phase;
uint32_t sector_pos;
uint32_t sector_len;
uint32_t packet_len;
int packet_status;
uint8_t atapi_cdb[16];
uint8_t current_cdb[16];
uint32_t pos;
int callback;
int data_pos;
int cdb_len_setting;
int cdb_len;
int cd_status;
int prev_status;
int unit_attention;
uint8_t sense[18];
int request_pos;
uint16_t buffer[390144];
int times;
uint32_t seek_pos;
int total_read;
int block_total;
int all_blocks_total;
int old_len;
} cdrom_t;
extern cdrom_t cdrom[CDROM_NUM];
typedef struct __attribute__((__packed__))
{
int enabled;
int max_blocks_at_once;
CDROM *handler;
int host_drive;
int prev_host_drive;
uint8_t bus_type; /* 0 = ATAPI, 1 = SCSI */
uint8_t bus_mode; /* Bit 0 = PIO suported;
Bit 1 = DMA supportd. */
uint8_t check_on_execution; /* 0 = Not Ready/Unit Attention checkeck is performed on the controller's side before command execution;
1 = Not Ready/Unit Attention checkeck is performed on command execution. */
uint8_t ide_channel;
uint8_t scsi_device_id;
uint8_t sound_on;
} cdrom_drive_t;
extern cdrom_drive_t cdrom_drives[CDROM_NUM];
extern uint8_t atapi_cdrom_drives[8];
extern uint8_t scsi_cdrom_drives[16];
extern int (*ide_bus_master_read)(int channel, uint8_t *data, int transfer_length);
extern int (*ide_bus_master_write)(int channel, uint8_t *data, int transfer_length);
extern void (*ide_bus_master_set_irq)(int channel);
typedef struct
{
uint32_t last_block;
uint64_t image_size;
int iso_inited;
char iso_path[1024];
FILE* iso_image;
int iso_changed;
uint32_t cd_pos;
uint32_t cd_end;
} cdrom_iso_t;
cdrom_iso_t cdrom_iso[CDROM_NUM];
typedef struct
{
uint32_t last_block;
uint32_t cdrom_capacity;
int ioctl_inited;
char ioctl_path[8];
int tocvalid;
int cd_state;
uint32_t cd_end;
int16_t cd_buffer[BUF_SIZE];
int cd_buflen;
} cdrom_ioctl_t;
void ioctl_close(uint8_t id);
cdrom_ioctl_t cdrom_ioctl[CDROM_NUM];
uint32_t cdrom_mode_sense_get_channel(uint8_t id, int channel);
uint32_t cdrom_mode_sense_get_volume(uint8_t id, int channel);
void build_atapi_cdrom_map();
void build_scsi_cdrom_map();
int cdrom_CDROM_PHASE_to_scsi(uint8_t id);
int cdrom_atapi_phase_to_scsi(uint8_t id);
void cdrom_command(uint8_t id, uint8_t *cdb);
int cdrom_phase_callback(uint8_t id);
uint32_t cdrom_read(uint8_t channel);
int cdrom_write(uint8_t channel, uint16_t val);
int cdrom_lba_to_msf_accurate(int lba);
void cdrom_reset(uint8_t id);
void cdrom_set_signature(int id);
#define cdrom_sense_error cdrom[id].sense[0]
#define cdrom_sense_key cdrom[id].sense[2]
#define cdrom_asc cdrom[id].sense[12]
#define cdrom_ascq cdrom[id].sense[12]
#define cdrom_drive cdrom_drives[id].host_drive
#endif

View File

@@ -3188,6 +3188,8 @@ static void TEST_NONZERO_JUMP_L(int host_reg, uint32_t new_pc, int taken_cycles)
static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int not)
{
uint8_t *jump1;
if (codegen_flags_changed && cpu_state.flags_op != FLAGS_UNKNOWN)
{
addbyte(0x83); /*CMP flags_res, 0*/
@@ -3203,10 +3205,8 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0xc0);
addbyte(0x75); /*JNZ +*/
}
if (not)
addbyte(12+2+2+7+5+(timing_bt ? 8 : 0));
else
addbyte(12+2+2);
jump1 = &codeblock[block_current].data[block_pos];
addbyte(0);
CALL_FUNC(CF_SET);
addbyte(0x85); /*TEST EAX,EAX*/
addbyte(0xc0);
@@ -3215,6 +3215,9 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
else
addbyte(0x74); /*JZ +*/
addbyte(7+5+(timing_bt ? 4 : 0));
if (!not)
*jump1 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump1 - 1;
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
addbyte(cpu_state_offset(pc));
@@ -3228,6 +3231,8 @@ static int BRANCH_COND_BE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
}
addbyte(0xe9); /*JMP end*/
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
if (not)
*jump1 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump1 - 1;
}
static int BRANCH_COND_L(int pc_offset, uint32_t op_pc, uint32_t offset, int not)
@@ -3268,6 +3273,7 @@ static int BRANCH_COND_L(int pc_offset, uint32_t op_pc, uint32_t offset, int not
static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int not)
{
uint8_t *jump1;
if (codegen_flags_changed && cpu_state.flags_op != FLAGS_UNKNOWN)
{
addbyte(0x83); /*CMP flags_res, 0*/
@@ -3283,11 +3289,8 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
addbyte(0xc0);
addbyte(0x75); /*JNZ +*/
}
if (not)
addbyte(12+2+3+12+2+3+2+2+7+5+(timing_bt ? 8 : 0));
else
addbyte(12+2+3+12+2+3+2+2);
jump1 = &codeblock[block_current].data[block_pos];
addbyte(0);
CALL_FUNC(NF_SET);
addbyte(0x85); /*TEST EAX,EAX*/
addbyte(0xc0);
@@ -3307,6 +3310,8 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
else
addbyte(0x74); /*JZ +*/
addbyte(7+5+(timing_bt ? 4 : 0));
if (!not)
*jump1 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump1 - 1;
addbyte(0xC7); /*MOVL [pc], new_pc*/
addbyte(0x45);
addbyte(cpu_state_offset(pc));
@@ -3320,6 +3325,8 @@ static int BRANCH_COND_LE(int pc_offset, uint32_t op_pc, uint32_t offset, int no
}
addbyte(0xe9); /*JMP end*/
addlong(BLOCK_EXIT_OFFSET - (block_pos + 4));
if (not)
*jump1 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump1 - 1;
}
static int LOAD_VAR_W(uintptr_t addr)
@@ -5241,7 +5248,7 @@ static void LOAD_EA()
static void MEM_CHECK_WRITE(x86seg *seg)
{
uint8_t *jump1, *jump2;
uint8_t *jump1, *jump2, *jump3;
CHECK_SEG_WRITE(seg);
@@ -5264,15 +5271,27 @@ static void MEM_CHECK_WRITE(x86seg *seg)
/*seg = ESI, addr = EAX*/
if (IS_32_ADDR(&cr0))
{
addbyte(0x83); /*CMP cr0, 0*/
addbyte(0x3c);
addbyte(0x25);
addlong((uint32_t)&cr0);
addbyte(0);
}
else
{
addbyte(0x48); /*MOV RDI, &cr0*/
addbyte(0xbf);
addquad((uint64_t)&cr0);
addbyte(0x83); /*CMPL [RDI], 0*/
addbyte(0x3f);
addbyte(0);
}
addbyte(0x67); /*LEA EDI, [EAX+ESI]*/
addbyte(0x8d);
addbyte(0x3c);
addbyte(0x30);
addbyte(0x83); /*CMP cr0, 0*/
addbyte(0x3c);
addbyte(0x25);
addlong((uint32_t)&cr0);
addbyte(0);
addbyte(0x79); /*JNS +*/
jump1 = &codeblock[block_current].data[block_pos];
addbyte(0);
@@ -5284,17 +5303,32 @@ static void MEM_CHECK_WRITE(x86seg *seg)
addbyte(0xfe);
addbyte(-1);
addbyte(0x74); /*JE slowpath*/
addbyte(10);
addbyte(0x83); /*CMP writelookup2[RDI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
jump3 = &codeblock[block_current].data[block_pos];
addbyte(0);
if (IS_32_ADDR(writelookup2))
{
addbyte(0x83); /*CMP writelookup2[RDI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
}
else
{
addbyte(0x48); /*MOV RCX, writelookup2*/
addbyte(0xb9);
addquad((uint64_t)writelookup2);
addbyte(0x83); /*CMP [RCX+RDI*8], -1*/
addbyte(0x3c);
addbyte(0xf9);
addbyte(-1);
}
addbyte(0x75); /*JNE +*/
jump2 = &codeblock[block_current].data[block_pos];
addbyte(0);
// addbyte(0xc3); /*RET*/
*jump3 = (uintptr_t)&codeblock[block_current].data[block_pos] - (uintptr_t)jump3 - 1;
/*slowpath:*/
addbyte(0x67); /*LEA EDI, [EAX+ESI]*/
addbyte(0x8d);
@@ -5358,15 +5392,27 @@ static void MEM_CHECK_WRITE_W(x86seg *seg)
/*seg = ESI, addr = EAX*/
if (IS_32_ADDR(&cr0))
{
addbyte(0x83); /*CMP cr0, 0*/
addbyte(0x3c);
addbyte(0x25);
addlong((uint32_t)&cr0);
addbyte(0);
}
else
{
addbyte(0x48); /*MOV RDI, &cr0*/
addbyte(0xbf);
addquad((uint64_t)&cr0);
addbyte(0x83); /*CMPL [RDI], 0*/
addbyte(0x3f);
addbyte(0);
}
addbyte(0x67); /*LEA EDI, [EAX+ESI]*/
addbyte(0x8d);
addbyte(0x3c);
addbyte(0x30);
addbyte(0x83); /*CMP cr0, 0*/
addbyte(0x3c);
addbyte(0x25);
addlong((uint32_t)&cr0);
addbyte(0);
addbyte(0x79); /*JNS +*/
jump1 = &codeblock[block_current].data[block_pos];
addbyte(0);
@@ -5387,19 +5433,42 @@ static void MEM_CHECK_WRITE_W(x86seg *seg)
addbyte(0xc1); /*SHR ESI, 12*/
addbyte(0xee);
addbyte(12);
addbyte(0x83); /*CMP writelookup2[RDI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
if (IS_32_ADDR(writelookup2))
{
addbyte(0x83); /*CMP writelookup2[RDI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
}
else
{
addbyte(0x48); /*MOV RAX, writelookup2*/
addbyte(0xb8);
addquad((uint64_t)writelookup2);
addbyte(0x83); /*CMP [RAX+RDI*8], -1*/
addbyte(0x3c);
addbyte(0xf8);
addbyte(-1);
}
addbyte(0x74); /*JE +*/
jump2 = &codeblock[block_current].data[block_pos];
addbyte(0);
addbyte(0x83); /*CMP writelookup2[RSI*8],-1*/
addbyte(0x3c);
addbyte(0xf5);
addlong((uint32_t)writelookup2);
addbyte(-1);
if (IS_32_ADDR(writelookup2))
{
addbyte(0x83); /*CMP writelookup2[RSI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
}
else
{
addbyte(0x83); /*CMP [RAX+RSI*8], -1*/
addbyte(0x3c);
addbyte(0xf0);
addbyte(-1);
}
addbyte(0x75); /*JNE +*/
jump3 = &codeblock[block_current].data[block_pos];
addbyte(0);
@@ -5460,15 +5529,27 @@ static void MEM_CHECK_WRITE_L(x86seg *seg)
/*seg = ESI, addr = EAX*/
if (IS_32_ADDR(&cr0))
{
addbyte(0x83); /*CMP cr0, 0*/
addbyte(0x3c);
addbyte(0x25);
addlong((uint32_t)&cr0);
addbyte(0);
}
else
{
addbyte(0x48); /*MOV RDI, &cr0*/
addbyte(0xbf);
addquad((uint64_t)&cr0);
addbyte(0x83); /*CMPL [RDI], 0*/
addbyte(0x3f);
addbyte(0);
}
addbyte(0x67); /*LEA EDI, [EAX+ESI]*/
addbyte(0x8d);
addbyte(0x3c);
addbyte(0x30);
addbyte(0x83); /*CMP cr0, 0*/
addbyte(0x3c);
addbyte(0x25);
addlong((uint32_t)&cr0);
addbyte(0);
addbyte(0x79); /*JNS +*/
jump1 = &codeblock[block_current].data[block_pos];
addbyte(0);
@@ -5489,19 +5570,42 @@ static void MEM_CHECK_WRITE_L(x86seg *seg)
addbyte(0xc1); /*SHR ESI, 12*/
addbyte(0xee);
addbyte(12);
addbyte(0x83); /*CMP writelookup2[RDI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
if (IS_32_ADDR(writelookup2))
{
addbyte(0x83); /*CMP writelookup2[RDI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
}
else
{
addbyte(0x48); /*MOV RAX, writelookup2*/
addbyte(0xb8);
addquad((uint64_t)writelookup2);
addbyte(0x83); /*CMP [RAX+RDI*8], -1*/
addbyte(0x3c);
addbyte(0xf8);
addbyte(-1);
}
addbyte(0x74); /*JE slowpath*/
jump2 = &codeblock[block_current].data[block_pos];
addbyte(0);
addbyte(0x83); /*CMP writelookup2[RSI*8],-1*/
addbyte(0x3c);
addbyte(0xf5);
addlong((uint32_t)writelookup2);
addbyte(-1);
if (IS_32_ADDR(writelookup2))
{
addbyte(0x83); /*CMP writelookup2[RSI*8],-1*/
addbyte(0x3c);
addbyte(0xfd);
addlong((uint32_t)writelookup2);
addbyte(-1);
}
else
{
addbyte(0x83); /*CMP [RAX+RSI*8], -1*/
addbyte(0x3c);
addbyte(0xf0);
addbyte(-1);
}
addbyte(0x75); /*JNE +*/
jump3 = &codeblock[block_current].data[block_pos];
addbyte(0);

View File

@@ -3460,13 +3460,13 @@ static void MMX_ENTER()
addbyte(0x45);
addbyte(cpu_state_offset(ismmx));
addbyte(1);
addbyte(0x8b); /*MOV TOP, EAX*/
addbyte(0x89); /*MOV TOP, EAX*/
addbyte(0x45);
addbyte(cpu_state_offset(TOP));
addbyte(0x8b); /*MOV tag, EAX*/
addbyte(0x89); /*MOV tag, EAX*/
addbyte(0x45);
addbyte(cpu_state_offset(tag[0]));
addbyte(0x8b); /*MOV tag+4, EAX*/
addbyte(0x89); /*MOV tag+4, EAX*/
addbyte(0x45);
addbyte(cpu_state_offset(tag[4]));

View File

@@ -10,7 +10,7 @@
#define BLOCK_EXIT_OFFSET 0x7e0
#define BLOCK_GPF_OFFSET (BLOCK_EXIT_OFFSET - 20)
#define BLOCK_MAX 1650
#define BLOCK_MAX 1620
enum
{

View File

@@ -203,6 +203,22 @@ static struct __attribute__((packed))
uint32_t dma_over;
} d86f[FDD_NUM];
int d86f_do_log = 1;
void d86f_log(const char *format, ...)
{
#ifdef ENABLE_D86F_LOG
if (d86f_do_log)
{
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
fflush(stdout);
}
#endif
}
static void d86f_setupcrc(uint16_t poly)
{
int c = 256, bc;
@@ -1107,7 +1123,7 @@ void d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_
{
find->sync_marks++;
find->sync_pos = d86f[drive].track_pos;
// pclog("Sync marks: %i\n", find->sync_marks);
// d86f_log("Sync marks: %i\n", find->sync_marks);
return;
}
@@ -1120,7 +1136,7 @@ void d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_
disc_calccrc(decodefm(drive, d86f[drive].last_word[side]), &(d86f[drive].calc_crc));
find->sync_marks = find->bits_obtained = find->bytes_obtained = 0;
find->sync_pos = 0xFFFFFFFF;
// pclog("AM found (%04X) (%02X)\n", req_am, d86f[drive].state);
// d86f_log("AM found (%04X) (%02X)\n", req_am, d86f[drive].state);
d86f[drive].preceding_bit[side] = d86f[drive].last_word[side] & 1;
d86f[drive].state++;
return;
@@ -1143,7 +1159,7 @@ void d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_
else
{
/* Not skip mode, process the sector anyway. */
// pclog("Wrong AM found (%04X) (%02X)\n", other_am, d86f[drive].state);
// d86f_log("Wrong AM found (%04X) (%02X)\n", other_am, d86f[drive].state);
fdc_set_wrong_am();
d86f[drive].preceding_bit[side] = d86f[drive].last_word[side] & 1;
d86f[drive].state++;
@@ -1247,12 +1263,12 @@ void d86f_read_sector_id(int drive, int side, int match)
else
{
/* CRC is valid. */
// pclog("Sector ID found: %08X; Requested: %08X\n", d86f[drive].last_sector.dword, d86f[drive].req_sector.dword);
// d86f_log("Sector ID found: %08X; Requested: %08X\n", d86f[drive].last_sector.dword, d86f[drive].req_sector.dword);
d86f[drive].id_find.sync_marks = d86f[drive].id_find.bits_obtained = d86f[drive].id_find.bytes_obtained = 0;
d86f[drive].id_found++;
if ((d86f[drive].last_sector.dword == d86f[drive].req_sector.dword) || !match)
{
// pclog("ID read (%02X)\n", d86f[drive].state);
// d86f_log("ID read (%02X)\n", d86f[drive].state);
d86f_handler[drive].set_sector(drive, side, d86f[drive].last_sector.id.c, d86f[drive].last_sector.id.h, d86f[drive].last_sector.id.r, d86f[drive].last_sector.id.n);
if (d86f[drive].state == STATE_02_READ_ID)
{
@@ -1274,12 +1290,12 @@ void d86f_read_sector_id(int drive, int side, int match)
{
if (d86f[drive].last_sector.id.c == 0xFF)
{
// pclog("[State: %02X] [Side %i] Bad cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] Bad cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].error_condition |= 8;
}
else
{
// pclog("[State: %02X] [Side %i] Wrong cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] Wrong cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].error_condition |= 0x10;
}
}
@@ -1385,7 +1401,7 @@ void d86f_read_sector_data(int drive, int side)
if (read_status == -1)
{
d86f[drive].dma_over++;
// pclog("DMA over now: %i\n", d86f[drive].dma_over);
// d86f_log("DMA over now: %i\n", d86f[drive].dma_over);
}
}
}
@@ -1403,7 +1419,7 @@ void d86f_read_sector_data(int drive, int side)
/* We've got the data. */
if (d86f[drive].dma_over > 1)
{
// pclog("DMA overrun while reading data!\n");
// d86f_log("DMA overrun while reading data!\n");
d86f[drive].data_find.sync_marks = d86f[drive].data_find.bits_obtained = d86f[drive].data_find.bytes_obtained = 0;
d86f[drive].error_condition = 0;
d86f[drive].state = STATE_IDLE;
@@ -1417,7 +1433,7 @@ void d86f_read_sector_data(int drive, int side)
}
else
{
// pclog("Bytes over DMA: %i\n", d86f[drive].dma_over);
// d86f_log("Bytes over DMA: %i\n", d86f[drive].dma_over);
}
if ((d86f[drive].calc_crc.word != d86f[drive].track_crc.word) && (d86f[drive].state != STATE_02_READ_DATA))
@@ -1490,7 +1506,7 @@ void d86f_write_sector_data(int drive, int side, int mfm, uint16_t am)
{
/* We're in the data field of the sector, use a CRC byte. */
d86f[drive].current_byte[side] = d86f[drive].calc_crc.bytes[(d86f[drive].data_find.bytes_obtained & 1)];
// pclog("BO: %04X (%02X)\n", d86f[drive].data_find.bytes_obtained, d86f[drive].current_byte[side]);
// d86f_log("BO: %04X (%02X)\n", d86f[drive].data_find.bytes_obtained, d86f[drive].current_byte[side]);
}
d86f[drive].current_bit[side] = (15 - (d86f[drive].data_find.bits_obtained & 15)) >> 1;
@@ -1574,7 +1590,7 @@ void d86f_write_sector_data(int drive, int side, int mfm, uint16_t am)
{
if (d86f[drive].dma_over > 1)
{
// pclog("DMA overrun while writing data!\n");
// d86f_log("DMA overrun while writing data!\n");
d86f[drive].data_find.sync_marks = d86f[drive].data_find.bits_obtained = d86f[drive].data_find.bytes_obtained = 0;
d86f[drive].error_condition = 0;
d86f[drive].state = STATE_IDLE;
@@ -1611,7 +1627,7 @@ void d86f_advance_bit(int drive, int side)
if (d86f[drive].state != STATE_IDLE)
{
d86f[drive].index_count++;
// pclog("Index count now: %i\n", d86f[drive].index_count);
// d86f_log("Index count now: %i\n", d86f[drive].index_count);
}
}
}
@@ -1721,7 +1737,7 @@ void d86f_format_finish(int drive, int side, int mfm, uint16_t sc, uint16_t gap_
d86f[drive].state = STATE_IDLE;
d86f_handler[drive].writeback(drive);
// pclog("Format finished (%i) (%i)!\n", d86f[drive].track_pos, sc);
// d86f_log("Format finished (%i) (%i)!\n", d86f[drive].track_pos, sc);
d86f[drive].error_condition = 0;
d86f[drive].datac = 0;
fdc_sector_finishread();
@@ -1784,11 +1800,11 @@ void d86f_format_track(int drive, int side)
data = 0;
}
d86f[drive].format_sector_id.byte_array[d86f[drive].datac] = data & 0xff;
// pclog("format_sector_id[%i] = %i\n", d86f[drive].datac, d86f[drive].format_sector_id.byte_array[d86f[drive].datac]);
// d86f_log("format_sector_id[%i] = %i\n", d86f[drive].datac, d86f[drive].format_sector_id.byte_array[d86f[drive].datac]);
if (d86f[drive].datac == 3)
{
fdc_stop_id_request();
// pclog("Formatting sector: %08X (%i) (%i)...\n", d86f[drive].format_sector_id.dword, d86f[drive].track_pos, sc);
// d86f_log("Formatting sector: %08X (%i) (%i)...\n", d86f[drive].format_sector_id.dword, d86f[drive].track_pos, sc);
}
}
case FMT_PRETRK_SYNC:
@@ -1881,7 +1897,7 @@ void d86f_format_track(int drive, int side)
if ((d86f[drive].index_count) && (d86f[drive].format_state < FMT_SECTOR_ID_SYNC) || (d86f[drive].format_state > FMT_SECTOR_GAP3))
{
// pclog("Format finished regularly\n");
// d86f_log("Format finished regularly\n");
d86f_format_finish(drive, side, mfm, sc, gap_fill, do_write);
return;
}
@@ -1903,7 +1919,7 @@ void d86f_format_track(int drive, int side)
case FMT_POSTTRK_CHECK:
if (d86f[drive].index_count)
{
// pclog("Format finished with delay\n");
// d86f_log("Format finished with delay\n");
d86f_format_finish(drive, side, mfm, sc, gap_fill, do_write);
return;
}
@@ -1945,10 +1961,10 @@ void d86f_poll(int drive)
{
if (!d86f_can_read_address(drive))
{
/* if (fdc_get_bitcell_period() != d86f_get_bitcell_period(drive)) pclog("[%i, %i] Bitcell period mismatch (%i != %i)\n", drive, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive));
if (!fdd_can_read_medium(real_drive(drive))) pclog("[%i, %i] Drive can not read medium (hole = %01X)\n", drive, side, d86f_hole(drive));
if (fdc_is_mfm() != d86f_is_mfm(drive)) pclog("[%i, %i] Encoding mismatch\n", drive, side);
if (d86f_get_encoding(drive) > 1) pclog("[%i, %i] Image encoding (%s) not FM or MFM\n", drive, side, (d86f_get_encoding(drive) == 2) ? "M2FM" : "GCR"); */
/* if (fdc_get_bitcell_period() != d86f_get_bitcell_period(drive)) d86f_log("[%i, %i] Bitcell period mismatch (%i != %i)\n", drive, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive));
if (!fdd_can_read_medium(real_drive(drive))) d86f_log("[%i, %i] Drive can not read medium (hole = %01X)\n", drive, side, d86f_hole(drive));
if (fdc_is_mfm() != d86f_is_mfm(drive)) d86f_log("[%i, %i] Encoding mismatch\n", drive, side);
if (d86f_get_encoding(drive) > 1) d86f_log("[%i, %i] Image encoding (%s) not FM or MFM\n", drive, side, (d86f_get_encoding(drive) == 2) ? "M2FM" : "GCR"); */
d86f[drive].state = STATE_SECTOR_NOT_FOUND;
}
@@ -2081,7 +2097,7 @@ void d86f_poll(int drive)
if (d86f_wrong_densel(drive) && (d86f[drive].state != STATE_IDLE))
{
// pclog("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].state = STATE_IDLE;
fdc_noidam();
return;
@@ -2093,7 +2109,7 @@ void d86f_poll(int drive)
{
case STATE_0A_FIND_ID:
case STATE_SECTOR_NOT_FOUND:
// pclog("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].state = STATE_IDLE;
fdc_noidam();
break;
@@ -2104,7 +2120,7 @@ void d86f_poll(int drive)
case STATE_05_FIND_DATA:
case STATE_09_FIND_DATA:
case STATE_0C_FIND_DATA:
// pclog("[State: %02X] [Side %i] No data address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] No data address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
d86f[drive].state = STATE_IDLE;
fdc_nodataam();
break;
@@ -2128,24 +2144,24 @@ void d86f_poll(int drive)
{
if ((d86f[drive].error_condition & 0x18) == 0x08)
{
// pclog("[State: %02X] [Side %i] Bad cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] Bad cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_badcylinder();
}
if ((d86f[drive].error_condition & 0x10) == 0x10)
{
// pclog("[State: %02X] [Side %i] Wrong cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] Wrong cylinder (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_wrongcylinder();
}
}
else
{
// pclog("[State: %02X] [Side %i] Sector not found (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] Sector not found (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_nosector();
}
}
else
{
// pclog("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
// d86f_log("[State: %02X] [Side %i] No ID address mark (%i != %i?) (%02X) (%08X) (%i)\n", d86f[drive].state, side, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), d86f_handler[drive].side_flags(drive), d86f[drive].req_sector.dword, d86f_handler[drive].get_raw_size(drive, side));
fdc_noidam();
}
break;
@@ -2580,7 +2596,7 @@ void d86f_seek(int drive, int track)
void d86f_write_track(int drive, int side, uint16_t *da0, uint16_t *sa0)
{
// pclog("Pos: %08X\n", ftell(d86f[drive].f));
// d86f_log("Pos: %08X\n", ftell(d86f[drive].f));
fwrite(&(d86f[drive].side_flags[side]), 1, 2, d86f[drive].f);
@@ -2598,7 +2614,7 @@ void d86f_write_track(int drive, int side, uint16_t *da0, uint16_t *sa0)
fwrite(da0, 1, d86f_get_array_size(drive, side) << 1, d86f[drive].f);
// pclog("Pos: %08X\n", ftell(d86f[drive].f));
// d86f_log("Pos: %08X\n", ftell(d86f[drive].f));
}
int d86f_get_track_table_size(int drive)
@@ -2639,9 +2655,9 @@ void d86f_writeback(int drive)
fread(header, 1, header_size, d86f[drive].f);
fseek(d86f[drive].f, 8, SEEK_SET);
// pclog("PosEx: %08X\n", ftell(d86f[drive].f));
// d86f_log("PosEx: %08X\n", ftell(d86f[drive].f));
fwrite(d86f[drive].track_offset, 1, d86f_get_track_table_size(drive), d86f[drive].f);
// pclog("PosEx: %08X\n", ftell(d86f[drive].f));
// d86f_log("PosEx: %08X\n", ftell(d86f[drive].f));
if (!fdd_doublestep_40(drive))
{
@@ -2681,14 +2697,14 @@ void d86f_writeback(int drive)
}
if (d86f[drive].track_offset[logical_track])
{
// pclog("Writing track...\n");
// d86f_log("Writing track...\n");
fseek(d86f[drive].f, d86f[drive].track_offset[logical_track], SEEK_SET);
d86f_write_track(drive, side, d86f[drive].track_encoded_data[side], d86f[drive].track_surface_data[side]);
}
}
}
// pclog("Position: %08X\n", ftell(d86f[drive].f));
// d86f_log("Position: %08X\n", ftell(d86f[drive].f));
if (d86f[drive].is_compressed)
{
@@ -2715,7 +2731,7 @@ void d86f_writeback(int drive)
// ret = d86f_zlib(cf, d86f[drive].f, 0);
if (!ret)
{
pclog("86F: Error compressing file\n");
d86f_log("86F: Error compressing file\n");
}
fwrite(d86f[drive].outbuf, 1, ret, cf);
@@ -2772,7 +2788,7 @@ void d86f_writeback(int drive)
}
#endif
// pclog("d86f_writeback(): %08X\n", d86f[drive].track_offset[track]);
// d86f_log("d86f_writeback(): %08X\n", d86f[drive].track_offset[track]);
}
void d86f_stop(int drive)
@@ -2782,7 +2798,7 @@ void d86f_stop(int drive)
int d86f_common_command(int drive, int sector, int track, int side, int rate, int sector_size)
{
// pclog("d86f_common_command (drive %i): fdc_period=%i img_period=%i rate=%i sector=%i track=%i side=%i\n", drive, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), rate, sector, track, side);
d86f_log("d86f_common_command (drive %i): fdc_period=%i img_period=%i rate=%i sector=%i track=%i side=%i\n", drive, fdc_get_bitcell_period(), d86f_get_bitcell_period(drive), rate, sector, track, side);
d86f[drive].req_sector.id.c = track;
d86f[drive].req_sector.id.h = side;
@@ -2802,7 +2818,7 @@ int d86f_common_command(int drive, int sector, int track, int side, int rate, in
if (fdd_get_head(drive) && (d86f_get_sides(drive) == 1))
{
// pclog("Wrong side!\n");
// d86f_log("Wrong side!\n");
fdc_noidam();
d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0;
@@ -2863,11 +2879,11 @@ void d86f_comparesector(int drive, int sector, int track, int side, int rate, in
void d86f_readaddress(int drive, int side, int rate)
{
// pclog("Reading sector ID on drive %i...\n", drive);
// d86f_log("Reading sector ID on drive %i...\n", drive);
if (fdd_get_head(drive) && (d86f_get_sides(drive) == 1))
{
// pclog("Trying to access the second side of a single-sided disk\n");
// d86f_log("Trying to access the second side of a single-sided disk\n");
fdc_noidam();
d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0;
@@ -2949,7 +2965,7 @@ void d86f_common_format(int drive, int side, int rate, uint8_t fill, int proxy)
if (d86f[drive].cur_track > 256)
{
// pclog("Track above 256\n");
// d86f_log("Track above 256\n");
fdc_writeprotect();
d86f[drive].state = STATE_IDLE;
d86f[drive].index_count = 0;
@@ -2979,7 +2995,7 @@ void d86f_common_format(int drive, int side, int rate, uint8_t fill, int proxy)
}
}
// pclog("Formatting track %i side %i\n", track, side);
// d86f_log("Formatting track %i side %i\n", track, side);
d86f[drive].fill = fill;
@@ -3071,7 +3087,7 @@ void d86f_load(int drive, char *fn)
if ((magic != 0x46423638) && (magic != 0x66623638))
{
/* File is not of the valid format, abort. */
pclog("86F: Unrecognized magic bytes: %08X\n", magic);
d86f_log("86F: Unrecognized magic bytes: %08X\n", magic);
fclose(d86f[drive].f);
return;
}
@@ -3083,22 +3099,22 @@ void d86f_load(int drive, char *fn)
/* File is not of a recognized format version, abort. */
if (d86f[drive].version == 0x0063)
{
pclog("86F: File has emulator-internal version 0.99, this version is not valid in a file\n");
d86f_log("86F: File has emulator-internal version 0.99, this version is not valid in a file\n");
}
else if ((d86f[drive].version >= 0x0100) && (d86f[drive].version < D86FVER))
{
pclog("86F: No longer supported development file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
d86f_log("86F: No longer supported development file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
}
else
{
pclog("86F: Unrecognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
d86f_log("86F: Unrecognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
}
fclose(d86f[drive].f);
return;
}
else
{
pclog("86F: Recognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
d86f_log("86F: Recognized file version: %i.%02i\n", d86f[drive].version >> 8, d86f[drive].version & 0xFF);
}
fread(&(d86f[drive].disk_flags), 2, 1, d86f[drive].f);
@@ -3128,7 +3144,7 @@ void d86f_load(int drive, char *fn)
if (crc64 != read_crc64)
{
pclog("86F: CRC64 error\n");
d86f_log("86F: CRC64 error\n");
fclose(d86f[drive].f);
return;
}
@@ -3145,7 +3161,7 @@ void d86f_load(int drive, char *fn)
d86f[drive].f = fopen(temp_file_name, "wb");
if (!d86f[drive].f)
{
pclog("86F: Unable to create temporary decompressed file\n");
d86f_log("86F: Unable to create temporary decompressed file\n");
return;
}
@@ -3175,7 +3191,7 @@ void d86f_load(int drive, char *fn)
if (!temp)
{
pclog("86F: Error decompressing file\n");
d86f_log("86F: Error decompressing file\n");
remove(temp_file_name);
return;
}
@@ -3186,7 +3202,7 @@ void d86f_load(int drive, char *fn)
if (d86f[drive].disk_flags & 0x100)
{
/* Zoned disk. */
pclog("86F: Disk is zoned (Apple or Sony)\n");
d86f_log("86F: Disk is zoned (Apple or Sony)\n");
fclose(d86f[drive].f);
if (d86f[drive].is_compressed)
{
@@ -3198,7 +3214,7 @@ void d86f_load(int drive, char *fn)
if (d86f[drive].disk_flags & 0x600)
{
/* Zone type is not 0 but the disk is fixed-RPM. */
pclog("86F: Disk is fixed-RPM but zone type is not 0\n");
d86f_log("86F: Disk is fixed-RPM but zone type is not 0\n");
fclose(d86f[drive].f);
if (d86f[drive].is_compressed)
{
@@ -3234,7 +3250,7 @@ void d86f_load(int drive, char *fn)
if (!(d86f[drive].track_offset[0]))
{
/* File has no track 0 side 0, abort. */
pclog("86F: No Track 0 side 0\n");
d86f_log("86F: No Track 0 side 0\n");
fclose(d86f[drive].f);
return;
}
@@ -3242,7 +3258,7 @@ void d86f_load(int drive, char *fn)
if ((d86f_get_sides(drive) == 2) && !(d86f[drive].track_offset[1]))
{
/* File is 2-sided but has no track 0 side 1, abort. */
pclog("86F: No Track 0 side 0\n");
d86f_log("86F: No Track 0 side 0\n");
fclose(d86f[drive].f);
return;
}
@@ -3306,7 +3322,7 @@ void d86f_load(int drive, char *fn)
d86f_common_handlers(drive);
drives[drive].format = d86f_format;
pclog("86F: Disk is %scompressed and %s surface description data\n", d86f[drive].is_compressed ? "" : "not ", d86f_has_surface_desc(drive) ? "has" : "does not have");
d86f_log("86F: Disk is %scompressed and %s surface description data\n", d86f[drive].is_compressed ? "" : "not ", d86f_has_surface_desc(drive) ? "has" : "does not have");
}
void d86f_init()

View File

@@ -565,34 +565,39 @@ int dma_channel_write(int channel, uint16_t val)
return 0;
}
#if 0
static uint32_t PageLengthReadWrite(uint32_t PhysAddress, uint32_t TotalSize)
{
uint32_t LengthSize;
uint32_t Page;
Page = PhysAddress & 4095;
LengthSize = (Page + 4096) - PhysAddress;
if (LengthSize > TotalSize)
LengthSize = TotalSize;
return LengthSize;
if ((Page + TotalSize - 1) >= 4096)
{
TotalSize = 4096 - Page;
}
return TotalSize;
}
#endif
//DMA Bus Master Page Read/Write
void DMAPageRead(uint32_t PhysAddress, void *DataRead, uint32_t TotalSize)
{
uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize);
memcpy(DataRead, &ram[PhysAddress], PageLen);
DataRead -= PageLen;
TotalSize += PageLen;
// uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize);
memcpy(DataRead, &ram[PhysAddress], TotalSize);
// DataRead -= PageLen;
DataRead -= TotalSize;
}
void DMAPageWrite(uint32_t PhysAddress, const void *DataWrite, uint32_t TotalSize)
{
uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize);
memcpy(&ram[PhysAddress], DataWrite, PageLen);
DataWrite -= PageLen;
TotalSize += PageLen;
// uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize);
memcpy(&ram[PhysAddress], DataWrite, TotalSize);
mem_invalidate_range(PhysAddress, PhysAddress + TotalSize - 1);
// DataWrite -= PageLen;
DataWrite -= TotalSize;
}
int dma_mode(int channel)

125
src/fdc.c
View File

@@ -115,6 +115,23 @@ int discmodified[4];
int discrate[4];
int discint;
int fdc_do_log = 1;
void fdc_log(const char *format, ...)
{
#ifdef ENABLE_FDC_LOG
if (fdc_do_log)
{
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
fflush(stdout);
}
#endif
}
void fdc_reset()
{
fdc.stat=0x80;
@@ -128,7 +145,7 @@ void fdc_reset()
fdc.rate = 2;
// fdc_update_rate();
}
// pclog("Reset FDC\n");
// fdc_log("Reset FDC\n");
}
sector_id_t fdc_get_read_track_sector()
@@ -282,7 +299,7 @@ void fdc_fifo_buf_advance()
{
fdc.fifobufpos++;
}
// pclog("FIFO buffer position = %02X\n", fdc.fifobufpos);
// fdc_log("FIFO buffer position = %02X\n", fdc.fifobufpos);
}
void fdc_fifo_buf_write(int val)
@@ -305,7 +322,7 @@ static void fdc_int()
{
if (fdc.dor & 8)
{
// pclog("FDC interrupt!\n");
// fdc_log("FDC interrupt!\n");
picint(1 << 6);
fdc.fintr = 1;
}
@@ -321,7 +338,7 @@ static void fdc_watchdog_poll(void *p)
fdc->watchdog_timer += 1000 * TIMER_USEC;
else
{
// pclog("Watchdog timed out\n");
// fdc_log("Watchdog timed out\n");
fdc->watchdog_timer = 0;
if (fdc->dor & 0x20)
@@ -460,7 +477,7 @@ void fdc_update_rate(int drive)
}
fdc.bitcell_period = 1000000 / bit_rate*2; /*Bitcell period in ns*/
// pclog("fdc_update_rate: rate=%i bit_rate=%i bitcell_period=%i\n", fdc.rate, bit_rate, fdc.bitcell_period);
// fdc_log("fdc_update_rate: rate=%i bit_rate=%i bitcell_period=%i\n", fdc.rate, bit_rate, fdc.bitcell_period);
}
int fdc_get_bit_rate()
@@ -573,7 +590,7 @@ void fdc_implied_seek()
void fdc_write(uint16_t addr, uint8_t val, void *priv)
{
// pclog("Write FDC %04X %02X %04X:%04X %i %02X %i rate=%i %i\n",addr,val,cs>>4,pc,ins,fdc.st0,ins,fdc.rate, fdc.data_ready);
// fdc_log("Write FDC %04X %02X %04X:%04X %i %02X %i rate=%i %i\n",addr,val,cs>>4,pc,ins,fdc.st0,ins,fdc.rate, fdc.data_ready);
int drive, i, drive_num;
int seek_time, seek_time_base;
@@ -591,7 +608,7 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc.watchdog_timer = 1000 * TIMER_USEC;
fdc.watchdog_count = 1000;
picintc(1 << 6);
// pclog("watchdog set %i %i\n", fdc.watchdog_timer, TIMER_USEC);
// fdc_log("watchdog set %i %i\n", fdc.watchdog_timer, TIMER_USEC);
}
if ((val & 0x80) && !(fdc.dor & 0x80))
{
@@ -686,10 +703,10 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc.perp &= 0xfc;
fdc_reset();
}
// pclog("DSR now: %02X\n", val);
// fdc_log("DSR now: %02X\n", val);
return;
case 5: /*Command register*/
// pclog("CMD now: %02X\n", val);
// fdc_log("CMD now: %02X\n", val);
if ((fdc.stat & 0xf0) == 0xb0)
{
if (fdc.pcjr || !fdc.fifo)
@@ -705,8 +722,8 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv)
break;
}
// if (fdc.inread)
// rpclog("c82c711_fdc_write : writing while inread! %02X\n", val);
// rpclog("Write command reg %i %i\n",fdc.pnum, fdc.ptot);
// rfdc_log("c82c711_fdc_write : writing while inread! %02X\n", val);
// rfdc_log("Write command reg %i %i\n",fdc.pnum, fdc.ptot);
if (fdc.pnum==fdc.ptot)
{
// if ((fdc.stat & 0x10) || !fdc.stat)
@@ -723,7 +740,7 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc.command=val;
fdc.stat |= 0x10;
// pclog("Starting FDC command %02X\n",fdc.command);
fdc_log("Starting FDC command %02X\n",fdc.command);
switch (fdc.command&0x1F)
{
case 1: /*Mode*/
@@ -793,7 +810,7 @@ void fdc_write(uint16_t addr, uint8_t val, void *priv)
fdc.stat |= 0x90;
break;
case 8: /*Sense interrupt status*/
// if (!fdc.fintr && !fdc_reset_stat) pclog("Attempted SENSE INTERRUPT STATUS without FINTR\n");
// if (!fdc.fintr && !fdc_reset_stat) fdc_log("Attempted SENSE INTERRUPT STATUS without FINTR\n");
if (!fdc.fintr && !fdc_reset_stat) goto bad_command;
// printf("Sense interrupt status %i\n",curdrive);
fdc.lastdrive = fdc.drive;
@@ -898,7 +915,7 @@ bad_command:
}
if (fdc.pnum==fdc.ptot)
{
// pclog("Got all params %02X\n", fdc.command);
fdc_log("Got all params %02X\n", fdc.command);
discint=fdc.command&0x1F;
timer_process();
disctime = 1024 * (1 << TIMER_SHIFT);
@@ -921,7 +938,7 @@ bad_command:
fdc.read_track_sector.id.n = fdc.params[4];
fdc_implied_seek();
fdc.rw_track = fdc.params[1];
// pclog("Read a track track=%i head=%i sector=%i eot=%i\n", fdc.pcn[fdc.params[0] & 3], fdc.head, fdc.sector, fdc.eot[fdc.drive]);
// fdc_log("Read a track track=%i head=%i sector=%i eot=%i\n", fdc.pcn[fdc.params[0] & 3], fdc.head, fdc.sector, fdc.eot[fdc.drive]);
disc_readsector(fdc.drive, SECTOR_FIRST, fdc.params[1], fdc.head, fdc.rate, fdc.params[4]);
if (fdc.pcjr || !fdc.dma)
{
@@ -955,7 +972,7 @@ bad_command:
fdc.perp &= 0xfc;
fdc.perp |= (fdc.params[0] & 0x03);
}
// pclog("PERPENDICULAR: Set to: %02X\n", fdc.perp);
// fdc_log("PERPENDICULAR: Set to: %02X\n", fdc.perp);
disctime = 0;
return;
@@ -1039,11 +1056,11 @@ bad_command:
fdc.dtl = fdc.params[7];
fdc_implied_seek();
fdc.rw_track = fdc.params[1];
// pclog("Reading sector (drive %i) (%i) (%i %i %i %i) (%i %i %i)\n", fdc.drive, fdc.params[0], fdc.params[1], fdc.params[2], fdc.params[3], fdc.params[4], fdc.params[5], fdc.params[6], fdc.params[7]);
fdc_log("Reading sector (drive %i) (%i) (%i %i %i %i) (%i %i %i)\n", fdc.drive, fdc.params[0], fdc.params[1], fdc.params[2], fdc.params[3], fdc.params[4], fdc.params[5], fdc.params[6], fdc.params[7]);
if (((dma_mode(2) & 0x0C) == 0x00) && !fdc.pcjr && fdc.dma)
{
/* DMA is in verify mode, treat this like a VERIFY command. */
// pclog("Verify-mode read!\n");
fdc_log("Verify-mode read!\n");
fdc.tc = 1;
fdc.deleted |= 2;
}
@@ -1103,12 +1120,12 @@ bad_command:
fdc.gap = fdc.params[3];
fdc.dtl = 4000000;
fdc.format_sectors = fdc.params[2];
// pclog("Formatting with %i sectors per track\n", fdc.format_sectors);
// fdc_log("Formatting with %i sectors per track\n", fdc.format_sectors);
fdc.format_n = fdc.params[1];
fdc.format_state = 1;
fdc.pos = 0;
fdc.stat = 0x10;
// pclog("FDC FORMAT: %02X %02X %02X %02X %02X\n", fdc.params[0], fdc.params[1], fdc.params[2], fdc.params[3], fdc.params[4]);
// fdc_log("FDC FORMAT: %02X %02X %02X %02X %02X\n", fdc.params[0], fdc.params[1], fdc.params[2], fdc.params[3], fdc.params[4]);
break;
case 0xf: /*Seek*/
@@ -1181,7 +1198,7 @@ bad_command:
}
else
{
// pclog("Seeking to track %i...\n", fdc.params[1]);
fdc_log("Seeking to track %i...\n", fdc.params[1]);
seek_time = ((int) (fdc.params[1] - fdc.pcn[fdc.params[0] & 3])) * seek_time_base * TIMER_USEC;
if ((fdc.params[1] - fdc.pcn[fdc.params[0] & 3]) == 0)
@@ -1233,7 +1250,7 @@ bad_command:
case 7:
if (!AT) return;
fdc.rate=val&3;
// pclog("Rate now: %i\n", val & 3);
// fdc_log("Rate now: %i\n", val & 3);
disc_3f7=val;
return;
@@ -1271,7 +1288,7 @@ uint8_t fdc_read(uint16_t addr, void *priv)
break;
case 2:
temp = fdc.dor;
// pclog("Read DOR: %02X\n", fdc.dor);
// fdc_log("Read DOR: %02X\n", fdc.dor);
break;
case 3:
drive = real_drive(fdc.dor & 3);
@@ -1301,7 +1318,7 @@ uint8_t fdc_read(uint16_t addr, void *priv)
return 0;
}
temp=fdc.stat;
// pclog("Read MSR: %02X\n", fdc.stat);
// fdc_log("Read MSR: %02X\n", fdc.stat);
break;
case 5: /*Data*/
fdc.stat&=~0x80;
@@ -1313,15 +1330,15 @@ uint8_t fdc_read(uint16_t addr, void *priv)
{
temp = fdc_fifo_buf_read();
}
// pclog("Read DAT: %02X\n", temp);
// fdc_log("Read DAT: %02X\n", temp);
break;
}
if (paramstogo)
{
paramstogo--;
temp=fdc.res[10 - paramstogo];
// pclog("Read result: %02X\n", temp);
// pclog("Read param %i %02X\n",10-paramstogo,temp);
// fdc_log("Read result: %02X\n", temp);
// fdc_log("Read param %i %02X\n",10-paramstogo,temp);
if (!paramstogo)
{
fdc.stat=0x80;
@@ -1339,7 +1356,7 @@ uint8_t fdc_read(uint16_t addr, void *priv)
fdc.stat = 0x80;
lastbyte=0;
temp=fdc.dat;
// pclog("Read DAT: %02X\n", temp);
// fdc_log("Read DAT: %02X\n", temp);
fdc.data_ready = 0;
}
/* What the heck is this even doing?! */
@@ -1363,7 +1380,7 @@ uint8_t fdc_read(uint16_t addr, void *priv)
{
temp |= 0x7F;
}
// pclog("Read CCR: %02X\n", temp);
// fdc_log("Read CCR: %02X\n", temp);
// printf("- DC %i %02X %02X %i %i - ",fdc.dor & 3, fdc.dor, 0x10 << (fdc.dor & 3), discchanged[fdc.dor & 1], driveempty[fdc.dor & 1]);
// discchanged[fdc.dor&1]=0;
break;
@@ -1457,14 +1474,14 @@ void fdc_callback()
int old_sector = 0;
int bad_end = 0;
disctime = 0;
// pclog("fdc_callback %i %i\n", discint, disctime);
// fdc_log("fdc_callback %i %i\n", discint, disctime);
// if (fdc.inread)
// rpclog("c82c711_fdc_callback : while inread! %08X %i %02X %i\n", discint, fdc.drive, fdc.st0, ins);
// rfdc_log("c82c711_fdc_callback : while inread! %08X %i %02X %i\n", discint, fdc.drive, fdc.st0, ins);
switch (discint)
{
case -3: /*End of command with interrupt*/
// if (output) printf("EOC - interrupt!\n");
//rpclog("EOC\n");
//rfdc_log("EOC\n");
fdc_int();
fdc.stat = (fdc.stat & 0xf) | 0x80;
return;
@@ -1472,7 +1489,7 @@ void fdc_callback()
fdc.stat = (fdc.stat & 0xf) | 0x80;
return;
case -1: /*Reset*/
//rpclog("Reset\n");
//rfdc_log("Reset\n");
fdc_int();
fdc.fintr = 0;
memset(fdc.pcn, 0, 4);
@@ -1487,7 +1504,7 @@ void fdc_callback()
readflash = 1;
fdc.eot[fdc.drive]--;
fdc.read_track_sector.id.r++;
// pclog("Read a track callback, eot=%i\n", fdc.eot[fdc.drive]);
// fdc_log("Read a track callback, eot=%i\n", fdc.eot[fdc.drive]);
if (!fdc.eot[fdc.drive] || fdc.tc)
{
fdc_poll_readwrite_finish(2);
@@ -1531,7 +1548,7 @@ void fdc_callback()
case 0x19: /*Scan low or equal*/
case 0x1C: /*Verify*/
case 0x1D: /*Scan high or equal*/
// rpclog("Read data %i\n", fdc.tc);
// rfdc_log("Read data %i\n", fdc.tc);
if ((discint == 0x11) || (discint == 0x19) || (discint == 0x1D))
{
compare = 1;
@@ -1687,7 +1704,7 @@ void fdc_callback()
return;
case 8: /*Sense interrupt status*/
// pclog("Sense interrupt status %i\n", fdc_reset_stat);
// fdc_log("Sense interrupt status %i\n", fdc_reset_stat);
fdc.stat = (fdc.stat & 0xf) | 0xd0;
@@ -1718,7 +1735,7 @@ void fdc_callback()
fdc.res[10] = fdc.pcn[fdc.res[9] & 3];
// pclog("SENSE INTERRUPT STATUS: Results %02X %02X, ST0 %02X\n", fdc.res[9], fdc.res[10], fdc.st0);
// fdc_log("SENSE INTERRUPT STATUS: Results %02X %02X, ST0 %02X\n", fdc.res[9], fdc.res[10], fdc.st0);
paramstogo = 2;
discint = 0;
@@ -1726,7 +1743,7 @@ void fdc_callback()
return;
case 0x0d: /*Format track*/
// rpclog("Format\n");
// rfdc_log("Format\n");
if (fdc.format_state == 1)
{
// ioc_fiq(IOC_FIQ_DISC_DATA);
@@ -1737,7 +1754,7 @@ void fdc_callback()
}
else if (fdc.format_state == 2)
{
// pclog("Format next stage track %i head %i n %i is_mfm %i gap %i sc %i\n", fdc.pcn[fdc.params[0] & 3], fdc.head, fdc_get_format_n(), fdc_is_mfm(), fdc_get_gap(), fdc_get_format_sectors());
// fdc_log("Format next stage track %i head %i n %i is_mfm %i gap %i sc %i\n", fdc.pcn[fdc.params[0] & 3], fdc.head, fdc_get_format_n(), fdc_is_mfm(), fdc_get_gap(), fdc_get_format_sectors());
disc_format(fdc.drive, fdc.head, fdc.rate, fdc.params[4]);
fdc.format_state = 3;
}
@@ -1768,7 +1785,7 @@ void fdc_callback()
disctime = 2048 * (1 << TIMER_SHIFT);
timer_update_outstanding();
fdc.stat = 0x80 | (1 << fdc.drive);
// pclog("Stat %02X ST0 %02X\n", fdc.stat, fdc.st0);
// fdc_log("Stat %02X ST0 %02X\n", fdc.stat, fdc.st0);
return;
case 0x0e: /*Dump registers*/
fdc.stat = (fdc.stat & 0xf) | 0xd0;
@@ -1807,8 +1824,8 @@ void fdc_callback()
fdc.pretrk = fdc.params[2];
fdc.fifo = (fdc.params[1] & 0x20) ? 0 : 1;
fdc.tfifo = (fdc.params[1] & 0xF) + 1;
// pclog("CONFIGURE (%02X, %02X, %02X)\n", fdc.params[0], fdc.params[1], fdc.params[2]);
// pclog("FIFO is now %02X, threshold is %02X\n", fdc.fifo, fdc.tfifo);
// fdc_log("CONFIGURE (%02X, %02X, %02X)\n", fdc.params[0], fdc.params[1], fdc.params[2]);
// fdc_log("FIFO is now %02X, threshold is %02X\n", fdc.fifo, fdc.tfifo);
fdc.stat = 0x80;
disctime = 0;
// picint(0x40);
@@ -1840,7 +1857,7 @@ void fdc_callback()
case 0xfc: /*Invalid*/
fdc.dat = fdc.st0 = 0x80;
// pclog("Inv!\n");
// fdc_log("Inv!\n");
//picint(0x40);
fdc.stat = (fdc.stat & 0xf) | 0xd0;
// fdc.stat|=0xC0;
@@ -1922,7 +1939,7 @@ int fdc_data(uint8_t data)
if (fdc.data_ready)
{
fdc_overrun();
// pclog("Overrun\n");
// fdc_log("Overrun\n");
return -1;
}
@@ -1983,7 +2000,7 @@ void fdc_finishread()
{
fdc.inread = 0;
// disctime = 200 * TIMER_USEC;
// rpclog("fdc_finishread\n");
// rfdc_log("fdc_finishread\n");
}
void fdc_track_finishread(int condition)
@@ -1992,7 +2009,7 @@ void fdc_track_finishread(int condition)
fdc.satisfying_sectors |= condition;
fdc.inread = 0;
fdc_callback();
// rpclog("fdc_finishread\n");
// rfdc_log("fdc_finishread\n");
}
void fdc_sector_finishcompare(int satisfying)
@@ -2001,7 +2018,7 @@ void fdc_sector_finishcompare(int satisfying)
fdc.satisfying_sectors++;
fdc.inread = 0;
fdc_callback();
// rpclog("fdc_finishread\n");
// rfdc_log("fdc_finishread\n");
}
void fdc_sector_finishread()
@@ -2009,7 +2026,7 @@ void fdc_sector_finishread()
fdc.stat = 0x10;
fdc.inread = 0;
fdc_callback();
// rpclog("fdc_finishread\n");
// rfdc_log("fdc_finishread\n");
}
#if 0
@@ -2017,7 +2034,7 @@ void fdc_notfound()
{
fdc_error(5, 0);
// rpclog("c82c711_fdc_notfound\n");
// rfdc_log("c82c711_fdc_notfound\n");
}
#endif
@@ -2050,14 +2067,14 @@ void fdc_datacrcerror()
{
fdc_error(0x20, 0x20);
// rpclog("c82c711_fdc_datacrcerror\n");
// rfdc_log("c82c711_fdc_datacrcerror\n");
}
void fdc_headercrcerror()
{
fdc_error(0x20, 0);
// rpclog("c82c711_fdc_headercrcerror\n");
// rfdc_log("c82c711_fdc_headercrcerror\n");
}
void fdc_wrongcylinder()
@@ -2084,7 +2101,7 @@ int fdc_getdata(int last)
if (fdc.written)
{
fdc_overrun();
// pclog("Overrun\n");
// fdc_log("Overrun\n");
return -1;
}
if (fdc.pcjr || !fdc.fifo)
@@ -2129,7 +2146,7 @@ int fdc_getdata(int last)
void fdc_sectorid(uint8_t track, uint8_t side, uint8_t sector, uint8_t size, uint8_t crc1, uint8_t crc2)
{
// pclog("SectorID %i %i %i %i\n", track, side, sector, size);
// fdc_log("SectorID %i %i %i %i\n", track, side, sector, size);
fdc_int();
fdc.stat=0xD0;
fdc.res[4]=(fdd_get_head(real_drive(fdc.drive))?4:0)|fdc.drive;
@@ -2145,7 +2162,7 @@ void fdc_sectorid(uint8_t track, uint8_t side, uint8_t sector, uint8_t size, uin
void fdc_indexpulse()
{
// ioc_irqa(IOC_IRQA_DISC_INDEX);
// rpclog("c82c711_fdc_indexpulse\n");
// rfdc_log("c82c711_fdc_indexpulse\n");
}
void fdc_init()

View File

@@ -535,11 +535,7 @@ int keybsenddelay;
/*CD-ROM*/
extern int cdrom_drive;
extern int old_cdrom_drive;
extern int idecallback[4];
extern int cdrom_enabled;
extern int scsi_cdrom_enabled;
#define CD_STATUS_EMPTY 0
#define CD_STATUS_DATA_ONLY 1

2170
src/ide.c

File diff suppressed because it is too large Load Diff

View File

@@ -4,7 +4,35 @@
#ifndef __IDE__
#define __IDE__
struct IDE;
typedef struct IDE
{
int type;
int board;
uint8_t atastat;
uint8_t error;
int secount,sector,cylinder,head,drive,cylprecomp;
uint8_t command;
uint8_t fdisk;
int pos;
int packlen;
int spt,hpc;
int tracks;
int packetstatus;
uint8_t asc;
int reset;
FILE *hdfile;
uint16_t buffer[65536];
int irqstat;
int service;
int lba;
int channel;
uint32_t lba_addr;
int skip512;
int blocksize, blockcount;
uint16_t dma_identify_data[3];
int hdi,base;
int hdc_num;
} IDE;
extern void writeide(int ide_board, uint16_t addr, uint8_t val);
extern void writeidew(int ide_board, uint16_t val);
@@ -23,7 +51,7 @@ extern void ide_pri_disable();
extern void ide_sec_disable();
extern void ide_ter_disable();
extern void ide_qua_disable();
extern void ide_set_bus_master(int (*read_sector)(int channel, uint8_t *data), int (*write_sector)(int channel, uint8_t *data), void (*set_irq)(int channel));
extern void ide_set_bus_master(int (*read)(int channel, uint8_t *data, int transfer_length), int (*write)(int channel, uint8_t *data, int transfer_length), void (*set_irq)(int channel));
extern int ideboard;
@@ -34,6 +62,13 @@ extern int idecallback[4];
extern char ide_fn[IDE_NUM][512];
extern int atapi_cdrom_channel;
void ide_irq_lower(IDE *ide);
IDE ide_drives[IDE_NUM];
void ide_padstr8(uint8_t *buf, int buf_size, const char *src);
void win_cdrom_eject(uint8_t id);
void win_cdrom_reload(uint8_t id);
#endif //__IDE__

View File

@@ -1,7 +1,11 @@
/* Copyright holders: Sarah Walker
see COPYING for more details
*/
#include <stdint.h>
#include <stdio.h>
#include "ibm.h"
#include "cdrom.h"
#include "cpu.h"
#include "mem.h"
#include "model.h"
@@ -403,11 +407,28 @@ void at_opti495_init()
opti495_init();
}
void secondary_ide_check()
{
int i = 0;
int secondary_cdroms = 0;
for (i = 0; i < CDROM_NUM; i++)
{
if ((cdrom_drives[i].ide_channel >= 2) && (cdrom_drives[i].ide_channel <= 3) && !cdrom_drives[i].bus_type)
{
secondary_cdroms++;
}
if (!secondary_cdroms) ide_sec_disable();
}
}
void at_ali1429_init()
{
at_init();
ali1429_init();
if (atapi_cdrom_channel <= 1) ide_sec_disable();
secondary_ide_check();
}
/* void at_um8881f_init()
@@ -422,7 +443,7 @@ void at_dtk486_init()
at_init();
memregs_init();
sis85c471_init();
if (atapi_cdrom_channel <= 1) ide_sec_disable();
secondary_ide_check();
}
void at_sis496_init()
@@ -464,7 +485,7 @@ void at_586mc1_init()
i430lx_init();
sio_init(1);
device_add(&intel_flash_bxt_device);
if (atapi_cdrom_channel <= 1) ide_sec_disable();
secondary_ide_check();
}
void at_plato_init()

View File

@@ -10,6 +10,8 @@ int mouse_get_type(int mouse);
#define MOUSE_TYPE_AMSTRAD 2
#define MOUSE_TYPE_OLIM24 3
#define MOUSE_TYPE_IF_MASK 3
#define MOUSE_TYPE_3BUTTON (1 << 31)
typedef struct

View File

@@ -249,6 +249,7 @@ int ne2000_do_log = 0;
void ne2000_log(const char *format, ...)
{
#ifdef ENABLE_NE2000_LOG
if (ne2000_do_log)
{
va_list ap;
@@ -257,6 +258,7 @@ void ne2000_log(const char *format, ...)
va_end(ap);
fflush(stdout);
}
#endif
}
static void ne2000_setirq(ne2000_t *ne2000, int irq)

239
src/pc.c
View File

@@ -9,6 +9,7 @@
#include "device.h"
#include "ali1429.h"
#include "cdrom.h"
#include "cdrom-ioctl.h"
#include "disc.h"
#include "mem.h"
@@ -59,8 +60,6 @@ int window_w, window_h, window_x, window_y, window_remember;
int start_in_fullscreen = 0;
int scsi_cdrom_enabled;
int cdrom_enabled;
int CPUID;
int vid_resize, vid_api;
@@ -207,7 +206,7 @@ void initpc(int argc, char *argv[])
{
char *p;
char *config_file = NULL;
int c;
int c, i;
FILE *ff;
// allegro_init();
get_executable_name(pcempath,511);
@@ -271,6 +270,41 @@ void initpc(int argc, char *argv[])
device_init();
timer_reset();
for (i = 0; i < CDROM_NUM; i++)
{
if (cdrom_drives[i].bus_type)
{
SCSIReset(cdrom_drives[i].scsi_device_id);
}
if (cdrom_drives[i].host_drive == 0)
{
cdrom_null_open(i, cdrom_drives[i].host_drive);
}
else
{
if (cdrom_drives[i].host_drive == 200)
{
ff = fopen(cdrom_iso[i].iso_path, "rb");
if (ff)
{
fclose(ff);
iso_open(i, cdrom_iso[i].iso_path);
}
else
{
cdrom_drives[i].host_drive = 0;
cdrom_null_open(i, cdrom_drives[i].host_drive);
}
}
else
{
ioctl_open(i, cdrom_drives[i].host_drive);
}
}
}
sound_reset();
fdc_init();
disc_init();
@@ -294,41 +328,13 @@ void initpc(int argc, char *argv[])
//loadfont();
loadnvr();
sound_init();
resetide();
if (buslogic_enabled)
{
SCSIReset(scsi_cdrom_id);
device_add(&BuslogicDevice);
}
if ((cdrom_drive == -1) || (cdrom_drive == 0))
cdrom_null_open(cdrom_drive);
else
if (buslogic_enabled)
{
if (cdrom_drive == 200)
{
ff = fopen(iso_path, "rb");
if (ff)
{
fclose(ff);
iso_open(iso_path);
}
else
{
#if __unix
cdrom_drive = -1;
#else
cdrom_drive = 0;
#endif
cdrom_null_open(cdrom_drive);
}
}
else
{
ioctl_open(cdrom_drive);
}
}
device_add(&BuslogicDevice);
}
pit_reset();
/* if (romset==ROM_AMI386 || romset==ROM_AMI486) */fullspeed();
ali1429_reset();
@@ -336,18 +342,23 @@ void initpc(int argc, char *argv[])
// pclog("Init - CPUID %i %i\n",CPUID,cpuspeed);
shadowbios=0;
if ((cdrom_drive == -1) || (cdrom_drive == 0))
cdrom_null_reset();
else
for (i = 0; i < CDROM_NUM; i++)
{
if (cdrom_drive == 200)
if (cdrom_drives[i].host_drive == 0)
{
cdrom_null_reset(i);
}
else
{
if (cdrom_drives[i].host_drive == 200)
{
iso_reset();
iso_reset(i);
}
else
{
ioctl_reset();
ioctl_reset(i);
}
}
}
}
@@ -384,6 +395,8 @@ void resetpc_cad()
void resetpchard()
{
int i = 0;
savenvr();
saveconfig();
@@ -436,13 +449,19 @@ void resetpchard()
device_add(&voodoo_device);
pc_reset();
resetide();
if (buslogic_enabled)
for (i = 0; i < CDROM_NUM; i++)
{
if (cdrom_drives[i].bus_type)
{
SCSIReset(scsi_cdrom_id);
device_add(&BuslogicDevice);
SCSIReset(cdrom_drives[i].scsi_device_id);
}
}
resetide();
if (buslogic_enabled)
{
device_add(&BuslogicDevice);
}
loadnvr();
@@ -459,18 +478,23 @@ void resetpchard()
// output=3;
if ((cdrom_drive == -1) || (cdrom_drive == 0))
cdrom_null_reset();
else
for (i = 0; i < CDROM_NUM; i++)
{
if (cdrom_drive == 200)
if (cdrom_drives[i].host_drive == 0)
{
cdrom_null_reset(i);
}
else
{
if (cdrom_drives[i].host_drive == 200)
{
iso_reset();
iso_reset(i);
}
else
{
ioctl_reset();
ioctl_reset(i);
}
}
}
}
@@ -601,7 +625,11 @@ void speedchanged()
void closepc()
{
cdrom->exit();
int i = 0;
for (i = 0; i < CDROM_NUM; i++)
{
cdrom_drives[i].handler->exit(i);
}
// ioctl_close();
dumppic();
// output=7;
@@ -701,19 +729,54 @@ void loadconfig(char *fn)
if (mem_size < ((models[model].flags & MODEL_AT) ? models[model].min_ram*1024 : models[model].min_ram))
mem_size = ((models[model].flags & MODEL_AT) ? models[model].min_ram*1024 : models[model].min_ram);
cdrom_drive = config_get_int(NULL, "cdrom_drive", 0);
old_cdrom_drive = cdrom_drive;
cdrom_enabled = config_get_int(NULL, "cdrom_enabled", 0);
cdrom_drives[0].host_drive = config_get_int(NULL, "cdrom_1_host_drive", 0);
cdrom_drives[0].prev_host_drive = cdrom_drives[0].host_drive;
cdrom_drives[0].enabled = config_get_int(NULL, "cdrom_1_enabled", 0);
cdrom_drives[0].sound_on = config_get_int(NULL, "cdrom_1_sound_on", 1);
cdrom_drives[0].bus_type = config_get_int(NULL, "cdrom_1_bus_type", 0);
cdrom_drives[0].ide_channel = config_get_int(NULL, "cdrom_1_ide_channel", 2);
cdrom_drives[0].scsi_device_id = config_get_int(NULL, "cdrom_1_scsi_device_id", 2);
atapi_cdrom_channel = config_get_int(NULL, "atapi_cdrom_channel", 2);
p = (char *)config_get_string(NULL, "cdrom_1_iso_path", "");
if (p) strcpy(cdrom_iso[0].iso_path, p);
else strcpy(cdrom_iso[0].iso_path, "");
cdrom_drives[1].host_drive = config_get_int(NULL, "cdrom_2_host_drive", 0);
cdrom_drives[1].prev_host_drive = cdrom_drives[1].host_drive;
cdrom_drives[1].enabled = config_get_int(NULL, "cdrom_2_enabled", 0);
cdrom_drives[1].sound_on = config_get_int(NULL, "cdrom_2_sound_on", 1);
cdrom_drives[1].bus_type = config_get_int(NULL, "cdrom_2_bus_type", 0);
cdrom_drives[1].ide_channel = config_get_int(NULL, "cdrom_2_ide_channel", 3);
cdrom_drives[1].scsi_device_id = config_get_int(NULL, "cdrom_2_scsi_device_id", 3);
p = (char *)config_get_string(NULL, "cdrom_2_iso_path", "");
if (p) strcpy(cdrom_iso[1].iso_path, p);
else strcpy(cdrom_iso[1].iso_path, "");
cdrom_drives[2].host_drive = config_get_int(NULL, "cdrom_3_host_drive", 0);
cdrom_drives[2].prev_host_drive = cdrom_drives[2].host_drive;
cdrom_drives[2].enabled = config_get_int(NULL, "cdrom_3_enabled", 0);
cdrom_drives[2].sound_on = config_get_int(NULL, "cdrom_3_sound_on", 1);
cdrom_drives[2].bus_type = config_get_int(NULL, "cdrom_3_bus_type", 0);
cdrom_drives[2].ide_channel = config_get_int(NULL, "cdrom_3_ide_channel", 4);
cdrom_drives[2].scsi_device_id = config_get_int(NULL, "cdrom_3_scsi_device_id", 4);
p = (char *)config_get_string(NULL, "cdrom_3_iso_path", "");
if (p) strcpy(cdrom_iso[2].iso_path, p);
else strcpy(cdrom_iso[2].iso_path, "");
cdrom_drives[3].host_drive = config_get_int(NULL, "cdrom_4_host_drive", 0);
cdrom_drives[3].prev_host_drive = cdrom_drives[3].host_drive;
cdrom_drives[3].enabled = config_get_int(NULL, "cdrom_4_enabled", 0);
cdrom_drives[3].sound_on = config_get_int(NULL, "cdrom_4_sound_on", 1);
cdrom_drives[3].bus_type = config_get_int(NULL, "cdrom_4_bus_type", 0);
cdrom_drives[3].ide_channel = config_get_int(NULL, "cdrom_4_ide_channel", 5);
cdrom_drives[3].scsi_device_id = config_get_int(NULL, "cdrom_4_scsi_device_id", 5);
p = (char *)config_get_string(NULL, "cdrom_4_iso_path", "");
if (p) strcpy(cdrom_iso[3].iso_path, p);
else strcpy(cdrom_iso[3].iso_path, "");
scsi_cdrom_enabled = config_get_int(NULL, "scsi_cdrom_enabled", 0);
scsi_cdrom_id = config_get_int(NULL, "scsi_cdrom_id", 3);
p = (char *)config_get_string(NULL, "cdrom_path", "");
if (p) strcpy(iso_path, p);
else strcpy(iso_path, "");
vid_resize = config_get_int(NULL, "vid_resize", 0);
vid_api = config_get_int(NULL, "vid_api", 0);
video_fullscreen_scale = config_get_int(NULL, "video_fullscreen_scale", 0);
@@ -881,15 +944,43 @@ void saveconfig()
config_set_string(NULL, "disc_4", discfns[3]);
config_set_int(NULL, "disc_4_writeprot", ui_writeprot[3]);
config_set_int(NULL, "mem_size", mem_size);
config_set_int(NULL, "cdrom_drive", cdrom_drive);
config_set_int(NULL, "cdrom_enabled", cdrom_enabled);
config_set_int(NULL, "atapi_cdrom_channel", atapi_cdrom_channel);
config_set_int(NULL, "scsi_cdrom_enabled", scsi_cdrom_enabled);
config_set_int(NULL, "scsi_cdrom_id", scsi_cdrom_id);
config_set_string(NULL, "cdrom_path", iso_path);
config_set_int(NULL, "cdrom_1_host_drive", cdrom_drives[0].host_drive);
config_set_int(NULL, "cdrom_1_enabled", cdrom_drives[0].enabled);
config_set_int(NULL, "cdrom_1_sound_on", cdrom_drives[0].sound_on);
config_set_int(NULL, "cdrom_1_bus_type", cdrom_drives[0].bus_type);
config_set_int(NULL, "cdrom_1_ide_channel", cdrom_drives[0].ide_channel);
config_set_int(NULL, "cdrom_1_scsi_device_id", cdrom_drives[0].scsi_device_id);
config_set_string(NULL, "cdrom_1_iso_path", cdrom_iso[0].iso_path);
config_set_int(NULL, "cdrom_2_host_drive", cdrom_drives[1].host_drive);
config_set_int(NULL, "cdrom_2_enabled", cdrom_drives[1].enabled);
config_set_int(NULL, "cdrom_2_sound_on", cdrom_drives[1].sound_on);
config_set_int(NULL, "cdrom_2_bus_type", cdrom_drives[1].bus_type);
config_set_int(NULL, "cdrom_2_ide_channel", cdrom_drives[1].ide_channel);
config_set_int(NULL, "cdrom_2_scsi_device_id", cdrom_drives[1].scsi_device_id);
config_set_string(NULL, "cdrom_2_iso_path", cdrom_iso[1].iso_path);
config_set_int(NULL, "cdrom_3_host_drive", cdrom_drives[2].host_drive);
config_set_int(NULL, "cdrom_3_enabled", cdrom_drives[2].enabled);
config_set_int(NULL, "cdrom_3_sound_on", cdrom_drives[2].sound_on);
config_set_int(NULL, "cdrom_3_bus_type", cdrom_drives[2].bus_type);
config_set_int(NULL, "cdrom_3_ide_channel", cdrom_drives[2].ide_channel);
config_set_int(NULL, "cdrom_3_scsi_device_id", cdrom_drives[2].scsi_device_id);
config_set_string(NULL, "cdrom_3_iso_path", cdrom_iso[2].iso_path);
config_set_int(NULL, "cdrom_4_host_drive", cdrom_drives[3].host_drive);
config_set_int(NULL, "cdrom_4_enabled", cdrom_drives[3].enabled);
config_set_int(NULL, "cdrom_4_sound_on", cdrom_drives[3].sound_on);
config_set_int(NULL, "cdrom_4_bus_type", cdrom_drives[3].bus_type);
config_set_int(NULL, "cdrom_4_ide_channel", cdrom_drives[3].ide_channel);
config_set_int(NULL, "cdrom_4_scsi_device_id", cdrom_drives[3].scsi_device_id);
config_set_string(NULL, "cdrom_4_iso_path", cdrom_iso[3].iso_path);
config_set_int(NULL, "vid_resize", vid_resize);
config_set_int(NULL, "vid_api", vid_api);
config_set_int(NULL, "video_fullscreen_scale", video_fullscreen_scale);

185
src/pc.rc
View File

@@ -35,15 +35,172 @@ BEGIN
MENUITEM "E&ject FDD 4", IDM_EJECT_4
MENUITEM SEPARATOR
MENUITEM "&Configure hard discs...",IDM_HDCONF
POPUP "C&D-ROM"
POPUP "C&D-ROM 1"
BEGIN
MENUITEM "&Enabled", IDM_CDROM_ENABLED
MENUITEM "&SCSI", IDM_CDROM_SCSI
MENUITEM "&Enabled", IDM_CDROM_1_ENABLED
MENUITEM "S&ound enabled", IDM_CDROM_1_SOUND_ON
MENUITEM SEPARATOR
MENUITEM "E&mpty",IDM_CDROM_EMPTY
MENUITEM "&Reload previous disc",IDM_CDROM_RELOAD
MENUITEM "&SCSI", IDM_CDROM_1_SCSI
MENUITEM SEPARATOR
MENUITEM "&ISO...",IDM_CDROM_ISO
MENUITEM "E&mpty",IDM_CDROM_1_EMPTY
MENUITEM "&Reload previous disc",IDM_CDROM_1_RELOAD
MENUITEM SEPARATOR
POPUP "&IDE channel..."
BEGIN
MENUITEM "&C:",IDM_CDROM_1_C
MENUITEM "&D:",IDM_CDROM_1_D
MENUITEM "&E:",IDM_CDROM_1_E
MENUITEM "&F:",IDM_CDROM_1_F
MENUITEM "&G:",IDM_CDROM_1_G
MENUITEM "&H:",IDM_CDROM_1_H
MENUITEM "&I:",IDM_CDROM_1_I
MENUITEM "&J:",IDM_CDROM_1_J
END
POPUP "S&CSI ID..."
BEGIN
MENUITEM "&0",IDM_CDROM_1_0
MENUITEM "&1",IDM_CDROM_1_1
MENUITEM "&2",IDM_CDROM_1_2
MENUITEM "&3",IDM_CDROM_1_3
MENUITEM "&4",IDM_CDROM_1_4
MENUITEM "&5",IDM_CDROM_1_5
MENUITEM "&6",IDM_CDROM_1_6
MENUITEM "&8",IDM_CDROM_1_8
MENUITEM "&9",IDM_CDROM_1_9
MENUITEM "10",IDM_CDROM_1_10
MENUITEM "11",IDM_CDROM_1_11
MENUITEM "12",IDM_CDROM_1_12
MENUITEM "13",IDM_CDROM_1_13
MENUITEM "14",IDM_CDROM_1_14
MENUITEM "15",IDM_CDROM_1_15
END
MENUITEM SEPARATOR
MENUITEM "&ISO...",IDM_CDROM_1_ISO
END
POPUP "CD-&ROM 2"
BEGIN
MENUITEM "&Enabled", IDM_CDROM_2_ENABLED
MENUITEM "S&ound enabled", IDM_CDROM_2_SOUND_ON
MENUITEM SEPARATOR
MENUITEM "&SCSI", IDM_CDROM_2_SCSI
MENUITEM SEPARATOR
MENUITEM "E&mpty",IDM_CDROM_2_EMPTY
MENUITEM "&Reload previous disc",IDM_CDROM_2_RELOAD
MENUITEM SEPARATOR
POPUP "&IDE channel..."
BEGIN
MENUITEM "&C:",IDM_CDROM_2_C
MENUITEM "&D:",IDM_CDROM_2_D
MENUITEM "&E:",IDM_CDROM_2_E
MENUITEM "&F:",IDM_CDROM_2_F
MENUITEM "&G:",IDM_CDROM_2_G
MENUITEM "&H:",IDM_CDROM_2_H
MENUITEM "&I:",IDM_CDROM_2_I
MENUITEM "&J:",IDM_CDROM_2_J
END
POPUP "S&CSI ID..."
BEGIN
MENUITEM "&0",IDM_CDROM_2_0
MENUITEM "&1",IDM_CDROM_2_1
MENUITEM "&2",IDM_CDROM_2_2
MENUITEM "&3",IDM_CDROM_2_3
MENUITEM "&4",IDM_CDROM_2_4
MENUITEM "&5",IDM_CDROM_2_5
MENUITEM "&6",IDM_CDROM_2_6
MENUITEM "&8",IDM_CDROM_2_8
MENUITEM "&9",IDM_CDROM_2_9
MENUITEM "10",IDM_CDROM_2_10
MENUITEM "11",IDM_CDROM_2_11
MENUITEM "12",IDM_CDROM_2_12
MENUITEM "13",IDM_CDROM_2_13
MENUITEM "14",IDM_CDROM_2_14
MENUITEM "15",IDM_CDROM_2_15
END
MENUITEM SEPARATOR
MENUITEM "&ISO...",IDM_CDROM_2_ISO
END
POPUP "CD-R&OM 3"
BEGIN
MENUITEM "&Enabled", IDM_CDROM_3_ENABLED
MENUITEM "S&ound enabled", IDM_CDROM_3_SOUND_ON
MENUITEM SEPARATOR
MENUITEM "&SCSI", IDM_CDROM_3_SCSI
MENUITEM SEPARATOR
MENUITEM "E&mpty",IDM_CDROM_3_EMPTY
MENUITEM "&Reload previous disc",IDM_CDROM_3_RELOAD
MENUITEM SEPARATOR
POPUP "&IDE channel..."
BEGIN
MENUITEM "&C:",IDM_CDROM_3_C
MENUITEM "&D:",IDM_CDROM_3_D
MENUITEM "&E:",IDM_CDROM_3_E
MENUITEM "&F:",IDM_CDROM_3_F
MENUITEM "&G:",IDM_CDROM_3_G
MENUITEM "&H:",IDM_CDROM_3_H
MENUITEM "&I:",IDM_CDROM_3_I
MENUITEM "&J:",IDM_CDROM_3_J
END
POPUP "S&CSI ID..."
BEGIN
MENUITEM "&0",IDM_CDROM_3_0
MENUITEM "&1",IDM_CDROM_3_1
MENUITEM "&2",IDM_CDROM_3_2
MENUITEM "&3",IDM_CDROM_3_3
MENUITEM "&4",IDM_CDROM_3_4
MENUITEM "&5",IDM_CDROM_3_5
MENUITEM "&6",IDM_CDROM_3_6
MENUITEM "&8",IDM_CDROM_3_8
MENUITEM "&9",IDM_CDROM_3_9
MENUITEM "10",IDM_CDROM_3_10
MENUITEM "11",IDM_CDROM_3_11
MENUITEM "12",IDM_CDROM_3_12
MENUITEM "13",IDM_CDROM_3_13
MENUITEM "14",IDM_CDROM_3_14
MENUITEM "15",IDM_CDROM_3_15
END
MENUITEM SEPARATOR
MENUITEM "&ISO...",IDM_CDROM_3_ISO
END
POPUP "CD-RO&M 4"
BEGIN
MENUITEM "&Enabled", IDM_CDROM_4_ENABLED
MENUITEM "S&ound enabled", IDM_CDROM_4_SOUND_ON
MENUITEM SEPARATOR
MENUITEM "&SCSI", IDM_CDROM_4_SCSI
MENUITEM "E&mpty",IDM_CDROM_4_EMPTY
MENUITEM "&Reload previous disc",IDM_CDROM_4_RELOAD
MENUITEM SEPARATOR
POPUP "&IDE channel..."
BEGIN
MENUITEM "&C:",IDM_CDROM_4_C
MENUITEM "&D:",IDM_CDROM_4_D
MENUITEM "&E:",IDM_CDROM_4_E
MENUITEM "&F:",IDM_CDROM_4_F
MENUITEM "&G:",IDM_CDROM_4_G
MENUITEM "&H:",IDM_CDROM_4_H
MENUITEM "&I:",IDM_CDROM_4_I
MENUITEM "&J:",IDM_CDROM_4_J
END
POPUP "S&CSI ID..."
BEGIN
MENUITEM "&0",IDM_CDROM_4_0
MENUITEM "&1",IDM_CDROM_4_1
MENUITEM "&2",IDM_CDROM_4_2
MENUITEM "&3",IDM_CDROM_4_3
MENUITEM "&4",IDM_CDROM_4_4
MENUITEM "&5",IDM_CDROM_4_5
MENUITEM "&6",IDM_CDROM_4_6
MENUITEM "&8",IDM_CDROM_4_8
MENUITEM "&9",IDM_CDROM_4_9
MENUITEM "10",IDM_CDROM_4_10
MENUITEM "11",IDM_CDROM_4_11
MENUITEM "12",IDM_CDROM_4_12
MENUITEM "13",IDM_CDROM_4_13
MENUITEM "14",IDM_CDROM_4_14
MENUITEM "15",IDM_CDROM_4_15
END
MENUITEM SEPARATOR
MENUITEM "&ISO...",IDM_CDROM_4_ISO
END
POPUP "E&xtra IDE controllers"
BEGIN
@@ -218,8 +375,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_CFILE,7 + 136, C_BASE, 16, 14
PUSHBUTTON "New",IDC_CNEW,7 + 152, C_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTC, 7 + 176, C_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_CHDD, 7+207, C_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_CCDROM, 7+207, C_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_C_SPT,15,C_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_C_HPC,48,C_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_C_CYL,81,C_BASE+16,28,12, WS_DISABLED
@@ -233,8 +388,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_DFILE,7 + 136, D_BASE, 16, 14
PUSHBUTTON "New",IDC_DNEW,7 + 152, D_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTD, 7 + 176, D_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_DHDD, 7+207, D_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_DCDROM, 7+207, D_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_D_SPT,15,D_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_D_HPC,48,D_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_D_CYL,81,D_BASE+16,28,12, WS_DISABLED
@@ -248,8 +401,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_EFILE,7 + 136, E_BASE, 16, 14
PUSHBUTTON "New",IDC_ENEW,7 + 152, E_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTE, 7 + 176, E_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_EHDD, 7+207, E_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_ECDROM, 7+207, E_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_E_SPT,15,E_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_E_HPC,48,E_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_E_CYL,81,E_BASE+16,28,12, WS_DISABLED
@@ -263,8 +414,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_FFILE,7 + 136, F_BASE, 16, 14
PUSHBUTTON "New",IDC_FNEW,7 + 152, F_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTF, 7 + 176, F_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_FHDD, 7+207, F_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_FCDROM, 7+207, F_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_F_SPT,15,F_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_F_HPC,48,F_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_F_CYL,81,F_BASE+16,28,12, WS_DISABLED
@@ -278,8 +427,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_GFILE,7 + 136, G_BASE, 16, 14
PUSHBUTTON "New",IDC_GNEW,7 + 152, G_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTG, 7 + 176, G_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_GHDD, 7+207, G_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_GCDROM, 7+207, G_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_G_SPT,15,G_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_G_HPC,48,G_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_G_CYL,81,G_BASE+16,28,12, WS_DISABLED
@@ -293,8 +440,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_HFILE,7 + 136, H_BASE, 16, 14
PUSHBUTTON "New",IDC_HNEW,7 + 152, H_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTH, 7 + 176, H_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_HHDD, 7+207, H_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_HCDROM, 7+207, H_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_H_SPT,15,H_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_H_HPC,48,H_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_H_CYL,81,H_BASE+16,28,12, WS_DISABLED
@@ -308,8 +453,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_IFILE,7 + 136, I_BASE, 16, 14
PUSHBUTTON "New",IDC_INEW,7 + 152, I_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTI, 7 + 176, I_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_IHDD, 7+207, I_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_ICDROM, 7+207, I_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_I_SPT,15,I_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_I_HPC,48,I_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_I_CYL,81,I_BASE+16,28,12, WS_DISABLED
@@ -323,8 +466,6 @@ HdConfDlg DIALOGEX 0, 0, 270, DLG_HEIGHT
PUSHBUTTON "...",IDC_JFILE,7 + 136, J_BASE, 16, 14
PUSHBUTTON "New",IDC_JNEW,7 + 152, J_BASE, 24, 14
PUSHBUTTON "Eject", IDC_EJECTJ, 7 + 176, J_BASE, 24, 14
RADIOBUTTON "Hard drive", IDC_JHDD, 7+207, J_BASE, 53, 12 , WS_TABSTOP
RADIOBUTTON "CD-ROM", IDC_JCDROM, 7+207, J_BASE+16, 53, 12 , WS_TABSTOP
EDITTEXT IDC_EDIT_J_SPT,15,J_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_J_HPC,48,J_BASE+16,16,12, WS_DISABLED
EDITTEXT IDC_EDIT_J_CYL,81,J_BASE+16,28,12, WS_DISABLED

View File

@@ -396,21 +396,21 @@ uint8_t piix_bus_master_read(uint16_t port, void *priv)
return 0xff;
}
int piix_bus_master_sector_read(int channel, uint8_t *data)
int piix_bus_master_dma_read(int channel, uint8_t *data, int transfer_length)
{
int transferred = 0;
if (!(piix_busmaster[channel].status & 1))
return 1; /*DMA disabled*/
while (transferred < 512)
while (transferred < transfer_length)
{
if (piix_busmaster[channel].count < (512 - transferred) && piix_busmaster[channel].eot)
fatal("DMA on channel %i - Read count less than 512! Addr %08X Count %04X EOT %i\n", channel, piix_busmaster[channel].addr, piix_busmaster[channel].count, piix_busmaster[channel].eot);
if (piix_busmaster[channel].count < (transfer_length - transferred) && piix_busmaster[channel].eot)
fatal("DMA on channel %i - Read count less than transfer_length! Addr %08X Count %04X EOT %i\n", channel, piix_busmaster[channel].addr, piix_busmaster[channel].count, piix_busmaster[channel].eot);
mem_invalidate_range(piix_busmaster[channel].addr, piix_busmaster[channel].addr+511);
mem_invalidate_range(piix_busmaster[channel].addr, piix_busmaster[channel].addr + transfer_length - 1);
if (piix_busmaster[channel].count < (512 - transferred))
if (piix_busmaster[channel].count < (transfer_length - transferred))
{
// pclog("Transferring smaller - %i bytes\n", piix_busmaster[channel].count);
memcpy(&ram[piix_busmaster[channel].addr], data + transferred, piix_busmaster[channel].count);
@@ -421,11 +421,11 @@ int piix_bus_master_sector_read(int channel, uint8_t *data)
}
else
{
// pclog("Transferring larger - %i bytes\n", 512 - transferred);
memcpy(&ram[piix_busmaster[channel].addr], data + transferred, 512 - transferred);
piix_busmaster[channel].addr += (512 - transferred);
piix_busmaster[channel].count -= (512 - transferred);
transferred += (512 - transferred);
// pclog("Transferring larger - %i bytes\n", transfer_length - transferred);
memcpy(&ram[piix_busmaster[channel].addr], data + transferred, transfer_length - transferred);
piix_busmaster[channel].addr += (transfer_length - transferred);
piix_busmaster[channel].count -= (transfer_length - transferred);
transferred += (transfer_length - transferred);
}
// pclog("DMA on channel %i - Addr %08X Count %04X EOT %i\n", channel, piix_busmaster[channel].addr, piix_busmaster[channel].count, piix_busmaster[channel].eot);
@@ -444,19 +444,20 @@ int piix_bus_master_sector_read(int channel, uint8_t *data)
}
return 0;
}
int piix_bus_master_sector_write(int channel, uint8_t *data)
int piix_bus_master_dma_write(int channel, uint8_t *data, int transfer_length)
{
int transferred = 0;
if (!(piix_busmaster[channel].status & 1))
return 1; /*DMA disabled*/
while (transferred < 512)
while (transferred < transfer_length)
{
if (piix_busmaster[channel].count < (512 - transferred) && piix_busmaster[channel].eot)
fatal("DMA on channel %i - Write count less than 512! Addr %08X Count %04X EOT %i\n", channel, piix_busmaster[channel].addr, piix_busmaster[channel].count, piix_busmaster[channel].eot);
if (piix_busmaster[channel].count < (transfer_length - transferred) && piix_busmaster[channel].eot)
fatal("DMA on channel %i - Write count less than transfer_length! Addr %08X Count %04X EOT %i\n", channel, piix_busmaster[channel].addr, piix_busmaster[channel].count, piix_busmaster[channel].eot);
if (piix_busmaster[channel].count < (512 - transferred))
if (piix_busmaster[channel].count < (transfer_length - transferred))
{
// pclog("Transferring smaller - %i bytes\n", piix_busmaster[channel].count);
memcpy(data + transferred, &ram[piix_busmaster[channel].addr], piix_busmaster[channel].count);
@@ -467,11 +468,11 @@ int piix_bus_master_sector_write(int channel, uint8_t *data)
}
else
{
// pclog("Transferring larger - %i bytes\n", 512 - transferred);
memcpy(data + transferred, &ram[piix_busmaster[channel].addr], 512 - transferred);
piix_busmaster[channel].addr += (512 - transferred);
piix_busmaster[channel].count -= (512 - transferred);
transferred += (512 - transferred);
// pclog("Transferring larger - %i bytes\n", transfer_length - transferred);
memcpy(data + transferred, &ram[piix_busmaster[channel].addr], transfer_length - transferred);
piix_busmaster[channel].addr += (transfer_length - transferred);
piix_busmaster[channel].count -= (transfer_length - transferred);
transferred += (transfer_length - transferred);
}
// pclog("DMA on channel %i - Addr %08X Count %04X EOT %i\n", channel, piix_busmaster[channel].addr, piix_busmaster[channel].count, piix_busmaster[channel].eot);
@@ -620,7 +621,7 @@ void piix_init(int card)
piix_type = 1;
ide_set_bus_master(piix_bus_master_sector_read, piix_bus_master_sector_write, piix_bus_master_set_irq);
ide_set_bus_master(piix_bus_master_dma_read, piix_bus_master_dma_write, piix_bus_master_set_irq);
io_sethandler(0x0cf9, 0x0001, rc_read, NULL, NULL, rc_write, NULL, NULL, NULL);
@@ -641,7 +642,7 @@ void piix3_init(int card)
piix_type = 3;
ide_set_bus_master(piix_bus_master_sector_read, piix_bus_master_sector_write, piix_bus_master_set_irq);
ide_set_bus_master(piix_bus_master_dma_read, piix_bus_master_dma_write, piix_bus_master_set_irq);
io_sethandler(0x0cf9, 0x0001, rc_read, NULL, NULL, rc_write, NULL, NULL, NULL);

View File

@@ -35,44 +35,158 @@
#define IDM_EJECT_4 40082
#define IDM_DISC_3_WP 40083
#define IDM_DISC_4_WP 40084
#define IDM_CDROM_ISO 40100
#define IDM_CDROM_RELOAD 40101
#define IDM_CDROM_EMPTY 40200
#define IDM_CDROM_REAL 40200
#define IDM_CDROM_ENABLED 40300
#define IDM_CDROM_SCSI 40400
#define IDM_IDE_TER_ENABLED 40500
#define IDM_IDE_TER_IRQ9 40501
#define IDM_IDE_TER_IRQ10 40502
#define IDM_IDE_TER_IRQ11 40503
#define IDM_IDE_TER_IRQ12 40504
#define IDM_IDE_TER_IRQ14 40505
#define IDM_IDE_TER_IRQ15 40506
#define IDM_IDE_QUA_ENABLED 40507
#define IDM_IDE_QUA_IRQ9 40508
#define IDM_IDE_QUA_IRQ10 40509
#define IDM_IDE_QUA_IRQ11 40510
#define IDM_IDE_QUA_IRQ12 40511
#define IDM_IDE_QUA_IRQ14 40512
#define IDM_IDE_QUA_IRQ15 40513
#define IDM_SCSI_ENABLED 40600
#define IDM_SCSI_MODEL0 40601
#define IDM_SCSI_MODEL1 40602
#define IDM_SCSI_BASE130 40603
#define IDM_SCSI_BASE134 40604
#define IDM_SCSI_BASE230 40605
#define IDM_SCSI_BASE234 40606
#define IDM_SCSI_BASE330 40607
#define IDM_SCSI_BASE334 40608
#define IDM_SCSI_IRQ9 40609
#define IDM_SCSI_IRQ10 40610
#define IDM_SCSI_IRQ11 40611
#define IDM_SCSI_IRQ12 40612
#define IDM_SCSI_IRQ14 40613
#define IDM_SCSI_IRQ15 40614
#define IDM_SCSI_DMA5 40615
#define IDM_SCSI_DMA6 40616
#define IDM_SCSI_DMA7 40617
#define IDM_CDROM_1_ISO 40100
#define IDM_CDROM_1_RELOAD 40101
#define IDM_CDROM_1_EMPTY 40200
#define IDM_CDROM_1_REAL 40200
#define IDM_CDROM_1_ENABLED 40300
#define IDM_CDROM_1_SOUND_ON 40400
#define IDM_CDROM_1_SCSI 40500
#define IDM_CDROM_1_C 40600
#define IDM_CDROM_1_D 40601
#define IDM_CDROM_1_E 40602
#define IDM_CDROM_1_F 40603
#define IDM_CDROM_1_G 40604
#define IDM_CDROM_1_H 40605
#define IDM_CDROM_1_I 40606
#define IDM_CDROM_1_J 40607
#define IDM_CDROM_1_0 40700
#define IDM_CDROM_1_1 40701
#define IDM_CDROM_1_2 40702
#define IDM_CDROM_1_3 40703
#define IDM_CDROM_1_4 40704
#define IDM_CDROM_1_5 40705
#define IDM_CDROM_1_6 40706
#define IDM_CDROM_1_8 40708
#define IDM_CDROM_1_9 40709
#define IDM_CDROM_1_10 40710
#define IDM_CDROM_1_11 40711
#define IDM_CDROM_1_12 40712
#define IDM_CDROM_1_13 40713
#define IDM_CDROM_1_14 40714
#define IDM_CDROM_1_15 40715
#define IDM_CDROM_2_ISO 41100
#define IDM_CDROM_2_RELOAD 41101
#define IDM_CDROM_2_EMPTY 41200
#define IDM_CDROM_2_REAL 41200
#define IDM_CDROM_2_ENABLED 41300
#define IDM_CDROM_2_SOUND_ON 41400
#define IDM_CDROM_2_SCSI 41500
#define IDM_CDROM_2_C 41600
#define IDM_CDROM_2_D 41601
#define IDM_CDROM_2_E 41602
#define IDM_CDROM_2_F 41603
#define IDM_CDROM_2_G 41604
#define IDM_CDROM_2_H 41605
#define IDM_CDROM_2_I 41606
#define IDM_CDROM_2_J 41607
#define IDM_CDROM_2_0 41700
#define IDM_CDROM_2_1 41701
#define IDM_CDROM_2_2 41702
#define IDM_CDROM_2_3 41703
#define IDM_CDROM_2_4 41704
#define IDM_CDROM_2_5 41705
#define IDM_CDROM_2_6 41706
#define IDM_CDROM_2_8 41708
#define IDM_CDROM_2_9 41709
#define IDM_CDROM_2_10 41710
#define IDM_CDROM_2_11 41711
#define IDM_CDROM_2_12 41712
#define IDM_CDROM_2_13 41713
#define IDM_CDROM_2_14 41714
#define IDM_CDROM_2_15 41715
#define IDM_CDROM_3_ISO 42100
#define IDM_CDROM_3_RELOAD 42101
#define IDM_CDROM_3_EMPTY 42200
#define IDM_CDROM_3_REAL 42200
#define IDM_CDROM_3_ENABLED 42300
#define IDM_CDROM_3_SOUND_ON 42400
#define IDM_CDROM_3_SCSI 42500
#define IDM_CDROM_3_C 42600
#define IDM_CDROM_3_D 42601
#define IDM_CDROM_3_E 42602
#define IDM_CDROM_3_F 42603
#define IDM_CDROM_3_G 42604
#define IDM_CDROM_3_H 42605
#define IDM_CDROM_3_I 42606
#define IDM_CDROM_3_J 42607
#define IDM_CDROM_3_0 42700
#define IDM_CDROM_3_1 42701
#define IDM_CDROM_3_2 42702
#define IDM_CDROM_3_3 42703
#define IDM_CDROM_3_4 42704
#define IDM_CDROM_3_5 42705
#define IDM_CDROM_3_6 42706
#define IDM_CDROM_3_8 42708
#define IDM_CDROM_3_9 42709
#define IDM_CDROM_3_10 42710
#define IDM_CDROM_3_11 42711
#define IDM_CDROM_3_12 42712
#define IDM_CDROM_3_13 42713
#define IDM_CDROM_3_14 42714
#define IDM_CDROM_3_15 42715
#define IDM_CDROM_4_ISO 43100
#define IDM_CDROM_4_RELOAD 43101
#define IDM_CDROM_4_EMPTY 43200
#define IDM_CDROM_4_REAL 43200
#define IDM_CDROM_4_ENABLED 43300
#define IDM_CDROM_4_SOUND_ON 43400
#define IDM_CDROM_4_SCSI 43500
#define IDM_CDROM_4_C 43600
#define IDM_CDROM_4_D 43601
#define IDM_CDROM_4_E 43602
#define IDM_CDROM_4_F 43603
#define IDM_CDROM_4_G 43604
#define IDM_CDROM_4_H 43605
#define IDM_CDROM_4_I 43606
#define IDM_CDROM_4_J 43607
#define IDM_CDROM_4_0 43700
#define IDM_CDROM_4_1 43701
#define IDM_CDROM_4_2 43702
#define IDM_CDROM_4_3 43703
#define IDM_CDROM_4_4 43704
#define IDM_CDROM_4_5 43705
#define IDM_CDROM_4_6 43706
#define IDM_CDROM_4_8 43708
#define IDM_CDROM_4_9 43709
#define IDM_CDROM_4_10 43710
#define IDM_CDROM_4_11 43711
#define IDM_CDROM_4_12 43712
#define IDM_CDROM_4_13 43713
#define IDM_CDROM_4_14 43714
#define IDM_CDROM_4_15 43715
#define IDM_IDE_TER_ENABLED 44000
#define IDM_IDE_TER_IRQ9 44009
#define IDM_IDE_TER_IRQ10 44010
#define IDM_IDE_TER_IRQ11 44011
#define IDM_IDE_TER_IRQ12 44012
#define IDM_IDE_TER_IRQ14 44014
#define IDM_IDE_TER_IRQ15 44015
#define IDM_IDE_QUA_ENABLED 44020
#define IDM_IDE_QUA_IRQ9 44029
#define IDM_IDE_QUA_IRQ10 44030
#define IDM_IDE_QUA_IRQ11 44031
#define IDM_IDE_QUA_IRQ12 44032
#define IDM_IDE_QUA_IRQ14 44033
#define IDM_IDE_QUA_IRQ15 44035
#define IDM_SCSI_ENABLED 45000
#define IDM_SCSI_MODEL0 45100
#define IDM_SCSI_MODEL1 45101
#define IDM_SCSI_BASE130 45200 + 0x130
#define IDM_SCSI_BASE134 45200 + 0x134
#define IDM_SCSI_BASE230 45200 + 0x230
#define IDM_SCSI_BASE234 45200 + 0x234
#define IDM_SCSI_BASE330 45200 + 0x330
#define IDM_SCSI_BASE334 45200 + 0x334
#define IDM_SCSI_IRQ9 45309
#define IDM_SCSI_IRQ10 45310
#define IDM_SCSI_IRQ11 45311
#define IDM_SCSI_IRQ12 45312
#define IDM_SCSI_IRQ14 45314
#define IDM_SCSI_IRQ15 45315
#define IDM_SCSI_DMA5 45405
#define IDM_SCSI_DMA6 45406
#define IDM_SCSI_DMA7 45407
#define IDC_COMBO1 1000
#define IDC_COMBOVID 1001
@@ -113,8 +227,6 @@
#define IDC_EDITC 1050
#define IDC_CFILE 1060
#define IDC_CNEW 1070
#define IDC_CHDD 1080
#define IDC_CCDROM 1090
#define IDC_EDIT_C_SPT 1200
#define IDC_EDIT_C_HPC 1210
#define IDC_EDIT_C_CYL 1220
@@ -125,8 +237,6 @@
#define IDC_EDITD 1051
#define IDC_DFILE 1061
#define IDC_DNEW 1071
#define IDC_DHDD 1081
#define IDC_DCDROM 1091
#define IDC_EDIT_D_SPT 1201
#define IDC_EDIT_D_HPC 1211
#define IDC_EDIT_D_CYL 1221
@@ -137,8 +247,6 @@
#define IDC_EDITE 1052
#define IDC_EFILE 1062
#define IDC_ENEW 1072
#define IDC_EHDD 1082
#define IDC_ECDROM 1092
#define IDC_EDIT_E_SPT 1202
#define IDC_EDIT_E_HPC 1212
#define IDC_EDIT_E_CYL 1222
@@ -149,8 +257,6 @@
#define IDC_EDITF 1053
#define IDC_FFILE 1063
#define IDC_FNEW 1073
#define IDC_FHDD 1083
#define IDC_FCDROM 1093
#define IDC_EDIT_F_SPT 1203
#define IDC_EDIT_F_HPC 1213
#define IDC_EDIT_F_CYL 1223
@@ -161,8 +267,6 @@
#define IDC_EDITG 1054
#define IDC_GFILE 1064
#define IDC_GNEW 1074
#define IDC_GHDD 1084
#define IDC_GCDROM 1094
#define IDC_EDIT_G_SPT 1204
#define IDC_EDIT_G_HPC 1214
#define IDC_EDIT_G_CYL 1224
@@ -173,8 +277,6 @@
#define IDC_EDITH 1055
#define IDC_HFILE 1065
#define IDC_HNEW 1075
#define IDC_HHDD 1085
#define IDC_HCDROM 1095
#define IDC_EDIT_H_SPT 1205
#define IDC_EDIT_H_HPC 1215
#define IDC_EDIT_H_CYL 1225
@@ -185,8 +287,6 @@
#define IDC_EDITI 1056
#define IDC_IFILE 1066
#define IDC_INEW 1076
#define IDC_IHDD 1086
#define IDC_ICDROM 1096
#define IDC_EDIT_I_SPT 1206
#define IDC_EDIT_I_HPC 1216
#define IDC_EDIT_I_CYL 1226
@@ -197,8 +297,6 @@
#define IDC_EDITJ 1057
#define IDC_JFILE 1067
#define IDC_JNEW 1077
#define IDC_JHDD 1087
#define IDC_JCDROM 1097
#define IDC_EDIT_J_SPT 1207
#define IDC_EDIT_J_HPC 1217
#define IDC_EDIT_J_CYL 1227

View File

@@ -13,6 +13,9 @@
#include "timer.h"
uint8_t SCSIPhase = SCSI_PHASE_BUS_FREE;
uint8_t SCSIStatus = SCSI_STATUS_OK;
int SCSICallback[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint8_t scsi_cdrom_id = 3; /*common setting*/
@@ -22,6 +25,7 @@ void SCSIGetLength(uint8_t id, int *datalen)
*datalen = SCSIDevices[id].CmdBufferLength;
}
#if 0
//Execute SCSI command
void SCSIExecCommand(uint8_t id, uint8_t *buffer, uint8_t *cdb)
{
@@ -72,25 +76,22 @@ void SCSIWrite(uint8_t Id, uint8_t *srcbuf, uint8_t *dstbuf, uint32_t len_size)
}
}
/////
#endif
//Initialization function for the SCSI layer
void SCSIReset(uint8_t Id)
{
page_flags[GPMODE_CDROM_AUDIO_PAGE] &= 0xFD; /* Clear changed flag for CDROM AUDIO mode page. */
memset(mode_pages_in[GPMODE_CDROM_AUDIO_PAGE], 0, 256); /* Clear the page itself. */
uint8_t cdrom_id = scsi_cdrom_drives[Id];
SCSICallback[Id]=0;
if (cdrom_enabled && scsi_cdrom_enabled)
if (buslogic_scsi_drive_is_cdrom(Id))
{
SCSICallback[cdrom_id]=0;
cdrom_reset(cdrom_id);
SCSIDevices[Id].LunType = SCSI_CDROM;
}
else
{
SCSIDevices[Id].LunType = SCSI_NONE;
}
page_flags[GPMODE_CDROM_AUDIO_PAGE] &= ~PAGE_CHANGED;
SCSISense.UnitAttention = 0;
}

View File

@@ -12,10 +12,12 @@
/* SCSI Commands */
#define GPCMD_TEST_UNIT_READY 0x00
#define GPCMD_REZERO_UNIT 0x01
#define GPCMD_REQUEST_SENSE 0x03
#define GPCMD_READ_6 0x08
#define GPCMD_SEEK_6 0x0b
#define GPCMD_INQUIRY 0x12
#define GPCMD_VERIFY_6 0x13
#define GPCMD_MODE_SELECT_6 0x15
#define GPCMD_MODE_SENSE_6 0x1a
#define GPCMD_START_STOP_UNIT 0x1b
@@ -23,12 +25,14 @@
#define GPCMD_READ_CDROM_CAPACITY 0x25
#define GPCMD_READ_10 0x28
#define GPCMD_SEEK_10 0x2b
#define GPCMD_VERIFY_10 0x2f
#define GPCMD_READ_SUBCHANNEL 0x42
#define GPCMD_READ_TOC_PMA_ATIP 0x43
#define GPCMD_READ_HEADER 0x44
#define GPCMD_PLAY_AUDIO_10 0x45
#define GPCMD_GET_CONFIGURATION 0x46
#define GPCMD_PLAY_AUDIO_MSF 0x47
#define GPCMD_PLAY_AUDIO_TRACK_INDEX 0x48
#define GPCMD_GET_EVENT_STATUS_NOTIFICATION 0x4a
#define GPCMD_PAUSE_RESUME 0x4b
#define GPCMD_STOP_PLAY_SCAN 0x4e
@@ -39,12 +43,18 @@
#define GPCMD_PLAY_AUDIO_12 0xa5
#define GPCMD_READ_12 0xa8
#define GPCMD_READ_DVD_STRUCTURE 0xad /* For reading. */
#define GPCMD_VERIFY_12 0xaf
#define GPCMD_PLAY_CD_OLD 0xb4
#define GPCMD_READ_CD_OLD 0xb8
#define GPCMD_READ_CD_MSF 0xb9
#define GPCMD_SCAN 0xba
#define GPCMD_SET_SPEED 0xbb
#define GPCMD_PLAY_CD 0xbc
#define GPCMD_MECHANISM_STATUS 0xbd
#define GPCMD_READ_CD 0xbe
#define GPCMD_SEND_DVD_STRUCTURE 0xbf /* This is for writing only, irrelevant to PCem. */
#define GPCMD_SCAN_ALT 0xcd /* Should be equivalent to 0xba */
#define GPCMD_SET_SPEED_ALT 0xda /* Should be equivalent to 0xbb */
/* Mode page codes for mode sense/set */
#define GPMODE_R_W_ERROR_PAGE 0x01
@@ -66,7 +76,9 @@
/* SCSI Additional Sense Codes */
#define ASC_AUDIO_PLAY_OPERATION 0x00
#define ASC_ILLEGAL_OPCODE 0x20
#define ASC_LBA_OUT_OF_RANGE 0x21
#define ASC_INV_FIELD_IN_CMD_PACKET 0x24
#define ASC_INV_FIELD_IN_PARAMETER_LIST 0x26
#define ASC_MEDIUM_MAY_HAVE_CHANGED 0x28
#define ASC_INCOMPATIBLE_FORMAT 0x30
#define ASC_MEDIUM_NOT_PRESENT 0x3a
@@ -79,7 +91,7 @@
/* Tell RISC OS that we have a 4x CD-ROM drive (600kb/sec data, 706kb/sec raw).
Not that it means anything */
#define CDROM_SPEED 706
#define CDROM_SPEED 706 /* 0x2C2 */
/* Some generally useful CD-ROM information */
#define CD_MINS 75 /* max. minutes per CD */
@@ -144,14 +156,15 @@
#define MMC_PROFILE_HDDVD_RW_DL 0x005A
#define MMC_PROFILE_INVALID 0xFFFF
#define SCSI_ONLY 32
#define ATAPI_ONLY 16
#define IMPLEMENTED 8
#define NONDATA 4
#define CHECK_READY 2
#define ALLOW_UA 1
extern uint8_t SCSICommandTable[0x100];
#define IMPLEMENTED 1
extern uint8_t mode_sense_pages[0x40];
extern int readcdmode;
@@ -197,47 +210,6 @@ extern int prev_status;
#define MSFtoLBA(m,s,f) ((((m*60)+s)*75)+f)
typedef struct __attribute__((packed))
{
uint8_t user_data[2048];
uint8_t ecc[288];
} m1_data_t;
typedef struct __attribute__((packed))
{
uint8_t sub_header[8];
uint8_t user_data[2328];
} m2_data_t;
typedef union __attribute__((packed))
{
m1_data_t m1_data;
m2_data_t m2_data;
uint8_t raw_data[2352];
} sector_data_t;
typedef struct __attribute__((packed))
{
uint8_t sync[12];
uint8_t header[4];
sector_data_t data;
uint8_t c2[296];
uint8_t subchannel_raw[96];
uint8_t subchannel_q[16];
uint8_t subchannel_rw[96];
} cdrom_sector_t;
typedef union __attribute__((packed))
{
cdrom_sector_t cdrom_sector;
uint8_t buffer[2856];
} sector_buffer_t;
extern sector_buffer_t cdrom_sector_buffer;
extern int cdrom_sector_type, cdrom_sector_flags;
extern int cdrom_sector_size, cdrom_sector_ismsf;
#define SCSI_PHASE_DATAOUT ( 0 )
#define SCSI_PHASE_DATAIN ( 1 )
#define SCSI_PHASE_COMMAND ( 2 )
@@ -250,7 +222,7 @@ extern int cdrom_sector_size, cdrom_sector_ismsf;
struct
{
uint32_t pos;
uint8_t CmdBuffer[512*512];
uint8_t CmdBuffer[390144];
uint32_t CmdBufferLength;
int LunType;
uint32_t InitLength;
@@ -266,6 +238,10 @@ void SCSICDROM_Insert();
int cdrom_add_error_and_subchannel(uint8_t *b, int real_sector_type);
int cdrom_LBAtoMSF_accurate();
int cdrom_read_data(uint8_t *buffer);
// int cdrom_read_data(uint8_t *buffer);
int mode_select_init(uint8_t command, uint16_t pl_length, uint8_t do_save);
int mode_select_terminate(int force);
int mode_select_write(uint8_t val);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,10 @@
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "cdrom.h"
#include "ibm.h"
#include "device.h"
#include "filters.h"
@@ -89,7 +93,8 @@ int sound_pos_global = 0;
int soundon = 1;
static int16_t cd_buffer[CD_BUFLEN * 2];
static int16_t cd_buffer[CDROM_NUM][CD_BUFLEN * 2];
static float cd_out_buffer[CD_BUFLEN * 2];
static thread_t *sound_cd_thread_h;
static event_t *sound_cd_event;
static unsigned int cd_vol_l, cd_vol_r;
@@ -102,62 +107,81 @@ void sound_set_cd_volume(unsigned int vol_l, unsigned int vol_r)
static void sound_cd_thread(void *param)
{
int i = 0;
while (1)
{
int c;
int c, has_audio;
thread_wait_event(sound_cd_event, -1);
ioctl_audio_callback(cd_buffer, CD_BUFLEN*2);
if (soundon)
{
int32_t audio_vol_l = SCSIGetCDVolume(0);
int32_t audio_vol_r = SCSIGetCDVolume(1);
int channel_select[2];
for (c = 0; c < CD_BUFLEN*2; c += 2)
{
cd_out_buffer[c] = 0;
cd_out_buffer[c+1] = 0;
}
for (i = 0; i < CDROM_NUM; i++)
{
has_audio = 0;
if (cdrom_drives[i].handler->audio_callback)
{
cdrom_drives[i].handler->audio_callback(i, cd_buffer[i], CD_BUFLEN*2);
has_audio = cdrom_drives[i].sound_on;
}
if (soundon && has_audio)
{
int32_t audio_vol_l = cdrom_mode_sense_get_volume(i, 0);
int32_t audio_vol_r = cdrom_mode_sense_get_volume(i, 1);
int channel_select[2];
channel_select[0] = cdrom_mode_sense_get_channel(i, 0);
channel_select[1] = cdrom_mode_sense_get_channel(i, 1);
channel_select[0] = SCSIGetCDChannel(0);
channel_select[1] = SCSIGetCDChannel(1);
for (c = 0; c < CD_BUFLEN*2; c += 2)
{
int32_t cd_buffer_temp[2] = {0, 0};
for (c = 0; c < CD_BUFLEN*2; c += 2)
{
int32_t cd_buffer_temp[2] = {0, 0};
/*First, adjust input from drive according to ATAPI/SCSI volume.*/
cd_buffer[i][c] = ((int32_t)cd_buffer[i][c] * audio_vol_l) / 255;
cd_buffer[i][c+1] = ((int32_t)cd_buffer[i][c+1] * audio_vol_r) / 255;
/*Apply ATAPI channel select*/
if (channel_select[0] & 1)
cd_buffer_temp[0] += cd_buffer[i][c];
if (channel_select[0] & 2)
cd_buffer_temp[1] += cd_buffer[i][c];
if (channel_select[1] & 1)
cd_buffer_temp[0] += cd_buffer[i][c+1];
if (channel_select[1] & 2)
cd_buffer_temp[1] += cd_buffer[i][c+1];
/*First, adjust input from drive according to ATAPI/SCSI volume.*/
cd_buffer[c] = ((int32_t)cd_buffer[c] * audio_vol_l) / 255;
cd_buffer[c+1] = ((int32_t)cd_buffer[c+1] * audio_vol_r) / 255;
/*Apply sound card CD volume*/
cd_buffer_temp[0] = (cd_buffer_temp[0] * (int)cd_vol_l) / 65535;
cd_buffer_temp[1] = (cd_buffer_temp[1] * (int)cd_vol_r) / 65535;
/*Apply ATAPI channel select*/
if (channel_select[0] & 1)
cd_buffer_temp[0] += cd_buffer[c];
if (channel_select[0] & 2)
cd_buffer_temp[1] += cd_buffer[c];
if (channel_select[1] & 1)
cd_buffer_temp[0] += cd_buffer[c+1];
if (channel_select[1] & 2)
cd_buffer_temp[1] += cd_buffer[c+1];
/*Apply sound card CD volume*/
cd_buffer_temp[0] = (cd_buffer_temp[0] * (int)cd_vol_l) / 65535;
cd_buffer_temp[1] = (cd_buffer_temp[1] * (int)cd_vol_r) / 65535;
if (cd_buffer_temp[0] > 32767)
cd_buffer_temp[0] = 32767;
if (cd_buffer_temp[0] < -32768)
cd_buffer_temp[0] = -32768;
if (cd_buffer_temp[1] > 32767)
cd_buffer_temp[1] = 32767;
if (cd_buffer_temp[1] < -32768)
cd_buffer_temp[1] = -32768;
if (cd_buffer_temp[0] > 32767)
cd_buffer_temp[0] = 32767;
if (cd_buffer_temp[0] < -32768)
cd_buffer_temp[0] = -32768;
if (cd_buffer_temp[1] > 32767)
cd_buffer_temp[1] = 32767;
if (cd_buffer_temp[1] < -32768)
cd_buffer_temp[1] = -32768;
cd_buffer[i][c] = cd_buffer_temp[0];
cd_buffer[i][c+1] = cd_buffer_temp[1];
cd_buffer[c] = cd_buffer_temp[0];
cd_buffer[c+1] = cd_buffer_temp[1];
}
cd_out_buffer[c] += ((float) cd_buffer[i][c]) / 32768.0;
cd_out_buffer[c+1] += ((float) cd_buffer[i][c+1]) / 32768.0;
}
givealbuffer_cd(cd_buffer);
}
}
}
givealbuffer_cd(cd_out_buffer);
}
}
static int32_t *outbuffer;
static float *outbuffer_ex;
void sound_init()
{
@@ -165,6 +189,7 @@ void sound_init()
inital();
outbuffer = malloc(SOUNDBUFLEN * 2 * sizeof(int32_t));
outbuffer_ex = malloc(SOUNDBUFLEN * 2 * sizeof(float));
sound_cd_event = thread_create_event();
sound_cd_thread_h = thread_create(sound_cd_thread, NULL);
@@ -205,8 +230,13 @@ void sound_poll(void *priv)
if (!soundf) soundf=fopen("sound.pcm","wb");
fwrite(buf16,(SOUNDBUFLEN)*2*2,1,soundf);*/
for (c = 0; c < SOUNDBUFLEN * 2; c++)
{
outbuffer_ex[c] = ((float) outbuffer[c]) / 32768.0;
}
if (soundon) givealbuffer(outbuffer);
if (soundon) givealbuffer(outbuffer_ex);
thread_set_event(sound_cd_event);
@@ -221,10 +251,20 @@ void sound_speed_changed()
void sound_reset()
{
int i = 0;
timer_add(sound_poll, &sound_poll_time, TIMER_ALWAYS_ENABLED, NULL);
sound_handlers_num = 0;
sound_set_cd_volume(65535, 65535);
ioctl_audio_stop();
for (i = 0; i < CDROM_NUM; i++)
{
pclog("Resetting audio for CD-ROM %i...\n", i);
if (cdrom_drives[i].handler->audio_stop)
{
cdrom_drives[i].handler->audio_stop(i);
}
}
}

View File

@@ -7,6 +7,8 @@
#include "sound.h"
#include "sound_cms.h"
#define MASTER_CLOCK 7159090
typedef struct cms_t
{
int addrs[2];
@@ -37,9 +39,9 @@ void cms_update(cms_t *cms)
{
switch (cms->noisetype[c >> 1][c & 1])
{
case 0: cms->noisefreq[c >> 1][c & 1] = 31250; break;
case 1: cms->noisefreq[c >> 1][c & 1] = 15625; break;
case 2: cms->noisefreq[c >> 1][c & 1] = 7812; break;
case 0: cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK/256; break;
case 1: cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK/512; break;
case 2: cms->noisefreq[c >> 1][c & 1] = MASTER_CLOCK/1024; break;
case 3: cms->noisefreq[c >> 1][c & 1] = cms->freq[c >> 1][(c & 1) * 3]; break;
}
}
@@ -124,14 +126,14 @@ void cms_write(uint16_t addr, uint8_t val, void *p)
case 0x0B: case 0x0C: case 0x0D:
voice = cms->addrs[chip] & 7;
cms->latch[chip][voice] = (cms->latch[chip][voice] & 0x700) | val;
cms->freq[chip][voice] = (15625 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255));
cms->freq[chip][voice] = (MASTER_CLOCK/512 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255));
break;
case 0x10: case 0x11: case 0x12: /*Octave*/
voice = (cms->addrs[chip] & 3) << 1;
cms->latch[chip][voice] = (cms->latch[chip][voice] & 0xFF) | ((val & 7) << 8);
cms->latch[chip][voice + 1] = (cms->latch[chip][voice + 1] & 0xFF) | ((val & 0x70) << 4);
cms->freq[chip][voice] = (15625 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255));
cms->freq[chip][voice + 1] = (15625 << (cms->latch[chip][voice + 1] >> 8)) / (511 - (cms->latch[chip][voice + 1] & 255));
cms->freq[chip][voice] = (MASTER_CLOCK/512 << (cms->latch[chip][voice] >> 8)) / (511 - (cms->latch[chip][voice] & 255));
cms->freq[chip][voice + 1] = (MASTER_CLOCK/512 << (cms->latch[chip][voice + 1] >> 8)) / (511 - (cms->latch[chip][voice + 1] & 255));
break;
case 0x16: /*Noise*/
cms->noisetype[chip][0] = val & 3;

View File

@@ -5,6 +5,7 @@
#ifdef USE_OPENAL
#include <AL/al.h>
#include <AL/alc.h>
#include <AL/alext.h>
#endif
#include "ibm.h"
#include "sound.h"
@@ -84,7 +85,7 @@ void inital()
{
#ifdef USE_OPENAL
int c;
int16_t buf[BUFLEN*2];
float buf[BUFLEN*2];
// printf("1\n");
check();
@@ -118,8 +119,8 @@ void inital()
// printf("5\n");
for (c = 0; c < 4; c++)
{
alBufferData(buffers[c], AL_FORMAT_STEREO16, buf, BUFLEN*2*2, FREQ);
alBufferData(buffers_cd[c], AL_FORMAT_STEREO16, buf, CD_BUFLEN*2*2, CD_FREQ);
alBufferData(buffers[c], AL_FORMAT_STEREO_FLOAT32, buf, BUFLEN*2*sizeof(float), FREQ);
alBufferData(buffers_cd[c], AL_FORMAT_STEREO_FLOAT32, buf, CD_BUFLEN*2*sizeof(float), CD_FREQ);
}
alSourceQueueBuffers(source[0], 4, buffers);
@@ -135,7 +136,7 @@ void inital()
#endif
}
void givealbuffer(int32_t *buf)
void givealbuffer(float *buf)
{
#ifdef USE_OPENAL
int16_t buf16[BUFLEN*2];
@@ -174,7 +175,7 @@ void givealbuffer(int32_t *buf)
// printf("U ");
check();
for (c=0;c<BUFLEN*2;c++)
/* for (c=0;c<BUFLEN*2;c++)
{
if (buf[c] < -32768)
buf16[c] = -32768;
@@ -182,9 +183,9 @@ void givealbuffer(int32_t *buf)
buf16[c] = 32767;
else
buf16[c] = buf[c];
}
} */
// for (c=0;c<BUFLEN*2;c++) buf[c]^=0x8000;
alBufferData(buffer, AL_FORMAT_STEREO16, buf16, BUFLEN*2*2, FREQ);
alBufferData(buffer, AL_FORMAT_STEREO_FLOAT32, buf, BUFLEN*2*sizeof(float), FREQ);
// printf("B ");
check();
@@ -201,7 +202,7 @@ void givealbuffer(int32_t *buf)
#endif
}
void givealbuffer_cd(int16_t *buf)
void givealbuffer_cd(float *buf)
{
#ifdef USE_OPENAL
int processed;
@@ -239,7 +240,7 @@ void givealbuffer_cd(int16_t *buf)
check();
// for (c=0;c<BUFLEN*2;c++) buf[c]^=0x8000;
alBufferData(buffer, AL_FORMAT_STEREO16, buf, CD_BUFLEN*2*2, CD_FREQ);
alBufferData(buffer, AL_FORMAT_STEREO_FLOAT32, buf, CD_BUFLEN*2*sizeof(float), CD_FREQ);
// printf("B ");
check();

View File

@@ -1131,7 +1131,7 @@ static void riva128_puller_exec_method(int chanid, int subchanid, int offset, ui
}
unsigned new_class = (tmp >> 16) & 0x1f;
if(riva128->pgraph.debug[1] & 0x10000 && ((riva128->pgraph.instance >> 4)) != riva128->pgraph.ctx_switch[3] && (new_class == 0x0d || new_class == 0x0e || new_class == 0x14 || new_class == 0x17 || offset == 0x0104)
if((riva128->pgraph.debug[1] & 0x10000) && ((riva128->pgraph.instance >> 4) != riva128->pgraph.ctx_switch[3]) && (new_class == 0x0d || new_class == 0x0e || new_class == 0x14 || new_class == 0x17 || offset == 0x0104))
{
riva128->pgraph.ctx_switch[3] = riva128->pgraph.instance >> 4;
riva128->pgraph.ctx_switch[1] = riva128->pramin[riva128->pgraph.instance + 4] & 0xffff;

View File

@@ -190,6 +190,7 @@ typedef struct texture_t
volatile int refcount, refcount_r[2];
int is16;
uint32_t palette_checksum;
uint32_t addr_start, addr_end;
uint32_t *data;
} texture_t;
@@ -1466,8 +1467,10 @@ static void use_texture(voodoo_t *voodoo, voodoo_params_t *params, int tmu)
else
voodoo->texture_cache[tmu][c].palette_checksum = 0;
addr = voodoo->texture_cache[tmu][c].base + texture_offset[lod_min] * (voodoo->texture_cache[tmu][c].is16 ? 2 : 1);
addr_end = voodoo->texture_cache[tmu][c].base + texture_offset[lod_max+1] * (voodoo->texture_cache[tmu][c].is16 ? 2 : 1);
addr = voodoo->params.tex_base[tmu][lod_min];
addr_end = voodoo->params.tex_base[tmu][lod_max+1];
voodoo->texture_cache[tmu][c].addr_start = addr;
voodoo->texture_cache[tmu][c].addr_end = addr_end;
for (; addr <= addr_end; addr += (1 << TEX_DIRTY_SHIFT))
voodoo->texture_present[tmu][(addr & voodoo->texture_mask) >> TEX_DIRTY_SHIFT] = 1;
@@ -1488,8 +1491,8 @@ static void flush_texture_cache(voodoo_t *voodoo, uint32_t dirty_addr, int tmu)
{
int lod_min = (voodoo->texture_cache[tmu][c].tLOD >> 2) & 15;
int lod_max = (voodoo->texture_cache[tmu][c].tLOD >> 8) & 15;
int addr_start = voodoo->texture_cache[tmu][c].base + texture_offset[lod_min] * (voodoo->texture_cache[tmu][c].is16 ? 2 : 1);
int addr_end = voodoo->texture_cache[tmu][c].base + texture_offset[lod_max+1] * (voodoo->texture_cache[tmu][c].is16 ? 2 : 1);
int addr_start = voodoo->texture_cache[tmu][c].addr_start;
int addr_end = voodoo->texture_cache[tmu][c].addr_end;
if (dirty_addr >= (addr_start & voodoo->texture_mask & ~0x3ff) && dirty_addr < (((addr_end & voodoo->texture_mask) + 0x3ff) & ~0x3ff))
{

View File

@@ -32,11 +32,11 @@ static int settings_network_to_list[20], settings_list_to_network[20];
static int mouse_valid(int type, int model)
{
if (type == MOUSE_TYPE_PS2 && !(models[model].flags & MODEL_PS2))
if ((type & MOUSE_TYPE_IF_MASK) == MOUSE_TYPE_PS2 && !(models[model].flags & MODEL_PS2))
return 0;
if (type == MOUSE_TYPE_AMSTRAD && !(models[model].flags & MODEL_AMSTRAD))
if ((type & MOUSE_TYPE_IF_MASK) == MOUSE_TYPE_AMSTRAD && !(models[model].flags & MODEL_AMSTRAD))
return 0;
if (type == MOUSE_TYPE_OLIM24 && !(models[model].flags & MODEL_OLIM24))
if ((type & MOUSE_TYPE_IF_MASK) == MOUSE_TYPE_OLIM24 && !(models[model].flags & MODEL_OLIM24))
return 0;
return 1;
}

View File

@@ -19,20 +19,6 @@ static uint64_t hd_new_spt, hd_new_hpc, hd_new_cyl;
static int hd_new_hdi;
static int new_cdrom_channel;
static void update_hdd_cdrom(HWND hdlg)
{
HWND h;
int drive_num = 0;
for (drive_num = 0; drive_num < IDE_NUM; drive_num++)
{
h = GetDlgItem(hdlg, IDC_CHDD + drive_num);
SendMessage(h, BM_SETCHECK, (new_cdrom_channel == drive_num) ? 0 : 1, 0);
h = GetDlgItem(hdlg, IDC_CCDROM + drive_num);
SendMessage(h, BM_SETCHECK, (new_cdrom_channel == drive_num) ? 1 : 0, 0);
}
}
int hdnew_no_update = 0;
hard_disk_t hdnew_temp_hd;
@@ -556,16 +542,13 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
hd_changed = 0;
new_cdrom_channel = atapi_cdrom_channel;
update_hdd_cdrom(hdlg);
return TRUE;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDOK:
if (hd_changed || atapi_cdrom_channel != new_cdrom_channel)
if (hd_changed)
{
if (MessageBox(NULL, "This will reset 86Box!\nOkay to continue?", "86Box", MB_OKCANCEL) == IDOK)
{
@@ -586,8 +569,6 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
hdc[drive_num] = hd[drive_num];
}
atapi_cdrom_channel = new_cdrom_channel;
saveconfig();
resetpchard();
@@ -645,31 +626,6 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
drive_num = LOWORD(wParam) % 10;
hdconf_edit_boxes(hdlg, drive_num, &(hd[drive_num]));
return TRUE;
case IDC_CHDD:
case IDC_DHDD:
case IDC_EHDD:
case IDC_FHDD:
case IDC_GHDD:
case IDC_HHDD:
case IDC_IHDD:
case IDC_JHDD:
if (new_cdrom_channel == (LOWORD(wParam) - IDC_CCDROM))
new_cdrom_channel = -1;
update_hdd_cdrom(hdlg);
return TRUE;
case IDC_CCDROM:
case IDC_DCDROM:
case IDC_ECDROM:
case IDC_FCDROM:
case IDC_GCDROM:
case IDC_HCDROM:
case IDC_ICDROM:
case IDC_JCDROM:
new_cdrom_channel = LOWORD(wParam) - IDC_CCDROM;
update_hdd_cdrom(hdlg);
return TRUE;
}
break;

596
src/win.c
View File

@@ -320,23 +320,27 @@ void thread_destroy_event(event_t *_event)
static void initmenu(void)
{
int c;
HMENU m;
int i, c;
HMENU dm, m;
char s[32];
m=GetSubMenu(menu,1); /*Disc*/
m=GetSubMenu(m,17); /*CD-ROM*/
dm=GetSubMenu(menu,1); /*Disc*/
/* Loop through each Windows drive letter and test to see if
it's a CDROM */
for (c='A';c<='Z';c++)
{
sprintf(s,"%c:\\",c);
if (GetDriveType(s)==DRIVE_CDROM)
{
sprintf(s, "Host CD/DVD Drive (%c:)", c);
AppendMenu(m,MF_STRING,IDM_CDROM_REAL+c,s);
}
}
for (i = 0; i < CDROM_NUM; i++)
{
m=GetSubMenu(dm,17+i); /*CD-ROM*/
/* Loop through each Windows drive letter and test to see if
it's a CDROM */
for (c='A';c<='Z';c++)
{
sprintf(s,"%c:\\",c);
if (GetDriveType(s)==DRIVE_CDROM)
{
sprintf(s, "Host CD/DVD Drive (%c:)", c);
AppendMenu(m,MF_STRING,IDM_CDROM_1_REAL+c+(i * 1000),s);
}
}
}
}
void get_executable_name(char *s, int size)
@@ -515,6 +519,28 @@ static void process_command_line()
argv[argc] = NULL;
}
int valid_models[2] = { 0, 1 };
int valid_bases[6] = { 0x130, 0x134, 0x230, 0x234, 0x330, 0x334 };
int valid_irqs[6] = { 9, 10, 11, 12, 14, 15 };
int valid_dma_channels[3] = { 5, 6, 7 };
int valid_ide_channels[8] = { 0, 1, 2, 3, 4, 5, 6, 7 };
int valid_scsi_ids[15] = { 0, 1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15 };
int find_in_array(int *array, int val, int len, int menu_base)
{
int i = 0;
int temp = 0;
for (i = 0; i < len; i++)
{
CheckMenuItem(menu, menu_base + array[i], MF_UNCHECKED);
if (array[i] == val)
{
temp = 1;
}
}
return temp;
}
HANDLE hinstAcc;
int WINAPI WinMain (HINSTANCE hThisInstance,
@@ -526,7 +552,7 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
HWND hwnd; /* This is the handle for our window */
MSG messages; /* Here messages to the application are saved */
WNDCLASSEX wincl; /* Data structure for the windowclass */
int c, d, bRet;
int c, d, e, bRet;
char emulator_title[200];
LARGE_INTEGER qpc_freq;
HACCEL haccel; /* Handle to accelerator table */
@@ -621,210 +647,90 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
// pclog("Checking CD-ROM menu item...\n");
/* Note by Kiririn: I've redone this since the CD-ROM can be disabled but still have something inside it. */
if (cdrom_enabled)
CheckMenuItem(menu, IDM_CDROM_ENABLED, MF_CHECKED);
for (e = 0; e < CDROM_NUM; e++)
{
if (cdrom_drives[e].enabled)
CheckMenuItem(menu, IDM_CDROM_1_ENABLED + (e * 1000), MF_CHECKED);
if (scsi_cdrom_enabled)
CheckMenuItem(menu, IDM_CDROM_SCSI, MF_CHECKED);
if (cdrom_drives[e].sound_on)
CheckMenuItem(menu, IDM_CDROM_1_SOUND_ON + (e * 1000), MF_CHECKED);
if (cdrom_drives[e].bus_type)
CheckMenuItem(menu, IDM_CDROM_1_SCSI + (e * 1000), MF_CHECKED);
if (!find_in_array(valid_ide_channels, cdrom_drives[e].ide_channel, 8, IDM_CDROM_1_C + (e * 1000)))
{
fatal("Tertiary IDE controller: Invalid IRQ\n");
}
CheckMenuItem(menu, IDM_CDROM_1_C + (e * 1000) + cdrom_drives[e].ide_channel, MF_CHECKED);
if (!find_in_array(valid_scsi_ids, cdrom_drives[e].scsi_device_id, 15, IDM_CDROM_1_0 + (e * 1000)))
{
fatal("Tertiary IDE controller: Invalid IRQ\n");
}
CheckMenuItem(menu, IDM_CDROM_1_0 + (e * 1000) + cdrom_drives[e].scsi_device_id, MF_CHECKED);
if (cdrom_drives[e].host_drive == 200)
{
CheckMenuItem(menu, IDM_CDROM_1_ISO + (e * 1000), MF_CHECKED);
}
else
{
CheckMenuItem(menu, IDM_CDROM_1_REAL + (e * 1000) + cdrom_drives[e].host_drive, MF_CHECKED);
}
}
if (ide_enable[2])
CheckMenuItem(menu, IDM_IDE_TER_ENABLED, MF_CHECKED);
CheckMenuItem(menu, IDM_IDE_TER_IRQ9, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_TER_IRQ10, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_TER_IRQ11, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_TER_IRQ12, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_TER_IRQ14, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_TER_IRQ15, MF_UNCHECKED);
if (!find_in_array(valid_irqs, ide_irq[2], 6, IDM_IDE_TER_IRQ9 - 9))
{
fatal("Tertiary IDE controller: Invalid IRQ\n");
}
if (ide_irq[2] == 9)
{
CheckMenuItem(menu, IDM_IDE_TER_IRQ9, MF_CHECKED);
}
else if (ide_irq[2] == 10)
{
CheckMenuItem(menu, IDM_IDE_TER_IRQ10, MF_CHECKED);
}
else if (ide_irq[2] == 11)
{
CheckMenuItem(menu, IDM_IDE_TER_IRQ11, MF_CHECKED);
}
else if (ide_irq[2] == 12)
{
CheckMenuItem(menu, IDM_IDE_TER_IRQ12, MF_CHECKED);
}
else if (ide_irq[2] == 14)
{
CheckMenuItem(menu, IDM_IDE_TER_IRQ14, MF_CHECKED);
}
else if (ide_irq[2] == 15)
{
CheckMenuItem(menu, IDM_IDE_TER_IRQ15, MF_CHECKED);
}
else
{
fatal("Unrecognized tertiary IDE controller IRQ\n");
}
CheckMenuItem(menu, IDM_IDE_TER_IRQ9 - 9 + ide_irq[2], MF_CHECKED);
if (ide_enable[3])
CheckMenuItem(menu, IDM_IDE_QUA_ENABLED, MF_CHECKED);
CheckMenuItem(menu, IDM_IDE_QUA_IRQ9, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_QUA_IRQ10, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_QUA_IRQ11, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_QUA_IRQ12, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_QUA_IRQ14, MF_UNCHECKED);
CheckMenuItem(menu, IDM_IDE_QUA_IRQ15, MF_UNCHECKED);
if (!find_in_array(valid_irqs, ide_irq[3], 6, IDM_IDE_QUA_IRQ9 - 9))
{
fatal("Quaternary IDE controller: Invalid IRQ\n");
}
if (ide_irq[3] == 9)
{
CheckMenuItem(menu, IDM_IDE_QUA_IRQ9, MF_CHECKED);
}
else if (ide_irq[3] == 10)
{
CheckMenuItem(menu, IDM_IDE_QUA_IRQ10, MF_CHECKED);
}
else if (ide_irq[3] == 11)
{
CheckMenuItem(menu, IDM_IDE_QUA_IRQ11, MF_CHECKED);
}
else if (ide_irq[3] == 12)
{
CheckMenuItem(menu, IDM_IDE_QUA_IRQ12, MF_CHECKED);
}
else if (ide_irq[3] == 14)
{
CheckMenuItem(menu, IDM_IDE_QUA_IRQ14, MF_CHECKED);
}
else if (ide_irq[3] == 15)
{
CheckMenuItem(menu, IDM_IDE_QUA_IRQ15, MF_CHECKED);
}
else
{
fatal("Unrecognized quaternary IDE controller IRQ\n");
}
CheckMenuItem(menu, IDM_IDE_QUA_IRQ9 - 9 + ide_irq[3], MF_CHECKED);
if (buslogic_enabled)
CheckMenuItem(menu, IDM_SCSI_ENABLED, MF_CHECKED);
CheckMenuItem(menu, IDM_SCSI_MODEL0, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_MODEL1, MF_UNCHECKED);
if (scsi_model == 0)
if (!find_in_array(valid_models, scsi_model, 2, IDM_SCSI_MODEL0))
{
CheckMenuItem(menu, IDM_SCSI_MODEL0, MF_CHECKED);
}
else if (scsi_model == 1)
{
CheckMenuItem(menu, IDM_SCSI_MODEL1, MF_CHECKED);
}
else
{
fatal("Unrecognized SCSI model\n");
fatal("SCSI controller: Invalid model\n");
}
CheckMenuItem(menu, IDM_SCSI_BASE130, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_BASE134, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_BASE230, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_BASE234, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_BASE330, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_BASE334, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_MODEL0 + scsi_model, MF_CHECKED);
if (scsi_base == 0x130)
if (!find_in_array(valid_bases, scsi_base, 6, IDM_SCSI_BASE130 - 0x130))
{
CheckMenuItem(menu, IDM_SCSI_BASE130, MF_CHECKED);
}
else if (scsi_base == 0x134)
{
CheckMenuItem(menu, IDM_SCSI_BASE134, MF_CHECKED);
}
else if (scsi_base == 0x230)
{
CheckMenuItem(menu, IDM_SCSI_BASE230, MF_CHECKED);
}
else if (scsi_base == 0x234)
{
CheckMenuItem(menu, IDM_SCSI_BASE234, MF_CHECKED);
}
else if (scsi_base == 0x330)
{
CheckMenuItem(menu, IDM_SCSI_BASE330, MF_CHECKED);
}
else if (scsi_base == 0x334)
{
CheckMenuItem(menu, IDM_SCSI_BASE334, MF_CHECKED);
}
else
{
fatal("Unrecognized SCSI base address\n");
fatal("SCSI controller: Invalid base address\n");
}
CheckMenuItem(menu, IDM_SCSI_IRQ9, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_IRQ10, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_IRQ11, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_IRQ12, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_IRQ14, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_IRQ15, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_BASE130 - 0x130 + scsi_base, MF_CHECKED);
if (scsi_irq == 9)
if (!find_in_array(valid_irqs, scsi_irq, 6, IDM_SCSI_IRQ9 - 9))
{
CheckMenuItem(menu, IDM_SCSI_IRQ9, MF_CHECKED);
fatal("SCSI controller: Invalid IRQ\n");
}
else if (scsi_irq == 10)
CheckMenuItem(menu, IDM_SCSI_IRQ9 - 9 + scsi_irq, MF_CHECKED);
if (!find_in_array(valid_dma_channels, scsi_dma, 3, IDM_SCSI_DMA5 - 5))
{
CheckMenuItem(menu, IDM_SCSI_IRQ10, MF_CHECKED);
}
else if (scsi_irq == 11)
{
CheckMenuItem(menu, IDM_SCSI_IRQ11, MF_CHECKED);
}
else if (scsi_irq == 12)
{
CheckMenuItem(menu, IDM_SCSI_IRQ12, MF_CHECKED);
}
else if (scsi_irq == 14)
{
CheckMenuItem(menu, IDM_SCSI_IRQ14, MF_CHECKED);
}
else if (scsi_irq == 15)
{
CheckMenuItem(menu, IDM_SCSI_IRQ15, MF_CHECKED);
}
else
{
fatal("Unrecognized SCSI IRQ\n");
fatal("SCSI controller: Invalid DMA channel\n");
}
CheckMenuItem(menu, IDM_SCSI_DMA5, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_DMA6, MF_UNCHECKED);
CheckMenuItem(menu, IDM_SCSI_DMA7, MF_UNCHECKED);
if (scsi_dma == 5)
{
CheckMenuItem(menu, IDM_SCSI_DMA5, MF_CHECKED);
}
else if (scsi_dma == 6)
{
CheckMenuItem(menu, IDM_SCSI_DMA6, MF_CHECKED);
}
else if (scsi_dma == 7)
{
CheckMenuItem(menu, IDM_SCSI_DMA7, MF_CHECKED);
}
else
{
fatal("Unrecognized SCSI DMA address\n");
}
if (cdrom_drive == 200)
{
CheckMenuItem(menu, IDM_CDROM_ISO, MF_CHECKED);
}
else
{
CheckMenuItem(menu, IDM_CDROM_REAL + cdrom_drive, MF_CHECKED);
}
CheckMenuItem(menu, IDM_SCSI_DMA5 - 5 + scsi_dma, MF_CHECKED);
CheckMenuItem(menu, IDM_VID_FORCE43, force_43 ? MF_CHECKED : MF_UNCHECKED);
CheckMenuItem(menu, IDM_VID_OVERSCAN, enable_overscan ? MF_CHECKED : MF_UNCHECKED);
@@ -1138,18 +1044,18 @@ LRESULT CALLBACK LowLevelKeyboardProc( int nCode, WPARAM wParam, LPARAM lParam )
return CallNextHookEx( hKeyboardHook, nCode, wParam, lParam );
}
void cdrom_close(void)
void cdrom_close(uint8_t id)
{
switch (cdrom_drive)
switch (cdrom_drives[id].host_drive)
{
case 0:
null_close();
null_close(id);
break;
default:
ioctl_close();
ioctl_close(id);
break;
case 200:
iso_close();
iso_close(id);
break;
}
}
@@ -1312,73 +1218,90 @@ void video_toggle_option(HMENU hmenu, int *val, int id)
saveconfig();
}
void win_cdrom_eject()
void win_cdrom_eject(uint8_t id)
{
HMENU hmenu;
hmenu=GetMenu(ghwnd);
if (cdrom_drive == 0)
if (cdrom_drives[id].host_drive == 0)
{
/* Switch from empty to empty. Do nothing. */
return;
}
cdrom->exit();
cdrom_close();
cdrom_null_open(0);
if (cdrom_enabled)
cdrom_drives[id].handler->exit(id);
cdrom_close(id);
cdrom_null_open(id, 0);
if (cdrom_drives[id].enabled)
{
/* Signal disc change to the emulated machine. */
SCSICDROM_Insert();
cdrom_insert(id);
}
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_UNCHECKED);
old_cdrom_drive = cdrom_drive;
cdrom_drive=0;
CheckMenuItem(hmenu, IDM_CDROM_EMPTY, MF_CHECKED);
CheckMenuItem(hmenu, IDM_CDROM_1_REAL + (id * 1000) + cdrom_drive, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_1_ISO + (id * 1000), MF_UNCHECKED);
cdrom_drives[id].prev_host_drive = cdrom_drives[id].host_drive;
cdrom_drives[id].host_drive=0;
CheckMenuItem(hmenu, IDM_CDROM_1_EMPTY + (id * 1000), MF_CHECKED);
saveconfig();
}
void win_cdrom_reload()
void win_cdrom_reload(uint8_t id)
{
HMENU hmenu;
hmenu=GetMenu(ghwnd);
int new_cdrom_drive;
if ((cdrom_drive == old_cdrom_drive) || (old_cdrom_drive == 0) || (cdrom_drive != 0))
if ((cdrom_drives[id].host_drive == cdrom_drives[id].prev_host_drive) || (cdrom_drives[id].prev_host_drive == 0) || (cdrom_drives[id].host_drive != 0))
{
/* Switch from empty to empty. Do nothing. */
return;
}
if (old_cdrom_drive == 200)
cdrom_close(id);
if (cdrom_drives[id].prev_host_drive == 200)
{
iso_open(iso_path);
if (cdrom_enabled)
iso_open(id, cdrom_iso[id].iso_path);
if (cdrom_drives[id].enabled)
{
/* Signal disc change to the emulated machine. */
SCSICDROM_Insert();
cdrom_insert(id);
}
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_UNCHECKED);
// CheckMenuItem(hmenu, IDM_CDROM_DISABLED, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_UNCHECKED);
cdrom_drive = 200;
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_CHECKED);
CheckMenuItem(hmenu, IDM_CDROM_1_EMPTY + (id * 1000), MF_UNCHECKED);
cdrom_drives[id].host_drive = 200;
CheckMenuItem(hmenu, IDM_CDROM_1_ISO + (id * 1000), MF_CHECKED);
saveconfig();
}
else
{
new_cdrom_drive = old_cdrom_drive;
ioctl_open(new_cdrom_drive);
if (cdrom_enabled)
new_cdrom_drive = cdrom_drives[id].prev_host_drive;
ioctl_open(id, new_cdrom_drive);
if (cdrom_drives[id].enabled)
{
/* Signal disc change to the emulated machine. */
SCSICDROM_Insert();
cdrom_insert(id);
}
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_1_EMPTY + (id * 1000), MF_UNCHECKED);
cdrom_drive = new_cdrom_drive;
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_CHECKED);
CheckMenuItem(hmenu, IDM_CDROM_1_REAL + (id * 1000) + cdrom_drives[id].host_drive, MF_CHECKED);
saveconfig();
}
}
int convert_cdrom_id(int original_id)
{
int i = 0;
if (original_id >= (CDROM_NUM * 1000))
{
return 0;
}
for (i = 0; i < CDROM_NUM; i++)
{
if (original_id == (i * 1000))
{
return i;
}
}
return 0;
}
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HMENU hmenu;
@@ -1386,6 +1309,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
uint32_t ri_size = 0;
char temp_iso_path[1024];
int new_cdrom_drive;
int cdrom_id = 0;
int menu_sub_param = 0;
// pclog("Message %i %08X\n",message,message);
switch (message)
{
@@ -1598,61 +1523,88 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
pause = 0;
break;
#if 0
case IDM_CDROM_DISABLED:
if (cdrom_enabled)
{
if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK)
break;
}
if (!cdrom_enabled)
{
/* Switching from disabled to disabled. Do nothing. */
break;
}
cdrom->exit();
cdrom_close();
cdrom_null_open(0);
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_DISABLED, MF_CHECKED);
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_UNCHECKED);
old_cdrom_drive = cdrom_drive;
cdrom_drive=0;
CheckMenuItem(hmenu, IDM_CDROM_EMPTY, MF_UNCHECKED);
if (cdrom_enabled)
{
pause = 1;
Sleep(100);
cdrom_enabled = 0;
saveconfig();
resetpchard();
pause = 0;
}
break;
#endif
case IDM_CDROM_ENABLED:
case IDM_CDROM_1_ENABLED:
case IDM_CDROM_2_ENABLED:
case IDM_CDROM_3_ENABLED:
case IDM_CDROM_4_ENABLED:
cdrom_id = convert_cdrom_id(LOWORD(wParam) - IDM_CDROM_1_ENABLED);
if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK)
{
break;
}
pause = 1;
Sleep(100);
cdrom_enabled ^= 1;
CheckMenuItem(hmenu, IDM_CDROM_ENABLED, cdrom_enabled ? MF_CHECKED : MF_UNCHECKED);
cdrom_drives[cdrom_id].enabled ^= 1;
CheckMenuItem(hmenu, IDM_CDROM_1_ENABLED + (cdrom_id * 1000), cdrom_drives[cdrom_id].enabled ? MF_CHECKED : MF_UNCHECKED);
saveconfig();
resetpchard();
pause = 0;
break;
case IDM_CDROM_SCSI:
case IDM_CDROM_1_SOUND_ON:
case IDM_CDROM_2_SOUND_ON:
case IDM_CDROM_3_SOUND_ON:
case IDM_CDROM_4_SOUND_ON:
cdrom_id = convert_cdrom_id(LOWORD(wParam) - IDM_CDROM_1_SOUND_ON);
Sleep(100);
cdrom_drives[cdrom_id].sound_on ^= 1;
CheckMenuItem(hmenu, IDM_CDROM_1_SOUND_ON + (cdrom_id * 1000), cdrom_drives[cdrom_id].enabled ? MF_CHECKED : MF_UNCHECKED);
saveconfig();
break;
case IDM_CDROM_1_SCSI:
case IDM_CDROM_2_SCSI:
case IDM_CDROM_3_SCSI:
case IDM_CDROM_4_SCSI:
cdrom_id = convert_cdrom_id(LOWORD(wParam) - IDM_CDROM_1_SCSI);
if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK)
{
break;
}
pause = 1;
Sleep(100);
scsi_cdrom_enabled ^= 1;
CheckMenuItem(hmenu, IDM_CDROM_SCSI, scsi_cdrom_enabled ? MF_CHECKED : MF_UNCHECKED);
cdrom_drives[cdrom_id].bus_type ^= 1;
CheckMenuItem(hmenu, IDM_CDROM_1_SCSI + (cdrom_id * 1000), cdrom_drives[cdrom_id].bus_type ? MF_CHECKED : MF_UNCHECKED);
saveconfig();
resetpchard();
pause = 0;
break;
case IDM_CDROM_1_C ... IDM_CDROM_1_H:
case IDM_CDROM_2_C ... IDM_CDROM_2_H:
case IDM_CDROM_3_C ... IDM_CDROM_3_H:
case IDM_CDROM_4_C ... IDM_CDROM_4_H:
menu_sub_param = LOWORD(wParam) % 100;
cdrom_id = convert_cdrom_id(LOWORD(wParam) - menu_sub_param - IDM_CDROM_1_C);
if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK)
{
break;
}
pause = 1;
Sleep(100);
CheckMenuItem(hmenu, IDM_CDROM_1_C + (cdrom_id * 1000) + cdrom_drives[cdrom_id].ide_channel, MF_UNCHECKED);
cdrom_drives[cdrom_id].ide_channel = menu_sub_param;
CheckMenuItem(hmenu, IDM_CDROM_1_C + (cdrom_id * 1000) + cdrom_drives[cdrom_id].ide_channel, MF_CHECKED);
saveconfig();
resetpchard();
pause = 0;
break;
case IDM_CDROM_1_0 ... IDM_CDROM_1_15:
case IDM_CDROM_2_0 ... IDM_CDROM_2_15:
case IDM_CDROM_3_0 ... IDM_CDROM_3_15:
case IDM_CDROM_4_0 ... IDM_CDROM_4_15:
menu_sub_param = LOWORD(wParam) % 100;
cdrom_id = convert_cdrom_id(LOWORD(wParam) - menu_sub_param - IDM_CDROM_1_0);
if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK)
{
break;
}
pause = 1;
Sleep(100);
CheckMenuItem(hmenu, IDM_CDROM_1_0 + (cdrom_id * 1000) + cdrom_drives[cdrom_id].scsi_device_id, MF_UNCHECKED);
cdrom_drives[cdrom_id].scsi_device_id = menu_sub_param;
CheckMenuItem(hmenu, IDM_CDROM_1_0 + (cdrom_id * 1000) + cdrom_drives[cdrom_id].scsi_device_id, MF_CHECKED);
saveconfig();
resetpchard();
pause = 0;
@@ -1816,7 +1768,13 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
scsi_set_dma(hmenu, 7, IDM_SCSI_DMA7);
break;
case IDM_CDROM_EMPTY:
case IDM_CDROM_1_EMPTY:
case IDM_CDROM_2_EMPTY:
case IDM_CDROM_3_EMPTY:
case IDM_CDROM_4_EMPTY:
cdrom_id = convert_cdrom_id(LOWORD(wParam) - IDM_CDROM_1_EMPTY);
win_cdrom_eject(cdrom_id);
#if 0
if (cdrom_drive == 0)
{
/* Switch from empty to empty. Do nothing. */
@@ -1836,93 +1794,79 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
cdrom_drive=0;
CheckMenuItem(hmenu, IDM_CDROM_EMPTY, MF_CHECKED);
saveconfig();
#endif
break;
case IDM_CDROM_RELOAD:
win_cdrom_reload();
case IDM_CDROM_1_RELOAD:
case IDM_CDROM_2_RELOAD:
case IDM_CDROM_3_RELOAD:
case IDM_CDROM_4_RELOAD:
cdrom_id = convert_cdrom_id(LOWORD(wParam) - IDM_CDROM_1_RELOAD);
win_cdrom_reload(cdrom_id);
break;
case IDM_CDROM_ISO:
if (!getfile(hwnd,"CD-ROM image (*.ISO)\0*.ISO\0All files (*.*)\0*.*\0",iso_path))
case IDM_CDROM_1_ISO:
case IDM_CDROM_2_ISO:
case IDM_CDROM_3_ISO:
case IDM_CDROM_4_ISO:
cdrom_id = convert_cdrom_id(LOWORD(wParam) - IDM_CDROM_1_ISO);
if (!getfile(hwnd,"CD-ROM image (*.ISO)\0*.ISO\0All files (*.*)\0*.*\0",cdrom_iso[cdrom_id].iso_path))
{
/* if (!cdrom_enabled)
{
if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK)
break;
} */
old_cdrom_drive = cdrom_drive;
cdrom_drives[cdrom_id].prev_host_drive = cdrom_drives[cdrom_id].host_drive;
strcpy(temp_iso_path, openfilestring);
// if ((strcmp(iso_path, temp_iso_path) == 0) && (cdrom_drive == 200) && cdrom_enabled)
if ((strcmp(iso_path, temp_iso_path) == 0) && (cdrom_drive == 200))
if ((strcmp(cdrom_iso[cdrom_id].iso_path, temp_iso_path) == 0) && (cdrom_drives[cdrom_id].host_drive == 200))
{
/* Switching from ISO to the same ISO. Do nothing. */
break;
}
cdrom->exit();
cdrom_close();
iso_open(temp_iso_path);
if (cdrom_enabled)
cdrom_drives[cdrom_id].handler->exit(cdrom_id);
cdrom_close(cdrom_id);
iso_open(cdrom_id, temp_iso_path);
if (cdrom_drives[cdrom_id].enabled)
{
/* Signal disc change to the emulated machine. */
SCSICDROM_Insert();
cdrom_insert(cdrom_id);
}
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_UNCHECKED);
// CheckMenuItem(hmenu, IDM_CDROM_DISABLED, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_UNCHECKED);
cdrom_drive = 200;
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_CHECKED);
CheckMenuItem(hmenu, IDM_CDROM_1_EMPTY + (cdrom_id * 1000), MF_UNCHECKED);
if ((cdrom_drives[cdrom_id].host_drive != 0) && (cdrom_drives[cdrom_id].host_drive != 200))
{
CheckMenuItem(hmenu, IDM_CDROM_1_REAL + (cdrom_id * 1000) + cdrom_drives[cdrom_id].host_drive, MF_UNCHECKED);
}
cdrom_drives[cdrom_id].host_drive = 200;
CheckMenuItem(hmenu, IDM_CDROM_1_ISO + (cdrom_id * 1000), MF_CHECKED);
saveconfig();
/* if (!cdrom_enabled)
{
pause = 1;
Sleep(100);
cdrom_enabled = 1;
saveconfig();
resetpchard();
pause = 0;
} */
}
break;
default:
if (LOWORD(wParam)>IDM_CDROM_REAL && LOWORD(wParam)<(IDM_CDROM_REAL+100))
menu_sub_param = LOWORD(wParam) % 100;
cdrom_id = convert_cdrom_id(LOWORD(wParam) - menu_sub_param - IDM_CDROM_1_REAL);
if ((LOWORD(wParam) > IDM_CDROM_1_REAL + (cdrom_id * 1000)) && (LOWORD(wParam) < (IDM_CDROM_1_REAL + (cdrom_id * 1000) + 100)))
{
/* if (!cdrom_enabled)
{
if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK)
break;
} */
new_cdrom_drive = LOWORD(wParam)-IDM_CDROM_REAL;
// if ((cdrom_drive == new_cdrom_drive) && cdrom_enabled)
if (cdrom_drive == new_cdrom_drive)
new_cdrom_drive = menu_sub_param;
if (cdrom_drives[cdrom_id].host_drive == new_cdrom_drive)
{
/* Switching to the same drive. Do nothing. */
break;
}
old_cdrom_drive = cdrom_drive;
cdrom->exit();
cdrom_close();
ioctl_open(new_cdrom_drive);
if (cdrom_enabled)
cdrom_drives[cdrom_id].prev_host_drive = cdrom_drives[cdrom_id].host_drive;
cdrom_drives[cdrom_id].handler->exit(cdrom_id);
cdrom_close(cdrom_id);
ioctl_open(cdrom_id, new_cdrom_drive);
if (cdrom_drives[cdrom_id].enabled)
{
/* Signal disc change to the emulated machine. */
SCSICDROM_Insert();
cdrom_insert(cdrom_id);
}
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_UNCHECKED);
// CheckMenuItem(hmenu, IDM_CDROM_DISABLED, MF_UNCHECKED);
CheckMenuItem(hmenu, IDM_CDROM_ISO, MF_UNCHECKED);
cdrom_drive = new_cdrom_drive;
CheckMenuItem(hmenu, IDM_CDROM_REAL + cdrom_drive, MF_CHECKED);
CheckMenuItem(hmenu, IDM_CDROM_1_EMPTY + (cdrom_id * 1000), MF_UNCHECKED);
if ((cdrom_drives[cdrom_id].host_drive != 0) && (cdrom_drives[cdrom_id].host_drive != 200))
{
CheckMenuItem(hmenu, IDM_CDROM_1_REAL + (cdrom_id * 1000) + cdrom_drives[cdrom_id].host_drive, MF_UNCHECKED);
}
CheckMenuItem(hmenu, IDM_CDROM_1_ISO + (cdrom_id * 1000), MF_UNCHECKED);
cdrom_drives[cdrom_id].host_drive = new_cdrom_drive;
CheckMenuItem(hmenu, IDM_CDROM_1_REAL + (cdrom_id * 1000) + cdrom_drives[cdrom_id].host_drive, MF_CHECKED);
saveconfig();
/* if (!cdrom_enabled)
{
pause = 1;
Sleep(100);
cdrom_enabled = 1;
saveconfig();
resetpchard();
pause = 0;
} */
}
break;
}

View File

@@ -301,6 +301,13 @@ static int opFXSAVESTOR_a16(uint32_t fetchdat)
cpu_state.eaaddr = old_eaaddr;
cpu_state.npxc = 0x37F;
cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00);
cpu_state.npxs = 0;
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
cpu_state.TOP = 0;
cpu_state.ismmx = 0;
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
if(cpu_state.abrt) pclog("FXSAVE: abrt != 0\n");
@@ -477,6 +484,13 @@ static int opFXSAVESTOR_a32(uint32_t fetchdat)
cpu_state.eaaddr = old_eaaddr;
cpu_state.npxc = 0x37F;
cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00);
cpu_state.npxs = 0;
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
cpu_state.TOP = 0;
cpu_state.ismmx = 0;
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
if(cpu_state.abrt) pclog("FXSAVE: abrt != 0\n");

View File

@@ -41,7 +41,7 @@ static inline void x87_set_mmx()
static inline void x87_emms()
{
*cpu_state.tag = 0x0303030303030303ll;
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
cpu_state.ismmx = 0;
}

View File

@@ -36,6 +36,7 @@ static int opFINIT(uint32_t fetchdat)
cpu_state.npxs = 0;
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
cpu_state.TOP = 0;
cpu_state.ismmx = 0;
CLOCK_CYCLES(17);
return 0;
}
@@ -282,6 +283,14 @@ static int FSAVE()
}
break;
}
cpu_state.npxc = 0x37F;
cpu_state.new_npxc = (cpu_state.old_npxc & ~0xc00);
cpu_state.npxs = 0;
*(uint64_t *)cpu_state.tag = 0x0303030303030303ll;
cpu_state.TOP = 0;
cpu_state.ismmx = 0;
CLOCK_CYCLES((cr0 & 1) ? 56 : 67);
return cpu_state.abrt;
}