10 REM > MDRDump 1.15
   20 REM v1.15 Added -short option
   30 :
   40 ON ERROR REPORT:PROCClose_All:PRINT:PROCexit(ERR):END
   50 seclen%=543:DIM ctrl% 31,mem% seclen%-1:in%=0:X%=ctrl%:Y%=X%DIV256
   60 A$=FNOS_GetEnv:IFos%>31:PROCWin_TextIO
   70 ro$="":IFA$="":INPUT"Input microdrive file: "A$
   80 A%=INSTR(A$+" "," "):IFA%:in$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1)
   90 A%=INSTR(A$+" "," "):IFA%:ro$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1)
  100 IFin$="-?":PRINT"Syntax: DumpMDR <filename> (-short)":PROCexit(0):END
  110 IFin$="":PROCexit(0):END
  120 :
  130 in%=FNf_openin(in$):IF in%=0:PRINT"'"in$"' not found":PROCexit(214):END
  140 ptr%=0:REPEAT
  150   PROCgbpb(3,in%,mem%,seclen%,ptr%):ptr%=ptr%+seclen%
  160   PRINT FNh0(mem%?00,2);" Sec=";FNh0(mem%?01,2);" "FNh0(mem%!02,4);" ";
  170   PRINT FNstr(mem%+04,10);" CRC=";FNh0(mem%?14,2);" ";
  180   PRINT "Flg=";FNh0(mem%?15,2);" Rec=";FNh0(mem%?16,2);" Len="FNh0(mem%!17,4);" ";
  190   PRINT FNstr(mem%+19,10);" CRC=";FNh0(mem%?29,2);" ";
  200   IF ro$="":PRINT'" Data:";FNdmp(mem%+30,30);" CRC=";FNh0(mem%?(seclen%-1),2);
  210   PRINT
  220 UNTIL EOF#in% OR ptr%>EXT#in%
  230 CLOSE#in%:in%=0:PROCexit(0):END
  240 :
  250 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
  260 DEFFNdmp(A%,N%):FOR B%=A% TO A%+N%-1:PRINT FNh0(?B%,2);:NEXT:=""
  270 DEFFNstr(A%,N%):FOR B%=A% TO A%+N%-1:A%=?B% AND 127:IF A%=127 OR A%<32:A%=ASC"."
  280 VDU A%:NEXT:=""
  290 :
  300 DEFPROCClose_All:*EXEC
  310 in%=in%:IFin%:A%=in%:in%=0:CLOSE#A%
  320 ENDPROC
  330 :
  340 DEFFNf_openin(A$)=OPENIN(FNf_name(A$))
  350 DEFFNf_name(A$):IFos%>31:LOCALA%,B%:REPEATB%=A%:A%=INSTR(A$,"\",A%+1):UNTILA%=0:IFINSTR(A$,".",B%)=0:A$=A$+"."
  360 =A$
  370 :
  380 DEFPROCgbpb(A%,chn%,addr%,num%,ptr%)
  390 ?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:IFPAGE<&FFFFF:CALL &FFD1:ENDPROC
  400 IFA%=1ORA%=3:PTR#?X%=X%!9
  410 REPEAT:IFA%=1ORA%=2:BPUT#?X%,?X%!1 ELSE IFA%=3ORA%=4:?X%!1=BGET#?X%
  420 X%!1=X%!1+1:X%!5=X%!5-1:UNTIL(EOF#?X% AND A%>2)OR X%!5<1:ENDPROC
  430 :
  440 DEFFNOS_GetEnv:LOCALA%,X%,Y%,P%,A$:X%=1:os%=((USR&FFF4)AND&FF00)DIV256:DIMX%TRUE
  450 IF!PAGE=&D7C1C7C5:run$=ARGV$(0):IFARGC:FORA%=1TOARGC:A$=A$+ARGV$(A%)+" ":NEXT:=LEFT$(A$,LENA$-1)ELSEIF!PAGE=&D7C1C7C5:=""
  460 IFPAGE>&FFFFF:DIMX%LOCAL256:A$=@cmd$:SYS"GetModuleFileName",0,X%,255:run$=$$X%:Y%=INSTR(@lib$,@tmp$)=0:P%=TRUE
  470 IFP%=0:IFHIMEM>&FFFF:run$=$&8100:SYS"OS_GetEnv"TOA$,,A%:SYS"OS_WriteEnv","",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):P%=TRUE:Y%=TRUE:IFINSTR(A$," ")=0:A$=run$+" "
  480 IFP%=0:P%=X%:[OPT 0:NOP:]:P%=?X%:Y%=TRUE:IFP%=&EAORP%=18:A$=$&600 ELSEIFP%=0:A$=$(PAGE-&300)ELSEIFP%=&A0:A$=$(^@%-256):Y%=?(PAGE-2)AND64ELSEIFP%=&90:A$=$&100:Y%=!&200
  490 A$=" "+A$:REPEATREPEATA$=MID$(A$,2):UNTILASCA$<>32:IFASCA$=34:A%=INSTR(A$,"""",2)+1ELSEA%=INSTR(A$+" "," ")
  500   IFY%:run$=LEFT$(A$,A%-1):A$=MID$(A$,A%+1):Y%=0
  510 UNTILASCA$<>32:=A$
  520 :
  530 DEFPROCos(A$):IFASCA$=42:OSCLIA$ ELSE IFA$<>"":CHAINA$
  540 ENDPROC
  550 :
  560 DEFPROCexit(A%):OSCLI"FX1,"+STR$(A%AND255):quit$=quit$:A$=quit$:quit$="":PROCos(A$)
  570 IFPAGE>&FFFFF:QUIT A% ELSE END
  580 ENDPROC
  590 :
  600 DEFPROCWin_TextIO
  610 SYS "GetStdHandle",-10 TO @hfile%(1):*INPUT 13
  620 SYS "GetStdHandle",-11 TO @hfile%(2):*OUTPUT 14
  630 SYS "SetConsoleMode",@hfile%(1),0:ENDPROC
  640 :