mirror of
https://github.com/sheumann/NetDisk.git
synced 2024-09-27 12:57:51 +00:00
Add basic support for 2img format.
This commit is contained in:
parent
d718d82ff1
commit
2670da4f59
28
driver.c
28
driver.c
@ -7,8 +7,11 @@
|
|||||||
#include "seturl.h"
|
#include "seturl.h"
|
||||||
#include "http.h"
|
#include "http.h"
|
||||||
#include "readtcp.h"
|
#include "readtcp.h"
|
||||||
|
#include "asmglue.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
#define TWO_IMG_MAGIC ('2' | 'I'<<8 | (LongWord)'M'<<16 | (LongWord)'G'<<24)
|
||||||
|
|
||||||
struct DIB dibs[NDIBS] = {0};
|
struct DIB dibs[NDIBS] = {0};
|
||||||
struct DIBList dibList = {NDIBS};
|
struct DIBList dibList = {NDIBS};
|
||||||
|
|
||||||
@ -47,6 +50,7 @@ void InitDIBs(void) {
|
|||||||
|
|
||||||
#pragma databank 1
|
#pragma databank 1
|
||||||
Word DriverDispatch(Word callNum, struct GSOSDP *dp) {
|
Word DriverDispatch(Word callNum, struct GSOSDP *dp) {
|
||||||
|
Word stateReg = ForceRomIn();
|
||||||
Word retVal = 0;
|
Word retVal = 0;
|
||||||
|
|
||||||
switch (callNum) {
|
switch (callNum) {
|
||||||
@ -182,11 +186,24 @@ Word DriverDispatch(Word callNum, struct GSOSDP *dp) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RestoreStateReg(stateReg);
|
||||||
return retVal;
|
return retVal;
|
||||||
}
|
}
|
||||||
#pragma databank 0
|
#pragma databank 0
|
||||||
|
|
||||||
|
|
||||||
|
static Word CheckTwoImg(Session *sess) {
|
||||||
|
struct TwoImgHeader *hdr = &sess->fileHeader.twoImgHeader;
|
||||||
|
if (hdr->twoImgID != TWO_IMG_MAGIC)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// TODO more checks
|
||||||
|
|
||||||
|
sess->dataOffset = hdr->dataOffset;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static Word DoMountURL(struct GSOSDP *dp) {
|
static Word DoMountURL(struct GSOSDP *dp) {
|
||||||
if (dp->dibPointer->extendedDIBPtr != NULL) {
|
if (dp->dibPointer->extendedDIBPtr != NULL) {
|
||||||
dp->transferCount = 0;
|
dp->transferCount = 0;
|
||||||
@ -207,20 +224,23 @@ static Word DoMountURL(struct GSOSDP *dp) {
|
|||||||
return drvrIOError;
|
return drvrIOError;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum RequestResult requestResult = DoHTTPRequest(sess, 0, sizeof(sess->fileHeaderBuf) - 1);
|
enum RequestResult requestResult = DoHTTPRequest(sess, 0, sizeof(sess->fileHeader) - 1);
|
||||||
if (requestResult != REQUEST_SUCCESSFUL) {
|
if (requestResult != REQUEST_SUCCESSFUL) {
|
||||||
// TODO arrange for more detailed error reporting
|
// TODO arrange for more detailed error reporting
|
||||||
dp->transferCount = 0;
|
dp->transferCount = 0;
|
||||||
return drvrIOError;
|
return drvrIOError;
|
||||||
}
|
}
|
||||||
|
|
||||||
InitReadTCP(sess, sizeof(sess->fileHeaderBuf), &sess->fileHeaderBuf);
|
InitReadTCP(sess, sizeof(sess->fileHeader.buf), &sess->fileHeader.buf);
|
||||||
while (TryReadTCP(sess) == rsWaiting)
|
while (TryReadTCP(sess) == rsWaiting)
|
||||||
// TODO timeout
|
// TODO timeout
|
||||||
/* keep reading */ ;
|
/* keep reading */ ;
|
||||||
//TODO detect errors
|
//TODO detect errors
|
||||||
|
|
||||||
//TODO detect 2mg
|
Word checkResult = CheckTwoImg(sess);
|
||||||
|
if (checkResult != 0) {
|
||||||
|
// TODO error
|
||||||
|
}
|
||||||
|
|
||||||
//TODO report disk switch
|
//TODO report disk switch
|
||||||
|
|
||||||
@ -237,7 +257,7 @@ static Word DoRead(struct GSOSDP *dp) {
|
|||||||
//TODO check size is multiple of a block
|
//TODO check size is multiple of a block
|
||||||
//TODO disk-switched logic
|
//TODO disk-switched logic
|
||||||
|
|
||||||
unsigned long readStart = dp->blockNum * dp->blockSize;
|
unsigned long readStart = dp->blockNum * dp->blockSize + sess->dataOffset;
|
||||||
unsigned long readEnd = readStart + dp->requestCount - 1;
|
unsigned long readEnd = readStart + dp->requestCount - 1;
|
||||||
|
|
||||||
enum RequestResult requestResult = DoHTTPRequest(sess, readStart, readEnd);
|
enum RequestResult requestResult = DoHTTPRequest(sess, readStart, readEnd);
|
||||||
|
20
session.h
20
session.h
@ -3,6 +3,18 @@
|
|||||||
|
|
||||||
#include <types.h>
|
#include <types.h>
|
||||||
|
|
||||||
|
struct TwoImgHeader {
|
||||||
|
LongWord twoImgID;
|
||||||
|
LongWord appTag;
|
||||||
|
Word headerLength;
|
||||||
|
Word version;
|
||||||
|
LongWord imgFormat;
|
||||||
|
LongWord flag;
|
||||||
|
LongWord nBlocks;
|
||||||
|
LongWord dataOffset;
|
||||||
|
LongWord dataLength;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct Session {
|
typedef struct Session {
|
||||||
/* Marinetti TCP connection status */
|
/* Marinetti TCP connection status */
|
||||||
Word ipid;
|
Word ipid;
|
||||||
@ -48,8 +60,14 @@ typedef struct Session {
|
|||||||
/* Expected length of disk image */
|
/* Expected length of disk image */
|
||||||
LongWord expectedLength;
|
LongWord expectedLength;
|
||||||
|
|
||||||
|
/* Offset of disk image blocks within file */
|
||||||
|
LongWord dataOffset;
|
||||||
|
|
||||||
/* Buffer for initial bytes of file (which may be a disk image header) */
|
/* Buffer for initial bytes of file (which may be a disk image header) */
|
||||||
unsigned char fileHeaderBuf[32];
|
union {
|
||||||
|
unsigned char buf[32];
|
||||||
|
struct TwoImgHeader twoImgHeader;
|
||||||
|
} fileHeader;
|
||||||
} Session;
|
} Session;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user