PK:HH!BOOTACARC0A<; >!BOOT **K.1QUIT|M*BASIC|MLO."COMPTYPE"|MRUN|M *FX 138,0,129 PKuB=^^!DiscTree/!BackupACARC0A3| Boot file for starting backup program | if "" = "" then Error 0 System resources cannot be found, (!System not run?) | RMEnsure SharedCLibrary 3.50 RMLoad System:Modules.CLib RMEnsure SharedCLibrary 3.50 Error You need SharedCLibrary 3.50 or later, see User Guide/Release note. | WimpSlot -min 160K Run ".BackupImge" %0 PK~"Z==!DiscTree/!BootACARC0AD3| Boot file for !ArcTree - version 0.33 (30-Mar-1989) | IconSprites .!Sprites Set File$Type_D73 MitBScpt Set File$Type_D74 MitBakup Set Alias$@RunType_D73 /.!Backup %%*0 Set Alias$@RunType_D74 /.!Restore %%*0 Set Alias$@PrintType_D73 /.!Run -p %%*0 Set DiscTree$Dir PKyBt}]]!DiscTree/!RestoreACARC0A3| Obey file for starting restore program | if "" = "" then Error 0 System resources cannot be found, (!System not run?) | RMEnsure SharedCLibrary 3.50 RMLoad System:Modules.CLib RMEnsure SharedCLibrary 3.50 Error You need SharedCLibrary 3.50 or later, see User Guide/Release Note. WimpSlot -min 160K Run ".RestoreImg" %0 PK ؜$!DiscTree/!RunACARC0C]3 | !Run file DiscTree, Release 2. 1989 | Last Changed: | 13-Sep-1989: Version 2.09 and higher. | IconSprites .!Sprites Set DiscTree$Dir Set File$Type_D73 MitBScpt Set File$Type_D74 MitBakup Set Alias$@RunType_D73 /.!Backup %%*0 Set Alias$@RunType_D74 /.!Restore %%*0 Set Alias$@PrintType_D73 /.!Run -p %%*0 if "" = "" then Error 0 System resources cannot be found (!System not run?). | RMEnsure SharedCLibrary 3.50 RMLoad System:Modules.CLib350 RMEnsure SharedCLibrary 3.50 Error You need SharedCLibrary 3.50 or later, please see User Guide/Release Note. | WimpSlot -min 32K -max 32K RMRun ".!RunImage" %*0 PKo*Ԗl#l#!DiscTree/!RunImageACARC0D 53d,5TDiscTreeDiscTree 2.17 (01 Nov 1989)xh L-- 0 0臯]뇯J0LQPQ'QO- `03p- 0 臯C6㇯J0f@O-- 00-Z@ 뇯J00OPO-- 0 臯@@;@p@`X[W[HpG@@Y @[ -L ]?P@:@P :P`PQ .QP[P@r@po@W @[ 0-L ]?@P:?P :Q $Q $QP0[0[ -L ]?@`PpP 0 p$QP  p$P P P[ -L ]s?P@ă Mp$?`P:?`P`` pW  pDQ PPUY P PG,PCW  PP< QY3 ,P.W  ;P'  zP P<P @P<P P YDQ Q PPU[ -LVM \>P.`@ MPl p$P P Pc ]$>PM>PH D  RPL  + E$>P >P D  RP3  0S <@D0P P P 0S <@D0P P P  P>P> [ -L ]o>``P@h+P[>pP[ >0D `>P #,@@Ph>r؆ -L ]C>(>@P[ >0P >P,h|>w -L ]%>@ h-( -L ]>@`PMPPE>rec- 0-0 ЍP P =#fF-[ 0-L ]=@P@ P0[  0h 0-L ]=@P@P0[  0h 0-LFM \=@dPPM=P@P 0-0 P=Ѝ.@0[̆%s%s.%s 0-LEM \=@M@P 0 P=/@0[wipe %s%s R -L ]=@`Ppe,P QQ  0 010Q Q Q (<@fh, -L"M \M=@pM +P6 e,`P, PP# 0 PD=**P P;=.P P %s%swipe %s RP'fc,@[ -LEM \=@M@&P 0 !O@=T[ -LM \<P@M`fMlpq=0 l@O<l =<Plp=<@p=CAYIDAY?O-? -P)?`?O-xW$/e/O0!@< Ѝ @P<P *<   "[*...%s%s (Script: %s%s %s) D0C!D 0000 0-L ]w<@Pe+@ PLlf0h+ 0-L ]V<@Pe+@w  f0h+ p-L ]A<@Pl`e+ Lfph+LL 0-L ]!<P@P0[ U D0[D   H@0[ p-L ] <@PLPw`P P 0-X0M ЍPp[ph&Vp[ ph& p [l 000 t Ql 0000 t Fl0 l  ! 7 0-L ];@4PP]-PZ-p0[ 0hi)괆 0-L ];@4PPG-P l?-t0[ 0hM)l 0000 l 0000   l0 lL  "   -L ]W;M0-@P ,;[.TempScriptObey .!Backup .TempScriptIgnore DateYesterdayTodayFile SpecFile TypesDated On/BeforeDated AfterInclude non stampedFloppy :0Floppy :1FileCompressAll dirs.SelectionFilesDestinationDo itSave optionsAll dirs.SelectionFile SpecFile TypesDo itShow sub-dirsHide sub-dirsSelect sub-dirsDe-select sub-dirsNew directoryDelete directoryCreate TreeViewerHide sub-dirs.Show sub-dirs.Delete selected dirs.Clear selectionInfoDir. '0123456789'SelectionSearchBackup -L ]:0 P P\ R0[ -L ]:P`pM⌑ x(d h0$ 0$00d0(00,000P00000400080 00<0<0@000D0`0H000L0MPT\X(`hdhp@MRP꼈  xhԉtP@q@QP@ @@3 P@ @  | x ": P @Pt @ (p < Ppd xp,Dir. '%s't%  (< Pp d x#9t (< Pd x P ppLPl@hpDir. ''lph@lP,@dp,pd@pL@ll@h,@d`\XTDPpPp(+t$+pP @L pL(l@ H@pDltP @HpD@ pHpDl@$<0-<` d0*,Bs ,Ѝ 140 P    Pp(@l@p<p[ -L ]8@M@   "\H#\l-DH(.4X#x#P^-[ -L ]8P`@RD@[D@[ |5-dp d0*,Bs ,Ѝ  .[ -L ]8(M 7[ -LM \8P@Mp$[P 0 `8P P??-0 A @8Ѝ)Ppz[%s%s~Copy %s %s ~Q%sDR -LJM \a8`pPJEM " PP! x pP ,PP pg8<0 -d0 S/Ѝ 0,[X -L ]*8P@` pP[@QR Q Q[* Q3  Q[@+ P[ee' Z f\' hx@ P J @ f 0r   Pp P /   K Pp@p[  0h$0, p-L ]7P@`0 ph -L#M \7@P`pPL 4P PG(P pB@7 P=* M @`70-0 7Ѝ p Ѝ,%s%s.%sM.p7P0-0 AO7Ѝ P  P P[ P??- A?(@u7Ѝ(p܍[~ -L ]N7@X!x!P+h+ --LM \=7MP`@fMAAdt+pP0 #XP+0 "xPX!p@t@l@D     ?+P 7 @`7LPM 7` 7< < 0Kp ScriptFile*d܋TreeViewer0 d(6d6PPd6P@dX//0 6 ]p, e&>-f?  ЍPf%%s%s...f% 6P* 6 |4  p- =N 0 -0  Ѝ  9 0"*PP2 P PE@ \P ` [鬤jhQ؆ Q 0-L ]06@(? p67 p. * $ܶ\4dt`̆TLԉ8 Ḋ(|hDiscTree11r%&p+Pz*Pv o%Pr Po ,Pj P|-PxpP" PP SPC VPj.Templates.DiscTree.HelpMsgsP/ vPV&;؆P\ ,0-r 0Asb(Ѝ("Program parameter file name to print is not a Backup Script file~P\ M P00 c Ѝ k .d[Program parameter file name to load is not a Backup Script file j# -L ]0@$PMP$%h!% -L ]0@p`P4$P. 0$P$ 0.0P   W`  0($P[$[ -L ]U0p`P@ P[ P[ p`00X 0@0@[ 0-L ]10P@ 0$ rP P0[\ p-L ]0@`P$Q QP$P P Pp[ p-L ]/@P$QPp[ ``$P P Pp[ --L ]/@PpM @`0 !P` / +P/+PMsm%ssmall_app 3 3,  Ra( 00-0 $-2 ` Ѝp`QV7 AP2$Q. 0-Q0 Ѝ`/small_dir0-0 yЍ`V $P P PV $P@$Q Q(`,[ -L ]./@`P0P (@((0@@(@P (p0@A/@,/S(@P[$P[ (@0',0'$QP[ p $P P ...P[ p-L ].P@`Pp[ $Qp[ QP $ P P Pp[ p-L ].`PFPp[ 0 ph -L ].pP`F.P Q0 [$Q[ Q P[$ Q Q Q[ p-L ]V.P@`P Q0&s$QQp[ $P P Qp[ p-L ]&.P@&`P Q0D$QQp[ $P P Qp[ 0-L ]-P@P0[ 0&0h -L ]-@P P[ [ -L ]-P@pP "`P  ?p@p ="[ -L ]-`@PpU Pn$QQ[  $P P Q[ p-L ]-P@$ `P  p[@. p-LCM \r-P@M`P 0 {-!PT*%s%s* d)p[ p-L ]N-P`@(M @` #[,P@P@ŧ@ŷQP p[ -L ],-@M`0 pP _H-P Y!PP  k-0-  0`P[%03xFile$Type* -L ],@P@P`QQpP `P   !P P h h -L ],@@Z[d -L ],P@Op  R``p0 V.  0 (-  0Ѝp 0 1(- 0 Ѝ(pGQ Q `h`p V!!kQ -L ]\,@P&pP[ da`p P [  0  p z P p 0 -000 Ѝz fileTypes [ -L ],`@PtU0 , XQ4 kQP[   RQ  0 ^@ Q Q QP P P[ p-L ]+@SP`QN P X`p[ p-L ]+@0TP`:7 P x{`p[ -L ]+@Q PP[ h+ -L ]z+@c(h -LVM \o+@p` PEM(Pp P P0- 0 ЍprP Pp  Yh QppWK <$i+PB  P< @sP6<`L+K+$P  (P P:.*`  Q QppW(`'P (P`4 P Pp  P$ x[ -LGM \*`P@M *$*Pi :*Pd @P[,pPG, P0=, ($AP#-@* O*(P   (PS(P `pLoadMsgP(@ 4 Oq`p x [  -LGM \S*p`@PM0 _*$p*PL :k*PG @}P>%s%s,sP , B HP  :*V    'P  (P(P P.* |i}[  -L[M \)p@`PMe:0 WO)%O*U   e'P6$QX  0 )P $P P XX<$)P rP 0 I &P  &f[  -LM \)PM@P PmPQ\\h(PeM)`P\ ),<P , )w Detail of script file: %s q),  'pp" /'PĐE\R\T\ P r  Detail of script file: Destination drive for backup files: %d 3=)L 67) 72):/)PC/E/D') F")P7/9/I)P H#) 7 D)@L GQ Destination file for backup: %s Disc to backup: %s From directory: %s Selection criteria to select files to be backed up: selectedall Search %s directories Match file name specification: %s, %s file typesToday Files dated on or before : %sYesterdayP  (  (@Q /!/!(P 6'PTM($Date Ignored Files dated after : %sIgnoreInclude, %s non stamped files Selected Directories to search:  s(X ,& P ܍ %s File is an old format and cannot be read File is not a backup script fileH(& ({( @( \H(0' - 0F Ѝߍ [ Unable to read script data -LM \(`PM@Mp'[P B/)(Q I  pB (ABL( (`'lD  D @@ptxPA /pP P  2%p B /8&PPY Q"x  RQ P  "&Px Q Q Q PXQ.QQ" P ,'' ,% PQ Q Q PX %X As([P Pm'xPU'PD  4o'WX   @s[ -LM \'P@Mp PP\ P\` P!P #%pn A /e%PfP Pn'&P' A &`&lptpP   3%PppW P xzpXWXppP  ,% PppW  XWXpp ]$W P DDP&Q ([ -L2M \a&pPIs@`MW P s&a 0WU PC Pe$pJ  /$P2ĐE\R\T\( P! 0L p9&@#AP BYpP 4&(K %s%s`   # P؆ 0X [^ 0-L ]%@PMe2@P   f'0[ 0-L ]%@:PP PP  ;0[ -LMM \%P@`FM_P# P p P 0 `% 0W"0&pp [%s%s p-LFM \}%P@Mu`P P 0 O@% ! PP  0p[ -LFM \R%P@`AM{P ev?P 0 KO`P%%0 \p f[ -L ]"%P`petQP F0 :P P PfhV -L ]$@P&P[ eHvf`0 q ik7Delete selected filesSelect allClear selection p-L ]$<``(PE P q@G@@p[l -L ]$@M 0` pe,P PPUL xJ  9$⅌3  P -$ P($ 3$0-0 $- 0 f,Ѝ0`Y pP P P small_%03xfile_%03xsmall_xxxPU xV F P,Cf[ -LIM \J$p`P@MPM 0,  7P$`X$ 60pp: 0 -0 Ѝ[p#  Xp M @p  Ѝ Files Matching: %s on %s xFoundViewer0 [ -LRM \#P@M`pMQX7 P (P# 0 # P Q %s%s `P P  `P P XY P   L[ -L ]#@ h -L ]|#`Pp@R! HY  h -LOM \b#Pp$@`MXP P* Pi PybQ`V 10-0  `V#Ѝp&  P%s%s.%spV=XR Q <#P' bpP TE#M#XP T;#0#D<@ ` pXXPPp X@X Q  p  U[ --L ]"`@P\ pP3 @T@0 P'   `XP Tp    w9 (SearchMsg@ [ ,QPPU@P ,P $(QPPU,P(P  PPPp[ -L(M [[ --Lp`PM@JM0(S00c00cS 0S00c00c0L(( P((:,@0@8`p4(! #P U0[ -L(M    p[ 0-L@M0S00c00cS 0S00c00c0L P Px Ll!l @ y0[ -LP@p  `P @PK@0uP lqlp' [8 00\00S\0y 00S 00S 00S -L(M  [ -L(M ~ [ -L ][@ P@[ p-L ]N@PU L`PP Q Q  U p[@. p-L ]/@P` l Pp[ P Q   p[ -L ]`p@PQ R  Q@ Q Q{ A[QQ PW P P P W PP P  w[ -L ]@`P pP[ ` Ps PP P P  X7 ( P/`( PP !PP P P P P  X ( PX  pp!P P  P Pppp ppppp p[@ -L ]p@`P YP[ P@pT T T[P[,3[l p-L ]@P`P  P P P P P  PPp[ p-L ]@`PPP% " PP( %PP P P P P P  PP p[p[0 -L ]~(M @ T[ 0-L ]j!@(M  xP U0[ 0-L ]S@(M dP P .q!P  U !**rP @0[ 0-L ]&@(M 6P U0[ 0-L ]@(M  P U0[ -L ](M  @ nT[ 0-L ]@4M  P YU! p  '@U0[ p-L ]!P@(M 0 0P ` .Vp[ 0-L ]@(M0@ P U0[ 0-L ]@(M  P U0[ -L ]{@`Pp,MpT Pf(P ~PU XeP[ p-LCM \SP@MM ` j p[ p-LCM \<P@MM `,9 p[ -L ](@ [ Q h p-L ]P@`Q 0 yPp[ p[ , -L ]`P@ p p* P p W  PpWpP P  @P pP@[ -LEM \`qpP@BM@@e@ @@3`PT 0  PDĐM\C\M\> P; P5 P.  P' P! rb Q 0 Q0! Q@P0$ PfY  [Unable to load message file -L ]-$C@P PP[ h@-PdC@pa PpW R pp pWppQ QP@300   p-LBM \P@M ,` <p[ -0-LM \PAM,@P '0[ -0-LM \ PM,@P @ Q0[! -L ]8@(MeP fP gP  <  @  [T -L ]u@\MT T T T   A  4 82<48nP T T T T &   44[ p-L ]6P@`(MP P P P  B   3Q``p[ -L ] M [ -L ]M [ -L ]M [ -L ]M [ -LaM \pP`M@YMPIW W W WJE  X II   Q Y @=!BQ\3?P0 d  =P)  @ The disc in drive %s appears to be un-formatted. Do you want to format it?ADFS:FORMAT %s E Y X[ -L ]aM @s v[:%d -L ]PP@lMp hO`_ @\ aP \ <`Shp[ A(@ Pp  Cp W Padfs::%s.$*[ -L ]@(Mp`CPW\ @:4P@@ }T[ p-L ]@HM4:P4`@PP04 @Pp[%s:Dismount %s 0-L ]@(M@  P BU0[ -L ]P`@(M! P ) p )WP [ p-L ]P@(M  `P   Vp[ -L ]Pp`g@(MP  PlP  P  X x X[鬅 -L ]RP$M `p@(M$ z0-0 ЍP '%d%*c%d%*c%d RQdP @PA`pP=P = QQP[ -L ] M$MP` p@(M$ (20 -0 (QЍP )%d%*c%d%*c%d%*c%d%*c%d%*c%dQP dR+B  @p`P P QQP[ -L ] P[ K  +/   0- 0  [%02d/%02d/%04d 0-L ] P@\M@(2)  P"$M $ @ 0  -0 \vO ЍP0[dP @@ $Ѝ0[%24:%MI:%SE,%DY/%MN/%CE%YR -L ]^ m@K{ 0  w A P MQa@ Pu P[ MQ[p@[ -L ]; @pP` M ?%P;HP IP MP pP#-V12!"F ampm- < P   %2d< O<  %02dQ DQPP DQ[ -L ] M @  a[ -L ] $@HMK $ q K   k 8aP@@ !!b!P@ A[& 0-LM \ @M P  P 0-00[ -LM \ `P@MP' P3P0 p~  P@ . P M@0- 0@PTlЍ @Q   0Q  [ -L ]I M 0 S S\    [ -L ]/ Pp@` MP Pp  @5  0[file_%03x -L ] p`P@ MHP/ '0 jp% `p,(  0\ -X 0 ЍD 0 9OP  SaveAsRxQpSX [HL $ -L ] PppP@(M R  `P dV`  p  ` V   IV[ 0-L ] P@ :@0[ -L ]t @(MP *P  u [ -L ]Q @`PMPG8Pp=(( L PP,H! B PP"8`4p0, 7 PP( P P,PP0P 5 [ -L ] `P@{wGpP 0 [pp  - pGPP[c[ 0-L ] @PP0[ P0[ 0 0hlV p-L ] @P`Pp[ TphdUph_ph  0-L ] @PP0h $M jP  0[ -LM \ `pP@MP PE @|+P8 P1 ]p& $M$  4 .P  8P Q8P  @P}$ЍTY [ -L ](  M@0 0yP NP YP nPP\ P\ @@ [ -LQM \ pP`@KM50 cp, 3P5 ,(  %P  k i0x -t0 vЍz0 -0 FЍQuitQDo you want to save edited file %s?[Ys[* -L ] M  [ -L ] `P@pP P,  NpP PpW[ -L ]y p`P@ RP PQ\ RPQ\ P\\  eP P \` P]M@@P \P P$pP0-,0P+($@ P0-^ 0 -0  Ѝp/ ]P+#4]0-H 0 - 0 ЍVp0-5 0 -0 A ЍAP ЍY (Im [ -L ]@P`$M   0 pP.P0$ - 0 y Ѝ@p PP @ ` P. T [] -L ]`P@M pH 0 -0 [ --LEM \M0M0P@Mp@@@ @ `0-0 -0 B Ѝp `P @Pp W [ -L ]E-0 [ -L ]4@ 0^^  P 0 D0[ 0-L ],0@M @ PPbPCP0[z --L ]@PpM`L`@dP hp0l0 t $\L @xP0C|0 A,000B꼎 hL@xl P B| p 0 Bt A`($P0 I` #[ -L ]@Pp`(M P 0  -0-0 yЍ[ -L ]r@,MS`~yGP P XYV`WpP0q0p j(0  -0-,0 6Ѝ[ 0-L ].@P  0h# 0-L ] @P 0h+       -L ](M E[ -L ]`Pfe p@    k 0-L ]P@ a0h -L ](M [ -L ](M [ 0-L ]@(M  EP@0[ -L ]`P@pP P[ hKV DM(P@! @  [h -L ]l M@0 0yP NP YP nPP\ P\ @@ [ -LGM \E`pP@AM0 p@  X tP L !QuitQ  0-W$?$? "P+Ѝ %  0 - 0 Ѝ 0 - 0 uЍ[s%1d file%s edited but not saved in %s: are you sure you want to quit?jHiV -L ]@$PZ PWhT -L ]`M(QPXpHMD@@e P0 P  P @`P p|T@P D`@ ( H( TPl*X PPXXPU MTX @(pPE $P? Y  P7 $ l pPbp" Y U$8HAH$X  ,   B  r B  $ T RHЍP Xs  T R P Pz   gf=@P[ -L ]`P" @pppP9  P7 Q P/ $ P' $8 HHX  ,  0   r0   T R LyPP  [ -L ]sp@(MP `PW P   X@P @[ 0-L ]W@TPP |0h2 0h -L ]<`P@(MpA IP-P*,P Pp`pW   .(P   `p .P X p x[ -L ]@(M  Q  , .P[ -L ]pPM5@`(M``(  Q  , .  8Y(M@ P4 8(ЍY[ -LBM \@pfPM`PP( P,  ,   RUN %sFiler_opendir %sP P`V[ -LEM \aP0Mp@@M @@@ @ `u0-0 -0  Ѝ@p e|[`u p-LCM \4@PMM   0 `E0-R0 - 0 p[ 0-L ]@PPP<P0[ .cfgFile11||a~.@:"\\$%^&11||a0-9\-/127||a~@*"\\%^&64||a~@*#"\\%^&11||a~.@:#*"\\$%^&Matching:4\Date: ĔDate: ( (4DPFiles<File Named@Еp@|DestinationTėBackupMatching:ԗ  SearchDir. Name  \,X<ԑP`<tDirectorytl|SelectionИؘDiscTreel@|@@(@8Oak SCSIHDevice Name@@Ĭ@īЬ@ԫܬ@@@@View On:$̪Options<DLXDiscTreeDh\(hFile 0 O[$ p000Ğ@?>|>x>t>p>l>h>d>`>\>X>T>P>L>H>D>@><>8>4>0>,>(>$> >>>>> >>>>=555555555555$3 300-h,********)x(t(t&$#HD@<840,($ p0 DM0CXBHSDSRQYTYlkc\yXyssssspdnyyl<~~~~`|zx`plht84dHDL<(       t p ` \ L H 8 4 $             p     x ` P L < 8 ( $              t \ 4 $          p \ H D 4 0   |lXD@0|lPK~3Rh !DiscTree/!SpritesACARC0Ap2n3 !disctree, www᪪qwzwqwqwwwqwwww7qqwzwqwwwwwqzqwwwwwwwwwwwwwwwqqwwwwwwwwwwwwwwwqwwwwwwwwwwwwwfile_d74, wwwwwwwwwwwwwwwwwwwww"""""""""""""""ww"DDDDDDDDDDDDD"wwwww"D"""""""""""D"wwwww"w """"""""""D"wwwww"ww'"""""""""D"wwwww"w"""rwww'""r"wwwww"D""""rw'""rww"wwwww"D"""""""""w"D"wwwww"D""""""""r'"D"wwwww"w """"""""""D"wwwww"ww'"""""""""D"wwwww"w"""""""""""D"wwwww"D"""""""""""D"wwwww"DDDDDDDDDDDDD"wwwww"""""""""""""""wwwwwwwwwwwwwwwwwwwwwDwwpwwfile_d73, wwwwwwwwwwwwwwwwwwwww"""""""""""""""ww"DDDDDDDDDDDtw'wwwww"D"""""""D$rw'wwwww"w """"""D$w'wwwww"w'""""""Dtp'wwwww"w""ww'"wG'wwwww"D""r'"rwGw'wwwww"D"""""w"Dw'wwwww"D"""""""DwU"wwwww"w """"""Dw'D"wwwww"w'""""""Dt'"D"wwwww"w"""""""D$"D"wwwww"D"""""""D.D"wwwww"DDDDDDDDDDDDD"wwwww"""""""""""""""wwwwwwwwwwwwwwwwwwwwwDwwpwwPKUD'e'e!DiscTree/BackupImgeACARC0CIYI3)D:SK @0S.-ڻ/Q;h֒[#L#I$wcL[Ky8_f,!gcBI1PZV0Qڻ UZZ뵰.¾PM.$yZۼpOZ޹*y˭`_TеdOE`4TcRa3_dc1T_L^kikMlO%NgeξLJ-J8MZkQh_r_8`Wb3LlrUb^klpM$geLJ+JMeQ?֚yyоL_HXOU@bKd`ȆVZke[%.m=J$ \.TО(gDlxb?["\jb˾P߻?[۪w\glHbZ\k}\~T>bƥ~9b{ks\\kwK^`8]TfbXduY@G>|`J"qKZkv\sZvK2 _2*#Kbl ̳LhMO bkO bdOaF]\Ud4\G`T@/^yOBbl``Es䞕e6:3d4c2v v s%Ţk#r##H$b^K]u˾Q;K`D ]㻩[ZkZhZQZϨ!`l]Knރ"zrC\^Qڻ~LLUeD:lJNZl?]L۞l"wZ,\滵QڻˮIFY.p 2majݵȾڻ Q;pg@;$SMTK ٴ;VO d5:kj3:j:+64"ZnzZڿۀQ;΍[m!Ko8\"HG].H2I/F.PHPIiHEnһCB%m }5:źjQڻMLZ>-Q;34K[ZqIKIJGr]A\KT7FLc\/QڻdyK+^xTۡ+>7ńyPε_lh,%/wӠ?[5и.MXiɞ ڿ7Q;[yoGh<>y[M̟G[ypKy'[Gy&[,MiNɽ$g2=#kTo]Yڸ۪;NլUڸ۪;ܫNݢY2Q;^\dnM4dM \Or F<^jZkϮ]/nQڻC0; DDzy[33V1ߠ:ը7[<фK% _wۺZx5SɾQ;KPTHL\m]^3̬^mk_@ϸ.Z1͏.ZϾ^_.ۺZ.1АkZ՞;N96.%_Fϸ.Z1.]Zо^֓>#D%4.6.%6%.[K7%"iW2\W2mK [.%ܵ˾þP.R3/DU\.wP ^kZ%Dlzu*hU*na 3ii2#s(53r/a"3tHu2 [*l' 3 ,w:0i)R񽇒qNAȏ(NОXŭw+cm(#>Xi[i^GlYiVGlv\2) Wl.{P̷]mPClb}l"^+X^&[WF*U}fql,#RuFbt2pu$$G#,(jGlN̒GqqNx GּoNojFlN̒Fq"}$d ]1d.+QLQ]mQiCl|l[[ӂ]PXTTSͭTͭRU[][k[๭e]ƣ| ꞙqlT r+:ge3le#ic@3h =3eq5"[c][KMCl|Ɣo[0\ ]k,U^0U^4U^8U^X=;LÓ0`f"^cpUVh.FV"9+j(SHXTRUCyIir^~_nr답Q{C~orv?Ղޒ߈\[kEpn TU<\ϸ.[1͏.[Ͼ\nsϸ.[1.][о\uMH7,4t[ {[]ҽ|\lri. X] X[nw]B/A?^5)s_ϸ.[1͐.[оI\KMn|{qz\ t4PU"[HՃ ݃ =Ҡ!ը[&r%\.Xi׃w]B/A]5)\սnJ般s[lr;_ž0r[k][[ioۓiL[[kcۭrc~mh[ Epnήɭ%x\x'U\'%\`5`'G.KN~P;,B3LBMNZ\[޹`˾lB\m[tL[V2xP][ligP[g]|N\M`L[^[zk PE.~rC3}[[kIZ[nv[yk?-O|k[|k8nay[g[Ƈ1Oyg|,drdLY[[k&]ĵQڻ}`K̰`/'[[kIZ[е"[[><[{`1[pkYT\T]y[*[lk`p{![ư0_þP&-}Kܲ07DZktbZ3)"ڵZXl)!EECOA|ė ԙZk)ly`UơL.+*{}K{`ˇZkQT"n^)TlW"ޏZlXiZCZkt.*!ѻݞE!鍸ͻdٍ00:TtmV"kZlXi`ZCZktͨ*!ѻϺE桨T,ލ0@"C$`KV`4Z?EyOˍf4l(ZZ)TlhI,{V"!lѹݛE!鍸_#ˮPọٺKGlQl LJZ,:,*YbP(tF ăZT IV  ۼ~U i8Vm q έl-F.I[L7"y"t F ˚SWI؛វ  Km uSƮʞQDMɬ%:,?Y `) YLS_SDmb00h-YESVٴ uYlZibЮЩ 'ifZ SZB4͞ DMɛ3X oX3)f lܷB n(UY`~`a@?:dszT%>wƈ[m5L_l9+\A\ÿK\Clࠜy_qao&3go:ڳQIHDC,n#T4{k5R9,/R@йF޺G :NF G5#9U.EixYBiCZ̿ʾþ|Q;Kn5rXQdynIZB\^݃r=yn6\|{ݥ5,,ʹ{r̭dXny\{,K_?h% FEryLXn^hN Qڻ$|n$mcE!t /l4ԵǾľ |Q;X[d2(>ΈIVCՙE MSJOFeFdJE\>9ͭI\c"l"KtQ9;TI3\[3NK3#R\K@=\իx/m#;D/F]Hi۵{Q;;\ᗜpytZ[XMTLM[nyˈRIL&_zXlk_'WXFX[k@HUO3Z뮵Qڻ^{žQڻP{KzLTͣx zL:Ξ=Qڻ4{ᘜJ]NͯvJZn㿁I3AcY_o]4XlM\ryKU{]q_"Xlбm]n_ĭ_ An˾.X]k_In˾ZIPcY_o]<%X[Qڻ8zSF(@VFeH ;MyqZ^ԣ\m[Wl&IO\ˢ"ƞHFV[L<&IO$@lڽzQ;Iyrct']SE;DY_Y""U(qE]P]XI{yWlk[y$!Zm~~Z뽵Qڻ(VzCܟ RӓH Ily[m>S^nՁ 5Wlkݾͫ=n*]QYIxcV2n`[y\my~ZkZ뽼#_\&6.[%^Br!YJWΫMrͭIZξKJ:]ξT.ݛ\9+F) Cy[mZe}ɾ%yQ;ۮ̞9HaQMaI힫5z#3ۺ3&#ۺ+)aYͫUaQͫMaI٫ξN\5#˞zgIMaIέ_TzyݫIgGJyfgg +f]Z.%ˮϫݽQڻ~xx0RP FL͕MɖNH^8.5.Qڻ\xͺP-[ۺ`aQMaIέ\O[-4.,黵Qڻ*xam\%oaYͫUaQͫMaͭI[ξO-\ۺ4ͭI[Ⱦ;ڳwQ;0OPeQfg 4!B \r?yT{l$޽д;VL,HpRX TڸwQ;,0[L_˃ݦrKTlyL0{VǾڳwQ;1,Z.+=nQڻ|wChi܍܎܏ ԐLT]S܃R1rKi|T@fNd>.S64,5VC"FW/lZ{渵QڻwHw<,LmWUwlly[!F;&lF2at # G:ip" mC3mt3 õڻ@ [Ճ+8OOUPOLOTMUXOHQUym(KňQY,K_LZ0KŤ7;VdT^k;U]kռ_UUdLT ] 2˾ڸ揻` .+-QZk[Ǿڻ`P"[Ⱦڳ,W]0Z4YURrͦy`PQwlƾڸ`0 $ZzǾð/DTO^TP^YPT![TQ^ZQT![TT^T䂜R 9QkVz)QzlTSUVTUT;QҬTVS+;T"QփVrPlKyvNβ} JY.%\وí͇y>p=1 Mt)"z M\K."z M\K."z M\K.=˻\เM."z Mw0)r"zPm"z MV"z\1MkLի ^]sPIl_H.i5Mo="=WC]16 n.Sz"Ngg'ꍜ݀;44ylqqz"|M9a\^|\"z.Pmx|3U&PZkZ3"VJ3\P;z"\)qףL=kJ,S=꽭"ʵ˾ EKݯ,E4'KHNyV]Em룻ϞoكEބNJ(;ZlCZ 3ECc#`;r˝Nl*yul_복˞ۃrˉNlyzu浵Ki6|D@]zmƾڴ'|mDizڻ+IPD/M̀|9n YΊzLfL!R6 ShK Y=Z?Nkk_1]0"P͂Iٹ \j9{i ZdO UMn˼H; bNI\ _BF $F;y<"n6,|ܵ˾ڽ\K dDi{r tn9U 3 ]T=U3jEYo̽SrzMtlɾڻٍK Lo{mFÛF$Ol ^zZF@Ml.%OlȸFʦԳrMy(l[Ⱦv g"&q5:"pMjʹD f,8dRQ^5m^rVMƲ\F/˾tKNzmiOUPQRS]﮵[kѦrK)Mlt浵&zmDyϴū9Ml︵ڻX/L`0wMyMsll[ڻ⓻Ű懩I,:Fd잖zHJYLJ?Pd^iD+?7@M?l|ކ O5Icc;c{MZk*F0*ӹc<4P=λ!+Fo(BzVͫMPI١ξ-4~P\mNU!)F R"zD?W@}]tMk|݆˻Dn?A=!mF@yXeLfYJ9(PY]?UHM?l\܆AldIn\0Ս0uZY n\z0MPInàIɠINAs`zkUe) 13ir"wa(n`AsUzn*k:ptn # nA#ry`LkL\kN`u$-z:3 e"Vpxhn:# t"f`wsVpxsn2l,`빫LtlܮWt7Q:e .3`wLvly`rlˮW%Q:i5wڻppUW4+~*{*f**f**f *o**f**f(Xn*ot!ԓXDEiynQ<8"!)L0*@bR@7>>O\3)(^ͫMPI١ξ.PܦrKJl\ڻij:͓8Y;N;qoJ\lѺz^Kqnkវ\)pKK3L\3[(K\\Z}X"/XHq\4J\5]pPJdhѵz]qlk(YC\ۮNDwmC8W9X:Y;Z<[޵žڲהԴwmC?@ Aݵžڶ봧wmD= 4$]ƾڰ մwmC>ݵžۻH [bͅwLn,`Y:D`^̽IlKy٬pLbilw#vLn̥2t]Q΁N8`Y,HUD.R,JS HT$H(HpwLng0z\˗HI{)-̬g@j^yz-g*$;J[ki]ΣJ[k;ξjNll Ho\DpwLnLiuZ뿵HKP;[}։ylkލ0);@^NJ}m>M.oylkލ0)0&KB^KP>"RʾڮrIlžۻqd0܄ڪQڪ2یd^R(U,[IV8^0[U4b]!'RlRr7yol0fڻ1݃ԬrHƱolžڸ0˄򻒂ڪQڪ2ی\ >I=lLp)]hs]hGT͢m^~Ǿڽsl;VYn<0TthLYh%J\>s\k]*0tա#',=$0G0uSRMYSIمξ6ڮUkedUҦrKEHl6o段ڻrӦ8H)ol9nQڻvܻ,Z0QLHᆜ o\HV`7 <`fHSrl<,ŋ%/r vHၜ4tfe 8$,U0(,Ugh夜4Y\C[F@,Rd,0^ ,u^kt,4U➜ك,វή{T޵˾ľquQ;.)\\eHqkcJ˥H?U\Hql`nW8rHoHokU\ܾ{Hq^k`[޹x8`H]Hnk)0b]Z*8ڻ+uQ;[ܺr7Glp$մ%)Z8".Qڻu(K ԫ軘\ryG\\:,Dry G\ryG k,2L^m˾tQ;KOTIݹrK6_J0jϪNݹrˤFyͅ[@ryFr`Fly͍L\ ~ŧmmk\븵Qڻt 졛ݸrh5) K)&⸵QڻzttﴃܝrFlhÙv%K"Ǿľ_tQ; Eۙ\rlFrcF\k^"͎MɏM*ṡо>l\rJFC9mlC#ęQڻ tCr3h´!鮵QڻtrFl]7ڿsQ;ܒ" A#Ol!G[{CGvllZMauZP |b 먊e:b6O`6(AB&%<\µQڻs !A#$ÖlۊFo~OzvoFPZa%u*ad{c'aZܺ_d4fb3ۗOł4߭4`B20A<\-˾ڰgsQ;B0)COFk53W2W̞NgFtlvŮd/"4ڸEsQ;nRrrOEl`lbFkZ@ZKZˬZ/i\uL}Fv4doa騊e:``h3p%%"%%"%%"YڷsQ;m"FDFmAM&FƎLa;,NM"PMFƎD,pQڻr򳬰%NcHTIfMp-$"Eba.npE-diEw :s^%(.nwE4^KnӾEl^w2ӭv CiK F LBNFJB峵Qڻr`ZEiEѬ"ƾڵ{rQ;$E&d$uiKFykEk`iFyk'h((bi-a-))b;c>N6ڻOrQ;̂ަrK_Dl\KmyLk"Ⱦ7rQ;KaDrED\klYE]k۲r˥:DKy^'klĞ!\rq,DE]k16<bQڻr˔PɕRɖSIA>L`aC8d^QRT떜 &  gƾڻqQ;n˅eOIRIrܿr־r iC፜h]`^o*宵Qڻq]]Qڻq]\Qڻq]߼]Qڻxq]\a.KlqP;♻\\MaOIRIccEc ̥bCꞜ;\LZѾ n md C>B6!Cc?Dz`KCDmy`[jlp{l`z|Z1{]mdT"STe9n$bD3tr<#y "Tw>a f3jtM:" %"y^jl!ˮ쳵QڻpQwˍwDl:'ڽpQ;̡l/Uw˗4Cnh͵`Sh̗}UCƞ|CR΢M`]r˞Bmyi_[뒕 Z뿵QڻpCLXGLάZC:d@pB[k{iokēK⻵QڻplC4ud4}:DmZC\@Cmkڹ`guZCȡ%ޢ% u"Qڻi`p̗rpBy˗`i!ęǾڽKpQ;!ԝr\WB)dyGinkᛜ\IZξ+4nQڻ,pr=Bl-ilēK⸵QڻupvK޵r˒&Bl7i!ęǾڸpQ;荻r˒B\i恜ZCF!鿉4藜zK9 feQڻo˘ݵr˒Ay˗hK)ǾڸoQ;˚rAl˽hlkė!鳵QڻorAl˩hlēB鸵Qڻo W] wĒAy˗h|gh夜OC[.rkޯB黵Qڻunov ZYUr\yAlzihlkĘ!鸵QڻTo'kZյr˒dAl7Th!ęǾڸ?oQ;rOAl?hlkė!(3)oQ;*K;BA3C 3L3FN3D3HbT54U76U98U;:U(}(Ea̧(BִrAƲÙ? "[뻵Qڻnęl[p(\YRrK@lhNgNfeۿyоgl\2ڳnQ;덻nl`yxZA̍)nlZtj ľP.nK3Ĩ 1`zAJd_`e*|~kY{lu{{_kM`ql9q{_kd`e|yk^kou϶+<,\ǝ\{nMy`{\5R{TQo[ɓˬ)^b T2ڳUnQ;v[RwvUR pUKjeAczZkYƾڸ9nQ;,ŗ렝`kz.Z^xA[2ڳnQ;$[ç, Z5nQڻn☻X E˭inlra٦ĥ@Einm֢hj֠ܮ×jݓfą)oˍtj^TDUݠ݅yR@mRۦrK?lѥ""bYMCNb$b⋹XTE_>(ĞBjx$BUiۥl|ZpizZLhiu$[&@Vn w[@m$Lɛ Hf&!oHX;NPʛjSje)%, ;Dl|$fl~{,_QڻlC2Ψ]LG2nNq>[knyMeYi2n3~,鸵QڻllolmNlijl 6Ƶ1n1ľlQ;͡軚r˥>\N`i[k`̞ia` GVrw>l˷ɂܩ^տr˥0Ih]kL^y]Te˾ڳAlQ;Ԏr`ӾC4i-1Qڻɺ╻5oEՄ(Ԏr`ӾC4i,_l{eiރ^r+PW~^amr*^^a(}Mf,!$FD!fc dnʵڸAGD[:EOǘ껵ڻFB[{:COn f f0 FK.K.xhq}^<d:4J:D+-rh A:d) "-rh *oo"dk >,"dl C = rD5DEl~EJ&nHK"o/,)")   )D<"PL"T   PNO ( +D]y \\`6\]^\S^  ]$#^\  :klkl|lk &7ab0_lklg]_0kkli^e{uc%o&2.fu]^!]$ \"\g`:2i]4d=]k  R  M\fU \Yb d   -& F   ]#c(\]]_   _a^_ g`kkkkkk&\||llИkl,`dhx\.\(]}]$t`fXaXl|{|^d|aTlfa|{f`p^Xi<{^Xi|^Xd,k`k|`\J\ik{\kkkϯfhaP*ftaTk{|l|{"k2ftaTk2k،fq\Nkځ`f`"\l:]iknT\]TBi^Ti&^n4ft`6f\aLl6k̮,"\pkhk.^8k\6\]g&\Njț*00lp:]ż*t~e*J\]^    C \} \]  *J\]^Tr        !\py|\]\\[F".    ,"a]\l\hL]\b\`X_\}\%17\" !((/' \U,0\m 3 !" ]\X:]+]\^`\;  )    *$          (            A| 585  + $ 4/   p\`|%=j\Jh***\Y_] c@*:zjc\^@]a \bn\~:\_`ͮɯI  @]]^::*\`"`]}aedt "*:4{֯Ze*\*] _]\\`_JJ\\`_]]b]J0^V     J!fFm!\a^_+\]\_&Tj\f_Ecy&$Ef:z%^'qrsS֮.Bmʯ.ͲA(p]e^A] `eAeh j_Aa`] ]\I`bLnfH^]Umdb`_eOXd˭H_ _8^^XajMe*D`L_.dd `\^] SSG@>JJpa u*^^zߏ_lׯ䱫׶DvT٠0*wD* {  ֟XD`]]\g]]]\^o*\`\q\aPZaqay\I K\)*Z\*\I+\\YZ\\\:Z\__Q^) \]]]]]]]]_^ \"do   : "_\|\:^\]0\e] ]]d@4PJ*\^]0\[]^]\J*\]@]\`f4*\zJ*\&\d\`*5?\]1#:\p*>:U:#\\f\\p\y\]d*\p\\J +&>]0\\Į<  \]\^]\] \s\]a]a^]z @{:]^x**__h_l_            6|bZk J*\ *\J\*4  \J:\ (*\  (\p:**\pI\  8 (^*\ 8*^ Z:**\**\V:J*\  +):J J:J \J*\pJJ\  (\]0*JZ*J**:J   :]0J)l^i`\^Z\\`^a )J*^ ]]papa*c\*^@\\pJ*_@_O\:e]__`]]` \b_]^ |J@ }H \&^\`hc !      6 Ek*ldwQ?,O? @ JoV` q P@ 0[) QQ T 00K00Q\Q00Q00\Q00T  @POo@U H Z7`z0 SzASzzD S@ zzzzL&2 SzQ0(SzzT0(SP0( zzzz\0(] `I ]ʻ|Hrcc 3.00 Hypo1210PKY, !DiscTree/cfgFileACARC0@Y3PK:H#xX!DiscTree/HelpMsgACARC0B8!3MCMF31/uHQuH_5:9]<$KLr9Vx` GWH3q&$$t-l[4E{9f0mON{,'7‡f P kSKF}8Os BCP(X})x%@>aן IEvvk _{gPB\%@?P}vWblyPz9hXIR ;9PO;'{v5K7'+b>fWNϨHGhkT~4MDg( O;#>zf 2{FߙBg;>Ԯ7qa7'+Pn˶HqϨݧ.mPww;-1h@ [jADrHGh3dԆhbP,#7i,@,#7i,,#7i,,#7i,,#7i,,#7i,,#7i,,#7i,,#7i,,#7i,,#7i,6K<ЄuƁ9W]PO;+9&}fsk®WPw9qOKrON{,zL!qkײ.'wh8c2@\|w]f+L!Q>j׻~dYwj?c8W !>]2>sN~p ~Y~g$>2L!RjHacd|B|u}ζk+=48YO9n?p2Rgޙ]`V!Kα8YO9n?p2Rgޙu`Ia!,u|3>ndd8U|S~p}N;#*7<FTV^adgjmpsvy|  PKU_vv!DiscTree/RestoreImgACARC0CYYI3(-TSK @0S~dtit.3Ӹϋ٪n+r3Gϋ٪c-g8:DCK9ڪA9yWR=9e`a2ƽfe23 scS3e ϋvtrI3 r'3kȢMF0tFt)e3b:r2p"e(hq i3t:i3te# No ib lc#rC 3i4lg#LHQh'Sl$b=cm*/X,ӛRj ;4[I,ӛFjVΜd;`1\p✷Tde ά2kX'Kk1檴 *[Lӳ;%S&^7I߃Ú4dW4 NKU3VBԊomUxxɞ06I}ߚF`؞K.mKĦ}l~đ,+TRe-+Xf.+YfZT\R\\VULk\){>XMmUwI?Pƫm͟SD\VpaVΜo6愈k\ɟ\o^3ٷw\`|\~oI7J8Fm˯,؞K,DF$LZ謠`ŕdB D% 9m [#yJ:t2*.L4OFW,<,A<@CK"L0kPJGm4aTI1,a{V<[~J5TFNd?i̢%)ds"S))Z0arrk\黝̝np휐TSX\UJ{z휞}K8c,I7I7Mtζ;']%0h}]=,YUkʥksά*|FKk7k)άk7Ɯ3\ls^lQ:VkLViL*n?=$=?wݼ]/ YھΉ8 Y|?ql6:V예mACsm\ډk\ LHk7ۅm"ά ʊMN<T;ѻF^T Rlk 9Μ0űpƝikɗ\qΤm٠gάhqΜmΜZk<:>B_,7auSԛjǻ .frQkO8idވOdވOdވOdވOdވYlKJ˓9Ģ OeOe̻]dȄFɽ}W\h\lTT]lzŋk9\KE,X&KbJHDm$T|P8M5f; 542KdoL@?=A 0s'%)%M"BY̓Id@5>xC"vݻmMμ:>jΜvݮ*p0ߣܺ0훣`0>٣Nh[y Uwhq^m,nY6;"n} Uq"^mnmЙhI])whq'm(nYm̽[Uݮ?v"o^ uoqɛט'NFpIƢkeά̑*+:޼ӛh΂;׻[* :mϜ`/HZ*t[)`;׻^ۺ廝Ε偹)K,=wmyΜ=ram$!;%^$FlZ'>nB2^^4^3 \L l4$ſrDwJ@\x2IμAxmruD /\ ŔL\·3͒ќ1Ѓ8N٢Х=6Ҝ/Ӭ$4^|μ EqIPxROE0E8lmT&3{7vʓxƲo/xmxpٰ3dtc,rc$pc$ l,:mx4xxš dΌ{$YܟNMm~r(F]&%!4SݛrΜKm˞)rΜn2\;E3tΜ휛|dy굄Mm,4^IΚƜqv\ffYoΜ*!4n4ά^뀡JmQϬJzP:4ހ ϳ3P˵:m7m |hċYQeظ ^Q̺vԵL2n8Ƒ~sΜZƜkooc,kڭ`.$;;ѻ9%Z\ݮϛmkQμ:>ZΜ7 ܽΜFYΜv %L mװ̑tΜ[NM(FR΄oΠc,J\Lݭ;̻9W)n6mP\mOܽΛqΜmΜܝ^Ϝ AaLkװΜm}ΜΜB_Μvn}6c2c oΜv\;c,Γ\d%]&9^ %KoY#ފmT\֊YΜqm^Ϝ οaLr3t$r*se"=n5*v=)2528&t"B::4;߻TPݭg`F$JLDSw鮾D)ͮKf* S)Q͝o:Ơ6ơ ,Ơ(ơզr. ;dơlٵkٵ9mkٵ8m:mٵ;mFkКmkg dYL/z{ל(Nr,*YDoۜܬoo!ҭ$yV kCD؅ĻL W/3kѢOY0e8:l)p;ؾķt.Y_SpQ!ށmk~ik~Zmjk vr F?y%k2"[ k 圮yI ۋk(\(ZfζnN<lF;A7mYΜL}irΜ9o,g,(ƛl$8'̻>X k^Μk8Ήp٢8ݛ QnΝ&׻TPS1^ecb,VqfP)䙝b^[Μ^Q✅MΜ}T{qΜmΜ펛onΞTxM{˾ PS":T=k%ػ>^݋ml^-Μ,+-ΰu,qΰmxy~/\ kkx~, @,μ+}Μ, yΜuΜ,qΜmΜyr~ μ-ޞ-,qΰm٠xΜ,,,,鴞o_+޴ݛ Wn\$߻ٻBW^Y)P=BlDqr帴#̻,WtΜ/s<+ΰu,qΰmٝsΜs:;,ӛ8eQ!543 MgݡLzşͳɽc1Ϊ˓#X44ZU,{\-4?d[NTI\k,kQKDǷͺsHgnFp#2tGlE3ap v#mni2tA:m7&@8U]]+PMTMu8\Pu8uUTtB]HvLuUXu(s_uΜ,sśp0s_άV|Ljߟb'o1DCNܱhDawYG|Lhߟ`j_ȳ|gߟ_iLsv͡i",q p n m lk(]fOh."Ir89ikf3 @tmt\3֪ r X#ܪ˷m : 7g"ͪu#:ms43rn 3n*r 0H3t6,P(^Eѻ7mM$\ TH3Po]׭Μw`u ]rwǻxyzrۂye۟DųɽE%]Z#uΜw]w`뮺-Tp03P,UoMg˭wuM`DV`Ηur |]wu$ԩv=˵0+[_TjZ~~sv4}^v ~T"T³ɽE%[Z#uΜw]w`뮺͎1˵l˽E*I9ָ7mP@12u˜ggMgћΜ<>ZztPwYά|@˛muߡȽt$zά&El0$"z)ͬLElʕgg7YgWFtΜ dN)> {SXo,@Q"ۺEl8k6ΜT]큏UfM<?K9D0],]f8 bYӻ&6ݳn#kxǻ[߹ΊΉ♵,d \ΐyh \P͏, \k͎sΜzpPZ߼rm\΍Y){@6ČjΜUfͧjȓmcS0̋t~drMs͡DElsQr]@ňhΜUKբyһ+6Ͳݟά^ۨ\ػ[6+ܲb] ά޵ަ^ۤ\PYKPx4СͭLEl߻ 7m' dM\Pm ,LDE,lR,?" EIy7m̻W>E˅:m˼oPl.ûΜtsˡ$HEloΜ7Ōܜ$^tn.(UןΜvˡU $K~DԛIpٜ7mCU7~~U m"Tdl*ά W 9S*Wlύ[ ,)P04,}U0ɟͳKԖEl7SS"*Lά\S7/gLeͳɽE#΃ƺo7m\mnΜn Ɲ<^CF ŌވݪU#K@$ }9t>N|H".grI'\"4ҀCąg.gSg>%"ߦ|d͉|!F6*ڽ.g|آFnax3}3gN.gݿάg  M)-4D-YY 4[Pn,oq"qA l44[mpŞ$qqRUn(gSNMD5 C>8;;`ghK˽E*S7۠,PgݳɽE*ͺ|7m`0nΪqi1@C\0Qƪi1n%Pmȏ\D]g;Μ* E)ͳ #/2e C 3dq γƌϜZ1eg tmϜѬ @^ΉΫgn IL@s JClr} k@ dC OJ}+ \,US ,ҸmΪ Y- {I_/F SK.qZf,S) }w+,ͳK8El7 | ESיkΜW,/ЬX$kYs TNkΜ@K[dXJYkΜ,LNʽ mT(Ƶ'K, t,ɉ"F :"Ab3ά`MQع s"8Bu5UTʓkΜH)Ήd -tܪ'yΜwxyz{ڵ,ųFEI7mPiYغ rePX]ҡ'0xEl7ۜ׻6%\7PB՜3ϧmT_snBnќHLYn✃NPRZM_dеLu"lPcLؽLc\:m b:ɲ:<Oj)\Efs S<ˇYtjcJMqlsn(qΜmΜb4D[t蜮M_h K\FLsnD˧Y蜇lΜPߞcؽLq9MN!Cχ~s^%ΜL(nY-{P_BlPycL8ݻ0dqU~ J0[qΤmY,NmMBmKN#W\l Z:reO#aNi3t I$¡˹'pnP3n1:nlt3r 2ɼGrV2¤%άš˹e$T#nc:t!h2 ͢¡nܯ*Ks8#άá ̐ڪ Ut_3e,ơˡ@̐ڪ%*طT۷P,pK]c'{\Q\f\~\f\\f+\+\\*o\\f\IH#\&CD|Y"D=\FߙuΜmku Smevs@̓kΜ @(qΜmΜctYȽE1k.[7SXhά8iiN㐲kJMʉ`άSp(K_\aQ(\śZX,XU"Xm\É^nĐkJT<\C(U h逑큒킓탔\yh{H?zL?P?\0Ѵ{iq4Q \ôyhD? ѻnH91Phu毴Μ,_pE$1ƺoS7ϖunuFMN˞y(rϜЬ8,ph,r] pz^$p{^(p|^hu0F\7mOuH͔r@H+puL$gNھPN>p puAun5QH)ZPd׺>n>ZR o@Zr>nºԭ>YoR ZeY]͟o kLV",Pf,̳ɽE) ߻K%IPx8o(;<zΜedU [0epΜhfhRU0I])<,)V0T $`:"0q'm(k\,EVEI87m,ͳKEl7I+pyΊ;D F,\x$/;N}+-,V}; T=)Yz&;"ޘނ5~z&ݛYמ+IE|gݳɽE.[7IكƉ)G YE ˦س_+ά*޽]@n=;G,E %EON+0 .KrԻOTS5 $O)#cZŪ̚?檀B7oԛҿ觔;-[PXݸ,dγ3Qdrkm&g^gg.XE`kkGdr,gݳɽE.ˍIƉ.GӜ]R nEgݳɽE.ͺ2k];^8 BҋP,jMH@;4r;X/[@>%ISkΈZiEû ֵ zSn CnƵחk@{2vmى#άp*N7Z7~{;w3*N3{y3Eo> 뉮h;n]4;ѻ]dP]тk!5qΜT Hպˈ vYH>k^FksάR|3XŦ%7X767oΜLUA ۅ_n pY?|Xb\ߛػSQn (_O翥Μ%܍9L ˏy뮞۠kˠmٛˍteG859Ss%ά(V̵sQ툌 g?N׶~Μ [?Ν>Ľ[6㘿DQs?zRףp~Ľ[㢽FQm;;߻T%Pͺα[];DjO(FUPPU((]A]k$Þ(*SQ FYvY JoQNpZ0GA"밪n(o83l;l2c5:Β;߻T%Pa JaNV n ڪMwd[5\ŻyJE%>nxS/E[5- jMTTӒ?LSՁNEyk Ma͞uΜYan֡ޮk x$;̻+4ά*G\4ƝB7m*%ݟͳɽE(;ά γE+5ά48U,0U) Elˑ,EBKά6**ᄆ7mk7ۜ7Imͤ6kMLyΜOJ{庞P`#Bϰktά汞kά랮Tĵk̟Sζ=j٠jΜ0=9TΈ;̻XΞƛk鬵3\p3p)MWcp]"Rwl;5tvw"E%JE AiE&Jӡ8ͮLeuvx!#ME&OEEME M-Wۯ,Ӝs՜v# IE̳E*LlˊꋵU];&܊;&܉꣔;&ͪLޣ;&܉Γa\ңһP%Y_[٨܅sv# EͰLIḚE!ȉLl˨"gI\k 6 9F ?K 7ko%!DǑBc4?3?J=d{T9Oٻˡ˜khkߞT/e]:ea:bp:rfnK3 t"wjy2fB:ta3#:A#%M" 7~XX;(ǝjk:/.TGl]PMaLVkϷ̡JkˣRkʟԳ:m߻~kΌΜ.* ;,W[ݍCd:қK+sڜ~V)좔;2ˠ: F4d ksάškk%.u*Ƣ;,PֈkѻT~7mMұPX!,L])ͳK߽;~mΜxvΒ;lP,̜* ߳罞m$Μ~RΛm$.u(+[p ,ȏ䝳-ά F,Q۾qά)흳i x,aW7Iݟ}B;8KTo,7OxIsKVάn0BO9ξͱ+@A ۾-ά`E&mξp՝AI՜}k, "K۵ Μ{> V)-ᡳ,t"8ݳmε>zΜ+V"ơ;ѻ 3EZ,흳Ӈ4ά ճɾʇk͋+}qqp>nEműIo.}7moPJ;6#S,PԳབmε>wΜM,oԳཀ mFu`;̻[-܁7f, "ֳPEEc me"ϊPΓ#8"6pJݷ޻O#!;һp"6Mۺ/~ -iiucnX7^:mϜ/HZ*[Z$֠;׻^ۺ廝Γ偹 K5뀇wΜpE[L;,[PB^jGV j3KڇΜև@JMEZM4MC3 BZAӬ֝Μ=վοͳɝߐΜgVΜ I✷Ȼ6K0Fn]d妇k{My"ĝkJ@۠oM:a?Gg)S,-VS,+iUN|fT[SM/4V7v;D"5fp7$FDoItD=[O$@ B\L۟;һ6M. Γ[ȟC7fwM߭xni\ L;f ā_DMwki䮛{tnѕ n!Llj,PLܽkɻƜ˹߆qќ ΧWUڏRμٻVΜV_]~\P;!%ngLmiPlܛ,̭Lumʻھv۔lԼgtٞ d%2c/*Ύ@*μdN3ͽ[U͡ݹUgeb~qYΜZN"hTwNzSv _/*4d"ឳ5Pȸɟ)"+5ḼamRھZvvaLTԬڎ˅k%.%%"%%"Y%"mݡCl[tt…EmpΜXaH"tYҸPdiΜpB n~;̻ӻ'&A%HNIIMxIpI-6J""pa"-ЯKb^m F, %0Tma۷Nğ_ִ<od<dp✅``nm(;%@kRcg$CT2L3$ƪ-Smlmb=μssގ>o;oˤ=v^sn띳`,P ۳ʾmˉ<9Ϭw͍rSݷSmˍAAl oՁEHl׃άH]̃m˞mpB7mP,L-EyΧZΆ;5%LWQm,\(عM-Eyk-, ݳɽP}[u梩Y ݟk梪Y(M)sn,C;ݳTmIһ7mV/Q,L=IM;, P7I݉ЬC6FM, G ¥KJ D@gP;,7yV)֜;QK,ݳOIbkM,;ݳЂmIN7mgP;/ }] ѻ79Ƨ#ꧩlgS,Q ]m׻kMQkY,l{IMV;,Q ԳfmI亭kM&r@;P0բ,teuf!gE#K$BEE"GK\Eijj;7mT^q{Ң $`& ;$2ETP,o+ݞkݞk˺mݯkoS!յ,G ۭR mΛ;'EG,ݜځkݜ\Ձ6 mqn%óȽKM>lΦ;SQ ֬{,uJ肶 p! Z{⛮򜞻΀;PT]jVr;^+(;V ;<5me\knМ;UIH{%f;V lV$^,װ,E˵(aN[d$d*ά_ekc̑9޽m̻:ƛ:9_Okc^9ۧmo_&׾c<ؐ͑sEtܻ˜Vc,o$vm1k皳[W-+.*+ 'EeCsJkLNٰ 7ݻX?{m˸u_ ]U `UɱkNΜklO):楚ػ)˻ؾE\ L;%zZDPT]}[k멁kcؾBҺKtsm{?טuΜWzn@]qkw,kO)M򜞚lL;׾ު!pa*b; D#Z!IZ &o鹫KO,c(Qެ-kάgS6k΋Μton ;̻U]NLmM`Vdؽp} lU$tU(L[xSP[|S^[e׀z5eDChݪVr\L鵘xzvP5p|U 5}St^u`zE$MEMZXkW7IݝGΦ;̻o,ܮk,άȫkn S>׾;潼{g-SMWԭ^MSQԴҫk'ά N ;x-Fxf,((Vމ> >,;Iݽϋon7$ vRs,ӛpz(; %l2XP_ͳK,ElSZIN>8mζ7;4mε=3mZ^M霰8'mDY>=ܟƳͽE~$/oqΏ[ʏGΜT%\X4(Cmˣm$gɲqm gfoVg^ ҏNMi?n ȵkfn$]XprYESo"q>%$6א޹zΏmɟsc7Iݝ鬱Ʃ)]:n>˘>ֳEIi~֟7Jߖ^Μ?[ZQfp]^ nϡYckκtp✅ε$U@Rnrη> $9VHpYeHHC[^R Xg tYO>@U r" gnL%5̶FR1,>Π.䗔;P.a,ΜXۍa8rٜ}hkLa bξ;$[??ƭr:?n?nn7In{f̥/>XAD !BDL C.DN&1D#F0DH(D*D1QlM4m65f87 f:9f(;f(Ĥ~d}mΜ)\r;j1P͜ٻةk+ά(ųɽE+y}ƕHQ?7۝뵶-IY,LX۲SX}kˣf~kΜεk,,;PT,ͳK<}El˝oﷵN;KD,PͳLl-Z~k KoΜ7mMٝJj~kZVkDHd,SF 2KFDPlAK}xyꢭѻK|uvRf6m.lf Po oM0d76ih[PԿĺWm 4D<:L"8+&۪ l38d2"۪o "Io۾Plͼ L"q" 06D +D TcWDÂǦs̀X%HT}Tf,N:\;8E$;E$ " #< T $ %l  & ' ( L ?)  *d + ,| - . @ /` 01HA aL0u   {5'j^adM*2**22*6BFJy]\]xkXm\r^2FZ\\$`gH-cb]Ͱ>e,k{{` _k#+ Oe*J_T               & +Vd   |k k` `k_ ?ac_kB_Лll@pk||@0J\_T      #"2       Q%3 \Uz\Y)Ej@ ( NG &B>j˛ dz_/~(5 E ǹ9O E D >5 3_*1+ 嚇ma3*^CնEd)\ RRjh ްJ!^ŵDa^3&䬗le `&wF @i^L Lp_ YS  z>*\U<,\\]*) 2\ 0_      pA ~\ʀ\\j \{\k]|ol]kl    0\\J*d`*a ]d`*a e)a kk k k  k  k ] {k \k \xc``hes @<&kwݮBZ\qg_@F{  \`,]]]^  _L\ k2\ k6\ kl {kk &b`:oӛ_0k>\kNkklk\{c|lџ%l4_폯*.fu`D \"\g_Q\*2j鮿=]k 1 ).d]\T b d  -" F   _`L\]]_  \_2g *g_kbe7_gkkk \{|lllllp:{1PK !DiscTree/Templates/BackupACARC0A3\AskForDisc 0 5NotEmpty A0@Pbkfile f,radl\ =8N=L2Ht9_'t9F =QUIT L ed> Message from Backup Previous disc full Please insert a floppy disc into drive 0 to be used as backup disc number: 9999 |p =D=(X9!L0=OK titled> 0=CANCEL ed> Message from Backup The disc you have inserted is not empty Delete the contents of the disc? ll =0L=OK titled> =QUIT tled> P=  D9To file: > L(= NAMessage from Backup 1234567890123456789012345678901234567890123456789012345678901234 L PK4]99!DiscTree/Templates/DiscTreeACARC0A3cTreeViewer 7QuitQ PLoadMsg R SearchMsg ArcTreeInfo yeFoundViewer fileTypes vSaveAs Ll 1 XQtreeviewer  = 0&=YES itled> *&=NO titled> ProgName ? l40 0 =\HDxpMessage from DiscTree Analysing Disc xxxx::DDDDDDDDDDD.  =0Searching Ws~\.for itled> (4X Message from DiscTree xxxx::DDDDDDDDDD. 0123456789 H (@=X Name: led> 0=DiscTree >  Purpose: > 0=k dAuthor: d> d0= 0`Version: > 00`=About this program File/Disc Maintenance Mitre Software Ltd. D| =X2Found Viewer Z$,x 0File Types e!9 ck tled>  1All. 678 > J>ttX=0Save as: > eP:`file_d73 >  `=`=OK titled> ScriptFile PKOK)!DiscTree/Templates/restoreACARC0Ad3Flocked RITERestoreInfo olAskRestoreS XRestore _%033ThisBackup AskRestVS _S |AskRestoreB _Pbkfile NSPRI"J| =d9 =.=Message from Restore Overwrite LOCKED File ? 012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 L 10:10:10 04 Nov 1988 v@ (@=X Name: led> 0=Restore >  Purpose: > 0=k dAuthor: d> d0= 0`Version: > 00`=About this program Restore Backup Files Mitre Software Ltd. ,N =p9- T =;(L=b9 x$=U @p=WMessage from Restore Restore File: 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 L 10:10:10 04 Nov 1988 to 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456 L 10:10:10 04 Nov 1988 ^ 0=Restore d> ed< \=X 1Backup of: =i 9{= d1On: itled> d= 0`1 0`= This backup disc adfs::MitreDevel. Using script: 10:12am 22rd September 1988 Disc Number: "XJ =p9- =;@&L |={XI9 =@$ =Message from Restore Restore File: 012345678901234567890123456789012345678901234567890123456789012 10:10:10 04 Nov 1988 to 012345678901234567890123456789012345678901234567890123456789012 10:10:10 04 Nov 1988 "L<xPK~K{XXA300/400/1/HARD_DISC/DHFORMACARC0A3; >DHFORM A This is a derivation of HFORM 1.72. modified for use in the @ dealer test software suite by B. Rice Acorn COmputers Ltd. (D This program has been renamed DHFORM, the D signifying DEALER. 2; The program version number is 1.72D dated 5-July-1989 0 GoodDefects T~C  OldShape *)Op(Verify%,0,0,SecSize%*SecsPerTrk%) 4 ConfirmMake DpC > AskMake H I%=0 BootSize%-4 R Boot%!I%=0 \ I% fInitBootDefects pFormatted%=(Result%=0) z AskShape A "Do you want to soak test the hard disc for defects (Y/N)"; SoakFlag%=Choose("YN")="Y" B "Are you certain you want to format drive ";Drive%;" (Y/N)";  Choose("YN")="N"  ("*DIR :0.A300/400/1")  "MAIN_MENU"   MoanOp(Specify%,0,0,0)  :  OldShape SecsPerTrk%=BootRec%?1 Heads%=BootRec%?2 Log2Alloc%=BootRec%?5 DiscSize%=BootRec%!&10 $3Cyls%=DiscSize% (SecSize%*SecsPerTrk%*Heads%) .'LowCurrentCyl%=(BootRec%!-8) &3FF 8$PreCompCyl%=(BootRec%!-6) &3FF B8ParkCyl%=(BootRec%!-4)(SecSize%*SecsPerTrk%*Heads%) LInitDiscRec V `: j AskMake t ~ Makes%=0   Make$  Makes%+=1  ;Makes%;". ";Make$  I%=1 MakeParams%  A$  I%  Make$="OTHER" 8Make%=InputDec("Which make of hard disc ",1,Makes%)   I%=(Make%-1)*(MakeParams%+1)  ȕ I%>0  A$  I%-=1  N Make$, SecsPerTrk%, Heads%, Cyls%, LowCurrentCyl%, PreCompCyl%, ParkCyl% ( Make$;" chosen" 2 <: F ConfirmMake P Z) Make$, P1%, P2%, P3%, P4%, P5%, P6% d Make$="OTHER" "The shape written on the disc does not match any of the standard drive shapes": "known by this program. Do you wish to retain this shape (Y/N)";:=Choose("YN")="Y" nq P1%<>SecsPerTrk% P2%<>Heads% P3%<>Cyls% P4%<>LowCurrentCyl% P5%<>PreCompCyl% P6%<>ParkCyl% DZE xp "The shape written on the disc matches that of a ";Make$;" disc"'"Do you wish to retain this shape (Y/N)"; =Choose("YN")="Y" :  AskShape 9 : : =&1E6 NewMap%=: d\E :;" @ ";: ș "XFileCore_Create", 0  > char%=(StrAsk("Old or New map format (O/N)","N")) &DF  char%="O" char%="N" NewMap%=(char%="N") 5SecsPerTrk%=Ask("Sectors per track",SecsPerTrk%) DiscRec%?1=SecsPerTrk% Heads%=Ask("Heads",Heads%) DiscRec%?2=Heads% !Cyls%=Ask("Cylinders",Cyls%) /DiscSize%=SecSize%*SecsPerTrk%*Heads%*Cyls% DiscRec%!&10=DiscSize% ">LowCurrentCyl%=Ask("Low current cylinder",LowCurrentCyl%) ,=0  sector%=sector% 320   sector%=-sector%  A defect%=((cyl%*Heads%+head%)*SecsPerTrk%+sector%)*SecSize%  opt$="B"  AddPhysDefect(defect%)  " RemovePhysDefect(defect%)   "C":  NewMap% : AddPhysDefect(InputHex("Disc address in bytes"))   "If the ADFS gives an error such as 'Disc error 13 at :4/00012A00' then 00012A00 is a logical disc address. The logical to physical disc address mapping depends on the defect list. ";  " When these defects are added to the defect list, it is important that they are added in DESCENDING order BEFORE the list is changed in any other way!"  N AddPhysDefect(LogToPhys(InputHex("Logical disc address in bytes"))) * 4 > opt$="A" H I%=0 DiscStruc%-4 4 R BootRec%!I%=DiscRec%!I% \ I% fInitHardDesc p z:  Format =0  I%,J%,cyl%,head% MoanOp(Specify%,0,0,0) MoanOp(Restore%,0,0,0)  "Formatting" * I%=0 512-4 4:Buf%!I%=&077F03FF:  cyl%=0 Cyls%-1  13:cyl%;  head%=0 Heads%-1 , cyl%=0 head%=0 Formatted% TZI  J%=cyl% (head%<<24) < I%=0 (SecsPerTrk%-1)*4 4:Buf%!I%=J% (I%<<14): H Op(WriteTrack%,(cyl%*Heads%+head%)*SecsPerTrk%*SecSize%,Buf%,512) 0 Result% ;" format error on this track"  $ . 8 B: L Verify Vd SoakFlag% '"PRESSING THE SPACE BAR WILL CAUSE THE SOAK TEST TO END AT THE END OF THAT CYCLE" `" add%,ptr%,sector%,head%,cyl% jCycle%=1:ErrorCycle%=-100 t(CylSize%=SecSize%*SecsPerTrk%*Heads% ~!suspects%=0:MaxSuspects%=1000 G CylBuf% CylSize%+4, SusAdd%(MaxSuspects%), SusCount% MaxSuspects%   Cycle%>1  I%=Cycle% Patterns%  I%>1  J%=Pattern%(I%) # J%=(J%>>>1) ((J% 1)<<23)  Pattern%(I%)=J%   J%=(&1000000)-1  / SoakFlag% "Writing pattern &";~J% 2 I%=CylBuf% CylBuf%+CylSize% 3:!I%=J%: ptr%=0 5 Formatted% add%=SecSize%*SecsPerTrk% add%=0  (2 CylEnd%=add% - (add% CylSize%) + CylSize% 2 defect%=Defect%!ptr% < defect%>CylEnd% F length%=CylEnd%-add% P Z length%=defect%-add% d n! Op(Write%,add%,0,length%) x Result% / add%=(ErrDiscAdd% &1FFFFF00)+SecSize%   add%+=length%  . add%=defect% add%+=SecSize%:ptr%+=4  add%>=DiscSize%  " SoakFlag% "Verifying"  add%=0:ptr%=0  MoanOp(Restore%,0,0,0)   ȕ Defect%!ptr%DiscSize% " length%=DiscSize%-add% , 6 length%=defect%-add% @ J! Op(Verify%,add%,0,length%) T Result% ^# add%=ErrDiscAdd% &1FFFFF00 h Try%=0 r | Try%+=1  MoanOp(Restore%,0,0,0) Op(Verify%,add%,0,&100)  Result%=0 Try%=5  Result% Try%+=1  sector%=add% SecSize% " head%=sector% SecsPerTrk% $ sector%=sector% SecsPerTrk%  cyl%=head% Heads%  head%=head% Heads% ; "Cyl=";cyl%;" Head=";head%;" Sector=";sector%;" "; sus%=0 8 ȕ sus%add%:sus%+=1:  sus%=suspects% " suspects%=MaxSuspects%  sus%=(MaxSuspects%)-1  & suspects%+=1 0 : SusAdd%(sus%)=add% D SusCount%?sus%=0 N X score%=2^(Try%-1)-1 b$ SoakFlag% score%=score%*4 l SusCount%?sus%+=score% v SusCount%?sus%>30  "defect ";  SoakFlag%  ("TIME")  AddPhysDefect(add%)  ErrorCycle%=Cycle%   SoakFlag% ' =0: >500: 13:(39);:13 " ;Try%;" retries needed"    add%=add%+SecSize%  *! add%=add%+length%+SecSize% 4 > add%>defect% H ptr%+=4 R \ add%>=DiscSize% f SoakFlag% p z Key%=(0)  Key%=-1 Key%=32  done%=(Key%=32)  done%=Cycle%>ErrorCycle%+2   Cycle%+=1 done%  :  Structure  NewMap%  NewStructure   OldStructure   $: . OldStructure 8WriteDefectList BWriteOldFsMap LWriteRootDir V `: j NewStructure tZone0Bits%=60*8 ~ZoneBits%=SecSize%*8 2 Log2Alloc%<8 Log2Alloc%>12 Log2Alloc%=10 : allocation size loop ; Alloc%=Ask("Large file allocation unit",2^Log2Alloc%)  Log%=7   Log%+=1  Alloc%=2^Log% Log%=13 , Log%=13 : restart alloc size loop  Log2Alloc%=Log%  MapBits%=DiscSize% Alloc% ! RoundSize%=MapBits% * Alloc% 4 BestZones%=1 << 30 : init to rogue values  BestCylOff%=1 << 30   DummySpare%=1 1 2 SpareBits% = 4*8 ZoneBits%-Zone0Bits%-8*8  CalcZones ( LinkBits%=10 2 LinkBits%+=1 < CalcIds F Ids%<=2^LinkBits% PA SpareBits%-4*8>0 SpareBits%-4*8<=LinkBits% SpareBits% Z5 OddBits%>0 OddBits%<=LinkBits% SpareBits% d# LinkBits%>15 Zones%>127 n$ "Allocation unit too small" x Log2Alloc%+=1  DummySpare% & : restart alloc size loop   Zones% <= BestZones% * Crucial%=Zones%*SecSize%*2+DirSize% / MapZone%=0 Crucial%=BootAdd%+BootSize% D Crucial%=EndDefect% (defect%>=MapAdd% defect%=EndDefect% CylOff%0 Crucial%+=Alloc%-Crucial% Alloc%  MapZone%=0 # RootDirAdd%=BootAdd%+BootSize% > IndRootDirAdd%=&200 + (BootAdd%+BootSize%) SecSize% + 1  " RootDirAdd%=MapAdd%+MapLen%*2 # IndRootDirAdd%=&200+Zones%*2+1  &DiscRec%?4=LinkBits% 0DiscRec%?5=Log2Alloc% :DiscRec%?9=Zones% D DiscRec%?&A=SpareBits% 256 N DiscRec%?&B=SpareBits% 256 XDiscRec%!&C=IndRootDirAdd% bBootRec%!4=DiscRec%!4 lBootRec%!8=DiscRec%!8 vBootRec%!&C=DiscRec%!&C " I%=0 Zones%*SecSize%-4 4  Buf%!I%=0  I%  I%=0 60-4 4  Buf%!(I%+4)=DiscRec%!I%  I% WriteDefectList  "Creating Map"  ptr%=0 DefectStart%=0 %DiscEndBit%=DiscToMap(DiscSize%) ZoneStart%=Buf% ZoneStartBit%=0  zone%=0 Zones%-1  $ !ZoneStart%=1<<(15+FreeLink%*8) ( ZoneEndBit%=ZoneStartBit%+ZoneBits%  / UsedZoneEndBit%=ZoneEndBit%-SpareBits%+4*8 *$ UsedZoneEndBit%>DiscEndBit% 4! UsedZoneEndBit%=DiscEndBit% > H' PreFree%=ZoneStartBit%+FreeLink%*8 R ZoneBit%=ZoneStartBit%+4*8 \ zone%=0 f" ZoneBit%=ZoneBit%+Zone0Bits% p+ length%=(BootAdd%+BootSize%) Alloc% z/ length%DefectStart% , DefectStart%=DiscToMap(Defect%!ptr%) ( DefectStart%>=UsedZoneEndBit%  DefectStart%=ZoneEndBit% $ .! DefectEnd%=DefectStart%+1 8 ptr%+=4 B L done1%= V ` done2%= j. NextDefect%=DiscToMap(Defect%!ptr%) t) NextDefect%ZoneEndBit%-(LinkBits%+1) . NextDef%=ZoneEndBit%-(LinkBits%+1)   NextDef%=NextDefect%  . NextDef%-DefectEnd%DefectEnd% % DefectEnd%=NextDefect%+1   ptr%+=4  done2%=    done2%  0 DefectEnd%-DefectStart%ZoneEndBit% (! DefectEnd%=ZoneEndBit% 2 < done1%= F PK DefectEnd%>ZoneEndBit%-(LinkBits%+1) DefectEnd%<>ZoneEndBit% Z DefectEnd%=ZoneEndBit% d done1%= n x0 DefectEnd%-DefectStart%DefectStart% "PROGRAM ERROR 1": B DefectStart%-ZoneBit% <= LinkBits% DefectStart%=ZoneBit%  DefectStart%>ZoneBit% - WriteLink(PreFree%,ZoneBit%-PreFree%) ( DefectStart%>=UsedZoneEndBit% 7 WriteLength(ZoneBit%,UsedZoneEndBit%-ZoneBit%) ' ZoneEndBit%>UsedZoneEndBit% & WriteLink(UsedZoneEndBit%,1) B WriteLength(UsedZoneEndBit%,ZoneEndBit%-UsedZoneEndBit%)   "4 WriteLength(ZoneBit%,DefectStart%-ZoneBit%) , 6 PreFree%=ZoneBit% @ J" DefectStart%UsedZoneEndBit%-(LinkBits%+1) ^ DefectEnd%=ZoneEndBit% h r! WriteLink(DefectStart%,1) |9 WriteLength(DefectStart%,DefectEnd%-DefectStart%)  ZoneBit%=DefectEnd%   ZoneBit%=ZoneEndBit%   ZoneBit%=ZoneEndBit%  WriteLink(PreFree%,0)  zone%=0  ZoneStart%?CrossCheck%=&FF   ZoneStart%?CrossCheck%=0  2 ?ZoneStart%=NewMapCheck(ZoneStart%,SecSize%) # ZoneStart%=ZoneStart%+SecSize%  ZoneStartBit%=ZoneEndBit%  zone%  "Writing map" &(MoanOp(Write%,MapAdd%,Buf%,MapLen%) 00MoanOp(Write%,MapAdd%+MapLen%,Buf%,MapLen%) :WriteRootDir D N: X CalcZones b#UsedBits%=SecSize%*8-SpareBits% l1WholeZones%=(MapBits%+Zone0Bits%) UsedBits% v.OddBits%=(MapBits%+Zone0Bits%) UsedBits% 8 OddBits% Zones%=WholeZones%+1 Zones%=WholeZones% MapZone%=Zones% 2  MapZone%=0  MapAdd%=0  3 MapAdd%=(UsedBits%*MapZone%-Zone0Bits%)*Alloc%  MapLen%=Zones%*SecSize%  :  CalcIds )IdsPerZone%=UsedBits% (LinkBits%+1) =Ids%=IdsPerZone% * WholeZones% + OddBits% (LinkBits%+1)   :  DiscToMap(discadd%)   bit%,zone% *'bit%=(discadd% Alloc%)+Zone0Bits% 4zone%=bit% UsedBits% >/bit%=bit%+(bit% UsedBits%)*SpareBits%+4*8 H = bit% R: \ WriteLink(off%,link%) f. link%>=2^LinkBits% "PROGRAM ERROR 2": p bit%,add%,mask% zbit%=off% 8 add%=Buf%+off% 8 mask%=2^LinkBits%-1 1!add%=(!add% (mask%<>>16) V'check%=(check% (check%>>>8)) &FF `"Boot%!ptr%=EndDefect% check% jSum(Boot%,BootSize%) t,MoanOp(Write%,BootAdd%,Boot%,BootSize%) ~ :  WriteOldFsMap  "Writing free space map"  s%,I% s%=OldMapSize% 2 * I%=0 OldMapSize%-4 4:Buf%!I%=0: !Buf%=OldLWM% &100 8Buf%!s%=(DiscSize%-OldLWM%-Defects%*SecSize%) &100 !!(Buf%+s%-4)=DiscSize% &100 %!(Buf%+OldMapSize%-5)=(&10000)-1 !(Buf%+OldMapSize%-2)=3 Sum(Buf%,s%) Sum(Buf%+s%,s%)  /MoanOp(Write%,OldMapAdd%,Buf%,OldMapSize%)  : ( WriteRootDir 2 "Writing root directory" < BF% F' I%=0 DirSize%-4 4:Buf%!I%=0: P NewMap% Z $DirMark%="Hugo" d n $DirMark%="Hugo" x Buf%!1=!DirMark% BF%=Buf%+DirSize%  NewMap%  BF%!-38=IndRootDirAdd%  " BF%!-38=IndRootDirAdd% &100  BF%?-35="$" BF%?-16="$" BF%!-5=!DirMark%  check%=0 CheckPut(!Buf%) CheckPut(Buf%?4)  I%=BF%-40  ȕ I%3  CheckPut(?I%) " I%=I%+1 , 6ȕ I%>>16) h'check%=(check% (check%>>>8)) &FF rBF%?-1=check% |-MoanOp(Write%,RootDirAdd%,Buf%,DirSize%)  :  LogToPhys(add%)  ptr%  ptr%=0 ȕ add%>=Defect%!ptr%  ptr%=ptr%+4  add%=add%+SecSize%   =add% :  AddPhysDefect(add%)  ptr%,ptr2%,defect%  Defects%=ptr% l& Defect%!(ptr2%+4)=Defect%!ptr2% v ptr2%=ptr2%-4   Defect%!ptr%=add%  Defects%=Defects%+1    "Defect list full"   :  RemovePhysDefect(add%)  ptr%,ptr2%,defect% ȕ Defect%!ptr% H Defects%=Defects%-1 R \" "Defect not in defect list" f p z:  GoodDefects  ptr%=-4  check%=0  last%=-1  good%=   ptr%=ptr%+4  defect%=Boot%!ptr%  defect%<=last% good%=  last%=defect% , defect%= EndDefect%) good% Defects%=ptr%4 !check%=check% (check%>>>16) 'check%=(check% (check%>>>8)) &FF T= good% ((defect%&FF) = check%) (sum(Boot%,BootSize%)=Boot%?(BootSize%-1)) $: . InitDiscRec 8 I%=0 64-4 4 B DiscRec%!I%=0 L I% V?DiscRec%=Log2SecSize% `DiscRec%?1=SecsPerTrk% jDiscRec%?2=Heads% tDiscRec%!&C=IndRootDirAdd% ~DiscRec%!&10=DiscSize% DiscRec%!&14=(&10000)-1 &$(DiscRec%+&16)="HardDisc"+Drive% DiscRec%?&22=Drive%  :  InitBootDefects !Boot%=EndDefect% Defects%=0 InitHardDesc  :  InitHardDesc .BootRec%!-&10= &00000000 : SL xxxxxx  6BootRec%!-&C = &0D0C200A : GPL2 GPL3 SH GPL1 9 BootRec%!-&10= &16000000 slow stepping alternative 9 BootRec%!-&C = &0D0CA80A slow stepping alternative (5BootRec%!-8 = LowCurrentCyl% (PreCompCyl%<<16) 27BootRec%!-4 = SecSize%*SecsPerTrk%*Heads%*ParkCyl% < F: P Ask(String$,Default%) Z X,Y,reply$,value% d :11 n String$;" ?"; xX= Y=  X,Y);Default%;X,Y);  *FX 15,1  ""reply$  reply$=""  value%=Default%   value%=(reply$)   X,Y);value%;3  = value% :  StrAsk(String$,Default$)  X,Y,reply$  String$;" ?"; X= "Y= , X,Y);Default$;X,Y); 6 ""reply$ @# reply$="" reply$ = Default$ J X,Y);reply$;3 T = reply$ ^: h" InputDec(String$,min%,max%) r reply$,value% |* String$;" (";min%;" to ";max%;" ) ";  reply$  value%=(reply$) ! value%>=min% value%<=max%  = value% :  InputHex(String$)  reply$,value%  String$;" &";  ""reply$ =("&"+reply$) :  Choose(opt$)  reply$   reply$  (reply$)=1 &reply$=((reply$)&DF) 0 opt$,reply$) : =reply$ D: N CheckPut(I%) XBcheck%=(check% >>> 13) ((check% (2^13-1)) << (32-13)) I% b l: v sum(base%,len%) sum%=0:c%=0  I%=len%-2 0 -1 sum%=sum%+base%?I%+c% + sum%<&100 c%=0 sum%=sum% &FF:c%=1  I% =sum% :  Sum(base%,len%) #base%?(len%-1)=sum(base%,len%)  : & NewMapCheck(B%,C%)=(NewCheck%) : ! Asm !  opt%=0 2 2 ! P%=mc% !  [ OPT opt% !*.NewCheck% !4 MOV R0,#0 !> ADDS R2,R1,R2 \C=0 !H .loop% !R LDR R3,[R2,#-4]! !\ ADCS R0,R0,R3 !f TEQS R2,R1 !p BNE loop% !z R3,R3,#&FF ! SUB R0,R0,R3 ! R0,R0,R0,LSR #16 ! R0,R0,R0,LSR #8 ! R0,R0,#&FF ! MOVS PC,R14 ! ] ! opt% ! !: ! DisableEscape !+ș "XOS_Byte",200,1,0 R0,OldEscState% !5ș "XOS_Byte",247,%10101010,0 R0,OldBreakState% ! ": " RestoreEscape "$ș "XOS_Byte",200,OldEscState%,0 "$&ș "XOS_Byte",247,OldBreakState%,0 ". "8: "B MoanOp(b%, C%, D%, E%) "LPș AdfsSwi%, 0, b% AltDefectBit% (DiscRec%<<6), C% Drive%<< 29, D%, E% "V "`: "j Op(b%, C%, D%, E%) "tvș AdfsSwi% (1<<17), 0, b% AltDefectBit% (DiscRec%<<6), C% Drive%<< 29, D%, E% Result%, R1%, ErrDiscAdd% "~ Result% " Result% (1 << 31) "( "Error &";~Result% &3FFFFFFF: " "- ((!Result%) &FFFFFF)=AdfsDiscErr% " Result%=Result%?3 " "! "Error &";~!Result%;" "; " I%=4 " ȕ Result%?I% " Result%?I% " I%=I%+1 " # #  # # #( #2 #<: #Fy Manufacturer, Sectors per track, heads, cylinders, low current cylinder, precompensation cylinder, parking cylinder #P> 20Mb Western Digital/Tandon, 32, 4, 615, &3FF, &3FF, 663 #Z> 20Mb Miniscribe, 32, 4, 615, &3FF, 128, 663 #d> 20Mb NEC, 32, 4, 612, &3FF, 256, 672 #n> 20Mb Olivetti, 32, 4, 612, &3FF, 128, 670 #x> 53Mb Rodime, 32, 7, 872, &3FF, 650, 871 #O OTHER, 32, 4, 612, &3FF, 128, 611:REM MUST BE LAST #[ For slow stepping drives you will need to use the alternate lines in PROCInitHardDesc PK'UC=vvA300/400/1/HARD_DISC/DSOAKACARC0A; >DSOAK ?Dealer= : If Dealer then attempt to return to main menu. FWist= : If Wist then winnie only,if NOT Wist do whole soak test (8WIST%=0:WinAcc%=50000:flopAcc%=20: Wist WIST%=1 2M************************************************************************ In WIST mode it responds to keys H, Q and T  Mods end. C Mods. for 2.12 - restore keyboard after termination. C Mods. for DEALER S/W Version 2.13 by B. Rice 21-6-89 G Mods. Change path and file name of exit if dealer is set F File name changed to DSOAK. Ensure that Q to Quit D works properly. Removal of the warning re-data. = Ensure that noretries ADFS is installed. C Mods. for DEALER S/W Version 2.14 by B. Rice 30-6-89 L Addition of procedure to read and check the name of the "J disc in drive 0 to ensure that the correct disc is in ,1 the drive before continuing. 6L*********************************************************************** @ *FX 7 3 J *FX 8 3 Tver$="2.14 Dealer" ^date$="30-June-1989" hC filength(20):Timeset=0:STM$="":et%=&FF:ferr%=0:term%=:A$="" r7*KEY 1 FORI%=0TO&3FFSTEP4:PRINT~I%,~!(I%+Buf%):NEXT |M Sec Hd Cyl Map Dir Park PCC LCC Type serial no. L DefaultShape, 32, 4, 615, 0, &400, 663, 613, 613, "Default","00000000" C Testtime(hr), Retries, Defects, Re-reads, MaxFails, Writes ? 12, 5, 20, 20, 5, 20  Format, 1024, 5, 2, 0, 2 : ;adfs$="": Wist adfs$="NoRetries" adfs$="NoRetries" ("*RMLOAD "+adfs$)  OSCLI("*RMKILL HardDisc") ("*RMREINIT ADFS") 12 :  Wist win_to_mem J''''''''''''''" INSERT SCRATCH DISC NOW"  Init  Wist Warning :Screen:display_errors & Wist :*FX 2,0 0 assm :DInitAltDefectList : Create blank alternative defect list D0InitAltDiscRec : and disk record. NCGetShape : Specify,Restore,read in defect list X!display_errors:Displayparms b: l Wist v (-85) Hacker:  : =0   test  timeout=  timeout :  abort Terminate * 130: 0:0,11);240," ");:termseq= G0,11);"Termination sequence running";:timeout=: 128: 2:term%= =Pattern=&4E4E4E4E:write_surface:read_surface:Structure : " abort abort=207:Terminate  : display_errors  3 130: 0:0,12);"Test Completed Succesfully." *I%=116:"PASS ";:I% 4 128: 7:0,tlin%);""; > Dealer H "DIR:4" R \ Wist mem_to_win f *FX 21,0 pQ%=4 z et%=&EE  Wist ramtest 4seek_track(Seek%,Parkcyl%*&8000,Buf%,blocklen%)  Wist  *FX 2,0  *FX 12,0   Dealer    a$=  a$=" "  check_name  disc_ok=  ("*DIR :0.A300/400/1")  "MAIN_MENU"  $: .: 8 check_name BL This procedure will check that the name on the disc is that for the L dealer test disc. V disc_name$="" ` ("*DIR :0") j- ș "OS_GBPB",5,0,disc_name% R0,R1,R2 t length%=disc_name%?0 ~ I=1 length% . disc_name$=disc_name$+(disc_name%?I)  I / disc_number$=disc_name$,number_length%) 1 disc_version$=disc_name$,version_length%) # disc_number$=ref_number$  disc_number%=   disc_number%=  & disc_version$>=ref_version$  disc_version%=   disc_version%=  + disc_number%= disc_version%=  disc_ok= ( 2 disc_ok= < F P Z test d ftime= n x6 Pattern=&0DB60DB6:write_surface:read_surface 6 Pattern=&0B6D0B6D:write_surface:read_surface 6 Pattern=&A5A5A5A5:write_surface:read_surface  I1%=0 " ȕ (abort=0) ( timeout) 4 Pattern=(I1%<<24)+(I1%<<16)+(I1%<<8)+I1% ( write_surface:read_surface ' I1%=I1%+1: I1%=&FF I1%=0   abort timeout  :  write_surface  abort timeout  C4%,L1%);"Write "; 9 C4%,L1%+1);"&";8-(~(Pattern)),"0");~Pattern; H !fcaddr=Buf%:!fclength=&2000:!fcdata=Pattern: flushbuf:track%=0 " , term% comms 6 track%=track%+1 @% C4%,L1%+2);track%;" "; J8 PROCseek_track(Seek%,staddr%,Buf%,blocklen%) T write_track ^% termseq display_time h7 (track%=(NoCyls%*NoHeads%)-1) abort timeout r |:  read_surface  abort timeout  C4%,L1%);"Read "; 9 C4%,L1%+1);"&";8-(~(Pattern)),"0");~Pattern; ! track%=(NoCyls%*NoHeads%)   term% comms  track%=track%-1 % C4%,L1%+2);track%;" "; 8 PROCseek_track(Seek%,staddr%,Buf%,blocklen%)  read_track % termseq display_time $ (track%=1) abort timeout  :  write_track & abort timeout 0- staddr%=track%*&2000:eot%=staddr%+&1FFF : D check_track N< blocklen%>0 Op(Write%,staddr%,Buf%,blocklen%) XP staddr%=staddr%+blocklen%+&100: move to start of next potential block b% ( Split) abort timeout l v:  read_track  abort timeout - staddr%=track%*&2000:eot%=staddr%+&1FFF   check_track  blocklen%>0 F !fcaddr=Buf%:!fclength=&2000:!fcdata=&12345678: flushbuf  : H I%=0 &1F00 &100:!(Buf%+&1F00-I%)=I%+&100:I%:markers  : : Op(Read%,staddr%,Buf%,blocklen%):!fcerrors=0 M !fcaddr=Buf%:!fclength=blocklen%:!fcdata=Pattern:CALL checkbuf ' !fcerrors<>0 abort=203   Q staddr%=staddr%+blocklen%+&100: moveto startof next poten. block % ( Split) abort timeout   *: 4! seek_track(b%, C%, D%, E%) > abort timeout H\ ș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result% R2 Result% good_seek=:seekerr%=seekerr%+1 \( seekerr%>AllowSeek% abort=306 f p: z check_track Split=:ptr%=-4   ptr%=ptr%+4 L (Defect%!ptr%>=(1<<29))((Defect%!ptr%>=staddr%)(Defect%!ptr%<=eot%)) > (Defect%!ptr%>=staddr%) (Defect%!ptr%<=staddr%+eot%) % blocklen%=Defect%!ptr%-staddr%  Split=  + blocklen%=((track%+1)*&2000)-staddr%   :  Op(b%, C%, D%, E%) oș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result%,A,ErrDiscAdd%,R3%,R4%  Result% 7 b%=Write% werror_handler error_handler $ . 8: B werror_handler L+ ((!Result%) &FFFFFF)=AdfsDiscErr% V Wist ` Result%=Result%?3: 11 j/ cyl%=track%4:head%=track%-(cyl%*NoHeads%) t1 erc%,erl%);4-((cyl%)),"0")+(cyl%);" "; ~5 erc%+5,erl%);2-((head%)),"0")+(head%);" ";  erc%+8,erl%);"Wr"; ; erc%+11,erl%);2-((Result%*4)),"0")+~(Result%*4); 4 erl%=erl%+1: erl%>31 erc%=erc%+16:erl%=L2%+1  erc%>70 erc%=C5%+1  G 1:wrterr%=wrterr%+1:display_errors: wrterr%>AllowWrt%abort=311  2   abort=210:   :  error_handler $ 1:retries%=MaxRetry%:abort=416 + ((!Result%) &FFFFFF)=AdfsDiscErr%  Result%=Result%?3 ( 2 abort=210: < F: P% Synthesize R4% from buffer data Z R4%=&2000 d ȕ !(Buf%+&2000-R4%)<>R4% n R4%=R4%-&100 x : " (Result%=&12) R4%=R4%+&100 " (Result%=&10) R4%=R4%+&100 " (Result%=&08) R4%=R4%+&100 / Compensate for ECC errors (Don't ask !!!) : 7sector%=((staddr%+&2000-R4%)&100)-(track%*SecTrk%) P IF(sector%<0)OR(sector%>31) THEN PRINT"Bad sect with result "~Result%:STOP FC%=staddr%+(sector%*&100):E%=&100: Limit retry to sector in error MD%=Buf%+(sector%*&100):blocklen%=(((blocklen%-R4%)&100)*&100): adjusted I%=-1   I%=I%+1 A (I%>AllowReRd%) (ReRdLog%(I%,0)=0) (ReRdLog%(I%,0)=C%)  ReRdLog%(I%,0)=C% % ReRdLog%(I%,1)0 |2 retries%=retries%-1:rereads%=rereads%+1 ) Wist 10:track_print: 1 v ș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result%,A,ErrDiscAdd%,R3%,R4%  Result%=0 ) retries%=0:abort=0:Split=  abort  Result%=Result%?3 5 track_print:AddPhysDefect(C%):DefectCheck @ Defect%!ptr%=check% (1<<29):Sum(Defect%,DefectSize%) 3 abort=0:adddefect%=adddefect%+1:Structure  * rereads%>AllowReRd% abort=305  display_errors: 2  &: 0 display_errors :1 C4%,L1%+3);wrterr%;:C4%,L1%+4);rereads%; D& PRINTTAB(C4%,L1%+5);reformats%; N4 C4%,L1%+5);adddefect%;:C4%,L1%+6);Defects%; X b: l Screen vLC1%=2:C2%=30:C3%=40:C4%=67:C5%=0:L1%=4:L2%=14:erc%=C5%+1:erl%=L2%+1::7 ?" Acorn Computers Winchester Soak and Test "; ! Wist "(WIST)" "(ASOAK)" E" ------------------------------------------------" @" Version ";ver$;" ";date$;" ADFS ";adfs$;" Q - to quit"  6 ) C1%,L1%+0);"Type";C2%-C1%-4,"."); 3 C1%,L1%+1);"Serial Number";C2%-C1%-13,"."); > C1%,L1%+2);"Precompensation Cylinder";C2%-C1%-24,"."); @ C1%,L1%+3);"Reduced Write Current Cyl.";C2%-C1%-26,"."); * C1%,L1%+4);"Heads";C2%-C1%-5,"."); . C1%,L1%+5);"Cylinders";C2%-C1%-9,"."); 3 C1%,L1%+6);"Park Cylinder";C2%-C1%-13,"."); : > C3%,L1%+0);"Read/Write/Format/Verify";C4%-C3%-24,"."); 2 C3%,L1%+1);"Data Pattern";C4%-C3%-12,"."); 6 C3%,L1%+2);"Working on track";C4%-C3%-16,"."); 2 C3%,L1%+3);"Write errors";C4%-C3%-12,"."); *7 C3%,L1%+4);"Re-reads Required";C4%-C3%-17,"."); 43 C3%,L1%+5);"Defects Added";C4%-C3%-13,"."); >4 C3%,L1%+6);"Logged Defects";C4%-C3%-14,"."); H: R8 I%=0 4:C5%+I%*16,L2%);" Cyln Hd Sc Er ";:I% \ J%=L2% L2%+17 f0 I%=0 3:C5%+I%*16+15,J%);"|";: I% p J% z :  Displayparms 3  C2%,L1%+0);type$  C2%,L1%+1);serno$  C2%,L1%+2);PCC%  C2%,L1%+3);LCC%  C2%,L1%+4);NoHeads%  C2%,L1%+5);NoCyls%  C2%,L1%+6);Parkcyl% : ptr%=0  ȕ Defect%!ptr%<(1<<29) O track%=(Defect%!ptr%)&2000:sector%=(Defect%!ptr%/&100)-(track%*SecTrk%)  track_print:ptr%=ptr%+4  $2 . 8: B track_print L> Pass track number, sector must be calculated externally VE cyl%=track%4:head%=track%-(cyl%*NoHeads%):Result%=Result% &FF `1 erc%,erl%);4-((cyl%)),"0")+(cyl%);" "; j5 erc%+5,erl%);2-((head%)),"0")+(head%);" "; t5 erc%+8,erl%);2-((sector%)),"0")+(sector%); ~; erc%+11,erl%);2-((Result%*4)),"0")+~(Result%*4); 4 erl%=erl%+1: erl%>31 erc%=erc%+16:erl%=L2%+1  erc%>70 erc%=C5%+1  :  cylprint 1 erc%,erl%);4-((cyl%)),"0")+(cyl%);" "; 5 erc%+5,erl%);2-((head%)),"0")+(head%);" "; 5 erc%+8,erl%);2-((sector%)),"0")+(sector%); 4 erl%=erl%+1: erl%>31 erc%=erc%+13:erl%=L2%+1  erc%>70 erc%=C5%+1  :  display_time  A dtime=:hr%=dtime 360000:min%=(dtime-(hr%*360000)) 6000 1 sec%=(dtime-(hr%*360000)-(min%*6000)) 100 JC1%,tlin%);"Elapsed time ";hr%;" hr ";min%;" min ";sec%;" sec "; ( Wist 2 (-17) abort=215 < (-36) abort=99 F P timeout ZL dtime=tsttime+ftime-:hr%=dtime 360000:min%=(dtime-(hr%*360000))6000 d1 sec%=(dtime-(hr%*360000)-(min%*6000)) 100 nJC3%,tlin%);"Test ends in ";hr%;" hr ";min%;" min ";sec%;" sec "; x9 dtime<=0 timeout=: Time is up so end the test  2cycle%=cycle%+WIST%: cycle%=WinAcc% floppy  comms  :  assm 9 code &300:EnterOS=&16:SVC_mode=3:I_bit=1<<27 . pass=0 2 2:P%=code:[ OPT pass H .flushbuf SWI EnterOS ;enter supervisor mode B TEQP pc,#I_bit+SVC_mode ;kill interrupts E LDR r0,fcaddr ;get buffer address O LDR r1,fcdata ;get data to fill buffer with D LDR r2,fclength ;get buffer length R .flushloop STR r1,[r0],#4 ;store data in buffer & inc addr D SUBS r2,r2,#4 ;decrement counter B BNE flushloop ;loop until done "; BAL exit ;and quit , ; 6% .checkbuf SWI EnterOS @0 TEQP pc,#I_bit+SVC_mode J' LDR r0,fcaddr T' LDR r1,fcdata ^) LDR r2,fclength h& ADDS r2,r2,#0 rO BEQ exit ;cope with zero length checks |O LDR r3,fcerrors ;get a zero poked in by BASIC R .checkloop LDR r4,[r0],#4 ;read a word from buffer into r4 L CMP r1,r4 ;test if same as test data O ADDNE r3,r3,#1 ;inc error count if not equal D SUBS r2,r2,#4 ;decrement counter B BNE checkloop ;loop until done I STR r3,fcerrors ;store result for BASIC " BAL exit  ; % .skip1chk SWI EnterOS 0 TEQP pc,#I_bit+SVC_mode ' LDR r0,fcaddr I ADDS r0,r0,#4 ;Skip 1st word in check ' LDR r1,fcdata ) LDR r2,fclength & SUBS r2,r2,#4 O LDR r3,fcerrors ;get a zero poked in by BASIC &R .skip1loop LDR r4,[r0],#4 ;read a word from buffer into r4 0L CMP r1,r4 ;test if same as test data :O ADDNE r3,r3,#1 ;inc error count if not equal DD SUBS r2,r2,#4 ;decrement counter NB BNE skip1loop ;loop until done XI STR r3,fcerrors ;store result for BASIC b ; l# .exit TEQP pc,#0 v# MOV r0,r0 B MOVS pc,r14 ;return to BASIC  ; A .fcaddr EQUD 0 ;buffer address @ .fclength EQUD 0 ;buffer length G .fcdata EQUD 0 ;data to test or fill N .fcerrors EQUD 0 ;error count, must init to 0  ;  .loop ( LDRB R3,[R0],#1 ( LDRB R4,[R1],#1 # TEQS R3,R4 " BNE fail  .checkk% # CMPS R0,R2  " BNE loop # MOV R0,#0  $ MOVS PC,R14 * .fail 4$ MOVS PC,R14 > ]: pass H R: \: f Init p disc_name% &0F z number_length%=7  version_length%=2  ref_number$="0283090"  ref_version$="01" PCC%=0:LCC%=0  Verify%=0  Read%=1  Write%=2 WriteTrack%=4  Seek%=5 Restore%=6 Specify%=&F AltDefectBit%=&10 DiscStruc%=&14 SecSize%=&100:LogSecSize%=8 MapSize%=&200 DirSize%=&800 $DefectAdd%=&C00 .DefectSize%=&200 8'MaxDefects%=(DefectSize%-64-&C-4)4 B LWM%=&E00 LAdfsSwi%=&40240 VAdfsDiscErr%=&108C7 `MaxVerifyBad%=32 jP Buf% &2000, DiscRec% 64+&200, mc% 100, Hugo% 4,Bad%(MaxVerifyBad%),RWP%(5) t"Defect%=DiscRec%+64:Defects%=0 ~%DefectRec%=Defect%+DefectSize%-64 ASecTrk%=0:NoHeads%=0:NoCyls%=0:MapAdd%=0:DirAdd%=0:Parkcyl%=0 Restore("DefaultShape") MSecTrk%,NoHeads%,NoCyls%,MapAdd%,DirAdd%,Parkcyl%,PCC%,LCC%,type$,serno$ /DiscSize%=SecSize%*SecTrk%*NoHeads%*NoCyls% 7sector%=0:Drive%=4:A%=0:B%=0:C%=0:R3%=0:R4%=0:I1%=0 3 AltDiscRec% 64+&200:AltDefect%=AltDiscRec%+64 +AltDefectRec%=AltDefect%+DefectSize%-64 IResult%=0:retries%=0:MaxRetry%=0:AllowDef%=0:AllowWrt%=0:AllowSeek%=7 Rreformats%=0:dataerr%=0:wrterr%=0:eccerr%=0:rereads%=0:adddefect%=0:seekerr%=0 >staddr%=0:blocklen%=0:track%=0:abort=:good_seek=:Split= ;hr%=0:min%=0:sec%=0:dtime%=0:tcol%=10:tlin%=3:tsttime=0 1ftime=0:timeout=:abort=0:termseq=:eoeblk%=0 @ tsttime,MaxRetry%,AllowDef%,AllowReRd%,MaxFails%,AllowWrt%  tsttime=(tsttime*360000) ) ReRdLog%(AllowReRd%,1), Scratch 256 :I%=0AllowReRd%:ReRdLog%(I%,0)=0:ReRdLog%(I%,1)=0:I% ( 19,10,16,&F0,&A0,&00 2 19,11,16,&E0,&60,&80 <AdfsSwi%=&40240 F Wist P fDiscRec% 36 Z* fDiscRec% 4<>0: "Bad Disc Rec": d3 A$,secsize%,SecsPerTrk%,Heads%,Skew%,Density% nflopers%=0:sererr%=0 x?fDiscRec%=0 9S%=secsize%:ȕ S%>1 ?fDiscRec%=?fDiscRec%+1:S%=S%2: fDiscRec%?1=SecsPerTrk% fDiscRec%?2=Heads% fDiscRec%?3=Density% fDiscRec%?34=0  z% -1 $dsize%=((-z%-&800)/2)&FFFFFF00 E dsize%>secsize%*SecsPerTrk%*160 dsize%=secsize%*SecsPerTrk%*160 fDiscRec%!16=dsize% dummy=(-1)  lwm%=&C00  fill%=0  secs%=(dsize%-lwm%)secsize%  opctr%=0  R% dsize%*2 z%=R%+dsize% "& I%=lwm% dsize%-4 4:R%!I%=0: ,#op(2,lwm%,R%+lwm%,dsize%-lwm%) 6 @ J T ^: h Warning rG VERSION 2.13 Most of this procedure has been removed, the warning |F is now handled by HD_SOAK. Instead this program will ask for the  drive to be soaked.  7 8Drive%=Ask("Soak test which hard disc drive 4/5",4)  12  :  GetShape InitDefectList InitDiscRec FatalOp(Specify%,0,0,0) FatalOp(Restore%,0,0,0) 2FatalOp(Read%,DefectAdd%,Defect%,DefectSize%)  GoodDefects  OldShape   abort=102:Terminate & 0 ptr%=0 : ȕ Defect%!ptr%<(1<<29) D ptr%=ptr%+4 N X3 (ptr% 4)>AllowDef% abort=104:Terminate b l: v OldShape SecTrk%=DefectRec%?1 NoHeads%=DefectRec%?2 MapAdd%=DefectRec%!8 DirAdd%=DefectRec%!&C DiscSize%=DefectRec%!&10 3NoCyls%=DiscSize% (SecSize%*SecTrk%*NoHeads%) 8Parkcyl%=(DefectRec%!-4)(SecSize%*SecTrk%*NoHeads%) PCC%=DefectRec%!-8>>16 LCC%=DefectRec%!-8 &FFFF InitDiscRec $InitAltDiscRec:InitAltHardDesc  :  AskShape  -SecTrk%=Ask("Sectors per track",SecTrk%) DiscRec%?1=SecTrk%  #NoHeads%=Ask("Heads",NoHeads%) *DiscRec%?2=NoHeads% 4%NoCyls%=Ask("Cylinders",NoCyls%) >/DiscSize%=SecSize%*SecTrk%*NoHeads%*NoCyls% HDiscRec%!&10=DiscSize% R.Parkcyl%=Ask("Parking cylinder",Parkcyl%) \ f ptr%=0 p/ "Current Defects (Cylinder,Head,Sector)" z ȕ Defect%!ptr%<(1<<29)  defect%=Defect%!ptr%  defect%=defect% SecSize%  sector%=defect% SecTrk%  defect%=defect% SecTrk% T ((ptr%4)7)*11);"(";defect%NoHeads%;",";defect%NoHeads%;",";sector%;")";  ptr%=ptr%+4   Defects%=ptr%4  P rwopt$=Choose("A: add defect, B: Remove defect, C: No more changes","ABC")  rwopt$<>"C" , cyl%=InputDec("Cylinder",0,NoCyls%-1) * head%=InputDec("Head",0,NoHeads%-1) C sector%=InputDec("Byte, or -ve for sector",1-SecTrk%,&10000) ; sector%>=0 sector%=sector% 320 sector%=-sector%  $> defect%=((cyl%*NoHeads%+head%)*SecTrk%+sector%)*SecSize% . rwopt$="A" 8 AddPhysDefect(defect%) B L! RemovePhysDefect(defect%) V ` j rwopt$="C" t I%=0 DiscStruc%-1 ~ DefectRec%?I%=DiscRec%?I%  I% DefectCheck !Defect%!ptr%=(1<<29) check% InitHardDesc Sum(Defect%,DefectSize%)  :  DefectCheck  ptr%=0  check%=0 ȕ Defect%!ptr%<(1<<29)  CheckPut(Defect%!ptr%)  ptr%=ptr%+4   Defects%=ptr% 4 !check%=check% (check%>>>16) ('check%=(check% (check%>>>8)) &FF 2$ Defects%>AllowDef% abort=304 < F: P WriteDefectList Z3FatalOp(Write%,DefectAdd%,Defect%,DefectSize%) d n: x LogToPhys(add%)  ptr%  ptr%=0 ȕ add%>=Defect%!ptr%  ptr%=ptr%+4  add%=add%+SecSize%   =add% :  AddPhysDefect(add%)  ptr%,ptr2%,defect%  Defects%=ptr% J& Defect%!(ptr2%+4)=Defect%!ptr2% T ptr2%=ptr2%-4 ^ h Defect%!ptr%=add% r Defects%=Defects%+1 |   abort=209  $ Defects%>AllowDef% abort=304  :  RemovePhysDefect(add%)  ptr%,ptr2%,defect% ȕ Defect%!ptr%= (1<<29)) good% Defects%=ptr%4 !check%=check% (check%>>>16) 'check%=(check% (check%>>>8)) &FF \= good% ((defect%&FF) = check%) (sum(Defect%,DefectSize%)=Defect%?(DefectSize%-1))  :  InitDiscRec  ?DiscRec%=LogSecSize% *DiscRec%?1=SecTrk% 4DiscRec%?2=NoHeads% >DiscRec%?3=0 HDiscRec%?4=0 R9DiscRec%?5=0 : Not used at 0.1 MapSize% DIV &80 \DiscRec%?6=0 fDiscRec%?7=0 p0DiscRec%!8=0 : Not used at 0.1 MapAdd% zDiscRec%!&C=DirAdd% DiscRec%!&10=DiscSize% DiscRec%!&14=(&10000)-1 DiscRec%!&18=0 DiscRec%!&1C=0 DiscRec%?&22=Drive%  :  InitDefectList 3!Defect%=(1<<29) : empty defect Defects%=0 InitHardDesc  :  InitHardDesc =DefectRec%!-&10=&16000000 : SL xxxxxx EDefectRec%!-&C =&0D0CA80A : GPL2 GPL3 SH GPL1 $;DefectRec%!-8 =PCC%*10000 + LCC% : PCC LCC .6DefectRec%!-4 =SecSize%*SecTrk%*NoHeads%*Parkcyl% 8 B: L InitAltDiscRec V?AltDiscRec%=LogSecSize% `AltDiscRec%?1=SecTrk% jAltDiscRec%?2=NoHeads% tAltDiscRec%?3=0 ~AltDiscRec%?4=0 >AltDiscRec%?5=0 : Not used at 0.1 MapSize% DIV &80 AltDiscRec%?6=0 AltDiscRec%?7=0 5AltDiscRec%!8=0 : Not used at 0.1 MapAdd% AltDiscRec%!&C=DirAdd% AltDiscRec%!&10=DiscSize% AltDiscRec%!&14=(&10000)-1 AltDiscRec%!&18=0 AltDiscRec%!&1C=0 AltDiscRec%?&22=Drive%  :  InitAltDefectList  2!AltDefect%=(1<<29) : empty defect AltDefects%=0 InitAltHardDesc ( 2: < InitAltHardDesc F@AltDefectRec%!-&10=&16000000 : SL xxxxxx PHAltDefectRec%!-&C =&0D0CA80A : GPL2 GPL3 SH GPL1 Z>AltDefectRec%!-8 =PCC%*&10000 + LCC% : PCC LCC d9AltDefectRec%!-4 =SecSize%*SecTrk%*NoHeads%*Parkcyl% n x:  AskHex(String$,Default%)  X,Y,reply$,value%  String$;" ?"; X= Y=  X,Y);"&";~Default%;X,Y);  ""reply$ 2 reply$="" value%=Default% value%=(reply$)  X,Y);"&";~value%;9  = value% :  Ask(String$,Default%)  X,Y,reply$,value%  String$;" ?"; X= Y= " X,Y);Default%;X,Y); , ""reply$ 62 reply$="" value%=Default% value%=(reply$) @ X,Y);value%;9 J = value% T: ^" InputDec(String$,min%,max%) h reply$,value% r* String$;" (";min%;" to ";max%;" ) "; | reply$  value%=(reply$) ! value%>=min% value%<=max%  = value% :  Choose(mess$,rwopt$)  reply$  mess$;   reply$  (reply$)=1 reply$=((reply$)&DF)  rwopt$,reply$)  =reply$ :  CheckPut(I%) Bcheck%=(check% >>> 13) ((check% (2^13-1)) << (32-13)) I% & 0: : sum(base%,len%) Dsum%=0:c%=0 N I%=len%-2 0 -1 Xsum%=sum%+base%?I%+c% b+ sum%<&100 c%=0 sum%=sum% &FF:c%=1 l I% v =sum% :  Sum(base%,len%) #base%?(len%-1)=sum(base%,len%)  :  Restore(A$)  B$  B$ B$=A$  :  FatalOp(b%, C%, D%, E%) !oș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result%,A,ErrDiscAdd%,R3%,R4% ! $ Result% abort=201:Terminate ! ! : !* RSECT !4 !>+ sector%=Ask("Read which sector ",-1) !H sector%=-1 !R I%=0&FF:Buf%?I%=I%:I% !\' Op(Read%,sector%*&100,Buf%,&100) !f' I%=0 &FF 16:@%=3:~I%": "; !p2 @%=10:J%=0 15 4:~!(I%+J%+Buf%);" ";: !z= " ";:J%=0 15:Z%=?(I%+J%+Buf%): Z%>31:Z% &2E ! ::@%=3: ! sector%=-1 ! !: ! WSECT ! !, sector%=Ask("Write which sector ",-1) ! sector%=-1 ! I%=0&FF:Buf%?I%=0:I% !( Op(Write%,sector%*&100,Buf%,&100) !' I%=0 &FF 16:@%=3:~I%": "; !2 @%=10:J%=0 15 4:~!(I%+J%+Buf%);" ";: != " ";:J%=0 15:Z%=?(I%+J%+Buf%): Z%>31:Z% &2E " ::@%=3: " sector%=-1 " "$: ". Format "8 I%,J%,cyl%,head% "BFatalOp(Specify%,0,0,0) "LFatalOp(Restore%,0,0,0) "VC4%,L1%);"Format "; "`* I%=0 512-4 4:Buf%!I%=&077F03FF: "j cyl%=0 NoCyls%-1 "t head%=0 NoHeads%-1 "~1 J%=cyl% (head%<<24):track%=(cyl%*4)+head% "! C4%,L1%+2);track%;" "; "8 I%=0 (SecTrk%-1)*4 4:Buf%!I%=J% (I%<<14): "F Op(WriteTrack%,(cyl%*NoHeads%+head%)*SecTrk%*SecSize%,Buf%,512) " head% " cyl% "+reformats%=reformats%+1:display_errors " ": " Format_track " I%,J%,cyl%,head% "FatalOp(Specify%,0,0,0) "FatalOp(Restore%,0,0,0) #C4%,L1%);"Format "; # * I%=0 512-4 4:Buf%!I%=&077F03FF: #0 cyl%=track%4:head%=track%-(cyl%*NoHeads%) #1 J%=cyl% (head%<<24):track%=(cyl%*4)+head% #(! C4%,L1%+2);track%;" "; #28 I%=0 (SecTrk%-1)*4 4:Buf%!I%=J% (I%<<14): #DiscSize% # blocklen%=DiscSize%-add% # # blocklen%=defect%-add% # # FatalOp(Restore%,0,0,0) #" Op(Verify%,add%,0,blocklen%) # Result% #" add%=ErrDiscAdd% &1FFFFF00 # sector%=add% SecSize% $ head%=sector% SecTrk% $ sector%=sector% SecTrk% $ cyl%=head% NoHeads% $" head%=head% NoHeads% $, cylprint $6 Bad%(bad%)=add% $@ bad%=bad%+1 $J add%=add%+SecSize% $T $^" add%=add%+blocklen%+SecSize% $h $r! add%>defect% ptr%=ptr%+4 $|* add%>=DiscSize% bad%=MaxVerifyBad% $ bad%<>0 $ bad2%=bad% $ ȕ bad2%>0 $ bad2%=bad2%-1 $" AddPhysDefect(Bad%(bad2%)) $ $ DefectCheck $& Defect%!ptr%=check% (1<<29) $" Sum(Defect%,DefectSize%) $ $ bad%=0 $ $ =(bad%=0) %: % Track_Verified %(add%=track%*SecSize%:eot%=add%+&2000 %&Cbad%=0:ptr%=0:blkcnt=0:Pattern=&4E4E4E4E:C4%,L1%);"Verify "; %05C4%,L1%+1);"&";8-(~(Pattern)),"0");~Pattern; %: %D defect%=Defect%!ptr% %N defect%>eot% %X blocklen%=eot%-add% %b %l blocklen%=defect%-add% %v % FatalOp(Restore%,0,0,0) %" Op(Verify%,add%,0,blocklen%) % Result% %" add%=ErrDiscAdd% &1FFFFF00 % sector%=add% SecSize% % head%=sector% SecTrk% % sector%=sector% SecTrk% % cyl%=head% NoHeads% % head%=head% NoHeads% % cylprint % Bad%(bad%)=add% % bad%=bad%+1 % add%=add%+SecSize% & & " add%=add%+blocklen%+SecSize% & & ! add%>defect% ptr%=ptr%+4 &*% add%>=eot% bad%=MaxVerifyBad% &4 bad%<>0 &> bad2%=bad% &H ȕ bad2%>0 &R bad2%=bad2%-1 &\" AddPhysDefect(Bad%(bad2%)) &f &p DefectCheck &z& Defect%!ptr%=check% (1<<29) &" Sum(Defect%,DefectSize%) & & bad%=0 & & =(bad%=0) &: & Structure &WriteDefectList &WriteOldFsMap &WriteRootDir & &: & WriteOldFsMap ' s%,I% 's%=MapSize% 2 '' I%=0 MapSize%-4 4:Buf%!I%=0: '$!Buf%=LWM% &100 '.5Buf%!s%=(DiscSize%-LWM%-Defects%*SecSize%) &100 '8!!(Buf%+s%-4)=DiscSize% &100 'B"!(Buf%+MapSize%-5)=(&10000)-1 'L!(Buf%+MapSize%-2)=3 'VSum(Buf%,s%) '`Sum(Buf%+s%,s%) 'j*FatalOp(Write%,MapAdd%,Buf%,MapSize%) 't '~: ' WriteRootDir ' BF% '' I%=0 DirSize%-4 4:Buf%!I%=0: '$Hugo%="Hugo":hugo%=!Hugo% 'Buf%!1=hugo% 'BF%=Buf%+DirSize% 'BF%!-38=DirAdd% &100 'BF%?-35="$" 'BF%?-16="$" 'BF%!-5=hugo% ' check%=0 'CheckPut(!Buf%) (CheckPut(Buf%?4) ( I%=BF%-40 ( ȕ I%3 ( CheckPut(?I%) (( I%=I%+1 (2 (<ȕ I%>>16) (n'check%=(check% (check%>>>8)) &FF (xBF%?-1=check% (*FatalOp(Write%,DirAdd%,Buf%,DirSize%) ( (: ( ZAPMAP (2FatalOp(Read%,DefectAdd%,Defect%,DefectSize%) (0!Defect%=&20000000:Sum(Defect%,DefectSize%) (WriteDefectList ( (: ( Hacker ( *FX 21,0 (0,L1%+7);""; ()"PROCZAPMAP - Clear the defect list" )*"PROCRSECT - Read a sector from disk" )3"PROCWSECT - Write a sector of zeroes to disk" ) )": ), Terminate )68 abort<100 abort=0:: Some aborts are not errors )@, 129: 0:0,11);240," ");:0,11);""; )JK abort>300 "Test Parameter Beyond Acceptable Limit":abort=abort-300 )TE abort>200 "Fatal Error Occurred During Test":abort=abort-200 )^G abort>100 "Fatal error - Unable to start test":abort=abort-100 )hȎ abort )r5 1:"Winchester drive or interface failure" )|# 2:"Defect list corrupt" )4 3:"Error during data transfer to memory" )C 4:"Defects in excess of acceptable limit of ";AllowDef% )L 5:"Sector re-reads in excess of acceptable limit of ";AllowReRd% )H 6:"Seek errors in excess of acceptable limit of ";AllowSeek% )1 7:"Error during termination sequence" ); 8:"Bad error 8 - Defect already in defect list" ). 9:"Bad error 9 - Defect list full" )' 10:"Non ADFS error occurred" )H 11:"Write errors in excess of acceptable limit of ";AllowWrt% ) 15:"User interrupt." ) )I%=116:"FAIL ";:I% ) 128: 7:0,tlin%);""; * *FX 21,0 *4seek_track(Seek%,Parkcyl%*&8000,Buf%,blocklen%) * *FX 2,0 *&):("*DIR $.a300/400/1"):"MAIN_MENU" *0! ** End Of Alex's Section ** *: floppy *D ferr%<>0 *N "DIR:0" *X cycle%=0 *b+ ''''''''"Accessing Floppy Drive...." *l bash *v * bash * * fct%=fct%+1 * op%=(2) *+ start%=((secs%+1)-1)*secsize%+lwm% *! start%=dsize% length%=0 *3 start%<>dsize% l1%=(dsize%+1-start%)-1 *3 start%<>dsize% l2%=(dsize%+1-start%)-1 *7 start%<>dsize% length%=(dsize%+1-start%)-1 *2 start%<>dsize% l1%dsize% l2%0 +6 op%=1 check(R%+start%,z%,R%+start%+length%) +  "FX 21,1" +*6 fct%=flopAcc% fct%=0:11:Q=0160:" ";:: +4 +> +H check(A%,B%,C%) +R( checkk%<>0 flopers%=flopers%+1 +\ +f RandData(S%,L%) +p L%=0 +z I%=0 L%-4 4:S%!I%=: + L%>3 S%!(L%-4)= + J%=L%secsize% + J%=0 +0 I%=L% L%+secsize%-J%-1:S%?(I%)=fill%: + + op(fb%,C%,fD%,fE%) + : 3 + " Op ";opctr%; + comms +/ fb%=1 " Read from "; " Write to "; +: "Disc address ";~C%;" start=";~fD%;" length=";~fE% + 11:11:ferr%=(&3F000000 )/&1000000:" "'"Disc error ";~ferr%;" Floppy tests terminated ": 2: :fct%=flopAcc%:flopers%+=1: +6 ș "ADFS_DiscOp",0,fb%+(fDiscRec%<<6),C%,fD%,fE% , , comms , opctr%=opctr%+1 ,$ 11 ,. 2 ,8 ,B1 ************ COMMS BIT!! ************ ,L comms ,V *FX2,1 ,`) time0%= 6000 :time1%=time0% 60 ,j. A=(0) : has character been recieved ,t8 A<>&FF A<>-1 sererr%+=1:: is charac. &FF? ,~) A=-1 : if no character received ,M Checksum%=Defects%+rereads%+seekerr%+flopers%+sererr%+time0%+time1%+et% , *FX 3 7 , (Defects%); , (rereads%); , (seekerr%); , (flopers%); , (sererr%); , (time0%); , (time1%); , (Checksum%); , (et%); , *FX 3 0 - A=(50) -  A=-1 sererr%+=1: - Timeset=0 Timeset - *FX 3 0 -( -2 Timeset -< *FX 15 0 -F Timeset=1 -P X=1 11 -Z STM$=STM$+((200)) -d -n4 "SET Sys$Date Fri,"+STM$,1,2)+" "+STM$,3,3) -x6 "SET Sys$Time "+STM$,6,2)+":"+STM$,8,2)+":00" -$ "SET Sys$Year 19"+STM$,10,2) - -Iwin_to_mem: loads progs from winnie to ram to prevent overwriting - "LOAD !F2BOOT 200000" -> ș "XOS_File",5,"!F2BOOT" R0,R1,R2,R3,R4:filength(0)=R4 - "LOAD BWIT 200100" -; ș "XOS_File",5,"BWIT" R0,R1,R2,R3,R4:filength(1)=R4 - "LOAD COMPTYPE 204100" -? ș "XOS_File",5,"COMPTYPE" R0,R1,R2,R3,R4:filength(2)=R4 - "LOAD EPSPRINT 205100" -? ș "XOS_File",5,"EPSPRINT" R0,R1,R2,R3,R4:filength(3)=R4 - "LOAD JPPRINT 205200" -> ș "XOS_File",5,"JPPRINT" R0,R1,R2,R3,R4:filength(4)=R4 . "LOAD MENU400 205300" .> ș "XOS_File",5,"MENU400" R0,R1,R2,R3,R4:filength(5)=R4 . "LOAD NOPRINT 206300" ."> ș "XOS_File",5,"NOPRINT" R0,R1,R2,R3,R4:filength(6)=R4 ., "LOAD PORTS 206400" .6< ș "XOS_File",5,"PORTS" R0,R1,R2,R3,R4:filength(7)=R4 .@ "LOAD SCREEN 20A400" .J= ș "XOS_File",5,"SCREEN" R0,R1,R2,R3,R4:filength(8)=R4 .T "LOAD STATCHK 20E400" .^> ș "XOS_File",5,"STATCHK" R0,R1,R2,R3,R4:filength(9)=R4 .h "LOAD TIME 211400" .r< ș "XOS_File",5,"TIME" R0,R1,R2,R3,R4:filength(10)=R4 .| "LOAD WFORM 214400" .= ș "XOS_File",5,"WFORM" R0,R1,R2,R3,R4:filength(12)=R4 . "LOAD ASOAK 217400" .= ș "XOS_File",5,"ASOAK" R0,R1,R2,R3,R4:filength(13)=R4 . "LOAD MEMOBJ 220000" .> ș "XOS_File",5,"MEMOBJ" R0,R1,R2,R3,R4:filength(14)=R4 . .= mem_to_win : copies func test back to winnie from ram . "WIPE * ~CF~V" .* "SAVE !BOOT 200000 +"+(filength(0)) .) "SAVE BWIT 200100 +"+(filength(1)) .- "SAVE COMPTYPE 204100 +"+(filength(2)) .- "SAVE EPSPRINT 205100 +"+(filength(3)) ., "SAVE JPPRINT 205200 +"+(filength(4)) /, "SAVE MENU400 205300 +"+(filength(5)) /, "SAVE NOPRINT 206300 +"+(filength(6)) /* "SAVE PORTS 206400 +"+(filength(7)) /&* "SAVE SCREEN 20A400+"+(filength(8)) /0, "SAVE STATCHK 20E400 +"+(filength(9)) /:* "SAVE TIME 211400 +"+(filength(10)) /D+ "SAVE WFORM 214400 +"+(filength(12)) /N+ "SAVE ASOAK 217400 +"+(filength(13)) /XA "SAVE MEMOBJ 220000+"+(filength(14))+ " 00008000 00008000" /b "SETTYPE ASOAK FFB" /l "SETTYPE !BOOT FFB" /v "SETTYPE BWIT FFB" / "SETTYPE COMPTYPE FFB" / "SETTYPE EPSPRINT FFB" / "SETTYPE JPPRINT FFB" / "SETTYPE MENU400 FFB" / "SETTYPE NOPRINT FFB" / "SETTYPE PORTS FFB" / "SETTYPE SCREEN FFB" / "SETTYPE STATCHK FFB" / "SETTYPE TIME FFB" / "SETTYPE WFORM FFB" / / ramtest / 0 comms 0  0 0  ** end of file ** PK0\  A300/400/1/HARD_DISC/DVERIFYACARC0A;5;  >DVERIFY % ARCIMEDES DEALER TEST SOFTWARE 8 Version 1.01 15-June-1989 Author B. Rice (8 Version 1.01 21-June-1989 Author B. Rice 28 Version 1.02 22-June-1989 Author B. Rice <8 Version 1.03 5-July-1989 Author B. Rice F/ This program will verify the hard disc. P This is a new program. Z1 The program will be called by "main_menu". d) V 1.00 Inital writing and editing. nL V 1.01 Change the position of the procedures, change tab positions of x; text messages, make program verify hard disc. K V 1.02 Remove the check for ID%=5 and make the warning globle, drive , 4 or 5 will now be configured.  V 1.03 General tyding.  K The program will check for ID% code of 5 (410/1) if this is the case ? then the program will ask for conformation of hard disc. J The program checks for ID%=5 and if necessary ask for conformation. 5 The program will then if required will verify. L V1.01 reverses above, a globle warning regarding hard disc connection  is now given.   Main program.  7  get_res_int  main_bit  *dir :0.A300/400/1 " "MAIN_MENU" , 6 @ get_res_int J' ș "OS_Byte",161,30,0 R1,R2,R3 T tsr%=R3 ^ ID%=tsr% &0F h Q%=tsr%>>7 r S%=(tsr% &40)>>6 | E%=(tsr% &30)>>4 ' ș "OS_Byte",161,31,0 R1,R2,R3  MEM%=R3    main_bit F This procedure will display th etitle and do most of the work ? 0,1)(130)(141)"HARD DISK VERIFIER (V1.03 DEALER)" ? 0,2)(130)(141)"HARD DISK VERIFIER (V1.03 DEALER)"  warning  a$="Y" a$="y"  verify     warning > This procedure will display a warning to the operator &2 10,5) (129) (136) (141)"W A R N I N G" 02 10,6) (129) (136) (141)"W A R N I N G" :2 10,7) (129) (136) (141)"=============" D2 10,8) (129) (136) (141)"=============" N3 2,10) "Please ensure that a hard disc has" X- 2,11) "been fitted to this machine." bK 2,12) "Please"; (129); "DO NOT"; (135); "continue with the test" l6 2,13) "if the hard disc has not been fitted." v 2,15) "Continue Y/N ?";  *FX15,0   a$= * a$="Y" a$="y" a$="N" a$="n"  a$    verify 2 This procedure will verify the hard disc.  line%=5 15  0,line%)(40)  line% $ 10,7)"Verify Drive 4 or 5";    drive%  drive%=4 drive%=5   drive$=(drive%) *! ("CONFIGURE HARDDISCS 2") 4 ("RMKILL ADFS") > ("RMREINIT ADFS") H ("VERIFY :"+drive$) R \1 "Press space bar to return to the menu"; f p a$= z a$=" "   " That's all no more program. PKOFEUA300/400/1/HARD_DISC/HD_COPYACARC0A`94;  >HD_COPY & ARCHIMEDES DEALER TEST SOFTWARE 7 Version 1.0 5-July-1989 Author B. Rice (5 This program will copy HFORM to the Hard Disc. 2 New >7  S%=(tsr% &40)>>6  E%=(tsr% &30)>>4 ' ș "OS_Byte",161,31,0 R1,R2,R3  MEM%=R3 " , 6 main_bit @F This procedure will display th etitle and do most of the work J6 5,1)(130)(141)"HFORM COPY (V1.00 DEALER)" T6 5,2)(130)(141)"HFORM COPY (V1.00 DEALER)" ^ ID%=5 h warning r a$="Y" a$="y" | copy    copy     copy 9 This procedure will copy HFORM to the hard disc.  line%=5 15  0,line%)(40)  line% % 10,7)"Copy to Drive 4 or 5";   drive%  drive%=4 drive%=5  drive$=(drive%) &! ("CONFIGURE HARDDISCS 2") 0 ("RMKILL ADFS") : ("RMREINIT ADFS") DP ("*COPY ADFS::0.LIBRARY ADFS::"+ drive$ +".LIBRARY A~C~DF~LN~P~QRS~T~V") N X "HFORM Copied." b l1 "Press space bar to return to the menu"; v  a$=  a$=" "    warning > This procedure will display a warning to the operator 2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"W A R N I N G" 2 10,7) (129) (136) (141)"=============" 2 10,8) (129) (136) (141)"=============" 3 2,10) "Please ensure that a hard disc has" - 2,11) "been fitted to this machine." K 2,12) "Please"; (129); "DO NOT"; (135); "continue with the test" 6 2,13) "if the hard disc has not been fitted."  2,15) "Continue Y/N ?";  *FX15,0   * a$= 4* a$="Y" a$="y" a$="N" a$="n" > H R! That's all folks, no more. PKN;Z A300/400/1/HARD_DISC/HD_FORMATACARC0Ay>;  >HD_FORMAT % ARCIMEDES DEALER TEST SOFTWARE 8 Version 1.00 15-June-1989 Author B. Rice (8 Version 1.01 21-June-1989 Author B. Rice 28 Version 1.02 5-July-1989 Author B. Rice >7  S%=(tsr% &40)>>6  E%=(tsr% &30)>>4 ' ș "OS_Byte",161,31,0 R1,R2,R3  MEM%=R3    main_bit F This procedure will display th etitle and do most of the work @ 0,1)(130)(141)"HARD DISK FORMATTER (V1.02 DEALER)" @ 0,2)(130)(141)"HARD DISK FORMATTER (V1.02 DEALER)"  warning  a$="Y" a$="y"  format_ok= & 0 format_ok= : D X warning b> This procedure will display a warning to the operator l2 10,4) (129) (136) (141)"W A R N I N G" v2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"=============" 2 10,7) (129) (136) (141)"=============" 5 2,9) "Running this test on a hard disc that" @ 2,10) "has data on it will"; (129); "DESTROY ALL DATA" , 2,11) "currently held on the disc." 6 2,12) "Please ensure that users are aware of" 0 2,13) "this and give you their consent" " 2,14) "before you start." 5 2,16) "Please ensure that a hard disc drive" 1 2,17) "has been fitted to this machine." K 2,19) "Please"; (129); "DO NOT"; (135); "continue with the test" 5 2,20) "if the hard disc has not been fitted" 6 2,21) "or you do not have the users consent."  2,23) "Continue Y/N ?";   *FX15,0   a$= ** a$="Y" a$="y" a$="N" a$="n" 4 a$ > H R' That's all folk no more program. PK|6  A300/400/1/HARD_DISC/HD_PARKACARC0A4;  >HD_PARK G Mod. Change the path and file name of the menu to return to. Add H space bar response at end, add question re number of drives. (+ Mod. done by Brian Rice 5-July-1989 2 7 <9 0,3)(130)(141)"HARD DISK PARK (V1.00 DEALER)" F9 0,4)(130)(141)"HARD DISK PARK (V1.00 DEALER)" P* 1,6)"How meny hard disc drives are" Z 1,7)"attached 1 or 2 ?"; d n no_drives$= x& no_drives$="1" no_drives$="2"  no_drives$  no_drives$="1"  *CON. HARDDISCS 1   *CON. HARDDISCS 2   *RMREINIT ADFS *BYE 7 0,10)(131)"The hard disc heads are now parked." 6 0,14)(131)"Press space to return to the Menu."  a$= a$=" "  ("*DIR :0.A300/400/1")  "MAIN_MENU" PKiپ A300/400/1/HARD_DISC/HD_SOAKACARC0A>;  >HD_SOAK % ARCIMEDES DEALER TEST SOFTWARE 8 Version 1.00 15-June-1989 Author B. Rice (8 Version 1.01 21-June-1989 Author B. Rice 28 Version 1.02 6-July-1989 Author B. Rice >7  S%=(tsr% &40)>>6  E%=(tsr% &30)>>4 ' ș "OS_Byte",161,31,0 R1,R2,R3  MEM%=R3    main_bit F This procedure will display th etitle and do most of the work ; 2,1)(130)(141)"HARD DISK SOAK (V1.02 DEALER)" ; 2,2)(130)(141)"HARD DISK SOAK (V1.02 DEALER)"  warning  a$="Y" a$="y" & soak_ok= 0 : soak_ok= D N b warning l> This procedure will display a warning to the operator v2 10,4) (129) (136) (141)"W A R N I N G" 2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"=============" 2 10,7) (129) (136) (141)"=============" 5 2,9) "Running this test on a hard disc that" @ 2,10) "has data on it will"; (129); "DESTROY ALL DATA" , 2,11) "currently held on the disc." 6 2,12) "Please ensure that users are aware of" 0 2,13) "this and give you their consent" " 2,14) "before you start." 5 2,16) "Please ensure that a hard disc drive" 1 2,17) "has been fitted to this machine." K 2,19) "Please"; (129); "DO NOT"; (135); "continue with the test" 5 2,20) "if the hard disc has not been fitted" 6 2,21) "or you do not have the users consent."  2,23) "Continue Y/N ?";  *FX15,0   * a$= 4* a$="Y" a$="y" a$="N" a$="n" > a$ H \( That's it folks, no more program. PKZE,hhA300/400/1/HARD_DISC/NORETRIESACARC0@'{;`PdR(T284LN5\^6ln7|~89:;< RZ 0#4^$ RZ$  RTTZpa R& $ R&:0+a  n0:987~6|n5l^4\N3L! RZ +a \0!$ RZ$  RpUaUZ_-1  Q0Q :0@P`p_0QZ0Q TZ@-@1 `@-@1 `@- @- a R@--Ѝ@-A@!@@-2L@D |@-0AS:4S  S4 0`@P^&T!*PS:R  *|- ( @@A@<$ $$ $$ $$  $$  ,048(((,048   ,(   (    ( 0@(,048.%0E2F3o %\/Pll4`8p   <  N-2@|\@P*D 0^""*" D |0LSC0L5@0#x<@Q7 O2 @20Q <<P|p Q L\ ,D D |p DAD]@<t P\  D >0""P@TP` Dl "$ E@ HdhP@THU0:Q!,01@- d@  h PhHHdL PCLD D@ dH pH Q8:d <x`@P P@P< 5 PPlD*xPx&J Q(Q P: P3PVC+,r(wPX PZ'pV/wGT@(}~u dL$O P" P T"$P TYZ@@-# ((@ @P` )dhp )tx ))0-@(p(p(TP `)$(pdPt |"|X  %"TP|K/(  .dL$O P"P C T(PCT,( YZ@-  ( Q(pP(( ((p( ( (( (p(( @@- `$( &d p,( @`hp,( $( @P,( $( 't,d( (`( ,( $( )dkAe,xpx(}PX2 ^ZpW <*N[H(~j <L@LDD `@P Pp0!XlRpXDPTPdFPpX,9P,(^X H (PZS!P0,`(F@ mH)PZ<( @-2 P027"QZ PD@- ``FPD@-T@^aan"Q1;0025^37:##p"Q*4jR( p11  #j2 Q:0-@ ` p 0<0 #N#d{@-P%S^QQ^"pWM*-W#D*@H`VY Y> -"1s0,jV *( PT!VL3@`^.0:    `|PL-p>3Y@P33.13VdွPP P`6Ppz  `6 `2`p``6dွO-?ь@@ ࠌ< @P@/ R"!! "`0Vv2#*R*5  Q U @-@-Silly length @?@|v1@-@-Not start at sec boundary @?@eaRrp @-@-Not trk start @?@QMXݰPY#!PI"\T`勠> `am Y:   :\  Q*;@제J 0 00Pp2*@*T ќdᏽ1ࠌꀀPp33SSss0娀 % :^"0娀 % :ʄ^"0娀 :ڄ %^"\0 ^0 ^\(ր^@ՀX* @PJ0S@D0@0TCT@A@9X6*P10  Q#:X @ R @4PPP5 @P@P0O00(U3 @^0oO` ppQ:mOA!L-2@09-赯O-^#3ࠜdް@  ް; 2 00 (Y3Xݰ *oްް;1pـڐ֠۠Z @: U 2Р> A8 p֠8-00 p@8Z#Z*@-%&ǀX```&r`X`@-ǀ N,2L@`Dpd`V@L@`Dpd`V`@V:@-PU\ Q*1 Q\@- T1 ZQ\5p2* ``\T  @-P#:T0  0 @ 00S1010>2 53 5     \P@-\P`}2 y @-sqo @-l0  "` @- $28@-28 @55O-@AM  j11>dQ*qq~Q#*z"T0Busu " !yIQ#C*$MP @e z80 0\>/, 0usu` &11>!p7 ppW J 78 `6jO~O \>"$Ѝ2dC-O @AAp"UA 0 Lz0X؀8 H O*B03 8yy 8dC-O @j@j@"H004F.?Asq+s.qLs9{jCcjY l@nl@A 0.L'{s ud?@-! $ !1$ @ PRPU?A-Q 11010>2$:@lQQ^#p7!pW"Xp2`p T tX W 0`@4l*@-`PtQY0Yi. >@-@P:! 0QQ^P!^02^N!Ņ@T:!0>@- R 3 5 3" 5@-" O-  0 ^P10: а ! (뎏 @-N 0q ,",00^R O-O-K)L5_`tS)  *Pr`u`p"z9 "jpH GD H F p 0jP0 Ft0d@-븰  ; ^@-0O-pt0sv K)L5_`o@ @n@@-ҿ> > J JZG ^# Y! ! ! Zy6 8 ;ү  J KQQ NQQ IY 1 1X(*>1 K^^ J r F A m0!@-P DA A@-  @- 0 K @-PP@-PPH-P Ḱ . ;@-@-(pF4pF &.5&.5P&.F&.5"(""$" V2ᧀ@-) F5 F@^P:@O-0a0]Q0!01Y ! 1,-j T @ P8-a  8 jb  K p I j9Ѝ00d@-@@ O-wpW``)c  [ sU{ sO{)AJ@D /BE  ;8Y:[: ;R @-Z@Z  Ѝ"*@O^@ 0ZZmЍbjZ@Z  @@ =H01[ 0FR  R@-O7[@,!H@Qx QY j @-@-bad RMA return @?@Q. j @-@-bad sys heap return @?@[@@TZ@-##@-#P#U@-M AtpucpcDpЍ@-)>~JO @1  B 2B 1-?|     ? B@@-A0 ^027"QZ@- M p p Ѝ @- @-tj @ 0 -0S=0 00 cj=Рd@- r@ cP@-<g c08@AjS0T@@-YPqPc@- 2 5d}]1VVW P#W+d@-V^VU@-VV@-V@V@-cV@^VU @-@-@-@-@-@-@-@- @- @-!@-)@- @-0@-i ak@hj @-@-system heap error@?@@-@-i ak@hj @-@-module error@?@@-0@-|A@-w{@-r)cu@-lp@-g3k @-"0@wdA-pA-p].QQ^4Q"PW3+*j]"`am0a "-1L0q@q{usuj "PT%1! T̅`\̅2kd@-]H-1 P ]; jD]dO- @ Q2 8@QQQdO- [ CJJ@(: W: WnB^@1`1 1J2P2t1  Q) Q`F0! %`#: " wP Q J  W1@1 1J2`G0PtpQdO-T`QP.`p @{ JP#%*p Z X @8p >`[ J8a pJjkdߏ@-o@-@- j DM,b +b nNd@-RNO-"@- RH  $хpN裞ቑ "剐  @-;  tK@-D  K'$! R!@-7 ! @-@-writing silly length to map @?@'@-0  O-`ledO-Z_dO-TYd@-"010H-;z`f l@-  #* R@-t~pt@-p~tp@-h0s>qd$&%@\^:"|, &@-0O @PS:",O:0   M *!  D  $0 `0 `VZ+[2P^0"P' ` PРMd@-.0 0 ` p0 pWZ#0*0PS*P`VJ*.0 @- *.P* 0 AA@-P pA-`bjh0@:0   j;$0 3$0s>11> 0)&0 `0sh0 "&.Library$.Library@@0 \0l0 %P":pd0sTOROPO]T@-@ T@z0UGs-( 0KjL"D*.0 ?j^0@B*@p-.0 #!* .09 0 P@4 3 pq {{j@ ^$+>@40z j 4@Dp@j(dw@-q2&F*F#4@-*j PQ]00``>AAN"@t-)!R+(  "%~"0I@@t3I- 0ud0@L` > 5PPv3 `$@2:v /0+(pT`7 50:  -ij@ 0PPP  pW:d@-.0 :@-QQ.>A@-0@-0* .0*]aRzr BAR B"0 R7r": "S:R:P1#+`@-PP@D2@!~ :X `O- `pA#*P aPzp @#P P @wz"Y!ӏpz#*P aPzp @#P P aYzy I!Y3V!!.Pa:Pӏ@-4 8@-42@-o4*@-&@-4  \  QZ@-..@-0  @-0@-0@-0 !@-  @-0 {  # Q@-@-&F*F!@- L-V0 X>F > )V5V0 t>H  {dHugoL-@-<F@-5@-^# P"@-)5P#3d@-T> PO-<qAd踀DllllD @LP-u`q`rkO-` Vv"#8*6 `|-|O @-kj  3 #  0# >U3:~2-@ `p @M. j @ 0 PЍЍ]@-vSVT [;;; t~?d{{9)j2`0! d0 h0 l1l-0 j> { j  6?{ @Hugo@-F 3#&4{#jj1- `@F4@F@#@F'@F=F0 @t u{{{ s{ {mm -_ ЍBpL@0TO- JP{j #+*[I{jj*N{j j;>- 0 @>jop q  q  p qqp qI qJ @- <@-< ~4Q0a 0 + "p1%"% P#%"%O  kL j!   8tp7#p0_- `)pF5FOKjO@"G^ T ^ 1W@QF 0 @{{s8s8{8u {j8{8u{}_-! !   0-R" !*냄-0j@0@wP%PPP I O @TL ]n4 yH @OAx-|B%|xL億HHtHDppq 0ON䩐# R*Rr"p5|2 P$` R:=DOAGj OA W, 0$jhÂ,,=_-V a@-i agk@hj @-@-CloseAll Error @?@`@-i aPk@h@-i aLk@hj @-@-FSC error @?@aOAkCa% @-i a.k@h@-i a*k@hj @-@-Heap error @?@c ]@- @ @-@-Adfs Init Error @?@/P-@1 DOA W,03B'1@ 1 V@^ "OrArp {-YOO A V>$ VU#"Q*1Q*"1hPZ/L-M! - /"+" ꢮ-*j".s".ߍ衰;L |  O-,n!{ jeWkUt L P-I[ 0kAADFSDiscOpHDCDrivesFreeSpace [Q]P-?-Mvru`q7q{r$uj 0l/*Q0q0"YPyPn j P>&]:Insert sourceInsert destination}j disc in drive wj0 %rj then press SPACE bar jjh*gj 0,8h[jp> 5 Uj T,% ( P Q30e?j`00$ 31 0( *VH(pH@F^@p=0"-!" 40400 j0QS1: 5Pt PESq:kߍdz{ ABEX*Bye closes all files, unsets all directories, and parks hard discs. Syntax: *ByeP-^kl*Compact tries to collect free spaces together by moving files. Syntax: *Compact []P-@-1 ,F{jnOM 0pIj-70I`E@Ep V+#pp ^,s@A@@ d X* W1^ YY*j@-@-*** ReturnWholeSpace GAVE ERROR TO *Compact *** @?@j@-@-*** ClaimFreeSpace GAVE ERROR TO *Compact *** @?@-/0"Ijx0 0  w ` > P>  0>t~ j ^@V Kp0Xpkl93  j@E8>`NvOߍkd*Dismount closes files, unsets directories and parks the given disc. Syntax: *Dismount []P-V}-1 ,\z`{a Wkd}@- @-`!0 PPaQE3H 5 0$0!5.1];PaQd*Drive sets the default drive to use if the directory is unset. Syntax: *Drive P-@ukk@-Are you sure (Y/N) ?{!{*{Y0y0?cd@-0*{?D- ^&@p`P@@ZP5P RYJ ?@- @NQ*Format prepares a floppy disc for use with the ADFS. L is the old 640K ADFS format. D is a new 800K format. Syntax: *Format L/D%24_%mi_%w3 Verifying ... P--,MU,jၑ   2j"; ,:>jn2aPzp @OIY0 Y>^Y0y0V{I , " D  9P`p- Formattingq{_jN\j `6pYPUP0@R:fO[!r s0s{Kj Y PY !L>lk<$4F'FF#F*F&F4pF(pF>FIF $40P%TPPEQ\A-  ?O A RA  B  9k jFormattedu q{Ks{{ ,ЍU?kd*Free displays the total free space on a disc. Syntax: *Free []P--1W ,y{jBytes free & j Bytes used &j^ kEj =K{{j*Map displays a disc's free space map. Syntax: *Map []P--MQ 6j ,1jg( start, length) 4{'j'Wrj} X  p(,) p { jW> T~kЍYpN-p$*Mount sets the directory to the root directory of the disc, sets the library if unset to $.Library if it exists, and unsets the URD. The default is the default drive. Syntax: *Mount []P-~-14. -j{s`u{gk~*NameDisc alters a disc's name. Syntax: *NameDisc P--.$j:0Q.jPPjp:0! ! @2 #B@T@q `s4qupr{%k*NoDir unsets the current directory. Syntax: *NoDirP-h~lh*NoLib unsets the library. Syntax: *NoLibP-d*NoUrd unsets the URD. Syntax: *NoUrdP-`*Title sets the title of the current directory. Syntax: *Title []P-s-pZO A y j#F'F Rr # p2Qkm*Urd sets the user root directory. Syntax: *Urd []P-I-1OD Oj`0e@F4@F `p}ekI*Verify checks the whole disc is readable. The default is the current disc. Syntax: *Verify []P--1 , Or @r?{ j"`@ 6Verified OK hk@-^QQ^0. z [`p#{j.NTʩxЍ*Configure drive sets the value the default drive is initialised to. Drive P--+O{j1Drive jo{ j *Configure Floppies sets the number of floppy disc drives attached. Floppies P--,O{hj1}Floppies j={0 j *Configure HardDiscs sets the number of hard discs attached. HardDiscs P-m-+O{k7ij1LHardDiscs bj {^80 Yj!T *Configure Step sets the step rate of one or all floppy disc drive. Step []P-4-@O]a{20j.j`O1 Step &j%Q!j0SL @ljPT!0!@!^Z !!"! *@ jP3/;:  <`kdPcP-P0:KAkURD Disc Option 0Dir. Lib. "Unset" "No Name" (Off) (Load) (Run) (Exec)LOAD &.!BOOTRUN &.!BOOTEXEC &.!BOOTO-PM p  7j^QQ^#@F'@F`6@O@@O" `4* @OLD@OAMO@`QOO@h V@OLD@d 9{PЍd@-qNO @-p{@j@-ZJ:J"Pv;"5P3002 2;J25P3?#$J"* O@O-PM p Rj@[PP``!~y; y {j 9SPЍpd DLWR%24:%mi:%se %dy-%m3-%ce%yrdir  @- `NwPL`OAPQk[Z20 g@~- $@- O GpN  0Op DQ&# : G@->p@-Pp@-PP^>DŽ`V`V[Zp@-@-@- 021 0SZ@- P027"@- @- 0S0  @-[ j  Q[jZd@-0jdx@-{x@-D k@-h~h0ll0|@F4@F `pЀ@-d~O:Az0q@-jd0e@F4@F `p}@-p9O"A"D ?{{ q{@-p%@-p*O"/@-pz@- +!j4$ DL dir j2  1{0{ j= 5{t2{ s@D{z1 @-j^ j" L!6 uO-8 {jpDM  "" j7D> 0q3n:mjD31 X21 D0@D2q{Z@- 0$@.{0q{pF4pF `{{jh9 `p d9p ؀@-  2j  33 3& &$j0 j .j-` q 0q{u{ q r s{qP{{W0qj{@q{{{}Ѝsu0A- Q-ju' >A aPzp @oOkFp0  p2:LPP0!~% t~{E- jH OAm@-h0~qq~@s߀@-PP 0h0@d0@P@- `p sOOKD PP ^>„`V `f`䠀O-O"A" D @EP&j0 ^2:;ppJ^aeiu `,;P22U1 1:P @-@Q;^{@aQZQPZdS@-`f W*P p4`2:S W4P-xqk@-i ak@hj @-@-ADFS Open error @?@O- ; fz0R;LY3I: Bj;#<; 4  ;.- 0*jx0; `p`㣞 xj 0@ 4 ЍP-ek@-i ak@hj @-@-Adfs Close error @?@O- 9j pj7M  j - U"{sx 1-#j @-@-Free Heap err@?@@-`px0@V60Pz7pp>P P- -j-8 Ak P-{ - j^-8 uBs{k P-i-ljp P0  JTYRV QRO{NjP\ X:pRGJ^ Y( ƒ,ƒpGH`p%usu upu') [jp- 0S0uxu u{ qz#*^1 p0 {Aj 0,ck ЍC-0@@ T T `0)` V `!Qb @P jpY@-xPdj @-@-Bad handle @?@@-0j @pr 7pg  W@-PPx r `6 а怽@-x1PK;d1 1 A300/400/1/MAIN_MENUACARC0AS>;  >MAIN_MENU & ARCHIMEDES DEALER TEST SOFTWARE 7 Version 1.00 15-June-1989 Author B. Rice (7 Version 1.01 23-June-1989 Author B. Rice 27 Version 1.02 27-June-1989 Author B. Rice <7 Version 1.03 5-July-1989 Author B. Rice FH This program will offer options for testing the 300/400 machines. P0 The program is roughly based on NMENU400. Z, This progrqm is called by dealer menu d/ V 1.00 Inital writing and modifications. n& V 1.01 Add PARK option to menu. x- V 1.02 Add COPY HFORM option to menu.  V 1.03 General tyding. D The program offers and selects the various tests which can be  performed.  Main Program init title  list_options  get_response  Ȏ TEST 1 , ("*DIR :0.A300/400/1.HARD_DISC")  "HD_FORMAT"  2 , ("*DIR :0.A300/400/1.HARD_DISC") " "DVERIFY" , 3 6, ("*DIR :0.A300/400/1.HARD_DISC") @ "HD_SOAK" J 4 T, ("*DIR :0.A300/400/1.HARD_DISC") ^ "HD_COPY" h 5 r, ("*DIR :0.A300/400/1.HARD_DISC") | "HD_PARK"  6 , ("*DIR :0.A300/400/1.UNIVERSAL")  "UT_MENU"  7  ("*DIR ^")  "DEALERMENU"  8  9     init 2 This procedure will initlise the program. ! Disanle Escape function.  *FX 229,1  Disable auto-repeat & *FX 11,0 0 7 :2 OPTIONS=7 : Number of choices on menu D- bottom%=1 : Minium option number N5 ut_tests%=6 : Minium none hard disc option X G$(OPTIONS,1) b get_res_int l set_valid_options v   get_res_int B This procedure will det the resedent intergers from cmos. ' ș "OS_Byte",161,30,0 R1,R2,R3  tsr%=R3  ID%=tsr% &0F  Q%=tsr%>>7  S%=(tsr% &40)>>6  E%=(tsr% &30)>>4 ' ș "OS_Byte",161,31,0 R1,R2,R3  MEM%=R3   set_valid_options  J This procedure will set which options are "valid" for the machine  being tested.   ID%=9 * lower_valid%=OPTIONS 4 upper_valid%=OPTIONS > H4 ID%=2 ID%=5 ID%=6 ID%=7 ID%=8 R! lower_valid%=bottom% \! upper_valid%=OPTIONS f p# lower_valid%=ut_tests% z! upper_valid%=OPTIONS     title  Display menu title  T%=400   ' BNR$=(132)+(157)+(131)+(141) ( BNR$;" A300/A400 Test Menu" ( BNR$;" A300/A400 Test Menu"    list_options  List menu options $ TEST=1 OPTIONS . G$(TEST,0) 86 4,TEST*2+4);130;(TEST+48);133;G$(TEST,0) B L% 23,1,1;0;0;0; : Cursor on V j get_response t& Wait for valid keyboard input ~ *FX15,0  ( 9,22);130"SELECT OPTION : ";  a$=  TEST=(a$)-48 3 TEST>= lower_valid% TEST <= upper_valid%  a$  Enable auto-repeat  *FX12,0  ' Hard Disc Formatter A400's only. ' Hard Disc Verifier A400's only. ' Hard Disc Soak Test A400's only.  ' Copy HFORM A400's only. ' Hard Disc Park A400's only. ( Other Tests.,Return to main menu. 2! Thats all no more program. PK|=*8  A300/400/1/UNIVERSAL/MEMOBJACARC0;  Memory test  ___________   Phase one: Incrementing patternpLL 4.( 2v 4 pW8W0 Phase two: TRUE hierarchy  T:.0PoQl T: R 0:1  Phase three: FALSE hierarchy 8# Phase two: Cycling bitsp  / T:. Q\/ T:p: All seems OK......  There were &b failures in total  TESTING ABORTED  X* Phase 1 fail at &PDF with &A instead of &:m X* Phase 2 fail at &DP+ with && instead of &u X* Phase 4 fail at &D with &  instead of &1uB `: P07`VZ@PKvoPoPA300/400/1/UNIVERSAL/PORTSACARC0A{-; >PORTS & ARCHIMEDES DEALER TEST SOFTWARE 8 Version 1.02 25-June-1989 Author B. Rice (8 Version 1.03 27-June-1989 Author B. Rice 28 Version 1.04 29-June-1989 Author B. Rice <8 Version 1.05 5-July-1989 Author B. Rice FH This program will test the floopy disc drive, the RS423 port, the P printer port. Z5 This program is based on PORTS V 1.01 12-8-87. d+ The program is chained from "SCREEN" n( V 1.02 Inital mods and rewriting. xD V 1.03 Remove ProcDisc and replace with a modified version of K PROCDISC taken from the Universal Production Test Software 3. < Version of the source ports porgram is V 1.10. L V 1.04 Addition of PROCcheck_disc, which checks to see if the disc in . drive 0 is the dealer test disc.  V 1.05 General tyding.  % Port Test or Soak Test Program ? Global flag E% = 0 if Printer test is not to be executed 5 E% = 1 if Epson compatible printer + E% = 2 if Olivetti JP101  For Final Banner :- ; Flag F% will be set to TRUE if there is a DISC error = Flag R% will be set to TRUE if there is an RS423 error : Global flag S% is TRUE if there was a STATCHK error   Main program " 6 , 7 6 *FX15,0 @ *FX11,0 J' BSK= : Soak Test or Port Test TK FDSC= : Floppy Disc Test (Useful for disabling disc in soak test) ^ INIT h getresint r FDInit |5 BSK E%=0 : Disable printer test if Soak Test J If this program is used as a Port Test and E% has not been set as a H resident integer variable by preceeding ARCHIMEDES Test Programs, $ then disable the printer test  BSK (E%<0 E%>2)  E%=0   BSK  loop=   loop=    BSK  cnt=cnt+1 @ '(9)(134)"SOAK TEST"(135)"(";cnt" tests)"(40-);  & BSK 0 '(32)(135)"FAILS" : D0 '(134)" FLOPPY DISC DRIVE TESTS"(40-) N N%=2 X (134);" Drive 0" b l DISC(0) v N%=2 4 (134);" Drive 1 "   N%=2  N%=1  DISC(1)  0 (80);(134)" PORT TESTS";(40-);(40);  RS423  PRINTER  BSK  28,0,24,39,+1,12,26   loop=  report  FINALE  *FX12,0   ("*DIR :0.A300/400/1") * "MAIN_MENU" 4 > H INIT R loop= \! buf 512,dcb 16,mcode 200 f BSK p F(10) z I%=0 10  F(I%)=0   cnt=0   rs423constants  assmreadwrite  DealerFS%=&100  disc_name% &0F  number_length%=7  version_length%=2  ref_number$="0283090"  ref_version$="01"    getresint ' ș "OS_Byte",161,30,0 R1,R2,R3 $ tsr%=R3 . ID%=tsr% &0F 8 Q%=tsr%>>7 B zzxzzxz%=(tsr% &40)>>6 L E%=(tsr% &30)>>4 V' ș "OS_Byte",161,31,0 R1,R2,R3 ` MEM%=R3 j t ~ n(N,A$,M)  N - A$=129+136+"FAILED"+137+135+A$  ! A$=130+" PASSED "+A$   A$;(33-A$);  R=  BSK  (40-);    N  F(M)=F(M)+1   135;F(M);(40-);  ( 2 nt(A$) <& 131" "A$" NOT TESTED"(40-); F P Z rs423constants d A1 constants n EnterOS = &16 x SVCmode = 3  Ibit = 1<<27  Osbyte = 6  ACIA constants  Baseaddress =&033B0000  Acia = Baseaddress  AciaTxDreg = Acia + 2  AciaRxDreg = Acia + 0  AciaStatusreg = Acia + 4  AciaCommandreg = Acia + 8 ! AciaControlreg = Acia + 12  Control constants 7 RTS_DTR = &02 : RTS high DTR high 7 rts_DTR = &0A : RTS low DTR high 6 RTS_dtr = &03 : RTS high DTR low 6 Trigger = &0B : RTS low DTR low 7 Reset = &02 : RTS high DTR high "% Status constants and masks , dcdlow = &50 6 dcd_dsrlow =&10 @ RTS_DTRhigh = &70 J ControlStatusmask = &70 T Paritymode = &20 ^ Noparity = &0 h Rxmask = &08 r RxRegFull = &08 | Txmask = &10  TxRegFull = &00  TxRegEmpty = &10  Commandmask = &F0  DatumControlbyte = &10 # Programme MAX. constants  MaxBitPattern = &FF  Maxattempts = 10 1 MaxBaudRate = 8 : 19200 baud  MaxCommstate =&1C  Test patterns  Testpattern5 = &55  TestpatternA = &AA 0 TestBaudRate = 0 : 9600 buad    RS423 & 0 rs423error : PASS = D FAIL = N result = PASS X rs423test b result l$ n(result,"RS423 port",6) v  R%=result    read(register)  read(register)  =data   assmreadwrite  pass = 0 2 2  P% = mcode  [ OPT pass @.irqoff SWI EnterOS ;enter supervisor mode : TEQP pc,#Ibit+SVCmode ;kill interrupts - MOV r0,#&03200000 ;ioc  8 LDRB r1,[r0,#&28] ;read IRQB mask 6 STRB r1,oldmask ;save oldmask  9 BIC r1,r1,#(1<<2) ;disable acia IRQ *< STRB r1,[r0,#&28] ;introduce new mask 41 BAL exit ;goodbye >; H@.irqon SWI EnterOS ;enter supervisor mode R: TEQP pc,#Ibit+SVCmode ;kill interrupts \. MOV r0,#&03200000 ;ioc f? LDRB r1,[r0,#&28] ;read current IRQmask p? LDRB r2,oldmask ;retrieve old IRQmask z) r2,r2,#(1<<2) ; + BIC r1,r1,#(1<<2) ; * R r1,r2,r1 ; ? STRB r1,[r0,#&28] ;re-establish oldmask 2 BAL exit ;goodbye ; @.write SWI EnterOS ;enter supervisor mode : TEQP pc,#Ibit+SVCmode ;kill interrupts B LDR r1, ioaddress ;get i/o address into r1 D LDR r0, iodata ;get data to write into r0 5 STRB r0,[r1] ;write data 3 BAL exit ;and quit ; @.read SWI EnterOS ;enter supervisor mode : TEQP pc,#Ibit+SVCmode ;kill interrupts B LDR r1, ioaddress ;get i/o address into r1 4 LDRB r0,[r1] ;read data $C STR r0,rddata ;store in variable rddata .; 8=.exit TEQP pc,#0 ;restore interrupts BD MOV r0,r0 ;don't know what this does L1 MOVS pc,r14 ;return V<.rddata EQUD 0 ;read data storage `!.ioaddress EQUD &00000000 j!.iodata EQUD &00000000 t.oldmask EQUD 0 ~ ] pass    rs423error  irqon  init_acia = ș Osbyte,2,0 : selects keyboard and disables rs423 ' ș Osbyte,3,0 : disable rs423   " at line"     init_acia < ș Osbyte,15,0 : flush all buffers ? ș Osbyte,7,TestBaudRate : set rx test baudrate (? ș Osbyte,8,TestBaudRate : set tx test baudrate 2 ș Osbyte,156,&1C < F P rs423(data) ZD data sent and recieved via rs423 and tested for correctness d7 ș Osbyte,2,1 : select and enable rs423 port n. ș Osbyte,3,7 : enable rs423 driver x4 ș Osbyte,21,2 : flush rs423 output buffer data  attempts = 0   returndata = (10)  attempts +=1 3 returndata <> -1 attempts > Maxattempts ' ș Osbyte,3,0 : disable rs423  returndata <> data  result = FAIL = ș Osbyte,2,0 : selects keyboard and disables rs423    rs423test  test_controllines  result "- n(result,"RS423 control lines",7) , 6 @ test_datalines J result T* n(result,"RS423 data lines",8) ^ h r test_baudrate | result ( n(result,"RS423 baudrate",9)  test_communistate  result - n(result,"RS423 RX/TX format",10)    test_baudrate  init_acia  baudrate = 1  C ș Osbyte,7,baudrate : set rx baud rate C ș Osbyte,8,baudrate : set tx baud rate  rs423(TestpatternA) & rs423(Testpattern5) 0 baudrate +=1 :/ baudrate > MaxBaudRate result = FAIL D N X test_communistate b+ test parity,stopbit and wordlength l init_acia v commstate = 0  ș Osbyte,156,commstate  rs423(Testpattern5)  commstate += 4 1 commstate > MaxCommstate result = FAIL    test_controllines  irqoff  init_acia & write(AciaCommandreg ,RTS_DTR) D (read(AciaStatusreg) ControlStatusmask) <> RTS_DTRhigh  result = FAIL  & write(AciaCommandreg ,rts_DTR) ? (read(AciaStatusreg) ControlStatusmask) <> dcdlow  result = FAIL * 4& write(AciaCommandreg ,RTS_DTR) >D (read(AciaStatusreg) ControlStatusmask) <> RTS_DTRhigh H result = FAIL R \& write(AciaCommandreg ,RTS_dtr) fC (read(AciaStatusreg) ControlStatusmask) <> dcd_dsrlow p result = FAIL z & write(AciaCommandreg ,RTS_DTR) D (read(AciaStatusreg) ControlStatusmask) <> RTS_DTRhigh  result = FAIL Q write(AciaCommandreg ,((read(AciaCommandreg) Commandmask) Trigger))  irqon    test_datalines  init_acia : ș Osbyte,7,TestBaudRate : set rx test baudrate ; ș Osbyte,8,TestBaudRate : set tx test baud rate  bit% = 0 7  bitpattern = 2^bit%  rs423(bitpattern)  bit% $ rs423(Testpattern5) . rs423(TestpatternA) 8 B L write(address,data) V !ioaddress = address ` !iodata = data j write t ~  read(address)  !ioaddress = address  read  data = ?rddata    DISC(DR%)  *RMKILL ADFS  *RMREINIT ADFS   PASS = : FAIL = @ F%=: Error flag for DISC tests  wrtprt  rwe    ( 2 wrtprt < X= F Y= P wpe%=0 Z result = PASS d 31,X,Y n3 " "(133);"Checking write protect";(40-); x chkwp=  X=X-2  Y=Y-2  wrtprterr  wpe%=0 ' ("SAVE :0.$.TEST 9000+100")  result=FAIL   31,X,Y # n(result,"Write Protect",1)  result=FAIL  F%=   *FX 21 0   ' " Insert Test Disc 2";(40-) "% " Then Press SPACE";(40-) , 6 a$= @ a$=" " J 31,X,Y T (120); ^ h r wrtprterr | =67785  wpe%=1  result=PASS          rwe  *DIR :0   0,20)(40)  0,21)(40)  0,22)(40) & ș "ADFS_FreeSpace",":0" R0 & R0<>&C7400 0. 0,20)" Disc not blank";(40-) :@ 0,21)" Ensure Test Disc 2 is in Drive 0";(40-) D> 0,22)" Then Press SPACE to continue.";(40-); N X a$= b a$=" " l *DIR:0 v  R0=&C7400   WP2  ("OPT 4 3")  0,20)(40)  0,21)(40)  0,22)(40)  WPERR=0   WPERR<>67785  *OPT 4 0  X=0  Y=5  chkwp=   result=PASS  TR%=-38   * TR%=TR%+40 4 DR%=0 > SN%=16*TR% H GENDAT R 31,X,Y \/ (133);" Writing track ";TR%;(40-); f2 Op(Write%,SN%*&100 (DR%<<29),buf,&200) p TR%=122 IE%<>0 z 31,X,Y  n(result,"Write Test",2)  result=FAIL  F%=    X=  Y=  result=PASS  TR%=-38   TR%=TR%+40  DR%=0  SN%=16*TR%  31,X,Y . (133)" Reading track ";TR%;(40-); 1 Op(Read%,SN%*&100 (DR%<<29),buf,&200) $ CHKDAT ." TR%=122 IE%<>0 CE%<>0 8 31,X,Y B n(result,"Read Test",3) L result=FAIL V F%= ` j t X= ~ Y=  result=PASS  TR%=-38   TR%=TR%+40  DR%=0  SN%=16*TR%  FLUSHBUF  31,X,Y / (133);" Erasing track ";TR%;(40-); 2 Op(Write%,SN%*&100 (DR%<<29),buf,&200)  TR%=122 IE%<>0  31,X,Y  n(result,"Erase Test",4)   result=FAIL  F%=  ( (133);" "; 2 < F WP2 P =67785 Z, 0,20)" Disc Protected";(40-) d> 0,21)" Ensure Test Disc 2 is in Drive 0";(40-) n< 0,22)" Then Press SPACE to continue.";(40-); x WPERR=   a$=  a$=" "  *DIR:0     GENDAT F Generate 256 bytes equal to track number followed by 0 to 255  W%=0255  buf?W%=TR%  buf?(W%+256)=W%  W%    FLUSHBUF " W%=0255 , buf?W%=&E5 6 buf?(W%+256)=&E5 @ W% J T ^ CHKDAT h CE%=0 r W%=0255 | TR%<>buf?W%  CE%=1   W%<>buf?(W%+256)  CE%=2   W%  CE%<>0  result=FAIL     FDInit  IE%=0  A=0  ErrDiscAdd%=0  AdfsDiscErr%=&0108C7 & AdfsSwi%=&0040240 0 sector%=0 : Read%=1 D Write%=2 N X b DUMP l v( "Enter sector to dump";sector%  sector%<0    I%=0&FF  buf?I%=I%  I% 5 Op(Read%,sector%*&100 (DR%<<29),buf,&100)  I%=0&FF 16  @%=3  ~I%": ";  @%=10  J%=0 15 4  ~!(I%+J%+buf);" ";  J%   " ";  J%=015   K%=?(I%+J%+buf) * K%>31 4 K% > H &2E R \ J% f p @%=3 z I%  sector%=-1    Op(b%, C%, D%, E%)  E ș AdfsSwi% (1<<17), 0, b%, C%, D%, E% IE%,A,ErrDiscAdd% ) nodisc=((!IE% &FFFFFF)=&108D3)  nodisc  31,X,Y 0 0,20)" Disc NOT Present";(40-) 9 0,21)" Ensure Disc is in Drive 0";(40-) > 0,22)" Then Press SPACE to continue.";(40-);   a$=  a$=" "  31,X,Y $ (120); . 8/ nodisc : Disc present B 0,20)(40) L 0,21)(40) V 0,22)(40) `# wp=((!IE% &FFFFFF)=&108C9) j chkwp wp t; : Write protect working ok ~  chkwp wp  result=FAIL 7 : Write protect failed   IE%=0    result=FAIL  (129)" "; * ((!IE%) &FFFFFF)=AdfsDiscErr%  IE%=IE%?3  "ADFS ERROR";    I%=4  ȕ IE%?I%  IE%?I% ( I%=I%+1 2 < F " Error &";~!IE% P Z d report n= this procedure will report any failures to the user. x *FX21,0  E%<>0  2   F%=FAIL & (133)" FAILED DISC TEST"   R%=FAIL ' (133)" FAILED RS423 TEST"   S%=FAIL * (133)" FAILED CONFIGURATION"   3 , (F%=FAIL) (R%=FAIL) (S%=FAIL)  # (133);"NOTE FAILURES" " , 6 @ J. "Insert Dealer Test disc 1";(40-) T% "Then Press SPACE";(40-) ^ *FX15,0 h r a$= | a$=" "  check_name  *DIR:0  11  11  11  11    disc_ok=    check_name L This procedure will check that the name on the disc is that for the  dealer test disc.  disc_name$=""  ("*DIR :0") - ș "OS_GBPB",5,0,disc_name% R0,R1,R2 & length%=disc_name%?0 0 I=1 length% :. disc_name$=disc_name$+(disc_name%?I) D I N/ disc_number$=disc_name$,number_length%) X1 disc_version$=disc_name$,version_length%) b# disc_number$=ref_number$ l disc_number%= v  disc_number%=  & disc_version$>=ref_version$  disc_version%=   disc_version%=  + disc_number%= disc_version%=  disc_ok=   disc_ok=     FINALE  6  7 *, F$=(141)+(129)+(157)+(135)+(136) 4, P$=(141)+(130)+(157)+(132)+(137) > F% R% S% H C$="FAILED" R B$=F$ \ A$=" "+(129)+(157) f N%=5 p z C$=" TESTS COMPLETE"  B$=P$  A$=" "+(130)+(157)  N%=3   'A$  K%=0 5  L%=1 2  B$;(N%*K%);C$    A$  2   3  (131)" ";  E%=1 E%=2 $ 2 . "TESTS COMPLETE"'' 8 1,10,1,10,1,10,3 B 3 L V; '" PRESS"(136)""(137)"TO CONTINUE"''" "; ` *FX15,0 j t a$= ~ a$=" "    PRINTER   E%=0  nt("PRINTER") ( : NO PRINTER ATTACHED   *FX5,1  Printer options * E%=1 Epson compatible printer  E%=2 Olivetti JP101  Select Printer   printer = E% # Epson printer parameters  Maxpattern = 2 ( Maxbit = 7 2 Maxdot = 22 < Maxline =2 F3 Pattern = Maxdot * Maxpattern * (Maxbit + 1) P No_ofBitImage = Pattern Z# LoByte = No_ofBitImage 256 d# HiByte = No_ofBitImage 256 n! Jet printer parameters x Heightbytes = 8  Pattern = 2  Widthbytes=6 ; "control$" is the code to define the Image for Jet N control$= (27)+"G9;"+(2*Widthbytes)+";"+(Heightbytes)+";2"+(27)+"Z"  errorflag% =  printererror  printer epson,jet  errorflag%  2  "TEST FAILED"  3     epson  2 " 1,27,1,64 : Reset ," 1,13,1,10 : CR and LF 6 3 @ 2,13); J 2 T "PRINTER TEST"; ^" 1,13,1,10 : CR and LF h line=1 Maxline r epsontest |" 1,13,1,10 : CR and LF   " COMPLETE";  NOW=   DO NOTHING  -NOW=130 ! 1,13,1,10 : CR and LF  1,27,1,64 : Reset  3    jet  setcontrol  2  1,27,1,48 : Reset ! 1,13,1,10 : CR and LF & 3 0 2,13); : 2 D "PRINTER TEST"; N 1,13,1,10 X CR and LF b jptest l! 1,13,1,10 : CR and LF v " COMPLETE"; NOW=   DO NOTHING  -NOW=1000 ! 1,13,1,10 : CR and LF  1,27,1,48 : Reset 3    jptest  pattern = 1 Pattern " Send CONTROL to printer * controlbyte=0 ((control$)-1) !! 1,CONTROL?controlbyte ! !$ bit = 0 (Heightbytes-1) !  line = 0 7 !*" no = 1 Widthbytes !4 D = 1< 1,D,1,0 !H !R !\ !f !p !z ! setcontrol ! CONTROL (control$) ! $CONTROL = control$ ! ! ! epsontest !) 1,27,1,"*",1,0,1,LoByte,1,HiByte ! pattern=1 Maxpattern ! bit=0 Maxbit ! code= 2^bit ! dot=1 Maxdot ! 1,code ! " " " "$ ". printererror "8 "B# errorflag%= : errorflag "L *FX15,0 "V$ 1,13,1,10 : CR and LF "` "PRINTER TEST FAILED" "j$ 1,13,1,10 : CR and LF "t 3 "~ " "( Thats all folk's no more program. " PKs^55A300/400/1/UNIVERSAL/SCREENACARC0A >;  >SCREEN  ARCHIMEDES TEST SOFTWARE < Version 1.14 16-December-1988 for RISC OS 2.00 +nw (< Version 1.15 5-July-1989 Brian Rice for Dealer S/W 2) Speaker, Headphones and Video Tests < F data 255, PIC$(15) P Z Constants d(Spacechar = 32 : ASCII "space" nMaxalpha = 2*/4 - 2*/4/20 x'Maxchar = 256 : ASCII "????" Maxcolour = 63 Maxcount = 5000 Maxcursor = 4 Maxdisplay = 5 Maxmode = 1 Maxpalettecolour = 15 Maxstrip = 15 Maxwidth = 1280 Basecolour = 0 Bordercolour = 1 Red = 1 Green = 2 Blue = 3  Grey = 4 Bright = 3  Dull = 0 "Finished = 5 , First = 0 6 Mid = 8 @ Next = 1 JStartalpha = 2*/4/20 TNextalpha = 2*/4/20 ^DiagDatum = 1000 hYdatum = 850 rYheight = 970 |Xdir = 640 Xcentre = 640 Ycentre = 512 Ydir = 410  Size = 78 Border = 16 Outerdiameter = 400 Bandwidth = 26  MAIN PROGRAMME  6  Disable key auto-repeat  *FX11,0  speaker  headphones ! 0 : necessary for cursor  pixel_modes  testColours && ș "OS_Byte",161,30,0 R1,R2,R3 0 ID%=(R3 &0F) :6 ID%=2 ID%=5 ID%=6 ID%=7 ID%=8 hires D Enable key auto-repeat N *FX12,0 X 7 b4 '(134)"LOADING NEXT TEST. PLEASE WAIT"''" "; l "PORTS" v  banner  0,Maxpalettecolour  25 4,0;Ydatum-Border; & 25 101,Xcentre;Yheight+Border;  colourtitle  0,Basecolour # 25 4,Xcentre;Ydatum-Border; ' 25 101,Maxwidth;Yheight+Border;   changeBaseColour  Ȏ basecolour  Red : basecolour = Green  ! Green : basecolour = Blue  Blue : basecolour = Grey    basecolour = Finished * 4 H colourtitle R Ȏ basecolour \$ Red : title$ ="RED SCALE " f' Green : title$ ="GREEN SCALE " p' Blue : title$ = "BLUE SCALE " z' Grey : title$ = "GREY SCALE "   Maxpalettecolour  5,8)title$  ( cursor(shapeno%,W%,H%,AX%,AY%,D%)  block 9  block?0=0:block?1=shapeno%  block?2=W%:block?3=H% ( block?4=AX%:block?5=AY%:block!6=D%  ș 7,&15,block   cursorcolours  19,1,25,0,&F0,0  19,2,25,&50,&50,0 $ 19,3,25,&F0,0,0 . B cursormove L X% = 0 V cursor = 1 ` j Y%=.78*X% t, ș 6,106,cursor : cursor ~ setposition(X%,Y%)  *FX19 > cursor > Maxcursor cursor = First cursor += Next  X% += 5  X% >= 1180   cursorshape  cursor = 1  ddL   strip=First   PIC$(strip)   strip += Next  strip > Maxstrip  I%=0 &7F 8 ( I1%=0 4 4 2 B%=0 < J% = 16 1 -1 F/ B%=(B%<<2)+PIC$(I%>>3),J%+(I1%<<2),1) P Z data!(I%+I1%)=B% d n x% cursor(cursor,8,16,0,0,data)  cursor += Next  (cursor > Maxcursor)   displaybar  banner  colour = First   rectangle(colour)  colour += Next ! colour > Maxpalettecolour   displayCircle  29 Xcentre;Ydir;  colour = Maxpalettecolour " , 0,colour 6) index = Maxpalettecolour - colour @ 25 4,0;0; J5 25 157,(Outerdiameter-(Bandwidth*index));0; T colour -= Next ^ colour < Basecolour h | goonybird  cursorcolours  cursorshape   mixPalette(basecolour)  palettecolour = First   setmix(basecolour) 5 19,palettecolour,16,redmix,greenmix,bluemix M palettecolour = Mid 19,Bordercolour,24,redmix,greenmix,bluemix  palettecolour += Next ( palettecolour > Maxpalettecolour   pixel_modes  block 6 & goonybird 0 mode = 0 : D mode N X alpha = Startalpha b l 25,4,0;DiagDatum; v' xdirection = DiagDatum*alpha  25,5,xdirection;0;  alpha += Nextalpha  alpha > Maxalpha  cursormove  mode += Next  *FX15,0  t=025000:  *FX15,0  exit =  mode >= Maxmode   rectangle(colour)  0, colour  ) 25 4,(colour*Size+Border);Ydatum; 1 25 101,(colour*Size+Size+Border);Yheight;   4 setmix(colour) > Ȏ colour HF Red : redmix = palettecolour << 4 : greenmix = 0 : bluemix = 0 RH Green : redmix = 0 : greenmix = palettecolour << 4 : bluemix = 0 \G Blue : redmix = 0 : greenmix = 0 : bluemix = palettecolour << 4 f#  redmix = palettecolour << 4 p- greenmix = palettecolour << 4 z, bluemix = palettecolour << 4    setposition(X%,Y%) $ ?block=3:block!1=X%:block!3=Y%  ș 7,&15,block   testColours  12   basecolour = Red   mixPalette(basecolour)  displaybar  displayCircle $ changeBaseColour . *FX15,0 8 t=025000: B *FX 15,0 L exit = V basecolour >= Finished ` t test256 ~ 13   29,Xcentre;Ycentre;  tint = Bright   23,17,2,tint<<6| xsc = 128*tint + 128 + 1  ysc = xsc  var = /180*360/64  colour = Basecolour  0,colour  0,0 / xsc*(colour*var),ysc*(colour*var) ; &B5,xsc*(colour*var+var),ysc*(colour*var+var)  colour += Next  colour > Maxcolour ( tint -= Next 2 tint < Dull < *FX15,0 F exit= P d& 00000000001111111111000000000000 n& 00000000011111111111100000000000 x& 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000000000000000000000000000 & 00000000222222222222220000000000 & 00000000222222222222220000000000 & 00000000022222222222200000000000 & 00000000002222222222000000000000 & 00000000000000330000000000000000 & 00000003333333333330000000000000 & 00000000000000003333333330000000 & 00000000000000000000003333330000 & 00000000001111111111000000000000 & 00000000011111111111100000000000 & 00000000111111111111110000000000 "& 00000000111111111111110000000000 ,& 00000000111111111111110000000000 6& 00000000111111111111110000000000 @& 00000000111111111111110000000000 J& 00000000000000000000000000000000 T& 00000000222222222222220000000000 ^& 00000000222222222222220000000000 h& 00000000022222222222200000000000 r& 00000000002222222222000000000000 |& 00000000000000330000000000000000 & 00000003333333333330000000000000 & 00000000000000003333333330000000 & 00000000000000000000003333330000 & 00000000001111111111000000000000 & 00000000011111111111100000000000 & 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000000000000000000000000000 & 00000000222222222222220000000000 & 00000000222222222222220000000000 & 00000000022222222222200000000000 & 00000p00002222222222000000000000 & 00000000000000330000000000000000 && 00000003333333333330000000000000 0& 00000000000000003333333330000000 :& 00000000000000000000003333330000 D& 00000000001111111111000000000000 N& 00000000011111111111100000000000 X& 00000000111111111111110000000000 b& 00000000111111111111110000000000 l& 00000000111111111111110000000000 v& 00000000111111111111110000000000 & 00000000111111111111110000000000 & 00000000000000000000000000000000 & 00000000222222222222220000000000 & 00000000222222222222220000000000 & 00000000022222222222200000000000 & 00000000002222222222000000000000 & 00000000000000330000000000000000 & 00000003333333333330000000000000 & 00000000000000003333333330000000 & 00000000000000000000003333330000 & 00000000000000000000000000000003 & 00000000000000000000000000033330 & 00000000000000000000000001333000 & 00000011222221000011111111100000 & 00001111122222111122222110000000 & 00011111122222222222221000000000 & 00111000122222222222221100000000 *& 01110000122222222222222210000000 4& 11000000122222222222222221000000 >& 10000001222211111111122222100000 H& 00000112221100000000001222100000 R& 00001222221000000000000011100000 \& 00112222100000000000000001100000 f& 11222221000000000000000001100000 p& 12222210000000000000000001100000 z& 11111100000000000000000000100000 & 11111111111000000000000000000003 & 11122222222100000000000000033330 & 00001112222210000000000001333000 & 00000001222221000011111111100000 & 00000000122222111122222110000000 & 00000000122222222222221000000000 & 00000000122222222222221111111000 & 00000000122222222222222222221100 & 00000000122222222222222222222210 & 00000001222211111111111111122210 & 00000112221100000000000000122210 & 00001222221000000000000000012210 & 00112222100000000000000000001210 & 11222221000000000000000000000110 & 12222210000000000000000000000000 & 11111100000000000000000000000000 $& 00000000000000000000000000000003 .& 00000000000000000000000000033330 8& 00000000000000000000000001333000 B& 00000011222221000011111111100000 L& 00001111122222111122222110000000 V& 00011111122222222222221000000000 `& 00111000122222222222221100000000 j& 01110000122222222222222210000000 t& 11000000122222222222222221000000 ~& 10000001222211111111122222100000 & 00000112221100000000001222100000 & 00001222221000000000000011100000 & 00112222100000000000000001100000 & 11222221000000000000000001100000 & 12222210000000000000000001100000 & 11111100000000000000000000100000 & 11111111111000000000000000000003 & 11122222222100000000000000033330 & 00001112222210000000000001333000 & 00000001222221000011111111100000 & 00000000122222111122222110000000 & 00000000122222222222221000000000 & 00000000122222222222221111111000  & 00000000122222222222222222221100 & 00000000122222222222222222222210 & 00000001222211111111111111122210 (& 00000112221100000000000000122210 2& 00001222221000000000000000012210 <& 00112222100000000000000000001210 F& 11222221000000000000000000000110 P& 12222210000000000000000000000000 Z& 11111100000000000000000000000000 n speaker x Amplitude = -15  Duration = 10  7 % 10,9)(134)"LOUDSPEAKER TEST" + '(135);(7)"LISTEN AND CHECK SOUND" J '(135);(3)"THE PRESS"(136)""(137)"TO CONTINUE"''" ";  *FX15,0  Ƞ 8  *VOLUME 127  *SPEAKER ON   stereo%=-127  voice%=1  tZP  chan%=1 8 4 ("CHANNELVOICE "+(chan%)+" "+(voice%))  Ȣ chan%,stereo% " pitch% , chan%,-15,pitch%,8 6 chan%=4 @ stereo%=127 J wait(0.4) T ^ wait(0.4) h r wait(0.4) | (0)=32  *SPEAKER OFF  *VOLUME 1 & 122,105,113,85,85,113,122,105   headphones  6  7  *FX15,0  Ƞ 8  *VOLUME 80  *SPEAKER OFF + 7,9)(134)"HEADPHONE TEST RUNNING" % '(8)"LISTEN AND CHECK SOUND" D '(4)"THEN PRESS"(136)""(137)"TO CONTINUE"''" ";  & stereo%=-127 0 voice%=1 : dZQ D chan%=1 8 N4 ("CHANNELVOICE "+(chan%)+" "+(voice%)) X Ȣ chan%,stereo% b pitch% l chan%,-15,pitch%,8 v chan%=4  stereo%=127  wait(0.4)   wait(0.4)   wait(0.4)  (0)=32  *SPEAKER ON  *VOLUME 1 ( 172,155,163,143,143,163,172,155    wait(SECS)  NOW=    DO NOTHING   -NOW=100*SECS * 4 > hires H 1 R1 '''" High resolution monitor tests." \0 '"Check for linearity and a clean,noise" f1 "free display on high resolution monitor" p 1 zT ' "Ensure Hi-res and Standard RGB monitors";'" are at least 500mm apart"  7 * '" Run the Hi-res tests (Y/N)?";  A=  A=89 A=121  "Yes"   TDU   ("*CO. MONITORTYPE 2")  22  ID%=2  moncon    tfS  X=100 660 2 $ X,0 . X,979 8 X B X=681 1271 2 L X,0 V X,979 ` X jf " Adjust VR1 until both blocks are of equal shade - Press to continue" t *FX15 0 ~ t=0 25000   A=   X=79 2279 20  X,5  X,1979  X 5 " Press space for horizontal"  *FX15,0  t=0 25000   A=  Y=5 1979 20   79,Y  2279,Y  Y ( 11 28 " Press space for inverse video" < *FX15,0 F t=0 25000 P Z A= d 23,17,5,0,0,0,0,0,0,0 n 0 x  X=9 2299 20  X,5  X,1979  X  Y=5 1979 20  9,Y  2299,Y  Y ! "PRESS SPACE TO CONTINUE"  *FX15,0  t=0 25000   A=  "CO. MONITORTYPE 0"  23,17,5,0,0,0,0,0,0,0  7 " 6 moncon @ P% 1023 J VIDC = &03400000 T[ ^ .VIDCprog h ; R0 is data to program r SWI "XOS_EnterOS" | MOV R1,#VIDC  STR R0,[R1]  TEQP PC,#0  MOV R0,R0  MOV PC,R14 ]   dBU " 195, 25, 33, 31, 191, 195  R% = &80 &94 4  A% ! A% = (A%<<14) + (R%<<24)  ~A%  VIDCprog   & Thats all folks PK2ϝEEA300/400/1/UNIVERSAL/STATCHKACARC0AI7;  >STATCHK & ARCHIMEDES DEALER TEST SOFTWARE 7 Version 1.30 19-June-1989 Author B. Rice (7 Version 1.31 5-July-1989 Author B. Rice 25 This program will test the battery backed RAM. The program reports the PHYSICAL address if there is an J@ error. This number less 64 equals the locations described T+ in the Programers Manual PG 323,324. ^D The locations to be missed in the defult test are show within h the appropiate procedure. rF IMPORTANT - Econet Station Number is set to zero, since this is | not done by R-Power-On G Global flag S% set to TRUE if there is an error for final banner   MAIN PROGRAM  init  heading  reade2  chkprm  testram  set_error  report  set_status & ("*DIR :0.A300/400/1.UNIVERSAL")  "TIME"    init & code% 1000, stack 256 0 6 : 7 D IOC=&03200000 N IOCControl=&0 X IOCControlSoftCopy=&106 b EnterOS=&16 l SVC_mode=3 v Timer0LR=&4C  Timer0CL=&40  I_bit=1<<27  assm 8 SA%=&10 : Start address of used area 6 EA%=&FF : End address of used area 4 e2(255) : Array for current values 5 df(255) : Array for defaults values < notchk(255) : Array for addrs no to be checked B config_error= : configuation TRUE=corrupt, FALSE=correct B aa55_error= : AA/55 Test TRUE=corrupt, FALSE=correct B verify_error= : Verification TRUE=corrupt, FALSE=correct , S%= : Global Failed Flag ! read defaults into array  X%=0 255   df(X%)  X%  ( read no check values into array * X%= 0 255 4 notchk(X%) > X% H R \ set_status fC This procedure will set the status byte for the stack test p' ș "OS_Byte",161,30,0 R1,R2,R3 z! tsr%=(R3 &BF)+((S%)<<6) * ș "OS_Byte",162,30,tsr% R1,R2,R3    set_error + Procedure to set the error flag S%  config_error  ( (129);"Configuration Lost."  S%=   aa55_error  ' (133);"AA / 55 Test Fail."  S%=   verify_error $ ., (133);"Verification Test Fail." 8 S%= B L V ` report jB This procedure will report test status and final message. t S% ~# (133);"NOTE FAILURES"    (130)"PASSED"   ; (137)"PRESS"(136)""(137)"TO CONTINUE."  *FX15,0   a$=  a$=" "  0 (134);"LOADING NEXT TEST. PLEASE WAIT";  *FX12,0  15   ( heading 2 <3 This procedure print's the program heading F7 (131);"Battery Backed Ram (BBR) test running." P7 (131);"--------------------------------------" Z d" " Press to scroll" n x3 28,0,24,39,5 : set up screen window 0 14 : Turn on page mode    testram 9 aa55tst : check static RAM with &55 and &AA 9 set_station : set econet station number to zero 9 write2 : write e2 array back to static RAM : verify : verify static RAM against e2 array    reade2 ' read static RAM into the array ( " Reading BBR into main memory."  X%=SA% EA%  !io_addr=X%  RDVAL " e2(X%)=?io_data , X% 6 @ J aa55tst T= check read/write function of BB RAM with &55 and &AA ^/ " Checking read/write function of BBR." h X%=SA% EA% r !io_data=&55 | !io_addr=X%  WRVAL  X%  X%=SA% EA%  !io_addr=X%  RDVAL  ?io_data<>&55 ' (129)"Failed at byte ";~X%  aa55_error=   X%  X%=SA% EA%  !io_data=&AA  !io_addr=X%  WRVAL  X%  X%=SA% EA% & !io_addr=X% 0 RDVAL : ?io_data<>&AA D) (129)"Failed at byte ";~X% N aa55_error= X b X% l v  set_station * set econet station number to zero 6 re-compute checksum when checksum implemented  e2(63)=e2(63)-e2(64)  station number  e2(64)=0    chkprm 7 Verify BB RAM against known set of parameters. ; Bytes 63, 64, 74, 75, 80, 81, 94, 95, 160, ; Bytes 192, 193, 194, 195, 196, 199, 201, 253, 254. G are not checked since they may vary with different versions of 5 ARTHUR or different hardware configurations.  & Byte 63 - BB RAM checksum. H Byte 64 - Econet Station Number. Not checked because it will  B not yet have been initialised in some cases. *E Byte 74 - Startup mode, *TV state. First changed between 45 versions 0.2 and 0.3 of ARTHUR. >- Byte 75 - bits 0-2 change with OS H& Byte 80 - other misc bits. R' Byte 81 - Reserved by ACORN \) Byte 94 - Test status flag #1 f) Byte 95 - Test status flag #2 p& Byte 160 - other misc bits. zC Byte 192 - Current year. These have different values at : Byte 193 - different points on production line. @ Byte 194 - Last month and "we've had the 28th of Feb" 4 Byte 195 - contents cannot be guarenteed. H Byte 199 - Number of floppy and winchester discs. Will change H for different hardware configurations or upgrades.  Byte 201 - Not listed  Byte 253 - Not listed G Byte 254 - Winchester size. Will vary with production build.  X%=SA% EA%  notchk(X%) <> 1 ! e2(X%) <> df(X%) F (129)"Fail CONFIG check, byte ";X%;" value ";e2(X%)  config_error=    X% $ . 8 write2 B& write e2 array back to BB RAM L/ " Re-loading configuration parameters." V X%=SA% EA% ` !io_addr=X% j !io_data=e2(X%) t WRVAL ~ X%   verify ' verify BB RAM against e2 array  X%=SA% EA%  !io_addr=X%  RDVAL  ?io_data<>e2(X%) * (129)"Fail verify byte ";X%  verify_error= X%   K ******************************************************************** < Data tables for defult settings of Battery Backed Ram () Default Config settings ARCHIMEDES 25 PHYSICAL address are reported by this program. .SetC1C0 ; wiggle C1 & C0 of IOC ie SCL & SDA of I2C bus &% ; C1,C0 are parameters 0$ STMFD R13!,{R0-R2,R14} :D ADD R0, R0, R1, LSL #1 ; R0 = C0 + C1*2 DP MOV R2, #0 ; prepare to index soft copy ND LDRB R1, [R2, #IOCControlSoftCopy] ; read soft copy XJ BIC R1, R1, #&03 ; clear clock and data bN R R0, R1, R0 ; put in new clock and data lP R R0, R0, #&C0 ; make sure two test bits are vG ; always set to 1 ! M STRB R0, [R2, #IOCControlSoftCopy] ; store back to soft copy  MOV R2, #IOC ) STRB R0, [R2, #IOCControl] Q MOV R0, #10 ; delay for >= 10/2 microsecs BL DoMicroDelay # LDMFD R13!,{R0-R2,PC} ; M; *********************************************************************** ; 9; DoMicroDelay - Delay for >= R0/2 microseconds ; 4; in, R0 = time delay in 1/2 microsecond units ; R2 -> IOC ; ; out, R0,R1 corrupted  .DoMicroDelay  STMFD R13!,{R14} *L STRB R0, [R2, #Timer0LR] ; copy counter into output latch 4C LDRB R1, [R2, #Timer0CL] ; R1 = low output latch > .Loop HL STRB R0, [R2, #Timer0LR] ; copy counter into output latch RD LDRB R14, [R2, #Timer0CL] ; R14 = low output latch \9 TEQ R14, R1 ; unchanged ? f9 MOVNE R1, R14 ; copy anyway p7 BEQ Loop ; then loop z= SUBS R0, R0, #1 ; decrement count B BNE Loop ; loop if not finished  LDMFD R13!,{PC} ; M; *********************************************************************** ;  .ClockData0  MOV R0, #0 . .ClockData ; Clock a bit down the I2C bus " ; The bit is in R0 " STMFD R13!,{R1, R14}  MOV R1, #0  BL SetC1C0  MOV R1, #1  BL SetC1C0 ); Delay here must be >= 4.0 microsecs  MOV R1, #0 $ BL SetC1C0 .! LDMFD R13!,{R1, PC} 8; BM; *********************************************************************** L; V$ .Start ; Send the START signal `$ STMFD R13!,{R0,R1,R14} j MOV R0, #1 t MOV R1, #1 ~ BL SetC1C0 ); Delay here must be >= 4.0 microsecs  MOV R0, #0  MOV R1, #1  BL SetC1C0 ); Delay here must be >= 4.7 microsecs  MOV R0, #0  MOV R1, #0  BL SetC1C0 # LDMFD R13!,{R0,R1,PC} ; M; *********************************************************************** ; / .Acknowledge ; send the Acknowledge signal  $ STMFD R13!,{R0,R1,R14}  MOV R0, #1  MOV R1, #1 ( BL SetC1C0 2); Delay here must be >= 4.0 microsecs < MOV R0, #1 F MOV R1, #0 P BL SetC1C0 Z# LDMFD R13!,{R0,R1,PC} d; nM; *********************************************************************** x; ! .Stop ; Send the stop signal $ STMFD R13!,{R0,R1,R14}  MOV R0, #0  MOV R1, #1  BL SetC1C0 ); Delay here must be >= 4.0 microsecs  MOV R0, #1  MOV R1, #1  BL SetC1C0 # LDMFD R13!,{R0,R1,PC} ; M; *********************************************************************** ; 4 .TXByte ; Transmit a byte (in R0) down the line ' STMFD R13!,{R0,R1,R2,R14} 7 MOV R2, R0 ; byte goes into R2 "8 MOV R1, #&80 ; 2^7 the bit mask , .TXByteloop 6 TST R2, R1 @ Q R0, #0 J MOVNE R0, #1 T2 BL ClockData ; send the bit ^" MOVS R1, R1, LSR #1 h BNE TXByteloop r& LDMFD R13!,{R0,R1,R2,PC} |; M; *********************************************************************** ; ) .RXByte ; receive a byte up the line # ; and returns it in R0 % STMFD R13!,{R1-R4, R14} 4 MOV R3, #0 ; byte=0  MOV R2, #IOC  MOV R4, #7  .RXByteloop  MOV R0, #1  MOV R1, #1  BL SetC1C0 C LDRB R1, [R2, #IOCControl] ; get the data from IOC  R1, R1, #1 C ADD R3, R1, R3, LSL #1 ; byte=byte*2+(IOC?0)1  MOV R0, #1 & MOV R1, #0 0 BL SetC1C0 : SUBS R4, R4, #1 D8 BPL RXByteloop ; 7..0, -1= NE MOV R0, R3 ; return the result in R0 X% LDMFD R13!,{R1-R4, PC} b; lM; *********************************************************************** v; & .WRVAL ; Write a byte of CMOS RAM  SWI EnterOS & TEQP pc,#I_bit+SVC_mode  LDR R0,io_addr  LDR R1,io_data  MOV R2, R0  MOV R3, R1  BL Start  MOV R0, #&A0  BL TXByte  BL Acknowledge 5 MOV R0, R2 ; address  BL TXByte  BL Acknowledge  2 MOV R0, R3 ; data  BL TXByte   BL Acknowledge * BL Stop 4 BAL exit >; HM; *********************************************************************** R; \% .RDVAL ; Read a byte of CMOS RAM f SWI EnterOS p& TEQP pc,#I_bit+SVC_mode z LDR R0,io_addr 6 MOV R2,R0 ; save the address  BL Start  MOV R0, #&A0  BL TXByte  BL Acknowledge - MOV R0, R2 ; address  BL TXByte  BL Acknowledge  BL Start  MOV R0, #&A1  BL TXByte  BL Acknowledge 4 BL RXByte ; returned in R0 8 MOV R2, R0 ; copy to R2 for now  MOV R0, #1  BL ClockData $ BL Stop .7 MOV R0, R2 ; return the result 8 STR R0,io_data B; LM; *********************************************************************** V; ` .exit TEQP pc,#0 j MOV R0,R0 t MOV pc, R14 ~ ;  .io_data EQUD 0  .io_addr EQUD 0  ;  ]  pass    THAT'S THE END. PKA300/400/1/UNIVERSAL/TIMEACARC0A0>; >TIME & ARCHIMEDES DEALER TEST SOFTWARE 8 Version 1.04 5-July-1989 Author B. Rice ($ ARCHIMEDES Clock Test Program 2B This program is based on Aricemedes universal test software 3 TIME V1.03 <- The program will be chained bt Statchk FJ V 1.04 Reformating of procedures, adding the third option, allowing P) the user to select options. ZK The program offers three choices 1 SET TIME, 2 READ TIME, 3 RESD AND d SET TIME. n x Main program init  getresint select  Ȏ choice%  1  READTIME  2   SETTIME  FLAG=1  3  READTIME   SETTIME  FLAG=1  " *FX12,0 , 64 ''(134)"LOADING NEXT TEST. PLEASE WAIT"''" "; @ "SCREEN" J T init ^4 This procedure will initlise the variables. h 6 r *FX15,0 | *FX11,0  Constants  number$="0123456789" D alpha$="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" ' weekday$="SUNMONTUEWEDTHUFRISAT" M months$="JAN31FEB29MAR31APR30MAY31JUN30JUL31AUG31SEP30OCT31NOV30DEC31" D day$="mon": Must be set to something valid for TIME$ to work  FLAG=0   getresint < This procedure will get the resident byte from cmos ' ș "OS_Byte",161,30,0 R1,R2,R3  Q%=(R3 &80)   select B This procedure will offer and get the required selection.  7 & *FX21,0 0& 12,3)(134)"DO YOU WANT TO ?" :/ 3,5)(131)"1. CHECK THE DATE AND TIME" D- 3,7)(130)"2. SET THE DATE AND TIME" N8 3,9)(133)"3. CHECK THEN SET THE DATE AND TIME" XK 3,11)"PRESS "(131)"1 "(135)"or "(130)"2 "(135)"or "(133)"3 "; b l choice%="123",) v choice%>=1 choice%<=3    SETTIME    *FX15,0   data= * 0,2)(134)" WHAT DATE IS IT" + 0,3)(134)" (2 NUMBERS) ?"; $ date$=keydata(2,number$) ' (date$)<1 (date$)>31  (7)  data=    data=  * data= 4+ 0,5)(134)" WHAT MONTH IS IT" >- 0,6)(134)" (3 LETTERS) ?"; H$ month$=keydata(3,alpha$) R# pointer=months$,month$) \ pointer=0 f data= p (7) z  data=   data= 0 0,8)(134)" WHAT YEAR IS IT,19-- " 1 0,9)(134)" (2 NUMBERS) ?"; ) year$="19"+keydata(2,number$)  (year$)<89  (7)  data=   data= 0 (date$) > (months$,pointer+3,2))  7 z 0,11)(129)" Date and Month are not compatible" 0,12)(131)" PRESS SPACE AND RE-ENTER";   a$= $ a$=" " . data = 8 B data = L V data = `) A$ =date$+" "+month$+";"+year$+"." j t data= ~) 0,11)(130)" WHAT HOUR IS IT" 7 0,12)(130)" (24 HOUR CLOCK: 2 NUMBERS) ?";  H$=keydata(2,number$)  (H$)<0 (H$)>23  (7)  data=   data=  A$=A$+H$+":"   data= + 0,14)(130)" WHAT MINUTE IS IT" - 0,15)(130)" (2 NUMBERS) ?";  M$=keydata(2,number$)   (M$)<0 (M$)>59  (7)  data= ( 2 data= < A$=A$+M$+":00" F P% 10,3)(133)"YOUR INPUT WAS " Z 8,5);A$ d $ = day$+","+ A$ n3 0,8)(130)" THE MACHINE IS NOW SET TO" x 0,10)(130) d 0,13)" PRESS"(136)""(137)"IF IT IS CORRECT"'" ANY OTHER KEY TO CHANGE THE SETTING" G Show time incrementing and keep cursor flashing at normal rate  *FX21,0  I=0   I=I+1   6,10)$  I 10 = 0   1,18);  WAIT(0.2)   A=(0)  A<>-1  " A=32 , FLAG=1 6 @ J T READTIME ^ h' 8,8)(133)"THE DATE & TIME IS" r 0,10)(130) |E 0,12)" CHECK & THEN PRESS"(136)""(137)"TO CONTINUE" G Show time incrementing and keep cursor flashing at normal rate  *FX21,0  I=0   I=I+1   6,10)$  I 10 = 0   1,16);  WAIT(0.2)   A=(0)  A=32   & WAIT(SECS) 0 NOW= : D Do nothing N -NOW=100*SECS X b keydata(N,A$) l; Gets N characters from keyboard if contained in A$ v& Character 127 is key  S$  S$=""    char$ = & A$,char$)>0 (char$)=127 # (char$)=127 (S$)>0  char$;  S$=S$,(S$)-1)   (char$)<>127  char$;  S$=S$+char$    (S$)=N  =S$   *! That's it no more program. PK%  A300/400/1/UNIVERSAL/UT_MENUACARC0AQ;  >UT_MENU & ARCHIMEDES DEALER TEST SOFTWARE 7 Version 1.0 26-June-1989 Author B. Rice (H This program will offer options for testing the 300/400 machines. 2/ The program is roughly based on MAINMENU <* This progrqm is called by main_menu F/ V 1.00 Inital writing and modifications. ZL The program offers and selects the various printerswhich can be used. n Main Program x get_res_int init title  list_options  get_response  Ȏ TEST 1  E%=0 2  E%=1 3  E%=2 4  ("*DIR ^")  "MAIN_MENU"   5 " 6 , 7 6 8 @ 9 J T save_res_int ^ *K.1 *BASIC|MCH."STATCHK"|M h *FX 138,0,129 r *MEMOBJ |   init 2 This procedure will initlise the program. ! Disanle Escape function.  *FX 229,1  Disable auto-repeat  *FX 11,0  7 / OPTIONS=4 : Number of choices on menu  G$(OPTIONS,1)    get_res_int B This procedure will det the resedent intergers from cmos. ' ș "OS_Byte",161,30,0 R1,R2,R3  tsr%=R3 & ID%=tsr% &0F 0 Q%=tsr%>>7 : S%=(tsr% &40)>>6 D E%=(tsr% &30)>>4 N' ș "OS_Byte",161,31,0 R1,R2,R3 X MEM%=R3 b v save_res_int ? This procedure will save the resedent integers to cmos ' tsr%=(Q%<<7)+(S%<<6)+(E%<<4)+ID% * ș "OS_Byte",162,30,tsr% R1,R2,R3   title  Display menu title   ' BNR$=(132)+(157)+(131)+(141) / 0,1)BNR$;" A300/A400 Printer Menu" / 0,2)BNR$;" A300/A400 Printer Menu"     list_options  List menu options   TEST=1 OPTIONS * G$(TEST,0) 46 4,TEST*2+4);130;(TEST+48);133;G$(TEST,0) > H% 23,1,1;0;0;0; : Cursor on R f get_response p& Wait for valid keyboard input z *FX15,0  ( 9,22);130"SELECT OPTION : ";  a$=  TEST=(a$)-48 # TEST>= 1 TEST <= OPTIONS  a$  Enable auto-repeat  *FX12,0   All Tests Except Printer. # All Tests and Epson Printer. # All Tests and JP101 Printer.  Return to main menu. ! Thats all no more program. PK]yY!3 AU00/DUALFLOPACARC0A~;  >DUALFLOP  ARCHIMEDES TEST SOFTWARE $ Version 1.00 17-August-1987 0 Version 1.01 22-June-1989 by Brian Rice 4 V 1.01 Change name of menu file to return to. (" Dual Floppy Disc Drive Test 2 For Final Banner :- <; Flag F% will be set to TRUE if there is a DISC error F 6 P 7 Z *FX15,0 d *FX11,0 n BSK=: TRUE FOR SOAK TEST x INIT # " "(131);(157);(30);(156) B " "(131);(157);(132)"DUAL FLOPPY DISC DRIVE TEST "(156) # " "(131);(157);(30);(156) J BSK cnt=cnt+1:'(9)(134)"SOAK TEST"(135)"(";cnt" tests)"(40-); , XS=:YS=+2 : Store Starting Position  BSK '(32)"FAILS";  Ҙ BSK 31,XM,YM:" Insert Test Disc 1 in Drive 0"'" Insert Test Disc 2 in Drive 1"'(9)"Then Press SPACE"'" ";:: =" ":31,XM,YM:(120); ) 31,XS,YS:(131)" DRIVE 0";(40-); + 31,XS,YS+6:(131)" DRIVE 1";(40-); ; BSK CHECK_WRITE_PROTECT(0) : CHECK_READ_WRITE(1)  BSK CHECK_READ_WRITE(0) k BSK 31,XM,YM:(7)"Swap Discs in Drives"'(9)"Then Press SPACE"'(7);:: =" ":31,XM,YM:(80);  BSK CHECK_READ_WRITE(1) ; BSK CHECK_READ_WRITE(0) : CHECK_WRITE_PROTECT(1) "( BSK 28,0,24,39,+1,12,26 : tL@ , 6 *FX21,0 @ 31,0,20 J" F% (133);" NOTE FAILURES" K+ '" Replace Test Disc 1 in Drive 0 " T? " and press"(136)""(137)"to Continue"'" "; ^ *FX11,0 h :A$=: A$=" " r *DIR :0.$.AU00 s "POD_MENU" | *FX12,0    INIT . Set Configuration to Dual Floppy Drives  *CON. FLOPPIES 2  *RMREINIT ADFS  *ADFS  buf 512,dcb 16 ) BSK F(9):I%=19:F(I%)=0::cnt=0 1 IE%=0:A=0:ErrDiscAdd%=0:AdfsDiscErr%=&0108C7  AdfsSwi%=&0040240  sector%=0:Read%=1:Write%=2  PASS = : FAIL = % F%=: Error flag for DISC tests 3 XM=0:YM=20 : Position of screen instructions  & 0 n(N,A$,M) :H N A$=129+136+" FAILED"+137+135+A$ A$=130+" PASSED "+A$ D A$;(33-A$);:R= N BSK (40-);: X N F(M)=F(M)+1 b 135;F(M);(40-); l v   CHECK_WRITE_PROTECT(DR%) @ Check write protect on Test Software Disk. A bit risky !!   X=XS:Y=YS+6*DR%+1  chkwp=  result=PASS  31,X,Y 1 (133);" Checking write protect";(40-); ? Op(Write%,&9E0*&100 (DR%<<29),buf,&200): Attempt write / 31,X,Y:n(result,"Write Protect",4*DR%+1)  result=FAIL F%=     CHECK_READ_WRITE(DR%) 9 Write/Read/Erase side 0 trk 1 & trk 41 sectors 0-1  @ Write/Read/Erase side 1 (ie trk 81 & trk 121) sectors 0-1 * 4 X=XS:Y=YS+6*DR%+2 > chkwp= H result=PASS R TR%=-38 \ :TR%=TR%+40 f SN%=16*TR%:GENDAT p7 31,X,Y:(133);" Writing track ";TR%;(40-); z0 Op(Write%,SN%*&100 (DR%<<29),buf,&200)  TR%=122 IE%<>0 , 31,X,Y:n(result,"Write Test",4*DR%+2)  result=FAIL F%=:   X=:Y=  result=PASS  TR%=-38  :TR%=TR%+40  SN%=16*TR% 6 31,X,Y:(133)" Reading track ";TR%;(40-); 7 Op(Read%,SN%*&100 (DR%<<29),buf,&200):CHKDAT  TR%=122 IE%<>0 CE%<>0 + 31,X,Y:n(result,"Read Test",4*DR%+3)  result=FAIL F%=:   X=:Y= $ result=PASS . TR%=-38 8 :TR%=TR%+40 B SN%=16*TR%:FLUSHBUF L7 31,X,Y:(133);" Erasing track ";TR%;(40-); V0 Op(Write%,SN%*&100 (DR%<<29),buf,&200) ` TR%=122 IE%<>0 j, 31,X,Y:n(result,"Erase Test",4*DR%+4) t result=FAIL F%= ~   GENDAT D Generate 256 bytes equal to track number followed by 0 to 255 / W%=0255:buf?W%=TR%:buf?(W%+256)=W%:W%:   FLUSHBUF 0 W%=0255:buf?W%=&E5:buf?(W%+256)=&E5:W%:   CHKDAT * CE%=0:W%=0255: TR%<>buf?W% CE%=1  W%<>buf?(W%+256) CE%=2  W%  CE%<>0 result=FAIL     DUMP ( I%,J%,K% 2 chkwp= < F& "Enter sector to dump";sector% P sector%<0 Z I%=0&FF:buf?I%=I%:I% d3 Op(Read%,sector%*&100 (DR%<<29),buf,&100) n I%=0&FF 16 x @%=3:~I%": ";:@%=10 6 J%=015 4:~!(I%+J%+buf);" ";:J%:" "; 5 J%=015:K%=?(I%+J%+buf): K%>31:K% &2E  J%  :@%=3  I%  sector%=-1    Op(b%, C%, D%, E%)  I%  C ș AdfsSwi% (1<<17), 0, b%, C%, D%, E% IE%,A,ErrDiscAdd% ' nodisc=((!IE% &FFFFFF)=&108D3)  nodisc 31,XM,YM:(4)"Disc NOT Present";(40-);(4)"Ensure Disc is in Drive "DR%;(40-);(4)"Then Press SPACE";(40-);(4);:: =" ":31,XM,YM: (120);  nodisc : Disc present ! wp=((!IE% &FFFFFF)=&108C9) "2 chkwp wp : Write protect working ok ,< chkwp wp result=FAIL: : Write protect failed 6 wp 31,XM,YM:(4)"Disc Protected";(40-);(4)"Ensure Test Disc 2 is in Drive ";DR%;(40-);(4)"Then Press SPACE";(40-);(4);:: =" ":31,XM,YM: (120);: dfE @ IE%=0 J result=FAIL T (129)" "; ^( ((!IE%) &FFFFFF)=AdfsDiscErr% h IE%=IE%?3:"ADFS ERROR"; r | I%=4 # ȕ IE%?I%: IE%?I%:I%=I%+1:   " Error &";~!IE%     FINALE  6:7 * F$=(141)+(129)+(157)+(135)+(136) * P$=(141)+(130)+(157)+(132)+(137) Y F% C$="FAILED":B$=F$:A$=" "+(129)+(157) C$="PASSED":B$=P$:A$=" "+(130)+(157)  'A$  K%=0 5  L%=1 2  B$;(5*K%);C$  & 0 A$ : PK nLLAU00/HD_POD_PRG/HDU_MENUACARC0A?;  >HDU_MENU & ARCHIMEDES DEALER TEST SOFTWARE 8 Version 1.01 22-June-1989 Author B. Rice (8 Version 1.02 5-July-1989 Author B. Rice 2B This program will offer the tests available from this disc. key  *FX 200,1  7 " Number of choices on menu  OPTIONS=7  G$(OPTIONS,1)  ("*CON. HARDDISCS 2")  ("*RMREINIT ADFS") " ("DIR :0.AU00.HD_POD_PRG")    title  Display menu title  & 0' BNR$=(132)+(157)+(131)+(141) :- BNR$;" Hard Disc Upgrade Test Menu" D- BNR$;" Hard Disc Upgrade Test Menu" N X b list_options l List menu options v TEST=1 OPTIONS  G$(TEST,0) 6 4,TEST*2+4);130;(TEST+48);133;G$(TEST,0)  $ 23,1,1;0;0;0; : Cursor on    get_response & Wait for valid keyboard input  *FX15,0  ( 9,22);130"SELECT OPTION : ";  A$=  TEST=(A$)-48 " TEST >0 TEST <= OPTIONS  A$  Enable auto-repeat   *FX12,0 * 4 >! List of options available. H Winchester Format R Winchester Verify \& Winchester Interface Quick Test f" Winchester System Soak Test p Copy HFORM z Park Winchester Heads  Return to main menu  # That's all, no more program. PKZE,hhAU00/HD_POD_PRG/NORETRIESACARC0@'{;`PdR(T284LN5\^6ln7|~89:;< RZ 0#4^$ RZ$  RTTZpa R& $ R&:0+a  n0:987~6|n5l^4\N3L! RZ +a \0!$ RZ$  RpUaUZ_-1  Q0Q :0@P`p_0QZ0Q TZ@-@1 `@-@1 `@- @- a R@--Ѝ@-A@!@@-2L@D |@-0AS:4S  S4 0`@P^&T!*PS:R  *|- ( @@A@<$ $$ $$ $$  $$  ,048(((,048   ,(   (    ( 0@(,048.%0E2F3o %\/Pll4`8p   <  N-2@|\@P*D 0^""*" D |0LSC0L5@0#x<@Q7 O2 @20Q <<P|p Q L\ ,D D |p DAD]@<t P\  D >0""P@TP` Dl "$ E@ HdhP@THU0:Q!,01@- d@  h PhHHdL PCLD D@ dH pH Q8:d <x`@P P@P< 5 PPlD*xPx&J Q(Q P: P3PVC+,r(wPX PZ'pV/wGT@(}~u dL$O P" P T"$P TYZ@@-# ((@ @P` )dhp )tx ))0-@(p(p(TP `)$(pdPt |"|X  %"TP|K/(  .dL$O P"P C T(PCT,( YZ@-  ( Q(pP(( ((p( ( (( (p(( @@- `$( &d p,( @`hp,( $( @P,( $( 't,d( (`( ,( $( )dkAe,xpx(}PX2 ^ZpW <*N[H(~j <L@LDD `@P Pp0!XlRpXDPTPdFPpX,9P,(^X H (PZS!P0,`(F@ mH)PZ<( @-2 P027"QZ PD@- ``FPD@-T@^aan"Q1;0025^37:##p"Q*4jR( p11  #j2 Q:0-@ ` p 0<0 #N#d{@-P%S^QQ^"pWM*-W#D*@H`VY Y> -"1s0,jV *( PT!VL3@`^.0:    `|PL-p>3Y@P33.13VdွPP P`6Ppz  `6 `2`p``6dွO-?ь@@ ࠌ< @P@/ R"!! "`0Vv2#*R*5  Q U @-@-Silly length @?@|v1@-@-Not start at sec boundary @?@eaRrp @-@-Not trk start @?@QMXݰPY#!PI"\T`勠> `am Y:   :\  Q*;@제J 0 00Pp2*@*T ќdᏽ1ࠌꀀPp33SSss0娀 % :^"0娀 % :ʄ^"0娀 :ڄ %^"\0 ^0 ^\(ր^@ՀX* @PJ0S@D0@0TCT@A@9X6*P10  Q#:X @ R @4PPP5 @P@P0O00(U3 @^0oO` ppQ:mOA!L-2@09-赯O-^#3ࠜdް@  ް; 2 00 (Y3Xݰ *oްް;1pـڐ֠۠Z @: U 2Р> A8 p֠8-00 p@8Z#Z*@-%&ǀX```&r`X`@-ǀ N,2L@`Dpd`V@L@`Dpd`V`@V:@-PU\ Q*1 Q\@- T1 ZQ\5p2* ``\T  @-P#:T0  0 @ 00S1010>2 53 5     \P@-\P`}2 y @-sqo @-l0  "` @- $28@-28 @55O-@AM  j11>dQ*qq~Q#*z"T0Busu " !yIQ#C*$MP @e z80 0\>/, 0usu` &11>!p7 ppW J 78 `6jO~O \>"$Ѝ2dC-O @AAp"UA 0 Lz0X؀8 H O*B03 8yy 8dC-O @j@j@"H004F.?Asq+s.qLs9{jCcjY l@nl@A 0.L'{s ud?@-! $ !1$ @ PRPU?A-Q 11010>2$:@lQQ^#p7!pW"Xp2`p T tX W 0`@4l*@-`PtQY0Yi. >@-@P:! 0QQ^P!^02^N!Ņ@T:!0>@- R 3 5 3" 5@-" O-  0 ^P10: а ! (뎏 @-N 0q ,",00^R O-O-K)L5_`tS)  *Pr`u`p"z9 "jpH GD H F p 0jP0 Ft0d@-븰  ; ^@-0O-pt0sv K)L5_`o@ @n@@-ҿ> > J JZG ^# Y! ! ! Zy6 8 ;ү  J KQQ NQQ IY 1 1X(*>1 K^^ J r F A m0!@-P DA A@-  @- 0 K @-PP@-PPH-P Ḱ . ;@-@-(pF4pF &.5&.5P&.F&.5"(""$" V2ᧀ@-) F5 F@^P:@O-0a0]Q0!01Y ! 1,-j T @ P8-a  8 jb  K p I j9Ѝ00d@-@@ O-wpW``)c  [ sU{ sO{)AJ@D /BE  ;8Y:[: ;R @-Z@Z  Ѝ"*@O^@ 0ZZmЍbjZ@Z  @@ =H01[ 0FR  R@-O7[@,!H@Qx QY j @-@-bad RMA return @?@Q. j @-@-bad sys heap return @?@[@@TZ@-##@-#P#U@-M AtpucpcDpЍ@-)>~JO @1  B 2B 1-?|     ? B@@-A0 ^027"QZ@- M p p Ѝ @- @-tj @ 0 -0S=0 00 cj=Рd@- r@ cP@-<g c08@AjS0T@@-YPqPc@- 2 5d}]1VVW P#W+d@-V^VU@-VV@-V@V@-cV@^VU @-@-@-@-@-@-@-@- @- @-!@-)@- @-0@-i ak@hj @-@-system heap error@?@@-@-i ak@hj @-@-module error@?@@-0@-|A@-w{@-r)cu@-lp@-g3k @-"0@wdA-pA-p].QQ^4Q"PW3+*j]"`am0a "-1L0q@q{usuj "PT%1! T̅`\̅2kd@-]H-1 P ]; jD]dO- @ Q2 8@QQQdO- [ CJJ@(: W: WnB^@1`1 1J2P2t1  Q) Q`F0! %`#: " wP Q J  W1@1 1J2`G0PtpQdO-T`QP.`p @{ JP#%*p Z X @8p >`[ J8a pJjkdߏ@-o@-@- j DM,b +b nNd@-RNO-"@- RH  $хpN裞ቑ "剐  @-;  tK@-D  K'$! R!@-7 ! @-@-writing silly length to map @?@'@-0  O-`ledO-Z_dO-TYd@-"010H-;z`f l@-  #* R@-t~pt@-p~tp@-h0s>qd$&%@\^:"|, &@-0O @PS:",O:0   M *!  D  $0 `0 `VZ+[2P^0"P' ` PРMd@-.0 0 ` p0 pWZ#0*0PS*P`VJ*.0 @- *.P* 0 AA@-P pA-`bjh0@:0   j;$0 3$0s>11> 0)&0 `0sh0 "&.Library$.Library@@0 \0l0 %P":pd0sTOROPO]T@-@ T@z0UGs-( 0KjL"D*.0 ?j^0@B*@p-.0 #!* .09 0 P@4 3 pq {{j@ ^$+>@40z j 4@Dp@j(dw@-q2&F*F#4@-*j PQ]00``>AAN"@t-)!R+(  "%~"0I@@t3I- 0ud0@L` > 5PPv3 `$@2:v /0+(pT`7 50:  -ij@ 0PPP  pW:d@-.0 :@-QQ.>A@-0@-0* .0*]aRzr BAR B"0 R7r": "S:R:P1#+`@-PP@D2@!~ :X `O- `pA#*P aPzp @#P P @wz"Y!ӏpz#*P aPzp @#P P aYzy I!Y3V!!.Pa:Pӏ@-4 8@-42@-o4*@-&@-4  \  QZ@-..@-0  @-0@-0@-0 !@-  @-0 {  # Q@-@-&F*F!@- L-V0 X>F > )V5V0 t>H  {dHugoL-@-<F@-5@-^# P"@-)5P#3d@-T> PO-<qAd踀DllllD @LP-u`q`rkO-` Vv"#8*6 `|-|O @-kj  3 #  0# >U3:~2-@ `p @M. j @ 0 PЍЍ]@-vSVT [;;; t~?d{{9)j2`0! d0 h0 l1l-0 j> { j  6?{ @Hugo@-F 3#&4{#jj1- `@F4@F@#@F'@F=F0 @t u{{{ s{ {mm -_ ЍBpL@0TO- JP{j #+*[I{jj*N{j j;>- 0 @>jop q  q  p qqp qI qJ @- <@-< ~4Q0a 0 + "p1%"% P#%"%O  kL j!   8tp7#p0_- `)pF5FOKjO@"G^ T ^ 1W@QF 0 @{{s8s8{8u {j8{8u{}_-! !   0-R" !*냄-0j@0@wP%PPP I O @TL ]n4 yH @OAx-|B%|xL億HHtHDppq 0ON䩐# R*Rr"p5|2 P$` R:=DOAGj OA W, 0$jhÂ,,=_-V a@-i agk@hj @-@-CloseAll Error @?@`@-i aPk@h@-i aLk@hj @-@-FSC error @?@aOAkCa% @-i a.k@h@-i a*k@hj @-@-Heap error @?@c ]@- @ @-@-Adfs Init Error @?@/P-@1 DOA W,03B'1@ 1 V@^ "OrArp {-YOO A V>$ VU#"Q*1Q*"1hPZ/L-M! - /"+" ꢮ-*j".s".ߍ衰;L |  O-,n!{ jeWkUt L P-I[ 0kAADFSDiscOpHDCDrivesFreeSpace [Q]P-?-Mvru`q7q{r$uj 0l/*Q0q0"YPyPn j P>&]:Insert sourceInsert destination}j disc in drive wj0 %rj then press SPACE bar jjh*gj 0,8h[jp> 5 Uj T,% ( P Q30e?j`00$ 31 0( *VH(pH@F^@p=0"-!" 40400 j0QS1: 5Pt PESq:kߍdz{ ABEX*Bye closes all files, unsets all directories, and parks hard discs. Syntax: *ByeP-^kl*Compact tries to collect free spaces together by moving files. Syntax: *Compact []P-@-1 ,F{jnOM 0pIj-70I`E@Ep V+#pp ^,s@A@@ d X* W1^ YY*j@-@-*** ReturnWholeSpace GAVE ERROR TO *Compact *** @?@j@-@-*** ClaimFreeSpace GAVE ERROR TO *Compact *** @?@-/0"Ijx0 0  w ` > P>  0>t~ j ^@V Kp0Xpkl93  j@E8>`NvOߍkd*Dismount closes files, unsets directories and parks the given disc. Syntax: *Dismount []P-V}-1 ,\z`{a Wkd}@- @-`!0 PPaQE3H 5 0$0!5.1];PaQd*Drive sets the default drive to use if the directory is unset. Syntax: *Drive P-@ukk@-Are you sure (Y/N) ?{!{*{Y0y0?cd@-0*{?D- ^&@p`P@@ZP5P RYJ ?@- @NQ*Format prepares a floppy disc for use with the ADFS. L is the old 640K ADFS format. D is a new 800K format. Syntax: *Format L/D%24_%mi_%w3 Verifying ... P--,MU,jၑ   2j"; ,:>jn2aPzp @OIY0 Y>^Y0y0V{I , " D  9P`p- Formattingq{_jN\j `6pYPUP0@R:fO[!r s0s{Kj Y PY !L>lk<$4F'FF#F*F&F4pF(pF>FIF $40P%TPPEQ\A-  ?O A RA  B  9k jFormattedu q{Ks{{ ,ЍU?kd*Free displays the total free space on a disc. Syntax: *Free []P--1W ,y{jBytes free & j Bytes used &j^ kEj =K{{j*Map displays a disc's free space map. Syntax: *Map []P--MQ 6j ,1jg( start, length) 4{'j'Wrj} X  p(,) p { jW> T~kЍYpN-p$*Mount sets the directory to the root directory of the disc, sets the library if unset to $.Library if it exists, and unsets the URD. The default is the default drive. Syntax: *Mount []P-~-14. -j{s`u{gk~*NameDisc alters a disc's name. Syntax: *NameDisc P--.$j:0Q.jPPjp:0! ! @2 #B@T@q `s4qupr{%k*NoDir unsets the current directory. Syntax: *NoDirP-h~lh*NoLib unsets the library. Syntax: *NoLibP-d*NoUrd unsets the URD. Syntax: *NoUrdP-`*Title sets the title of the current directory. Syntax: *Title []P-s-pZO A y j#F'F Rr # p2Qkm*Urd sets the user root directory. Syntax: *Urd []P-I-1OD Oj`0e@F4@F `p}ekI*Verify checks the whole disc is readable. The default is the current disc. Syntax: *Verify []P--1 , Or @r?{ j"`@ 6Verified OK hk@-^QQ^0. z [`p#{j.NTʩxЍ*Configure drive sets the value the default drive is initialised to. Drive P--+O{j1Drive jo{ j *Configure Floppies sets the number of floppy disc drives attached. Floppies P--,O{hj1}Floppies j={0 j *Configure HardDiscs sets the number of hard discs attached. HardDiscs P-m-+O{k7ij1LHardDiscs bj {^80 Yj!T *Configure Step sets the step rate of one or all floppy disc drive. Step []P-4-@O]a{20j.j`O1 Step &j%Q!j0SL @ljPT!0!@!^Z !!"! *@ jP3/;:  <`kdPcP-P0:KAkURD Disc Option 0Dir. Lib. "Unset" "No Name" (Off) (Load) (Run) (Exec)LOAD &.!BOOTRUN &.!BOOTEXEC &.!BOOTO-PM p  7j^QQ^#@F'@F`6@O@@O" `4* @OLD@OAMO@`QOO@h V@OLD@d 9{PЍd@-qNO @-p{@j@-ZJ:J"Pv;"5P3002 2;J25P3?#$J"* O@O-PM p Rj@[PP``!~y; y {j 9SPЍpd DLWR%24:%mi:%se %dy-%m3-%ce%yrdir  @- `NwPL`OAPQk[Z20 g@~- $@- O GpN  0Op DQ&# : G@->p@-Pp@-PP^>DŽ`V`V[Zp@-@-@- 021 0SZ@- P027"@- @- 0S0  @-[ j  Q[jZd@-0jdx@-{x@-D k@-h~h0ll0|@F4@F `pЀ@-d~O:Az0q@-jd0e@F4@F `p}@-p9O"A"D ?{{ q{@-p%@-p*O"/@-pz@- +!j4$ DL dir j2  1{0{ j= 5{t2{ s@D{z1 @-j^ j" L!6 uO-8 {jpDM  "" j7D> 0q3n:mjD31 X21 D0@D2q{Z@- 0$@.{0q{pF4pF `{{jh9 `p d9p ؀@-  2j  33 3& &$j0 j .j-` q 0q{u{ q r s{qP{{W0qj{@q{{{}Ѝsu0A- Q-ju' >A aPzp @oOkFp0  p2:LPP0!~% t~{E- jH OAm@-h0~qq~@s߀@-PP 0h0@d0@P@- `p sOOKD PP ^>„`V `f`䠀O-O"A" D @EP&j0 ^2:;ppJ^aeiu `,;P22U1 1:P @-@Q;^{@aQZQPZdS@-`f W*P p4`2:S W4P-xqk@-i ak@hj @-@-ADFS Open error @?@O- ; fz0R;LY3I: Bj;#<; 4  ;.- 0*jx0; `p`㣞 xj 0@ 4 ЍP-ek@-i ak@hj @-@-Adfs Close error @?@O- 9j pj7M  j - U"{sx 1-#j @-@-Free Heap err@?@@-`px0@V60Pz7pp>P P- -j-8 Ak P-{ - j^-8 uBs{k P-i-ljp P0  JTYRV QRO{NjP\ X:pRGJ^ Y( ƒ,ƒpGH`p%usu upu') [jp- 0S0uxu u{ qz#*^1 p0 {Aj 0,ck ЍC-0@@ T T `0)` V `!Qb @P jpY@-xPdj @-@-Bad handle @?@@-0j @pr 7pg  W@-PPx r `6 а怽@-x1PKa  AU00/HD_POD_PRG/PHD_COPYACARC0An?;  >PHD_COPY & ARCHIMEDES DEALER TEST SOFTWARE 7 Version 1.0 5-July-1989 Author B. Rice (5 This program will copy HFORM to the Hard Disc. 2 New >7  S%=(tsr% &40)>>6  E%=(tsr% &30)>>4 ' ș "OS_Byte",161,31,0 R1,R2,R3 " MEM%=R3 , 6 @ main_bit JF This procedure will display th etitle and do most of the work T6 5,1)(130)(141)"HFORM COPY (V1.00 DEALER)" ^6 5,2)(130)(141)"HFORM COPY (V1.00 DEALER)" h ID%=5 r warning | a$="Y" a$="y"  copy    copy     copy 9 This procedure will copy HFORM to the hard disc.  line%=5 15  0,line%)(40)  line% % 10,7)"Copy to Drive 4 or 5";   drive%  drive%=4 drive%=5 & drive$=(drive%) 0! ("CONFIGURE HARDDISCS 2") : ("RMKILL ADFS") D ("RMREINIT ADFS") NI ("*COPY ADFS::0.LIBRARY ADFS::"+ drive$ +".LIBRARY ~C~DF~P~QR~V") X b "HFORM Copied." l v1 "Press space bar to return to the menu";   a$=  a$=" "    warning > This procedure will display a warning to the operator 2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"W A R N I N G" 2 10,7) (129) (136) (141)"=============" 2 10,8) (129) (136) (141)"=============" 3 2,10) "Please ensure that a hard disc has" - 2,11) "been fitted to this machine." K 2,12) "Please"; (129); "DO NOT"; (135); "continue with the test"  6 2,13) "if the hard disc has not been fitted."  2,15) "Continue Y/N ?";   *FX15,0 * 4 a$= >* a$="Y" a$="y" a$="N" a$="n" H R \! That's all folks, no more. PK-.  AU00/HD_POD_PRG/PHD_FORMATACARC0A?;  >PHD_FORMAT % ARCIMEDES DEALER TEST SOFTWARE 8 Version 1.00 5-July-1989 Author B. Rice (M This program will ask and check that the user wants to format the disc 2 New program. <( The program called form main_menu F( V 1.00 Inital writing and editing PK A globle warning regarding hard disc connection and data destruction ZC given to the user. The program will wait for a Y/N response. d n Main program. x 7  format_ok=  get_res_int  main_bit  format_ok=  ("*CON. HARDDISCS 2")  ("*RMREINIT ADFS") % ("*DIR :0.AU00.HD_POD_PRG")  "PHFORM"  % ("*DIR :0.AU00.HD_POD_PRG")  "HDU_MENU"     get_res_int ' ș "OS_Byte",161,30,0 R1,R2,R3 " tsr%=R3 , ID%=tsr% &0F 6 Q%=tsr%>>7 @ S%=(tsr% &40)>>6 J E%=(tsr% &30)>>4 T' ș "OS_Byte",161,31,0 R1,R2,R3 ^ MEM%=R3 h r | main_bit F This procedure will display th etitle and do most of the work @ 0,1)(130)(141)"HARD DISK FORMATTER (V1.01 DEALER)" @ 0,2)(130)(141)"HARD DISK FORMATTER (V1.01 DEALER)"  warning  a$="Y" a$="y"  format_ok=   format_ok=    warning > This procedure will display a warning to the operator 2 10,4) (129) (136) (141)"W A R N I N G" 2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"=============" 2 10,7) (129) (136) (141)"=============" &5 2,9) "Running this test on a hard disc that" 0@ 2,10) "has data on it will"; (129); "DESTROY ALL DATA" :, 2,11) "currently held on the disc." D6 2,12) "Please ensure that users are aware of" N0 2,13) "this and give you their consent" X" 2,14) "before you start." b5 2,16) "Please ensure that a hard disc drive" l1 2,17) "has been fitted to this machine." vK 2,19) "Please"; (129); "DO NOT"; (135); "continue with the test" 5 2,20) "if the hard disc has not been fitted" 6 2,21) "or you do not have the users consent."  2,23) "Continue Y/N ?";  *FX15,0   a$= * a$="Y" a$="y" a$="N" a$="n"  a$   ' That's all folk no more program. PK8VAU00/HD_POD_PRG/PHD_PARKACARC0A=$;  >PHD_PARK M Mod. Change the path and file name of the menu to return to. Add space B bar response at end, add question re number of drives. (+ Mod. done by Brian Rice 23-June-1989 2 7 <9 0,3)(130)(141)"HARD DISK PARK (V1.00 DEALER)" F9 0,4)(130)(141)"HARD DISK PARK (V1.00 DEALER)" P* 1,6)"How meny hard disc drives are" Z 1,7)"attached 1 or 2 ?"; d n no_drives$= x& no_drives$="1" no_drives$="2"  no_drives$  no_drives$="1"  *CON. HARDDISCS 1   *CON. HARDDISCS 2   *RMREINIT ADFS *BYE 8 0,10)(131)"The Winchester heads are now parked." 6 0,14)(131)"Press space to return to the Menu."  a$= a$=" " # ("*DIR :0.$.AU00.HD_POD_PRG")  "HDU_MENU" PKE+pl^ ^ AU00/HD_POD_PRG/PHD_SOAKACARC0A-?;  >PHD_SOAK % ARCIMEDES DEALER TEST SOFTWARE 8 Version 1.00 5-July-1989 Author B. Rice (K This program will ask and check that the user wants to soak the disc 2 New program. <- The program is called from "main_menu" F( V 1.00 Inital writing and editing P ZK A globle warning regarding hard disc connection and data destruction dF is now given to the user. The program waits for a Y/N response. n x Main program.  7  soak_ok=  get_res_int  main_bit  soak_ok=  ("*CON. HARDDISCS 2")  ("*RMREINIT ADFS") % ("*DIR :0.AU00.HD_POD_PRG")  "PSOAK"  % ("*dir :0.AU00.HD_POD_PRG")  "HDU_MENU"     get_res_int "' ș "OS_Byte",161,30,0 R1,R2,R3 , tsr%=R3 6 ID%=tsr% &0F @ Q%=tsr%>>7 J S%=(tsr% &40)>>6 T E%=(tsr% &30)>>4 ^' ș "OS_Byte",161,31,0 R1,R2,R3 h MEM%=R3 r |  main_bit F This procedure will display th etitle and do most of the work ; 2,1)(130)(141)"HARD DISK SOAK (V1.01 DEALER)" ; 2,2)(130)(141)"HARD DISK SOAK (V1.01 DEALER)"  warning  a$="Y" a$="y"  soak_ok=   soak_ok=   ID%=0 ( ("*RMREINIT ARMBasicEditor") " ("*RMREINIT Debugger") ' ("*RMREINIT SoundChannels") " ("*RMREINIT SoundDMA") ( ("*RMREINIT SoundScheduler") &# ("*RMREINIT WaveSynth") 0# ("*RMREINIT StringLib") :$ ("*RMREINIT Percussion") D& ("*RMKILL ARMBasicEditor") N ("*RMKILL Debugger") X% ("*RMKILL SoundChannels") b ("*RMKILL SoundDMA") l& ("*RMKILL SoundScheduler") v! ("*RMKILL WaveSynth") ! ("*RMKILL StringLib") " ("*RMKILL Percussion")  ("*RMTIDY")    warning > This procedure will display a warning to the operator 2 10,4) (129) (136) (141)"W A R N I N G" 2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"=============" 2 10,7) (129) (136) (141)"=============" 5 2,9) "Running this test on a hard disc that" @ 2,10) "has data on it will"; (129); "DESTROY ALL DATA" , 2,11) "currently held on the disc."  6 2,12) "Please ensure that users are aware of" 0 2,13) "this and give you their consent"  " 2,14) "before you start." *5 2,16) "Please ensure that a hard disc drive" 41 2,17) "has been fitted to this machine." >K 2,19) "Please"; (129); "DO NOT"; (135); "continue with the test" H5 2,20) "if the hard disc has not been fitted" R6 2,21) "or you do not have the users consent." \ 2,23) "Continue Y/N ?"; f *FX15,0 p z a$= * a$="Y" a$="y" a$="N" a$="n"  a$  ( That's it folks, no more program. PKT}}AU00/HD_POD_PRG/PHD_VERIFYACARC0A9?;  >PHD_VERIFY % ARCIMEDES DEALER TEST SOFTWARE 8 Version 1.00 5-July-1989 Author B. Rice (/ This program will verify the hard disc. 2 This is a new program. <1 The program will be called by "main_menu". F) V 1.00 Inital writing and editing. P ZK A globle warning regarding hard disc connection and data destruction dJ is now given to the user. The program will wait for a Y/N response. n x Main program.  7  get_res_int  main_bit ! ("*dir :0.AU00.HD_POD_PRG")  "HDU_MENU"    get_res_int ' ș "OS_Byte",161,30,0 R1,R2,R3  tsr%=R3  ID%=tsr% &0F  Q%=tsr%>>7  S%=(tsr% &40)>>6  E%=(tsr% &30)>>4 ' ș "OS_Byte",161,31,0 R1,R2,R3  MEM%=R3 " , 6 main_bit @F This procedure will display th etitle and do most of the work J? 0,1)(130)(141)"HARD DISK VERIFIER (V1.02 DEALER)" T? 0,2)(130)(141)"HARD DISK VERIFIER (V1.02 DEALER)" ^ warning h a$="Y" a$="y" r verify |   warning > This procedure will display a warning to the operator 2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"W A R N I N G" 2 10,7) (129) (136) (141)"=============" 2 10,8) (129) (136) (141)"=============" 3 2,10) "Please ensure that a hard disc has" - 2,11) "been fitted to this machine." K 2,12) "Please"; (129); "DO NOT"; (135); "continue with the test" 6 2,13) "if the hard disc has not been fitted."  2,15) "Continue Y/N ?";  *FX15,0   a$= * a$="Y" a$="y" a$="N" a$="n" & a$ 0 : D verify N2 This procedure will verify the hard disc. X line%=5 15 b 0,line%)(40) l line% v$ 10,7)"Verify Drive 4 or 5";   drive%  drive%=4 drive%=5  drive$=(drive%) ! ("CONFIGURE HARDDISCS 2")  ("RMKILL ADFS")  ("RMREINIT ADFS")  ("VERIFY :"+drive$)  1 "Press space bar to return to the menu";   a$=  a$=" "   " That's all no more program. PKqI%AU00/HD_POD_PRG/PHD_WITACARC0A:;  >PHD_WIT % ARCIMEDES DEALER TEST SOFTWARE 8 Version 1.00 5-July-1989 Author B. Rice (G This program will check that the user wants to test the disc i/f 2 New program. <' The program called form hdu_menu F( V 1.00 Inital writing and editing PK A globle warning regarding hard disc connection and data destruction ZC given to the user. The program will wait for a Y/N response. d n Main program. x 7  wit_test_ok=  get_res_int  main_bit  wit_test_ok=  ("*CON. HARDDISCS 2")  ("*RMREINIT ADFS") % ("*DIR :0.AU00.HD_POD_PRG")  "PWIT"  % ("*DIR :0.AU00.HD_POD_PRG")  "HDU_MENU"     get_res_int ' ș "OS_Byte",161,30,0 R1,R2,R3 " tsr%=R3 , ID%=tsr% &0F 6 Q%=tsr%>>7 @ S%=(tsr% &40)>>6 J E%=(tsr% &30)>>4 T' ș "OS_Byte",161,31,0 R1,R2,R3 ^ MEM%=R3 h r | main_bit F This procedure will display th etitle and do most of the work > 0,1)(130)(141)"INTERFACE QUICK TEST (V1.01 DEALER)" > 0,2)(130)(141)"INTERFACE QUICK TEST (V1.01 DEALER)"  warning  a$="Y" a$="y"  wit_test_ok=   wit_test_ok=    warning > This procedure will display a warning to the operator 2 10,4) (129) (136) (141)"W A R N I N G" 2 10,5) (129) (136) (141)"W A R N I N G" 2 10,6) (129) (136) (141)"=============" 2 10,7) (129) (136) (141)"=============" &5 2,9) "Running this test on a hard disc that" 0@ 2,10) "has data on it will"; (129); "DESTROY ALL DATA" :, 2,11) "currently held on the disc." D6 2,12) "Please ensure that users are aware of" N0 2,13) "this and give you their consent" X" 2,14) "before you start." b5 2,16) "Please ensure that a hard disc drive" l1 2,17) "has been fitted to this machine." vK 2,19) "Please"; (129); "DO NOT"; (135); "continue with the test" 5 2,20) "if the hard disc has not been fitted" 6 2,21) "or you do not have the users consent."  2,23) "Continue Y/N ?";  *FX15,0   a$= * a$="Y" a$="y" a$="N" a$="n"   ' That's all folk no more program. PK ZXXAU00/HD_POD_PRG/PHFORMACARC0ASn?; >PHFORM B THIS IS A DERIVATION OF DHFORM 1.72. MODIFIED FOR USE IN THE @ HARD DISC PODULE TEST OF THE DEALER TEST SOFTWARE SUITE BY % BRIAN RICE ACORN COMPUTERS LTD. (D THIS PROGRAM HAS BEEN RENAMED PHFORM, THE P SIGNIFYING PODULE. )( Version number 1.72DP 5-July-1989. 2. PHFORM IS BASED ON DHFORM V 1.72 June-89 dD MODIFICATIONS ARE TO ENABLE THE PROGRAM TO RETURN TO THE MENU. nE IF USER ANSWERS N TO "DO YOU WANT TO FORMAT ?" THE PROGRAM GOES x- BACK TO THE MENU. THE TITLE NOW SAYS :- , ""HARD DISC FORMATTER (V1.72 DEALER)""  0 Init GetShape DisableEscape Format Verify Structure RestoreEscape *RMREINIT ADFS ("*DIR :0.AU00.HD_POD_PRG")  "HDU_MENU"  :  Init MakeParams%=6 "VerifyRetries%=1 ,DefectRetries%=5 6 Verify%=0 @ Read%=1 J Write%=2 TWriteTrack%=4 ^Restore%=6 hSpecify%=&F rAltDefectBit%=&10 |DiscStruc%=&14 Log2SecSize%=8 SecSize%=2^Log2SecSize% OldMapAdd%=0 OldMapSize%=&200 DirSize%=&800 BootAdd%=&C00 BootSize%=&200 %MaxDefects%=(BootSize%-64-&C-4)4 EndDefect%=1 << 29 OldLWM%=&E00 FreeLink%=1 CrossCheck%=3 AdfsSwi%=&40240 AdfsDiscErr%=&108C7 MaxVerifyBad%=16 Patterns%=8 &z Buf% &8000, DiscRec% 64+BootSize%, Defect% BootSize%, DirMark% 5, Bad%(MaxVerifyBad%),mc% 100, Pattern%(Patterns%-1) 0Boot%=DiscRec%+64 :BootRec%=Boot%+BootSize%-64 DPattern%(2)=&FFFFFF NPattern%(3)=&6DB6DB XPattern%(4)=0 bPattern%(5)=&2CB2CB lPattern%(6)=&5A5A5A vPattern%(7)=&4D34D3 B ''"H A R D D I S C F O R M A T T E R (V 1.72 DEALER)"' 2 Drive%=Ask("Format which drive (4 or 5)",4)  Drive%=4 Drive%=5 MSecsPerTrk%=32:Heads%=1:Cyls%=1:LowCurrentCyl%=1:PreCompCyl%=1:ParkCyl%=1 "RootDirAdd%=&400:Log2Alloc%=10 IndRootDirAdd%=RootDirAdd% /DiscSize%=SecSize%*SecsPerTrk%*Heads%*Cyls%  dZB !("-ADFS-%DISMOUNT "+Drive%)  Asm  :  GetShape  InitBootDefects InitDiscRec  MoanOp(Restore%,0,0,0) *'Op(Read%,BootAdd%,Boot%,BootSize%) 4( Result%<>0 GoodDefects D\C > OldShape H)Op(Verify%,0,0,SecSize%*SecsPerTrk%) R ConfirmMake tNC \ AskMake f I%=0 BootSize%-4 p Boot%!I%=0 z I% InitBootDefects Formatted%=(Result%=0)  AskShape A "Do you want to soak test the hard disc for defects (Y/N)"; SoakFlag%=Choose("YN")="Y" B "Are you certain you want to format drive ";Drive%;" (Y/N)";  Choose("YN")="N" $ ("*DIR :0.AU00.HD_POD_PRG")  "HDU_MENU"   MoanOp(Specify%,0,0,0)  :  OldShape SecsPerTrk%=BootRec%?1 $Heads%=BootRec%?2 .Log2Alloc%=BootRec%?5 8DiscSize%=BootRec%!&10 B3Cyls%=DiscSize% (SecSize%*SecsPerTrk%*Heads%) L'LowCurrentCyl%=(BootRec%!-8) &3FF V$PreCompCyl%=(BootRec%!-6) &3FF `8ParkCyl%=(BootRec%!-4)(SecSize%*SecsPerTrk%*Heads%) jInitDiscRec t ~:  AskMake   Makes%=0   Make$  Makes%+=1  ;Makes%;". ";Make$  I%=1 MakeParams%  A$  I%  Make$="OTHER" 8Make%=InputDec("Which make of hard disc ",1,Makes%)   I%=(Make%-1)*(MakeParams%+1)  ȕ I%>0  A$ ( I%-=1 2 SecsPerTrk% P2%<>Heads% P3%<>Cyls% P4%<>LowCurrentCyl% P5%<>PreCompCyl% P6%<>ParkCyl% DxE p "The shape written on the disc matches that of a ";Make$;" disc"'"Do you wish to retain this shape (Y/N)"; =Choose("YN")="Y" :  AskShape 9 : : =&1E6 NewMap%=: dzE :;" @ ";: ș "XFileCore_Create", 0  > char%=(StrAsk("Old or New map format (O/N)","N")) &DF  char%="O" char%="N" NewMap%=(char%="N") 5SecsPerTrk%=Ask("Sectors per track",SecsPerTrk%) DiscRec%?1=SecsPerTrk% Heads%=Ask("Heads",Heads%) DiscRec%?2=Heads% "!Cyls%=Ask("Cylinders",Cyls%) ,/DiscSize%=SecSize%*SecsPerTrk%*Heads%*Cyls% 6DiscRec%!&10=DiscSize% @>LowCurrentCyl%=Ask("Low current cylinder",LowCurrentCyl%) J=0  sector%=sector% 320   sector%=-sector%  A defect%=((cyl%*Heads%+head%)*SecsPerTrk%+sector%)*SecSize%  opt$="B"  AddPhysDefect(defect%)  " RemovePhysDefect(defect%)   "C":   NewMap% : AddPhysDefect(InputHex("Disc address in bytes"))   * "If the ADFS gives an error such as 'Disc error 13 at :4/00012A00' then 00012A00 is a logical disc address. The logical to physical disc address mapping depends on the defect list. "; 4 " When these defects are added to the defect list, it is important that they are added in DESCENDING order BEFORE the list is changed in any other way!" >N AddPhysDefect(LogToPhys(InputHex("Logical disc address in bytes"))) H R \ opt$="A" f I%=0 DiscStruc%-4 4 p BootRec%!I%=DiscRec%!I% z I% InitHardDesc  :  Format =0  I%,J%,cyl%,head% MoanOp(Specify%,0,0,0) MoanOp(Restore%,0,0,0)  "Formatting" * I%=0 512-4 4:Buf%!I%=&077F03FF:  cyl%=0 Cyls%-1  13:cyl%;  head%=0 Heads%-1 , cyl%=0 head%=0 Formatted% TxI  J%=cyl% (head%<<24) < I%=0 (SecsPerTrk%-1)*4 4:Buf%!I%=J% (I%<<14): $H Op(WriteTrack%,(cyl%*Heads%+head%)*SecsPerTrk%*SecSize%,Buf%,512) .0 Result% ;" format error on this track" 8 B L V `: j Verify td SoakFlag% '"PRESSING THE SPACE BAR WILL CAUSE THE SOAK TEST TO END AT THE END OF THAT CYCLE" ~" add%,ptr%,sector%,head%,cyl% Cycle%=1:ErrorCycle%=-100 (CylSize%=SecSize%*SecsPerTrk%*Heads% !suspects%=0:MaxSuspects%=1000 G CylBuf% CylSize%+4, SusAdd%(MaxSuspects%), SusCount% MaxSuspects%   Cycle%>1  I%=Cycle% Patterns%  I%>1  J%=Pattern%(I%) # J%=(J%>>>1) ((J% 1)<<23)  Pattern%(I%)=J%   J%=(&1000000)-1  / SoakFlag% "Writing pattern &";~J% 2 I%=CylBuf% CylBuf%+CylSize% 3:!I%=J%: ( ptr%=0 25 Formatted% add%=SecSize%*SecsPerTrk% add%=0 < F2 CylEnd%=add% - (add% CylSize%) + CylSize% P defect%=Defect%!ptr% Z defect%>CylEnd% d length%=CylEnd%-add% n x length%=defect%-add%  ! Op(Write%,add%,0,length%)  Result% / add%=(ErrDiscAdd% &1FFFFF00)+SecSize%   add%+=length%  . add%=defect% add%+=SecSize%:ptr%+=4  add%>=DiscSize%  " SoakFlag% "Verifying"  add%=0:ptr%=0  MoanOp(Restore%,0,0,0)   ȕ Defect%!ptr%DiscSize% @ length%=DiscSize%-add% J T length%=defect%-add% ^ h! Op(Verify%,add%,0,length%) r Result% |# add%=ErrDiscAdd% &1FFFFF00 Try%=0   Try%+=1  MoanOp(Restore%,0,0,0) Op(Verify%,add%,0,&100)  Result%=0 Try%=5  Result% Try%+=1  sector%=add% SecSize% " head%=sector% SecsPerTrk% $ sector%=sector% SecsPerTrk%  cyl%=head% Heads%  head%=head% Heads% ; "Cyl=";cyl%;" Head=";head%;" Sector=";sector%;" ";  sus%=0 8 ȕ sus%add%:sus%+=1:  sus%=suspects% &" suspects%=MaxSuspects% 0 sus%=(MaxSuspects%)-1 : D suspects%+=1 N X SusAdd%(sus%)=add% b SusCount%?sus%=0 l v score%=2^(Try%-1)-1 $ SoakFlag% score%=score%*4  SusCount%?sus%+=score%  SusCount%?sus%>30  "defect ";  SoakFlag%  ("TIME")  AddPhysDefect(add%)  ErrorCycle%=Cycle%   SoakFlag% ' =0: >500: 13:(39);:13 " ;Try%;" retries needed" * 4 add%=add%+SecSize% > H! add%=add%+length%+SecSize% R \ add%>defect% f ptr%+=4 p z add%>=DiscSize%  SoakFlag%   Key%=(0)  Key%=-1 Key%=32  done%=(Key%=32)  done%=Cycle%>ErrorCycle%+2   Cycle%+=1 done%  :  Structure  NewMap%  NewStructure  $ OldStructure . 8 B: L OldStructure VWriteDefectList `WriteOldFsMap jWriteRootDir t ~:  NewStructure Zone0Bits%=60*8 ZoneBits%=SecSize%*8 2 Log2Alloc%<8 Log2Alloc%>12 Log2Alloc%=10 : allocation size loop ; Alloc%=Ask("Large file allocation unit",2^Log2Alloc%)  Log%=7   Log%+=1  Alloc%=2^Log% Log%=13 , Log%=13 : restart alloc size loop  Log2Alloc%=Log%  MapBits%=DiscSize% Alloc%  ! RoundSize%=MapBits% * Alloc% 4 BestZones%=1 << 30 : init to rogue values  BestCylOff%=1 << 30 ( DummySpare%=1 1 22 SpareBits% = 4*8 ZoneBits%-Zone0Bits%-8*8 < CalcZones F LinkBits%=10 P LinkBits%+=1 Z CalcIds d Ids%<=2^LinkBits% nA SpareBits%-4*8>0 SpareBits%-4*8<=LinkBits% SpareBits% x5 OddBits%>0 OddBits%<=LinkBits% SpareBits% # LinkBits%>15 Zones%>127 $ "Allocation unit too small"  Log2Alloc%+=1  DummySpare% & : restart alloc size loop   Zones% <= BestZones% * Crucial%=Zones%*SecSize%*2+DirSize% / MapZone%=0 Crucial%=BootAdd%+BootSize% D Crucial%=EndDefect% (defect%>=MapAdd% defect%=EndDefect% CylOff%0 Crucial%+=Alloc%-Crucial% Alloc%  MapZone%=0 # RootDirAdd%=BootAdd%+BootSize% > IndRootDirAdd%=&200 + (BootAdd%+BootSize%) SecSize% + 1  &" RootDirAdd%=MapAdd%+MapLen%*2 0# IndRootDirAdd%=&200+Zones%*2+1 : DDiscRec%?4=LinkBits% NDiscRec%?5=Log2Alloc% XDiscRec%?9=Zones% b DiscRec%?&A=SpareBits% 256 l DiscRec%?&B=SpareBits% 256 vDiscRec%!&C=IndRootDirAdd% BootRec%!4=DiscRec%!4 BootRec%!8=DiscRec%!8 BootRec%!&C=DiscRec%!&C " I%=0 Zones%*SecSize%-4 4  Buf%!I%=0  I%  I%=0 60-4 4  Buf%!(I%+4)=DiscRec%!I%  I% WriteDefectList  "Creating Map"  ptr%=0 DefectStart%=0 %DiscEndBit%=DiscToMap(DiscSize%)  ZoneStart%=Buf% ZoneStartBit%=0   zone%=0 Zones%-1 *$ !ZoneStart%=1<<(15+FreeLink%*8) 4( ZoneEndBit%=ZoneStartBit%+ZoneBits% >/ UsedZoneEndBit%=ZoneEndBit%-SpareBits%+4*8 H$ UsedZoneEndBit%>DiscEndBit% R! UsedZoneEndBit%=DiscEndBit% \ f' PreFree%=ZoneStartBit%+FreeLink%*8 p ZoneBit%=ZoneStartBit%+4*8 z zone%=0 " ZoneBit%=ZoneBit%+Zone0Bits% + length%=(BootAdd%+BootSize%) Alloc% / length%DefectStart% $, DefectStart%=DiscToMap(Defect%!ptr%) .( DefectStart%>=UsedZoneEndBit% 8 DefectStart%=ZoneEndBit% B L! DefectEnd%=DefectStart%+1 V ptr%+=4 ` j done1%= t ~ done2%= . NextDefect%=DiscToMap(Defect%!ptr%) ) NextDefect%ZoneEndBit%-(LinkBits%+1) . NextDef%=ZoneEndBit%-(LinkBits%+1)   NextDef%=NextDefect%  . NextDef%-DefectEnd%DefectEnd% % DefectEnd%=NextDefect%+1   ptr%+=4  done2%=    done2% (0 DefectEnd%-DefectStart%ZoneEndBit% F! DefectEnd%=ZoneEndBit% P Z done1%= d nK DefectEnd%>ZoneEndBit%-(LinkBits%+1) DefectEnd%<>ZoneEndBit% x DefectEnd%=ZoneEndBit%  done1%=  0 DefectEnd%-DefectStart%DefectStart% "PROGRAM ERROR 1": B DefectStart%-ZoneBit% <= LinkBits% DefectStart%=ZoneBit%  DefectStart%>ZoneBit% - WriteLink(PreFree%,ZoneBit%-PreFree%) ( DefectStart%>=UsedZoneEndBit% 7 WriteLength(ZoneBit%,UsedZoneEndBit%-ZoneBit%) ' ZoneEndBit%>UsedZoneEndBit% & WriteLink(UsedZoneEndBit%,1) "B WriteLength(UsedZoneEndBit%,ZoneEndBit%-UsedZoneEndBit%) , 6 @4 WriteLength(ZoneBit%,DefectStart%-ZoneBit%) J T PreFree%=ZoneBit% ^ h" DefectStart%UsedZoneEndBit%-(LinkBits%+1) | DefectEnd%=ZoneEndBit%  ! WriteLink(DefectStart%,1) 9 WriteLength(DefectStart%,DefectEnd%-DefectStart%)  ZoneBit%=DefectEnd%   ZoneBit%=ZoneEndBit%   ZoneBit%=ZoneEndBit%  WriteLink(PreFree%,0)  zone%=0  ZoneStart%?CrossCheck%=&FF   ZoneStart%?CrossCheck%=0  2 ?ZoneStart%=NewMapCheck(ZoneStart%,SecSize%) # ZoneStart%=ZoneStart%+SecSize% & ZoneStartBit%=ZoneEndBit% 0 zone% : "Writing map" D(MoanOp(Write%,MapAdd%,Buf%,MapLen%) N0MoanOp(Write%,MapAdd%+MapLen%,Buf%,MapLen%) XWriteRootDir b l: v CalcZones #UsedBits%=SecSize%*8-SpareBits% 1WholeZones%=(MapBits%+Zone0Bits%) UsedBits% .OddBits%=(MapBits%+Zone0Bits%) UsedBits% 8 OddBits% Zones%=WholeZones%+1 Zones%=WholeZones% MapZone%=Zones% 2  MapZone%=0  MapAdd%=0  3 MapAdd%=(UsedBits%*MapZone%-Zone0Bits%)*Alloc%  MapLen%=Zones%*SecSize%  :  CalcIds  )IdsPerZone%=UsedBits% (LinkBits%+1) =Ids%=IdsPerZone% * WholeZones% + OddBits% (LinkBits%+1)   *: 4 DiscToMap(discadd%) > bit%,zone% H'bit%=(discadd% Alloc%)+Zone0Bits% Rzone%=bit% UsedBits% \/bit%=bit%+(bit% UsedBits%)*SpareBits%+4*8 f = bit% p: z WriteLink(off%,link%) . link%>=2^LinkBits% "PROGRAM ERROR 2":  bit%,add%,mask% bit%=off% 8 add%=Buf%+off% 8 mask%=2^LinkBits%-1 1!add%=(!add% (mask%<>>16) t'check%=(check% (check%>>>8)) &FF ~"Boot%!ptr%=EndDefect% check% Sum(Boot%,BootSize%) ,MoanOp(Write%,BootAdd%,Boot%,BootSize%)  :  WriteOldFsMap  "Writing free space map"  s%,I% s%=OldMapSize% 2 * I%=0 OldMapSize%-4 4:Buf%!I%=0: !Buf%=OldLWM% &100 8Buf%!s%=(DiscSize%-OldLWM%-Defects%*SecSize%) &100 !!(Buf%+s%-4)=DiscSize% &100 %!(Buf%+OldMapSize%-5)=(&10000)-1  !(Buf%+OldMapSize%-2)=3 Sum(Buf%,s%) Sum(Buf%+s%,s%) (/MoanOp(Write%,OldMapAdd%,Buf%,OldMapSize%) 2 <: F WriteRootDir P "Writing root directory" Z BF% d' I%=0 DirSize%-4 4:Buf%!I%=0: n NewMap% x $DirMark%="Hugo"   $DirMark%="Hugo"  Buf%!1=!DirMark% BF%=Buf%+DirSize%  NewMap%  BF%!-38=IndRootDirAdd%  " BF%!-38=IndRootDirAdd% &100  BF%?-35="$" BF%?-16="$" BF%!-5=!DirMark%  check%=0 CheckPut(!Buf%) CheckPut(Buf%?4) " I%=BF%-40 , ȕ I%3 6 CheckPut(?I%) @ I%=I%+1 J Tȕ I%>>16) 'check%=(check% (check%>>>8)) &FF BF%?-1=check% -MoanOp(Write%,RootDirAdd%,Buf%,DirSize%)  :  LogToPhys(add%)  ptr%  ptr%=0 ȕ add%>=Defect%!ptr%  ptr%=ptr%+4  add%=add%+SecSize%   =add% :  AddPhysDefect(add%)  ptr%,ptr2%,defect% & Defects%=ptr% & Defect%!(ptr2%+4)=Defect%!ptr2%  ptr2%=ptr2%-4   Defect%!ptr%=add%  Defects%=Defects%+1    "Defect list full"   :  RemovePhysDefect(add%)  ptr%,ptr2%,defect%  ȕ Defect%!ptr% ȕ ptr%= EndDefect%) good% Defects%=ptr%4 $!check%=check% (check%>>>16) .'check%=(check% (check%>>>8)) &FF 8T= good% ((defect%&FF) = check%) (sum(Boot%,BootSize%)=Boot%?(BootSize%-1)) B: L InitDiscRec V I%=0 64-4 4 ` DiscRec%!I%=0 j I% t?DiscRec%=Log2SecSize% ~DiscRec%?1=SecsPerTrk% DiscRec%?2=Heads% DiscRec%!&C=IndRootDirAdd% DiscRec%!&10=DiscSize% DiscRec%!&14=(&10000)-1 &$(DiscRec%+&16)="HardDisc"+Drive% DiscRec%?&22=Drive%  :  InitBootDefects !Boot%=EndDefect% Defects%=0 InitHardDesc   :  InitHardDesc .BootRec%!-&10= &00000000 : SL xxxxxx (6BootRec%!-&C = &0D0C200A : GPL2 GPL3 SH GPL1 29 BootRec%!-&10= &16000000 slow stepping alternative <9 BootRec%!-&C = &0D0CA80A slow stepping alternative F5BootRec%!-8 = LowCurrentCyl% (PreCompCyl%<<16) P7BootRec%!-4 = SecSize%*SecsPerTrk%*Heads%*ParkCyl% Z d: n Ask(String$,Default%) x X,Y,reply$,value%  :11  String$;" ?"; X= Y=  X,Y);Default%;X,Y);  *FX 15,1  ""reply$  reply$=""  value%=Default%   value%=(reply$)   X,Y);value%;3  = value% :  StrAsk(String$,Default$) " X,Y,reply$ , String$;" ?"; 6X= @Y= J X,Y);Default$;X,Y); T ""reply$ ^# reply$="" reply$ = Default$ h X,Y);reply$;3 r = reply$ |: " InputDec(String$,min%,max%)  reply$,value% * String$;" (";min%;" to ";max%;" ) ";  reply$  value%=(reply$) ! value%>=min% value%<=max%  = value% :  InputHex(String$)  reply$,value%  String$;" &";  ""reply$ =("&"+reply$) :  Choose(opt$)  reply$ & 0 reply$ : (reply$)=1 Dreply$=((reply$)&DF) N opt$,reply$) X =reply$ b: l CheckPut(I%) vBcheck%=(check% >>> 13) ((check% (2^13-1)) << (32-13)) I%  :  sum(base%,len%) sum%=0:c%=0  I%=len%-2 0 -1 sum%=sum%+base%?I%+c% + sum%<&100 c%=0 sum%=sum% &FF:c%=1  I% =sum% :  Sum(base%,len%) #base%?(len%-1)=sum(base%,len%)  !: ! & NewMapCheck(B%,C%)=(NewCheck%) !: ! Asm !* opt%=0 2 2 !4 P%=mc% !> [ OPT opt% !H.NewCheck% !R MOV R0,#0 !\ ADDS R2,R1,R2 \C=0 !f .loop% !p LDR R3,[R2,#-4]! !z ADCS R0,R0,R3 ! TEQS R2,R1 ! BNE loop% ! R3,R3,#&FF ! SUB R0,R0,R3 ! R0,R0,R0,LSR #16 ! R0,R0,R0,LSR #8 ! R0,R0,#&FF ! MOVS PC,R14 ! ] ! opt% ! !: ! DisableEscape "+ș "XOS_Byte",200,1,0 R0,OldEscState% "5ș "XOS_Byte",247,%10101010,0 R0,OldBreakState% " "$: ". RestoreEscape "8$ș "XOS_Byte",200,OldEscState%,0 "B&ș "XOS_Byte",247,OldBreakState%,0 "L "V: "` MoanOp(b%, C%, D%, E%) "jPș AdfsSwi%, 0, b% AltDefectBit% (DiscRec%<<6), C% Drive%<< 29, D%, E% "t "~: " Op(b%, C%, D%, E%) "vș AdfsSwi% (1<<17), 0, b% AltDefectBit% (DiscRec%<<6), C% Drive%<< 29, D%, E% Result%, R1%, ErrDiscAdd% " Result% " Result% (1 << 31) "( "Error &";~Result% &3FFFFFFF: " "- ((!Result%) &FFFFFF)=AdfsDiscErr% " Result%=Result%?3 " "! "Error &";~!Result%;" "; " I%=4 " ȕ Result%?I% # Result%?I% #  I%=I%+1 # # #( #2 #< #F #P #Z: #dy Manufacturer, Sectors per track, heads, cylinders, low current cylinder, precompensation cylinder, parking cylinder #n> 20Mb Western Digital/Tandon, 32, 4, 615, &3FF, &3FF, 663 #x> 20Mb Miniscribe, 32, 4, 615, &3FF, 128, 663 #> 20Mb NEC, 32, 4, 612, &3FF, 256, 672 #> 20Mb Olivetti, 32, 4, 612, &3FF, 128, 670 #> 53Mb Rodime, 32, 7, 872, &3FF, 650, 871 #O OTHER, 32, 4, 612, &3FF, 128, 611:REM MUST BE LAST #[ For slow stepping drives you will need to use the alternate lines in PROCInitHardDesc PKϐ49AU00/HD_POD_PRG/PSOAKACARC0Aj; >PSOAK ?Dealer= : If Dealer then attempt to return to main menu. FWist= : If Wist then winnie only,if NOT Wist do whole soak test (8WIST%=0:WinAcc%=50000:flopAcc%=20: Wist WIST%=1 2M************************************************************************ In WIST mode it responds to keys H, Q and T  Mods end. C Mods. for 2.12 - restore keyboard after termination. F Mods. V 2.13 Change path and name of menu to return to. A Ensure that noretries ADFS is loaded. @ Mod done by Brian Rice 26-June-1989. L*********************************************************************** *FX 7 3  *FX 8 3 ver$="2.13 DEALER" C filength(20):Timeset=0:STM$="":et%=&FF:ferr%=0:term%=:A$="" "7*KEY 1 FORI%=0TO&3FFSTEP4:PRINT~I%,~!(I%+Buf%):NEXT ,M Sec Hd Cyl Map Dir Park PCC LCC Type serial no. 6L DefaultShape, 32, 4, 615, 0, &400, 663, 613, 613, "Default","00000000" @C Testtime(hr), Retries, Defects, Re-reads, MaxFails, Writes J? 12, 5, 20, 20, 5, 20 T Format, 1024, 5, 2, 0, 2 ^: h;adfs$="": Wist adfs$="NoRetries" adfs$="NoRetries" r("*RMLOAD "+adfs$) | OSCLI("*RMKILL HardDisc") ("*RMREINIT ADFS") 12 :  Wist win_to_mem J''''''''''''''" INSERT SCRATCH DISC NOW"  Init  Wist Warning :Screen:display_errors  Wist :*FX 2,0  assm DInitAltDefectList : Create blank alternative defect list 0InitAltDiscRec : and disk record. CGetShape : Specify,Restore,read in defect list !display_errors:Displayparms :  Wist & (-85) Hacker: 0 :: D=0 N X test b timeout= l timeout v:  abort Terminate * 130: 0:0,11);240," ");:termseq= G0,11);"Termination sequence running";:timeout=: 128: 2:term%= =Pattern=&4E4E4E4E:write_surface:read_surface:Structure : " abort abort=207:Terminate : display_errors 3 130: 0:0,12);"Test Completed Succesfully." I%=116:"PASS ";:I%  128: 7:0,tlin%);"";  Dealer  "DIR:4"    Wist mem_to_win  *FX 21,0  Q%=4 * et%=&EE 4 Wist ramtest >4seek_track(Seek%,Parkcyl%*&8000,Buf%,blocklen%) H Wist R *FX 2,0 \ *FX 12,0 f p Dealer z : (-99) # ("*DIR :0.AU00.HD_POD_PRG")  "HDU_MENU"  : :  test  ftime=  6 Pattern=&0DB60DB6:write_surface:read_surface 6 Pattern=&0B6D0B6D:write_surface:read_surface 6 Pattern=&A5A5A5A5:write_surface:read_surface  I1%=0 " ȕ (abort=0) ( timeout) 4 Pattern=(I1%<<24)+(I1%<<16)+(I1%<<8)+I1% ( write_surface:read_surface ' I1%=I1%+1: I1%=&FF I1%=0 $ . abort timeout 8 B: L write_surface V abort timeout ` C4%,L1%);"Write "; j9 C4%,L1%+1);"&";8-(~(Pattern)),"0");~Pattern; tH !fcaddr=Buf%:!fclength=&2000:!fcdata=Pattern: flushbuf:track%=0 ~  term% comms  track%=track%+1 % C4%,L1%+2);track%;" "; 8 PROCseek_track(Seek%,staddr%,Buf%,blocklen%)  write_track % termseq display_time 7 (track%=(NoCyls%*NoHeads%)-1) abort timeout  :  read_surface  abort timeout  C4%,L1%);"Read "; 9 C4%,L1%+1);"&";8-(~(Pattern)),"0");~Pattern;  ! track%=(NoCyls%*NoHeads%)   term% comms ( track%=track%-1 2% C4%,L1%+2);track%;" "; <8 PROCseek_track(Seek%,staddr%,Buf%,blocklen%) F read_track P% termseq display_time Z$ (track%=1) abort timeout d n: x write_track  abort timeout - staddr%=track%*&2000:eot%=staddr%+&1FFF   check_track < blocklen%>0 Op(Write%,staddr%,Buf%,blocklen%) P staddr%=staddr%+blocklen%+&100: move to start of next potential block % ( Split) abort timeout  :  read_track  abort timeout - staddr%=track%*&2000:eot%=staddr%+&1FFF   check_track  blocklen%>0 F !fcaddr=Buf%:!fclength=&2000:!fcdata=&12345678: flushbuf " : ,H I%=0 &1F00 &100:!(Buf%+&1F00-I%)=I%+&100:I%:markers 6 : @: Op(Read%,staddr%,Buf%,blocklen%):!fcerrors=0 JM !fcaddr=Buf%:!fclength=blocklen%:!fcdata=Pattern:CALL checkbuf T' !fcerrors<>0 abort=203 ^ hQ staddr%=staddr%+blocklen%+&100: moveto startof next poten. block r% ( Split) abort timeout | : ! seek_track(b%, C%, D%, E%)  abort timeout \ ș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result% 2 Result% good_seek=:seekerr%=seekerr%+1 ( seekerr%>AllowSeek% abort=306  :  check_track Split=:ptr%=-4   ptr%=ptr%+4 L (Defect%!ptr%>=(1<<29))((Defect%!ptr%>=staddr%)(Defect%!ptr%<=eot%)) > (Defect%!ptr%>=staddr%) (Defect%!ptr%<=staddr%+eot%) % blocklen%=Defect%!ptr%-staddr%  Split= & 0+ blocklen%=((track%+1)*&2000)-staddr% : D N: X Op(b%, C%, D%, E%) boș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result%,A,ErrDiscAdd%,R3%,R4% l Result% v7 b%=Write% werror_handler error_handler   :  werror_handler + ((!Result%) &FFFFFF)=AdfsDiscErr%  Wist  Result%=Result%?3: 11 / cyl%=track%4:head%=track%-(cyl%*NoHeads%) 1 erc%,erl%);4-((cyl%)),"0")+(cyl%);" "; 5 erc%+5,erl%);2-((head%)),"0")+(head%);" ";  erc%+8,erl%);"Wr"; ; erc%+11,erl%);2-((Result%*4)),"0")+~(Result%*4); 4 erl%=erl%+1: erl%>31 erc%=erc%+16:erl%=L2%+1  erc%>70 erc%=C5%+1   G 1:wrterr%=wrterr%+1:display_errors: wrterr%>AllowWrt%abort=311   2 * 4 abort=210: > H R: \ error_handler f$ 1:retries%=MaxRetry%:abort=416 p+ ((!Result%) &FFFFFF)=AdfsDiscErr% z Result%=Result%?3   abort=210:  : % Synthesize R4% from buffer data  R4%=&2000  ȕ !(Buf%+&2000-R4%)<>R4%  R4%=R4%-&100  : " (Result%=&12) R4%=R4%+&100 " (Result%=&10) R4%=R4%+&100 " (Result%=&08) R4%=R4%+&100 / Compensate for ECC errors (Don't ask !!!) : 7sector%=((staddr%+&2000-R4%)&100)-(track%*SecTrk%) $P IF(sector%<0)OR(sector%>31) THEN PRINT"Bad sect with result "~Result%:STOP .FC%=staddr%+(sector%*&100):E%=&100: Limit retry to sector in error 8MD%=Buf%+(sector%*&100):blocklen%=(((blocklen%-R4%)&100)*&100): adjusted B I%=-1 L V I%=I%+1 `A (I%>AllowReRd%) (ReRdLog%(I%,0)=0) (ReRdLog%(I%,0)=C%) j ReRdLog%(I%,0)=C% t% ReRdLog%(I%,1)0 2 retries%=retries%-1:rereads%=rereads%+1 ) Wist 10:track_print: 1 v ș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result%,A,ErrDiscAdd%,R3%,R4%  Result%=0 ) retries%=0:abort=0:Split=   abort ( Result%=Result%?3 25 track_print:AddPhysDefect(C%):DefectCheck <@ Defect%!ptr%=check% (1<<29):Sum(Defect%,DefectSize%) F3 abort=0:adddefect%=adddefect%+1:Structure P Z* rereads%>AllowReRd% abort=305 d ndisplay_errors: 2 x :  display_errors 1 C4%,L1%+3);wrterr%;:C4%,L1%+4);rereads%; & PRINTTAB(C4%,L1%+5);reformats%; 4 C4%,L1%+5);adddefect%;:C4%,L1%+6);Defects%;  : Screen LC1%=2:C2%=30:C3%=40:C4%=67:C5%=0:L1%=4:L2%=14:erc%=C5%+1:erl%=L2%+1::7 ?" Acorn Computers Winchester Soak and Test "; ! Wist "(WIST)" "(ASOAK)" E" ------------------------------------------------" G" Version ";ver$;" 8-October-1987 ADFS ";adfs$;" Q - to quit"  6 ) C1%,L1%+0);"Type";C2%-C1%-4,"."); 3 C1%,L1%+1);"Serial Number";C2%-C1%-13,"."); "> C1%,L1%+2);"Precompensation Cylinder";C2%-C1%-24,"."); ,@ C1%,L1%+3);"Reduced Write Current Cyl.";C2%-C1%-26,"."); 6* C1%,L1%+4);"Heads";C2%-C1%-5,"."); @. C1%,L1%+5);"Cylinders";C2%-C1%-9,"."); J3 C1%,L1%+6);"Park Cylinder";C2%-C1%-13,"."); T: ^> C3%,L1%+0);"Read/Write/Format/Verify";C4%-C3%-24,"."); h2 C3%,L1%+1);"Data Pattern";C4%-C3%-12,"."); r6 C3%,L1%+2);"Working on track";C4%-C3%-16,"."); |2 C3%,L1%+3);"Write errors";C4%-C3%-12,"."); 7 C3%,L1%+4);"Re-reads Required";C4%-C3%-17,"."); 3 C3%,L1%+5);"Defects Added";C4%-C3%-13,"."); 4 C3%,L1%+6);"Logged Defects";C4%-C3%-14,"."); : 8 I%=0 4:C5%+I%*16,L2%);" Cyln Hd Sc Er ";:I%  J%=L2% L2%+17 0 I%=0 3:C5%+I%*16+15,J%);"|";: I% J%  :  Displayparms 3  C2%,L1%+0);type$  C2%,L1%+1);serno$  C2%,L1%+2);PCC%  C2%,L1%+3);LCC% & C2%,L1%+4);NoHeads% 0 C2%,L1%+5);NoCyls% : C2%,L1%+6);Parkcyl% D: N ptr%=0 X ȕ Defect%!ptr%<(1<<29) bO track%=(Defect%!ptr%)&2000:sector%=(Defect%!ptr%/&100)-(track%*SecTrk%) l track_print:ptr%=ptr%+4 v 2  :  track_print > Pass track number, sector must be calculated externally E cyl%=track%4:head%=track%-(cyl%*NoHeads%):Result%=Result% &FF 1 erc%,erl%);4-((cyl%)),"0")+(cyl%);" "; 5 erc%+5,erl%);2-((head%)),"0")+(head%);" "; 5 erc%+8,erl%);2-((sector%)),"0")+(sector%); ; erc%+11,erl%);2-((Result%*4)),"0")+~(Result%*4); 4 erl%=erl%+1: erl%>31 erc%=erc%+16:erl%=L2%+1  erc%>70 erc%=C5%+1  :  cylprint 1 erc%,erl%);4-((cyl%)),"0")+(cyl%);" "; 5 erc%+5,erl%);2-((head%)),"0")+(head%);" "; *5 erc%+8,erl%);2-((sector%)),"0")+(sector%); 44 erl%=erl%+1: erl%>31 erc%=erc%+13:erl%=L2%+1 > erc%>70 erc%=C5%+1 H R: \ display_time fA dtime=:hr%=dtime 360000:min%=(dtime-(hr%*360000)) 6000 p1 sec%=(dtime-(hr%*360000)-(min%*6000)) 100 zJC1%,tlin%);"Elapsed time ";hr%;" hr ";min%;" min ";sec%;" sec "; Wist  (-17) abort=215  (-36) abort=99   timeout L dtime=tsttime+ftime-:hr%=dtime 360000:min%=(dtime-(hr%*360000))6000 1 sec%=(dtime-(hr%*360000)-(min%*6000)) 100 JC3%,tlin%);"Test ends in ";hr%;" hr ";min%;" min ";sec%;" sec "; 9 dtime<=0 timeout=: Time is up so end the test  2cycle%=cycle%+WIST%: cycle%=WinAcc% floppy comms  :  assm 9 code &300:EnterOS=&16:SVC_mode=3:I_bit=1<<27 $. pass=0 2 2:P%=code:[ OPT pass .H .flushbuf SWI EnterOS ;enter supervisor mode 8B TEQP pc,#I_bit+SVC_mode ;kill interrupts BE LDR r0,fcaddr ;get buffer address LO LDR r1,fcdata ;get data to fill buffer with VD LDR r2,fclength ;get buffer length `R .flushloop STR r1,[r0],#4 ;store data in buffer & inc addr jD SUBS r2,r2,#4 ;decrement counter tB BNE flushloop ;loop until done ~; BAL exit ;and quit  ; % .checkbuf SWI EnterOS 0 TEQP pc,#I_bit+SVC_mode ' LDR r0,fcaddr ' LDR r1,fcdata ) LDR r2,fclength & ADDS r2,r2,#0 O BEQ exit ;cope with zero length checks O LDR r3,fcerrors ;get a zero poked in by BASIC R .checkloop LDR r4,[r0],#4 ;read a word from buffer into r4 L CMP r1,r4 ;test if same as test data O ADDNE r3,r3,#1 ;inc error count if not equal D SUBS r2,r2,#4 ;decrement counter  B BNE checkloop ;loop until done I STR r3,fcerrors ;store result for BASIC " BAL exit ( ; 2% .skip1chk SWI EnterOS <0 TEQP pc,#I_bit+SVC_mode F' LDR r0,fcaddr PI ADDS r0,r0,#4 ;Skip 1st word in check Z' LDR r1,fcdata d) LDR r2,fclength n& SUBS r2,r2,#4 xO LDR r3,fcerrors ;get a zero poked in by BASIC R .skip1loop LDR r4,[r0],#4 ;read a word from buffer into r4 L CMP r1,r4 ;test if same as test data O ADDNE r3,r3,#1 ;inc error count if not equal D SUBS r2,r2,#4 ;decrement counter B BNE skip1loop ;loop until done I STR r3,fcerrors ;store result for BASIC  ; # .exit TEQP pc,#0 # MOV r0,r0 B MOVS pc,r14 ;return to BASIC  ; A .fcaddr EQUD 0 ;buffer address @ .fclength EQUD 0 ;buffer length G .fcdata EQUD 0 ;data to test or fill N .fcerrors EQUD 0 ;error count, must init to 0  ; " .loop ,( LDRB R3,[R0],#1 6( LDRB R4,[R1],#1 @# TEQS R3,R4 J" BNE fail T .checkk% ^# CMPS R0,R2 h" BNE loop r# MOV R0,#0 |$ MOVS PC,R14  .fail $ MOVS PC,R14  ]: pass  : :  Init PCC%=0:LCC%=0  Verify%=0  Read%=1  Write%=2 WriteTrack%=4  Seek%=5 Restore%=6 Specify%=&F AltDefectBit%=&10 &DiscStruc%=&14 0SecSize%=&100:LogSecSize%=8 :MapSize%=&200 DDirSize%=&800 NDefectAdd%=&C00 XDefectSize%=&200 b'MaxDefects%=(DefectSize%-64-&C-4)4 l LWM%=&E00 vAdfsSwi%=&40240 AdfsDiscErr%=&108C7 MaxVerifyBad%=32 P Buf% &2000, DiscRec% 64+&200, mc% 100, Hugo% 4,Bad%(MaxVerifyBad%),RWP%(5) "Defect%=DiscRec%+64:Defects%=0 %DefectRec%=Defect%+DefectSize%-64 ASecTrk%=0:NoHeads%=0:NoCyls%=0:MapAdd%=0:DirAdd%=0:Parkcyl%=0 Restore("DefaultShape") MSecTrk%,NoHeads%,NoCyls%,MapAdd%,DirAdd%,Parkcyl%,PCC%,LCC%,type$,serno$ /DiscSize%=SecSize%*SecTrk%*NoHeads%*NoCyls% 7sector%=0:Drive%=4:A%=0:B%=0:C%=0:R3%=0:R4%=0:I1%=0 3 AltDiscRec% 64+&200:AltDefect%=AltDiscRec%+64 +AltDefectRec%=AltDefect%+DefectSize%-64 IResult%=0:retries%=0:MaxRetry%=0:AllowDef%=0:AllowWrt%=0:AllowSeek%=7 Rreformats%=0:dataerr%=0:wrterr%=0:eccerr%=0:rereads%=0:adddefect%=0:seekerr%=0  >staddr%=0:blocklen%=0:track%=0:abort=:good_seek=:Split= ;hr%=0:min%=0:sec%=0:dtime%=0:tcol%=10:tlin%=3:tsttime=0  1ftime=0:timeout=:abort=0:termseq=:eoeblk%=0 *@ tsttime,MaxRetry%,AllowDef%,AllowReRd%,MaxFails%,AllowWrt% 4tsttime=(tsttime*360000) >) ReRdLog%(AllowReRd%,1), Scratch 256 H:I%=0AllowReRd%:ReRdLog%(I%,0)=0:ReRdLog%(I%,1)=0:I% R 19,10,16,&F0,&A0,&00 \ 19,11,16,&E0,&60,&80 fAdfsSwi%=&40240 p Wist z fDiscRec% 36 * fDiscRec% 4<>0: "Bad Disc Rec": 3 A$,secsize%,SecsPerTrk%,Heads%,Skew%,Density% flopers%=0:sererr%=0 ?fDiscRec%=0 9S%=secsize%:ȕ S%>1 ?fDiscRec%=?fDiscRec%+1:S%=S%2: fDiscRec%?1=SecsPerTrk% fDiscRec%?2=Heads% fDiscRec%?3=Density% fDiscRec%?34=0  z% -1 $dsize%=((-z%-&800)/2)&FFFFFF00 E dsize%>secsize%*SecsPerTrk%*160 dsize%=secsize%*SecsPerTrk%*160 fDiscRec%!16=dsize% dummy=(-1)  lwm%=&C00  fill%=0 $ secs%=(dsize%-lwm%)secsize% . opctr%=0 8 R% dsize%*2 Bz%=R%+dsize% L& I%=lwm% dsize%-4 4:R%!I%=0: V#op(2,lwm%,R%+lwm%,dsize%-lwm%) ` j t ~ :  Warning @ This procedure is no longer required and has been removed 9 Version 2.13 by Brian Rice for the Dealer Version.  Drive%=Ask("Test Drive",4)  12  (: 2 GetShape <InitDefectList FInitDiscRec PFatalOp(Specify%,0,0,0) ZFatalOp(Restore%,0,0,0) d2FatalOp(Read%,DefectAdd%,Defect%,DefectSize%) n GoodDefects x OldShape   abort=102:Terminate   ptr%=0  ȕ Defect%!ptr%<(1<<29)  ptr%=ptr%+4  3 (ptr% 4)>AllowDef% abort=104:Terminate  :  OldShape SecTrk%=DefectRec%?1 NoHeads%=DefectRec%?2 MapAdd%=DefectRec%!8 DirAdd%=DefectRec%!&C DiscSize%=DefectRec%!&10 "3NoCyls%=DiscSize% (SecSize%*SecTrk%*NoHeads%) ,8Parkcyl%=(DefectRec%!-4)(SecSize%*SecTrk%*NoHeads%) 6PCC%=DefectRec%!-8>>16 @LCC%=DefectRec%!-8 &FFFF JInitDiscRec T$InitAltDiscRec:InitAltHardDesc ^ h: r AskShape |-SecTrk%=Ask("Sectors per track",SecTrk%) DiscRec%?1=SecTrk% #NoHeads%=Ask("Heads",NoHeads%) DiscRec%?2=NoHeads% %NoCyls%=Ask("Cylinders",NoCyls%) /DiscSize%=SecSize%*SecTrk%*NoHeads%*NoCyls% DiscRec%!&10=DiscSize% .Parkcyl%=Ask("Parking cylinder",Parkcyl%)   ptr%=0 / "Current Defects (Cylinder,Head,Sector)"  ȕ Defect%!ptr%<(1<<29)  defect%=Defect%!ptr%  defect%=defect% SecSize%  sector%=defect% SecTrk%  defect%=defect% SecTrk% T ((ptr%4)7)*11);"(";defect%NoHeads%;",";defect%NoHeads%;",";sector%;")"; & ptr%=ptr%+4 0 : Defects%=ptr%4 D NP rwopt$=Choose("A: add defect, B: Remove defect, C: No more changes","ABC") X rwopt$<>"C" b, cyl%=InputDec("Cylinder",0,NoCyls%-1) l* head%=InputDec("Head",0,NoHeads%-1) vC sector%=InputDec("Byte, or -ve for sector",1-SecTrk%,&10000) ; sector%>=0 sector%=sector% 320 sector%=-sector%  > defect%=((cyl%*NoHeads%+head%)*SecTrk%+sector%)*SecSize%  rwopt$="A"  AddPhysDefect(defect%)  ! RemovePhysDefect(defect%)    rwopt$="C"  I%=0 DiscStruc%-1  DefectRec%?I%=DiscRec%?I%  I% DefectCheck  !Defect%!ptr%=(1<<29) check% InitHardDesc  Sum(Defect%,DefectSize%) * 4: > DefectCheck H ptr%=0 R check%=0 \ȕ Defect%!ptr%<(1<<29) f CheckPut(Defect%!ptr%) p ptr%=ptr%+4 z Defects%=ptr% 4 !check%=check% (check%>>>16) 'check%=(check% (check%>>>8)) &FF $ Defects%>AllowDef% abort=304  :  WriteDefectList 3FatalOp(Write%,DefectAdd%,Defect%,DefectSize%)  :  LogToPhys(add%)  ptr%  ptr%=0 ȕ add%>=Defect%!ptr%  ptr%=ptr%+4  add%=add%+SecSize% $ . =add% 8: B AddPhysDefect(add%) L ptr%,ptr2%,defect% V Defects%=ptr% & Defect%!(ptr2%+4)=Defect%!ptr2%  ptr2%=ptr2%-4   Defect%!ptr%=add%  Defects%=Defects%+1    abort=209   $ Defects%>AllowDef% abort=304  (: 2 RemovePhysDefect(add%) < ptr%,ptr2%,defect% Fȕ Defect%!ptr%= (1<<29)) good% TDefects%=ptr%4 ^!check%=check% (check%>>>16) h'check%=(check% (check%>>>8)) &FF r\= good% ((defect%&FF) = check%) (sum(Defect%,DefectSize%)=Defect%?(DefectSize%-1)) |:  InitDiscRec ?DiscRec%=LogSecSize% DiscRec%?1=SecTrk% DiscRec%?2=NoHeads% DiscRec%?3=0 DiscRec%?4=0 9DiscRec%?5=0 : Not used at 0.1 MapSize% DIV &80 DiscRec%?6=0 DiscRec%?7=0 0DiscRec%!8=0 : Not used at 0.1 MapAdd% DiscRec%!&C=DirAdd% DiscRec%!&10=DiscSize% DiscRec%!&14=(&10000)-1 DiscRec%!&18=0 DiscRec%!&1C=0 DiscRec%?&22=Drive% & 0: : InitDefectList D3!Defect%=(1<<29) : empty defect NDefects%=0 XInitHardDesc b l: v InitHardDesc =DefectRec%!-&10=&16000000 : SL xxxxxx EDefectRec%!-&C =&0D0CA80A : GPL2 GPL3 SH GPL1 ;DefectRec%!-8 =PCC%*10000 + LCC% : PCC LCC 6DefectRec%!-4 =SecSize%*SecTrk%*NoHeads%*Parkcyl%  :  InitAltDiscRec ?AltDiscRec%=LogSecSize% AltDiscRec%?1=SecTrk% AltDiscRec%?2=NoHeads% AltDiscRec%?3=0 AltDiscRec%?4=0 >AltDiscRec%?5=0 : Not used at 0.1 MapSize% DIV &80 AltDiscRec%?6=0  AltDiscRec%?7=0 5AltDiscRec%!8=0 : Not used at 0.1 MapAdd%  AltDiscRec%!&C=DirAdd% *AltDiscRec%!&10=DiscSize% 4AltDiscRec%!&14=(&10000)-1 >AltDiscRec%!&18=0 HAltDiscRec%!&1C=0 RAltDiscRec%?&22=Drive% \ f: p InitAltDefectList z2!AltDefect%=(1<<29) : empty defect AltDefects%=0 InitAltHardDesc  :  InitAltHardDesc @AltDefectRec%!-&10=&16000000 : SL xxxxxx HAltDefectRec%!-&C =&0D0CA80A : GPL2 GPL3 SH GPL1 >AltDefectRec%!-8 =PCC%*&10000 + LCC% : PCC LCC 9AltDefectRec%!-4 =SecSize%*SecTrk%*NoHeads%*Parkcyl%  :  AskHex(String$,Default%)  X,Y,reply$,value%  String$;" ?"; X= Y= $ X,Y);"&";~Default%;X,Y); . ""reply$ 82 reply$="" value%=Default% value%=(reply$) B X,Y);"&";~value%;9 L = value% V: ` Ask(String$,Default%) j X,Y,reply$,value% t String$;" ?"; ~X= Y=  X,Y);Default%;X,Y);  ""reply$ 2 reply$="" value%=Default% value%=(reply$)  X,Y);value%;9  = value% : " InputDec(String$,min%,max%)  reply$,value% * String$;" (";min%;" to ";max%;" ) ";  reply$  value%=(reply$) ! value%>=min% value%<=max%  = value% :  Choose(mess$,rwopt$) ( reply$ 2 mess$; < F reply$ P (reply$)=1 Zreply$=((reply$)&DF) d rwopt$,reply$) n =reply$ x:  CheckPut(I%) Bcheck%=(check% >>> 13) ((check% (2^13-1)) << (32-13)) I%  :  sum(base%,len%) sum%=0:c%=0  I%=len%-2 0 -1 sum%=sum%+base%?I%+c% + sum%<&100 c%=0 sum%=sum% &FF:c%=1  I%  =sum% :  Sum(base%,len%) #base%?(len%-1)=sum(base%,len%)  : " Restore(A$) , B$ 6 @ B$ J B$=A$ T ^: h FatalOp(b%, C%, D%, E%) roș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result%,A,ErrDiscAdd%,R3%,R4% |$ Result% abort=201:Terminate  :  RSECT  + sector%=Ask("Read which sector ",-1)  sector%=-1  I%=0&FF:Buf%?I%=I%:I% ' Op(Read%,sector%*&100,Buf%,&100) ' I%=0 &FF 16:@%=3:~I%": "; 2 @%=10:J%=0 15 4:~!(I%+J%+Buf%);" ";: = " ";:J%=0 15:Z%=?(I%+J%+Buf%): Z%>31:Z% &2E  ::@%=3:  sector%=-1  :  WSECT & 0, sector%=Ask("Write which sector ",-1) : sector%=-1 D I%=0&FF:Buf%?I%=0:I% N( Op(Write%,sector%*&100,Buf%,&100) X' I%=0 &FF 16:@%=3:~I%": "; b2 @%=10:J%=0 15 4:~!(I%+J%+Buf%);" ";: l= " ";:J%=0 15:Z%=?(I%+J%+Buf%): Z%>31:Z% &2E v ::@%=3:  sector%=-1  : Format  I%,J%,cyl%,head% FatalOp(Specify%,0,0,0) FatalOp(Restore%,0,0,0) C4%,L1%);"Format "; * I%=0 512-4 4:Buf%!I%=&077F03FF:  cyl%=0 NoCyls%-1  head%=0 NoHeads%-1 1 J%=cyl% (head%<<24):track%=(cyl%*4)+head% ! C4%,L1%+2);track%;" "; !8 I%=0 (SecTrk%-1)*4 4:Buf%!I%=J% (I%<<14): ! F Op(WriteTrack%,(cyl%*NoHeads%+head%)*SecTrk%*SecSize%,Buf%,512) ! head% ! cyl% !*+reformats%=reformats%+1:display_errors !4 !>: !H Format_track !R I%,J%,cyl%,head% !\FatalOp(Specify%,0,0,0) !fFatalOp(Restore%,0,0,0) !pC4%,L1%);"Format "; !z* I%=0 512-4 4:Buf%!I%=&077F03FF: !0 cyl%=track%4:head%=track%-(cyl%*NoHeads%) !1 J%=cyl% (head%<<24):track%=(cyl%*4)+head% !! C4%,L1%+2);track%;" "; !8 I%=0 (SecTrk%-1)*4 4:Buf%!I%=J% (I%<<14): !I PROCOp(WriteTrack%,(cyl%*NoHeads%+head%)*SecTrk%*SecSize%,Buf%,512) !+reformats%=reformats%+1:display_errors ! !: ! Verified !( LOCAL bad%,add%,sector%,head%,cyl% !Jbad%=0:add%=0:ptr%=0:blkcnt=0:Pattern=&4E4E4E4E:C4%,L1%);"Verify "; !5C4%,L1%+1);"&";8-(~(Pattern)),"0");~Pattern; ! " defect%=Defect%!ptr% " defect%>DiscSize% " blocklen%=DiscSize%-add% "$ ". blocklen%=defect%-add% "8 "B FatalOp(Restore%,0,0,0) "L" Op(Verify%,add%,0,blocklen%) "V Result% "`" add%=ErrDiscAdd% &1FFFFF00 "j sector%=add% SecSize% "t head%=sector% SecTrk% "~ sector%=sector% SecTrk% " cyl%=head% NoHeads% " head%=head% NoHeads% " cylprint " Bad%(bad%)=add% " bad%=bad%+1 " add%=add%+SecSize% " "" add%=add%+blocklen%+SecSize% " "! add%>defect% ptr%=ptr%+4 "* add%>=DiscSize% bad%=MaxVerifyBad% " bad%<>0 # bad2%=bad% #  ȕ bad2%>0 # bad2%=bad2%-1 #" AddPhysDefect(Bad%(bad2%)) #( #2 DefectCheck #<& Defect%!ptr%=check% (1<<29) #F" Sum(Defect%,DefectSize%) #P #Z bad%=0 #d #n =(bad%=0) #x: # Track_Verified #(add%=track%*SecSize%:eot%=add%+&2000 #Cbad%=0:ptr%=0:blkcnt=0:Pattern=&4E4E4E4E:C4%,L1%);"Verify "; #5C4%,L1%+1);"&";8-(~(Pattern)),"0");~Pattern; # # defect%=Defect%!ptr% # defect%>eot% # blocklen%=eot%-add% # # blocklen%=defect%-add% # # FatalOp(Restore%,0,0,0) #" Op(Verify%,add%,0,blocklen%) $ Result% $" add%=ErrDiscAdd% &1FFFFF00 $ sector%=add% SecSize% $" head%=sector% SecTrk% $, sector%=sector% SecTrk% $6 cyl%=head% NoHeads% $@ head%=head% NoHeads% $J cylprint $T Bad%(bad%)=add% $^ bad%=bad%+1 $h add%=add%+SecSize% $r $|" add%=add%+blocklen%+SecSize% $ $! add%>defect% ptr%=ptr%+4 $% add%>=eot% bad%=MaxVerifyBad% $ bad%<>0 $ bad2%=bad% $ ȕ bad2%>0 $ bad2%=bad2%-1 $" AddPhysDefect(Bad%(bad2%)) $ $ DefectCheck $& Defect%!ptr%=check% (1<<29) $" Sum(Defect%,DefectSize%) $ % bad%=0 % % =(bad%=0) %&: %0 Structure %:WriteDefectList %DWriteOldFsMap %NWriteRootDir %X %b: %l WriteOldFsMap %v s%,I% %s%=MapSize% 2 %' I%=0 MapSize%-4 4:Buf%!I%=0: %!Buf%=LWM% &100 %5Buf%!s%=(DiscSize%-LWM%-Defects%*SecSize%) &100 %!!(Buf%+s%-4)=DiscSize% &100 %"!(Buf%+MapSize%-5)=(&10000)-1 %!(Buf%+MapSize%-2)=3 %Sum(Buf%,s%) %Sum(Buf%+s%,s%) %*FatalOp(Write%,MapAdd%,Buf%,MapSize%) % %: % WriteRootDir & BF% & ' I%=0 DirSize%-4 4:Buf%!I%=0: &$Hugo%="Hugo":hugo%=!Hugo% & Buf%!1=hugo% &*BF%=Buf%+DirSize% &4BF%!-38=DirAdd% &100 &>BF%?-35="$" &HBF%?-16="$" &RBF%!-5=hugo% &\ check%=0 &fCheckPut(!Buf%) &pCheckPut(Buf%?4) &z I%=BF%-40 & ȕ I%3 & CheckPut(?I%) & I%=I%+1 & &ȕ I%>>16) &'check%=(check% (check%>>>8)) &FF &BF%?-1=check% &*FatalOp(Write%,DirAdd%,Buf%,DirSize%) & ': ' ZAPMAP '2FatalOp(Read%,DefectAdd%,Defect%,DefectSize%) '$0!Defect%=&20000000:Sum(Defect%,DefectSize%) '.WriteDefectList '8 'B: 'L Hacker 'V *FX 21,0 '`0,L1%+7);""; 'j)"PROCZAPMAP - Clear the defect list" 't*"PROCRSECT - Read a sector from disk" '~3"PROCWSECT - Write a sector of zeroes to disk" ' ': ' Terminate '8 abort<100 abort=0:: Some aborts are not errors ', 129: 0:0,11);240," ");:0,11);""; 'K abort>300 "Test Parameter Beyond Acceptable Limit":abort=abort-300 'E abort>200 "Fatal Error Occurred During Test":abort=abort-200 'G abort>100 "Fatal error - Unable to start test":abort=abort-100 'Ȏ abort '5 1:"Winchester drive or interface failure" '# 2:"Defect list corrupt" '4 3:"Error during data transfer to memory" (C 4:"Defects in excess of acceptable limit of ";AllowDef% ( L 5:"Sector re-reads in excess of acceptable limit of ";AllowReRd% (H 6:"Seek errors in excess of acceptable limit of ";AllowSeek% (1 7:"Error during termination sequence" ((; 8:"Bad error 8 - Defect already in defect list" (2. 9:"Bad error 9 - Defect list full" (<' 10:"Non ADFS error occurred" (FH 11:"Write errors in excess of acceptable limit of ";AllowWrt% (P 15:"User interrupt." (Z (dI%=116:"FAIL ";:I% (n 128: 7:0,tlin%);""; (x *FX 21,0 (4seek_track(Seek%,Parkcyl%*&8000,Buf%,blocklen%) ( *FX 2,0 ( (# ("*DIR :0.AU00.HD_POD_PRG") ( "HDU_MENU" (! ** End Of Alex's Section ** ( floppy ( ferr%<>0 ( "DIR:0" ( cycle%=0 (+ ''''''''"Accessing Floppy Drive...." ( bash ( ( bash ( ) fct%=fct%+1 ) op%=(2) )+ start%=((secs%+1)-1)*secsize%+lwm% )"! start%=dsize% length%=0 ),3 start%<>dsize% l1%=(dsize%+1-start%)-1 )63 start%<>dsize% l2%=(dsize%+1-start%)-1 )@7 start%<>dsize% length%=(dsize%+1-start%)-1 )J2 start%<>dsize% l1%dsize% l2%0 )6 op%=1 check(R%+start%,z%,R%+start%+length%) ) "FX 21,1" )6 fct%=flopAcc% fct%=0:11:Q=0160:" ";:: ) ) ) check(A%,B%,C%) )( checkk%<>0 flopers%=flopers%+1 ) ) RandData(S%,L%) ) L%=0 ) I%=0 L%-4 4:S%!I%=: ) L%>3 S%!(L%-4)= ) J%=L%secsize% * J%=0 *0 I%=L% L%+secsize%-J%-1:S%?(I%)=fill%: * *& op(fb%,C%,fD%,fE%) *0 : 3 *: " Op ";opctr%; *D comms *N/ fb%=1 " Read from "; " Write to "; *X: "Disc address ";~C%;" start=";~fD%;" length=";~fE% *b 11:11:ferr%=(&3F000000 )/&1000000:" "'"Disc error ";~ferr%;" Floppy tests terminated ": 2: :fct%=flopAcc%:flopers%+=1: *l6 ș "ADFS_DiscOp",0,fb%+(fDiscRec%<<6),C%,fD%,fE% *v * comms * opctr%=opctr%+1 * 11 * 2 * *1 ************ COMMS BIT!! ************ * comms * *FX2,1 *) time0%= 6000 :time1%=time0% 60 *. A=(0) : has character been recieved *8 A<>&FF A<>-1 sererr%+=1:: is charac. &FF? *) A=-1 : if no character received *M Checksum%=Defects%+rereads%+seekerr%+flopers%+sererr%+time0%+time1%+et% + *FX 3 7 +  (Defects%); + (rereads%); +  (seekerr%); +* (flopers%); +4 (sererr%); +> (time0%); +H (time1%); +R (Checksum%); +\ (et%); +f *FX 3 0 +p A=(50) +z A=-1 sererr%+=1: + Timeset=0 Timeset + *FX 3 0 + + Timeset + *FX 15 0 + Timeset=1 + X=1 11 + STM$=STM$+((200)) + +4 "SET Sys$Date Fri,"+STM$,1,2)+" "+STM$,3,3) +6 "SET Sys$Time "+STM$,6,2)+":"+STM$,8,2)+":00" +$ "SET Sys$Year 19"+STM$,10,2) + ,Iwin_to_mem: loads progs from winnie to ram to prevent overwriting , "LOAD !F2BOOT 200000" ,> ș "XOS_File",5,"!F2BOOT" R0,R1,R2,R3,R4:filength(0)=R4 ,$ "LOAD BWIT 200100" ,.; ș "XOS_File",5,"BWIT" R0,R1,R2,R3,R4:filength(1)=R4 ,8 "LOAD COMPTYPE 204100" ,B? ș "XOS_File",5,"COMPTYPE" R0,R1,R2,R3,R4:filength(2)=R4 ,L "LOAD EPSPRINT 205100" ,V? ș "XOS_File",5,"EPSPRINT" R0,R1,R2,R3,R4:filength(3)=R4 ,` "LOAD JPPRINT 205200" ,j> ș "XOS_File",5,"JPPRINT" R0,R1,R2,R3,R4:filength(4)=R4 ,t "LOAD MENU400 205300" ,~> ș "XOS_File",5,"MENU400" R0,R1,R2,R3,R4:filength(5)=R4 , "LOAD NOPRINT 206300" ,> ș "XOS_File",5,"NOPRINT" R0,R1,R2,R3,R4:filength(6)=R4 , "LOAD PORTS 206400" ,< ș "XOS_File",5,"PORTS" R0,R1,R2,R3,R4:filength(7)=R4 , "LOAD SCREEN 20A400" ,= ș "XOS_File",5,"SCREEN" R0,R1,R2,R3,R4:filength(8)=R4 , "LOAD STATCHK 20E400" ,> ș "XOS_File",5,"STATCHK" R0,R1,R2,R3,R4:filength(9)=R4 , "LOAD TIME 211400" ,< ș "XOS_File",5,"TIME" R0,R1,R2,R3,R4:filength(10)=R4 , "LOAD WFORM 214400" ,= ș "XOS_File",5,"WFORM" R0,R1,R2,R3,R4:filength(12)=R4 - "LOAD ASOAK 217400" - = ș "XOS_File",5,"ASOAK" R0,R1,R2,R3,R4:filength(13)=R4 - "LOAD MEMOBJ 220000" -> ș "XOS_File",5,"MEMOBJ" R0,R1,R2,R3,R4:filength(14)=R4 -( -2= mem_to_win : copies func test back to winnie from ram -< "WIPE * ~CF~V" -F* "SAVE !BOOT 200000 +"+(filength(0)) -P) "SAVE BWIT 200100 +"+(filength(1)) -Z- "SAVE COMPTYPE 204100 +"+(filength(2)) -d- "SAVE EPSPRINT 205100 +"+(filength(3)) -n, "SAVE JPPRINT 205200 +"+(filength(4)) -x, "SAVE MENU400 205300 +"+(filength(5)) -, "SAVE NOPRINT 206300 +"+(filength(6)) -* "SAVE PORTS 206400 +"+(filength(7)) -* "SAVE SCREEN 20A400+"+(filength(8)) -, "SAVE STATCHK 20E400 +"+(filength(9)) -* "SAVE TIME 211400 +"+(filength(10)) -+ "SAVE WFORM 214400 +"+(filength(12)) -+ "SAVE ASOAK 217400 +"+(filength(13)) -A "SAVE MEMOBJ 220000+"+(filength(14))+ " 00008000 00008000" - "SETTYPE ASOAK FFB" - "SETTYPE !BOOT FFB" - "SETTYPE BWIT FFB" - "SETTYPE COMPTYPE FFB" - "SETTYPE EPSPRINT FFB" . "SETTYPE JPPRINT FFB" . "SETTYPE MENU400 FFB" . "SETTYPE NOPRINT FFB" ." "SETTYPE PORTS FFB" ., "SETTYPE SCREEN FFB" .6 "SETTYPE STATCHK FFB" .@ "SETTYPE TIME FFB" .J "SETTYPE WFORM FFB" .T .^ ramtest .h .r comms .| . . ** end of file ** PKې99AU00/HD_POD_PRG/PWITACARC0At; >PWIT L*********************************************************************** = Winchester Interface Quick Test (WIQT) [wicket] (A Written by Alex Bienek 14-July-1987 2D Modified for use with podules 6-January-1988 <& (c) Acorn Computers Ltd. F Filename: PBWIT P Version : 1.00 Z* Version : 1.01 by Brian Rice dF Change file name to PWIT, change the path nJ and file name of the return menu. 26-Jun-1989 xL*********************************************************************** : version$="1.01"  0 > Init: Initialise all variables and dimension the arrays *TV0,1  6  7 ( :BNR$=(132)+(157)+(129)+(141) + BNR$;" Winchester Interface Test" + BNR$;" Winchester Interface Test" 8 " (c) Acorn Computers Ltd. Version ";version$:  * "Initialising all program variables"  "Assembling ARM code" " assm: Assemble the ARM code 6 PCC%=Ask("Write Pre-compensation cylinder",1023) ": ,DInitAltDefectList : Create blank alternative defect list 60InitAltDiscRec : and disk record. @CGetShape : Specify,Restore,read in defect list JA abort% A$=Choose("Bad defect list, continue (Y/N)","YN") T abort% : A$<>"Y" ^: h Main test procedure r: |4 stsect%=0 &6000 &2000 : 1st cyl. = 31,0,10:"Reading track ";stsect%/&2000 1 Op(Read%,stsect%,Buf%,&2000)  stsect% : ? stsect%=&1300000 &1306000 &2000 : last cyl. = 31,0,12:"Reading track ";stsect%/&2000 1 Op(Read%,stsect%,Buf%,&2000)  stsect% : ? stsect%=&980000 &986000 &2000 : middle cyl. M !fcaddr=Buf%:!fclength=&2000:!fcdata=&DB6DB6DB: flushbuf K !Buf%=stsect%: 31,0,14:"Writing track ";stsect%/&2000 2 Op(Write%,stsect%,Buf%,&2000)  stsect% : / stsect%=&980000 &986000 &2000 &? 31,0,16:"Verifying track ";stsect%/&2000 01 Op(Read%,stsect%,Buf%,&2000) := !fcerrors=0: checkbuf:dataerr%=!fcerrors D stsect% N: X/ stsect%=&980000 &986000 &2000 bM !fcaddr=Buf%:!fclength=&2000:!fcdata=&4E4E4E4E: flushbuf l2 Op(Write%,stsect%,Buf%,&2000) v= 31,0,18:"Erasing track ";stsect%/&2000 1 Op(Read%,stsect%,Buf%,&2000) F !fcerrors=0: checkbuf:dataerr%=!fcerrors+dataerr%  stsect% :  'othererr%=dataerr%+eccerr%+ueccerr%  othererr%=0 " (130);"INTERFACE PASSED"  0 (129);(136);" INTERFACE FAILED"  $'" Press to continue"   a$=  a$=" "  ("*DIR :0.AU00.HD_POD_PRG")   "HDU_MENU" * 4: > assm H9 code &100:EnterOS=&16:SVC_mode=3:I_bit=1<<27 R. pass=0 2 2:P%=code:[ OPT pass \H .flushbuf SWI EnterOS ;enter supervisor mode fB TEQP pc,#I_bit+SVC_mode ;kill interrupts pE LDR r0,fcaddr ;get buffer address zO LDR r1,fcdata ;get data to fill buffer with D LDR r2,fclength ;get buffer length R .flushloop STR r1,[r0],#4 ;store data in buffer & inc addr D SUBS r2,r2,#4 ;decrement counter B BNE flushloop ;loop until done ; BAL exit ;and quit  ; % .checkbuf SWI EnterOS 0 TEQP pc,#I_bit+SVC_mode ' LDR r0,fcaddr I ADDS r0,r0,#4 ;Skip 1st word in check ' LDR r1,fcdata ) LDR r2,fclength & SUBS r2,r2,#4 O LDR r3,fcerrors ;get a zero poked in by BASIC R .checkloop LDR r4,[r0],#4 ;read a word from buffer into r4 L CMP r1,r4 ;test if same as test data $O ADDNE r3,r3,#1 ;inc error count if not equal .D SUBS r2,r2,#4 ;decrement counter 8B BNE checkloop ;loop until done BI STR r3,fcerrors ;store result for BASIC L ; V# .exit TEQP pc,#0 `# MOV r0,r0 jB MOVS pc,r14 ;return to BASIC t ; ~A .fcaddr EQUD 0 ;buffer address @ .fclength EQUD 0 ;buffer length G .fcdata EQUD 0 ;data to test or fill N .fcerrors EQUD 0 ;error count, must init to 0  ;  ]: pass  :  Checkcrc !ș AdfsSwi%+&10, 1 A%,B%,C% stsect%=stsect% 256 eccerr%   eccerr%=B%:el%=el%+1 J "Corrected Err at Cyl.";ercyl%;" Head ";erhead%;" Sect.";ersect%  ( C%<>ueccerr% 2 ueccerr%=C%:el%=el%+1 0 abort%=  :  OldShape SecsPerTrk%=DefectRec%?1 Heads%=DefectRec%?2 MapAdd%=DefectRec%!8 DirAdd%=DefectRec%!&C DiscSize%=DefectRec%!&10 3Cyls%=DiscSize% (SecSize%*SecsPerTrk%*Heads%) :ParkCyl%=(DefectRec%!-4)(SecSize%*SecsPerTrk%*Heads%) InitDiscRec  :  AskShape  5SecsPerTrk%=Ask("Sectors per track",SecsPerTrk%) DiscRec%?1=SecsPerTrk%  Heads%=Ask("Heads",Heads%) *DiscRec%?2=Heads% 4!Cyls%=Ask("Cylinders",Cyls%) >/DiscSize%=SecSize%*SecsPerTrk%*Heads%*Cyls% HDiscRec%!&10=DiscSize% R.ParkCyl%=Ask("Parking cylinder",ParkCyl%) \ f ptr%=0 p/ "Current Defects (Cylinder,Head,Sector)" z ȕ Defect%!ptr%<(1<<29)  defect%=Defect%!ptr%  defect%=defect% SecSize% # sector%=defect% SecsPerTrk% # defect%=defect% SecsPerTrk% P ((ptr%4)7)*11);"(";defect%Heads%;",";defect%Heads%;",";sector%;")";  ptr%=ptr%+4   Defects%=ptr%4  P rwopt$=Choose("A: add defect, B: Remove defect, C: No more changes","ABC")  rwopt$<>"C" * cyl%=InputDec("Cylinder",0,Cyls%-1) ( head%=InputDec("Head",0,Heads%-1) G sector%=InputDec("Byte, or -ve for sector",1-SecsPerTrk%,&10000) ; sector%>=0 sector%=sector% 320 sector%=-sector%  $@ defect%=((cyl%*Heads%+head%)*SecsPerTrk%+sector%)*SecSize% . rwopt$="A" 8 AddPhysDefect(defect%) B L! RemovePhysDefect(defect%) V ` j rwopt$="C" t I%=0 DiscStruc%-1 ~ DefectRec%?I%=DiscRec%?I%  I% DefectCheck !Defect%!ptr%=(1<<29) check% InitHardDesc Sum(Defect%,DefectSize%)  :  DefectCheck ptr%=0 check%=0 ȕ Defect%!ptr%<(1<<29)  CheckPut(Defect%!ptr%)  ptr%=ptr%+4  Defects%=ptr% 4 !check%=check% (check%>>>16) ('check%=(check% (check%>>>8)) &FF 2 <: F WriteDefectList P "Writing defect list" Z2MoanOp(Write%,DefectAdd%,Defect%,DefectSize%) d n: x LogToPhys(add%) ptr% ptr%=0 ȕ add%>=Defect%!ptr%  ptr%=ptr%+4  add%=add%+SecSize%  =add% :  AddPhysDefect(add%)  ptr%,ptr2%,defect%  Defects%=ptr% J& Defect%!(ptr2%+4)=Defect%!ptr2% T ptr2%=ptr2%-4 ^ h Defect%!ptr%=add% r Defects%=Defects%+1 |   "Defect list full"   :  RemovePhysDefect(add%)  ptr%,ptr2%,defect% ȕ Defect%!ptr%= (1<<29)) good% Defects%=ptr%4 !check%=check% (check%>>>16) 'check%=(check% (check%>>>8)) &FF \= good% ((defect%&FF) = check%) (sum(Defect%,DefectSize%)=Defect%?(DefectSize%-1)) :  InitDiscRec ?DiscRec%=LogSecSize% DiscRec%?1=SecsPerTrk% *DiscRec%?2=Heads% 4DiscRec%?3=0 >DiscRec%?4=0 H9DiscRec%?5=0 : Not used at 0.1 MapSize% DIV &80 RDiscRec%?6=0 \DiscRec%?7=0 f0DiscRec%!8=0 : Not used at 0.1 MapAdd% pDiscRec%!&C=DirAdd% zDiscRec%!&10=DiscSize% DiscRec%!&14=(&10000)-1 DiscRec%!&18=0 DiscRec%!&1C=0 DiscRec%?&22=Drive%  :  InitDefectList 3!Defect%=(1<<29) : empty defect Defects%=0 InitHardDesc  :  InitHardDesc =DefectRec%!-&10=&16000000 : SL xxxxxx EDefectRec%!-&C =&0D0CA80A : GPL2 GPL3 SH GPL1 :DefectRec%!-8 =&00000080 PCC%*10000 : PCC LCC $8DefectRec%!-4 =SecSize%*SecsPerTrk%*Heads%*ParkCyl% . 8: B InitAltDiscRec L?AltDiscRec%=LogSecSize% VAltDiscRec%?1=SecsPerTrk% `AltDiscRec%?2=Heads% jAltDiscRec%?3=0 tAltDiscRec%?4=0 ~>AltDiscRec%?5=0 : Not used at 0.1 MapSize% DIV &80 AltDiscRec%?6=0 AltDiscRec%?7=0 5AltDiscRec%!8=0 : Not used at 0.1 MapAdd% AltDiscRec%!&C=DirAdd% AltDiscRec%!&10=DiscSize% AltDiscRec%!&14=(&10000)-1 AltDiscRec%!&18=0 AltDiscRec%!&1C=0 AltDiscRec%?&22=Drive%  :  InitAltDefectList 2!AltDefect%=(1<<29) : empty defect  AltDefects%=0 InitAltHardDesc  (: 2 InitAltHardDesc <@AltDefectRec%!-&10=&16000000 : SL xxxxxx FHAltDefectRec%!-&C =&0D0CA80A : GPL2 GPL3 SH GPL1 P=AltDefectRec%!-8 =&00000080 PCC%*&10000 : PCC LCC Z;AltDefectRec%!-4 =SecSize%*SecsPerTrk%*Heads%*ParkCyl% d n: x AskHex(String$,Default%)  X,Y,reply$,value%  String$;" ?"; X= Y=  X,Y);"&";~Default%;X,Y);  ""reply$ 2 reply$="" value%=Default% value%=(reply$)  X,Y);"&";~value%;9  = value% :  Ask(String$,Default%)  X,Y,reply$,value%  String$;" ?";  *K.0 |M *FX 138,0,128 X= "Y= , X,Y);Default%;X,Y); 6 ""reply$ @2 reply$="" value%=Default% value%=(reply$) J X,Y);value%;9 T = value% ^: h" InputDec(String$,min%,max%) r reply$,value% |* String$;" (";min%;" to ";max%;" ) ";  reply$  value%=(reply$) ! value%>=min% value%<=max%  = value% :  Choose(mess$,rwopt$)  reply$  mess$;   reply$  (reply$)=1 reply$=((reply$)&DF)  rwopt$,reply$)  =reply$ :  CheckPut(I%) &Bcheck%=(check% >>> 13) ((check% (2^13-1)) << (32-13)) I% 0 :: D sum(base%,len%) Nsum%=0:c%=0 X I%=len%-2 0 -1 bsum%=sum%+base%?I%+c% l+ sum%<&100 c%=0 sum%=sum% &FF:c%=1 v I%  =sum% :  Sum(base%,len%) #base%?(len%-1)=sum(base%,len%)  :  Restore(A$)  B$   B$  B$=A$  :  MoanOp(b%, C%, D%, E%)  Eș AdfsSwi%, 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E%   : * Op(b%, C%, D%, E%) 4%abort%=:CheckDefects: abort% >gș AdfsSwi% (1<<17), 0, b% AltDefectBit% (AltDiscRec%<<6), C%, D%, E% Result%,A,ErrDiscAdd% H Checkcrc R% Result% othererr%=othererr%+1 \ Result% f ~Result%,~ErrDiscAdd% p Result% (1 << 31) z( "Error &";~Result% &3FFFFFFF:  - ((!Result%) &FFFFFF)=AdfsDiscErr%  Result%=Result%?3  ! "Error &";~!Result%;" ";  I%=4  ȕ Result%?I%  Result%?I%  I%=I%+1       $ .: 8 CheckDefects BP Initially using a slow sequencial search, will go to binary if too slow !! Lptr%=-4:abort%= V ` ptr%=ptr%+4 jJ (Defect%!ptr%>=(1<<29)) ((Defect%!ptr%>=C%)(Defect%!ptr%<=C%+7)) t1 (Defect%!ptr%>=C%) (Defect%!ptr%<=C%+7) ~( abort%=:" Listed defect avoided"   :  RSECT  + sector%=Ask("Read which sector ",-1)  sector%=-1  I%=0&FF:Buf%?I%=I%:I% ' Op(Read%,sector%*&100,Buf%,&100) ' I%=0 &FF 16:@%=3:~I%": "; 2 @%=10:J%=0 15 4:~!(I%+J%+Buf%);" ";: = " ";:J%=0 15:Z%=?(I%+J%+Buf%): Z%>31:Z% &2E  ::@%=3:   sector%=-1  : ( WSECT 2 <, sector%=Ask("Write which sector ",-1) F sector%=-1 P I%=0&FF:Buf%?I%=0:I% Z( Op(Write%,sector%*&100,Buf%,&100) d' I%=0 &FF 16:@%=3:~I%": "; n2 @%=10:J%=0 15 4:~!(I%+J%+Buf%);" ";: x= " ";:J%=0 15:Z%=?(I%+J%+Buf%): Z%>31:Z% &2E  ::@%=3:  sector%=-1  : , DefaultShape, 32, 4, 612, 0, &400, 663 PKUm9ttAU00/HD_POD_PRG/SHORTTOACARC0@.=};lPpR4T28HW@VVAcorn ADFSADFS 1.02025 DEVELOPMENT VERSIONEscapeCan't delete current directoryCan't delete libraryCompaction requiredFree space map fullBad discToo many discsIllegal use of ^Ambiguous disc nameNot same discADFS in useBad parametersCan't delete user root directoryNo room for bufferADFS Workspace corruptMultiple file closing errorsBroken directoryBad free space mapBad defect listBad driveSizes don't matchSame discBad RENAMEDirectory fullDirectory not emptyAccess violationToo many open filesFile openLockedAlready existsTypes don't matchDisc fullProtected discBad nameDrive emptyDisc not foundDisc not presentNot foundChannelWild cardsBad commandADFS errorL9 DZ  Disc error 00 at :0/00000000P@cs@-@-^ࠑ^ P@  ^*_-2l Q3 R$ $ R$:00#4 n>4LN5\^6ln7|~89:;< RZ 0#4^$ RZ$  RTTZpa R& $ R&:0+a  n0:987~6|n5l^4\N3L! RZ +a \0!$ RZ$  RpUaUZ_-1  Q0Q :0@P`p_0QZ0Q TZ@-@1 `@-@1 `@- @- a R@--Ѝ@-A@!@@-2L@D |@-0AS:4S  S4 0`@P^&T!*PS:R  *|- ( @@A@<$ $$ $$ $$  $$  ,048(((,048   ,(   (    0 0@(,048.%0E2F3o %\/Pll4`8p   <   N-2@|\@P*D 0^""*" D |0LSC0L5@0#x<@Q7 O2 @20Q <<P|p Q L\ ,D D |p DAD]@<| Xd   D >0""P@TP` Dl "$ E@ HdhP@THU0:Q!,01@- d@  h PhHHdL PCLD D@ dH pH Q8:d <x`@P P@@P< 5 PPlD*xPx&J Q(Q P8 P1PVC),p(uPX PZ%pV/uER@({|s dL$O P" P T"$P TYZ@@-# ((@ @P` )dhp )tx ))0-@(p(p(TP `)$(pdPt |"|X  %"TP|K/( ,dL$O P"P C T(PCT,( YZ@-  ( Q(pP(( ((p( ( (( (p(( @@- `$( &d p,( @`hp,( $( @P,( $( 't,d( (`( ,( $( )di?c,xpv({PX0 ^ZpW <(LYH(|h <L@LDD `@P Pp0!XlRpXDPTPdFPpX*7P,(\V H (PZQP0,`(D> kH)PZ:( -@-2 P027"QZ PD@- ``FPD@-T@^aan"Q1;0025^37:##p"Q*4jR( p11  #j2 Q:0-@ ` p 0<0 #N#d{@-P%S^QQ^"pWM*-W#D*@H`VY Y> -"1s0,jV *( PT!VL3@`^.0:    `|PL-p>3Y@P33.13SdွPP P`6Ppz  `6 `2`p``6dွO-?ь@@ ࠌ< @P@, R"!! "`0Vv2#*R*5  Q U @-@-Silly length @?@|v1@-@-Not start at sec boundary @?@eaRrp @-@-Not trk start @?@QMXݰPY#!PI"\T`勠> `am Y:   :\  Q*;@제J 0 00Pp2*@*T ќdᏽ1ࠌꀀPp33SSss0娀 % :^"0娀 % :ʄ^"0娀 :ڄ %^"\0 ^0 ^\(ր^@ՀX* @PJ0S@D0@0TCT@A@9X6*P10  Q#:X @ R @4PPP5 @P@P0O00(U3 @^0oO` ppQ:mOA!L-2@09-赯O-^#3ࠜdް@  ް; 2 00 (Y3Xݰ *oްް;1pـڐ֠۠Z @: U 2Р> A8 p֠8-00 p@8Z#Z*@-"#ǀX```&r`X`@-ǀ N,2L@`Dpd`V@L@`Dpd`V`@V:@-PU\ Q*1 Q\@- T1 ZQ\5p2* ``\T  @-P#:T0  0 @ 00S1010>2 53 5     \P@-\P`}2 y @-sqo @-l0  "` @- $28@-28 @55O-@AM  j11>dQ*qq~Q#*z"T0Busu " !vIQ#C*$MP @e z50 0\>,, 0usu` &11>!p7 ppW J 78 `6jO~O\>"$Ѝ/dC-O @AAp"UA 0 Lz0X؀8 T O*B03 8yy 8dC-O @j@j@"H004F.?Asq+s.qLs9{jCcjY l@nl@A 0.L'{s ud?@-! $ !1$ @ PRPU?A-Q 11010>2$:@lQQ^#p7!pW"Xp2`p T tX W 0`@4l*@-`PtQY0Yi. >@-@P:! 0QQ^P!^02^N!Ņ@T:!0>@- R 3 5 3" 5@-" O-  0 ^P10: а ! %뎏 @-N 0q ,",00^R O-O-K)L5_`tS)  *Pr`u`p"z9 "jpH GD H F p 0jP0 Ft0d@-븰  ; ^@-0O-pt0sv K)L5_`o@ @n@@-ҿ> > J JZG ^# Y! ! ! Zy6 8 ;ү  J KQQ NQQ IY 1 1X(*>1 K^^ J o F A j0!@-P DA A@-  @- 0 K @-PP@-PPH-P Ḱ . ;@-@-(pF4pF &.5&.5P&.F&.5"(""$" V2ᧀ@-) F5 F@^P:@O-0a0]Q0!01Y ! 1,-j T @ P8-a  8 jb  K p I j9Ѝ00d@-@@ O-wpW``)c  [ sU{ sO{)AJ@D /BE  ;8Y:[: ;O @-Z@Z  Ѝ"*@O^@ 0ZZmЍbjZ@Z  @@ =H01[ 0FR  R@-O7[@,!H@Qx QY j @-@-bad RMA return @?@Q. j @-@-bad sys heap return @?@[@@TZ@-##@-#P#U@-M AtpucpcDpЍ@-)>~MO @1  B 2B 1-?|     ? B@@-A0 ^027"QZ@- M p p Ѝ @- @-tj @ 0 -0S=0 00 cj=Рd@- r@ cP@-<g c08@AjS0T@@-YPqPc@- 2 5d}]1VVW P#W+d@-V^VU@-VV@-V@V@-cV@^VU @-@-@-@-@-@-@-@- @- @-!@-)@- @-0@-i ak@hj @-@-system heap error@?@@-@-i ak@hj @-@-module error@?@@-0@-|A@-w{@-r)cu@-lp@-g3k @-"0@wdA-pA-p].QQ^4Q"PW3+*j]"`am0a "-1L0q@q{usuj "PT%1! T̅`\̅/kd@-]H-. P ]; jD]dO- @ Q2 8@QQQdO- [ CJJ@(: W: WnB^@1`1 1J2P2t1  Q) Q`F0! %`#: " wP Q J  W1@1 1J2`G0PtpQdO-T`QP.`p @{ JP#%*p Z X @8p >`[ J8a pJjhdߏ@-l@-@- j DM,b +b kKd@-ONO-"@- RH  $хpN裞ቑ "剐  @-;  tK@-D  K$!! R!@-7 ! @-@-writing silly length to map @?@'@-0  O-`ledO-Z_dO-TYd@-"010H-;z`f l@-  #* R@-t~pt@-p~tp@-h0s>qd$&%@\^:"|, &@-0O @PS:",O:0   M *!  D  $0 `0 `VZ+[2P^0"P' ` PРJd@-.0 0 ` p0 pWZ#0*0PS*P`VJ*.0 @- *.P* 0 AA@-P pA-`bjh0@:0   j;$0 3$0s>11> 0)&0 `0sh0 "&.Library$.Library@@0 \0l0 %P":pd0sTOROPO]T@-@ T@z0UGs-( 0KjL"D*.0 ?j^0@B*@p-.0 #!* .09 0 P@4 3 pq {{j@ ^$+>@40z j 4@Dp@j(dw@-q2&F*F 4@-*j PQ]00``>AAN"@t-)!R+(  "%~"0I@@t3I- 0ud0@L` > 5PPv3 `$@2:v /0(%pT`7 50:  -ij@ 0PPP  pW:d@-.0 :@-QQ.>A@-0@-0* .0*]aRzr BAR B"0 R7r": "S:R:P1#+`@-PP@D2@!~ :X `O- `pA#*P aPzp @#P P @wz"Y!ӏpz#*P aPzp @#P P aYzy I!Y3V!!.Pa:Pӏ@-4 5@-4/@-o4'@-#@-4  \  QZ@-..@-0  @-0@-0@-0 !@-  @-0 {  # Q@-@-&F*F!@- L-V0 X>F > )V5V0 t>H  {dHugoL-@-<F@-5@-^# P"@-)5P#3d@-T> PO-<qAd踀DllllD @LP-u`q`rkO-` Vv"#8*6 `|-|O @-kj  3 #  0# >U3:~2-@ `p @M. j @ 0 PЍЍZ@-vPST [;;; t~<d{{6)j2`0! d0 h0 l1l-0 j> { j  3?{ @ Hugo@-F 3#&4{#jj1- `@F4@F@#@F'@F=F0 @t u{{{ s{ {mm -_ ЍBpL@0TO- JP{j #+*[I{jj*N{j j;>- 0 @>jop q  q  p qqp qI qJ @- <@-< ~4Q0a 0 + "p1%"% P#%"%L  kL j!   8tp4#p0_- `)pF5FOKjO@"G^ T ^ 1W=QF 0 @{{s8s8 {8u {j8{8u{}_-! !   0-R" !*냄-0j@0@wP%PPP I KO @TL ]n4 yH @OAx-|B%|xL億HHtHDppq 0kON䩐# R*Rr"p5|2 P$` R:=DOAGj OA W, 0$jhÂ,,=_-V a@-i agk@hj @-@-CloseAll Error @?@`@-i aPk@h@-i aLk@hj @-@-FSC error @?@aOAk@a% @-i a.k@h@-i a*k@hj @-@-Heap error @?@c ]@- @ @-@-Adfs Init Error @?@/P-@1 EOA W,03B'1@ 1 V@^ "OrArp {-YOO A V>$ VU#"Q*1Q*"1hPZ/L-M! - /"+" ꢮ-*j".s".ߍ衰;L |  O-,n!{ jeWkU}t L P-I[ 0kAADFSDiscOpHDCDrivesFreeSpaceHW,ЁIsAdfsYY|YBackZZYBackupZZ [Q]P-?-Mvru`q7q{r$uj 0l/*Q0q0"YPyPn j P>&]:Insert sourceInsert destination}j disc in drive wj0 %rj then press SPACE bar jjh*gj 0,8h[jp> 5 Uj T," ( P Q30e?j`00$ 31 0( *VH(pH@F^@p=0"-!" 40400 j0QS1: 5Pt PESq:kߍdz{ ABEX*Bye closes all files, unsets all directories, and parks hard discs. Syntax: *ByeP-^kl*Compact tries to collect free spaces together by moving files. Syntax: *Compact []P-@-1 ,F{jkOM 0pIj-70I`E@Ep V+#pp ^)s@A@@ d X* W1^ YY*j@-@-*** ReturnWholeSpace GAVE ERROR TO *Compact *** @?@j@-@-*** ClaimFreeSpace GAVE ERROR TO *Compact *** @?@-/0"Ijx0 0  w ` > P>  0>t~ j ^@V Kp0Xpkl93  j@E8>`NvOߍkd*Dismount closes files, unsets directories and parks the given disc. Syntax: *Dismount []P-V}-1 ,\z`{a Wkd}@- @-`!0 PPaQE3H 5 0$0!5.1];PaNd*Drive sets the default drive to use if the directory is unset. Syntax: *Drive P-@ukk@-Are you sure (Y/N) ?{!{*{Y0y0?cd@-0*{?D- ^&@p`P@@ZP5P RYJ ?@- @NQ*Format prepares a floppy disc for use with the ADFS. L is the old 640K ADFS format. D is a new 800K format. Syntax: *Format L/D%24_%mi_%w3 Verifying ... P--,MU,jၑ   2j"; ,:>jn2aPzp @OIY0 Y>^Y0y0V{I , " D  9P`p- Formattingq{_jN\j `6pYPUP0@R:fO[!r s0s{Kj Y PY !L>lk<$4F'FF#F*F&F4pF(pF>FIF $40P%TPPEQ\A-  ?O A RA  B  9k jFormattedu q{Ks{{,ЍU?kd*Free displays the total free space on a disc. Syntax: *Free []P--1W ,y{jBytes free & j Bytes used &j^ kEj =K{{j*Map displays a disc's free space map. Syntax: *Map []P--MQ 6j ,1jg( start, length) 4{'j'Wrj} X  p(,) p { jW> T~kЍYpN-p$*Mount sets the directory to the root directory of the disc, sets the library if unset to $.Library if it exists, and unsets the URD. The default is the default drive. Syntax: *Mount []P-~-14. -j{s`u{gk~*NameDisc alters a disc's name. Syntax: *NameDisc P--.$j:0Q.jPPjp:0! ! @2 #B@T@q `s4qupr{%k*NoDir unsets the current directory. Syntax: *NoDirP-h~lh*NoLib unsets the library. Syntax: *NoLibP-d*NoUrd unsets the URD. Syntax: *NoUrdP-`*Title sets the title of the current directory. Syntax: *Title []P-s-pZO A y j#F'F Rr # p2Qkm*Urd sets the user root directory. Syntax: *Urd []P-I-1OD Oj`0e@F4@F `p}bkI*Verify checks the whole disc is readable. The default is the current disc. Syntax: *Verify []P--1 , Or @r?{ j"`@ 6Verified OK hk@-^QQ^0. z [`p#{j.NTʩxЍ*Configure drive sets the value the default drive is initialised to. Drive P--+O{j1Drive jo{ j *Configure Floppies sets the number of floppy disc drives attached. Floppies P--,O{hj1}Floppies j={0 j *Configure HardDiscs sets the number of hard discs attached. HardDiscs P-m-+O{k7ij1LHardDiscs bj {^80 Yj!T *Configure Step sets the step rate of one or all floppy disc drive. Step []P-4-@O]a{20j.j`O1 Step &j%Q!j0SL @ljPT!0!@!^Z !!"! *@ jP3,;:  <`kdPcP-P0:KAkURD Disc Option 0Dir. Lib. "Unset" "No Name" (Off) (Load) (Run) (Exec)LOAD &.!BOOTRUN &.!BOOTEXEC &.!BOOTO-PM p  7j^QQ^#@F'@F`6@O@@O" `4* @OLD@OAMO@`QOO@h V@OLD@d 9{PЍd@-qNO @-p{@j@-ZJ:J"Pv;"5P3002 2;J25P3?#$J"* O@O-PM p Rj@[PP``!~y; y {j 9SPЍpd DLWR%24:%mi:%se %dy-%m3-%ce%yrdir  @- `NwPL`OAPQk[Z20 g@~- $@- O GpN  0Op DQ&# : G@->p@-Pp@-PP^>DŽ`V`V[Zp@-@-@- 021 0SZ@- P027"@- @- 0S0  @-[ j  Q[jZd@-0jdx@-{x@-D k@-h~h0ll0|@F4@F `pЀ@-d~O:Az0n@-jd0e@F4@F `p}@-p9O"A"D ?{{ q{@-p%@-p*O"/@-pz@- +!j4$ DL dir j2  1{0{ j: 5{t2{ s@D{z1 @-j^ j" L!6 uO-8 {jpDM  "" j7D> 0q3n:mjD31 X21 D0@D2q{Z@- 0$@.{0q{pF4pF `{{jh9 `p d9p ؀@-  2j  33 3& &$j0 j .j-` q 0q{u{ q r s{qP{{W0qj{@q{{{zЍsu0A- Q-ju' >A aPzp @oOkFp0  p2:LPP0!~% t~{B- jE OAm@-h0~qq~@s߀@-PP 0h0@d0@P@- `p sOOKD PP ^>„`V `f`䠀O-O"A" D @EP&j0 ^2:;ppJ^aeiu `,;P22U1 1:P @-@Q;^{@aQZQPZdS@-`f W*P p4`2:S W4P-xqk@-i ak@hj @-@-ADFS Open error @?@O- ; fz0R;LY3I: Bj;#<; 4  ;.- 0*jx0; `p`㣞 xj 0@ 1 ЍP-ek@-i ak@hj @-@-Adfs Close error @?@O- 9j pj7M  j - U"{sx 1-#j @-@-Free Heap err@?@@-`px0@V60Pz7pp>P P- -j-8 Ak P-{ - j^-8 uBs{k P-i-ljp P0  JTYRV QRO{NjP\ X:pRGJ^ Y( ƒ,ƒpGH`p%usu upu') [jp- 0S0uxu u{ qz#*^1 p0 {Aj 0)ck ЍC-0@@ T T `0)` V `!Qb @P jpY@-xPdj @-@-Bad handle @?@@-0j @pr 7pg  W@-PPx r `6 а怽@-x1PKx/uMuMAU00/IOPODTESTACARC0A9b};  > IOPODTEST J ********************************************************************  (G BBC I/O & MIDI Podule Test Program. Version 4.2D April-1987 2" Written by Victor Gibling. < (c) Acorn Computers Ltd. F P. Modified by Alex Bienek. 12-June-1987 Z d- Utilizes Master port tester hardware. n x Notes: > 1) MIDI port thru' connection is not currently tested / 2) Interrupts are not currently tested 1 3) Podule VIA internal timers not tested J Modified to version 4.1D for dealer tests 10-Feb-88 by Alex Bienek I Modified to version 4.2D for dealer tests 22-Jun-89 by Brian Rice B Version 4.2D is to change the path and file name for menu. L.......................................................................  CONSTANTS   A1 constants  RV$="4.1D" AtoDstats=:MIDI=:IOPOD= -Service=:abort=:failureflag=:Testskt=0  m(4),s(4),mcode 1000 EnterOS = &16 "SVCmode = 3 ,Ibit = 1<<27 6slot=0:foundpod= @$ș "XOS_CLI","RMKILL I/O_Podule" J& Constants set, roll titles...... T *TV0,1 ^ 6 h 7 r |3 testmodemenu : get mode choice  A<7 mainprog  A=7 ("DIR :0.$.AU00")  "POD_MENU"  :  mainprog ( :BNR$=(132)+(157)+(129)+(141) , BNR$;" Archimedes I/O Podule Test" , BNR$;" Archimedes I/O Podule Test" 6 " (c) Acorn Computers Ltd. Version ";RV$ ? PASS = : set to correspond with errorflag which 9 FAIL = : denotes a failure when set TRUE  assmreadwrite  autoslot  foundpod &A (130);" Podule found in slot ";slot 0 :B (129);" No Podule found. Test aborted." D abort= N X@ soak 0,18)(131);" Press to end soak test" b abort l v Service 5 (10);(131);"Servicing Version"  7 (10);(131);"Dealer Test Version"    I Autoslot returns Baseaddress so we can continue with initialisation AtoD = Baseaddress+&1000 "AtoDhibyte = Baseaddress+&1004 "AtoDlobyte = Baseaddress+&1008 Hibytemask = &FF Lobytemask = &F0 Eocmask = &C0 Eocflag = &40  Trigger = 8 AtoDtol1 = 4000  AtoDtol2 = 1000 *AtoDexpectedValue = 50850 4Datumchannel = 3 >MidiCR = Baseaddress+&1800 HMidiSR = Baseaddress+&1800 RMidiTxD = Baseaddress+&1804 \MidiRxD = Baseaddress+&1804 f Modeset=&15 p Reset=3 z%PodRomstart = Baseaddress+&3C0000 #PodRomend = Baseaddress+&3C1FFF 9PodRomsize = 16 : rom size in Kilobytes BPodRomchecksum = &37C701 : I/O Podule driver ROM checksum F MIDI PodRomchecksum = &290147: I/O Podule & MIDI ROM checksum POutputA = &07 : Only set as o/p lines used. Leave Vpp & PGM. "PodviaORB =Baseaddress+&3C2000 "PodviaORA =Baseaddress+&3C2004 #PodviaDDRB =Baseaddress+&3C2008 #PodviaDDRA =Baseaddress+&3C200C "PodviaPCR =Baseaddress+&3C2030 "PodviaIFR =Baseaddress+&3C2034 "PodviaIER =Baseaddress+&3C2038 #Int_buffer =Baseaddress+&3C3000 IRQ_mask =01 FIQ_mask =04 Inputs = 0 $Outputs = &FF .NegCB2 = &A0 8 NoCB = 0 BCB1flag = &10 LPosCA1 = &01 VLowCA2 =&0C `HighCA2 =&0E j t FIT tester constants ~ 'Rom1startaddress =Baseaddress+&0080 %Rom1endaddress =Baseaddress+&03FF 'Rom2startaddress =Baseaddress+&0800 %Rom2endaddress =Baseaddress+&0BFF Rom1checksum = &669E Rom2checksum = &5EB6 PPIportB =Baseaddress+&0004 PPIportC =Baseaddress+&0008 PPICR =Baseaddress+&000C Bmode1 = &9F Bout = &99 Cout = &92 VIADDRB =Baseaddress+&0048  VIAORB =Baseaddress+&0040 OutB34_5 = &38 CMeasureoffset = &30 : configure 4052 to measure zerooffset (DMeasurecal = &18 : configure 4052 to measure calibration 2 < PROGRAMME constants F P adval =0 ZNo_of_samples = 4 dMaxbitpattern = 128 n*A$="":A1$="": General purpose strings xH................................................................... @ Final initialisation and main program loop  I%=0 4  m(I%) = 0  s(I%) = 0  soakcycles = 0 $ soak AtoDstats onerror   31,0,8  errorflag =  failureflag =  IOPOD  1megbus  errorflag  busfail  " podrom , userport 6 AtoD @ firebuttons J T ^ MIDI midi h soak r! soakcycles=soakcycles+1 |G 31,0,7:(131);" Soak cycles completed ";soakcycles  A$=(10)  % soak failureflag (A$=" ")  31,0,18  failureflag 6 136;129"Test complete podule... FAILED"  9 130;" Test complete podule... PASSED"   Service accessloop  : FROM IF NOT abort ,:" Press SPACE to return to menu " : (-99)    assmreadwrite & pass = 0 2 2 0 P% = mcode : [ OPT pass DI.write SWI EnterOS ;enter supervisor mode NC TEQP pc,#Ibit+SVCmode ;kill interrupts XK LDR r1, ioaddress ;get i/o address into r1 bM LDR r0, iodata ;get data to write into r0 l> STRB r0,[r1] ;write data v< BAL exit ;and quit  ; I.read SWI EnterOS ;enter supervisor mode C TEQP pc,#Ibit+SVCmode ;kill interrupts K LDR r1, ioaddress ;get i/o address into r1 = LDRB r0,[r1] ;read data L STR r0,rddata ;store in variable rddata < BAL exit ;and quit ; I.writelp SWI EnterOS ;enter supervisor mode C TEQP pc,#Ibit+SVCmode ;kill interrupts K.wrloop LDR r1, ioaddress ;get i/o address into r1 M LDR r0, iodata ;get data to write into r0 > STRB r0,[r1] ;write data A MOV r0,#&81 ;scan keyboard   MOV r1,#0  MOV r2,#0  B SWI "OS_Byte" ;check keyboard *C CMP r1,#32 ;check for space 4? BNE wrloop ;loop if not >= BAL exit ;else quit H ; RI.readlp SWI EnterOS ;enter supervisor mode \C TEQP pc,#Ibit+SVCmode ;kill interrupts fK.rdloop LDR r1, ioaddress ;get i/o address into r1 p= LDRB r0,[r1] ;read data zL STR r0,rddata ;store in variable rddata A MOV r0,#&81 ;scan keyboard  MOV r1,#0  MOV r2,#0 B SWI "OS_Byte" ;check keyboard C CMP r1,#32 ;check for space ? BNE rdloop ;loop if not = BAL exit ;else quit  ; I.addpage SWI EnterOS ;enter supervisor mode I LDR r1, ioaddress ;point to base of page J MOV r0,#0 ;zero reg. for addition F MOV r2,#2048 ;2K bytes to add up L.addloop LDRB r3,[r1] ;read a byte from the ROM M ADD r0,r0,r3 ;add to r0 where r1 points R ADD r1,r1,#4 ;increment pointer to next byte J SUBS r2,r2,#1 ;decrement byte counter $C BNE addloop ;loop until done .N STR r0,rddata ;pass back result in rddata 8< BAL exit ;and quit B ; LF.exit TEQP pc,#0 ;restore interrupts VM MOV r0, r0 ;don't know what this does `: MOVS pc, r14 ;return jE.rddata EQUD 0 ;read data storage t .ioaddress EQUD &0300D000 ~ .iodata EQUD &00000000 ] pass    autoslot  find I/O pod slot / Baseaddress=&02FFC000:slot=0:foundpod= 5 Baseaddress=Baseaddress+&4000:slot=slot+1 H This bit peculiar to I/O podule to initialise the 6522 @ !ioaddress=Baseaddress+&3C200C:!iodata=7: write @ !ioaddress=Baseaddress+&3C2004:!iodata=7: write @ !ioaddress=Baseaddress+&3C0000: read: read ID byte ! (?rddata &FA)=0 H !ioaddress=Baseaddress+&3C000C: read:Producttype=?rddata 4 !ioaddress=Baseaddress+&3C0010: read (5 Producttype=Producttype+(?rddata*&100) 2/ Producttype=&0006 foundpod= < F" (foundpod=) (slot=4) P Z dB AtoD : PROCAtoD n$ " AtoD test"; x write(VIADDRB,OutB34_5) J write(VIAORB,Measureoffset) : configure 4052 for measurement  total = 0 " sample = 1 No_of_samples  doAtoD(Datumchannel)  total=total + adval - errorflag samples = No_of_samples  ( errorflag result(errorflag): ' zero_offset = total/No_of_samples C write(VIAORB,Measurecal) : configure 4052  doAtoD(Datumchannel) ) errorflag result(errorflag): , calibrationvalue = adval - zero_offset ? difFromExpectValue = calibrationvalue - AtoDexpectedValue  AtoDstats stat1 6 (difFromExpectValue) > AtoDtol1 errorflag= " testloop = 0 3 ,N write(VIAORB,testloop*8) : configure 4052 with test address 6- testpoint = testloop+1 testloop+4 @# channel = (testpoint 4) J* fsdfactor = testpoint - testloop T doAtoD(channel) ^3 errorflag testloop = 3 :testpoint = 7 h/ normalisedvalue = adval - zero_offset rP difFromExpectValue = ((calibrationvalue*fsdfactor/4)-normalisedvalue) |Y (difFromExpectValue) > AtoDtol2 testloop = 3 : testpoint = 7:errorflag =  AtoDstats stat2   result(errorflag)  AtoDstats stat3   D busfail : PROCbusfail :: 3 136;129"1MHz Bus FAILURE....TEST ABORTED"  failureflag=    doAtoD(channel)  read(AtoDhibyte) A read(Int_buffer): (?rddata IRQ_mask) <> 0 errorflag= &$ write(AtoD,Trigger + channel) 0 endconversion :A read(Int_buffer): (?rddata IRQ_mask) <> 1 errorflag= D errorflag N read(AtoDhibyte) X' hibyte=(?rddata Hibytemask)*256 b read(AtoDlobyte) l% lobyte = (?rddata Lobytemask) v adval = hibyte + lobyte   B endconversion : PROCendconversion  attempts = 1  complete =   read(AtoD) * (?rddata Eocmask) <> Eocflag attempts = attempts + 1  complete = ( complete = attempts > 10000 ( attempts > 10000 errorflag =   A midi : PROCmidi *$ " MIDI test"; 4 write(MidiCR,Reset) > write(MidiCR,Modeset) H bitpattern = 1 R \" write(MidiTxD,bitpattern) f$ transmissioncomplete("TxD") p( attempts > 200 errorflag = z$ transmissioncomplete("RxD") ( attempts > 200 errorflag =  readmidi 0 mididata <> bitpattern errorflag = # bitpattern = bitpattern <<1 8 bitpattern > Maxbitpattern: OR errorflag = TRUE  result(errorflag)   > podrom : PROCpodrom $ " Podule ROM test";  maxpage = PodRomsize/2  romtotal = 0 write(PodviaDDRA,OutputA)  page=0  ! write(PodviaORA,page) $+ !ioaddress=PodRomstart: addpage .( romtotal = romtotal + !rddata 8 page = page +1 B page+2 > maxpage L2 romtotal <> PodRomchecksum errorflag = V result(errorflag) `$ romtotal <> PodRomchecksum j5 (129);" Checksum found to be &";~romtotal t ~ = write(PodviaORA,00) : always leave ROM on page 0   ; read(address) : PRCread  !ioaddress = address  read   ? readlp(address) : PRCreadloop  !ioaddress = address  readlp    > result(result) : PROCresult  result  "ed...";136;129"FAILED" ( 2 "ed...";130" PASSED" < F# errorflag failureflag = P errorflag = Z d n@ readmidi : PROCreadmidi x read(MidiRxD)  mididata = ?rddata   B stat1 : PROCstat1  cnt = soakcycles @ (difFromExpectValue) > m(0) m(0) = difFromExpectValue  @% = &505 $ s(0) = s(0) + calibrationvalue ] " "AtoDtol1" ";difFromExpectValue" AVGE VALUE =";s(0)/cnt" max dev=";m(0);(40-);B$   B stat2 : PROCstat2  @% = &303 ) " "AtoDtol2" "difFromExpectValue; ; s(fsdfactor) = s(fsdfactor) + (difFromExpectValue)^2 S (difFromExpectValue) > (m(fsdfactor)) m(fsdfactor) = difFromExpectValue " , 6B stat3 : PROCstat3 @ @% = &303 J cnt = soakcycles T B$ ^E "max dev 20% V=";(m(1))(1)"max dev 40% V=";(m(2));(40-) hH "max dev 60% V=";(m(3))(1)"max dev 80% V=";(m(4));(40-);B$ rW "std dev 20% V=";((s(1)/(4*cnt)))(1)"std dev 40% V=";((s(2)/(4*cnt)))" " |W "std dev 60% V=";((s(3)/(4*cnt)))(1)"std dev 80% V=";((s(4)/(4*cnt)))" "  @% = &90A   L transmissioncomplete(type$) : PROCtransmissioncomplete  attempts = 0  complete =   read(MidiSR) < type$ = "RxD" (?rddata 1) = 1 complete = < type$ = "TxD" (?rddata 2) = 2 complete =  attempts = attempts + 1 ) (complete = ) (attempts > 200)   E userport : PROCuserport $ " Userport (output) test"; &H write(PPICR,Bmode1) : configure portB as mode1 input 0C write(PodviaDDRB,Outputs) : configure portB as output : bitpattern = 1 D NC write(PodviaPCR,NegCB2) : configure portB negative CB2 X$ write(PodviaORB,bitpattern) bB write(PodviaPCR,NoCB) : configure with no CB pulses l0 write(PodviaORB,0) : send ZERO vB read(PPIportB) : should still be bit pattern - ?rddata<> bitpattern errorflag = ; read(PodviaIFR) : check CB1 functioned 2 (?rddata CB1flag)<> 16 errorflag = " bitpattern = bitpattern<<1 ? bitpattern > Maxbitpattern : OR errorflag = TRUE  result(errorflag) $ " Userport (input) test"; B write(PodviaDDRB,Inputs) : configure portB as input C write(PPICR,Bout) : configure portB as output  bitpattern = 1  # write(PPIportB,bitpattern)  read(PodviaORB) - ?rddata<> bitpattern errorflag =  " bitpattern = bitpattern<<1 : bitpattern > Maxbitpattern : OR errorflag = TRUE   result(errorflag) * 4 >B write(address,data) : PROCwrite H !ioaddress = address R !iodata = data \ write f p zF writelp(address,data) : PROCwriteloop  !ioaddress = address  !iodata = data  writelp   D 1megbus : PROC1megbus $ " 1MHz Bus (&FCXX) test";  romtotal = 0 : romaddress = Rom1startaddress Rom1endaddress 4  read(romaddress) ( PRINT ~romaddress ,~?rddata:A=GET % romtotal = romtotal + ?rddata  2 romtotal <> Rom1checksum errorflag = :  result(PASS) $ " 1MHz Bus (&FDXX) test"; $ romtotal = 0 .: romaddress = Rom2startaddress Rom2endaddress 4 8 read(romaddress) B% romtotal =romtotal + ?rddata L( PRINT ~romaddress ,~?rddata:A=GET V `2 romtotal <> Rom2checksum errorflag = : j result(PASS) t ~  onerror  :"SYSTEM FAILURE": ::" at line ":  stat1  stat2  stat3   E firebuttons : Test fire buttons and light pen strobe $ " Fire buttons/LPSTB test"; , Bits 6 & 7 of port A should be input E write(PodviaPCR,PosCA1) : configure CA1 for positive edge  H write(PPICR,Cout) : set port C of 8255 as op, A & B ip < write(PPIportC,0) : set both fire i/ps low ; read(PodviaORA): (?rddata &C0)<>&00 errorflag= (5 write(PPIportC,&40) : set fire 0 high 2; read(PodviaORA): (?rddata &C0)<>&40 errorflag= <5 write(PPIportC,&80) : set fire 1 high F; read(PodviaORA): (?rddata &C0)<>&80 errorflag= P> write(PPIportC,&01) : cause active edge on CA1 Z; read(PodviaIFR): (?rddata &02)<>&02 errorflag= d9 read(PodviaORA) : clear CA1 interrupt n result(errorflag) x   accessloop " :"Enter device to access:" 2 "V(ia A(toD E(prom U(art I(nterrupt buff."; / "1MHz Bus page f(C or page f(D Q(uit ";   A$= F (A$="V")(A$="A")(A$="E")(A$="U")(A$="C")(A$="Q")(A$="D")  A$  A$="Q"  "R(ead or W(rite "; & :A1$=: (A1$="R") (A1$="W") 3 A1$:A$=A$+A1$:(13);(136);(131);"Running"  Ȏ A$ ! "VR":readlp(PodviaORA) & "VW":writelp(PodviaORA,&55) " "AR":readlp(AtoD) ,! "AW":writelp(AtoD,&55) 6# "ER":readlp(PodRomstart) @( "EW":writelp(PodRomstart,&55) J "UR":readlp(MidiCR) T# "UW":writelp(MidiCR,&55) ^# "CR":readlp(Baseaddress) h( "CW":writelp(Baseaddress,&55) r( "DR":readlp(Baseaddress+&800) |- "DW":writelp(Baseaddress+&800,&55) " "IR":readlp(Int_buffer) ' "IW":writelp(Int_buffer,&55)     interrupts : Interrupts may be tested on the A/D by doing ADVALs H Other interrupts would require the fitting and removal of jumpers C This shall be left until a genuine driver EPROM is released.    testmodemenu ( :BNR$=(132)+(157)+(129)+(141) / BNR$;" Archimedes I/O Podule Test Menu" / BNR$;" Archimedes I/O Podule Test Menu" 8 " (c) Acorn Computers Ltd. Version ";RV$: & :: 0 " 1) I/O Podule Test" : " 2) I/O Podule Soak" D " 3) MIDI Upgrade Test" N " 4) MIDI Upgrade Soak" X/ " 5) I/O Podule and MIDI Upgrade Test" b/ " 6) I/O Podule and MIDI Upgrade Soak" l" " 7) Return to Main Menu" v : # "Enter test mode choice :";   A$=  (A$>"0") (A$<"8")  A$:A=(A$)  Ȏ A % 1:soak=:MIDI=:IOPOD= & 2:soak= :MIDI=:IOPOD= & 3:soak=:MIDI= :IOPOD= ' 4:soak= :MIDI= :IOPOD= & 5:soak=:MIDI= :IOPOD= ' 6:soak= :MIDI= :IOPOD=     PK&z+z+ AU00/MIDITESTACARC0AU!;  > MIDITEST L ********************************************************************** 1 Archimedes MIDI Podule Production Test (B Written by Alex Bienek 12-January-1988 2' (c)1988 Acorn Computers Ltd. < Filename: MIDITEST F( Version : 1.10 Dealer Version PJ Version : 1.11 Dealer Version #2 modified by Brian Rice 22-6-89 ZM Mod to path name and file name of menu to retun to. dJ Update the version number to 1.11D. 27-June-1989 nI Remove CHR$(131) commands from cable connection xF prompts. Change i/p on cable prompts to O/P. M ***********************************************************************  ver$="1.11D" init soak= ( :BNR$=(132)+(157)+(129)+(141) - BNR$;" Archimedes MIDI Podule Test" - BNR$;" Archimedes MIDI Podule Test" = " (c) Acorn Computers Ltd. Version ";ver$:::  autoslot  foundpod F (130);" MIDI Podule found in slot ";slot  G (129);" No MIDI Podule found. Test aborted." E '''" Press space to return to menu":S= ( ("*DIR :0.AU00") " "POD_MENU" " , podrom 6 INsocket @ soak THRUsocket J OUT1socket T OUT2socket ^: h r soak |D 31,0,4:(131);" Soak cycles completed ";soakcycles , 31,22,5:I%=I%+1: I%>=256 I%=0 7 Tx0Ready:write(TX0,I%):Rx2Ready:read(RX2) $ !iodata<>I% failflag= 7 Tx2Ready:write(TX2,I%):Rx0Ready:read(RX0) $ !iodata<>I% failflag= ) A$=(1):soakcycles=soakcycles+1  " soak failflag (A$=" ")  31,0,20 :  failflag 5 136;129" Test complete. Podule.......FAILED"  9 130;" Test complete. Podule.......PASSED"  .:" Press SPACE to return to main menu" &: (-99) 0 :("DIR :0.$.AU00") D "POD_MENU" N X: b INsocket l :ResetUARTS v1 (133);" IN socket test..........";:I%=-1  > I%=I%+1:Tx2Ready:write(TX2,I%):Rx0Ready:read(RX0)  !iodata<>I% fail=  (I%=255) (fail=)  result  :  THRUsocket  :ResetUARTS < "Connect O/P lead to THRU and press SPACE";:getspace 1 (133);" THRU socket test........";:I%=-1  > I%=I%+1:Tx2Ready:write(TX2,I%):Rx2Ready:read(RX2)  !iodata<>I% fail=   (I%=255) (fail=)  result   *: 4 OUT1socket > :ResetUARTS H< "Connect O/P lead to OUT1 and press SPACE";:getspace R1 (133);" OUT1 socket test........";:I%=-1 \ f> I%=I%+1:Tx0Ready:write(TX0,I%):Rx2Ready:read(RX2) p !iodata<>I% fail= z (I%=255) (fail=)  result  :  OUT2socket  :ResetUARTS < "Connect O/P lead to OUT2 and press SPACE";:getspace 1 (133);" OUT2 socket test........";:I%=-1  > I%=I%+1:Tx0Ready:write(TX0,I%):Rx2Ready:read(RX2)  !iodata<>I% fail=  (I%=255) (fail=)  result  :  getspace  soak $& :A$=(10): (A$=" ") (A$="S") . A$="S" soak= 8 B L: V init `G Testskt=0:EnterOS = &16:SVCmode = 3:Ibit = 1<<27:slot=0:foundpod= j< soak=:soakcycles = 0:fail=:timeout=:failflag=:A$="" t *TV0,1 ~ 6  7:  mcode 1000:assmreadwrite J Baseaddress=&033C8000:initUART: Initialise the resident MIDI podule < RX2=UARTaddress+12:TX2=UARTaddress+12:SR2=UARTaddress+4 C Baseaddress=&033C0000:initUART: Initialise the target podule < RX0=UARTaddress+12:TX0=UARTaddress+12:SR0=UARTaddress+4  PodRomstart = Baseaddress " PodRomend = Baseaddress+&1FFF : PodRomsize = 16 : rom size in Kilobytes  PodRomchecksum = &2E31A  Pagereg=Baseaddress=&3000  :  initUART " UARTaddress=Baseaddress+&2000 G MR1=UARTaddress:MR2=UARTaddress:SR=UARTaddress+4:CSR=UARTaddress+4 (; CR=UARTaddress+8:RHR=UARTaddress+12:THR=UARTaddress+12 2Q ACR=UARTaddress+16:ISR=UARTaddress+20:IMR=UARTaddress+20:CTUR=UARTaddress+24 << CTLR=UARTaddress+28:RX=UARTaddress+12:TX=UARTaddress+12 F I%=&10 &50 &10 PG !ioaddress=CR:!iodata=I%: write: Reset all sections of the UART Z I% d= !ioaddress=MR1:!iodata=&73: write: Set mode register 1 n= !ioaddress=MR2:!iodata=&07: write: Set mode register 2 xB !ioaddress=CSR:!iodata=&DD: write: Set timer as baud source A !ioaddress=ACR:!iodata=&6D: write: Set aux ctrl timer mode B !ioaddress=CTUR:!iodata=&0: write: Set counter high to zero : !ioaddress=CTLR:!iodata=&02: write: Set counter low 4 !ioaddress=CR:!iodata=&80: write: start timer 7 !ioaddress=CR:!iodata=&05: write: ENABLE TX & RX  :  assmreadwrite  pass = 0 2 2  P% = mcode  [ OPT pass I.write SWI EnterOS ;enter supervisor mode C TEQP pc,#Ibit+SVCmode ;kill interrupts K LDR r1, ioaddress ;get i/o address into r1 M LDR r0, iodata ;get data to write into r0 > STRB r0,[r1] ;write data "< BAL exit ;and quit , ; 6I.read SWI EnterOS ;enter supervisor mode @C TEQP pc,#Ibit+SVCmode ;kill interrupts JK LDR r1, ioaddress ;get i/o address into r1 T= LDRB r0,[r1] ;read data ^L STR r0, iodata ;store in variable iodata h< BAL exit ;and quit r; |I.writelp SWI EnterOS ;enter supervisor mode C TEQP pc,#Ibit+SVCmode ;kill interrupts K.wrloop LDR r1, ioaddress ;get i/o address into r1 M LDR r0, iodata ;get data to write into r0 > STRB r0,[r1] ;write data A MOV r0,#&81 ;scan keyboard  MOV r1,#0  MOV r2,#0 B SWI "OS_Byte" ;check keyboard C CMP r1,#32 ;check for space ? BNE wrloop ;loop if not = BAL exit ;else quit  ; I.readlp SWI EnterOS ;enter supervisor mode C TEQP pc,#Ibit+SVCmode ;kill interrupts K.rdloop LDR r1, ioaddress ;get i/o address into r1 = LDRB r0,[r1] ;read data &L STR r0, iodata ;store in variable iodata 0A MOV r0,#&81 ;scan keyboard : MOV r1,#0 D MOV r2,#0 NB SWI "OS_Byte" ;check keyboard XC CMP r1,#32 ;check for space b? BNE rdloop ;loop if not l= BAL exit ;else quit v ; I.addpage SWI EnterOS ;enter supervisor mode P LDR r1, ioaddress ;point to UARTaddress of page J MOV r0,#0 ;zero reg. for addition F MOV r2,#2048 ;2K bytes to add up L.addloop LDRB r3,[r1] ;read a byte from the ROM M ADD r0,r0,r3 ;add to r0 where r1 points R ADD r1,r1,#4 ;increment pointer to next byte J SUBS r2,r2,#1 ;decrement byte counter C BNE addloop ;loop until done N STR r0, iodata ;pass back result in iodata < BAL exit ;and quit  ; F.exit TEQP pc,#0 ;restore interrupts M MOV r0, r0 ;don't know what this does  : MOVS pc, r14 ;return  .ioaddress EQUD &0300D000  .iodata EQUD &00000000 * ] 4 pass > H: R autoslot \ find podule slot f0 Baseaddress=&033BC000:slot=-1:foundpod= p z3 Baseaddress=Baseaddress+&4000:slot=slot+1 8 !ioaddress=Baseaddress: read: read ID byte ! (?iodata &FA)=0 D !ioaddress=Baseaddress+&0C: read:Producttype=?iodata 0 !ioaddress=Baseaddress+&10: read 5 Producttype=Producttype+(?iodata*&100) / Producttype=&0013 foundpod=  " (foundpod=) (slot=4)  : > podrom : PROCpodrom + (133);" Podule ROM test.........";  maxpage = PodRomsize/2  romtotal = 0  page=0  $ write(Pagereg,page) .+ !ioaddress=PodRomstart: addpage 8( romtotal = romtotal + !iodata B page = page +1 L page+2 > maxpage V+ romtotal <> PodRomchecksum fail= ` result j$ romtotal <> PodRomchecksum t5 (129);" Checksum found to be &";~romtotal ~  6 write(Pagereg,00) : always leave ROM on page 0  :  Rx0Ready  attempts=0  : attempts=attempts+1:!ioaddress=SR0: read:X%=?iodata $ (attempts>200) ((X% 1)=1)  attempts>200 timeout  :  Tx0Ready  attempts=0  : attempts=attempts+1:!ioaddress=SR0: read:X%=?iodata ($ (attempts>200) ((X% 4)=4) 2 attempts>200 timeout < F: P Rx2Ready Z attempts=0 d n: attempts=attempts+1:!ioaddress=SR2: read:X%=?iodata x$ (attempts>200) ((X% 1)=1)  attempts>200 timeout  :  Tx2Ready  attempts=0  : attempts=attempts+1:!ioaddress=SR2: read:X%=?iodata $ (attempts>200) ((X% 4)=4)  attempts>200 timeout  : < read(address) : PROCread  !ioaddress = address  read  : "@ readlp(address) : PROCreadloop , !ioaddress = address 6 readlp @ J: T> write(address,data) : PROCwrite ^ !ioaddress = address h !iodata = data r write | : B writelp(address,data) : PROCwriteloop  !ioaddress = address  !iodata = data  writelp  : result  fail ( (129);"...Failed":failflag=  ResetUARTS  (130);"...Passed"   fail=  &: 0 timeout :2 fail=:timeout=:8,(8));(129);"Timeout"; D ResetUARTS:failflag= N X: b ResetUARTS lN Baseaddress=&033C8000:initUART: Re-initialise the resident MIDI podule vG Baseaddress=&033C0000:initUART: Re-initialise the target podule  :  ** end of file ** PK AU00/POD_MENUACARC0AJ:;  >POD_MENU & ARCHIMEDES DEALER TEST SOFTWARE 8 Version 1.10 19-June-1989 Author B. Rice (8 Version 1.11 22-June-1989 Author B. Rice 28 Version 1.12 5-July-1989 Author B. Rice This program is based on MMENU from the dealer software P, This program is chained from comptype Z( V 1.10 Inital changes and editing d6 V 1.11 Change path for hard disc upgrade tests. nI V 1.12 Change set valid option details to exclude hard dosc podule x/ tests if the machine is an A400/1  I The program will list the options available, in the data statment, L and wait for the user to enter a number. Only valid numbers accepted.   Main program. init title  list_options  get_response  Ȏ TEST 1  "IOPODTEST" 2  ("*DIR HD_POD_PRG")  "HDU_MENU"  3 " "MIDITEST" , 4 6 "ROMTEST" @ 5 J "DUALFLOP" T 6 ^ ("*DIR ^") h "DEALERMENU" r | 7  8  9     init O This procedure will prepare the program for what it is about to recive  Disable auto-repeat  *FX 11,0  Disable key  *fx 200,1  7 " Number of choices on menu  OPTIONS=6 6 lower_valid%=1 : Minium option number 6 upper_valid%=OPTIONS : Maxium option number &D hd_pod%=2 : Number of hard disc podule option. 0 G$(OPTIONS,1) : get_res_int D set_valid_options N X b set_valid_options lJ This procedure will set which options are "valid" for the machine v being tested.  ID%=6 ID%=7 ID%=8  not_valid%=hd_pod%      get_res_int B This procedure will det the resedent intergers from cmos. ' ș "OS_Byte",161,30,0 R1,R2,R3  tsr%=R3  ID%=tsr% &0F  Q%=tsr%>>7  S%=(tsr% &40)>>6  E%=(tsr% &30)>>4  ' ș "OS_Byte",161,31,0 R1,R2,R3  MEM%=R3   * 4 title > Display menu title H R \' BNR$=(132)+(157)+(131)+(141) f+ BNR$;" Archimedes Podule Tests" p+ BNR$;" Archimedes Podule Tests" z   list_options  List menu options  TEST=1 OPTIONS  G$(TEST,0) 6 4,TEST*2+4);130;(TEST+48);133;G$(TEST,0)  & 23,1,1;0;0;0; : Cursor on    get_response & Wait for valid keyboard input  *FX15,0  ( 9,22);130"SELECT OPTION : ";  a$= $ TEST=(a$)-48 .K (TEST >= lower_valid% TEST <= upper_valid%) TEST <> not_valid% 8 a$ B Enable auto-repeat L *FX12,0 V ` j! List of options available. tI I/O Podule & MIDI Upgrade,Hard Disc Upgrade,MIDI Podule,ROM Podule ~0 Dual floppy disc test,Return to main menu  # That's all, no more program. PKXb AU00/ROMTESTACARC0AZ\;  >ROMTEST H Test program for the EPROM podule utilising the IBM CRC Polynomial ( Algorithm found on the Stag ZM2800 (1 VERSION 0.4 Written by D. Burling 22.1.88 2* VERSION 0.5 By Brian Rice 26-6-89. * Test 1Mbit eprom. Set up parameters. H RRomlen% = &20000 \ code% 1024 f Knowncrc% 4 p Storebase% Romlen% z !Knowncrc%=&D29A &0000FFFF CRCADD% = Storebase% >Pagesize%=&7FF*4:Totalpages=&3F:PG%=&40:Slatch=&3800:sk%=6 asm 22,8)"IC Socket 6"  : J..................................................................... :  podule J Find the podule in any of the 4 backplane sockets locations &3340000 J &3344000,&3348000 and &334C000. Podule identification found in bytes D 3,4,5 & 6 on the page 0 of the ROM. Byte 3 should be 5 for the 0 ROM podule and bytes 4,5, & 6 should be 0. K If rom podule is not found, determined by podule% =4 (each of 4 slots G tried ) or flag still false (initial setting) the test will print  podule not found and end. $8 R% equated to Rombase% to hold value during clear. .: 8+base%=&3340000:Found=:Podule%=0:PGE%=0 B ID% 4 L V( Rombase%=base%+&4000*Podule%:ptr%=0 `R%=Rombase% j device t page(PGE%) ~ ADD%=&0C &18 4  read(ADD%)  ID%?ptr%=Q%  ptr%=ptr%+1  * !ID%=5 Found= Podule%=Podule%+1  Found= Podule%=4 8 Found= 8,2)"Podule found in socket ";Podule%  Podule%>3 ! 10,2)"PODULE NOT FOUND" 2 :" Press SPACE to return to main menu"  : (-99)   ("*DIR :0.$.AU00")   "POD_MENU"   (: 2I ................................................................... < device F Slatch controls s2 PRombase%=R% Z s2 high 800; s2 low 000 d3 s1 , s0 bits 6 & 7 in page register &3342000 n% B%=Rombase%+Slatch: Writebyte% x A%=PG%  : L ...................................................................... : page (PGE%)  select 0 to 3F pages L PG% used allow offset to be added to page register for page selection 0 A%=PGE%+PG%:B%=Rombase%+&2000: Writebyte%  : L ......................................................................  read (ADD%)  read data from eprom  B%=ADD%+Rombase%  Q%= Readbyte% " ,: 6L ...................................................................... @: Jstore(STADD%) T- move read data from Q% to storage area ^ ?STADD% =Q% h r: |L ...................................................................... :  asm sp = 13: lr = 14  step% = 2  pass% = 0 step% step% P% = code% [ OPT pass% .romsize EQUD Romlen% : 6.crc STMFD sp !, {r0-r6, lr} \ Store stack < LDR r0, whichone \ Load base address ; LDR r5, romsize \ Store rom length 8 MOV r1, #&A000 \ CRC pattern  R r1, r1, #1 E MOV r2, #1 \ A single bit to be shifted 6 MOV r3, #0 \ Initial CRC & .crcloop 04 LDRB r6, [r0], #1 \ Read data :< MOV r4, #0 \ Go round the bits D.crcinnerloop NG TST r6, r2, LSL r4 \ Is data bit = carry ?; NE/EQ X? BEQ crceq \ If data bit 0 branch b; MOVS r3, r3, LSR #1 \ acc >>= 1; CS/CC lD CC r3, r3, r1 \ NE, CC -> eor, NE, CS -> ok v B crccont : ;.crceq MOVS r3, r3, LSR #1 \ acc >>= 1; CS/CC D CS r3, r3, r1 \ EQ, CS -> eor, EQ, CC -> ok :  .crccont 7 ADD r4, r4, #1 \ Increment r4 @ CMP r4, #8 \ 8th time round loop ?  BNE crcinnerloop : < SUBS r5, r5, #1 \ CRC romsize bytes 8 BNE crcloop \ Anymore bytes : @ STR r3, finalcrc \ Store CRC in finalcrc 8 LDMFD sp !, {r0-r6, pc}^ \ Retrive stack  :  .finalcrc   EQUD 0 *: 4 .whichone > EQUD 0 H: RI;.................................................................... \: f9.Readbyte% MOV R5, R14 \ Store PC in r5 pL SWI &16 + (1<<17) \ Enter supervisor mode & kill ints z4 LDRB R0, [ R1 ] \ Read data > TEQP R15, #0 \ Change to user mode 5 MOV PC, R5 \ Restore PC : I;.................................................................... : 9.Writebyte% MOV R5, R14 \ Store PC in r5 L SWI &16 + (1<<17) \ Enter supervisor mode & kill ints 5 STRB R0, [ R1 ] \ Write data > TEQP R15, #0 \ Change to user mode 5 MOV PC, R5 \ Restore PC ]  pass%  PK؍ECMOSLSACARC0A#>;  >CMOSLS  ARCHIMEDES TEST SOFTWARE 7 Version 1.10 14-June-1989 Author B. Rice (7 Version 1.11 5-July-1989 Author B. Rice 2B This program will load or save the cmos ram from or to disc a$="L" a$="l" a$="S" a$="s" a$="Q" a$="q" D a$="L" a$="l" N "Load" X load b l a$="S" a$="s" v "Save"  save   a$="Q" a$="q"    load > This procedure will load a copy of cmos ram from disc 1 7,10)(134)"Insert DATA disc in drive 0" ' 1,12)"Filename of data file ";  file$  *DIR:0  11  X=file$  X=0  - 1,14)"File ";file$;" not found." - 1,15)"Press to continue"   get_space * 45 1,14)"Loading CMOS RAM with file ";file$ > B=1 240 H C=#X R, ș "OS_Byte",162,B,C R1,R2,R3 \ f *CLOSE p z 11 = 1,14)"Replace test disc and press space " & 1,15)"bar to continue."  get_space  check_name  disc_ok=  *DIR:0.$     save 6 This procedure will save the cmos ram to disc 1 7,10)(134)"Insert DATA disc in drive 0" - 1,12)"Enter filename of data file ";  file$  *DIR:0  11 $ X=file$ .) 1,14)"Saving CMOS RAM as ";file$ 8 B=1 240 B( ș "OS_Byte",161,B,0 R1,R2,R3 L #X,R3 V ` *CLOSE j t 11 ~3 1,14)"Replace test disc and press space" " 1,15)"bar to continue."  get_space  check_name  disc_ok=  *DIR:0.$  error%=0    get_space B This procedure will wait for the space bar