IMD 1.17: 27/06/2012 8:50:00 PASCAL VII.0 VARIABLE DENSITY CONTROLLER SOFTWARE CONVERSION KIT PART NUMBER 95-0010-102 MANUFACTURED ON 29-OCT-80  @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TERAKߋtv ?B-NO BOOT ON VOLUME @w p@w wP׭ ׭ w f@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ D(ŗ%!ŗkh HBf     B d 7×h3 7 ?IO ERROR WHILE BOOTING? 7 ?NOT ENOUGH CORE TO BOOT?   e    Ӈ\ߕ vߕ 7* SYSTEM.PASCAL? w7SYSTEM.8510.QX? @Aw  `! mG~d!~  \ZD C& H&  0  EL  ~  _~U@pe &  %C e U&f&  BA!A C5 D  ! A!U  C`C!C  U U5w \E ŋw 2Ŋw ( C! @ D~̋   wwDDԤ  Ӌ5 eW 7 ?YOU DON'T HAVE A  ߋt_v @ @ QB20CVTSYSTEM.8510.QB\5SYSTEM.8510.QX\5:SYSTEM.CHARSET\":V SYSTEM.FILER\gVY BOOTER.CODE\Yz SYSTEM.PASCAL\z|QXBOOT\I|~QBBOOT\I~Q2BOOT\I DM.8510.QB\ FORMAT.CODE\ STTK.8510.QB\ STDM.8510.QB\ SYSTEM.EDITOR[Y <fr.4H'B&J8$!COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD Z Z ` f:@FLRX^djpv| "*2``@Z`d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E e6!a6!@$% ''@&0(b6!c6! \ j .   @`& E&~AA~E e @`&AA~E e @`  `` @ @f ~f{fxfufrfoflfifffcf `f" t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef rHJKC  >P  ?]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*! /efAA,"<w eeee e  e e& f   EezN EE7- 7 &  G 6E7, 6 ?  w pr@$@$@$@" EB~f r&z%% 7 *\7 *``WtB &E7 5@|<7w {7yw 7 psw mw g- aBE B<<  wN EC~ B~Uf rfVpfz  eN @_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & E7? ~7E@U@  E7 w wU &    N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "~<E `E `EՀW @p@ `E e `&& `& ` ^ E@ &?  w U@w > 6 & h ^7 X E e `&EՀ~<  7Z   ҂ ~< E e ` EF @~w 2 ?*  "U@  wE 7 wv FRX\`&    @ ` G7vz   7H 7Z 6W w{Z N B F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz <6 E E7 ~<& EE Jd`n  B@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &  Z&X( &7 |v7 n|7 `|7 T 7 < 6 '((@`@`( (+m ]   P~P~eeNPP  \ = "  \m\  W  m ef5`\_e w5 5@ W  ~~e<ee``!~ e C~C~ %< C~\ɋE 5\\\f F^T2&,FR,: f6 C~ceί%@ eAp6% "1, 1,1,^  %W Y#w (Q&vI  >7 7(w& EFHJKABCDWX][f@@ N Z[  ^A %^A&Daef ¥_09E AZ  U7MwG7 % @`?R wLVxx|xt@ wU :: C  f ee $ $ $ $ @A eeee >eJ< K E7 w z2@t  w Et@_7   O 0E]``&& `  E e @a&&6E e @a&!$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTOE e @a \d<Z@@`@`$fH@7 `e B~  B~< _ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4IN7@` dd&`f&d&b&  m ef )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD - ɋ e  rfwBC % e 7d,\ Aɋ BJ@ BREPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR m8~@ Bm*~@ Bm~     WHILE WITH 7 +& @  z7 +7 t+7 X+7 R(7 ,7 V(7 ) I?zr& 7h  AF eA -Bl: \.<$WFl7 -\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k<   mAɋF! &ffD e w5 wDe`<nC<QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &  tʕ U Q~ʕ \׌UE׌x׌"  e % C ``` e7 %  % % ` %@7 6_ 8 E7 _ 7 v7 7 7 P 7"  @t@@Tw h07  w w N!.7 eJww  U @e @wxBEfEP$  LN wU  E@ e ]&  ]p |ʋD~ G~ 5E~ E~e  e  ` e  |7 7 7ߐ2 7  | t ~"w d    X N wK ZT| *, wU  @E  @7LWw: 7 ,* $? U@ _E7 wf U?  E7 E w<E 7$  7 t$Wax$Waw$  w wPRTV + wU  E@  U@ _E7 _y7|7v$ :)wmwed$ $ w[&$ $  E?R?DŸJE R7~  #l d#\ a:-:2* $ z&z& K wU  J _&2 -/ -'z& $ :?$ ,g SF $ ':t w` 1 -~'z&t t n d ^_TR HD 28*7 2E 7 _z&7  'U `  xZ7Wm7 P ]Dw=7w Zl Fw bIT $ '& _w E  t_! \RU \@@&2E  w tR <w H<  Alw&f65t w E   e@ׇEU Ub ]ER H7h$ga7k$`7n$[7q$VwLwCw;7B DI~A<ʵm H& W Y#w H^E. U w w  UEw  B | r $ _ $B  #E %M~ @E  a7 w7 _w Zć  tw  h!w  UOw p w 먇  <w  0w `ʽ W Y#ww7wm ,URN WW=774\% eC ~ 5@5@7 XJ((N()((*((((*N(*N(*N(*N((*)*N()*)B)f&\  \& \\r1@\[?\ ew & ?U?*@ڪAD C %     @   f&\   B -  e \z\D f C_  fW & @&&&&7 0**+:* <f,4~%x$J8*0*)J(@**N()N(N() *N(&**|*e\\;@\ \N @   =@f&ysE[\pCf&f&\%#V"COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD a @w   6 6 &  f 6A  v  6N\z\\\HJKC  >P  ? N A f C %C B    \ w  D& &&@7 N(+D& && /efAA,"<w  6  A7 ^)+P)J(++P)+J(+++*,*N(*N(*N(*N(*+ e\ \S\ e& @7 7 &  G 6E7, 6 ?  w prN(,+e\D,f& \:יc&>X4%]@& & & & & D&&D&& @%7 r&E7 5@|<7w {7yw 7 psw mw g-),  IA e e@ e& & & & & D&&e #@  @_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l@6 7 )-6 6 #?%-0 @ ׳f&& @׳@f&7 *J(-J()t-f&f7? ~7E@U@  E7 w wU &   &7 l*-*N(*N(*N(*N(*N(N(-N(*-   \-f& \ e\>:L]L?ƪ@ \fEA# *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "& e@ & f& f& f7 )N(". ff w   &@& n.  ^ E@ &?  w U@w > 6 & h ^7 X E7  (U@ % E7 ez\& Dr)&&\    ~<E `E `EՀW @p@ `E e `&& `& `<   mAɋF! &ffD e w5 wDe`<nC<E e `&EՀ~<  7Z   ҂ ~< E e ` EB@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &  F @~w 2 ?*  "U@  wE 7 wv FRX\`&    @ ` G7vz   7H 7Z 6W w{Z N B F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz <6 E E7 ~<& EE Jd`n Z Z ` f:@FLRX^djpv| "*2``@Z`d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E e8f"a8f"@"$ F% &@L$f&b8f"c8f" \ j .   @`& E&~AA~E e @`&AA~E e @`  `` @ @f ~f{fxfufrfoflfifffcf `f" t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*!``&& `  E e @a&&6E e @a&eeee e  e e& f   EezN EE7- E e @a \d<Z@@`@`$fH@7 `e B~  B~< _@$@$@$@" EB~f r&z%% 7 (\7 (``WtB 7@` dd&`f&d&b&  m ef aBE B<<  wN EC~ B~Uf rfVpfz  eN  ɋ e  rfwBC % e 7d,\ Aɋ BJ@ B8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & Em8~@ Bm*~@ Bm~     N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  I?zr& 7h  AF eA -Bl: \.<$WFl REPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR w Zć  tw  h!w  UOw p w 먇  <w  0w `ʽ W Y#w WHILE WITH 7 <)& @  z7 <)7 )7 )7 &7 *7 &7 ' tʕ U Q~ʕ \׌UE׌x׌"  e 7 ,,\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k@7 6_ 8 E7 _ 7 v7 7 7 P 7"QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &w h07  w w N!.7 eJww  U @e @wxBEfEPZ&X( &7 |v7 n|7 `|7 T 7 < 6  ]p |ʋD~ G~ 5E~ E~e  e  ` e  |'((@`@`( (+m ]   P~P~eeNPP  \ = "  \m\  W  m ef5`\_e w5 5@ W  ~~e<ee``!~ e C~C~ %< C~\ɋE 5\\\f F^T2&,FR,: f6 C~ceί%@ eAp6% "1, 1,1,^  %W Y#w (Q&vI  >7 7(w& EFHJKABCDWX][f@@ N Z[  ^A %^A&Daef ¥_09E AZ  U7MwG7 % @`?R wLVxx|xt@ wU :: C  f ee $ $ $ $ @A eeee >eJ< K E7 w z2@t  w Et@_7   O 0E]!$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTO'U `  xZ7Wm7 P ]Dw=7w Zl Fw bI ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4IN w tR <w H<  Alw&f65t w E   e@ׇEU  )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD -ʵm H& W Y#w H^E. U w w  UEw  B w   D5H5   :@ S~ e&-"wn.5) 5|w  f C_  fW & @&&&&7 f( )<)p((f('&v( )&'&&'V(&\( )(e\\;@\ \N @ 77 :  .-& pU`E@ wHw .:"   =@f&ysE[\pCf&f&\% a @w   6 6 &  f 6FU@ % eC ~% C ``` ezLN A  v  6N\z\\\ N A f C %C B    \ wU  E@ e ]& 7 7 7ߐ2 7  | t ~" w  D& &&@7 &)D& && 6  A7 ^'*'&**'*&"*** )J* )& )& )& )& )) w d    X N wK w: 7 ,* $? U@ _E7 wf e\ \S\ e& @7 &:*)e\z*f& \:יc&>X4%]@& & & U?  E7 PRTV + wU  E@ & & D&&D&& @%7 r'*  IA e e@ e& & & & & D U@ _E7 _&&e #@  @6 7 'J+6 6 #?%-0 @ ׳$$ K wU  J _&f&& @׳@f&7 )&+&'+f&f&7 l )+ )& )& )& )& )&&,&.)+   \(,f&ZT| ** wU &f&f7 .U   02 -/ ->%$  -~>%$t t n d ^_TR HDɝ^& _E7 .C DE!:7  7aehD A   aw7 28*7 2E 7 _$7  E7 V&U@ % E7 e:wXP@P7n@eI70@wnM)w\ 7 , ßz 5U$ ez\& Dr)&&\   5@5@7 X&'&'0'0' )'''' )& )& )& )&$'(:' )&J  E     7 7  @  27 !ׯ+U E ` D' )D'x'f&\  \& \\r1@\[?\ ew & ?U?*@ڪAD    ͋D 5|w 5B N  5 , W#D  7W ΁?Zw  C %     @  f&\   B -  e \z\D  ݽÿ۽ϟ>*>$$~$~$$>> >.*.:*:8DD88(800   $~$|8(8ÿŹýýýŹ ~8(8``0 > BB~~BB~>BBBBB>~>~~Qˡá >>"rBB^@BBB~BBB ">B""B~fZBBBBBBFJZRbB~BBBBB~~BB~~BBBRr~@~BB>BBB<B<@B<~BBBBBB~BBBBB$BBBBBZfBB$$BBBBB<~B0< B~>> 0``|@@@@@|><@\B|:FBF:ǟ`ƋfZBBB>BBBB>xx > 5 FILEHAND ہہǻ  \ e\>:L]L?ƪ@ \fEA#& e@ & f& f& f7 '&X, ff w ý  &@& , ýýý  " ȡ3پ!}ȄپaپzȄ پaAצI T  ܪ۪ڪ- آצ ? ) ,áYø۪   ˡ[ ġR&    צ ? (Y/N) - -F&צ ?  ɡ& Invalid #aP  ˄8&Destroy Gצ: ?  Gצצkת{צcתת(WצSתԦת(KצOת  J [ áF([*****]/(ġ 0 2` ٪ # ת á n`Äצ(ڹצParity (CRC) error(Bad unit numberת(Bad I/O operationת( Timeout error1 0 ء,ˡ   ߓ`&צPut  : in unit  ת(Vol went off-lineת(File lost in dirת(|צ Bad file name(fצNo room on vol(ONo such vol on-lineת(ء ߓ ٨š5Kˡ*   ġ" ء " 3File not foundת( t`K1ٹVol already on-lineת(Text file lostת(צCode file lost(N۪ڪƁK""áN׷9& צ ? " File foundת(צBlkd vol( Unblkd volת(צ File name(צFile/(unblkd vol)(צFile/(blkd vol)(צ  ڪ٪ت&:&Pɡ(š File/vol(Vol nameת(צOutput file full(Workfile is savedת(No directory on volת(No workfile to --> 4ثضÍצ$*á-:á?:saveת(Wildcard not allowedת(צ"Bad form (Wild Non-Wild) card(Ill file/vol nameת(}Ill change (Vol <:á ;&Pġ - عEXå[ׯGC81(o*to> file) nameת(UBad dest for files foundת(4,"iEbUġ#(צ  MJLN0A$6Uۡ &Pɡ צ, áצ áצ expected1(& Ş"˶ I/O error # 4!צ Filer error # ءfܪ(G[!nء CGGá+á &"ˡ~[צ[\&),áY 6( ˡ  .  sآWצ:آ(Yצc&  g=#g=ɍ=*á =*jjjצ:j($hh=ɡX="#š=P="=ݢÄ ۡ"ˡ ݢڶ /ݢ0/0 /0"=h"h=h"h"=P=gg=á?gg=ɡ, 󍓡 =g/0 0 òCń /C"ݢݢ///צ://td צTPܓÄ)jjSjצ:jˡjj(jAj(ܓfOGK׷ȄransferTo whereׯ󓄡=H3Transferצblocks# of blocks to transfer צTransferff@Զ  rުݪ"צPWkKGšׯɄ  צ. Ɓ-צMakeǐh"))** **  0ު(áܲ~Í %&ܥKO &&ȡu ''k'S{c\ڥs[KG2G:[ Remove oldRƁ-צChangȡKk'k-'' ܡšڡKNeChange to what׷{צSW,,W,צ:,(,,(,{A,(*צChange Y˄ &"&& & ܡ&'&k'{[*[")ǐ ),, d,,[,["𥀈{á򥀿D{ c󓍄E''S'צ:'{!'0'c?'(&K&not proccessedá" G"+!+~G?KÄ?G;K;GK,,á á3!:W~,gڲ= ggۓ$=?G,:, ׯ>צRemoveǀ RemoveE+G'ز=g(=g=&=g&Pɡۡצ ...too long <ٹFצ file nޤ removed%á % ń,&Update directory ? צame < scan string #צ vol name  M8!ۡ1á    - char. max >- Ɓ3"ݣ ɡݣ  ڕš"ق Illegal formatT<=ڲ= ݪצc&.צ what fileצܡC׷C#ÄÄ~Íj%á*צPut in G:'צInsert destination  what vol ?  , gg#š=jgjPg?=ɍ :disk % š " ݢÄ   Text file saved  & 0צCODE  #צCode file saved62"o.,%ö,ÍP$&,􍓡~%K:, %,,,|.צצ not named2 Workfile is :.񄓡 (not saved) No workfileڶ+šڸ+*ڂ*ŶB < UNUSED >     .p/ƃƅ'v%.ת&תת(&Ɓ.񄓡9&צThrow away current workfile ? Dir listing ofצ׷١糖 צ#1:(ƃ"١̅.̅-̅,̅+̅*̅) ̅( ءצ*SYSTEM.WRK.TEXTצ*SYSTEM.WRK.CODEצ*SYSTEM.LST.TEXT**.*צ.BACK*צצ Ä . %̅,ړצListƅ-~$ʅ.áWriting.ʅ.̅.ʅ- ̅/Remove  ء&צWorkfile cleared&Tf ' ݪܪ  : .  ǀʅ- ʅ//ʅ/ʅ/̅)ʅ(ʅ)̅(ƃʅ/ƃצʅ/ƃʅ) ƃʅ/  ƃ-ƃƅ0ʅ/ á@ .  ڲ צ& * )'Getצǐ&G.[0ƃ-ƃʅ/   ءQƃʅ/ ƃʅ/  ƃƃƅ0ʅ/ƅ0ƃfile3ƃʅ/ .&ؓń=.צ.TEXT.צ.CODE ..Ȳ.׷:.TEXTצText ײ ƃƅ0ʅ/ƅ0. ڍʅ- /ƃʅ. ƃ/ƃ  ƃ files;ƃצ--<00..99>Cˡ_צ Today is C -C-, $[.GC .צE&Save as C  New date ?  ,Cػ+škGGȡ"GؾAĥGؾZȄ:. ? 瓡צSave asצ[š C?/צTEXT$CODE$饀 GإGؾAa ȡ$GCػ+c,C ػ?צ:@Ä".[G&TEXT&  #hKצ*..CODEOld code removed, Cצ The date is C -C-C 6 *  ?:צPrefix is - ;: 0 צ Zero dir ofצH YbcCZ BAD.xxxxx.BADתV̂dVʂdȡV̂eʂeWʂeXT̂fTʂfġ1Z TʂeoT0צDuplicate dir ?   Are thereצblks on the diskצ# of blocks on the disk צNew vol name ? eʂeoTTT TWT ɡTTWT#VV צBad blocks markedH`]t5 饀:˥׷!צ:DGצ : correct ?  ۢˡMoving ۢۢצ SYSTEM.PASCAL G?   š G CK"צ: zeroed p1šצFile(s) endangered:Mȡ " " ġ  7l\ؤ áצ Directoryڢڢ  v 2צCrunch@צFrom end of disk, blockצStarting at block # 3 % forward ת ˡZ ȡ<ڤ š+ؓښڤ ȡ3ؓ R j3צBad block scan of ȡ'  š 7  צback  ġ ɡ7 GצHScan forצblocksScan for how many blocks ܕšۏ"ˡ`ۂȡQ : crunched#צPlease re-boot{ X6تPFP') x"ˡ93צBlock  צ is badۂġ צ bad blocks2 R88תVצOFiler: G(et, S(ave, W(hat, N(ew, L(dir, R(em, C(hng, T(rans, D(ate, Q(uit [C.4]8+צ 4צExamine blocks onצH&Block-range ? S  SRR  RRˡR&Filer: G, S, N, L, R, C, T, D, Q [C.4]8?áVOFiler: B(ad-blks, E(xt-dir, K(rnch, M(ake, P(refix, V(ols, X(amine, Z(ero [C. ġ RSSRō5%SVR̂dVʂdȡ V3VVš#2 Fix them ? Ǡ  4]8+&Filer: W, B, E, K, M, P, V, X, Z [C.4]8ڡ$&B% ȡ~٤ܦ׷u ȡhܲ~ؤsted/in-dir>, ƃʅ( ƃ blocks usedƃ, ƃʅ* ƃ unusedƃצ, ƃʅ+ ƃצ in largest T USVR̂dVʂdȡצBlock V ƁdVƁdV"á dV"Ɓdd  may be ok"١ ƃƃ"ƃ ,  N- Vols on-line: ȡ &Gz is badV3ˡYV šOUVˡ9TTTM šTVT ȡR~צ; צ #  :צRoot vol is - VVUVVá52Mark bad blocks ?š$צ (files will be removed !)צ (Y/N)  VWarning units   &  צ have the same name--('U}U}ˡ7Write Error: ,Bצ&** Bootstrap installed succ"צPrefix titles byl;G& Prefix is ;:`%\!X0T4P1L5H6essfully **ƂU *m is a general bootstrap mover.צ3Enter name of file D*@:BZ2" (@,(NXF0N>w\ ƁG&צSYSTEM.to be installed as a bootstrap: Pצ`  PASCALSYUSERPROGDEBUGGERPRINTERRINITIALIGETCMD 2 BOOTER   ɡOšOɡšF  LS#  , P# ƂUƃ  צ*This program is a general bootstrap mover.צ3Enter name of file  , I#  l,á*6!F *STK OFLOW*תPFF+ to be installed as a bootstrap: Pצצ to continue)   d˯7 H ȡ   צ0H" & ,Í ˫hp(ުPצצ22ȡ5233 ȡ 23aĩ3zȄ 23aAġ  *@#ٕš ګ۫ š۫ ګ,0   22š*á ?צ:22ȡá;2á!2ȡ5252š[ץQɫ  ȡ 0  0ȡ? ȡ  ġ  á22š2222ȡ2š5252á4w4]ץ11á4\1šV42233z ġMáš6 삫뻥 d #( / 3042221é42é1Ä2*á444ń55P.TEXTׯ]צ.CODEÍáɡ 럚肚X ū  J.BACKׯ7צ.INFO$.GRAFׯצ.FOTO8 <!~ áš  h ! ! Ä & ! !    šˡ 퓄 Ä퓡w 0ń0ˡ oɡ` Nȡš š   ɍL  "ˡ.ˡ   d쓡 뾿  .dá0á-  21šá. Ą ɡ 낫š ꓡ2  Q l>š 쾿  š땫ĚL삫Ú š a .Tá " *áá0á"á61 ɚ l š +-Í-ëzV 0á$-á š áš  šš!邚邫镫ë퓡S z kO  ȡ*ń+  ɡ"á a˄  ! "ˡ! "ˡ "ˡáˡת     n  á sá# Ȅ 隹Ká/Ä   á9 铡/! !!1ˡ) ! 76x á1 š2    7( :VQ28˄šá  d1  šš$ !邚邫镫ë퓡h  ! "ˡ ɡ! dÍÍˡ 퓄 Ä퓡  dÄÍ"  ! "ˡf á3 á+á! "ˡ ˄"ɡ  dá  dá C#C˄ C     +Uz  Oš *š  áá ~צ/13:!      4T h ɡ 逫-á-32768ת Pġ>o0 Eá +6+6ˡ6á  T4P"hvf J.*L overflowת(צInteger overflow(Divide by zeroת(צNIL pointer reference(צProgram interrupted by user( .Tf* zF d2:X fE6!~?8FצPut in :P?צSystem IO error(צ unknown cause( parity (CRC)ת(צillegal unit #(illegal IO requestת(צdata-FP'Ǡá*EEE   !#E$ á"ˡ"com timeout(vol went off-lineת(file lost in dirת(צ bad file name(צno room on vol( vol not found& E ##&Eá +6+6ˡ6á  T4ת(file not foundת(צ dup dir entry(צfile already open(צ file not open(צbad input format(r8FNo user programתP8F0#^.)G:!ing buffer overflowת(צdisk write protected(uillegal block #ת(]bad byte countת(Fצbad init record(.( SYSTEM.WRK. $*(J '%Ҧ74 text&}eN:%oYDצ IO error: (צUnimplemented instruction(צFloating point error(u'773code'77$Z&ت( *SYSTEM.WRK. 4(RWtn d8String overflowת(]Programmed HALTת(EProgrammed break-pointת(&ReP9$oYC %ƮƂƂ0ƂXƁ<s$` 0T @NDZ 8 T z ~ x\6  ( :*צ dup dir entry(צfile already open(צ file not open(צbad input format(r8FNo debugger in systemתP8F6^.)G:!ing buffer overflowת(צdisk write protected(uillegal block #ת(]bad byte countת(Fצbad init record(.Ȅ4šáRתPńȄ ,ń.( SYSTEM.WRK. $*(J '%Ҧ74 textáš蕿@šQȡ2 š'773code'77$Z&ت( *SYSTEM.WRK. 4(RWtn d8:X fE6!~?8FצPut in :P?FP'Ǡá*EE %ƮƂƂ0ƂXƁ<s$` 0T @NDZ 8 T z ~ x\6  (E   !#E$ á"ˡ"& E ##&צUnknown run-time error(צValue range error(צNo proc in seg-table(Exit from uncalled procת(Stack String overflowת(]Programmed HALTת(EProgrammed break-pointת(&ReP9$oYC? צ*SYSTEM.WRK.TEXT& *SYSTEM.WRK.CODEײ , 7 ٢ š٢ ٢٢ 4*ƁV`tDoo odoo'zr:9CONSOLE:ת(:9SYSTERM:ת(8:98́ʁʁʁצ*SYSTEM.MISCINFOP*"áO* ?́*́ʁʁʁʁʁʁ 6ëצ???JanתצFebMarתצAprMayתצJunJʁ%ʁ% t*&*n تٞ&"á ~٤  :SYSTEM.ASSMBLERת :SYSTEM.COMulתצAug Sepת צOct Novת צDec ???תצ??????ת6! PILERת :SYSTEM.EDITORת :SYSTEM.FILERת צ:SYSTEM.LINKERƁ&̨<́b ́cʁcȡ~ؤ%7̄詄% š t Welcome ?צ, tódʁdתʁd0ʁdʁd؞&"á*ʁd ضá0?ʁdצ*SYSTEM.STARTUP(߫7U.C.S.D. Pascal System II.0Current date is C -C-%́eʁ%ʁeȡlضʁ%ʁbQ́fƁfʁdƁfƁ&ʁ% Ɓf(ߡʁ% ʁbʁ%́bʁ%́%C %System re-initialized(, 06" 0 MayתצJunJ;??ٟá'C CONSOLEצSYSTERMGRAPHICצPRINTERREMINצREMOUTexulתצAug Sepת צOct Novת צDec ???תצ??????ת6! <ƋD*SYSTEM.CHARSETת(ƋDʋI&"áǀʋUʋTʋKƆD ʋT  ̌fʌުP11ˡCۡ>1áIllegal file nameצNo file ́3ˡ fȡƆD   ̌fʌfȡƈD  ل7@ǀ ?̌fʌfȡƊDؤؤ  not code3"ˡצ Bad block #02́42ʁ4ȡCƀ2ƀ2ō$ƀ ƀ P  ƋDR677::9 3222́42ʁ4ȡuƀ2ˡaݡ9צ Linking...ܡ #צ988:9  6 ۪1٦׷)Must L(ink firstg222́42ʁ4ȡJ22č7ʁ302́532́6ʁ5ʁ5ʁ6ʁ5ʁ622&}eN:%oYDצ IO error: (צUnimplemented instruction(צFloating point error(uצ: ܢܢH d    0&צצ.צ?? צ:) Running...ء ء:9  _~U@pe &  %C e U5w 8:9á'צ*SYSTEM.STARTUP %áá  E ŋw Ŋw C! @ D~̋   ww~DԤ  e f@^ڤ áڤ !~ e ת*U  6   FצKCommand: E(dit, R(un, F(ile, C(omp, L(ink, X(ecute, A(ssem, D(ebug,? [II.0]P')%?á@F!! !:!!ڤ  ڤ  áڤ R צ*Command: U(ser restart, I(nitialize, H(altP')%$z쓡áצ Assemblingצ Compiling...á999':::::&: Linking...ˡ&צ Restarting...צ U not allowed(yáצAssembleצCompile what text? (ׯ::(:.TEXT-:( RRJHá68AX0qz((* "D&(,. Dv\x"ˡ$צ Can't find ::9 ƀצ:9 ƀ:SYSTEM.SWAPDISK&:(76   FצKCommand: E(dit, R(un, F(ile, C(omp, L(ink, X(ecute, A(ssem, D(ebug,? [II.0]P')%?á@F-*SYSTEM.WRK.CODE[*]תצTo what codefile? (צ,áuצ$,,ˡ-צ*Command: U(ser restart, I(nitialize, H(altP')%$z쓡,::(,$,]ˡ$-::(:צ.CODE[*]0:--"ˡ צ Can't ope Linking...ˡ&צ Restarting...צ U not allowedn -   áث 7_a 7& š+ d(ŗkm HBf    7 ?IO ERROR WHIš%צSYSTEM.WRK.CODEsSYSTEM.WRK.CODE׷Fš5LE BOOTING? 7 ?NOT ENOUGH CORE TO BOOT? צ.CODE.. Execute what file?  e    \ߕ vߕ 7 SYSTEM.PASCAL? w7SYSTEM.8510.QX? @Aw   šA.á צ.CODEm%`! mG~d!~  \ZD C& H&  0  EL  ~  7 ?YOU DON'T HAVE A  ߋt_v @ @  /efAA,"<w 7 &  G 6E7, 6 ?  w prD(ŗ%!ŗkh HBf     B &E7 5@|<7w {7yw 7 psw mw g-d 7×h3 7 ?IO ERROR WHILE BOOTING? 7 ?NOT ENOUGH CORE TO BOOT? @_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l  e    Ӈ\ߕ vߕ 7* SYSTEM.PASCAL? w7SYSTEM.8510.QX? @Aw  7? ~7E@U@  E7 w wU &   Ӌ5 eW 7 ?YOU DON'T HAVE A  ߋt_v @ @ `! mG~d!~  \ZD C& H&  0  EL  ~  _~U@pe &  %C e U&f&  BA!A (B    d 7C5 D  ! A!U  C`C!C  U U5w \E ŋ×V= 7 ?IO ERROR WHILE BOOTING? 7l ?NOT ENOUGH CORE TO BOOT? w 2Ŋw ( C! @ D~̋   wwDDԤ  Ӌ5   e    ɇ\ߕ vߕ 7 SYSTEM.PASCAL? w7SYSTEM.8510.QB? @Aw  eW 7 ?YOU DON'T HAVE A  ߋt_v @ @ `! mG~d!~  \ZD C& H&  0  EL  ~ <f+$#>  _~U@pe &  %C e U&f&  BA!A D"COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SDC5 D  ! A!U  C`C!C  U UDԤ  Ӌ5 eW   P  ? "a"@ "F# n$H%@t#%b"c" \ j .   @`& E&~AA~E e @`&AA~E e @`  `` @ @f ~f{fxfufrfoflfifffcf `f" t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*!``&& `  E e @a&&6E e @a&eeee e  e e& f   EezN EE7- E e @a \d<Z@@`@`$fH@7 `e B~  B~< _@$@$@$@" EB~f r&z%% 7 (\7 (``WtB 7@` dd&`f&d&b&  m ef aBE B<<  wN EC~ B~Uf rfVpfz  eN  ɋ e  rfwBC % e 7d,\ Aɋ BJ@ B8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & Em8~@ Bm*~@ Bm~     N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  I?zr& 7h  AF eA -Bl: \.<$WFl *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "~<E `E `EՀW @p@ `E e `&& `& ` ^ E@ &?  w U@w > 6 & h ^7 X E e `&EՀ~<  7Z   ҂ ~< E e ` EF @~w 2 ?*  "U@  wE 7 wv FRX\`&    @ ` G7vz   7H 7Z 6W w{Z N B F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz <6 E E7 ~<& EE Jd`n Z Z ` f:@FLRX^djpv| "*2``@x`d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E e '((@`@`( (+m ]   P~P~eeNPP  \ = "  \m\  W  m ef5`\_e w5 5@ W  ~~e<ee``!~ e C~C~ %< C~\ɋE 5\\\f F^T2&,FR,:  C~ceί%@ eAp6% "1, 1,1,^  %wU jjK E7 J-`f5tD P 6_ 8׌E  ^A %^A&Daef ¥_09E AZ  El7 h_&  ^< <ߗv<7|&fEʕ @W ^ C  f ee $ $ $ $ @A eeee >eJ< <  x*w w ʕtʕ  Q~wEU 5 !$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTO   V U  >e0   W <]@e" E@W ^< E&@ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4INW ^<E  dt`  Ue E:tte E e' e- )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD -잇EE7  e &RPE ҐREPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR ~ wU  @E  @7LWE w<E 7 WHILE WITH 7 d(& @  z7 d(7 (7 (7 %7 *7 %7  ' "  7 !Wa!Waw!  w wy7|7v! :7 T+\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k)wmwed! ! w[&z! "  E?R?DŸJE R7~ <   mAɋF! &ffD e w5 wDe`<nC<QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &B@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &  Z&X( &7 |v7 n|7 `|7 T 7 < 6  ## K #?%-0 @ ׳f&& @׳@f&7 H(% +%'*f&f&7 lH(+H(%H(%H(%H(%H(%%0+ !l  \ a:-:2* $ ! :?wU  J _&2 -/ -f$#  -~f$#t t n d! ,g SF ! ':t w` 1Tj! '& _w  ^_TR HD 28*7 2E 7 _#7  E7 ~%U@E  t_> \RU \@@&2E Ub ]ER % E7 ez\& Dr)&&\   5@5@7 X%B&%' H7!ga7!`7![7!VwLwCw;7B DI~A< | r  " _ !X&X&H(.&8&8&8&H(%H(%H(%H(%L&(b&H(%l&H(l&&f&\  \& \\r1@\[?\B  #E %M~ @E  a7 w7 _w7wm ,UR ew & ?U?*@ڪAD C %     @  f&\  N WW=774\% eC ~% C ``` e B -  e \z\D f C_  fW & @&&&&7 'H(d('(''%'H(%'%%'~'%'H('e7 %  % % ` %  @t\\;@\ \N @   =@f&ysE[\pCf&f&\% a @w @@T$   6 6 &  f 6A  v  6N\z\\\ N A f C % LN wU  E@ e ]& 7 7 7C B    \ w  D& &&@7 %(D& && 6  A7 ^'0)&%:)0)&2 7  | t ~"w d    X N wK w: 7 ,* $? UD)%J)0)0)H(r)H(%H(%H(%H(%H(") e\ \S\ e& @7 %b))e\)@ _E7 wf U?  E7 PRTV + f& \:יc&>X4%]@& & & & & D&&D&& @%7 r')  IA ewU  E@  U@ _E7 _ e@ e& & & & & D&&e #@  @6 7 'r*6 6  140 blocks) 2 = Double-sided, Double-density (2280 blocks) S = STOP Drive Number (0,1,2 or 3) ? @ -OK @ -INVALID OPTION    , TRY AGAIN.SYSTEM DEVICE - Are you sure? (Y or N) PLACE DISK IN DRIVE @ - TYPE ANY KEY WHEN READY FORMAT COMPLETE - NO E  Rg; MT@@$@  * FORRORS DETECTED ?REBOOT ADVISED?  Controller Board Fault *h8ŝwEcH,۝p~ RMAT ABORTED BECAUSE:  ST0/3 ST1 ST2 C H R N Cylinder (x10): @@@@@@@@@@@@@@ b  LDrive Not Ready *@B  ,Write Protect On *  Single Sided Disk *a @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%V(+   \P+f& \ e\>:L]L?ƪ@ \fEA#& e@ & f& f& f7 '%+N 7& C~ d7E%B!>94  hw $C x 8o79 ff w   &@& + w7f8 J d (Write Failure *\ wwwwwsqo   DOIT 8 Seek Failure *B ~)B \  Lwvs w   JRecalibration Failure * V ~  Format Failure *A˝eE~U  UB  Execute Phase Sync Fault *Y~7Uhd   zEp7p ZB  BResult Phase Synch Fault *Y~ȕ$E     ZCå &f&f   37#  d7   D0C @ \K n7 7)c e~np pߋprpt tߋtc& | @ X f \$ * C~7 ,7 ES012vt   @b b   b b b 3YN TERAK DISK FORMAT UTILITY * VER. 1-01 0 = Single-sided, Single-density (494 blocks) 1 = Single-sided, Double-density (1           /HJKC  >P  ?]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*! /efAA,"<w eeee e  e e& f   EezN EE7- 7 &  G 6E7, 6 ?  w pr@$@$@$@" EB~f r&z%% 7 *\7 *``WtB &E7 5@|<7w {7yw 7 psw mw g- aBE B<<  wN EC~ B~Uf rfVpfz  eN @_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & E7? ~7E@U@  E7 w wU &    N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "~<E `E `EՀW @p@ `E e `&& `& `@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ^ E@ &?  w U@w > 6 & h ^7 X @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@TERAK @@@@F @~w 2 ?*  "U@  wE 7 wv FRX\`& @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@V P J 4 .  F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz  ZVRN:dhZT4;  Z Z ` f:@FLRX^djpv| "*2``@Z` <fr.4H'B&J86!a6!@$% ''@&0(b6!c6! \ j .  $!COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD @ @f ~f{fxfufrfoflfifffcf `f" d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E eC~ceί%@ eAp6% "1, 1,1,^  % @`& E&~AA~E e @`&AA~E e @`  `` ^A %^A&Daef ¥_09E AZ   t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r C  f ee $ $ $ $ @A eeee >eJ< ``&& `  E e @a&&6E e @a&!$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTOE e @a \d<Z@@`@`$fH@7 `e B~  B~< _ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4IN7@` dd&`f&d&b&  m ef )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD - ɋ e  rfwBC % e 7d,\ Aɋ BJ@ BREPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR m8~@ Bm*~@ Bm~     WHILE WITH 7 +& @  z7 +7 t+7 X+7 R(7 ,7 V(7 ) I?zr& 7h  AF eA -Bl: \.<$WFl7 -\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k<   mAɋF! &ffD e w5 wDe`<nC<QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &E e `&EՀ~<  7Z   ҂ ~< E e ` EB@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &     @ ` G7vz   7H 7Z 6W w{Z N B '((@`@`( (+m ]   P~P~eeNPP   <6 E E7 ~<& EE Jd`n W  ~~e<ee``!~ e C~C~ %< C~ Z&X( &7 |v7 n|7 `|7 T 7 < 6  ]p |ʋD~ G~ 5E~ E~e  e  ` e  |\ = "  \m\  W  m ef5`\_e w5 5@ ZT| *, wU  @E  @7LW\ɋE 5\\\f F^T2&,FR,: f6 E w<E 7$  7 t$Wax$Waw$  w wW Y#w (Q&vI  >7 7(w& EFHJKABCDWX][f@@ N Z[ y7|7v$ :)wmwed$ $ w[&$ $  E?R?DŸJEU7MwG7 % @`?R wLVxx|xt@ wU :: R7~  #l d#\ a:-:2* $ K E7 w z2@t  w Et@_7   O 0E]$ :?$ ,g SF $ ':t w` 1'U `  xZ7Wm7 P ]Dw=7w Zl Fw bIT $ '& _w E  t_! \RU \@@&2E  w tR <w H<  Alw&f65t w E   e@ׇEU Ub ]ER H7h$ga7k$`7n$[7q$VwLwCw;7B DI~A<ʵm H& W Y#w H^E. U w w  UEw  B | r $ _ $B  #E %M~ @E  a7 w7 _w Zć  tw  h!w  UOw p w 먇  <w  0w `ʽ W Y#ww7wm ,URN WW=774\% eC ~ tʕ U Q~ʕ \׌UE׌x׌"  e % C ``` e7 %  % % ` %@7 6_ 8 E7 _ 7 v7 7 7 P 7"  @t@@Tw h07  w w N!.7 eJww  U @e @wxBEfEP$  LN wU  E@ e ]&  *0*)J(@**N()N(N() *N(&**|*e\\;@\ \N @   =@f&ysE[\pCf&f&\%D"COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD a @w   6 6 &  f 6A  v  6N\z\\\/  P  ? N A f C %C B    \ w  D& &&@7 N(+D& && /efAA,"<w 7 7 7ߐ2 7  | t ~"w d    X N wK  6  A7 ^)+P)J(++P)+J(+++*,*N(*N(*N(*N(*+ e\ \S\ e& @7 w: 7 ,* $? U@ _E7 wf U?  E7 N(,+e\D,f& \:יc&>X4%]@& & & & & D&&D&& @%7 rPRTV + wU  E@  U@ _E7 _),  IA e e@ e& & & & & D&&e #@  @6 7 )-6 6 #?%-0 @ ׳f&& @׳@f&7 *J(-J()t-f&fz&z& K wU  J _&2 -/ -'z& &7 l*-*N(*N(*N(*N(*N(N(-N(*-   \-f& \ e\>:L]L?ƪ@ \fEA# -~'z&t t n d ^_TR HD 28*7 2E 7 _z&7  & e@ & f& f& f7 )N(". ff w   &@& n. E7  (U@ % E7 ez\& Dr)&&\   5@5@7 XJ((N()((*((((*N(*N(*N(*N((*)*N()*)B)f&\  \& \\r1@\[?\ ew & ?U?*@ڪAD C %     @   f&\   B -  e \z\D f C_  fW & @&&&&7 0**+:* <f+$#> F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz <6 E E7 ~<& EE Jd`n Z Z ` f:@FLRX^djpv| "*2``@x`d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E e"a"@ "F# n$H%@t#%b"c" \ j .   @`& E&~AA~E e @`&AA~E e @`  `` @ @f ~f{fxfufrfoflfifffcf `f" t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*!``&& `  E e @a&&6E e @a&eeee e  e e& f   EezN EE7- E e @a \d<Z@@`@`$fH@7 `e B~  B~< _7 &  G 6E7, 6 ?  w pr@$@$@$@" EB~f r&z%% 7 (\7 (``WtB &E7 5@|<7w {7yw 7 psw mw g- aBE B<<  wN EC~ B~Uf rfVpfz  eN @_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & E7? ~7E@U@  E7 w wU &    N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "~<E `E `EՀW @p@ `E e `&& `& ` ^ E@ &?  w U@w > 6 & h ^7 X E e `&EՀ~<  7Z   ҂ ~< E e ` EF @~w 2 ?*  "U@  wE 7 wv FRX\`&    @ ` G7vz   7H 7Z 6W w{Z N B  <   mAɋF! &ffD e w5 wDe`<nC<QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &B@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &  Z&X( &7 |v7 n|7 `|7 T 7 < 6 '((@`@`( (+m ]   P~P~eeNPP  \ = "  \m\  W  m ef5`\_e w5 5@ W  ~~e<ee``!~ e C~C~ %< C~\ɋE 5\\\f F^T2&,FR,:  C~ceί%@ eAp6% "1, 1,1,^  %wU jjK E7 J-`f5tD P 6_ 8׌E  ^A %^A&Daef ¥_09E AZ  El7 h_&  ^< <ߗv<7|&fEʕ @W ^ C  f ee $ $ $ $ @A eeee >eJ< <  x*w w ʕtʕ  Q~wEU 5 !$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTO   V U  >e0   W <]@e" E@W ^< E&@ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4INW ^<E  dt`  Ue E:tte E e' e-7@` dd&`f&d&b&  m ef )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD - ɋ e  rfwBC % e 7d,\ Aɋ BJ@ BREPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR m8~@ Bm*~@ Bm~     WHILE WITH 7 d(& @  z7 d(7 (7 (7 %7 *7 %7  ' I?zr& 7h  AF eA -Bl: \.<$WFl7 T+\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k ~ wU  @E  @7LWE w<E 7@ _E7 wf U?  E7 PRTV +  "  7 !Wa!Waw!  w wy7|7v! :wU  E@  U@ _E7 _)wmwed! ! w[&z! "  E?R?DŸJE R7~ ## K  !l  \ a:-:2* $ ! :?wU  J _&2 -/ -f$#  -~f$#t t n d! ,g SF ! ':t w` 1Tj! '& _w  ^_TR HD 28*7 2E 7 _#7  E7 ~%U@E  t_> \RU \@@&2E Ub ]ER % E7 ez\& Dr)&&\   5@5@7 X%B&%' H7!ga7!`7![7!VwLwCw;7B DI~A< | r  " _ !X&X&H(.&8&8&8&H(%H(%H(%H(%L&(b&H(%l&H(l&&f&\  \& \\r1@\[?\B  #E %M~ @E  a7 w7 _w7wm ,UR ew & ?U?*@ڪAD C %     @  f&\  N WW=774\% eC ~% C ``` e B -  e \z\D f C_  fW & @&&&&7 'H(d('(''%'H(%'%%'~'%'H('e7 %  % % ` %  @t\\;@\ \N @   =@f&ysE[\pCf&f&\% a @w @@T$   6 6 &  f 6A  v  6N\z\\\ N A f C % LN wU  E@ e ]& 7 7 7C B    \ w  D& &&@7 %(D& && 6  A7 ^'0)&%:)0)&잇EE7  e &RPE Ґ2 7  | t ~"w d    X N wK w: 7 ,* $? U  2IھPھNéN˄  ˥P۾ܥOڂ  ٕ ݞ݂ ˡ !U܂Zhڡ?١ ( P!کN˄9!'۹  vڤVڳNĩ1ۥ č%`wȡ'ڤġڤڤ؂ D)%J)0)0)H(r)H(%H(%H(%H(%H(") e\ \S\ e& @7 %b))e\) * 񿥆P&  f& \:יc&>X4%]@& & & & & D&&D&& @%7 r')  IA evPv v&áٕٕ: e@ e& & & & & D&&e #@  @6 7 'r*6 6  "á <&ȡ<#?%-0 @ ׳f&& @׳@f&7 H(% +%'*f&f&7 lH(+H(%H(%H(%H(%H(%%0+ ٪P&áצERROR: á<& Please press to continue.%V(+   \P+f& \ e\>:L]L?ƪ@ \fEA#& e@ & f& f& f7 '%+ áR۾8۾áݩ۾ ۾ á ܕR` ff w   &@& + ۥ    ڞڂ ˡ  !Uقč x \6F& EDITOR w^  á  ܂áũؓɍš  ٚáء  INITIALIOUT COPYFILEENVIRONMPUTSYNTAEDITCORE e   ݂ɡ  ݂ەݕ ; Z-š 0 ۍۡ צRepeatfactor > 10,000?COPYRIGHT (C) 1979, THE REGENTS OF THE UNIVERSITY OF CALIFORNIA\ á  8ڕ škvKThere is no room to copy the deletionɡ š    H FIؾ. Do you wish to delete anyway? (y/n)תP Yá*KڕJJI IJ! v٤ؚٳ v قؚ. M Edit: A(djst C(py D(lete F(ind I(nsrt J(mp R(place Q(uit X(chng Z(ap [E<    09̂5ʂ5ȡ )  (( Ʉ?Í  .6f]תPrצH Insert: Text { a char, a line} [ accepts, escapes]PIצA Delete: < > {Edit:KN̂5Ƃ5Ƃ5צ:Ƃ5&Ƃ5tx> to delete, to abort}PK Adjust: L(just R(just C(enter { to leave}תP ɡ"ˡצWorkfile lost.vצFNo workfile is present. File? ( for no file to exit ) Pvצr2 Insrt: {,} [ accepts, aborts]תPI4 Delete: { deletes, aborts}תP5 Adjst::  P á v ,á ̂5ʂ5ȡ   צ.TEXT   ȍ L(ft R(ght C(ntr to leaveתP צ+ Edit: A, C, D, F, I, J, R, Q, X, Z [E.6f]P<צ>Edit .˄# ̂5Ƃ5 PƂ5.TEXTUƂ5P .á N vצNot present. File? P"á Í IĩIɄ I؂ IHZګ ء8ȩ쾩 쾩 :צReadingNvˡצ Reading file.N5øbáܕܩܕ   á  .5  ĸ5 á "ˡצ Disk error-á á.á é Äە߂ũȍ0 á  Buffer overflow.8 4آFGأ%Fأ&G G آ-NIآHآ$۩ߞ á<á / é쾩Í ߂  á߂߂܂܂Iآ Hآ$Iآ Hآ$Iآ#Hآ$Iآ#Hآ$Iآ!Hآ  d>h ٪Pצ what marker? -P,-V$I HIآ"Hآ$Iآ!Hآ$Pأ.Oآ/ POPآ),Vȡ-,-, ,,-- -- C ƂNƃz   šOآ/ Pآ-Oآ/ Pآ,Oآ/ Pآ,Oآ/ Pآ'Oآ/Pآ á á  á ƂN-R; v< ~*^LLbP& F > Z   ~ 'Oآ/Pآ(Oآ/P آ(O آ/أ.áPáPJO ,  B!۩ߞ á<á / é쾩Í ߂  á߂߂܂܂Pپخ%v ACDFIJLMP Q R S V XZ,>.+-?/=" v CC^v̂5ʂ5ȡܤܚAẐ5ʂ5ȡܤAaẑ5ʂ5ȡצImproper marker specification.  2ꂶ6צMarker exceed>Quit:תP# U(pdate the workfile and leaveצ E(xit without updatings file bounds.ĩ :ꕕ,צ[á$ + R(eturn to the editor without updatingצ% W(rite to a file name and return ר  צ]ɍٲˍ.ڕ.P..P,áؕ RáEáꥂNWáצ)Name of output file ( to return) -->ƂPƂ     ە ..ȡ۲۾ ..ȡáƂ̂.ʂ.ȡƂƂ۾ .TEXTƂƂƂȍƂƂ.˄%Ƃ̂.Ƃ.ƂPƂ..TEXTUƂ. ۲ ۾ ..ȡ۲۾ צ.TEXT˲ȍ.˄#..PPƂƂ.á ƂƂƂצ*SYSTEM.WRK.TEXTPצWritingNƂCNvˡ..צ.TEXTU.P.áȡLٕڂġ)Buffer overflow.ĩɡW  ۂۂۀ Nˡۂ.ɡ3 ꕞN  ٩ڞڂZ= ˸ .   Vˡ.Nצ Your file is   bytes long.UáV?&צSYSTEM.WRK.TEĶɄ , ڨ߶ߤ ߤ Marker not there. ٲ0 > K%̂5ʂ5ʂ5ʂ5ʂ5 ʂ5PHGv:XTN*SYSTEM.WRK.CODENתeצ4Do you want to E(xit from or R(eturn to the editor? v CC^v̂5ʂ5ȡܤܚAẐ5ʂ5ȡܤAaẑ5ʂ5ȡ  EګצWriting out the file K+IT Nvˡ.ܤA09̂5ʂ5ȡܤA    Ǫ תP7UsdhmNTvB  ȍɡW  ۂۂۀ Nˡۂ.ɡ3 ꕞN .˄# ̂5Ƃ5 PƂ5.TEXTUƂ5P .á N vצNot present. File? P"á Í ˡ.Nצ Your file is   bytes long.UáV?&צSYSTEM.WRK.TE > K%̂5ʂ5ʂ5ʂ5ʂ5 ʂ5PHGv:XTN*SYSTEM.WRK.CODENתeצ4Do you want to E(xit from or R(eturn to the editor? #  ƂPƂá Ƃ=Ƃ# Copy: File not present. Filename? תP"áצ CopyP  Ⓞ G2 = 'ũEǀ'H.צ , = 'Fǀ'wڕɄ čⓄ% Ʉ "ˡ Disk Error.ĩƂ= Markers: wȡ8 xؤá Ƃ=fV^vdN  ׷   ׷ U=ˡ צ Date Created:  - -  Last Used:  - ׷     ׷     Ƃ=ƃiצ& Copy: From what file[marker,marker]? P -   Jצ Not option d ƂPƂá Ƃ=Ƃ# Copy: File not present. Filename? תP"áצ CopyP  Ⓞ wi[M=/AT(k) geQ"c&ڕɄ čⓄ% Ʉ "ˡ Disk Error.ĩƂ=; R &(38 xؤá   ȡ.ءצTrueצFalse0 ڳ@צ Date Created:  - -  Last Used:  -@צT or FȡĹ TáTrue צFalse Z -   Jצ Not option d  # ڳɡ ڂ0 wi[M=/AT(k) geQ"c&   צ. Environment: {options} or to leaveP  A(uto indenvSyntax Error #תP צ . Type @Ƃ ƃ7Ƃ צ*SYSTEM.SYNTAX"ˡ hȡ9t צ F(illing  L(eft margin   R(ight margin   ~ȡ- Ǘȡ ǹȡ .ȡ  Ƃ ˡ á d d   0ز+߾á f v   ׷   ׷ U=ˡ  P(ara margin   C(ommand ch  T(oken def  ׷     ׷     Ƃ=ƃiצ& Copy: From what file[marker,marker]? Pצ  צ bytes used,   available.HG Patterns:$   á8š1ؾ\ áO ˄:؂š!  ؂  P  ɡ          š   ˡ 0 00 :  ؕ؞ق ق   پÍ   پÄG vؕvDؕ? ة꾿á٫؞ǀ 8ꕀPšr vצ . Type  á   Ƃ #%deQ"c&L WARNING! You are about to zap more than 80 chars, do you wish to zap? (y/n)תP  Yˡ   á> < A&! Copy: B(uffer F(rom file תP  DBEL š ꕞ ĩꕕK멂J IũIĄצ Invalid copy.멂JġNo roommLꩂJIĩIɄIJꩂɡ"צNo room to insert. j˄' J IꩂJ멂JꩂJ ĩ Fá * צJump to   ꂫꂶÄ  Í  K \ةwxؤ xؤ  Not there.ؤ ĩ.\ $ JUMP: B(IJڶȡ6No insertion to back over.   oڶġd5Please finish up the eginning E(nd M(arker תP  Bá)EáMá ةˡة$ insertion   ڶ š Buffer Overflow!!!! á  i ĩ צInappropriate environmentKR  w w > ! á ^áw áwȡ/ ) x٤vצ$Marker ovflw. Which one to replace?P Jéé Íɡ f ġ앞$ĩp0wSet  ׷ Gwȡx٤ xؤؤةw앞 ^ á "4áww@n *  Set: E(nvironment M(arker תP  EáMá ةˡة ! á.!~ō?    G~ ĩo < eXchange: TEXT { a char} [ escapes; accepts]תP          á   ǀd ؂ȡ ؂ġ  % b   Ȅ5  ɡášĶ  rflow<) <á"#˶˄ >á#"+ $   Í      !ń9  á   á8á  á  Cá1á  á   ɡit"  Ʉ: á    |  *ȡGھ á-ń ۂšĶ   #<áTń1 á  ꂫġ ھO Z+ȡˡˡȡ ȡ Z-    ٕةġ-á- ؕ  ؕ ٩ ø ɡzɄ2  ɡáĸ š# Í ؞؞ ٫ګ    U ؂ \       $%&؂ɡ  rP  ˡPšǀ3á Ä؂ jš앞0dšצBuffer overflow' 앞ˡ앫؂ǀ vá(ȡ  á Ą (  P  Ä˄Ąۄy á  háOȡ% ˡܡ Má M vá    á< >   ȩMd$ Tá(J    á áث8   Ʉ ܹ-(1ڕ($ڕ( 4-"á(wá (eDŽP   ڂ٥ č9h  ^ġ) á (- áڕ(ڕ( ˡá۫ k 'šA>áš (š  ) <öÍ   ˄#áR)  M;%*&&<á%&  ń     ɡT "$"#<á"# !$šToo many$ġצInteger Ove&   ö D. ./ Lá .Vá . Tá 'R' replaces, ' ' doesn't 9 á Rr˄Fš[Fš9צBuffer full. Abo . VTÍLÍ/SsÍV^0/L(Invalid delimiter. rting Replace FꕞFɡFꕞFFˡ F멂FꩂF.á*۾ ń  čġ.צYour pattern is too long @:̀̀  á Findצ =>9( Replaceצ V(fy =>9. 1۶ɩۂ۾Ä۶d% 02  á./0ʀ ťE1G á./̀0ʀ F1HéG éHGl  ȩMل*6 ١ނ߫ á:63ǀ Ŷٶq ġ   ض á 9 ؂    á<á  ٓ(MńצPattern not in the fileצNo old pattern.  " d   2  .|v 4ǀ Ŷڶq š  P  .Má  Má   d~ á 9ض     á   2  .|v 5EE Ŷ zxt p lhd ĩD@08lb^\ZXVVVTRPN024680>@b4` x š ɡ,ń Eá X7Ŷ EɄ ŶŶ šٮ ݮ+,    IP öEɄ E Ŷ EɄ Eá ?   vá   w"#<á"# |!x$sá< > 8     á78>á54v b á78   3Nġ Integer Ovflw) <á"#]_nlDtٕ ,˄  Ŷ š 2 á}Aáojũ˄ȍátÄ S ٕ܄Lɡ ꕞ ٩ٕٕ   ȥ  Ä: N6.۪PڪP.P [M /ثLK IٕJ٫ ö ݓ -á- á'*  á צ]: ء% áL(itT(okz9z  Replaceצ' aborts,' zxt p lhd ĩD@08lb^\ZXVVVTRPN024680>@bZ Z ` f:@FLRX^djpv| "*2``@Z` <f,4~%x$J88f"a8f"@"$ F% &@L$f&b8f"c8f" \ j .  #V"COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD @ @f ~f{fxfufrfoflfifffcf `f"HJKC  >P  ?]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*! /efAA,"<w eeee e  e e& f   EezN EE7- 7 &  G 6E7, 6 ?  w pr@$@$@$@" EB~f r&z%% 7 (\7 (``WtB &E7 5@|<7w {7yw 7 psw mw g- aBE B<<  wN EC~ B~Uf rfVpfz  eN @_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & E7? ~7E@U@  E7 w wU &    N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "~<E `E `EՀW @p@ `E e `&& `& `; ˡ; z\2n  t  ^&@H t tZz0`b0  ^ E@ &?  w U@w > 6 & h ^7 X !!h"#$#,%<%l&hv;צPattern not in the fileצNo old pattern.  " dF @~w 2 ?*  "U@  wE 7 wv FRX\`&  P  .Má  Má   d~ F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz( E e `&EՀ~<  7Z   ҂ ~< E e ` EB@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &     @ ` G7vz   7H 7Z 6W w{Z N B '((@`@`( (+m ]   P~P~eeNPP   <6 E E7 ~<& EE Jd`n W  ~~e<ee``!~ e C~C~ %< C~d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E eC~ceί%@ eAp6% "1, 1,1,^  % @`& E&~AA~E e @`&AA~E e @`  `` ^A %^A&Daef ¥_09E AZ   t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r C  f ee $ $ $ $ @A eeee >eJ< ``&& `  E e @a&&6E e @a&!$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTOE e @a \d<Z@@`@`$fH@7 `e B~  B~< _ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4IN7@` dd&`f&d&b&  m ef )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD - ɋ e  rfwBC % e 7d,\ Aɋ BJ@ BREPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR m8~@ Bm*~@ Bm~     WHILE WITH 7 <)& @  z7 <)7 )7 )7 &7 *7 &7 ' I?zr& 7h  AF eA -Bl: \.<$WFl7 ,,\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k<   mAɋF! &ffD e w5 wDe`<nC<QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &)  tʕ U Q~ʕ \׌UE׌x׌"  e F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz@7 6_ 8 E7 _ 7 v7 7 7 P 7"Z Z ` f:@FLRX^djpv| "*2``@x` <f*"!>a@V |! "~#@!#bc \ j .  Z&X( &7 |v7 n|7 `|7 T 7 < 6 z COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD\ = "  \m\  W  m ef5`\_e w5 5@   P  ?\ɋE 5\\\f F^T2&,FR,: f6  /efAA,"<w W Y#w (Q&vI  >7 7(w& EFHJKABCDWX][f@@ N Z[ 7 &  G 6E7, 6 ?  w prU7MwG7 % @`?R wLVxx|xt@ wU ::&E7 5@|<7w {7yw 7 psw mw g-K E7 w z2@t  w Et@_7   O 0E]@_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l'U `  xZ7Wm7 P ]Dw=7w Zl Fw bI7? ~7E@U@  E7 w wU &    w tR <w H<  Alw&f65t w E   e@ׇEU  *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "ʵm H& W Y#w H^E. U w w  UEw  B ^ E@ &?  w U@w > 6 & h ^7 X w Zć  tw  h!w  UOw p w 먇  <w  0w `ʽ W Y#wF @~w 2 ?*  "U@  wE 7 wv FRX\`& * ~<E `E `EՀW @p@ `E e `&& `& `<   mAɋF! &ffD e w5 wDe`<nC<E e `&EՀ~<  7Z   ҂ ~< E e ` EB@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &     @ ` G7vz   7H 7Z 6W w{Z N B '((@`@`( (+m ]   P~P~eeNPP   <6 E E7 ~<& EE Jd`n W  ~~e<ee``!~ e C~C~ %< C~d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E eC~ceί%@ eAp6% "1, 1,1,^  % @`& E&~AA~E e @`&AA~E e @`  `` ^A %^A&Daef ¥_09E AZ   @ @f ~f{fxfufrfoflfifffcf `f" t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*!``&& `  E e @a&&6E e @a&eeee e  e e& f   EezN EE7- E e @a \d<Z@@`@`$fH@7 `e B~  B~< _@$@$@$@" EB~f r&z%% 7 J&\7 J&``WtB 7@` dd&`f&d&b&  m ef aBE B<<  wN EC~ B~Uf rfVpfz  eN  ɋ e  rfwBC % e 7d,\ Aɋ BJ@ B8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & Em8~@ Bm*~@ Bm~     N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  I?zr& 7h  AF eA -Bl: \.<$WFl+ REPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR ~ wU &f&f7 U   0ɝ^& _E7  WHILE WITH 7 && @  z7 &7 '7 &7 #7 R(7 #7 V%C DE!:7  7aehD A   aw7e:wXP@P7n@eI7 )\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k70@wnM)w\ 7 , ßz 5U$ J  E   QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &  7 7  @  27 !ׯ+U E `    ͋Z&X( &7 |v7 n|7 `|7 T 7 < 6 D 5|w 5B N  5 , W#D  7W ΁?Zw w   D5H\ = "  \m\  W  m ef5`\_e w5 5@ 5   :@ S~ e&-"wn.5) 5|w 77 :  .\ɋE 5\\\f F^T2&,FR,:  -& pU`E@ wHw . FU@ wU jjK E7 J-`f5tD P 6_ 8׌E % eC ~% C ``` ezLN wU  E@El7 h_&  ^< <ߗv<7|&fEʕ @W ^ e ]& 7 7 7ߐ2 7  | t ~"w d    X N C  f ee $ $ $ $ @A eeee >eJ< <  x*w w ʕtʕ  Q~wEU 5 !$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTO   V U  >e0   W <]@e" E@W ^< E&@ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4INW ^<E  dt`  Ue E:tte E e' e- )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD -잇EE7  e &RPE Ґ,  E7 PRTV + wU  E@  U@ _ @%7 rR%(  IA e e@ e& & & & & D&&e #@ E7 _ @6 7 R%(6 6 #?%-0 @ ׳f&& @׳@f&7 ~&#"" K wU  J _&2 -/ -"@)#R%)f&f&7 l~&J)~&#~&#~&#~&#~&##f)#&<)   \)f& \ e\>:L]L?ƪ"  -~""t t n d ^_TR HD 28*7 2E 7 _@ \fEA#& e@ & f& f& f7 R%#) ff w   &@& "7  E7 #U@ % E7 ez\& Dr)&&* \   5@5@7 X#x$#R%$$~&d$n$n$n$~&#~&#~&#~&#$J&$~&#$~&$$f&\  \& \\r1@\[?\ ew & ?U?*@ڪAD C %     @  f&\   B -  e \z\D f C_  fW & @&&&&7 %~&&%J&%R%#%~&#R%##R%%#%~&&e\\;@\ \N @   =@f&ysE[\ .TITLE QX-11 FLOPPY HANDLER ; FOR VERSION I.5, II.0 INTERPS. ; ; COPYRIGHT (C) 1978 REGENTS OF THE UNIVERSTIY OF CALIFORNpCf&f&\% a @w   6 6 &  f 6A  v  6N\zIA. ; PERMISSION TO COPY OR DISTRIBUTE THIS SOFTWARE OR DOCUMEN- ; TATION IN HARD COPY OR SOFT COPY GRANTED ONLY BY WRITTEN \\\ N A f C %C B    \ w  D& &&@LICENSE ; OBTAINED FROM THE INSTITUTE OF INFORMATION SYSTEMS. ALL RIGHTS ; RESERVED. NO PART OF THIS PUBLICATION MAY BE RE7 #'D& && 6  A7 ^R%f'$#p'f'$z'#'f'f'~&'~&#~&#~&#~&#~&X' e\ \S\PRODUCED, STORED ; IN A RETRIEVAL SYSTEM ( E.G., IN MEMORY, DISK, OR CORE) OR BE ; TRANSMITTED BY ANY MEANS, ELECTRONIC, MEC wK w: 7 ,* $? U@ _E7 wrf U?  e& @7 #'<'e\'f& \:יc&>X4%]@& & & & & D&&D&& - UST SET UP A PHONY ; IO Q FOR THE RT-11 DRIVER FROM TERAK AND LET IT DO ALL THE ; DIRTY WORK. TST QXUNIT ; ANY IO'S ALREAD0 QXTRK0 = 1000 QXDDAT = 2000 QXWRTP = 4000 QXCRC = 10000 QXSYNC = 40000 QXCQE: .WORD DUMIOQ ;CURRENT QUEUE ELEMENTY GOING? BNE QXSTRT ; IF SO THEN HANG! MOV R1,QXUNIT ; NOW IO IS GOING ON QX BIS #BSYBIT,@R1 TST (R3)+ ; SKIP PAST IO T QENTRY: MOV #QXCS, R5 ;SET UP CS REG POINTER MOV QXCQE, R1 ;GET CURRENT QUE ELEMENT POINTER MOV (R1)+, R3 ;R3 HAS BLOCKHANICAL, PHOTOCOPY, ; RECORDING, OR OTHERWISE, WITHOUT PRIOR WRITTEN PERMISSION FROM THE ; PUBLISHER. ; ; ;;;;;;;;;;;YPE MOV R3,@SP ; SAVE ALL REGISTERS...KLUDGE!! MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R4,-(SP) MOV R5,-(SP) C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; SYSTEM TABLE CONTENTS ; ; ; ;LR DUMCSW ; CLEAR ANY HARD ERROR PROBS MOV #DUMIOQ,R5 ; POINT R5 AT IO Q...READY TO BUILD IT MOV (SP),(R5)+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .ASECT ; INTERRUPT HANDLER LOCATION IN VECTORS .=250  MOV @R1,(R5)+ ; UNIT # (SPECIAL FORMAT IN MY UNITABLE) MOV (SP),(R5)+ MOV (SP),R0 ROR R0  QX$INT ; QX FLOPPY INTERRUPT HANDLER 340 ; MAX PRIORITY .CSECT TABLES .BLKW 128. ; OPERATOR XFER TABLE .REPT 4 .; IN WORD COUNT (CBIT IS CLEAR) TST -(R3) ; CHECK IF READ OR WRITE BNE 1$ ; 1 IS A READ...0 IS A WRITE NEG R0 ; NEGATIVBLKW 3 .ENDR .WORD INBIT!OUTBIT,QXSTRT,QXABRT .WORD INBIT!OUTBIT!400,QXSTRT,QXABRT .REPT 3 .BLKW 3 .ENDR .WORD INBE WORD COUNT IF A WRITE 1$: MOV R0,(R5)+ ; FINALLY WORD COUNT SET IN Q EL JSR PC,QENTRY ; AND START UP DRIVER MOV (SP)+,R5 IT!OUTBIT!1000,QXSTRT,QXABRT .WORD INBIT!OUTBIT!1400,QXSTRT,QXABRT .PAGE .CSECT QXDRVR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; NOW RESTORE THOSE REGS MOV (SP)+,R4 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 MOVB DUMCSW,@R1 ; SEND POSSIBLE ERROR BAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ; Q X - 1 1 FLOPPY HANDLER ; ; K TO USER JMP @(SP)+ ; RETURN TO UIO NOW (OLD R3 VAL @SP) $INTEN: ; FAKE $INTEN FOR DRIVERS BENEFIT MOV R4,-(SP) ; R5 AL ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;READY ON STACK JSR PC,@R5 MOV (SP)+,R4 MOV (SP)+,R5 JMP @#INTRTN QXQUIT: ; THIS IS THE DUMMY QMANAGR ENTERED UPON IO ;; QXUNIT: .WORD 0 ; ADDRESS OF UNIT TABLE ENTRY FOR I/O QXOFST = 14 DUMCSW: .WORD ; START OF PHONY IO Q ENTRY FOR TERAKCOMPLETE MOVB DUMCSW,@QXUNIT ; PLACE POSSIBLE HARD ERROR IN RESULT BYTE BIC #BSYBIT,@QXUNIT CLR QXUNIT RTS PC ; FALLS I DRIVER .WORD DUMCSW ; POINTER TO CSW DUMIOQ: .WORD ; DISK BLOCK # .WORD ; SPEC FUNC (0) AND UNIT # IN HIGH BYTE .WORD NTO $INTEN .PAGE ;QX CONTROLLER REGISTERS QXCS = 177000 QXDB = 177002 ;COMMAND BITS QXENBL = 1 QXRTC = 2 QXSTPN = ; BUFFER ADDRESS .WORD ; WORD COUNT .WORD 1 ; ASYNCHRONOUS IO REQUEST QXSTRT: ; ENTER HERE TO START FLOPPY IO'S. WE J 4 QXSTPO = 6 QXRTS = 10 QXREAD = 12 QXWRT = 14 QXWRTD = 16 QXHEAD = 20 QXCRNT = 40 QXNTRP = 100 WRTFLG = 20.  -> BYTE COUNT ADD R4, R1 ;PLUS BUF START = BUFFER END MOV R1, BUFEND ;AND THAT'S WHERE WE PUT IT! MOV R4, BUFADR ;SAVE BNE ERRCHK BIS #QXHEAD, CMDMSK ;SET HEAD DOWN BIT IN MSK MOV CMDMSK, (R5) ;AND INTO CONTROLLER MOV #^D<50/2>, HDTIME ;R BUFFER POINTER MOV PC, R1 ;SET UP MARK ADD #QXTOP-.,R1 ;FOR INITL INTRPT MOV R1, MRKPTR MOV CMDMSK, R1 ;GET OLD MASST HD SETTLING TIME ERRCHK: TST R2 ;TRK ERR ZERO ??? BEQ SETCHK ;YES>>CHECK HEAD SETTLING BR MOVHD ;NO>>MOVE IT!!! ; K(HAS UNIT ALREADY) MOV #QXHEAD, R2 ;HEAD BIT MASK! BIS R2, R1 ;ASSUME HEAD DOWN BIS R1, R0 ;AND INSTALL TO DATA COMMAN HDUPCK: CMP R2, #10 ;IF OVER 8 STEPS REQD, BLOS MOVHD ;WE CAN UNLOAD THE HEAD BIC #QXHEAD, CMDMSK ;HEAD UP WITH NEXT STEPD MOV R0, CMD ;SAVE NEW DATA COMMAND MOV R1, R0 ;NEED ANOTHER COPY ADD #QXNTRP!QXRTS!QXENBL, R0 ;NTRPT NBL OFF, RTS IN  MOVHD: TST R3 ;GET DIRECTIONS..IN OR OUT BPL MOVHDO MOVHDN: JSR PC, STEPN BR MOVMRK MOVHDO: JSR PC, STEPO MOVMRK: MOV MOV R0, CMDTS ;INSTALL TO TRKSEC COMMAND BIT R2, (R5) ;WHERE IS REAL HEAD??(UNIT SAME) BNE 1$ ;DOWN...GUESS WAS O.K.  #^D<6/2>, R4 ;SET UP STEP WAIT TIME DEC R2 ;WILL THIS BE LAST STEP? BGT 1$ MOV #^D<26/2>, R4 ;UP TIMEOUT TO 26 MS 1$: # INC R1 ;SKIP SPEC FUNCTION BYTE MOVB (R1)+, R4 ;GET UNIT NMBR BIC #^C7, R4 ;CLEAN OFF JOB NUMBER CMP R4, #3 ;0 BIC R2,R1 ;TURN OFF HEAD BIT 1$: MOV R1, CMDMSK ;SAVE NEW MASK MOV R1, (R5) ;KICK THE CONTROLLER RTS PC ;FOR FIRST INTTHRU N ONLY BHI HERHOP ;OTHERWISE...HARD ERROR CMPB R4, CMDMSK+1 ;IS THIS A DIFFERENT UNIT? BEQ BUFCMD ;NO -> DON'T BOTHERRUPT ; HERHOP: CMP -(SP), -(SP) ;LOAD STACK HRDHOP: JMP HRDERR ;WAY STATION FOR HARD ERRORS TRKHST: .BYTE 200,200,200,20ER W/TRK PNTR SWAB R4 ;SET NEW UNIT NUMBER MOV R4, (R5) ;INTO HARDWARE...DONE HERE SWAB R4 ;IN CASE OF SPFUN 374 MO0 ;NEG TRK HISTORY BYTE->NEW LOAD QXTOP: MOV CMDMSK, (R5) ;CHECK THAT DOOR!! TST (R5) ;AND THAT IT'S READY BMI HRDHOP ;VB R4, CMDMSK+1 ;INSTALL IN MASK ADD PC, R4 ;PIC POINTER TO ADD #TRKHST-., R4 ;TRACK HISTORY BYTES MOV R4, (PC)+ ;REF'D  GIVE HARD ERROR FOR DRIVE NOT CLOSED ERCOMP: CLR RESTEP ;SET UP TRACK MISS CNTR MOV #8., (PC)+ ;RESET THE RETRY COUNTER RINDIRECTLY TRACK: .WORD 0 ;THRU HERE BUFCMD: MOV (R1)+, R4 ;R4 HAS BUFFER ADDRESS MOV #QXREAD!QXENBL, R0 ;ASSUME A READ CTRIES: .WORD 0 ;EACH TIME WE SEEK A NEW SECTOR RESEEK: MOVB TRKREQ, R2 ;COMPUTE TRACK ERROR MOVB @TRACK, R3 ;BETWEEN HISTOMMAND MOV (R1), R1 ;R1 HAS WORD COUNT BPL STNDRD ;TAKE ABS VALUE MOV #WRTFLG!QXWRT!QXENBL, R0 ;NEG WRD CNT => WRITE ;ORY & REQUEST BPL 2$ ;IS HISTORY BYTE VALID?? MOVB R2, @TRACK ;NO!...ASSUME HEAD POSITION MOV R2, R3 ;IS CORRECT TO CAWRTFLG IS A DON'T CARE BIT...MAKES READ/WRT CHK EASIER NEG R1 ;TAKE ABSLUT VAL STNDRD: ASL R3 ;BLOCK NMBR * 4 = ASL R3 USE TRKSEC CHK 2$: SUB R2, R3 ;SUBTRACT BYTES MOV R3, R2 ;NEED SIGNED AND UNSIGNED ERR BGE 1$ ;ABSVAL INTO R NEG R2  ;LOGICAL SECTOR NMBR (LSN) MOV R3, LSNREQ ;PUT LSN AT HELM JSR PC, ABCOMP ;BEAT INTO ABSOLUTE TRK/SEC ASL R1 ;WRDCNT ;SIGNED IS IN R3 1$: CMP R2, #4 ;AT 4 OR LESS STEPS, BHI HDUPCK ;SET HEAD DOWN BIT #QXHEAD, (R5) ;IS HEAD DOWN ALREADY??/ LOW CURRENT BIT 1$: MOV (PC)+, R3 ;R3 INDEXES BUFFER BUFADR: .WORD 0 MOV #200, R2 ;64 WORDS ADD R3, R2 ;R2 -> END OF THPN ;TRK0 -> STEP N BR TSX ; UPDATE: CMP (R5), (PC)+ ;MATCH?? TRKREQ: .BYTE 0 SECREQ: .BYTE 0 BEQ DATA ;GOT IT!! MOIS CHUNK MOV BUFEND, R4 ;R4 -> END OF WHOLE BUFFER TST (R5)+ ;R5 PTS AT QXDB (ALSO RESET HDWR PTR) DATAO: CMP R3, R4 ;DOV (R5), R4 ;GET ANOTHER COPY BPL UPDATX ;DELETED TRACK?? TST -(R5) ;ADJ PTR BR TSJOG ;DELTD TRK -> STEP OVER UPDATX: ES R3 POINT ABOVE BHIS SLUFF ;END OF BUFFER ?? MOV (R3)+, (R5) ;NO..MOV WRD TO QX BFR WRTADV: CMP R2, R3 ;WAIT FOR 200 TST -(R5) ;ADJ PTR CMPB R4, TRKREQ ;DID WE FIND RIGHT TRACK?? BEQ TSWAIT ;TRK O.K.->GO WAIT FOR SECTOR COM (PC)+ ;MIS- BHI DATAO ;LOOP DE LOOP TST -(R5) ;RESTORE PTR TO QXCS BR TSREAD SLUFF: MOV #0, (R5) ;YES..SLUFF ZEROS ;NOTE...A CLR CALC'D TRACK!! RESTEP: .WORD 0 ;COUNT TRK RECHECKS BMI TSWAIT ;ALLOW ONE MOVB R4, @TRACK ;UPDATE TRACK IMAGE JSR R5DOES NOT WORK!! (CNTRLR IS FINICKY) TST (R3)+ ;ADV BUFFER BR WRTADV ; TSWAIT: JSR PC, TIME ;WAIT 4 MS OUT OF 6 .WORD , RETRY ;CLEAR FOR RETRY??? NOP JMP RESEEK ;UP TO 20 SHOTS FOR A DIME ; DATA: MOV (PC)+, -(R5) ;ISSUE WHATEVER CMD: .^D<4/2> TSREAD: MOV (PC)+, (R5) ;READ TRACK/SECTOR ID CMDTS: .WORD 0 ;RTS SANS NTRPT NBL 1$: TSTB (R5) ;WAIT ON DONE...STWORD 0 ;ALREADY HAS UNIT,ENABLE,HEAD BITS (ALSO WRTFLG) INC LSNREQ ;COMPUTE NEXT ABS SEC NMBR JSR PC, ABCOMP JSR PC, MARKAGED!! BPL 1$ ;SPIN WHEELS &...GREEN LIGHT ;WAIT ON DONE BECAUSE CAN'T ABIDE F/B NTRPT LATENCY MOV (R5)+, R4 ;ANY ERROR ;WAIT FOR COMPLETION MOV (R5), R4 ;ANY ERRORS? BPL READCK BIT #QXWRTP, R4 ;WRITE PROTECT VIOLATN? BNE HRDERR ;YES..S??? BPL UPDATE TST -(R5) ;RESTORE CS PTR BIT #76000, R4 ;USE ONLY ONE COPY OF ERRS BEQ QXTOP ;READY->DOOR OPENED->WAWRT CMD IS IMPLICIT BIT #QXDDAT, R4 ;DELETED DATA MARK?? BEQ DATRTY ;NO..GET SERIOUS THEN!!! READCK: TSTB CMD ;WAS THIS  MOV R4, STPTIM ;SAVE TIMEOUT FIGURE SUB R4, HDTIME ;NUDGE TIMER JSR PC, MARK ;FIRST CATCH STEP INTRPT JSR PC, TIME ;WIT ;NOT-READY TOLERATED IF DURING READ I.D. JSR R5, RETRY ;GET CLEARANCE FOR A RETRY BR TSWAIT ;1ST 10 TRIES..RE-READ TSAIT FOR STEP/HEAD STPTIM: .WORD 0 BR RESEEK ;RE FIGURE ERRORS ; SETCHK: TST HDTIME ;TIME-OUT REQUIRED?? BLE HDSTOK ;I BIT #QXSYNC!QXTRK0, R4 ;10 TO 20 RETRIES... ;ANY ERR ON TRK 0->STEP IN ;NO SYNC ->MAYBE TRK 77->STEP OUT BNE ERRSTP ;NF NEG, IT'S SETTLED JSR PC, TIME ;SAVES SOME TIME WHEN TIMEOUT=0 HDTIME: .WORD 0 HDSTOK: CLR HDTIME ;IN CASE OF ERRS! TSO..THEN JOG HEAD TSJOG: JSR PC, STEP ;STEP IN SAME DX AS LAST TIME TSX: JSR PC, MARK ;WAIT ON STEP DONE JSR PC, TIME ;BECTB CMD ;WRT OR WD FLAG ON?? BPL TSREAD ;NO>>XFR DATA AFTERWARDS ; ;WRITE DATA TRANSFER ; WRTMOV: CMPB @TRACK, #53 ;DEAUSE DX OF STEP REVERSED .WORD ^D<26/2> ;WAIT 26 MS BR TSREAD ;AND RE-READ T/S ; ERRSTP: BIT #QXTRK0, R4 ;TRK 0 ERROR?CIDE ON HEAD CURRENT BLOS 2$ ;IF ABOVE 43 (DECML) BIS #QXCRNT, CMD ;SET LOW CURRENT BIT BR 1$ 2$: BIC #QXCRNT, CMD ;CLR ? BNE 1$ ;YS..STEPN / NO..STEPO JSR PC, STEPO ;NO SYNC -> OUT OF TRK 77 BR TSX ;USE COMMON MARK&TIME 1$: JSR PC, STE0 ORD CNT GETS FIRST SHOT BHIS 1$ ;TO STOP XFR MOV (R5), (R3)+ ;MOVE A WORD SOB R2, 2$ ;OR 64 WORDS MAXIMUM 1$: TST -(RTORE REGS MOV (SP)+, R2 JMP QXQUIT ; MARK: MOV (SP)+, MRKPTR ;POP RETURN ADDRESS MOV (SP)+, R3 ;RESTORE REGS MOV (SP5) MOPUP: ADD #200, BUFADR ;ADV BFR PTR CMP BUFADR, BUFEND ;JOB DONE??? BHIS 2$ ;YES...CHECK FOR WRITE SLUFF 1$: JMP ERC)+, R2 RTS PC ; QX$INT: JSR R5, $INTEN ;ENTER SYSTEM STATE MOV R2, -(SP) ;PUSH A FEW REGS MOV R3, -(SP) ; MOV #QXCOMP ;GET ANOTHER SECTOR + RESET ERRORS ; 2$: TSTB CMD ;WAS THIS A WRITE/WRITE-D?? BPL QXDONE ;READ GETS TO GO HOME BIT S, R5 ;ALWAYS SET UP QXCS PTR MOV (PC), PC ;RETURN TO MARK CALLER MRKPTR: .WORD 0 ; ; QXABRT: MOV #QXDONE,MRKPTR ; NEX#3, LSNREQ ;WRITE MUST SLUFF TO END OF LOGICAL BLOCK BNE 1$ ;-> MULT OF 4 IN LOGICAL SECTOR BR QXDONE ;SCHOOL'S OUT!! ; T INTERRUPT KILLS IO 1$: TST QXUNIT ; NOW HANG UNTIL IO IS DONE BNE 1$ RTS PC STEPN: MOV #105277, STEP ;GET TRACK BUMPE DATRTY: DEC LSNREQ ;ADJUST TO OLD LOGICAL SECTOR JSR PC, ABCOMP ;CORRECT ABS T&S VALUES BIT #76000, R4 ;READY BIT ONLY??R ;105277 = INCB @(PC) MOV #QXSTPN!QXENBL, STPINS ;GET COMMAND BR STEP ;GO STEP ; STEPO: MOV #105377, STEP ;GET TR BNE DATRTZ BR HRDERR ;DOOR OPENED DURING READ/WRITE DATRTZ: JSR R5, RETRY ;CLEAR FOR RETRY BR TSWAIT ;RE-READ 10 TIMEACK BUMPER ;105377 = DECB @(PC) MOV #QXSTPO!QXENBL, STPINS ;FALL INTO STEP ; STEP: INCB @TRACK ;MAY BE INCB OR DECB S, THEN BR TSJOG ;JOG HEAD 10 TIMES ; ;TIME MARKER ;CALLED BY: JSR PC, TIME ; .WORD X ;X = TIME REQUEST IN 2 MS L MOV (PC)+, R4 ;GET COMMAND STPINS: .WORD QXSTPN!QXENBL ;MAY BE QXSTPN OR QXSTPO BR CMDASY ; ; TICK: MOV #QXRTC!QXENBL,UMPS TIME: MOV (SP)+, R4 ;POP STACK MOV (R4)+, TICKER ;GET TIME + ADV RETURN MOV R4, TIMPTR ;SAVE RETURN W/O STACK TIMEX R4 ;2 MS TIME COMMAND ; CMDASY: BIS (PC)+, R4 ;STUFF IN UNIT, INTRPT ENBL, CMDMSK: .WORD QXNTRP!QXCRC ;HEAD UP/DWN W/ INT: JSR PC, TICK ;ASK FOR A TICK JSR PC, MARK ;WAIT FOR 2 MS DEC (PC)+ ;BUMP COUNT TICKER: .WORD 0 BGT TIMEX ;LOOP M ENABLED ;QXCRC-> UNIT CHANGE WHEN FIRST LOADED MOV R4, (R5) ;STUFF CMD AT QX FLOPPY RTS PC ;R5 MUST => QXCS ; ;ABCOV (PC), PC ;RETURN TIMPTR: .WORD 0 ; RETRY: DEC RTRIES ;KNOCK RETRY COUNT BLE RETRY1 ;THRU 0 ADV RETURN RTS R5 ;FIOMP..........CONVERT LSNREQ TO ABSOLUTE ;SECREQ AND TRKREQ USING ONLY R2 & R3 ;DEC 2:1 INTERLEAVE OF SECTORS IS SUPPORTED RST 10 RETURNS RETRY1: CMP RTRIES, #-20. ;OVER 20 YET?? BLE RETRY2 TST (R5)+ ;ADVANCE RETURN RTS R5 ;IF TWIXT 10 & 20 ;ALSO 6 SECTOR PER TRACK INCREMENT SKEW ;PLUS TRACK 0 CANNOT BE REACHED ; ABCOMP: MOV (PC)+, R3 ;GET LSN REQUEST LSNREQ: A READ COMMAND?? BMI MOPUP ;NO..SKIP DATA XFR REDMOV: MOV (PC)+, R4 ;XFR 64 OR LESS WRDS BUFEND: .WORD 0 TST (R5)+ ;R5 - RETRY2: MOV (SP)+, R5 ;REPAIR STACK, NO MORE TRYS HRDERR: MOV QXCQE, R4 ;GET CHAN STAT WRD BIS #1, @-(R4) ;SET HARD ERROR> DATA REG (ALSO RESET HDWR PNTR) MOV BUFADR, R3 ;DEPENDING ON WRD CNT MOV #100, R2 ;R2 & R4 COUNT XFR 2$: CMP R3, R4 ;W BIT QXDONE: MOV CMDMSK, R4 ;GET CRNT UNIT & HEAD BIC #QXNTRP, R4 ;TURN OFF INTERRUPTS MOV R4, (R5) MOV (SP)+, R3 ;RES1 nt nt> nt nt>nt@. wU &fm .&&f7 U TERAK CORPORATION ; SCOTTSDALE, AZ ; SYSTEM HANDLER TO READ/WRITE LOGICAL BLOCKS FROM/TO SINGLE, ; DOUBLE AND QUAD DENSI.WORD 0 BMI ABCOM4 ;SIGN FLAGS SPFUN -> SKIP MOV #10, R2 ;COUNT 8 BITS OF DIVIDE ABCOM1: CMP #6400, R3 ;DOES 26 GO INTO D   .L 0ɝ^& _ ":s.rE7 C DE!IVIDEND BHI ABCOM2 ;BR IF NO, C CLR ADD #171400, R3 ;SUB 26 AND C SET ABCOM2: ROL R3 ;SHIFT IN QUOTIENT (C BIT) SOB R:d .7  7aehD At.   aw7e:wX.P2, ABCOM1 ;COUNT 8 BITS MOVB R3, R2 ;COPY TRK NMBR TO R2 CLRB R3 SWAB R3 ;SIGN XTND SECTOR CMP #14, R3 ;C=1 IFF 13a>l* nt nt> nt nt>66b>c>J.  .TITLE MULTI-DENSITY DISKETTE HANDLER .SBTTL VER. 1-00 / MULTI-DRIVE ; AUTHOR: STORM L JOHNSON ; SOFTWARE ENGINEERING ;2  USED BY /DUP/ TO DETERMINE DEVICE SIZE FROM ; HANDLERS SUPPORTING MULTI-DENSITY DEVICES. ; 372 RETRIEVE PRIOR STATUS. 1BSOLUTE SECTOR WRITE SPF375 = 375 ; ABSOLUTE SECTOR WRITE DELETED DATA SPF374 = 374 ; RETRIEVE DRIVE STATUS SPF373 = 373 0 BYTES RETURNED. ; RETURNS THE STATUS BYTES DERIVED FROM THE ; CONTROLLER DURING THE PREVIOUS OPERATION. ; INCLUDED ; RETRIEVE DEVICE SIZE SPF372 = 372 ; RETRIEVE PRIOR STATUS ; BIT DEFINITIONS BIT7 = 200 ; BIT 7 POSITIONAL VALUE ARE THE RETRY LIMIT FOR THE HANDLER, ; RETRY DECREMENT COUNTER AND THE LAST COMMAND ; CODE BYTE. SINCE NO RETRIES ARE A BIT6 = 100 ; BIT 6 POSITIONAL VALUE BIT5 = 40 ; BIT 5 POSITIONAL VALUE BIT4 = 20 ; BIT 4 POSITIONAL VALUE BIT3 = 10 LLOWED ; FOR SPECIAL FUNCTIONS, THE DECREMENTED RETRY ; LIMIT RETURNED IS EITHER 1 (SUCCESSFUL) OR ; 0 (FAILED).  ; BIT 3 POSITIONAL VALUE BIT2 = 4 ; BIT 3 POSITIONAL VALUE BIT1 = 2 ; BIT 1 POSITIONAL VALUE BIT0 = 1 ; BIT 0 POSITIONTY DISKETTES ACCESSED UNDER RT-11. ; DENSITY/SIDES LOGICAL BLOCKS/LENGTH SECTORS/LOGICAL BLOCK ; ------------- -------------; IN GENERAL: ; BYTE CONTENTS ; ---- -------- ; 1 MAX RETRY LIMIT ; 2 DECREMENTED RETRY LIMIT ; 3 OPE-------- --------------------- ; SINGLE/1 492/512 BYTES 4 ; DOUBLE/1 1140/512 BYTES 1 ; QUAD/2 2280/512 BYTES 1 ; RATION CODE (READ, WRITE, ETC.) ; 4 STATUS REGISTER 0 ; 5 STATUS REGISTER 1 ; 6 STATUS REGISTER 2 ; 7 CYLINDER NSPECIAL FUNCTIONS ARE ALSO SUPPORTED AS DESCRIBED BELOW. ; ALL SPECIAL FUNCTION IO TRANSFERS MOVE 1 PHYSICAL BLOCK ONLY. ;UMBER ; 8 HEAD NUMBER ; 9 SECTOR NUMBER ; 10 BYTES/SECTOR (0=128, 1=256, 2=512) ; .MCALL .DRBEG .DREND .DRAST 377 ABSOLUTE SECTOR READ. ONE SECTOR RETURNED. ; BLOCK = |HEAD|SECTOR| ; WORD COUNT = TRACK NUMBER ; (IF .DRFIN .FORK ; FLOPPY DISK CONTROLLER VECTOR ADDRESS AND CONTROL/STATUS REGS ; (DEFAULTS) .IIF NDF QB$VEC, QB$VEC == 23 BIT 15 SET, THEN SEEK ONLY) ; 376 ABSOLUTE SECTOR WRITE. ONE SECTOR WRITTEN. ; ENTRIES AS IN 377. ; 375 ABSOLUTE SE4 .IIF NDF QBCSR, QBCSR == 171000 ; DEFAULTS FOR SYSTEM MACROS .IIF NDF TIM$IT, TIM$IT = 0 .IIF NDF MMG$T, MMG$T = 0CTOR WRITE DELETED DATA MARKER. ; ENTRIES AS IN 377, EXCEPT: ; BUFFER (0) = DELETED DATA MARKER VALUE ; 374 RETRIEVE .IIF NDF ERL$G, ERL$G = 0 ; ---------------------------------------------------------------------- SYMBOLS ; FLOPPY DI DRIVE STATUS. ONE WORD RETURNED. ; BIT ASSIGNMENTS ARE: ; 15 - NOT DEFINED ; 14 - WRITE PROTECT FLAG ; 13 SK CONTROL REGISTERS FDCCSR = 171000 ; CONTROL/STATUS REGISTER FDCDR = FDCCSR+2 ; TO/FROM STACK DATA REGISTER ; DMA RE - DRIVE READY FLAG ; 12 - TRACK 0 HEAD POSITION FLAG ; 11 - TWO SIDED DISKETTE FLAG ; 10 - HEAD SELECTED (0 OGISTERS DMACSR = 171012 ; DMA CONTROL/STATUS REGISTER DMATCR = DMACSR+2 ; DMA TERMINAL COUNT REGISTER DMADAR = DMATCR+2 R 1) ; 8-9 - UNIT SELECT (0-3) ; 0-7 - CURRENT TRACK POSITION ; 373 RETRIEVE DEVICE SIZE. ONE WORD RETURNED. ;  ; DMA DATA ADDRESS REGISTER ; SPECIAL FUNCTION CODE DEFINITIONS SPF377 = 377 ; ABSOLUTE SECTOR READ SPF376 = 376 ; A3 OSITION FOR UNKNOWN DEVICE SAFETY = 173773 ; ADDRESS OF SD/DD SOFTCHECK ZAPIT = 377 ; INDICATES A DRIVE CHANGED STATE ISOLA; ************************************************************************* .IF DF $PAS BIT15 = 100000 .MACRO .DRBEG DR,T = ^C3 ; MASK TO ISOLATE LOWER 2 BITS OF A WORD READ = 6 ; FDC READ COMMAND WRITE = 5 ; FDC WRITE COMMAND T0S7CT = 38. ; DUM1, DUM2, DUM3 DR'BUFR = 8. DR'LENG = 6 DR'BLOK = 4 .ASECT .=DR'$VEC .WORD DR'$INT, 340 .CSECT TABLES .BLKW  WORDS TO READ FROM TRK 0 SECT 7 SIDE 0 DMARD = 100000 ; DMA READ BIT DMAWR = 40000 ; DMA WRITE BIT ; -------------------140. .WORD 60000, DR'STRT, DR'KILL .WORD 60400, DR'STRT, DR'KILL .BLKW 9. .WORD 61000, DR'STRT, DR'KILL .WORD 61400, D---------------------------------------------------- MACROS ; MACRO DEFINITIONS FOR: /PUSH/ /POP/ /MOVA/ /INVOKE/ /UPDATE/ R'STRT, DR'KILL .CSECT DR'DRVR DR'CQE: .WORD .+4 ; POINTER TO IO QUEUE ELEMENT .WORD 0 ; POINTER TO CONTROL STATUS WO ; MACRO TO PUSH WORD DATUM TO STACK .MACRO PUSH FROM MOV FROM, -(SP) .ENDM PUSH ; MACRO TO POP WORD DATUM FROM STACRD .WORD 0 ; BLOCK # .WORD 0 ; SPFUN & UNIT # .WORD 0 ; BUFFER ADDRESS .WORD 0 ; WORD COUNT .WORD 1 ; ASYNCHK .MACRO POP TO MOV (SP)+, TO .ENDM POP ; MACRO TO PERFORM POSITION INDEPENDENT LOADING OF A REGISTER ; OR MEMORY A IO FLAG DR'STRT: TST DR'CQE+2 ; ANY IO'S ACTIVE? BNE DR'STRT ; LOOP TILL PREVIOUS IO COMPLETE CLR DR'HOLD ; NO HOLD DDRESS WITH A TABLE POINTER .MACRO MOVA ADDR, DEST, MEMFLG .IF B MEMFLG MOV PC, DEST ADD #ADDR-., DEST .IFF STATE ON DRIVES MOV R1, DR'CQE+2 ; START FILLING DUMMY TABLE BIS #BIT15, @R1 ; INDICATE IO ACTIVE TST (R3)+ ; SKIP OVEAL VALUE ; TIMING PARAMETERS FOR THE FLOPPY DISK CONTROLLER SRTSS = 240 ; SS STEP RATE (6MS=HEX A IN UPPER 4 BITS) SRTDS PUSH PC ADD #ADDR-., (SP) POP DEST .ENDC .ENDM MOVA ; MACRO TO INVOKE AN FDC TASK .MACRO INVOKE TABLE M = 320 ; DS STEP RATE (3MS=HEX D) HLT = 44 ; HEAD LOAD TIME SHIFTED RIGHT 1 BIT POS. ; (18-2MS INCREMENTS) HUT = 17 ; OVA TABLE, R0 ; COMMAND STACK ADDRESS CALL COMAND ; DO JOB .ENDM INVOKE ; MACRO TO UPDATE THE IO TABLE .MACRO UPDHEAD UNLOAD TIME (ZERO TIME=ALL 4 BITS SET=1) SRTHTS = SRTSS!HUT ; SINGLE SIDED DRIVE STEP AND UNLOAD PARMS SRTHTD = SRTDS!HUTATE TABLE, POSN, ORONLY MOV R0, R2 ADD PC, R2 .IF B ORONLY MOVB TABLE-.(R2), POSN .IFF BISB TABLE-.(R2), POS ; DOUBLE SIDED DRIVE STEP AND UNLOAD PARMS ND = 0 ; DMA INDICATOR BIT (0=YES, 1=NO) HLTNDS = HLT!ND ; HEAD LOAD & DMA INDICN .ENDC .ENDM UPDATE .MACRO .ABORT .ENDM .ABORT ; ****************************************************************ATOR PARM (BOTH S AND D) ; MISCELLANEOUS QBSTS = 102006 ; DEVICE STATUS WORD QBDSIZ = 494. ; MIN DEVICE SIZE (26 SEC X ********* ; ************************************************************************* ; P A S C A L S Y S T E M L I N K A76 TRK / 4) CNTDWN = 5 ; DELAY LOOP COUNTER MAXTRY = 6 ; MAXIMUM RETRY COUNT FOR ALL ACTIVITIES SHUFL = 3 ; CYLINDER PRE-P G E ; (VIA CONDITIONAL REDEFINITION OF MACROS) ; ************************************************************************* 4 ; MAKE WORD COUNT TST -(R3) ; NOW IO TYPE MATTERS BNE 100$ ; IF A READ, MOVE ON NEG R0 ; MAKE NEGATIVE TO SIGNAL HAN--------------------- SET OPTION ; DEVICE SET OPTION (POSITION DEPENDENT CODE) .IF NDF $SYSDV .ASECT .=400 .WORD 0 DLER PROPER 100$: MOV R0, (R4) ; STASH AWAY FOR LATER USE .ENDM .DRBEG .MACRO .DRAST DR, DUM1, DUM2 .GLOBL INTRTN ; ; PARAMETER .RAD50 /HOLD / ; OPTION .BYTE /2 ; SET ROUTINE .BYTE 200 ; NO/YES OPTION .WORD 0 H.OPT: INC RINTRTN: ; ROUTINE IN PASCAL ; CMP @(SP), (PC)+ ; NEXT INSTR A WAIT? ; WAIT ; BNE 1$ ; IF NOT, SKIP ; ADD #2, @SP ; E3 ; HOLD IS TRUE BR H.COM CLR R3 ; HOLD IS FALSE H.COM: MOV R3, QBHOLD ; STORE RESULT RETURN .ENDC ; ***********LSE BUMP RETURN ADDRESS ;1$: RTI ; AND RETURN $INTEN: PUSH R4 CALL @R5 POP R4 POP R5 JMP @#INTRTN DR'$INT: ************************************************************** ; **************************************************************JSR R5, $INTEN .ENDM .DRAST .MACRO .DRFIN DR PUSH R4 MOV DR'CQE, R4 BIC #BIT15, @-(R4) CLR (R4) POP R4 *********** ; E N T R Y P O I N T ; ************************************************************************* ; ********* RETURN .ENDM .DRFIN .MACRO .DREND DR .ENDM .DREND .MACRO .FORK DUM1 .ENDM .FORK .MACRO MOVA ADDR, DEST, D**************************************************************** ; SYSTEM DEFINED ENTRY POINT MACRO ; ------------------UM1 MOV #ADDR, DEST .ENDM MOVA .MACRO UPDATE TABLE, POSN, ORONLY .IF B ORONLY MOVB TABLE(R0), POSN .IFF B----------------------------------------------------- ; -----------------------------------------------------------------------ISB TABLE(R0), POSN .ENDC .ENDM UPDATE .MACRO .ABORT MOVA IOFAIL, CAPRTN, * ; SHORT CIRCUIT MULT. INTERRUPTS PU .DRBEG ; ----------------------------------------------------------------------- .DRBEG QB QB$VEC QBDSIZ QBSTS ; 1) INISH R4 ; SAVE IPC MOV QBCQE, R4 ; IO ELEMENT POINTER TST -(R4) ; BACK UP 1 WORD TST (R4) ; DONE EXIT TAKEN YET? T THE DMA/INTERRUPT CONTROL WORD. ; 2) SAVE THE LOGICAL BLOCK NUMBER FOR THIS IO. ; 3) ACQUIRE SPECIAL FUNCTION CODE AND UNIT  BNE .-2 ; IF NOT, WAIT POP R4 ; YES, RESTORE REG RETURN ; AND RETURN .ENDM .ABORT .ENDC ; ************NUMBER. ; (IF) SPFCOD #372, PASS INFO TO CALLER AND QUIT ; (ELSE) PROCEED. ; 4) EXAMINE CONTROLLER STATUS AND ABORT IF BAD.R IO TYPE (RD/WR) FLAG MOV R3, (SP) ; RETURN ADDRESS TO STACK TOP CALL SAVREG ; SAVE NECESSARY REGISTERS MOV DR'CQE, R4************************************************************* ; *************************************************************** ; GET TABLE POINTER MOV DR'BLOK(SP), (R4)+ ; STORE BLOCK NUMBER MOV @R1, R0 ; MESSY UNIT # BIC #^C1400, R0 ; AND CLEA********** ; E N D P A S C A L L I N K A G E ; ************************************************************************* N MOV R0, (R4)+ ; NOW IN TABLE MOV DR'BUFR(SP), (R4)+ ; BUFFER ADDRESS MOV DR'LENG(SP), R0 ; LENGTH IN BYTES ASR R0  ; ************************************************************************* ; ----------------------------------------------5  ; REGISTER USAGE: ; R4 - SYSTEM IO QUEUE ELEMENT POINTER ; R5 - UNIT NUMBER OF DRIVE CURRENTLY BEING ACCESSED MOV #B GENERATE THE EXACT ADDRESS ; FOR THIS DRIVE'S TRACK AND SIZE INFORMATION. ; 4) PERFORM A SENSE DRIVE STATUS USING INVOKE. IT6, (PC)+ ; INIT CONT REG MEMORY PICTURE CONTRL: .WORD 0 ; CONTROL WORD FOR DMA AND INT ENABLE MOV QBCQE, R4 ; QUEUE ELE ; 5) EXAMINE SPECIAL FUNCTION CODE. ; (IF) SPFCOD #374, RETURN STATUS TO USER AND EXIT. ; (ELSE) PROCEED. ; 6) CHECK DRIVEMENT ADDRESS MOV (R4)+, LOGBLK ; SAVE THE LOGICAL BLOCK SPEC MOV (R4)+, R5 ; SP FUNC AND UNIT NUMBER --> R5 MOVB R5, (PC READY BIT. ; (IF) DRIVE READY, PROCEED. ; (ELSE) CHECK SPIN AND WAIT FLAG. ; (IF) WAIT IS SET, CHECK STATUS TILL DRIVE R)+ ; STASH FUNCTION CODE (IF ANY) SPFCOD: .BYTE 0 ; SPECIAL FUNCTION CODE RESTOR: .BYTE 0 ; REGISTER RESTORE FLAG BEQ 2EADY, THEN ; PROCEED. ; (ELSE) ABORT THE TASK IF WAIT FLAG IS FALSE. 4$: MOVB #MAXTRY, RETRY ; INIT RETRY LIMIT ($ ; IF NO SPFUN, SKIP THIS TEST CMPB #SPF372, R5 ; SP FUNC RETRIEVE STATUS? BNE 2$ ; IF NOT, SKIP ; SPECIAL FUNCTION MUST BE > 0 ) COM R5 ; ADJUST UNIT NUMBER FOR SPECIAL TASK 5$: MOV R4, FAILCK ; USE FAILCK RTN TO RESET DRIVE TBLS INVO # 372 MOV (R4), R0 ; USER'S BUFFER ADDRESS MOVA STATUS, R1 ; OUR STATUS BUFFER ADDRESS MOVB #STATLN, R2 ; BYTES TO KE SENSIT ; SENSE STATUS TILL ILLEGAL TO DO SO TST R5 ; WE DONE? BMI 5$ ; NO, KEEP A MOVIN' CLR FAILCK ; REMOVE TEXFER 1$: MOVB (R1)+, (R0)+ ; DO IT SOB R2, 1$ ; TILL FINISHED JMP DONE ; THAT WAS EASY, RETURN ; EXAMINE THE STATST FLAG MOVA DRVTRK, TRKADR, * ; SET UP TRACK TABLE FOR PIC USE ADD R5, (PC)+ ; POINT TO THIS UNIT'S TRACK SLOT TRKADR: .WUS OF THE CONTROLLER - ABORT IF BAD 2$: SWAB R5 ; UNIT NUMBER IN L.O. BYTE BIC #ISOLAT, R5 ; CLEAN OFF SP FUNC CODE MOORD 0 ; CURRENT UNIT'S TRACK POINTER MOVA DRVSIZ, SIZADR, * ; ALSO DENSITY/SIDES TABLE ADD R5, (PC)+ ; AND HIS DENSITY/SIV @#FDCCSR, R0 ; IS NEC CHIP READY? BPL 3$ ; IF NEG FLAG OFF, HE ISN'T ASL R0 ; DOES HE WANT A COMMAND? BPL 4$ ; YEDES SLOT SIZADR: .WORD 0 ; CURRENT UNIT'S SIZE POINTER MOVB R5, SENSDR+2 ; STASH UNIT# IN SENSE DRIVE STATUS TBL TSTDRV: S..GO AHEAD 3$: JMP IOFAIL ; CHIP ISN'T READY AT ALL ; 1) INIT MAXIMUM RETRIES-BEFORE-FAILURE COUNTER. ; 2) PERFORM SENINVOKE SENSDR ; GET DRIVE STATUS NOW CMPB #SPF374, SPFCOD ; DRIVE STATUS SPECIAL FUNCTION? BNE 1$ ; IF NOT, GO AHEAD SE INTERRUPT STATUS SERIES UNTIL IT BECOMES ; AN ILLEGAL INSTRUCTION. THIS WILL ALLOW US TO IDENTIFY ; ANY DRIVES WHICH MOVB @TRKADR, SPFCOD ; PLACE TRACK INFO IN WRK AREA MOVB STREGS, SPFCOD+1 ; STASH STATUS BYTE MOV SPFCOD, @(R4) ; PLACE INHAVE CHANGED STATE SINCE THE LAST IO. ; IF A STATE CHANGE OCCURRED FOR A DRIVE, WE MUST RE-READ ; SIDE 0 TRACK 0 SECTOR  1ST WORD OF USER BUFFER JMP DONE ; THAT'S IT 1$: BITB #BIT5, STREGS ; IS DRIVE READY? BNE DRVRDY ; IF BIT SET, YES 7 TO DETERMINE ITS SIZE. ; 3) INITIALIZE PIC ADDRESS TABLES IF NOT ALREADY DONE. ADD IN UNIT ; NUMBERS WHERE APPROPRIATE TO MOVB #ZAPIT, @TRKADR ; MAKE HIM AN UNKNOWN ENTITY TST (PC)+ ; IS HOLD SET? QBHOLD: .WORD 1 ; SPIN ON READY BIT FLAG 6 M BACK TO TRACK ZERO BNE 3$ ; TRY AGAIN IF NO WORKEE ; GET TRACK 0, SECTOR 7 INFO TO DETERMINE IF SINGLE, DOUBLE, OR QUADSS BUFADR: .WORD 0 ; DMA TRANSFER ADDRESS MOVB SPFCOD, R1 ; GET SPECIAL FUNCTION CODE (IF ANY) BEQ 5$ ; IF NONE, JUMP  ; ONCE DONE, UPDATE UNIT TRACKING TABLES MOVB R5, T0S7RD+2 ; UNIT # IN TRK0, SECT 7 READ TABLE MOV #T0S7CT, R2 ; DMA TAHEAD ; SPECIAL FUNCTION IO SETUP HERE (NUMBERS 375, 376 AND 377) MOVB (R4), TRACK ; TRACK=WORD COUNT MOVB #BIT0, RETRRANSFER COUNT MOVA BUFR, R3 ; DMA BUFFER ADDRESS CALL DMALOD ; SET IT UP INVOKE T0S7RD ; TRY IT BNE 3$ ; RETRY IFY ; ONLY 1 RETRY PERMITTED MOVB LOGBLK+1, HEAD ; PICK OFF HEAD NUMBER BPL 1$ ; SKIP AHEAD IF NOT NEGATIVE CLR R4 ; SBNE TSTDRV ; YES, SPIN AND WAIT JMP IOFAIL ; ELSE DIE ; 1) TEST FOR NUMBER OF SIDES AND SET UP DRIVE PARAMETERS ACCORDI NECESSARY MOVB SL, R0 ; GET SECTOR LENGTH INDICATOR BISB VSI, R0 ; OR IN VOL SURFACE INDICATOR ASR R0 ; GET RID OF NGLY. ; 2) EXAMINE HOW FDC LAST PROGRAMMED. ; (IF) SAME AS NOW PLANNED, PROCEED ; (ELSE) PROGRAM THE CONTROLLER TO HANDLE TLOW BIT BIC #ISOLAT, R0 ; NOW A 0,1,2 OR 3 MOVB R0, @SIZADR ; STASH INDICATOR CLRB @TRKADR ; UNIT AT TRK 0 AND KNOWN HE DRIVE. DRVRDY: MOV #SRTHTS, R0 ; ASSUME SS DRIVE STEP RATE BITB #BIT3, STREGS ; IS DRIVE DS WITH DS DISK? BEQ 1$ ; ; 1) ACQUIRE DRIVE'S SIZE (SIDES AND DENSITY INDICATOR). ; 2) CHECK FOR SPECIAL FUNCTION #373. ; (IF) TRUE, RETURN SIZE  IF NOT, MOVE ON, ELSE MOV #SRTHTD, R0 ; MAKE DS DRIVE STEP RATE 1$: CMPB R0, SPECFY+2 ; SAME AS LAST TIME? BEQ 2$ ; THINFO TO SYSTEM IMMED. AND EXIT ; (ELSE) PUT ASSUMED READ FUNCTION CODE IN IO TABLE ; AND ACQUIRE THE IO BUFFER'S ADDRE SAME, DON'T RESPECIFY MOVB R0, SPECFY+2 ; SAVE THE RATE ; SPECIFY CONTROL PARAMETERS TO THE FDC ; (I.E. HEAD LOAD/UNLOAESS. ; 3) CHECK TO SEE IF ANY OTHER SPECIAL FUNCTION. ; (IF) TRUE, SET UP NECESSARY PARAMETERS AND JUMP INTO ; THE NORD TIME, STEP RATE AND DMA USE BIT) INVOKE SPECFY ; PERFORM SPECIFY ; 1) EXAMINE CURRENT UNIT'S PRESENT TRACK NUMBER. ;MAL IO ROUTINE ; (ELSE) PROCEED IMMEDIATELY TO THE NORMAL IO ROUTINE. ; GET DRIVE'S DENSITY/SIDE INDICATOR FLAG AND UPDATE  (IF) POSITIVE, PROCEED. ; (ELSE) POSITION HEAD OVER MEDIA, RECALIBRATE AND ATTEMPT ; TO READ TRACK 0 SECTOR 7 SIDE ALL TABLES 5$: MOVB @SIZADR, R2 ; GET DEV SIZE INDICATOR MOV R2, R0 ; AND MAKE DENSITY INDICATOR BIC #BIT1, R0 ; BY C0 FOR DENSITY AND SURFACE ; INFORMATION. THEN UPDATE HIS CONTROL TABLES. 2$: TSTB @TRKADR ; IS DEVICE SIZE KNOWN? LEARING AWAY SIDE BIT ; IS THIS SPEC FUNCTION #373? CMPB #SPF373, SPFCOD ; CHECK IT OUT BNE 6$ ; IF NOT, SKIP AHEAD  BPL 5$ ; IF YES, BRANCH MOVB R5, SEEK+2 ; UNIT # TO SEEK TBL MOVB R5, RECAL+2 ; UNIT IN RECAL TABLE ALSO MOVB #SHUFL ASL R2 ; MAKE DEV SIZE INDIC WORD OFFSET ADD PC, R2 ; GET READY FOR PIC REFERENCE MOV DEVSIZ-.(R2), @(R4) ; SEND HIM T, TRKNO ; SET IN TRACK NUMBER 3$: INVOKE SEEK ; MOVE OUT A BIT BNE 3$ ; TRY AGAIN IF FAILED 4$: INVOKE RECAL ; SLAP'HE GOODIES JMP DONE ; QUICKY 6$: MOVB #READ, RDWROP ; ASSUME A READ OPERATION MOV (R4)+, (PC)+ ; PICK UP BUFFER ADDRE7  COMMAND CODE ; (ELSE) PROCEED. ; 2) CONVERT LOGICAL BLOCK TO LOGICAL SECTOR NUMBER AND STORE. ; 3) CONVERT SIDE AND DENSITY HEAD ; HEAD 1 SELECTED? BEQ SPFUNS ; IF NO, SKIP BISB #BIT2, UNITNR ; SET HEAD 1 SPFUNS: MOVB TRACK, TRKNO ; PREPARE INDEX TO SIDE VALUE AND STORE. ; 4) PREPARE FOR CALL TO DD MAPPING ALGORITHM. ; (IF) TRUE, PROCEED ; (ELSE) SET UP FOR SD  SEEK TABLE ; IO NOW ATTEMPTED W/RETRIES IF NECESSARY 1$: CMPB @TRKADR, TRACK ; ALREADY POSITIONED? BEQ 4$ ; YES, SKIMAPPING. ; 5) INITIALIZE IO TABLE W/ UNCHANGING INFO. 5$: MOV (R4), R4 ; GET POS/NEG WORD COUNT? BPL 6$ ; BRANCH IF POSP THIS FOLDEROL INVOKE SEEK ; GET PROPER TRACK BEQ 3$ ; IF GOOD, READ/WRITE THE STUFF 2$: CLRB @TRKADR ; BACK TO TRACITIVE NEG R4 ; MAKE POSITIVE MOVB #WRITE, RDWROP ; AND OPERATION IS A WRITE, NOT READ MOV #DMARD, DMAOP ; DMA LOAD RTNK 0 INVOKE RECAL ; ELSE RETURN TO TRACK 0 BEQ 1$ ; IF SUCCESSFUL, RE-SEEK BR 2$ ; ELSE RETRY RECAL 3$: MOVB TRACK,  NEEDS THIS 6$: MOV R4, WRDCNT ; SAVE COUNT ASR R2 ; NIX LOW ORDER BIT, NOW A SIDE BIT MOVB R2, SL ; SAVE AS SIDE INDI@TRKADR ; UPDATE DRIVE TRACK TABLE 4$: TST R4 ; IS THIS A SEEK ONLY OPERATION? BEQ DONE ; YES, WE'RE DONE 5$: MOV WRDMOCATOR BIT CALL IOLOD ; LOAD UNCHANGING PART OF TABLE MOVA DDMAP, BUFR, * ; ASSUME DOUBLE DENSITY MAPPING MOVB #BIT0, PSV, R2 ; GET DMA STUFF MOV BUFADR, R3 CALL DMALOD ; PROGRAM IT INVOKE RDWRIO ; TRY THE READ/WRITE BEQ 6$ ; MOVE OEEK ONLY OPERATION BR SPFUNS ; GO DO IT NOW 1$: MOVB LOGBLK, SECTOR ; GET SECTOR # TST (R4) ; TRACK ZERO? BNE 2$ ;PLB ; AND 1 SECTOR/LOGICAL BLOCK ASL R0 ; DENSITY INDEX NOW WORD OFFSET BNE UPDPTA ; IF NOT SD , SKIP MOVA SDMAP, BUF NO, SKIP CLR R0 ; ELSE ASSUME 128 BPS TSTB HEAD ; SIDE 0? BEQ 2$ ; YUP, ALL'S WELL TST (R0)+ ; NO, PREPARE FORR, * ; ELSE SET UP SD MAPPING MOVB #BIT2, PSPLB ; AND 4 SECTORS / LOGICAL BLOCK MOV (PC)+, R3 ; GET LOGICAL BLOCK NUMBER  256 BPS 2$: CMPB #SPF377, R1 ; READ OR WRITE OP? BEQ 3$ ; READ, IO CODE GOOD MOVB #WRITE, RDWROP ; MAKE WRITE OPERATIO LOGBLK: .WORD 0 ; LOGICAL BLOCK FOR THIS IO ASL R3 ; X 4 FOR LOGICAL SECTOR # ASL R3 MOV R3, LOGBLK ; NOW LOGICAL SEN MOV #DMARD, DMAOP ; LET DMA LOAD RTN KNOW 3$: CALL IOLOD ; SET UP IO TABLE (NON-VOLATILE PART) ASL R0 ; GET WORD OFFCTOR NUMBER UPDPTA: ADD PC, R0 ; GET XFER WORD COUNT MOV WRDSIZ-.(R0), (PC)+ ; DONE WRDMOV: .WORD 0 ; ACTUAL # WORDS TO SET FOR DMA BYTE CNT ADD PC, R0 ; PREPARE TO GET WORDS TO XFER MOV WRDSIZ-.(R0), WRDMOV ; DONE CMPB #SPF375, R1 ; WRITEXFER NXTBLK: MOVB PSPLB, VSI ; SECTORS/BLOCK GETCNT: CMP WRDCNT, WRDMOV ; MOVING TOO MUCH? BHIS NEWCNT ; IF NOT, GET NEW DELETED? BNE 4$ ; NO MOV #BIT0, WRDMOV ; YES- XFER 1 WORD AND ZERO SLUFF 4$: CLRB VSI ; ZAP THE IO ITERATION COUNTER  COUNT MOV WRDCNT, WRDMOV ; ELSE SET UP FOR FEWER WORDS NEWCNT: SUB WRDMOV, WRDCNT ; GET REMAINING COUNT DSKADR: CALL @BUF BR SPFUN ; JUMP INTO IO AREA ; 1) THIS IS ENTRY FOR NORMAL IO. DETERMINE IF A READ OR WRITE. ; (IF) WRITE, ALTER IOR ; DO CONVERSION INC LOGBLK ; ADVANCE TO NEXT LOGICAL BLOCK (SECTOR) ; COMPLETE SETTING UP OF TABLE NOW SPFUN: TSTB8 T ; MORE BYTES TO XFER? BNE GETCNT ; YES, DO MORE BITB #BIT0, RDWROP ; NO, BUT IS THIS A WRITE? BEQ DONE ; IF NOT, R MOVB #ZAPIT, @TRKADR ; MAKE HIM UNKNOWN ; NORMAL COMPLETION EXIT DONE: TSTB RESTOR ; GIVE CALLER HIS REGS BACK? BWE'RE DONE MOV #BIT0, WRDMOV ; ELSE SLUFF ZEROS TILL DONE MOVA ZERBUF, BUFADR, * ; POINT BUFFER TO ZERO WORD AND CONT BR EQ 1$ ; IF ZIP-NO CALL RSTREG ; YES, RESTORE THEM 1$: MOV #DMAWR, (PC)+ ; RESET DEFAULT READ OPERATION BIT DMAOP: .WORDDSKADR ; KEEP GOIN' 7$: TST WRDCNT ; ANY MORE TO XFER BEQ DONE ; NO, WE'RE DONE BR NXTBLK ; YES, RESET COUNTER  DMAWR ; DMA OPERATION, INIT FOR READ .DRFIN QB ; AND AWAY WE GO ; **************************************************** ; ----------------------------------------------------------------------- ; --------------------------------------------------********************* ; ************************************************************************* ; S U B R O U T I N E S --------------------- .DRAST ; ----------------------------------------------------------------------- ; SYSTEM MACRO TO GEN; ************************************************************************* ; *************************************************ERATE INTERRUPT ENTRY POINT .DRAST QB, 5, QBKILL ; ROUTINE WHICH RECEIVES CONTROL UPON INTERRUPT BIC #, CO************************ ; ----------------------------------------------------------------------- ; -----------------------NTRL ; ZAP THE DMA AND INTERRUPT ENABLE BITS MOV CONTRL, @#DMACSR ; INFORM CONTROL REGISTER CALL SAVREG ; SAVE NECESSARY R------------------------------------------------ DMALOD ; ---------------------------------------------------------------------EGISTERS MOV (PC)+, R1 ; GET OUR REGS BACK HN1: .WORD 0 MOV (PC)+, R4 HN4: .WORD 0 MOV (PC)+, R5 HN5: .WORD 0 .FORK -- ; ROUTINE TO PREPARE THE DMA FOR AN FDC DATA TRANSFER DMALOD: MOV #DMADAR, R1 ; DMA DATA REGISTER MOV R3, (R1) ; PAFRKBLK ; CRITICAL STUFF DONE, SET PRIORITY TO 0 JMP @(PC)+ ; RETURN TO INLINE AS IF NOTHING AMISS CAPRTN: .WORD 0 ; PO SS UPPER BYTE OF ADDRESS SWAB R3 ; SWITCHEROO MOV R3, (R1) ; NOW LOWER BYTE BIS #BIT4, CONTRL ; CONTROL REG WILL BE SEN IF SUCCESSFUL BITB #BIT0, RETRY ; RETRY LIMIT ODD/EVEN? BNE 5$ ; IF ODD, REDO IO IN PLACE BR 2$ ; ELSE RECAL, RESEEBOX NUMBER FRKBLK: .WORD 0,0,0,0 ; FORK BLOCK ; ----------------------------------------------------------------------- ;K AND RETRY ; UPDATE BUFFER ADDRESS AND PREPARE FOR ANY ; ADDITIONAL TRANSFERS. 6$: BICB #BIT2, UNITNR ; RESET HEAD IND ----------------------------------------------------------------------- .DRFIN ; ---------------------------------------------ICATOR MOV WRDMOV, R1 ; GET # WORDS XFERED ASL R1 ; MAKE BYTE COUNT ADD R1, BUFADR ; POINT TO NEW LOCATION IN BUFR D-------------------------- ; HANDLER ABORT ENTRY QBKILL: .ABORT ; ABORT ENTRY POINT ; IO FAILURE DUE TO EXCESSIVE ECB VSI ; DECREMENT IO'S/BLOCK COUNTER BMI DONE ; SPEC FUNCTION OVER BEQ 7$ ; COUNT ZERO, MAKE OTHER TESTS TST WRDCNRETRIES/CONTROLLER SYNCH FAULT EXIT IOFAIL: MOV QBCQE, R4 ; QUEUE ADDRESS BIS #1, @-(R4) ; SET FAIL FLAG FOR QUEUE MANAGE9 ATION BPL 1$ ; IF STILL A READ, BRANCH AHEAD BIC #BIT4, CONTRL ; ELSE PRIME FOR WRITE OP 1$: MOV R2, -(R1) ; PASS UPPER COMRDY ; CONTINUE TILL ALL BYTES PASSED ; -- E X E C U T I O N P H A S E -- ; NOW GET THE RESULT PHASE BYTE RETURN C BYTE OF TRANSFER COUNT SWAB R2 ; FLIP FLOP REGISTER MOV R2, (R1) ; PASS LOWER BYTE INC CONTRL ; ENABLE THE DMA ACTIVOUNT ; IF ZERO: NO RESULT PHASE, RETURN ; IF NEGATIVE: MAKE POSITIVE, OBTAIN RESULT PHASE BYTES IMMEDIATELY ; IF POSITIE BIT RETURN ; ----------------------------------------------------------------------- ; ---------------------------------VE: WAIT FOR INTERRUPT, THEN SHIFT COUNT RIGHT 1 BIT ; IF ZERO: PERFORM A SENSE INTERRUPT STATUS ; IF POSITIVE: OBTAIN RESUL-------------------------------------- IOLOD ; ----------------------------------------------------------------------- ; ROUT PHASE BYTES MOVB (R0), R1 ; OBTAIN COUNT BNE 1$ ; IF NOT ZERO, MOVE AHEAD BR COMEND ; ELSE RETURN, NO RESULTS PHATINES TO SET UP THE RDWRIO TABLE IOLOD: UPDATE RECMOD, RDWROP, * ; SET FM/MFM MODE BICB @#SAFETY, RDWROP ; IN CASE DRIVE NOSE 1$: BMI MAKPOS ; IF NEGATIVE, GET THE BYTES NOW ; ELSE SENSE END OF EXECUTION PHASE VIA INTERRUPTS MOV (PC), FAILCKT CERTIFIED DD UPDATE BYTSEC, BPS ; BYTES PER SECTOR UPDATE SECTRK, SPT ; SECTORS PER TRACK UPDATE GP1TBL, GPL ; GAP LE ; WE WILL EXAMINE SUCCESS OF TASK CALL CAPTUR ; SET UP..AND WAIT ASR R1 ; SHIFT COUNT RIGHT 1 BIT BNE RESULT ; IF NGTH MOVB R5, UNITNR ; INSERT UNIT # IN APPROPRIATE TABLES MOVB R5, SEEK+2 MOVB R5, RECAL+2 RETURN ; IS DONE ; --POSITIVE, GO GET THE GOODIES MOV COMRTN, RTNADR ; WE'LL REENTER, SHUFFLE RETURN ADDRESS INVOKE SENSIT ; AND REENTER COMMA--------------------------------------------------------------------- ; -------------------------------------------------------ND PHASE JMP @(PC)+ ; THEN GO HOME RTNADR: .WORD 0 ; RETURN ADDRESS MAKPOS: NEG R1 ; MAKE TRANSFER COUNT POSITIVE ;---------------- COMAND ; ----------------------------------------------------------------------- ; COMAND ROUTINE PASSES TH -- R E S U L T P H A S E -- RESULT: MOVA STREGS, R0 ; STATUS REGISTER STACK ADDRESS RESRDY: MOV @#FDCCSR, R2 ; CAN WE GE COMMAND STACK TO THE FDC ; -- C O M M A N D P H A S E -- COMAND: POP COMRTN ; GET RETURN ADDRESS SQUIRRELED AWAY MET ANOTHER STATUS BYTE? BPL RESRDY ; IF NOT, WAIT TILL WE CAN ROL R2 ; WE STILL IN SYNCH? BMI GETBYT ; YES, DIRECTIOOVB (R0)+, R1 ; NUMBER OF COMMAND BYTES TO SEND MOVB (R0), TASK ; SAVE FOR SPFUN REQ #372 COMRDY: MOV @#FDCCSR, R2 ; IS NEN GOOD TST R5 ; YIPES! DRIVE STATE EXAMINE TASK? BPL FATAL ; NO, SYNCH ERROR COM R5 ; YES, REMAKE R5 TO POSITIVE UNIC READY TO RECEIVE? BPL COMRDY ; IF NOT (BIT15=0), LOOP TILL HE IS ROL R2 ; IS TRANSFER DIRECTION GOOD? BMI FATAL ; T # BR COMEND ; ALL DONE GETBYT: MOV @#FDCDR, R2 ; PUT STATUS WORD IN STAGING REGISTER MOVB R2, (R0)+ ; EXTRACT STATUS T FOR READ ASL R2 ; GET BYTE COUNT DEC R2 ; TERMINAL COUNT=XFER COUNT-1 BIS DMAOP, R2 ; ADJUST TC FOR READ/WRITE OPERIF NOT, SHUT SYSTEM DOWN MOVB (R0)+, R2 ; PUT COMMAND BYTE IN STAGING REGISTER MOV R2, @#FDCDR ; HAND OFF TO FDC SOB R1,: --------------------------------------------------------------- CAPTUR: POP CAPRTN ; GET RETURN ADDRESS FROM STACK MOV R1------------------- ; SINGLE DENSITY LOGICAL TO PHYSICAL MAPPING SDMAP: CLRB HEAD ; HEAD 1 NOT SUPPORTED AT THIS TIME , HN1 ; SAVE OUR REGS MOV R4, HN4 MOV R5, HN5 ; DONE TSTB RESTOR ; RESTORE REGS ONLY IF SAVED EARLIER BEQ 1$ ; SMOV LOGBLK, R3 ; GET LOGICAL SECTOR # MOV #8., R2 ; 8 BITS FOR DIVIDE 1$: CMP #6400, R3 ; LOG SECTOR DIVISIBLE BY 26? BBYTE SOB R1, RESRDY ; CONTINUE TILL ALL ARE RECEIVED ; -- T E S T P H A S E -- ; THIS PIECE OF CODE CHECKS FOR SUCCESKIP AHEAD IF NOT DONE CALL RSTREG ; RESTORE CALLER'S REGISTERS 1$: BIS #BIT3, CONTRL ; SET INTERRUPT ENABLE FLAG MOV CONSFUL COMPLETION OF A TASK. ; STREGS IS THE STATUS 0 REGISTER WHOSE UPPER 2 BITS ; SIGNIFY THE FOLLOWING: ; 0 0 ----> TASK STRL, @#DMACSR ; TOGGLE CONTROL REGISTER RETURN ; RETURN TO SYSTEM, INTERRUPT WILL COME ; -------------------------------UCCESSFUL ; 0 1 ----> TASK BEGAN, BUT FAILED TO COMPLETE ; 1 0 ----> ILLEGAL COMMAND (NOT EXPECTED, NOT TESTED FOR) ; 1 1 ------------------------------------------- ; ----------------------------------------------------------------------- SAVREG ; ---> A DRIVE CHANGED ITS READY STATE TST (PC)+ ; PERFORM SUCCESS TEST? FAILCK: .WORD 0 ; TEST FLAG BEQ COMEND ; NOPE --------------------------------------------------------------------- SAVREG: MOV R0, (PC)+ ; SAVE INTERRUPTED RTN'S REGS U BITB #BIT6, STREGS ; ALL'S WELL? BEQ OK ; IF SO, RETURN NOW MOVB STREGS, R2 ; GET ST0 STATUS BYTE BPL 2$ ; JUST A S0: .WORD 0 MOV R1, (PC)+ US1: .WORD 0 MOV R2, (PC)+ US2: .WORD 0 MOV R3, (PC)+ US3: .WORD 0 MOV R4, (PC)+ US4: .WORSIMPLE FAILURE BIC #ISOLAT, R2 ; ADJUST DRIVES STATUS, IT CHANGED! CMP R2, R5 ; OUR UNIT? BNE 1$ ; NO, SKIP AHEAD MD 0 MOV R5, (PC)+ US5: .WORD 0 INCB RESTOR ; LET CAPTUR KNOW WE SAVED REGISTERS RETURN ; THAT'S ALL ; -----------OVB #ZAPIT, @TRKADR ; OUR UNIT BECAME UNKNOWN BR FATAL ; DOWN IN FLAMES 1$: ADD PC, R2 ; PREPARE TO MODIFY DRIVE TABLE ------------------------------------------------------------ ; ---------------------------------------------------------------- MOVB #ZAPIT, DRVTRK-.(R2) ; SOCKIT TO 'IM INCB RETRY ; OUR GUY HAS AN ALIBI 2$: CLR FAILCK ; CLEAR FAIL CHECK FLAG DEC------- RSTREG ; ----------------------------------------------------------------------- ; ROUTINE TO RESTORE THE CALLER'S RB RETRY ; ANY MORE CHANCES? BNE COMEND ; YES, YOU LUCKY PUPPY! FATAL: JMP IOFAIL ; SORRY CHARLIE OK: CLR FAILCK ; REEGISTERS RSTREG: MOV US5, R5 ; DO THE JOB MOV US4, R4 MOV US3, R3 MOV US2, R2 MOV US1, R1 MOV US0, R0 CLRB RESTSET TEST FLAG COMEND: JMP @(PC)+ ; ALL DONE! COMRTN: .WORD 0 ; WHERE IT'S AT! ; -------------------------------------OR ; RESET REGISTER RESTOR FLAG RETURN ; ----------------------------------------------------------------------- ; --------------------------------------- ; ----------------------------------------------------------------------- CAPTUR ; -------------------------------------------------------------------------- SDMAP ; ----------------------------------------------------; ; TRACK = Track number ; HEAD = Head number ; SECTOR = Sector number ; ; Remarks: ; Registers R2 and R3 are destroyed. WORD 64. , 256. , 128. ; WORD XFER CNT DEVSIZ: .WORD QBDSIZ , 1140. , QBDSIZ+QBDSIZ , 2280. ; DEV SIZES-SS,SD,DS,DD ; IO ; .MACRO MOD M,R,?A,?B ;handy macro .IF DF $TERAK DIV M,R .IFF A: CMP M,R!1 BGT B SUB M,R!1 INC R BR A B: .EBUFFER FOR SIDE 0 TRACK 0 SECTOR 7 READ FOR DEVICE IDENTIFICATION ; ALSO USED AS A WORK AREA DURING NORMAL IO BUFR: .WORD 0 NDC .ENDM ; DDMAP: 1$: CLRB HEAD ;assume head 0. MOV LOGBLK,R3 ;get logical BLOCK. ; ; Compute LSN Mod 15. ;  ; ALSO FOR MAPPING ALGORITHM ADDRESS WRDCNT: .WORD 0 ; ALSO FOR TOTAL BYTE XFER COUNT .BLKB 66. PSPLB: .BYTE 0 ; PHYSICLR R2 MOD #15.,R2 ;LSN Mod 15. ; ; The quotient is now in R2, and the residue in R3. ; ; TSTB SL ;number of surfaceCAL SECTORS PER LOGICAL BLOCK ; SINGLE=100 DOUBLE=324 VSI: .BYTE 0 ; VOLUME SURFACE INDICATOR .BLKB 3 ; DON'T CARs? BEQ 20$ ;If double sided then ; ; Compute LSN modulo 30. If this value is less than 15, we want ; to select head 0. E ; SINGLE=100 DOUBLE=362 SL: .BYTE 0 ; SECTOR LENGTH INDICATOR RECMOD: .BYTE 0 , 100 , 100 ; RECORDING MODE BYTHI 2$ ; BR IF LOW, CARRY IS CLEAR ADD #171400, R3 ; YES, SUBT 26 AND SET CARRY 2$: ROL R3 ; SHIFT IN QUOTIENT (C-BIT) Otherwise head 1 is selected. ; MOV LOGBLK,R3 ;get logical BLOCK again. CLR R2 MOD #30.,R2 ;LSN Mod 30. CMP #15.,R3 SOB R2, 1$ ; GO TILL DONE MOVB R3, R2 ; COPY OF TRACK # CLRB R3 ; REMOVE TRK # SWAB R3 ; SIGN XTEND SECTOR CMP # ;which head do we want? BGT 20$ ;branch if head 0, else INCB HEAD ;select head 1. 20$: ; ; At this point R2 contain14, R3 ; CARRY SET IF 13E 0 ; UNIT NUMBER TRACK: .BYTE 0 ; CYLINDER NUMBER HEAD: .BYTE 0 ; HEAD NUMBER-SIDE SECTOR: .BYTE 0 ; SECTOR NUMBER BPS: U jt*}KT`HaH\* jt jtH jt jtH66bHSEC: .BYTE 0 , 2 , 1 ; BYTES/SECTOR (0=128, 2=512) SECTRK: .BYTE 26. , 15. , 26. ; SECTORS/TRACK BASED ON DENSITY GP1TBL: .B .BYTE 0 ; BYTES/SECTOR (0=128) SPT: .BYTE 0 ; SECTORS/TRACK GPL: .BYTE 0 ; GAP LENGTH .BYTE ZAPIT ; DATA LENGTH, CAUSESYTE 27. , 84. , 14. ; READ/WRITE GAP LENGTHSFOR SD AND DD .EVEN DRVTRK: .REPT 4 ; DRIVE TRACK POSITION TRACKER .BYTE ZAP BYTES/SECTOR OVERRIDE .BYTE 16 ; RPSL (7 SHIFT 1 BIT LEFT) ; TRACK 0 SIDE 0 SECTOR 7 READ TABLE (TO ACQUIRE DEVICE SIZE) IT ; ALL DRIVES INITIALLY UNKNOWN .ENDR ; DEVICE SIZE INDIC. ; SS SD = 0 ; SS DD = 1 ; DS SD = 2 ; DS DD = 3  T0S7RD: .BYTE 9. ; C.S.L. .BYTE 6 ; READ COMMAND .BYTE 0 ; UNIT NUMBER .BYTE 0 ; TRACK # .BYTE 0 ; HEAD # (SIDE) DRVSIZ: .BLKB 4 ; DEVICE SIZE INDICATOR ; SPFUN REQUEST #372 GETS THIS TABLE (10 BYTES) STATUS: .BYTE MAXTRY ; RETRY  .BYTE 7 ; SECTOR .BYTE 0 ; BYTES/SECTOR (0=128) .BYTE 26. ; SECTORS/TRACK .BYTE 7 ; GAP LENGTH .BYTE ZAPIT ; BYTMAX FOR SPFUN REQUEST #372 RETRY: .BYTE 0 ; RETRY DECREMENT REGISTER TASK: .BYTE 0 ; TASK IN PROGRESS STREGS: .BLKB 7 ;E COUNT OVERIDE .BYTE 16 ; RPSL (7 SHIFTED LEFT 1 BIT) ; SENSE INTERRUPT STATUS SENSIT: .BYTE 1 ; C.S.L. .BYTE 10 ;= E 7.: D 7 WaWaw : Z.T  1|w.  % H.X % % .~` %  @t.  w`4. 77 )wwY .0 t   @@T   .$ w&  &.V4/ ݅ E?F?8Ÿ>t /.|E   8 aw..7{Wp be . Z G  a7.`T79 7.d7  6~ n6&.: aL-L.`D< 6 .$ L? >Jw <f,Z%T$>.y \ $ 9r $.Lt w`A -.9R"COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD /& _w &:s8.E ($ _.D^& U  P  ?5  ^.jD \@@&~E .U ]E `.7g /efAA,"<w a7`7[7VwLw .Cw;7B DI~.A< | 7 &  G 6E7, 6 ?  w prr : _  :.( B  #E %M~ R  .N@E H a&E7 5@|<7w {7yw 7 psw mw g-cH:. jt jtH jt jtHjtt. 7 wU   .&.t7 w7 _w7w. ,U W.W@E  M.L@7W ť • P ".r~wE wwt.7o74J% eC ~T. % C ``` e.27>  aBE B<<  wN EC~ B~Uf rfVpfz  eN  ɋ e  rfwBC % e 7d,\ Aɋ BJ@ B@_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & E7? ~7E@U@  E7 w wU &    N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "~<E `E `EՀW @p@ `E e `&& `& ` ^ E@ &?  w U@w > 6 & h ^7 X E e `&EՀ~<  7Z   ҂ ~< E e ` EF @~w 2 ?*  "U@  wE 7 wv FRX\`&    @ ` G7vz   7H 7Z 6W w{Z N B F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bz <6 E E7 ~<& EE Jd`n Z Z ` f:@FLRX^djpv| "*2``@x`d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E ea@"# "%%@($B&bc \ j .   @`& E&~AA~E e @`&AA~E e @`  `` @ @f ~f{fxfufrfoflfifffcf `f" t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*!``&& `  E e @a&&6E e @a&eeee e  e e& f   EezN EE7- E e @a \d<Z@@`@`$fH@7 `e B~  B~< _@$@$@$@" EB~f r&z%% 7 (\7 (``WtB 7@` dd&`f&d&b&  m ef? !$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTO   V U  >e0   W <]@e" E@W ^< E&@ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4INW ^<E  dt`  Ue E:tte E e' e- )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD -잇EE7  e &RPE ҐREPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR ~ 7 wU  @E  @7W ť "• P~wm8~@ Bm*~@ Bm~     WHILE WITH 7 )& @  z7 )7 )7 j)7 d&7 *7 h&7 ' I?zr& 7h  AF eA -Bl: \.<$WFl7 ,\ vw *< R'(((@ BCzEG@HPtJ$LM nO(k<   mAɋF! &ffD e w5 wDe`<nC<QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &B@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &  Z&X( &7 |v7 n|7 `|7 T 7 < 6 '((@`@`( (+m ]   P~P~eeNPP  \ = "  \m\  W  m ef5`\_e w5 5@ W  ~~e<ee``!~ e C~C~ %< C~\ɋE 5\\\f F^T2&,FR,:  C~ceί%@ eAp6% "1, 1,1,^  %wU jjK E7 J-`f5tD P 6_ 8׌E  ^A %^A&Daef ¥_09E AZ  El7 h_&  ^< <ߗv<7|&fEʕ @W ^ C  f ee $ $ $ $ @A eeee >eJ< <  x*w w ʕtʕ  Q~wEU 5 @ @&~E U ]E 7z"ga7}"`7"[7"VwLwCw;7B D   5@5@7 X\&&`&' ' '(&&&&(`&(`&(`&(`&'('(`& '( 'T'f&\  \I~A< | r " _ "B  #E %M~ @E H a7 & \\r1@\[?\ ew & ?U?*@ڪAD C %  w7 _w7w ,U WW7o74J    @  f&\   B -  e \z\D f C_  fW & @&&% eC ~% C ``` e7 %  % %&&7 B(()L((B('\&R((`&'`&`&'2(`&8(((e\\;@\ \N @   =@f&ysE[\ ` %  @t@@pCf&f&\% a @w   6 6 &  f 6A  v  6N\z\T$  LN wU  E@ \\ N A f C %C B    \ w  D& &&@7 e ]& 7 7 7ߐ2 7  | t ~"w d    X N`&)D& && 6  A7 ^')b'\&))b')\&)))(&*(`&(`&(`&(`&() e\ \S\E wwE 7" D 7 "Wa"WawT"  1|w   wK w: 7 ,* $? U@ _E7 wf U?  w`77" )ww" " w&." 4" ݅ E?F?8ŸE7 PRTV + wU  E@  U@ _E>E aw.7{Wp be  Z G  a7`7 _T79 d7  !~ v!n aL-LD< 6 $$ K wU  J _&2 -/ -%$" L?" >y \ " 9Lt w`A -9$  -~%$t t n d ^_TR HD 28*7 2E 7 _R" /& _w E ($ _& UD \@$7  E7 2&U@ % E7 ez\& Dr)&&\A \&'+f&f&7 l(+(`&(`&(`&(`&(`&`&+`& )+   \,f& \ e\>:L]L?ƪ *7 7 7 zv x7 vEl7 h 7 E7 tv wU W r7 $7 "@ \fEA#& e@ & f& f& f7 '`&4, ff w   &@& , ^ E@ &?  w U@w > 6 & h ^7 X  F @~w 2 ?*  "U@  wE 7 wv FRX\`& F J ^ f j n x |  " 6 B D J f 2  4 ^ v ~   6 j | h*06NV\bzZ Z ` f:@FLRX^djpv| "*2``@x` <f,\%V$>a@"# $%%@*$D&bc \ j .  "COPYRIGHT (C) 1978, REGENTS OF UNIV OF CALIF,SD @ @f ~f{fxfufrfoflfifffcf `f"  P  ?]f$Zf&Wf(Tf*Q NKHEB?<963 0"-$*&'($*! /efAA,"<w eeee e  e e& f   EezN EE7- 7 &  G 6E7, 6 ?  w pr@$@$@$@" EB~f r&z%% 7 (\7 (``WtB  e& @7 `&*)e\V*f& \:יc&>X4%]@& & & & & D&&D&& &E7 5@|<7w {7yw 7 psw mw g- @%7 r'*  IA e e@ e& & & & & D&&e #@ @_ azE ~ ~UV3T E@ JD B94T?4 E@" "-l @6 7 '&+6 6 #?%-0 @ ׳f&& @׳@f&7 (\&+7? ~7E@U@  E7 w wU &   B  aBE B<<  wN EC~ B~Uf rfVpfz  eN  ɋ e  rfwBC % e 7d,\ Aɋ BJ@ B8@ 6NE LU@t7`.~BE B @Wtw`& B~<z& & Em8~@ Bm*~@ Bm~     N\Et& B~ & > ~UB~  Ձ@  a a!~F@  B~  I?zr& 7h  AF eA -Bl: \.<$WFl~<E `E `EՀW @p@ `E e `&& `& `<   mAɋF! &ffD e w5 wDe`<nC<E e `&EՀ~<  7Z   ҂ ~< E e ` EB@B <C``& ΟX @ e E`E``B~8A Ew0w.Dw$ &     @ ` G7vz   7H 7Z 6W w{Z N B '((@`@`( (+m ]   P~P~eeNPP   <6 E E7 ~<& EE Jd`n W  ~~e<ee``!~ e C~C~ %< C~d %  D~ " ~ E D~ D C~ %  D~  ~& <AA~E eC~ceί%@ eAp6% "1, 1,1,^  % @`& E&~AA~E e @`&AA~E e @`  `` ^A %^A&Daef ¥_09E AZ   t @L A@@A tBt B@P< ``f~ ``A~ c ҇ef r C  f ee $ $ $ $ @A eeee >eJ< ``&& `  E e @a&&6E e @a&!$'(****AND 'ARRAY ,BEGIN CASE CONST DIV 'DO DOWNTOE e @a \d<Z@@`@`$fH@7 `e B~  B~< _ ELSE END EXTERNAL5FOR FILE .FORWARD "FUNCTION GOTO IF IMPLEMEN4IN7@` dd&`f&d&b&  m ef )INTERFAC3LABEL MOD 'NOT &OF OR (PACKED +PROCEDURPROGRAM !RECORD -C    V U  >e0   W <]@e" E@W ^< E&@% eC ~% C ``` e7 %  % %W ^<E  dt`  Ue E:tte E e' e- ` %  @t@@잇EE7  e &RPE ҐT$  LN wU  E@REPEAT SET *SEGMENT !SEPARATE6THEN TO TYPE UNIT 2UNTIL USES 1VAR ~ 7 wU  @E  @7W ť "• P~w WHILE WITH 7 )& @  z7 )7 )7 l)7 f&7 *7 j&7 'E wwE 7" D 7 "Wa"WawT"  1|w  7  ,\ vw *< R'(((@ BCzEG@HPtJ$LM nO(kw`77" )ww" " w&0" 4" ݅ E?F?8QRChTV焵W!cY_[\^^k `#ǭaxXc'exfhShjQYkoNmo9?pIrs|ouEw7x߄z @|Η}½  & &Ÿ>E aw.7{Wp be  Z G  a7`Z&X( &7 |v7 n|7 `|7 T 7 < 6 T79 d7  !~ x!n aL-LD< 6 \ = "  \m\  W  m ef5`\_e w5 5@ $" L?" >y \ " 9Lt w`A -\ɋE 5\\\f F^T2&,FR,:  9R " /& _w E ($ _& UD \wU jjK E7 J-`f5tD P 6_ 8׌E @@&|E U ]E 7|"ga7"`7"[7"VwLwCw;7B DEl7 h_&  ^< <ߗv<7|&fEʕ @W ^I~A< | r " _ "B  #E %M~ @E H a7 <  x*w w ʕtʕ  Q~wEU 5 w7 _w7w ,U WW7o74JD \   5@5@7 X^&&b&'''(&&&&(b&(b&(b&(b&'('(b&"'("'V'f&\  \& \\r1@\[?\ ew & ?U?*@ڪAD C %     @  f&\   B -  e \z\D f C_  fW & @& ` %  @t@@&&&7 D(()N((D('^&T((b&'b&b&'4(b&:(((e\\;@\ \N @   =@f&ysE[\T$  LN wU  E@pCf&f&\% a @w   6 6 &  f 6A  v  6N\z e ]& 7 7 7ߐ2 7  | t ~"w d    X N\\\ N A f C %C B    \ w  D& &&@ wK w: 7 ,* $? U@ _E7 wf U?  e ]& 7 7 7ߐ2 7  | t ~"w d    X N7 b&)D& && 6  A7 ^')d'^&))d')^&*))((*(b&(b&(b&(b&() e\ \S\ wK w: 7 ,* $? U@ _E7 wf U?  e& @7 b&*)e\X*f& \:יc&>X4%]@& & & & & D&&D&&  E7 PRTV + wU  E@  U@ _ @%7 r'*  IA e e@ e& & & & & D&&e #@ E7 _ @6 7 '(+6 6 #?%-0 @ ׳f&& @׳@f&7 (^&$$ K wU  J _&2 -/ -%+^&'+f&f&7 l(+(b&(b&(b&(b&(b&b&+b& )+   \,f& \ e\>:L]L?ƪ$  -~%$t t n d ^_TR HD 28*7 2E 7 _@ \fEA#& e@ & f& f& f7 'b&6, ff w   &@& $7  E7 4&U@ % E7 ez\& Dr)&&, E $7  E7 4&U@ % E7 ez\& Dr)&&, \   5@5@7 X^&&b&'''(&&&&(b&(b&(b&(b&'('(b&"'("'V'f&\  \& \\r1@\[?\ ew & ?U?*@ڪAD C %     @  f&\   B -  e \z\D f C_  fW & @&AILED 4$: INVOKE RECAL ; SLAP'M BACK TO TRACK ZERO BNE 3$ ; TRY AGAIN IF NO WORKEE ; GET TRACK 0, SECTOR 7 INFO TO DET&&&7 D(()N((D('^&T((b&'b&b&'4(b&:(((e\\;@\ \N @   =@f&ysE[\ERMINE IF SINGLE, DOUBLE, OR QUAD ; ONCE DONE, UPDATE UNIT TRACKING TABLES MOVB R5, T0S7RD+2 ; UNIT # IN TRK0, SECT 7 READpCf&f&\% a @w   6 6 &  f 6A  v  6N\z TABLE MOV #T0S7CT, R2 ; DMA TRANSFER COUNT MOVA BUFR, R3 ; DMA BUFFER ADDRESS CALL DMALOD ; SET IT UP INVOKE T0S7RD\\\ N A f C %C B    \ w  D& &&@ ; TRY IT BNE 3$ ; RETRY IF NECESSARY MOVB SL, R0 ; GET SECTOR LENGTH INDICATOR BISB VSI, R0 ; OR IN VOL SURFACE I7 b&)D& && 6  A7 ^')d'^&))d')^&*))((*(b&(b&(b&(b&() e\ \S\NDICATOR ASR R0 ; GET RID OF LOW BIT BIC #ISOLAT, R0 ; NOW A 0,1,2 OR 3 MOVB R0, @SIZADR ; STASH INDICATOR CLRB @TR e& @7 b&*)e\X*f& \:יc&>X4%]@& & & & & D&&D&& KADR ; UNIT AT TRK 0 AND KNOWN ; 1) ACQUIRE DRIVE'S SIZE (SIDES AND DENSITY INDICATOR). ; 2) CHECK FOR SPECIAL FUNCTION  E7 PRTV + wU  E@  U@ _ @%7 r'*  IA e e@ e& & & & & D&&e #@ E7 _ @6 7 '(+6 6 #?%-0 @ ׳f&& @׳@f&7 (^&$$ K wU  J _&2 -/ -%+^&'+f&f&7 l(+(b&(b&(b&(b&(b&b&+b& )+   \,f& \ e\>:L]L?ƪ$  -~%$t t n d ^_TR HD 28*7 2E 7 _@ \fEA#& e@ & f& f& f7 'b&6, ff w   &@& F  AND ACQUIRE THE IO BUFFER'S ADDRESS. ; 3) CHECK TO SEE IF ANY OTHER SPECIAL FUNCTION. ; (IF) TRUE, SET UP NECESSARY PARAMETEE PART) ASL R0 ; GET WORD OFFSET FOR DMA BYTE CNT ADD PC, R0 ; PREPARE TO GET WORDS TO XFER MOV WRDSIZ-.(R0), WRDMOV ;RS AND JUMP INTO ; THE NORMAL IO ROUTINE ; (ELSE) PROCEED IMMEDIATELY TO THE NORMAL IO ROUTINE. ; GET DRIVE'S DENSIT DONE CMPB #SPF375, R1 ; WRITE DELETED? BNE 4$ ; NO MOV #BIT0, WRDMOV ; YES- XFER 1 WORD AND ZERO SLUFF 4$: CLRB VSI Y/SIDE INDICATOR FLAG AND UPDATE ALL TABLES 5$: MOVB @SIZADR, R2 ; GET DEV SIZE INDICATOR MOV R2, R0 ; AND MAKE DENSITY  ; ZAP THE IO ITERATION COUNTER BR SPFUN ; JUMP INTO IO AREA ; 1) THIS IS ENTRY FOR NORMAL IO. DETERMINE IF A READ OINDICATOR BIC #BIT1, R0 ; BY CLEARING AWAY SIDE BIT ; IS THIS SPEC FUNCTION #373? CMPB #SPF373, SPFCOD ; CHECK IT OUTR WRITE. ; (IF) WRITE, ALTER IO COMMAND CODE ; (ELSE) PROCEED. ; 2) CONVERT LOGICAL BLOCK TO LOGICAL SECTOR NUMBER AND STOR BNE 6$ ; IF NOT, SKIP AHEAD ASL R2 ; MAKE DEV SIZE INDIC WORD OFFSET ADD PC, R2 ; GET READY FOR PIC REFERENCE MOVE. ; 3) CONVERT SIDE AND DENSITY INDEX TO SIDE VALUE AND STORE. ; 4) PREPARE FOR CALL TO DD MAPPING ALGORITHM. ; (IF) TRUE,  DEVSIZ-.(R2), @(R4) ; SEND HIM THE GOODIES JMP DONE ; QUICKY 6$: MOVB #READ, RDWROP ; ASSUME A READ OPERATION MOV (R4PROCEED ; (ELSE) SET UP FOR SD MAPPING. ; 5) INITIALIZE IO TABLE W/ UNCHANGING INFO. 5$: MOV (R4), R4 ; GET POS/NEG WORD )+, (PC)+ ; PICK UP BUFFER ADDRESS BUFADR: .WORD 0 ; DMA TRANSFER ADDRESS MOVB SPFCOD, R1 ; GET SPECIAL FUNCTION CODE (IFCOUNT? BPL 6$ ; BRANCH IF POSITIVE NEG R4 ; MAKE POSITIVE MOVB #WRITE, RDWROP ; AND OPERATION IS A WRITE, NOT READ  ANY) BEQ 5$ ; IF NONE, JUMP AHEAD ; SPECIAL FUNCTION IO SETUP HERE (NUMBERS 375, 376 AND 377) MOVB (R4), TRACK ; TRMOV #DMARD, DMAOP ; DMA LOAD RTN NEEDS THIS 6$: MOV R4, WRDCNT ; SAVE COUNT ASR R2 ; NIX LOW ORDER BIT, NOW A SIDE BIT ACK=WORD COUNT MOVB #BIT0, RETRY ; ONLY 1 RETRY PERMITTED MOVB LOGBLK+1, HEAD ; PICK OFF HEAD NUMBER BPL 1$ ; SKIP AHEMOVB R2, SL ; SAVE AS SIDE INDICATOR BIT CALL IOLOD ; LOAD UNCHANGING PART OF TABLE MOVA DDMAP, BUFR, * ; ASSUME DOUBLEAD IF NOT NEGATIVE CLR R4 ; SEEK ONLY OPERATION BR SPFUNS ; GO DO IT NOW 1$: MOVB LOGBLK, SECTOR ; GET SECTOR # TST  DENSITY MAPPING MOVB #BIT0, PSPLB ; AND 1 SECTOR/LOGICAL BLOCK ASL R0 ; DENSITY INDEX NOW WORD OFFSET BNE UPDPTA ; I(R4) ; TRACK ZERO? BNE 2$ ; NO, SKIP CLR R0 ; ELSE ASSUME 128 BPS TSTB HEAD ; SIDE 0? BEQ 2$ ; YUP, ALL'S WELF NOT SD , SKIP MOVA SDMAP, BUFR, * ; ELSE SET UP SD MAPPING MOVB #BIT2, PSPLB ; AND 4 SECTORS / LOGICAL BLOCK MOV (PC)+L TST (R0)+ ; NO, PREPARE FOR 256 BPS 2$: CMPB #SPF377, R1 ; READ OR WRITE OP? BEQ 3$ ; READ, IO CODE GOOD MOVB #WRI, R3 ; GET LOGICAL BLOCK NUMBER LOGBLK: .WORD 0 ; LOGICAL BLOCK FOR THIS IO ASL R3 ; X 4 FOR LOGICAL SECTOR # ASL R3 #373. ; (IF) TRUE, RETURN SIZE INFO TO SYSTEM IMMED. AND EXIT ; (ELSE) PUT ASSUMED READ FUNCTION CODE IN IO TABLE ; TE, RDWROP ; MAKE WRITE OPERATION MOV #DMARD, DMAOP ; LET DMA LOAD RTN KNOW 3$: CALL IOLOD ; SET UP IO TABLE (NON-VOLATILG ACE BR 2$ ; ELSE RECAL, RESEEK AND RETRY ; UPDATE BUFFER ADDRESS AND PREPARE FOR ANY ; ADDITIONAL TRANSFERS. 6$: BIC------------------------------ ; ----------------------------------------------------------------------- .DRFIN ; ------------B #BIT2, UNITNR ; RESET HEAD INDICATOR MOV WRDMOV, R1 ; GET # WORDS XFERED ASL R1 ; MAKE BYTE COUNT ADD R1, BUFADR ; ----------------------------------------------------------- ; HANDLER ABORT ENTRY QBKILL: .ABORT ; ABORT ENTRY POINT  MOV R3, LOGBLK ; NOW LOGICAL SECTOR NUMBER UPDPTA: ADD PC, R0 ; GET XFER WORD COUNT MOV WRDSIZ-.(R0), (PC)+ ; DONE WRDMOPOINT TO NEW LOCATION IN BUFR DECB VSI ; DECREMENT IO'S/BLOCK COUNTER BMI DONE ; SPEC FUNCTION OVER BEQ 7$ ; COUNT ZV: .WORD 0 ; ACTUAL # WORDS TO XFER NXTBLK: MOVB PSPLB, VSI ; SECTORS/BLOCK GETCNT: CMP WRDCNT, WRDMOV ; MOVING TOO MUCH? ERO, MAKE OTHER TESTS TST WRDCNT ; MORE BYTES TO XFER? BNE GETCNT ; YES, DO MORE BITB #BIT0, RDWROP ; NO, BUT IS THIS BHIS NEWCNT ; IF NOT, GET NEW COUNT MOV WRDCNT, WRDMOV ; ELSE SET UP FOR FEWER WORDS NEWCNT: SUB WRDMOV, WRDCNT ; GET R A WRITE? BEQ DONE ; IF NOT, WE'RE DONE MOV #BIT0, WRDMOV ; ELSE SLUFF ZEROS TILL DONE MOVA ZERBUF, BUFADR, * ; POINT BEMAINING COUNT DSKADR: CALL @BUFR ; DO CONVERSION INC LOGBLK ; ADVANCE TO NEXT LOGICAL BLOCK (SECTOR) ; COMPLETE SETTIUFFER TO ZERO WORD AND CONT BR DSKADR ; KEEP GOIN' 7$: TST WRDCNT ; ANY MORE TO XFER BEQ DONE ; NO, WE'RE DONE BR NNG UP OF TABLE NOW SPFUN: TSTB HEAD ; HEAD 1 SELECTED? BEQ SPFUNS ; IF NO, SKIP BISB #BIT2, UNITNR ; SET HEAD 1 SPFXTBLK ; YES, RESET COUNTER ; ----------------------------------------------------------------------- ; -----------------UNS: MOVB TRACK, TRKNO ; PREPARE SEEK TABLE ; IO NOW ATTEMPTED W/RETRIES IF NECESSARY 1$: CMPB @TRKADR, TRACK ; ALREADY ------------------------------------------------------ .DRAST ; ---------------------------------------------------------------POSITIONED? BEQ 4$ ; YES, SKIP THIS FOLDEROL INVOKE SEEK ; GET PROPER TRACK BEQ 3$ ; IF GOOD, READ/WRITE THE STUFF -------- ; SYSTEM MACRO TO GENERATE INTERRUPT ENTRY POINT .DRAST QB, 5, QBKILL ; ROUTINE WHICH RECEIVES CONTROL UPON I2$: CLRB @TRKADR ; BACK TO TRACK 0 INVOKE RECAL ; ELSE RETURN TO TRACK 0 BEQ 1$ ; IF SUCCESSFUL, RE-SEEK BR 2$ ; ENTERRUPT BIC #, CONTRL ; ZAP THE DMA AND INTERRUPT ENABLE BITS MOV CONTRL, @#DMACSR ; INFORM CONTROL REGISTER LSE RETRY RECAL 3$: MOVB TRACK, @TRKADR ; UPDATE DRIVE TRACK TABLE 4$: TST R4 ; IS THIS A SEEK ONLY OPERATION? BEQ DONE  CALL SAVREG ; SAVE NECESSARY REGISTERS MOV (PC)+, R1 ; GET OUR REGS BACK HN1: .WORD 0 MOV (PC)+, R4 HN4: .WORD 0 MOV ; YES, WE'RE DONE 5$: MOV WRDMOV, R2 ; GET DMA STUFF MOV BUFADR, R3 CALL DMALOD ; PROGRAM IT INVOKE RDWRIO ; TRY T (PC)+, R5 HN5: .WORD 0 .FORK FRKBLK ; CRITICAL STUFF DONE, SET PRIORITY TO 0 JMP @(PC)+ ; RETURN TO INLINE AS IF NOTHIHE READ/WRITE BEQ 6$ ; MOVE ON IF SUCCESSFUL BITB #BIT0, RETRY ; RETRY LIMIT ODD/EVEN? BNE 5$ ; IF ODD, REDO IO IN PLNG AMISS CAPRTN: .WORD 0 ; PO BOX NUMBER FRKBLK: .WORD 0,0,0,0 ; FORK BLOCK ; -----------------------------------------H ----------------------------------- ; ROUTINE TO PREPARE THE DMA FOR AN FDC DATA TRANSFER DMALOD: MOV #DMADAR, R1 ; DMA DETURN ADDRESS SQUIRRELED AWAY MOVB (R0)+, R1 ; NUMBER OF COMMAND BYTES TO SEND MOVB (R0), TASK ; SAVE FOR SPFUN REQ #372 ATA REGISTER MOV R3, (R1) ; PASS UPPER BYTE OF ADDRESS SWAB R3 ; SWITCHEROO MOV R3, (R1) ; NOW LOWER BYTE BIS #BIT4,COMRDY: MOV @#FDCCSR, R2 ; IS NEC READY TO RECEIVE? BPL COMRDY ; IF NOT (BIT15=0), LOOP TILL HE IS ROL R2 ; IS TRANSFER CONTRL ; CONTROL REG WILL BE SET FOR READ ASL R2 ; GET BYTE COUNT DEC R2 ; TERMINAL COUNT=XFER COUNT-1 BIS DMAOP, R2 DIRECTION GOOD? BMI FATAL ; IF NOT, SHUT SYSTEM DOWN MOVB (R0)+, R2 ; PUT COMMAND BYTE IN STAGING REGISTER MOV R2, @#F ; ADJUST TC FOR READ/WRITE OPERATION BPL 1$ ; IF STILL A READ, BRANCH AHEAD BIC #BIT4, CONTRL ; ELSE PRIME FOR WRITE OPDCDR ; HAND OFF TO FDC SOB R1, COMRDY ; CONTINUE TILL ALL BYTES PASSED ; -- E X E C U T I O N P H A S E -- ; NOW G 1$: MOV R2, -(R1) ; PASS UPPER BYTE OF TRANSFER COUNT SWAB R2 ; FLIP FLOP REGISTER MOV R2, (R1) ; PASS LOWER BYTE INET THE RESULT PHASE BYTE RETURN COUNT ; IF ZERO: NO RESULT PHASE, RETURN ; IF NEGATIVE: MAKE POSITIVE, OBTAIN RESULT PHASE ; IO FAILURE DUE TO EXCESSIVE RETRIES/CONTROLLER SYNCH FAULT EXIT IOFAIL: MOV QBCQE, R4 ; QUEUE ADDRESS BIS #1, @-(R4) C CONTRL ; ENABLE THE DMA ACTIVE BIT RETURN ; ----------------------------------------------------------------------- ;  ; SET FAIL FLAG FOR QUEUE MANAGER MOVB #ZAPIT, @TRKADR ; MAKE HIM UNKNOWN ; NORMAL COMPLETION EXIT DONE: TSTB RESTOR ----------------------------------------------------------------------- IOLOD ; ----------------------------------------------- ; GIVE CALLER HIS REGS BACK? BEQ 1$ ; IF ZIP-NO CALL RSTREG ; YES, RESTORE THEM 1$: MOV #DMAWR, (PC)+ ; RESET DEFAULT------------------------ ; ROUTINES TO SET UP THE RDWRIO TABLE IOLOD: UPDATE RECMOD, RDWROP, * ; SET FM/MFM MODE BICB @# READ OPERATION BIT DMAOP: .WORD DMAWR ; DMA OPERATION, INIT FOR READ .DRFIN QB ; AND AWAY WE GO ; *******************SAFETY, RDWROP ; IN CASE DRIVE NOT CERTIFIED DD UPDATE BYTSEC, BPS ; BYTES PER SECTOR UPDATE SECTRK, SPT ; SECTORS PER TRA****************************************************** ; **********************************************************************CK UPDATE GP1TBL, GPL ; GAP LENGTH MOVB R5, UNITNR ; INSERT UNIT # IN APPROPRIATE TABLES MOVB R5, SEEK+2 MOVB R5, RECA*** ; S U B R O U T I N E S ; ************************************************************************* ; ****************L+2 RETURN ; IS DONE ; ----------------------------------------------------------------------- ; ----------------------********************************************************* ; ------------------------------------------------------------------------------------------------------------------ COMAND ; -------------------------------------------------------------------------- ; ----------------------------------------------------------------------- DMALOD ; --------------------------------------- ; COMAND ROUTINE PASSES THE COMMAND STACK TO THE FDC ; -- C O M M A N D P H A S E -- COMAND: POP COMRTN ; GET RI VOKE SENSIT ; AND REENTER COMMAND PHASE JMP @(PC)+ ; THEN GO HOME RTNADR: .WORD 0 ; RETURN ADDRESS MAKPOS: NEG R1 ; K ; CLEAR FAIL CHECK FLAG DECB RETRY ; ANY MORE CHANCES? BNE COMEND ; YES, YOU LUCKY PUPPY! FATAL: JMP IOFAIL ; SORMAKE TRANSFER COUNT POSITIVE ; -- R E S U L T P H A S E -- RESULT: MOVA STREGS, R0 ; STATUS REGISTER STACK ADDRESS RESRY CHARLIE OK: CLR FAILCK ; RESET TEST FLAG COMEND: JMP @(PC)+ ; ALL DONE! COMRTN: .WORD 0 ; WHERE IT'S AT! ; ----RDY: MOV @#FDCCSR, R2 ; CAN WE GET ANOTHER STATUS BYTE? BPL RESRDY ; IF NOT, WAIT TILL WE CAN ROL R2 ; WE STILL IN SYNC------------------------------------------------------------------- ; ---------------------------------------------------------H? BMI GETBYT ; YES, DIRECTION GOOD TST R5 ; YIPES! DRIVE STATE EXAMINE TASK? BPL FATAL ; NO, SYNCH ERROR COM R5 -------------- CAPTUR ; ----------------------------------------------------------------------- CAPTUR: POP CAPRTN ; GET R ; YES, REMAKE R5 TO POSITIVE UNIT # BR COMEND ; ALL DONE GETBYT: MOV @#FDCDR, R2 ; PUT STATUS WORD IN STAGING REGISTER ETURN ADDRESS FROM STACK MOV R1, HN1 ; SAVE OUR REGS MOV R4, HN4 MOV R5, HN5 ; DONE TSTB RESTOR ; RESTORE REGS ONLMOVB R2, (R0)+ ; EXTRACT STATUS BYTE SOB R1, RESRDY ; CONTINUE TILL ALL ARE RECEIVED ; -- T E S T P H A S E -- ; THIY IF SAVED EARLIER BEQ 1$ ; SKIP AHEAD IF NOT DONE CALL RSTREG ; RESTORE CALLER'S REGISTERS 1$: BIS #BIT3, CONTRL ; SES PIECE OF CODE CHECKS FOR SUCCESSFUL COMPLETION OF A TASK. ; STREGS IS THE STATUS 0 REGISTER WHOSE UPPER 2 BITS ; SIGNIFY THET INTERRUPT ENABLE FLAG MOV CONTRL, @#DMACSR ; TOGGLE CONTROL REGISTER RETURN ; RETURN TO SYSTEM, INTERRUPT WILL COME  FOLLOWING: ; 0 0 ----> TASK SUCCESSFUL ; 0 1 ----> TASK BEGAN, BUT FAILED TO COMPLETE ; 1 0 ----> ILLEGAL COMMAND (NOT EXP; ----------------------------------------------------------------------- ; --------------------------------------------------- BYTES IMMEDIATELY ; IF POSITIVE: WAIT FOR INTERRUPT, THEN SHIFT COUNT RIGHT 1 BIT ; IF ZERO: PERFORM A SENSE INTERRUPT STAECTED, NOT TESTED FOR) ; 1 1 ----> A DRIVE CHANGED ITS READY STATE TST (PC)+ ; PERFORM SUCCESS TEST? FAILCK: .WORD 0 ;TUS ; IF POSITIVE: OBTAIN RESULT PHASE BYTES MOVB (R0), R1 ; OBTAIN COUNT BNE 1$ ; IF NOT ZERO, MOVE AHEAD BR COMEN TEST FLAG BEQ COMEND ; NOPE BITB #BIT6, STREGS ; ALL'S WELL? BEQ OK ; IF SO, RETURN NOW MOVB STREGS, R2 ; GET ST0D ; ELSE RETURN, NO RESULTS PHASE 1$: BMI MAKPOS ; IF NEGATIVE, GET THE BYTES NOW ; ELSE SENSE END OF EXECUTION PHASE VI STATUS BYTE BPL 2$ ; JUST A SIMPLE FAILURE BIC #ISOLAT, R2 ; ADJUST DRIVES STATUS, IT CHANGED! CMP R2, R5 ; OUR UNITA INTERRUPTS MOV (PC), FAILCK ; WE WILL EXAMINE SUCCESS OF TASK CALL CAPTUR ; SET UP..AND WAIT ASR R1 ; SHIFT COUNT? BNE 1$ ; NO, SKIP AHEAD MOVB #ZAPIT, @TRKADR ; OUR UNIT BECAME UNKNOWN BR FATAL ; DOWN IN FLAMES 1$: ADD PC, R2  RIGHT 1 BIT BNE RESULT ; IF POSITIVE, GO GET THE GOODIES MOV COMRTN, RTNADR ; WE'LL REENTER, SHUFFLE RETURN ADDRESS IN; PREPARE TO MODIFY DRIVE TABLE MOVB #ZAPIT, DRVTRK-.(R2) ; SOCKIT TO 'IM INCB RETRY ; OUR GUY HAS AN ALIBI 2$: CLR FAILCJ WORD 0 MOV R4, (PC)+ US4: .WORD 0 MOV R5, (PC)+ US5: .WORD 0 INCB RESTOR ; LET CAPTUR KNOW WE SAVED REGISTERS RETURNODIES MOVB R2, TRACK RETURN ; ALL DONE ; ----------------------------------------------------------------------- ; -- ; THAT'S ALL ; ----------------------------------------------------------------------- ; ---------------------------------------------------------------------------------------------------- DDMAP ; ----------------------------------------------------------------------------------------- RSTREG ; ----------------------------------------------------------------------- ; ---------------------- ; Double density interleave algorithm. - DWL - Terak Corporation ; ; Input: ; LOGBLK = Logical BLROUTINE TO RESTORE THE CALLER'S REGISTERS RSTREG: MOV US5, R5 ; DO THE JOB MOV US4, R4 MOV US3, R3 MOV US2, R2 MOV OCK number (LSN) ; ; Outputs: ; TRACK = Track number ; HEAD = Head number ; SECTOR = Sector number ; ; Remarks: ; RegUS1, R1 MOV US0, R0 CLRB RESTOR ; RESET REGISTER RESTOR FLAG RETURN ; -----------------------------------------------isters R2 and R3 are destroyed. ; .MACRO MOD M,R,?A,?B ;handy macro .IF DF $TERAK DIV M,R .IFF A: CMP M,R!1 BGT B ------------------------ ; ----------------------------------------------------------------------- SDMAP ; -------------------SUB M,R!1 INC R BR A B: .ENDC .ENDM ; DDMAP: 1$: CLRB HEAD ;assume head 0. MOV LOGBLK,R3 ;get logical BLOCK---------------------------------------------------- ; SINGLE DENSITY LOGICAL TO PHYSICAL MAPPING SDMAP: CLRB HEAD ; HEA. ; ; Compute LSN Mod 15. ; CLR R2 MOD #15.,R2 ;LSN Mod 15. ; ; The quotient is now in R2, and the residue in R3. ; D 1 NOT SUPPORTED AT THIS TIME MOV LOGBLK, R3 ; GET LOGICAL SECTOR # MOV #8., R2 ; 8 BITS FOR DIVIDE 1$: CMP #6400, R3  ; TSTB SL ;number of surfaces? BEQ 20$ ;If double sided then ; ; Compute LSN modulo 30. If this value is less than 1; LOG SECTOR DIVISIBLE BY 26? BHI 2$ ; BR IF LOW, CARRY IS CLEAR ADD #171400, R3 ; YES, SUBT 26 AND SET CARRY 2$: ROL R35, we want ; to select head 0. Otherwise head 1 is selected. ; MOV LOGBLK,R3 ;get logical BLOCK again. CLR R2 MOD #30. ; SHIFT IN QUOTIENT (C-BIT) SOB R2, 1$ ; GO TILL DONE MOVB R3, R2 ; COPY OF TRACK # CLRB R3 ; REMOVE TRK # SWAB,R2 ;LSN Mod 30. CMP #15.,R3 ;which head do we want? BGT 20$ ;branch if head 0, else INCB HEAD ;select head 1. 20 R3 ; SIGN XTEND SECTOR CMP #14, R3 ; CARRY SET IF 13