home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 03 / ami041a.txt < prev    next >
Text File  |  1997-04-06  |  5KB  |  318 lines

  1. -> ReadSecs 1.0 (c) 22.01.1995 Rafal Wiosna
  2.  
  3. -> -----------------------------------------------------------------------------------
  4.  
  5. ->
  6.  
  7. -> To jest bardzo prosty program demonstrujâcy uûycie
  8.  
  9. -> trackdisk.device -- ReadSecs czyta sektory i zapisuje
  10.  
  11. -> je do pliku. Moûna to zrobiê inaczej (szczególnie nie
  12.  
  13. -> naleûaîoby zabieraê pamiëci na caîy czytany obszar
  14.  
  15. -> (wystarczy jedna ôcieûka = 11 sektorów), ale to tylko
  16.  
  17. -> przykîad!
  18.  
  19. ->
  20.  
  21. -> Acha, wszelkie teksty sâ po angielsku, ale nie znaczy to,
  22.  
  23. -> ûe nie jestem jego autorem!!!
  24.  
  25. ->
  26.  
  27. -> I jeszcze coô -- wersja 3.x E oferuje nowy sposób
  28.  
  29. -> wprowadzania komentarzy, jak to widaê w zaîâczonym
  30.  
  31. -> tym przydîugim tekôcie wprowadzajâcym...
  32.  
  33.  
  34.  
  35.  
  36.  
  37.  
  38.  
  39. MODULE 'exec/io','exec/ports', 'devices/trackdisk','dos/dos'
  40.  
  41.  
  42.  
  43. ENUM OK,ERRNOMEM, ERRDEVOPN, ERRTDREAD, ERRNODISK, ERRNOPORT, ERRNOREQ, ERRBADARGS, ERRCANTLOCK, ERROPEN, ERRWRITE
  44.  
  45.  
  46.  
  47. ENUM ARGUNIT, ARGSTART, ARGEND, ARGFILE
  48.  
  49.  
  50.  
  51. RAISE ERRNOMEM IF New()=NIL
  52.  
  53.  
  54.  
  55. CONST MOTOR_OFF=0, MOTOR_ON=1
  56.  
  57.  
  58.  
  59. DEF trdiorequest:PTR TO iostd,myport,myargs:PTR TO LONG,rdargs,fh
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67. PROC main() HANDLE
  68.  
  69.  
  70.  
  71. DEF trmem
  72.  
  73.  
  74.  
  75.     WriteF('\e[1mReadSecs\e[0m 1.0 (c) 1995 Rafal Wiosna.\n')
  76.  
  77.     startup()
  78.  
  79.     trmem:=readsectors(Long(myargs[ARGSTART]),Long(myargs[ARGEND]))
  80.  
  81.     savemem(trmem,((Long(myargs[ARGEND])-Long(myargs[ARGSTART])+1)*TD_SECTOR),myargs[ARGFILE])
  82.  
  83.     WriteF('Image written to file \s\n',myargs[ARGFILE])
  84.  
  85.  
  86.  
  87. EXCEPT DO
  88.  
  89.  
  90.  
  91.     cleanup()
  92.  
  93.  
  94.  
  95.     IF exception
  96.  
  97.         SELECT exception
  98.  
  99.             CASE ERRNOMEM; WriteF('Cannot allocate needed memory')
  100.  
  101.             CASE ERRDEVOPN; WriteF('Cannot open trackdisk.device unit 0')
  102.  
  103.             CASE ERRTDREAD
  104.  
  105.                 WriteF('failed\nDoIO() returned error ')
  106.  
  107.                 tderrorhandle(exceptioninfo)
  108.  
  109.             CASE ERRNODISK; WriteF('No disk in drive')
  110.  
  111.             CASE ERRNOPORT; WriteF('Cannot create msgport')
  112.  
  113.             CASE ERRNOREQ; WriteF('Cannot create IOrequest')
  114.  
  115.             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')
  116.  
  117.             CASE ERROPEN; WriteF('Cannot open file \s for writing',exceptioninfo)
  118.  
  119.             CASE ERRWRITE; WriteF('Cannot write to file \s for writing',exceptioninfo)
  120.  
  121.         ENDSELECT
  122.  
  123.         WriteF(', program terminated.\n')
  124.  
  125.     ENDIF
  126.  
  127.  
  128.  
  129. ENDPROC
  130.  
  131.  
  132.  
  133.  
  134.  
  135.  
  136.  
  137. PROC startup()
  138.  
  139.  
  140.  
  141.     myargs:=New(4*4)
  142.  
  143.     IF (rdargs:=ReadArgs('UNIT/N,STARTSECTOR/N,ENDSECTOR/N,SAVETOFILE/A',myargs,NIL))=NIL THEN Raise(ERRBADARGS)
  144.  
  145.     IF (myport:=CreateMsgPort())=NIL THEN Raise(ERRNOPORT)
  146.  
  147.     IF (trdiorequest:=CreateIORequest(myport,SIZEOF iostd))=NIL THEN Raise(ERRNOREQ)
  148.  
  149.     IF OpenDevice('trackdisk.device',0,trdiorequest,NIL) THEN Raise(ERRDEVOPN)
  150.  
  151.  
  152.  
  153. ENDPROC
  154.  
  155.  
  156.  
  157.  
  158.  
  159.  
  160.  
  161. PROC cleanup()
  162.  
  163.  
  164.  
  165.     IF fh THEN Close(fh)
  166.  
  167.     IF trdiorequest
  168.  
  169.         CloseDevice(trdiorequest)
  170.  
  171.         DeleteIORequest(trdiorequest)
  172.  
  173.     ENDIF
  174.  
  175.     IF myport THEN DeleteMsgPort(myport)
  176.  
  177.     IF rdargs THEN FreeArgs(rdargs)
  178.  
  179.  
  180.  
  181. ENDPROC
  182.  
  183.  
  184.  
  185.  
  186.  
  187.  
  188.  
  189. PROC readsectors(startsec,endsec)
  190.  
  191.  
  192.  
  193.     DEF numsec,memsec,doioerr
  194.  
  195.  
  196.  
  197.     trdiorequest.command:=TD_CHANGESTATE
  198.  
  199.     trdiorequest.flags:=IOF_QUICK
  200.  
  201.     DoIO(trdiorequest)
  202.  
  203.     IF trdiorequest.actual THEN Raise(ERRNODISK)
  204.  
  205.  
  206.  
  207.     numsec:=endsec-startsec+1
  208.  
  209.     memsec:=New(numsec*TD_SECTOR)
  210.  
  211.  
  212.  
  213.     WriteF('\nReading \d sectors (\d to \d) from DF\d:...',numsec,startsec,endsec,Long(myargs[ARGUNIT]))
  214.  
  215.  
  216.  
  217.     trdiorequest.command:=CMD_READ
  218.  
  219.     trdiorequest.flags:=IOF_QUICK
  220.  
  221.     trdiorequest.data:=memsec
  222.  
  223.     trdiorequest.length:=numsec*TD_SECTOR
  224.  
  225.     trdiorequest.offset:=startsec*TD_SECTOR
  226.  
  227.     doioerr:=DoIO(trdiorequest)
  228.  
  229.  
  230.  
  231.     trdiorequest.command:=TD_MOTOR
  232.  
  233.     trdiorequest.flags:=IOF_QUICK
  234.  
  235.     trdiorequest.length:=MOTOR_OFF
  236.  
  237.     DoIO(trdiorequest)
  238.  
  239.  
  240.  
  241.     IF doioerr THEN Throw(ERRTDREAD,doioerr) ELSE WriteF(' done!\n')
  242.  
  243.  
  244.  
  245. ENDPROC memsec
  246.  
  247.  
  248.  
  249.  
  250.  
  251.  
  252.  
  253. PROC tderrorhandle(tderror)
  254.  
  255.  
  256.  
  257. DEF tderr
  258.  
  259.  
  260.  
  261.     tderr:=tderror-TDERR_NOTSPECIFIED-1
  262.  
  263.     WriteF('\d: \s',tderror,ListItem([
  264.  
  265.         'TDERR_NoSecHdr - couldnt even find a sector',
  266.  
  267.         'TDERR_BadSecPreamble - sector looked wrong',
  268.  
  269.         'TDERR_BadSecID - ditto',
  270.  
  271.         'TDERR_BadHdrSum - header had incorrect checksum',
  272.  
  273.         'TDERR_BadSecSum - data had incorrect checksum',
  274.  
  275.         'TDERR_TooFewSecs - couldnt find enough sectors',
  276.  
  277.         'TDERR_BadSecHdr - sector looked wrong',
  278.  
  279.         'TDERR_WriteProt - cant write to a protected disk',
  280.  
  281.         'TDERR_DiskChanged - no disk in the drive',
  282.  
  283.         'TDERR_SeekError - couldnt find track 0',
  284.  
  285.         'TDERR_NoMem - out of memory',
  286.  
  287.         'TDERR_BadUnitNum - asked for a unit > NUMUNITS',
  288.  
  289.         'TDERR_BadDriveType - not a drive that trackdisk groks',
  290.  
  291.         'TDERR_DriveInUse - someone else allocated the drive',
  292.  
  293.         'TDERR_PostReset - user hit reset; awaiting doom'],tderr))
  294.  
  295.  
  296.  
  297. ENDPROC
  298.  
  299.  
  300.  
  301.  
  302.  
  303.  
  304.  
  305. PROC savemem(memptr,memsize,savefile)
  306.  
  307.  
  308.  
  309.     IF (fh:=Open(savefile,MODE_NEWFILE))=NIL THEN Throw(ERROPEN,savefile)
  310.  
  311.     IF (Write(fh,memptr,memsize))<>memsize THEN Throw(ERRWRITE,savefile)
  312.  
  313.  
  314.  
  315.  
  316.  
  317. ENDPROC
  318.