Added BusLogic BT-542B BIOS support (patch from TheCollector1995);
Brought the Adaptec AHA-1540B BIOS support to an essentially work state; Fixed some warnings in CPU/808x.c.
This commit is contained in:
@@ -983,7 +983,7 @@ void execx86(int cycs)
|
||||
int8_t offset;
|
||||
int tempws;
|
||||
uint32_t templ;
|
||||
int c;
|
||||
unsigned int c;
|
||||
int tempi;
|
||||
int trap;
|
||||
|
||||
@@ -2439,6 +2439,12 @@ void execx86(int cycs)
|
||||
switch (rmdat&0x38)
|
||||
{
|
||||
case 0x00: /*ROL b,CL*/
|
||||
temp2=(temp&0x80)?1:0;
|
||||
if (!c)
|
||||
{
|
||||
cycles-=((cpu_mod==3)?8:28);
|
||||
break;
|
||||
}
|
||||
while (c>0)
|
||||
{
|
||||
temp2=(temp&0x80)?1:0;
|
||||
@@ -2454,6 +2460,12 @@ void execx86(int cycs)
|
||||
cycles-=((cpu_mod==3)?8:28);
|
||||
break;
|
||||
case 0x08: /*ROR b,CL*/
|
||||
temp2=temp&1;
|
||||
if (!c)
|
||||
{
|
||||
cycles-=((cpu_mod==3)?8:28);
|
||||
break;
|
||||
}
|
||||
while (c>0)
|
||||
{
|
||||
temp2=temp&1;
|
||||
@@ -2564,6 +2576,12 @@ void execx86(int cycs)
|
||||
cycles-=((cpu_mod==3)?8:28);
|
||||
break;
|
||||
case 0x08: /*ROR w,CL*/
|
||||
tempw2=(tempw&1)?0x8000:0;
|
||||
if (!c)
|
||||
{
|
||||
cycles-=((cpu_mod==3)?8:28);
|
||||
break;
|
||||
}
|
||||
while (c>0)
|
||||
{
|
||||
tempw2=(tempw&1)?0x8000:0;
|
||||
@@ -2596,6 +2614,13 @@ void execx86(int cycs)
|
||||
cycles-=((cpu_mod==3)?8:28);
|
||||
break;
|
||||
case 0x18: /*RCR w,CL*/
|
||||
templ=flags&C_FLAG;
|
||||
tempw2=(templ&1)?0x8000:0;
|
||||
if (!c)
|
||||
{
|
||||
cycles-=((cpu_mod==3)?8:28);
|
||||
break;
|
||||
}
|
||||
while (c>0)
|
||||
{
|
||||
templ=flags&C_FLAG;
|
||||
|
@@ -233,6 +233,7 @@ void cdrom_update_cdb(uint8_t *cdb, int lba_pos, int number_of_blocks);
|
||||
void cdrom_insert(uint8_t id);
|
||||
|
||||
int find_cdrom_for_scsi_id(uint8_t scsi_id, uint8_t scsi_lun);
|
||||
int cdrom_read_capacity(uint8_t id, uint8_t *cdb, uint8_t *buffer, uint32_t *len);
|
||||
|
||||
#define cdrom_sense_error cdrom[id].sense[0]
|
||||
#define cdrom_sense_key cdrom[id].sense[2]
|
||||
|
17
src/scsi.h
17
src/scsi.h
@@ -289,6 +289,23 @@ typedef struct {
|
||||
#define ADDR_TO_U32(x) (((x).hi<<16)|((x).mid<<8)|((x).lo&0xFF))
|
||||
#define U32_TO_ADDR(a,x) do {(a).hi=(x)>>16;(a).mid=(x)>>8;(a).lo=(x)&0xFF;}while(0)
|
||||
|
||||
#pragma pack(push,1)
|
||||
typedef struct
|
||||
{
|
||||
uint8_t command;
|
||||
unsigned char id:3;
|
||||
unsigned char reserved:2;
|
||||
unsigned char lun:3;
|
||||
uint16_t cylinder;
|
||||
uint8_t head;
|
||||
uint8_t sector;
|
||||
uint8_t secount;
|
||||
addr24 dma_address;
|
||||
} BIOSCMD;
|
||||
#pragma pack(pop)
|
||||
|
||||
uint8_t HACommand03Handler(uint8_t last_id, BIOSCMD *BiosCmd);
|
||||
|
||||
|
||||
/*
|
||||
*
|
||||
|
@@ -12,7 +12,7 @@
|
||||
*
|
||||
* NOTE: THIS IS CURRENTLY A MESS, but will be cleaned up as I go.
|
||||
*
|
||||
* Version: @(#)scsi_aha154x.c 1.0.7 2017/06/14
|
||||
* Version: @(#)scsi_aha154x.c 1.0.8 2017/08/15
|
||||
*
|
||||
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
|
||||
* Original Buslogic version by SA1988 and Miran Grca.
|
||||
@@ -182,6 +182,7 @@ static uint16_t aha_ports[] = {
|
||||
0x0130, 0x0134, 0x0000, 0x0000
|
||||
};
|
||||
|
||||
#define WALTJE 1
|
||||
|
||||
#ifdef WALTJE
|
||||
int aha_do_log = 1;
|
||||
@@ -310,7 +311,8 @@ aha154x_bios(uint16_t ioaddr, uint32_t memaddr, aha_info *aha, int irq, int dma,
|
||||
/* bios_path = ROMFILE; */
|
||||
if (chip == CHIP_AHA154XB)
|
||||
{
|
||||
bios_path = L"roms/scsi/adaptec/aha1540b310.bin";
|
||||
/* bios_path = L"roms/scsi/adaptec/aha1540b310.bin"; */
|
||||
bios_path = L"roms/scsi/adaptec/B_AC00.BIN";
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -545,7 +547,7 @@ aha154x_memory(uint8_t cmd)
|
||||
}
|
||||
|
||||
|
||||
#define AHA_RESET_DURATION_NS UINT64_C(50000000)
|
||||
#define AHA_RESET_DURATION_NS UINT64_C(25000000)
|
||||
|
||||
|
||||
/*
|
||||
@@ -1338,6 +1340,7 @@ aha_read(uint16_t port, void *priv)
|
||||
|
||||
switch (port & 3) {
|
||||
case 0:
|
||||
default:
|
||||
ret = dev->Status;
|
||||
break;
|
||||
|
||||
@@ -1386,14 +1389,18 @@ aha_write(uint16_t port, uint8_t val, void *priv)
|
||||
aha_t *dev = (aha_t *)priv;
|
||||
uint8_t Offset;
|
||||
MailboxInit_t *MailboxInit;
|
||||
BIOSCMD *BiosCmd;
|
||||
ReplyInquireSetupInformation *ReplyISI;
|
||||
uint16_t cyl = 0;
|
||||
uint8_t temp = 0;
|
||||
|
||||
pclog("AHA154X: Write Port 0x%02X, Value %02X\n", port, val);
|
||||
|
||||
switch (port & 3) {
|
||||
case 0:
|
||||
if ((val & CTRL_HRST) || (val & CTRL_SRST)) {
|
||||
uint8_t Reset = !(val & CTRL_HRST);
|
||||
uint8_t Reset = (val & CTRL_HRST);
|
||||
pclog("Reset completed = %x\n", Reset);
|
||||
aha_reset_ctrl(dev, Reset);
|
||||
break;
|
||||
}
|
||||
@@ -1466,10 +1473,7 @@ aha_write(uint16_t port, uint8_t val, void *priv)
|
||||
break;
|
||||
|
||||
case 0x29:
|
||||
if (dev->chip != CHIP_AHA154XB)
|
||||
{
|
||||
dev->CmdParamLeft = 2;
|
||||
}
|
||||
dev->CmdParamLeft = 2;
|
||||
break;
|
||||
|
||||
case 0x91:
|
||||
@@ -1511,7 +1515,16 @@ aha_0x01:
|
||||
break;
|
||||
|
||||
case 0x03:
|
||||
dev->DataBuf[0] = 0x00;
|
||||
BiosCmd = (BIOSCMD *)dev->CmdBuf;
|
||||
|
||||
cyl = ((BiosCmd->cylinder & 0xff) << 8) | ((BiosCmd->cylinder >> 8) & 0xff);
|
||||
BiosCmd->cylinder = cyl;
|
||||
temp = BiosCmd->id;
|
||||
BiosCmd->id = BiosCmd->lun;
|
||||
BiosCmd->lun = temp;
|
||||
pclog("C: %04X, H: %02X, S: %02X\n", BiosCmd->cylinder, BiosCmd->head, BiosCmd->sector);
|
||||
dev->DataBuf[0] = HACommand03Handler(7, BiosCmd);
|
||||
pclog("BIOS Completion/Status Code %x\n", dev->DataBuf[0]);
|
||||
dev->DataReplyLeft = 1;
|
||||
break;
|
||||
|
||||
@@ -1683,32 +1696,17 @@ aha_0x01:
|
||||
break;
|
||||
|
||||
case 0x28:
|
||||
if (dev->chip == CHIP_AHA154XB)
|
||||
{
|
||||
dev->DataReplyLeft = 0;
|
||||
dev->Status |= STAT_INVCMD;
|
||||
}
|
||||
else
|
||||
{
|
||||
dev->DataBuf[0] = 0x08;
|
||||
dev->DataBuf[1] = dev->Lock;
|
||||
dev->DataReplyLeft = 2;
|
||||
}
|
||||
dev->DataBuf[0] = 0x08;
|
||||
dev->DataBuf[1] = dev->Lock;
|
||||
dev->DataReplyLeft = 2;
|
||||
break;
|
||||
case 0x29:
|
||||
dev->DataReplyLeft = 0;
|
||||
if (dev->chip == CHIP_AHA154XB)
|
||||
{
|
||||
dev->Status |= STAT_INVCMD;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dev->CmdBuf[1] == dev->Lock) {
|
||||
if (dev->CmdBuf[0] & 1) {
|
||||
dev->Lock = 1;
|
||||
} else {
|
||||
dev->Lock = 0;
|
||||
}
|
||||
if (dev->CmdBuf[1] == dev->Lock) {
|
||||
if (dev->CmdBuf[0] & 1) {
|
||||
dev->Lock = 1;
|
||||
} else {
|
||||
dev->Lock = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -2316,7 +2314,14 @@ aha_init(int chip, int has_bios)
|
||||
|
||||
if (bios) {
|
||||
/* Perform AHA-154xNN-specific initialization. */
|
||||
aha154x_bios(dev->Base, bios_addr, &dev->aha, dev->Irq, dev->DmaChannel, chip);
|
||||
if (chip == CHIP_AHA154XB)
|
||||
{
|
||||
rom_init(&dev->bios, L"roms/scsi/adaptec/B_AC00.BIN", 0xd8000, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL);
|
||||
}
|
||||
else
|
||||
{
|
||||
aha154x_bios(dev->Base, bios_addr, &dev->aha, dev->Irq, dev->DmaChannel, chip);
|
||||
}
|
||||
}
|
||||
|
||||
return(dev);
|
||||
|
1209
src/scsi_buslogic.c
1209
src/scsi_buslogic.c
File diff suppressed because it is too large
Load Diff
@@ -14,6 +14,7 @@
|
||||
#include <malloc.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#include "86box.h"
|
||||
#include "cdrom.h"
|
||||
@@ -115,11 +116,12 @@ uint8_t scsi_hd_command_flags[0x100] =
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
/* #define ENABLE_SCSI_HD_LOG 0 */
|
||||
int scsi_hd_do_log = 0;
|
||||
|
||||
void scsi_hd_log(const char *format, ...)
|
||||
{
|
||||
#ifdef ENABLE_scsi_hd_LOG
|
||||
#ifdef ENABLE_SCSI_HD_LOG
|
||||
if (scsi_hd_do_log)
|
||||
{
|
||||
va_list ap;
|
||||
@@ -291,7 +293,13 @@ int scsi_hd_read_capacity(uint8_t id, uint8_t *cdb, uint8_t *buffer, uint32_t *l
|
||||
buffer[3] = size & 0xff;
|
||||
buffer[6] = 2; /* 512 = 0x0200 */
|
||||
*len = 8;
|
||||
|
||||
|
||||
pclog("Read Capacity\n");
|
||||
pclog("buffer[0]=%x\n", buffer[0]);
|
||||
pclog("buffer[1]=%x\n", buffer[1]);
|
||||
pclog("buffer[2]=%x\n", buffer[2]);
|
||||
pclog("buffer[3]=%x\n", buffer[3]);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -353,7 +361,7 @@ static void scsi_hd_command_common(uint8_t id)
|
||||
}
|
||||
}
|
||||
|
||||
static void scsi_hd_command_complete(uint8_t id)
|
||||
void scsi_hd_command_complete(uint8_t id)
|
||||
{
|
||||
shdc[id].packet_status = CDROM_PHASE_COMPLETE;
|
||||
scsi_hd_command_common(id);
|
||||
@@ -372,7 +380,7 @@ static void scsi_hd_command_write_dma(uint8_t id)
|
||||
scsi_hd_command_common(id);
|
||||
}
|
||||
|
||||
static void scsi_hd_data_command_finish(uint8_t id, int len, int block_len, int alloc_len, int direction)
|
||||
void scsi_hd_data_command_finish(uint8_t id, int len, int block_len, int alloc_len, int direction)
|
||||
{
|
||||
scsi_hd_log("SCSI HD %i: Finishing command (%02X): %i, %i, %i, %i, %i\n", id, shdc[id].current_cdb[0], len, block_len, alloc_len, direction, shdc[id].request_length);
|
||||
shdc[id].pos=0;
|
||||
@@ -470,7 +478,7 @@ static void scsi_hd_illegal_opcode(uint8_t id)
|
||||
scsi_hd_cmd_error(id);
|
||||
}
|
||||
|
||||
static void scsi_hd_lba_out_of_range(uint8_t id)
|
||||
void scsi_hd_lba_out_of_range(uint8_t id)
|
||||
{
|
||||
scsi_hd_sense_key = SENSE_ILLEGAL_REQUEST;
|
||||
scsi_hd_asc = ASC_LBA_OUT_OF_RANGE;
|
||||
@@ -792,7 +800,6 @@ void scsi_hd_command(uint8_t id, uint8_t *cdb)
|
||||
case GPCMD_READ_10:
|
||||
shdc[id].sector_len = (cdb[7] << 8) | cdb[8];
|
||||
shdc[id].sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5];
|
||||
scsi_hd_log("SCSI HD %i: Length: %i, LBA: %i\n", id, shdc[id].sector_len, shdc[id].sector_pos);
|
||||
break;
|
||||
case GPCMD_READ_12:
|
||||
shdc[id].sector_len = (((uint32_t) cdb[6]) << 24) | (((uint32_t) cdb[7]) << 16) | (((uint32_t) cdb[8]) << 8) | ((uint32_t) cdb[9]);
|
||||
|
@@ -52,3 +52,5 @@ extern void scsi_reloadhd(int id);
|
||||
extern void scsi_unloadhd(int scsi_id, int scsi_lun, int id);
|
||||
|
||||
extern FILE *shdf[HDC_NUM];
|
||||
|
||||
int scsi_hd_read_capacity(uint8_t id, uint8_t *cdb, uint8_t *buffer, uint32_t *len);
|
||||
|
Reference in New Issue
Block a user