-> ReadSecs 1.0 (c) 22.01.1995 Rafal Wiosna -> ----------------------------------------------------------------------------------- -> -> To jest bardzo prosty program demonstrujâcy uûycie -> trackdisk.device -- ReadSecs czyta sektory i zapisuje -> je do pliku. Moûna to zrobiê inaczej (szczególnie nie -> naleûaîoby zabieraê pamiëci na caîy czytany obszar -> (wystarczy jedna ôcieûka = 11 sektorów), ale to tylko -> przykîad! -> -> Acha, wszelkie teksty sâ po angielsku, ale nie znaczy to, -> ûe nie jestem jego autorem!!! -> -> I jeszcze coô -- wersja 3.x E oferuje nowy sposób -> wprowadzania komentarzy, jak to widaê w zaîâczonym -> tym przydîugim tekôcie wprowadzajâcym... MODULE 'exec/io','exec/ports', 'devices/trackdisk','dos/dos' ENUM OK,ERRNOMEM, ERRDEVOPN, ERRTDREAD, ERRNODISK, ERRNOPORT, ERRNOREQ, ERRBADARGS, ERRCANTLOCK, ERROPEN, ERRWRITE ENUM ARGUNIT, ARGSTART, ARGEND, ARGFILE RAISE ERRNOMEM IF New()=NIL CONST MOTOR_OFF=0, MOTOR_ON=1 DEF trdiorequest:PTR TO iostd,myport,myargs:PTR TO LONG,rdargs,fh PROC main() HANDLE DEF trmem WriteF('\e[1mReadSecs\e[0m 1.0 (c) 1995 Rafal Wiosna.\n') startup() trmem:=readsectors(Long(myargs[ARGSTART]),Long(myargs[ARGEND])) savemem(trmem,((Long(myargs[ARGEND])-Long(myargs[ARGSTART])+1)*TD_SECTOR),myargs[ARGFILE]) 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) ENDPROC