MODULE 'exec/io';PROC main();DEF m,p,i:PTR TO iostd,n;WriteF('SOS disk format reader\n\n');IF m:=AllocMem(512*11*2*80,1);IF p:=CreateMsgPort();IF i:=CreateIORequest(p,SIZEOF iostd);IF(OpenDevice('trackdisk.device',0,i,0))=0 WriteF('Insert a SOS disk into DF0: and press RETURN\n');n:=Inp(stdin);WriteF('Reading disk...');i.command:=2;i.offset:=0;i.length:=512*11*2*80;i.data:=m;n:=DoIO(i);i.command:=9;i.length:=0;DoIO(i) IF n THEN WriteF('\nError reading disk!') ELSE part2(m) WriteF('\n');CloseDevice(i);ENDIF;DeleteIORequest(i);ENDIF;DeleteMsgPort(p);ENDIF;FreeMem(m,512*11*2*80);ENDIF;ENDPROC PROC part2(m);DEF o,l,n,f;WriteF('\nSeeking directory block...') MOVE.L dosbase,A6 MOVE.L m,A2 MOVE.L A2,D0 MOVE.L D0,D2 ADD.L #512*100,D0 a: ADD.L #512,A2 CMP.L #"load",8(A2) BEQ.S d MOVE.L A2,D1 CMP.L D0,D1 BNE.S a WriteF('\nNot an SOS disk!');RETURN d: MOVE.L (A2),o ADD.L D2,o MOVE.L 4(A2),l LEA 8(A2),A3 MOVE.L A3,n MOVEM.L A2/D2,-(A7) WriteF('\nSaving "\s" (\d bytes)...',n,l);IF(f:=Open(n,NEWFILE));Write(f,o,l);Close(f);IF CtrlC() THEN RETURN;ENDIF MOVEM.L (A7)+,A2/D2 ADD.L #32,A2 CMP.L #0,(A2) BNE d ENDPROC