static uae_u32 REGPARAM2 dev_beginio (TrapContext *context) { uae_u32 request = m68k_areg (&context->regs, 1); uae_u8 flags = get_byte (request + 30); int command = get_word (request + 28); struct priv_devstruct *pdev = getpdevstruct (request); struct devstruct *dev = getdevstruct (pdev->unit); put_byte (request+8, NT_MESSAGE); if (!dev || !pdev) { put_byte (request + 31, 32); return get_byte (request + 31); } put_byte (request+31, 0); if ((flags & 1) && dev_canquick (dev, request)) { if (dev_do_io (dev, request)) write_log ("device %s command %d bug with IO_QUICK\n", getdevname (pdev->type), command); return get_byte (request + 31); } else { add_async_request (dev, request, ASYNC_REQUEST_TEMP, 0); put_byte (request+30, get_byte (request + 30) & ~1); write_comm_pipe_u32 (&dev->requests, request, 1); return 0; } }
static uint32_t REGPARAM2 dev_abortio (TrapContext *context) { uint32_t request = m68k_areg (regs, 1); struct devstruct *dev = getdevstruct (get_long (request + 24)); if (!dev) { put_byte (request + 31, 32); return get_byte (request + 31); } abort_async (dev, request); return 0; }
static uae_u32 REGPARAM2 dev_open_2 (TrapContext *context, int type) { uaecptr ioreq = m68k_areg (&context->regs, 1); uae_u32 unit = m68k_dreg (&context->regs, 0); uae_u32 flags = m68k_dreg (&context->regs, 1); struct devstruct *dev = getdevstruct (unit); struct priv_devstruct *pdev = 0; int i; if (log_scsi) write_log ("opening %s:%d ioreq=%08.8X\n", getdevname (type), unit, ioreq); if (!dev) return openfail (ioreq, 32); /* badunitnum */ if (!dev->opencnt) { for (i = 0; i < MAX_OPEN_DEVICES; i++) { pdev = &pdevst[i]; if (pdev->inuse == 0) break; } if (type == UAEDEV_SCSI_ID && sys_command_open (DF_SCSI, dev->unitnum)) { pdev->scsi = 1; pdev->mode = DF_SCSI; } if (type == UAEDEV_DISK_ID && sys_command_open (DF_IOCTL, dev->unitnum)) { pdev->ioctl = 1; pdev->mode = DF_IOCTL; } if (!pdev->scsi && !pdev->ioctl) return openfail (ioreq, -1); pdev->type = type; pdev->unit = unit; pdev->flags = flags; pdev->inuse = 1; put_long (ioreq + 24, pdev - pdevst); start_thread (dev); } else { for (i = 0; i < MAX_OPEN_DEVICES; i++) { pdev = &pdevst[i]; if (pdev->inuse && pdev->unit == (int)unit) break; } if (i == MAX_OPEN_DEVICES) return openfail (ioreq, -1); put_long (ioreq + 24, pdev - pdevst); } dev->opencnt++; put_word (m68k_areg (&context->regs, 6) + 32, get_word (m68k_areg (&context->regs, 6) + 32) + 1); put_byte (ioreq + 31, 0); put_byte (ioreq + 8, 7); return 0; }
static uint32_t REGPARAM2 dev_close (TrapContext *context) { uint32_t request = m68k_areg (regs, 1); struct devstruct *dev; dev = getdevstruct (get_long (request + 24)); if (!dev) return 0; if (log_uaeserial) write_log (_T("%s:%d close, req=%x\n"), getdevname(), dev->unit, request); dev_close_3 (dev); put_long (request + 24, 0); put_word (m68k_areg (regs, 6) + 32, get_word (m68k_areg (regs, 6) + 32) - 1); return 0; }
static uae_u32 REGPARAM2 dev_close_2 (TrapContext *context) { uae_u32 request = m68k_areg (&context->regs, 1); struct priv_devstruct *pdev = getpdevstruct (request); struct devstruct *dev; if (!pdev) return 0; dev = getdevstruct (pdev->unit); if (log_scsi) write_log ("%s:%d close, req=%08.8X\n", getdevname (pdev->type), pdev->unit, request); if (!dev) return 0; dev_close_3 (dev, pdev); put_long (request + 24, 0); put_word (m68k_areg (&context->regs, 6) + 32, get_word (m68k_areg (&context->regs, 6) + 32) - 1); return 0; }
static uae_u32 REGPARAM2 dev_abortio (TrapContext *context) { uae_u32 request = m68k_areg (&context->regs, 1); struct priv_devstruct *pdev = getpdevstruct (request); struct devstruct *dev; if (!pdev) { put_byte (request + 31, 32); return get_byte (request + 31); } dev = getdevstruct (pdev->unit); if (!dev) { put_byte (request + 31, 32); return get_byte (request + 31); } put_byte (request + 31, -2); if (log_scsi) write_log ("abortio %s unit=%d, request=%08.8X\n", getdevname (pdev->type), pdev->unit, request); abort_async (dev, request, -2, 0); return 0; }
static uint32_t REGPARAM2 dev_beginio (TrapContext *context) { uint32_t request = m68k_areg (regs, 1); uint8_t flags = get_byte (request + 30); int32_t command = get_word (request + 28); struct devstruct *dev = getdevstruct (get_long (request + 24)); put_byte (request + 8, NT_MESSAGE); if (!dev) { put_byte (request + 31, 32); return get_byte (request + 31); } put_byte (request + 31, 0); if ((flags & 1) && dev_canquick (dev, request)) { if (dev_do_io (dev, request, 1)) write_log (_T("device %s:%d command %d bug with IO_QUICK\n"), getdevname(), dev->unit, command); return get_byte (request + 31); } else { put_byte (request + 30, get_byte (request + 30) & ~1); write_comm_pipe_u32 (&dev->requests, request, 1); return 0; } }