TRK: matched serpoll and support; and making more progress (#565)

This commit is contained in:
mrshigure 2025-02-10 19:49:23 -08:00 committed by GitHub
parent 66a9a044fa
commit 23b7af3bc5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 1053 additions and 859 deletions

View file

@ -245,4 +245,4 @@ lbl_8037149C:
#endif // clang-format on
}
u32 TRKTargetCPUMinorType(void) { return 0x54; }
u8 TRKTargetCPUMinorType(void) { return 0x54; }

View file

@ -9,74 +9,133 @@ static TRKFramingState gTRKFramingState;
void* gTRKInputPendingPtr;
MessageBufferID TRKTestForPacket()
{
int bytes;
int batch;
int err;
TRKBuffer* b;
int id;
static inline BOOL serpoll_inline_00(TRKBuffer* buffer) {
if (buffer->length < 2) {
TRKStandardACK(buffer, DSMSG_ReplyNAK, DSREPLY_PacketSizeError);
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
return FALSE;
}
buffer->position = 0;
buffer->length--;
return TRUE;
}
bytes = TRKPollUART();
if (bytes > 0) {
TRKGetFreeBuffer(&id, &b);
if (bytes > TRKMSGBUF_SIZE) {
for (; bytes > 0; bytes -= batch) {
batch = bytes > TRKMSGBUF_SIZE ? TRKMSGBUF_SIZE : bytes;
TRKReadUARTN(b->data, batch);
}
TRKStandardACK(b, 0xff, 6);
} else {
err = TRKReadUARTN(b->data, bytes);
if (err == 0) {
b->length = bytes;
return id;
}
}
}
if (id != -1) {
TRKReleaseBuffer(id);
}
return -1;
MessageBufferID TRKTestForPacket(void) {
s32 var_r29;
s32 var_r3;
s8 sp8;
s32 temp_r3;
var_r29 = 0;
var_r3 = TRKReadUARTPoll(&sp8);
while (var_r3 == 0 && var_r29 == 0) {
if (gTRKFramingState.receiveState != DSRECV_InFrame) {
gTRKFramingState.isEscape = FALSE;
}
switch (gTRKFramingState.receiveState) {
case DSRECV_Wait:
if (sp8 == 0x7E) {
var_r29 = TRKGetFreeBuffer(&gTRKFramingState.msgBufID, &gTRKFramingState.buffer);
gTRKFramingState.fcsType = 0;
gTRKFramingState.receiveState = DSRECV_Found;
}
break;
case DSRECV_Found:
if (sp8 == 0x7E) {
break;
}
gTRKFramingState.receiveState = DSRECV_InFrame;
/* fallthrough */
case DSRECV_InFrame:
if (sp8 == 0x7E) {
if (gTRKFramingState.isEscape) {
TRKStandardACK(gTRKFramingState.buffer, DSMSG_ReplyNAK, DSREPLY_EscapeError);
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
break;
}
if (serpoll_inline_00(gTRKFramingState.buffer)) {
temp_r3 = gTRKFramingState.msgBufID;
gTRKFramingState.msgBufID = -1;
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
return temp_r3;
}
gTRKFramingState.receiveState = DSRECV_Wait;
} else {
if (gTRKFramingState.isEscape) {
sp8 ^= 0x20;
gTRKFramingState.isEscape = FALSE;
} else if (sp8 == 0x7D) {
gTRKFramingState.isEscape = TRUE;
break;
}
var_r29 = TRKAppendBuffer1_ui8(gTRKFramingState.buffer, sp8);
gTRKFramingState.fcsType += sp8;
}
break;
case DSRECV_FrameOverflow:
if (sp8 == 0x7E) {
if (gTRKFramingState.msgBufID != -1) {
TRKReleaseBuffer(gTRKFramingState.msgBufID);
gTRKFramingState.msgBufID = -1;
}
gTRKFramingState.buffer = NULL;
gTRKFramingState.receiveState = DSRECV_Wait;
}
break;
}
var_r3 = TRKReadUARTPoll(&sp8);
}
return -1;
}
void TRKGetInput(void)
{
MessageBufferID id;
TRKBuffer* msgBuffer;
u8 command;
TRKBuffer* msgBuffer;
MessageBufferID id;
u8 command;
id = TRKTestForPacket();
if (id == -1)
return;
id = TRKTestForPacket();
if (id == -1)
return;
msgBuffer = TRKGetBuffer(id);
TRKSetBufferPosition(msgBuffer, 0);
TRKReadBuffer1_ui8(msgBuffer, &command);
if (command < DSMSG_ReplyACK) {
TRKProcessInput(id);
} else {
TRKReleaseBuffer(id);
}
msgBuffer = TRKGetBuffer(id);
TRKSetBufferPosition(msgBuffer, 0);
TRKReadBuffer1_ui8(msgBuffer, &command);
if (command < DSMSG_ReplyACK) {
TRKProcessInput(id);
} else {
TRKReleaseBuffer(id);
}
}
void TRKProcessInput(int bufferIdx)
{
TRKEvent event;
TRKEvent event;
TRKConstructEvent(&event, NUBEVENT_Request);
gTRKFramingState.msgBufID = -1;
event.msgBufID = bufferIdx;
TRKPostEvent(&event);
TRKConstructEvent(&event, NUBEVENT_Request);
gTRKFramingState.msgBufID = -1;
event.msgBufID = bufferIdx;
TRKPostEvent(&event);
}
DSError TRKInitializeSerialHandler(void)
{
gTRKFramingState.msgBufID = -1;
gTRKFramingState.receiveState = DSRECV_Wait;
gTRKFramingState.isEscape = FALSE;
gTRKFramingState.msgBufID = -1;
gTRKFramingState.receiveState = DSRECV_Wait;
gTRKFramingState.isEscape = FALSE;
return DS_NoError;
return DS_NoError;
}
DSError TRKTerminateSerialHandler(void) { return DS_NoError; }

View file

@ -28,7 +28,7 @@ DSError TRKSuppAccessFile(u32 file_handle, u8* data, size_t* count,
*io_result = DS_IONoError;
done = 0;
error = DS_NoError;
while (!exit && done < *count && error == DS_NoError && *io_result == 0) {
while (!exit && done < *count && error == DS_NoError && *io_result == DS_IONoError) {
if (*count - done > 0x800) {
length = 0x800;
} else {
@ -175,3 +175,114 @@ DSError TRKRequestSend(TRKBuffer* msgBuf, int* bufferId, u32 p1, u32 p2, int p3)
return error;
}
DSError HandleOpenFileSupportRequest(const char* path, u8 replyError, u32* param_3, u8* ioResult) {
int sp10;
int spC;
TRKBuffer* sp8;
TRKBuffer* var_r31;
DSError var_r26;
*param_3 = 0;
var_r26 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui8(sp8, 0xD2);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui8(sp8, replyError);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer1_ui16(sp8, strlen(path) + 1);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKAppendBuffer_ui8(sp8, (u8*) path, strlen(path) + 1);
}
if (var_r26 == DS_NoError) {
*ioResult = 0;
var_r26 = TRKRequestSend(sp8, &sp10, 7, 3, 0);
if (var_r26 == DS_NoError) {
var_r31 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r31, 2);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKReadBuffer1_ui8(var_r31, ioResult);
}
if (var_r26 == DS_NoError) {
var_r26 = TRKReadBuffer1_ui32(var_r31, param_3);
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r26;
}
DSError HandleCloseFileSupportRequest(int replyError, u8* ioResult) {
int sp10;
int spC;
DSError var_r31;
TRKBuffer* sp8;
TRKBuffer* var_r30;
var_r31 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r31 == DS_NoError) {
var_r31 = TRKAppendBuffer1_ui8(sp8, 0xD3);
}
if (var_r31 == DS_NoError) {
var_r31 = TRKAppendBuffer1_ui32(sp8, replyError);
}
if (var_r31 == DS_NoError) {
*ioResult = DS_IONoError;
var_r31 = TRKRequestSend(sp8, &sp10, 3, 3, 0);
if (var_r31 == DS_NoError) {
var_r30 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r30, 2);
}
if (var_r31 == DS_NoError) {
var_r31 = TRKReadBuffer1_ui8(var_r30, ioResult);
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r31;
}
DSError HandlePositionFileSupportRequest(u32 replyErr, u32* param_2, u8 param_3, u8* ioResult) {
int sp10;
int spC;
TRKBuffer* sp8;
TRKBuffer* var_r31;
DSError var_r27;
var_r27 = TRKGetFreeBuffer(&spC, &sp8);
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui8(sp8, 0xD4);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui32(sp8, replyErr);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui32(sp8, *param_2);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKAppendBuffer1_ui8(sp8, param_3);
}
if (var_r27 == DS_NoError) {
*ioResult = DS_IONoError;
var_r27 = TRKRequestSend(sp8, &sp10, 3, 3, 0);
if (var_r27 == DS_NoError) {
var_r31 = TRKGetBuffer(sp10);
TRKSetBufferPosition(var_r31, 2);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKReadBuffer1_ui8(var_r31, ioResult);
}
if (var_r27 == DS_NoError) {
var_r27 = TRKReadBuffer1_ui32(var_r31, param_2);
} else {
*param_2 = -1;
}
TRKReleaseBuffer(sp10);
}
TRKReleaseBuffer(spC);
return var_r27;
}

File diff suppressed because it is too large Load diff