mirror of
https://github.com/86Box/86Box.git
synced 2026-02-23 01:48:21 -07:00
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:
@@ -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 \
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
269
src/buslogic.c
269
src/buslogic.c
@@ -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);
|
||||
|
||||
|
||||
1155
src/cdrom-ioctl.c
1155
src/cdrom-ioctl.c
File diff suppressed because it is too large
Load Diff
@@ -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 */
|
||||
|
||||
414
src/cdrom-iso.c
414
src/cdrom-iso.c
@@ -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
|
||||
};
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
2867
src/cdrom.c
Normal file
File diff suppressed because it is too large
Load Diff
219
src/cdrom.h
219
src/cdrom.h
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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]));
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
128
src/disc_86f.c
128
src/disc_86f.c
@@ -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()
|
||||
|
||||
29
src/dma.c
29
src/dma.c
@@ -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
125
src/fdc.c
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
41
src/ide.h
41
src/ide.h
@@ -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__
|
||||
|
||||
27
src/model.c
27
src/model.c
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
239
src/pc.c
@@ -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
185
src/pc.rc
@@ -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
|
||||
|
||||
47
src/piix.c
47
src/piix.c
@@ -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);
|
||||
|
||||
|
||||
206
src/resources.h
206
src/resources.h
@@ -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
|
||||
|
||||
19
src/scsi.c
19
src/scsi.c
@@ -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;
|
||||
}
|
||||
|
||||
68
src/scsi.h
68
src/scsi.h
@@ -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
|
||||
1677
src/scsi_cdrom.c
1677
src/scsi_cdrom.c
File diff suppressed because it is too large
Load Diff
130
src/sound.c
130
src/sound.c
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
596
src/win.c
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user