Merge pull request #57 from TC1995/master

Renamed Adaptec 154x adapter source to Buslogic as now it emulates th…
This commit is contained in:
OBattler
2016-12-23 17:17:32 +01:00
committed by GitHub
15 changed files with 2824 additions and 2831 deletions

View File

@@ -4,13 +4,13 @@ CC = gcc.exe
WINDRES = windres.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 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 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 aha154x.o ali1429.o amstrad.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-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 \ 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 \ 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 \ 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 \ 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 \ 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 scattergather.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 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 \
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_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 \ 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 \ soundopenal.o tandy_eeprom.o tandy_rom.o timer.o um8669f.o vid_ati_eeprom.o vid_ati_mach64.o vid_ati18800.o \

View File

@@ -4,13 +4,13 @@ CC = gcc.exe
WINDRES = windres.exe 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 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 DFLAGS = -O3 -fomit-frame-pointer -msse2
OBJ = 386.o 386_dynarec.o 386_dynarec_ops.o 808x.o acer386sx.o acerm3a.o aha154x.o ali1429.o amstrad.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-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 \ 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 \ 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 \ 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 \ 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 \ 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 scattergather.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 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 \
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_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 \ 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 \ soundopenal.o tandy_eeprom.o tandy_rom.o timer.o um8669f.o vid_ati_eeprom.o vid_ati_mach64.o vid_ati18800.o \

File diff suppressed because it is too large Load Diff

View File

@@ -1 +0,0 @@
extern void AdaptecInit();

1573
src/buslogic.c Normal file

File diff suppressed because it is too large Load Diff

1
src/buslogic.h Normal file
View File

@@ -0,0 +1 @@
extern device_t BuslogicDevice;

View File

@@ -565,9 +565,9 @@ int dma_channel_write(int channel, uint16_t val)
return 0; return 0;
} }
static size_t PageLengthReadWrite(uint32_t PhysAddress, size_t TotalSize) static uint32_t PageLengthReadWrite(uint32_t PhysAddress, uint32_t TotalSize)
{ {
size_t LengthSize; uint32_t LengthSize;
uint32_t Page; uint32_t Page;
Page = PhysAddress & 4095; Page = PhysAddress & 4095;
@@ -579,20 +579,20 @@ static size_t PageLengthReadWrite(uint32_t PhysAddress, size_t TotalSize)
} }
//DMA Bus Master Page Read/Write //DMA Bus Master Page Read/Write
void DMAPageRead(uint32_t PhysAddress, void *DataRead, size_t TotalSize) void DMAPageRead(uint32_t PhysAddress, void *DataRead, uint32_t TotalSize)
{ {
uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize); uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize);
memcpy(DataRead, &ram[PhysAddress], PageLen); memcpy(DataRead, &ram[PhysAddress], PageLen);
DataRead -= PageLen; DataRead -= PageLen;
PageLen -= TotalSize; TotalSize += PageLen;
} }
void DMAPageWrite(uint32_t PhysAddress, const void *DataWrite, size_t TotalSize) void DMAPageWrite(uint32_t PhysAddress, const void *DataWrite, uint32_t TotalSize)
{ {
uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize); uint32_t PageLen = PageLengthReadWrite(PhysAddress, TotalSize);
memcpy(&ram[PhysAddress], DataWrite, PageLen); memcpy(&ram[PhysAddress], DataWrite, PageLen);
DataWrite -= PageLen; DataWrite -= PageLen;
PageLen -= TotalSize; TotalSize += PageLen;
} }
int dma_mode(int channel) int dma_mode(int channel)

View File

@@ -19,5 +19,5 @@ void writedma2(uint8_t temp);
int dma_channel_read(int channel); int dma_channel_read(int channel);
int dma_channel_write(int channel, uint16_t val); int dma_channel_write(int channel, uint16_t val);
void DMAPageRead(uint32_t PhysAddress, void *DataRead, size_t TotalSize); void DMAPageRead(uint32_t PhysAddress, void *DataRead, uint32_t TotalSize);
void DMAPageWrite(uint32_t PhysAddress, const void *DataWrite, size_t TotalSize); void DMAPageWrite(uint32_t PhysAddress, const void *DataWrite, uint32_t TotalSize);

View File

@@ -345,7 +345,7 @@ int driveempty[4];
#define PCJR (romset == ROM_IBMPCJR) #define PCJR (romset == ROM_IBMPCJR)
#define AMIBIOS (romset==ROM_AMI386SX || romset==ROM_AMI486 || romset == ROM_WIN486) #define AMIBIOS (romset==ROM_AMI386SX || romset==ROM_AMI486 || romset == ROM_WIN486)
int GAMEBLASTER, GUS, SSI2001, voodoo_enabled, aha154x_enabled; int GAMEBLASTER, GUS, SSI2001, voodoo_enabled, buslogic_enabled;
extern int AMSTRAD, AT, is286, is386, PCI, TANDY; extern int AMSTRAD, AT, is286, is386, PCI, TANDY;
enum enum

368
src/ide.c
View File

@@ -125,7 +125,6 @@ typedef struct IDE
int spt,hpc; int spt,hpc;
int tracks; int tracks;
int packetstatus; int packetstatus;
int cdpos,cdlen;
uint8_t asc; uint8_t asc;
int reset; int reset;
FILE *hdfile; FILE *hdfile;
@@ -167,49 +166,6 @@ int ide_ter_enabled = 0;
uint8_t getstat(IDE *ide) { return ide->atastat; } uint8_t getstat(IDE *ide) { return ide->atastat; }
#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;
sector_buffer_t cdrom_sector_buffer;
int cdrom_sector_type, cdrom_sector_flags;
int cdrom_sector_size, cdrom_sector_ismsf;
int image_is_hdi(const char *s) int image_is_hdi(const char *s)
{ {
int i, len; int i, len;
@@ -1907,266 +1863,6 @@ static void atapi_sense_clear(int command, int ignore_ua)
} }
} }
static int cdrom_add_error_and_subchannel(uint8_t *b, int real_sector_type)
{
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;
}
else if ((cdrom_sector_flags & 0x06) == 0x06)
{
// pclog("Invalid error flags\n");
return 0;
}
/* if (real_sector_type == 1)
{ */
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;
}
else if (((cdrom_sector_flags & 0x700) == 0x300) || ((cdrom_sector_flags & 0x700) > 0x400))
{
// pclog("Invalid subchannel data flags\n");
return 0;
}
// }
// pclog("CD-ROM sector size after processing: %i (%i, %i) [%04X]\n", cdrom_sector_size, cdrom_sector_type, real_sector_type, cdrom_sector_flags);
return cdrom_sector_size;
}
static int cdrom_LBAtoMSF_accurate(IDE *ide)
{
int temp_pos;
int m, s, f;
temp_pos = ide->cdpos + 150;
f = temp_pos % 75;
temp_pos -= f;
temp_pos /= 75;
s = temp_pos % 60;
temp_pos -= s;
temp_pos /= 60;
m = temp_pos;
return ((m << 16) | (s << 8) | f);
}
static int cdrom_read_data(IDE *ide, uint8_t *buffer)
{
int real_sector_type;
uint8_t *b;
uint8_t *temp_b;
int is_audio;
int real_pos;
b = temp_b = buffer;
if (cdrom_sector_ismsf)
{
real_pos = cdrom_LBAtoMSF_accurate(ide);
}
else
{
real_pos = ide->cdpos;
}
memset(cdrom_sector_buffer.buffer, 0, 2856);
// is_audio = cdrom->is_track_audio(real_pos, cdrom_sector_ismsf);
real_sector_type = cdrom->sector_data_type(real_pos, cdrom_sector_ismsf);
// pclog("Sector type: %i\n", real_sector_type);
if ((cdrom_sector_type > 0) && (cdrom_sector_type < 6))
{
if (real_sector_type != cdrom_sector_type)
{
return 0;
}
}
else if (cdrom_sector_type == 6)
{
/* READ (6), READ (10), READ (12) */
if ((real_sector_type != 2) && (real_sector_type != 4))
{
return 0;
}
}
if (!(cdrom_sector_flags & 0xf0)) /* 0x00 and 0x08 are illegal modes */
{
return 0;
}
cdrom->readsector_raw(cdrom_sector_buffer.buffer, real_pos, cdrom_sector_ismsf);
if (real_sector_type == 1)
{
memcpy(b, cdrom_sector_buffer.buffer, 2352);
cdrom_sector_size = 2352;
}
else
{
if ((cdrom_sector_flags & 0x18) == 0x08) /* EDC/ECC without user data is an illegal mode */
{
return 0;
}
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;
}
if (real_sector_type == 2)
{
/* 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;
}
}
else if (real_sector_type == 3)
{
/* Mode 2 sector, non-XA mode. */
if (cdrom_sector_flags & 0x40) /* Sub-header */
{
if (!(cdrom_sector_flags & 0x10)) /* No user data */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.sub_header, 8);
cdrom_sector_size += 8;
temp_b += 8;
}
}
if (cdrom_sector_flags & 0x10) /* User data */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.sub_header, 2328);
cdrom_sector_size += 8;
temp_b += 8;
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.user_data, 2328);
cdrom_sector_size += 2328;
temp_b += 2328;
}
}
else if (real_sector_type == 4)
{
/* Mode 2 sector, XA Form 1 mode */
if ((cdrom_sector_flags & 0xf0) == 0x30)
{
return 0;
}
if (((cdrom_sector_flags & 0xf8) >= 0xa8) && ((cdrom_sector_flags & 0xf8) <= 0xd8))
{
return 0;
}
if (cdrom_sector_flags & 0x40) /* Sub-header */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.sub_header, 8);
cdrom_sector_size += 8;
temp_b += 8;
}
if (cdrom_sector_flags & 0x10) /* User data */
{
if ((cdrom_sector_flags & 0xf0) == 0x10)
{
/* The data is alone, include sub-header. */
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.sub_header, 8);
cdrom_sector_size += 8;
temp_b += 8;
}
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.user_data, 2040);
cdrom_sector_size += 2040;
temp_b += 2040;
}
if (cdrom_sector_flags & 0x08) /* EDC/ECC */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.user_data + 2040, 288);
cdrom_sector_size += 288;
temp_b += 288;
}
}
else if (real_sector_type == 5)
{
/* Mode 2 sector, XA Form 2 mode */
if ((cdrom_sector_flags & 0xf0) == 0x30)
{
return 0;
}
if (((cdrom_sector_flags & 0xf8) >= 0xa8) || ((cdrom_sector_flags & 0xf8) <= 0xd8))
{
return 0;
}
/* Mode 2 sector, XA Form 1 mode */
if (cdrom_sector_flags & 0x40) /* Sub-header */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.sub_header, 8);
cdrom_sector_size += 8;
temp_b += 8;
}
if (cdrom_sector_flags & 0x10) /* User data */
{
memcpy(temp_b, cdrom_sector_buffer.cdrom_sector.data.m2_data.user_data, 2328);
cdrom_sector_size += 2328;
temp_b += 2328;
}
}
else
{
return 0;
}
}
// pclog("CD-ROM sector size: %i (%i, %i) [%04X]\n", cdrom_sector_size, cdrom_sector_type, real_sector_type, cdrom_sector_flags);
return cdrom_add_error_and_subchannel(b, real_sector_type);
}
static void atapicommand(int ide_board) static void atapicommand(int ide_board)
{ {
IDE *ide = &ide_drives[cur_ide[ide_board]]; IDE *ide = &ide_drives[cur_ide[ide_board]];
@@ -2202,7 +1898,7 @@ static void atapicommand(int ide_board)
#endif #endif
msf=idebufferb[1]&2; msf=idebufferb[1]&2;
ide->cdlen=0; SectorLen=0;
if (cdrom->medium_changed()) if (cdrom->medium_changed())
{ {
@@ -2412,18 +2108,18 @@ static void atapicommand(int ide_board)
// pclog("Read CD : start LBA %02X%02X%02X%02X Length %02X%02X%02X Flags %02X\n",idebufferb[2],idebufferb[3],idebufferb[4],idebufferb[5],idebufferb[6],idebufferb[7],idebufferb[8],idebufferb[9]); // pclog("Read CD : start LBA %02X%02X%02X%02X Length %02X%02X%02X Flags %02X\n",idebufferb[2],idebufferb[3],idebufferb[4],idebufferb[5],idebufferb[6],idebufferb[7],idebufferb[8],idebufferb[9]);
if (idebufferb[0] == GPCMD_READ_CD_MSF) if (idebufferb[0] == GPCMD_READ_CD_MSF)
{ {
ide->cdpos=MSFtoLBA(idebufferb[3],idebufferb[4],idebufferb[5]); SectorLBA=MSFtoLBA(idebufferb[3],idebufferb[4],idebufferb[5]);
ide->cdlen=MSFtoLBA(idebufferb[6],idebufferb[7],idebufferb[8]); SectorLen=MSFtoLBA(idebufferb[6],idebufferb[7],idebufferb[8]);
ide->cdlen -= ide->cdpos; SectorLen -= SectorLBA;
ide->cdlen++; SectorLen++;
cdrom_sector_ismsf = 1; cdrom_sector_ismsf = 1;
} }
else else
{ {
ide->cdlen=(idebufferb[6]<<16)|(idebufferb[7]<<8)|idebufferb[8]; SectorLen=(idebufferb[6]<<16)|(idebufferb[7]<<8)|idebufferb[8];
ide->cdpos=(idebufferb[2]<<24)|(idebufferb[3]<<16)|(idebufferb[4]<<8)|idebufferb[5]; SectorLBA=(idebufferb[2]<<24)|(idebufferb[3]<<16)|(idebufferb[4]<<8)|idebufferb[5];
cdrom_sector_ismsf = 0; cdrom_sector_ismsf = 0;
} }
@@ -2431,7 +2127,7 @@ static void atapicommand(int ide_board)
cdrom_sector_type = (idebufferb[1] >> 2) & 7; cdrom_sector_type = (idebufferb[1] >> 2) & 7;
cdrom_sector_flags = idebufferb[9] || (((uint32_t) idebufferb[10]) << 8); cdrom_sector_flags = idebufferb[9] || (((uint32_t) idebufferb[10]) << 8);
if (ide->cdpos > (cdrom->size() - 1)) if (SectorLBA > (cdrom->size() - 1))
{ {
pclog("Trying to read beyond the end of disc\n"); pclog("Trying to read beyond the end of disc\n");
ide->atastat = READY_STAT | ERR_STAT; /*CHECK CONDITION*/ ide->atastat = READY_STAT | ERR_STAT; /*CHECK CONDITION*/
@@ -2446,7 +2142,7 @@ static void atapicommand(int ide_board)
break; break;
} }
ret = cdrom_read_data(ide, idebufferb); ret = cdrom_read_data(idebufferb);
if (!ret) if (!ret)
{ {
@@ -2466,9 +2162,9 @@ static void atapicommand(int ide_board)
readflash=1; readflash=1;
#endif #endif
ide->cdpos++; SectorLBA++;
ide->cdlen--; SectorLen--;
if (ide->cdlen >= 0) if (SectorLen >= 0)
ide->packetstatus = ATAPI_STATUS_READCD; ide->packetstatus = ATAPI_STATUS_READCD;
else else
ide->packetstatus = ATAPI_STATUS_DATA; ide->packetstatus = ATAPI_STATUS_DATA;
@@ -2487,21 +2183,21 @@ static void atapicommand(int ide_board)
if (idebufferb[0] == GPCMD_READ_6) if (idebufferb[0] == GPCMD_READ_6)
{ {
ide->cdlen=idebufferb[4]; SectorLen=idebufferb[4];
ide->cdpos=((((uint32_t) idebufferb[1]) & 0x1f)<<16)|(((uint32_t) idebufferb[2])<<8)|((uint32_t) idebufferb[3]); SectorLBA=((((uint32_t) idebufferb[1]) & 0x1f)<<16)|(((uint32_t) idebufferb[2])<<8)|((uint32_t) idebufferb[3]);
} }
else if (idebufferb[0] == GPCMD_READ_10) else if (idebufferb[0] == GPCMD_READ_10)
{ {
ide->cdlen=(idebufferb[7]<<8)|idebufferb[8]; SectorLen=(idebufferb[7]<<8)|idebufferb[8];
ide->cdpos=(idebufferb[2]<<24)|(idebufferb[3]<<16)|(idebufferb[4]<<8)|idebufferb[5]; SectorLBA=(idebufferb[2]<<24)|(idebufferb[3]<<16)|(idebufferb[4]<<8)|idebufferb[5];
} }
else else
{ {
ide->cdlen=(((uint32_t) idebufferb[6])<<24)|(((uint32_t) idebufferb[7])<<16)|(((uint32_t) idebufferb[8])<<8)|((uint32_t) idebufferb[9]); SectorLen=(((uint32_t) idebufferb[6])<<24)|(((uint32_t) idebufferb[7])<<16)|(((uint32_t) idebufferb[8])<<8)|((uint32_t) idebufferb[9]);
ide->cdpos=(((uint32_t) idebufferb[2])<<24)|(((uint32_t) idebufferb[3])<<16)|(((uint32_t) idebufferb[4])<<8)|((uint32_t) idebufferb[5]); SectorLBA=(((uint32_t) idebufferb[2])<<24)|(((uint32_t) idebufferb[3])<<16)|(((uint32_t) idebufferb[4])<<8)|((uint32_t) idebufferb[5]);
} }
if (ide->cdpos > (cdrom->size() - 1)) if (SectorLBA > (cdrom->size() - 1))
{ {
pclog("Trying to read beyond the end of disc\n"); pclog("Trying to read beyond the end of disc\n");
ide->atastat = READY_STAT | ERR_STAT; /*CHECK CONDITION*/ ide->atastat = READY_STAT | ERR_STAT; /*CHECK CONDITION*/
@@ -2516,7 +2212,7 @@ static void atapicommand(int ide_board)
break; break;
} }
if (!ide->cdlen) if (!SectorLen)
{ {
// pclog("All done - callback set\n"); // pclog("All done - callback set\n");
ide->packetstatus = ATAPI_STATUS_COMPLETE; ide->packetstatus = ATAPI_STATUS_COMPLETE;
@@ -2527,7 +2223,7 @@ static void atapicommand(int ide_board)
cdrom_sector_type = 6; cdrom_sector_type = 6;
cdrom_sector_flags = 0x10; cdrom_sector_flags = 0x10;
ret = cdrom_read_data(ide, idebufferb); ret = cdrom_read_data(idebufferb);
if (!ret) if (!ret)
{ {
@@ -2544,9 +2240,9 @@ static void atapicommand(int ide_board)
#ifndef RPCEMU_IDE #ifndef RPCEMU_IDE
readflash=1; readflash=1;
#endif #endif
ide->cdpos++; SectorLBA++;
ide->cdlen--; SectorLen--;
if (ide->cdlen >= 0) if (SectorLen >= 0)
ide->packetstatus = ATAPI_STATUS_READCD; ide->packetstatus = ATAPI_STATUS_READCD;
else else
ide->packetstatus = ATAPI_STATUS_DATA; ide->packetstatus = ATAPI_STATUS_DATA;
@@ -2564,15 +2260,15 @@ static void atapicommand(int ide_board)
} }
else else
{ {
ide->cdlen=(idebufferb[7]<<8)|idebufferb[8]; SectorLen=(idebufferb[7]<<8)|idebufferb[8];
ide->cdpos=(idebufferb[2]<<24)|(idebufferb[3]<<16)|(idebufferb[4]<<8)|idebufferb[5]; SectorLBA=(idebufferb[2]<<24)|(idebufferb[3]<<16)|(idebufferb[4]<<8)|idebufferb[5];
if (msf) if (msf)
{ {
real_pos = cdrom_LBAtoMSF_accurate(ide); real_pos = cdrom_LBAtoMSF_accurate(ide);
} }
else else
{ {
real_pos = ide->cdpos; real_pos = SectorLBA;
} }
idebufferb[4] = (real_pos >> 24); idebufferb[4] = (real_pos >> 24);
idebufferb[5] = ((real_pos >> 16) & 0xff); idebufferb[5] = ((real_pos >> 16) & 0xff);
@@ -3200,24 +2896,24 @@ static void callreadcd(IDE *ide)
int ret; int ret;
ide_irq_lower(ide); ide_irq_lower(ide);
if (ide->cdlen<=0) if (SectorLen<=0)
{ {
// pclog("All done - callback set\n"); // pclog("All done - callback set\n");
ide->packetstatus = ATAPI_STATUS_COMPLETE; ide->packetstatus = ATAPI_STATUS_COMPLETE;
idecallback[ide->board]=20*IDE_TIME; idecallback[ide->board]=20*IDE_TIME;
return; return;
} }
// pclog("Continue readcd! %i blocks left\n",ide->cdlen); // pclog("Continue readcd! %i blocks left\n",SectorLen);
ide->atastat = BUSY_STAT; ide->atastat = BUSY_STAT;
ret = cdrom_read_data(ide, (uint8_t *) ide->buffer); ret = cdrom_read_data((uint8_t *) ide->buffer);
#ifndef RPCEMU_IDE #ifndef RPCEMU_IDE
readflash=1; readflash=1;
#endif #endif
ide->cdpos++; SectorLBA++;
ide->cdlen--; SectorLen--;
ide->packetstatus = ATAPI_STATUS_READCD; ide->packetstatus = ATAPI_STATUS_READCD;
ide->cylinder=cdrom_sector_size; ide->cylinder=cdrom_sector_size;
ide->secount=2; ide->secount=2;

View File

@@ -23,7 +23,7 @@
#include "fdd.h" #include "fdd.h"
#include "gameport.h" #include "gameport.h"
#include "sound_gus.h" #include "sound_gus.h"
#include "aha154x.h" #include "buslogic.h"
#include "cdrom.h" #include "cdrom.h"
#include "scsi.h" #include "scsi.h"
#include "ide.h" #include "ide.h"
@@ -292,10 +292,10 @@ void initpc(int argc, char *argv[])
loadnvr(); loadnvr();
sound_init(); sound_init();
resetide(); resetide();
if (aha154x_enabled) if (buslogic_enabled)
{ {
SCSIReset(&ScsiDrives[scsi_cdrom_id], scsi_cdrom_id); SCSIReset(scsi_cdrom_id);
AdaptecInit(scsi_cdrom_id); device_add(&BuslogicDevice);
} }
if ((cdrom_drive == -1) || (cdrom_drive == 0)) if ((cdrom_drive == -1) || (cdrom_drive == 0))
@@ -419,10 +419,10 @@ void resetpchard()
resetide(); resetide();
if (aha154x_enabled) if (buslogic_enabled)
{ {
SCSIReset(&ScsiDrives[scsi_cdrom_id], scsi_cdrom_id); SCSIReset(scsi_cdrom_id);
AdaptecInit(scsi_cdrom_id); device_add(&BuslogicDevice);
} }
loadnvr(); loadnvr();
@@ -626,7 +626,7 @@ void loadconfig(char *fn)
GUS = config_get_int(NULL, "gus", 0); GUS = config_get_int(NULL, "gus", 0);
SSI2001 = config_get_int(NULL, "ssi2001", 0); SSI2001 = config_get_int(NULL, "ssi2001", 0);
voodoo_enabled = config_get_int(NULL, "voodoo", 0); voodoo_enabled = config_get_int(NULL, "voodoo", 0);
aha154x_enabled = config_get_int(NULL, "aha154x", 0); buslogic_enabled = config_get_int(NULL, "buslogic", 0);
scsi_base = config_get_int(NULL, "scsi_base", 0x330); scsi_base = config_get_int(NULL, "scsi_base", 0x330);
scsi_irq = config_get_int(NULL, "scsi_irq", 11); scsi_irq = config_get_int(NULL, "scsi_irq", 11);
@@ -814,7 +814,7 @@ void saveconfig()
config_set_int(NULL, "gus", GUS); config_set_int(NULL, "gus", GUS);
config_set_int(NULL, "ssi2001", SSI2001); config_set_int(NULL, "ssi2001", SSI2001);
config_set_int(NULL, "voodoo", voodoo_enabled); config_set_int(NULL, "voodoo", voodoo_enabled);
config_set_int(NULL, "aha154x", aha154x_enabled); config_set_int(NULL, "buslogic", buslogic_enabled);
config_set_int(NULL, "scsi_base", scsi_base); config_set_int(NULL, "scsi_base", scsi_base);
config_set_int(NULL, "scsi_irq", scsi_irq); config_set_int(NULL, "scsi_irq", scsi_irq);

View File

@@ -1,4 +1,4 @@
/* Copyright holders: SA1988 /* Copyright holders: SA1988, Tenshi
see COPYING for more details see COPYING for more details
*/ */
/*SCSI layer emulation*/ /*SCSI layer emulation*/
@@ -11,98 +11,101 @@
#include "cdrom.h" #include "cdrom.h"
#include "scsi.h" #include "scsi.h"
int ScsiCallback[7] = {0,0,0,0,0,0,0}; #include "timer.h"
int SCSICallback[7] = {0,0,0,0,0,0,0};
uint8_t scsi_cdrom_id = 3; /*common setting*/ uint8_t scsi_cdrom_id = 3; /*common setting*/
void SCSIQueryResidual(SCSI *Scsi, uint32_t *Residual) //Get the transfer length of the command
void SCSIGetLength(uint8_t id, int *datalen)
{ {
*Residual = ScsiStatus == SCSI_STATUS_OK ? 0 : Scsi->SegmentData.Length; *datalen = SCSIDevices[id].CmdBufferLength;
} }
static uint32_t SCSICopyFromBuffer(uint32_t OffDst, SGBUF *SegmentBuffer, //Execute SCSI command
uint32_t Copy) void SCSIExecCommand(uint8_t id, uint8_t *cdb)
{ {
const SGSEG *SegmentArray = SegmentBuffer->SegmentPtr; SCSICDROM_Command(id, cdb);
unsigned SegmentNum = SegmentBuffer->SegmentNum;
uint32_t Copied = 0;
SGBUF SegmentBuffer2;
SegmentBufferInit(&SegmentBuffer2, SegmentArray, SegmentNum);
SegmentBufferAdvance(&SegmentBuffer2, OffDst);
Copied = SegmentBufferCopy(&SegmentBuffer2, SegmentBuffer, Copy);
return Copied;
} }
static uint32_t SCSICopyToBuffer(uint32_t OffSrc, SGBUF *SegmentBuffer, //Read pending data from the resulting SCSI command
uint32_t Copy) void SCSIReadData(uint8_t id, uint8_t *cdb, uint8_t *data, int datalen)
{ {
const SGSEG *SegmentArray = SegmentBuffer->SegmentPtr; SCSICDROM_ReadData(id, cdb, data, datalen);
unsigned SegmentNum = SegmentBuffer->SegmentNum;
uint32_t Copied = 0;
SGBUF SegmentBuffer2;
SegmentBufferInit(&SegmentBuffer2, SegmentArray, SegmentNum);
SegmentBufferAdvance(&SegmentBuffer2, OffSrc);
Copied = SegmentBufferCopy(&SegmentBuffer2, SegmentBuffer, Copy);
return Copied;
} }
void SCSIWriteTransfer(SCSI *Scsi, uint8_t Id) //Write pending data to the resulting SCSI command
void SCSIWriteData(uint8_t id, uint8_t *cdb, uint8_t *data, int datalen)
{ {
if ((Scsi->BufferPosition >= prefix_len + 4) && (page_flags[page_current] & PAGE_CHANGEABLE)) SCSICDROM_WriteData(id, cdb, data, datalen);
}
/////
void SCSIDMAResetPosition(uint8_t Id)
{
//Reset position in memory after reaching the
SCSIDevices[Id].pos = 0;
}
//Read data from buffer with given position in buffer memory
void SCSIRead(uint8_t Id, uint32_t len_size)
{
if (!len_size) //If there's no data, don't try to do anything.
return;
int c;
for (c = 0; c <= len_size; c++) //Count as many bytes as the length of the buffer is requested
{ {
mode_pages_in[page_current][Scsi->BufferPosition - prefix_len - 4] = Scsi->SegmentData.Address[Scsi->BufferPosition - 2]; memcpy(SCSIDevices[Id].CmdBuffer, SCSIDevices[Id].CmdBuffer + SCSIDevices[Id].pos, len_size);
mode_pages_in[page_current][Scsi->BufferPosition - prefix_len - 3] = Scsi->SegmentData.Address[Scsi->BufferPosition - 1]; SCSIDevices[Id].pos = c;
//pclog("SCSI Read: position at %i\n", SCSIDevices[Id].pos);
} }
SGBUF SegmentBuffer;
SCSICopyToBuffer(Scsi->SegmentData.Length, &SegmentBuffer, 1);
pfnIoRequestCopyToBuffer(0, &SegmentBuffer, Scsi->SegmentData.Length);
} }
void SCSIReadTransfer(SCSI *Scsi, uint8_t Id) //Write data to buffer with given position in buffer memory
void SCSIWrite(uint8_t Id, uint32_t len_size)
{ {
SCSICDROM_ReadCallback(Scsi, Id); if (!len_size) //If there's no data, don't try to do anything.
return;
SGBUF SegmentBuffer; int c;
SCSICopyFromBuffer(Scsi->SegmentData.Length, &SegmentBuffer, 1);
pfnIoRequestCopyFromBuffer(0, &SegmentBuffer, Scsi->SegmentData.Length); for (c = 0; c <= len_size; c++) //Count as many bytes as the length of the buffer is requested
{
memcpy(SCSIDevices[Id].CmdBuffer + SCSIDevices[Id].pos, SCSIDevices[Id].CmdBuffer, len_size);
SCSIDevices[Id].pos = c;
//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];
}
//pclog("SCSI Write: position at %i\n", SCSIDevices[Id].pos);
}
} }
/////
void SCSISendCommand(SCSI *Scsi, uint8_t Id, uint8_t *Cdb, uint8_t CdbLength, uint32_t DataBufferLength, uint8_t *SenseBufferPointer, uint8_t SenseBufferLength) //Initialization function for the SCSI layer
{ void SCSIReset(uint8_t Id)
uint32_t i;
for (i = 0; i < CdbLength; i++)
pclog("Cdb[%d]=0x%02X\n", i, Cdb[i]);
Scsi->CdbLength = CdbLength;
pclog("SCSI CD-ROM in ID %d\n", Id);
SCSICDROM_RunCommand(Scsi, Id, Cdb, SenseBufferLength, SenseBufferPointer, DataBufferLength);
}
void SCSIReset(SCSI *Scsi, uint8_t Id)
{ {
page_flags[GPMODE_CDROM_AUDIO_PAGE] &= 0xFD; /* Clear changed flag for CDROM AUDIO mode page. */ 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. */ memset(mode_pages_in[GPMODE_CDROM_AUDIO_PAGE], 0, 256); /* Clear the page itself. */
if (scsi_cdrom_enabled) if (cdrom_enabled && scsi_cdrom_enabled)
{ {
if (cdrom_enabled) SCSICallback[Id]=0;
{ SCSIDevices[Id].LunType = SCSI_CDROM;
Scsi->LunType = SCSI_CDROM;
}
} }
else else
{ {
Scsi->LunType = SCSI_NONE; SCSIDevices[Id].LunType = SCSI_NONE;
} }
pfnIoRequestCopyFromBuffer = SCSICopyFromBuffer;
pfnIoRequestCopyToBuffer = SCSICopyToBuffer;
page_flags[GPMODE_CDROM_AUDIO_PAGE] &= ~PAGE_CHANGED; page_flags[GPMODE_CDROM_AUDIO_PAGE] &= ~PAGE_CHANGED;
SCSISense.UnitAttention = 0;
} }

View File

@@ -4,7 +4,11 @@
#ifndef __SCSI_H__ #ifndef __SCSI_H__
#define __SCSI_H__ #define __SCSI_H__
#include "scattergather.h" //#include "scattergather.h"
#include "timer.h"
#define SCSI_TIME (5 * 100 * (1 << TIMER_SHIFT))
/* SCSI Commands */ /* SCSI Commands */
#define GPCMD_TEST_UNIT_READY 0x00 #define GPCMD_TEST_UNIT_READY 0x00
@@ -138,6 +142,8 @@
#define MMC_PROFILE_HDDVD_RW_DL 0x005A #define MMC_PROFILE_HDDVD_RW_DL 0x005A
#define MMC_PROFILE_INVALID 0xFFFF #define MMC_PROFILE_INVALID 0xFFFF
#define WRITEDATA 0x10
#define READDATA 8
#define NONDATA 4 #define NONDATA 4
#define CHECK_READY 2 #define CHECK_READY 2
#define ALLOW_UA 1 #define ALLOW_UA 1
@@ -162,8 +168,12 @@ extern uint8_t page_current;
uint32_t DataLength; uint32_t DataLength;
uint32_t DataPointer; uint32_t DataPointer;
extern uint8_t ScsiStatus; int SectorLBA;
extern int ScsiCallback[7]; int SectorLen;
extern uint8_t SCSIStatus;
extern uint8_t SCSIPhase;
extern int SCSICallback[7];
extern uint8_t scsi_cdrom_id; extern uint8_t scsi_cdrom_id;
struct struct
@@ -181,52 +191,81 @@ extern int prev_status;
#define SCSI_HDD 1 /*not present yet*/ #define SCSI_HDD 1 /*not present yet*/
#define SCSI_CDROM 2 #define SCSI_CDROM 2
// extern sector_buffer_t cdrom_sector_buffer; #define MSFtoLBA(m,s,f) ((((m*60)+s)*75)+f)
// extern int cdrom_sector_type, cdrom_sector_flags; typedef struct __attribute__((packed))
// extern int cdrom_sector_size, cdrom_sector_ismsf;
typedef struct SCSI
{ {
uint8_t Cdb[32]; uint8_t user_data[2048];
uint8_t CdbLength; uint8_t ecc[288];
SGBUF SegmentBuffer; } m1_data_t;
int SectorLen;
int SectorLba; typedef struct __attribute__((packed))
int BufferLength; {
int BufferPosition; uint8_t sub_header[8];
SGSEG SegmentData; 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 )
#define SCSI_PHASE_STATUS ( 3 )
#define SCSI_PHASE_MESSAGE_OUT ( 6 )
#define SCSI_PHASE_MESSAGE_IN ( 7 )
#define SCSI_PHASE_BUS_FREE ( 8 )
#define SCSI_PHASE_SELECT ( 9 )
#define BUFFER_LEN 262144
struct
{
uint32_t buffer_size;
uint32_t pos;
uint8_t *Cdb;
uint8_t CmdBuffer[BUFFER_LEN];
uint32_t CmdBufferLength;
int LunType; int LunType;
uint8_t PacketStatus; uint32_t InitLength;
int ReadCDCallback; } SCSIDevices[7];
int RequestSenseEnabled;
void *p;
} SCSI;
SCSI ScsiDrives[7]; extern void SCSIReset(uint8_t Id);
void SCSIQueryResidual(SCSI *Scsi, uint32_t *Residual); uint32_t SCSICDROMModeSense(uint8_t *buf, uint32_t pos, uint8_t type);
uint8_t SCSICDROMSetProfile(uint8_t *buf, uint8_t *index, uint16_t profile);
int SCSICDROMReadDVDStructure(int format, const uint8_t *packet, uint8_t *buf);
uint32_t SCSICDROMEventStatus(uint8_t *buffer);
void SCSICDROM_Insert();
void SCSISendCommand(SCSI *Scsi, uint8_t Id, uint8_t *Cdb, uint8_t CdbLength, int cdrom_add_error_and_subchannel(uint8_t *b, int real_sector_type);
uint32_t DataBufferLength, uint8_t *SenseBufferPointer, int cdrom_LBAtoMSF_accurate();
uint8_t SenseBufferLength); int cdrom_read_data(uint8_t *buffer);
uint32_t (*pfnIoRequestCopyFromBuffer)(uint32_t OffDst, SGBUF *SegmentBuffer,
uint32_t Copy);
uint32_t (*pfnIoRequestCopyToBuffer)(uint32_t OffSrc, SGBUF *SegmentBuffer,
uint32_t Copy);
void SCSIReadTransfer(SCSI *Scsi, uint8_t Id);
void SCSIWriteTransfer(SCSI *Scsi, uint8_t Id);
extern void SCSIReset(SCSI *Scsi, uint8_t Id);
extern uint32_t SCSICDROMModeSense(uint8_t *buf, uint32_t pos, uint8_t type);
extern uint8_t SCSICDROMSetProfile(uint8_t *buf, uint8_t *index, uint16_t profile);
extern int SCSICDROMReadDVDStructure(int format, const uint8_t *packet, uint8_t *buf);
extern uint32_t SCSICDROMEventStatus(uint8_t *buffer);
extern void SCSICDROM_ReadyHandler(int IsReady);
extern void SCSICDROM_Insert();
// extern int cdrom_add_error_and_subchannel(uint8_t *b, int real_sector_type);
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@@ -626,7 +626,7 @@ int WINAPI WinMain (HINSTANCE hThisInstance,
if (scsi_cdrom_enabled) if (scsi_cdrom_enabled)
CheckMenuItem(menu, IDM_CDROM_SCSI, MF_CHECKED); CheckMenuItem(menu, IDM_CDROM_SCSI, MF_CHECKED);
if (aha154x_enabled) if (buslogic_enabled)
CheckMenuItem(menu, IDM_SCSI_ENABLED, MF_CHECKED); CheckMenuItem(menu, IDM_SCSI_ENABLED, MF_CHECKED);
CheckMenuItem(menu, IDM_SCSI_BASE130, MF_UNCHECKED); CheckMenuItem(menu, IDM_SCSI_BASE130, MF_UNCHECKED);
@@ -1429,8 +1429,8 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
} }
pause = 1; pause = 1;
Sleep(100); Sleep(100);
aha154x_enabled ^= 1; buslogic_enabled ^= 1;
CheckMenuItem(hmenu, IDM_SCSI_ENABLED, aha154x_enabled ? MF_CHECKED : MF_UNCHECKED); CheckMenuItem(hmenu, IDM_SCSI_ENABLED, buslogic_enabled ? MF_CHECKED : MF_UNCHECKED);
saveconfig(); saveconfig();
resetpchard(); resetpchard();
pause = 0; pause = 0;