int16 ASERDPort::status(uint32 pb, uint32 dce, uint16 code) { D(bug("status(%ld)\n", (uint32)code)); switch (code) { case kSERDInputCount: WriteMacInt32(pb + csParam, 0); if (!is_parallel) { if (!query()) return noErr; D(bug("status(2) successful, returning %08lx\n", control_io->IOSer.io_Actual)); WriteMacInt32(pb + csParam, control_io->IOSer.io_Actual); } return noErr; case kSERDStatus: { uint32 p = pb + csParam; WriteMacInt8(p + staCumErrs, cum_errors); cum_errors = 0; WriteMacInt8(p + staRdPend, read_pending); WriteMacInt8(p + staWrPend, write_pending); if (is_parallel) { WriteMacInt8(p + staXOffSent, 0); WriteMacInt8(p + staXOffHold, 0); WriteMacInt8(p + staCtsHold, 0); WriteMacInt8(p + staDsrHold, 0); WriteMacInt8(p + staModemStatus, dsrEvent | dcdEvent | ctsEvent); } else { query(); WriteMacInt8(p + staXOffSent, (control_io->io_Status & IO_STATF_XOFFREAD ? xOffWasSent : 0) | (control_io->io_Status & (1 << 6) ? dtrNegated : 0)); // RTS WriteMacInt8(p + staXOffHold, control_io->io_Status & IO_STATF_XOFFWRITE); WriteMacInt8(p + staCtsHold, control_io->io_Status & (1 << 4)); // CTS WriteMacInt8(p + staDsrHold, control_io->io_Status & (1 << 3)); // DSR WriteMacInt8(p + staModemStatus, (control_io->io_Status & (1 << 3) ? 0 : dsrEvent) | (control_io->io_Status & (1 << 2) ? riEvent : 0) | (control_io->io_Status & (1 << 5) ? 0 : dcdEvent) | (control_io->io_Status & (1 << 4) ? 0 : ctsEvent) | (control_io->io_Status & IO_STATF_READBREAK ? breakEvent : 0)); } return noErr; } default: printf("WARNING: SerialStatus(): unimplemented status code %d\n", code); return statusErr; } }
static void mon_write_byte_b2(uintptr adr, uint32 b) { WriteMacInt8(adr, b); }
uint32 FindLibSymbol(const char *lib_str, const char *sym_str) { SheepVar32 conn_id = 0; SheepVar32 main_addr = 0; SheepArray<256> err; WriteMacInt8(err.addr(), 0); SheepVar32 sym_addr = 0; SheepVar32 sym_class = 0; SheepString lib(lib_str); SheepString sym(sym_str); D(bug("FindLibSymbol %s in %s...\n", sym.value()+1, lib.value()+1)); if (ReadMacInt32(XLM_RUN_MODE) == MODE_EMUL_OP) { M68kRegisters r; // Find shared library static const uint8 proc1_template[] = { 0x55, 0x8f, // subq.l #2,a7 0x2f, 0x08, // move.l a0,-(a7) 0x2f, 0x3c, 0x70, 0x77, 0x70, 0x63, // move.l #'pwpc',-(a7) 0x2f, 0x3c, 0x00, 0x00, 0x00, 0x01, // move.l #kReferenceCFrag,-(a7) 0x2f, 0x09, // move.l a1,-(a7) 0x2f, 0x0a, // move.l a2,-(a7) 0x2f, 0x0b, // move.l a3,-(a7) 0x3f, 0x3c, 0x00, 0x01, // (GetSharedLibrary) 0xaa, 0x5a, // CFMDispatch 0x30, 0x1f, // move.w (a7)+,d0 M68K_RTS >> 8, M68K_RTS & 0xff }; BUILD_SHEEPSHAVER_PROCEDURE(proc1); r.a[0] = lib.addr(); r.a[1] = conn_id.addr(); r.a[2] = main_addr.addr(); r.a[3] = err.addr(); Execute68k(proc1, &r); D(bug(" GetSharedLibrary: ret %d, connection ID %ld, main %p\n", (int16)r.d[0], conn_id.value(), main_addr.value())); if (r.d[0]) return 0; // Find symbol static const uint8 proc2_template[] = { 0x55, 0x8f, // subq.l #2,a7 0x2f, 0x00, // move.l d0,-(a7) 0x2f, 0x08, // move.l a0,-(a7) 0x2f, 0x09, // move.l a1,-(a7) 0x2f, 0x0a, // move.l a2,-(a7) 0x3f, 0x3c, 0x00, 0x05, // (FindSymbol) 0xaa, 0x5a, // CFMDispatch 0x30, 0x1f, // move.w (a7)+,d0 M68K_RTS >> 8, M68K_RTS & 0xff }; BUILD_SHEEPSHAVER_PROCEDURE(proc2); r.d[0] = conn_id.value(); r.a[0] = sym.addr(); r.a[1] = sym_addr.addr(); r.a[2] = sym_class.addr(); Execute68k(proc2, &r); D(bug(" FindSymbol1: ret %d, sym_addr %p, sym_class %ld\n", (int16)r.d[0], sym_addr.value(), sym_class.value())); //!! CloseConnection()? if (r.d[0]) return 0; else return sym_addr.value(); } else {
int16 XSERDPort::status(uint32 pb, uint32 dce, uint16 code) { switch (code) { case kSERDInputCount: { int num; ioctl(fd, FIONREAD, &num); WriteMacInt32(pb + csParam, num); return noErr; } case kSERDStatus: { uint32 p = pb + csParam; WriteMacInt8(p + staCumErrs, cum_errors); cum_errors = 0; WriteMacInt8(p + staXOffSent, 0); WriteMacInt8(p + staXOffHold, 0); WriteMacInt8(p + staRdPend, read_pending); WriteMacInt8(p + staWrPend, write_pending); if (protocol != serial) { WriteMacInt8(p + staCtsHold, 0); WriteMacInt8(p + staDsrHold, 0); WriteMacInt8(p + staModemStatus, dsrEvent | dcdEvent | ctsEvent); } else { unsigned int status; ioctl(fd, TIOCMGET, &status); WriteMacInt8(p + staCtsHold, status & TIOCM_CTS ? 0 : 1); WriteMacInt8(p + staDsrHold, status & TIOCM_DTR ? 0 : 1); WriteMacInt8(p + staModemStatus, (status & TIOCM_DSR ? dsrEvent : 0) | (status & TIOCM_RI ? riEvent : 0) | (status & TIOCM_CD ? dcdEvent : 0) | (status & TIOCM_CTS ? ctsEvent : 0)); } return noErr; } default: printf("WARNING: SerialStatus(): unimplemented status code %d\n", code); return statusErr; } }