WriteF('Image written to file \s\n',myargs[ARGFILE])
EXCEPT DO
cleanup()
IF exception
SELECT exception
CASE ERRNOMEM; WriteF('Cannot allocate needed memory')
CASE ERRDEVOPN; WriteF('Cannot open trackdisk.device unit 0')
CASE ERRTDREAD
WriteF('failed\nDoIO() returned error ')
tderrorhandle(exceptioninfo)
CASE ERRNODISK; WriteF('No disk in drive')
CASE ERRNOPORT; WriteF('Cannot create msgport')
CASE ERRNOREQ; WriteF('Cannot create IOrequest')
CASE ERRBADARGS; WriteF('\nUsage: ReadSecs unit startsector endsector filename\nExample: ReadSecs 0 0 1759 RAM:disk - reads the whole disk into file RAM:disk\n\nBad arguments')
CASE ERROPEN; WriteF('Cannot open file \s for writing',exceptioninfo)
CASE ERRWRITE; WriteF('Cannot write to file \s for writing',exceptioninfo)
ENDSELECT
WriteF(', program terminated.\n')
ENDIF
ENDPROC
PROC startup()
myargs:=New(4*4)
IF (rdargs:=ReadArgs('UNIT/N,STARTSECTOR/N,ENDSECTOR/N,SAVETOFILE/A',myargs,NIL))=NIL THEN Raise(ERRBADARGS)
IF (myport:=CreateMsgPort())=NIL THEN Raise(ERRNOPORT)
IF (trdiorequest:=CreateIORequest(myport,SIZEOF iostd))=NIL THEN Raise(ERRNOREQ)
IF OpenDevice('trackdisk.device',0,trdiorequest,NIL) THEN Raise(ERRDEVOPN)
ENDPROC
PROC cleanup()
IF fh THEN Close(fh)
IF trdiorequest
CloseDevice(trdiorequest)
DeleteIORequest(trdiorequest)
ENDIF
IF myport THEN DeleteMsgPort(myport)
IF rdargs THEN FreeArgs(rdargs)
ENDPROC
PROC readsectors(startsec,endsec)
DEF numsec,memsec,doioerr
trdiorequest.command:=TD_CHANGESTATE
trdiorequest.flags:=IOF_QUICK
DoIO(trdiorequest)
IF trdiorequest.actual THEN Raise(ERRNODISK)
numsec:=endsec-startsec+1
memsec:=New(numsec*TD_SECTOR)
WriteF('\nReading \d sectors (\d to \d) from DF\d:...',numsec,startsec,endsec,Long(myargs[ARGUNIT]))
trdiorequest.command:=CMD_READ
trdiorequest.flags:=IOF_QUICK
trdiorequest.data:=memsec
trdiorequest.length:=numsec*TD_SECTOR
trdiorequest.offset:=startsec*TD_SECTOR
doioerr:=DoIO(trdiorequest)
trdiorequest.command:=TD_MOTOR
trdiorequest.flags:=IOF_QUICK
trdiorequest.length:=MOTOR_OFF
DoIO(trdiorequest)
IF doioerr THEN Throw(ERRTDREAD,doioerr) ELSE WriteF(' done!\n')
ENDPROC memsec
PROC tderrorhandle(tderror)
DEF tderr
tderr:=tderror-TDERR_NOTSPECIFIED-1
WriteF('\d: \s',tderror,ListItem([
'TDERR_NoSecHdr - couldnt even find a sector',
'TDERR_BadSecPreamble - sector looked wrong',
'TDERR_BadSecID - ditto',
'TDERR_BadHdrSum - header had incorrect checksum',
'TDERR_BadSecSum - data had incorrect checksum',
'TDERR_TooFewSecs - couldnt find enough sectors',
'TDERR_BadSecHdr - sector looked wrong',
'TDERR_WriteProt - cant write to a protected disk',
'TDERR_DiskChanged - no disk in the drive',
'TDERR_SeekError - couldnt find track 0',
'TDERR_NoMem - out of memory',
'TDERR_BadUnitNum - asked for a unit > NUMUNITS',
'TDERR_BadDriveType - not a drive that trackdisk groks',
'TDERR_DriveInUse - someone else allocated the drive',
'TDERR_PostReset - user hit reset; awaiting doom'],tderr))
ENDPROC
PROC savemem(memptr,memsize,savefile)
IF (fh:=Open(savefile,MODE_NEWFILE))=NIL THEN Throw(ERROPEN,savefile)
IF (Write(fh,memptr,memsize))<>memsize THEN Throw(ERRWRITE,savefile)