IMD 1.16: 31/05/2007 19:46:28 FOGCPM.099 --FOGCPM099BD03 COM*BD HLP DIAG204 COM DIAG204 COM-07-00 86 DISKDOC COMW !"#$%&'()*DISKDOC DOC1+,-./01DISKX COM23456789:;<=>?@ADISKX COM BC-CPM099 DOCDISKX10 DOCDEFGDISKX DTA'HIJKLDISKX INSMNOPDISKXINSCOMQRSTUVWXYZ[\]^_`DISKXINSCOMCabcdefghiFAST COMjFAST DOC klOSPD COM8mnopqrsOSPD C tuvwxyz{|}~OSPD C PK COMPK DOC,READTRAKCOMREADTRAKDOCREGROUP COM_REGROUP DOC REGROUP PASLTD COMTD DOCThis is the disk name. OBD v03 - 01 May 86 - put user number in 0103h, FF in 0105h to show progress, 0 to suppress. Program finds and locks out any bad blocks, then shows any files that are affected. Irv Hoff $::: 2:<2د2> *> _  |{0 ~#fos#r~og}o|g11 . { v v *"|!,|}!££,ɯ|ʏ!|}!-|}ʌz!--{!-z{Ìz{!||g}o){ozg|/g}/o%#DMp|PPDM͘,,|,N#F#xo~#~#XX!xGyO҅҅;7*!;;7*!}!&6U:V !Y !k:*@| { :*@+}2*#^ *2!}2(!}2$!*!ͯʉ * ?#}+× *"&":(@|0 !}2%:%@!-  :%@#}2%+ *:$@#}2$+)*##"++27 Æ !}2%:%@!ʆ Z :%@#}2%+7 *:$@#}2$+)*&#"&+?!E7K ñ **?#}*!7*:$@)!}2#7}2)!}2$*2#!6*?6"**2ʚ *#"+ **:$@)2͑^ !6k*ͳ*:#@#}2#+)*7:$@#}2$+× |ʗ !}2)!Hk*ͳ*:#@#}2#+)*7 **27:)@| *:#@:(@ͩ:*@!l :# !Zk!bk:#@ͳ!}2-!D"*!?}!*}2%:-@!C :%@!͉ͯʮ ` !!}2%% !:%@!"/*/|’ */?!͉ʛ L */""&:(@|. !}2.:.@!+ :.@#}2.+ú *##"++2*:#@,|( */*+! :-@#}2-+1Y+ ë !}2.:.@!ʫ X :.@#}2.+5 *&#"&+?!E*:#@,|ʨ */*+! :-@#}2-+1Yë I L :-@|ʌ!yk!}2%*+"&:%@:-@ʉ :%@#}2%+ !k* ͳ!}2.:.@!A.:.@#}2.+ *&#"&+?e! e!}2.:.@!ʆs:.@#}2.+P*&#"&+?ed Ô!k!k!"!*!9?|!!}2!}2:@!9? :@#}2+:@:@Eͥʵ:@|{* ?*?}*!}!*!͑k!N* ?#}+!*!͑ʚ!N*""*!}!9?|*##"++!92:@)27*#"+!92:@)2}!!9?E*?#1+"**!E#}* *!}!*!͑r!N!92?|ʛ!92#7+?etU}2s:s@!a:s@!zͽ͉:s@:s@! "!}2:@!&:@#}2+*#"+!}**!}2'!9?+}2(:'@:(@:'@:(@!6}2)!92:)@)2"***! 92͑ʤ!"*!92**:)@+}2(:)@#}2'C!Ý;*!9!}!"!92#7+!9?! Q"!9?#}+*#"?!92#7+?ͯN!"3!F*W!"W*W! ʢ*W#"W+c!92#7+!92#7?}t"W!92!92!92!92! !!ͽ!N*2#7+"*#"*2+7#ͯ"!N!" * 2" * !E!ͯM!N!92Ý!kú!kú!kú!kú!kú!kúúV* !922!E BD v02 - bad disk blocks/files check drive: checking.... 0 checking.... check drive: prior check: %d this check: %d bad blocks on : %d bad files: %c:bad files on : 0  will not work with MP/M will not work if BIOS is in ROM Sync error ++ error closing file ++ ++ directory is full ++ 9?! Q"!9?#}+*#"?!92#7+?ͯN!"3!F*W!"W*W! ʢ*W#"W+c!92#7+!92#7?}t"W!92!92!92!92! !!ͽ!N*2#7+"*#"*2+7#ͯ"!N!" * 2" * !E!ͯM!N!92Ý!kú!kú!kú!kú!kú!kúúV* !922!E BD v02 - bad disk blocks/files check drive: checking.... 0 checking.... check drive: prior check: %d this check: %d bad blocks on : %d bad files: %c:bad files on : 0  will not work with MP/M will not work if BIOS is in ROM Sync error ++ error closing fi BD BAD DISK PROGRAM =================== 01 May 1986 GENERAL: ------- 'BD' stands for "bad disk". It reads the records on a disk (floppy or hard) and finds those that are unacceptable. It locks out the blocks containing those records into a file called [LOCKED].OUT. It then shows what files (if any) are defective. (The program is 5k long.) Small floppies have blocks with 8 records (1k), larger floppies have blocks with 16 records (2k) and most large hard drives have blocks with 32 records (4k). 'BD' has a progress report by showing the current block count, each five blocks. If/whenever a block has one or more bad records, this informa- ion overwrites the progress report. It then resumes the progress report on the following line. This gives an attractive display. TO USE: ------ Any of the following three will work. The first permits removing the disk from the current drive and replacing with the disk to be checked. Useful for only one drive or if you want to check a disk in any drive. (For floppies, it is often beneficial to check the same disk in every drive you have, they occasionally act differently in different drives.) A>BD activates pgm, will ask what drive A>BD B activates pgm, checks drive B: A>BD B: activates pgm, checks drive B: EXAMPLE 1: --------- If the disk already has a [LOCKED].OUT file from a previous check, the results might look like this: BD v03 - bad disk blocks/files check drive: A (automatically logs in that drive) checking.... prior check: 127 prior check: 148 prior check: 149 prior check: 160 this check: 162 prior check: 204 this check: 225 494 (total data blocks checked) bad blocks: 7 bad files: A:CRT ASM A:LIST DOC A> As it checks the file, if the current block has previously been reported as bad, that is shown as "prior check", and if not previously reported, it shows as "this check". Thus you can see if the disk has new problems since the prior check. You can manually erase the [LOCKED].OUT file if you wish and rerun the program to see what it will report "this time". (If results vary more than slightly, you may have a bum drive that is giving erratic results, or that initially did a poor job formatting the disk.) When showing 'bad files' it may show the same file name more than one time, indicating that particular file has multiple bad areas and will be difficult to rebuild into a normal file. EXAMPLE 2: --------- This is what you are hoping to see, for a normal disk: BD v03 - bad disk block/files check drive: B checking.... 494 bad blocks: 0 bad files : 0 A> OPTIONS: ------- 1) 0103h - sets the user area for [LOCKED].OUT file. 00 = user area zero 0F = user area 15 (then save 20 pages if using DDT or SID, etc.) 2) 0105h - turns progress reports on/off. You may want a version with them turned off, so you can use the printer to display the results. 00 = no progress reports FF = progress reports shown (anything but 00) - Irv Hoff W6FFC , or that initially did a poor job formatting the disk.) When showing 'bad files' it may show the same file name more than one time, indicating that particular file has multiple bad areas and will be difficult to rebuild into a normal file. EXAMPLE 2: --------- This is what you are hoping to see, for a normal disk: BD v03 - bad disk block/files check drive: B checking.... 494 bad blocks: 0 bad files : 0 A> OPTIONS: ------- 1) 0103h - sets the user area for [LOCKED].OUT file. 00 = user area zero 0F = user area 15 (then save 20 pages if using DDT or SID, etc.) 2) 0105h - turns progress reports on/off. You may want a version with them turned off, so you can us> 2l&*RB"*!F*"%"!F"*+*!:RJA!:K͹:O!0!A!n"B!"C!"D!"E!c$F!"G!H!I!J!(K!DL!M!1P!A=Q!D4S!)5T!-U!Q-V!)W!+X!(Y!+Zc!7FIELD SERVICE SYSTEM CONFIDENCE TEST 2.04 OCC1 O = cOnfidence test MEMORY MISCELLANEOUS A = refresh L = rom test B = galpat M = display sector C = v-bar N = D = diagonal P = DRIVE EXER E = run all memory test Q = step rate F = alter refresh delay R = S = screen pattern DRIVE G = drive A ERROR SUMMARIES H = drive B T = print disk errors, serial I = drives A & B U = print disk errors, parallel V = display disk errors hard PORT W = display disk errors soft J = serial X = display memory K = parallel Y = clear error totals  Z = exit$>2>W2*:2*>2:(! : !:!:>V2P! P2DX(>2:(:(* #" :(!$:!4::V : ! :>U2P: ::Ʉ(J) serial port test $SERIAL PORT TEST 300 BAUD$SERIAL PORT TEST 1200 BAUD$ ** FAIL ** $ -- PASS -- $!L*: (!f :(.* #" %!:!f :(!$:!4:::(K) parallel port test $>2~>2P!:(!: !:!:22!"P2*!<8*|):o(|g}o"*#"P2: *">2**R(*#": b*>;!:*!R !:0*!UR !:*!2#U! o:(Y) clear all error counters $!n:(Z) exit diagnostics $=7 INPUT LETTER COMMAND: $ REFRESH MEMORY TEST $ GALPAT MEMORY TEST  $ V-BAR MEMORY TEST $ MOVING DIAGONAL MEMORY TEST $ PARALLEL PORT TEST $ SERIAL PORT TEST $ SD FORMATING DRIVE B TRACK 0$ HEAD MOVEMENT TEST TRACK $ ALTERNATING SEEK TEST TRACK $ DD ACCORDION SEEK/WRITE/READ/VERIFY TRACK $ DD ACCORDION SEEK/READ/VERIFY TRACK $ DD RANDOM SEEK/WRITE/READ/VERIFY TRACK $ DD RANDOM SEEK/READ/VERIFY TRACK $ D SEEK/READ/VERIFY TRACK $ RANDOM SEEK TEST TRACK $ D SEEK/WRITE/READ/VERIFY TRACK $TEST CYCLE IS :$ ONE CYCLE PASSED $ NO CYCLES COMPLETED$ BURNIN PASSED $ * POSSIBLE REJECT *$ * * * REJECT * * *$HARD ERROR TOTALS ARE: ----------------------$KEYBOARD :$SERIAL PORT :$PARALLEL PORT :$MEMORY :$CPU :$DRIVE A :$DRIVE B :$ NUMB cyc# cyc# cyc# cyc# cyc# -------------------- ---- ---- ---- ---- ---- ----$ FORMAT/READ :$ MOVE/READ :$ READ :$ WRITE/READ :$SOFT ERROR TOTALS ARE: Use CTRL <- keys for ---------------------- drive B totals DRIVE A:$ NUMB cyc# cyc# cyc# cyc# cyc# DRIVE B:$ NUMB cyc# cyc# cyc# cyc# cyc# ------------- ---- ---- ---- ---- ---- ----  ------------- ---- ---- ---- ---- ---- ----$S.T. MOVE :$S.T. READ :$S.T. WRITE :$S.T. DISPLAY :$S.T. FORMAT :$HOME :$SEEK :$STEP :$STEPIN :$STEPOUT :$READ :$WRITE :$READADR :$READTRK :$FORMAT :$SELECT :$COMPARE :$  RE-ENTER - USE FOUR HEX DIGITS : $ 5$F(O) cOnfidence test $(I) drive A & B test $(G) drive A test $(H) drive B test $ SELECT DRIVE TEST DENSITIES S = Single Density Test only D = Double Density Test only B = Both Single and Double Density test $ SELECT TEST TYPE P = Pre-Test (2 Cycles) F = Final-Test (5 Cycles) L = Loop-Test (25 Cycles) $L!:!:͹:S :2D :@2B :2!:!:͹:P 2IF 2I L 2I!:>?2J)!:#!#* }(,!: $)#! :7$$* +}( !5 :O$$ͨ$* }c$(D*2>21! ":! :IP ~ 3#~ -)!t:͹:7F ~ #~ )!:c$L=7 ----> PRE-TEST COMPLETE$=7 ----> FINAL-TEST COMPLETE$!:>2J)2>21! ":þ!:>2J>!:>2J>2)1! "::('>Sh8 * }(8:d !o:͜88(:w>Dh* }!!P͜8(* +|!!P͜8(!!P͜8(!!P͜8(!!P͜8(!!P͜8(ɪI$m>2 >2V<8͠7:2>2* ;! :<87>2* ;! :<8͸7:<((2* ;! :<8ͬ7>'2* ;! :<8ͬ7>&2* ;! :<87>%2* ;! :<8͸7:=¼* +|(V22* ;! :<8ͬ7:O>'2* ;! :<8ͬ7:<(>K22*S ;!" :<8ͬ7>2*S ;!" :<ͬ7:=F* +}(8>d2͈:2* ;!` :<8ͬ7͈:X9:=™:2:2:V=7>2 ͜8>2:G(>S>D2, 2*\ ;!+ : :<(>2 * +|԰x>2 I8:G(>S>D2 22* ;! :<8ͬ7 :O>'2* ;! :<8ͬ7 :<(Z:G(>S>D2X 22* ;!W :<8ͬ7C:GO8 :O>'2* ;!W :<8ͬ7C:GO8 :<(:G(>S>D2 >22͈:2*' ;! :<8ͬ7 := :G(>S>D2 >22͈:2* ;! :<8ͬ7C:GO8 := ɯ2:G(>S>D2 * ;! :C:GO8 :<(nC>2V:G2n8G:G( !nU:!U:ͷ8:V=7~w#~w#~w# x r͇ͩS> 2>2 x22:ʝ!!>2 QC͜8:A2 :G >D>S2 2>2V:2<* ;! :'lQ͘7 >2:G͂7 :<(!7ͷ8:V= 7Q*K>2U:=G*K!U4:~\wvwQB"Q!Q[:G[:wɠu00 NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN(!'Y%#!#1#(ͨ$q"(!'Y% $)#1#(ͨ$Ì"(!'Y%7$$1#(ͨ$ç"(!'Y%O$$1#(ͨ$" (:t&!"=">*w 7A" "2t&_!u&^#V"r&"*_&#"_&*a&#"a&*]&#"]&!&͸#"j&|N#:j&N#2i&y#Oc#:i&y#O:l&#0:0:܏#Ԟ#!'͸#!'͸# c# c#"m&~Oc#*m&~##"m&þ#͸#*m&#~#*_!L&6 ##>r%ͣ%͈%<(>r%** &wͻ%0$#$$ɯ2M$$:M$$:M$/8$%6% >@Q$(!'Y%#!#(!'Y% $)#(!'Y%7$$(!'Y%O$$(ͨ$c$:Y&$:Z&$:[&$:\&$* #" *c&#"c&*e&#"e&*g&#"g&**2q&wͻ%:q&/#$**2q& &ͻ%:q&/#%**y/%6ͻ%# %6A&%**yR% &ͻ%# ?%>AE%"o&!&͸#*]&@# ;*o&͸#**2q&wͻ%:q&#|%**:q& &ͻ%:q&#Ô%*r&d>=@Iª% ¨%+}¦%<}%>%{%z"j&!&͸#*j&@#>%>%0:&2L&"M&x4&O!O& |-&}4&N#Fp+q*M&|O!Y& :L&w  d,XpPF CYCLES Select function: Test Range: Start End cycles errors ====== ====== Failing rams indicated by a one Location: 27 26 25 24 23 22 21 20 UA UB UC UD Refresh test Galpat test V-bar test Moving diagonal test  A) .1 ms B) .2 ms C) .5 ms D) 1.0 sec E) 5.0 sec F) 10.0 sec G) 30.0 sec H) 1.0 hr I) 2.0 hr Select Refresh delay time. press "RETURN" key to exit$c#ͭ#!&͸#*@#!&͸#*@#ͭ#ͭ#!&͸#!'͸#*_&>;9#*O&>;ͭ#!'͸#*a&>;9#*Q&>;ͭ#!'͸#*c&>;9#*S&>;ͭ#!'͸#*e&>;9#*U&>;ͭ#ͭ#!7'͸#:Y&̓#!'͸#:Z&̓#!'͸#:[&̓#!'͸#:\&̓#K DIAGNOSTICS 2.04 $SINGLE DENSITY TEST$DOUBLE DENSITY TEST$SINGLE/DOUBLE DENSITY TEST$>:!)::00!):!): 0!)::!:* >;!::(*{9:!:* >;!:* >;!:* >;:(E:!7:* >;!Y:!:!3 ;!:! ;!:! ;!:! ;:(E:!H:*A >;!Y:!:!} ;!:!M ;!:!e ;!:!Y ;!+:=7 $ $>:!:* >;! :* >;!~:* >;!:!4:! ;!H-:!4:! ;!E:! ;!H-:!E:! ;!V:! ;!H-:!V:! ;!g:! ;!H-:!g:!;!x:! ;!H-:!x:!;!:! ;!H-:!:!f ;!:! ;!H-:!:!r ;!:! ;!H-:!:!~ ;!:! ;!H-:!:! ;!:! ;!H-:!:! ;!:! ;!H-:!:! ;!:! ;!H-:!:! ;!:!* ;!H-:!:! ;!:!6 ;!H-:!:! ;!":!B ;!H-:!":! ;!3:!N ;!H-:!3:! ;!D:!Z ;!H-:!D:! ;: $!-::2->2> :> ͳ;>ͳ;>ͳ;!-Q;> :> :&.PARALLEL PORT PRINT OUT $(U) print parallel port $!.::2->@2> :> ͳ;>ͳ;>ͳ;!-Q;> :> :&.SERIAL PORT PRINT OUT $(T) print serial port $!Q;* ;!Q;{9V;!Q;* ;!Q;* ;!Q;* ;s;!7Q;* ;!YV;!Q;!3 ͒;!Q;! ͒;!Q;! ͒;!Q;! ͒;s;!HQ;*A ;!YV;!Q;!} ͒;!Q;!M ͒;!Q;!e ͒;!Q;!Y ͒;> ͳ;> ͳ;>ͳ;>ͳ;> ͳ;:-2> :> ͳ;>ͳ;>ͳ;!Q;* ;! Q;* ;!~V;* ;!V;!4Q;! ͒;!b1V;!4V;! ͒;!EQ;! ͒;!b1V;!EV;! ͒;!VQ;! ͒;!b1V;!VV;! ͒;!gQ;! ͒;!b1V;!gV;!͒;!xQ;! ͒;!b1V;!xV;!͒;!Q;! ͒;!b1V;!V;!f ͒;!Q;! ͒;!b1V;!V;!r ͒;!Q;! ͒;!b1V;!V;!~ ͒;!Q;! ͒;!b1V;!V;! ͒;!Q;! ͒;!b1V;!V;! ͒;!Q;! ͒;!b1V;!V;! ͒;!Q;! ͒;!b1V;!V;! ͒;!Q;!* ͒;!b1V;!V;! ͒;!Q;!6 ͒;!b1V;!V;! ͒;!"Q;!B ͒;!b1V;!"V;! ͒;!3Q;!N ͒;!b1V;!3V;! ͒;!DQ;!Z ͒;!b1V;!DV;! ͒;> ͳ;> ͳ;>ͳ;>ͳ;> ͳ; $&. /nCCP ͂7h9w27!2~2&o:2;#:.3ڷ1}(ڱ1>'222!B2~2&o_2;#:.31}<1= 1> 22B2{7ͬ7͐7C͂77B !͢3!g2:;4ҍ17ENTER TRACK TO USE (0..39)[ ] : $ENTER SECTOR TO USE (1..10)[ ] : $AGAIN ? (Y) : $!2͛:͹:77 7Aʙ2w22!3:A:::=3$ Select source drive for DISPLAY.(A or B)=4$ or press RETURN for main menu $ SELECTED DRIVE IS : $ H3I37E3h3ECTOR TO USE (1..10)[ ] : $A!3ʔ33ʆ37'U<U<dU< U<U<:|ւ4}4> :> :~4<< 3#}3y3o},3 ;3 ;~. 44Oy:<#4}3:ë3G24x24Ɛ'@':͹:Y7!w4::0:>)::͹: 770Z4Z427 SELECT STEP RATE FOR DRIVES: 0 = 6 Milliseconds 1 = 12 Milliseconds 2 = 20 Milliseconds 3 = 30 Milliseconds ENTER NUMBER (0-3) : CURRENT SETTING ($!55͛:͹:7g2G gGE EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gG gG gG gG gG gG gG gG gG gG gG gG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE gG EgG gGE EgG g2G $*8'*8**80*8 9*8f!78i!78l!78o!78r!78!78!!78$!78 ~!88*8!"8:g.6ͷ87:g.6>2V2n8K8:V=687>2V>2n8j8:V=T87<8ڙ87ڙ8ͬ7ڙ8:ʓ87Ú87Ú8>2V<8ڮ8͠7:V=ž878"9):! 8! ":F !8:! 8!f .:: 9G !:! 9! .::V=T9: T9G !:! M9!A ":.:O>=@I\9 Z9 *P>y9p9ɯ* }:* }:* }:* }:* }:* ::* ::* ::*3 ::*M ::*Y ::*e ::*} ::y:* | :: :!0!J!d!~!|O^#Vr+s":## ++  w#w xk:# X:>7Wxʄ:r xʄ:!_?(ڙ:(w~²:#~=G#~ʲ::~:#ʛ:(a:{: _:< > :> : ;> :;; y:n#f#>;;!:s;~$m;_#[;!|;V; $;!V;n#f#;œ;_;<;<;<;<}0>02<>0]T< ;=kbG:<<> x>2<0( :2:27>#0i< i< =c<7! ":>T̀Ð<0:<O;͹: <<_͹: <<<0<  <!e:͝2>5D![EC͔@> @=Ax?!=CBDe=7 |=͔=e=‡=?e= e=?e=::=GO!= >=>=">=͋A=x?!=C4 FOR MENU PICK, USE LEFT/RIGHT ARROWS THEN HIT RETURN͏C2?\>!>"͝C͖C?!>C\>U>!\?C!>?C͝CK"͖C?BD>>!\?C!>C!>+DD}>ʙ>>}>>'>!>C!>C!>+D>5Dh>Enter new track number (0 - 39): =A! Invalid track, please try againThis test will cycle the disc head between the current track and a new track.To stop test, press any key4 4 4 4 4 ͠D?!?C:G!?ͤC*?gD!?C!tAC:ʹ?!?Cÿ?!?CAB, 4 4 ??   :=@ @:=@ @2=!@v@!,@v@:@@@D@H@L@P@V@^@b@f@j@n@      ! ʈ@= @ EͤC!@C  HOME  SEEK  ALT  DRIVE  DRIVE   HEAD  TRACK  TRACK  TIMER  SELECT  !FAC       0 10 20 30 39DRIVE: TRACK: 7!AC͙B͏C͖C! BC7BگA]B AA!EC!E+DBDʻA!1BC”A!AC=A? 4 4 4 4 4 4 4 4 4 To stop test, HOLD down any key 4 mFOBLD!UBCB  BDiBfFLDfFʹBjF!kFw+#6.!dFCBDʖB!FC!BͤCEEDFLFTF!=F:ZEw+C> EBB!\F>B}.B!`F>-B!AFw+2ZECɯ7C y2(C|2)C}2*C(!(C+CCgoy k!aC 6#!aC&'&NCǹUC##aCiBfG~Cx~CƐ'@'5D:g.6͈Ci͈C~͈Cn#f#}Cx#Nw+C#qêC##! CG o'D C #D D}o#D!DD#D=G!Dw#w#C~5D#+D_͝CzD͉DzD͉DzD͉DzD͉D}0>02D>0]T< }D=kbG:D–D> x>2D0!ECBDʦDʈA_ADDæD2͏C2 DDD ED'D C #D D} o#D!!=E6E/E(E7'DEDEdDE DEDE0XE XE =RE7OSBORNE DISK EXERCISER REV 1.2 (c) 1982 OCCPut diskette in drive, PRESS key to start timerDrive A or B?'     Milliseconds 180 190 200 210 220   +-+ | | +-+<->  !! ښFyF! ښF†F ښFʐF>2>2)2)2)>2)>2)>2)>42)2):)( >2:)( >2><2):)U( >2:)O(>>2><2):)( >2:)( >2>42):)( >2:)( >2>2)>2)>2)2)>42)2)>2):)( >2:)( >2>E2):)M( >2:)U( >2>2):)( >2:)( >2>2):)( >2:)( >2>2)>?2)>2)2)>42)2)>2):)( >2:)( >2> 2):)K( >2:)U( >2>#2):)( >2:)( >2>+2):)( >2:)( >2>2)>2)>2)>2)>42)2)>2)>2):)( >2>2):)( >2>2):)N( >2>2):)( >2>2):)N( >2>2):)( >2>2):)N( >2> 2):)( >2>@2):)N( >2>2):)( >2>:)>2)2)>2)>2)>>2)2)>2)>2):)( >2>2)>2):) >2ɯ>2~L)c$D*% %;!a}2,!",!",!"-A!!H%|:%I!I&I!j&I!{&II!&!9!}!9%!eN%|ʊI!&!9!&!e}!9%!aH%|͚Ç!9%!bH%|Ç!9%!cH%|$Ç!9%!pH%|ͅ Ç!9%!sH%|*e Ç!9%!tH%|D́Ç!9%!zH%|^)ÇI!& ! N%|ʄ!9!}ItI!'%3II!;'͆!"-͋*-!H%|!`'͆!"-͋*-!"-I;;!9!9!c'!'͵!9!H%|! 9!H%|5! 9!9!Ϳ%-%!9|!9!-%!9! 9%%-%!9%!9%!'8!H%|ʝ! 9!|>!9%%!9%%!H%|! 9!9! 9%%-%!9!9%%!*,%-%!9%%!*,% !~%|">!9!H%|;>Ý!9!-%!9!9%%-%!9%!9%!'8!H%|ʉ! 9!| !9%%!9%%!H%|!'I! 9!9%%!9%%b%| !9!9!9%%!*,%-%ÉDI!'I! 9;;!9!9!'!'͵!9!H%|[! 9!H%|s! 9!9!Ϳ%-%!9|!9!-%!9!9%%!*,%-%!9%!9%!(8!H%|! 9!9%%!9%%!H%|! 9!9%!9%!!(8!H%|B! 9!9%%!9%%!H%|l! 9!9*,!͸%-%!9|!9%%!9%%!H%|!9%%",!9%%A",I!((*,*,!9!9%%!-%!9!9%%!-%ÀÂI!:(I! 9II!K(i!H%|T! 9I!j(*,!͸%&!(!9*,!͸%!*,!͸%-%!H%|ʺ! 9!9!-%!9!-%!9!*,%-%!9%%!9%%h%| !9%%!9%%#-%+!}!9!-%!9%%!9%%h%|v!9%%!!H%|j! 9!9,I! 9II!(i!H%|ʬ! 9I!(!H%|! 9!9!(-%!9!-%!9%%!h%|8 !,!9%%!9%%!9%%!A%%}!9%%#-%!(!0)!n!nH%|; I!3)!9!-%!9*,!͸%-%!9!9ͬ|; !,!! 9%%}!,!!9%%A}͗ | !! 9!9%%!9%%A!,͈$!H%|8 I!K)!9%%!9%%AI!! 9Å !9!Ϳ%-%I!Z)!9|O !9%%!!H%|ʉ ! 9!9*,!͸%-%!9!-%!9|L !,!! 9%%}!,!!9%%A}!9%%!,!H%|3 !9%%",!9%%A",I!r)*,*,!9!9%%!-%é U I!)I! 9II!)i!H%|ʈ |ʂ I!9!-%!9*,!͸%-%!9!9ͬ|w ͗ | !9%%*,H%| !)!9%%&! ͔!!9%%!9%%A!,;$!H%|t !)!9%%!9%%A!)I!9%%",!9%%A",ó !)III!)i!H%|ʦ *,*,h%|ʼ *,",!,!,ͬ!<Z͍!*I!S*!Z!*!*! 9-%!9!9%%: -%!b%|0 !<Z;;!9 }!9%!qH%|f !Ϳ%"!9%! H%|ʜ !9!9%%!!%-%"!9%!H%| !9!9%%!!͸%!%-%"!9%! H%|!9!9%%!!%-%"!9%!sH%|<!9!9%%ͬ-%"!9%!nH%|_!9v-%"!9%!lH%|ʂ!9͇-%"!9%!tH%|ʥ!9͘-%"!9%!rH%|!9-%"!9%!wH%|!9͋-%"!9%!'H%|^!'͔!!9͆!}!͔!!9%!H%|=!9%%[!9!9%%!9%0-%"!9!9% }!b%|"!9%ͬ!9 }!N%|!9% !b%|ʿË!͔!!9%!H%|!9%%"!9!9%%!9%!ͱ%!9% 0-%!9%%B!,!9%%!9%%}!9!9%%#-%+-%!9%%!b%|ʀ!9!-%!9%%#-%+!T%|ʣÀ!9%%!9! 9%%-%!9!-%!|f!9!,!9%%%!A%-%!,!9%%!9%%!ͣ%!9%%!ͱ%3%}!9!9%%!A%-%!9%%#-%+!H%|cf!9%%B!,!,ͬ!,!,͈#͍!Z!&*͍I!,!,ͬ!9!-%!9%%!h%|!,!9%%#-%+!}͍!Z*,*,!,;$!H%|4!**,*,!*I!*!9!-%B!9%%#-%+|ʀe!B͍!Z!9-%͍!Z!9%%|0*,*,!,͈$!H%|!*0*,*,!,;$!H%|!*0!,!,!H%|0! +!*!B͍!Z!!+!9!9%%!%-%!9%%+-%#|ʌ! ͔!n!9!9%%!%!%-%!9%%!9%%h%|!9%%#-%+ì!9%%!,!9%%#-%+%͋!&+!9%%!%| !!(+!9!9%%!͸%-%!|ʌ!,!9%%#-%+%Ͳ͔!!9%%!%!H%|ʉÌ@!++I!9%%!H%|ʯ!!9%%͋!-+!Ϳ%;!9*,-%!|͗ |!3!9%%!9%%A! 9%%;$!H%|ʿI!0+!9%%!9%%AI!?+!9!Y+!r}!9%!rH%|ʌ!*,!,;$!9%%",!9%%A",!9%!qH%|ʿ!3!9!9%%!-%!9!H%|!33!9*,-%!|ʪ͗ |!!9%%!9%%A!9%%͈$!H%|vI!]+!9%%!9%%AI!!9!9%%!-%!9!H%|ʧ!I!l+*,!͸%&!v+!9%%!9%%%%!*,!͸%-%I!z+*,&!+*,!͸%*,&!+!9%%!9%%%%*,*,!͸%*,-%:, %}2,!,!,!,ͦ!!9!H%|ʮI!+I!-$!II! 9%%!9%%:, %}2,}I!9%%! 9%%:, %}!9%%%!,!,!,ͦ!!9-$! 9%%%!9!9!9ͦ!!9-$!9%%*,N%!9%%*,N%3%!9%%*,N%3%|ʥI!+I!!!9%%|!!9%%!9%%%%#-%*,!͸%*,T%| !9%%*,-%!!!9%%%%#-%*,b%|=!9%%!-%!*,!dT%|Y!9%%!9!9%%!9%%*,͸%-%!9%%*,!͸%*,T%|!9%%*,͸%*,!A%!H%!9%%!9!-%!9%%!h%|3!9%%!9%%%!9%%!9%%%N%|#!!9%%#-%!!9%!9%H%|ʅI!+!9%%!+!H%|ʅ!!9%!9!9!9ͦ!!9!H%|I!9%%!+I!!!+!9%;I!+!9!+!c}I!9%!cH%3;;!|!9 }! H%|O!9!9%}!9%!9%%!H%|t !9%͔!!9!}!9%!N%|!9 }! H%|!9%Ët !9%%%|!9%%#-%+%!9%H%|!!;! 9%%! 9%%T%|3! 9! 9%%-%!9!9!-%-%!|ʣ!9 }! H%|ʳ!9%%|ʒ!9%%! 9%%b%|ʏãð!9!9!9%%-%&-%à!9%!H%|!9%%|!9%%+-%!9!9%%! %-%tà!9%Ͷ!b%!9! 9%%! %!9%Ͷ-%! 9%%[%A%|ʠ!9%%!T%!9%%!H%3%|ʠ!9%%#-%!9!9%%-%!9%͔!H!9%%!9!9!9%!A%}!9%! b%!9%!h%A%|!9%! !+!9%%&!+!9%%&!9%%! T%|[!9!9%%! %&-%g!9!-%!9%%! %ͬ!9%%!!9%%!ͣ%ͬ!9%%ͬ!9!9%%!A%-%! T%|!9%%! ͸%!a͔!!9%%!0͔!!9%%%|)!9%%#-%+%͔!!9%%+-%#|H! ͔!*! ͔!! ͔!!9%%+-%#|sIZ!͔!! ͔!!͔!*-!b%|ʥ!͔!*-!A%͔!!9!9%!0͸%}!h%|!Ϳ%!9%! [%|!9%!Ϳ%!9%!0h%| !Ϳ%!9%!9[%|C !9%!0͸%!9!9%!a͸%! }! h%|t !Ϳ%!9%![%|ʐ !9%!Ϳ%x!|ʾ I!,!H%|ʾ !!;!9͆!}!9%!Ab%!9%!Z[%A%|!!9!9 %!a!A͸%}!9%3!-;!9!9-%!9%%!,͸%3  S!|X!!!9!-%!9%%%!H%!!$!!$!!9%$!9! !9%!a͸%$-%!H%|!!!9!9%%!)%%"-!9!9%%!)%%-%*-|9"!9%%*-!%-%Z"!9%%!!!$A%-%! 9!9%%!-%!9%%!9%%%%-%!9!9%%!-%! 9!9%%!-%!9!9%%! -%!9! 9%%%%!!9%%%!͸%ͱ%-%!9!9%%!9%%%%%!%! 9%%!9%%%%%!9%%%%!͸%!9%%%%%-%!9%%!9%%! 9%%%%-%!!9*-|$!9!-%*-!9%%#-%+%!9%%%%N%|#Ý#!9%%*,b%|#!9%%!9!-%!9%%*-!9%%%-%+$!9%%!9%%ͬ!!$! !9%%$! !9%%$! !9%%$! !$|ʄ$!!! !9%%$! !9%%$! !9%%$!!$|$!!!9!9%%!͸%!%-%*%PYo&y%-%~og~#fo}}|}o|g}o|g}o|gn%+n%+n%+n%+n%+n%+{_z!{%ɳ7͘%+͘%+͘%+͘%+zŸ%{!||g}o¤%)²%{ozg%#|/g}/oDM!y%xGyOȯ{_zW%DMzz,&x4&>)<&&D&&}o{_zW=!&&,&,&z/W{/_x/Gy/O{_zW{zwelcome to the world of diskdoc ver c - 1 nov 81by egil kvalebergkindly enter your requestadapt, backup, compare, exit, patch, scan, test or zero ?abcepstzre-insert the system diskette and type thanks for having consulted diskdoctype character to move cursor home....source diskette in drive (a-h) ?destination diskette in drive (a-h) ?sourcedestinationbackup abortedbackup finishedcompare diskette in drive (a-h) ?to diskette in drive (a-h) ?firstsecondcompare error in compare finishedzero diskette in drive (a-h) ?zero how many tracks (0-) ?diskette to test in drive (a-h) ?the test will destroy the contents of the diskette**** diskdoc **** test pattern *does diskette already contain test pattern (y-n) ?ynwriting test pattern...error writing reading test pattern...bad test pattern in test completedscan diskette in drive (a-h) ?track the dubious quality of has been detectedscan finishedpatch diskette in drive (a-h) ?=next-byte, =previous-byte, =next-line, , ',next, logical-next, trk-sec, re-read, shift-bit, write or quit ? +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f 0123456789abcdeferror reading error writingerror reading backerror on read verify00 '' error reading continue, retry or quit ?qcrerror writing track (0-) ?sector (-) ?drive not readydrives are not compatibleinsert diskette drive is not readyabcdefghcontinue or quit ?cqtrack sector break0-) ?diskette to test in drive (a-h) ?the test will destroy the contents of the diskette**** diskdoc **** test pattern *doeVER 008 MARG+1,66 Small-C DISKDOC: A REPAIR AND MAINTENANCE UTILITY By Egil Kvaleberg, N-4060 Kleppe, Norway. Appeared in the Dr. Dobb's Journal #66, April 1982. Diskdoc is a utility that, like its name implies, is intended for repair and maintainance of diskettes and other random access mass storage media. Tasks accomplished include: i Taking backups (also in a single drive system). ii Verifying data integrity. iii Restoring previously deleted files (by manual patching). iv Repairing faulty sectors. v Debugging disk driver routines and controller hardware. vi Debugging file systems. Diskdoc has been in frequent use for about two years now (including a one year assembly language childhood), and has proved a useful companion when exploring the oh-so-vulnerable world of diskettes. The version listed runs under CP/M, but adapting to other operating systems will probably not be found too difficult a task to accomplish. As explained in the listing, te program is written to be compiled by the Ron Cain Small-C compiler. Small-C is smaller than standard C, and conoisseurs of the C language will find some of the constructions used quite primitive. If you prepare the program for a richer dialect of C, you might consider rewriting parts of the program. Except for efficiency, perhaps, there is little reason to take the bother since Small-C is a true subset of C. TALKING TO DISKDOC Diskdoc always tries to give self explanatory prompts. The default value can usually be displayed by typing once. If you should enter an inappropriate character, diskdoc simply refuses to echo it. Entries may be corrected by using the backspace key. A final will, as usual, end the input line. THE COMMAND LEVEL Starting up, diskdoc will enter the command level, requesting a single letter command: a Adapt to terminal type. You will asked to enter the character that will move the cursor home. An  escape sequence is acceptable. This is all that is required to adapt diskdoc to virtually any video terminal. It is assumed that the width of the screen is 80 characters. b Backup entire diskette, on a sector-by-sector basis. You will be asked to enter the source and destination drive names (a-h). It is crucial to double-check the direction of data flow. The same drive might be assigned as both source and destination, in which case diskdoc will request a diskette change whenever necessary during the copy process. If an error is detected in the source diskette, diskdoc will ask whether the sector read operation should be retried, the error ignored, or the backup aborted. It is recommended to retry a few times before declaring a sector unrecoverable, thereby filtering out intermittently occuring errors. If desired, backup can be aborted by typing any character. c Compare the contents of two diskettes. Every discrepancy will be reported. Abort by typing any character. e Exit. You will be prompted to insert a system diskette before leaving. p Patch. Look at and optionally patch selected sectors. For patch subcommands, see below. s Scan diskette by reading every sector. The test will quickly locate any sector that doesn't give a proper CRC. The test might be interrupted by typing any character. t Test diskette. A test pattern will be written, and the entire diskette will then be read back and compared. The write operation may be omitted. The command provides useful verification of disk controller hardware and software operation. z Zero diskette. The specified number of tracks will be erased by filling the EBCDIC character 'V' (0E5H). PATCH COMMANDS Move the cursor to the next byte. Move the cursor to the previous byte. Move the cursor down, i.e. 16 bytes forward. To patch, enter the new hex byte directly. After having entered the first digit, a will "undo" it. After having entered the second, the cursor will move to the next byte. ' To enter an ascii character, type a single quote followed by the desired character. l Read the logically following sector. This command is useful where a mapping between physical and logical sectors exists, such as in standard CP/M single density diskettes. n Read the next sequential sector. The next track is accessed if the end of the current one is reached. q Quit patch mode. r Re-read. Read the current sector once again. s Shift the rest of the sector one bit-position to the right. This command is useful when attempting to repair sectors where the controller has lost a few bits here and there. t Select a new track and/or sector. w Write back the current sector. Remember to use this command after having made any changes, since no automatic write is performed. REGARDING THE CP/M VERSION The CP/M version, as listed, will adapt to the physical characteristics of the drive (track and sector counts). This is accomplished by reading the disk parameter block returned by the BIOS drive select call. CP/M version 2.0 or better is required. For drives using sector blocking/deblocking schemes, the sectors that diskdoc works with will not correspond directly to the physical sectors. ADAPTING TO OTHER OPERATING SYSTEMS AND/OR COMPILERS All implementation depandant functions are containded in the file "ddocsys.c". These functions are all very low-level, and thus very non-standard. You will have to write these functions yourself, since no C runtime libraries will support them. If automatic size adaptation and/or logical to physical sector mapping aren't required, the functions seldrv() and lnext(), respectively, can be considerably simplifed. e is performed. REGARDING THE CP/M VERSION The CP/M version, as listed, will adapt to the physical characteristics of the drive (track and sector counts). This is accomplished by reading the disk parameter block returned by the BIOS drive select call. CP/M version 2.0 or better is required. For drives using sector blocking/deblocking schemes, the sectors that diskdoc works with will not correspond directly to the physical sectors. ADAPTING TO OTHER OPERATING SYSTEMS AND/OR COMPILERS All implementation depandant functions are containded in the file "ddocsys.c". These functions are all very low-level, and thus very non-standard. You will have to write these functions yourself, since no C runtime libraries will support them. If automatic size adaptation and/or logical to physical sector mapping aren't required, the functions seldrv() and lnex ͫCopyright (C) 1984 Bill Rink A* JESUS is the ANSWER * Osborne 1oroc type)MP)tartup(esetit=dl/c/lc *@#ERT(0)4~7#~=% o&ͦoͦܐԩͣ}!!"8~#(}:$= +*!Z!*B!!:(=2!Z: <2!!!:O::O:!*B! !45(!.+/ 0y0( d!kZ!{Z͈͈o&  :(y ͠|( *"x2y( >28!?"9!!>2 :D]SXN]D [ (!e}̈́A8Q0G: x@!\w# (   yV. V!h6# (*(.(!8}(*(̈́w#>?> w#a{ |͒}͛Ɛ'@'7||}>"C"6# ""͐ͩ*B"[R5*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#E͊w}8uRB0 >R@RR!+ͨ z R!+ͨ z <!+ͨ z <!+ͨ z <!#ͨ z <!+ͨ z T]KB!z> S>))0 = |JJDMgo>jB0 7?= H\<z5+)+<z {0Gɯgo||H}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'ͬͬdͬ ͬ} wͦWͧ _}8(8J`9{T]=o`9y w >uJ u` }>(; xQ }} ˸T}ٕ(0D=C ,= ( [ 0%D , 7 ͏ ?(8u x O - ; 8˸x X ,-xG}; }م 9; .>#ank","5308 9302 7000 2880","18","200","413.76","13.76","405","60","DEC" "Cindy Rink"," ","00"," ","140"," ","190͏ ?x P , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx(ͼ ?}ٽÏ }ց; <(; 7D = |٤g{٣_z٢Wy١Ox٠GD u J }x>uu}ƀ/ƀo; -J }0W-J W,}l˸ͨ 8 ; ` x( -ͨ 8J -ͨ 8,J }l8;*!` ! >u` ` u--- J ,,,-xGg?+2n*8t z~,->uxua}.; OJ , ; !U >,k- o&0%,` }g; }؉}颋.:}8c~I$I~L*kٷx˸; }0G,͙<},-(-J ! >0 a` o8 Oþ >um.`1pF,t6|!wS<.z}[|%FXc~ur1}Oٯx(<˸ͨ 8; !~Jͨ 0O!><ͨ 8 =  7 <` O ; 7 0 W-J OT0 j oD,:j !I}袋.}8c~I$I~L!>u` ` 77 ` = O nf^VNF!DLT\I!!53!r1!\!> x #-= o˸xO(- }(x>8(C ,C `iM!>u|; |J>| )=|(DMbo˸ͦ88ͦx(0 8> Mx(>-Ͳ{(ay(Ͱͦ \z(>.Ͳ (Ͱ ~ͦ{>EͲ>+|(|Dg>-Ͳ|/ 0:p# ~# +>0w#,-  60#J˸}րogM| .(C = ~> x0w#xG%P %P ZJDM%P = _~65i+~hìx-Sx9?+{Η@}|C C gZJDM0D ,7}o˸  #yO!@9i&   # w# /w# w#!9! E9!!9~(+F͊!"9!(#>2*Ͳ"|>" :( ͆ *6#w*6#6 !\$![ (̈́( #:~CONTRMKBDLSTAUXUSR>2$*#~ Ͷ$*:> >w###6  #6++p>2S-$Ͷ:*6###ww#w$w#w: ##N#F*B> w#w#[s#r>2S$Ͷ$*6 #-Nw#Fwq#p#6#w#w#w* :( ͒: *^ F* < >26"~͟*-w#ww#͟"~ <@*Ͳ!\  <ʮ!\$> >2*|>! * \$\<(!: [1Á\!(f"> 2:!<"F( #~#6e>!["N>!~8>O6*"w (=(&("( :(N 8y(~#x+% (6*#~[*#~ *~(h#"b=  8 J= B== ͯ}8= ͵}/ͭ !*###~-_~(4Q6*>2>*##w:>*##~*#~(E[ ( ( ( !][ ( ( ((w#(6!]~-#8~>7  [>OkͼMs #rkͼpX á[ [ (( #w(q*#~[ (  *##~6͜O$*#~(08ʦ=ʦ==ʩ=ʬò+###~-_q46͡> *:4^q}Ò*|(M|( M6-#͐ͦ[R8 (G> ͒C~͒#*ͦC!h !lTRUEFALSEͦ!9^#(~#(G~͒#> ͒> Ò "F![(#RR0*4#4> RR *4 #4(>>2$*V(/˖:(#~+ x y2!͵( =( X:(R*:(###~-_-͌X> :("͟"*^˞*V˖0 SRѷR8A* N#F#s#r$ 0})jS\*###w* N#FB ͟r+s> !T]>)j)0 0= UR!#U*^#V#N#F#^#V>">!2DM"~x(L* :O(o:" C}=( ?*-N#Fp+qq#p! * F+N+++V+^Bq#p>>> SRѷR* s#r$ s#r"S"! N#FB(^x * 6#[<(H*! Kq#p##K[! *! 4 #4! x *$ *>w""{_!"*nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* 5KB!>u~#fo{_"*R0RnfR0KqputsrNF( ^VNF^V*SutKqp R*R(~w~wnf ut"6# * *!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#VS>O"w2x2!"" @*>2"!"""!\Ͳ*: !~6go(\R*s#r_2x( s x(T]DMR0 -a%}̈́o*!~6o&͠|ͣ}%^C User break1:% I/O% Run-time% error ͒%, PC=[R"͍% Program aborted*1!͍!5Ͳ)͠E !!o&}2***&(}2 !}2**&}2P!Ͳ!!ͽ! R!q! b*&Er !++P._bÓ e.P!+Ͳ**&!aEr !!ͽ!+ P!OͲ!O P!Ͳ!!ͽ͐R!! !qbͩ*!"*&! !3 \}oE*!*!"6!*!"! "!**R!b*!"!**R!b*!"!**R!b*!"!**R!b*!"!**R!b*!"*&E#*͸Mh"˸*˸!|g}o!NE4"*!"*˸!|g}o!NE["*!"*˸! |g}o! NEʂ"*!"*˸!|g}o!NE#Disk Not Ready͹ Ŕ Hit Return when Readybe.P!+Ͳ**&!aE"!!ͽ!**R!b*!"!**R!b*!"!**R!b!B!Ŕ b!B!*R!b!B!Ŕ b!B!*߸R!b""""**!O͛**!͛}oE>$ Window Won' t Fit ScreenP!AͲ!A ͹ 4%**!*!5zw$"R!-b*#Y$!*5zʰ$"***R!|b*#Â$!*5z$"****R!|b*#û$***!!*!5z4%"R!-b*#%*ո*aE{%!*!Ŕ b!*!*R!b*"ո*Ӹ*߸aE%!!Ŕ b!!*߸R!b*߸"Ӹ*Ѹ*aE%!B! *R!b*"Ѹ*ϸ*aE!&!B! *R!b*"ϸ**aEQ&!B! *R!b*"**aEʁ&!B!*R!b*"e.P!+Ͳ**&!aE'!+ !He.\E&!}2!<!͐ŔHaltbͩ!+ !Se.\E'!}2!4!͐ŔSkipbͩ!&!n&!AR}2)!*)&!*)&DM."!۸*n&s!۸!*!n&s!*! n&s!!*! n&s!ݸ*n&s!ݸ!*!n&s!o&}2)!&!*)&!As!!͐!& R!qbͩ!!*ݸR!b*۸*n&"! *߸DM.! *DM.!!3-(*!"! .o&"*!aEʟ(*!" -(!!3*!"! .o&"*!aE(*!" *!N*&}o}oE~)!!5zT)"!3*+n&!3*+n&aEK)*!"*#)**aE~)!!*R!b͂&*&}oEʓ)͠(W(5%(!!5z)"!3*+!s*#è)c!N!!!#!!Ŕ1D i s k E x e r c i s o r V e r s i o n 1 . 0b!!Ŕ(c) Bill Rink; 1984b! !ŔDrive:b!!ŔTrack:b!"!ŔSector:b!/!Ŕ Test Mode:b! !ŔSec/Trk=b!!ŔTracks=b!"!Ŕ Test Drives:b!&! !!#!&! !)!#!! Ŕ E R R O R Sb! "!*Ŕ Total Errorsb*!"!*Ŕ Read Errorsb*!"!*Ŕ Write Errorsb*!"!*Ŕ Disk1 Errorsb*!"!*Ŕ Disk2 Errorsb*!"!*Ŕ CRC Errorsb*!"!*Ŕ RNF Errorsb*!"!*Ŕ Write Faultsb*!"!*ŔCompare Errorsb!6! Ŕ S T A T U Sb! "!0*ŔPassb*!"!0*Ŕ Loop Countb*!"!0*Ŕ Reads/passb*!"!0*Ŕ Writes/passb*!"!0*ŔTrack in Errorb*!"!0*ŔPhy_Sec in Errorb!"Ѹ!"ϸ!"!"!"Ӹ!"ո!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"߸!}2!}2!}2!}2!Enter FIRST Drive (A-P) to Test: ! P!Ͳ**&! aEʑ.!/!! R!qbEnter SECOND Drive to Test: ! P!3Ͳ**&! NEE/! P!3Ͳa/!1!!3 R!qb%Maximum track number to test - 0 thru! P!+Ͳ!+ !!Ǹ͞*Ǹ!a*!ͯ}o*!O͛}oE/!'"!!*R!b!"͸/STATUS port address for WD179X disk controller:! P!+Ͳ!+ !͸!Ǹ͞!0!ŔController Portb!B!*Ǹ!N*͸!t}o*͸!͇}oE0!}2*͸R!b0!}2͐Ŕ Not Definedbͩ Hit RETURN to Start, ESC to Quit! P!+Ͳ**&!NE21!0!Ŕuse Skip or Halt during testb*&}o}2*&Eʊ1! !&ͲØ1!3 !&Ͳ'!}2*&Eʥ2!& !3 \! !3 \}oE1!}2!}2!;!͐ŔVerify Disk, Readbͩ!;! Ŕ (1) b!"͂)*!"**ݸ!R͛*&}o*&}oE32*߸!"߸*߸*!N*&}o*&}oE-2*&}oE3͝)!"!"׸!}2!}2!;!͐Ŕ Spiral, R/WbͩŔ b!;! R!(*ݸ!́) b!"߸*׸"**ݸtET3!"͂)*߸!"߸*!"*߸*!N*&}o*&}oE>3!"߸*׸!"׸*!"**ݸ͛*&}o*&}oE2*&}oE4͝)!"!}2!;!͐Ŕ Random, R/WbͩŔ b!;! Ŕ (1000) b*!"߸*ݸ"͂)*!"*!͛*&}o*&}oEN4*!"5%!"!"!B! Ŕ b!B!Ŕ b*&Eb1!!R;Test Terminated, place system disk into drive A, hit RETURNbe.P!+Ͳ**&!aEA5!!ͽŔHappy Trails...bminated, place system disk into drive A, hit RETURNbe.P!+Ͳ**&!aEA5!!ͽŔHappy Trai*&K! [! [!g!H}os5}o}oE5*&K! [! [Ev6!!!!n&+ss5E6**e.*ͬ*&! [E6*&L! \!2!\$7L!\!g!?z7"L!! !\*+6!2!\75*&K!$[!0!9e}o}oEʸ5*&! [Eʽ7L*&3!k! \**&e.*ͬ75Eʫ7! }2ú7!2!\R7""*ͬ!}2!2!\*&"K!-[!A!ZeE8*&"}2U8*&"K!0!9e!$[EI8p5L8R7L͊\*&r9*+"*!HEʇ8!"L!*\!$8 !8 !$!ͷ}2 * \* ;}oE9* G! !HE8L!<\* 2!$ͭ\* G!R*[E9͢-õ8* \Ͳ-}oEq9* G! !HE\9L!>\ͪ-* U!$\)9"P!ͬ" !L!k! \!"!Ͷ !!8!^8!9!$!!![E::L͊\L{9*** WARNING: Unable to sort Terminal names - Press RETURN͊\%Y\L͊\6Q"*!!s!2!\*&! [Eʈ;*&K! !~eE:*&L\*!*!n&#s**!n&*&sv;*&!H*&!H}o*g!͕}oEP;L!! !\*!*!n&+sv;*&!H*ߗ&}oEv;!}2ޗÑ;!2!\n:L͊\""!L!k*!!-*!!E!k\"""**n**́}o}2*&""""*VE=*Ӑ^#VL!! !!k! \*x&}oE?!zG:*ޗ&ED>?!z*Ӑ!y!x <*y&*"&}oEu>!}2x?*y&Eʹ>*͐*Ӑs#r*Ӑ^#V*ѐ*ϐ;Eʫ>!}2xö>*ѐ*ϐ͒;?*x&}oE>!L!k!E!k\?*Ӑ^#V*ѐ*ϐ;}oE?*ѐ*ϐ͒;!}2x">"p"r"t"v*vn&"l!l*t*r*p=*l*vs"j!*j/zʄ?"fL!_\*f#f?!*j/zʭ?"fL!\*f#Ï?"b"d*"&Eʞ@!*dg/z @" L*d* n&3!k! \*********************************************************************** * * * D I S K E X E R C I S O R 1 . 0 * * * ************************************************************************ Copyright Bill Rink; 1984 (**Configured for Oxborne 1 by Mel Hulse**) (DOES NOT WORK ON THE EXECUTIVE) This software is made available to the public domain and may be freely distributed. It is not to be sold or used for commercial use. DISKX.COM is a comprehensive disk exercisor that can be used to certify either the operation of your disk drive(s) or the quality of a floppy. It is particularly useful if you are trying out a new brand of diskettes. I wrote it initially for testing some new 96 tpi Shuggart drives and to check the compatabilty of 48 tpi diskettes with them. This program was written for a Western Digital (or compatable) 179X Floppy Disk Controller and so the error conditions detected are set-up for that device. (Note: the Osborne 1 uses a 1793 look alike. - MWH.) If you have some other controller it will still work but you will not get error counts for CRC, RNF (record not found), or Write Fault errors. You will be prompted for the status port address of your 179X controller. For the Osborne 1 the disk status port address is 2100. For computers not using the 179x controller simply press return. (note: 179X stands for 1791,1792,1793,1794,1795,1797 controller family.) DISKX.COM can be initialized to test up to 2 drives. There are three basic tests performed on each pass. Verify Scan, Read This test will scan the disk first to verify it is free of format and CRC errors. This is a READ only test. Sequential, R/W A random data pattern is written and the read back on every track and sector on the disk. A spiral pattern is used to start with the first track/sector and then sprial to the inner most tracks, then repeating this after incrementing the sector bias by one. Random, R/W Random data is written and read on randomly generated track and sector numbers. This will give the disk a good workout and more closely resemble real activity, though more intensive. (I know that there are certain data patterns that are good for detecting certain write problems, but I was in a hurry to get something together, so I used random data patterns.) Each test will loop for the number displayed in brackets next to the loop counter. At any time, you may either SKIP the current test or HALT the program by entering either 'S' or 'H'. Play with it, you'll get the idea. INSTALLATION Provided in the library file is an istallation program called DISKXINS.COM You must also have the DISKX.INS and DISKX.DTA files on you disk at the time of installation. Simply execute the DISKXINS.COM file and follow the instructions. Use the "None of above" selection if your terminal is not listed. ute the DISKXINS.COM file and follow the instructions. Use the "None of above" selection if your terminadata is written and read on randomly generated track and sector numbers. This will give the disk a good workout and more closely resemble real activity, though more intensive. (I know that there are certain data patterns that are good for detecting certain write problems, but I was in a hurry to get something together, so I used random data patterns.) Each test will loop for the number displayed in brackets next to the loop counter. At any time, you may either SKIP the current test or HALT the program by entering either 'S' or 'H'. Play with it, you'll get the idea. INSTALLATION Provided in the library file is an istallation program called DISKXINS.COM You must also have the DISKX.INS and DISKX.DTA files on you disk at the time of installation. Simply execute the DISKXINS.COM file and follow the instructions. Use the "None of above" selection if your termina!Actrix (Soroc type)p= *()T  P= ADDS 20/25/300PY  KPY ADDS 40/600PY  KMlPYADDS Viewpoint-1A0AY  KPYADM 3A= P= Ampex D80= )(TER(=ANSI0 Terminal;1P[;HDEC Rainbow, 8 bitP[;H DEC VT100-bP[;HHazeltine 1500~~~~~~~P~Hazeltine Esprit PIBM-PC CCP/M b/wY EruKLMPYIBM-PC CCP/M colorxccY EbbKLMPYKaypro with hilite0= /-C1B1ERP=Kaypro, no hilitetin= ERP=Lear-Siegler ADM-20= )(TERP=Lear-Siegler ADM-31= *)(TERP=Liberty= )(TERP= Morrow MDT-20= )(TERP= Osborne 1)(= ()TERP=Otrona Attache`a= HU$U KLMP=Qume= )(TERP= RC-855 (ITT)  PSoroc 120/Apple CP/M= *)(TP=Soroc new models= *)(TERP=SSM-UB300;002J1;17U0UKLMP;Tandberg TDV 2215PTeleray series 10Y  KLMPY Teletex 3000= )(T-ERP= Televideo 925/920/92= ()TERP= Visual 200Y v34xLMPYWyse WY-100/200/300= *)(TERP=Zenith00Cur[, Morrow Y0 E(qEpKLMPYOrona ttach00Cur[, Morrow Y0 E(PTeleray series 10Y1 DISKX 1.0 TURBO Pascal Terminal Installation Pgm 2 Modified version, limited to the following options: 3 [S]creen Install | [Q]uit Installation 4 Enter either an 'S' or 'Q': 10 Duplicate definition. Error occurred between question Commands starting with the same letter must have the same length. Error occurred between question The total maximum length of commands are execeeded 13 -> CURSOR MOVEMENTS: Character left Alternative Character right Word left Word right Line up Line down Scroll down Scroll up Page up Page down To left on line To right on line To top of page To bottom of page To top of file To end of file To begining of block To end of block To last cursor position INSERT & DELETE: Insert mode on/off Insert line Delete line Delete to end of line Delete right word Delete character under cursor Delete left character Alternative BLOCK COMMANDS: Mark block begin 49 Mark block end 50 Mark single word 51 Hide/display block 52 Copy block 53 Move block 54 Delete block 55 Read block from disk 56 Write block to disk 17 MISC. EDITING COMMANDS: 57 End edit 58 Tab 59 Auto tab on/off 60 Restore line 61 Find 62 Find & replace 63 Repeat last find 64 Control character prefix 101 Nothing ^Q: Quit, ^R: Last page, ^C: Next page, : Select terminal: Wait Sorting Definitions Change to: (Y/N)? y n Text file name: Command: Numeric entry expected Legal range is , please re-enter: Choose one of the following terminals: None of the above ( Max. 20 Characters ) Delete a definition ( Max. 20 Characters ) Which terminal? (Enter no. or ^Q to exit): Delete terminal? (Enter no. or ^Q to exit): Do you want to modify this definition before installation? Terminal type: Send an initialization string to the terminal? Initializaion defined as a command string? (No = a file) Send a reset string to the terminal Reset defined as a command? (No = a file) CURSOR LEAD-IN command: CURSOR POSITIONING COMMAND to send between line and column: CURSOR POSITIONING COMMAND to send after both line and column: Column first OFFSET to add to LINE:  OFFSET to add to COLUMN: Binary address Number of ASCII digits (2 or 3): CLEAR SCREEN command: Does CLEAR SCREEN also HOME cursor HOME command: DELETE LINE command: INSERT LINE command: ERASE TO END OF LINE command: START HIGHLIGHTING command: END HIGHLIGHTING command: Number of rows (lines) on your screen: Number of columns on your screen: Delay after CURSOR ADDRESS (0-255 ms): Delay after CLEAR, DELETE and INSERT (0-255 ms): Delay after ERASE TO END OF LINE and HIGHLIGHT (0-255 ms): Is this definition correct? Hardware dependent information Operating frequency of your microprocessor in MHz (for delays):  the terminal Reset defined as a command? (No = a file) CURSOR LEAD-IN command: CURSOR POSITIONING COMMAND to send between line and column: CURSOR POSITIONING COMMAND to send after both line and column: Column first OFFSET to add to LINE: ͫCopyright (C) 1984 BORLAND Inc#ANo Terminal selectedP~7#~=% o&ͦoͦܐԩͣ}!!"8~#(}:$= +*!Z!*B!!:(=2!Z: <2!!!:O::O:!*B! !45(!.+/ 0y0( d!kZ!{Z͈͈o&  :(y ͠|( ʿ*"x2y( >28!9"9!!>2:D]SXN]D [ (!e}̈́A8Q0G: x@!\w# (   yV. V!h6# (*(.(!8}(*(̈́w#>?> w#a{ |͒}͛Ɛ'@'7||}>"C"6# ""*B"[R/*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#Ë́w}8oRB0 >R:RR!+͢ t R!+͢ t 6!+͢ t 6!+͢ t 6!#͢ t 6!+͢ t T]KB!z> S>))0 = |DDDMgo>jB0 7?= HV<z5%)%<z {0Gɯgo||B}||/g}/o#}o&K[xAJSJDM!b"!6J"DM'ͦͦdͦ ͦ} qͦW͡ _}8(8J`9{T]=o`9y q >oD oZ }>(͸ xK }} ˸T}ٕ(0D== ,= ( U 0%> , 7 ͉ ?(8o x I - 5 8˸x R ,-xG}5 }م 95 .>#n0U > = - nx J ,-(-˸G,-5 }ٕ? 9.>͉ 8o ?= u+-(>I 0o I 8͉ ?x J , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨ xx(Ͷ ?}ٽÉ }ց5 <(5 7> = |٤g{٣_z٢Wy١Ox٠G> o D }x>oo}ƀ/ƀo͸ -D }0Q-D Q,}l˸͢ 8 ͸ Z x( -͢ 8D -͢ 8,D }l8;*!Z ! >oZ Z o--- D ,,,-xGg?+2n*8t z~,->oxo[}.͸ ID , ͸ !O >,e- o&0%,Z }g5 }؉}颋.:}8c~I$I~L*eٷx˸͸ }0G,͓<},-(-D ! > 0 [Z o8 Iø >om.`1pF,t6|!wS<.z}[|%FXc~ur1}Iٯx(<˸͢ 8͸ !~J͢ 0O!>6͢ 8 =  1 6Z I ͸ 1 0 Q-D OT0 j oD,:j !I}袋.}8c~I$I~L!>oZ Z 11 Z = I nf^VNF!DLT\I!!53!r1!V!> x #-= o˸xI(- }(x>8(= ,= `iG!>o|5 |D>| )=|(DMbo˸ͦ88ͦx(0 8> Gx(>-ͬ{(ay(ͪ͠ Vz(>.ͬ (ͪ x͠{>Eͬ>+|(|Dg>-ͬ|/ 0:p# ~# +>0w#,-  60#D˸}րogM;| .(= = ~> x0w#xG%J %J ZJDM%J = _~65c+~6(z= Z ø @ >hìx-Sx9?+{Η@}|= = gZJDM0> ,7}o˸ #yO!@9i&  #w#/w#w#!9! E9!!9~(+F̈́!"9!(#>2*ͬ"|>":( ̀ *6#w*6#6 !\$![ (̈́( #:~CONTRMKBDLSTAUXUSR>2*#~ Ͱ*:> >w###6  #6++p>2S'Ͱ:*6###ww#w$w#w: ##N#F*B>w#w#[s#r>2MͰ*6 #-Nw#Fwq#p#6#w#w#w* :( ͌:  *^ F* < >26"~͙*-w#ww#͙"~ <@*ͬ!\  <ʨ!\$>>2*|>! * \$\<(!: [1Á\!(f"ͼ> 2:!6"F( #~#6_>!U"N>!~8>O6*"w (=(&("( :(H 8y(~#r+% (6*#~ͼU*#~ *~(h#"b=  8 J= B== ͯ}8= ͵}/ͧ !*###~-_~(4K6*>2>*##w:>*##~*#~(EU ( ( ( !]U ( ( ((w#(ͼ6!]~-#8~>7ͼ U>OeͶͻGs #reͶjR ÛU U (( #w(ͼq*#~U (ͼ  *##~6͖O*#~(08ʦ=ʦ==ʩ=ʬò+###~-_q46͛>*:4^q}Ì*|(G|( G6-#͊ͦ[R8 (G> ͌C~͌#*ͦC!b !fTRUEFALSEͦ!9^#"~#(G~͌#> ͌> Ì "F!U(#LR0*4#4>LR *4 #4(>>2*V(/˖:(#~+ x y,!ͯ( =( X:(R*:(###~-_-͆R>:("͙"*^˞*V˖0 SLѷR8A* N#F#s#r 0})jS\*###w* N#FB ͙r+s>!T]>)j)0 0= OR!#O*^#V#N#F#^#V>">!2DM"~x(L* :O(o:" C}=( ?*-N#Fp+qq#p! * F+N+++V+^Bq#p>>>SLѷR* s#r$ s#r"S"! N#FB(^x * 6#[<(H*! Kq#p##K[! *! 4 #4! x *$ *>q""{_!"*nf}(HR0nf" ^VMDnfutqp*s#r*s#r"* /KB!>o~#fo{_"*R0RnfR0KqputsrNF;( ^VNF^V*SutKqp R*R(~w~wnf ut"6#**!""*NFy(* "*B0Cnf* [R*"*RS[s#r^#VS>O"w2x2!"" :*>2"!"""!\ͬ*:  !~6go(\R*s#r_2x( s x(T]DMR0 -a%}̈́o*!~6o&͠|ͣ}%^C User break1:% I/O% Run-time% error ͒%, PC=[R"͍% Program aborted*1!͍!GbͲaCOM"|*|"z*z!!; !t͛!t"r*r"p!*pg/z "n*p*n*p*nn&"s*n#Q P!ͬ/!HEʜ L͊L{*** FATAL ERROR: !!k͊Ϳ""**ͩE *" *"*""**͕E!!*"'!*"*" "* ͟Ec!** ͟!}2j!!}2*&" * g!͕* !n&! H}oEʸ!* !!ͷx!* * gn&! HE!* !* !n&+sø!*"6"8!;*6*;\!;*8*a\"2"4!;*2*;\!;*4*e\"/*/*"-*-!ԟ!)^#VH*-!ԟ!)^#VH}o*-!ԟ!)^#VH}o}21*1&")"+*+*"'!}2&!ԟ*&&)^#V*'[E#*&&!}2&"!ڟ*&&)^#V*+* *;*)s#r" """$*$^"}oE\$*$*"!}2*"*"* *"!ԟ*&)^#V*H!ԟ*&)^#V*H}oE#*&!}2Ù#!џ*&n&E$!ڟ*&)^#V!ԟ*&)^#V!!ڟ*&)^#V*+"!ԟ*&)*s#r!џ*&!s""**"!}2!ԟ*&)^#V*[Eʭ$*&!}2~$**"!}2 !ԟ* &)^#V*[E$* &!}2 $** "** "!ڟ*&)^#V**;" !ڟ* &)^#V**;" * *s** * **s* *!џ*&!s!џ* &!s""*******) * &}2*&*!͕E&&!!+)!s#r!!+)*!Rs#r!",&!"*!͕Eʂ(!*+)^#V"}!*+)^#V"{*!R"*}"y*{"w*y*w!"**y*wH#*!m"*m*u**y*w*H#*y!q"*q*u͞%E '*y!"y*y*w*H#*y!q"&*w*y*H#*w!o"*u*o͞%E`'*w!R"w*w*y*H#*w!o"$'*y*ẃEʦ'*y*w[Eʋ'*y*w]$*y!"y*w!R"w*y*w͕Eʷ&*w*}R*{*yRͩE%(*y*{ͩE(*!"!*+)*ys#r!*+)*{s#r*w"{o(*}*wͩEi(*!"!*+)*}s#r!*+)*ws#r*y"}*}*{nEo&,&*!H*!n}oE5)*!HE(!; $$$SOWRK.$$$7!;s\!}2:!!!!!!!ڟ!)^#V!ԟ!)^#V!!ԟ!)!ԟ!)^#V!s#r*!͕EN)!"T)*"!ڟ*)^#V**;"****!"*!"**HEʻ)!"*!"*k*!R*}/o|/g#H#*k!"****k!"k*k*n}2""""""!͛!("!)"!*"!"!*Ͷ *Ͷ !͛!! !!; ͟E*!@!; !͛!! ͡!"*!͕E$+!*!;"*!;"**"*!́EY+!"ü,!ڟ!)*+!Ev+!"!ڟ!)*+!Eʙ+*!"!ڟ!)*+!Eʼ+*!"!s*+!E+*!"!u*+!E+*!"*![E ,!"ü,!"!}2:!"!"!"!ԟ!)!s#r!ԟ!)!s#r!ԟ!)!s#r*) !џ!!s!џ!!s!џ!!s%!"k*) *:&Eʼ,!;V*!nE,!u*4*!R"*!nE-!s*4*!R"*!nE>-!ڟ!)*4*!R"*!nEn-!ڟ!)*4*!R"*!nEʞ-!ڟ!)*4*!R"**) *) *) *&}2*&"*"*0!s#r*2!s}2""*"**0^#V[E/*2n&Ek.**0^#V\**3!a\*2!s**O!R͕E.*&Eʪ.Seek read error̀ .**O͕E.Seek write error̀ **\/**\**3!e\*0*s#r"*"*2n&E^/**0^#V\**3!a\*M\"}2"""**!-!*&R"ߞ*"*3*&**ߞ* *ߞ*ͩE.0**0^#V!!-*3**ߞ!**ߞR *ߞ!"ߞ/"֞}2؞"ٞ"۞"ݞ*ݞ*ٞ!-!*؞&R*֞ "Ҟ*ݞ"Ԟ*۞*Ԟ3*؞&*Ҟ*Ԟ2!s*Ҟ*֞ͩE1*ݞ*Ԟ0^#V!!-*۞*Ҟ*Ԟ3!*֞*ҞR *Ԟ2!s*Ҟ!"ҞÞ0"̞"Ξ"О*О͗}oE1*О2!̝(Y!̝g!͕E1!̝!! e.!̝v+/!ʝ!ȝ͘*ȝ!H*ʝ*ΞH}oE1!̝! e.!̝v#!/*̞ͬ1"1"ĝ"Ɲ*Ɲ͗}oE2*Ɲ2*ĝ(Y*ĝ! e.*ĝv#!/*ĝͬu2*#"*!HE_2*#"!"***!9!e!9*n&}25*5&""!ͬ"!}28!"!"!8!!!n&s!!8g/z2"6!8*6#2s*6#2!8!VE 3!}28H3!8!!ͷ!8!!8!n&#s!8!8g#2s*;*8&}oE2*8&}2Ý*!;*!gR!*s#r*!!gR!! *s#r*Ý&}24*4&!  RB 4  RB 4  RB 4 RBF4Ctrl-*4&!@e.!ͬ4  Rd4!ͬ4 R4!ͬ4RŸ4!ͬ4 R¿4!ͬ4R4!ͬ4*4&e.!ͬ*4&!͕E5!(+128)!ͬ!!5ͬ!5þ7*g*nEc5!}2L!\j5!}2*&ø5!!!͘*!H*!n}o*!́}o}2*&*&e.!ͬ*&L\!2!\!*&e.!ͬ*&K! [! [!g!H}os5}o}oE5*&K! [! [Ev6!!!!n&+ss5E6**e.*ͬ*&! [E6*&L! \!2!\$7L!\!g!?z7"L!! !\*+6!2!\75*&K!$[!0!9e}o}oEʸ5*&! [Eʽ7L*&3!k! \**&e.*ͬ75Eʫ7! }2ú7!2!\R7""*ͬ!}2!2!\*&"K!-[!A!ZeE8*&"}2U8*&"K!0!9e!$[EI8p5L8R7L͊\*&r9*+"*!HEʇ8!"L!*\!$8 !8 !$!ͷ}2 * \* ;}oE9* G! !HE8L!<\* 2!$ͭ\* G!R*[E9͢-õ8* \Ͳ-}oEq9* G! !HE\9L!>\ͪ-* U!$\)9"P!ͬ" !L!k! \!"!Ͷ !!8!^8!9!$!!![E::L͊\L{9*** WARNING: Unable to sort Terminal names - Press RETURN͊\%Y\L͊\6Q"*!!s!2!\*&! [Eʈ;*&K! !~eE:*&L\*!*!n&#s**!n&*&sv;*&!H*&!H}o*g!͕}oEP;L!! !\*!*!n&+sv;*&!H*ߗ&}oEv;!}2ޗÑ;!2!\n:L͊\""!L!k*!!-*!!E!k\"""**n**́}o}2*&""""*VE=*Ӑ^#VL!! !!k! \*x&}oE?!zG:*ޗ&ED>?!z*Ӑ!y!x <*y&*"&}oEu>!}2x?*y&Eʹ>*͐*Ӑs#r*Ӑ^#V*ѐ*ϐ;Eʫ>!}2xö>*ѐ*ϐ͒;?*x&}oE>!L!k!E!k\?*Ӑ^#V*ѐ*ϐ;}oE?*ѐ*ϐ͒;!}2x">"p"r"t"v*vn&"l!l*t*r*p=*l*vs"j!*j/zʄ?"fL!_\*f#f?!*j/zʭ?"fL!\*f#Ï?"b"d*"&Eʞ@!*dg/z @" L*d* n&3!k! \* #?*dg!͕Eʀ@L{ (\!*dg/zn@" L*d* n&!! \* #=@L!{) \L! !!k! \!*b45}2 !V*"&}o}oE@!*dͬA* &!-HEA*dͬ!_L!k͊\""" *"&EPA* n&!HEIA!}2PA!}2!<*&}oEA!* s*͚ͬ<:C*"&EʭA* n&!HEʦA!}2íA!}2!*@"8éO*B+">*B*6+*@;R"8*8+*:#"8!*8+/z$Q"2!*:+/zQ"0*6+*@;*0*8;*2"%*%*>́E QL*%#!{) \*6*4[*>*%R!n}oEʃP!**%\!*2!ͭ\!!ͬP*>*%RR©P!ߎ!ͬPRP!!ͬ!L!k\*0*:+ͩE QL!!gR!k\*0#OL͊\*2#O\M}oEbO*F&"!P!ͬP!;ͬ!}2!*!;7!*/![EʐQ!*\D!}2ߗ!}2ޗ!*O!H}2ܗ!"ڗ*ܗ&EQ͚2i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp]i.2_!fp+q*e2_2_!hp+q*g!jp+q*i!lp+q*k!np+q*m2_!pp]DISKXINSCOMQRSTUVWXYZ[\]^_`DISKXINSCOMCabcdefghiFAST $$$Originated - 7/8/82 by Tom Vyse, San Diego, Calif. The FAST program is specific to the Osborne 1. It also will only work on those Osbornes which have MPI disk drives. Those can be identified by a plastic lever hanging down in the right hand side of the disk drive slot. This is part of the door interlock mechanism. Osbornes are also shipped with other, and frequently slower, drives from different manufac- turers. FAST is designed to increase the disk drive step rate from 20 ms./step (the default) to 6ms./step. It does this by altering the value in the operating system parameter table which controls this rate. The address of this parameter (in both versions 1.2 and 1.3) is EF13H. The effect of various parameters in this location are: Value Step Rate ----- --------- 0 6 ms. (MPI only) 1 12 ms. 2 20 ms. (Seimens) 3 30 ms. The code to drive this is simply: MVI A,0  STA 0EF13H JMP 0 END Not much of a program, but it sure makes programs with a lot of disk access run nicer. Also, the MPI drive will operate more quietly at the higher step rate. Fini. n nicer. Also, the MPI drive will operate more quietly at the higher step rate. Fini. ower, drives from different manufac- turers. FAST is designed to increase the disk drive step rate from 20 ms./step (the default) to 6ms./step. It does this by altering the value in the operating system parameter table which controls this rate. The address of this parameter (in both versions 1.2 and 1.3) is EF13H. The effect of various parameters in this location are: Value Step Rate ----- --------- 0 6 ms. (MPI only) 1 12 ms. 2 20 ms. (Seimens) 3 30 ms. The code to drive this is simply: MVI A,0 !@@*+%"HB%"FB%"DB "B "B "By 6"CA+6+!^6 F+N+<@!* !@!9~#ʗ@ R@O"k@'k@ +}|+#~ʂ@u@6#~#<ʷ@>@!@4R@6#6*@!@G* A|ʴ@C!@ͯB"@@r! AͯB" A@R@@ Can't open > or < file.$è@w*6A G)A! 9F!"6A,[*@D:BA<*CA 2BA ́AFA A €A> _*CA~+#4N s> A> !B+B:EAºAFA2BA_~ýA A A > GG AʘAAGG!* A͟D> !B+B} B > _con:rdr:pun:lst: =B=B_~O7A !"# !B  B#¾Bi& ~ºB!hB~B#BD~#F6%pw623CB7G!9LGy=SFDE>wDC<D!gBs 6#6 ~+|CAs#r{D{ ڟC!B+B#^{!!PBw#w!gB~<D6 D!|B~rC!BN!nBLG}C*eBybC>w#C%!=C)$E{=SFbtDx DADh&{ D!B~!nBN#F{p+pH#xD¯DA ڽDA+!9~ D!B~bD!D5D> D6> *eB w`i#QG᯾E%,!$E|!!9n&:DʟDɯ2E>[E!9LG):E|!PBwLE#4!^Bw>2E>2-E:EAcAExE:-EO”E! DMiE:-EEE !EWrite error - Disk full $`i7G.E!9~=+SFV+^+F+N "IF> w+ Ew w##w w #~+:&F~##KF@~#.7FKF&F*IF++KFw#=Fa O!B ~_#V!$Ar+sbk#|}o|g}o|g}o|g|!,|}!­F­F,ɯ|ʙF!|}!-zF{F!,zFzF{!-|!F|g|G}! G-ɵzG{!-||g}oGG).G{ozg+|/g}/o~og~#fos#rN#F#xrG~#~#[G[G`iDM!z>‚GS\))ҊG =‚GɯßGz>G|>GMD!x<³Gz>ڸGjS\>))G# G =¸G>G>G*G*G*G*G*G*G*G*GjJ!4"G*GvY͓L#"G!|IJvJ!"G*GdFYHJH*G#"G1HL͓FVHJH@H̀XJ!2!:!ʦL:!®L!#: "L:!ʹL#: "L:!LL2>2!LL!:~"L.L!:@"L.L!:"L.                                                                                                                                                                                                                                                  *6M*4M*2M*0M! 9LG+|U!"6M! 9LG++|V!"6M! 9LG+++|V!$"6M!"2M*2MF?X;V*2M#"2M"V*6M*2MsG"0M!"4M*4M F 0) /* display right hand digit first */ { dispbig(n%10,i--); /* use big digits */ n /= 10; } } /* lrkey() checks for keys L or l or R or r */ lrkey() { int i; if(keychk() == 0) return(0); else if(lkey() == 1) return('l'); else if(rkey() == 1) return('r'); else return(-1); /* some other key was pressed */ } motor(i) int i; { if(i == 0) #asm ;turn motors off CALL SETROM ;ENTER SHADOW MODE LDA 2C02H ;GET PIA STATUS ANI 03FH ;RESET BITS 6,7 STA 2C02H ;BOTH DRIVES OFF CALL SETRAM ;EXIT SHADOW MODE EI ;ENABLE INTERRUPTS #endasm ; if(i == 1) #asm  ;select left drive CALL SETROM ;ENTER SHADOW MODE LDA 2C02H ;GET PIA STATUS ORI 40H ;SET BIT 6 ANI 07FH ;RESET BIT 7 STA 2C02H ;LEFT DRIVE ON, RIGHT 0FF CALL SETRAM ;EXIT SHADOW MODE #endasm ; if(i == 2) #asm ;select right drive CALL SETROM ;ENTER SHADOW MODE LDA 2C02H ;GET PIA STATUS ORI 80H ;SET BIT 7 ANI 0BFH ;RESET BIT 6 STA 2C02H ;LEFT DRIVE OFF, RIGHT ON CALL SETRAM ;EXIT SHADOW MODE #endasm ; } getdsk() /* get logged disk drive */ { #asm MVI C,19H ;return current disk function CALL 5 LXI H,0 MOV L,A ;answer returned in HL #endasm } getpd() /* get period of disk rotation */ { #asm ;send cmd type 1 to ;access index status CALL SETROM ;ENTER SHADOW MVI A,03H ;RESTORE COMMAND STA 2100H ;NEED TYPE 1 CMD TO ;ENABLE INDEX STATUS ; DI ;OTHERWISE DISK TIMEOUT ;CAN CRASH PROGRAM STAT1 LDA 2100H ;GET DISK STATUS ANI 02H ;MASK INDEX HOLE JZ STAT1 ;WAIT FOR INDEX ; STAT2 LDA 2100H ;GET DISK STATUS ANI 02H ;MASK INDEX HOLE JNZ STAT2 ;WAIT FOR NO INDEX ; LXI H,00H ;INITIALIZE CNTR1 ; COUNT1 INX H ;BUMP CNTR1 LDA 2220H ;KYBD ROW 5 ANI 08H ;SPACE BAR JZ EXIT ;EXIT IF PRESSED LDA 2100H ;GET DISK STATUS ANI 02H ;MASK INDEX HOLE JZ COUNT1 ;WAIT FOR INDEX ; COUNT2 INX H ;6 CLOCK CYCLES LDA 2220H ;13 ANI 08H ;7 JZ EXIT ;10 LDA 2100H ;13 ANI 02H ;7 JNZ COUNT2 ;10 ; TOTAL: 66 CLOCK CYCLES ; PLUS 14 WAIT STATES ; EQUALS 80 CYCLES IN LOOP JMP END ;DONE ; SETROM DI ;SWITCH TO ROM BANK PUSH PSW ;SAVE A, FLAGS OUT 0 ;SET ROMBANK XRA A ;CLEAR A STA 0EF08H ;STORE FLAG POP PSW ;RESTORE A, FLAGS ; EI ;LEAVE DISABLED OR ;DISK TIMEOUT CAN ;CRASH PROGRAM RET SETRAM DI ;SWITCH TO RAM BANK PUSH PSW ;SAVE A, FLAGS OUT 01 ;SET RAMBANK MVI A,1 ;FLAG STA 0EF08H ;STORE FLAG POP PSW ; EI RET ; EXIT LXI H,0 ;KEY PRESSED END CALL SETRAM ;EXIT SHADOW MODE ; EI ;ENABLE INTERRUPTS #endasm ;disk speed returned in HL } /* keychk() checks if any key down */ /* Cannot call BDOS because disk stops */ keychk() { #asm CALL SETROM ;leaves interrupts disabled LXI H,0 ;initialize HL LDA 227EH ;keyboard, all rows but capslock CPI 0FFH ;any key CALL SETRAM RZ ;return 0 if no keydown MVI L,01 ;return 1 if keydown #endasm } /* lkey() checks for key L or key l */ lkey() { #asm CALL SETROM LXI H,0 LDA 2240H ;keyboard row containing 'L' CPI 0BFH ;seventh column contains 'L' CALL SETRAM RNZ ;return 0 if not 'L' or 'l' MVI L,01 ;return 1 if 'L' or 'l' #endasm } /* rkey() checks for key R or key r */ rkey() { #asm CALL SETROM LXI H,0 LDA 2204H ;keyboard row containing 'R' CPI 0F7H ;fourth column contains 'R' CALL SETRAM RNZ ;return 0 if not 'R' or 'r' MVI L,01 ;return 1 if 'R' or 'r' #endasm } /* dispbig(n,m) displays a number n in big font at position m = 1, 2, or 3 */ dispbig(n,m) int n,m; { char *p; int r,c,o; /* row, column, offset */ static char one[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,32,32,32,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,22,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,32,32,22,22,32,32,32,32}, {32,32,32,22,22,22,22,22,22,32,32}, {32,32,32,22,22,22,22,22,22,32,32} }; static char two[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,22,22,22,22,32,32,32,32}, {32,32,22,22,22,22,22,22,32,32,32}, {32,22,22,32,32,32,32,22,22,32,32}, {32,22,22,32,32,32,32,22,22,32,32}, {22,22,32,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,22,22,22,32}, {32,32,32,32,32,32,22,22,22,32,32}, {32,32,32,32,32,22,22,22,32,32,32}, {32,32,32,32,22,22,22,32,32,32,32}, {32,32,32,22,22,22,32,32,32,32,32}, {32,32,22,22,22,32,32,32,32,32,32}, {32,22,22,22,32,32,32,32,32,32,32}, {32,22,22,32,32,32,32,32,32,32,32}, {22,22,22,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,22,22,32}, {22,22,22,22,22,22,22,22,22,22,32}, {22,22,22,22,22,22,22,22,22,22,32} }; static char three[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,32,22,22,22,32,32,32,32}, {32,32,22,22,22,22,22,22,32,32,32}, {32,32,22,22,32,32,32,22,22,32,32}, {32,32,32,32,32,32,32,22,22,32,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,22,22,32,32}, {32,32,32,32,32,32,32,22,22,32,32}, {32,32,32,32,22,22,22,22,32,32,32}, {32,32,32,32,22,22,22,22,32,32,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,32,22,22}, {32,32,32,32,32,32,32,32,32,22,22}, {32,32,32,32,32,32,32,32,32,22,22}, {32,32,32,32,32,32,32,32,32,22,22}, {32,22,22,32,32,32,32,32,22,22,32}, {32,22,22,22,22,22,22,22,22,22,32}, {32,32,32,22,22,22,22,22,32,32,32} }; static char four[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,32,32,32,22,22,32,32,32}, {32,32,32,32,32,32,22,22,32,32,32}, {32,32,32,32,32,22,22,22,32,32,32}, {32,32,32,32,22,22,22,22,32,32,32}, {32,32,32,22,22,32,22,22,32,32,32}, {32,32,32,22,22,32,22,22,32,32,32}, {32,32,22,22,32,32,22,22,32,32,32}, {32,22,22,32,32,32,22,22,32,32,32}, {32,22,22,32,32,32,22,22,32,32,32}, {22,22,32,32,32,32,22,22,32,32,32}, {22,22,22,22,22,22,22,22,22,22,32}, {22,22,22,22,22,22,22,22,22,22,32}, {32,32,32,32,32,32,22,22,32,32,32}, {32,32,32,32,32,32,22,22,32,32,32}, {32,32,32,32,32,32,22,22,32,32,32}, {32,32,32,32,32,32,22,22,32,32,32}, {32,32,32,32,32,32,22,22,32,32,32}, {32,32,32,32,32,22,22,22,22,32,32}, {32,32,32,32,32,22,22,22,22,32,32} }; static char five[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,22,22,22,22,22,22,22,22}, {32,32,22,22,22,22,22,22,22,22,22}, {32,32,22,22,32,32,32,32,32,32,32}, {32,22,22,32,32,32,32,32,32,32,32}, {32,22,22,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,22,22,22,22,22,22,32,32,32}, {22,22,22,22,22,22,22,22,22,32,32}, {32,32,32,32,32,32,32,22,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,32,22,22}, {32,32,32,32,32,32,32,32,32,22,22}, {32,32,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {32,22,22,32,32,32,32,32,22,22,32}, {32,22,22,22,22,22,22,22,22,22,32}, {32,32,32,22,22,22,22,22,32,32,32} }; static char six[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,22,22,22,22,22,32,32,32}, {32,32,22,22,22,22,22,22,22,32,32}, {32,22,22,22,32,32,32,22,22,22,32}, {22,22,22,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,32,22,22,22,22,22,32,32,32}, {22,22,22,22,22,22,22,22,22,32,32}, {22,22,22,22,32,32,32,22,22,22,32}, {22,22,22,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,22,32,32,32,32,32,22,22,22}, {32,22,22,22,32,32,32,22,22,22,32}, {32,22,22,22,22,22,22,22,22,22,32}, {32,32,32,22,22,22,22,22,32,32,32} }; static char seven[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {22,22,22,22,22,22,22,22,22,22,32}, {22,22,22,22,22,22,22,22,22,22,32}, {22,22,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,22,22,22,32}, {32,32,32,32,32,32,22,22,22,32,32}, {32,32,32,32,32,22,22,22,32,32,32}, {32,32,32,32,22,22,22,32,32,32,32}, {32,32,32,22,22,22,32,32,32,32,32}, {32,32,32,22,22,32,32,32,32,32,32}, {32,32,22,22,22,32,32,32,32,32,32}, {32,32,22,22,32,32,32,32,32,32,32}, {32,22,22,22,32,32,32,32,32,32,32}, {32,22,22,32,32,32,32,32,32,32,32}, {22,22,22,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32}, {22,22,32,32,32,32,32,32,32,32,32} }; static char eight[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,32,22,22,22,32,32,32,32}, {32,32,32,22,22,22,22,22,32,32,32}, {32,32,22,22,32,32,32,22,22,32,32}, {32,32,22,22,32,32,32,22,22,32,32}, {32,22,22,32,32,32,32,32,22,22,32}, {32,22,22,32,32,32,32,32,22,22,32}, {32,32,22,22,32,32,32,22,22,32,32}, {32,32,22,22,32,32,32,22,22,32,32}, {32,32,32,22,22,22,22,22,32,32,32}, {32,32,22,22,22,22,22,22,22,32,32}, {32,22,22,32,32,32,32,32,22,22,32}, {32,22,22,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {32,22,22,32,32,32,32,32,22,22,32}, {32,22,22,32,32,32,32,32,22,22,32}, {32,32,22,22,22,22,22,22,22,32,32}, {32,32,32,22,22,22,22,22,32,32,32} }; static char nine[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,22,22,22,22,32,32,32,32}, {32,32,22,22,22,22,22,22,32,32,32}, {32,22,22,22,32,32,22,22,22,32,32}, {32,22,22,32,32,32,32,22,22,32,32}, {22,22,32,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,22,22,32}, {32,22,22,32,32,32,32,22,22,22,32}, {32,22,22,22,32,32,22,22,22,22,32}, {32,32,22,22,22,22,22,22,22,22,32}, {32,32,32,22,22,22,22,32,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {32,32,32,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,22,22,32,32}, {32,22,22,32,32,32,32,22,22,32,32}, {32,32,22,22,22,22,22,22,32,32,32}, {32,32,32,22,22,22,22,32,32,32,32} }; static char zero[20][11] = { {32,32,32,32,32,32,32,32,32,32,32}, {32,32,32,22,22,22,22,22,32,32,32}, {32,32,22,22,22,22,22,22,22,32,32}, {32,22,22,32,32,32,32,32,22,22,32}, {32,22,22,32,32,32,32,32,22,22,32}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {22,22,32,32,32,32,32,32,32,22,22}, {32,22,22,32,32,32,32,32,22,22,32}, {32,22,22,32,32,32,32,32,22,22,32}, {32,32,22,22,22,22,22,22,22,32,32}, {32,32,32,22,22,22,22,22,32,32,32} }; if(m == 1) o = 02; /* character starting offset */ if(m == 2) o = 19; if(m == 3) o = 36; for(r = 0; r < 20; ++r) { p = HOME + o + r*LINE; for(c = 0; c < 11; ++c) switch (n) { case 1: *p++ = one[r][c]; break; case 2: *p++ = two[r][c]; break; case 3: *p++ = three[r][c]; break; case 4: *p++ = four[r][c]; break; case 5: *p++ = five[r][c]; break; case 6: *p++ = six[r][c]; break; case 7: *p++ = seven[r][c]; break; case 8: *p++ = eight[r][c]; break; case 9: *p++ = nine[r][c]; break; case 0: *p++ = zero[r][c]; break; default: *p++ = zero[r][c]; break; } } } britedim() /* alternate intensity of screen rows 1 - 20, columns 1 - 60 */ { static int i = 0; (i == 0) ? (i = 1) : (i = 0); /* reverse i */ if(i == 0) brite(); else dim(); } brite() /* make screen bright */ { char *p,*q; for(p = HOME; p < (HOME + 21*LINE); p += LINE) for(q = p; q <= (p + 60); ++q) stobrite(q); } dim() /* make screen dim */ { char *p,*q; for(p = HOME; p < (HOME + 21*LINE); p += LINE) for(q = p; q <= (p + 60); ++q) stodim(q); } stobrite(q) char *q; { q; /* put q in HL */ #asm CALL SETROM ;switch to ROM MVI B,0FFH ;all bits hi CALL STODIM ;put in dimRAM CALL SETRAM ;switch back to RAM #endasm } /* STODIM is in ROM and looks like this: 015D JMP O6D5 06D5 DI OUT 2 MOV M,B OUT 3 EI RET */ stodim(q) char *q; { q; /* put q in HL */ #asm CALL SETROM ;switch to ROM MVI B,07FH ;bit 8 lo CALL STODIM ;put in dimRAM CALL SETRAM ;switch back to RAM #endasm } setwid(w) int w; /* sets screenwidth to 52, 80, or 100 columns */ { char c; /* screen width: 1 = 100 columns */ /* 2 = 52 columns */ /* 3 = 80 columns */ char *pw; /* pointer to screen width control port */ pw = WIDCON; /* points to screenwidth control port */ switch(w) { case 52: c = 2; break; case 80: c = 3; break; case 100: c = 1; break; default: c = 3; } #asm CALL SETROM ;switch to ROM #endasm *pw = c; /* set screenwidth */ #asm CALL SETRAM ;switch back to RAM #endasm } rdcon() /* read console */ { #asm MVI E,0FFH MVI C,6 CALL 5 #endasm }  to RAM #endasm } /* STODIM is in ROM and looks like this: 015D JMP O6D5 06D5 DI OUT 2 MOV M,B OUT 3 EI RET */ stodim(q) char *q; { q; /* put q in HL */ #asm CALL SETROM ;switch to ROM MVI B,07FH ;bit 8 lo CALL STODIM ;put in dimRAM CALL SETRAM ;switch back to RAM #endasm } setwid(w) int w; /* sets screenwidth to 52, 80, or 100 columns */ { char c; /* screen width: 1 = 100 columns */ /* 2 = 52 columns */ /* 3 = 80 columns */ char *pw; /* pointer to screen width control port */ pw = WIDCON; /* points to screenwidth control port */ switch(w) { case 52: c = 2; break; case 80: c = 3; break; case 100: c = 1; break; default: c = 3; } #asm CALL SETROM ;switch^ Nq:VN>:Vq>ɯ2;͚>PK  !6'!~<2_6> ͓:à1͚ PK 1.3 - E.Meyer - 07/84 :222"2'22%:*ڀ!~#::2UG>2V*}* ͌"S" " `!2k#2j#~+ #2W#~=fÀ#2Y>2X#~fZw#:i<2iG#~,:iG=2W2X*j!YN# #Z:Vʅ͚[Bank :͓͚] *j͚: }ʸ͚ :l<2l:o=2o=Ù:W2n}t#:l_}2o><2mt:V5:U`! "!" ͚ >2V>2o>2i2W2X2l2m2n.*SNwy#h:mʉ͚ =x2m:lʞ> ͓=Ï2l͚ >!p:oG~ ڻڽ>.͓#°͚< >2o:n#͚: p#26#~=€#24#~€>>23>25!<-"/͚Port :6Ͳ͚ -> Ͳ> ͓!"3>25!->"/5͚ ??}o|g_㯆#͓Ú0:ړÓͦͦ|Ͳ}Ͳ~ʀA_0Ҁ_#_ PK.DOC ------ Documentation for PK.COM Version 1.3 (c) 07/84 E.Meyer PK.COM is a handy PeeK and PoKe utility for CP/M. Written in 8080 assembler, it takes only 1K of disk space. It allows you to examine or change the contents of any location in RAM. You can also read or send a byte to a hardware port. PK output will echo to the printer with the CP/M ^P toggle. Here is a brief summary of PK syntax ("[]" = optional): A>pk or A>pk [b:]aaaa[+nn][=vv] or A>pk [b:]aaaa=vvvv.... or A>pk #pp[=vv] Use only valid hex digits 0-f, and specify ALL digits, even leading 0's, or you will get a syntax error. The "b:" parameter in the above examples is used only on systems with banked memory; see NOTE below. Typing "PK" alone, with no arguments, invokes interactive mode. You will receive a prompt, ">PK ", following which you may enter any of the argument forms discussed below. Standard CP/M line editing is in effect. Enter ^C or a null line to exit. I. PEEK: Examine memory locations You can examine anything from a single byte to a full page (256 bytes) of memory. There are two different formats: (1) To examine a single byte: A>pk aaaa (2) To examine many bytes: A>pk aaaa+nn Examples: PK 003B shows the value at address 003B. PK 0600+4F shows all bytes from 0600 to 064F. PK always displays the requested location(s) in hex and ASCII: A>pk 005d+07 PK 1.3 - 07/84 - E.Meyer 005D: 30 30 35 >005< 0060: 44 2B 30 37 20 >D+07 < Of course 005C is the address of CP/M's first FCB, so its contents were simply the argument we gave on the command line with PK. II. POKE: Change memory locations PK also allows you to poke desired values into memory. There are three different formats for doing this. (1) To poke a single byte: A>pk aaaa=vv (2) To poke the same value into many bytes: A>pk aaaa+nn=vv (3) To poke a series of up to 16 different values: A>pk aaaa=vvvv.... The offset and value series options conflict. If you specify both, as in PK 1800+2F=0D0A00, PK will ignore the offset specified. Examples: PK 309D=E5 pokes value E5 into address 309D. PK 4000+07=00 pokes value 00 into addresses 4000-4007. PK 0006=43FB pokes 43 into 0006 and FB into 0007. PK then displays a peek of the addresses just poked. III. IN/OUT: Communicate with hardware port PK also allows you to talk to hardware ports using the IN and OUT assembler commands. To do this, the argument should begin with a number sign "#" and the port number, "pp". (1) To read a hardware port: A>pk #pp (2) To send a value to it: A>pk #pp=vv Examples: PK #0D reads the byte from port 0D. PK #0C=E8 sends byte E8 to port 0C. The port and the value read "->" or sent "<-" will be displayed. -------- NOTE ON BANKED MEMORY (CP/M PLUS ONLY) -------- If you do not have banked memory (found in most implementations of CP/M 3.0), do not use the "b:" parameter. Furthermore, it may not work on your machine if its bank selection protocol is different from that of an Osborne Executive. Bank "n" must be enabled by sending a byte with bit "n-1" high to the bank control port: for example 01000000 for bank 7. The original configuration is restored on exit. The default bank is "1:", the TPA. Accessing other banks can be hazardous, as they contain the non-resident operating system, its data buffers, and various machine-specific firmware (such as video RAM or boot ROM). Sometimes the same addresses may refer to different entities on reading and writing. If you use an address that doesn't exist in the specified bank, you will be operating on bank 0. Review your manual. To use bank selection, you may have to patch one of two values into PK.COM with SID. First, your machine's bank control port number is required at location 0103. The default is 00, for an Osborne Executive. Second, if PK does not run properly with the default of 0000 at location 0104-5, you must install an address in your resident BIOS where PK can temporarily put 26 bytes of code. This can be either an unused BIOS patch area, or if necessary a location in some routine that PK will NOT try to call (for example, disk i/o). The original code will be restored. PK has to use an odd trick to switch banks in order to avoid losing itself, since switching banks disables bank 1, which is where PK is running. The BDOS, though, is usually visible under any bank selection, as is a small amount of RAM just below it. PK has to put a small piece of itself (26 bytes) up in this common memory, so that it won't get wiped out by the bank switch. If you have not patched in an address to use (at 0104-5) as described above, PK will calculate an address just under the start of the BDOS (plus RSXes if active), and hope that this location will be high enough. This will, for example, work on my Executive unless there are more than two pages of RSXs in memory. If the address you have at 0104-5 does not work, PK will crash when some banks (particularly 0) are accessed. s in memory. If the address you have at 0104-5 does not work, PK will crash when some banks (particularly 0) are accessed. to call (for example, disk i/o). The original code will be restored. PK has to use an odd trick to switch banks in order to avoid losing itself, since switching banks disables bank 1, which is where PK is running. The BDOS, though, is usually visible under any bank selection, as is a small amount of RAM just below it. PK has to put a small piece of itself (26 bytes) up in this common memory, so that it won't get wiped out by the bank switch. If you have not patched in an address to use (!P#P1OP:2P4U͒P1O>2V͒P͘PHQPDPPʗQRjS? PQʍPS;SLRPW͒P!X͘P (( 80w#xP> w#Px\P+\P PʍP_( P!"X6# y x ɯ!/Uw!0Uw> ͮP> ͮP!"X:3U( > ͮP> ͮPyPz\R͋R{\R͋R>=ͮP~\R͋R# ~\R͋R> ͮP# :/U<2/U ܯ2/UBA> ͮP~ 0>. >.ͮP#:0U<20UQ20U> ͮP> ͮP͘PQ!/Uw>!0Uw!/WR:-U\R͚R! XR> ͩR> ͩR!"X:3U( > ͩR> ͩRyPz\R͚R{\R͚R>=ͩR~\R͚R# ~\R͚R> ͩR# :/U<2/U ܯ2/UBA> ͩR~ 0>. >.ͩR#:0U<20U ͩRQO???? 007Gy˿˷˯˧ 007OC1UK1UxͮPyͮPK1UxͩRyͩR_ ( P~ͩR#V͒P͘PAjSCjSA !.UwP2>2!.U~''''''G:b2b> ͮP:b˿˷2b> ͮP[W͒P͘PD(S >ED!3UwO:aA(ˇ2aPW͒P͘P08400(G !-Uw͘P08@00G!-U~wPRͿTZTSSUSTUSTUSͨTSP{ :TT:!W( ::!7:!G( x >7!!F(HTw:3U6T>GF 72j>:!T:.U >@@O:bG̈́T>͜T>͜T>!j6:b?O͏T>2,y2b2,O>=@I :b?O͏T>2,y2a2,:3UO:aOͲT>T8 /!"XT!T:!w# xT!!:-U2!:TTWWWͨTS!PÒP Read Track / Disk Track Read Program For The Osbourn 1 Computer Rev 1.2 Program By James D. McDaniel 04/04/84 Your Commands Are: S,D,P,R,?,Q,H,L ---------------------------------------- S=Set Drive Density D=Disply Disk Track P=Print Disk Track R=Read Disk Track ?=Output Commands Q=Quit(Back To CP/M) H=Printer Heading L=Log-In Disk Drive Press The "ESC" Key To Stop Any Printing $ Enter Your Command:$ Which Drive Is To Be Used? (A,B):$ Which Track Is To Be Read? (00 To 39):$ Read Track Program / Hex Track Number:$ Enter D=Double Or S=Single Density:$ ERROR DURING HOMING THE DISK$ ERROR DURING DISK TRACK READ$ ERROR DURING SEEK TRACK OPERATION$ Enter Printe r Heading (16 Char. Max):$ ????????????????ROR DURING DISK TRACK READ$ ERROR DURING SEEK TRACK OPERATION$ Enter Printe3ͱ,USPS* |} !9":!"<<2* ͞ !~5 * ͡S ͤ xT!!:-U2!:TTWWWͨTS!PÒP Read Track / Disk Track Read Program For The Osbourn 1 Computer Rev 1.2 Program By James D. McDaniel 04/04/84 Your Commands Are: S,D,P,R,?,Q,H,L ---------------------------------------- S=Set Drive Density D=Disply Disk Track P=Print Disk Track R=Read Disk Track ?=Output Commands Q=Quit(Back To CP/M) H=Printer Heading L=Log-In Disk Drive Press The "ESC" Key To Stop Any Printing $ Enter Your Command:$ Which Drive Is To Be Used? (A,B):$ Which Track Is To Be Read? (00 To 39):$ Read Track Program / Hex Track Number:$ Enter D=Double Or S=Single Density:$ ERROR DURING HOMING THE DISK$ ERROR DURING DISK TRACK READ$ ERROR DURING SEEK TRACK OPERATION$ Enter Printe READTRACK PROGRAM DOCUMENTATION 04-26-84 READTRAC wa writte t allo th Osbour compute t loo a an 5.1/4 dis fro an typ o machine I yo the obtai boo fro Wester Digita o ther 179 Dis controlle chip yo ca determin wha dis forma yo ar lookin at READTRAC wil no cop an disk bu wil allo yo t determin dis density sector size, and sector numbering system. READTRAC wa writte o a doubl densit machin bu shoul wor o singl densit machin also T us typ i th nam READTRAK28!"9!!>2 0&+!0 [ (!ePWA8Q0G: x@!\w# (   L). )!h6# (*(.(!8}(*(Ww#>?> w#a{ |e}nƐ'@'ý7||}>"C ""*B"[R*"^#V#^#V#N#FO/o&9O/o&9!9(> (G!9 w#EMw}8"RB0 >RRR!+k = R!+k = !+k = !+k = !#k = !+k = T]KB!z> S>))0 = |  DMgo>jB0 7?= H<͡z5)<z {0Gɯgo|| }||/g}/o#}o&K[xAJSJDM!b"!6J"DM'oodo o} $yWj _}8(8J`9{T]=o`9y $͙ >" 8# }>(́ x }} ˸T}ٕ(0D= ,= (  0% , 7 R ?(88 x  - 8˸x   ͠ ,-xG} }م 9 .>#n0  = - nx  ,-(-˸G,- }ٕ? 9.>R 88 ?= u+-(> 08  8R ?x  , 78ƀ8ƀ8ox٨!دoGOW_gɷɷ|لg{ً_zيWyىOxوG|ٔg{ٛ_zٚWyٙOx٘Gxٸyٹzٺ{ٻ|ټx٨u xx( ?}ٽR }ց <( 7 = |٤g{٣_z٢Wy١Ox٠G 8͉ }x>"8}ƀ/ƀó ͙ - }0- ,}l˸k 8 ́ # x(͙ -k 8 -k 8, }l8;*!# ! >8# # 8---͙ ,,,-xGg?+2n*8t z~,->"x"$}.́  ,͙ ́ ! >,.-͙ o&0%͔,# ͙ }g }؉}颋.:}8c~I$I~L*.ٷx˸́ }0G,\<}͔,-(- ! >0 $# o8 Á >"m.`1pF,t6|!wS<.z}[|%FXc~ur1}ٯx(<˸k 8́ !~Jk 0ͺO!Z>k 8 =  ͙ # ͙ ́ ͺ͙ 0 - OT0 j oD,:j !I}袋.}8c~I$I~L!>8# # ͙ # = Ù nf^VNF!DLT\I!!53!r1!!> x #-= o˸x(-͙ }(x>8( , `i!>"| | >)=|(DMbo˸y88yx(0 8> x(>-q{(ay(oe z(>.q (o =e{>Eq>+|(|Dg>-q|/ 0:p# ~# +>0w#,-  60# ˸}րogM͇| .( = ~> x0w#xG% % ZJDM% = _~65(+~hìx-Sx9?+{Η@}|  gZJDM0 ,7}o˸ #yO!@9i&  #w#/w#w#!9! E9!!9~(+FM!"9!(#>2*u"|>":( E *6#w*6#6 !\$!u[ (W( #:~CONTRMKBDLSTAUXUSR>2ͭ*#~ u*:> >w###6Õ  #6++p>2Su:*6###ww#w$w#w: ͳ##N#F*B>w#w#[s#rò>2u*6 #-Nw#Fwq#p#6#w#w#w͞* :( Q: *^ F* < >26"~^*-w#ww#Ͳ^"~ <@*u!\  >2*|>! * \$\<(!: [1Á\!(f"́> 2:!"F( #~#6$>!"N>!~8>O6*"w (=(&("( :( 8y(~#ͽ7+ (6*#~́*#~ *~(h#"b=  8ͽ ̶J= B== ͯ}8= ͵}/l !*###~-_~(46*>2>*##w:>*##~*#~(E͋ ( ( ( ͕!] ( ( ((w#(͕́̕6!]~-#8~>7́ Õ͕>O*{͍̈́s #r*{/͍ d͋ ͕ (( #w(͕́̕q*#~ʶ (͕́ ͕ Õ*##~6[O*#~(08ʦ=ʦ==ʩ=ʬò+###~-_q46`>*:4^q}Q*|(|( 6-#Sy[R8 (G> QC~Q#*ͳyC!' !+TRUEFALSEy!9^#~#(G~Q#> Q> Q "F!(#R0ͳ*4#4>R *4 #4(Ͳ>>2*V(/˖:(#~+ x y!t( =( X:(R*:(###~-_-K< =>:("^"*^˞*V˖0 SѷR8A* N#F#s#r 0})jS\*###w* N#FB ^r+s>!T]>)j)0 0= R!#*^#V#N#F#^#V>">!2DM"~ʲx(L* :O(o:" C}=( ?*-N#Fp+qq#p! * F+N+++V+^Bq#p>>>SѷR* s#r$ s#r*"[R0s#r>"[^#VS!9[R8[R>O"w2x2!"" ͵*>2"!"""!\u*: ͭ!~6go(\R*s#r_2x( s x(T]DMR0 -a%Ù}Wo*!~6o&͠|ͣ}^C" User break1: I/O Run-time error e, PC=[R"` Program aborted*1!`!0.ͅ/}2d*d&Rµ!}2e _RB*d&}2e _RB*d&!R}2e!.}2e*e&"^!*^͐}2Y*Y&RNNot on menu. P!uÄR„ Allocation group out of range. P!u!!!0@Hit any key to continue.͠Eʹ"""!*^#V!*^#V!͡"! *DM!*^#V!͇"*"!!z~"! *DM! *DM! *!"*!"*#2""!@ALLOCATION GROUP *^#V!͵OO!!z( "**+n&͔}2*&ͱ*!@!E O*#""""*!!.E} **s#r*****Ä !6@8A Move ahead one allocation group and display contents.O@7B Move back one allocation group and display contents.O@:F Construct a new file out of allocation groups that haveO@9 been labeled with the corresponding filename using theO@ label function.O@?G Move to the specified allocation group and display contents.O@< This is the only command allowing an argument. Syntax isO@< Gxxx or G xxx, where xxx is an allocation group number inO@: decimal. Note that end of file will appear as a shadedO@+ square graphic symbol or series of such.O@;L Label the currently displayed allocation group with a 12O@> character maximum filename. This name should consist of anO@< 8 char max filename, period, and 3 char max filetype. ItO@= must not include a drive specification, since this will beO@ supplied automatically.O@=M Display a map of all allocation groups and their filenamesO@( as supplied using the label function.O@X Exit program.O@? Display this help screen.OOO@# Press any key to return to menu.O͠En%6""!@Enter filename for group: !   !u!!! ͭ**^#V)))! ͔"""!@Target drive for output file: !\͚*\&!AR"]!@ Filename: !   !u!!! ͭ*]!E&!aA:!'!aB:!!a8!@2Show each group before writing to file (Y or N)? !\͚!!zD("_**_)))!E;(!_***\&!YE*(!_*!@&Write group to file (Y) or skip (N)? !\͚*\&!YE'(!a*!&;(!a*!&*_#c'!a"Z!!͐!!zʚ)"T*T!@!E)*T!^E(!@&Press C to continue map, X to abort: !O͚*O&!XE(Ý)!!z)"R*R*R#)!*T!"R!*T!@!͡!͇"P*P*R*T!͵! ͱ*Z*T)))!0*T#n(á)Ú)"H"J"L}2N*N&!E)*L^#V!"B)*L^#V!R"B*B*L*J*H) "<">"@6@7REGROUP version 1.0 5/83 by David B. RingOO@an unreadable disk and suspect a bad directory, try copying itO@;to a new diskette using the COPYF command of MVP FORTH. ItO@s#r!!zf."5*<*5)))  ͔*5#,.6!!@2A Ahead B Back F File G GroupO@1L Label M Map X Exit ? HelpO!@Your choice: !0͚!.ͭ*0&ARI/!!!!͢)/BRi/!!!!͢)/FR…/!!!f &/GR¥/*.!!!) /LR½/!!fz%/MR/!fN(/XR/6r/?R/ͅ /!!!!f*!E0j. 0r) Í/LRL!!fz%í/MRM!fN(/XRX6r/?R?ͅ /!! CP/M files.OO@=REGROUP is placed in the public domain, and may be reproducedO@?freely for noncommer#REGROUP.COM is a special purpose utility for recovering files from a disk that has a damaged directory, but which is otherwise readable. (If a disk is totally unreadable, and a directory error seems likely, it may be possible to copy the disk to a new diskette using the COPYF command of MVP FORTH from the FOG library, after which REGROUP may then be usable on the copy.) REGROUP can also be applied to recover pieces of files that have been partially overwritten and are thus beyond salvaging with UNERA. Finally, REGROUP could be used to store FORTH screens into CP/M files, although screens on the first three tracks would not be accessible. The program displays one kilobyte of data at a time as a block of 16 by 64 characters. In the case of an Osborne double density disk, this block will correspond to one allocation group. For convenience in determining the last block of an ASCII file, the CP/M end of file character (control Z) is shown as a shaded square graphic symbol. A label (which will become the filename) can be assigned to the currently displayed block, and a map showing the labels assigned so far can be displayed at any time. When a series of blocks that appear to form a file has been labeled, the file command prompts for a filename and causes all blocks with that label to be written to a new disk file. REGROUP is configured for Osborne double density disks only. The Pascal source code has been placed in the FOG library and can be modified for single density if anyone is interested (although it will not be possible to show the full 2 kilobyte single density allocation group on one screen).ot be accessible. The program displays one kilobyte of data at a time as a block of 16 by 64 characters. In the case of an Osborne double density disk, this block will correspond to one allocation group. For convenience in determining the last block of an ASCII file, the CP/M end of file character (control Z) is shown as a shaded square graphic symbol. A label (which wil(* REGROUP version 1.0 5/84 by David B. Ring This program is placed in the public domain and may be freely reproduced for noncommercial purposes. It is intended to be compiled with Turbo Pascal from Borland International, and compatibility with other versions of Pascal has not been checked. *) const MAXGROUP = 184; (* last allocation group on DD *) FIRST_TRACK = 3; (* first nonsystem track *) GROUPS_PER_TRACK = 5; SECTORS_PER_GROUP = 8; SELDRV = 14; (* BDOS and BIOS functions *) SETTRK = 9; SETSEC = 10; SETDMA = 11; READSEC = 12; A = 0; (* disk drives *) B = 1; SHADED_SQUARE = 127; (* special symbols for display *) DOT = 46; END_OF_FILE = 26; (* CP/M end of file character *) type blockbuf = array[1..1024] of byte; filename = string[12]; maparray = array[0..MAXGROUP] of filename; direction = (AHEAD, BACK); errorcode = (NOT_ON_MENU, OUT_OF_RANGE); var group : integer; sourcedrive : integer; buffer : blockbuf; map : maparray; (** LOW LEVEL PROCEDURES *******************************************) function filter(c : byte) : byte; begin case c of END_OF_FILE : filter := SHADED_SQUARE; 32..126 : filter := c; 160..254 : filter := c - 128; else filter := DOT; end; end; procedure prompt(line : integer); begin gotoxy(1, line); clreol; end; procedure error(code : errorcode); var s : string[80]; begin case code of NOT_ON_MENU : s := 'Not on menu. '; OUT_OF_RANGE : s := 'Allocation group out of range. '; end; prompt(4); write(s, 'Hit any key to continue.'); repeat until keypressed; end; procedure readgroup(var group, drive : integer; var buffer : blockbuf); var track, sector, address, i : integer; begin bdos(SELDRV, drive); track := FIRST_TRACK + group div GROUPS_PER_TRACK; bios(SETTRK, track); sector := SECTORS_PER_GROUP * (group mod GROUPS_PER_TRACK); address := addr(buffer); for i := 1 to SECTORS_PER_GROUP do begin bios(SETSEC, sector); bios(SETDMA, address); bios(READSEC); sector := sector + 1; address := address + 128; end; end; procedure showgroup(var group : integer; var buffer : blockbuf); var i : integer; c : char; begin prompt(6); writeln('ALLOCATION GROUP ', group); writeln; for i := 1 to 1024 do begin c := char(filter(buffer[i])); write(c); if (i mod 64 = 0) then writeln; end; end; (** PROCEDURES CALLED BY MENU ************************************) procedure gotogroup(newgroup : integer; var group, drive : integer; var buf$fer : blockbuf); begin if (newgroup in [0..MAXGROUP]) then begin group := newgroup; readgroup(group, drive, buffer); showgroup(group, buffer); end else error(OUT_OF_RANGE); end; procedure help; begin clrscr; writeln('A Move ahead one allocation group and display contents.'); writeln('B Move back one allocation group and display contents.'); writeln('F Construct a new file out of allocation groups that have'); writeln(' been labeled with the corresponding filename using the'); writeln(' label function.'); writeln('G Move to the specified allocation group and display contents.'); writeln(' This is the only command allowing an argument. Syntax is'); writeln(' Gxxx or G xxx, where xxx is an allocation group number in'); writeln(' decimal. Note that end of file will appear as a shaded'); writeln(' square graphic symbol or series of such.'); writeln('L Label the currently displayed allocation group with a 12'); writeln(' character maximum filename. This name should consist of an'); writeln(' 8 char max filename, period, and 3 char max filetype. It'); writeln(' must not include a drive specification, since this will be'); writeln(' supplied automatically.'); writeln('M Display a map of all allocation groups and their filenames'); writeln(' as supplied using the label function.'); writeln('X Exit program.'); writeln('? Display this help screen.'); writeln; writeln; writeln(' Press any key to return to menu.'); repeat until keypressed; clrscr; end; procedure maplabel(var group : integer; var map : maparray); var s, t : filename; begin prompt(4); write('Enter filename for group: '); read(s); t := ' '; insert(s, t, 1); map[group] := t; end; procedure makefile(var source : integer; var buffer : blockbuf; var map : maparray); var name, mapname : filename; chan : file; group, target : integer; c : char; begin prompt(4); write('Target drive for output file: '); read(c); target := ord(upcase(c)) - ord('A'); prompt(4); write('Filename: '); read(name); mapname := ' '; insert(name, mapname, 1); if (target = A) then assign(chan, 'A:' + name) else assign(chan, 'B:' + name); rewrite(chan); prompt(4); write('Show each group before writing to file (Y or N)? '); read(c); for group := 0 to MAXGROUP do begin if (map[group] = mapname) then begin readgroup(group, source, buffer); if (upcase(c) = 'Y') then begin showgroup(group, buffer); prompt(4); write('Write group to file (Y) or skip (N)? '); read(c); if (upcase(c) = 'Y') then blockwrite(chan, buffer, 8); end else blockwrite(chan, buffer, 8); end; end; close(chan); end; procedure showmap(var map : maparray); label abort; var i, row, col : integer; c : char; begin gotoxy(1, 6); clreol; for i := 0 to MAXGROUP do begin if (i mod 64 = 0) then begin if (i > 0) then begin prompt(4); write('Press C to continue map, X to abort: '); read(c); if (upcase(c) = 'X') then goto abort; end; for row := 8 to 24 do prompt(row); end; row := 8 + i mod 16; col := 1 + ((i mod 64) div 16) * 17; gotoxy(col, row); write(i : 3, ' ', map[i]); end; abort: end; procedure step(dir : direction; var group, drive : integer; var buffer : blockbuf); var newgroup : integer; begin if (dir = AHEAD) then newgroup := group + 1 else newgroup := group - 1; gotogroup(newgroup, group, drive, buffer); end; (** PROCEDURES CALLED BY MAIN PROGRAM ******************************) procedure init(var sourcedrive, group : integer; var map : maparray); var c : char; i : integer; begin clrscr; writeln('REGROUP version 1.0 5/83 by David B. Ring'); writeln; writeln('REGROUP facilitates recovery of files from disks that have a'); writeln('bad directory, but that are otherwise readable. (If you have'); writeln('an unreadable disk and suspect a bad directory, try copying it'); writeln('to a new diskette using the COPYF command of MVP FORTH. It'); writeln('may then be completely okay, or at least recoverable by this'); writeln('program.) REGROUP can also be used to partially recover erased'); writeln('files that can no longer be salvaged with UNERA, or to write'); writeln('FORTH screens into CP/M files.'); %writeln; writeln('REGROUP is placed in the public domain, and may be reproduced'); writeln('freely for noncommercial purposes. REGROUP is written in Turbo'); writeln('Pascal, and thanks are due to Borland International for allowing'); writeln('free distribution of the compiled code.'); writeln; writeln; write('Source drive for allocation groups: '); read(c); sourcedrive := ord(upcase(c)) - ord('A'); group := 0; for i := 0 to MAXGROUP do map[i] := ' '; clrscr; end; procedure menu; var c : char; n : integer; begin gotoxy(1, 1); writeln('A Ahead B Back F File G Group'); writeln('L Label M Map X Exit ? Help'); prompt(4); write('Your choice: '); read(c, n); case upcase(c) of 'A' : step(AHEAD, group, sourcedrive, buffer); 'B' : step(BACK, group, sourcedrive, buffer); 'F' : makefile(sourcedrive, buffer, map); 'G' : gotogroup(n, group, sourcedrive, buffer); 'L' : maplabel(group, map); 'M' : showmap(map); 'X' : begin clrscr; halt; end; '?' : help; else error(NOT_ON_MENU); end; end; (** MAIN PROGRAM ***************************************************) begin init(sourcedrive, group, map); while (true) do menu; end. '; clrscr; end; procedure menu; var c : char; n : integer; begin gotoxy(1, 1); writeln('A Ahead B Back F File G Group'); writeln('L Label M Map X Exit ? Help'); prompt(4); write('Your choice: '); read(c, n); case upcase(c) of 'A' : step(AHEAD, group, sourcedrive, buffer); 'B' : step(BACK, group, sourcedrive, buffer); 'F' : makefile(sourcedrive, b@ O1 DISK TIMER V1.51 (C) 84/02/12 M.J.GUERRA =2j!@:] (!2o @ O1 DISK TIMER -- (C) 1984--MJ GUERRA--VROOM INC. MILLISECONDS PER REVOLUTION SSSSDDDDDDSSSSSS g    G 1 1 1 1 1 2 2 2 2 2 2 7 8 8 9 9 0 0 1 1 2 2 5 0 5 0 5 0 5 0 5 0 5 g           G A diskette must be in each drive to be timed. Press and hold: A to time left drive B to time right drive any other key to exit $*Z> w>2ͮ@>2!ͤ@:!(Kͤ@!#:! >28UCͤ@͗@(A6 >2ͤ@(_A( B(>2j2a>2@6<@͗@6>@*@6 "@ x >2,:(>@@2b2,ɯ(A6 >2ͤ@(_A( B(>2j2aThis program times your Osborne 1 disk drives. The form of the command is TD or TD A or TD B There must be a diskette in the target drive for this program to work properly. TD without a specified disk drive will default to the "boot" drive. The displayed D range is for double density. Optimum is from 200 to 203 ms/rev. The farther from this range that your drive varies, the greater the chances of BDOS errors. Single density drives are more tolerant of the variation in speed, and I've seen one work at 215 ms/rev. To stop the program, press and hold any key. To test the opposite drive, press and hold the key that corresponds to that drive. If no mark appears to indicate the timing, no index mark is being detected and the program will wait until one is detected or you press the RESET button. -M.J.Guerra  This is the release date of the disk. OSPD COM mOSPD C tMSPD C PK COM PK DOC READTRAKCOM READTRAKDOC REGROUP COM /REGROUP DOC REGROUP PAS &TD COM TD DOC DISKXINS.COM 44 4B 24960 195 FAST .COM 7F AD 384 3 FAST .DOC 62 4C 1408 11 OSPD .COM 16 CF 7168 56 OSPD .C D5 86 19712 154 PK .COM EF 68 1024 8 PK .DOC 0A 35 5632 44 READTRAK.COM FA 38 2304 18 READTRAK.DOC 48 08 1920 15 REGROUP .COM 40 73 12160 95 REGROUP .DOC 42 E0 1664 13 REGROUP .PAS 5D 85 9728 76 TD & Fog Library Disk FOG-CPM.099 Copyright (1986) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. Computer diagnostic programs. Filename Description -07-00 .86 This is the release date of the disk. -CPM099 .DOC This is the description of the disk contents. BD03 .COM 1CE9 6K ver. .03 [Bad Disk 1 of 2] Program to read disks and lock out bad sectors. BD .HLP 26F1 4K ver. .03 [Bad Disk 2 of 2] DIAG204 .COM E5FD 19K OCC factory diagnostics for the Osborne 1 single and double density systems. Note that the drive test options are destructive -- be sure to use two scratch disks before selecting any option which does anything with either drive. This program loads into memory so remove disk after loading. DISKDOC .COM 1179 11K ver. .008 [DISKDOC 1 of 2] Verifies data, fixes bad sectors, debugs file systems, disk drivers, and controller routines. DISKDOC .DOC 1B52 7K ver. .008 [DISKDOC 2 of 2] DISKX .COM 3EEA 18K ver. 1.0 [Disk Exerciser 1 of 5] For CP/M 2.2 computers with a 179x controller chip. Currently set up for ADM2 type terminals (Osborne and Kaypro). DISKX10 .DOC 16B5 4K ver. 1.0 [Disk Exerciser 2 of 5] DISKX .DTA 9EB7 5K ver. 1.0 [Disk Exerciser 3 of 5] DISKX .INS D004 4K ver. 1.0 [Disk Exerciser 4 of 5] DISKXINS.COM 444B 25K ver. 1.0 [Disk Exerciser 5 of 5] FAST .COM 7FAD 1K [FAST 1 of 2] Patch to speed up MPI drives on an Osborne 1 to reduce noise and shorten drive access time. FAST .DOC 624C 2K [FAST 2 of 2] OSPD .COM 16CF 7K [Osborne Speed 1 of 2] Drive timing program for the Osborne 1. Includes C80 source. OSPD .C D586 20K [Osborne Speed 2 of 2] PK .COM EF68 1K ver. 1.3 [Peek and Poke 1 of 2] Utility which allows you to examine or change any location in RAM on most CP/M 2.2 or CPM+ systems. PK .DOC 0A35 6K ver. 1.3 [Peek and Poke 2 of 2] READTRAK.COM FA38 3K [ReadTrack 1 of 2] Allows Osborne 1 to read tracks of any disk in its drive to determine density, sector size, etc. READTRAK.DOC 4808 2K [ReadTrack 2 of 2] REGROUP .COM 4073 12K ver. 1.0 [REGROUP 1 of 3] Recover files from a disk with a damaged directory. Written for Osborne 1 but Turbo Pascal source is included. REGROUP .DOC 42E0 2K ver. 1.0 [REGROUP 2 of 3] REGROUP .PAS 5D85 10K ver. 1.0 [REGROUP 3 of 3] TD .COM 19A2 1K ver. 1.51 [Time Drives 1 of 2] Allows Osborne 1 user to check drive speed. TD .DOC 088E 1K ver. 1.51 [Time Drives 2 of 2] iskf.cheklist.crc ENDIF SELE B STOR diskf-fn-"."-ft TO malt STOR SUBST(ft,1,2) TO mdate SET ALTE TO &malt SET ALTE ON ? filedesc SET ALTE OFF SET ALTE TO SELE A STOR diskf-"-"-SUBST(dfile,5,3)-"&mdiskno"-".DOC" TO malt SET ALTE TO &malt SET ALTE ON DO WHILE diskno="&mdiskno".AND. .NOT. EOF() IF diskno="000" IF dfile="FOG-DOS" ? " '