dev_asc.cc Source File
Back to the index.
Go to the documentation of this file.
78 #define ASC_TICK_SHIFT 15
83 #define ASC_FIFO_LEN 16
84 #define STATE_DISCONNECTED 0
85 #define STATE_INITIATOR 1
86 #define STATE_TARGET 2
88 #define PHASE_DATA_OUT 0
89 #define PHASE_DATA_IN 1
90 #define PHASE_COMMAND 2
91 #define PHASE_STATUS 3
92 #define PHASE_MSG_OUT 6
93 #define PHASE_MSG_IN 7
99 #define ASC_DMA_SIZE (128*1024)
134 unsigned char *
data,
size_t len,
int writeflag);
143 "NCR_TCL",
"NCR_TCM",
"NCR_FIFO",
"NCR_CMD",
144 "NCR_STAT/NCR_SELID",
"NCR_INTR/NCR_TIMEOUT",
145 "NCR_STEP/NCR_SYNCTP",
"NCR_FFLAG/NCR_SYNCOFF",
146 "NCR_CFG1",
"NCR_CCF",
"NCR_TEST",
"NCR_CFG2",
147 "NCR_CFG3",
"reg_0xd",
"NCR_TCH",
"reg_0xf"
152 static int dev_asc_select(
struct cpu *
cpu,
struct asc_data *d,
int from_id,
153 int to_id,
int dmaflag,
int n_messagebytes);
173 static void dev_asc_fifo_flush(
struct asc_data *d)
187 static void dev_asc_reset(
struct asc_data *d)
192 if (d->
xferp != NULL)
196 dev_asc_fifo_flush(d);
212 static int dev_asc_fifo_read(
struct asc_data *d)
217 fatal(
"dev_asc: WARNING! FIFO overrun!\n");
231 static void dev_asc_fifo_write(
struct asc_data *d,
unsigned char data)
238 fatal(
"dev_asc: WARNING! FIFO overrun on write!\n");
247 static void dev_asc_newxfer(
struct asc_data *d)
249 if (d->
xferp != NULL) {
250 printf(
"WARNING! dev_asc_newxfer(): freeing previous"
258 d->
xferp->get_data_out = dev_asc_get_data_out;
259 d->
xferp->gdo_extra = (
void *) d;
272 static int dev_asc_transfer(
struct cpu *
cpu,
struct asc_data *d,
int dmaflag)
274 int res = 1, all_done = 1;
284 fatal(
"no incoming data?\n");
288 fatal(
"TODO..............\n");
297 dev_asc_fifo_write(d, ch);
310 fatal(
"no incoming DMA data?\n");
319 if (lenIn < lenIn2) {
320 fatal(
"{ asc: data in, lenIn=%i lenIn2=%i "
321 "}\n", lenIn, lenIn2);
331 if (lenIn2 > lenIn) {
340 for (i=0; i<lenIn; i++)
366 printf(
"WARNING!!!!!!!!! BUG!!!! Unexpected stuff..."
367 "lenIn2=%i d->xferp->data_in_len=%i\n", (
int)lenIn2,
398 fatal(
"TODO.......asdgasin\n");
409 fprintf(stderr,
"d->xferp->data_out_len == "
466 debug(
"[ asc: data_out, multitransfer "
467 "len = %i, len2 = %i ]\n",
468 (
int)len, (
int)len2);
471 fatal(
"[ asc data_out dma: too much?"
480 for (i=0; i<len; i++)
503 fatal(
" (PHASE OUT MSG len == %i, "
504 "should be 1)\n", oldlen);
514 ch = dev_asc_fifo_read(d);
517 debug(
"0x%02x ", ch);
531 fatal(
" !! Mach/PMAX hack !! ");
538 fatal(
"[ DMA MSG OUT: xxx TODO! ]");
545 fatal(
"[ MACH HACK! ]");
547 dev_asc_fifo_write(d, 0x07);
552 debug(
" COMMAND ==> select ");
557 fatal(
"!!! TODO: unknown/unimplemented phase "
600 static int dev_asc_select(
struct cpu *
cpu,
struct asc_data *d,
int from_id,
601 int to_id,
int dmaflag,
int n_messagebytes)
606 debug(
" { SELECT id %i: ", to_id);
614 if (n_messagebytes > 0) {
619 while (n_messagebytes-- > 0) {
620 int ch2 = dev_asc_fifo_read(d);
627 debug(
" (LUNs not implemented yet: 0x%02x) }",
634 fatal(
" (Unimplemented msg out: 0x%02x) }",
640 fatal(
" (Long msg out, not implemented yet;"
652 debug(
" MSG OUT DEBUG");
654 fatal(
" (SELATNS: msg out len == %i, should be 1)",
688 ch = dev_asc_fifo_read(d);
703 for (i=0; i<len; i++) {
749 if (relative_addr + len > 4)
767 memcpy(
data, d->
dma + relative_addr, len);
771 debug(
"[ asc: read from DMA addr 0x%05x:",
772 (
int) relative_addr);
773 for (i=0; i<len; i++)
783 memcpy(d->
dma + relative_addr,
data, len);
787 debug(
"[ asc: write to DMA addr 0x%05x:",
788 (
int) relative_addr);
789 for (i=0; i<len; i++)
805 int n_messagebytes = 0;
806 uint64_t idata = 0, odata = 0;
815 fatal(
"[ asc: writeflag=%i addr=%08x idata=%016llx ]\n",
816 writeflag, (
int)relative_addr, (
long long)idata);
821 regnr = relative_addr / 4;
825 regnr = relative_addr;
843 dev_asc_fifo_write(d, idata);
845 odata = dev_asc_fifo_read(d);
853 #ifdef ASC_FULL_REGISTER_ACCESS_DEBUG
856 debug(
"[ asc: read from %s: 0x%02x",
859 debug(
"[ asc: write to %s: 0x%02x",
864 }
else if (relative_addr >= 0x300 && relative_addr < 0x600
866 debug(
"[ asc: offset 0x%x, redirecting to turbochannel"
867 " access ]\n", relative_addr);
869 relative_addr,
data, len, writeflag,
873 fatal(
"[ asc: read from 0x%04x: 0x%02x ]\n",
874 relative_addr, (
int)odata);
876 fatal(
"[ asc: write to 0x%04x: 0x%02x ]\n",
877 relative_addr, (
int)idata);
930 dev_asc_fifo_flush(d);
966 dev_asc_fifo_write(d, 0x00);
971 dev_asc_fifo_write(d, 0x00);
988 debug(
"; Rejecting message");
990 debug(
"; Accepting message");
1002 if (d->
xferp != NULL)
1029 debug(
"SELATNS: select with "
1030 "atn and stop, id %i",
1035 debug(
"SELATN: select with atn"
1043 debug(
"SELNATN: select with atn3, "
1049 debug(
"SELNATN: select without atn, "
1059 if (target_exists) {
1068 ok = dev_asc_select(
cpu, d,
1082 if (d->
xferp != NULL)
1098 dev_asc_fifo_flush(d);
1111 ok = dev_asc_transfer(
cpu, d,
1119 if (d->
xferp != NULL)
1139 dev_asc_fifo_flush(d);
1153 ok = dev_asc_transfer(
cpu, d,
1161 if (d->
xferp != NULL)
1169 fatal(
"(unimplemented asc cmd 0x%02x)", (
int)idata);
1209 #ifdef ASC_FULL_REGISTER_ACCESS_DEBUG
1212 dev_asc_tick(
cpu, extra);
1229 unsigned char *
data,
size_t len,
int writeflag),
1235 memset(d, 0,
sizeof(
struct asc_data));
1259 baseaddr + 0x40000, 4096, dev_asc_address_reg_access, d,
#define INTERRUPT_CONNECT(name, istruct)
#define INTERRUPT_ASSERT(istruct)
int diskimage_scsicommand(struct cpu *cpu, int id, int type, struct scsi_transfer *xferp)
struct scsi_transfer * xferp
void scsi_transfer_free(struct scsi_transfer *p)
void memory_device_register(struct memory *mem, const char *, uint64_t baseaddr, uint64_t len, int(*f)(struct cpu *, struct memory *, uint64_t, unsigned char *, size_t, int, void *), void *extra, int flags, unsigned char *dyntrans_data)
size_t(* dma_controller)(void *dma_controller_data, unsigned char *data, size_t len, int writeflag)
int dev_asc_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
unsigned char * incoming_data
#define DM_DYNTRANS_WRITE_OK
void machine_add_tickfunction(struct machine *machine, void(*func)(struct cpu *, void *), void *extra, int clockshift)
#define DEV_ASC_DEC_LENGTH
void fatal(const char *fmt,...)
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
int dev_turbochannel_access(struct cpu *cpu, struct memory *mem, uint64_t relative_addr, unsigned char *data, size_t len, int writeflag, void *)
#define STATE_DISCONNECTED
void dev_asc_init(struct machine *machine, struct memory *mem, uint64_t baseaddr, const char *irq_path, void *turbochannel, int mode, size_t(*dma_controller)(void *dma_controller_data, unsigned char *data, size_t len, int writeflag), void *dma_controller_data)
void scsi_transfer_allocbuf(size_t *lenp, unsigned char **pp, size_t want_len, int clearflag)
struct scsi_transfer * scsi_transfer_alloc(void)
#define INTERRUPT_DEASSERT(istruct)
DEVICE_ACCESS(asc_address_reg)
void * dma_controller_data
unsigned char * dma_address_reg_memory
#define DEV_ASC_PICA_LENGTH
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
const char * asc_reg_names[0x10]
int diskimage_exist(struct machine *machine, int id, int type)
unsigned char fifo[ASC_FIFO_LEN]
#define CHECK_ALLOCATION(ptr)
Generated on Tue Aug 25 2020 19:25:06 for GXemul by
1.8.18