From 275f3456ba4ebe37a2c648c88baa0472fb0fb332 Mon Sep 17 00:00:00 2001 From: Stephen Heumann Date: Wed, 22 Mar 2017 20:13:20 -0500 Subject: [PATCH] Add support for sending DSICommand requests. --- aspinterface.c | 16 +++++++++++++--- dsitest.c | 16 ++++++++++++++++ endian.asm | 2 +- 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/aspinterface.c b/aspinterface.c index 200b4b5..d603498 100644 --- a/aspinterface.c +++ b/aspinterface.c @@ -138,7 +138,15 @@ void DoSPCloseSession(Session *sess, ASPCloseSessionRec *commandRec) { } void DoSPCommand(Session *sess, ASPCommandRec *commandRec) { - // TODO + sess->request.flags = DSI_REQUEST; + sess->request.command = DSICommand; + sess->request.requestID = htons(sess->nextRequestID++); + sess->request.writeOffset = 0; + sess->request.totalDataLength = htonl(commandRec->cmdBlkLength); + sess->replyBuf = (void*)commandRec->replyBufferAddr; + sess->replyBufLen = commandRec->replyBufferLen; + + SendDSIMessage(sess, &sess->request, (void*)commandRec->cmdBlkAddr); } void DoSPWrite(Session *sess, ASPWriteRec *commandRec) { @@ -154,7 +162,7 @@ void FinishASPCommand(Session *sess) { // The IIgs ASP interfaces can't represent lengths over 64k. // This should be detected as an error earlier, but let's make sure. sess->spCommandRec->result = aspSizeErr; - return; + goto complete; } switch(sess->spCommandRec->command) { @@ -176,7 +184,8 @@ void FinishASPCommand(Session *sess) { // TODO break; } - + +complete: CompleteCommand(sess); } @@ -196,5 +205,6 @@ void CompleteCommand(Session *sess) { memset(sess, 0, sizeof(*sess)); } else { sess->commandPending = FALSE; + InitReadTCP(sess, DSI_HEADER_SIZE, &sess->reply); } } diff --git a/dsitest.c b/dsitest.c index 9e6e1c4..42f5fc8 100644 --- a/dsitest.c +++ b/dsitest.c @@ -8,6 +8,7 @@ ASPGetStatusRec getStatusRec; ASPOpenSessionRec openSessionRec; +ASPCommandRec commandRec; ASPCloseSessionRec closeSessionRec; Byte replyBuffer[1024]; @@ -81,6 +82,21 @@ int main(int argc, char **argv) if (openSessionRec.result) goto error; + commandRec.async = AT_SYNC; + commandRec.command = aspCommandCommand; + commandRec.completionPtr = 0; + commandRec.refNum = openSessionRec.refNum; + // FIXME this sends meaningless garbage, not a real AFP request + commandRec.cmdBlkLength = 10; + commandRec.cmdBlkAddr = (LongWord)&openSessionRec; + commandRec.replyBufferLen = sizeof(replyBuffer); + commandRec.replyBufferAddr = (LongWord)&replyBuffer; + + printf("Sending command...\n"); + DispatchASPCommand((SPCommandRec *)&commandRec); + printf("result code = %04x, command result = %08lx\n", + commandRec.result, commandRec.cmdResult); + closeSessionRec.async = AT_SYNC; closeSessionRec.command = aspCloseSessionCommand; closeSessionRec.completionPtr = 0; diff --git a/endian.asm b/endian.asm index 5e180e3..fed061b 100644 --- a/endian.asm +++ b/endian.asm @@ -15,7 +15,7 @@ ntohs entry htonl start ntohl entry - lda 4,s + lda 4,s xba tax lda 6,s