IMD 1.06: 20/10/2005 14:10:02 STRIDE MICRO SGDEV IV.21 DK0137B October 15, 1985 #   function ac_getrequest  ( !accept_socket : integer ; { the socket to pick up request on } !wait_time : integer ; { time to wait for a request (in 60ths/sec) } !var requestor : sk_netaddr ; { who the request is from } !var msg : interface packed array [l..h:integer] of char @{ user defined part of the message }  ) : lo_result ; { result of the operation }  !{ ac_getrequest picks up one locator request off of the ACCEPT_SOCKET. #WAIT_TIME defines the time to wait for the request. REQUESTOR is the #network address of the sender of the request. The MSG is the user part #of the request. } #   function ac_putresponse  ( !accept_socket : integer ; { socket to put out response on } !requestor : sk_netaddr ; { where to send the response } !var msg : interface packed array [l..h:integer] of char @{ user defined part of the message }  ) : lo_result ; { result of the operation }   c`SGDEVsp!xstru DK0137B  SYSTEM.SYNTAXIJSYSTEM.COMPILERƙ"SYSTEM.ASSMBLERUNCG.68000.CODEg: SYSTEM.LINKER:Z PATCH.CODEZ`SAMPLEGOTO.TEXTb`| DEBUGGER.CODE| DECODE.CODELSCREENTEST.CODE 68000.ERRORS 68000.OPCODES(ʀ LMONITOR.CODE" XREF.CODE ASMLOAD.CODEFPUMACROS.TEXT6 COMPRESS.CODE|F LDEMO.SVOLFj LDEMO.CODEjMU4.FBOOT.TEXT{MU4.WBOOT.TEXT{ȝ MU.PBOOT.TEXTMU.BOOTEXT.TEXTFINDPARAMS.CODEtREMINTEST.TEXT RECEIVE.TEXTREMOUTTEST.TEXT  SEND.TEXT  TEXTIN.TEXT?SSAGE.PBOOT.TEXT?gSSAGE.WBOOT.TEXTgTOPSYS4.2.TEXTEX.TEXTEST_SOCKET is open rq_putrequest will broadcast a message #consisting of DESC (the service descriptor string) and MSG (the user #portion of the message. NOTE THAT msg_size is NOT the size of the request #MSG, but the size of the response messages that will be picked up using #the rq_getresponse procedure. } # #   function rq_getresponse  ( "request_socket : integer ; { socket to pick up the response on } "wait_time : integer ; { time to wait for one response } "var acceptor : sk_netaddr ; { who the response came from } "var msg : interface packed array[l..h:integer] of char @{ user portion of response message }  ) : lo_result ; { result of operation }  !{ rq_getresponse picks up one response message off of the REQUEST_SOCKET. #WAIT_TIME is the time to wait for one message. ACCEPTOR is the source #address of the response. MSG is the user portion of the message received. !} !   procedure rq_close  (  c`SGDEVsp!xstru DK0137B  SYSTEM.SYNTAXIJSYSTEM.COMPILERƙ"SYSTEM.ASSMBLERUNCG.68000.CODEg: SYSTEM.LINKER:Z PATCH.CODEZ`SAMPLEGOTO.TEXTb`| DEBUGGER.CODE| DECODE.CODELSCREENTEST.CODE 68000.ERRORS 68000.OPCODES(ʀ LMONITOR.CODE" XREF.CODE ASMLOAD.CODEFPUMACROS.TEXT6 COMPRESS.CODE|F LDEMO.SVOLFj LDEMO.CODEjMU4.FBOOT.TEXT{MU4.WBOOT.TEXT{ȝ MU.PBOOT.TEXTMU.BOOTEXT.TEXTFINDPARAMS.CODEtREMINTEST.TEXT RECEIVE.TEXTREMOUTTEST.TEXT  SEND.TEXT  TEXTIN.TEXT?SSAGE.PBOOT.TEXT?gSSAGE.WBOOT.TEXTgTOPSYS4.2.TEXTEX.TEXTr,*b#!r ,r h  "!l$m%s%xM $&'('pa#t a rh .m63 EXTRAHEABYTEFLIPSOCKETS  DISKSHAR < bCCopyright 1983 SofTech Microsystems, Inc.  'LO^LרFS1:Error in simple type  2:Identifier expected  3:unimplemented error  4:')' expected  5:':' expected  6:Illegal symbol (terminator expected)  7:Error in parameter list  8:'OF' expected  9:'(' expected  10:Error in type  11:'[' expected  12:']' expected  13:'END' expected  14:Semicolon expected  15:Integer expected  16:'=' expected  17:'BEGIN' expected  18:Error in declaration part  19:Error in  20:'.' expected  21:'*' expected  22:'INTERFACE' expected  23:'IMPLEMENTATION' expected  24:'UNIT' expected  50:Error in constant  51:':=' expected  52:'THEN' expected  53:'UNTIL' expected  54:'DO' expected  55:'TO' or 'DOWNTO' expected in for statement  56:'IF' expected  57:'FILE' expected  58:Error in (bad expression)  59:Error in variable  60:Must be of type 'SEMAPHORE'  61:Must be of type 'PROCESSID'  62:Process not allowed at this nesting level  63:Only main task may start processes  101:Identifier declared twice  102:Low bound exceeds high bound  103:Identifier is not of the appropriate class  104:Undeclared identifier  105:sign not allowed  106:Number expected  107:Incompatible subrange types  108:File not allowed here  109:Type must not be real  110: type must be scalar or subrange  111:Incompatible with part  112:Index type must not be real  113:Index type must be a scalar or a subrange  114:Base type must not be real  115:Base type must be a scalar or a subrange  116:Error in type of standard procedure parameter  117:Unsatisified forward reference  118:Forward reference type identifier in variable declaration  119:Re-specified params not OK for a forward declared procedure  120:Function result type must be scalar, subrange or pointer  121:File value parameter not allowed  122:A forward declared function's result type can't be re-specified  123:Missing result type in function declaration  124:F-format for reals only  125:Error in type of standard procedure parameter  126:Number of parameters does not agree with declaration  127:Illegal parameter substitution  128:Result type does not agree with declaration  129:Type conflict of operands  130:Expression is not of set type  131:Tests on equality allowed only  132:Strict inclusion not allowed  133:File comparison not allowed  134:Illegal type of operand(s)  135:Type of operand must be Boolean  136:Set element type must be scalar or subrange  137:Set element types must be compatible  138:Type of variable is not array  139:Index type is not compatible with the declaration  140:Type of variable is not record  141:Type of variable must be file or pointer  142:Illegal parameter solution  143:Illegal type of loop control variable  144:Illegal type of expression  145:Type conflict  146:Assignment of files not allowed  147:Label type incompatible with selecting expression  148:Subrange bounds must be scalar  149:Index type must be integer  150:Assignment to standard function is not allowed  151:Assignment to formal function is not allowed  152:No such field in this record  153:Type error in read  154:Actual parameter must be a variable  155:Control variable cannot be formal or non-local  156:Multidefined case label  157:Too many cases in case statement  158:No such variant in this record  159:Real or string tagfields not allowed  160:Previous declaration was not forward  161:Again forward declared  162:Parameter size must be constant  163:Missing variant in declaration  164:Substition of standard proc/func not allowed  165:Multidefined label  166:Multideclared label  167:Undeclared label  168:Undefined label  169:Error in base set  170:Value parameter expected  171:Standard file was re-declared  172:Undeclared external file  173:Fortran procedure or function expected  174:Pascal function or procedure expected  175:Semaphore value parameter not allowed  176:Undefined forward procedure  182:Nested units not allowed  183:External declaration not allowed at this level  184:External declaration not allowed in INTERFACE section  185:Segment declaration not allowed in INTERFACE section  186:Labels not allowed in INTERFACE section  187:Attempt to open library unsuccessful  188:Unit not declared in previous USES  189:'USES' not allowed at this nesting level  190:Unit not in library  191:Forward declaration was not segment  192:Forward declaration was segment  193:Not enough room for this operation  194:Flag must be declared at top of program  195:Unit not importable  201:Error in real number - digit expected  202:String constant must not exceed source line  203:Integer constant exceeds range  204:8 or 9 in octal number  250:Too many scopes of nested identifiers  251:Too many nested procedures or functions  252:Too many forward references of procedure entries  253:Procedure too long  254:Too many long constants in this procedure  256:Too many external references  257:Too many externals  258:Too many local files  259:Expression too complicated  300:Division by zero  301:No case provided for this value  302:Index expression out of bounds  303:Value to be assigned is out of bounds  304:Element expression out of range  305:Maximum segment number exceeded  306:Unit name same as program name  307:Unit name declared twice  308:Invalid array bounds  309:Bounds may not be of type real  310:Only one dimension may be conformant  311:Must be a variable parameter  312:Must be a conformant array  313:Segment declaration not permitted here  314:PROCEDURE, FUNCTION or PROCESS expected  315:HOST call not permitted here  316:May not be formal procedure  317:May not be formal parameter  318:Invalid file type  319:Must be an untyped file  320:Segment entry not found  321:May not be a conformant array index bound  322:Must be a string constant  323:Must be a variable  324:Must be a declared procedure  325:May not call the main program  326:May not be an expression  327:Maximum code size exceeded  328:May not be a conformant array  329:Procedure with untyped params must be external  330:EXIT call not permitted here  398:Implementation restriction  399:Implementation restriction  400:Illegal character in text  401:Unexpected end of input  402:Error in writing code file, not enough room  403:Error in reading include file  404:Error in writing list file, not enough room  405:'PROGRAM' or 'UNIT' expected  406:Include file not legal  407:Include file nesting limit exceeded  408:INTERFACE section not contained in one file  409:Unit name reserved for system  410:disk error  500:Assembler Error 5 ).28HJNRSDV] cg qPASCALCOERROR COMPINITDECLARATUSESDECLSTRUCTURBODYPARTREADWRITAROUTINEBROUTINEWRITELINUNITPARTBACKEND PARSEDIRFINALPARDEBUGINF  <PASCALCOPASCALCOPASCALCOPASCALCOPASCALCOPASCALCOPASCALCOPASCALCOPASCALCOPASCALCOPASCALCON<BACKEND BACKEND h!#Copyright 1984 SofTech Microsystems84 SofTech Microsystems, Inc. PASCALCOh!&`08p8 O    !d8  !h |! NąNNNw |  |j |jh   ihj"$i!"h "j #"!mBjjjh  (i!'!' R ᆀj(iV!G!$P!&!%z!'Rjw4j(h VG $P &= %z 'RĚ Rjj+‡,p+h`,P `U `pw,z"0 1P "1P "","/1= /w=!! p& Ċ Ė78xh & `p& "d *gwhh*Ihw"Fh:"Dh/"Ch$"Eh"Bh"@hAh! Ė#h y " |! {Ċ"#7!Ċ#{!#{ Ċ!Ė>`i  y | {7ii  i! i:h'>2w  >>%h7hT-` `  m%%%%%;%%%7%c ##'xđbj>(?`ڡ ?jj>կa !m%~h'% x"Ւ ; "''xċ 90"*c ##'x#m%%x'#ĊM 8A";c #m%%'xz%'xy%znl$&%$'x$x$'#Ċiw>#";h'xđz>$&"m%%xą9h'xđO>0@""m%znl$&%$%$x$`   'xđ jw  >  w  ( Ė d -,-, -y,y-y-z,zjGlGk$$ +y-z+x,zj+zl"#d $ +-z+,z+G$G-z,zj"#Gc]-z,zQ-{,{-|,|j"-|-~,~-},}-,j"- -x,x-y,yj-y,y՚-z ,z *)Ո-y*y*{*{~ -y)y){){~ *;  n* f ); om)ge -y,y "'(%&j-y,y "('&%j"*)j"g-zi,zhj! "/!~ ~! j"! ! ! j!i h"! -{,{-z,zր܊5-y -z,&,y -,z-y,yڡ}r08 8 i'hb!% 0!i% m h ib!0! b! !ii!b! !+b,Pbih !b  -h !  + <  > ^pph p i!! ߖ! 쥃` pq w쥃q쥃pih !!ip!j"$" h m#!ĖGb '&;[ pq whi! q' p  w'&;i`h!@w p pq6 pp w pq wqp 8Gw8h 0 0  w8 0 08p !/8*088p 0 w <`p nc &Nb& & &8& kxđ<{{i!k!x!년R 'ONONRQOc b(Vc     h !  ! !  ޖaeph a< a NĀ&NN1wNN  VĚVZJe[Y p'ZZ[[Zp[ZZpYY!h`Ɂ`ɢj j" =h`[ZpZZ)A`d`[ZpZZ)ia`p =h`[ZpZZ)  ĭyyĭ ąV>VV7xc b "7x"Ęh"i"՞"xՔ"xn&?&DK p lmk|xlK~m|m& % & %> & $%>>&~y&~y@ >&~x>&}&}B>&|&|B> "h"yj\c Ih% լ%jK " h ""  " |h w$""?K >" >a>`>YWZX>V`aV7xV>VV>a`ki!#>!%mK nVfWYV=[XpFe`W 0V=`Xpe`W p'p'DKCA!?!h + %     w |E }EhVYWZX>څ c>M᥃MF#IH 7xE K < >#s>wc%K>K > i!)KwwcK >K > i!>ڠԧ!Kwwc >>'K > wc c ZKj""" '!"z{"| ᥄P"yH"x"} "{|K K K K>+ڥMh5c H*>/ c3>7c  v! !)Ze[Y p' ۃ;">w.%K    pq wNh 0 w( eee† # (ve.TEXT system.info[*]]#UW; T_EN(D1b=> {&&u /F]ioc 9?K warning ioerror / generating symbolic debugging information for  D D G s >Sgo=zC F   H & v d ; 4Pd4   uj* fEPASCALIOEXTRAHEAFILEOPS EXTRAIO STRINGOP HEAPOPS BACKEND SCREENOPOSUTIL MSGOPS COMMANDI 4ERROR h![z \1= .+u(z 1zpzh1 a= p\a=  \ \\ \\ \ RV\ \V \\-`-````-*S=TPr+$q+q$+ hX$++asp"   ` s ⼃0 E e+P=Vsp p P+Vs+U=SPT+ s p"<  > + <---Line  in include file #6:9Type to continue, to terminate, or 'e' to edit  [ oCOMPINIT}h!F  ;h   Ć9 9h   Ć8 8h dLq Ć7 7h   Ć6 6h   Ć4 4h   Ć5 5h ,  7Ć3 3h ,  7Ć2 2h  P   ;   7 PĆ1 1h    Ć0 0h   ;ĖRa !k##;#!qa !k##9#!qa !k# #7#!qa !k##6#!qa !k##2#!qa !k##5#!qa !k##3#!q> >k##5## # ą>q= =k#"#5## # ą=qa !k#&#5## # !qhj"9a !k#6" #*#.# # "#!q!h"6!a !k#2#4## #!qa !k#6#;## !qa !k#:#1#!qa !k#>#0#!q`BF Fl$`$$ĆE El$`$$$ $ĆD Dl$`$$$ $ $ĆC Cl$`$$$ $ĆB Bl$`$$$$$$$ $ $ $$ $ Ć@ @l$`$$$$$$$ $ $ $$ $ ĆA Al$`$$$$$$$ $ $ $$ $ Ė)`*P` ``p`+!!F.ph! p JiiMc!i!j"` `  o'c''"'Ċ'' ' ! q %m l g%m$l%Cn%6j`  ,;,ċ7j;j`  ,9,Ċt9jlmlij` c # ,,, ,#, l9 l;jh. l'6j`  ,;,Ċ9j jhցE&a a ! ,g, , +, $&,Ċ,  ,", !q ᥃놃[_cgkosw{     qVG;?G z$P QRqqp:rG 9/#{|O  %L N(+) .'*"!Jj᥃RQON&ok TSTS,-bcdZY[p᥄P~ }   SUT  ss H-PVVćVćVćVĂqG-usp tt       &VVP VU VP$ q08p8 q q qPqzqC qq- 0 ]  qqqHVVćVćVćVĆ< w>!էq> w!pVVV <ćVćVq>(>qw>qw K KVV ćVćV<ćV9ćVHćV7ćV|ćV ćV ĖINTEGER REAL CHAR BOOLEAN STRING TEXT INTERACTINPUT OUTPUT KEYBOARDFALSE TRUE NIL MAXINT SEMAPHORPROCESSI =READ.READLN.WRITE.WRITELN.EOF.EOLN.PRED.SUCC.ORD.SQR.ABS.NEW.7UNITREAD.UNITWRIT.CONCAT.LENGTH.INSERT.DELETE.COPY.POS.7MOVELEFT.MOVERIGH.EXIT.IDSEARCH.TREESEAR.TIME.FILLCHAR.6MEMLOCK.MEMSWAP.REWRITE.CLOSE.SEEK.RESET.GET.PUT.SCAN..8BLOCKREA.BLOCKWRI.TRUNC.PAGE.SIZEOF.STR.GOTOXY.UNITSTAT..2DISPOSE.PMACHINE.SIGNAL.WAIT.START.SEMINIT.ATTACH..VARNEW.VARDISPO.VARAVAIL.P?ODD.CHR.ROUND.SIN.COS.LOG.LN.ARCTAN.EXP.SQRT.ATAN.MARK.RELEASE.;MEMAVAIL.IORESULT.UNITBUSY.PWROFTEN.UNITWAIT.UNITCLEA.HALT.0WouKERNEL HEAPOPS CONCURRESTRINGOPREALOPS LONGOPS FILEOPS PASCALIOOSUTIL GOTOXY SCREENOPDEBUGGEREXTRAHEAEXTRAIO PERMHEAPSOFTOPS COMMANDICOMPUNIT* 8|tx4R0.177 SYSTEM.SYNTAX2Output file for compiled listing? ( for none) /PRINTERRPRINTER::/CONSOLEECONSOLE::#11#66.TEXT.TEXT!Pascal compiler - release level [< 0>PROGRAM D zb   DECLARAT h!.g">wq >Տ>Տ7l7y7-a a !! ,,,Ęjmq>.c # ,,!,", %,#q%m#jqwg>!"$>qw>`cq q#Ya !! #,-~,,zq w,,- x,>qw`fq!fx!z kw#~i!2>Ղq`fq ;Z&&wPn-a a ! ,,&,,,;,,,7,&!w>q w^!;Z>Vqa !! ,8y,8xĄ`fq ;&&$w!&qĊw>q w!.!xĊZa !!Ą`fq q wh! , ,fx,>qw`fq!fx!z kw!+! ,y#,z,z95w,|,{ fw,,|/!Ą/Ė7-G"aq+h %U Ui! !{i! !ziր !"!!!Ė!> wbq >"> b! b! b!!x Ċ !xxĖ>`w`q n%#X%j"yO%;%9%%a`q !n$i! !i!!i$$xĊ!"z$#"za`q h n$ Ċր >#I7j"{hi ! x yhiw!`  k###"{" qw> :q:ԛ>qw>w q >``  k####q>)? qw abq q ! bx> qw >w q >Մb "m%%%q>)? qw cd"q"#ą;i!'!"!~"~!; !Ċ!;!h!i> qwv;i!0!bq "!~"~!; !Ċ!;!h!i̅; ; uw;i j>8c # (("((ą"( <Ċ( H#q#jqw> ۆ}w ۆ}q > :q:ԋ>qw"i ۆ}de"?" ($( 99% (j(#$$y "(7zĆ7!Ċ> qw>>};o'0'cq #'~#~';&'Ċ';'n'o̅; ; uw; , " i7xqTh ;  +   8 րw   Ċ'  8 +  h   ĭ Ċ 9   H { <ĭHN1wNNqpi!! + 'wqo>,q>q w-  '    ( ((ą-'((ĭh9 m%K>@ ĭĭ Hĭqĭq>qww%튯q ~yw~ĭ~ĭ z (((q>nq& & w> wqw>>_q ~a'!! ((!(!ĭ ({h((ĭ 9  qw {y6w 9 "h ~y ~y ĭ ~x - ĭ ~x 9 ~x ~q    5j9 >w q >wwq>w !q >>"%>q9 a !!!!~lU>nqni >wD&c c # ,,,!&,Ċ,, H#q#i* q> .w .q > :q:ԇl>Րq>3 q&7w>Hcq q#~lo$-&)$y yw$1w$y$xo$q o9*' +"$y8we %$%$x%%l $;l& 9* w> (w (q !hk!!k! ,$,i##" j>&q> %w !q >w>q w.9Ęh "Ո" ,i, ,,(( _,~Z,~y,~zl,~l, , (( ,"$$y+!!~,~ $z{- (- (( ${l$y"h!jr/ Ċ/Ė$%h ( j"~""~y"~y$$x"~x"h%h v j" ""$xĊ" " " Ċ " " $x ~i!y!zi!y  ~ ~"!z{k# # $x# # $x!{i!y"hS1'9w< N { {>h>(q:wh 9 #m> wBjH 7 | "" |HHHw7.77$"ĊćććĊw" (a" a" $"!ċ8.H>wa" $"!9 ċ a" $"!>eq>M$zwaq !~k"## ##y xw9#x #xqw q ${w9>>qw>" " " "g""'$ 9' 'o>5WHw "w9w"ćĚ q%q>qw " "ċ>" U%w$w ">"<wq>qw ( %w$"i!!~!Iw!iM "ććK q1q>! w 0q q>q>q >q H7L>27>hq !  w    >6>C" >:ڡ>>(j!>w Bq >FMD TuwJu , USESDECLgh!3"i`a`a k"k$"$x"x:#$x#c$xxiah #"Ċ$$xĊ$$xĊmj`ak!## w#j!#!l!s x" wB*q`rP `Pր `* *q`08*p8* qPqzq!*l#ą?h #x #Ċ h#x*aqp! q|#ą_ ;p#Ċ #Ċ#x #xw#Ċww##xG"bq"q N NNN1w<q{qPqq } } | | ~ &`q+n yj&m %y\%z-%{i%{jk!!!!d $#&$Ċ"$$jk!iۊ+%z %%z %z %{ %z %z %z ր%7xe$p& hw#7x`$p&՞7%G# B# %~y-a !j""% z"% y"%  #x !ĊG%~9a !!% #x !Ċ&%~q a !% #x !Ċ #x % xċ# #x % #x % ċ# #x % #x % % #x % #x % Ċ|% # # #x #x % #x % #x % #x % % "#x%#x%#x%#x%Ċ#x%#x%Ċ # ր"#x%#x#x%~#x%#xq7#x#x%%h ~ h#x~ `!x"$"y` "9` "q `!}!} !|!| !!!!~! a ya ra ka da ]!7x`!p&! !/! aa! aa aր. a ր3 y y`2!h yQaM z  z  a8a1a*a # z aaa aր>!{!{!z!z!x`q+ y$!x2q . !a Lqqq>w` q>>w7x 7x 7{ 7{iUU7q>q% q08p8  [qq->-.77Ć7Ć7Ć7ĘUa!^b ":ćć ": 9 _ %q!q!'Pq-- q q7-( ' %{/Hw>w}"G :h    hꀼwq> q q>2<2w:h   3wŊ h :q:jqw"*SYSTEM.LIBRARY*SYSTEM.LIBRARY @@@X y Selecting declarations from Using p8FD}H  STRUCTURh!h"i!~ 6   h! ! ! ! Į  *  h! ! !~ !~x ,i! $! ! Ċ! !  ! ! Ė    m%%% ĭ q>-     m%%%% aq>h>,aqqa>qwq > Maq ~ / y$9 qmw ĭ  nwqwwq  Ę    q z z~qow m% %%x% ĭ > :q:Ԟ>qw>q w>(    zĭ ĭ> q w> : q  :>   ĖTi h>wq >!j>F-d  d d $ć"ćć $j$qqw>wq > :q:ԍ>qw ) )y lw"!")""hj$i>q> w q j!!l"!j$i>Ė ĭ h   q>~7x p&' h   ; ĭ;~~y  ~Ċlwqw >>+ q >} w}q >,;q>q wi-b )b b " " ,!,),,,"i`f !& * y 9mwh ;wh" Ċqwh> :q:m>q w> qwbf " "y lw" ) ++! ,,+,+! ,{h,",z+,z gq ,| '(,~n&'(n&4wn,&!j i!ҽO>-wq7k777 ,,Ċwm ݁a%*mb " " ,7x,!,%,#> q w>*|q> qwaf !!y!;swi !9rwib " " ,!,!#! gq ,'('w,Ċ,ĊR>.Mqb " " , ,> qaf !5lwi"!! ",!xĊ"(."Ė      ,b 7BODYPARTh!j>iq`aq$wR$y wG$zB q 9w1$z~ q$${h  k#|! #xj#zl#{h$xjltw"mhi2 2j"y"z"zk#xi#y#{htw> i!  272y29( mn.2;2a`q ! Ksw72 2y}w; d  `d ,!,,  ր 08 8 `08p8 08 8 !3!9!5 !a$! !!!h``<     '՘&4xlqh"jRiR$R1lj$%4$x$ QiQ$Q$l2$$/O$O"$q!$$mk#%4#x#$ 4x,''7&'f& 8 x&& "" "&թH!-" / "" "&% s!,"  "" "&$ CH!""" "&Y!H " !ڡ,!"! )"X"k") "! "E "! w%;wq >x>^`  ywhqn2 2yqw  .z2q;.z q -.z q . ,+K,,,#"M.yD.z{/~2q5. H/ /  H/ / K- H/ / #w.{2e.|+.}.} q .l X.~.}6 y z{ H/ /  WW2x2y2x>հ>q w>Ջ2 2ywq>p2h2z q* wU*.~46. 5.  wրp. . . . 22y2xqw]2W2.y.y E.y.z.z2>w 2722y2xwq>wq }Z > `q qwDhb a !h  ~yPH  H  ;K / (z{~h ; baq |({yc *{kc({&*y5*z{ H) )  H) ) ' H) ) '+*{x+  * *z  q  ({x*yՀ*z{ H) )  H) ) #*|*~"*~ m*{x *{x (| (~ ({x ({x n'J*9 *x (| (~ ({x  ; !4w 'm%y&y/%{y&{yڡ %{&{(l%{&{ql$%z&zql+%y&y%zcaq &zb`q '&q#"! l'&l$  #  H   $H f  Ij$#"P#~$~q#$j"5$ $#+j ih##~#~i$$~$~h! j$l#k"$#m`q i  h h"j" +ww! w! ! Ewq*3F4 w008p008py( 2xxwwil  i  w l $ ~~x ( ))>!~wq!!)8"82!Ն!~yo'!~zj!~j"f"y"/#" /2(w 2"k"&!" " " 2y՚273m"x2x3,2x'n"y&G"x8 "x 8 ["y2;8& "x8 9"y."|"{K"2;"9q L9 %"q 2j"yZ2yw9008p008p2x xE2x992x 99 "q ,' "2qw!,!!i>6>qw!~w N  Ew6 ! ) H ))      ?   ~;" ii" h>q ti w w zc"  c! c! ! >qw%T0 0 8 p0 !8 29"x9!2;L9"x; -"9Ė xy2y2; 8 x; 8Ė>:wq >բ>|`q q   $  ~ xĊ  e22yz);xq9xq7d $2 $$xqd $$q$xqq >qwq2e2 26wvq jd $ćć> $q}22y w$z2qժik34i4n&w&o8m>Jqk$z2qw!34 4o'wi!% &'#b<"[j$2$w> :q:>q w".  O OąO[O OąOր>wq S 2>'3`?n8oq 2'8'o 2&`'.`/ ;2; = 929B+2y y y 2q\w`'. 929Cwy`/ ;2;  y2y wM ;2;.b=Kw 626!wր L on>(?`ڡ?onq 12&2;292yw'2;a29d2y>(`?m8 q 1(8( 2%`(.`/ ;2;": 929@)2y y y 2q[wp`(.`/ ;2;#: 929A)2y y y 2q]w 626 wրNJ Oo0>) .27 ?3O 2 2y`!?m8 q03 2յ%(2y 2zqZww &  .27 72 `( ( D2y 2`*.`/.)2 #`2 - ,+ % m m m mր 2q  x n1 y 9nM 6%ڡn3y%n3ine% wn6QHwJn9 q " nh z zq / %w)) wր&%T&%0ڡ% 018% ր&$ ,-&) %w6'O/h2w== z{i |5 H! !  H! ! # ~" ~ 7 H! !  H! !  H! ! #m b"| @+ >*n2 42y`q2   @2y2;9 qL98 q2;82yw8 2q՜ *y. *|*{K`$}G*x`$r`$m x`$a5]3m *|* ) k%*%*x xE%*x!*x xE*x wրw3w >#Ci7j"y"j񆀞"{h ! k#xi#yh!wqw3>> :q:> q w26wl8a!#> q4w 3> ` !q3 ! h i!qQ  j"z q   "y"x  ҭ Q QO O g'2i!!y!9wi> qwm j`fq!R! qG%lk$$ ,z& ,z&w$k,xlb " ,$,&,#"m#"Ċw> :q:Ԏ>qw +3>"(> :q:> J'%%z %lm$xk$%$m#l$%z ;> q w L ` 3>> :q:> q8 #5w a!@8` #>q6w3! !q`22yw2q3,$ y4|4{wy.|{K$r3( $5&9 $ 99 99 23w">Gq /~mn/o/ / wm%%y9%qwmqwAq > ?3wq  > > @?7w@q .#>q6w3e+mn,e$-,.9 Q#ji> `q qwDhB c2m2yd7Y7"j7l$2z47l$$5$6Ċ)&97l$$99 !i99ww> :q:V>q6w37"9! $II9l>#P7i!y!i񆀞!{j"""m%x%zw%%x %yjڀwq>qw>fwfq >ըc >`q q f  Aw 4[qI;w H"q3q7-q6'q9!q:q=q<q> q@րc q>&wfq II$ ,' qqn8m -h- -~-~x *h- h-i, )* !!-~զ-~y-~zk-~k#y ,## ,y h,{ # hp -^#yQ- #q $ h #q ,#+#x  h #x xE#x #xh - h- h-i5- -^ Q97zi!I!-~- - ,.z-~3.z7.zx-i$&%8 q+n8m3>> :q:> q w H&%8"q7zi!!- -i"-- *q7{l$$-zw-yl'q k|Ė' 6db(c aaYZZq%᥅aA b `aq*dq&`o @d`?-@*** OjSSo0Ig'g= e n7vEBF(8n   C rHHUF,zqH d / P^WN?qdP%> AREADWRITh!E"`q ~" ~y  ~z7q! >"w>q|>h> `w> "4i!*&9&999 992^;2qO92q ?82q2x)72q 2q 2 }w!%9 9 9 9H/> :q:  /1=j> b>t"&2h q 332 ) % n&y&y$q>&q&22;}wii ;! 9=!>$q"22;}w t 8q!\ 7! G q ! 1 q 'k z zdcq #$k!## }w/> :q:Ռ"/D % AROUTINE`h!%>qw42;}wb3272q U33!;!w27'Oh   4ȅO 22 2Ć2 2}w2A> `q q>!  :q:! ! i99 22 2!Ėw  9h9 +    2i  22 - ! ! 99! +  22y }w 2z>w T>q}w4,$2 2z7>w  ր/ /22y }w2z7 >w> 6/F2 2;`29c}w;327+2q 34y'2}w;  22 ;pk> `q qwDh a2 2y }w>J !: 4j "p" "pĆ2 &q /2 2y }w>Zq>O 9'wqw/# 22y }w 2z?w >q % /;82q$2q 2 tw&2;2q tw}w: 6  ;  րր: (NORMAL LOCK PURGE CRUNCH 66XX1hhmMrh>[ BROUTINEh!%>qw42;}w >wq h!`q q !  ~jk8n c2j& kj>-qaeq!!;}wm %/wmmm"'"yվ"z{ "|< H( (  H( ( #"~""~ = H( (  H( (  H( ( #m %6%b"$ %%"% `>"y "{ow"xo"xo#3%'&% '% ' '%% #%%q ; >q `">wfed9 9 99&%( q q)&>oq`20=wo''ȕ'($%$9 > 3gwq"21w>bq 2;qwDgD*>wq ր%c">qc9> c(> qD"abq;!q"q>h q Ԩ  2+2; b 29FB}w; >q>>q .        % ;&{ 22J2>)? ? }wq}w 2 27}w>q;2!29>2y2;}w; 2 $b^ZV 4 2 2ytw2 4 ; ր NIL /3} 5%WW4Z4_dv  WRITELINh!-88 `08p8 >8j''m%%08p8 %%~x% " % % hwq j?h "  hjew"%`  ć?ć ? Nqq*! N<Ċwqw>q K Ke H7+77ććć  qw᥄PrKhK Ki! !j"?"""" " " " <" """"!9! H>qq ہKK} K KF> >9q>2wf`=kPjji>3qw-f j!wqq p lP"_j0" w 0" w$0#0#p0##pkl"j q =# 8  1#08p08 p80=#q >4wfq qfq"q!% > >qw1<w!q)Ze[Y pq'Km%x%yH%{|%z{%| %} K K` >O<:+ Nq e eG e07ȈHR "@?:^䂀^P^P 5  m%% 2 '_&%$i3<h8 wi!p!!i8!w!p!!h! p "p `p`!!!xą!x" p!!x 8 h ! x: x: ! ĭk! x!x!!x x xĊ xĖaphm%  h9 na&(& m% ' Ė "!'*89h 孁9"!'h 9 9ߖ  "! p :ձ p| x` p<|ʄʇ x` zp  xhb `6* x xć 'wp *0*.'wp*Ƈ$'wp*`66*  02Hh892Gj")9"..az. . .)"ѭ9 99'89cpj"79".c". c". Ą$".d"/.-/ʊ'/ʊ/ʊ/ʊ /ʊրe/9"ʇ/ʇ/ ʄt". Ą"/d"ɊJ/. ĭ9"0/0xć/0ć/0Ċ/.րl"//. ʇ/ʇ/ ʇ/ ʈNp"9 99ii!8c wp!h9~0: hx+ h  x x  y%xhh  yZ 8wp @"a+aa`p+`p `p j  c$9#l j+,i,ćxh  , 얁 @ C!h"  0Ȋ!" C " 0" j hߖ H!&h   ĈGG G (p#iaG arL aph  ( !&h x y  GHM Iwp9Iwp *`+*+ +  + * `GHG+ HG <    I  p`Iwp ` ?  ^C u?  ? 0Ȉ ? 0>  > 0Ȉ > 0Ȗ w0ZI ȭ  F^^Ոby0՘  Д ՘ b  CDCCDCCD - Հ ]h Ո p Ȉ՘  CE՘^^EEwOD! !  ! Ha`<ph GG <H Ip`IwpEGGxpȂ^h` ` `% `eI  iI ۃWI .I I !I i  I !i!i  "! pm! I phI "! p"!  I pi! !h  C`D` `I `p ` I ȭFFF<E^>#ՂC>՘ `?ՂCDC C!C &T$2'&%wp%%'&%wp$ h`&$p" $$` I^ IsI#ՂC ՘jb bI b>#ՂC>՘D>Ixxĭ ." jb՘ bI bAI u? d? @ @?jb՘ bI bIՂCDjb՘ bI bIՂCDjb՘ bI bG}y" r.n&xĆ# %i% !%'&%wp$ G" #&'&%wp&ր򇀄!DDa;̀<­`a aĖdcbat; $ $պ"=j" "k# # Syntax Error # Syntax Error: ! Previous error - line  {commented ';'}  {code omitted} 4|xB lines compiled in ,  lines per minute errors detecteddDEBUGINFw p "tg83XiRK*2mI"T <h Y 1*** FILEOPS STRINGOP HEAPOPS PASCALIO EXTRAHEA EXTRAIO DEBUGINFOSUTIL MSGOPS COMMANDI PARSEDIRwh! h $$'"#$9  # #Ċ%# #Į  " " ! Ė CB#CxCp!h  %  Ėuji  ;/;=kb#pa#p #pK8d;wpbd=pad=p d=p8d;wp"i!h!> 8 w`p!!Ċ !!p!= 92 p ȅhNn&p&xȅ ȅ &~  h bbp o       ؅ ȅhi    C x ح $9j" <!< h" $9j"":: "P #` h hրica a #:#:#, GF<ba a a ")-")-M՛d$9$1 w.q w<. <A4<;=.p7AA1&.wA w q w yjhGa !Xa !MaEa=6a.a&aaa a!!m  pԻ d$9.$ %.$%ʊ .$ʊi!! Ba7Ga"fa &:&:?a ր@  4vvHjo`^!o[F   FINALPAR:h!0! !j !jN! !j !j'jmlih"nk#&Ջ #o''!''x 'b'Y'x 'zx' 'ɢhm4'Ɉ 'zɐ'!'ɢim$#jl#n%]"nk#&$ #o'''#֖$hi{hCxi# # !#! !!"!yxy`#`x )ihz)kmn#%%m%x#knވ% ({i&8%x%yg$9' h(|(%(|h C(yxhj""j"!"!!" !!!  ȅ   ȅ ȅ  ȅ`ki!#d !R !zj""M"2xh'h    z" hۈ ! !튖큐A h  !!!M!2  ĉ5큐 f h  !  "ۀڡ   ĉX1i.ba"!!ll l lր$`a  `a `a !iea a a 1k#1ea ! a #n&&!MG @2$  !iaր $/1)hd o_V2 A5 /*9 _@ g !!!mh_LGB=8" րG0hK  @!h`ɒ`ɒ#ib!!p!!!8%h! 8!!wp! !!!Ė  `""M"2xh(h    z" hڈ i!!z" !kd a ` $l֒$$""!  !mk#%)b   ""#і6  Փ  zɅ"h ^ 3iii!ȅ ȅ""!ȅ ȅ""! ""P i.ba"!!ll l lր$Ԑ! "!iga ''o?!h a! h  p  h h k# #x#'o!''""!iga 'o`a  k#fa &#瀃'' ""!iga 'o`a  k#fa &#''""TG$`!ia$"!:a$"!1!ia'!ia!ia !iaր$t # " !! !  #!" ! !!  - h  z  ɦʖ@ C<Cx#mCx%{%zji" d o[R > /(" _)g !K_g/! vq! `l$$! @;61, ց0Fip ""qn   " "7DQ] p}1G@W 1@fff4?LYbmY{^ p ]"8ND -N ttt Nx\S )"DEBUGINFFa31!h0`Ɂ`ɢj jM""x!!x xĖi`zxy"! k#zxy"!#h  #zxy"!#h  `zxy$%`!`zxy!x 0(x4a(x'! `(x' ((xĊ((xĊ&(x !(xԿ! a" `"x! ""xĊ$"x "x mw!!x! # l# x"x!x#xll" #x"xh !"x ""x "x ludWG7) )9!& ?"(-TLA INITIALISYMTBLDUPROCEND ASSEMBLEPRINTMES   -TLA TLA TLA TLA TLA yBCopr (c) 1978,79 REGENTS, UC, 1981 TALLGRASS TECH, 1981,82,83 SMS  J INITIALIyR$ĆR Ć R%ĆR'ĆR9ĆR4ĆR?ĆR7Ć"R8Ć &R >Ć *R &Ć .R 1Ć 2R 2Ć 6R RĆ:R3Ć>R*ĆBR+ĆFR5ĆJR6ĆNR#ĆRRLĆVR:ĆZR;Ć^R)ĆbR"ĆfR=ĆjRBĆnR<ĆrR,ĆvR-ĆzR.Ć~R/Ć R 0Ė,!R!Ć"R"Ć#R#Ć$R$Ć%R%Ć&R&CĆ'R'DĆ(R(EĆ)R)FĆ*R*GĆ+R+HĆ,R,IĆ-R-JĆ .R.@Ć/R/AĖ;h`CĭW|jWvdWiJd  !!di!di!i!xJ00dJ0|Jv dv vFw0d"0W|qW}qk0#Ċ0W}0W|0!xĆ!0ĈWvWvWW @ ,(A*(-+ p".  P.`t `"v v vp W` }  }tG W sÆx tt fp3v pv pv pvpj" " " 6 "%!}t} E v pd'PdPdspd(d-d2Id'աId4d9d>d@dDdH Pd p`Jd *PdP MX  p(PdP RS  pphq d' ;E;B<;:98MD7j" vp"EGJ,IH]EF>F=?KGT#X [ b P;yPv pPfv pPvpP/ pPvpP/ pP vpPkv pP#vpPvpPvpPvp##^ qwqW ALIGN ASCII BLOCK BYTE CONST EQU FUNC PUBLIC PRIVATE PROC WORD INTERP MACRO ENDM IF ENDC ELSE REF DEF ORG INCLUDE LIST NOLIST ASECT PSECT TITLE END PAGE MACROLISNOMACROLPATCHLISNOPATCHLABSOLUTEOR AND NOT XOR MOD CONDLISTNOCONDLIASCIILISNOASCIILPAGEHEIGNARROWPANOSYMTABRADIX RELPROC RELFUNC opcode declared twice==LINKER.INFO[*]]68000.OPCODESS68000.OPCODES NOT on any volumee68000.ERRORS68000 Assembler [1R.1]]0123456789ABCDEF2Output file for assembled listing: ( for none))CONSOLE::console::#1:PRINTER::printer::#6:REMOUT:remout:#8:.TEXT.TEXT[*]][*] 68000 Assembler [1R.1]] Page  k %SYMTBLDU7ywcgih jc"x$"y"wi"y"y"y0Ċ"yh""z"wi"z"z"z0Ċ"zh!Ԭ { z z xP0v p0}n Pf P[ PP PE P: P/ P$ P P Pր P v p0}O0~q Pv pI塭IPvp!!!q PRv p y yk^`w w0Tew%0%%l$$$x00}0րX0|$Մ6PPq Pv pPvpPv pPvpPv pPvpPvpPvp!!k f ji f ji8"i%y6PPvp!!q `w^ AB  LB  PR  FC  PB  PV  RF  DF  UD  MC - | - Symbol Table>AB - Absolute LB - Label UD - Undefined MC - Macroo=RF Ref DF - Def PR - Proc FC - Func,PB - Public PV - Private CS - Constss------------>  >PROCEND Iy# i(!7qZ56h h:O 6  6q6 36 3!p:O6 67!76!7qՆ56h h:O 6  6q6 36 3!63'p:O633 636q63p:O6 67!76!76qWC!h " " xq XvpiDxQX pkh #;XvpXx%)j""X"xX"xq!i" 튿j"$"x$"xq!i"! !q%q qdkry X ph v x0b0}S;ՌPvpPv pP0v pPvp!!0i!_!zjPv pPb ɧ pPbɧ pPbɧ pPbɧ pPvp!!!|iI;Ռvpv p0v pvp0i!`!zjv pb ɧ pbɧ pbɧ pbɧ pvp!|iq,Xp0}8XĊ3XĊ+XĊ#XĊXĊX Ċ X ĊրX00}0 0hXĮX0ĮX0ĮX0 0X0 xĮXXp0 0 yĊʮX00 ĊfXĮX%ĮX0~ĮXK0}X ĊX ĮX0ĮX0~ĮX0ĮXXĮX0ĮXĮXրIրt0| 틂 X pon&'#XvpXxaX$a$7q&ז}EIvpq^ pX p6q ]E2D4q4765 4%2ą$52$5wBEIvp1BEq`w O5 `wOpD754375436$p:O 6qqD$qqi! q !qqqqq,`p`ć$Ą! p!aʇʇ Mʄʇ ʇ ʄقMCE``xq``yqĄaaxqĄxqq:` p6q X 0\ % 1BDJ%k# #xq#%qO66p4qq44$44$6qk:O#6 #6q6#XpXXX 0 D{qk#l$Tp0O $#j" O""pp:O6 6q6$튤p 0 qEIYPvpPv pP" vpPv pPvpP vpPv pPvpP pP pvpv p" vpv pvp vpv pvpJw%%% Fqpyp1rp0kp/dp.% X p^ p^ p w<Ę52Dqq1>)q1QqL0} q@%000%0Lq1q1Pq0q0ąEIvpv pq 1( q1(qq 3,X 0 >>>>> Referenced at: >>>>> Referenced at: ))****,[1R.1]] Assembly complete:: liness" errors flagged on this assemblyyAssembly complete:: liness" errors flagged on this assemblyy#Ru  !ASSEMBLENy,q1O9cPq1h 1Bqq1Oci !-.q-qH><^q03>-$>j3xh3 >"i !---,h1( q1(qq ;qjq5eq8 ;q 3q8.Ցciq8!8 8 c!8!iqAc+cq= cq c  c$j";Sqqq1( q1(qhq ;qjq5eq8 ;q 3q8.Ճ ic(q8,!828 c!8!iqAc:+c>qcBq cFj"I$j$|i${7h$$y#$ɡ $$y${7q7${q$ q^ą^$^vp$$!lil1MU0iK050~k0ą!q0}"0(Ċ$0},0*0Ċ0+ĊlLK,q=,~, q,,+Ć,Ć,}i,1Mqq$140#Ċ qKi14!4RF>ii!>q!>i!)>!i!jh "q !jh "q q1OAi!jh ";:  q q !!q  qq w0h   !x ąa# b !x.!xJ !x|!x0!0Ė5}(5=ą5>>h`q {K&qf q[^CqP=*Gq>=Nڅ5}QڡHq"] 5 5 55~Kx-Aqq1T q0}1! q0-ĆNw0Nq8 AN<haZ=4 Nwq5eqN488 q q,8. ha^ 8b8 a 8 h4aj "qanԌ4 N4 Ȋ NwN Ȁ,=q qxl>1q1(IqO>hj1>j1( q ki!#"q! ki!# bq ![iq1(Iq.h >h q;!i!1q 1Җq1(IqHih>h`q !i; !1q 1!!q ,^T>ID >6&>qq >q >q 1#%$&' "րrq1Qq:0} q.&%0hq1q1P Ċqq Ċq1Ӷ,q1O P.qq; <5<<ʭ><5<!> qm$3ᱡ qmm !h       *Ė* ]E E q1(qpX 33 Ė >q>1 111Җ. h x { y { {᳟ y x { {+q { y x] ~] y^ |`] _ bր x z }a y {+a*a`a i1`W11 1 pq0  ) 1րÐ i9 (i'hak`j#]"! n!mn! mC!@@i! @ @ n! @ @ m%ld% &n% m%l"n!m! n! m) & % րȖ zyxڭ 堭{yxh x y5 ~(  ~  ~ Ċ Ċր  y xĭ  ċ  |  {ċ  |  {Ċy  |Ċn  |Ċc  | |ĊP  |ĊE  |Ċ1  |"Ċ  |"Ċր A S1*} 1`*hR M H( <(**  *  (>q0} ր+ () *)*`.`1Pl-"/$/l/n*mnkllrn#mhi,~,,oikn,|lG0};0~ln0}m0}*j,i0on$n0ok0~ln0okn0}m0o0~lhց>ցmDk( ` ! . tN`r q]E1q0}1QP$^ 0~0}  q8)q88./q8W8LQ$8L q1 qN$L$0~0~m3q1Q0}M$<0~q1 N$+q3x 1q3q1Q0}M$D0~q1 q11)q+$᳟O$&L$1 3q& 3H>=':=(2],&1 ]h*3+3x- 1 )L$3L$W]]E1Tq7qm]W ڡTB  %`` ``ցqChOhgdڭhyhlQq ʊ ʊ  ʊց%R$0}R$kʆʆQW.%30S$0}S$ ʆ7q]QQWW]]Ehɦɦ#/WQ ɦ ɦ/Aq0}1QM`N0}0~0}hq.q0} 0}1QS$0} 0~ʆq7qp@0}q.%03S$>>%0R$.q0}1Q ʊ0}1Q ʊS$qʆ7q/S54)Uq&Qq ʊʊց%. Յ % Ɂڠ30S$ 3S$ʆʆʊh ʆ ʊ`R$   0R$R$ʆq0}1Q  0~ʊS$q7q/Vq%ɀN7@H 2S$ 03S$ʆ7q/|QqՄ``hDh`i!7]/!!h%^!᳡hb}!᳡hց 7%W]]E7q]W`UqQqʊ ʊց%03S$ʆ7q/UqQqʊ ʊց%RqkQWWE.q0}1Q5ɁSq0}0}Qqq>%30S$ʆ7q]QQWW]]Eh#/WQ ɦɦ/Vqq0}1QRq0~7qq>Vqq0}1QRq0~7qq%3S$S$ʆ7q/ Ɂ Vq+$Uq!Qqʊʊ ʊց%Rqhʭ% Sq 7qI#$Qqʊʊց% ʆʊ(  ʊRq.%Sq7q ʆ%13S$ʆ7q/BAmVq%.K %0Sq 30Sqʆ7q/pqR$]S>h%0Sq 30Sqʆ7q q/UqQqʊ ʊւ%Rq.%Sq 7qVq%Wq.7q%Xq/yVq%Rqh .%Sq  ʊ!ʭ h ʆ 7qVq7qqY$Jp(0}1Qk0}1QkK0~jq1"i"q0}#0}#1QK0~iq"!K"!lh $# K #  ۖ>1qL1QqUq ʊւ q0}1QJJ.%23S$ʆʭabxh b a  / >%.2R$ʆqJ7q"q/}UqQq ʊւ%.' ʆ%Sqʊ*ʭRqq0}1QSq 0~q7q]W/Vq3xR$>.q0}1QSq 0~7qq' Vq%0Rq.ʆq0}1Q  0~ʊSq7q/qn UqQqʊ ʊւq0}1QSq0~7qq Vq13x>ʊZq7q !Vqq0}1QMq0~7qq.!3x=*>qZ$W!Vq%2Rqʆ.q0}1QMq 0~7q/q}!Vq%Z$7q/7"q 0~kq8.A*q8Bk8Wk8Lk 8Sk_q0}h6g7c8_9[:W;SG?C@?C;D7 E3F/G+H'I#MNOPQR STւ R"; q Iqq"E*ih! !xh !i!;q  q"%DqDq"q1P<ڡq1(q"q1Pqq1(q$qq1M1N 1>11K%1(1"q1(qq D1h1UV 1A?MLMr1Eq h'#qq#ւH3q1( q1(q u3q K_ IF ENDC END ELSE ENDC IF END ENDC ENDC   END ENDM 59,^y~ >~8L^sQ,Q2zz;; P    JxjsaW}'/7?GO\0fRF+^9{!c9 a u r K 8 U N  |; )RShfW>qFF SF#{Y,PRINTMES)yP)`*P;P: pP`v pI;: p`v p+ 8TLA * y);EPvp߹fPffv pPvp!!Pv pP*vp!!I;?vp߹fffv pvpv p*vp} *`t` `;իPvp!!}P v pPvpPv pP ɧ pPɧ pPɧ pPɧ pPh pPvpP v pPvp#I;vp*P* r+ ,v v`v A °+/+<)+t^ ^ ^ p E e-+(*t^ ^ ^ p+t;! +j"i`a`a k PHv p   Pvp!!! `b(#hbՀ  ᳟_$hJv p` ɧ p`ɧ p`ɧ p`ɧ pvpO'`;B" hO'`ȅO'`;B |p.p p+-ih !g }Y; PvpPOv pP v pI;#vpSv p v p  튓+- x+w*o5A55 *p5f*톃5p*톃fp/5 *p5f*5p *fp;I'vp< p"vp> pgIPvpPvp P pPWv pP#vpP pPv pP- pPv p;I8##ȆPZv pPv pPvpPvpPvp!##5"";I. p"2;!!!  2=2h2Ȇ2 Ȇa2pa2ȆP\v pPav pP^v pPv p5ee85115a5pa5ȅP# pPav pPvpP pPav pPvp 35s"h!L P`ɧ pP`ɧ p!P`vpP`vpP`vp@P` ɧ pP`ɧ pP`ɧ pP`ɧ pBP`vpP` vpP` vpP`vpP`vpP`vph6B:O6 666363OOp6677O6!ȅ667655454;Gv!h02)2`ɧȆ2톉`ɧȆ2 2<252`ɀ0Ȇ2`ɀ0Ȇ2`ɀ0Ȇ2 2 b%xabx"j;#`axĊ`bx$$lb2[2*p$2` ɧȆ2톉`ɧ$2`ɧȆ2`ɧȆ2 2z2s2*p$'2`ɀ0Ȇ2` ɀ0Ȇ2` ɀ0$*2`ɀ0Ȇ2`ɀ0Ȇ2`ɀ0Ȇ2 2#Gbɑ bɑ G <5<<<< Da*5"x#^ ą^!^vp!p"!"x5""xĖ+ Ki#h].d^4<_}Ć_<ą | w.db}>.d7<bąb<ą | w.dր``a#.b j""Ćcwc5ąc" " cąa1y0r /kրր]E`!  3?6( )9( )*()()>?.'(&*9( )?6 } $p"pf *pp5f*5p *fpE jN#x ##x8189(81ixhՀxN!N "N ;1" N "jN "N "jN ,"!i hf N pi !hN 8 8; xNg! " ;5" "j " "j ,"!i hf pi !h 8 8;8,#xą AFA 45AN4,N4 8 H5e5Ȇ5854N4 8%F M8 F,f N4ph5 f5 p5 4 8 5f588  A 5A N  8%F8 F8;8,ZF NphF ph5 xN xA^8 FA5f5 5 N  8 ΀ 55f588  A**A*?* 8=* H*** 8 F=*f *p*(8;F*f *p* 8  ր8 8aA ,-PcP8=8_48A -87Ȋ-80cWWcP W- WPc cc88jj jjրjAP-"cIccWW-P Wc WPۄV cʄVcʄVcʄVcʇVucyccWW-P Wc WPhi!c! . c!h!c   c ccccqccWW-P Wc WPi!c!!VcʄV cʄV cʄVcʄVcʄVcʇV`cOccWW-P Wc WPi!c!  V!c!!ۇVրah8& 8_88 a 8 h -hJJ / h aJJ! R xA1RՎ"#xNxN4 4* **1(3E;塅  Iv1LՇ?#|%o?/PeP8 8 !/8eZZeP Z/ ZP8 υ('*&6e pXX Xծvffv v v vv v ev v v(v vYv Y6Y^ ^ p6e pXX&6ZZeP Z9U Z e(*(I;vpffv pc<h8@& 8_8H8 c 8 hjJ  h ""c j"c j"j"xJ00cJ0|JՓgwc w w w  wցP0o'''' ' 0Ċ" w ww00ĊցV0o'c''"xĆ"0ċ0}-՘"- t 4Ċ *8  +ą-+0~0~NN I(pH 8:M0}0}!QA dikh #x,#+j #xj+,-j8!d!8!i!'JJ,",dJ,,ۅJu- (pe ?,,-,p++# i!(!!x!熃, (d(,((ą--NH8:A g|OF+aP Ph+ P8 D8"8" A+" +(a8Ȇ,,P ,a ,P hF8 () P*|1(HS8 H8 (8      (*$8089A 8/Az8+8A]8-8(A?:50+&!8>A ց1S "!h "!k"k! ! j! j! j=^ 6b P| u%E9  1B内^ 6 P error error Last error was on page:  at location: This is the first error( (continue), (terminate), E(ditt * location >>>>> $>>>>> $Page  | | ,#'Wdp  ~@.T3   Error -- Volume not onlineeInsert  then to continue  Or type to exit. .text $'-  !~h@'m3:! - c l  7 6 6K`FW* EXTRAIO STRINGOP FILEOPS HEAPOPS PASCALIOMSGOPS SCREENOPCOMMANDI %+?A6DHI.JzPDTdCODEGEN GENPROC DUMPPROCINITCG STARTSEGFINISHSEIVMGBLS IVMPVTS IVMDCD1 IVMDCD2 IVMDCD3   2CODEGEN CODEGEN CODEGEN CODEGEN CODEGEN (,( ixFCopr. 1979 Regents,UC; 1982 Software Const.; 1984 SofTech MicrosystemstemsCODEGEN ix*a+Pwpaw pwpwp paw pwpw pwp`w p  p,)`*Pwpw pwp`w pwp+S14 ph44T19y i?kj"#.1" p h1"! p h"?!!1p  u10 00!h`ˑ`ˑ!h`˧ˑ`˧ˑ`˧ˑ`˧ˑf'2j'ˏik"4վ''i%Y)d ˆ1!˧dˆ1!˧Ȋ'dˆ1!˧dˆ1!˧&$ĊW&xl)1!d˧Ȇ1!d˧Ȋ'1!d˧Ȇ1!d˧ȋ"3M13 pk34 .1" pk# :"%/1!xldhddd &$Ċ0&xldhddd ʆ1!$Jw p420k71˧;i117˧xi16xj<" to continue, to exit...>>>>WARNING<<<<error writing code file....reading past valid codeerror reading/writing code file copying...3segment contains machine code <> target native codetrouble getting procc"trouble writing segment dictionaryytrouble closing file...f J FILEOPS STRINGOP HEAPOPS EXTRAIO PASCALIOIVMDCD3 IVMDCD2 IVMDCD1 IVMGBLS  %GENPROC ixH=2wpw p. p="YɊ` ` `  ` ր4` -` &` ` ` `  ` ր i!xą ! !"ʅ  k! h i!!"h! ʖIh i!!:h! #! "|h i!!eh!"! ʖh i!!#h!"! #""! ʂq h i!!#h! "#hh'% i-'+ i'0 ii j""'h" &%#$!h i!!Ah!"! #"᳟""'&%$ =h i!!'h! !&%$"#Zh i!!$h! !"!#ʖh i!![h! !&%$"#h i!!!h!$!"! #h i! !1h!"! #ah i! !&h! $!"! %#h i! ! h!$! #"'h j"(h$""h#""h$#$i#l!k" " " $" #ʖ{h i! !&h!%! "! $! #! h j( ii"")h" " ("#'&$%! Hh i!!'h! ! %!&"! # !$$$4q! ʖh j( ii""(h" "#'&$%!(##" ʂ>q 9h i!!(h! !&!'%$"#&&! ʂHq'%! ʂTq ((`"᳡"&""j(`  " ('"&%$#Wh i!!(h! !'!"&%#$'! ʂ_q )h' %᳡%D%%m))\ )\ %!)ii)^a  )!%( )B)C' % ( h k)0%'%(&($ (&$n&oo)0 j)n jj##)h# ()s'&$%" # ' )yڡ# ʂq f h j( ii""(h" '&%#$! " ʖ M **]'& *)( $h j*o*$ oi&**I i' ii""*h" " '")( &%#$! " )& " ʂq)&" ʂq  +& 4$$᳈ )ɡ$*)x)$ & $ +*)(' h j""6h" "+*)'(i""" " ""|" " """"!&%#$ " +& " ʂq+&" ʂq h i!&!%!$!#!"ʖ ! #ʊ  ##"h q l lj)(i(i (i& 9&4k * & *o n$ *$$#'i&&hk  '( * & '* n 'ʊ> 'x 'ɠ' * ' *o ' &n#() i$ '$'$ʊ iiր$&)!)`j$ ($)ʊ$ )$j!)%ڡ$$" $ ʂq  x Ĉ dĈ 0wpނw p wpq ʖ!!h Ɋ   րdklih!xj!x!hl"#!h"kր!l!i$ n x%q)x)ċqq)xշ)xh. dn"mj oi!'".!dj!"%x՛% )  % )ʈ ) %ʈ )&Ɋ&%ʊ &%ʊց,%Ĉ% d oi!'.!d!鋮l&x&ɊO) &z ) ;0 &&z)_     &&z)ց4&&&&&xk. d h . dx#$#$)Ĉ)ddĊ<qցM( )ɡ)  )ʖ #i!ɀդ!Ɋ!h !hցS x "h "#m" ɡ Q!& !!z ! !!Ċ     ʊ!ɀHj"h "#!ɋY  N!z"  !z 6!%0 !!z _    #!  !  !z!{  !z0 !!z!_  " ɡ     !!z o!{  !z Y "/ !!z!   ʊ !!z!ց[!! !Ė.$dkj#x#ɋY### #z . #z #%0 ##z _    P#x # ## #z # # #{ #z  ~0 ##z#_    # L ##z 9#{ #z# ##z## ցe#xb$dh#xi. d dh. dx! "!"#####ĭ"[h m. di!ɊP" d%E"!x d%$"!x d%ցo"j Vih!.!d!i!lj"$6."dm%Ɋ h%x hցy"k##x h#lj"$l."dm%ɊR"! 7."d$%Ĉ%Ĉ%"dĊ"! h"d%ց~"튎~ɀ⼀ۀҀռۀh i!!! ʆɀ⼀ۀۃ qɀ8ɀoɀx!%Ċ!! !$ċlɋa! !!%ċG% ! ʊ ! !!%ċ! !!%!$ċ$ ! ʊ ! !!%!$ċ# ! ʊ ! !!%!$!#ċ$ ! ʊ ! !!%!$!#ĊG! !!%Ċ+! !!%!$!#Ċցh ! Ėh " !Ė5h5h%zi ij!x*%!xz!xi%!xz%!z$!ɱ!xijj"%!z$!ɱQ`  k#!x! i#$##+?#%ĭk%'%#z%#z#z'!!n>k#7#x$wpނw p#wpq#Å'zl'n$&&i  xmoj"'%."d m"!o''''%$Ր& h ''ĭ 'ʊ'ʭʭxNx'zAh 'ĭ % ĭ ʭxx &'ʖ)`*P+  x Ĉ dĖcd q:!h Ĉ.d! Ɋ ɐ3 ɐ3ւ*!h    ĊN!.d!Ɋ.!ddĊ!ddĊւ2aa$j`2x' 7% ʊ '%&$(aajCa&&j$ oa ʊa''k%aʊaʊ%aʊa`2!4!h   z ʊ:q/ 7f7f7 7h igɊU hljm i< l j(m4h0lgj(m%)lj(milgj(m iւF f$lgjm.kk' Ɋj $# $"%!W # , $"%!#, $"%!,-#,$"%!# ,$"%!ւPf! !`7aɀ`$aɊ1aaʊcaaaʊaʊ aʊւZ`2ih(n&Ɋ/&xh &zi&xhւ_!A'n&Ɋ4 i3i/&x i&x iւg!($'$b((''b *!g7 7 c  ggc  ڡ )- )-     7   ʊ  ʄ  )- ʋ g: hj ɋ   ʋ)  ʄ  ʊ7   ʈ ʄ   j8**     ) Ɉ ɠf  i h !ʈ  ɡ  h    j     ja  )  ʊE* ) ʊ&  )  g!ւq"g g2R!"ath  "ath k!k"h Ɋ@ !ɰ z!z !ɰk !ɰ z!z {!{kւ{"h&(l$btk#⼀ۀۃ"'(z#Xʄ##ΣC#ʊ ʄ$=!ʄ$bt$=ւe7 7e>ee   >s'fi!e$ɊJ!/ 'f/ (! /' f/ւDŽ !e!th 2e2 ;# a7b #ka2<e7fb  ] se$fhbɊa]  Wa$] b b =] b# -$] #] b#da!ւe2 #$hji#`"#"!i"j!"!#xm$ d7 7i e*& d: jeɋB" &`Ac & "ʄ ! d? "," k "ʊk  # "  #"i B" & Od$B"e e 7B"e& )'B"&B"e&gd!ւ!  "ʄ 2 &a7e7fb#ɀ'#o'#ˏob#y aa$ a gb +h >  ʆ%(( (g > b )e$,f  fb"f # "fb ɀcf a!e2G&`7aɊ""j H `$Ha ւ`2~&`7a"j`$Ha a `2&`7aɊ""j E `$Ea ւ`2' a7b#k5eaa$ea gb +h Eb )a2 ' b7f7gcɀ($ ($ ɀIiifb:ghcɊh!  _! $ Sb$! c c :! c$ +%! $! c$eb!ւf2 F("h Ɋl! c! z V"$!  A!  z / {! z!  z ւ"!("!F    x( Ċ& Ċ! Ċ Ċ Ċ Ċ Ċ Ċփ"$!"H"!'* 77 AɊ0,+,#,,, ,փ2Ɋi iii iiփ)! ii iiփ'f  f&(dtk#⼀ۀۀ$'(z t#mkm##!i iii iiփ6%&$,j aI!"9"h #  aI+jggg !"  ")f2*`7&$,l$'(a   `!Qa"m%԰%հ"%"$(`$Q aɀ$$`!6+f7 7&$,h g"Ɋ,( ,( փE6 b  ffbɊiiփI faI! , e7& %l$cq$bq$lf&#''"$'#aq'(!,i!e$"# f '(,if #f "# !2 f  $$f.  e!$$"# h ) aq'(!,i aq $$"#* ,`7aɊ `$"jփMd7e&*d$,e  eʈ ed2;`28_-a7b#*a$,b  bʈ ba2;a7"h #  bɊca$ bRb b#  #b*$ # b#dփWa!bb ka2-`7a"`$ a`2%%5@;-aaj% aʅ%ka`2q. d7heɊ,d$h'exhgxha d _"k##e ej #ʊ gj #ʈ #Ɉ "i #ʊi!# " d2 2 .`7d7a`$ed$`2d2.`4akqa"l?a1`4axqala"lqql$(`4aq$"laɀ*q$q/>&U><>0 >> >mh %   >   (b>kba2a2/`4ama;al`4%am$al`4%am$al$q%q0&(aaj`2 0&`7(1 7f7b7c g$($,b2  $gf$b$+i+h cH gf$fcH ! )>  ʆ%((%( (g > !)b21&W(aaj`2<1&`7`7(aaj`2L1&`7W(s1ɀ &`7(`2 &`7`7(1&`7(1&Ɋ2`7aʊ+Uaʊ"UaʊUUaʊUUaʊփ(aa>jj`22&ɀTlaaʅ%jaʘk(`2Ɋk`7`7(jaaʊYTl`7jaʊITlTma$%$j%jaʊ*TlTma%jaʊTlTmajք(a`24h"x"x| h !h!0Vh!NKE?9/-'> ք3!|$h! քMk! h! քTA!h!  ք\$!h! քa!kh!cdtɀ⼀iq',%$,%ʆ((tɀ|qք!*h!" քT! h! ք4!!h!>>> >ք !hք  52h 4q h q5&9mɊFɀw%m$%(%l1($lɀ%m(%m#l`7`7`7ml(ք٭%$cd aʭjaʊa`25&`7`7(6&ɋaaʅ#j(`2`7aaʅ%j(`2%l$`4$"la\q$jq`7(aa>j(`2r`7aa>j(`2\U`7(S`7`7(I`7`7(?`7`7aaj(`2&`7`7aaj(`2 `7`7(օx6i!!Ƀڡh /  @7i!!ɀ⼀ۀڡh (((D9jʅ xoxi!% ,,zi,h,ɤ ,x nx&xx ",ɢj,ɋV'hQ!n,{! ,{!n(`,q)'i'h,x  +!+,+- ) -ʊ-,Ɋ'h 'iֆ,Ƀ ?m,x%5,x,,xxĊ ,x,x{!!,,xxĊm,Ƀ ,x,x,|,xz,x'iB,|l,ɤ ,x'i*  $k#-* *# ֆx}(!q&x:&w p.(p ph   h   h  ʈ  ވ ʈ ʈ  xĆ ą   ĭ ĭ =jt&'''z- )q$ɀ⼀ۀۀҀּۀۀۀۀۀۀۀڠՑɀՠɀ ɐ5ɀ/6qɀ?ɀ/6Xɀgɀ_6?ɀoɀg68"ɀwbɆɢ5;9ɋ5%5%%5%6%6%68%6%6%68~ɀ%6m%$6b%$6W%$68HXCY>%%5;908)f$feON[ ]f%%5<P\GCDJFE5<5<<?@BZJ`af &h$,~KzLvMrbn &(gQc&( nX_TfP&(I^ERAV= n7S30q*%$m$k#jl &hkjlֆAֆF(ɀ⼀ۀۀۀۀۀۀۀۀۀۀۀрּۀۀۀۀۀۀۃn Չg ..@illegal byte dataP(U illegal shift countillegal bit numberrillegal quick immediatebyte address registerlong immediate...  `@long immediate...long immediate...byte address register....long immediateebyte address register....#illegal register for instruction... ==illegal ea for instructionnReg D:: register left sign extendeddall regs already allocated...register already allocateddcannot free reserved register attempt to free reg not on stackk -#4~c!attempt to generate invalid pcode~ BBB REG: DD reg left un-freeddemulation stack overflowwword expected on stackkVouh0<operand must be on stackkoperand must be on stackkexpected body of settexpected set on stackoperand must be on stackkreal expected on stackkbad real popped from stackkillegal pkd pointer poppeddoperand must be on stackk&$jump expected after start process....#NOP expected after start process... gxproc parms must be on stackincorrect parameter countpoperand should be on stackkerror in multiple word blkkI1{@+transfer to non-forward, non-empty stack...@>label destination not found gen illegal pcode!cannot iterively code generate...++2H`j>qqNSS%DIRt]]]]$$ggglllgbbbbbbgXbbbb gggg).bb3;gnK O;B[]%]A& w^ X> t q g a j ] W L A - r ~ ZF)_&U3hDr& jDUMPPROCixH=2wpw p. p="8` 4` -` &` ` ` `  ` ր i!xą ! !"  kE jilph r m"%ɢj%ɋHܭn&&"&"!&$$l$l%zxq%zĈܭn&%z&"&"!&ċ%ɀ)ܭn&%{&"&"!&ċ%Ƀwܭn&%|%ɊH!i&ĭ$ok#'# (%|(#݊!i&Ċ &Ċր!&"&"!Ċր6%xh%l ܭkj#zxh ?q {6 l$zi$" j!xh Gq$Ċ"2""l$zj$!$Ċ߈ܭ! a x#x'###x%ĭ%7 y#y'###y%ĭ%  e x#x&###x%ĭ%: y#y&###y%ĭ%  "hi hmlk!j"<"n&&y$&&x#&{Oq րY"j%$#Ԩ?iha˧$#"q  l420i!nfɦ?o'ɋ('ɀ3''{$l'܈'{xy$yċ$l$l$y!'{'z j"(("`q܈ xy!h"`"ҋ'Ƀ`Ձ$l$ '(zĈ܈(zxy(yk'ɊC'#Ċ=## '#Ċ!#''Ghʊ'#Ċրbրgx )`*P`w p+ހ, p wp2ޮwpހ: p ހ  pޮwpހ| p  p!!Ȳ qqU!xh  zq4 {     ! ވ w p7 chhhހ: pހ p ހ p`!h`qN q8 ˆ)`˧Ȉ ˆ)`˧Ȯz!h`` P!H B 9 0 '    րހD p!wp/$jhi!6b!' h #!! !!!Ė &li%$ j$k$|h$ j$k${h#"" "  " ~ " g  " M  " i6"+ )    i րր!W%+$ $$   )$ $$   ^ 'mh&%|i%k% j%{i%k% j##!!h"!qhրր ild!&-d %d % d%ʊ+d %d % d%$ Tɋ P P Px Po Pf P] PT PK PB P9 P0 P' P P P Pց*+&PTɋ+'P+*P+,P+0P+4P+7Pt+:Pi+=P^+?PS+BPH+DP=++h`F `+Q `P+GP+JP+MP+OP+RP+TP+WP+YP+[P+]P+aP+eP+hP++h`k `+R `Pj+mP_+pPT+sPI+uP>+xP3+zP(+}P+P+P+P+P+P+P+P+P+P+P+P+P+P+P+Px+Pm+Pb+PW+PL+PA+P6+P++P +P+P +P+P+P+P+P+P+P+P+P++h` `+Q `P+P{+Pq+Pg+P]+PS+PI+P?+P5+P++P!+P+P +Pւ+mS`TɃolTɊ``**`P *qR *PC`**`P *sR *P#`**`P *uR *Pւw``` p`` Ti ?i|i`i0iii@/i@ii@.i iaii@iiPiy`irik/ic@i\AiU@iM@iFBi?i8i1Pi)<i"i@Oi@Ni >ii i>i@iNix>iiPiHi@i@~iHii@iJiDiPiNi}Fiv ioNih@ia< iZAiS`NiL| iEPNi>@0i7@ i0@i)@i!HiqNii HiFi@iiiiHii@ipii|i@i@?i@HisNiHipNi{wNiuDioihuNibi[@niTJiNPiHiB@NiC BE !| 5! F ! ! I փLwp#!!!!h``  wp &m%%Ɋ[%{X%{R%{%|H%{%|>%{%|%}0%{%|%}"%{%|%}%{lddփfވ w pp %`s`w p%ɋ%ɀ%{ %Ƀuކ%ɀoxw p %ɀ %|%{ k%ɀ⼀ކ%{xw p%{ %| 6%ɀކ%{xw p%{ %| %} փ}wp h16 qq q q% wp wp%`J=p`JȆwp`w pwpނw pނw pނw pހ pނw pwpނw pކQ9w pނw p6wpނw pހ  pނw pwpނw pޮwpހ  pނw pހ  pނw pwpނw pހ  pނw pހ  pނw pwpނw pހ  pނw pހ  pނw pwpނw pހ  pނw pހ  pނw pwp`w pwpwp%  ph Ւ i!Ɋ8!{ !{!  wp!z!>+!{ ވ w pނw pwp  ք!xhh0wp w p  ..label defined more than once!!Tj/DZq1{{?Gz^illegal instruction `##-((),-(()()+,(()++(),###SR,,CCRR,SR78#@,CCRR,SR#USP,,,USPP9Nooo5b*1*8m ;p-code u  ˇȄ   ˧qqwpwpw pQ9w pwp(w pwp*w p1xwp-w pwp9w p19ywpIw pwpwpNq19ą 9 ʆ9xR9xn949{#1& pfqqӖ!trouble reading relocation buffererror dumping alt_bufCompleted segment   of  procedures translatedd segment size in words before , after /Destination code segment greater than 64K bytestrouble reading interface IVMGBLS teC%-rsr *** FILEOPS  -IVMPVTS )teC6"i`a`a kP  s *** IVMGBLS  yIVMDCD1 teCtla VK@5*"& *.26:>BFJNRVZ{^qbgf]jSnIr?v5z+~! ր#wlaVK@5*  {qg]S#I'?+5/+3!7; ?ցC5imquy}wlaVK@5* {qg]S I ?5+!! %ւ)!⼀ۀۃ[ a!c! eR!/ iC!? m4!g q%!o u!w y }! !ƲLDCB LDCI LCO  LDC LLA LDO LAO LDL LDA LOD UJP UJPL MPI DVI STM MODI CPL CPG CPI CXL CXG CXI RPU CPF LDCN LSL LDE LAE NOP LPR BPT BNOT LOR LAND ADI  #.9DOZep{SBI STL SRO STR LDB NATIVE NAT-INFOINVALID CAP CSP SLOD1 SLOD2 INVALID EQUI NEQI LEQI GEQI LEUSW GEUSW EQPWR LEPWR GEPWR EQBYTE LEBYTE GEBYTE SRS SWAP TRUNC ROUND ADR SBR MPR DVR STO MOV DUP2 ~ #.9DOZep{ADJ STB LDP STP CHK FLT EQREAL LEREAL GEREAL LDM SPR EFJ NFJ FJP FJPL XJP IXA IXP STE INN UNI INT DIF SIGNAL WAIT ABI NGI DUP1 ABR NGR LNOT IND INC EQSTR LESTR GESTR ASTR CSTR INCI DECI SCIP1 SCIP2 TJP LDCRL LDRL STRL CNTRL EXPRL &1ppGih- v&! Ě, uhh!ih !ԽpY X "˧h "˭ !˧ȭ ! Ȉ "xh " !xĈ ! Ė=%i!!k#j#$U"$! #x "x"h#h#h x !x$k ! i!!k#j ydgtm%gth'Ri p l$ 0%$gtj"!i !$Ȅ !"$l! l$ $!ː$l! l$ $ $ː$l! l$ $- $˧ $x$l՛- !˧% !lgtk$# $x$l$- $˧#$!- $xĊ-%  !  -pah-x & p dtk#dth$'' վ&m#'dtj""#բ"-xˏ%%%"%"dt%x""%""%x 'ˑ %"dt-vp       wj\H-i!yh ˏ !x -vpj " p"Ě Ջ-" p L-vp   p-" p"i!|h!`˧" jՄs-hi!y x y -vp j #p )-vp   p-#p#i !jh "! ! xu h+jh "! ! xu h$!|!|!~!~ !| .CODE l; >~g~JSTRINGOP FILEOPS EXTRAIO IVMPVTS IVMDCD2 IVMDCD1 IVMGBLS  =>o ?LINKERPRPHASE1 PHASE2 PHASE3 BUILDWOR <LINKERPRLINKERPRLINKERPRLINKERPRg5CCopr. 1978,79 Regents, UC; Copr. 1984 SofTech Microsystems, Inc. *Y);<PHASE1 g50`"!`tqc( ##Pp# p(  # pP# c(   PP q ((i6   dӔ $1$#$ #e! q' # qъ чЇeq i$e $#&@$cf$sv$瀃$瀓@}}Pj(hf"塤e"yf"&qe"ye"xe"x .q&"q 5q( j"j"p( $!Շ < # q1 6#h    D  5% ccLcS([ ccrca ccbc(i ccrcaco pccašx +Pcr+a)++지. ++ ~+P+ 1j"xi"1"!j"0x"h "ĭ!ĭĭ c!ĭĖ*k1m%ni!գ&c!Ռ%!ː# c #*# #xk#"##&瀓!x1l$oh @'c -%#!'瀓 $ ː"#z}#z" 튺$xl$0Ұ!V%xm%0Je1k#Fl$:#c$'b "3"#"$"""3"$#xk3i!!}h!3! i*43 qq%* *m%33}%z%%ĖĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆĆ Ć Ć Ć Ć Ć Ć Ć Ć Ć ĆĆĆĆld˧"k###x#b``"ϖI*(+aP}aP(q(q(q in workspacee.CODENo file Opening segtbl read err Bad seg dicttfunny code segg bad diskinfoo bad seg nameeAll segs linkedLinker [1R0.3]] in workspacee*SYSTEM.LIBRARY Host file? in workspacee Lib file? **SYSTEM.LIBRARY Map name? .TEXTno host seg in host fileec C~=PHASE2 g5mh+ (xyh q !p !ĭH!h q q |  ~ ~q }q |  qx } } ~ ~#qT } })q= |     } } ~ ~d0qր7 &(x$$(y%$瀓(y&$y%x(xĊDq$c(yJk(| %y&yl%yl%x$l6(M $#(y  #({*po''q'넁p(n' Rq4j#_m%; a  !p({o'!'q'!!%mi!!xh!! i&(#b " "(q  (""!qh {`q k9& &z&y&x&l$m$| $}$} Xq$}i!i%!%!%xh%%%% j kc-%c%cx"c "hc^qcҥ% %z%z%%jq(x(yyn&mb a% k# rqP(xy!%(x(yx% zq-!q h o 'l$$ q(zb  I*j"9"zi!-!|!!! !ր!}i"xj3i!!4 !}i*z|*z3i!!!}i(q li read errnon-alpha namee too many refs bad formatt bad private bad globdef bad publicdef bad proc/func CCCCreading code seggReading bad litypee bad proc ##illegal relocation typeproc place errrsep seg too bigsep seg read errr bad proc dict9 g>BUILDWORg5s!U!z!y!x!A`  !    ĉ Ċ !  h! k!p!z!y!x! [!T h  z! p xh`  !        pi qmi!R!}H!z!yj!yj h !{ { y" ! Ęh xh xh!} !!{z!xi3i!( xz"!zq h  x ĭ x!Ęi!}iԖ%h3j"x{"#{U"}jxi!{#{$#y z!y z5!h!xi!*!{#{"!h!xi!"!{"#{ "}j!Ҷ #xĭ#Ċ# x #Ė(x՜(xk#zl$|#ċ#$ zzq # zċ#$ zzq #y#y # zċ m%zn#%y%%y$Ĉ&x瀃&y##z#%zĊ_ #y$#y $~  $ q1 #y$#y $~ $ qր(xj("x"yd"zk#|F, ;0 -4 8 ; ր># Iq"y 'x" "'x'"ċ] u(ՙ(z (y (x (n&|Հ&~k&m%u#l#k#l%$xji!}>!y o"'z9/"'z'%`  (     !xi!Ҷ$l$%xm h i!!{#!}!hi!xi % i!{ {j"!xi"!#z  xh !!4!z !y !x ! !`  !         j z|"3ĭ "z "z &  3h  }hխ "z    i! !!xi3h  }h missing proccProc  param mismatchFunc  param mismatch !S Global Public Const Proc Func  undefineddc=C < n PHASE3 g5(#"xh!`q ln'h&i !%1 !q !%k !q!i#lj"$ !q!i"Ɩ&h%i !$k !q !$j !q#"&""$4(h'k #&j #q "&l "q$$q$mi!%% "!&( "!&& "!q! #& ( #&& #q #q E! !j jp n& m% qq%p qnxy& & qq qj"" qq" qi!qhx )c)瀓ykk#q #q o('#p!  l!$!$q $q o('$p {o=x-.yo-c'-瀓yo.x lm%%$l% ij$k,R,-y (. !.xi".x.xj#.xk-~( -x !"#h !!i""j!"#h'(  'qq  p!"qq!!qq""qqqqˤ ,A,y -&&-n,~%+ˤ +1qˤ ,+,x +qq  p q!x!yx!x!yyh  9   Rqq  !"h  q k!" "" {xy  Xqq""  `qq"q k!"  qh{`q ijc  i!!{yxc  ɇ{x瀃{yq"{ c c { 6<o | u x   xyxznzˏyq 4&  ./-,p,-,/q"{/xyxxnxˏ&   ɋ zyq׋{ zyqyx{qq x q+ q+ +q|M zyq׊ րyqyqx瀃{x瀃{yʇy~q!xi9c | թ +z ,|,.ᰤ '.+y  z.-x瀃-yɰ ր+|x瀃+|yqo*L,|Y+yhU+y +}y yh'x q h*,|+}h+yh  h'x hր,~k, (#j#k#j("xi/ )Wn m%%{+|%nm%xm&)6&{+|,&y !-z!-z- !-z-yi &xnnn)Q,}2!ql'x dq$ ldq$ l$!q !qր,| !q"j"9(x +xP xi z!瀓 y!cʭ!ĭh  qq!ĭ  j"xk #瀃"y ,##"y   h    Ք yj " "|     ~  "y  "   xhfi!!h    h    ճ yj " "| "} i "} P  } 7   }y  "~ ց  xhG!  o'x f (瀓{h Ց   je"  9qq(sxl(s "k1y%#$# Hqq%## Rqq$#l# #h ҵ (sf  b k#xl#y˦6E\ $# a $瀃  (u+c#|   i!F!7h ! ! q!q!튳b bi1h cpc $#@dcts瀃瀓@ 1܆}Mx0 jj"ԇxhc!dq"i 0jpP l (5@p ctqr55%фћG тwO  pLpsTфт| ф PTPTTP PTq(.j+cR+ pA + p+s +  +cP* ,Ճ+c/ ,z-x#-y  ,z}--},z+c" ,y   ,x w1x 1y 1x1y (     P bad proc dictno mem room for output segg seg read errrbad code segmenttoutput seg too biggproc num ofloww0LINKER,PHASE3,HEAPOPS,EXTRAHEAP,PASCALIO,EXTRAIOO out of memmreading sep seglinker error reading sep segg Copying proc func )relocatable quantity not on word boundary(ref to non word aligned addresscode write errrSeg # Sep procss  proc func # base == leng == Sep proc refss Local seg refs public LC == const val == privat LC == glob def in  @@ ~{{0LINKER,PHASE3,HEAPOPS,EXTRAHEAP,PASCALIO,EXTRAIOOno mem room to copy interfaceinterface read errrinterface write errLinking  # Code write errrPHASE33 Output file? .CODE[*]] Code open Error opening , Link map for next base LC = PHASE33c@e@:V9 LINKERPRhg5*a+Pa    v` &22 11x 1y 1x1y  ҳ((,vp"Δ p"xi`a`a" Ė! j"!`p k! "Ȗb! p$jh ՟" k##a"` xa"` ax"p a"瀀 xa"瀀 ax"` 6"瀐 "瀐 "瀐 "瀐  Z""Б$$$#x#$ĊM#xi!h!$!zij!$!yij $!x!$Ęhi! " $Ċ $ĖPl!h . # zh # yh " xh lhΖvjh ! ˧ j"!h"!h k i i Δ wΔ  $Type (continue),(terminate))J=* yrme`NB SEXTRAIO PASCALIO EXTRAHEA STRINGOP FILEOPS HEAPOPS COMMANDIGETCMD SCREENOPPRNTERR OSUTIL  C16BITCOPATCH   2 =Copr. 1979 Regents, UC; Copr. 1984 SofTech Microsystems, Inc. C16BITCO#0%1i%0h ! i!i! i$! $0!!ikkj!$"! "j! i#$"-Ȗ`"`"!`ɧ!`ɧ!`ɧ!` ɧ!Ȗ  ! !Ȗj& '1hmj"%&"  h"j'0h&&0  hmj"%&"  h"j$%hki!#$! h!i%hki!#$! h!i$%hki!#$!  h!i%hki!#$!  h!i:0h1 h  jh " 0 h jh " A hia2r prp0r prprp Hr prparpr paȆah Pr p!rpTr pr p/sprp! ҙYr prparpr paȆah fbr p!rpfr pfr p/sprp! қkr prparpr paȆah brr p!rpvr pbr p/sprp! қ{r prparpr paȆah r p!rpr p r p/sprp! ҙr prparpr paȆah r p!rpr pr p/sprp! ҙr prparpr paȆah r p!rpr pr p/sprp! ҙr prp 00-327688   2DEBUGGING PROCEDURE FOR THE 16 BIT CONVERSION UNITT.TYPE INTEGER NUMBERS - A 10 WILL QUIT THE LOOPPCHARACTER TESTTNUM = CHAR = HEXADECIMAL TESTTNUM = HEX = INTEGER TESTTNUM = INT = OCTAL TESTTNUM = OCT = INTEGER BYTES TESTTNUM = DEC = OCTAL BYTES TESTTNUM = OCTB = FINISHED TESTINGGLgKr  EXTRAIO PASCALIO PATCH A#0nS+VPTusUUarav + +v v `v sW)`*Ps`v +/f0Psfv 1`v i`sj""UhDh LhRhր!! aAh !Zh k-d.P0d !}d 4kdhi dIhi 5d M!d 0Od xi h Qih!f0!0/# "PY# "PL"Pi#h#kh#"!# x!i# k "!-!i"!"!p"!Ȗ*)*`RpE!++*Y"ih !"  " " aA ޖ132sv `Pv v `Ն4w4`wp.p5ć5P32s@511ć1` 1`P1ć14ć1Ă32sv ]vv `Pv v `** ]1Ե*Ր4w*p"p.p5ć5P32sO511ć1ć1ć1ć1*ć1`P54 1Ċ32ss5RTSsv `Pv v ```**`P *Q *P`rUwU`wp*pVćVPTSs5V**ć*ć*ć*ć*` *`PsV>k"h {' x ypp psk9! yupskp0pskM允z pmh % ata ap ߆vBv v vpvpf pt mh % ata ap t vDv v vpvp_允{ plh $ ata ap ކvFv v vpvpg pt lh $ ata ap t vHv v vpvpo允z pmh % ata ap ߆vJv v vpvpf pt mh % ata ap t vLv v vpvp; 允 pnh &x at cta  aȊ cȈ ca aȊ cȈ c 튂vNv v vpvp pt nh &x at cta  aȊ cȈ ca aȊ cȈ c 튂t vPv v vpvpc 允Յ pmh %& ata pa p ԆvRv v vpvp允q pt mh %& ata pa p t vTv v vpvp 允Յ pmh %& ata pa p ԆvVv v vpvp允q pt mh %& ata pa p t vXv v vpvpO Zv p2ih !$ v]v pr ֊[h $ vav pE ih !$ vev p ֆvpFk#ipiFh Fե jid!ȅ#yp.#p#p#p#p#p Sդjid!ȅ# ps# p\# pE# p.# p# )pFij!k!kh #aÅ p9v  vGv vvp Upp 튙"eÅ!"p""pev !vsv "vvp ppjpki!#"գođ Mv #vv tv vp pY#kppH#, ld d,' d`v  Y yisT`$#s" v v '#s! v v 8#s v v s v vvv vv vv vv v v-v v:v vvGv vTv vav vv vv vv vv vv vv vvv vv vstv spvsvs v v svsv sFv  sv s v v s v v sE՜FFs )sFF s  FF F"F's )v vv   ;`v I QYv i \v i+"h!s Ā'!  Ā8!  ĖMi!_t!mso stv spvDs_sbPv v bh q p(q, 22e, 2,6 2spv |s8sbPv v bh  s v s奁 v v [(sbPv v bsv "(sbPv v bsv  sA  sFv  sbPv v bh    sv wog_Ws奁 v v -s奁 v v քs!Qrs 2.Msv v vh  s v|u ߖi0j" " "0k#0ե#sj"Ն"h#""i!dt!ft3 f p'd dȄ  Ȋ f p3 f p)d dȄ  Ȋ f p"s KKv #Ssdtft3dڡdu ufufu3dڡdu ufufu01s0N#`Pv v `000/* 22+/ 2*9 2s#10 C1OsN( N Y[ f q,pp p9u pp psv v sv vv vv vv vs v v v  v v v#v h  s  11sC0001s00s 0001s00sJ1011s!0I001s00s~00s00s1I101s0I1100s010s0I101s100i!#x#!#xjh " ! $ .(`Pv v `++++28CWs`Pv v `K+`S``++1+`Z+``ڡՑ`b`A *$`g`a * `0*`n`A **&`s`a ** `0***++1+ z+ֆ +s01s+.,,. )),.F00001s`v i`sj"W!<100!Ț!u u01s))10(01s"Ҕs01s)01s`v i`sl$թ ! Չ  0k"  A k a k aAh100j00""#Ȋ"""#Ț u01s)01s$>s01ss01sh %" ,-*&' ()և+ Q2.wwwE!*s .jb@! bQL bPjbg! bxO bPPWPۃOěO ěOděOěO'h  0 h  A i!P᥃tPsrqp᥃oFPEDCB᥃A*n"@wĆw솃wst/.Osv  aAռ  33 g#c$_2.2Js2.5""% !ֈ, CֈOQ .www > %Null string. Value defaults to zero.(String too long. Value defaults to zero..)Error in string. Value defaults to zero.2Integer constant overflow. Value defaults to zeroo-3276880  FILENAME : < c/r for Unit I/O > !Error opening file. Ioresult is File opened. Unitnumber : 4, 5, 9 ..  ( 0 quits ) "Error clearing unit. Ioresult is File opened. Filename: #11#66:!Error opening file. Ioresult is File opened.."Error reading block. Ioresult is "Error reading block. Ioresult is "Error reading block. Ioresult is | | | | | | | | | | | |  : : : ERROR in I/O #1. Ioresult is ERROR in I/O #2. Ioresult is ERROR in I/O #3. Ioresult is ERROR in I/O #4. Ioresult is ERROR in I/O #5. Ioresult is ERROR in I/O #6. Ioresult is ERROR in I/O #7. Ioresult is ERROR in I/O #8. Ioresult is ERROR in I/O #9. Ioresult is ERROR in I/O #10. Ioresult is ERROR in I/O #11. Ioresult is ERROR in I/O #12. Ioresult is ERROR in I/O #13. Ioresult is CORE DUMP Startbyte :  Number of valid bytes : ERROR in I/O #14. Ioresult is CORE DUMP Startbyte :  Number of valid bytes : ERROR in I/O #15. Ioresult is  Block number [  ] of the file ERROR in I/O #16. Ioresult is Error occurred reading block !Do you want to continue ? ( y/n )@@TrueeFalseTrueeFalseTrueeFalseDUMP : D(o, Q(uit  A) Input File  B) Starting Block  C) Number of Blocks  E) Read from Memory  F) Starting Byte  G) Number of Bytes  H) Output File  I) Width in words @ Flip Both  J) Decimal  K) Hexadecimal  L) Characters  M) Octal  N) Decimal bytes  O) Octal bytes  S) Space between Lines  T) Space between Groups True FalseTrueeFalseTrueeFalseCONSOLE::#1:CONSOLE::#1:Input file is not opened.CONSOLE::#1:PRINTER::#6:#Type < space > to redisplay promptsOutput file is not opened..@@TrueeFalse,Value out of range. Maximum block number is Input file must be opened first..!Number must be greater than zero. Input file must be opened first..TrueeFalseCOREREAD not set.COREREAD not set. Value out range. Defaults to 15..TrueeFalseTrueeFalseAT,uz6y: 0: 2: 4: 6: 8: 10: 12: 14: 16: 18: 20:: 22: 24: 26: 28::Blocknumber : /Blocknumber is out of range. Highest value is Read was successful..Read was successful..Have reached end of file.Read was successful..Already at beginning of file.$Error saving buffer.U. Ioresult is Block saved..$Error saving buffer.B. Ioresult is $Error saving buffer.B. Ioresult is Block saved..File : Length : Current :  Byte 0 = Most_Sig_Bytee Byte 0 = Least_Sig_Byte Open : True Open : Falsee Unit I/O : True  Unit I/O : False Unitnumber : Number of bytes : Number of bytes is out of range..What pattern : Invalid format.Invalid format.~~~~6Invalid format. Hexdigits ::= 0 .. 9 , A .. F, a .. f Ch007Invalid format. Must have prefix character, 'C' or 'H' 2CHARACTERS : , quits Invalid character6HEXADECIMAL : 0 .. 9 , A .. F , a .. f , Quitss~ Invalid inputX$CU!EDIT : D(ump, G(et, R(ead, S(ave,+ M(ix, T(ype, I(nfo, F(or, B(ack, ? [1R0.1]!EDIT : V(iew, W(ipe, Q(uit, ? . LTYPE : C(har, H(ex, F(ill, U(p, D(own, L(eft, R(ight, , Q(uittHValid format : C or H ~~"0The display will be in characters, if printable..*The display will be in hexadecimal digits..BVError. File not open. WJc%  \ P { 7 l  DylH :) /j~QE9 /GOTOXY OSUTIL STRINGOP FILEOPS PASCALIOEXTRAIO C16BITCOSCREENOPPRNTERR  O^TbpYg {$U-} { ALWAYS include this compiler directive. }  UNIT GOTOXY; !{ This is an unpublished work copyright 1978, 1979 } !{ by the Regents of The University of California and 1980 } !{1981, 1982 by SofTech Microsystems, Inc. }   { This item is the property of SofTech Microsystems, inc. }  { and it may be used, copied, or distributed only as permitted }  { in a written license from that company. }   INTERFACE "PROCEDURE AGOTOXY(X,Y: INTEGER); "  IMPLEMENTATION "USES {$U SCREENOPS.CODE} SCREENOPS (SC_TX_PORT, SC_PORT); "PROCEDURE AGOTOXY; " "CONST TELL_LENGTH_MINUS_1 = 3; )OFFSET = 32; "{ You may have to change these, depending on your terminal. } " "VAR TELL: PACKED ARRAY [0..TELL_LENGTH_MINUS_1] 1OF 0..255; "BEGIN $IF X>79 THEN X:=79 'ELSE IF X<0 THEN X:=0; $IF Y>23 THEN Y:=23 'ELSE IF Y<0 THEN Y:=0; ${ This range-checking is necessary. The actual (screenwidth and height may be different for you. } ( ${ This code must be contained in every gotoxy, to track cursor position } $WITH SC_PORT DO &BEGIN (CUR_X:=X-COL; (CUR_Y:=Y-ROW; &END; & ${ These first elements of TELL must contain 'the characters which tell your terminal to 'position the cursor at (X,Y): 'fill in the blanks... } $TELL[0] := 0 {change this}; $TELL[1] := 0 {and this}; ${ The actual X and Y values are usually the 'last things in the array; 'the order may be different on your terminal. } $TELL[TELL_LENGTH_MINUS_1 - 1] := Y + OFFSET; $TELL[TELL_LENGTH_MINUS_1] := X + OFFSET; $ $UNITWRITE(1,TELL,TELL_LENGTH_MINUS_1 + 1) "END {AGOTOXY};  END {UNIT GOTOXY}. DEBUGGERSEGDEBUG # DEBUGGER(gYCCopyright 1984 SofTech Microsystems, Inc. ; " "procedure enterdebug(errnum:integer); ${pass execution error# or -1 for non error entry} " "procedure setbreaks; ${called after segfault occurs, to install breakpoints}  "procedure update_erecs( dumping:boolean ); ${ called by associate (dumping=false) or } ${ by dump environment (dumping=true) to update erecs for breakpoints}   implementation SEGDEBUG(gY""h`!pkD" xha"ap Ėg*a+Pxhaap Ė,h         haexhap Ė  c/j. C/ /-hh'i +!/!  c/! h/!! i!ي7.3-h cb ɧ hh cb ɧ h, `e`  ` $  `f`%  $  `d` ` v  d d`#  d%d , d- ` ){!zh `!x j!xj!cp$cx`pcx`p"`i!a!z!aAi!#!#Ԝ"!!32q '% cA% A*c0%0!cڡc ۃ.!!cڇ!1ڇ!!ȇ!  u! ⼃4d$i  >h -i* +% 0 9 0 A%특!! ⼃7ڇ#"$  '&Ċ-z'! z:'&z Ė&>*zm*q d%x%ypa%x%$pph!nj"&,c%x%$"pp##k)#)# )#h(""' Ė h! y! yh j #${#x$"!,$`ab z!{"#y@ C x G y J  M { %"Ph A!A!Z ⼭ ۃTi! zᱡ"zh ⼭ ۃZi!  i!  h"   !" ! h! r "`k:d iTj  in ⼃ph 0 9 $ #" n A Z% n ! zᱡĖj!q`}!q j`d`v}`z#~q}`q Ėdl#~#"`#/ ,z zl"z Ė""!`k     " ! k} !! !}qj j..th/ +-.$+. ۃC.+. + . ++ ++`+ pP+ .p*.`+*p`+*ȭ*,f `%G u%u ⼚ۃVV-, i" ~ h 1  ! ""!i!i! """! Ԥ!k *a+P.avph -, ,-`'.`($**``p```(--, W.ZvxW&f..tT$Ma!i`!hj "!" %"j" .vWĄ.vW h88xĖ #`*`*ʊ|*h ` `*ʊa*h `ʊO*hI7xhk>7x7x 7xh 7xﰮ7x 7xh7xhրޮ3@",#-  9yx 9y xii! !z  l; `e3` $F6,Ċ?6,Ċ56,Ċ+6,Ċ!6,Ċ6,Ċ 6,Ċր$5,Ċ 5,Ċր$4,Ċ 4,Ċց 7x 88x6xĭ3  29z2b2x2y8xpi7*h P7xn+n +n0+!n`+$nh+'tp+*nx+ -P BP WP{ lPq Pg P] PS PI P? P5 P+ P! )P >P SPւ`7x7x> 7xepeȇ7x P Pe 7x@+ a+9. ,`dc zx $Hb+ zyp z"$p b+*p z"p e+*p e gf))a,(! @ ĭ  W xy!x 0x "h`i```! k"k (⼀ۀۀۀۀۀ-h(3 x))x'ċ& x))x'ċ x x))x'ċ x x))x'ċ  pp p b 'ppbbx2bbx2 xbx xbx, xbx'p   p))x 2Ċd* x+ x) N))x'ĊF@&0;'06'&ڡ'&1"'%1yl +${+xy*)ւ– xxq xzxćxzx p `-*p  -)p (p a-*pxx!զ (xp f-*p&xn&o/&FxzIx{Mxxfedcb/).?%ۀۀۃQڡ%$#"/ x&'Ċ%x&'ĊY5a!j1!jhu {l$za$ bc" u yhuؖbh H i ! .! ,!f !b! -!f  튲!#{he#y j#-j" m  q zy t# aĂw! aĂz! ~x l#j"d~""" &## " " " "" l-"#" ## " " !lah e a - , + / .     qĖ  B`ba`ba.g z"! c7xzi"!x!y#xp+xih !" #x  #x"px`zx%xp`$&`zx%xp x%%xĭ %x$&Ȋ%x$&Ȗ< (x0g-l'i!epac bփxd^jk"#"xt"|jk""z{vtqsqr q lxqqxOz (x(x/! (xx (xx (yq !(yq !q qd:i! d! !i!d! d!~d!-! -iyh`apl$$kk#  ]$#j" !"x " #Pba`ba`.&#R5#A<#M#S=!hj ⼮ ۃk#")#0#9 d"#0Ċ d"#A "j## ""j# ⼃ԕ"'dxi" !dxi !q ;  h W !hj"  "q ;" "~"- h  *k}B"!3 ""x""x!"}qk!!xĊ!"}qk!k~YN {bCj{aCi~qh `b."!tst!qt r"x!v< }"i/"%¹`}qi"Ċi!"xk h{yj}a "x 6"!x !`Ft"!xx "!xz E~4~qi!!~}`F t!x !z E~z~}`Ft{x {z E=ca`~#z}~qa}q!}bFyttmtyl"depE}a  -`F'yt! txt!itktyj bcpE~e~qi!RDj!"{"|m"yj"uy%%`F"ttltyk cdpEIh PL+ GI" LJ IK EG SHh e D xC C)~F~q6q x xq  <+j "U1"Duy"Lhi  ui yh!ih L j"4i  """ " "  튮! (  1/z`/`6`4/`7/z7`   82?h L P SQ RRm Po* Rl An Mm Sk#Lj#EiEh "* K > EM>R>A>S>P> EPTRTATMTST TphQ  ]Va  N`` 9  w" p# ! p # ! pUqxi!p"U ja -b<p!b!p$Uh b x  !!xjth K Wq ]qxtydmlnokpq 3^mM>lR>nA>kS>oP>y?*yy,   y&9dq &yr0123456789ABCDEF P==P##  L# O#  V= VO##S==  (( ) (ms)  stat=dyn==ipc==env==  Segname? Offset#?   Procname or #?  Varname or offset#? First## Last## Line#? 1Type or to continue, to stop  Filename? .TEXT First  Last tbtgtksSLDC SLDL SLDO SLLA SSTL SCXG SIND (LDCB LDCI LCO LDC LLA LDO LAO LDL (LDA LOD UJP UJPL MPI DVI STM MODI (CPL CPG CPI CXL CXG CXI RPU CPF (LDCN LSL LDE LAE NOP LPR BPT BNOT (LOR LAND ADI SBI STL SRO STR LDB (NAT NATI ??? CAP CSP SLOD SLOD ??? (EQUI NEQI LEQI GEQI LEUSWGEUSWEQPWRLEPWRR(GEPWREQBYTLEBYTGEBYTSRS SWAP TRUNCROUNDD(ADR SBR MPR DVR STO MOV DUPR ADJ (STB LDP STP CHK FLT EQUR LEQR GEQR (LDM SPR EFJ NFJ FJP FJPL XJP IXA (IXP STE INN UNI INT DIF SIGNLWAIT (ABI NGI DUPW ABR NGR LNOT IND INC (EQSTRLESTRGESTRASTR CSTR INCI DECI SCPI SCPI TJP LDCRLLDRL STRL  *9HWep{@dbckccccggebaadaddjrrscaafqqaaaaaaaaccgaacacdppaaaaaaaaaalllaaaaa5aaaaahadaaaaaaaadaeeebcciqaaaaaaaaaaaacciiiiaaaooecaa???p(cd)  No proc in segKERNEL (rg) mp== sp== erec== seg= ipc= tib= rdyq== ior=  ) out of rangee+:  (st) [[~~  Start  End Seg#? no such seg no such seg Delta lex level? no such proc no such seg  Data address? Offset? Buffer offset?  (bb) No breakpts set Set break #?  already existsRemove break#?  "  IOResult= Block (0..32767)?? Control (0..FFFF)?Control (0..FFFF)??Device (0..255)??SEGDEBUGSEGDEBUG)press to continue, to abort evec  sib  erec sib seg nil  res== ~2(>0`DEBUGGER+\p Hit break##Error # at DEBUG [1R0.6]DEBUGGERB50W|o9 g ' r W 6   l H  z N  |.">YL  fT,~qB;z@4 zue[V6$ ^DEBUGGER(gY'`$#"!% n;`$#"!% nO`$#"!% nb`#"!$ m`do` &`&x o zy p2bgbh i!}& !!}Ċ!!}Ė ) f i^h !P k#yl$xmj"%<$"x-$"xy#y$"xzf$"xi"| "튾#|h! Eaeah o zo e i+^+x!F+xj"yk#xlh $-# x# xze +# xi !+"|Ċ! h ! A! Z ! ! ޖ%lyaxyp!pk`x#p$ $ .$ $ c$ pkx#p$ yk!T 7bx#py%(bw$ b$  ʆwx#py$  b$ bx#p m%% +++zi!!+!y|+ %ᱡk+ b+Qg+g g "c}+ 0++ + "+ + +} %+ g + %%7 r r sh 5 i!"!"! !! Ŗ *  BJY3`EXTRAHEA HEAPOPS FILEOPS GOTOXY EXTRAIO PERFOPS  .zJJDECODE IVMGBLS IVMPVTS IVMDCD1 IVMDCD2 IVMDCD3 22 (,( xiQ)Copyright 1984 SofTech Microsystems, Inc.3R3.1] 14-NOV-84 WPF DECODE  xiQSv~,!P!P w" p p p5 p` p  p#h"i!~`!˧ p!ݖke pj"/"`ti#? pe p pke p" pD p!ld˧d˧ pd˧d˧~e#d˧Ȋe#ˀ-d˧d˧~e#d˧Ȋ e#ˀ-#k")#j " pe p p petiuj3xh pF pS p pT p  pX p p  pk p ! po p!ˏ pw p!! p p!" p~ p pn p pV9 p p p3 p p p pրɆ pS p p9 p p p1Q pS p p9 p p pB89˄ uh )h 1Q pS p$ p9 p+ p p p. pS p3 p9 p p: p, p> p+ pF p** p pM p) pS p( p pY p  p_ p pt(d p p p( pdsk pd pɋ  pɀ⼀ۀҀռۀ p pɀ⼀ۃn"3 p p p p  p\ɀ"3 p p p p p  pցv8j"8"˧"놁 pp$xp  p" @ 9X)`*P` p+4 p pxi!Ս p} S p pî{h!! i!<b! pb p p p!튼 p p p p pun p S p pm`u `-$ p p` p pm% p p4  p pu , p S p p`u ` p$  p% p p% p p& p p% p p& pT$$    ւ"( p% p- p& p2 p' 7 : $$= B G L ւQW %\ _ b ւdi & p$m p' p`x p&  ) *+.( p `u ( `(x p*ˊւr p$ p p X  p p p p pS p p p p p` p ˧kj"#"˧"a ]Y UQ 0i` p %! 0i` p  ! 0ih p!ւ + pm )`*P` p+ 2h3`˧ 69< p p p" p" pO"n p" p" < p"u p" p`" p": p" p"S p" p3h" x p" y ph  ɊHB90' փ Ɋuof]TKB90' փ"  ph Ɋ-'  ք%  &'  ()* 1íi"!x p"!y p"!z p"!{ p$"' p"í p"' p" . p"+ p" p틖"/ p" p" p 3 p32ˆ3ugSgíi!ˆ3u՝h Վ g!3 S S gH !u9ubu 3&bb6冃3 g k!iR!ˆ3uu C p: p p0Ih F u5u+eti˧nk#&#˧# 튲h  p ˆ3u6 h"W p p p0 Ӳ00h p p0o 00h uj" ull$ eti 8 ps p  p| p pք0Յ2  p,! p, p pUP p pUU,PUuU!Ԉ,UPU! p! p p pUP p pU!+UPU!UP U peUUU! pU!ը  ,IV_MGBLS,IV_MPVTS,IV_MDCD1,IV_MDCD2,IV_MDCD330123456789ABCDEF%UCSD Code File Decoder IV.0 [3R5.2]press spacebar to continue...: Constant pool for segment Block::% Block offset: 0 Seg offset: 0Block:: Block offset: Seg offset:no segment in dictionary entryy$procedure dictionary pointer screwupp > number of procs in segmentIO error on fileeProcedure in assembly languageezsegment procedure0 not available in P-Code form for disassembly....segment procedure0 not available in P-Code form for disassembly.... Disassembling segment procedure  .... Segment: Procedure::Block:: Block offset: Seg offset: Data size:: Exit IC:: OffsetHex codee exit code::): GInterface text for segment trouble reading interfaceno interface text to list#Segment reference list for segment : )no segment reference list in this segmentLinker information for segment  EOFMARKK CONSTDEF PUBLDEF baseoffset== pubdataseg== GLOBDEF homeproc== icoffset== EXTPROCC EXTFUNCC SEPPROCC SEPFUNCC srcproc= nparams= koolbit=TRUEEFALSE GLOBREFF PUBLREFF PRIVREFF CONSTREF format==WORDDBYTEEBIG nrefs= nwords== !****yF+no linker information to list There are procedures in segment 7Procedure Guide: A(ll), #(of procedure), L(inker info),@ C(onstant pool), S(egment references), I(nterface text), Q(uit))0syySEX: LEASTMOSTT$ significant byte first NEXT PAGE:: to quitt , "$" for ]: $Listing file [CONSOLE:: , "$" for ]: $CONSOLE::CONSOLE::#1:9.^md[cE, $ FILEOPS EXTRAIO PASCALIO GOTOXY EXTRAHEAIVMDCD3 IVMDCD2 IVMDCD1 IVMGBLS  IVMGBLS xiQ%-rsr *** FILEOPS  -IVMPVTS )xiQ6"i`a`a kP  s *** IVMGBLS  yIVMDCD1 xiQtla VK@5*"& *.26:>BFJNRVZ{^qbgf]jSnIr?v5z+~! ր#wlaVK@5*  {qg]S#I'?+5/+3!7; ?ցC5imquy}wlaVK@5* {qg]S I ?5+!! %ւ)!⼀ۀۃ[ a!c! eR!/ iC!? m4!g q%!o u!w y }! !ƲLDCB LDCI LCO  LDC LLA LDO LAO LDL LDA LOD UJP UJPL MPI DVI STM MODI CPL CPG CPI CXL CXG CXI RPU CPF LDCN LSL LDE LAE NOP LPR BPT BNOT LOR LAND ADI  #.9DOZep{SBI STL SRO STR LDB NATIVE NAT-INFOINVALID CAP CSP SLOD1 SLOD2 INVALID EQUI NEQI LEQI GEQI LEUSW GEUSW EQPWR LEPWR GEPWR EQBYTE LEBYTE GEBYTE SRS SWAP TRUNC ROUND ADR SBR MPR DVR STO MOV DUP2 ~ #.9DOZep{ADJ STB LDP STP CHK FLT EQREAL LEREAL GEREAL LDM SPR EFJ NFJ FJP FJPL XJP IXA IXP STE INN UNI INT DIF SIGNAL WAIT ABI NGI DUP1 ABR NGR LNOT IND INC EQSTR LESTR GESTR ASTR CSTR INCI DECI SCIP1 SCIP2 TJP LDCRL LDRL STRL CNTRL EXPRL &1ppGih- v&! Ě, uhh!ih !ԽpY X "˧h "˭ !˧ȭ ! Ȉ "xh " !xĈ ! Ė%%i!!k#j#$U"$! #x "x"h#h#h x !x$k ! i!!k#j  iTgtm%gth'Bi p l$ /%$gtj"!i !$Ȅ !"$!l$$!ː$!l$$ $ː$! l$ #- $˧ $x$՛- !˧% !lgtk$# $x$l$- $˧#$!- $xĊ-%  !  -pah-x& p dtk#dth$'' &m#'dtj""#զ"-x%%%"%"dt%x""%""%x 'ˑ %"dt-vp       OjXD-i!yh  !x -vpj " p"Ě Ո-" p I-vp D-" p"i!|h!`˧" jՄs-hi!y x y -vp j ["p '-vp -"p"i h ! ! xu (h ! ! xu $!|!|!~!~ !| b.CODE `/ {*jSt0STRINGOP FILEOPS EXTRAIO IVMPVTS IVMDCD2 IVMDCD1 IVMGBLS   SCREENDI M LVG8 . d9? t \N SCREENDI1r/%ps ss s/s Ks ssr˥˥ɥQs Ps s ktpQr sms s2cksks k4sks kskts s s 4ss s`2 4k4sk uk`s ks*a+P`s  a,/i#xh >! 0i!(s s #xssp##xĊ "s  usp "Ҍ##x!lelek$#V#$|e$p$j"#e$#$p#l-e$"$pe"지|"ld id|h! r"ls s 01h rAˏuۖgr r0ji!"A!ˏu!i1jh " h#?Sh h 1r 0u1ri||r*uYr r 1kj"# s"j0kj"#  u"j>u01rr rkh # s h  h ki!# !i i kh # hh ki!# !ii kh # h4 r Ga{r du0ih ! $u hrr3Q\r r1jh "/0 1s 1 r h r r rr r ar rr3rrJrr _rrsrrr /0s 1r u<-pc+pj"0Պr "h" "0>" r" c"s "0<u0"i! !s "jr "i!u! us!iނpd for none) $Done with Screen Control Diagnosticss***** End Diagnostic;  errors encountered.. Error File """ closed with  errors..@@@@%integer overflow in message procedure . index=,illegal character in message procedure. ch==9* Is this sentence surrounded by two asterisks (stars). *0test_basic: not all characters being written outt6|0 0|Are all of the below lines the same (except for aa'|0 1|missing char in the lower right) ?*exhaustive_gotoxy_check: first pass not okk$Are all of the above lines the same??'exhaustive_gotoxy_check: top line error;|0 0|Does this message also start at the upper-left corner?,test_gotoxy: sc_goto_xy(0,0) did not go homee:*|0 0|Is there a '>' immed. followed by a '*' in the lowerr|0 1|right corner??:test_gotoxy: sc_goto_xy(screenwidth-1,screenheight) not okk-------->|9 9||@|5 0|Does the box have 10 stars per side and start at the arrow??$test_gotoxy: box not correctly drawnn3|0 10|Is the screen blank (except for this sentence3|0 11|and (maybe) the lower-right hand character) ?#test_clr_screen: screen not cleared1Does this message start at the upper-left corner?4test_clr_screen: cursor not left at (0,0) afterwardss*|0 0|Is this the only thing on the screen??%test_clr_line: didn't clear enough - (45,12)(0,10))(0,Screenwidth)>|0 0|Are there two blocks of "%"s (no gaps or missing chars) ??1test_clr_line: Clearing one line affected another;|0 0|Is the line below a series of stars immed. followed by a right-arrow ('>')?+test_erase_eol: sc_erase_to_eol didn't work9|0 0|Are there five full lines of '%'s followed by a line:|0 1| with just five '%'s (and maybe a stray character inn'|0 2| the extreme lower-right corner)?$test_etoeos: sc_eras_eos didn't workk;|0 0|Is the cursor at the upper-left corner (over the 'I')? test_home: cursor didn't go homee4|15 15|*|0 0|Is the cursor to the right of the star??)test_single_vectors: sc_right didn't work,|0 0|Is the cursor to the left of the star??(test_single_vectors: sc_left didn't workk'|0 0|Is the cursor just below the star?(test_single_vectors: sc_down didn't workk'|0 0|Is the cursor just above the star?&test_single_vectors: sc_up didn't workk3|0 1|Is this the top (and only) line of the screen?1test_scroll: sc_down at bottom line didn't scroll4|0 0|Are all the lines below a '<' followed by '-'s??4test_DLE_expansion: expansion not happening properlyyPlease press the  key. line feed|0 5|Key typed is not correct...|0 6|Do you wish to try typing this key again??@@@@test_keyboard:  key not correcttup-arroww down-arroww left-arroww right-arroweditor accept (etx)line dellDC1 backspaceescapeereturnntab line feed"|4 7|Bad character. You typed a ''chr(('-|4 9|Do you wish to try this character again?@@@@ 8Please type in the following characters|2 1|in the EXACTT order shown:|4 4||.|2 2|Note: The first character is a space|4 4||,,|4 8|which is interpreted as a special key..%check_normal_keys: Can't type these: F J3Fj/`{QiH STRINGOPEXTRAIO FILEOPS PASCALIOSCREENOP  undefined labeloperand out of rangemust have procedure namenumber of parameters expectedextra symbols on source linedinput line over 80 characters(unmatched conditional assembly directive&must be declared in .ASECT before usedveidentifier previously declaredore usedveimproper formatiously declaredore usedveillegal character in textlaredore usedve&must .EQU before use if not to a labelvemacro identifier expectedot to a labelvecode file too largepectedot to a labelvebackwards .ORG not allowedt to a labelveidentifier expectedallowedt to a labelveconstant expectededallowedt to a labelveinvalid structureedallowedt to a labelveextra special symbolllowedt to a labelvebranch too farsymbolllowedt to a labelve$LC-relative to externals not allowedelveillegal macro parameter indexallowedelveillegal macro parameter indexallowedelveoperand not absoluteter indexallowedelveillegal use of special symbolsllowedelveill-formed expressionl symbolsllowedelvenot enough operandsonl symbolsllowedelve&LC-relative to absolutes unrelocatableveconstant overflowsolutes unrelocatableveillegal decimal constant unrelocatableveillegal octal constantnt unrelocatableveillegal binary constantt unrelocatableveinvalid key wordonstantt unrelocatableve$unmatched macro definition directiveleveinclude files may not be nestedctiveleveunexpected end of inpute nestedctiveleve.INCLUDE not allowed in macrosdctivelevelabel expectedllowed in macrosdctiveleveexpected local label in macrosdctivelevelocal label stack overflowcrosdctiveleve'string constants must be on single linee%string constant exceeds 80 charactersnee!cannot handle this relocate counttersneeno local labels in .ASECTte counttersneeexpected key wordn .ASECTte counttersneestring expectedrdn .ASECTte counttersnee#I/O - bad block, parity error (CRC)rsneeI/O - illegal unit numberrror (CRC)rsneeI/O - illegal operation on unitCRC)rsneeI/O - undefined hardware errortCRC)rsneeI/O - unit no longer on-lineortCRC)rsnee!I/O - file no longer in directoryC)rsneeI/O - illegal file name directoryC)rsneeI/O - no room on diskme directoryC)rsneeI/O - no such unit on-linerectoryC)rsneeI/O - no such file on volumectoryC)rsneeI/O - duplicate filen volumectoryC)rsnee!I/O - attempted open of open fileC)rsnee%I/O - attempted access of closed filenee#I/O - bad format in real or integerleneeI/O - ring buffer overflowr integerlenee#I/O - write to write-protected diskleneeI/O - illegal block numbercted diskleneeI/O - illegal buffer addressed disklenee$nested macro definitions not allowedenee`=' or `<>` expectedions not allowedenee"may not equate to undefined labelsedenee%.ABSOLUTE must appear before 1st procnee.PROC or .FUNC expectedefore 1st procneetoo many proceduresctedefore 1st procnee#only absolute expressions in .ASECTocneemust be label expressions in .ASECTocneeno operands allowed in .ASECT.ASECTocneeoffset not word-aligned.ASECT.ASECTocneeLC not word-alignedgned.ASECT.ASECTocneeunrecognizable address modeCT.ASECTocneeaddress register expecteddeCT.ASECTocneeclose paren ')' expectedddeCT.ASECTocneedisplacement out of rangedeCT.ASECTocneeindex register expectedgedeCT.ASECTocneeillegal length qualifieredeCT.ASECTocneeillegal source address modeCT.ASECTocnee illegal destination address modeECTocneecomma ',' expectedn address modeECTocneelength qualifier requiredss modeECTocneelength qualifier not allowedmodeECTocneedata register expectedllowedmodeECTocneelabel expectedexpectedllowedmodeECTocneeillegal register listdllowedmodeECTocneeimmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee mmediate operand expectededmodeECTocnee!!SR CCR SP UNLK XN LINK PNTRAP @NSWAP @HEXT HMULU MULS DIVU DIVS CHK AMOVEQ pMOVEP MOVEM HRTR wNTRAPV vNRTS uNRTE sNSTOP rNNOP qNRESET pNEXG DBVS YDBVC XDBT PDBPL ZDBNE VDBMI [DBLT ]DBLS SDBLE _DBHI RDBGT ^DBGE \DBF QDBEQ WDBCS UDBCC TDBRA QCMPM BTST BSET BCLR BCHG @ LSL  LSR  ROXL  ROXR  ROL  ROR  ASL ASR SBCD ABCD SUBX ADDX SUBQ Q ADDQ P SUBA MOVEA @ LEA ACMPA ADDA SUBI ORI EORI ADDI CMPI ANDI BSR aBRA `BVS iBVC hBPL jBNE fBMI kBLT mBLS cBLE oBHI bBGT nBGE lBEQ  gBCS eBCC dSVS YSVC XST PSPL ZSNE VSMI [SLT ]SLS SSLE _SHI RSGT ^SGE \SF QSEQ WSCS USCC TJMP NJSR NTAS JTST JPEA @HNBCD HNEGX @NOT FNEG DCLR BCMP EOR OR AND SUB ADD MOVE A1 A0 A2 A3 A4 A5 A6 A7 USP D0 D1 D2 D3 D4 D5 D6 D7 CUPUTIL INIT 5ACUPUTIL ci`CCopyr 1978,79 Regents, UC; Copyr 1980,81,82,83 SofTech Microsystems-88vINIT ci`oo'&axxqĭ`an o'& n& ` xj"H "xzk#+#y#x-#yx#x-#yxd#x-dx#yd#x-x/ j" d"q"jj" "q"jdxdxdxdxᱠd xjiᱠPĊSdxPĊ5dxxqĆx 4P KP"j. a  p!eeddccbbaa`_CUPUTIL ,Generic Liaison Monitor Installation Utilityy,Generic Liaison Monitor Installation Utilityy,Generic Liaison Monitor Installation Utilityy+Custom Liaison Monitor Installation UtilityInvalid program.. :CUPUTIL ; ci`&  ȖV)`*P _r  ` t+61#x퍱x݇퍰|폤 `pxć瀀 瀐ćʖ9(hj8 8 jj"s0  0k0k#x#xk# #xk#8 #l$m$pni!&%`!% !!i$$قM8 n0k l7$ #xk7(폤 #l'm$(%$!(%$a(%$q(%$瀁(%$瀑(%  `y`aaɤq)߇~ё`)`*P`p+ykj  ` 1 ! i 5 "  9  "   j"ҍk0ji"3"x2h2h" "! ) i"xjɖ11xh  00xh       j"*,xxĭЭ+xx`,ij"! i`+! i!k - pi xh`ɀ`ɀit*-,ć,ć,ć,ć+j"9b"#7@5d  dpxh  *j"*""j넂xk5d#  *j"* d""jxdxdx*j"*-d"xd"x d"x"jddxx -k5d# 5d# dp  *j"*""j넂x}xxxᰡ xjiᰡx>xxxxx-/ xjiᰄxxᰠ"j,L]5^Pa  m%}m%k#k #@?k`#  ;`##j`jn5 "b "ogA g5X g, "a "ogF g5X gnb"ba"a`"``&Ԁ&ca bh^( Khh)`*P` p+ijh " !# i h!o)  x ih !# x x x hح i Չ ĭh   x x xᰡ xi#h  L `  .y/y n.y/ygx T5'x.x xc'x%i'i ''x!++x ''x,!",**xk#%jj%"@..y Ą '-'-'- .y- /yp''x Ą ''x,**.y'x,/yp, 'x''x ''x ,c*xN**x ! '*x'*x'*xx ! '*x*,,*%Ą '(xĭ" (-((((((x(((x)xĭ!c (',*.y/y 'x xl`  jhh %izi!j  hhC$('2m_ZU%"n!o   &f011 01M(' & '95-@5`fb55pf 55p5! !塠j`k"!`rk "s"k  i iZ,-ih !- - 집 h- -- -- -ia-P aU aP-ibr  fpf fph  i9h /0 agcg  p h.cr  f!p]55fp5iaf a aph  Җ  ]` !   !   !     r  ꂁ^  !ae n&&դՖae"axĆaxĆax%E5dr ar  2  p! 5 5!&+: HR .a5ap _Vme ePE5V*meVP eWQ e eP1-(me-P eXQ e eP  ! &^ 4`d حյ!ה`xOY `x `x `x $  M[ `x `x `x $  l!ה؊X]  El  /{    ց !ה   !ה  5Vcr  f$phb fV-cv(h' ց ibr  f fir pՓ}ׄ  H%!2ׅ_*rr # 8 ׊!rr IQb ճh 95awr   _* u1 ey,r dr _r r #$ pւz 5ERROR: no mem room for seg dicttreading segment dictionaryy bad seg dicttwriting segment dictionaryyKERNEL No mem roomreading writing interface sectionNot enough memory to hold segReading prog seggWriting monitor information code segmenttmust link firstKERNEL .CODE.CODE Output file? Could not create output fileeKERNEL Must link firstInvalid program Input file? .code no such fileeEnter product id word 1 : Enter product id word 2 : Enter product id word 3 : Enter maximum users : Output file is blocks longgclosing output fileMonitor Information CorruptedNo rights to set this fileeError reading filee:/ *  No monitor information founddCorrupted monitor informationNo rights to examine this fileeError reading fileeInvalid code fileNot a code fileEnter file(s) to display : No file foundInvalid file nameVolume is off linee No file found(Enter output file ( for CONSOLE:) : CONSOLE::( FILE NAME *=Genericc! ID 1 ID 2 ID 3 MAX USERS( FILE NAME *=Genericc! ID 1 ID 2 ID 3 MAX USERSNo files founddUnable to open output filee*Monitor Utility: D(isplay, I(nsert, Q(uit [1R0.1] Q  2 D{nX$jXK(TLgu- P &GOTOXY FILEOPS STRINGOP EXTRAHEA HEAPOPS PASCALIO EXTRAIO DIRINFO WILD COMMANDIOSUTIL SCREENOP Z yuREFERENCPROSESS INITIALITREEDUMPPROCTREEDOPASS  # REFERENCREFERENCREFERENCREFERENCREFERENCAiaCCopyr 1978,79 Regents, UC; Copyr 1980,81,82,83 SofTech Microsystems  \NPROSESS dAia15x 5y5h z=˥mq Άعq q ׅq q ΂ q jq Uq  q p`s i!!!5x 5x q q ΆΆΆΆΆΆܹ΂Ά΂ 4|h`p%!o i!5x hh ! xʹi j""{ Ęh zh!k h5k=j" /#x l$ $ʹh $}l "j#zk"5k ՞5x mgs' (#x($()(%5x 'Ċa%n%xi!'s'%5x 'Ċ>!%n%zm%i! %xi% &s&'Ċ's'&z&'#5)qq 5x h  xʹyh K5kl#$db#yq$#zk$" (9" $`s!! Ċ5x " Ċ9^q q ΆܹլΆܹΆ΂ΆΆ΂Ά9 Άܹ<Άعq Άعq p  F˥ q 9 5x 8;:gq [Άܹ΂ :˥ q 7Άع :˥ q ʆq  9q q  q :9lfq Άq  q%as!j"""5x 5x !q q q oΆaΆΆΆΆ΂Ά9q q q ΆUΆΆΆΆ΂Ά q q ΆU9MΆΆΆΆ΂"Άq ΆΆΆΆΆ΂&Ά3q qq ΆΆΆp9q qq  ʅ ʅӀ4q  q 9 qMtp΂*q 9ʆq  q!q hӀ4q  q 9 qMtpq  q΂.ΆΆΆΆΆΆܹΆ΂2 ΂6 ʊ ʐrecord implemenunit implemenunit case implemenimplemenimplemenimplemenimplemenlabel unit forward :Ta_z9M YINITIALIAia^+b,Pi!b6,b!ph΂b!솀 p! iq  ʊÖ-'Ij􂀬삀肀䂀܂؂Ԃ!pkPa&t ptpt p(ך<t Pt t p%vp+ddPwdUUwdP%vpҔXt `t t j aڥrt `t t  at `t t  aڥ(t `t t  aڥt `t t  aڥ}t `t t  aڥt `t t  aڥ)t Pt t zvpך2t ;Pt t ;p;E;G;L;QM;vpҢ!s5ćć9˥ ˥ ˥˥˥˥ ˥ ˥ՂV`\d`ۃh`ۃn vt pp˥%02 p t pt pp32˥01˧ 1˥01˧ 1˥˥8q Mt pMtpMt pMtpMtpMtp @attach,blockrea,blockwri,close,concat,copy,delete,exit,fillchar,,Bgotoxy,halt,idsearch,insert,ioresult,length,mark,memavail,memlock,,Amemswap,moveleft,moverigh,pos,pwroften,release,scan,seek,seminit,Asignal,sizeof,start,str,time,treesear,unitbusy,unitclea,unitread,9unitstat,unitwait,unitwrit,varavail,vardispo,varnew,wait,program procedurprocess functionconst type var begin end unit @abs,arctan,atan,chr,cos,dispose,eof,eoln,exp,get,ln,new,odd,ord,,@page,pred,put,read,readln,reset,rewrite,round,sin,sqr,sqrt,succ,,trunc,write,writeln,,+How wide is your output device ? [40..132] 1Please enter the file you wish Cross-Referenced: .text"Is this a compiled listing? [y/n] @@%Do you want intrinsics listed? [y/n] @@.Do you want initial procedure nestings? [y/n] @@-Do you want procedure called by trees? [y/n] @@(Do you want variables referenced? [y/n] @@,Do you want variable called by trees? [y/n] @@Do you wish warnings ? [y/n] @@%Please enter your warning file name: $Please enter your output file name: #1:Console::CONSOLE::console::S (no memory room for xrefUnable to read 6 Absolute/Relative Program/Procedure/Function headingg6-------------------------------------------------------1 FxTREEDUMPGAia7`c% M`t p M%tpx"4"h MtpM tp ˂ ɊaMt p M t p@M t p1Mt p"Mt pM tpրM!t p""|qM#t p ˦`iˏ!MtpM  pM%t p!x!x|qM't py˦Mtp z##h ##|qM)t p ˦ճլi텀(˦MtpM  pM+t pM p!y#˦!yj""|q M p!{ M* p M p!xj""|qM pz˦MMtpMtp %&&  eh?? extt fmll extt   :  :   :: :: ?PROCTREEAiad hij! _( d  xhd  yhi96"d )yk( #  xh#  yhjʊ9! " afh % xhk&(as!l$$#$#|#b"s"!ċ9 ` s ` sր l$$9$x$x|Ċm$%x$%x|$ %y$s$m%%%|Į E  9 s  sր Ċ9 s  sր  ĖW!ա!h 9  7@;2ˏ*tp{ p;tpt p . p;˥ 9xyxz 9""h y˦ 9 qMt p  ~qMt p  z i ˏ ;Mtp9M  pMt pM  pMt p!!}qMt p ˦ x MtpMtp x0 haso7<9tpt ptptp,t ptp˥ 47<9tp=t ptptpOt ptpq 9*Mbt pMtpMrt pMtp(Mt pMtpMt pMtp as }   ::  :: "Building procedure called by treess!Building Variable called by trees"Printing procedure called by treess%Printing Variable referenced by treesProcedure Called Byy-------------------------------/Procedure Variable Referenced By/-----------------------------------------------.\O tDOPASS Aiaas9&7t ptp%vM pq  qΆΆԹ q[Άr<  q 9qq 9Յ7tpt ptpMt pM  pM&t pMtp%kh #M- p h놁Mtp4 MtpK7tp/t ptpMEt pMtpMYt pMtp4 799/tpm j"'nt ptp asInitiaize Pass 2, VariablesPrinting Standard TreesHead Body Notes  Calls Made Too*Now Printing the variable reference tabless'Procedure References Variables'---------------------------------------+Memory small, variable trees not guaranteed REFERENCAiaIMt pM p˦c ijh "E'c   - (Mc  pMc  p h'! M8;tpM/ pM;tpMt p33ijij03"˧03!˧ h13 03ph3 ˥?= = M = p M  p33m 03pkh #M0 ˧ p h冁Mtpp;pt p t p{t pl)t p]9t pNIt p?[t p0gt p!vt pt pրt p;tptp~<˥ zt p Ezt pzt p-zt pzt pzt pրՆzt pz;tpztp01˧ 1 1˥101˧p01˧ 1 1˥01˧1 1˥101pk 01ph ]˥ 11ji!"30!˧; 0!˧0˥  p!ik1˥1˥`01˧` p01˧ 1'01˧6.Άع1˥37@;2ˏ*tp{ p;tpt p . p11˥;˥ 01˧j˥˥%02 pt p p2˥01˧1˥3˥01˧ 1˥1˥ 6 11 01p1 01p˥ʖ" "x&! Ć  ~h  }h"Ċі`s !  5 =˥ 4h    h h54" i!!"Ċ!"Ėjʆ%9 `s ` sրQ5y9 `s ` sր5 Ċ3ba5y"*9 `s ` sր!k## Ċ# "Ր k####### # 99G# 8;# # $9 # ʊ# ʊ# # # ʊր n$  A!n!91! 5! ! !8;ʊˑ! ʖ6˥ih ! j""x; hi!P!y˥!z˥!x˥ !|˥ !{˥%v%vp9'Mt pMt pMtpMtp6(6*ˑ 6{ˑ6 * 6)6}Է ˑah ( ; 8 2 1 38;˥ ˥˥˥˥ ˥ +%v%vp<h`Pw`Uw`P%vpˑp%02 p p 2˥7'tpt pt ptp9'Mt pMt pMtpMtp+l "6$"|6"h6!"T("01ph1i"* 1˥1 ˥ 0!ˆ p 6'6...656<5C6F6 8 ӆ΂Ihi!6ڡY6 6 ȅ Ҋ6_ h 6!i h6 톀΂MZΆΆΆΆΆΆ ӆ΂Q΂Uӆ΂YӖ 6Ռ6Ӌ]6**ӊf}`6'MI`6=ӊӊ.d6.ӊ ӊӊ ӊցg\% M pMt pMt pMtpMtpMtp zvMyv%Qvt pt ptp˥ u u < zvpzvpMvpzvMv%v'ss FATAL ERROR - No "program" word"No identifier After prog/proc/funccToken After heading unexpecteddLost ".", check Begin/case/ends#Same name, but not forward-DeclaredInclude File not founddToo many nested include files Units not in legal syntatic formm"No Identifier after const/type/varr v - AT LINE Warning: : may be undeclared: may not be initializeddNot Standard, Nested comments line #} unexpected end of input Return to .textInclude file is::Include file is::(@@ (( uses packed segment interfac @'{x&Procedural Cross-Referencer - Version [2R0.0]*PROCEDURAL CROSS-REFERENCER VERSION [2R0.0]8E~ u:^'EXTRAIO EXTRAHEA STRINGOPFILEOPS PASCALIOHEAPOPS  ASSEMLOASIOUNIT [IV a.0]ASSEMLOAVtupu pupupu pWPu pu pupWp*Ws Wtp*vp-u pWu pup0}rrr1 ~25u p.Pu pu pup.*Cu pupup2.Ms.s vp0sNu p.Pu pu pup.*^u pupup2.hs.s vp0siu pu pupupYyBqu pup132upyu pupu pupt0Loader for Stand Alone Assembly Language ProgrammName of assembly code file: .CODECould not open Target location (in Hex): Defaulting to 400HH Code startup address (in Hex): Defaulting to 400HH Ready to load: Loading program Load failedProgram abortedA&"_!_1_ !_0!@0pNNp NNN EXTRAIO PASCALIOFILEOPS SIOUNIT FILEINFO SIOUNIT 3k"x! !"xk""xĖ+b,P0i/x.Q./xhb b 0//xĊi*b!b bpb 0//xĊiii!Ԡ/ o$ijh&%-j &%+&x%(%&xk#h&&x$$x #0Ċii! o"$$xĖ %$h'x&[&'xj"G ''x" 0i"A ia i$xk%%xc ɢ$$x"!Ċhh Ԙmh$x#!#$xi! m$$x!"hh Җ$#"mpmh$x##$xi! $$x!"hh Ԗ?#,#jh "!# i!a!z # !aA hږ{P p`P` {`r`{`{``지.**Pr*{r*P지. r46s` s5nf5Prf`ZrfP6 P !ȖK&&2'k&li!$&c!h 0 jA j"%!iՖz||Q)`|`| p{**{Pr*`r*P|t~~~"dx T ***  LONGOPS STRINGOP O^{6 ; National 16081 Floating Point Instruction Macros  ;  ; Registers  R0 .EQU 0  R1 .EQU 1  R2 .EQU 2  R3 .EQU 3  R4 .EQU 4  R5 .EQU 5  R6 .EQU 6  R7 .EQU 7   ; Memory reference  M .EQU 8   ; Floating Point Chip  FPU1 .EQU 0C010H  FPU2 .EQU 0C020H  FPU3 .EQU 0C030H  FPUSTAT .EQU 0C041H    ; Moves (.MACRO MOVF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+4+1>*256>,FPU1 (.ENDM ( (.MACRO MOVL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+4>*256>,FPU1 (.ENDM ( (.MACRO MOVLF (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+16.>*256>,FPU1 (.ENDM ( (.MACRO MOVFL (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+24.>*256>,FPU1 (.ENDM ( (.MACRO MOVBF (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+4>*256>,FPU1 (.ENDM ( (.MACRO MOVWF (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+5>*256>,FPU1 (.ENDM  (.MACRO MOVDF (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+7>*256>,FPU1 (.ENDM  (.MACRO MOVBL (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<%2&3>*64>*256>,FPU1 (.ENDM ( (.MACRO MOVWL (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+1>*256>,FPU1 (.ENDM  (.MACRO MOVDL (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+3>*256>,FPU1 (.ENDM ( (.MACRO ROUNDFB (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+4>*256>,FPU1 (.ENDM ( (.MACRO ROUNDFW (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+5>*256>,FPU1 (.ENDM  (.MACRO ROUNDFD (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+7>*256>,FPU1 (.ENDM  (.MACRO ROUNDLB (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+0>*256>,FPU1 (.ENDM  (.MACRO ROUNDLW (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+1>*256>,FPU1 (.ENDM  (.MACRO ROUNDLD (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+3>*256>,FPU1 (.ENDM ( (.MACRO TRUNCFB (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+40.+4>*256>,FPU1 (.ENDM ( (.MACRO TRUNCFW (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+40.+5>*256>,FPU1 (.ENDM  (.MACRO TRUNCFD (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+40.+7>*256>,FPU1 (.ENDM  (.MACRO TRUNCLB (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+40.+0>*256>,FPU1 (.ENDM  (.MACRO TRUNCLW (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+40.+1>*256>,FPU1 (.ENDM  (.MACRO TRUNCLD (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+40.+3>*256>,FPU1 (.ENDM ( (.MACRO FLOORFB (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+56.+4>*256>,FPU1 (.ENDM ( (.MACRO FLOORFW (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+56.+5>*256>,FPU1 (.ENDM  (.MACRO FLOORFD (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+56.+7>*256>,FPU1 (.ENDM  (.MACRO FLOORLB (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+56.+0>*256>,FPU1 (.ENDM  (.MACRO FLOORLW (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+56.+1>*256>,FPU1 (.ENDM  (.MACRO FLOORLD (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+56.+3>*256>,FPU1 (.ENDM ( (.MACRO ADDF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+1>*256>,FPU1 (.ENDM ( (.MACRO ADDL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+0>*256>,FPU1 (.ENDM ( (.MACRO SUBF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+16.+1>*256>,FPU1 (.ENDM ( (.MACRO SUBL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+16.+0>*256>,FPU1 (.ENDM ( (.MACRO MULF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+48.+1>*256>,FPU1 (.ENDM ( (.MACRO MULL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+48.+0>*256>,FPU1 (.ENDM ( (.MACRO DIVF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+1>*256>,FPU1 (.ENDM ( (.MACRO DIVL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+32.+0>*256>,FPU1 (.ENDM ( (.MACRO NEGF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+20.+1>*256>,FPU1 (.ENDM ( (.MACRO NEGL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+20.+0>*256>,FPU1 (.ENDM ( (.MACRO ABSF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+52.+1>*256>,FPU1 (.ENDM ( (.MACRO ABSL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+52.+0>*256>,FPU1 (.ENDM ( (.MACRO CMPF (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+8.+1>*256>,FPU1 (.ENDM ( (.MACRO CMPL (MOVE.W #0BEH,FPU3 (MOVE.W #<%1 * 8>+<%2 // 4>+<<<<%2&3>*64>+8.+0>*256>,FPU1 (.ENDM ( (.MACRO LFSR (MOVE.W #03EH,FPU3 (MOVE.W #<%1 * 8>+<<8+3>*256>,FPU1 (.ENDM ( (.MACRO SFSR (MOVE.W #03EH,FPU3 (MOVE.W #<%1 // 4>+<<<<%1&3>*64>+48.+3>*256>,FPU1 (.ENDM ( (.MACRO FRESET (BCLR #1,80F1H (MOVE.B 80F1H,0C1C5H (MOVEQ #100.,D0 (DBF D0,* (BSET #1,80F1H (MOVE.B 80F1H,0C1C5H (.ENDM ( (.MACRO FCHK (MOVEQ #0,D0 (BTST D0,FPUSTAT (BEQ *-4 (BTST D0,FPU2+1 (.ENDM ( (.MACRO FCHK1 (MOVEQ #0,D0 (BTST D0,FPUSTAT (BEQ *-4 (MOVE.W FPU2,D0 (BTST #0,D0 (.ENDM (   COMPRESSINITIALI `# COMPRESSCCopyright 1980,81,82,83 SofTech Microsystems, Inc. -88vINITIALIG@lj"$&m"i!h%!k%!% % #"jߖYst t t ttt tt*t `t I !p Qڥ ut39tYt XPt t XnpXqj"̚tot ePt t e|p evp(eePw}UwP evpҞtt /Pt t t/p//eP1/vp"p w/]wq up pqik#;#凁! q i#l#k! q$xy$Ɂ]ڥ0123456789ABCDEFAssembly Code File Compressor [7R8.0] Type "!" to escape< Do you wish to produce a relocatable object file? (Y/N))@@( Base address of relocation (hex) : ! File to compress : !.CODE$ Output file ( for same) : ! opening file while reading segment dictionaryy&input code file is not linked assemblyy&input code file is not linked assemblyy " COMPRESSC)`*Put `t tp+)`*Put ,t u`t tp,*a,Pat h+"++Y+ u+ + h Y+ u+ + h-o+b-P,/b/nbih !cb ,,xb 0ĊAb ,,xb A Ċ"b ,,xb a Ċ/ h.2 i i2  i  i4  i  i 2! ȭ! Ȋ! ȭ! ȖS"!h7"!"!h'"!"!h"!"!h"!h k"!h2"`ȭ"`Ȋ"`ȭ"`Ȗ" !h4"`ȭ"`Ȋ"`ȭ"`Ȗ%" i! ,5h !9  6u p pQ  k#d]m#h o'(<' m%), %n&&&l&& &$ %m'o i (P#j"z" )")!)"i {ji!5!! !k!!i#" #j!k!h"*"l$m$ #%p#%k"h"j#?h Սi!z!y!zp!ĭ!y!zt t4!x4!x!y!zt !y!ztt tlzh" "x%"xi!z$ $!y# h""xĊіlk#$g#i!j"m!%z%x !j" h m"%z%x #k#h " i  Ȯ ! hk h p  24 ih ! 4 h63ĭji!p!3I!"jp3x 24hȭ 1"u"p p v1vQ234s301t tt 1tt t 5v1]vr0 v1v >>>>  >>>> disk error ~~pascalio,compressorbuffer allocation hassles.insufficient memory space to read in code fileewhile reading code filetoo many procedures in segmenttno procedures in segmenttprocedure code not assemblyinput code file not linkeddinput code file not linkedd3code may not contain base or interpreter relocation Procedure ##: H - H  bytessbad relocation informationnwhile writing out codee Highest code address is H.. Output file is bytes longJ8O`F,Ds$ EXTRAHEA STRINGOPFILEOPS EXTRAIO PASCALIOHEAPOPS    LDEMO@: $D.NETPRIMS.CODEQ$(LDEMOCOMP.TEXTa(, LDEMOLIB.TEXT,5WINDOWOPS.CODEQ5KD.CHNPRIMS.TEXTK#D.NETPRIMS.TEXTQ DNETUSR.TEXT DBSERVER.TEXTDISPATCHER.TEXTÁ DOCFIND.TEXTˁ FINDSERV.TEXT LDEMO.TEXTQ끃 LDEMUSR.TEXTSERVERCOMM.TEXTSPECIALIST.TEXT? LDEMO.CODE LDEMO@: $D.NETPRIMS.CODEQ$(LDEMOCOMP.TEXTa(, LDEMOLIB.TEXT,5WINDOWOPS.CODEQ5KD.CHNPRIMS.TEXTK#D.NETPRIMS.TEXTQ DNETUSR.TEXT DBSERVER.TEXTDISPATCHER.TEXTÁ DOCFIND.TEXTˁ FINDSERV.TEXT LDEMO.TEXTQ끃 LDEMUSR.TEXTSERVERCOMM.TEXTSPECIALIST.TEXT? LDEMO.CODE! ?DNETPRIM 7 rcFCCopyright 1983 SofTech Microsystems, Inc.  '  $uses '{$U ldemo:windowops.code} windowops, '{$U sockets:sockets.code} sockets, '{$U sockets:byte_flip.code} byte_flip, '{$U locator:locator.code} locator, '{$U sockets:time_out.code} time_out, '{$U channel:chservices.code} chservices, '{$U channel:chgroup.code} chgroup; $ $  {$E USERCOMP- } $ ( $ $type (window_ptr = ^window_rec; ' $var ( (curr_window:window_ptr; ( + #{routines} ( 'procedure d_set_window (window:window_rec);  'procedure d_clr_window (var window:window_rec); ' 'procedure lo_res_decode (d_lo_result:lo_result; var text:string);  'procedure result_decode (result:ch_result; var text:string);  (function d_tm_twait (var s:semaphore; t:integer):integer;  'procedure d_tm_sleep (t:integer);  (function d_sk_open (var socket:integer; bfsize:integer):boolean;  'procedure d_sk_accept_broadcast (socket:integer; desc:string);  'procedure d_sk_close (socket:integer);  'procedure d_sk_getmessage (socket:integer; var scraddr:sk_netaddr; ?var ln:integer; var msg:interface packed Tarray[min..max:integer] Tof char);  'procedure d_sk_vgetmessage (socket:integer; var scraddr:sk_netaddr; @var ln:integer; datasiz:integer; Ddata_offset:integer; @var msg:interface packed Darray[min..max:integer] of char);  'procedure d_sk_putmessage (socket:integer; dstaddr:sk_netaddr; ?var msg:interface packed Carray[min..max:integer] of char);  'procedure d_sk_vputmessage (socket:integer; var scraddr:sk_netaddr; Ddatasiz:integer; Ddata_offset:integer; @var msg:interface packed Darray[min..max:integer] of char); ' 'procedure d_sk_set_timeout (socket:integer; timeout:integer);  'procedure d_sk_node_status (var stat:st_record);  'procedure d_sk_nparameters (var stat:st_record);  (function d_sk_nresult (socket:integer; direction:boolean):integer;  'procedure d_sk_putbroadcast (socket:integer; Avar dest_name:interface packed Earray[min..max:integer] of char);  'procedure d_sk_vputbroadcast (socket:integer; datasiz:integer; Fdata_offset:integer; Bvar dest_name:interface packed Farray[min..max:integer] of char); ( (function d_ac_getrequest (accept_socket:integer; wait_time:integer; var msg_size:integer; var socket:integer) >:lo_result; (  'procedure d_bf_flip_record (var field:interface packed array M[min..max:integer] of char);  { ---------------------------------------------------------------------------- }  { ---------------------------------------------------------------------------- } (function d_ch_connect (local_addr:integer; remote_addr:sk_net_addr; @group_id:integer; protocol:ch_p_desc; var msg:interface packed array F[min..max:integer] of char{the data}; >var lngth:integer) :ch_result;  'procedure d_ch_set_group_timeout (group_id:integer; timeout:integer);   { --------------------------------------------------------------------------- }  { --------------------------------------------------------------------------- }  IMPLEMENTATION  >DNETPRIM bc&`   /ޖ P!Q PK PB P9 #P0 +P' 1P 9P BP MPրU!ml$%?$x ` nf f` f` f$lx ` me e` e40l$65v 75 `   ! e%%a %` %i %! %2$er6(0l$) ` e k  `  p  2$er)v)`90-;:s (< q( u;x ` : d ))y )` )~ )d ) ) )2-r;P0QQs M `RR RM R Rl Rm RQ`r0  `   `rs=0##DCB@>sD  Bx  `$$ $ $! $( $3 $2#`rDoZ077c ' ax + ` / _ 3 `88 8' 8" 8+) 8* 8/1 82 839 8D 8K7`rcba`_][s c:6?0@  `     +  2`r@6=;s@{R033Z ' X + W / `44 4' 4" 4+) 4* 4/1 4< 4K3`rZYXWUSsZ30##5  4  `$$ $ $ $ $ $2#`r54s5.b011cs `_` c&`22`_ 2` 2_1`rcpb011cs `_` c&`22`_ 2` 2_1`rc]a0BBcbs AAd6A<656+6!6$6- 67ց@A 2 c ' b +P +V `CC\ C' Cb C+ Cc! C2( C6< CKB`rcY0++^ ' Z[[\˧<<>e >' >n >,6 >o7 >K+`r^\Z"s^w044~ 5 } 9 | = xyyz˧QQQxyyz˄AQpQRRAp`SSp S5 Sy S9 Sz! S=( S{) SAG S|H Sd4`r~}|zxs~ s0JJzyxvtuII{I<y 8 z 4 `KK} K4 K K8 K8 Ks_group_id, ',', s_protocol, ',', s_con_id, =')=', s_result); (w_write_text(window^,display_line);   $end;{d_ch_connect}    function d_ch_remote_status {(con_id:integer; var status:ch_state; :var message_count:integer) :ch_result}; $var (display_line:string[125]; (s_con_id:string[7]; (s_status:string[25]; (s_message_count:string[7]; (s_result:string[40]; (window:window_ptr; (result:ch_result;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (result:=ch_remote_status(con_id,status,message_count); (d_ch_remote_status:=result; ( (result_decode(result,s_result);{decode result into text} (status_decode(status,s_status);{decode status into text} (str(message_count,s_message_count);{setup a value for display purposes} (str(con_id,s_con_id);{setup a value for display purposes} (display_line:=concat('CH_REMOTE_STATUS(', s_con_id, ',', s_status, >',', s_message_count, ')=', s_result ); (w_write_text(window^,display_line);  $end;{d_ch_remote_status}    function d_ch_send {(con_id:integer; 1var msg:interface packed array 9[min..max:integer] of char(*the data*)) :ch_result}; $var (display_line:string[75]; (s_con_id:string[7]; (s_result:string[40]; (window:window_ptr; (result:ch_result;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (result:=ch_send(con_id,msg);  d_ch_send:=result;  (result_decode(result,s_result); (str(con_id,s_con_id);{setup a value for display purposes} (display_line:=concat('CH_SEND(', s_con_id, ',"data"', =')=', s_result ); (w_write_text(window^,display_line);  $end;{d_ch_send}    function d_ch_receive {(con_id:integer; 4var msg:interface packed array <[min..max:integer] of char(*the data*); 4var lngth:integer) :ch_result}; $var (display_line:string[100]; (s_con_id:string[7]; (s_lngth:string[7]; (s_result:string[40]; (window:window_ptr; (result:ch_result;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (result:=ch_receive(con_id,msg,lngth);  d_ch_receive:=result;  (result_decode(result,s_result); (str(lngth,s_lngth);{setup a value for display purposes} (str(con_id,s_con_id);{setup a value for display purposes} (display_line:=concat('CH_RECEIVE(', s_con_id, ',"data",', >s_lngth, ')=', s_result ); (w_write_text(window^,display_$line);  $end;{d_ch_receive}    function d_ch_disconnect {(con_id:integer) :ch_result}; $var (display_line:string[75]; (s_con_id:string[7]; (s_result:string[40]; (window:window_ptr; (result:ch_result;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (result:=ch_disconnect(con_id); (d_ch_disconnect:=result;  (result_decode(result,s_result); (str(con_id,s_con_id);{setup a value for display purposes} (display_line:=concat('CH_DISCONNECT(', s_con_id, ')=', s_result ); (w_write_text(window^,display_line);  $end;{d_ch_disconnect}    function d_ch_init_group {(connection:ch_type):integer};  $var (display_line:string[50]; (s_group_id:string[7]; (window:window_ptr; (group_id:integer;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (group_id:=ch_init_group(connection); (d_ch_init_group:=group_id;  (str(group_id,s_group_id);{setup a value for display purposes}  (display_line:=concat('CH_INIT_GROUP("connection_type")=', s_group_id); (w_write_text(window^,display_line);   $end;{d_ch_init_group}    function d_ch_free_group {(group_id:integer) :boolean}; $ $var (display_line:string[50]; (s_group_id:string[7]; (s_result:string[8]; (window:window_ptr; (result:boolean;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (result:=ch_free_group(group_id); (d_ch_free_group:=result;  (str(group_id,s_group_id);{setup a value for display purposes} (s_result:='"true"'; (if result = false then ,s_result:='"false"'; (display_line:=concat('CH_FREE_GROUP(', s_group_id, ')=', s_result ); (w_write_text(window^,display_line);  $end;{d_ch_free_group}    function d_ch_group_receive {(con_id:integer; 4var msg:interface packed array <[min..max:integer] of char(*the data*); 4var lngth:integer) :ch_result}; $ $var (display_line:string[100]; (s_con_id:string[7]; (s_lngth:string[7]; (s_result:string[40]; (window:window_ptr; (result:ch_result;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (result:=ch_receive(con_id, msg, lngth);  d_ch_group_receive:=result;  (result_decode(result,s_result); (str(lngth,s_lngth);{setup a value for display purposes} (str(con_id,s_con_id);{setup a value for display purposes} (display_line:=concat('CH_GROUP_RECEIVE(', s_con_id, ',"data",', >s_lngth, ')=', s_result ); (w_write_text(window^,display_line);  $end;{d_ch_group_receive}    procedure d_ch_set_group_timeout {(group_id:integer; timeout:integer)}; $ $var ( (display_line:string[50]; (s_group_id:string[7]; (s_timeout:string[7]; (window:window_ptr;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (d_ch_set_group_timeout(group_id,timeout);  (str(timeout,s_timeout);{setup a value for display purposes} (str(group_id,s_group_id);{setup a value for display purposes} (display_line:=concat('CH_SET_GROUP_TIMEOUT(', s_group_id, ',', Vs_timeout, ')'); (w_write_text(window^,display_line);  $end;{d_ch_set_group_timeout} $ % START M1 M2 RET M3 M4 M5 M6 M7 M8 M9 RET2 D_CH #bkkk. c WwwwwkO 9Qrcf   { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. }     { This file is INCLUDED by either dnetusr.text or dnetcrv.text}  { The file dnetusr.text sets the USERCOMP compile-time flag }  { to indicate that all USED units are assumed to be on the }  { prefixed disk. }  { The file dnetcrv.text sets the USERCOMP compile-time flag }  { to indicate that USES declarations will explicitly indicate}  { the volume ( directory ) on which units will be located. }    { UNIT D_NETPRIMS; The actual unit declaration in either dnetusr or }  { dnetcrv text files. }   { --------------------------------------------------------------------------- }  { ----------------DEMONSTRATION NETWORK PRIMATIVES--------------------------- }  { --------------------------------------------------------------------------- }  {The following are the Demonstration variants of the network primatives. !They make extensive use of the windowing routines included with this package. !They also make the following essential assumptions: "1. The caller calls "d_set_window" just prior to calling one of these %variants. Failure to do so could result in the display occuring in the %wrong window, the garbling of the text being written, the overwriting %of previous messages, or even the destruction of the program and %operating system.  "2. The caller actually wishes the network primative to be executed, and %has followed the correct network procedures and protocols prior to %the invocation of the demonstration variant.} %  { --------------------------------------------------------------------------- }  { --------------------------------------------------------------------------- } $   { for user compilation all units are assumed to be on same volume ( directory)}  {$B USERCOMP+ }   uses  {$U windowops.code } windowops, '{$U sockets.code } sockets, '{$U byte_flip.code } byte_flip, '{$U locator.code } locator, '{$U time_out.code } time_out, '{$U chservices.code } chservices, '{$U chgroup.code } chgroup; ' ' '   {$E USERCOMP+ }    { for in-house compilations volume ( directory) names included in USES }  {$B USERCOMP- }  INTERFACE  $u%ses '{$U ldemo:windowops.code} windowops, '{$U sockets:sockets.code} sockets, '{$U sockets:byte_flip.code} byte_flip, '{$U locator:locator.code} locator, '{$U sockets:time_out.code} time_out, '{$U channel:chservices.code} chservices, '{$U channel:chgroup.code} chgroup; $ $  {$E USERCOMP- } $ ( $ $type (window_ptr = ^window_rec; ' $var ( (curr_window:window_ptr; ( + #{routines} ( 'procedure d_set_window (window:window_rec);  'procedure d_clr_window (var window:window_rec); ' 'procedure lo_res_decode (d_lo_result:lo_result; var text:string);  'procedure result_decode (result:ch_result; var text:string);  (function d_tm_twait (var s:semaphore; t:integer):integer;  'procedure d_tm_sleep (t:integer);  (function d_sk_open (var socket:integer; bfsize:integer):boolean;  'procedure d_sk_accept_broadcast (socket:integer; desc:string);  'procedure d_sk_close (socket:integer);  'procedure d_sk_getmessage (socket:integer; var scraddr:sk_netaddr; ?var ln:integer; var msg:interface packed Tarray[min..max:integer] Tof char);  'procedure d_sk_vgetmessage (socket:integer; var scraddr:sk_netaddr; @var ln:integer; datasiz:integer; Ddata_offset:integer; @var msg:interface packed Darray[min..max:integer] of char);  'procedure d_sk_putmessage (socket:integer; dstaddr:sk_netaddr; ?var msg:interface packed Carray[min..max:integer] of char);  'procedure d_sk_vputmessage (socket:integer; var scraddr:sk_netaddr; Ddatasiz:integer; Ddata_offset:integer; @var msg:interface packed Darray[min..max:integer] of char); ' 'procedure d_sk_set_timeout (socket:integer; timeout:integer);  'procedure d_sk_node_status (var stat:st_record);  'procedure d_sk_nparameters (var stat:st_record);  (function d_sk_nresult (socket:integer; direction:boolean):integer;  'procedure d_sk_putbroadcast (socket:integer; Avar dest_name:interface packed Earray[min..max:integer] of char);  'procedure d_sk_vputbroadcast (socket:integer; datasiz:integer; Fdata_offset:integer; Bvar dest_name:interface packed Farray[min..max:integer] of char); ( (function d_ac_getrequest (accept_socket:integer; wait_time:integer; var msg_size:integer; var socket:integer) >:lo_result; (  'procedure d_bf_flip_record (var field:interface packed array M[min..max:integer] of char);  { ---------------------------------------------------------------------------- }  { ---------------------------------------------------------------------------- } (function d_ch_connect (local_addr:integer; remote_addr:sk_net_addr; @group_id:integer; protocol:ch_p_desc; var msg:interface packed array F[min..max:integer] of char{the data}; >var lngth:integer) :ch_result;  'procedure d_ch_set_group_timeout (group_id:integer; timeout:integer);   { --------------------------------------------------------------------------- }  { --------------------------------------------------------------------------- }  IMPLEMENTATION  $type (d_max_string=string[255]; $var (d_window_sem:semaphore; (  {Procedure D_SET_WINDOW is used to protect the window pointer location during !the implicit passing of the window pointer during the calling of the !demonstration network primatives. It is not necessary to use this procedure !if the program does not have more than one process utilizing the primatives. !This procedure can then be replaced with the instruction "curr_window:= !(pointer to window)".}  procedure d_set_window {(window:window_rec)}; $begin 0wait(d_window_sem); 0curr_window:=window.pointer; $end;   procedure d_clr_window{(var window:window_rec)}; $begin 0signal(d_window_sem); $end;     procedure lo_res_decode {(d_lo_result:lo_result; var text:string)};  $begin  '{The default result is "unknown response"} (text:='"unknown response"'; '{Decode the locator result value according to the lo_result meanings.} (case d_lo_result of -lo_okay: text:='"lo_okay"';{successful operation} -lo_unknown: text:='"lo_unknown"';{unknown skt level error} -lo_socket_overflow:text:='"lo_socket_overflow"';{skt buff overflow} -lo_open_error: text:='"lo_open_error"';{skt open failed} -lo_memory: text:='"lo_memory"';{no room for msg buffer} -lo_put_error: text:='"lo_put_error"';{PUT failed} -lo_buf_overflow: text:='"cr_buf_overflow"';{msg too large} -lo_invalid_msg: text:='"cr_invalid_message"';{received bad msg} -lo_no_message: text:='"cr_no_message"';{no answer on I/O} (end;{case d_lo_result}  $end;{lo_res_decode}   procedure stat_rec_decode (var display_line:d_max_string; n:integer; @stat:st_record); $ $var (s_stat:string[7]; (i:integer;  $begin '{Decode the 1st n words of the status record.} (for i := 0 to (n-2) do ,begin 0str(stat[i],s_stat); 0display_line:=concat(display_line,s_stat, ','); ,end; '{The last word is not followed by a comma (,).} (str(stat[n-1],s_stat); (display_line:=concat(display_line,s_stat); $end;     function d_tm_twait {(var s:semaphore;t:integer):integer};  #var 's_t:string[7]; 'window:window_ptr; 'display_line:string[50]; 'result:integer; 's_result:string[7];  #begin 'window:=curr_window; {Set the current window to the caller's window} &{Clear the window semaphore for window use by other routines.} 'd_clr_window(window^); ' 'result:=tm_twait(s,t); 'd_tm_twait:=result; ' 'str(t,s_t);{setup a value for display purposes} 'str(result,s_result); 'display_line:=concat( 'TM_TWAIT("sem",', s_t, ')=', s_result); 'w_write_text(window^,display_line);  #end {d_tm_twait};     procedure d_tm_sleep {(t:integer)};  #var 's_t:string[7]; 'window:window_ptr; 'display_line:string[50];  #begin 'window:=curr_window; {Set the current window to the caller's window} &{Clear the window semaphore for window use by other routines.} 'd_clr_window(window^);  'str(t,s_t);{setup a value for display purposes} 'display_line:=concat( 'TM_SLEEP(', s_t, ')' ); 'w_write_text(window^,display_line);  'tm_sleep(t);  #end {d_tm_sleep};    function d_sk_open {(var socket:integer; bfsize:integer):boolean}; #var 's_socket:string[7]; 's_bfsize:string[7]; 'ans:boolean; 's_ans:string[7]; 'window:window_ptr; 'display_line:string[50];  #begin 'window:=curr_windo&w; {Set the current window to the caller's window} &{Clear the window semaphore for use by other routines.} 'd_clr_window(window^); ' 'ans:=sk_open(socket,bfsize); 'd_sk_open:=ans; & &{Convert integers and booleans to string values for display purposes.} 's_ans:='"true"'; 'if ans = false then +s_ans:='"false"'; 'str(socket,s_socket); 'str(bfsize,s_bfsize); 'display_line:=concat('SK_OPEN(', s_socket, ',', s_bfsize, ')=', s_ans); 'w_write_text(window^,display_line); #end;{d_sk_open}     procedure d_sk_accept_broadcast {(socket:integer;desc:string)}; $var (display_line:string[150]; (s_socket:string[7]; (window:window_ptr; $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for use by other routines.} (d_clr_window(window^); ' (sk_accept_broadcast(socket,desc);  (str(socket,s_socket);{setup a value for display purposes} (display_line:=concat('SK_ACCEPT_BROADCAST(', s_socket, P',', desc, ')' ); (w_write_text(window^,display_line);  $end {d_sk_accept_broadcast};     procedure d_sk_close {(socket:integer)}; $var (display_line:string[25]; (s_socket:string[7]; (window:window_ptr; $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (str(socket,s_socket);{setup a value for display purposes} (display_line:=concat('SK_CLOSE(', s_socket, ')' ); (w_write_text(window^,display_line);  (sk_close(socket);  $end {d_sk_close};   procedure d_sk_getmessage {(socket:integer; var scraddr:sk_netaddr; 8var ln:integer; var msg:interface packed Larray[min..max:integer] of char)}; $var (display_line:string[50]; (s_socket:string[7]; (s_ln:string[7]; (window:window_ptr;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (sk_getmessage(socket,scraddr,ln,msg);  (str(socket,s_socket) {setup a value for display purposes}; (str(ln,s_ln) {setup a value for display purposes}; (display_line:=concat('SK_GETMESSAGE(', s_socket, ',"scr_addr",', ?s_ln, ',"message")' ); (w_write_text(window^,display_line);  $end;{d_sk_getmessage}    procedure d_sk_vgetmessage {(socket:integer; var scraddr:sk_netaddr; 9var n:integer; datasiz:integer; =data_offset:integer; var msg:interface packed Marray[min..max:integer] of char)}; $var (display_line:string[75]; (s_socket:string[7]; (s_ln:string[7]; (s_datasiz:string[7]; (s_data_offset:string[7]; (window:window_ptr;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (str(socket,s_socket) {setup a value for display purposes}; (str(ln,s_ln) {setup a value for display purposes}; (str(datasiz,s_datasiz); (str(data_offset,s_data_offset); (display_line:=concat('SK_VGETMESSAGE(', s_socket, ',"scr_addr",', ?s_ln, ',', s_datasiz, ',', s_data_offset, ?',"message")' ); (w_write_text(window^,display_line);  (sk_vgetmessage(socket,scraddr,ln,datasiz,data_offset,msg);  $end;{d_sk_vgetmessage}     procedure d_sk_putmessage {(socket:integer; dstaddr:sk_netaddr; 5var msg:interface packed 5array[min..max:integer] of char)}; $var (display_line:string[50]; (s_socket:string[7]; (window:window_ptr; $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (str(socket,s_socket) {setup a value for display purposes}; (display_line:=concat('SK_PUTMESSAGE(', s_socket, L',"dst_addr","message")' ); (w_write_text(window^,display_line);  (sk_putmessage(socket,dstaddr,msg);  $end;{d_sk_putmessage}    procedure d_sk_vputmessage {(socket:integer; var scraddr:sk_netaddr; =datasiz:integer'; =data_offset:integer var msg:interface packed Marray[min..max:integer] of char)}; $var (display_line:string[75]; (s_socket:string[7]; (s_datasiz:string[7]; (s_data_offset:string[7]; (window:window_ptr;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (str(socket,s_socket) {setup a value for display purposes}; (str(datasiz,s_datasiz); (str(data_offset,s_data_offset); (display_line:=concat('SK_VPUTMESSAGE(', s_socket, ',"scr_addr",', =s_datasiz, ',', s_data_offset, ',"message")' ); (w_write_text(window^,display_line);  (sk_vputmessage(socket,scraddr,datasiz,data_offset,msg);  $end;{d_sk_vputmessage}     procedure d_sk_set_timeout {(socket:integer; timeout:integer)}; $var (display_line:string[50]; (s_socket:string[7]; (s_timeout:string[7]; (window:window_ptr; ( $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (str(socket,s_socket);{setup a value for display purposes} (str(timeout,s_timeout);{setup a value for display purposes} (display_line:=concat('SK_SET_TIMEOUT(', s_socket, ',', s_timeout, ?')' ); (w_write_text(window^,display_line);  (sk_set_timeout(socket,timeout); $end {d_sk_set_timeout};      procedure d_sk_node_status {(var stat:st_record)};  $const (stat_count=10; ( $var (display_line:string[95];{25+(stat_count*7)} (window:window_ptr;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (sk_node_status(stat); ( (display_line:='SK_NODE_STATUS('; (stat_rec_decode(display_line,stat_count,stat); (display_line:=concat(display_line,')'); ( (w_write_text(window^,display_line); $ $end;{sk_node_status}   procedure d_sk_nparameters {(var stat:st_record)};  $const (stat_count=10; ( $var (display_line:string[95];{25+(stat_count*7)} (window:window_ptr;  $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (sk_nparameters(stat);  (display_line:='SK_NPARAMETERS('; (stat_rec_decode(display_line,stat_count,stat); (display_line:=concat(display_line,')'); ( (w_write_text(window^,display_line); $ $end;{sk_node_status}  ( (  function d_sk_nresult {(socket:integer; direction:boolean):integer}; $const (success='(success)'; (skt_not_open='(socket not open)'; (time_out='(time_out)'; (msg_too_big='(message too big)'; (network_too_busy='(network too busy)'; (buffer_overflow='(buffer overflow)';  $var (display_line:string[75]; (s_socket:string[7]; (s_direction:string[12]; (s_d_sk_nresult:string[7]; (s_result_text:string[20]; (save_result:integer; (window:window_ptr;   $begin (window:=curr_window; {Set the current window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (save_result:=sk_nresult(socket,direction); (d_sk_nresult:=save_result; ' '{Setup the display description of the returned status.} (s_result_text:='**Unknown_Result**'; (case save_result of .0: s_result_text:=success; .9: s_result_text:=skt_not_open; -10: s_result_text:=time_out; -11: s_result_text:=msg_too_big; -12: s_result_text:=network_too_busy; -13: s_result_text:=buffer_overflow; (end;{case save_result} (str(save_result,s_d_sk_nresult); (str(socket,s_socket);{setup a value for display purposes} (if direction=true then 0s_direction:='"last get"' ,else 0s_direction:='"last put"'; (display_line:=concat('SK_NRESULT(', s_socket, =',', s_direction, ')=',s_d_sk_nresult, Bs_result_text ); (w_write_text(window^,display_line); $ $end {d_sk_nresult};    procedure d_sk_putbroadcast{(socket:integer; 9var dest_name:interface packed array['min..max:integer] Gof char)}; $ $const (lth_max=30;  $var (display_line:string[75]; (s_socket:string[7]; (window:window_ptr; (s_dest_name:string[lth_max]; (amount:integer;  chr_amount:char;  $begin (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (str(socket,s_socket) {setup a value for display purposes};  '{Strip the broadcast identifier from the beginning of the (user array for display.} +{Calculate the min of the max display length and the string length.} ,amount:=ord(dest_name[min]); ,if amount > lth_max then 0amount := lth_max; +{Move the string to the display area for the length calculated.} ,move_left(dest_name[min+1],s_dest_name[1],amount); + +{Move the amount field into the string length.} ,chr_amount:=chr(amount); ,move_left(chr_amount,s_dest_name,1); ( (display_line:=concat('SK_PUTBROADCAST(', s_socket, A',', s_dest_name, ')' ); (w_write_text(window^,display_line);  (sk_putbroadcast(socket,dest_name); $ $end;{d_sk_putbroadcast}     procedure d_sk_vputbroadcast {(socket:integer; datasiz:integer; ?data_offset:integer; ;var dest_name:interface packed Iarray[min..max:integer] of char)}; $const (lth_max=30;  $var (display_line:string[100]; (window:window_ptr; (s_socket:string[7]; (s_datasiz:string[7]; (s_data_offset:string[7]; (s_dest_name:string[lth_max]; (amount:integer;  chr_amount:char;  $begin (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (str(socket,s_socket) {setup a value for display purposes}; (str(datasiz,s_datasiz); (str(data_offset,s_data_offset);  '{Strip the broadcast identifier from the beginning of the (user array for display.} +{Calculate the min of the max display length and the string length.} ,amount:=ord(dest_name[min]); ,if amount > lth_max then 0amount := lth_max; +{Move the string to the display area for the length calculated.} ,move_left(dest_name[min+1],s_dest_name[1],amount); + +{Move the amount field into the string length.} ,chr_amount:=chr(amount); ,move_left(chr_amount,s_dest_name,1); ( (display_line:=concat('SK_VPUTBROADCAST(', s_socket, ',', s_datasiz, =',', s_data_offset, ',', s_dest_name, ')' ); (w_write_text(window^,display_line);  (sk_vputbroadcast(socket,datasiz,data_offset,dest_name); $end;{d_sk_vputbroadcast}    function d_ac_getrequest {(accept_socket:integer; wait_time:integer; 8var requestor:sk_netaddr; 8var msg:interface packed array @[min..max:integer] of char) :lo_result}; $var (display_line:string[100]; (s_accept_socket:string[7]; (s_wait_time:string[7]; (s_result:string[25]; (result:lo_result; (window:window_ptr; ( ( $begin (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (result:=ac_getrequest(accept_socket,wait_time,requestor,msg); (d_ac_getrequest:=result; ' '{lo_res_decode will provide a text description of the ac_getrequest (result} (lo_res_decode(result,s_result); ( (str(wait_time,s_wait_time); (str(accept_socket,s_accept_socket);{Set up a displayable value} (display_line:=concat('AC_GETREQUEST(', s_accept_socket, ',', 8s_wait_time, ',"request_addr","message")=', 8s_result ); (w_write_text(window^,display_line); $end {d_ac_getrequest};    function d_rq_putrequest {(var desc:string; queue_depth:integer; ?msg_size:integer; ;var msg:interface packed array C[min..max:integer) of char; ;var socket:integer; ):lo_result};  $var (display_line:string[200]; (s_socket:string[7]; (s_msg_size:string[7]; (s_queue_depth:string[7]; (s_result:string[25]; (result:lo_result; (window:window_ptr;  $begin  (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} ((d_clr_window(window^); / (result:=rq_put_request(desc,queue_depth,msg_size,msg,socket); (d_rq_putrequest:=result; ' '{lo_res_decode will provide a text description of the rq_put_request (result.} (lo_res_decode(result,s_result);  (str(queue_depth,s_queue_depth);{setup a value for display purposes} (str(msg_size,s_msg_size);{setup a value for display purposes} (str(socket,s_socket);{setup a value for display purposes} (display_line:=concat('RQ_PUTREQUEST(', desc, ',', s_queue_depth, L',', s_msg_size, ',"message",', Ms_socket, ')=',s_result); (w_write_text(window^,display_line);  $end {d_put_request};    procedure d_rq_close {(socket:integer)}; $var (display_line:string[25]; (s_socket:string[7]; (window:window_ptr; $begin  (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (str(socket,s_socket) {setup a value for display purposes}; (display_line:=concat('RQ_CLOSE(', s_socket, ')' ); (w_write_text(window^,display_line);  (rq_close(socket);  $end;{d_rq_close}   procedure d_ac_close {(socket:integer)}; $var (display_line:string[255]; (s_socket:string[7]; (window:window_ptr; $begin  (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (str(socket,s_socket) {setup a value for display purposes}; (display_line:=concat('AC_CLOSE(', s_socket, ')' ); (w_write_text(window^,display_line);  (ac_close(socket);  $end;{d_ac_close}   function d_rq_getresponse {(socket:integer; wait_time:integer; 9var acceptor:sk_netaddr; 9var msg:interface packed array A[min..max:integer] of char):lo_result};  $var (display_line:string[100]; (s_socket:string[7]; (s_wait_time:string[7]; (s_result:string[25]; (result:lo_result; (window:window_ptr;  $begin (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (result:=rq_getresponse(socket,wait_time,acceptor,msg); (d_rq_getresponse:=result; ( '{Setup values for display purposes.} (str(wait_time,s_wait_time); (str(socket,s_socket); '{lo_res_decode will provide text description of rq_getresponse (result} (lo_res_decode(result,s_result); ( (display_line:=concat('RQ_GETRESPONSE(', s_socket, ',',s_wait_time, 1',"acceptor_addr","message")=', s_result ); (w_write_text(window^,display_line);  $end; {d_rq_getresponse}   function d_ac_putresponse {(accept_socket:integer; requestor:sk_netaddr; =var msg:interface packed array E[min..max:integer] of char):lo_result};  $var (display_line:string[100]; (s_socket:string[7]; (s_result:string[25]; (result:lo_result; (window:window_ptr;  $begin  (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (result:=ac_putresponse(accept_socket,requestor,msg); (d_ac_putresponse:=result;  '{convert the socket no. to a string value for display purposes} (str(accept_socket, s_socket); '{lo_res_decode will provide a text description of the ac_putresponse (result.} (lo_res_decode(result,s_result); (display_line:=concat('AC_PUTRESPONSE(', s_socket, =',"request_addr","message")=',sresult); (w_write_text(window^,display_line);  $end;{d_ac_putresponse}    function d_ac_initiate {(var desc:string; queue_depth:integer; :var msg_size:integer; :var socket:integer):lo_result}; $ $var (display_line:string[200]; (s_socket:string[7]; (s_queue_depth:string[7]; (s_msg_size:string; (window:window_ptr;  result:lo_result; (s_result:string[25]; ( $begin (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^); / (result:=ac_initiate(desc,queue_depth,msg_size,socket); (d_ac_initiate:=result; ' '{lo_res_decode will (provide a text description of the result of (ac_initiate} (lo_res_decode(result,s_result); ( (str(socket,s_socket); (str(queue_depth,s_queue_depth); (str(msg_size,s_msg_size); (display_line:=concat('AC_INITIATE(', desc, ',', s_queue_depth, >',', s_msg_size, ',', s_socket, ')=',s_result ); (w_write_text(window^,display_line); $ $end {d_ac_initiate};     procedure d_bf_flip_record{(var field:interface packed array G[min..max:integer] of char)}; G $var (display_line:string[75]; (s_field:string[7]; (s_old_field:string[7]; (window:window_ptr;  $begin (window:=curr_window;{Set the window to the caller's window} '{Clear the window semaphore for window use by other routines.} (d_clr_window(window^);  (str(ord(field[min]),s_old_field); ( (bf_flip_record(field);  (str(ord(field[min]),s_field);{setup a value for display purposes} (display_line:=concat('BF_FLIP_RECORD(', s_old_field, ='){1st byte now=',s_field, '}' ); (w_write_text(window^,display_line);  $end {d_bf_flip_record};   {$I D.CHNPRIMS} $  {------------------------------------------------------------------------------}  {------------------------------------------------------------------------------}  {Initialization code for the window pointer synchronization semaphore.} $begin (sem_init(d_window_sem,1); '  end.  u O^rc   {$D USERCOMP+ } { USES statements set up assuming all units are } 8{ on one volume ( in one directory ) }  {**********************************************************************}  {$T D.NETPRIMS }  { D . N E T P R I M S }  { }  { This is an unpublished work copyright 1983 by }  { SofTech Microsystems, Inc. } { } { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. } { }  { Written: 11/83 by Mal Russell }  { Change Log: }  { Date Initials Change Description }  { ??/83 ??? ????????????????????????????? }  { }  {$C Copyright 1983 SofTech Microsystems, Inc. }  {***********************************************************)***********}  8  UNIT D.NETPRIMS; { unit declaration included here to insure that } 8{ compile-time flag USERCOMP gets set correctly } (  {$I D.NETPRIMS } { actual d.netprims unit } RET M1 M2 1 O^icr { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. }  #Process DBserver (var window:window_rec);  $const (last_get=true; (last_put=false; ( $type (request_type=char; ,  $var (digits :set of '0'..'9';{the ASCII digits} (even_digits:set of '0'..'8';{the even ASCII digits} (digit1,digit2,digit3:integer; (n:integer; (node_ident:string[30];  (comm_data:comm_msg; (display_line:string[255];  (rqstr_addr:sk_netaddr;{the address of the requesting process} (msg_lth :integer; (result :boolean; (done :boolean; (socket:integer; (status:integer; (s_chk_result:string[10]; (  '{$I :DOCFIND}   $begin {DBserver} ( (with comm_data do ,begin /{Open a socket for general communication to other nodes.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0result:=d_sk_open(socket,skt_buff_size); / /{Store the socket number in the global parameter server_skt 0for access by server_comm, which will be started by the 0main process LDEMO upon signaling via server_sem.} 0server_skt:=socket;  /{Signal to LDEMO that server_skt is ready} 0signal(server_sem);  /{Inform the viewer of the success of the startup.} 0w_write_text(window,' *-----DBSERVER READY-----*');  0even_digits:=['0','2','4','6','8']; 0digits:=['0'..'9']; /{Set timeout time to max value.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0d_sk_set_timeout(socket,0); 0done:=false; 0while not done do 4begin 7 repeat ;{Read a message} ;{for d.netprims, set the global window pointer} 10 {timeout} ) and ?(status<>12 {skt busy} )); 7 7{If the getmessage was successful, service the request.} 8if status=0 then 8begin 7{Choose the service to perform.} 8case request of  ((result= 0 {success}) and ?(comm_need=open_comm)));  7{If user, stop iterating.} 8if ((result=0) and (comm_need=open_comm)) then {Broadcast for any Specialist to help.} >{for d.netprims, set the global window pointer} ?d_set_window(window); ?d_sk_putbroadcast(socket,spec_broad); > >{Look for an answer.} >{for d.netprims, set the global window pointer} ?d_set_window(window); ?d_sk_getmessage(socket,spec_addr,msg_length, Mspec_broad); > >{If another timeout, ask the user if he ?wishes to keep trying.} >{for d.netprims, set the global window pointer} ?d_set_window(window); ?result:=d_sk_nresult(socket,last_get); ?if result<>0 then Crepeat Gdisplay_line:=concat('Still waiting. ', K' Do you wish to continue', K' (y or n)?'); Gw_write_text(window,display_line); C w_read(window,answer); Cuntil answer in yeses_noes; C ;until ((answer in noes) or (result=0)); ; 7end;{if answer in yeses} 2 2{If the user has decided to quit waiting for help, 3quit the attempt to find a Specialist.} 3if (answer in noes) then 7begin ;display_line:=concat('Sorry we couldn''t help ', ?'you today. ', ?'Hopefully we will be more successful next', ?' time. Please call back again. Goodbye.'); ;w_write_text(window,display_line); ;find_help:=false; 7end;{if answer in noes} /end;{if result = timeout} ' 'end;{with spec_broad} $ $end;{Find_Help} $    {AID_USER sets up the channel communications between the DISPATCHER and the !SPECIALIST nodes.}  procedure aid_user(var chan_id:integer; type_reqst:char); $ $var (exception:boolean; (msg_lth:integer; ( $ $begin{aid_user} (with comm_data do ,begin , /{Initialize the data record. This record is the same record 0utilized in Specialist<-->DBserver dialogue. It is used here 0to conserve buffer space and avoid coding complications. It 0therefore contains some fields which are not interesting to 0the Dispatcher process.} 0spec_type:=type_reqst;{user requested specialist type} 0found:=' ';{not searched for yet} 0continue:=true;{no further dialogue required} 0 /{Transfer the user request to the Specialist for further help. 0Perform the user<--->Specialist dialogue.} 3 /{The user wants a document reference found.} 0request:=find_doc; / 0repeat 3{Send the comm_data area to the Specialist to accept 4dialogue for the user.} 4repeat 7{for d.netprims, set the global window pointer} 8d_set_window(window); 8d_ch_result:=d_ch_send(chan_id,comm_data); 4until not (d_ch_result in [cr_busy,cr_sending,cr_error]); $ 3{If the send was successful, get the Special+ist response 4and write it out to the user. The response may be in 4multiple records requiring multiple network I/Os and 4displays.} 4while (continue and (d_ch_result=cr_success)) do 8begin cr_success then 4begin 8display_line:=concat('I''m sorry to report ', 8'that our Specialists have been taken seriously ', 8'ill. Would you please call back in a little ', 8'while. Someone should be able to help you ', 8'then. Goodbye.'); 8w_write_text(window,display_line); 8exception:=true; 4end;{if d_ch_result<>cr_success} ,end;{with comm_data} $ $end;{aid_user} $ $ $  $begin {dispatcher} '{Open a socket for network communications.} '{for d.netprims, set the global window pointer} (d_set_window(window); (success:=d_sk_open(socket,skt_buff_size);{skt_buff_size a global var}  '{Build the DBserver network identifier.} (DBserv_ident:=concat(user_net_id,d_dbserver);  '{Find the DBserver.} (repeat ,success:=findservice(window,socket,DBserv_ident,DBserv_addr); ,if not success then 0w_write_text(window,'Please start a DBSERVER node'); (until success;  '{Build the General Specialist network identifier.} (Gen_ident:=concat(user_net_id,d_specialist);  (done:=false; (repeat{until done}  ,w_write_text(window, ' Hello out there!'); ,w_write_text(window, +'I''m the Liaison Demonstration. May I have your account number?');  +{Query the user for a valid account number until one is received.} ,repeat 0w_write_text(window, 0'It must be an even number less than 1000 e.g."234".___'); 0readln(number_buffer);  /{Call DBserver for a check.} 0chk_answer:=number_check(number_buffer); 0if chk_answer <> yes then 4begin 8display_line:=concat( ;'Sorry, your number is not currently valid. ', ;'Please try again.'); 8w_write_text(window,display_line); 4end;{if result:=no} ,until chk_answer=yes;  ,w_write_text(window, -'Thank you! I provide two services:'); ,display_line:=concat( -'1. I can provide a demonstration of LIAISON in action while', /' giving general p-System documentation direction.'); ,w_write_text(window, display_line); ,w_write_text(window, -'2. I can also quit the program if you are through.'); ,w_write_text(window, 'With which may I help you (1 or 2)?_' ); +{Read the user choice of service.} ,repeat 0w_read(window,user_answer); ,until user_answer in [documents,quit]; +  {----------------------------------------------------------------------------}  '{Provide the service requested.} (if user_answer = documents then ,begin 0repeat 4w_write_text(window, 7'I can provide documentation direction in three areas:'); 4w_write_text(window, 7' 1. UCSD p-System and facilities.'); 4w_write_text(window, 7' 2. Languages.'); 4w_write_text(window, 5' 3. UCSD p-System implementations on specific hardware.'); 4w_write_text(window, 7' 4. I can return to start.'); 4w_write_text(window, 7'With which may I help you (1,2,3,4)?'); 3{Read user selection of specialty area.} 4w_read(window,user_answer); 0until (user_answer in 8[n_p_system,n_languages,n_hardware,restart]);  /{Set a specialty for which to broadcast.} 0case user_answer of 4n_p_system: 8begin  restart then 0success:=find_help(socket,spec_broad,spec_addr); + +{If find_help was successful, continue.} ,if ((user_answer<>restart) and success) then 0begin L 3{Initialize the protocol record prior to opening 4a channel to the Specialist.} 4with protocol do 8begin  restart and success} ,end {if user_answer = documents} ( (else ( ,if user_answer = quit then 0done := true;  (until done;{end of Dispatcher service} ( '{CLOSE DOWN THE OTHER NODES.} (w_write_text(window,'*** End of the day, everyone! ***'); (w_write_text(window,'**** Shutting Down All Nodes ****');  '{Set the communication record to request shut-down.} (comm_data.request:=quit_time; ' '{Tell DBserver to quit.} '{for d.netprims, set the global window pointer} (d_set_window(window); (d_sk_putmessage(socket,DBserv_addr,comm_data);  (with spec_broad do ,begin /{Set the broadcast record to request shut-down.} 0comm_need:=quit_time; /{Tell all Specialists to quit.} 0net_ident:=Gen_ident; /{for d.netprims, set the global window pointer} 0d_set_window(window); 0d_sk_putbroadcast(socket,spec_broad); ,end;{with spec_broad}  $ {Inform LDEMO of the termination of one of it's processes.} (signal(termination); $ $end;{dispatcher}  RET [ O^:,r' { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. }    {This procedure moves the document text into the document table. It is put !by itself to avoid cluttering the DBserver program.} !  function doc_find(doc_no:integer; var doc_key:string; Bvar doc_name:string):char;    $begin '{Clear the document key for later check.} ' doc_key:=''; '{The default is in case of a no find.? (doc_name:='Your local dealer '; '{Return the requested document description and reference key.} (case doc_no of  -1:begin 1doc_key:=' 1b'; 1doc_name:='OPERATING SYSTEM REFERENCE MANUAL'; /end;  -2:begin 1doc_key:=' 2b'; 1doc_name:='THE UCSD PASCAL HANDBOOK'; /end;  -3:begin 1doc_key:=' 3b'; 1doc_name:='INTERNAL ARCHITECTURE REFERENCE MANUAL'; /end;  -5:begin 1doc_key:=' 5b'; 1doc_name:='PROGRAM DEVELOPMENT REFERENCE MANUAL'; /end;  -9:begin 1doc_key:=' 9b'; 1doc_name:='APPLICATION DEVELOPMENT GUIDE'; /end;  ,11:begin 1doc_key:='11b'; 1doc_name:='ASSEMBLER REFERENCE MANUAL'; /end;  ,13:begin 1doc_key:='13b'; 1doc_name:='ADAPTABLE SYSTEM INSTALLATION MANUAL'; /end;  ,15:begin 1doc_key:='15b'; 1doc_name:='BASIC (LANGUAGE) REFERENCE MANUAL'; /end;  ,17:begin 1doc_key:=' 17'; 1doc_name:='FORTRAN-77 REFERENCE MANUAL'; /end;  ,20:begin 1doc_key:='20b'; 1doc_name:='VERSION IV FOR THE APPLE-II COMPUTER'; /end;  ,21:begin 1doc_key:='21b'; 1doc_name:='OPTIONAL PRODUCTS REFERENCE MANUAL:XENOFILE'; /end;  ,22:begin 1doc_key:='22b'; 1doc_name:='8086 ASSEMBLER REFERENCE MANUAL'; /end;  ,23:begin 1doc_key:='23b'; 1doc_name:='OPTIONAL PRODUCTS REFERENCE MANUAL:EDVANCE'; /end;  ,24:begin 1doc_key:='24b'; 1doc_name:='OPTIONAL PRODUCTS REFERENCE MANUAL:KSAM'; /end;  ,25:begin 1doc_key:='25b'; 1doc_name:='OPTIONAL PRODUCTS REFERENCE MANUAL:SOFTEACH'; /end;  ,26:begin 1doc_key:='26b'; 1doc_name:='IBM PC PERIPHERAL INSTALLATION GUIDE'; /end;  ,27:begin 1doc_key:='27b'; 1doc_name:='IBM FIXED DISC UTILITY PROGRAM (EXTRACT)'; /end;  ,28:begin 1doc_key:='28b'; 1doc_name:='SUPPLEMENT FOR THE IBM PERSONAL COMPUTER'; /end;  ,29:begin 1doc_key:='29b'; 1doc_name:='PERSONAL COMPUTING WITH THE UCSD P-SYSTEM'; /end;  ,33:begin 1doc_key:='33b'; 1doc_name:='SUPPLEMENTAL USERS DOCUMENT - ZENITH COMPUTERS'; /end;  ,34:begin 1doc_key:='34b'; 1doc_name:='SUPPLEMENTAL USERS DOCUMENT - CORVUS COMPUTERS'; /end;  ,35:begin 1doc_key:='35b'; 1doc_name:='SORT/PREPARE SORT REFERENCE MANUAL'; /end;  ,37:begin 1doc_key:='37b'; 1doc_name:='LIAISON PROGRAM DEVELOPMENT REFERENCE MANUAL'; /end;  ,39:begin 1doc_key:='39b'; 1doc_name:='SUPPLEMENTAL USERS MANUAL - DEC PROFESSIONAL 350 PC'; /end;  ,40:begin 1doc_key:='40b'; 1doc_name:='SUPPLEMENTAL USERS DOCUMENT - KAYPRO 4'; /end;  ,41:begin 1doc_key:='41b'; 1doc_name:='SUPPLEMENTAL USERS DOCUMENT - KAYPRO 10'; /end;  ,42:begin 1doc_key:='42b'; 1doc_name:='SUPPLEMENTAL USERS DOCUMENT - Z-100'; /end;  ,43:begin 1doc_key:='43b'; 1doc_name:='APPLE IIe (EXTENDED MEMORY) SUPPLEMENT'; /end;  +end;{case doc_no} &{if nothing found, return an exception} 'doc_find:=yes; 'if (doc_key = '') then doc_find:=no; #end;{doc_find}   ,RET O^rc7 { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. }    {FINDSERVICE provides a simplified interface for a process to be able to !find a service on the Liaison network. FINDSERVICE acquires that service !-if available- and sets up the communication requirements. FINDSERVICE !is meant to work in conjunction with FINDWORK.}  Function find_service (var window:window_rec; ;socket:integer; var desc:string; 7var choice:sk_netaddr):boolean; $const (queue_depth=1;{take one response to a request} ( $var (offer_skt:integer; (help_coming:lo_result; (display_line:string[255]; (msg_size:integer; $ $begin '{Put out a descriptive line to let the viewer more clearly see (the requestor command sequence.} (display_line:='###{start requestor sequence}###'; (w_write_text(window,display_line); ' '{Socket requires a byte_flip since it is used as a message value.} '{for d.netprims, set the global window pointer} (d_set_window(window); (d_bf_flip_record(socket);  '{Message size is one word, the socket # with which to communicate.} (msg_size:=size_of(socket); ( (repeat +{Make a request across the network for the server named. The + first responder will be accepted.} +{for d.netprims, set the global window pointer} ,d_set_window(window); ,help_coming:=d_rq_putrequest(desc,queue_depth,msg_size,socket, Ioffer_skt);  +{If the request for service went out successfully, ,pick up the first answer to the request. This will time out ,in 1800 60ths of a second =30 seconds.} ,if help_coming = lo_okay then /{Repeat until a good response is received.} 0repeat 3{for d.netprims, set the global window pointer} 4d_set_window(window); 4help_coming:=d_rq_getresponse(offer_skt,1800,choice, Uchoice.socketnum); 0until help_coming <> lo_invalid_msg; 0 +{choice.socketnum requires a byte_flip since it came from a message ,value.} +{for d.netprims, set the global window pointer} ,d_set_window(window); ,d_bf_flip_record(choice.socketnum);  +{Close out any outstanding offers and the "offer" socket ,since it is no longer necessary.} +{for d.netprims, set the global window pointer} ,d_set_window(window); ,d_rq_close(offer_skt);  (until ((help_coming = lo_okay) or (help_coming = lo_no_message)); ' '{Put out a descriptive line to let the viewer m-ore clearly see (the finish of the requestor command sequence.} (display_line:=' ###{end requestor sequence}###'; (w_write_text(window,display_line); ' (findservice:=true; (if help_coming = lo_no_message then ,findservice:=false;  $end;{findservice}   PASCAL MAIN M1 M2 RET DBSERVERRET2 FINDSERV  |-O^QrcW{ This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. }   { This file is INCLUDED either by ldemusr.text or ldemcrv.text.}  { The file ldemusr.text sets the USERCOMP flag so that the }  { USES statements used in compilation assume all necessary }  { units are located on prefixed volume ( directory ). }  { The file ldemcrv.text sets the USERCOMP flag so that the }  { USES statements used in compilation specify the volume }  { ( directory ) on which the unit will be found. }    { PROGRAM LDEMO; in root text file either ldemusr or ldemcrv }  { for user compilation all units expected to be on prefix disk } #{$B USERCOMP+ } $uses '{$L-} '{$U sockets.code} sockets, '{$U byte_flip.code} byte_flip, '{$U locator.code} locator, '{$U time_out.code} time_out, '{$U chservices.code} chservices, '{$U chgroup.code} chgroup, '{$U errorhandl.code} errorhandl (cancel), '{$U windowops.code} windowops, '{$U d.netprims.code} d_netprims; '{$L^} #{$E USERCOMP+ }  #{ for in-house compilation explicit uses are necessary } #{$B USERCOMP- } $uses '{$L-} '{$U sockets:sockets.code} sockets, '{$U sockets:byte_flip.code} byte_flip, '{$U locator:locator.code} locator, '{$U sockets:time_out.code} time_out, '{$U channel:chservices.code} chservices, '{$U channel:chgroup.code} chgroup, '{$U libunit:errorhandl.code} error_handling (cancel), '{$U ldemo:windowops.code} windowops, '{$U ldemo:d.netprims.code} d_netprims; '{$L^} #{$E USERCOMP- }   $const ' (db_stack_size=1600;{the stack size for DBserver} (sp_stack_size=2000;{the stack size for Document Specialists} (sv_stack_size=2400;{the stack size for Server_Comm} (yes='Y'; (no ='N'; ! (chk_acct_no='A'; (find_doc ='F'; (document ='D'; (open_comm ='O'; (quit_time ='Q'; ( (p_System ='p'; (languages ='L'; (hardware ='H'; : (n_p_System ='1'; (n_languages ='2'; (n_hardware ='3'; (n_cancel_r ='4'; : (d_dbserver= ' d.DBSERVER'; (d_specialist=' d.SPECIALIST'; (d_hardware= ' d.HARDWARE'; (d_p_system= ' d.p-SYSTEM'; (d_languages= ' d.LANGUAGES'; $ $type  (broad_rec = record ,net_ident:string[30]; ,comm_need:char; (end;{broad_rec} ! (comm_msg = record ,case request:char of 0chk_acct_no: 3(chk_result:char; 4acct_no :st-ring[3]); # 0find_doc: 3(spec_type:char; 4found :char; 4continue:boolean; 4ans_req:boolean; 4resp_lim:char; 4response:char; 4doc_no :integer; 4doc_key :string[3]; 4doc_desc:string[125]);  0open_comm: 3(name:string[25]);  0quit_time: 3(same_name:string[25]); ' ,end;{comm_msg} ' , $var (display_line:string[255]; (user_net_ident:string[15]; (n : integer; (count:integer; (dmy:process_id;{a dummy variable for collecting process ids} (server_id:process_id;{the id of SERVER_COMM, if started} (answer:char; (result:boolean; (specialty:string[25]; (skt_buff_size:integer; (disp_window:integer; (window_width:integer; (window_height:integer; (windows:array[0..4] of window_ptr; (server_sem:semaphore; (server_skt:integer; (yeses:set of char; (noes:set of char; (yeses_noes:set of char; (yorn:char;{User responses of yes(y) or no(n) go here}  termination:semaphore;   '{$I :FINDSERV} {Include the Find Service network procedure 9"open" function.} '{$I :DISPATCHER} {Include the Dispatcher process.} '{$I :DBSERVER} {Include the Data Base Server process.} '{$I :SERVERCOMM} {Include the Server Communications process.} '{$I :SPECIALIST} {Include the Document Specialist process.}    $begin {main process}  '{Initialize the yes and no response sets.} (yeses:=['y','Y']; (noes :=['n','N']; (yeses_noes:=yeses+noes;  '{Setup a global value for socket buffer sizes.} (skt_buff_size:=160+size_of(comm_msg); ' '{Set window size and location for node windows and the LDEMO (main process.} '{A window takes up 1/4 of the screen minus 2 lines and 2 columns (for the frame and title. Remainders, if any, are left to the (right and bottom of the screen.} (window_width:=(screen.size.x div 2)-2; (window_height:=(screen.size.y div 2)-2; (for n := 0 to 4 do ,begin /{Allocate the space for the window.} 0new(windows[n]); / /{Initialize the window variables prior to opening the window.} 0with windows[n]^ do 4begin 7{Set the pointer in the window record to point to 7 itself.} 8pointer:=windows[n]; 7 7{Windows 0,1,and 3 go on the left side of the screen; 8windows 2 and 4 go on the right side.} 8if n = 0 then )'); 0w_write_text(windows[0]^,display_line); 0w_readln(windows[0]^,user_net_ident); ,until length(user_net_ident) <= 15; + +{Give the user a chance to validate the identifier.} ,display_line:=concat('Is "',user_net_ident,'" correct?'); ,w_write_text(windows[0]^,display_line); ,w_read(windows[0]^,yorn); (until (yorn in yeses); ' '{The maximum number of user windows is 4.} (n:=4; ' '{Determine if the user wishes to have a DBserver process (started in this processor.} (repeat ,display_line:=concat('Is there a DBSERVER node already ', ?'available in the network (y or n)?'); ,w_write_text(windows[0]^,display_line); ,w_read(windows[0]^,yorn); (until yorn in yeses_noes; ' '{If the user wishes a DBserver node, start it and decrement the (number of windows remaining.} (if yorn in noes then ,begin /{Initialize a semaphore for use by DBSERVER. DBSERVER 0will signal when it has opened a socket for use by 0server_comm, and placed the n.umber in server_skt. The 0socket is gotten by DBSERVER so that the user may 0better see the cause/effect relations in the logical 0window, that is, DBSERVER's. A simpler method would be 0for the main program to open the socket before starting 0either process.} 0sem_init(server_sem,0); / /{Set the window title.} 0windows[n]^.window_name:='DB Server'; / /{Open a window for the data base server process.} 0w_open_window(windows[n]^); / /{Start the data base server program.} 0start (DBserver (windows[n]^), ;dmy,sv_stack_size); / /{Wait for DBSERVER to open a socket.}; 0wait(server_sem); / /{Start the server communications setup process.} 0start (server_comm (windows[n]^,server_skt,d_dbserver), ;server_id,db_stack_size); 0n:=n-1; ,end;{if yorn in yeses}  {----------------------------------------------------------------------------}  '{Determine if the user wishes to have a Dispatcher process (started in this processor.} (disp_window:=0; (repeat ,display_line:=concat('Do you wish a DISPATCHER node ', ='(y or n, you must have one if this', =' is the only processor)?'); ,w_write_text(windows[0]^,display_line); ,w_read(windows[0]^,yorn); (until yorn in yeses_noes; ' '{If the user wishes a Dispatcher node, it will be started later (to avoid its console communication confusing the LDEMO console (communication. At this point, the window assignment is saved, (and the number of windows remaining is decremented.} (if yorn in yeses then ,begin /{Set the window title} 0windows[n]^.window_name:='Dispatcher'; /{Save the window no. for later.} 0disp_window:=n; 0n:=n-1; ,end;{if yorn in yeses}  ({Determine if the user wishes to have one or more Specialist )processes started in this processor.} )repeat -display_line:=concat('Do you wish a SPECIALIST node ', >'(y or n, you must have one if this', >' is the only processor.)?'); -w_write_text(windows[0]^,display_line); -w_read(windows[0]^,yorn); )until yorn in yeses_noes; ( ({As long as the user wishes another Specialist node and )there are windows remaining, start another Specialist node.} )while ((yorn in yeses) and (n <> 0)) do -begin 0{Determine what type of specialty the node will have.} 1repeat 5display_line:=concat 9('What type? 1)p-System 2)Languages ', :'3)Hardware Supported 4)Cancel Request '); 5w_write_text(windows[0]^,display_line); 5w_read(windows[0]^,answer); 1until answer in [n_p_system,n_languages,n_hardware, Mn_cancel_r]; 0 0{Set the node specialty identifier.} 1case answer of 5n_p_System: 9begin <{Set the broadcast identifier.} =specialty:=d_p_system; <{Set the window name.} =windows[n]^.window_name:='p-System Specialist'; 9end;{case n_p_system}  5n_languages: 9begin <{Set the broadcast identifier.} =specialty:=d_languages; <{Set the window name.} =windows[n]^.window_name:='Languages Specialist'; 9end;{case n_languages}  5n_hardware: 9begin <{Set the broadcast identifier.} =specialty:=d_hardware; <{Set the window name.} =windows[n]^.window_name:='Hardware Specialist'; 9end;{case n_hardware} 1end;{case answer of } 0 0{If the request for a Specialist was not canceled, open 1a window for the specialist process and start it.} 1if answer <> n_cancel_r then 5begin 8{Open the window for the Specialist Process.} 9w_open_window(windows[n]^); 9start (Specialist (windows[n]^,specialty), Ldmy,sp_stack_size); 9n:=n-1; 8{If there are any windows remaining, ask the user 9if he wishes any more Specialist nodes.} 9if n <> 0 then ;begin =w_write_text(windows[0]^, ='Do you wish another SPECIALIST node (y or n)'); =w_read(windows[0]^,yorn); ;end;{if n <> 0} 5end {if answer <> n_cancel_r} 1else 4{The user wishes no more Specialist nodes.} 5yorn:='n'; -end;{while yorn in yeses and n<>0}  ({If the user requested a Dispatcher node, start it.} )if disp_window <> 0 then -with windows[disp_window]^ do 1begin 4{If there is room on the screen, then make the dispatcher. 5window as large as possible.} 4{If the window above is not used, use that space.} 5if (disp_window <= (n + 2)) then 9begin =location.y:=location.y-(size.y+2); =size.y:=size.y+size.y+2; 9end; 4{If the dispatcher is the only window on the screen, 5use the whole screen.} 5if n = 3 then 9begin =location.x:=location.x-(size.x+2); =size.x:=size.x+size.x+2; 9end; 1 4{Open the window for the Dispatcher process.} 5w_open_window(windows[disp_window]^); 4 4{Start the Dispatcher process.} 5start (Dispatcher (windows[disp_window]^), Hdmy,db_stack_size);  1end;{if disp_window <> 0 then with windows[disp_window]^} 5 ({Initialize the termination semaphore.} )sem_init(termination,0); ( ({Wait for all n processes to terminate before quitting the program.} )for count := 4 downto (n+1) do -wait(termination); 1 ({Close all open windows. This cannot be performed in the wait loop )above since the processes do not necessarily stop in order of )window number.} )for count := 4 downto (n+1) do -w_close_window(windows[count]^); ) ({Release the space for the window descriptors.} )for n := 0 to 4 do 1dispose(windows[n]);   end.{ldemo}    O^rcg   {$D USERCOMP+ } { USES statements set up assuming all units are } 8{ on one volume ( in one directory ) }  {**********************************************************************}  {$T LDEMO }  { L D E M O }  { }  { This is an unpublished work copyright 1983 by }  { SofTech Microsystems, Inc. } { } { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. } { }  { Written: 11/83 by Mal Russell }  { Change Log: }  { Date Initials Change Description }  { ??/83 ??? ????????????????????????????? }  { }  {$C Copyright 1983 SofTech Microsystems, Inc. }  {***********************************************************/***********}  8  PROGRAM LDEMO; { program declaration included here to insure that } 8{ compile-time flag USERCOMP gets set correctly } (  {$I LDEMO } { actual ldemo program } RET M1 M2  O^'rcw  {$P}  { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. }    {SERVER_COMM will setup communications with any broadcasting -"requestor"- !node using the Acceptor/Requestor protocols for any single node -"acceptor"- !within the same processor as SERVER_COMM. It accomplishes this by !performing the usual communications with the FIND_WORK function, and then !returning the acceptor's socket to the requestor. The requestor must then !make all individual requests for action (e.g. print a line) to the acceptor's !address and socket location. In this simplified version, SERVER_COMM does !not support request parameter manipulation.}   process server_comm (var window:window_rec; 9socket:integer; server_name:string);   var 'broadcast_desc:string[30];  requestor:sk_net_addr;  q:boolean;   {FINDWORK provides, for a process which performs a service, a function !which finds other processes which are requesting the service performed.}  function Findwork (var window:window_rec; 7caller_skt:integer; desc:string; 3var requestor:sk_netaddr):boolean; $ $const (queue_depth=1;{Queue up to " " requests at a time.} $ $var (request_skt:integer; (accpt_skt:integer; (accepted:lo_result; (msg_size:integer; (display_line:string[255]; ( $begin '{Put out a descriptive line to let the viewer more clearly see (the acceptor command sequence.} (display_line:=' ### {start acceptor sequence} ###'; (w_write_text(window,display_line); ' '{The caller communication socket requires a byte_flip since it will (be sent as a message.} '{for d.netprims, set the global window pointer} (d_set_window(window); (d_bf_flip_record(caller_skt); ' '{The message size will be the size of the requestor socket number.} (msg_size:=size_of(request_skt); ' '{Look for a request for a server with tag "desc". Any (requestor will be accepted and returned to the caller if service (is established.} ,repeat /{Start by opening a request socket for receiving calls 0for service.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0accepted:=d_ac_initiate(desc,queue_depth,msg_size,accpt_skt); $ /{If a socket was opened, get a request.} 0if accepted = lo_okay then 4repeat 7{for d.netprims, set the global window pointer} 8d_set_window(/window); 8accepted:=  2 do ,q:=find_work(window, socket, broadcast_desc, requestor); ( $end;{server_comm} : PASCAL MAIN M1 M2 RET DBSERVER#Q#2RET2 15?5? F+2O^rF { This item is the property of SofTech Microsystems, Inc., }  { and it may be used, copied or distributed only as permitted }  { in a written license from that company. }    Process Specialist (var window:window_rec; specialty:string);  #const ' 'last_get=true; 'last_put=false; ' #var 'dbserv_skt: integer;{Used for comm to DBserver.} 'special_skt: integer;{Used for comm to Dispatcher.} 'general_skt: integer;{Used to establish communications with =dispatchers nee0ding general help.} 'DB_addr:sk_netaddr; 'work_addr:sk_netaddr; 'dump_addr:sk_netaddr; 'work_channel:integer; 'protocol:ch_p_desc; 'd_ch_result:ch_result; ' 'comm_data:comm_msg; 'msg_lth:integer; 'search_name:string[30]; 'spec_ident:string[30]; 'gen_ident:string[30];  parameters:string;  success:boolean;  start_comm:broad_rec;  display_line:string[255]; '  {GIVE_HELP performs the documentation specialty area communications including !the actual seeking of documentation references from DBSERVER. GIVE_HELP uses !the channel services for communication to DISPATCHER and socket services !for communication with DBSERVER.}  procedure give_help (var work_channel:integer; var special_skt:integer; 5var db_addr:sk_netaddr);  $const (abort ='A'; ( $var $ msg_lth:integer; (d_ch_result:ch_result; (db_result:integer; . $ $begin 'with comm_data do +begin ' .{Read the user documentation request.} /repeat 2{for d.netprims, set the global window pointer} 3d_set_window(window); 3d_ch_result:=d_ch_receive(work_channel, comm_data, msg_lth); /until not (d_ch_result in [cr_busy,cr_receiving,cr_error]); . .{If the channel connection has been severed, handle it as /an abort.} /if ((d_ch_result<>cr_success) or (request<>find_doc)) then 3spec_type:=abort .{Otherwise say Hello to the user and go on to display the /documentation areas handled.} /else 3begin 7continue:=true;{there will be more to display} 7ans_req:=true;{there will be an answer expected} 7doc_no:=0;{no document here} 6 6{Preserve byte sex continuity.} 6{for d.netprims, set the global window pointer} 7d_set_window(window); 7d_bf_flip_record(continue); 6{for d.netprims, set the global window pointer} 7d_set_window(window); 7d_bf_flip_record(ans_req); 7 7doc_key:=''; 7doc_desc:=concat('Hello, I''m a document specialist. ', ;'I can give you references on:'); 6{Write the phrase to the user and await a response.} 7repeat :{for d.netprims, set the global window pointer} ;d_set_window(window); ;d_ch_result:=d_ch_send(work_channel,comm_data); 7until not (d_ch_result in F[cr_busy,cr_sending,cr_error]); . end;{d_ch_result<>cr_success or request<>find_doc ... else} 3 -{Process the individual documentation areas.} .case spec_type of . 2p_System: 6begin  9{Continue the sentence.} :doc_desc:=concat( >'General p-System Understanding- ', >' 1.Overview 2.Architecture 3.Installation,'); 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in I[cr_busy,cr_sending,cr_error]);  :doc_desc:=concat( >' or Specific Major Areas- 4.Applications ', >' 5.Liaison 6.Program Development.'); 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in I[cr_busy,cr_sending,cr_error]);  :resp_lim:='6';{dispatcher will check that the Iresponse is in the range} :doc_desc:='Please choose one (1-6).'; :ans_req:=true;{answer expected} :continue:=false;{message is ended} 6 9{Preserve byte sex continuity.} 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_bf_flip_record(continue); 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_bf_flip_record(ans_req); 7 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in I[cr_busy,cr_sending,cr_error]);  9{Look for the user Response.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_receive(work_channel, Rcomm_data,msg_lth); :until not (d_ch_result in G[cr_busy,cr_receiving,cr_error]);   :case response of >'1':d0oc_no:= 1; >'2':doc_no:= 3; >'3':doc_no:=13; >'4':doc_no:= 9; >'5':doc_no:=37; >'6':doc_no:= 5; :end;{case response}  6end;{case spec_type of p_System}   2languages: 6begin  9{Continue the sentence.} :doc_desc:=concat('High_level Languages - 1.UCSD ', >' Pascal 2.Fortran 3.Basic ,'); 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in I[cr_busy,cr_sending,cr_error]);  :doc_desc:=concat('or Assembly Languages - ', >' 4.General Use 5.8086/8088 '); 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in I[cr_busy,cr_sending,cr_error]);  :doc_desc:='Please choose one (1-5).'; :ans_req:=true;{answer expected} :continue:=false;{message is ended} 6 9{Preserve byte sex continuity.} 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_bf_flip_record(continue); 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_bf_flip_record(ans_req); 7 :resp_lim:='5';{dispatcher will check that the Iresponse is in the range} 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in I[cr_busy,cr_sending,cr_error]);  9{Look for the user Response.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_receive(work_channel, Xcomm_data,msg_lth); :until not (d_ch_result in I[cr_busy,cr_receiving,cr_error]);   :case response of >'1':doc_no:=2; >'2':doc_no:=17; >'3':doc_no:=15; >'4':doc_no:=11; >'5':doc_no:=22; :end;{case response}  6end;{case spec_type of languages}   2hardware: 6begin 9{Continue the dialog about hardware support.} :doc_desc:=concat('Some Hardware Specific Support ', :'Aids Are For- 1.Apple-II 2.KayPro 4 ', :'3.Kaypro 10 4.Corvus '); 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in I[cr_busy,cr_sending,cr_error]);  :doc_desc:= >'5.DEC Pro 350 6.Z-100 7.Zenith 8.IBM PC'; 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel,comm_data); :until not (d_ch_result in H[cr_busy,cr_sending,cr_error]);  :doc_desc:='Please choose one (1-8).'; :ans_req:=true;{answer expected} :continue:=false;{message is ended} 6 9{Preserve byte sex continuity.} 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_bf_flip_record(continue); 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_bf_flip_record(ans_req); 7 :resp_lim:='8';{dispatcher will check that the Iresponse is in the range} 9{Write comm_data to the Dispatcher.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_send(work_channel, Ucomm_data); :until not (d_ch_result in H[cr_busy,cr_sending,cr_error]);  9{Look for the user Response.} :repeat ={for d.netprims, set the global window pointer} >d_set_window(window); >d_ch_result:=d_ch_receive(work_channel, Rcomm_data,msg_lth); :until not (d_ch_result in G[cr_busy,cr_receiving,cr_error]);  :case response of >'1':doc_no:=20; >'2':doc_no:=40; >'3':doc_no:=41; >'4':doc_no:=34; >'5':doc_no:=39; >'6':doc_no:=42; >'7':doc_no:=33; >'8':doc_no:=28; :end;{case response}  6end;{case spec_type of hardware} & .end;{case spec_type} 9 -{If the operation wasn't aborted, get a document reference.} .if spec_type <> abort then - begin 5{Set the request to find a document.} 6request:=find_doc; 5 51{Perform a byte flip on doc_no to normalize byte sex.} 5{for d.netprims, set the global window pointer} 6d_set_window(window); 6d_bf_flip_record(doc_no); 5 5{Ask DBserver for the reference.} 5{for d.netprims, set the global window pointer} 6d_set_window(window); 6d_sk_putmessage(dbserv_skt, DB_addr, comm_data);  5{Wait for a document reference. This process assumes 6that messages will be answers to its requests. Any 6others are either errors, or leftover responses from 6previous communications, which may be discarded.} 6repeat 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_sk_getmessage(dbserv_skt, dump_addr, msg_lth, Kcomm_data); 9{Check the results of the getmessage.} 9{for d.netprims, set the global window pointer} :d_set_window(window); :db_result:=d_sk_nresult(dbserv_skt,true); 6until ((db_result=0) and (request=document));  6continue:=true;{more to the message}  ans_req:=false;{no more user responses} 5{Preserve byte sex continuity.} 5{for d.netprims, set the global window pointer} 6d_set_window(window); 6d_bf_flip_record(continue); 5{for d.netprims, set the global window pointer} 6d_set_window(window); 6d_bf_flip_record(ans_req);  5{Send the response to the Dispatcher.} 6repeat 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_ch_result:=d_ch_send(work_channel,comm_data); 6until not (d_ch_result in [cr_busy,cr_sending,cr_error]);  5{Say goodbye.} 6doc_desc:=concat(' is an excellent reference. I''m ', >'glad to have been of some help. Goodbye now.');  5{No further answer is expected.} 6ans_req:=false; 5{This session is over.} 6continue:=false;  5{Preserve byte sex continuity.} 5{for d.netprims, set the global window pointer} 6d_set_window(window); 6d_bf_flip_record(continue); 5{for d.netprims, set the global window pointer} 6d_set_window(window); 6d_bf_flip_record(ans_req); 6 5{Write the phrase to the Dispatcher.} 6repeat 9{for d.netprims, set the global window pointer} :d_set_window(window); :d_ch_result:=d_ch_send(work_channel,comm_data); 6until not (d_ch_result in [cr_busy,cr_sending,cr_error]); 5 1 end;{if not abort} > 2 *end;{with comm_data}   end;{give_help} + (  {ACCEPT_WORK uses the broadcast services to look for work under both the !specialty area and the general aid area. ACCEPT_WORK will accept two !request types:find a document, or shut down the node.}  procedure accept_work (gen_skt:integer; spec_skt:integer; 3var work_addr:sk_net_addr);  $var (result:integer; (msg_lth:integer; (work_found:boolean;   $begin{accept_work} (with start_comm do ( ,repeat {until result=0 and comm_need=quit_time or open_comm} /{Look for work on the specialty socket for 30 seconds.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0d_sk_set_timeout(spec_skt, 1800);{set timeout to 30 seconds} $ /{for d.netprims, set the global window pointer} 0d_set_window(window); 0d_sk_getmessage(spec_skt,work_addr,msg_lth,start_comm); $ /{Did the getmessage find any work?} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0result:=d_sk_nresult(spec_skt,last_get); / /{If the specialty socket timed out, try the general 0work socket for anyone who needs help. Otherwise, 0retry the specialty socket. The return must have been 0a mistaken communication.} 0if result = 10 {timeout} then 4begin 7{Look for work on the general socket for 1 second.} 7{for d.netprims, set the global window pointer} 8d_set_window(window); 8d_sk_set_timeout(gen_skt,60);{set timeout to 1 second.}  7{for d.netprims, set the global window pointer} 8d_set_window(window); 8d_sk_getmessage(gen_skt,work_addr,msg_lth,start_comm);  7{Did the getmessage find any work?} 7{for d.netprims, set the global window pointer} 8d_set_window(window); 8result:=d_sk_nresult(gen_skt,last_get); 4end;{if result = 10} 4 ,until (1(result=0) and ((comm_need=quit_time) or C(comm_need=open_comm))); ( $end;{accept_work}   $begin{specialist}  '{Open sockets and open communication with DBserver.} (with comm_data do ,begin /{Open socket for use in communication with DBserver.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0success:=d_sk_open(dbserv_skt,skt_buff_size);  /{Build a search name for finding a DBserver process.} 0search_name:=concat(user_net_ident,d_dbserver);  /{find_service will find a DBserver process and return.} 0success:=find_service(window,dbserv_skt,search_name,DB_addr);  /{Build a network identifier from the catenation of the 0user supplied network identifier, and the specialty 0area identifier.} 0spec_ident:=concat(user_net_ident,specialty);  /{Open socket for use in serving the specialty area.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0success:=d_sk_open(special_skt,skt_buff_size);  /{Accept broadcasts to the specialty identifier.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0d_sk_accept_broadcast(special_skt,spec_ident);  /{Open a general socket for use in serving anyone who needs 0general help.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0success:=d_sk_open(general_skt,skt_buff_size);  /{Build a network identifier from the concatenation of the 0user supplied network identifier and the general identifier.} 0gen_ident:=concat(user_net_ident,d_specialist); / /{Accept broadcasts to the general identifier.} /{for d.netprims, set the global window pointer} 0d_set_window(window); 0d_sk_accept_broadcast(general_skt,gen_ident); . /{Initialize the protocol record prior to opening a channel / to the Specialist.} 0with protocol do 4begin 8p_type:=single;{single packet delivery} 8s_max_rcv_msg:=size_of(comm_data); 8s_max_snd_msg:=size_of(comm_data); 8ack_wait_time:=3600{60 sec}; 8rcv_wait_time:=3600{60 sec}; 4end;{with protocol} G 0repeat {until Quit_Time} 3{Use accept_work to find work to do.} 4accept_work(general_skt, special_skt, work_addr); $ 3{Do work requested.} 4if start_comm.comm_need =open_comm then 8begin ;{Open a channel for communication with the user Specialist<--->DBserver !iP kP-!~P P!P P !P P!P P!P P!P P!P P!P P!1P 3P!HP JP!bP dPs!|P ~Pc!P PS!P PC!P P3!P P#!P P!P PօYk!Nk 4އ  쇀އH dX`\  퇀E 愀    ʇYN: ++`N+ dN` N b fd  o f Hp  $ $%'Dz  օ     ޔ Pdd   k ca j"E !PF` j ` " ! j""Ի ! "  ""Ԁdd  5oGp2Pt` G_ sr` t&5 8x` i! @!FAo!    "$kc# c@ c} 8x i! =$kc! cO c} 8x i! $kc, c6O c} 8x i! 6$H}     8x i! 㭁 8x` i! @ %!"! ! !%! !ֆU*$kc] cm? c} 8x i! $kc~ c6 c} 8x i! $}    5 8x i! 㭁 8x` i! @ !!! ! !ֆ$kc cI cc c} 8x i! $} 8x i! $}    8 8x i! 㭁 8x` i! @ 6!3(!,)!%"!'!*!!! !ևևAF !  6 `  j"D     8x i! $kc<! cMN c}     8x i! 8 $  $#a! $ h - %<  %#a! % h ΀Q΀OԎ!Pއ ` dOO Od O dctOO O_ O a  !t b OO Oj O " "! ΀O3 !  ac  !΀QҹOOt OqI OϘ   ! " ޔ7Ȇ  ۥ۲բx܅܆xą Ċˏąąą ą ąąTx x ۆۂ$ ۂJ x x Ԯۆۂ ۆ ۂ x xؔ ؆Rۆۂ! ۂC x xؔ ؆Ԯ؆ՌĆx x ۆx` ᆀ۔܆ߊۆx @ᆀ۔ԅۆۂ ۂ @ ۂX x xؔ ؆Ԣ؆!x +ۆۂ1 ۂA@ ۂSY x xؔ ؆Ԣ؆څ0ۆۂ`" ۂrH x x Ԯ]x Ax "x ֈ4jx ۆx ᆀ۔؅"x xؔ n؋ՙxۅ"z|ą||ą"y{ą{{Ćx ܆x@ᆀܔ܆ۥ۳ ߅ۥ۳x ۥ۲ߖ ###{start requestor sequence}#### ###{end requestor sequence}### All of our specialists for your #documentation area seem to be busy.May I pass your ,request to another area Specialist (y or n)??Still waiting.  Do you wish to continuee (y or n)??Sorry we couldn't help you today. )Hopefully we will be more successful next) time. Please call back again. Goodbye.I'm sorry to report /that our Specialists have been taken seriously -ill. Would you please call back in a little +while. Someone should be able to help you then. Goodbye. d.DBSERVERPlease start a DBSERVER nodee d.SPECIALIST Hello out there!?I'm the Liaison Demonstration. May I have your account number?:It must be an e3ven number less than 1000 e.g."234".___>,Sorry, your number is not currently valid. Please try again.#Thank you! I provide two services:;1. I can provide a demonstration of LIAISON in action while1 giving general p-System documentation direction.22. I can also quit the program if you are through..$With which may I help you (1 or 2)?__5I can provide documentation direction in three areas:! 1. UCSD p-System and facilities. 2. Languages..7 3. UCSD p-System implementations on specific hardware. 4. I can return to start..$With which may I help you (1,2,3,4)?? d.p-SYSTEM d.LANGUAGESS d.HARDWARE13!*** End of the day, everyone! ***!**** Shutting Down All Nodes **** 1b!OPERATING SYSTEM REFERENCE MANUAL 2bTHE UCSD PASCAL HANDBOOKK 3b&INTERNAL ARCHITECTURE REFERENCE MANUALL 5b$PROGRAM DEVELOPMENT REFERENCE MANUALL 9bAPPLICATION DEVELOPMENT GUIDE11bASSEMBLER REFERENCE MANUALL13b$ADAPTABLE SYSTEM INSTALLATION MANUALL15b!BASIC (LANGUAGE) REFERENCE MANUAL 17FORTRAN-77 REFERENCE MANUAL20b$VERSION IV FOR THE APPLE-II COMPUTERR21b+OPTIONAL PRODUCTS REFERENCE MANUAL:XENOFILE22b8086 ASSEMBLER REFERENCE MANUAL23b*OPTIONAL PRODUCTS REFERENCE MANUAL:EDVANCEE24b'OPTIONAL PRODUCTS REFERENCE MANUAL:KSAM25b+OPTIONAL PRODUCTS REFERENCE MANUAL:SOFTEACH26b$IBM PC PERIPHERAL INSTALLATION GUIDEE27b(IBM FIXED DISC UTILITY PROGRAM (EXTRACT))28b(SUPPLEMENT FOR THE IBM PERSONAL COMPUTERR29b)PERSONAL COMPUTING WITH THE UCSD P-SYSTEM33b.SUPPLEMENTAL USERS DOCUMENT - ZENITH COMPUTERSS34b.SUPPLEMENTAL USERS DOCUMENT - CORVUS COMPUTERSS35b"SORT/PREPARE SORT REFERENCE MANUALL37b,LIAISON PROGRAM DEVELOPMENT REFERENCE MANUALL39b3SUPPLEMENTAL USERS MANUAL - DEC PROFESSIONAL 350 PC40b&SUPPLEMENTAL USERS DOCUMENT - KAYPRO 4441b'SUPPLEMENTAL USERS DOCUMENT - KAYPRO 1042b#SUPPLEMENTAL USERS DOCUMENT - Z-10043b&APPLE IIe (EXTENDED MEMORY) SUPPLEMENTT+):K\m~(9J[l} *-----DBSERVER READY-----*Uokkbad {account number } {find document}DBserverr {open communications}AQ#### DBserver Stopping - OOooo.... " ### {start acceptor sequence} ####" #### {end acceptor sequence} ######Hello, I'm a document specialist. I can give you references on:!General p-System Understanding- . 1.Overview 2.Architecture 3.Installation,,, or Specific Major Areas- 4.Applications # 5.Liaison 6.Program Development.Please choose one (1-6)..16High_level Languages - 1.UCSD Pascal 2.Fortran 3.Basic ,,or Assembly Languages -  4.General Use 5.8086/8088 Please choose one (1-5)..15Some Hardware Specific Support *Aids Are For- 1.Apple-II 2.KayPro 4 3.Kaypro 10 4.Corvus -5.DEC Pro 350 6.Z-100 7.Zenith 8.IBM PCPlease choose one (1-8)..18Hp! is an excellent reference. I'm -glad to have been of some help. Goodbye now. d.DBSERVER d.SPECIALIST+ Specialist quitting for the day. Goodbye.@@--> LDEMO Setup$Please enter your unique identifier &if one is required (15 chars max ))Is "" " correct??!Is there a DBSERVER node already "available in the network (y or n)?? DB Server d.DBSERVERDo you wish a DISPATCHER node "(y or n, you must have one if thiss is the only processor)?? DispatcherrDo you wish a SPECIALIST node "(y or n, you must have one if thiss is the only processor.)?"What type? 1)p-System 2)Languages &3)Hardware Supported 4)Cancel Request  d.p-SYSTEMp-System Specialist d.LANGUAGESSLanguages Specialistt d.HARDWAREHardware Specialist13,Do you wish another SPECIALIST node (y or n))^5 EXTRAHEAHEAPOPS CONCURREPASCALIO STRINGOP DNETPRIM WINDOWOP ERRORHAN CHGROUP CHSERVICTIMEOUT LOCATOR BYTEFLIPSOCKETS  3ERRORHANQ2 ,c-P// Վ.a r! jh "  hc)/xa/xar/Ċ+/xa)r/!Ě/xcP/`$ $  ! " # t `! t  ! t! t@^h  z  h |hma%!%`! y!"!#!$!t `" "a !y    t `! t  uvĆrDEBUGGER{f  *** CONCURREPRNTERR SCREENOPPERMHEAP iPRSINGLEPb9#h$a#tj h ""m!m` xp x|lmdunfu` t xvĭ p x}%x|lmdunfu` t xvĭĖ @$#h I% '$&#ti '$&#%ti #x($xu$xj"y "x' h#&Ċ  ( ( )y*u*xĊ))y$lmdu nfu`2tv  ah  !} ,+. p,+ja"v x!o' ' (.('u),+*++,))xp)um.!"2th mn..cdh#  &%% a"v!h i!u!x  ,   !!˭!xp!x v   u   u2t ĭ ĖWah   .ć--`aj #,'h i!u!x  ,   !!˭!xp!x v   u   u2t ĭ Ė? g -`aj #, }  vah    -mneu , -a2th p-- h)+˖k ! yar a xdaxh !$ ć ć ć ć Ė  lmn o   du  ` t , a`tj""y!  +u+ ,x,yj,z j ,| jj  "  u d tk -,{- ,}av"#"h b`ti!$"u"k#x#y#ziibv!lb'h h h h(  }B6AS2u 6V"NEXTRAHEABYTEFLIPCHUTILS CHSERVICSOCKETS  VCHUTILS R!Fl!#!xl!xh  "Ċl!Ćޖc"h !  ޖ"i!h! !y!  r! ! !  |Ć!  "! xĆ "ĆޖXv p !!"#xvpv p !!"#xvpv p !!"#xvp v p !!"#xvpvp)j%&&'(%&&'(" %&&'("%&&'("'%t#i)j"y"$'%r"yh!i! $t$j"zi""{"!$j k"x"x"y# h$y $ h mx)++*w iG,o'y(rh'yb)*+xr 'yi!+xh)*Ċ)hhր )x+*w! v pvpjh "շ xi!ա!kvp'v p#yvp/v p#xvp8v p#~vpvpAv p#vpIv p#vpRv p# vpvp[v p# vpcv p#vplv p#vpvpuv p#vp}v p#vpv p# vpvp4v p#vpv p# vpvpv pvpv p#xiY hCvpv pvpvp jh "R  k#x> vpv p#{vpv p#xvpvp hޖ ˏik"xh  i!" kh!xh%jh"xik!#!%k!h!xi#Շ "Ċ !x! f!l$yr!$  |$  $ Ċ $  |h!  h $ !$  }$  a*w! r jjjj j jր– th+i0`r0r i to continue...... Dump of Setss timeout : protocol : GV_gtm>*I4v 4% L*** CONCURRE EXTRAHEAPASCALIOTIMEOUT BYTEFLIPCHSERVICSOCKETS  jWLDEMO ERRORHANPRSINGLECHUTILS K\- '.Copyright (c) 1984, SofTech Microsystems, Inc.LDEMO  beHbb    ` i!   i!⇀    !!ԡbb !%1 2PA]_ r  ] oN^'or ba] r  h ]A'̭^438Br Ex jiDnF&Omh% e hD r Ex!D r ExC] r Ex k# #&O#&Om# wog# g4C gr ogF gO4< gr r ձjD0r ExX r Ex!D r ExC!D r Ex k#Jogf gn' g{1 gr r Զ#hCog g# gL gu gr FEeXY^ _`F]r Zx]  ޭ`Sr Zx]a  @ݭr ` r a  rg a,rc `c1brg rc a?Mjb bC bp b b br hZrqsއr c ;; ; ;r#  r ݄0;; ;+ ;@r2 r; r[ ` p p`Y1;;y, ;= ;r YҜr ;;; ;l ;r r r rd $$1Ir r. r? rG rc rq rd $ԭ${ ;; ; ;pWU ;; ; ;LW, ;; ; ;HWւO]$4 cAR$4Ur #R ܄Wr  !$2@@r r Q]r # ] QQA0r #!A ޔs m!P"!P P!P P!P P!P P!P P!!P #Pq!1P 3P`!FP HPO!YP [P>!iP kP-!~P P!P P !P P!P P!P P!P P!P P!P P!1P 3P!HP JP!bP dPs!|P ~Pc!P PS!P PC!P P3!P P#!P P!P PօYk!Nk 4އ  쇀އH dX`\  퇀E 愀    ʇYN: ++`N+ dN` N b fd  o f Hp  $ $%'Dz  օ     ޔ Pdd   k ca j"E !PF` j ` " ! j""Ի ! "  ""Ԁdd  5oGpPt` G_ sr` t&5 8x` i! @!FAo!    "$kc# c@ c} 8x i! =$kc! cO c} 8x i! $kc, c6O c} 8x i! 6$H}     8x i! 㭁 8x` i! @ %!"! ! !%! !ֆU*$kc] cm? c} 8x i! $kc~ c6 c} 8x i! $}    5 8x i! 㭁 8x` i! @ !!! ! !ֆ$kc cI cc c} 8x i! $} 8x i! $}    8 8x i! 㭁 8x` i! @ 6!3(!,)!%"!'!*!!! !ևևAF !  6 `  j"D     8x i! $kc<! cMN c}     8x i! 8 $  $#a! $ h - %<  %#a! % h ΀Q΀OԎ!Pއ ` dOO Od O dctOO5 O_ O a  !t b OO Oj O " "! ΀O3 !  ac  !΀QҹOOt OqI OϘ   ! " ޔ7Ȇ  ۥ۲բx܅܆xą Ċˏąąą ą ąąTx x ۆۂ$ ۂJ x x Ԯۆۂ ۆ ۂ x xؔ ؆Rۆۂ! ۂC x xؔ ؆Ԯ؆ՌĆx x ۆx` ᆀ۔܆ߊۆx @ᆀ۔ԅۆۂ ۂ @ ۂX x xؔ ؆Ԣ؆!x +ۆۂ1 ۂA@ ۂSY x xؔ ؆Ԣ؆څ0ۆۂ`" ۂrH x x Ԯ]x Ax "x ֈ4jx ۆx ᆀ۔؅"x xؔ n؋ՙxۅ"z|ą||ą"y{ą{{Ćx ܆x@ᆀܔ܆ۥ۳ ߅ۥ۳x ۥ۲ߖ ###{start requestor sequence}#### ###{end requestor sequence}### All of our specialists for your #documentation area seem to be busy.May I pass your ,request to another area Specialist (y or n)??Still waiting.  Do you wish to continuee (y or n)??Sorry we couldn't help you today. )Hopefully we will be more successful next) time. Please call back again. Goodbye.I'm sorry to report /that our Specialists have been taken seriously -ill. Would you please call back in a little +while. Someone should be able to help you then. Goodbye. d.DBSERVERPlease start a DBSERVER nodee d.SPECIALIST Hello out there!?I'm the Liaison Demonstration. May I have your account number?:It must be an even number less than 1000 e.g."234".___>,Sorry, your number is not currently valid. Please try again.#Thank you! I provide two services:;1. I can provide a demonstration of LIAISON in action while1 giving general p-System documentation direction.22. I can also quit the program if you are through..$With which may I help you (1 or 2)?__5I can provide documentation direction in three areas:! 1. UCSD p-System and facilities. 2. Languages..7 3. UCSD p-System implementations on specific hardware. 4. I can return to start..$With which may I help you (1,2,3,4)?? d.p-SYSTEM d.LANGUAGESS d.HARDWARE13!*** End of the day, everyone! ***!**** Shutting Down All Nodes **** 1b!OPERATING SYSTEM REFERENCE MANUAL 2bTHE UCSD PASCAL HANDBOOKK 3b&INTERNAL ARCHITECTURE REFERENCE MANUALL 5b$PROGRAM DEVELOPMENT REFERENCE MANUALL 9bAPPLICATION DEVELOPMENT GUIDE11bASSEMBLER REFERENCE MANUALL13b$ADAPTABLE SYSTEM INSTALLATION MANUALL15b!BASIC (LANGUAGE) REFERENCE MANUAL 17FORTRAN-77 REFERENCE MANUAL20b$VERSION IV FOR THE APPLE-II COMPUTERR21b+OPTIONAL PRODUCTS REFERENCE MANUAL:XENOFILE22b8086 ASSEMBLER REFERENCE MANUAL23b*OPTIONAL PRODUCTS REFERENCE MANUAL:EDVANCEE24b'OPTIONAL PRODUCTS REFERENCE MANUAL:KSAM25b+OPTIONAL PRODUCTS REFERENCE MANUAL:SOFTEACH26b$IBM PC PERIPHERAL INSTALLATION GUIDEE27b(IBM FIXED DISC UTILITY PROGRAM (EXTRACT))28b(SUPPLEMENT FOR THE IBM PERSONAL COMPUTERR29b)PERSONAL COMPUTING WITH THE UCSD P-SYSTEM33b.SUPPLEMENTAL USERS DOCUMENT - ZENITH COMPUTERSS354b.SUPPLEMENTAL USERS DOCUMENT - CORVUS COMPUTERSS35b"SORT/PREPARE SORT REFERENCE MANUALL37b,LIAISON PROGRAM DEVELOPMENT REFERENCE MANUALL39b3SUPPLEMENTAL USERS MANUAL - DEC PROFESSIONAL 350 PC40b&SUPPLEMENTAL USERS DOCUMENT - KAYPRO 4441b'SUPPLEMENTAL USERS DOCUMENT - KAYPRO 1042b#SUPPLEMENTAL USERS DOCUMENT - Z-10043b&APPLE IIe (EXTENDED MEMORY) SUPPLEMENTT+):K\m~(9J[l} *-----DBSERVER READY-----*Uokkbad {account number } {find document}DBserverr {open communications}AQ#### DBserver Stopping - OOooo.... " ### {start acceptor sequence} ####" #### {end acceptor sequence} ######Hello, I'm a document specialist. I can give you references on:!General p-System Understanding- . 1.Overview 2.Architecture 3.Installation,,, or Specific Major Areas- 4.Applications # 5.Liaison 6.Program Development.Please choose one (1-6)..16High_level Languages - 1.UCSD Pascal 2.Fortran 3.Basic ,,or Assembly Languages -  4.General Use 5.8086/8088 Please choose one (1-5)..15Some Hardware Specific Support *Aids Are For- 1.Apple-II 2.KayPro 4 3.Kaypro 10 4.Corvus -5.DEC Pro 350 6.Z-100 7.Zenith 8.IBM PCPlease choose one (1-8)..18Hp! is an excellent reference. I'm -glad to have been of some help. Goodbye now. d.DBSERVER d.SPECIALIST+ Specialist quitting for the day. Goodbye.@@--> LDEMO Setup$Please enter your unique identifier &if one is required (15 chars max ))Is "" " correct??!Is there a DBSERVER node already "available in the network (y or n)?? DB Server d.DBSERVERDo you wish a DISPATCHER node "(y or n, you must have one if thiss is the only processor)?? DispatcherrDo you wish a SPECIALIST node "(y or n, you must have one if thiss is the only processor.)?"What type? 1)p-System 2)Languages &3)Hardware Supported 4)Cancel Request  d.p-SYSTEMp-System Specialist d.LANGUAGESSLanguages Specialistt d.HARDWAREHardware Specialist13,Do you wish another SPECIALIST node (y or n))^5 EXTRAHEAHEAPOPS CONCURREPASCALIO STRINGOP DNETPRIM WINDOWOP ERRORHAN CHGROUP CHSERVICTIMEOUT LOCATOR BYTEFLIPSOCKETS  ERRORHANQ2 ,c-P// Վ.a r! jh "  hc)/xa/xar/Ċ+/xa)r/!Ě/xcP/`$ $  ! " # t `! t  ! t! t@^h  z  h |hma%!%`! y!"!#!$!t `" "a !y    t `! t  uvĆrDEBUGGER{f  *** CONCURREPRNTERR SCREENOPPERMHEAP iPRSINGLEPb9#h$a#tj h ""m!m` xp x|lmdunfu` t xvĭ p x}%x|lmdunfu` t xvĭĖ @$#h I% '$&#ti '$&#%ti #x($xu$xj"y "x' h#&Ċ  ( ( )y*u*xĊ))y$lmdu nfu`2tv  ah  !} ,+. p,+ja"v6 x!o' ' (.('u),+*++,))xp)um.!"2th mn..cdh#  &%% a"v!h i!u!x  ,   !!˭!xp!x v   u   u2t ĭ ĖWah   .ć--`aj #,'h i!u!x  ,   !!˭!xp!x v   u   u2t ĭ Ė? g -`aj #, }  vah    -mneu , -a2th p-- h)+˖k ! yar a xdaxh !$ ć ć ć ć Ė  lmn o   du  ` t , a`tj""y!  +u+ ,x,yj,z j ,| jj  "  u d tk -,{- ,}av"#"h b`ti!$"u"k#x#y#ziibv!lb'h h h h(  }B6AS2u 6V"NEXTRAHEABYTEFLIPCHUTILS CHSERVICSOCKETS  VCHUTILS R!Fl!#!xl!xh  "Ċl!Ćޖc"h !  ޖ"i!h! !y!  r! ! !  |Ć!  "! xĆ "ĆޖXv p !!"#xvpv p !!"#xvpv p !!"#xvp v p !!"#xvpvp)j%&&'(%&&'(" %&&'("%&&'("'%t#i)j"y"$'%r"yh!i! $t$j"zi""{"!$j k"x"x"y# h$y $ h mx)++*w iG,o'y(rh'yb)*+xr 'yi!+xh)*Ċ)hhր )x+*w! v pvpjh "շ xi!ա!kvp'v p#yvp/v p#xvp8v p#~vpvpAv p#vpIv p#vpRv p# vpvp[v p# vpcv p#vplv p#vpvpuv p#vp}v p#vpv p# vpvpv p#vpv p# vpvpv pvpv p#xiY hCvpv pvpvp jh "R  k#x> vpv p#{vpv p#xvpvp hޖ ˏik"xh  i!" kh!xh%jh"xik!#!%k!h!xi#Շ "Ċ !x! f!l$yr!$  |$  $ Ċ $  |h!  h $ !$  }$  a*w! r jjjj j jր– th+i0`r0r i to continue...... Dump of Setss timeout : protocol : GV_gtm>*I4v 4% L*** CONCURRE EXTRAHEAPASCALIOTIMEOUT BYTEFLIPCHSERVICSOCKETS  O^5{(.TITLE "SAGE Multi-User System Bootstrap" .PROC BOOTMU   ;********************************************************************** ;  ; SAGE COMPUTER - Multi-User System Bootstrap from floppy  ;  ; File: MU4.FBOOT.TEXT  ; Date: 7-Nov-83  ; Issue: 1A  ;  ;  ; COPYRIGHT (c) 1982, 1983 SAGE Computer Technology  ; All Rights Reserved  ;  ;**********************************************************************  ;  ; History:  ;  ; 1 3-May-83 Initial release.  ; 1A 7-Nov-83 Fixed Boot extension & User boot options.  ;  ;**********************************************************************  ;  ; This bootstrap is to be located in logical blocks 0 and 1 on a  ; floppy diskette. The floppy diskette bootstrap command in the  ; PROM Debugger will read logical blocks 0 and 1 into memory at  ; location 400H.  ;  ; The bootstrap routine first reads in the p-System directory  ; from the floppy diskette. Then the bootstrap searches the  ; directory for the file MU.BIOS which contains the SAGE  ; Multi-User Basic Input/Output System routines. Once found the  ; BIOS code is positioned into the highest memory available.  ;  ; Next the bootstrap searches for the file MU.CONFIG. If it  ; finds the file it reads it into memory. Otherwise the bootstrap  ; prompts the user for the configuration file name. An immediate  ; carriage return will terminate the bootstrap. Once the  ; configuration file is found it is read into memory and its  ; address is store at CONFADDR (208H).  ;  ; Finally the bootstrap transfers to the BIOS for initialization  ; and the Multi-User executive takes control. The BIOS only  ; returns if no tasks are defined.  ;  ; Note: The Boot extension and User bootstrap features are not yet  ; supported.  ; 7 ;********************************************************************** (  ; Macro for calls to PROM area.  ; (required for generation of long addresses). (.MACRO LJSR (.WORD 4EB9H (.WORD 00FEH (.WORD %1 (.ENDM (  ; Permanent jump vector assignments in PROM  KEYBCH .EQU 8H ;Get a keyboard character  TERMCHAR.EQU 14H ;Output a character  TERMTEXT.EQU 18H ;Printout text string  TERMCRLF.EQU 1CH ;Printout carriage return & line feed  FDREAD .EQU 28H ;Read from floppy diskette (  ; RAM variables for Debugger  MEMTOP .EQU 100H ;Top of memory   ; RAM variables for BIOS  BIOSBASE.EQU 200H  CONFADDR.EQU 208H  (  ; Constants for BOOT positioning  HDSIZE .EQU 26. ;Size of header data in uncompressed code file   (.ASCII "BOOT" ;This text is checked by the Debugger @; bootstrap process to insure that the @; boot area has been initialized with @; a bootstrap routine.   START ;The Debugger transfers control to @; offset 4 in this file. (  LEA SCRATCH,A3 ;Set up RAM area for bootstrap (MOVE.L (A7)+,(A3) ;Save the return address (MOVE.W (A7)+,4(A3) ;Save the drive number (CLR.B 21.(A3) ;Clear the BIOS active flag (  ; Output initial boot message (LJSR TERMCRLF (LEA INITMSG,A0 ;Printout "SAGE Multi-User Bootstrap" (LJSR TERMTEXT (LJSR TERMCRLF (  ; Read in p-System directory (LEA DIRNAM-1,A6 ;Set up message in case of error @; note: does not have byte count. (MOVE.W #2,-(A7) ;The p-System directory is at block 2 of ( ; each devices. (LEA BUFFER,A0 ;Set up the directory buffer address (MOVE.L A0,-(A7) ;Buffer address (MOVEA.W #2048.,A0 ;The directory is 2K bytes long (MOVE.L A0,-(A7) ;Length of transfer (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in the directory with the floppy @; driver in PROM. (BNE BADREAD ;Found error reading directory (  ; Now search for MU.BIOS and read in first block (LEA BIOSNAM,A6 ;Set up search string (BSR SEARCH (BNE SRCHERR ;Could not find MU.BIOS (ADDQ.W #1,D1 ;Code starts at relative block 1 in file (MOVE.W D1,-(A7) ;Set up logical block for BIOS code (MOVE.W D1,6(A3)  ;Save logical block for later (LEA BUFFER2,A5 ;Set up buffer address for first block (MOVE.L A5,-(A7) ;Buffer address (MOVEA.W #512.,A0 ;Set up size for one block (MOVE.L A0,-(A7) ;Length of transfer (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in first block (BNE BADREAD ;Found error while reading BIOS (  ; Calculate target address for BIOS and read it into memory. (LEA BIOSPASS,A0 ;Check for BIOS password code (LEA BUFFER2+HDSIZE,A5 ;Adjust for header data in code file (CMPM.L (A5)+,(A0)+ (BNE BADPASS ;Password is not correct (MOVE.W 6(A3),-(A7) ;Set up logical block number (MOVEA.L MEMTOP,A1 ;Get current top of memory (MOVEA.W (A5)+,A0 ;Get BIOS code size (ADDA.W #HDSIZE,A0 ;Also read in header data (SUBA.L A0,A1 ;Set up code address for floppy driver (MOVE.L A1,-(A7) ;Set up BIOS codefile address in memory (MOVE.L A0,-(A7) ;Set up floppy transfer length (ADDA.W #HDSIZE,A1 ;Now form actual code address (MOVEA.L A1,A4 ;Save base of BIOS to calculate init address (MOVEA.W (A5)+,A0 ;Get size of BIOS buffer area (SUBA.L A0,A1 ;Form base of BIOS area in memory (MOVE.L A1,BIOSBASE ;Store new top of memory address (ADDA.W (A5),A4 ;Form BIOS Initialization routine address (MOVE.L A4,8(A3) ;Save starting address 7(MOVE.L 88.-8(A5),12.(A3) ;Save RAM Disk address (MOVE.L 92.-8(A5),16.(A3) ;Save top of RAM Disk (MOVE.B 96.-8(A5),20.(A3) ;Save RAM Disk Boot Flag (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in the whole BIOS (BNE BADREAD ;Found error while reading BIOS (  ; Read in Configuration info (LEA CONFNAME,A6 ;Set up search string (BSR SEARCH (BEQ $60 ;Found default file MU.CONFIG   ; Prompt user for name of configuration file  $10 LJSR TERMCRLF (LEA ASKCONF,A0 ;Ask for configuration file (LJSR TERMTEXT (LEA FILENAME,A6 ;Build filename string (CLR.W D1 (MOVE.B D1,(A6)  $20 LJSR KEYBCH ;Get a keyboard character (CMPI.B #0DH,D0 ;Check for carriage return (BEQ.S $50 ;Found terminator (CMPI.B #8,D0 (BEQ.S $40 ;Found Backspace (CMPI.B #" ",D0 (BLE.S $20 ;Don't process control characters or space (CMPI.B #15.,D1 (BGE.S $20 ;Too many characters (ADDQ.W #1,D1 ;Advance pointer (MOVE.B D0,0(A6,D1.W) ;Store character  CLR.B 1(A6,D1) ;Set up null terminator  $25 MOVE.B D1,(A6) ;Update string count (LJSR TERMCHAR ;Echo the character (BRA $20 ;Back for another character (  ; Handle backspace  $40 TST.W D1 (BEQ $20 ;Don't backspace past beginning (LJSR TERMCHAR ;Output Backspace (MOVEQ #" ",D0 ;Output blank (LJSR TERMCHAR (MOVEQ #8,D0 ;Set up another backspace (SUBQ.W #1,D1 ;Back up the pointer (BRA $25 (  ; Handle no file  $45 LEA SRCHMSG,A0 ;Printout "Could not find " (LJSR TERMTEXT (MOVEA.L A6,A0 (ADDQ.L #1,A0 (LJSR TERMTEXT ;Printout file name (LJSR TERMCRLF (BRA $10 ;Try again (  ; Handle carriage return  $50 LJSR TERMCRLF (TST.B D1 (BEQ PRTERR2 ;Null name field, exit debugger (BSR SEARCH (BNE $45 ;Did not find file (  $60 MOVE.W D1,-(A7) ;Set up logical block (LEA BUFFER3,A5 ;Set up buffer address (MOVE.L A5,-(A7) ;Buffer address for driver (ADDA.W #512.+HDSIZE+6,A5 (MOVE.L A5,CONFADDR ;Save address in BIOS area (ADDA.L D2,A5 ;Set up free address beyond configuration (MOVE.L A5,12.(A3) (MOVE.L D2,-(A7) ;Length of transfer (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in configuration (BNE BADREAD ;Found error while reading Configuration ( (MOVEA.L CONFADDR,A5 ;Check password on configuration (SUBQ.L #6,A5 (LEA CONFPASS,A0 (CMPM.L (A5)+,(A0)+ (BEQ.S $65 ;Password is good (LEA NOCONFIG,A0 ;Printout not configuration (LJSR TERMTEXT (LJSR TERMCRLF (BRA $10 (  ; Search for the optional MU.BOOTEXT.CODE file  $65 MOVEQ #0,D4 ;Default address (LEA BOOTEXT,A6 (BSR SEARCH (BNE.S $70 ;Optional boot extension not found (MOVE.W D1,-(A7) ;Set up logical block (LEA SCRATCH,A3 (MOVE.L 12.(A3),-(A7) ;Set up memory buffer (MOVE.L D2,-(A7) ;Length of transfer (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in boot extension code (BNE BADREAD ;Found error while reading boot extension (LEA SCRATCH,A3 (MOVE.L 12.(A3),D4  ADDI.L #512.+HDSIZE,D4 ;Bias to p-System assemby code (MOVEA.L D4,A5 (LEA EXBTPASS,A0  CMPM.L (A5)+,(A0)+ (BEQ.S $70 ;Good boot extension (LEA BADEXT,A0 ;Printout bad MU.BOOTEXT.CODE (LJSR TERMTEXT (LJSR TERMCRLF (MOVEQ #0,D4 ;No boot extension (  $70 LEA STACK,SP (MOVE.L D4,-(SP) ;Pass boot extension address (MOVE.W 4(A3),-(SP) ;Physical drive number  ADDQ.W #4,(SP)  8 ; Search for the optional USER.BOOT.CODE routine (MOVEQ #0,D4 ;Default User boot routine address (LEA USERBOOT,A6 (BSR SEARCH (BNE.S $80 ;No user boot (MOVE.W D1,D4 ;Save routine block address  $80 MOVE.L D4,-(SP) ;Pass User Boot routine address (MOVE.L D2,-(SP) ;Pass User Boot routine size (MOVE.W #0ABCDH,-(SP) ;New boot indicator code ( ; Initialize the BIOS  ENTER MOVEA.L 8(A3),A4 ;Get BIOS initialization address (JSR (A4) ;Initialize BIOS (  ; Never returns unless no tasks defined (MOVE #2700H,SR ;Make sure interrupts disabled (LEA NOTSKMSG,A0 (BRA PRTERR1 ( (  ; Search Routine for directory entry  ; A6 is pointer to target string.  ; A1 is returned with block address of start of code in file.  SEARCH (LEA BUFFER+32.,A5 ;Set up pointer to directory entry @; skipping initial volume entry. (LEA -16.(A5),A0 (MOVE.W (A0),D0 ;Get number of files (CMPI.W #77.,D0 ;Check for limit (BLE.S $5 ;Within limit  ROL.W #8,D0 ;Check if byte directory needs flipped  CMPI.W #77.,D0 ;Check limit again (BGT BADDIR ;Illegal directory   ; Swap bytes in directory (MOVE.W D0,(A0) ;Store swapped number of files (ADDQ.L #4,A0 (MOVE.W D0,D3 (BSR.S BYTSWAP ;Swap the date word (ADDQ.L #4,A0  ; Swap each directory entry  $2 BSR.S BYTSWAP ;First block (BSR.S BYTSWAP ;Last block (BSR.S BYTSWAP ;File kind (ADDA.W #16.,A0 (BSR.S BYTSWAP ;Last byte of data (BSR.S BYTSWAP ;Date (SUBQ.W #1,D3 (BNE $2 ;Back for more (  $5 TST.B D0 ;Check for empty directory (BEQ.S $40 ;Directory was empty, entry not found (  ; Base of loop for each entry  $10 MOVEA.L A6,A0 ;Set up pointer to test string (MOVEA.L A5,A1 ;Set up pointer to directory entry (CLR.L D1 (MOVE.B (A6),D1 ;Set up byte count for testing (  ; Base of loop for each character  $20 CMPM.B (A0)+,(A1)+ ;Compare the entries (DBNE D1,$20 (BNE.S $30 ;Found miscompare (CLR.L D2 (MOVE.W -6(A5),D1 ;Get starting block number (MOVE.W -4(A5),D2 ;Get trailing block number (SUB.W D1,D2 ;Form size in blocks (LSL.L #8,D2 ;Form size in bytes (LSL.L #1,D2 (CLR.B D0 ;Zero flag indicates success (RTS (  $30 SUBQ.B #1,D0 ;Check entry count (BEQ.S $40 ;Could not find entry (LEA 26.(A5),A5 ;Short way to advance address pointer (BRA.S $10 ;Back for another try (  $40 MOVE.B #1,D0 ;NE flag indicates failure (RTS (   ; Byte swap routine  BYTSWAP MOVE.W (A0),D1 (ROL.W #8,D1 (MOVE.W D1,(A0)+ (RTS    ; Found error while reading diskette.  ; Printout message about problem and return to debugger.  BADREAD LEA READMSG,A0 ;Printout "Error reading "  BRA.S PRTERR    ; Could not find "BIOS" password in SYSTEM.BIOS file.  ; Printout message about problem and return to debugger.  BADPASS LEA PASSMSG,A0 ;Printout "Not BIOS code in " (BRA.S PRTERR    ; Directory entry size was in error.  ; Printout message about problem and return to Debugger.  BADDIR ADDQ.L #4,A7 ;Get rid of return address (LJSR TERMCRLF (LEA DIRMSG,A0 ;Printout "Illegal directory" (BRA.S PRTERR    ; Could not find file in directory.  ; Printout message about problem and return to debugger.  SRCHERR LEA SRCHMSG,A0 ;Printout "Could not find " (   ; Printout error message  PRTERR LJSR TERMCRLF (LJSR TERMTEXT 8(MOVEA.L A6,A0 ;Set up pointer to name of item being read (ADDQ.L #1,A0 ;Bypass byte count  PRTERR1 LJSR TERMTEXT ;Printout type of information (LJSR TERMCRLF  PRTERR2 MOVEA.L (A3),A0 ;Return address to Debugger  JMP (A0)  (  ; Passwords (must have word alignment)  BIOSPASS.ASCII "BIOS" ;MU.BIOS password  CONFPASS.ASCII "MUCF" ;Configuration password  EXBTPASS.ASCII "MUBE" ;Boot extension password    ; Messages  INITMSG .ASCII "SAGE Multi-User System Bootstrap" (.BYTE 0   READMSG .ASCII "Error reading " (.BYTE 0   SRCHMSG .ASCII "Could not find " (.BYTE 0   PASSMSG .ASCII "Not BIOS code in " (.BYTE 0   NOTSKMSG.ASCII "No Tasks" (.BYTE 0   ASKCONF .ASCII "Configuration file? " (.BYTE 0   NOCONFIG.ASCII "Not MU configuration" (.BYTE 0    BADEXT .BYTE 7 (.ASCII "Bad MU.BOOTEXT.CODE" (.BYTE 0   DIRMSG .ASCII "Illegal "  ; Must fall into DIRNAM.   ; File names  DIRNAM .ASCII "directory" ;Only for error printout (.BYTE 0   BIOSNAM .BYTE 8 ;String byte count (.ASCII "MU4.BIOS" (.BYTE 0 ;Terminator for TERMTEXT   CONFNAME.BYTE 9 (.ASCII "MU.CONFIG" (.BYTE 0 (  USERBOOT.BYTE 14. (.ASCII "USER.BOOT.CODE" (.BYTE 0 (  BOOTEXT .BYTE 15. (.ASCII "MU.BOOTEXT.CODE" (.BYTE 0 ( (.BYTE 2 ;Bootstrap Version @;If bootstrap ends with a non-zero value @; the device to device bootstrap transfer @; can determine the size. ( (.ALIGN 2  SCRATCH .EQU *+1024. ;Ram scratch area  ;Offsets: @; 0.- Return address to Debugger @; 4.- Drive number (0 or 1) @; 6.- Logical block for BIOS @; 8.- Starting address of BIOS @;12.- Starting address of boot extension @;16. @;20. @;21. @;22.- Temporary storage (4 bytes)   FILENAME.EQU SCRATCH+26. ;Configuration file name  STACK .EQU FILENAME+18.  BUFFER .EQU STACK+512. ;p-System directory  BUFFER2 .EQU BUFFER+2048. ;First block of BIOS  BUFFER3 .EQU BUFFER2+512. ;Configuration storage  (.END    A B 9O^ {"9(.TITLE "SAGE Multi-User System Bootstrap" .PROC BOOTMU   ;********************************************************************** ;  ; SAGE COMPUTER - Multi-User System Bootstrap from Winchester  ;  ; File: MU4.WBOOT.TEXT  ; Date: 7-Nov-83  ; Issue: 1A  ;  ;  ; COPYRIGHT (c) 1982, 1983 SAGE Computer Technology  ; All Rights Reserved  ;  ;**********************************************************************  ;  ; History:  ;  ;  1 3-May-83 Initial release.  ; 1A 7-Nov-83 Fixed Boot extension and User boot options.  ;  ;**********************************************************************  ;  ; This bootstrap is to be located in logical blocks 0 and 1 on a  ; Winchester Partition. The Winchester bootstrap command in the  ; PROM Debugger will read logical blocks 0 and 1 into memory at  ; location 400H.  ;  ; The bootstrap routine first reads in the p-System directory  ; from the Winchester. Then the bootstrap searches the  ; directory for the file MU.BIOS which contains the SAGE  ; Multi-User Basic Input/Output System routines. Once found the  ; BIOS code is positioned into the highest memory available.  ;  ; Next the bootstrap searches for the file MU.CONFIG. If it  ; finds the file it reads it into memory. Otherwise the bootstrap  ; prompts the user for the configuration file name. An immediate  ; carriage return will terminate the bootstrap. Once the  ; configuration file is found it is read into memory and its  ; address is store at CONFADDR (208H).  ;  ; Finally the bootstrap transfers to the BIOS for initialization  ; and the Multi-User executive takes control. The BIOS only  ; returns if no tasks are defined.  ; ; Note: The Boot extension and User boot have not yet been  ; supported.  ;  ;********************************************************************** (  ; Macro for calls to PROM area.  ; (required for generation of long addresses). (.MACRO LJSR (.WORD 4EB9H (.WORD 00FEH (.WORD %1 (.ENDM (  ; Permanent jump vector assignments in PROM  KEYBCH .EQU 8H ;Get a keyboard character  TERMCHAR.EQU 14H ;Output a character  TERMTEXT.EQU 18H ;Printout text string  TERMCRLF.EQU 1CH ;Printout carriage return & line feed  WDREAD .EQU 3CH ;Read from Winchester (  ; RAM variables for Debugger  MEMTOP .EQU 100H ;Top of memory   ; RAM variables for BIOS  BIOSBASE.EQU 200H  CONFADDR.EQU 208H  (  ; Constants for BOOT positioning  HDSIZE .EQU 26. ;Size of header data in uncompressed code file   (.ASCII "BOOT" ;This text is checked by the Debugger @; bootstrap process to insure that the @; boot area has been initialized with @; a bootstrap routine.   START ;The Debugger transfers control to @; offset 4 in this file. (  LEA SCRATCH,A3 ;Set up RAM area for bootstrap (MOVE.L (A7)+,(A3) ;Save the return address (MOVE.W (A7)+,D0 ;Save the subdevice number (LSL.W #8,D0 (MOVE.B #9,D0 ;Set up physical device number (MOVE.W D0,4(A3) ;Save the drive number (  ; Output initial boot message (LJSR TERMCRLF (LEA INITMSG,A0 ;Printout "SAGE Multi-User Bootstrap" (LJSR TERMTEXT (LJSR TERMCRLF (  ; Read in p-System directory (LEA DIRNAM-1,A6 ;Set up message in case of error @; note: does not have byte count. (MOVE.L #2,-(A7) ;The p-System directory is at block 2 of ( ; each devices. (LEA BUFFER,A0 ;Set up the directory buffer address (MOVE.L A0,-(A7) ;Buffer address 9(MOVEA.W #2048.,A0 ;The directory is 2K bytes long (MOVE.L A0,-(A7) ;Length of transfer (LJSR WDREAD ;Read in the directory with the floppy @; driver in PROM. (BNE BADREAD ;Found error reading directory (  ; Now search for MU.BIOS and read in first block (LEA BIOSNAM,A6 ;Set up search string (BSR SEARCH (BNE SRCHERR ;Could not find MU.BIOS (ADDQ.W #1,D1 ;Code starts at relative block 1 in file (MOVE.L D1,-(A7)  ;Set up logical block for BIOS code (MOVE.L D1,16.(A3) ;Save logical block for later (LEA BUFFER2,A5 ;Set up buffer address for first block (MOVE.L A5,-(A7) ;Buffer address (MOVEA.W #512.,A0 ;Set up size for one block (MOVE.L A0,-(A7) ;Length of transfer (LJSR WDREAD ;Read in first block (BNE BADREAD ;Found error while reading BIOS (  ; Calculate target address for BIOS and read it into memory. (LEA BIOSPASS,A0 ;Check for BIOS password code (LEA BUFFER2+HDSIZE,A5 ;Adjust for header data in code file (CMPM.L (A5)+,(A0)+ (BNE BADPASS ;Password is not correct (MOVE.L 16.(A3),-(A7) ;Set up logical block number (MOVEA.L MEMTOP,A1 ;Get current top of memory (MOVEA.W (A5)+,A0 ;Get BIOS code size (ADDA.W #HDSIZE,A0 ;Also read in header data (SUBA.L A0,A1 ;Set up code address for floppy driver (MOVE.L A1,-(A7) ;Set up BIOS codefile address in memory (MOVE.L A0,-(A7) ;Set up floppy transfer length (ADDA.W #HDSIZE,A1 ;Now form actual code address (MOVEA.L A1,A4 ;Save base of BIOS to calculate init address (MOVEA.W (A5)+,A0 ;Get size of BIOS buffer area (SUBA.L A0,A1 ;Form base of BIOS area in memory (MOVE.L A1,20(A3) ;Store new top of memory address (ADDA.W (A5),A4 ;Form BIOS Initialization routine address (MOVE.L A4,8(A3) ;Save starting address (LJSR WDREAD ;Read in the whole BIOS (BNE BADREAD ;Found error while reading BIOS (  ; Read in Configuration info (LEA CONFNAME,A6 ;Set up search string (BSR SEARCH (BEQ $60 ;Found default file MU.CONFIG   ; Prompt user for name of configuration file  $10 LJSR TERMCRLF (LEA ASKCONF,A0 ;Ask for configuration file (LJSR TERMTEXT (LEA FILENAME,A6 ;Build filename string (CLR.W D1 (MOVE.B D1,(A6)  $20  LJSR KEYBCH ;Get a keyboard character (CMPI.B #0DH,D0 ;Check for carriage return (BEQ.S $50 ;Found terminator (CMPI.B #8,D0 (BEQ.S $40 ;Found Backspace (CMPI.B #" ",D0 (BLE.S $20 ;Don't process control characters or space (CMPI.B #15.,D1 (BGE.S $20 ;Too many characters (ADDQ.W #1,D1 ;Advance pointer (MOVE.B D0,0(A6,D1.W) ;Store character  CLR.B 1(A6,D1) ;Set up null terminator  $25 MOVE.B D1,(A6) ;Update string count (LJSR TERMCHAR ;Echo the character (BRA $20 ;Back for another character (  ; Handle backspace  $40 TST.W D1 (BEQ $20 ;Don't backspace past beginning (LJSR TERMCHAR ;Output Backspace (MOVEQ #" ",D0 ;Output blank (LJSR TERMCHAR (MOVEQ #8,D0 ;Set up another backspace (SUBQ.W #1,D1 ;Back up the pointer (BRA $25 (  ; Handle no file  $45 LEA SRCHMSG,A0 ;Printout "Could not find " (LJSR TERMTEXT (MOVEA.L A6,A0 (ADDQ.L #1,A0 (LJSR TERMTEXT ;Printout file name (LJSR TERMCRLF (BRA $10 ;Try again (  ; Handle carriage return  $50 LJSR TERMCRLF (TST.B D1 (BEQ PRTERR2 ;Null name field, exit debugger (BSR SEARCH (BNE $45 ;Did not find file (  $60 MOVE.L D1,-(A7) ;Set up logical block :(LEA BUFFER3,A5 ;Set up buffer address (MOVE.L A5,-(A7) ;Buffer address for driver (ADDA.W #512.+HDSIZE+6,A5 (MOVE.L A5,24.(A3) ;Save address in BIOS area (ADDA.L D2,A5 ;Set up free address beyond configuration (MOVE.L A5,12.(A3) (MOVE.L D2,-(A7) ;Length of transfer (LJSR WDREAD ;Read in configuration (BNE BADREAD ;Found error while reading Configuration ( (MOVEA.L 24.(A3),A5 ;Check password on configuration (SUBQ.L #6,A5 (LEA CONFPASS,A0 (CMPM.L (A5)+,(A0)+ (BEQ.S $65 ;Password is good (LEA NOCONFIG,A0 ;Printout not configuration (LJSR TERMTEXT (LJSR TERMCRLF (BRA $10 (  ; Search for the optional MU.BOOTEXT.CODE file  $65 MOVEQ #0,D4 ;Default address (LEA BOOTEXT,A6 (BSR SEARCH (BNE.S $70 ;Optional boot extension not found (MOVE.L D1,-(A7) ;Set up logical block (LEA SCRATCH,A3 (MOVE.L 12.(A3),-(A7) ;Set up memory buffer (MOVE.L D2,-(A7) ;Length of transfer (LJSR WDREAD ;Read in boot extension code (BNE BADREAD ;Found error while reading boot extension (LEA SCRATCH,A3 (MOVE.L 12.(A3),D4  ADDI.L #512.+HDSIZE,D4 ;Bias to p-System assemby code (MOVEA.L D4,A5 (LEA EXBTPASS,A0  CMPM.L (A5)+,(A0)+ (BEQ.S $70 ;Good boot extension (LEA BADEXT,A0 ;Printout bad MU.BOOTEXT.CODE (LJSR TERMTEXT (LJSR TERMCRLF (MOVEQ #0,D4 ;No boot extension (  $70 LEA STACK,SP (MOVE.L D4,-(SP) ;Pass boot extension address (MOVE.W 4(A3),-(SP) ;Physical drive number   ; Search for the optional USER.BOOT.CODE routine (MOVEQ #0,D4 ;Default User boot routine address (LEA USERBOOT,A6 (BSR SEARCH (BNE.S $80 ;No user boot (MOVE.W D1,D4 ;Save routine block address  $80 MOVE.L D4,-(SP) ;Pass User Boot routine address (MOVE.L D2,-(SP) ;Pass User Boot routine size (MOVE.W #0ABCDH,-(SP) ;New boot indicator code ( ; Initialize the BIOS  ENTER MOVE.L 20.(A3),BIOSBASE (MOVE.L 24.(A3),CONFADDR (MOVEA.L 8(A3),A4 ;Get BIOS initialization address (JSR (A4) ;Initialize BIOS (  ; Never returns unless no tasks defined (MOVE #2700H,SR ;Make sure interrupts disabled (LEA NOTSKMSG,A0 (BRA PRTERR1 ( (  ; Search Routine for directory entry  ; A6 is pointer to target string.  ; A1 is returned with block address of start of code in file.  SEARCH (LEA BUFFER+32.,A5 ;Set up pointer to directory entry @; skipping initial volume entry. (LEA -16.(A5),A0 (MOVE.W (A0),D0 ;Get number of files (CMPI.W #77.,D0 ;Check for limit (BLE.S $5 ;Within limit  ROL.W #8,D0 ;Check if byte directory needs flipped  CMPI.W #77.,D0 ;Check limit again (BGT BADDIR ;Illegal directory   ; Swap bytes in directory (MOVE.W D0,(A0) ;Store swapped number of files (ADDQ.L #4,A0 (MOVE.W D0,D3 (BSR.S BYTSWAP ;Swap the date word (ADDQ.L #4,A0  ; Swap each directory entry  $2 BSR.S BYTSWAP ;First block (BSR.S BYTSWAP ;Last block (BSR.S BYTSWAP ;File kind (ADDA.W #16.,A0 (BSR.S BYTSWAP ;Last byte of data (BSR.S BYTSWAP ;Date (SUBQ.W #1,D3 (BNE $2 ;Back for more (  $5 TST.B D0 ;Check for empty directory (BEQ.S $40 ;Directory was empty, entry not found (  ; Base of loop for each entry  $10 MOVEA.L A6,A0 ;Set up pointer to test string (MOVEA.L A5,A1 ;Set up pointer to directory entry (CLR.L D1 (MOVE.B (A6),D1 ;Set up byte count for testing (  ; Base of loop for each character : $20 CMPM.B (A0)+,(A1)+ ;Compare the entries (DBNE D1,$20 (BNE.S $30 ;Found miscompare (CLR.L D2 (MOVE.W -6(A5),D1 ;Get starting block number (MOVE.W -4(A5),D2 ;Get trailing block number (SUB.W D1,D2 ;Form size in blocks (LSL.L #8,D2 ;Form size in bytes (LSL.L #1,D2 (CLR.B D0 ;Zero flag indicates success (RTS (  $30 SUBQ.B #1,D0 ;Check entry count (BEQ.S $40 ;Could not find entry (LEA 26.(A5),A5 ;Short way to advance address pointer (BRA.S $10 ;Back for another try (  $40 MOVE.B #1,D0 ;NE flag indicates failure (RTS (   ; Byte swap routine  BYTSWAP MOVE.W (A0),D1 (ROL.W #8,D1 (MOVE.W D1,(A0)+ (RTS    ; Found error while reading diskette.  ; Printout message about problem and return to debugger.  BADREAD LEA READMSG,A0 ;Printout "Error reading "  BRA.S PRTERR    ; Could not find "BIOS" password in SYSTEM.BIOS file.  ; Printout message about problem and return to debugger.  BADPASS LEA PASSMSG,A0 ;Printout "Not BIOS code in " (BRA.S PRTERR    ; Directory entry size was in error.  ; Printout message about problem and return to Debugger.  BADDIR ADDQ.L #4,A7 ;Get rid of return address (LJSR TERMCRLF (LEA DIRMSG,A0 ;Printout "Illegal directory" (BRA.S PRTERR    ; Could not find file in directory.  ; Printout message about problem and return to debugger.  SRCHERR LEA SRCHMSG,A0 ;Printout "Could not find " (   ; Printout error message  PRTERR LJSR TERMCRLF (LJSR TERMTEXT (MOVEA.L A6,A0 ;Set up pointer to name of item being read (ADDQ.L #1,A0 ;Bypass byte count  PRTERR1 LJSR TERMTEXT ;Printout type of information (LJSR TERMCRLF  PRTERR2 MOVEA.L (A3),A0 ;Return address to Debugger  JMP (A0)  (  ; Passwords (must have word alignment)  BIOSPASS.ASCII "BIOS" ;MU.BIOS password  CONFPASS.ASCII "MUCF" ;Configuration password  EXBTPASS.ASCII "MUBE" ;Boot extension password    ; Messages  INITMSG .ASCII "SAGE Multi-User System Bootstrap" (.BYTE 0   READMSG .ASCII "Error reading " (.BYTE 0   SRCHMSG .ASCII "Could not find " (.BYTE 0   PASSMSG .ASCII "Not BIOS code in " (.BYTE 0   NOTSKMSG.ASCII "No Tasks" (.BYTE 0    ASKCONF .ASCII "Configuration file? " (.BYTE 0   NOCONFIG.ASCII "Not MU configuration" (.BYTE 0    BADEXT .BYTE 7 (.ASCII "Bad MU.BOOTEXT.CODE" (.BYTE 0   DIRMSG .ASCII "Illegal "  ; Must fall into DIRNAM.   ; File names  DIRNAM .ASCII "directory" ;Only for error printout (.BYTE 0   BIOSNAM .BYTE 8 ;String byte count (.ASCII "MU4.BIOS" (.BYTE 0 ;Terminator for TERMTEXT   CONFNAME.BYTE 9 (.ASCII "MU.CONFIG" (.BYTE 0 (  USERBOOT.BYTE 14. (.ASCII "USER.BOOT.CODE" (.BYTE 0 (  BOOTEXT .BYTE 15. (.ASCII "MU.BOOTEXT.CODE" (.BYTE 0 ( (.BYTE 2 ;Bootstrap Version @;If bootstrap ends with a non-zero value @; the device to device bootstrap transfer @; can determine the size. ( (.ALIGN 2  SCRATCH .EQU *+1024. ;Ram scratch area  ;Offsets: @; 0.- Return address to Debugger @; 4.- Drive number (0 or 1) @; 6. @; 8.- Starting address of BIOS @;12.- Starting address of boot extension @;16.- Logical block for BIOS @;20.- Base of BIOS @;24.- Configuration address   FILENAME.EQU SCRATCH+28. ;Configuration file name  STACK .EQU FILENAME+18. ;Stack while booting  BUFFER .EQU STACK+512. ;p-System directory  BUFFER2 .EQU BUFFER+2048. ;First block of BIOS  BUFFER3 .EQU BUFFER2+512. ;Configuration storage  (.END  ;A $CURSOR $EQUAL  7NO.(.TITLE "Multi-User p-System Version 4.21 Bootstrap" .PROC BOOTPSYS   ;********************************************************************** ;  ; Stride Micro - p-System Bootstrap  ;  ; File: MU.PBOOT.TEXT  ;  ; File creation date: 03-May-83  ; Last revision date: 11-Mar-85 by WRB  ;  ; Issue: 4  ;  ;  ; COPYRIGHT (c) 1984 Stride Micro  ; All Rights Reserved Worldwide  ;  ;**********************************************************************  ;  ; History:  ;  ; 1 3-May-83 Initial release.  ; 1A 24-Oct-83 Fixed code pool address calculation.  ; 2 9-Mar-84 Changed parameter passing to interpreter.  ; Now load interpreter at top of area.  ; 3 25-Sep-84 Stride release.  ; 4 11-Mar-85 Modified for IV.21.  ;  ;**********************************************************************  ;  ; This bootstrap is to be located in logical blocks 0 and 1 on a  ; floppy diskette. The floppy diskette bootstrap command in the  ; Multi-User monitorwill read logical blocks 0 and 1 into memory at  ; the base of the task memory area.  ;  ; The bootstrap routine first reads in the p-System directory  ; from the floppy diskette.  ;  ; The bootstrap then searches the directory for the file  ; SYSTEM.INTERP and read it into memory. The file SYSTEM.MISCINFO  ; is read in to patch the Code Pool address and size.  ;  ; Finally the p-System interpreter is started after several  ; parameters are pushed onto the stack.  ;  ;********************************************************************** (  ( (.ASCII "MUBT" ;This text is checked by the monitor @; bootstrap process to insure that the @; boot area has been initialized with @; a bootstrap routine.   START ;The monitor transfers control to @; offset 4 in this file. (  LEA SCRATCH,A3 ;Set up RAM area for bootstrap (MOVE.L (A7)+,(A3) ;Save the return address (MOVEA.L A3,SP ;Set up stack (MOVEQ #24.,D0 ;Get boot device (TRAP #14. (MOVE.W D0,4(A3) ;Save device number for boot reads (  ; Output initial boot message (BSR TERMCRLF (LEA INITMSG,A0 ;Printout "p-System Bootstrap" (BSR TERMTEXT (BSR TERMCRLF   ; Calculate memory areas (MOVEQ #22.,D0 ;Get base of memory area (TRAP #14. (MOVE.L A0,12.(A3) ;Save base of p-System Data area (MOVEA.L A0,A1 (MOVEQ #1,D0 (SWAP D0 (ADDA.L D0,A1 ;Allow at least 64K ( (MOVEQ #23.,D0 ;Get top of memory area (TRAP #14. (MOVE.L A0,16.(A3) ;Save top of memory area (CMPA.L A0,A1 (BHI NOMEMORY ;Data area too big  SUBA.L 12.(A3),A0 ;(MOVE.L A0,38.(A3) ;Save total size of memory   ; Read in p-System directory (LEA DIRNAM-1,A6 ;Set up message in case of error @; note: does not have byte count. (LEA ARGS,A0 (MOVE.W 4(A3),(A0) ;Boot device number for BIOS calls (ADDQ.L #4,A0 ;Advance to size field (CLR.W (A0)+ (MOVE.W #2048.,(A0)+ ;Size in bytes (PEA BUFFER (MOVE.L (SP)+,(A0)+ ;Set up Directory address (MOVE.W #2,(A0)+ ;Set up logical block for directory (CLR.L  (A0)+ ;Control word and High part of logical block (MOVEQ #11.,D0 ;Set up read (LEA ARGS,A0 (TRAP #14. (TST.W 2(A0) ;Check error code (BNE BADREAD ;Found error reading in directory ( (  ; Search for SYSTEM.INTERP and read it into memory (LEA BOOTNAM,A6 ;Set up search string (BSR SEARCH (LEA ARGS,A0 (MOVE.W 4(A3),(A0) ;Calculate floppy number for BIOS calls (ADDQ.L #4,A0 ;Advance to size field (MOVE.L D2,(A0)+ ;Size in bytes (SUB.L D2,16.(A3) ;Leave room for interpreter (MOVE.L 16.(A3),(A0)+ ;Set up interpreter address (MOVE.W D1,(A0)+ ;Set up logical block for interpreter code ( ; Note: assumes a compressed code file (CLR.W (A0)+ ;Control word (MOVEQ #11.,D0 ;Set up read (LEA ARGS,A0 (TRAP #14. (TST.W 2(A0) ;Check error code (BNE BADREAD ;Found error reading in interpreter file (  ; Lookup SYSTEM.PASCAL and start p-System.  ENTER LEA SCRATCH,A3 (MOVE.W 4(A3),D7 ;Get drive number (MOVEA.L 16.(A3),SP ; set user stack pointer (PEA BUFFER ;Address of directory (MOVE.L 38.(A3),-(SP) ;Size of memory area (MOVE.L 12.(A3),-(SP) ; set low memory address (MOVE.W D7,-(SP) ;Drive number (MOVEA.L 16.(A3),A3 ; jump into the interpreter (JMP (A3) ( ( (  ; Search Routine for directory entry  ; A6 is pointer to target string.  ; A1 is returned with block address of start of code in file.  SEARCH (LEA BUFFER+32.,A5 ;Set up pointer to directory entry @; skipping initial volume entry. (LEA -16.(A5),A0 (MOVE.W (A0),D0 ;Get number of files (CMPI.W #77.,D0 ;Check for limit (BLE.S $5 ;Within limit  ROL.W #8,D0 ;Check if byte directory needs flipped  CMPI.W #77.,D0 ;Check limit again (BGT BADDIR  ;Illegal directory   ; Swap bytes in directory (MOVE.W D0,(A0) ;Store swapped number of files (ADDQ.L #4,A0 (MOVE.W D0,D3 (BSR.S BYTSWAP ;Swap the date word (ADDQ.L #4,A0  ; Swap each directory entry  $2 BSR.S BYTSWAP ;First block (BSR.S BYTSWAP ;Last block (BSR.S BYTSWAP ;File kind (ADDA.W #16.,A0 (BSR.S BYTSWAP ;Last byte of data (BSR.S BYTSWAP ;Date (SUBQ.W #1,D3 (BNE $2 ;Back for more (  $5 TST.B D0 ;Check for empty directory (BEQ.S SRCHERR ;Directory was empty, entry not found (  ; Base of loop for each entry  $10 MOVEA.L A6,A0 ;Set up pointer to test string (MOVEA.L A5,A1 ;Set up pointer to directory entry (CLR.L D1 (MOVE.B (A6),D1 ;Set up byte count for testing (  ; Base of loop for each character  $20 CMPM.B (A0)+,(A1)+ ;Compare the entries (DBNE D1,$20 (BNE.S $30 ;Found miscompare (CLR.L D2 (MOVE.W -6(A5),D1 ;Get starting block number (MOVE.W -4(A5),D2 ;Get trailing block number (SUB.W D1,D2 ;Form size in blocks (LSL.L #8,D2 ;Form size in bytes (LSL.L #1,D2 (RTS (  $30 SUBQ.B #1,D0 ;Check entry count (BEQ.S SRCHERR ;Could not find entry (LEA 26.(A5),A5 ;Short way to advance address pointer (BRA.S $10 ;Back for another try (  < ; Byte swap routine  BYTSWAP MOVE.W (A0),D1 (ROL.W #8,D1 (MOVE.W D1,(A0)+ (RTS    ; Printout not enough memory  NOMEMORY (LEA MEMMSG,A0 (BRA PRTERR1    ; Found error while reading diskette.  ; Printout message about problem and return to debugger.  BADREAD LEA READMSG,A0 ;Printout "Error reading "  BRA.S PRTERR   ; Found error while writing  BADWRIT LEA WRITMSG,A0 ;Printout "Error writing " (BRA.S PRTERR     ; Directory entry size was in error.  ; Printout message about problem and return to Debugger.  BADDIR ADDQ.L #4,A7 ;Get rid of return address (BSR TERMCRLF (LEA DIRMSG,A0 ;Printout "Illegal directory" (BRA.S PRTERR    ; Could not find file in directory.  ; Printout message about problem and return to debugger.  SRCHERR ADDQ.L #4,A7 ;Get rid of return address (LEA SRCHMSG,A0 ;Printout "Could not find " (   ; Printout error message  PRTERR BSR TERMCRLF (BSR TERMTEXT (MOVEA.L A6,A0 ;Set up pointer to name of item being read (ADDQ.L #1,A0 ;Bypass byte count  PRTERR1 BSR TERMTEXT ;Printout type of information (BSR TERMCRLF (MOVEA.L (A3),A0 (JMP (A0) ;Return to caller   ; Printout text string  TERMTEXT (MOVE.B (A0)+,D0 (BEQ.S $10 (TRAP #10. (BRA TERMTEXT  $10 RTS   ; Printout Carriage Return and Line Feed  TERMCRLF (MOVEQ #13.,D0 ;Carriage Return (TRAP #10. (MOVEQ #10.,D0 ;Line Feed (TRAP #10. (CLR.B D0 ;Nulls for slow terminals (TRAP #10. (TRAP #10.  TRAP #10. (TRAP #10. (TRAP #10. (RTS    ; Messages  INITMSG .ASCII "Multi-User p-System IV.21 Bootstrap" (.BYTE 0   READMSG .ASCII "Error reading " (.BYTE 0   WRITMSG .ASCII "Error writing " (.BYTE 0   SRCHMSG .ASCII "Could not find " (.BYTE 0   MEMMSG .ASCII "Not enough memory" (.BYTE 0   DIRMSG .ASCII "Illegal "  ; Must fall into DIRNAM.   ; File names  DIRNAM .ASCII "directory" ;Only for error printout (.BYTE 0   BOOTNAM .BYTE 13. ;String byte count (.ASCII "SYSTEM.INTERP" (.BYTE 0 ;Terminator for TERMTEXT   MISCNAM .BYTE 15. (.ASCII "SYSTEM.MISCINFO" (.BYTE 0 ( (.BYTE 4 ;Bootstrap Version @;If bootstrap ends with a non-zero value @; the device to device bootstrap transfer @; can determine the size. ( (.ALIGN 2  SCRATCH .EQU *+1024. ;Ram scratch area  ;Offsets: @; 0.- Return address to Monitor @; 4.- Boot device number @; 6.- unused (2 bytes) @; 8.- unused (4 bytes) @;12.- Base of Data area @;16.- Top of Data area @;20.- unused (2 bytes) @;22.- Temporary storage (4 bytes)  ;26.- Base of code pool (4 bytes) @;30.- Size of code pool (2 bytes)  ;32.- Base of socket pool (4 bytes) @;36.- Size of socket pool (2 bytes)  ;38.- Size of memory area (4 bytes)   ARGS .EQU SCRATCH+42.  BUFFER .EQU ARGS+18.  BUFFER2 .EQU BUFFER+2048.  (.END  <A B C  :$O^֧8(.TITLE "Multi-User Bootstrap Extension for RAM Disk copy" (.PROC BOOTEXT   ;********************************************************************** ;  ; SAGE COMPUTER - Multi-User Bootstrap Extension  ;  ; File: MU.BOOTEXT.TEXT  ; Date: 26-Sep-83  ; Issue: 1  ;  ;  ; COPYRIGHT (c) 1983 SAGE Computer Technology  ; All Rights Reserved  ;  ;**********************************************************************  ;  ; History:  ;  ; 1  26-Sep-83 Initial release.  ;  ;**********************************************************************  ;  ;  ;********************************************************************** (  ; RAM variables for Debugger  BOOTFLGS.EQU 105H ;Bootstrap flag   (.ASCII "MUBE" ;This text is checked by the Multi-User @; bootstrap process to insure that the @; boot area has been initialized with @; a bootstrap extension routine.   START ;Multi-User bootstrap calls offset 4 in @; this file. ( (LEA SCRATCH,A3 ;Save return address (MOVE.L (SP)+,4(A3) (BTST #0,BOOTFLGS ;Check for RAM Disk copy inhibit (BNE ALLDONE ;Don't copy files   ; Allow reading of System Device by Task 1  ; First read in previous Control Information Block (LEA BDCIBARG,A0  LEA SYSCIB,A1  MOVE.L A1,8(A0) ;Set up target address (MOVEQ #11.,D0 ;Read request  TRAP #14.   ; Now make copy of block and set up to allow control (LEA SYSCIBNW,A2 (MOVEQ #12.-1,D0  $10 MOVE.B (A1)+,(A2)+ (DBF D0,$10 (LEA SYSCIBNW,A2 (BSET #1,1(A2) ;Allow Task 1 to read (  ; Write out new Control Information Block (MOVE.L A2,8(A0) ;Set up source address (MOVEQ #12.,D0 ;Write request (TRAP #14.   ; Read in Channel Map (LEA CHARG,A0 (LEA CHMAP,A1 (MOVE.L A1,8(A0) ;Set up destination address (MOVEQ #11.,D0 ;Read request (TRAP #14. (  ; Make a copy of Channel Map and set up RAM Disk devices  LEA CHMAPNEW,A2 (MOVEQ #32.-1,D0  $20 MOVE.B (A1)+,(A2)+ (DBF D0,$20 (LEA CHMAPNEW+<16*2>,A2 (MOVE.W #11.,(A2)+ (MOVE.W #21.,(A2)+ (MOVE.W #22.,(A2)+ (MOVE.W #23.,(A2)+   ; Write back new Channel Map (LEA CHMAPNEW,A2 (MOVE.L A2,8(A0) ;New Channel Map address (MOVEQ #12.,D0 ;Write request (TRAP #14.   ; Read in RAM Disk Configurations (LEA RDCNFARG,A0 (LEA RD1CONF,A1 (MOVE.L A1,8(A0) ;Destination address (MOVE.W #16.,14.(A0) ;Device (MOVEQ #11.,D0 ;Read request (TRAP #14. ( (LEA RDCNFARG,A0 (LEA RD2CONF,A1 (MOVE.L A1,8(A0) ;Destination address (MOVE.W #17.,14.(A0) ;Device (MOVEQ #11.,D0 ;Read request (TRAP #14.  (LEA RDCNFARG,A0 (LEA RD3CONF,A1 =(MOVE.L A1,8(A0) ;Destination address (MOVE.W #18.,14.(A0) ;Device (MOVEQ #11.,D0 ;Read request (TRAP #14.  (LEA RDCNFARG,A0 (LEA RD4CONF,A1 (MOVE.L A1,8(A0) ;Destination address (MOVE.W #19.,14.(A0) ;Device (MOVEQ #11.,D0 ;Read request (TRAP #14. (  ; Read in directory from boot device  LEA DIRNAM-1,A6 ;In case of error (LEA DIRARG,A0 (LEA BUFFER,A1 (MOVE.L A1,8(A0) ;Set up buffer address (MOVEQ #11,D0 ;Read request (TRAP #14. (TST.W 2(A0) ;Check for error (BNE BADREAD ;Found read error    ; Now for each RAM Disk zero the directory (LEA RD1CONF,A2  MOVEQ #16.,D7 ;Device number (BSR ZERODIR ;Zero directory of RAM Disk  (LEA RD2CONF,A2 (MOVEQ #17.,D7 ;Device number (BSR ZERODIR ;Zero directory of RAM Disk  (LEA RD3CONF,A2 (MOVEQ #18.,D7 ;Device number (BSR ZERODIR ;Zero directory of RAM Disk  (LEA RD4CONF,A2 (MOVEQ #19.,D7 ;Device number (BSR ZERODIR ;Zero directory of RAM Disk  (BRA EXIT2    ; Zero Directory  ZERODIR (MOVE.L (A2),D0 ;Check if this RAM Disk exists (BEQ $200 ;Device is not equipped (LEA SCRATCH,A3 (MOVE.L D0,8(A3) ;Save base of RAM Disk (BTST #0,8(A2) ;Check if to be initialized (BEQ $200 ;No initialization specified (MOVE.L 4(A2),D1 ;Top of RAM Disk (SUB.L D0,D1 (BMI $200 ;Too big (DIVU #512.,D1 (TST.W D1 (BMI $200 ;Too big (CMPI.W #6.,D1 (BLE $200 ;Too small (MOVEA.L (A2),A5 (ADDA.W #1024.,A5 ;Beginning of directory (MOVEA.L A5,A0 (MOVE.W #512.-1,D0 ;Clear directory  $10 CLR.L (A0)+ (DBF D0,$10 (MOVEA.L A5,A0 (ADDQ.L #2,A0 ;First block = 0 (MOVE.W #6,(A0)+ ;Next block = 6 (ADDQ.L #2,A0 ;DFKIND = 0 (LEA NEWNAME,A1 (MOVE.W #"1"+16.,D0 (SUB.B D7,D0 (MOVE.B D0,7(A1) ;Set up last character of name (MOVE.L (A1)+,(A0)+ ;Device name = RAMDSKx (MOVE.L (A1)+,(A0)+ (MOVE.W D1,(A0)+ ;Set up size of device in blocks (ADDQ.L #4,A0 ;Bypass number of files and load time (MOVE.W BUFFER+20.,(A0)+ ;Set up last date (CMPI.B #16.,D7 ;Check for first RAM Disk (BNE $200 ;Not first RAM Disk (MOVEM.L A0,-(SP) (LEA BOOTRAM,A0 ;Printout 'Copying to RAM Disk' (BSR TERMTEXT (BSR TERMCRLF (MOVEM.L (SP)+,A0 (LEA SCRATCH,A3 ;Set up scratch area (  ; Set up initial variables (ADDQ.L #4,A0 ;Advance to first file entry in directory (LEA BUFFER,A4 ;Source directory address (MOVEA.L A5,A2 ;RAM Disk address (ADDA.W #2048.,A2 ; bypass directory (MOVE.W #6,D4 ;Block number for RAM Disk (SUB.W D4,D1 ;Number of blocks left in RAM Disk (CLR.W D3 ;Number of files in RAM Disk (MOVE.W BUFFER+16.,D2 ;Number of files on source diskette (  ; Now process each file on source diskette  $20 SUBQ.W #1,D2 ;Check if done (BLT.S $100 ;Done with source files (ADDA.W #26.,A4 ;Advance source directory address  MOVE.L ENDBOOT,D0 (CMP.L 6(A4),D0 ;Check for file: ENDBOOT (BNE.S $25 ;File not found (MOVE.L ENDBOOT+4,D0 (CMP.L 10.(A4),D0 (BEQ.S $100 ;Found file, terminate copy  $25 CLR.L D0 (MOVE.W 2(A4),D0 ;Calculate file size in blocks (SUB.W (A4),D0 (SUB.W D0,D1 ;Will it fit in remaining RAM Disk (BLT.S $90 ;Would not fit ( (MOVE.W D4,(A0)+ ;Set up First block in directory (ADD.W D0,D4 (MOVE.W D4,(A0)+ ;Set up Next block in directory (ADDQ.W #1,D3 ;Advance number of RAM Disk files ( = ; Set up transfer (LEA RAMMSG-1,A6 ;Set up for possible error message (MOVE.L A0,(A3) ;Save A0 temporarily (LEA ARGS,A0 (MOVE.W #9,(A0) ;Device number (ADDQ.L #4,A0 (ASL.L #8,D0 ;Multiply by 512 (ASL.L #1,D0 (MOVE.L D0,(A0)+ ;Size in bytes (MOVE.L A2,(A0)+ ;Destination of RAM Disk (ADDA.L D0,A2 ;Advance RAM Disk address (MOVE.W (A4),(A0)+ ;Logical Block on device (CLR.L (A0)+ ;Control word & High block number (MOVEQ #11.,D0 ;Set up read request (LEA ARGS,A0 (TRAP #14. (TST.W 2(A0) (BNE BADREAD ;Found error reading diskette (MOVEA.L (A3),A0 ;Restore A0 (  ; Complete the loop (LEA 4(A4),A1 ;Set up copy of directory entry (MOVEQ #11.-1,D0  $30 MOVE.W (A1)+,(A0)+ (DBF D0,$30 (BRA $20 ;Back for more files (  ; File would not fit  $90 ADD.W D0,D1 ;Put back size (BRA $20 ;Try more anyway (  ; Done transfering all files  $100 MOVE.W D3,16.(A5) ;Set up number of RAM Disk files   ; Now set up RAM Disk Bootstrap (LEA BOOTFILE,A6 ;Look for RAM Disk bootstrap file (BSR SEARCH (BNE $200 ;Could not find bootstrap (ADDQ.W #1,D1 ;Code starts at relative block 1 (LEA ARGS,A0 (MOVE.L #1536.,4(A0) ;Read 3 blocks (LEA BUFFER1,A1 (MOVE.L A1,8(A0) ;Buffer location (MOVE.W D1,12.(A0) ;Block number (CLR.L 14.(A0) ;Control & High block number (MOVEQ #11.,D0 ;Read request (TRAP #14. (TST.W 2(A0) (BNE READMSG ;Error reading bootstrap (LEA 26.(A1),A1 (MOVE.W #256.-1,D0 (LEA SCRATCH,A3 (MOVEA.L 8(A3),A0 ;Get base of RAM Disk  $110 MOVE.L (A1)+,(A0)+ ;Move bootstrap (DBF D0,$110   $200 RTS     ; Write back Channel Map  EXIT2 LEA CHARG,A0 (LEA CHMAP,A2 (MOVE.L A2,8(A0) ;New Channel Map address (MOVEQ #12.,D0 ;Write request (TRAP #14.  ; Fall into EXIT1   ; Write back Boot Device's Control Information Block & terminate  EXIT1 LEA BDCIBARG,A0  LEA SYSCIB,A1 (MOVE.L A1,8(A0) ;Set up source address (MOVEQ #12.,D0 ;Write request  TRAP #14.  ; Fall into ALLDONE    ALLDONE LEA SCRATCH,A3 (MOVEA.L 4(A3),A0 (JMP (A0) ( (  ; Search Routine for directory entry  ; A6 is pointer to target string.  ; A1 is returned with block address of start of code in file.  SEARCH (LEA BUFFER+32.,A5 ;Set up pointer to directory entry @; skipping initial volume entry. (LEA -16.(A5),A0 (MOVE.W (A0),D0 ;Get number of files (CMPI.W #77.,D0 ;Check for limit (BLE.S $5 ;Within limit  ROL.W #8,D0 ;Check if byte directory needs flipped  CMPI.W #77.,D0 ;Check limit again (BGT BADDIR ;Illegal directory   ; Swap bytes in directory (MOVE.W D0,(A0) ;Store swapped number of files (ADDQ.L #4,A0 (MOVE.W D0,D3 (BSR.S BYTSWAP ;Swap the date word (ADDQ.L #4,A0  ; Swap each directory entry  $2 BSR.S BYTSWAP ;First block (BSR.S BYTSWAP ;Last block (BSR.S BYTSWAP ;File kind (ADDA.W #16.,A0 (BSR.S BYTSWAP ;Last byte of data (BSR.S BYTSWAP ;Date (SUBQ.W #1,D3 (BNE $2 ;Back for more (  $5 TST.B D0 ;Check for empty directory (BEQ.S $40 ;Directory was empty, entry not found (  ; Base of loop for each entry  $10 MOVEA.L A6,A0 ;Set up pointer to test string (MOVEA.L A5,A1 ;Set up pointer to directory entry (CLR.L D1 (MOVE.B (A6),D1 ;Set up byte count for testing (  ; Base of loop for each character  $20 CMPM.B (A0)+,(A1)+ ;Compare the entries >(DBNE D1,$20 (BNE.S $30 ;Found miscompare (CLR.L D2 (MOVE.W -6(A5),D1 ;Get starting block number (MOVE.W -4(A5),D2 ;Get trailing block number (SUB.W D1,D2 ;Form size in blocks (LSL.L #8,D2 ;Form size in bytes (LSL.L #1,D2 (CLR.B D0 ;Zero flag indicates success (RTS (  $30 SUBQ.B #1,D0 ;Check entry count (BEQ.S $40 ;Could not find entry (LEA 26.(A5),A5 ;Short way to advance address pointer (BRA.S $10 ;Back for another try (  $40 MOVE.B #1,D0 ;NE flag indicates failure (RTS   ; Byte swap routine  BYTSWAP MOVE.W (A0),D1 (ROL.W #8,D1 (MOVE.W D1,(A0)+ (RTS    ; Found error while reading device.  ; Printout message about problem and return to debugger.  BADREAD LEA READMSG,A0 ;Printout "Error reading "  BRA.S PRTERR    ; Directory entry size was in error.  ; Printout message about problem and return to Debugger.  BADDIR ADDQ.L #4,A7 ;Get rid of return address (BSR TERMCRLF (LEA DIRMSG,A0 ;Printout "Illegal directory" (BRA.S PRTERR    ; Printout error message  PRTERR BSR TERMCRLF (BSR TERMTEXT (MOVEA.L A6,A0 ;Set up pointer to name of item being read (ADDQ.L #1,A0 ;Bypass byte count  PRTERR1 BSR TERMTEXT ;Printout type of information (BSR TERMCRLF (BRA EXIT2   ; Printout Text String  TERMTEXT (MOVEM.L D0,-(SP)  $10 MOVE.B (A0)+,D0 ;Get a byte to output  BEQ.S $20 ;Done (TRAP #10. (BRA $10 (  $20 MOVEM.L (SP)+,D0 (RTS ( (  ; Printout Carriage Return & Line Feed  TERMCRLF (MOVEM.L D0,-(SP) (MOVEQ #13.,D0 ;Carriage return (TRAP #10. (MOVEQ #10.,D0 ;Line Feed (TRAP #10. (MOVEQ #0,D0 ;Nulls (TRAP #10. (TRAP #10. (TRAP #10. (TRAP #10. (TRAP #10. (TRAP #10. (MOVEM.L (SP)+,D0 (RTS    ; Request to read Boot Device's Control Information Block  BDCIBARG (.WORD 132. ;Device (.WORD 0 ;error (.WORD 0,2 ;Size - read control  .WORD 0,0 ;Address (.WORD 9 ;Block - logical device number (.WORD 0 ;Control - CIB access   ; Request to access Channel Map  CHARG (.WORD 128. ;Device (.WORD 0  ;error (.WORD 0,0 ;Size (.WORD 0,0 ;Address (.WORD 1 ;Block - indicates channel map (.WORD 0 ;Control - indicates system info   ; Request to access RAM Disk configuration  RDCNFARG (.WORD 128. ;Device (.WORD 0 ;Error (.WORD 0,0 ;Size (.WORD 0,0 ;Address (.WORD 0 ;Block (.WORD 16. ;Control - logical block number   ; Request to access directory  DIRARG (.WORD 9 ;Device (.WORD 0 ;Error (.WORD 0,2048. ;Size (.WORD 0,0 ;Address (.WORD 2 ;Block (.WORD 0 ;Control (.WORD 0 ;High block    ; File name to terminate the Boot copy  ENDBOOT .BYTE 7 (.ASCII "ENDBOOT"  ; New name for RAM device  NEWNAME .BYTE 7 (.ASCII "RAMDSK1"   ; RAM Disk bootstrap file  BOOTFILE (.BYTE  13. (.ASCII "RAM.BOOT.CODE" (.BYTE 0   READMSG .ASCII "Error reading " (.BYTE 0   BOOTRAM .ASCII "Copying to RAM Disk" (.BYTE 0   DIRMSG .ASCII "Illegal "  ; Must fall into DIRNAM.   ; File names  DIRNAM .ASCII "directory" ;Only for error printout (.BYTE 0   RAMMSG .ASCII "device into RAM" (.BYTE 0  ( (.ALIGN 2   SCRATCH .EQU * ;Offset 0 - Temp storage of A0 @;Offset 4 - Return from MU.BOOTEXT > ;Offset 8 - Base of RAM Disk  ARGS .EQU SCRATCH+12.  CHMAP .EQU ARGS+18. ;User Channel Map  CHMAPNEW.EQU CHMAP+64.  SYSCIB .EQU CHMAPNEW+64. ;Boot device Control Information Block  SYSCIBNW.EQU SYSCIB+12.  RD1CONF .EQU SYSCIBNW+12. ;RAM Disk Configurations  RD2CONF .EQU RD1CONF+10.  RD3CONF .EQU RD2CONF+10.  RD4CONF .EQU RD3CONF+10.  BUFFER .EQU RD4CONF+10. ;Source Directory  BUFFER1 .EQU BUFFER+2048. ;Area for bootstrap  (.END HELPTHES & W6Copyright (c) 1981, 1982 by SofTech Microsystems, Inc. *j]`xT2HELPTHESWCrpr prpr prp+-`Pr pr p`>,`+**+)`*짃-, ,x`*짢0ć**Њ,Ė,r prp*r prp>r prpQr prpcr prpxr prpr prpr prpr prpr prpr prpr prpr prpr prp'r prp1r prpEr prpWr prpkr prpr prpr prpr prpr prpr prpr prphr prpr prpr prpr prp,r prp?r prpRr prpfr prpyr prpr prpr prpr prpr prpr prpr prpr prpr prpr prp/r prpCr prpVr prpir prp|r prpr prpr p2rprp.ji kh #C!pbp!2i!1!1i!1pbp!2i!1!1i hrprpr p2rprp.kj lh $I mi!%3"p"2j"1"1j"1p"2j"1"1j!icp hrprpr p5rprp.jikh ##!pbp!5i!1!1i hؚrprpvr p5rprp.kjlh $1mi!%"p"5j"1"1j!icp hʚrprpZrprpp$xx1&5& 5rpr p5515 5ךrprp1&2&2rpr p212 2ۚrprp Press return to continuee& This program is intended to help youu&find the fastest interleaving and skeww$arrangement for your disk drives. Iff#your drives need some delay after a)DSKSTRT or before a DSKSTOP (i.e. turning"the motor on or off or loading andd%unloading the head), this program may(not operate correctly. If the program iss#running properly, some interleaving'ratios will be much faster than others.&Dots will be written to the console att%the rate the disk reads complete. The&best interleaving and skew will be thee&ones for which dots are written to theescreen the fastest.& First you will be shown all possiblee#interleaving ratios in a ?short test&execution. You should watch the screenn&and remember approximately which ratioo!results in dots being put out the$fastest. After this is finished, youu$will be able to run a longer test onn#the ratios of your choice to aid in&determining exactly which ratio is theefastest..$ Now you will be shown all possiblee$skews in a short test execution. Youu$should watch the screen and rememberr#approximately which skew results in%dots being put out the fastest. After%this is finished, you will be able to&run a longer test on the skews of yourr$choice to aid in determining exactlyywhich is the fastest.& If all ratio and skew tests executedd%at the same speed, then you will have%to guess at the proper values and try"them out by running the diskchangee$program, rebooting, and seeing whichh%accesses the disks the fastest (steps#2 through 4 in the adaptable system'user manual). Start your guesses with a$skew of 0 and interleave ratio of 2..'Keep trying larger ratios until you see$a large speed up. Then increment thee%skew until the speed increases again.%The speed increase from the skew will%be not be very large so you will haveto observe it closely..SKEW=SKEW=RATIO==RATIO=="Ratio to test ( to exit) !SKEW to test ( to exit) OXV$ = PASCALIO O^֥ { Program to test Remote Input Serial Channel }  { Version 1A 16-Jul-82 }   PROGRAM RemInTest;  VAR "TwoChar:PACKED ARRAY[0..1] OF CHAR; "Status:ARRAY[0..29] OF INTEGER;   BEGIN {RemInTest} "REPEAT $UNITSTATUS(1,Status,1); $IF Status[0] <> 0 THEN &BEGIN (UNITREAD(1,TwoChar[0],1); (IF (TwoChar[0]='Q') OR (TwoChar[0]='q') THEN EXIT(PROGRAM); &END; $UNITSTATUS(7,Status,1); $IF Status[0]<>0 THEN &BEGIN (UNITREAD(7,TwoChar[0],1); (UNITWRITE(2,TwoChar[0],1); &END; "UNTIL FALSE;  END.   {Alternate version for pre-Version IV systems  BEGIN {RemInTest}  REPEAT $UNITREAD(7,TwoChar[0],1); $UNITWRITE(2,TwoChar[0],1); "UNTIL FALSE;  END.  }  O^֥?{ Simple routine to receive the image of a device from another system }  { Version 1A 16-Jul-82 }  { Copyright (c) 1982 SAGE Computer Technology }   PROGRAM Receive;  CONST "Serial = 7; {REMIN}  VAR "I,ByteIndex,BlockIndex,BlockNumber,Checksum:INTEGER; "High,Low,Checkout:INTEGER; "CH:CHAR; "Done:BOOLEAN; "Buffer:ARRAY[0..31] OF PACKED ARRAY[0..511] OF 0..255; "DeviceName:STRING; "F:FILE; "  PROCEDURE GetChar;  VAR "NewChar:PACKED ARRAY[0..1] OF CHAR;  BEGIN "REPEAT $UNITREAD(Serial,NewChar[0],1); $CH:=NewChar[0];  UNTIL (ORD(CH)<>10) AND (ORD(CH)<>13);  END;   PROCEDURE ByteIn(VAR Value:INTEGER);  VAR "Count:INTEGER;  BEGIN "Value:=0; "Count:=0; "WHILE Count < 2 DO $BEGIN &GetChar; &IF CH IN ['0'..'9','A'..'F'] THEN (BEGIN *IF CH IN ['0'..'9'] THEN ,Value:=(Value*16)+ORD(CH)-ORD('0') *ELSE ,Value:=(Value*16)+ORD(CH)-ORD('A')+10; *Count:=Count+1; (END &ELSE (BEGIN *WRITELN('Bad character in transmission '); *CLOSE(F); *EXIT(Receive); (END;  END; "Checksum:=Checksum+Value;  END;   BEGIN {Receive} "UNITCLEAR(Serial); "WRITE('Device name for recieving (example #4:) ? '); "READLN(DeviceName); "IF LENGTH(DeviceName)=0 THEN EXIT(PROGRAM); "REWRITE(F,DeviceName); "BlockNumber:=0; "BlockIndex:=0; "Done:=FALSE; "WHILE NOT Done DO $BEGIN &GetChar; $ IF CH='S' THEN (BEGIN *Checksum:=0; *ByteIn(High); BYTEIN(Low); *IF ((High*255)+LOW) <> BlockNumber THEN ,BEGIN .WRITELN; WRITELN; WRITELN('Block number out of sequence'); .CLOSE(F); .EXIT(PROGRAM); ,END; *FOR I:= 0 TO 511 DO ,BEGIN .ByteIn(Low); .Buffer[BlockIndex,I]:=Low; ,END; *Checkout:=Checksum; *ByteIn(Low); *IF Low <> ORD( ODD(Checkout) AND ODD(255) ) THEN ,BEGIN .WRITELN; WRITELN; WRITELN('Checksum error'); .CLOSE(F); .EXIT(PROGRAM); ,END; *IF (Blocknumber MOD 10) = 0 THEN ,BEGIN WRITELN; WRITE('<',BlockNumber:4,'>'); END; *WRITE('.'); *BlockNumber:=BlockNumber+1; *BlockIndex:=BlockIndex+1; *IF BlockIndex = 32 THEN ,BEGIN .I:=BLOCKWRITE(F,Buffer,BlockIndex); .BlockIndex:=0; ,END; (END &ELSE (IF CH='Z' THEN *BEGIN ,IF BlockIndex > 0 THEN I:=BLOCKWRITE(F,Buffer,BlockIndex); ,CLOSE(F,LOCK); ,Done:=TRUE; *END; $END;  END.  O^֥@ { Program for testing Remote Output Serial Channel }  { Version: 1A 16-Jul-82 }   PROGRAM RemOutTest;  CONST "Delay=750; {Adjust down for slower machines}  VAR "Line:STRING; "TwoChar:PACKED ARRAY[0..1] OF CHAR; "I,Dly,Lines:INTEGER;  BEGIN "Line:='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz'; "TwoChar[0]:=CHR(13); {Carriage return} "REPEAT $WRITELN; $WRITE('Lines to output (0 quits) ? '); $READLN(Lines); $IF Lines=0 THEN EXIT(PROGRAM); $FOR I:= 1 TO Lines DO &BEGIN (UNITWRITE(8,Line[1],LENGTH(Line)); (UNITWRITE(8,TwoChar[0],1,0,8); (FOR DLY:=1 TO Delay DO {Nothing}; &END;  UNTIL FALSE;  END.  O^֥{ Simple routine to send another system the image of a device }  { Version 1A 16-Jul-82 }  { Copyright (c) 1982 SAGE Computer Technology }   PROGRAM Send;  CONST "Serial = 8; {REMOUT} "Pause = 32000; "Delay = 3;  VAR "I,ByteIndex,BlockIndex,BlockCount,Checksum:INTEGER; "Buffer:PACKED ARRAY[0..511] OF 0..255; "DeviceName:STRING; "S:FILE OF CHAR; "F:FILE;   PROCEDURE CharOut(CH:CHAR);  VAR TwoChar:PACKED ARRAY[0..1] OF CHAR; "Dly:INTEGER;  BEGIN  TwoChar[0]:=CH; "UNITWRITE(Serial,TwoChar[0],1,0,8);  FOR Dly:= 1 TO Delay DO {Nothing}  END;   PROCEDURE ByteOut(Value:INTEGER);   PROCEDURE HexOut(HexValue:INTEGER);  BEGIN "IF HexValue <10 THEN $CharOut(CHR( ORD('0')+HexValue )) "ELSE $CharOut(CHR( ORD('A')+HexValue-10 ));  END;   BEGIN {BYTEOUT} "HexOut(Value DIV 16); HexOut(Value MOD 16); "Checksum:=Checksum+Value;  END;   BEGIN {Send} "WRITE('Device name (example #4:) ? '); "READLN(DeviceName); "IF LENGTH(DeviceName)=0 THEN EXIT(PROGRAM); "RESET(F,DeviceName);  WRITE('Number of blocks to send ? '); "READLN(BlockCount); "IF BlockCount<=0 THEN EXIT(PROGRAM); "FOR BlockIndex := 0 TO BlockCount-1 DO $BEGIN &IF (BlockIndex MOD 10) = 0 THEN (BEGIN WRITELN; WRITE('<',BlockIndex:4,'>'); END; &WRITE('.'); &I:=BLOCKREAD(F,Buffer,1,BlockIndex); &Checksum:=0; &CharOut('S'); &ByteOut(BlockIndex DIV 255); ByteOut(BlockIndex MOD 255); &CharOut(CHR(13)); &FOR ByteIndex:= 0 TO 511 DO (BEGIN *@ByteOut(Buffer[ByteIndex]); *IF (ByteIndex MOD 32) = 31 THEN CharOut(CHR(13)); (END; &ByteOut(ORD( ODD(Checksum) AND ODD(255) )); $ CharOut(CHR(13)); &IF (BlockIndex MOD 32)=31 THEN FOR I:= 0 TO Pause DO { nothing } $END;  CharOut('Z'); "CharOut(CHR(13));  END.  O^֥{ Program to read in text characters from the Remote Serial Channel }  { Version 1A 16-Jul-82 }  { Copyright (c) 1982 SAGE Computer Technology }   PROGRAM TextIn;   CONST "Version = '1A';   VAR "CH:CHAR;  F:File;  D:TEXT;   PROCEDURE Convert;  VAR "I:INTEGER; "InBlock:INTEGER;  TestChar:CHAR; "Done:BOOLEAN; "InIndex,OutIndex:INTEGER; "OutString:STRING[255]; "InBuffer:PACKED ARRAY[0..511] OF CHAR; "SourceFile,DestFile:STRING;   PROCEDURE ConvertInit;  VAR "Open:BOOLEAN;   BEGIN  WRITELN; "WRITELN('Convert raw text to UCSD p-System .TEXT format'); "Open:=FALSE; "REPEAT $WRITELN; $WRITE('Source file for conversion? '); $READLN(SourceFile); $WRITELN; $IF LENGTH(SourceFile) = 0 THEN EXIT(Convert); ${$I-} $RESET(F,SourceFile); ${$I+} $IF IORESULT = 0 THEN Open:=TRUE $ELSE &WRITELN('Could not open ',SourceFile);  UNTIL Open; "Open:=FALSE; "REPEAT $WRITELN; $WRITE('Destination file for conversion? '); $READLN(DestFile); $WRITELN; $IF LENGTH(DestFile) = 0 THEN &BEGIN (CLOSE(D); (EXIT(Convert); $ END; ${$I-} $REWRITE(D,DestFile); ${$I+} $IF IORESULT = 0 THEN Open:=TRUE $ELSE &WRITELN('Could not create ',DestFile);  UNTIL Open;  InBlock:=0;  OutIndex:=0;  Done:=FALSE;  END;   PROCEDURE WriteOut;  BEGIN "{$R-} "OutString[0]:=CHR(OutIndex); "{$R+} "{$I-} "WRITELN(D,OutString); "{$I+} "IF IORESULT <> 0 THEN $BEGIN &WRITELN; &WRITELN('Error writing output file ',DestFile); &CLOSE(D); &CLOSE(F); &EXIT(Convert); $END; "OutIndex:=0;  END;   BEGIN {Convert}  ConvertInit; "REPEAT $InIndex:=0; $IF EOF(F) THEN &BEGIN & IF OutIndex > 0 THEN WriteOut; & {$I-} (CLOSE(D,LOCK); ({$I+} & IF IORESULT <> 0 THEN *BEGIN ,WRITELN; ,WRITELN('Error closing file ',DestFile); ,CLOSE(F); ,EXIT(Convert); & END; (CLOSE(F); & WRITELN; (WRITELN('Conversion complete'); (EXIT(Convert); &END; ${$I-} $I:=BLOCKREAD(F,InBuffer,1,InBlock); ${$I+} $IF IORESULT <> 0 THEN &BEGIN (WRITELN; (WRITELN('Error reading ',SourceFile); (EXIT(Convert); &END; $IF (InBlock MOD 10) = 0 THEN &BEGIN (WRITELN; (WRITE('<',InBlock:4,'>'); &END; $WRITE('.'); $InBlock:=InBlock+1; " REPEAT $ TestChar:=InBuffer[InIndex]; $ IF TestChar = CHR(13) THEN WriteOut &ELSE (IF (TestChar<>CHR(0)) AND (TestChar<>CHR(10)) THEN *BEGIN * OutIndex:=OutIndex+1; ,IF OutIndex > 255 THEN .BEGIN 0WRITELN; 0WRITELN('Line A> 255 characters'); . WriteOut; .END; ,{$R-} ,OutString[OutIndex]:=TestChar; ,{$R+} *END; $ InIndex:=InIndex+1; $UNTIL InIndex = 512; "UNTIL Done;  END;   PROCEDURE Receive;  VAR "Counter:INTEGER; "I,Index:INTEGER; "Block:INTEGER;  Buffer:PACKED ARRAY[0..1023] OF CHAR; "Status:ARRAY[0..29] OF INTEGER;  TwoChar:PACKED ARRAY[0..1] OF CHAR; "Filename:STRING;   PROCEDURE RecInit;  VAR "Open:BOOLEAN;   BEGIN "UNITCLEAR(7);  Open:=FALSE; "REPEAT $WRITELN; $WRITE('Receive text into what file? '); $READLN(Filename); " IF LENGTH(Filename) = 0 THEN EXIT(Receive); ${$I-} $REWRITE(F,Filename); ${$I+} " IF IORESULT = 0 THEN Open:=TRUE $ELSE &WRITELN('File ',Filename,' could not be created'); "UNTIL Open; Block:=0; "Index:=0; "{Write a block to position drive} "FILLCHAR(Buffer,512,0); "{$I-} "I:=BLOCKWRITE(F,Buffer,1,Block); "{$I+} "IF IORESULT <> 0 THEN $BEGIN &WRITELN; &WRITELN('Error writing to ',Filename); &Close(F); &EXIT(Receive); $END; "WRITELN; "WRITELN('A(bort or T(erminate receiving? '); "WRITELN;  END;   PROCEDURE Terminate;  VAR "InBuffer:PACKED ARRAY[0..511] OF CHAR;   BEGIN  IF (Index = 0) AND (Block = 0) THEN $BEGIN &CLOSE(F); &EXIT(Receive); " END; "FILLCHAR(Buffer[Index],512-Index,0); "IF Index > 0 THEN $BEGIN &{$I-} &I:=BLOCKWRITE(F,Buffer,1,Block); &{$I+} &IF IORESULT <> 0 THEN (BEGIN *WRITELN; *WRITELN('Error writing to ',Filename); *Close(F); *EXIT(Receive); (END; $END;  {$I-} "CLOSE(F,LOCK); "{$I+}  IF IORESULT <> 0 THEN $BEGIN &WRITELN; &WRITELN('Error closing ',Filename); $ EXIT(Receive); $END;  EXIT(Receive);  END;   BEGIN {Receive} "RecInit; "REPEAT " UNITSTATUS(1,Status,1); {Check keyboard} " IF Status[0] <> 0 THEN &BEGIN & UNITREAD(1,TwoChar[0],1); (CH:=TwoChar[0]; (IF (CH = 'T') OR (CH = 't') THEN Terminate (ELSE & IF (CH = 'A') OR (CH = 'a') THEN ,BEGIN .CLOSE(F); .EXIT(Receive) * END *ELSE ,BEGIN .TwoChar[0]:=CHR(7); {Warning bell} .UNITWRITE(1,TwoChar[0],1); ,END; &END; " UNITSTATUS(7,Status,1); {Check for remote input} $Counter:=Status[0]; $IF Counter <> 0 THEN &BEGIN (UNITREAD(7,Buffer[Index],Counter); & Index:=Index+Counter; & IF Index > 511 THEN & BEGIN * {$I-} ,I:=BLOCKWRITE(F,Buffer,1,Block); ,{$I+} * IF IORESULT <> 0 THEN .BEGIN 0WRITELN; 0WRITELN('Error writing to ',Filename); 0CLOSE(F); 0EXIT(Receive); .END; * Block:=Block+1; ,Index:=Index-512; ,IF Index > 0 THEN MOVELEFT(Buffer[512],Buffer[0],Index); * TwoChar[0]:='.'; ,UNITWRITE(1,TwoChar[0],1); ,IF (Block MOD 10) = 0 THEN * BEGIN 0TwoChar[0]:=CHR(13); 0UNITWRITE(1,TwoChar[0],1); .END; *END; &END; "UNTIL FALSE;  END;   BEGIN {TEXTIN} "WRITELN; "WRITELN('TEXTIN program - Version ',Version); "REPEAT $WRITELN; $WRITE('C(onvert, R(eceive, Q(uit ? '); " READ(CH); $WRITELN; $IF EOLN THEN EXIT(PROGRAM); $IF (CH = 'C') OR (CH = 'c') THEN Convert $ELSE &IF (CH = 'R') OR (CH = 'r') THEN Receive &ELSE (IF (CH = 'Q') OR (CH = 'q') THEN EXIT(PROGRAM) (ELSE *WRITE(CHR(7)); "UNTIL FALSE;  END.  $CURSOR $EQUAL $SYNTAX B@0O.cA(.TITLE "p-System Version 4.21 Floppy Bootstrap on Sage Computer" .PROC BOOTPSYS   ;********************************************************************** ;  ; Stride Micro - p-System Floppy Bootstrap  ;  ; File: SG.FBOOT.TEXT  ;  ; File creation date: 18-Apr-82  ; Last revision date: 15-May-85 by WRB  ;  ; Issue: 5  ;  ; COPYRIGHT (c) 1985 Stride Micro  ; All Rights Reserved Worldwide  ;  ;**********************************************************************  ;  ; History:  ;  ; 1 18-Apr-82 Initial release.  ; 2 11-Jul-82 Revised RAM Disk booting.  ; 2A 17-Aug-82 Changed minimum RAM Disk length for booting.  ; 2B 26-Sep-82 Fixed byte sex problems with RAM Disk.  ; Added reboot to RAM Disk.  ; 3 3-Aug-83 Fixed register problem with BYTSWAP. Fixed  ; string length problem with SEARCH. Added  ; physical to logical device lookup for use  ; with BIOS Channel Table.  ; Changed stack calculation method for BIOS 2.3.  ; 4 18-Apr-84 Modified arguments passed to intepreter for  ; Version IV.2. Modified for Stride.  ; 4A 24-Jul-84 File name changed.  ; 4B 11-Oct-84 Boot message change.  ; 5 6-Mar-85 Modified for IV.21.  ; 5A 15-May-85 Modified for SAGE.  ;  ;**********************************************************************  ;  ; This bootstrap is to be located in logical blocks 0 and 1 on a  ; floppy diskette. The floppy diskette bootstrap command in the  ; PROM Debugger will read logical blocks 0 and 1 into memory at  ; location 400H.  ;  ; The bootstrap routine first reads in the p-System directory  ; from the floppy diskette. Then the bootstrap searches the  ; directory for the file SYSTEM.BIOS which contains the Sage  ; Computer Basic Input/Output System routines. Once found the  ; BIOS code is positioned into the highest memory available  ; and the BIOS initialization routine is called. The Debugger  ; is redirected to use BIOS I/O.  ;  ; The bootstrap then searches the directory for the file  ; SYSTEM.INTERP and read it into memory. If booting to RAM Disk  ; is requested, the RAM Disk area is initialized and files are  ; copied from the diskette to RAM Disk as room permits. A file  ; named ENDBOOT will also terminate the file copy process.  ; Finally the UCSD p-System interpreter is started after several  ; parameters are pushed onto the stack.  ;  ;********************************************************************** (  ; Macro for calls to PROM area.  ; (required for generation of long addresses). (.MACRO LJSR (.WORD 4EB9H (.WORD 00FEH (.WORD %1 (.ENDM (  ; Permanent jump vector assignments in PROM  TERMTEXT.EQU 18H ;Printout text string  TERMCRLF.EQU 1CH ;Printout carriage return & line feed  FDREAD .EQU 28H ;Read from floppy diskette (  ; RAM variables for Debugger  MEMTOP .EQU 100H ;Top of memory  BOOTFLGS.EQU MEMTOP+5 ;Bootstrap flag   ; RAM variables for BIOS  BIOSBASE.EQU 200H  PBASE .EQU 400H   ; Offsets of vaBlues needed by loader  RAMBASE .EQU 88. ;RAMDISK base  RAMTOP .EQU 92. ; top  RAMFLG .EQU 96. ; Flag to boot  CHMAP .EQU 138. ;Channel Map  (  ; Constants for BOOT positioning  BOOTSTRT.EQU 44. ;Offset contains address of STARTUP @; in SYSTEM.INTERP  HDSIZE .EQU 26. ;Size of header data in uncompressed code file   (.ASCII "BOOT" ;This text is checked by the Debugger @; bootstrap process to insure that the @; boot area has been initialized with @; a bootstrap routine.   START ;The Debugger transfers control to @; offset 4 in this file. (  LEA SCRATCH,A3 ;Set up RAM area for bootstrap (MOVE.L (A7)+,(A3) ;Save the return address (MOVE.W (A7)+,4(A3) ;Save the drive number (CLR.B 21.(A3) ;Clear the BIOS active flag (  ; Output initial boot message (LJSR TERMCRLF (LEA INITMSG,A0  ;Printout "p-System Bootstrap" (LJSR TERMTEXT (LJSR TERMCRLF (  ; Read in p-System directory (LEA DIRNAM-1,A6 ;Set up message in case of error @; note: does not have byte count. (MOVE.W #2,-(A7) ;The p-System directory is at block 2 of ( ; each devices. (LEA BUFFER,A0 ;Set up the directory buffer address (MOVE.L A0,-(A7) ;Buffer address (MOVEA.W #2048.,A0 ;The directory is 2K bytes long (MOVE.L A0,-(A7) ;Length of transfer (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in the directory with the floppy @; driver in PROM. (BNE BADREAD ;Found error reading directory (  ; Now search for SYSTEM.BIOS and read in first block (LEA BIOSNAM,A6 ;Set up search string (BSR SEARCH (ADDQ.W #1,D1 ;Code starts at relative block 1 in file (MOVE.W D1,-(A7) ;Set up logical block for BIOS code (MOVE.W D1,6(A3)  ;Save logical block for later (LEA BUFFER2,A5 ;Set up buffer address for first block (MOVE.L A5,-(A7) ;Buffer address (MOVEA.W #512.,A0 ;Set up size for one block (MOVE.L A0,-(A7) ;Length of transfer (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in first block (BNE BADREAD ;Found error while reading BIOS (  ; Calculate target address for BIOS and read it into memory. (LEA BIOSPASS,A0 ;Check for BIOS password code (LEA BUFFER2+HDSIZE,A5 ;Adjust for header data in code file (CMPM.L (A5)+,(A0)+ (BNE BADPASS ;Password is not correct (MOVE.W 6(A3),-(A7) ;Set up logical block number (MOVEA.L MEMTOP,A1 ;Get current top of memory (MOVEA.W (A5)+,A0 ;Get BIOS code size (ADDA.W #HDSIZE,A0 ;Also read in header data (SUBA.L A0,A1 ;Set up code address for floppy driver (MOVE.L A1,-(A7) ;Set up BIOS codefile address in memory (MOVE.L A0,-(A7) ;Set up floppy transfer length (ADDA.W #HDSIZE,A1 ;Now form actual code address (ADDQ.L #2,A5 (ADDA.W (A5),A1 ;Form BIOS Initialization routine address (MOVE.L A1,8(A3) ;Save starting address (MOVE.L RAMBASE-8(A5),12.(A3) ;Save RAM Disk address (MOVE.L RAMTOP-8(A5),16.(A3) ;Save top of RAM Disk (MOVE.B RAMFLG-8(A5),20.(A3) ;Save RAM Disk Boot Flag (MOVE.W 4(A3),-(A7) ;Set up drive number (LJSR FDREAD ;Read in the whole BIOS (BNE BADREAD ;Found error while reading BIOS (  ; Initialize the BIOS (MOVEA.L 8(A3),A4 ;Get BIOS initialization address (JSR (A4) ;Initialize BIOS (MOVEA.L BIOSBASE,A7 ;Set up stack pointer (ADDA.W #512.,A7 (MOVEQ #3,D0 (TRAP #14. ;Install BIOS into Debugger (ADDQ.B #1,21.(A3) ;Set BIOS active flag (MOVEQ #23.,D0 ;Get to top of User RAM (TRAP #14. (MOVE.L A0,26.(A3B) ;Save top of User RAM (SUBA.L #PBASE,A0 (MOVE.L A0,30.(A3) ;Save total size of memory (  ; Now search for SYSTEM.INTERP and read it into memory (LEA BOOTNAM,A6 ;Set up search string (LEA CHMAP-8+64.(A5),A1 ;Find logical boot device (MOVEQ #31.,D7 ;Device number (MOVE.W 4(A3),D0 (ADDQ.W #4,D0  $1 CMP.W -(A1),D0 ;Check channel table (DBEQ D7,$1 (BNE BADREAD ;Device not found (BSR SEARCH (LEA ARGS,A0 (MOVE.W D7,(A0) ;Save logical device number (ADDQ.L #4,A0 ;Advance to size field (MOVE.L D2,(A0)+ ;Size in bytes (SUB.L D2,26.(A3) ;Form base of interpreter (MOVE.L 26.(A3),(A0)+ (MOVE.W D1,(A0)+ ;Set up logical block for interpreter code ( ; Note: assumes a compressed code file (CLR.W (A0)+ ;Control word (MOVEQ #11.,D0 ;Set up read (LEA ARGS,A0 (TRAP #14. (TST.W 2(A0) ;Check error code (BNE BADREAD ;Found error reading in interpreter file (  ; Check for RAM Disk Boot (TST.B 20.(A3) (BEQ ENTER ;Not booting RAM Disk (MOVE.L 12.(A3),D4 ;Get base of RAM Disk (BEQ ENTER ;No RAM Disk defined (MOVE.L 16.(A3),D1 ;Get top of RAM Disk (BNE.S $5 ;Top is defined (MOVE.L BIOSBASE,D1 ;Default to below BIOS  $5 SUB.L D4,D1 ;Find size of RAM Disk (BLT ENTER ;No room in RAM Disk  DIVU #512.,D1 ;Size in blocks (CMPI.W #128.,D1 ;Check for minimum size of 128 blocks (BLT ENTER ;Not enough room to boot ( (MOVEA.L D4,A5 (MOVEA.W #400H,A0 ;Move the bootstrap to RAM Disk (MOVE.W #256.-1,D0  $7 MOVE.L (A0)+,(A5)+ (DBF D0,$7 ( (BTST #0,BOOTFLGS (BNE $105 ;Don't copy files ( (LEA BOOTRAM,A0 ;Printout 'Copying to RAM Disk' (LJSR TERMTEXT (LJSR TERMCRLF ( (MOVEA.L A5,A0 ;Clear the directory (MOVE.W #512.-1,D0  $10 CLR.L (A0)+ (DBF D0,$10 (  ; Set up first directory entry in RAM Disk (MOVEA.L A5,A0 (ADDQ.L #2,A0 ;First block = 0 (MOVE.W #6,(A0)+ ;Next block = 6 (ADDQ.L #2,A0 ;DFKIND = 0 (MOVE.L NEWNAME,(A0)+ ;Device name = RAMDISK (MOVE.L NEWNAME+4,(A0)+ (MOVE.W D1,(A0)+ ;Set up size of device in blocks (ADDQ.L #4,A0 ;Bypass number of files & load time (MOVE.W BUFFER+20.,(A0)+;Set up last date (  ; Set up initial variables (ADDQ.L #4,A0 ;Advance to first file entry in directory (LEA BUFFER,A4 ;Source directory address (MOVEA.L A5,A2 ;RAM Disk address (ADDA.W #2048.,A2 ; bypass directory (MOVE.W #6,D4 ;Block number for RAM Disk (SUB.W D4,D1 ;Number of blocks left in RAM Disk (CLR.W D3 ;Number of files in RAM Disk (MOVE.W BUFFER+16.,D2 ;Number of files on source diskette (  ; Now process each file on source diskette  $20 SUBQ.W #1,D2 ;Check if done (BLT.S $100 ;Done with source files (ADDA.W #26.,A4 ;Advance source directory address  MOVE.L ENDBOOT,D0 (CMP.L 6(A4),D0 ;Check for file: ENDBOOT (BNE.S $25 ;File not found (MOVE.L ENDBOOT+4,D0 (CMP.L 10.(A4),D0 (BEQ.S $100 ;Found file, terminate copy  $25 CLR.L D0 (MOVE.W 2(A4),D0 ;Calculate file size in blocks (SUB.W (A4),D0 (SUB.W D0,D1 ;Will it fit in remaining RAM Disk (BLT.S $90 ;Would not fit ( (MOVE.W D4,(A0)+ ;Set up First block in directory (ADD.W D0,D4 (MOVE.W D4,(A0)+ ;Set up Next block in directory (ADDQ.W #1,D3 ;Advance number of RAM Disk files (  ; Set up transfer (LEA RAMMSG-1,A6 ;Set up for possible error message (MOVE.L A0,22.(A3) ;Save A0 temporarily (LEA ARGS+4,A0 (ASL.L #8,D0 ;Multiply by 512 (ASL.L #1,DC0 (MOVE.L D0,(A0)+ ;Size in bytes (MOVE.L A2,(A0)+ ;Destination of RAM Disk (ADDA.L D0,A2 ;Advance RAM Disk address (MOVE.W (A4),(A0)+ ;Logical Block on floppy (CLR.W (A0)+ ;Control word (MOVEQ #11.,D0 ;Set up read request (LEA ARGS,A0 (TRAP #14. (TST.W 2(A0) (BNE BADREAD ;Found error reading diskette (MOVEA.L 22.(A3),A0 ;Restore A0 (  ; Complete the loop (LEA 4(A4),A1 ;Set up copy of directory entry (MOVEQ #11.-1,D0  $30 MOVE.W (A1)+,(A0)+ (DBF D0,$30 (BRA $20 ;Back for more files (  ; File would not fit  $90 ADD.W D0,D1 ;Put back size (BRA $20 ;Try more anyway (  ; Done transfering all files  $100 MOVE.W D3,16.(A5) ;Set up number of RAM Disk files  $105 LEA BUFFER,A0 (MOVE.W #512.-1,D0  $110 MOVE.L (A5)+,(A0)+ ;Move directory of RAM Disk (DBF D0,$110  MOVEQ #11.,D7 ;Set up RAM Disk device number  BRA.S ENTER1    ; Lookup SYSTEM.PASCAL and start p-System.  ENTER MOVE.W ARGS,D7 ;Save drive number  ENTER1 MOVE.L 30.(A3),D0 ;Get memory size (ANDI.W #~2000H,SR ; put into user mode (MOVEA.L 26.(A3),SP ; set user stack pointer to base of interp (PEA BUFFER ;Address of directory (MOVE.L D0,-(SP) ;Size of memory area (MOVE.L #PBASE,-(SP) ; base of memory (MOVE.W D7,-(SP) (MOVEA.L 26(A3),A3 ; jump into the interpreter (JMP (A3) ( ( (  ; Search Routine for directory entry  ; A6 is pointer to target string.  ; A1 is returned with block address of start of code in file.  SEARCH (LEA BUFFER+32.,A5 ;Set up pointer to directory entry @; skipping initial volume entry. (LEA -16.(A5),A0 (MOVE.W (A0),D0 ;Get number of files (CMPI.W #77.,D0 ;Check for limit (BLE.S $5 ;Within limit  ROL.W #8,D0 ;Check if byte directory needs flipped  CMPI.W #77.,D0 ;Check limit again (BGT BADDIR ;Illegal directory   ; Swap bytes in directory (MOVE.W D0,(A0) ;Store swapped number of files (ADDQ.L #4,A0 (MOVE.W D0,D3 (BSR.S BYTSWAP ;Swap the date word (ADDQ.L #4,A0  ; Swap each directory entry  $2 BSR.S BYTSWAP ;First block (BSR.S BYTSWAP ;Last block (BSR.S BYTSWAP ;File kind (ADDA.W #16.,A0 (BSR.S BYTSWAP ;Last byte of data (BSR.S BYTSWAP ;Date (SUBQ.W #1,D3 (BNE $2 ;Back for more (  $5 TST.B D0 ;Check for empty directory (BEQ.S SRCHERR ;Directory was empty, entry not found (  ; Base of loop for each entry  $10 MOVEA.L A6,A0 ;Set up pointer to test string (MOVEA.L A5,A1 ;Set up pointer to directory entry (CLR.L D1 (MOVE.B (A6),D1 ;Set up byte count for testing (  ; Base of loop for each character  $20 CMPM.B (A0)+,(A1)+ ;Compare the entries (DBNE D1,$20 (BNE.S $30 ;Found miscompare (CLR.L D2 (MOVE.W -6(A5),D1 ;Get starting block number (MOVE.W -4(A5),D2 ;Get trailing block number (SUB.W D1,D2 ;Form size in blocks (LSL.L #8,D2 ;Form size in bytes (LSL.L #1,D2 (RTS (  $30 SUBQ.B #1,D0 ;Check entry count (BEQ.S SRCHERR ;Could not find entry (LEA 26.(A5),A5 ;Short way to advance address pointer (BRA.S $10 ;Back for another try (   ; Byte swap routine  BYTSWAP MOVE.W (A0),D1 (ROL.W #8,D1 (MOVE.W D1,(A0)+ (RTS    ; Found error while reading diskette.  ; Printout message about problem and return to debugger.  BADREAD LEA READMSG,A0 ;Printout "Error reading "  BRA.S PRCTERR    ; Could not find "BIOS" password in SYSTEM.BIOS file.  ; Printout message about problem and return to debugger.  BADPASS LEA PASSMSG,A0 ;Printout "Not BIOS code in " (BRA.S PRTERR    ; Directory entry size was in error.  ; Printout message about problem and return to Debugger.  BADDIR ADDQ.L #4,A7 ;Get rid of return address (LJSR TERMCRLF (LEA DIRMSG,A0 ;Printout "Illegal directory" (BRA.S PRTERR    ; Could not find file in directory.  ; Printout message about problem and return to debugger.  SRCHERR ADDQ.L #4,A7 ;Get rid of return address (LEA SRCHMSG,A0 ;Printout "Could not find " (   ; Printout error message  PRTERR LJSR TERMCRLF (LJSR TERMTEXT (MOVEA.L A6,A0 ;Set up pointer to name of item being read (ADDQ.L #1,A0 ;Bypass byte count  PRTERR1 LJSR TERMTEXT ;Printout type of information (LJSR TERMCRLF (TST.B 21.(A3) ;Check if BIOS is active (BNE.S $10 ;BIOS is active (MOVEA.L (A3),A0 ;Return address to Debugger  JMP (A0)   $10 MOVEQ #0,D0 (TRAP #14. ;Exit back to debugger  ; Never returns    ; BIOS password (must have word alignment)  BIOSPASS.ASCII "BIOS"   ; File name to terminate the Boot copy  ENDBOOT .BYTE 7 (.ASCII "ENDBOOT"  ; New name for RAM device  NEWNAME .BYTE 7 (.ASCII "RAMDISK"   ; Messages  INITMSG .ASCII "p-System IV.21 Bootstrap" (.BYTE 0   READMSG .ASCII "Error reading " (.BYTE 0   SRCHMSG .ASCII "Could not find " (.BYTE 0   PASSMSG .ASCII "Not BIOS code in " (.BYTE 0   BOOTRAM .ASCII "Copying to RAM Disk" (.BYTE 0   DIRMSG .ASCII "Illegal "  ; Must fall into DIRNAM.   ; File names  DIRNAM .ASCII "directory" ;Only for error printout (.BYTE 0   BIOSNAM .BYTE 11. ;String byte count (.ASCII "SYSTEM.BIOS" (.BYTE 0 ;Terminator for TERMTEXT   RAMMSG .ASCII "diskette into RAM" (.BYTE 0   BOOTNAM .BYTE 13. ;String byte count (.ASCII "SYSTEM.INTERP" (.BYTE 0 ;Terminator for TERMTEXT   (.BYTE 5 ;Bootstrap Version @;If bootstrap ends with a non-zero value @; the device to device bootstrap transfer @; can determine the size. ( (.ALIGN 2  SCRATCH .EQU *+1024. ;Ram scratch area  ;Offsets: @; 0.- Return address to Debugger @; 4.- Drive number (0 or 1) @; 6.- Logical block for BIOS @; 8.- Starting address of BIOS @;12.- RAM Disk beginning @;16.- RAM Disk top @;20.- RAM Disk boot flag @;21.- BIOS active flag @;22.- Temporary storage (4 bytes)  ;26.- Base of intepreter (4 bytes)  ;30.- Size of memory area (4 bytes)   ARGS .EQU SCRATCH+34.  BUFFER .EQU ARGS+16.  BUFFER2 .EQU BUFFER+2048.  (.END $CURSOR $EQUAL 0O.D(.TITLE "p-System Version 4.21 Bootstrap on Sage Computer" .PROC BOOTPSYS   ;********************************************************************** ;  ; Stride Micro - p-System Bootstrap  ;  ; File: SG.WBOOT.TEXT  ;  ; File creation date: 19-Mar-83  ; Last revision date: 15-May-85 by WRB  ;  ; Issue: 4  ;  ; COPYRIGHT (c) 1984 Stride Micro  ; All Rights Reserved Worldwide  ;  ;**********************************************************************  ;  ; History:  ;  ; 1 19-Mar-83 Initial release, derived from SAGE.PBOOT.TEXT  ; version 2B.  ; 2 3-Aug-83 Fixed wrong register in BYTSWAP. Fixed string  ; length bug in SEARCH.  ; 3 13-Jun-84 Modified argument sequence to pass to interp  ; for Version IV.2. Modified for Stride.  ; 3A 24-Jul-84 File name changed.  ; 3B 11-Oct-84 Boot message change.  ; 4 11-Mar-85 Modified for IV.21.  ; 4A 15-May-85 Modified for SAGE.  ;  ;**********************************************************************  ;  ; This bootstrap is to be located in logical blocks 0 and 1 on a  ; Winchester partition. The Winchester bootstrap command in the  ; PROM Debugger will read logical blocks 0 and 1 into memory at  ; location 400H.  ;  ; The bootstrap routine first reads in the p-System directory  ; from the Winchester. Then the bootstrap searches the  ; directory for the file SYSTEM.BIOS which contains the Sage  ; Computer Basic Input/Output System routines. Once found the  ; BIOS code is positioned into the highest memory available  ; and the BIOS initialization routine is called. The Debugger  ; is redirected to use BIOS I/O.  ;  ; The bootstrap searches the BIOS channel map to find the logical  ; device used for booting, from the subdevice number.  ;  ; The bootstrap then searches the directory for the file  ; SYSTEM.INTERP and read it into memory. If booting to RAM Disk  ; is requested, the RAM Disk area is initialized and files are  ; copied from the partition to RAM Disk as room permits. A file  ; named ENDBOOT will also terminate the file copy process.  ; Finally the UCSD p-System interpreter is started after several  ; parameters are pushed onto the stack.  ;  ;********************************************************************** (  ; Macro for calls to PROM area.  ; (required for generation of long addresses). (.MACRO LJSR (.WORD 4EB9H (.WORD 00FEH (.WORD %1 (.ENDM (  ; Permanent jump vector assignments in PROM  TERMTEXT.EQU 18H ;Printout text string  TERMCRLF.EQU 1CH ;Printout carriage return & line feed  WDREAD .EQU 3CH ;Read from Winchester (  ; RAM variables for Debugger  MEMTOP .EQU 100H ;Top of memory  BOOTFLGS.EQU MEMTOP+5 ;Bootstrap flag   ; RAM variables for BIOS  BIOSBASE.EQU 200H  PBASE .EQU 400H   ; Offsets of values needed by loader  RAMBASE .EQU 88. ;RAMDISK base  RAMTOP .EQU 92. ; top  RAMFLG .EQU 96. ; Flag to boot  CHMAP .EQU 138. ;Channel Map  (  ; Constants for BOOT positioning  BOOTSTRT.EQU 44. ;OffDset contains address of STARTUP @; in SYSTEM.INTERP  HDSIZE .EQU 26. ;Size of header data in uncompressed code file   (.ASCII "BOOT" ;This text is checked by the Debugger @; bootstrap process to insure that the @; boot area has been initialized with @; a bootstrap routine.   START ;The Debugger transfers control to @; offset 4 in this file. ( (LEA SCRATCH,A3 ;Set up RAM area for bootstrap (MOVE.L (A7)+,(A3) ;Save the return address (MOVE.W (A7)+,D0 ;Save subdevice number (LSL.W #8,D0 (MOVE.B #9,D0 ;Set up physical device number (MOVE.W D0,4(A3) (CLR.B 21.(A3) ;Clear the BIOS active flag (  ; Output initial boot message (LJSR TERMCRLF (LEA INITMSG,A0 ;Printout "UCSD p-System Bootstrap" (LJSR TERMTEXT (LJSR TERMCRLF (  ; Read in p-System directory (LEA DIRNAM-1,A6 ;Set up message in case of error @; note: does not have byte count. (MOVE.L #2,-(A7) ;The p-System directory is at block 2 of ( ; each devices. (LEA BUFFER,A0 ;Set up the directory buffer address (MOVE.L A0,-(A7) ;Buffer address (MOVE.L #2048.,-(A7) ;Length of transfer (LJSR WDREAD ;Read in the directory with the Winchester @; driver in PROM. (BNE BADREAD ;Found error reading directory (  ; Now search for SYSTEM.BIOS and read in first block (LEA BIOSNAM,A6 ;Set up search string (BSR SEARCH (ADDQ.W #1,D1 ;Code starts at relative block 1 in file (MOVE.L D1,-(A7) ;Set up logical block for BIOS code (MOVE.W D1,6(A3) ;Save logical block for later (LEA BUFFER2,A5 ;Set up buffer address for first block (MOVE.L A5,-(A7) ;Buffer address (MOVE.L #512.,-(A7) ;Length of transfer (LJSR WDREAD ;Read in first block (BNE BADREAD ;Found error while reading BIOS (  ; Calculate target address for BIOS and read it into memory. (LEA BIOSPASS,A0 ;Check for BIOS password code (LEA BUFFER2+HDSIZE,A5 ;Adjust for header data in code file (CMPM.L (A5)+,(A0)+ (BNE BADPASS ;Password is not correct (MOVE.W 6(A3),-(A7) ;Set up logical block number (CLR.W -(A7) ;High part is zero (MOVEA.L MEMTOP,A1 ;Get current top of memory (MOVEA.W (A5)+,A0 ;Get BIOS code size (ADDA.W #HDSIZE,A0 ;Also read in header data (SUBA.L A0,A1 ;Set up code address for Winchester driver (MOVE.L A1,-(A7) ;Set up BIOS codefile address in memory (MOVE.L A0,-(A7) ;Set up Winchester transfer length (ADDA.W #HDSIZE,A1 ;Now form actual code address (ADDQ.L #2,A5 (ADDA.W (A5),A1 ;Form BIOS Initialization routine address (MOVE.L A1,8(A3) ;Save starting address (MOVE.L RAMBASE-8(A5),12.(A3) ;Save RAM Disk address (MOVE.L RAMTOP-8(A5),16.(A3) ;Save top of RAM Disk (MOVE.B RAMFLG-8(A5),20.(A3) ;Save RAM Disk Boot Flag (LJSR WDREAD ;Read in the whole BIOS (BNE BADREAD ;Found error while reading BIOS (  ; Initialize the BIOS (MOVEA.L 8(A3),A4 ;Get BIOS initialization address (JSR (A4) ;Initialize BIOS (MOVEA.L BIOSBASE,A7 ;Set up stack pointer (ADDA.W #512.,A7 (MOVEQ #3,D0 (TRAP #14. ;Install BIOS into Debugger (ADDQ.B #1,21.(A3) ;Set BIOS active flag (MOVEQ #23.,D0 ;Find top of User RAM (TRAP #14. (MOVE.L A0,26.(A3) ;Save top of User RAM (SUBA.L #PBASE,A0 (MOVE.L A0,30.(A3) ;Save total size of memory (  ; Now search for SYSTEM.INTERP and read it into memory (LEA BOOTNAM,A6 ;Set up search string (LEA CHMAP-8+64.(A5),A1 ;Find logical boot device (MOVEQ #31,D7 ;Device number (MOVE.W 4(A3),D0  $1 CMP.W -(A1),D0 (DBEQ D7,$1 (BNE E BADREAD ;Device not found (BSR SEARCH (LEA ARGS,A0 (MOVE.W D7,(A0) ;Save logical device number (ADDQ.L #4,A0 ;Advance to size field (MOVE.L D2,(A0)+ ;Size in bytes (SUB.L D2,26.(A3) ;Form base of interpreter (MOVE.L 26.(A3),(A0)+ ;Set up interpreter address (MOVE.W D1,(A0)+ ;Set up logical block for interpreter code ( ; Note: assumes a compressed code file (CLR.L (A0)+ ;Control word & high block number (MOVEQ #11.,D0 ;Set up read (LEA ARGS,A0 (TRAP #14. (TST.W 2(A0) ;Check error code (BNE BADREAD ;Found error reading in interpreter file (  ; Check for RAM Disk Boot (TST.B 20.(A3) (BEQ ENTER ;Not booting RAM Disk (MOVE.L 12.(A3),D4 ;Get base of RAM Disk (BEQ ENTER ;No RAM Disk defined (MOVE.L 16.(A3),D1 ;Get top of RAM Disk (BNE.S $5  ;Top is defined (MOVE.L BIOSBASE,D1 ;Default to below BIOS  $5 SUB.L D4,D1 ;Find size of RAM Disk (BLT ENTER ;No room in RAM Disk  DIVU #512.,D1 ;Size in blocks (CMPI.W #128.,D1 ;Check for minimum size of 128 blocks (BLT ENTER ;Not enough room to boot ( (MOVEA.L D4,A5 (MOVEA.W #400H,A0 ;Move the bootstrap to RAM Disk (MOVE.W #256.-1,D0  $7 MOVE.L (A0)+,(A5)+ (DBF D0,$7 ( (BTST #0,BOOTFLGS (BNE $105 ;Don't copy files ( (LEA BOOTRAM,A0 ;Printout 'Copying to RAM Disk' (LJSR TERMTEXT (LJSR TERMCRLF ( (MOVEA.L A5,A0 ;Clear the directory (MOVE.W #512.-1,D0  $10 CLR.L (A0)+ (DBF D0,$10 (  ; Set up first directory entry in RAM Disk (MOVEA.L A5,A0 (ADDQ.L #2,A0 ;First block = 0 (MOVE.W #6,(A0)+ ;Next block = 6 (ADDQ.L #2,A0 ;DFKIND = 0 (MOVE.L NEWNAME,(A0)+ ;Device name = RAMDISK (MOVE.L NEWNAME+4,(A0)+ (MOVE.W D1,(A0)+ ;Set up size of device in blocks (ADDQ.L #4,A0 ;Bypass number of files & load time (MOVE.W BUFFER+20.,(A0)+;Set up last date (  ; Set up initial variables (ADDQ.L #4,A0 ;Advance to first file entry in directory (LEA BUFFER,A4 ;Source directory address (MOVEA.L A5,A2 ;RAM Disk address (ADDA.W #2048.,A2 ; bypass directory (MOVE.W #6,D4 ;Block number for RAM Disk (SUB.W D4,D1 ;Number of blocks left in RAM Disk (CLR.W D3 ;Number of files in RAM Disk (MOVE.W BUFFER+16.,D2 ;Number of files on source partition (  ; Now process each file on source partition  $20 SUBQ.W #1,D2 ;Check if done (BLT.S $100 ;Done with source files (ADDA.W #26.,A4 ;Advance source directory address  MOVE.L ENDBOOT,D0 (CMP.L 6(A4),D0 ;Check for file: ENDBOOT (BNE.S $25 ;File not found (MOVE.L ENDBOOT+4,D0 (CMP.L 10.(A4),D0 (BEQ.S $100 ;Found file, terminate copy  $25 CLR.L D0 (MOVE.W 2(A4),D0 ;Calculate file size in blocks (SUB.W (A4),D0 (SUB.W D0,D1 ;Will it fit in remaining RAM Disk (BLT.S $90 ;Would not fit ( (MOVE.W D4,(A0)+ ;Set up First block in directory (ADD.W D0,D4 (MOVE.W D4,(A0)+ ;Set up Next block in directory (ADDQ.W #1,D3 ;Advance number of RAM Disk files (  ; Set up transfer (LEA RAMMSG-1,A6 ;Set up for possible error message (MOVE.L A0,22.(A3) ;Save A0 temporarily (LEA ARGS+4,A0 (ASL.L #8,D0 ;Multiply by 512 (ASL.L #1,D0 (MOVE.L D0,(A0)+ ;Size in bytes (MOVE.L A2,(A0)+ ;Destination of RAM Disk (ADDA.L D0,A2 ;Advance RAM Disk address (MOVE.W (A4),(A0)+ ;Logical Block on Winchester (CLR.L (A0)+ ;Control word & high block number (MOVEQ #11.,D0 ;Set up read rEequest (LEA ARGS,A0 (TRAP #14. (TST.W 2(A0) (BNE BADREAD ;Found error reading drive (MOVEA.L 22.(A3),A0 ;Restore A0 (  ; Complete the loop (LEA 4(A4),A1 ;Set up copy of directory entry (MOVEQ #11.-1,D0  $30 MOVE.W (A1)+,(A0)+ (DBF D0,$30 (BRA $20 ;Back for more files (  ; File would not fit  $90 ADD.W D0,D1 ;Put back size (BRA $20 ;Try more anyway (  ; Done transfering all files  $100 MOVE.W D3,16.(A5) ;Set up number of RAM Disk files  $105 LEA BUFFER,A0 (MOVE.W #512.-1,D0  $110 MOVE.L (A5)+,(A0)+ ;Move directory of RAM Disk (DBF D0,$110  MOVEQ #11.,D7 ;Set up RAM Disk device number  BRA.S ENTER1    ; Lookup SYSTEM.PASCAL and start p-System.  ENTER MOVE.W ARGS,D7 ;Save drive number  ENTER1 MOVE.L 30.(A3),D0 ;Get memory size (ANDI.W #~2000H,SR ; put into user mode (MOVEA.L 26.(A3),SP ; set user stack pointer at base of interp (PEA BUFFER ;Address of directory (MOVE.L D0,-(SP) ;Size of memory area (MOVE.L #PBASE,-(SP) ; base of memory area (MOVE.W D7,-(SP) ;Drive number (MOVEA.L 26.(A3),A3 ; jump into the interpreter (JMP (A3) ( ( (  ; Search Routine for directory entry  ; A6 is pointer to target string.  ; A1 is returned with block address of start of code in file.  SEARCH (LEA BUFFER+32.,A5 ;Set up pointer to directory entry @; skipping initial volume entry. (LEA -16.(A5),A0 (MOVE.W (A0),D0 ;Get number of files (CMPI.W #77.,D0 ;Check for limit (BLE.S $5 ;Within limit  ROL.W #8,D0 ;Check if byte directory needs flipped  CMPI.W #77.,D0 ;Check limit again (BGT BADDIR ;Illegal directory   ; Swap bytes in directory (MOVE.W D0,(A0) ;Store swapped number of files (ADDQ.L #4,A0 (MOVE.W D0,D3 (BSR.S BYTSWAP ;Swap the date word (ADDQ.L #4,A0  ; Swap each directory entry  $2 BSR.S BYTSWAP ;First block (BSR.S BYTSWAP ;Last block (BSR.S BYTSWAP ;File kind (ADDA.W #16.,A0 (BSR.S BYTSWAP ;Last byte of data (BSR.S BYTSWAP ;Date (SUBQ.W #1,D3 (BNE $2 ;Back for more (  $5 TST.B D0 ;Check for empty directory (BEQ.S SRCHERR ;Directory was empty, entry not found (  ; Base of loop for each entry  $10 MOVEA.L A6,A0 ;Set up pointer to test string (MOVEA.L A5,A1 ;Set up pointer to directory entry (CLR.L D1 (MOVE.B (A6),D1 ;Set up byte count for testing (  ; Base of loop for each character  $20 CMPM.B (A0)+,(A1)+ ;Compare the entries (DBNE D1,$20 (BNE.S $30 ;Found miscompare (CLR.L D2 (MOVE.W -6(A5),D1 ;Get starting block number (MOVE.W -4(A5),D2 ;Get trailing block number (SUB.W D1,D2 ;Form size in blocks (LSL.L #8,D2 ;Form size in bytes (LSL.L #1,D2 (RTS (  $30 SUBQ.B #1,D0 ;Check entry count (BEQ.S SRCHERR ;Could not find entry (LEA 26.(A5),A5 ;Short way to advance address pointer (BRA.S $10 ;Back for another try (   ; Byte swap routine  BYTSWAP MOVE.W (A0),D1 (ROL.W #8,D1 (MOVE.W D1,(A0)+ (RTS    ; Found error while reading drive.  ; Printout message about problem and return to debugger.  BADREAD LEA READMSG,A0 ;Printout "Error reading "  BRA.S PRTERR    ; Could not find "BIOS" password in SYSTEM.BIOS file.  ; Printout message about problem and return to debugger.  BADPASS LEA PASSMSG,A0 ;Printout "Not BIOS code in " (BRA.S PRTERR    ; Directory entry size was in error.  ; Printout message about problem and return tFo Debugger.  BADDIR ADDQ.L #4,A7 ;Get rid of return address (LJSR TERMCRLF (LEA DIRMSG,A0 ;Printout "Illegal directory" (BRA.S PRTERR    ; Could not find file in directory.  ; Printout message about problem and return to debugger.  SRCHERR ADDQ.L #4,A7 ;Get rid of return address (LEA SRCHMSG,A0 ;Printout "Could not find " (   ; Printout error message  PRTERR LJSR TERMCRLF (LJSR TERMTEXT (MOVEA.L A6,A0 ;Set up pointer to name of item being read (ADDQ.L #1,A0 ;Bypass byte count  PRTERR1 LJSR TERMTEXT ;Printout type of information (LJSR TERMCRLF (TST.B 21.(A3) ;Check if BIOS is active (BNE.S $10 ;BIOS is active (MOVEA.L (A3),A0 ;Return address to Debugger  JMP (A0)   $10 MOVEQ #0,D0 (TRAP #14. ;Exit back to debugger  ; Never returns    ; BIOS password (must have word alignment)  BIOSPASS.ASCII "BIOS"   ; File name to terminate the Boot copy  ENDBOOT .BYTE 7 (.ASCII "ENDBOOT"  ; New name for RAM device  NEWNAME .BYTE 7 (.ASCII "RAMDISK"   ; Messages  INITMSG .ASCII "p-System IV.21 Bootstrap" (.BYTE 0   READMSG .ASCII "Error reading " (.BYTE 0   SRCHMSG .ASCII "Could not find " (.BYTE 0   PASSMSG .ASCII "Not BIOS code in " (.BYTE 0   BOOTRAM .ASCII "Copying to RAM Disk" (.BYTE 0   DIRMSG .ASCII "Illegal "  ; Must fall into DIRNAM.   ; File names  DIRNAM .ASCII "directory" ;Only for error printout (.BYTE 0   BIOSNAM .BYTE 11. ;String byte count (.ASCII "SYSTEM.BIOS" (.BYTE 0 ;Terminator for TERMTEXT   RAMMSG .ASCII "disk into RAM" (.BYTE 0   BOOTNAM .BYTE 13. ;String byte count (.ASCII "SYSTEM.INTERP" (.BYTE 0 ;Terminator for TERMTEXT   (.BYTE 4 ;Bootstrap Version @;If bootstrap ends with a non-zero value @; the device to device bootstrap transfer @; can determine the size. ( (.BYTE 0 (.ALIGN 2  SCRATCH .EQU *+1024. ;Ram scratch area  ;Offsets: @; 0.- Return address to Debugger @; 4.- Boot device & subdevice number @; 6.- Logical block for BIOS @; 8.- Starting address of BIOS @;12.- RAM Disk beginning @;16.- RAM Disk top @;20.- RAM Disk boot flag @;21.- BIOS active flag @;22.- Temporary storage (4 bytes)  ;26.- Base of interpreter (4 bytes)  ;30.- Size of memory area (4 bytes)   ARGS .EQU SCRATCH+34.  BUFFER .EQU ARGS+18.  BUFFER2 .EQU BUFFER+2048.  (.END  $TAG V BUFFER T MAIN $CURSOR $EQUAL $SYNTAX B A    \J{O.֪DF {the main program file for creating TOPSYS, which read CPM files to p-System.  {************************************************************************}  {* FILE: TOPSYS4.2.TEXT *}  {* Copyright (c) 1983,84,85 STRIDE MICRO *}  {* ALL RIGHTS RESERVED WORLDWIDE *}  {* *}  {* Version: 1.0 13 Jun 85 Don Marsh (Stride Micro) *}  {* Release of TOPSYS *}  {* 2.0 13 Jun 85 Chuck Emery *}  {* (TDI Computer Systems Limited ) *}  {* 2.1 9 Jul 85 Verlene Bonham (Stride Micro) *}  {* *}  {* DESCRIPTION: This program will transfer a CP/M-68k text or data *}  {* file to a P-system volume. A data file is *}  {* transferred literally; a text file is formatted *}  {* (tabs decoded, beginning spaces encoded, etc.) *}  {* HISTORY: " Version 2 was created to allow choice of unit numbers for source %( CP/M ) and destination ( p-System ). Specifically for a user %with a single floppy disk, for whom Version 1 was unusable. In %addition, to allow for the non-standardized nature of non-floppy %CP/M device parameters, Version 2 reads the device parameters for %the selected device and will use the device based on these parameters. " For this reason Version 2 USES the CONFIGUNIT from TOOLS.CODE, and %will need the appropriate version ( Either TOOLS.CODE or TOOLS4.13.CODE ) %libraried into the final code file - hence one code file for 4.2 %and another for 4.13. -Chuck " " Version 2.1 added code to allow for floppy default parameters in case %the device parameters were not set up. This makes it easier for novice %users.- Verlene %  {* *}  {************************************************************************}    PROGRAM TO_PSYS;   USES {$U UTILITY:TOOLS.CODE} CONFIG_UNIT;   VAR CPMTITLE, PSYSTITLE: STRING; { File names of transfer file } (CPMUNIT, { Where the CP/M disk will be } (PSYSUNIT,  { Where the P-system disk is } (ActualUnit, { Actual CP/M Physical Unit } (N_BlockSize, { Length of CP/M Extents } (N_Entries, { Length of Directory } (N_BootTracks, { Boot Tracks to Skip } (N_SectorsOnTrack, { How Long the Tracks ? } (MaxBlock, { 15 if DSM<256, else 7 } (DSM, { Number of Last CP/M Block } (CPMBLOCKS, PSYSBLOCKS: INTEGER; { Size of transfer file } (FORMAT: CHAR; { Indicates whether file is } P{ a text or data file } (CPMDIRECTORY: PACKED ARRAY[0..2047] OF CHAR; { Holds directory page } (EXTENTS: ARRAY[1..512] OF INTEGER; { Contains the block (extent) } P{ numbers associated with the } P{ CP/M file } P    {Two New Procedures Inserted Here - Chuck Emery }   {Get a Gvalid Volume number or BIOS channel}  PROCEDURE READVOLNUM ( VAR NUM : INTEGER ); "VAR $OK : BOOLEAN; $CH : CHAR; $I,N : INTEGER; "BEGIN $REPEAT &I:=0; &N:=0; &REPEAT (READ (KEYBOARD,CH); (IF CH IN ['0'..'9'] THEN *BEGIN ,I:=I*10+ORD(CH)-ORD('0'); ,N:=N+1; ,WRITE (CH); *END (ELSE IF ORD(CH)=8 THEN { BACKSPACE } *BEGIN ,IF N>0 THEN { ONLY IF SOMETHING THERE } .BEGIN 0N:=N-1; 0WRITE (CHR(8),' ',CHR(8)); 0I:=I DIV 10; .END ,ELSE WRITE (CHR(7)); { BEEP & IGNORE } *END (ELSE IF CH <> ' ' THEN WRITE (CHR(7)); { BEEP & IGNORE } &UNTIL EOLN(KEYBOARD); &OK:= I IN [4,5,9..22]; $ IF (NOT OK) AND (N > 0) THEN FOR I:=1 TO N DO WRITE (CHR(8),' ',CHR(8)); &IF (NOT OK) THEN IF N>0 THEN (BEGIN *WRITE (' Bad value',CHR(7)); *FOR I:=1 TO 15 DO WRITE (CHR(8)); (END ELSE EXIT(PROGRAM); $UNTIL OK; " NUM:=I; $WRITELN; "END; "  { Find out all about CP/M disk}  FUNCTION GETCPMPARAMS(Change:BOOLEAN) : BOOLEAN; "VAR $OkSoFar : BOOLEAN; $OrgInfo,Info, ActualSub, Sectors : INTEGER; $StatusRec : PACKED ARRAY [0..29] OF INTEGER; $ChanTable : Conf_ChanTable; " Floppy : Conf_Floppy; " Winch : Conf_Winch; " DevInfo : Conf_DevInfo; $WDevInfo : Conf_WDevInfo; , ${To make it easier on non-CPM types - Verlene} $PROCEDURE DoDefaults; $VAR ASCII:CHAR; $ ValOk:BOOLEAN; % )PROCEDURE MakeInfo; )VAR Count:INTEGER; )BEGIN )IF ActualUnit IN [4,5] THEN Info:=1 ELSE Info:=0; )OrgInfo:=N_BlockSize DIV 1024; )Count:=0; )WHILE (OrgInfo DIV 2)<>0 DO +BEGIN -OrgInfo:=OrgInfo DIV 2; -Count:=Count+1; +END; )Info:=Info + (Count * 8192); )Info:=Info + (N_Entries DIV 32) * 128; )Info:=Info + (N_BootTracks * 16); )DevInfo[ActualUnit]:=Info; )Conf_Wt_DevInfo ( DevInfo ); )END; $ $BEGIN $ValOk:=FALSE; $REPEAT &WRITELN; &IF CHANGE THEN (BEGIN *WRITE ('** CP/M disk parameters ARE: '); *WRITE (' BlockSize =',N_BlockSize); *WRITE (', Dir entries=',N_Entries); *WRITELN (', Offset =',N_BootTracks); &END ELSE WRITELN ('Error: ** CP/M disk parameters not defined **',CHR(7)); &WRITELN; &WRITELN(' The Blocksize in bytes, the directory track offset'); &WRITELN(' (the boot tracks) and the number of entries'); &WRITELN(' in a directory must be defined. See Auxiliary Device'); &WRITELN(' Information under UTIL in your Stride manual or'); &WRITELN; &WRITELN('Type: F to use Floppy Defaults'); &WRITELN(' V to define the parameters now.'); &WRITELN(' Q to quit this program.'); &WRITE (' ---> '); &READ (ASCII); &WRITELN; &CASE ASCII OF &'q','Q':EXIT(PROGRAM); &'f','F':BEGIN {Default for CPM floppies} 0N_BlockSize:= 2048; 0N_BootTracks:=2; 0N_Entries:=64; 0ValOk:=TRUE; .END; &'v','V':BEGIN {Default for CPM floppies} 0REPEAT 2WRITELN; 2WRITELN(' Block Size: 0 1024'); 2WRITELN(' 1 2048'); 2WRITELN(' 2 4096'); 2WRITELN('  3 8192'); 2WRITELN(' 4 16384'); 2WRITELN; 2WRITELN(' Q to quit this program.'); 2WRITE (' ---> '); 2READ (ASCII); 2WRITELN; 2CASE ASCII OF 5'0': N_BlockSize:= 1024; 5'1': N_BlockSize:= 2048; 5'2': N_BlockSize:= 4096; 5'3': N_BlockSize:= 8192; 5'4': N_BlockSize:=16384; 5'Q': EXIT(PROGRAM); 5END; 2WRITELN; 0UNTIL ASCII IN ['0'..'4']; 0WRITELN; 0WRITE (' Boot Track Offset (normally 2) --->'); 0READLN(N_BootTracks); 0WRITELN; 0WRITE (' Number of Dir Entries (32,64...)--->'); 0READLN(N_Entries); 0ValOk:=TRUE; .END; " END; "UNTIL ValOk; "MakeInfo; "END; " "BEGIN $OkSoFar:=TRUE; $Conf_RD_ChanTable ( ChanTable ); $ActualUnit:=ChanTable[CPMUNIT].Channel; $ActualSub:=ChanTable[CPMUNIT].SubChannel; " IF ActualUnit IN [4,5,11] THEN { Floppy or Ram } &BEGIN (IF ActualUnit = 11 THEN N_SectorsOnTrack:=0 (ELSE *BEGIN * Conf_RD_Floppy (ActualUnit, Floppy); ,N_SectorsOnTrack:=Floppy.SectorsPerTrackG; *END; & Conf_RD_DevInfo ( DevInfo ); (Info:=DevInfo[ActualUnit]; &END $ELSE IF ActualUnit = 9 THEN { Winchester } &BEGIN & Conf_RD_Winch ((ActualSub DIV 16), Winch); (N_SectorsOnTrack:=Winch.SectorsPerTrack; (Conf_RD_WDevInfo ( WDevInfo ); (Info:=WDevInfo[(ActualSub DIV 16),(ActualSub MOD 16)]; &END $ELSE &BEGIN (WRITELN ('** Not a valid channel **',CHR(7)); (OkSoFar:=FALSE; " END; " IF OkSoFar THEN &BEGIN (UNITSTATUS (CPMUNIT,StatusRec,0); { A trick to find size } (Sectors:=StatusRec[2]*StatusRec[3]; { for Floppy, Winch, or RAM } (IF NOT (N_SectorsOnTrack IN [0,8..19]) THEN *BEGIN ,WRITELN ('** Invalid Sectors per Track **',CHR(7)); ,OkSoFar:=FALSE; *END (ELSE IF (Info = 0) OR CHANGE THEN DoDefaults & ELSE *BEGIN ,OrgInfo:=Info; ,IF Info<0 THEN Info:=ORD(ODD(INFO) AND ODD(32767)); { - high bit } ,Info:=Info DIV 16; { strip REMOV & unused } ,N_BootTracks:=Info MOD 8; ,Info:=Info DIV 8; ,N_Entries:=32*(Info MOD 64); ,Info:=Info DIV 64; ,IF OrgInfo<0 THEN Info:=4; {Take care of - wrap } ,IF Info IN [0..4] THEN .BEGIN . Case Info of 20 : N_BlockSize:= 1024; 21 : N_BlockSize:= 2048; 22 : N_BlockSize:= 4096; 23 : N_BlockSize:= 8192; 24 : N_BlockSize:=16384; . END; 0{ Find Number of the last Block, DSM } 0DSM:=Sectors DIV (N_BlockSize DIV 512)-1; 0IF DSM<256 THEN MaxBlock:=15 2ELSE MaxBlock:=7; .END ,ELSE .BEGIN 0WRITELN ('** CP/M disk block size is illegal **',CHR(7)); 0CHANGE:=TRUE; 0DoDefaults; .END; *END; &END; $GETCPMPARAMS:=OkSoFar; "END; "  { Convert string S to upper case }  PROCEDURE UPPER(VAR S: STRING);  VAR I: INTEGER;  BEGIN  FOR I:=1 TO LENGTH(S) DO $IF (ORD(S[I])>=ORD('a')) AND (ORD(S[I])<=ORD('z')) THEN (S[I]:=CHR(ORD(S[I])-ORD('a')+ORD('A'));  END;     { Get a filename for the CP/M file from the user }  PROCEDURE GETFILENAME(VAR CPMTITLE: STRING);  CONST SPACES = '  ';  VAR I: INTEGER;   { Show the directory of the CP/M disk so the user can make an informed choice }  PROCEDURE SHOWDIRECTORY;  CONST EMPTYFLAG = 229; { Flags an empty directory entry }  VAR ITEM, FILENO, I, J: INTEGER;  DIRENTRIES: ARRAY[0..1023] OF STRING[11]; $FILENAME: STRING[11];  FOUND: BOOLEAN;  BEGIN  WRITELN;  WRITE(  'CP/M directory--------------------------------------------------------------');  ITEM:=-1; FILENO:=-1; FILENAME:='12345678901';  FOR I:=0 TO N_Entries-1 DO { Scan the directory for non-empty entries } $BEGIN $IF I MOD 64 = 0 THEN UNITREAD(CPMUNIT,CPMDIRECTORY,2048, (N_BootTracks*N_SectorsOnTrack+(I DIV 16)); { load directory buffer } $IF ORD(CPMDIRECTORY[32*I])<>EMPTYFLAG THEN (BEGIN (FOR J:=1 TO 11 DO { Copy filename into a string } ,FILENAME[J]:=CPMDIRECTORY[32*I+J]; (FOUND:=FALSE; (FOR J:=0 TO FILENO DO { Have we already printed this name? } ,IF FILENAME=DIRENTRIES[J] THEN FOUND:=TRUE; (IF NOT FOUND THEN { Print it } ,BEGIN ,FILENO:=FILENO+1; { Record the name for future checking } ,DIRENTRIES[FILENO]:=FILENAME; ,ITEM:=(ITEM+1) MOD 5; { Increment item's number on this line } ,IF ITEM=0 THEN { Start a new line on the screen } 0BEGIN 0WRITELN; WRITE(' '); 0END ,ELSE WRITE(' : '); { Separate directory items CP/M-style } ,WRITE(COPY(FILENAME,1,8),' ',COPY(FILENAME,9,3)); ,END; (END;  END;  WRITELN;  WRITELN(  '---------------------------------------------------------------------------');  WRITELN;  END;    BEGIN { *** GETFILENAME ***}  REPEAT $REPEAT (WRITE('CP/M file name (? for directory, @ new setup, CR to exit): '); $ READLN(CPMTITLE); $ IF CPMTITLE='?' THEN SHOWDIRECTORY; { Show the CP/M directory } (IF CPMTITLE='@' THEN IF NOT GETCPMPARAMS(TRUE) THEN Exit(PROGRAM); P {Change config setup } $UNTIL (CPMTITLE<>'@') AND (CPMTITLE<>'?'); $UPPER(CPMTITLE); { Make Hfilename upper case, no extra spaces } $WHILE POS(' ',CPMTITLE)>0 DO DELETE(CPMTITLE,POS(' ',CPMTITLE),1);   { Delete a period from the filename, then pad filename and extension with }  { spaces so that CPMTITLE fills exactly 11 characters. This format is }  { necessary when we scan the disk directory to find the given file. } $I:=POS('.',CPMTITLE)-1;  IF I<0 THEN { No period } (BEGIN (I:=LENGTH(CPMTITLE); (IF I=0 THEN EXIT(PROGRAM); { No filename } (END $ELSE (CPMTITLE:=CONCAT(CPMTITLE,' '); { Add spaces to fill extension } $IF I>8 THEN WRITELN('ILLEGAL FILE NAME (too long)');  UNTIL I<=8; { Loop until legal filename }  IF I8) THEN I:=8;  IF ORD(FORMAT)=ORD('T') THEN EXTENSION:='.TEXT' { Choose the proper extension }  ELSE EXTENSION:='.DATA';  PSYSTITLE:=CONCAT(UNITSTR,COPY(CPMTITLE,1,I),EXTENSION);  END;     { Search the CPM directory for file CPMTITLE. If it is found, the number of }  { blocks (extents) is recorded in CPMBLOCKS (zero if not found). This }  { procedure builds the EXTENTS table which tells which blocks (extents) are }  { associated with the given filename. }  PROCEDURE SEARCHCPM(VAR CPMTITLE: STRING; VAR CPMBLOCKS: INTEGER);  CONST EMPTYFLAG=229; { Byte that flags an empty directory entry }  VAR DIRENTRY, BLKNO, I: INTEGER; $FOUND: BOOLEAN;  BEGIN  CPMBLOCKS:=0;  { No blocks in this file, yet }  FOR DIRENTRY:=0 TO N_Entries-1 DO { Scan the directory for CPMTITLE } $BEGIN $IF DIRENTRY MOD 64 = 0 THEN UNITREAD(CPMUNIT,CPMDIRECTORY,2048, (N_BootTracks*N_SectorsOnTrack+(DIRENTRY DIV 16)); $IF ORD(CPMDIRECTORY[32*DIRENTRY])<>EMPTYFLAG THEN { Here's a non-empty } (BEGIN { directory entry } (FOUND:=TRUE; (FOR I:=1 TO 11 DO { Is this filename the same as CPMTITLE? } ,IF CPMDIRECTORY[32*DIRENTRY+I]<>CPMTITLE[I] THEN FOUND:=FALSE; (IF FOUND THEN { We found the filename we're looking for } ,FOR I:=0 TO MaxBlock DO { Record the block numbers (extents) } 0BEGIN { associated with this file } 0If DSM<256 THEN 2BLKNO:=ORD(CPMDIRECTORY[32*DIRENTRY+16+I]) 0ELSE 2BLKNO:=ORD(CPMDIRECTORY[32*DIRENTRY+16+I*2]) 4+256*ORD(CPMDIRECTORY[32*DIRENTRY+17+I*2]); 0IF BLKNO<>0 THEN 4BEGIN 4CPMBLOCKS:=CPMBLOCKS+1; { Increment block count } 4EXTENTS[CPMBLOCKS]:=BLKNO*(N_BlockSize DIV 512) 6+N_SectorsOnTrack*N_BootTracks; { Convert to equiv. } 4END; { P-system block so } 0END; { we can read with } (END; { UNITREAD }  END;  END;     { Transfer the text or data file from CP/M disk to P-system disk }  PROCEDURE WRITEFILE(VAR PSYSTITLE: STRING; FORMAT: CHAR; CPMBLOCKS: INTEGER; 4VAR PSYSBLOCKS: INTEGER);  VAR F: FILE; { P-system file } $INBLKS, OUTBLKS: INTEGER; { Number of blocks transfered } $InnerLoop : INTEGER; { Position in CP/M Block } $INBUFFER: PACKED ARRAY[0..1023] OF CHAR; $OUTBUFFER: PACKED ARRAY[0..511] OF CHAR;   { Indicate a disk write error and abort }  PROCEDURE WRITERR;  BEGIN  WRITELN('WRITE ERROR');  EXIT(PROGRAM);  END;   { Transfer a data file }  PROCEDURE WRITEDATA;  BEGIN  FOR INBLKS:=1 TO CPMBLOCKS DO { HTransfer all blocks } $BEGIN $ For InnerLoop := 0 to ( N_BlockSize DIV 1024 ) - 1 DO $ BEGIN 0UNITREAD(CPMUNIT,INBUFFER,1024,EXTENTS[INBLKS]+2*InnerLoop); 0{ Read a CP/M block portion, repeat until whole block read } 0IF BLOCKWRITE(F,INBUFFER,2)<>2 THEN WRITERR; 0{ Write 2 P-sys blocks } 0OUTBLKS:=OUTBLKS+2; { Update block counter } $ END; $END;  END;   { Transfer a text file with appropriate formatting (decode tabs, encode }  { starting spaces, etc.) }  PROCEDURE WRITETEXT;  VAR INPTR, OUTPTR, { Pointers which access INBUFFER and OUTBUFFER } $CHRVAL, { Current character value } $COLUMN, TABCOL: INTEGER;  NEWLINE: BOOLEAN; { Flags a new line } $  { Get a text character from the input buffer }  PROCEDURE GETCHAR(VAR CHRVAL: INTEGER);  BEGIN  IF INPTR<0 THEN { If input buffer is empty, get a new one } $BEGIN $InnerLoop:=InnerLoop+1; $If InnerLoop >= N_BlockSize DIV 1024 Then { go to next extent } $ BEGIN ( InnerLoop:=0; ,INBLKS:=INBLKS+1; { Increment CP/M block count } (END; $IF INBLKS<=CPMBLOCKS+1 THEN { Everything's OK } (UNITREAD(CPMUNIT,INBUFFER,1024,EXTENTS[INBLKS]+2*InnerLoop) ({ Read a CP/M block portion } $ELSE (BEGIN { Tried to read a non-existent block, so we } (WRITELN('READ ERROR -', { must not have gotten an end-of-file char. } 0' CP/M TEXT FILE HAS NO "EOF" CHARACTER'); (INPTR:=-1; (EXIT(WRITETEXT); (END; $END;  INPTR:=INPTR+1; { Increment buffer pointer }  CHRVAL:=ORD(INBUFFER[INPTR]); { Get a character from buffer }  IF INPTR=1023 THEN INPTR:=-1; { If that was the last character in the }  END; { buffer, signal that fact with -1 }   { Put a text character in output buffer }  PROCEDURE PUTCHAR(CHRVAL: INTEGER);  BEGIN  OUTPTR:=OUTPTR+1; { Increment buffer pointer }  COLUMN:=COLUMN+1; { Increment horizontal coordinate }  OUTBUFFER[OUTPTR]:=CHR(CHRVAL); { Store the character in the buffer }  IF OUTPTR=511 THEN { If that was the last character that fits, } $BEGIN { write the buffer to disk } $IF BLOCKWRITE(F,OUTBUFFER,1)<>1 THEN WRITERR; $OUTBLKS:=OUTBLKS+1; { Increment block count } $OUTPTR:=-1; $END;  END; $   BEGIN { *** WRITETEXT *** }  FILLCHAR(INBUFFER,1024,CHR(0)); { Dump two blocks of nulls to start out file }  IF BLOCKWRITE(F,INBUFFER,2)<>2 THEN WRITERR;  OUTBLKS:=OUTBLKS+2;  INPTR:=-1; OUTPTR:=-1; { Initialize buffer pointers }  InnerLoop:=N_BlockSize DIV 1024; { Force first extent read to be # 1 }  COLUMN:=0;  NEWLINE:=TRUE;  REPEAT $REPEAT (GETCHAR(CHRVAL); { Get a character from the input buffer } $UNTIL CHRVAL<>10; { Strip out line feed characters } $IF CHRVAL=13 { Carriage return } THEN (BEGIN (IF NEWLINE THEN ,BEGIN ,PUTCHAR(16); PUTCHAR(32); { Output indentation indicators } ,END; (PUTCHAR(13);  { Output carriage return } (IF ODD(OUTBLKS) THEN ,WHILE 512-OUTPTR<82 DO PUTCHAR(0); { Fill a small amount of space } (COLUMN:=0; { at the end of a block } (NEWLINE:=TRUE; { On a new line now } (END $ELSE IF NEWLINE THEN { Are we starting a new line? } ,IF CHRVAL=32 { Space} THEN 0COLUMN:=COLUMN+1 ,ELSE IF CHRVAL=9 { Tab } THEN 0COLUMN:=COLUMN+8-COLUMN MOD 8 ,ELSE { not a space or a tab } 0BEGIN 0PUTCHAR(16); { Output character count } 0PUTCHAR(COLUMN+32-1); 0COLUMN:=COLUMN-2; { Adj. column for two chars. just output } 0IF CHRVAL<>26 THEN { Output current char., unless it's eof } 4PUTCHAR(CHRVAL); 0NEWLINE:=FALSE; { Not a new line anymore } 0END (ELSE ,BEGIN { Not a new line } ,IF CHRVAL=9 { Tab } THEN 0FOR TABCOL:=COLUMN MOD 8 TO 7 DO PUTCHAR(32) { Simulate tab } ,ELSE IF CHRVAL<>26 THEN PUTCHAR(CHRVAL); { Don't output CP/M eof } ,END;  UNTIL CHRVAL=I26; { Process characters until end of file }  PUTCHAR(13); { Write P-system eof character }  WHILE OUTPTR>=0 DO PUTCHAR(0); { Fill out rest of this block }  WHILE ODD(OUTBLKS) DO PUTCHAR(0); { No. of text blocks must be even }  END;    BEGIN { *** WRITEFILE *** }  REWRITE(F,PSYSTITLE); { Open P-system file }  INBLKS:=0; OUTBLKS:=0;  IF FORMAT='T' THEN { Select appropriate format } $WRITETEXT  ELSE $WRITEDATA;  CLOSE(F,LOCK); { Close P-system file }  PSYSBLOCKS:=OUTBLKS; { Record size of P-system file }  END;     BEGIN { *** MAIN PROGRAM *** }   WRITELN;  WRITELN('TOPSYS version 2.0');  REPEAT "WRITELN; "WRITE ('Read CP/M files from BIOS channel:4, 5, or 9-22 --> '); "READVOLNUM (CPMUNIT);  UNTIL GETCPMPARAMS(FALSE); "WRITELN; "WRITELN; "WRITE ('Write to p-System Unit Number: 4, 5, or 9-22 --> '); "READVOLNUM (PSYSUNIT); "WRITELN;  REPEAT $WRITELN; $REPEAT (GETFILENAME(CPMTITLE); { Get the name of the CP/M file } (SEARCHCPM(CPMTITLE,CPMBLOCKS); { Search CP/M directory for file } (IF CPMBLOCKS=0 THEN ,WRITELN('FILE NOT FOUND ON #',CPMUNIT); $UNTIL CPMBLOCKS>0; $WRITELN('"',CPMTITLE,'" is ',CPMBLOCKS,' extents long');  $REPEAT (WRITE('Is this a T(ext or D(ata file? '); (READ(FORMAT); { Which format? } (WRITELN; (IF (FORMAT='t') OR (FORMAT='d') THEN { Convert format to upper case } ,FORMAT:=CHR(ORD(FORMAT)-ORD('a')+ORD('A')); $UNTIL (FORMAT='T') OR (FORMAT='D');  $CONVERTFILENAME(CPMTITLE,PSYSTITLE,FORMAT); { Convert CP/M file } X{ name to P-sys name } $WRITEFILE(PSYSTITLE,FORMAT,CPMBLOCKS,PSYSBLOCKS); { Transfer the file }  $WRITELN('"',PSYSTITLE,'" is ',PSYSBLOCKS,' blocks long');   UNTIL FALSE; { Loop forever (exit inside "GETFILENAME") }  END.    {  5*** Format of P-system text files *** ; %The following is an attempt to document the format of Sage P-system  '.TEXT' files.  %Each text file starts with a two-block header, followed by an even number  of text blocks (unused space in the text blocks following end-of-text is filled  out with nulls). The header blocks contain integers (stored high byte first,  low byte second) and text strings which give the following information:   Byte number Item  ----------- ------------------------------------------------------- "0-1 Contains 0004 (must be a text file constant?) "2-3 Contains the number of text markers currently active "4-11 Marker name 1 (text string, padded with spaces at end) !12-19 Marker name 2 !20-27 Marker name 3 !28-35 Marker name 4 !36-43 Marker name 5 !44-51 Marker name 6 !52-59 Marker name 7 !60-67  Marker name 8 !68-75 Marker name 9 !76-83 Marker name 10 !84-91 Marker name 11 !92-99 Marker name 12  100-107 Marker name 13  108-115 Marker name 14  116-123 Marker name 15  124-131 Marker name 16  132-139 Marker name 17  140-147 Marker name 18  148-155 Marker name 19  156-163 Marker name 20  164-171 Marker name 21  172-179 Marker name 22  180-187 Marker name 23  188-195 Marker name 24  196-203 Marker name 25  204-211 Marker name 26  212-243 UNUSED (space for 4 more marker names)  244-295 Marker flags for each marker 60000 = No marker here 60001 = Active marker 6FFFF = Marker has been deleted 6Other values are also possible for system markers  296-303 UNUSED (space for 4 more marker flags)  304-355 IMarker positions (byte count from start of text)  356-363 UNUSED (space for 4 more marker positions)  364-383 Tab stops array. A set tab stop is indicated by a set bit. 4 Bits are packed into bytes loosely (4 per byte with clear 6bits in-between)  384-395 Six words that the editor seems to like set to 0001. I don't 6know what they do.  396-397 Auto Indent option (0001=on, 0000=off)  398-399 Filling option (0001=on, 0000=off)  400-401 Token default (0001=on, 0000=off)  402-403 Left margin (starts at 0000)  404-405 Right margin (starts at 0000)  406-407 Paragraph margin (starts at 0000)  408-409 Com character (ASCII)  410-411 Date of textfile creation 6first 7 bits = year (00-63H = 00-99 decimal) 6next 5 bits = day (01-1FH = 01-31 decimal) 6last 4 bits = month (1-CH = Jan-Dec)  412-413 Date of last update to textfile (same format as above)  414-415 Number of times the textfile has been updated (revision #)  416-417 Auto Buffer option (0001=on, 0000=off)  418-511 UNUSED   Block 2:  --------  0-511 UNUSED (this block is not used as far as I can tell)   % 4Text blocks format 4------------------  %The text blocks contain straight ASCII code, with two additional characters  at the start of each line which contain an indentation setting. The format is  ASCII 0DH (the carriage return from the previous line), followed by 10H  (indentation code character), and a hex byte telling how many characters to  indent this line plus 20H. To indent 4 characters, for example, the hex bytes  would be "10 24".  %Lines may be split between an odd-numbered text block and an even block,  but not between an even block and an odd block. Therefore, up to 81 nulls may  follow the last line in an even block so that a new line can begin in the next  block. There must also be an even number of text blocks, so a block of nulls is  appended to an odd number of text blocks (the smallest text file is 4 blocks  long -- 2 header blocks + 2 text blocks).  %The editor does not allow input of line feeds, so carriage returns are  represented in the textfile without the associated line feed characters. If a  file contains line feed characters, the editor will not act normally.  %Text always ends with a carriage return character (0DH), although this  character is not treated as part of the user's text and is not displayed.  % %  Don Marsh, 21-Jun-83   } FIBBUS IBBUS IV.13 [a.1]JE Cp0<A0!H|CN"8:p0K0I0pNNC("`4p`C.Q|C QL> X?NC"Q`Q`PQ`Q`Q`Q`Q`Q`Q`Q`p``xx8<EH8*QNuap0<E5E5T0C|@p@@@ @ ||0<EJjEgf`| ||pdQ||ad)`p0<CpQNup0<CpQ`p0<EJjg&C| |?a )|_a)<Fp0<C0fp`VCg |a`@a)Qp0<Cfp`Cg|a)| `Eaj)| `a6<FC@)faQ|\a`CrHA2<)Vf HAQp`zNu<F:C"pC)f rHA2<)Vf HAQp`VfpEB"R:` C0HQ Q```C)gp `C| | |?aL)|_a>)|a0)|p0<A vC g\fTCa)| )f"rHA2<)Vf HAQp`:)f&| Q|a)<8p` | |a~))8`62  IBBUS IBBUS BUSTBL 6DEVSTAT 2MYSTACK STACK  A $CURSOR $EQUAL $SYNTAX C Z2O.֨ ;SAGE II IEEE-488 support package  ;  ; File: IB.BUS.TEXT  ; Date: 16-DEC-83  ; Version: 2.1  ;  ;Copyright (c) 1982 Sage Computer Technology  ;ALL RIGHTS RESERVED  ;*****************************************************************************  ; History:  ;  ; 1 17-Jul-82 Initial release.  ; 2 13-SEP-82 Reserved A3 for ATTACH  ; 2.1 16-DEC-83 Forced reset state in INIT.  ; Cleared data buf to & fixed timeout prob.  ;  ;*****************************************************************************  ;FUNCTION IB_BUS(VAR B,BLNG:INTEGER;CARG:INTEGER;CD:BUSCMD):INTEGER;EXTERNAL;  ;  ;This assembly routine directly access the TMS9914 chip so the supervisor mode  ;of the 68000 is enabled using TRAP 14.  ;  ;  ; LONG JSR MACRO: (.MACRO LJSR ;used for calling PROM routines if (.WORD 4EB9H ;necessary. NOT normally called by J(.WORD 00FEH ;this routine. (.WORD %1 (.ENDM  ;***************************************************************************** (.RELFUNC IB_BUS,4 ;relocatable, FUNC= integer E;values must remain between IBUS calls.  ;***************************************************************************** (.PRIVATE MYSTACK:24 ;Save reg on user built stack (.PRIVATE DEVSTAT:16 ;Device status table, use reg A1 bits E;0 = can talk E;1 = can listen E;2 = can control E;3 = has control E;4 = can SRQ E;5 = expects parallel poll E;6 = self (.PRIVATE BUSTBL:4 ;Local variables CONTROL AND CMDTIME  (.INCLUDE IB.DEF ;Register and cmd definitions  .PAGE  ;*****************************************************************************  ;Procedure start-up saves registers, finds address of pascal arguments, goes  ;to supervisor mode using TRAP 14, saves the stack pointer in case of an error.  ;  ;General register usage:  ; A7 stack pointer  ; A6 reserved for Pascal location pointer to Pascal variables  ; A5 reserved for p-system program counter  ; A4 address of start of the data array  ; A3 reserved for p-System break key feature  ; A2 cmdtime counter  ; A1 work register  ; A0 work register  ;  ; D7  ; D6  ; D5 CARG/CMDTIME  ; D4 CMD  ; D3  ; D2  ; D1  ; D0  ;*****************************************************************************   START MOVEQ #0,D0 ;Calculate MYSTACK's true location. (MOVE.W #MYSTACK,D0 ; (LEA 48(A6,D0.L),A0 ;Start at end of stack (MOVE.L (SP)+,-(A0) ;Save return address (MOVEM.L D6/D7/A1-A5,-(A0) ;Save selected registers (LEA SAVSTK,A1 (MOVE.L A0,(A1) ;Save pointer  (MOVE.W (SP)+,D4 ;CMD (MOVE.W (SP)+,D5 ;CARG/CMDTIME (MOVEQ #0,D0 (MOVE.W (SP)+,D0 ;LENG (ptr to) (LEA 0(A6,D0.L),A5 ;ADDR OF LENG/IB_SAGE (MOVE.W (SP)+,D0 ;ARRAY (ptr to) (LEA 0(A6,D0.L),A4 ;ADDR OF START OF ARRAY (MOVE.W (SP)+,D0 ;One word of junk tossed away  (MOVEQ #19.,D0 ;Enter Supervisor mode (TRAP #14. (LEA SAVESP,A1 ;Save supervisor stack PT (MOVE.L A7,(A1) ;for return of D0 (ERR OR DEV FOR SRQ) (BRA DOWHAT ;Find and do cmd   EXIT MOVEQ #0,D0 ;No error, Normal exit (BRA DORET  ERREXIT LEA SAVESP,A1 ;Restore stack pointer (MOVEA.L (A1),A7 ;D0 contains err code  DORET ANDI.W #0DFFFH,SR ;Back to User mode (LEA SAVSTK,A1 (MOVEA.L (A1),A0 (MOVEM.L (A0)+,D6/D7/A1-A5 ;RESTORE user REG (MOVEA.L (A0)+,A0 ;setup return address (MOVE.W D0,-(SP) ;Return ERR/func val (JMP (A0)  .PAGE  ;*****************************************************************************  ;The TRAP puts processor in supervisor mode so that we can now execute the  ;IEEE- processed specified by the CD -reg D4- argument.  ;*****************************************************************************  (.ALIGN 2  SAVESP .BLOCK 4,0 ;Saves stack pointer  SAVLOC .BLOCK 4,0 ;Used by IHEAR  SAVSTK .BLOCK 4,0 ;Save the POINTER TO THE USER STACK  TRAP0 LEA SAVESP,A1 ;Save stack PT in case of err (MOVE.L A7,(A1) E;DOWHAT rets to EXIT or ERREXIT  DOWHAT  ;Re-write as a jump table when assembler is fixed.  ;See the bug list in the SAGE II manual for details of assembler problems.  ;  ;ITALK and IHEAR were put first in order to speed calls up a bit.  ; (DBF D4,$5 (BRA ITALK ;1=SEND data  $5 DBF D4,$10 (BRA IHEAR ;2=rcv data  $10 DBF D4,$20 K(BRA SESSION ;3=set up who is to talk and listen.  $20 DBF D4,$30 (BRA SETSTAT ;4=setup status of a device.  $30 DBF D4,$40 (BRA DIRECT ;5=read/wrt to TMS9914 reg directly.  $40 DBF D4,$50 (BRA TRANS ;6=Transfer control to another device.  $50 DBF D4,$60 (BRA CHKSRQ ;7=CHk for SRQ  $60 DBF D4,$70 (BRA SPOLL ;8=Serial poll devices  $70 DBF D4,$100 (BRA PPOLL ;9=Parallel poll, not implemented  $100 DBF D4,BADA (BRA INIT ;10=initialize TMS9914 if controller  BADA MOVEQ #BADARG,D0 ;bad arg (BRA ERREXIT ;error return   ;*****************************************************************************  PPOLL BRA EXIT ;Not implemented yet.  ;*****************************************************************************   .PAGE  ;*****************************************************************************  ;Wait for device setups - 1.5 US x cmdtime  CMDWAIT (MOVEQ #0,D4 (MOVE.W #BUSTBL,D4 (LEA 0(A6,D4.L),A2 ;Set up to reference local var (MOVE.W CMDTIME(A2),D4 !$10 DBF D4,$10 (RTS   ;*****************************************************************************  ;IEEE 488 BUS INIT ROUTINE  ;  ;On power-up, the TMS9914 chip should be locked in a passive state until  ;a software reset/clear SWRST is done.  ;  ;Before the software SWRST is sent, the address register must be loaded  ;with the device TALK/LISTEN address and the interrupt mask set. The SAGE  ;powers up setting the chip with interrupts off.  ;  ;*****************************************************************************  INIT (BSR ZEROTBL ;zero the device status table. (MOVEQ #0,D0 (MOVE.W #BUSTBL,D0 (LEA 0(A6,D0.L),A2 ;Set up to reference local var (MOVE.W D5,CMDTIME(A2) ;Max CMD setup time (MOVE.W (A4),CONTROL(A2) ;load control word (MOVE.W (A5),D0 ;Self addr is usually set from switch (LEA BASE,A1 ;Base of TMS9914 chip (MOVE.B #SWRST,AUXCMD(A1) ;Force to init state, added vers 2.1 (MOVE.B D0,ADDRSS(A1) ;load SAGE II device addr into TMS9914 (MOVEQ #0,D0 (MOVE.B D0,INTMK0(A1) ;CLR interrupts mask 0 - DO NOT READ (MOVE.B D0,INTMK1(A1) ; 1 (MOVE.B D0,SERPOL(A1) ;CLR Serial poll reg (MOVE.B D0,PARPOL(A1) ;CLR Parallel poll reg (MOVE.B #DAI,AUXCMD(A1) ;DISABLE ALL INTERRUPTS (MOVE.B #RHDF,AUXCMD(A1) ;Release data hold off (MOVE.W #BUSTBL,D0 (LEA 0(A6,D0.L),A2 ;Set up to reference local var (TST.W CONTROL(A2) ;is this the controller? (LEA TXCONT,A2 ;controller xmits, slave rcvs (BNE.S $10 ;controller must clear bus (MOVE.B #TXOFF,(A2) ;slave rcvs control signals (BRA EXIT   $10 MOVE.B #TXON,(A2) ;Controller xmits control signals (MOVE.B #TCA,AUXCMD(A1) ;TAKE CONTROL (MOVE.B #SIC,AUXCMD(A1) ;SETUP to send interface clear. (MOVE.B #CLRST,AUXCMD(A1) ;Start it, IFC line goes low, #23 (MOVEQ #100,D0  $60 DBF D0,$60 ;delay >10us for all devices to synch. (MOVE.B #SICCLR,AUXCMD(A1) ;end interface clear. (MOVE.B #SRE,AUXCMD(A1) ;send remote enable (BSR CMDWAIT (MOVE.B INTST0(A1),D0 ;Clear BO as now in control mode. (BRA EXIT   .PAGE  ;*****************************************************************************  ;zero the device status table:  ;*****************************************************************************  ZEROTBL MOVEQ #0,D0 (MOVE.W #DEVSTAT,D0 (LEA 0(A6,D0.L),A1 (MOVEQ #1FH,D0 ;32 BYTE TABLE  $10 MOVE.B #0,(A1)+ (DBF D0,$10 (RTS   K ;*****************************************************************************  ;load the status of the devices into the table  ;*****************************************************************************  SETSTAT MOVEQ #0,D0 (MOVE.W #DEVSTAT,D0 (LEA 0(A6,D0.L),A1 (MOVEQ #1FH,D0 ;32 BYTE TABLE  $10 MOVE.B (A4)+,(A1)+ (DBF D0,$10 (BRA EXIT   .PAGE  ;*****************************************************************************  ;Set up talk and listen devices.  ;*****************************************************************************  SESSION (MOVEQ #0,D0 (MOVE.W #BUSTBL,D0 (LEA 0(A6,D0.L),A2 ;Set up to reference local var (TST.W CONTROL(A2) ;Am I the controller? (BEQ.S SETMLA ;NO (LEA BASE,A1 (MOVE.B #TCA,AUXCMD(A1) ;YES -TAKE CONTROL (MOVE.B #UNL,DATOUT(A1) ;Unlisten all devices (BSR CMDWAIT (MOVE.B INTST0(A1),D0 (MOVE.B #UNT,DATOUT(A1) ;Unlisten all devices (BSR CMDWAIT (MOVE.B INTST0(A1),D0  SETMLA MOVE.W (A5),D6 ;D6= how many devices will listen (SUBI.W #1,D6 ;LNG too big by 1 (MOVEQ #0,D0 (MOVE.W #DEVSTAT,D0 (LEA 0(A6,D0.L),A1 (MOVE.W (A4)+,D0 ;find device listen status (ADDA.W D0,A1 (BTST #1,(A1) ;can it listen? (BNE.S $5 (MOVEQ #NOHEAR,D0 ;ERR, it can't hear (BRA ERREXIT  $5 BTST #6,(A1) ;self? (LEA BASE,A1 (BEQ.S $10 (MOVE.B #LON,AUXCMD(A1) ;LON (BSR CMDWAIT (BRA.S $20  $10 BSET #5,D0 ;MLA=BIT 5 + listen address (MOVE.B D0,DATOUT(A1) ;set listen device(S) (BSR CMDWAIT ;Wait for slowest device (MOVE.B INTST0(A1),D0  $20 DBF D6,SETMLA ;D6=number of devices  ;Set my talk address  SETMTA MOVEQ #0,D0 (MOVE.W #DEVSTAT,D0 ;get status of device (LEA 0(A6,D0.L),A1  (ADDA.W D5,A1 ;TDEV=D5 (BTST #0,(A1) ;can he talk? (BNE.S $5 (MOVEQ #NOTALK,D0 ;NO!-exit to error return. (BRA ERREXIT  $5 BTST #6,(A1) ;Is it SELF? (LEA BASE,A1 (BEQ.S $10 ;NO - (MOVE.B #TON,AUXCMD(A1) ;yes-SELF talks (BSR CMDWAIT ;Wait for slowest device (MOVE.B DATIN(A1),D2 ;Clear data reg. vers 2.1 (MOVE.B #GTS,AUXCMD(A1) ;release ATN line (BRA EXIT   $10 BSET #6,D5 ;MTA=bit 6 +talk address (MOVE.B D5,DATOUT(A1) (BSR CMDWAIT ;Wait for slowest device (MOVE.B DATIN(A1),D2 ;Clear data reg. vers 2.1 (MOVE.B #GTS,AUXCMD(A1) ;release ATN line  $30 BRA EXIT (  .PAGE  ;*****************************************************************************  ;This device talks.  ;*****************************************************************************  ITALK  BSR WAITBO ;Vers 2.1 (MOVE.W (A5),D6 ;D6=how many bytes to send -1 (SUBI.W #1,D6 ;LNG too big by 1 for all routines  $10 MOVE.B (A4)+,D0 (LEA BASE,A1 (MOVE.B D0,DATOUT(A1) ;send a byte from PASCAL array (MOVE.B INTST0(A1),D4 ;LOOP UNTIL WE HAVE A BYTE (BTST #4,D4 (BNE.S $20 ;Fast devices ok here, (BSR WAITBO ;Wait around for slow ones  $20 DBF D6,$10 ;all but one sent? (MOVE.B #FEOI,AUXCMD(A1) ;send EOI with last byte (MOVE.B (A4)+,DATOUT(A1) ;  BSR WAITBO  $30 BRA EXIT (  ;Wait for a byte handsake completed. ;This routine gives a very long timeout to insure that slow devices can  ;respond without causing a timeout err. The check for a fast device is  ;no longer than necessary, an exit occurs as soon as the BYTE OUT flag  ;is found. Routine will timeout in about 5 sec.  WAITBO (LEA BASE,A1 (MOVEQ #012H,D1  $10 SWAP D1 L(MOVE.W #0FFFFH,D1 ;max wait count (+ 1) for data.  $20 MOVE.B INTST0(A1),D4 ;Chk for byte out flag (BTST #4,D4 (DBNE D1,$20 (BNE.S $40 ;Slow devices exit loop asap (SWAP D1 (DBF D1,$10 (MOVEQ #XTMOUT,D0 ;TRANSMIT Timeout error returned. (BRA ERREXIT  $40 RTS   .PAGE  ;*****************************************************************************  ;This device listens  ;*****************************************************************************  IHEAR (MOVE.W (A5),D6 ;Max number of bytes to receive -1 (SUBI.W #1,D6 ;LNG too big by 1 (MOVE.W #0,(A5) ;Zero count in case of error (LEA SAVLOC,A1 (MOVE.L A4,(A1) ;save org loc so we know how much was sent (MOVEQ #0,D0 ;Clear listen error code  HRCHK LEA BASE,A1 (MOVE.B INTST0(A1),D4 ;chk for byte-in handshake (BTST #5,D4 (BNE.S STORE ;Fast device sent byte already  WAITER ;Wait for slower devices up to 10 sec (MOVEQ #012H,D1  $10 SWAP D1 (MOVE.W #0FFFFH,D1 ;max wait count (+ 1) for data.  $20 MOVE.B INTST0(A1),D4 ;Chk for byte IN flag (BTST #5,D4 (DBNE D1,$20 (BNE.S STORE ;Slow devices exit loop asap (SWAP D1 (DBF D1,$10 ;Times out if no answ within 10 sec. (MOVEQ #RTMOUT,D0 ;Set error code to show receive timeout (BRA.S ENDHR ;exit with what data we have  STORE MOVE.B DATIN(A1),(A4)+ ;Store data, move to next position (BTST #3,D4 ;EOI bit usually set by talker when done. (DBNE D6,HRCHK ;Exit if array is full OR EOI (BNE.S ENDHR ;Was really the last one. (MOVEQ #FULL,D0 ;Array full, ?more data being sent?  ENDHR LEA SAVLOC,A2 ;Get loc of start of data (MOVEA.L (A2),A1 (SUBA.L A1,A4 ;calculate how much data sent: MAX=1 WORD (MOVE.W A4,(A5) ;return number of bytes accepted in LNG. (BRA DORET ;Leave D0 set with error code.     .PAGE  ;*****************************************************************************   ;DIRECT  ;The user is allowed to directly access the TMS9914 registers.  ;In this way, an application can be done without resorting to  ;assembly code  ;  ;The first WORD of the array B must be the register # (AUXCMD=3)  ;The next WORD is the cmd to be written/read.  ;Warning: no error checking is done on DIRECT ACCESS commands.  ;  ;*****************************************************************************   W1 .EQU 3 ;to return rd in low byte.  DIRECT (LEA BASE,A1 ;Which register do we want? (MOVE.W (A4),D0 ;Get reg # (LSL.W #1,D0 ;Mul by 2 (ADDA.W D0,A1 ;create reg address (always odd/high) (DBF D5,$10 ;0=READ (MOVE.B (A1),W1(A4) ;READ REGISTER. (BRA $20  $10 MOVE.B W1(A4),(A1) ;WRT VALUE TO REGISTER.  $20 BRA EXIT   ;*****************************************************************************  TRANS BRA EXIT ;not yet implemented  ;*****************************************************************************   .PAGE  ;*****************************************************************************  ;CHK for SRQ  ;*****************************************************************************  CHKSRQ (LEA BASE,A1 (MOVE.B INTST1(A1),D0 ;Chk for SRQ flag (BTST #1,D0 (BEQ EXIT ;No service request.  $10 MOVEQ #HAVESRQ,D0 (BRA ERREXIT    ;*****************************************************************************  ;Serial poll devices and find out who requested service. L ;*****************************************************************************  SPOLL ;Set serial poll (LEA BASE,A1 ( (MOVE.B #TCA,AUXCMD(A1) ;Grab bus again (ATN) (MOVE.B #TONCLR,AUXCMD(A1) (MOVE.B #UNL,DATOUT(A1) (BSR CMDWAIT ;wait for slow devices (MOVE.B INTST0(A1),D0 ;Clear first byte prompt (MOVE.B #UNT,DATOUT(A1) ;Send universal unTALK out (BSR CMDWAIT ;wait for slow devices (MOVE.B INTST0(A1),D0  ;Clear first byte prompt (MOVE.B #SPE,DATOUT(A1) ;Serial poll enable,get ready to poll. (BSR CMDWAIT ;wait for slow devices (MOVE.B INTST0(A1),D0 ;Clear first byte prompt (MOVE.B #LON,AUXCMD(A1)  (MOVEQ #0,D0 (MOVE.W #DEVSTAT,D0 (LEA 32(A6,D0.L),A0 ;Start at highest WORD address (MOVEQ #31,D3 ;check includes dev #0  DEVPOL (LEA BASE,A1 (MOVE.B -(A0),D0 ;Get device status, set for next dev. (BTST #4,D0 ;Get device status. (BEQ NXTDEV ;not him, can't send SRQ (BTST #6,D0 ;chk for self (BNE NXTDEV ;of course, I did't send it.  (BSET #6,D3 ;set other talker control bit (MOVE.B D3,DATOUT(A1) ;address dev to send poll status (BSR CMDWAIT ;wait for slow devices (MOVE.B DATIN(A1),D2 ;Clear data reg. vers 2.1 (MOVE.B #GTS,AUXCMD(A1) ;release ATN line  HRCHK2 BCLR #6,D3 ;clear talk bit (MOVE.B INTST0(A1),D4 ;chk for byte-in handshake (BTST #5,D4 (BNE.S RDSTAT ;Fast device sent byte already  WAITR2 ;Wait for slower devices up to 10 sec (MOVEQ #012H,D1  $10 SWAP D1 (MOVE.W #0FFFFH,D1 ;max wait count (+ 1) for data.  $20 MOVE.B INTST0(A1),D4 ;Chk for byte IN flag (BTST #5,D4 (DBNE D1,$20 (BNE.S RDSTAT ;Slow devices exit loop asap (SWAP D1 (DBF D1,$10 ;Times out if no answ within 10 sec. (MOVEQ #RTMOUT,D0 ;Set error code to show receive timeout (BRA ERREXIT ;exit with what data we have  RDSTAT MOVE.B DATIN(A1),D2 ;READ STATUS (BTST #6,D2 ;Was it you? (BNE XSPOLL ;YES,exit serial poll  NXTDEV MOVE.B #TCA,AUXCMD(A1) (DBF D3,DEVPOL (MOVE.B #SPD,DATOUT(A1) ;Disable serial poll (BSR CMDWAIT ;wait for slow devices (MOVE.B DATIN(A1),D2 ;Clear data reg. vers 2.1 (MOVE.B #0,D3 (MOVE.W D3,(A4) ;return zero for address (MOVEQ #NOBODY,D0 ;nobody did it?? (BRA ERREXIT  XSPOLL MOVE.B #TCA,AUXCMD(A1) (MOVE.B #SPD,DATOUT(A1) ;Disable serial poll (BSR CMDWAIT ;wait for slow devices (MOVE.B DATIN(A1),D2 ;Clear data reg. vers 2.1 (MOVE.B INTST0(A1),D0 ;Clear first byte prompt (MOVE.W D3,(A4) ;return culprit's address (BRA EXIT ( (.END    ( MIBUNIT I IV.13 [a.1]  VAR IB_SAGE, {The bus address of the SAGE II as set by switches} $IB_ERR:INTEGER; {If <>0, an error has occurred }  IB_CHK:BOOLEAN; {Chk,if true then wrt any error msgs from this unit}  IB_X,IB_Y:INTEGER;{Wrt any error msgs at screen postion X,Y}   {NOTE: arguments are defined in implementation section}   FUNCTION IB_SWITCH:INTEGER;  PROCEDURE IB_INIT(VAR CNTRL,ADDR:INTEGER;CMDWAIT:INTEGER);  PROCEDURE IB_STAT(BDEV,STATUS:INTEGER);  PROCEDURE IB_TALK(LDEV:INTEGER;VAR TBUF:INTEGER;LNG:INTEGER);  PROCEDURE IB_TALKS(LDEV:INTEGER;S:STRING);  PROCEDURE IB_HEAR(TDEV:INTEGER;VAR LBUF,LNG:INTEGER;MORE:BOOLEAN);  PROCEDURE IB_HEARS(TDEV:INTEGER;VAR S:STRING);  PROCEDURE IB_DIR(RDW,REG:INTEGER;VAR VAL:INTEGER);  PROCEDURE IB_SPOLL(VAR PDEV:INTEGER);  FUNCTION IB_CHKSRQ:BOOLEAN;  IMPLEMENTATION IBUNIT TV)`*P43rs p0sp tp`s ps p+2m0i0c ] T% K+ B1 9N 0j '    ր Nrihb! p"jb˧k"! * #"  Nb1 0 !` T,UP'+**+`*'ć**,),`)p`)O ȇW`')W # 0 "! +P+-`)++P2,+`Sˇ,+p-L !Ć  x "  xĖciha` 0 j    xĖ6 66uIB_ERR=Bad call to IB_BUS routinee Please accept data, more to comee RCV timeout XMT timeout8Control timeout - Talker did not give EOI (end-of-input))6Status table indicates device is not equipped to talk..8Status table indicates device is not equipped to listen..Nobody answered serial pollNo SRQ - service requesttUnexpected SRQQ(Input greater than 80 char string lengthh2p0<DA0!H|CN"8:p0K0I0pNNC("`4p`C.Q|C QL> X?NC"Q`Q`PQ`Q`Q`Q`Q`Q`Q`Q`p``xx8<tEH8*QNuap0<tE5E5T0C|@p@@@ @ ||0<tEJjEgf`| ||pdQ||ad)`p0<|CpQNup0<|CpQ`p0<tEJjg&C| |?a )|_a)<Fp0<|C0fp`VCg |a`@a)Qp0<|Cfp`Cg|a)| `Eaj)| `a6<FC@)faQ|\a`CrHA2<)Vf HAQp`zNu<F:C"pC)f rHA2<)Vf HAQp`VfpEB"R:` C0HQ Q```C)gp `C| | M|?aL)|_a>)|a0)|p0<|A vC g\fTCa)| )f"rHA2<)Vf HAQp`:)f&| Q|a)<8p` | |a~))8`- H(4 zhCf4Xp* *** EXTRAIO PASCALIOGOTOXY  IBEX ~~0LA\\F#\IBEX \rh ia`rp@r0r0`rs pspsps pspsp+h hr dar !0 s psps psp+R0rp0rpERR:=TOTAL== other SRQ FOUND SRQRU;DSSl0 PASCALIOIBUNIT  A $CURSOR $EQUAL $SYNTAX B O.` {*******************************************************************}  {* SAGE II/IV IEEE-488 support procedures: *}  {* *}  {* File: IB.UNIT.TEXT *}  {* Date: 16-Dec-83 *}  {* Version: 1.1 *}  {* *}  {* This unit provides software interfacing to the IEEE-488 bus. *}  {* *}  {* COPYRIGHT (c) 1983 SAGE Computer *}  {* ALL RIGHTS RESERVED *}  {* *}  {* Development History: *}  {* *}  {* 1 17-Jul-82 Initial Release *}  {* 1.1 16-DEC-83 IB_HEARS Buffer indx chng from 0 to 1 *}  {* *}  {* *}  {*******************************************************************}  UNIT IB_UNIT; {Link with IB.BUS.CODE to form IB.LNK.CODE}  INTERFACE  VAR IB_SAGE, {The bus address of the SAGE II as set by switcNhes} $IB_ERR:INTEGER; {If <>0, an error has occurred }  IB_CHK:BOOLEAN; {Chk,if true then wrt any error msgs from this unit}  IB_X,IB_Y:INTEGER;{Wrt any error msgs at screen postion X,Y}   {NOTE: arguments are defined in implementation section}   FUNCTION IB_SWITCH:INTEGER;  PROCEDURE IB_INIT(VAR CNTRL,ADDR:INTEGER;CMDWAIT:INTEGER);  PROCEDURE IB_STAT(BDEV,STATUS:INTEGER);  PROCEDURE IB_TALK(LDEV:INTEGER;VAR TBUF:INTEGER;LNG:INTEGER);  PROCEDURE IB_TALKS(LDEV:INTEGER;S:STRING);  PROCEDURE IB_HEAR(TDEV:INTEGER;VAR LBUF,LNG:INTEGER;MORE:BOOLEAN);  PROCEDURE IB_HEARS(TDEV:INTEGER;VAR S:STRING);  PROCEDURE IB_DIR(RDW,REG:INTEGER;VAR VAL:INTEGER);  PROCEDURE IB_SPOLL(VAR PDEV:INTEGER);  FUNCTION IB_CHKSRQ:BOOLEAN;  IMPLEMENTATION   CONST RD=0;WT=1; &AUX=3;  TYPE BYTE=0..255; %BUSCMD=(ITALK,IHEAR,SESSION,SETSTAT,DIRECT,TRANS,CHKSRQ,SPOLL,PPOLL,INIT);  VAR ASCII:CHAR; $BLNG,I:INTEGER; ${value to rd/wrt in direct access to GPIB registers} $CMD:PACKED RECORD CASE INTEGER OF '1:(W:PACKED ARRAY[0..3] OF INTEGER); ! END; $DEVSTAT:RECORD CASE INTEGER OF &1:(B:PACKED ARRAY[0..31] OF BYTE);  2:(W:PACKED ARRAY[0..15] OF INTEGER); &END;  FUNCTION IB_BUS(VAR B,BLNG:INTEGER;CARG:INTEGER;CD:BUSCMD):INTEGER;EXTERNAL;   PROCEDURE IB_WRTERR(S:STRING);  BEGIN  GOTOXY(IB_X,IB_Y);  WRITE('IB_ERR=',IB_ERR,' ',S);  READ(ASCII);  END;   PROCEDURE CHKERR;  BEGIN  IF IB_CHK THEN "BEGIN "IF IB_ERR<>0 THEN #BEGIN %CASE IB_ERR OF '1:IB_WRTERR('Bad call to IB_BUS routine'); '2:IB_WRTERR('Please accept data, more to come'); '3:IB_WRTERR('RCV timeout'); '4:IB_WRTERR('XMT timeout'); '5:IB_WRTERR('Control timeout - Talker did not give EOI (end-of-input)'); '6:IB_WRTERR('Status table indicates device is not equipped to talk.'); '7:IB_WRTERR('Status table indicates device is not equipped to listen.'); '8:IB_WRTERR('Nobody answered serial poll'); '9:IB_WRTERR('No SRQ - service request'); &10:IB_WRTERR('Unexpected SRQ'); &50:IB_WRTERR('Input greater than 80 char string length'); %END; #END;  END;  END;   FUNCTION IB_SWITCH;{:INTEGER;}  {Reads GROUP-B switch to get dev addr of SAGE II}  VAR SWLOW,SWHIGH:INTEGER;  SW:RECORD CASE INTEGER OF '1:(B:BOOLEAN); '2:(A:PACKED ARRAY[0..1] OF BYTE); 'END;  BEGIN  SWLOW:=20000+29187; {GROUPB addr = 00FF C023}  SWHIGH:=255;  UNITREAD(130,SW.A,2,SWLOW,SWHIGH);  SW.B:=NOT(SW.B);  IB_SWITCH:=SW.A[0];  END;      PROCEDURE IB_INIT; {CNTRL,ADDR,CMDWAIT:INTEGER}  {CNTRL = 1 if the SAGE is the controller, else 0  CMDWAIT = Time required for slowest device to do cmd. *Specify in usec, divided by 2}  BEGIN  IB_ERR:=IB_BUS(CNTRL,ADDR,CMDWAIT,INIT);  CHKERR;  END;    PROCEDURE IB_STAT; {(BDEV,STATUS:INTEGER);}  {BDEV = Bus device address (range 0-31) !STATUS = What the device can do - talk, listen,etc}  VAR SW:RECORD CASE INTEGER OF &1:(B1,B0:BYTE); &2:(W:INTEGER); &END;  BEGIN  DEVSTAT.B[BDEV]:=STATUS; {19=Can talk, listen and send SRQ}  BLNG:=1;  IB_ERR:=IB_BUS(DEVSTAT.W[0],BLNG,0,SETSTAT); {Send status to assembly code area}  CHKERR;  END;   PROCEDURE IB_TALK; {(LDEV:INTEGER;VAR TBUF:INTEGER;LNG:INTEGER);}  {LDEV = LISTEN device !TBUF = addr/ptr to start sending data from !LNG = how much data to send}  BEGIN  {set SAGE to talk, LDEV to listen}  BLNG:=1;  IB_ERR:=IB_BUS(LDEV,BLNG,IB_SAGE,SESSION);  CHKERR;  IF IB_ERR=0 THEN "BEGIN $IB_ERR:=IB_BUS(TBUF,LNG,0,ITALK); {start talking} $CHKERR;  END;  END;   PROCEDURE IB_TALKS; {(LDEV:INTEGER;S:STRING:INTEGER);}  {S = up to 80 chars are sent, if listener *requires a terminator other than CR with EOI *it must be part of string.}  VAR DT:PACKED RECORD CASE INTEGER OF %1:(B:PACKED ARRAY[0..79] OF BYTE);  2:(W:PACKED ARRAY[0..39] OF INTEGER); %END; $I,IK:INTEGER; %  BEGIN  FOR I:=0 TO 39 DO DT.W[I]:=0;  IK:=LENGTH(S);  MOVELEFT (S[1],DT,IK); N DT.B[IK]:=13; {TERMINATOR=CR}  IB_TALK(LDEV,DT.W[0],IK);  END;      PROCEDURE IB_HEAR; {(TDEV:INTEGER;VAR LBUF:INTEGER;LNG:INTEGER;MORE:BOOLEAN);}  {TDEV = ADDR/PTR to the talk device. !LBUF = ptr/addr of where to put listen data !LNG = amount of data expected !MORE = we have already setup the session, more data was sent than )the buffer size we had, so we are returning to get the rest )of it.}  BEGIN  IF NOT MORE THEN "BEGIN {Set SAGE to listen, IB_DEV to talk} $BLNG:=1; $IB_ERR:=IB_BUS(IB_SAGE,BLNG,TDEV,SESSION); $CHKERR; {Write an error if not ok} "END ELSE IB_ERR:=0; {Need this for block transfers}  IF IB_ERR=0 THEN "BEGIN $IB_ERR:=IB_BUS(LBUF,LNG,0,IHEAR); {Grab the data} $CHKERR; {Write an error if not ok}  END;  END;     PROCEDURE IB_HEARS; {(TDEV:INTEGER;var S:STRING:INTEGER);}  {TDEV = TALK device  S = up to 80 char are received from the *TALKing device.}  VAR DT:PACKED RECORD CASE INTEGER OF %1:(B:PACKED ARRAY[0..83] OF BYTE); %2:(W:PACKED ARRAY[0..41] OF INTEGER); %END;  IK:INTEGER;  BEGIN  IK:=80; {Max no. of char to put in string}  IB_HEAR(TDEV,DT.W[1],IK,FALSE);  {actual amount sent back in IK}  IF IK>80 THEN "BEGIN $IB_ERR:=50; {Reply bigger than string ...use HEAR} $CHKERR; "END "ELSE $BEGIN &{$R-} &S[0]:=CHR(IK); {Set string length to low byte} &{$R+} &MOVELEFT(DT.B[2],S[1],IK); $END;  END;   PROCEDURE IB_DIR; {RDW,REG:INTEGER;VAR VAL:INTEGER);  {RDW = 0 to read a register in the TMS9914 *1 to write a register !REG = number of register !VAL = value read/written from/to the register}  {note AUX cmd reg=3}   BEGIN  CMD.W[0]:=REG;  CMD.W[1]:=VAL;  BLNG:=1;  IB_ERR:=IB_BUS(CMD.W[0],BLNG,RDW,DIRECT);  CHKERR;  VAL:=CMD.W[1];  END;   FUNCTION IB_CHKSRQ; {BOOLEAN}  {checks for a service request}  CONST HAVESRQ=10;  VAR PDEV,BLNG:INTEGER;  BEGIN  PDEV:=0;  BLNG:=0;  IB_ERR:=IB_BUS(PDEV,BLNG,0,CHKSRQ);  IB_CHKSRQ:=(IB_ERR=HAVESRQ);  {Do not CHKERR here as only HAVESRQ or 0 will ever be returned}  END;   PROCEDURE IB_SPOLL; {(VAR PDEV:INTEGER)}  {PDEV = Serial poll returns addr of device *that requested service here.}  {CHK for SRQ and Do a serial poll to find who sent it. Return dev# in PDEV}  {If previous call told of an SRQ from IB_CHKSRQ above,then do just the poll}  CONST HAVESRQ=10;  BEGIN  PDEV:=0;  BLNG:=0;  IB_ERR:=IB_BUS(PDEV,BLNG,0,SPOLL);  CHKERR;  PDEV:=ORD(ODD(PDEV) AND ODD(31));  END;    BEGIN  FOR I:=0 TO 15 DO DEVSTAT.W[I]:=0;  END. $CURSOR $EQUAL $SYNTAX O.֨O {SAGE II IEEE-488 SUPPORT PACKAGE:   File: IB.EX.TEXT  Date: 17-JUL-82  Version: 1   Copyright (c) 1982 SAGE Computer Technology   }  {This is an example of how to use the IEEE-488 support package}  PROGRAM IB_EX;  {$U IB.UNIT.CODE}  USES IB_UNIT;  CONST MAX=512;  VAR HP1615:INTEGER;  ASCII:CHAR;   PROCEDURE DOINIT;  {Assumes SAGE II is controller}  CONST TLK=1;LST=2;TAK=4;CTR=8;SRQ=16;PP=32;IAM=64;  VAR CONTROL,SW:INTEGER;  BEGIN  IB_CHK:=TRUE; {YES, DO chk and display err msgs}  IB_X:=0; {wrt them at 0,22}  IB_Y:=22;  SW:=IB_SWITCH; {Read GROUP-B switch}  IB_SAGE:=ORD(ODD(SW) AND ODD(31)); { mask off address}  CONTROL:=1; {Send control flag thru}  IB_INIT(CONTROL,SW,23); {1=CONTROLLER,SAGE ADDR, 46 USEC CMD}  IF IB_ERR<>0 THEN EXIT(IB_EX);  IB_STAT(IB_SAGE,TLK+LST+TAK+CTR+IAM);{talk,listen,control,SELF: =79}  HP1615:=15;  IB_STAT(HP1615,TLK+LST+SRQ);{HP1615=DEV 15 can talk,listen, send SRQ =Serial poll by default : = 19}  END;   PROCEDURE GETDATA;  VAR BDATA:PACKED RECORD CASE INTEGER OF &1:(B:PACKED ARRAY[1..MAX] OF 0..255); &2:(W:INTEGER); &END; $MORE:BOOLEAN; $TOTAL,DLNG:INTEGER;   BEGIN  MORE:=FALSE;  DLNG:=MAX; {MAX number of bytes for each call}  TOTAL:=0;  REPEAT "IB_HEAR(HP1615,BDATA.W,DLNG,MORE); "{ SAVE DATA HERE} "MORE:=TRUE;  TOTAL:=TOTAL+DLNG;  UNTIL IB_ERR<>2;  IF IB_ERR<>0 THEN WRITELN('ERR:=',IB_ERR);  WRITELN('TOTAL=',TOTAL);  END; (  PROCEDURE ACTION;  {Wait for SRQ, then Do a serial poll}  CONST NOSRQ=9;  VAR PDEV,SCOUNT:INTEGER;  ACT:STRING;  BEGIN  SCOUNT:=0;  REPEAT "SCOUNT:=SCOUNT+1;  UNTIL (IB_CHKSRQ) OR (SCOUNT>100);  IB_SPOLL(PDEV);  IF PDEV<>HP1615 THEN WRITELN('other SRQ') ELSE WRITELN('FOUND SRQ');  END;   BEGIN  DOINIT;  IB_TALKS(HP1615,'RU;');  IF IB_ERR<>0 THEN EXIT(IB_EX);  IB_TALKS(HP1615,'DS');  IF IB_ERR<>0 THEN EXIT(IB_EX);  ACTION;  IB_CHK:=FALSE; {No error msgs displayed while getting data}  GETDATA;  END.       O