7$ ?BOOT-F-No boot on volume ߋtvRT11A DECRT11A Yzdzf Zz?f zvf Xvxevf 8dkQ$8kQ$8kQ!+18kQ+1#SkQ+1#S'+1#S +18kQ9$8kQ;$;kQ6$;*}kQ+19g&N! & dG F  `$) `e.e. & dG F   & dG F  `$) `e.e.5h)DbAb?`)7`4 (e  ee.!!2)5?`V)7`f`A!> 5CT,`l,><%""@"h$#$,*++$(r+ `a `7`|``& TG C `w  ? ? ",3 |EP$El(7 )7  3 3 3 3 :3K5B(3 J3 PNRe 5$UB(  8 E$ %e`eC 5$wd'E,+.5@++5E 8 &'I5= $0$$ 36Ew( 5 7 < ̋? ( ? E,'+7 w5i ?  pebe.e@ @! c"   f b``U&? f& ʋ5&ŀaz  7 & ~鈷6 fW@CUV&F f 6f W@f x6C5&%@&^6weC ˕ ˤ &툀鈷e2wZWfeͥ( 77777 ww  `Ceh EfE%  ҋҋG #ʵ@ e`a%A 7  w& ee^ & g E e%  78?KMON-F-Overlay read error 5A K ( +U@|$鈇  2 Ez %z ͋ ( > d  5$f J,( ""@"5@  e  %@Ae Fuu  ( T l \E $ \ .4  ? 6cef `%Ԃ  f W +,e( (wv>&@7$e &  I hww% ? & f F,e $&EΔNIQ%Ό%@ 2EQU E`H#Heebb,e( 0e>& & e$&w e !"t ~'((U  EE ` ف E6%^CC^!C%גPע! " C!$ @@   #   W: ee. `? j! C! פ ר- 3 _7 ^ & rp . J 4U - # 3c     H7G  u0&5B &E f&aWuWuH <7 > ene.* $  &@ E &E 7 g7z~ ? Hf  v - D @&c%Lbtt&b%0c0jW" ere.# 5o%% EP4H@ >` Χ `K5$eztX ."  ҫI$QIe:U@WE@aٌDaW w w eD w4 el ! s @r  wJ|D\f`|dP|D.8eAbw   Da(D`D` Rvpbdͥ,͋jg,E  7 7| lwr  wa PO e @e`  e ͇  @  7w r`wg awnͥ  ͥ+ͥ,ͥ 7,7xwre7_77 ͥ/I7PNO<e p SW B#B ԁ`C  emDHa ҋ 3EfE%  ҋʵ@AwmE 77P|   hœ  ¥  aefbL= K3 aezН/P h 0˵@-•:) N N Zͥ-,B 4 H•.˵  B  ֆ 2ae  0 Oͥ: ͥ- ]eЕ[ P ͥ. ww7?Mͥ:  f 7  77e eRe ͥ:  77e~ 2eef ,e  f&e j ppU%pppͥ:!fefe * nee( ~Е Pee  `ͥ[R  ͥ- g z R ͥ]R Еrnv e aew*W  Е:ͥ: ( ͥ.* wJ  @ʕ*  #ͥ.P J  v%* @.*   @P  .ͥ*ͥ%  ee@a ȕa P  w7 D  n7 E  2wwR e ы wae  8 $ w=u  V7fe e LMG,7 0w:, F f ÝeL aedw/   @RESORCPIPDIRDUPLINKBASICFORTRAMACRODUMPLIBRSRCCOMFILEXF4PDICOMPFOCALAPL     m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[  LB:V 6 F > < z \z p \ Z D L DK:DK:SY:.SYS.LST.BOTkQ\DK:DXMNSJ.SYSRF1:*.*YW:TT:PL:KDTDOFrom? To ? File? Files? Device? Device or file? File 1? File 2? Library? Files ? File ? Physical device name? Logical device name? AW[ 0W:&&&f  * ,e 6@2`,|02." *2*/,$,"h*.E.*... .4,,,, &&2RCODE DIDE T GLI ERECO  RESLC BSA RE SS GDE FO  AB DIFOSSTIN   DID IN RE LI:1FR SYS.JSNMXD SPIP R vPUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUPvFP;WPvFP;WP;WxBHz;WP;WLv xvwwwwz `        x g l~[WWQUY QOGAB I Pb M P SCTYUI STUN  w E+  Pw  ~  u% LF FB BENc CC!SC"S P#A$ODc%Dc&Jc'K(MUST )K*F+V,Q-R.G w ]  wͥ:[ +&B ` ¥]wPwn RE P IA B I P P   S  N SSBD ODTIAL B  B FF P T OS   OSAL ODS BEFB  F    D BE @ vAebC X DEBN!!  N! 6 N! *ͥ/͜AN ww.wͥ) ͥ, ͥ ͥ+͋f 5  (e    W ͋ w 6 0                G  G  G  G  G  G  G  G  G  ? WwWwW6d B ab 2.` "6w? ? F@w H !7w #  eNSS t_cw U 7   7 7 w w Dw?  w -7 \7 Zw <& 7 ԛw @%.@% @#eee%7` 7 x   e# 'B wEK]w  ۇf: N LW v1vELW! 5 `1   P$( & w    * . \  T5!f w Zd $PPw Nw Dw 2 w 2  rw ~EW2 Z 7 H3zN j> Q f *8,Q7 2#@SD Og,e  ,0*5 # #e`#w ڛ%    `C KSdKU b$`Cg, _# V ? B 7 T 63 f7 Kaes S w ^ 5Sw 6I3W2Wl Ew C $ A!EE P &EΒE? *# ?w &D%$7 vЕȕ e 0HJE & &:&& >0ee? 0  Uwhw &fmw   E ŧŭ^ f eg BBE/aw "Ba5lafw nCRC!  BC 5aW &*ڡ Q!E(A W   x6`Be 7pEe5d3 w w @w w B xPPPH (a(fECew EN  d FEUw 5@!eBB ` ? 0wElme& ,w  Q$ 7 &w 8w  Be$B  wdQ$mw  Z  &  7v@Ŋ5$ߋlz7 $B$* @5@+ עGEJ5$E ӋU@UӋˋ 5 A Q E %=%< D  "% % 5ŀ׭9Q *"CИBw( @'  7 e  O  $Z  N&r77  : `97Device fu||| ",ث2Rgd)Ÿgv:  N;N;Px;97J6 8d=(@ @Nx ̋R   ҁӤӤ5 w8;BF@STARTS &  %C e   ̋R  7 ?BOOT-F-I/O error vߋtȋwhj Z"xE  e  `@ `D fHT fHT HT `HTHT  HT HT HTpHT% HL xHT xHT5 &}@HT__2z >n e  @B5 %z% %Z7 }%Yz %d %\7 ~m5lem \7 ?BOOT-F-No swap file on volume 7` ?BOOT-F-No monitor file on volume  P7" ?BOOT-F-Insufficient memory 7 ?BOOT-F-Swap file is too small  ee |e . fDe\X<;p;;;B:9`Cj==?@,@PB 5CT, " %""@"h$#$,*++$(r+ `a `7`|``& TG C `w  ? ? ",3 |EP$El(7 )7  3 3 3 3 :3K5B(3 J3 PNRe 5$UB(  8 E$ %e`eC 5$wd'E,+.5@++5E 8 &'I5= $0$$ 36Ew( 5 7 < ̋? ( ? E,'+7 w5i ?  pebe.e@ @! c"   f b``U&? f& ʋ5&ŀaz  7 & ~鈷6 fW@CUV&F f 6f W@f x6C5&%@&^6weC ˕ ˤ &툀鈷e2wZWfeͥ( 77777 w  `Ceh EfE%  ҋҋG #ʵ@ e`a%A 7  w& ee^ & g<  E e%  78?KMON-F-Overlay read error 5A K ( +U@|$鈇  2 Ez %z ͋ ( > d  5$f J,( ""@"5@  e  %@Ae Fuu  ( T l \E $ \ .4  ?  cef `%Ԃ  f W +,e( (wv>&@7$e &  I hww% ? & f F,e $&EΔNIQ%Ό%@ 2EQU E`H#Heebb,e( 0e>& & e$&w e !"t ~'((U  EE ` ف E6%^CC^!C%גע! " C!$ @@   #   W: ee. `? j! C! פ ר- 3@ _7 ^ & rp . J 4U $- # 3c     H7G  0&5B &E faWWH <7 > ene.* $  &@ E &E 7 g7z~ ? Hf  v - D @&c%Lbtt&b%0c0jW" ere.# 5o%% EP4H@ >` X K5$etX ."  \ I$QIeU@W@aDaWw w eD w4 el ! s @r  wJ|D\f`|dP|D.8eAbw   Da(D`D` Rvpbdͥ,͋jg,E  7 7| lwr  wa PO e @e`  e ͇  @  7w r`wawnͥ  ͥ+ͥ,ͥ 7,7xwre7_77 ͥ/I7PNO<e p SW B#B ԁ`C  emDHa ҋ 3EfE%  ҋʵ@AwmE 77P|   hœ  ¥  aefbL= K3 aezН/P h 0˵@-•:) N N Zͥ-,B 4 H•.˵  B  ֆ 2ae  0 Oͥ: ͥ- ]eЕ[ P ͥ. ww7?Mͥ:  f 7  77e eRe ͥ:  77e~ 2eef ,e  f&e j ppU%pppͥ:!fefe * nee( ~Е Pee  `ͥ[R  ͥ- g z R ͥ]R Еrnv e aew*W Е:ͥ: ( ͥ.* wJ  @ʕ*  #ͥ.P J  v%* @.*   @P  .ͥ*ͥ%  ee@a ȕa P  w7  n7 E  2wwR e ы wae  8 $ w=u  V7fe e LMG,7 0w:, F f ÝeL aedw/   @RESORCPIPDIRDUPLINKBASICFORTRAMACRODUMPLIBRSRCCOMFILEXF4PDICOMPFOCALAPL     m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[m[ LB:V 6 F > < z \z p \ Z D L DK:DK:SY:.SYS.LST.BOTkQ\:TT:PL:KDTDOFrom? To ? File? Files? Device? Device or file? File 1? File 2? Library? Files ? File ? Physical device name? Logical device name? AW[ 0W:&&&f  * ,e 6@2`,|02." *2*/,$,"h*.E.*... .4,,,, &&2RCODE DIDE T GLI ERECO  RESLC BSA RE SS GDE FO  AB DIFOSSTIN   DID IN RE LI UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUwwwz `        x g l~[WWQUY QOGAB I Pb M P SCTYUI STUN  w E+  Pw  ~  u% LF FB BENc CC!SC"S P#A$ODc%Dc&Jc'K(MUST )K*F+V,Q-R.G w ]  wͥ:[ +&B ` ¥]wPwn RE P IA B I P P   S  N SSBD ODTIAL B  B FF P T OS   OSAL ODS BEFB  F    D BE @ vAebC X DEBN!!  N! 6 N! *ͥ/͜AN ww.wͥ) ͥ, ͥ ͥ+͋f 5  (e    W ͋ w 6 0 MfeBfeX, e_ l_? `BaJanD\Z^X`bFJ VT< "V  \0p^Xr2\ $2" eJe" aa C @ @E($U@ ?MON-F-Illegal call to USRNo deviceDirectory I/O errorBad FetchOverlay errorDirectory overflowIllegal addressIllegal channelIllegal EMTTrap to 4Trap to 10FP trapMemory errorStack overflowSystem write error@T^r|0$D DeC B`  ew> w2 X K5$e "  \ I$QIeU@ @FD$CeK    baba& Nww D> ? WWW B ab 2.` "6w? ? F@w H !7w #  eNSS t_ cw U 7   7 7 w w Dw?  w -7 \7 Zw <& 7 ^ w @%.@% @#eee%7` 7 x   e# ' wEK]w  ۇf: N LW 1vELW! 5 `1   P$ & w    . \  T5!f w Zd $PPw Nw Dw 2 w 2  rw EW2 Z 7 H3zN > Q f *8,QB7 2#@SD Og,e  ,0*5 # #e`#w d %   6  `C KSdKU b$`Cg, _#" V ? B 7 T 63 f7 Kaes S w ^ 5Sw 6I3W2Wl Ew C $ A!EE P &EΒE? *# ?w D%7 Еȕ e 0HJE & &:&& >0ee?   U<whw &fmw   E ŧ8ŭ^ f eg: BBE/aw "Ba5lafw nCRC!  BC 5aW &*d Q!E(A W   x`Be 7pEe5d3 w w @w w B xPPPH (a(fECew EN  d FEUw 5@!eBB ` ? 0wElme& ,w  Q$ 7 &w 8w  Be$B  wdQ$mw    &  7v@Ŋ5$ߋz7 $B$* @5@+> עGEJ5$E ӋU@UӋˋ 5 A Q E %=%< D  "% % 5ŀ׭9Q *"CИBw( @'  7 e  O  $  N&r77  : `97Device full D ,   &` 7File not found W,W=͋X7xIllegal commandͥ/N : U@ Rͥ.   6 7Illegal device* 7?CSI-F-鈀 U@dUf >w & tć W[ W]  2W:  eJW.  $  $  7%%**09AZaz&   Nl b e &N W-e E  C0Π a `  6w(Dprtv D<?30(  V 8$98zz 8r `THSpqM    EEw  D eEE e NQ@N  7Dť+;  fe  amagHb|vNNjNNNNNNN`NNNvNN NXU D   &7 <   uD*eaU6  + 6@;$w_ *%e@; *^%;w>5@.;^ 77 ?MON-F-Power fail halt ? ac,6 "8@H(F2&   5 D d@e PH7  0F-g,)7&5$ ͋%R? q"R@  , ͊  UU@0 w( "U$7 <6 7  7 57 E$(7< 7 ĥ  *U$5$BwP?V& zE [:>5@$azE e  `OFv         Hɥ W#Q u#R > 5$  4   ,?  w 5$  Ub3 UHr 7 h "(  .  t7 |? @    D L  P bb? H 5 @f`Ce)U%Me u#eR 7 `?`?`????? D \$bEX?% * " @fZ?7  A &$ v4 u# W%*L E  ?H#  4% 4  .? $ ̗/ ? % &LE w w Ea5' +7 5%5 E Eael B55 M  E E 7  s!5s  ENEae E % Άe`B`N ˋ  w  5E  $ &77  wzB 7p?MON-F-System read failure halt   <  $7 <7   ( " JĔ Ĕ &f&I e`  &e@^w83 vD w7 JbC&^C& t l  &7& V TT L4Lf  &  &  V%&f&  U$E$ L-7 zehF7 7 V7 e<:9J&\ %J $ j D@'( EM( U% (r w5:wVB J  e  L$  HwD >E % * *  wߋ$ɀf&CCe S x˵)ӵU$ aC}  `  7>wv7& &U@wg @@x 6, N 5z 7  b5@ 7RB  :% eC % C ``` e̋̋ @w,U? <@4e,}`8 p$ 7 55X 7  #̋ 7̋4 @VEw:e,͋(W    Ce<%R V `H͋*p5E   e  eH w| V P p””#e,e W5 2t2$e8 ͋+W  $ & Ĕ!7S͋3 eA ĒB `A `, p6 7 Z<@&7 L<  ":  |% ee/ e0w`  A @  -Jan-Feb-Mar-Apr-May-Jun-Jul-Aug-Sep-Oct-Nov-Dec-:<:<.< eH(,e(Ċ͋#! C͋ͥ ͥ,u W- !k$,1!"c  e V f/ND`? # e(e & / & &$ &   eVf  f % w|͋\  ,ep*Eg,e e E  & &+3O& ㈅ e W!·  ? ~ r X`? f Fߋ*ww~ }w  w }w  e>  7 I G v6&(7n a e,ew  2 bw Zߋ*ww ? \W,͋w4  "JeZ H f, " W-;7 4D)  !', Q$W 8',$)  a E 6Q$E , `6`? W,͋ww: H ,e:E: e" Ad  @b <J$H7 : n"Je" zzW0 ? " & &Ne@@ONU T : b$C;$"A 2 $ 7 .=E@ H@!"W. B` 7 ,-  & &wVww,E]Yzd m`" Gwd \d4 E(P$ e鈇 ae ,e"     D e& w W  %W  }' '* 4 X:#"""" wYwww wF }w   " V" SP   F &m eg z3 ?  & &+e_,00#`0. 0 ? z͋/W,ww  : Q hB[e e eeP    }w  "zL" I" F"  l  %z #0 `,,,#  * e .2  ! 1 1 Z? j͋W,w &" e#e"  ͋WE0 E ͋ ͥ-H ͋DA e B @ @ ց   @eEW=͋P,e( <  j W,w$|W ͋ @, " eEO eN   5 70 EBc O e @ e e @aew?KMON-F-?KMON-W-Line too longIllegal continuationAmbiguous commandIllegal commandFile not foundNot enough memorySystem I/O errorNo fileSave file I/O errorIllegal deviceBad fetchIllegal device for command fileIllegal option for programIllegal optionConflicting optionsAmbiguous optionIllegal NO on optionCommand string too complicatedIllegal value on optionError in file specToo many filesCommand file nesting too deepCommand file not at end of lineNo dateIllegal dateIllegal timeNo clockParametersMust 'R BATCH', type '/U'No roomAlready installed/assignedNo handler file on SY:Handler file I/O errorConflicting SYSGEN optionsDevice loaded or not removableAddressLogical name not foundNo roomCommand file I/O errorCommand file not foundw w n    Hw  en@׭v} mwk  [` :e ez}]vUHUHͥ: 2H.TECeBP ͥ: ' ''PPw PYHXZHK@IMZeDPP PJ`@ePPPPP Nz2dv@^UA!!@:ER#SY:HELP.TEC#"F@^A#?HELP-F-File not found HELP.TEC #HKEX'YHXZHKGAMZ $ Ow  &w V w   fw    W  x " " !eC   we "    t  ed  6 0e,͋E EXOAL  www ` @ : 3 g *RGWWQYCTNw  wL u   @wn  evf D!%  R`W!+&&   e f :  & f& ww7 m eB`  DZT͋D ,̕/w 6 wV7z7x A Def < e_!,ee   e%  @eae8 b"&e2  e% (Loaded) (Resident) , =   P7 z   <7    W"zW"  B 2e   7 eweP % b %e ee e  e鈁(@     w7 >6t tode-z @& 8wb`"  \* C! ׭l! fwW@7  5 wfߋ* <w ʋU fR? 4``? > N!%7 E!wW7 Հ 5 fE!^7 75 Q w *w60 <5"  e H̟Ԋ  ?? U ,Aw 2,e5 e %_͋%^jw  e$5 H(P͋&ͥ/@:f  W.  T%L%)& ef F6? e )o t  jwjD" D : !jB`vE<>11& "`e ?p4`b,^ 4e? ` &  E% w!Fͥ   7 2å åv qx17gp7 R ) Zå 7 ^å  v-P>  6 0 \7 6WE n D7 >HՐ נ  -    6 &  5 - w!J& 0֥  5 7r -`n f!%%%%% 7.  ^7 (  7 77 pf,EA    w5@E P??????????????????P ,5j 47a7a7a7a&7a7a7a7a7a7amB,&e eT` ee8wj1 w`1B*e@eA4  4 &6 ,e^d  d @  >J&zQQAA wL^YDIR V03.01 W<Bxkf ABCDEFGHIJKLMNOPQRSTUVWXYZ$%*0123456789Error reading directoryWrite errorIllegal directoryIllegal commandIllegal optionIllegal deviceOuptut file fullDevice not activeInsufficient memory@z@ ?DIR-l-     $ ( , 0 4 8 < @ D H L $r&(*0r8p:HFDABCDEFGJKLMNOPQRSVVd| rT& " \    L 4  & Ѡe w F f ҕ >   8  Octal& D/& 0 B 0  rBʥҋB     8 $ @& e % % @ 7v-pw F  rj^|P &^PZLVH   7]w F v  ȥ%Х*  @@e%  " A@|w &F#%5å Fåå :å2 &å m| @ w@ Ƈwe % % w 7   7 7  D~ Ov t , -t7ft]@ @@H   PBP |w F67 4|\0  w n Vw  R Dw f F%VOw X FӥD%%B7 + Volume ID: [S/&vr  Owner : [S/&  v  %HDvF|r0 % 7 , Volume ID: [S/& J6r  Owner : [S/& Vd    515 X W dwm|n]zM h ZG p A @ >wm, PEU0]. (- 7  [D6 Files in segment [D//&&"   B  7 wm  `  e%N  * ([D6 Available segments, [D in use//&R,  z  B z 6  6 $7 7 $  [D Files, [** Blocks/&&  ]  [** Free blocks/&&X  B   ҕ ҕ  P %   e% p  @@ D     %7$%c%He7  $ ww  . w  @ed  5 1 pd F ee 4   Xe  h  7 B Z , Pw P  Cå*DĠ Ġå*å% f  @  PDD     wR w GOx erwze t|np0 wwX5Rw:w@wv " ww%  57 em w xrredCȥ5 , ѕ ȥ. ȥ.Ћȥ. e1 N x z w Tw N 5t5 %%HD|w &w %EOf5 e61 w   re,1 e*  H5 v C"Cv  ` `u %|\rrr @5(@|0 00 d @ 7 w %d ѕ ɕ *5 5   zw w   e ve j e \H `u -~j r @?.%6 . H7w7 e  >m  e ~ mv mj  7 V@e ?- --1, 1,1,1, 7 A1,1, 4 E  w 4D -L2-D.!-<$"-4 "1,1,1,҇1,1,1,1,1,1, w &d r5-f   u 7 |pe j-fb Dw F7R7F*PPPPA -R: A P.&fP 5< UNUSED >&,  .[S& dV   * [** &f|v~ 5 [N9: & @ FJ 8 [**&R" f - ҕ ҕ 7   [N*: &f& "7  B  + W r# r | rp0 w7   &f5%D0[D1-&f  % &f@   -[D&& D# %H [N9: &0  -BAD- &J %r| r0  ߋ*w 0Fw *F rP  \Еrr7d z R- A eP wŀ @+Ջw\fEeHw. 7E 7 A   w   H: :  eB` &  ѕ  ѕ w C@ |:(@ n:S:d t5g h5k \5f0f e @`0& |\p&f  @/#[@DgOUwSwNw2* ҕ ҕ W*ы > ʕ@ Rʕ JrelzW*ы&Cנ0נ9 ы0@09዇0 e `W*ы ӕ0f  fe0㋓ w@ R  wC0@070 ` $W:ы@ wtҕ fb0  2e0cwB"> w&fe>B @& fE@@ B @ @@D_ B_ $_ _  B_  _  _  _  _ B_ B,e`eTeN( "2. & t& ` ? ɕe & tp& ˇ/ 5&ɋw*B `ыB ɋɋB  ew Qw&E B?7(w0-!< #HЋЋЋe 7ZAIN @ 7  w @` R f ~w 7   w ߥ*w w em>fm."m"7 Be B! f  X   E>w!w@w8  w b %   w w@`7  w w  %  b aa&  8 F@mB7 `T@ M-w\ w ,e  7`  7`D   T  w  @e E7w    w w   !7e7b mZ waV 7T w :J fw" 7.w Bwwew BC e wW"4@  @"? ~7 tw 7 l  m  `&`  N z  8 2 hw 8w Vw 8wD ( @m67 VN .*17 wp w 8e N   w l eee # e7lcE `7!w eA# #p #e6 v N&fH @`" B ,%w& 7 .  &B o D e 7 , ͋w w>   : B w7 ŝ ԋn l wj Dh  zZ R P P C hf`B   : 7 0   W ͋wn  d WWw 7 v  I    ee   fw %w f > - 6 . w w0  w%%VOww *(    w   wf Dw P Е= n AeB`w 86w . Е=eAeB`w :t  4  BP   @: Ie 8 ( . $ F   (  (  ,  &  7 ؁ 5 www@ ɋwe  @  @ A  @ A @ A @ A    e0U %  Օ0N UUU  m r w: 2r 7,* "| w|  fl `X fT L B e7: p #w8wFw vw =L P$  6 ׭!7J w7.737 ( '7 &  & w~ V!( e@W [eW $e c    "7 x >7,5/Ep 5wDw   Fz5mf A N  %  ѥ YnMw>w? + '$t X  00ȕ @ \ pPw *8%@ KrGo%@%@<7 9 65; (4$ #  %@w.~7 x $  `X7 t7 L<X7 2 ~  D ,p t  5*p   wh0 wj wVewPewJewDew>&f&f~  f NPxȋ ȝp0 &De"$& &e\7 e" #" #" , v?<9630-*'+$:![j|  x^鈀+wf@鈅 are you sure?/Init/Copy/Squeeze/Vol id changeForeground job loaded,continue?Insert system disc,Are you ready? Owner name Vol id? DUP V03.04A ?DUP-F-?DUP-W-RebootError writing directoryBad directory blockIllegal commandInsufficient memoryError reading directoryError in system areaDirectory not zeroedDevice fullRead errorWrite errorDirectory fullCannot write SY: while FG loadedIllegal deviceDevice not activeIllegal directoryIllegal contiguous fileToo many bad blocksIllegal optionCannot /s sy: if indirect file openUnmarked bad blockFile not foundInput truncated at six charactersInput truncated at ten charactersInput truncated at twelve charactersDevice in useNo RT-11 vol idFile existsOutput device not specified; DK: is defaultNo swap file on boot volume, ZNRBVKHFSICTUOYLXWV( ~vn %: X!}<}; z@: L 52ww &w 6?K ѭы @gw 7 e7Hv% p < w:\@ D 6 e e| j$ ?  "w ͋w>w>ew4Dw`m7  A w   " w 8 ` xrRjh" ww^ w@ w  " wd   R wD ew  RT11̕AeeDECRT11A #  ȭew Rw 7 ^ X׭8w.wrwVw "h wV  h w 2w w w  w  $e!ԕD%B1 3)w w |% 7 w Z t~w ~'w vw <w 6w 0Xw X4w w w w w w7z%l@ 8w @A +U@$U$DNA 8w 8ADe6N w 1E$E@$e R& & zȋ  5w S 2VOL1RT11A HDR1ZEROED.ZZZ RT11A 00010000000100 00000 00000 000000DECRT11AEOF1DRT11A ߋtv ?BOOT-F-No boot on volume Hw jw HN mD |7!?N B@e->5a  ~?a* wpw * w bw tw LD d:w02m07 vw ! * % -?a 6 ?0a pw?ahmb?^  %   b > wmt($` - \r` vV & w*D $ F w    dww ~-Jf  @ 2   wB Ȃ     n w w` 7w ^-w  ^" FD *[B&B\T7 N   Օ UU  % B՝՝՝%Օ.e  @ 0 7 BwXHardSoftBad Blocks Type Filename Rel Blk ?DUP-I-No bad blocks found 2 |w yw |~   &t   e w Hw Nw = %CR%T1fw 67ze7p w p=e #mV#Y7-(wdw B= & xRe N:ew $0@ $  !@w T:w L6@w hw Z:@ P  ` sw 68  ? ~ 户n h w 6le e ^wwba%>w w t6$\`1,w4  De 7B5-m&m% 8`m @ *`@ `  nC``B7r%vw e T% 8@ "@4 @w w z6tw $ fnw\w Lw 9w L_ , 6-2((  & e7p -w Bx7 v7 e 0 4  %nw$ex r N@n7 d7 ^\ 4P& Ε,e  ĥ%,_hjXX w  >Yzdz-@,w"w" AB CD@GIKMN(O PQRp@STUHWXYM'F+U oCP2w_ZPIP V06.01 deleted:copied/deleted:renamed:copied: Files to ? ?PIP-F-Check sum error Device full Device in use Error reading directoryLibrary file not copied Too many output filesFile not found Illegal output file File sequence number not foundIllegal deviceIllegal commandIllegal delete Illegal directoryIllegal option combinationIllegal optionIllegal use of wildcards Illegal rename Illegal option valueInput error Insufficient memoryNo .SYS actionOutput file found, no operation performed Output error Output file full RebootSystem errorUse DIRL $(2FPZdxW  <6     w h 7rZ @& e W x W @   [& , 7 x0    -& U%U%@M  CD5DSELw Pw Jw Dx @ J5 8  eW Z $5 !    -{∇&  2w \ +  z f   @    eW!]w F w @ Z  F f&m &׭ ]n]je x ]w  ˇ7&] ]eX]^e-w  eZ  e0??  e   G`5C5;ff \ ( ee    w- Uw b U  w- bUe emH  &Z  -Z 1 .  ]"    ^xw w ,eW!we 5 55 @ | -~Z BW- RRRReml   hg  ; e 6 xw> <& f& 2DT  ' r     FW-   x6  wwe Re       7, &f   Z F 7 7 0 4   @ ׭$ w r f pVw R 2e - | ^ =@ : &f   Vf  7 N  w w jw   ,]  *  4 0 @ `$ ^@&  5  ree RRRR  : w47 P 7 " J pw J   | z V e)@ ('f !f P%P%P% 7 @ ` /~@ .? hfe  ee w  eee f   jf<W4 T wNW#% > f v ww  8 ee | 7 47 *7 *    LZ  4 w   v]| v $ l ee f p p *W  B w׭    .   ewf    "  鈇PPPPEL]RE `7` ?w p w e 07 7'fZ n  w#@SS%#@SZ &f & R V@!   \B7 ^0 : 0  $j  ׭ w7 ׭ ׭w 2 ww (  * w  +w  w  w w "w $  @ w $7 d p& L Pw ewe t7 nw  77  T!0 & e $g,fE @  r`be\bj R0 &  7` ߋ* p&w w ww  v @`7x@E  w ` F. @`7H <W,*ъ  wwm @7` Z  (w w   ww  'V! ׭8 f L   w Bw <w 6w "5Z R׭  l  ȝz0 `ߋ*w  w  "~] w  ( 7 ( 5 wb,z, *& x"", 0 ,77 z jw 07 ^@ X   @ eP efe Np0 W- @ W w X2w R4׭ 5 p0 wf& A ww  f&  ·w  w    W#EOW#HDj 5ZJ 7 F5  D Xw w H-@ w 8w *-"w  X (W#EOw 5 pߋ*  -(w lwtDee fe rp0 f&,e$e0 p0 ͋   Nw .چew e w|&  PWW*  d׭ U%@.-N  :e e    c ` ׭$ w Nf&&  PW#w 2ߋ* wF5 p0 @ 6 wI&  D ! !e  ! &ҕ:  ҕ ҕ @f( @ %ee0f6e.    W.W: B ѕ ɕ鈇'& %Y&f   Cנ/D נ/ נ.!  f  f & \ע.פ/ H    ע  &׬    e  jL W#G "W#> z;b r7f&  r-T0 "  N   鈂 n( z&0  *w P+舀w < 6&0 ߋ*F  5 W l+͋+*@E@E f #5 j뗢.ʕ%/ҕ*ҋ  鈅 bw .enabl lc .title IBUP - GPIB11-Series Interface Utility Routine .nlist bex, ttm, cnd ; Rev. D.10 ; This software is provided solely for use with ; the National Instruments GPIB11-series interfaces. ; Copyright 1980 National Instruments ; Jeffrey Kodosky ; April 1980 ; Edit 09/26/81 ; REV C: 01/01/82 ; REV D: 01/01/83 ; V1: 02/22/83 IBUP POLL -1 now passes a 0 to GPIB TESTSRQ ; V2: 09/04/85 BASIC IBUP DEFINE errors corrected ; Edit the following assignments to reflect the desired software environment. BASIC= 0 ; 0 for FORTRAN/MACRO interface, 1 for BASIC DVR= 1 ; 1 if driver is an RT handler, 2 if RSX handler, 0 otherwise. ; Command Messages DCL= 024 GET= 010 GTL= 001 LLO= 021 PPC= 005 PPD= 0160 PPE0= 0140 PPU= 025 SDC= 004 SPD= 031 SPE= 030 TCT= 011 UNL= 077 UNT= 0137 ; Error Codes OK= 1 ENOTSAC= -4 ENOFUN= -20. ENODEV= -21. ENOLAD= -22. ENOTAD= -23. r0=%0 r1=%1 r2=%2 r3=%3 r4=%4 r5=%5 sp=%6 pc=%7 .macro device ta la sa rd eod wt .narg na .if ne,na .if ne,ta .iif lt,ta-0100, .error illegal GPIB Talk address .iif ge,ta-0137, .error illegal GPIB Talk address .endc .byte ta .if ne,la .iif lt,la-040, .error illegal GPIB Listen address .iif ge,la-077, .error illegal GPIB Listen address .endc .byte la .if ne,sa .iif lt,sa-0140, .error illegal GPIB Secondary address .iif ge,sa-0177, .error illegal GPIB Secondary address .endc .byte sa .byte rd, eod, wt .iff .byte 0,0,0,0,0,0 .endc .endm device .macro callf subr a0p a1p a2p a3p a4p a5p a6p a7p na=0 jsr r5,rsav .irp ap, .if nb,ap mov ap,-(sp) na= na+1 .endc .endr mov #na,-(sp) mov sp,r5 jsr pc,subr .if eq,na tst (sp)+ .iff .iif eq,na-1, cmp (sp)+,(sp)+ .iif ne,na-1, add #*2,sp .endc jsr r5,rres .endm callf .macro mul6 x asl x mov x,-(sp) asl x add (sp)+,x .endm mul6 .macro Exclude .iif eq,DVR-2, jsr pc,excl .endm Exclude .macro Unexclude .iif eq,DVR-2, jsr pc,unexcl .endm Unexclude .macro Sx instr src dst .if nb,dst instr ib11+devtbl+src,dst .iff instr ib11+devtbl+src .endc .endm Sx .macro cjmp t f .macro j't' a ?b b'f' b jmp a b: .endm j't' .macro j'f' a ?b b't' b jmp a b: .endm j'f' .endm cjmp .irp j,<,> cjmp j .endr ib11: .word 0, NDV-1 ; Device table ; One line per device, the GPIB interface must be the 0-th entry. ; Format is: ; device Talk_adr Listen_adr Secondary_adr Read_mode Eod_char Write_mode device 'U, '5, 0, 0, 0, 0 ; GPIB interface: must be entry 0. device ; empty slot device ; empty slot device ; empty slot device ; empty slot device ; empty slot device ; empty slot device ; empty slot device ; empty slot NDV= <.-ib11-4>/6 open=0 ;struct ib11 { ndev=2 ; int open, ndev; devtbl=4 ; struct device { tad=0 ; char tad, lad, sad; /* GPIB addresses */ lad=1 sad=2 rmd=3 ; char rmd, eod, wmd; /* read write modes */ eod=4 ; } devtbl[ndev+1]; wmd=5 ; } ib11; NFNS= 11. begin= . .globl ibup, gpib ibup: .if ne,BASIC .if eq,DVR-2 jsr pc,ibup0 mov @2(r5),r1 ; if called with extra arg then put return value in cmp r1,#NFNS bcc 1$ cmpb @r5,fcntbl(r1) ble 1$ movb @r5,r1 beq 1$ asl r1 add r5,r1 mov r0,@(r1)+ 1$: rts pc fcntbl: .byte 4,4,2,2,2,2,2,4,2,7,1 .even .iff .globl $arger,$bomb,$find,$alc,$store,$dealc,$msg cmpb 1(r5),#202 jne ibup0 mov @-2(r5),r4 bic #200,r4 cmp r4,#1023 bne argerr mov @2(r5),r0 cmp r0,#NFNS jcc b9$ cmpb @r5,bcntbl(r0) bne argerr movb fcntbl(r0),fblk mov 2(r5),fblk+2 mov -2(r5),r4 cmpb fblk,#1 ble 1$ mov 2(r4),r3 bic #200,r3 cmp r3,#1023 bne argerr mov 4(r5),fblk+4 1$: asl r0 jmp @pretbl(r0) b.write:mov 4(r4),r4 bit #1,r4 bne argerr mov (r4)+,r1 mov @r4,r0 bic #200,r1 cmp r1,#1100 bne argerr mov #100,r1 jsr pc,$find mov r0,fblk+6 mov #fblk+14.,fblk+8. mov r1,fblk+14. br b.call b.read: cmp (r4)+,(r4)+ mov (r4)+,r3 bit #1,r3 bne argerr cmp (r3)+,#1100 bne argerr mov @r3,strref mov #tmpstr,fblk+6 mov #fblk+8.,r3 mov r5,r2 add #8.,r2 mov #1,r0 br b.t2 argerr: jmp $arger b.configure:mov #2,r0 br b.t1 b.define:mov #6,r0 b.t1: mov #fblk+6,r3 mov r5,r2 add #6,r2 cmp (r4)+,(r4)+ b.t2: mov (r4)+,r1 bic #200,r1 cmp r1,#1023 bne argerr mov (r2)+,(r3)+ dec r0 bgt b.t2 br b.call b.poll: cmp 4(r4),#1023 bne argerr ;br b.call b.call: mov r5,-(sp) mov #fblk,r5 jsr pc,ibup0 mov (sp)+,r5 cmp r0,#ENOFUN ble b10$ mov @2(r5),r1 asl r1 jmp @postbl(r1) b.rd: tst r0 bpl 1$ clr r0 1$: mov #100,r1 jsr pc,$alc bcs b11$ mov #tmpstr,r3 2$: dec r1 bmi 3$ movb (r3)+,(r0)+ br 2$ 3$: mov sp,r0 mov strref,r1 jsr pc,$store jsr pc,$dealc rts pc b.pp: mov r0,@6(r5) b.rtn: rts pc b9$: mov #ENOFUN,r0 b10$: com r0 add #ENOFUN+1,r0 b11$: asl r0 mov emsg(r0),r1 jsr pc,$bomb ;no return emsg: bemsg1,emsg2,emsg3,emsg4,emsg5 bemsg1: .asciz /alc--no space/ emsg2: .asciz /bad ibup fctn code/ emsg3: .asciz /no device/ emsg4: .asciz /device not L/ emsg5: .asciz /device not T/ .even .csect gpib tmpstr: .blkb 256. strref: 0 fblk: .blkw 9. .csect bcntbl: .byte 3,4,2,2,2,2,3,4,2,010,1 fcntbl: .byte 4,4,2,2,2,2,2,4,2,7,1 pretbl: b.write, b.read, b.call, b.call, b.call, b.call, b.poll, b.configure b.call, b.define, b.call postbl: b.rtn, b.rd, b.rtn, b.rtn, b.rtn, b.rtn, b.pp, b.rtn, b.rtn, b.rtn, b.rtn .endc ibup0: .endc ;ibup(f,d,a2,a3,a4) tst ib11 ; if(ib11.open==0 && (x=init())<0) return x; bne 1$ jsr pc,init bcs 10$ 1$: mov @2(r5),r0 ; if(f<0 || f>=NFNS) return ENOFUN; cmp r0,#NFNS bhis 9$ cmpb @r5,#1 ; if(nargs()>1 && (d>ib11.ndev || d=0) tst r0 bmi 1$ callf gpib #Remotg ; x= gpib(Remotg); tst r0 ; if(x<0 && x!=ENOTSAC) return x; bpl 2$ 1$: cmp r0,#ENOTSAC beq 2$ sec rts pc 2$: inc ib11 ; ib11.open++; clr r0 ; return OK; rts pc write: ;write(d,bp,n) char bp[n]; mov #cbf,r0 ; s= &cbf[0]; movb #UNL,(r0)+ ; *s++= UNL; movb #UNT,(r0)+ ; *s++= UNT; Sx movb tad,(r0)+ ; *s++= ib11.devtbl[0].tad; Sx movb sad,@r0 ; if(*s= ib11.devtbl[0].sad) s++; beq 1$ inc r0 1$: jsr pc,ltns ; if((s= ltns(s,d))<0) return s; bcs 10$ Exclude ; exclude(); jsr pc,cmd ; if((x=cmd(s))<0 || tst r0 bmi 2$ Sx movb wmd(r1),mode ; (x= ans= gpib(Writeg,bp,n,ib11.devtbl[d].wmd))<0 callf gpib #Writeg 6(r5) 10(r5) #mode mov r0,r1 ; || (x=gtsun())<0) ans= x; bmi 2$ jsr pc,gtsun tst r0 bmi 2$ mov r1,r0 2$: Unexclude ; unexclude(); 10$: rts pc ; return ans; read: ;read(d,bp,n) char bp[n]; mov #cbf,r0 ; s= &cbf[0]; movb #UNL,(r0)+ ; *s++= UNL; movb #UNT,(r0)+ ; *s++= UNT; Sx movb tad(r1),(r0)+ ; if((*s++= ib11.devtbl[d].tad)==0) beq 10$ ; return ENOTAD; Sx movb sad(r1),@r0 ; if(*s= ib11.devtbl[d].sad) s++; beq 1$ inc r0 1$: Sx movb lad,(r0)+ ; *s++= ib11.devtbl[0].lad; Sx movb sad,@r0 ; if(*s= ib11.devtbl[0].sad) s++; beq 4$ inc r0 4$: Exclude ; exclude(); jsr pc,cmd ; if((x=cmd(s))<0 || tst r0 bmi 2$ Sx movb rmd(r1),mode ; (x= ans= gpib(Readg,bp,n,ib11.devtbl[d].rmd,ib11.devtbl[d].eod))<0 Sx movb eod(r1),mode+2 callf gpib #Readg 6(r5) 10(r5) #mode #mode+2 mov r0,r1 ; || (x=gtsun())<0) ans= x; bmi 2$ jsr pc,gtsun tst r0 bmi 2$ mov r1,r0 2$: Unexclude ; unexclude(); rts pc ; return ans; 10$: mov #ENOTAD,r0 rts pc clear: ;clear(d) tst r1 ; if(d<0) return gpib(Clear); bpl 1$ callf gpib #Clearg rts pc 1$: mov #cbf,r0 ; s= &cbf[0]; tst r1 ; if(d) *s++= UNL; beq 3$ movb #UNL,(r0)+ movb #UNT,(r0)+ ; *s++= UNT; jsr pc,ltns ; if((s= ltns(s,d))<0) return s; bcs 10$ movb #SDC,(r0)+ ; *s++= SDC; br 5$ 3$: movb #DCL,(r0)+ ; else *s++= DCL; 5$: jmp cmd ; return cmd(s); 10$: rts pc trigger: ;trigger(d) mov #cbf,r0 ; s= &cbf[0]; movb #UNL,(r0)+ ; *s++= UNL; movb #UNT,(r0)+ ; *s++= UNT; jsr pc,ltns ; if((s= ltns(s,d))<0) return s; bcs 10$ movb #GET,(r0)+ ; *s++= GET; jmp cmd ; return cmd(s); 10$: rts pc remote: ;remote(d) callf gpib #Remotg ; if((x=gpib(Remote))<0) return x; tst r0 bmi 10$ mov #cbf,r0 ; s= &cbf[0]; tst r1 ; if(d<0) *s++= LLO; d++; bpl 1$ movb #LLO,(r0)+ add #6,r1 1$: jsr pc,ltns ; if((s= ltns(s,d))<0) return s; bcs 10$ jmp cmd ; return cmd(s); 10$: rts pc local: ;local(d) tst r1 ; if(d<0) return gpib(Local); bpl 1$ callf gpib #Localg rts pc 1$: mov #cbf,r0 ; s= &cbf[0]; movb #UNL,(r0)+ ; *s++= UNL; movb #UNT,(r0)+ ; *s++= UNT; jsr pc,ltns ; if((s= ltns(s,d))<0) return s; bcs 10$ movb #GTL,(r0)+ ; *s++= GTL; jmp cmd ; return cmd(s); 10$: rts pc poll: ;poll(d) tst r1 ; if(d<0) return gpib(Testsrq, 0); bpl 1$ callf gpib #Testsrq #zero rts pc 1$: bgt 2$ ; if(d==0) return gpib(Parallel); callf gpib #Parallel rts pc 2$: mov #cbf,r0 ; s= &cbf[0]; movb #UNL,(r0)+ ; *s++= UNL; movb #UNT,(r0)+ ; *s++= UNT; movb #SPE,(r0)+ ; *s++= SPE; Sx movb tad(r1),(r0)+ ; if((*s++= ib11.devtbl[d].tad)==0) beq 10$ ; return ENOTAD; Sx movb sad(r1),@r0 ; if(*s= ib11.devtbl[d].sad) s++; beq 5$ inc r0 5$: Sx movb lad,(r0)+ ; *s++= ib11.devtbl[0].lad; Sx movb sad,@r0 ; if(*s= ib11.devtbl[0].sad) s++; beq 6$ inc r0 6$: Exclude ; exclude(); jsr pc,cmd ; if((x=cmd(s))>=0 tst r0 bmi 3$ ; && (x=gpib(Readg, &mode, 1,0,0))>=0 callf gpib #Readg #mode #one #zero #zero tst r0 bmi 3$ mov #cbf,r0 ; && (cbf[0]=SPD, (x=cmd(&cbf[1]))>=0)) movb #SPD,(r0)+ jsr pc,cmd tst r0 bmi 3$ mov mode,r0 ; x= mode; 3$: Unexclude ; unexclude(); rts pc ; return x; 10$: mov #ENOTAD,r0 rts pc configure: ;configure(d,sense,line) mov #cbf,r0 ; s= &cbf[0]; tst r1 ; if(d) *s++= UNL; beq 2$ movb #UNL,(r0)+ movb #UNT,(r0)+ ; *s++= UNT; jsr pc,ltns ; if((s= ltns(s,d))<0) return s; bcs 10$ movb #PPC,(r0)+ ; *s++= PPC; movb #PPE0,@r0 ; if(sense>=0) *s++= PPE0 | (line-1)&7 | (sense? 010:0); mov @6(r5),r1 bmi 44$ beq 1$ bisb #010,@r0 1$: mov @10(r5),r1 dec r1 bic #177770,r1 bisb r1,(r0)+ br 4$ 44$: movb #PPD,(r0)+ ; else *s++= PPD; br 4$ 2$: movb #PPU,(r0)+ ; else *s++= PPU; 4$: jmp cmd ; return cmd(s); 10$: rts pc passcontrol: ;passcontrol(d) mov #cbf,r0 ; s= &cbf[0]; movb #UNL,(r0)+ ; *s++= UNL; movb #UNT,(r0)+ ; *s++= UNT; Sx movb tad(r1),(r0)+ ; if((*s++= ib11.devtbl[d].tad)==0) beq 11$ ; return ENOTAD; Sx movb sad(r1),@r0 ; if(*s= ib11.devtbl[d].sad) s++; beq 1$ inc r0 1$: movb #TCT,(r0)+ ; *s++= TCT; Exclude ; exclude(); jsr pc,cmd ; if((x=cmd(s))>=0) tst r0 bmi 10$ callf gpib #Passg ; x= gpib(Passg); 10$: Unexclude ; unexclude(); rts pc ; return x; 11$: mov #ENOTAD,r0 rts pc define: ;define(d,tad,lad,sad,rmd,eod,wmd) add #ib11+devtbl,r1 movb @6(r5),r2 ; if(tad && (tad<0100 || tad>=0137)) beq 1$ ; return ENOTAD; cmpb r2,#0100 blt 11$ cmpb r2,#0137 bge 11$ 1$: movb @10(r5),r3 ; if(lad && (lad<040 || lad>=077)) beq 2$ ; return ENOLAD; cmpb r3,#040 blt 12$ cmpb r3,#077 bge 12$ 2$: movb @12(r5),r4 ; if(sad && (sad<0140 || sad>=0177)) beq 3$ ; return ENOTAD; cmpb r4,#0140 blt 11$ cmpb r4,#0177 bge 11$ 3$: movb r2,(r1)+ ; ib11.devtbl[d].tad= tad; movb r3,(r1)+ ; ib11.devtbl[d].lad= lad; movb r4,(r1)+ ; ib11.devtbl[d].sad= sad; movb @14(r5),(r1)+ ; ib11.devtbl[d].rmd= rmd; movb @16(r5),(r1)+ ; ib11.devtbl[d].eod= eod; movb @20(r5),@r1 ; ib11.devtbl[d].wmd= wmd; mov #OK,r0 ; return OK; rts pc 11$: mov #ENOTAD,r0 rts pc 12$: mov #ENOLAD,r0 rts pc finish: ;finish() clr ib11 ; ib11.open= 0; callf gpib #Finshg ; return gpib(Finshg); rts pc zero: Command: 0 one: Writeg: 1 Readg: 2 Transfg: 3 Clearg: 4 Remotg: 5 Localg: 6 Parallel:7 Passg: 8. Testsrq: 13. Finshg: 14. cbf: .blkb 35. ; 2*max number of devices +7 .even cnt: 0 mode: 0,0 ltns: ;ltns(s,d) char *s; tst r1 ; if(d) if((*s++= ib11.devtbl[d].lad)==0) beq 1$ ; return ENOLAD; Sx movb lad(r1),(r0)+ beq 11$ Sx movb sad(r1),@r0 ; if(*s= ib11.devtbl[d].sad) s++; beq 10$ inc r0 br 10$ 1$: mov ib11+ndev,r2 ; else for(d++, n=ib11.ndev; n-->0; d++) beq 10$ 2$: add #6,r1 Sx movb lad(r1),@r0 ; if(*s= ib11.devtbl[d].lad) beq 4$ inc r0 ; s++; Sx movb sad(r1),@r0 ; if(*s= ib11.devtbl[d].sad) s++; beq 4$ inc r0 4$: dec r2 bgt 2$ 10$: clc ; return s; rts pc 11$: mov #ENOLAD,r0 sec rts pc cmd: sub #cbf,r0 ;cmd(s) mov r0,cnt ; return gpib(Command, &cbf[0], s- &cbf[0]); callf gpib #Command #cbf #cnt tst r0 bmi 1$ mov #OK,r0 1$: rts pc gtsun: mov #cbf,r0 ;gtsun() movb #UNL,(r0)+ ; s= &cbf[0]; movb #UNT,(r0)+ ; *s++= UNL; *s++= UNT; jsr pc,cmd ; if((x=cmd(s))<0) return x; tst r0 bmi 10$ callf gpib #Transfg ; return gpib(Transfer); 10$: rts pc rsav: .irp a, mov a,-(sp) .endr rts r5 rres: tst (sp)+ .irp a, mov (sp)+,a .endr rts r5 .if eq,DVR-2 .mcall qiow$s excl: mov r0,-(sp) mov #3*256.,r0 ; IO.ATT br exq unexcl: mov r0,-(sp) mov #4*256.,r0 ; IO.DET exq: qiow$s r0, ib+chan, ib+efn mov (sp)+,r0 rts pc .csect ibudp ib: ;struct ib { int chan,efn,iost[2]; chan=0 efn=2 .csect .endc size= .-begin .end .enabl lc .title IBUDP - GPIB11-Series Interface Handler Front-end .nlist bex, ttm, cnd ; Rev. D.10 ; This software is provided solely for use with ; the National Instruments GPIB11-series interfaces. ; Copyright 1980 National Instruments ; Jeffrey Kodosky ; April 1980 ; Edit 09/26/81 ; REV C: 01/01/82 ; REV D: 12/20/82 ; V1: 04/18/83 Read and write are now done with spfun ; V2: 09/04/85 RT Version 5 spfun mods. ; Edit the following assignments to reflect the desired software environment. BASIC= 0 ; 0 for FORTRAN/MACRO interface, 1 for BASIC DVR= 1 ; 1 if driver is an RT handler, 2 if RSX handler, 0 otherwise. .iif eq,DVR, .error handler front-end only .iif eq,DVR-1, .mcall .lookup, .spfun, .close .iif eq,DVR-2, .mcall qiow$s, alun$s RTCHAN= 13. RSXCHAN= 1 RSXEFN= 2 .if ne,BASIC .if eq,DVR-2 RSXCHAN= 4 .endc .endc ; Error codes OK= 1 ENONE= -1 ENOFUN= -7 EOPEN= -17. ; Handler is already open. EHDLR= -100. ; Handler access error. r0=%0 r1=%1 r2=%2 r3=%3 r4=%4 r5=%5 sp=%6 pc=%7 .if eq,DVR-2 COM= 5*256. WT= 1*256. ;IO.WLB RD= 2*256. ;IO.RLB TR= 6*256. CL= 7*256. REM= 8.*256. LOC= 9.*256. PP= 10.*256. PCT= 11.*256. SST= 12.*256. MON= 13.*256. RDC= 14.*256. SPM= 15.*256. TSR= 16.*256. FIN= 17.*256. STA= 18.*256. SPB= 19.*256. .endc .if eq,DVR-1 COM= -1 WT= -2 RD= -3 TR= -4 CL= -5 REM= -6 LOC= -7 PP= -8. PCT= -9. SST= -10. MON= -11. RDC= -12. SPM= -13. TSR= -14. FIN= -15. STA= -16. SPB= -17. .endc .macro spfn code buffer count .if eq,DVR-2 .if nb,buffer qiow$s #code, ib+chan, ib+efn, , #ib+iost, , .iff qiow$s #code, ib+chan, ib+efn, , #ib+iost .endc mov ib+iost+2,r0 bmi .+16 cmpb #IS.SUC,ib+iost beq .+6 mov #EHDLR,r0 .endc .if eq,DVR-1 clr ib+iost .spfun #area, ib+chan, #code, buffer, count, #ib+iost mov ib+iost,r0 bmi .+10 bcc .+6 mov #EHDLR,r0 .endc .endm spfn .macro cjmp t f .macro j't' a ?b b'f' b jmp a b: .endm j't' .macro j'f' a ?b b't' b jmp a b: .endm j'f' .endm cjmp .irp j,<,> cjmp j .endr .csect ibudp ib: -1, 0, 0, 0 .byte -1, 0, -1, 10. .even .csect chan=0 ;struct ib { efn=2 ; int chan, efn, iost[2]; iost=4 rmd=8. ; char rmd, eod, wmd, timo; eod=9. wmd=10. ; } ib; timo=11. begin= . .globl gpib gpib: .if ne,BASIC .if eq,DVR-2 jsr pc,gpib0 mov @2(r5),r1 ; if called with extra arg then put return value in cmp r1,#NFNS bcc 1$ cmpb @r5,fcntbl(r1) ble 1$ movb @r5,r1 beq 1$ asl r1 add r5,r1 mov r0,@(r1)+ 1$: rts pc fcntbl: .byte 3, 4, 5, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 3, 2 .even .iff .globl $arger, $bomb, $find, $alc, $store, $dealc, $msg cmpb 1(r5),#202 jne gpib0 mov @-2(r5),r4 bic #200,r4 cmp r4,#1023 bne argerr mov @2(r5),r0 cmp r0,#NFNS jcc b9$ cmpb @r5,bcntbl(r0) bne argerr movb fcntbl(r0),fblk mov 2(r5),fblk+2 mov -2(r5),r4 asl r0 jmp @pretbl(r0) b.write:mov 4(r4),r4 bic #200,r4 cmp r4,#1023 bne argerr mov 6(r5),fblk+10 mov -2(r5),r4 b.command: mov 2(r4),r4 bit #1,r4 bne argerr mov (r4)+,r1 mov @r4,r0 bic #200,r1 cmp r1,#1100 bne argerr mov #100,r1 jsr pc,$find mov r0,fblk+4 mov #fblk+16,fblk+6 mov r1,fblk+16 br b.call argerr: jmp $arger b.read: tst (r4)+ mov (r4)+,r3 bit #1,r3 bne argerr cmp (r3)+,#1100 bne argerr mov @r3,strref mov #tmpstr,fblk+4 mov #fblk+6,r3 mov r5,r2 add #6,r2 mov #3,r0 br b.t2 b.setstatus: b.monitor: b.setparm: mov #1,r0 tst (r4)+ mov #fblk+4,r3 mov r5,r2 cmp (r2)+,(r2)+ b.t2: mov (r4)+,r1 bic #200,r1 cmp r1,#1023 bne argerr mov (r2)+,(r3)+ dec r0 bgt b.t2 br b.call b.parallel: cmp 2(r4),#1023 bne argerr ;br b.call b.call: mov r5,-(sp) mov #fblk,r5 jsr pc,gpib0 mov (sp)+,r5 cmp r0,#ENONE blt b10$ mov @2(r5),r1 asl r1 jmp @postbl(r1) b.rd: tst r0 bpl 1$ clr r0 1$: mov #100,r1 jsr pc,$alc bcs b11$ mov #tmpstr,r3 2$: dec r1 bmi 3$ movb (r3)+,(r0)+ br 2$ 3$: mov sp,r0 mov strref,r1 jsr pc,$store jsr pc,$dealc rts pc b.pp: b.rc: b.sr: mov r0,@4(r5) b.rtn: rts pc b9$: mov #ENOFUN,r0 b10$: com r0 b11$: asl r0 mov bemsg(r0),r1 jsr pc,$bomb ;no return bemsg: bemsg1, emsg2, emsg3, emsg4, emsg5, emsg6, emsg7, emsg8, emsg9 emsg10, emsg11, emsg12, emsg13, emsg14, emsg15, emsg16 bemsg1: .asciz /alc--no space/ emsg2: .asciz /CAC conflict/ emsg3: .asciz /not CAC/ emsg4: .asciz /not SAC/ emsg5: .asciz /IFC abort/ emsg6: .asciz /timeout/ emsg7: .asciz /bad fctn code/ emsg8: .asciz /?/ emsg9: .asciz /no listeners/ emsg10: .asciz /bcr error/ emsg11: .asciz /no PP/ emsg12: .asciz /ir timeout/ emsg13: .asciz /ir nex memory/ emsg14: .asciz /nex memory/ emsg15: .asciz /bar-bcr error/ emsg16: .asciz /umr error/ emsg17: .asciz /open err/ .even .csect gpib tmpstr: .blkb 256. strref: 0 fblk: .blkw 8. .csect bcntbl: .byte 2, 3, 5, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 1, 3, 1 fcntbl: .byte 3, 4, 5, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 2, 1, 3, 1 pretbl: b.command, b.write, b.read, b.call, b.call, b.call, b.call b.parallel, b.call, b.setstatus, b.monitor, b.call, b.setparm b.call, b.call postbl: b.rtn, b.rtn, b.rd, b.rtn, b.rtn, b.rtn, b.rtn, b.pp, b.rtn b.rtn, b.rtn, b.rc, b.rtn, b.sr, b.rtn .endc gpib0: .endc ;gpib(f,a1,a2,a3,a4) tst ib+chan ; if(ib.chan<0 && (x=ibopen())<0) bpl 1$ ; return x; jsr pc,ibopen bcs 10$ 1$: mov @2(r5),r0 ; if(f<0 || f>=NFNS) return ENOFUN; cmp r0,#NFNS bhis 9$ asl r0 ; return (*ibfn[f])(a1,a2,a3,a4); jmp @ibfn(r0) 9$: mov #ENOFUN,r0 10$: rts pc ibfn: ;int (*ibfn[])()= { command ; &command, &write, &read, &transfer, write ; &clear, &remote, &local, ¶llel, read ; &passcontrol, &setstatus, &monitor, &readcommand, transfer ; &setparameters, &testsrq, &finish }; clear remote local parallel passcontrol setstatus monitor readcommand setparameters testsrq finish status spbyte NFNS= <.-ibfn>/2 ibopen: ;ibopen() .if eq,DVR-1 .lookup #area, #RTCHAN, #devblk bcs 10$ mov #RTCHAN,ib+chan rts pc 10$: mov #EOPEN,r0 rts pc area: .blkw 12. devblk: .rad50 /IB/ .word 0, 0, 0 .endc .if eq,DVR-2 alun$s #RSXCHAN, #"IB, #0 bcs 10$ mov #RSXCHAN,ib+chan mov #RSXEFN,ib+efn rts pc 10$: mov #EOPEN,r0 rts pc .endc command: ;command(bp,n) char bp[n]; spfn COM, 4(r5), @6(r5) rts pc status: ;status(bp,n) char bp[n]; spfn STA, 4(r5), @6(r5) rts pc write: ;write(bp,n,mode) char bp[n]; cmpb ib+wmd,@10(r5) beq 1$ movb @10(r5),ib+wmd jsr pc,setmodes tst r0 bmi 10$ 1$: spfn WT, 4(r5), @6(r5) 10$: rts pc read: ;read(bp,n,mode,eod) char bp[n]; movb @10(r5),r0 cmpb r0,ib+rmd bne 1$ bit #2,r0 beq 2$ cmpb @12(r5),ib+eod beq 2$ 1$: movb r0,ib+rmd movb @12(r5),ib+eod jsr pc,setmodes tst r0 bmi 10$ 2$: spfn RD, 4(r5), @6(r5) 10$: rts pc setmodes: movb ib+rmd,r0 .rept 4 asl r0 .endr bic #177417,r0 mov r0,worksp movb ib+wmd,r0 bic #177760,r0 bis r0,worksp movb ib+eod,worksp+1 movb ib+timo,worksp+2 .if eq,DVR-2 spfn SPM, worksp, worksp+2 .endc .if eq,DVR-1 spfn SPM, #worksp, #3 .endc rts pc transfer: ;transfer() spfn TR rts pc clear: ;clear() spfn CL rts pc remote: ;remote() spfn REM rts pc local: ;local() spfn LOC rts pc parallel: ;parallel() spfn PP rts pc passcontrol: ;passcontrol() spfn PCT rts pc spbyte: ;spbyte(s) .if eq,DVR-1 spfn MON, #0, @4(r5) .iff spfn SPB, 0, @4(r5) .endc rts pc setstatus: ;setstatus(s) .if eq,DVR-1 spfn SST, #0, @4(r5) .iff spfn SST, 0, @4(r5) .endc rts pc setparameters: ;setparameters(t) movb @4(r5),ib+timo jsr pc,setmodes rts pc testsrq: ;testsrq() .if eq,DVR-1 spfn TSR, #0, @4(r5) .iff spfn TSR, 0, @4(r5) .endc rts pc monitor: ;monitor(m) .if eq,DVR-1 spfn MON, #0, @4(r5) .iff spfn MON, 0, @4(r5) .endc rts pc readcommand: ;readcommand() spfn RDC rts pc finish: ;finish() spfn FIN ;br ibclose ibclose: .if eq,DVR-1 mov r0,r1 .close ib+chan mov r1,r0 .endc mov #-1,ib+chan rts pc worksp: 0,0 size= .-begin .end .enabl lc .title IBIC - GPIB Interactive Controller .nlist bex, ttm, cnd ; This software is provided solely for use with ; the National Instruments GPIB series interfaces. ; Copyright 1980 National Instruments ; Jeffrey Kodosky ; May 1980 ; Edit 09/01/81 ; REV C: 01/01/82 ; REV D: 01/01/83 ; Edit the following assignments to reflect the desired software environment. OS= 1 ; 1 if running under RT, 2 if running under RSX, 0 otherwise. .macro call subr a0 a1 a2 a3 a4 a5 a6 a7 na=0 .irp a, .if nb,a mov a,-(sp) na=na+1 .endc .endr jsr pc,subr .iif eq,na-1, tst (sp)+ .iif eq,na-2, cmp (sp)+,(sp)+ .iif gt,na-2, add #na*2,sp .endm call .macro cjmp t f .macro j't' a ?b b'f' b jmp a b: .endm j't' .macro j'f' a ?b b't' b jmp a b: .endm j'f' .endm cjmp .irp j,<,,> cjmp j .endr .macro string a .csect sdata str= . .narg na .if eq,na .byte 0 .iff .asciz /a/ .endc .csect .word str .endm string .iif eq,OS-1, .mcall .exit, .ttyin, .ttyout .iif eq,OS-2, .mcall exit$s, alun$s, qiow$s fns: string ;char *fns[] { string ; "ibup", ; "gpib" }; .globl ibup, gpib fctn: ibup, gpib ;int (*fctn[])() { &ibup, &gpib }; maxcode: 10., 16. ;int maxcode[] { 10, 16 }; ;struct argdef { ; char *name, *args, *ans; }; fnargs: ibupargs, gpibargs ;struct argdef *fnargs[] { ibupargs, gpibargs }; ibupargs: ;struct argdef ibupargs[] { string ; {"write", "ISL", "I" }, string string string ; {"read", "IBN", "IB" }, string string string ; {"clear", "I", "I" }, string string string ; {"trigger", "I", "I" }, string string string ; {"remote", "I", "I" }, string string string ; {"local", "I", "I" }, string string string ; {"poll", "I", "O" }, string string string ; {"configure", "III", "I" }, string string string ; {"passcontrol", "I", "I" }, string string string ; {"define", "IIIIIII", "I" }, string string string ; {"finish", "", "I" } }; string string gpibargs: ;struct argdef gpibargs[] { string ; {"command", "SL", "I" }, string string string ; {"write", "SLI", "I" }, string string string ; {"read", "BNII", "IB" }, string string string ; {"transfer", "", "I" }, string string string ; {"clear", "", "I" }, string string string ; {"remote", "", "I" }, string string string ; {"local", "", "I" }, string string string ; {"parallelpoll", "", "O" }, string string string ; {"passcontrol", "", "I" }, string string string ; {"setstatus", "I", "I" }, string string string ; {"monitor", "I", "I" }, string string string ; {"readcommand", "", "O" }, string string string ; {"setparameters", "I", "I" }, string string string ; {"testsrq", "I", "I" }, string string string ; {"finish", "", "I" } }; string string string ; {"status", "BN", "IT" }, string string string ; {"spbyte", "I", "I" }, string string ; }; MAXBUF= 2048. ;#define MAXBUF 2048 MAXLIN= 256. ;#define MAXLIN 256 lbuf: .blkb MAXLIN ;char lbuf[MAXLIN], ansbuf[MAXBUF], *cp; ansbuf: .blkb MAXBUF cp: 0 strlen: 0 ;int strlen, fn; fn: 0 argc: 0 ;int argc; argv: code ;int argv[9] { &code }; .blkw 8. code: 0 ;int code, args[8]; args: .blkw 8. .globl ibic ibic: ;ibic(){ int n, i; char *atp, c; .if eq,OS mov #stack,sp jsr pc,init .endc loop: call getline ;loop: while((n=getline())>=0){ tst r0 jmi out beq loop ; if(n==0) continue; mov #lbuf,cp ; cp= lbuf; call getfn ; if((fn=getfn())<0) continue; mov r0,fn bmi loop call getcode fn ; if((code=getcode(fn))<0) continue; mov r0,code bmi loop clr r2 ; for(i=0, argc=1, atp=fnargs[fn][code].args; c= *atp++; ) mov #1,argc mov fn,r0 asl r0 mov fnargs(r0),r0 mov code,r1 asl r1 add code,r1 asl r1 add r1,r0 mov 2(r0),r3 for: movb (r3)+,r4 beq 10$ ; switch(c){ cmpb r4,#'N ; case 'N': bne 11$ ; if((argv[argc++]= getint(i++))==0) call getint r2 inc r2 tst r0 beq loop ; goto loop; cmp @r0,#MAXBUF ; if(args[i-1]>MAXBUF) args[i-1]= MAXBUF; ble 5$ mov #MAXBUF,@r0 br 5$ ; break; 11$: cmpb r4,#'I ; case 'I': bne 1$ call getint r2 ; if((argv[argc++]= getint(i++))==0) inc r2 ; break; br 5$ ; break; 1$: cmpb r4,#'S ; case 'S': bne 2$ ; if((argv[argc++]= getstr())==0) call getstr ; break; br 5$ ; break; 2$: cmpb r4,#'L ; case 'L': bne 3$ mov #strlen,r0 ; argv[argc++]= &strlen; br 5$ ; break; 3$: cmpb r4,#'B ; case 'B': bne for mov #ansbuf,r0 ; argv[argc++]= ansbuf; 5$: mov argc,r1 ; break; inc argc ; } asl r1 mov r0,argv(r1) beq loop br for 10$: jsr r5,rsav ; i= (*fctn[fn])(argc,argv); mov #argc,r5 mov fn,r0 asl r0 jsr pc,@fctn(r0) jsr r5,rres mov r0,r2 mov fn,r0 ; for(atp= fnargs[fn][code].ans; c= *atp++; ) asl r0 mov fnargs(r0),r0 mov code,r1 asl r1 add code,r1 asl r1 add r1,r0 mov 4(r0),r3 for1: movb (r3)+,r4 beq 10$ ; switch(c){ cmpb r4,#'I ; case 'I': putd(i); putc(' '); break; bne 1$ call putd r2 br 5$ 1$: cmpb r4,#'O ; case 'O': bne 2$ tst r2 ; if(i<0) putd(i); bpl 11$ call putd r2 br 5$ 11$: call puto r2 ; else puto(i); br 5$ ; putc(' '); break; 2$: cmpb r4,#'B ; case 'B': put(ansbuf,i); putc(' '); break; bne 6$ ; call put #ansbuf r2 br 5$ 6$: cmpb r4,#'T ; case 'T': putt (ansbuf,i); break; bne 5$ call putt #ansbuf r2 5$: call putc #040 ; } br for1 10$: call putc #012 ; putc('\n'); jmp loop ; } } out: .iif eq,OS, jmp ibic .iif eq,OS-1, .exit .iif eq,OS-2, exit$s getfn: jsr r5,rsav ;getfn(){ int fn;char *s, **a; call skpspc ; skpspc(); clr r4 ; for(fn=0, a=fns; fn<2; fn++, a++) mov #fns,r3 1$: cmp r4,#2 bge 2$ call match cp (r3)+ ; if(match(cp,*a)) break; tst r0 bne 3$ inc r4 br 1$ 2$: call putl emsg1 ; if(fn>=2){ putl("unrecognized function"); return -1; } mov #-1,r4 br 10$ 3$: call skpnspc ; skpnspc(); 10$: mov r4,r0 ; return fn; } jmp rrtn emsg1: string getcode:jsr r5,rsav ;getcode(fn){ int f; struct argdef *a; call skpspc ; skpspc(); mov 4(r5),r3 asl r3 mov maxcode(r3),r2 movb @cp,r0 ; if(*cp>='0' && *cp<='9') f= atoi(cp); cmpb r0,#'0 blt 1$ cmpb r0,#'9 bgt 1$ call atoi cp mov r0,r4 bmi 5$ cmp r4,r2 bgt 5$ br 8$ 1$: clr r4 ; else for(f=0, a=fnargs[fn]; f<=maxcode[fn]; a++, f++) mov fnargs(r3),r3 2$: cmp r4,r2 bgt 5$ call match cp @r3 ; if(match(cp,a->name)) break; tst r0 bne 8$ inc r4 add #6,r3 br 2$ 5$: call putl emsg2 ; if(f<0 || f>maxcode[fn]){ putl("illegal code"); return -1; } mov #-1,r4 br 10$ 8$: call skpnspc ; skpnspc(); 10$: mov r4,r0 ; return f; } jmp rrtn emsg2: string getint: jsr r5,rsav ;getint(i){ char *s; call skpspc ; skpspc(); movb @cp,r0 ; if(*cp>='0' && *cp<='9' || *cp=='-'){ cmpb r0,#'0 blt 1$ cmpb r0,#'9 ble 2$ 1$: cmpb r0,#'- bne 3$ 2$: mov 4(r5),r1 ; args[i]= atoi(cp); asl r1 add #args,r1 call atoi cp mov r0,@r1 call skpnspc ; skpnspc(); mov r1,r0 ; return &args[i]; } br 10$ 3$: call putl emsg3 ; putl("illegal integer argument"); clr r0 ; return 0; } 10$: jmp rrtn emsg3: string getstr: jsr r5,rsav ;getstr(){ char *s; call skpspc ; skpspc(); movb @cp,r0 ; if(*cp++=='"'){ inc cp cmpb r0,#'" bne 8$ clr strlen ; for(strlen=0, s=ansbuf; *cp && *cp!='"'; strlen++) mov #ansbuf,r4 1$: movb @cp,r0 beq 5$ cmpb r0,#'" beq 4$ call cscan ; *s++= cscan(); movb r0,(r4)+ inc strlen br 1$ 4$: call skpnspc ; skpnspc(); 5$: mov #ansbuf,r0 ; return ansbuf; } br 10$ 8$: call putl emsg4 ; putl("illegal string argument"); clr r0 ; return 0; } 10$: jmp rrtn emsg4: string skpspc: ;skpspc(){ movb @cp,r0 ; while(*cp && *cp<=' ') cp++; } beq 10$ cmpb r0,#040 bhi 10$ inc cp br skpspc 10$: rts pc skpnspc: ;skpnspc(){ movb @cp,r0 ; while(*cp>' ') cp++; } cmpb r0,#040 blos 10$ inc cp br skpnspc 10$: rts pc putl: mov 2(sp),r0 ;putl(s) char *s;{ call puts r0 ; puts(s); putc('\n'); } call putc #012 rts pc puts: jsr r5,rsav ;puts(s) char *s;{ mov 4(r5),r4 ; while(*s) putc(*s++); } 1$: movb (r4)+,r3 beq 10$ call putc r3 br 1$ 10$: jmp rrtn put: jsr r5,rsav ;put(s,i) char *s;{ mov 6(r5),r4 ; while(i-->0) ble 10$ mov 4(r5),r3 1$: movb (r3)+,r2 ; if((c= *s++)>=' ' && c<0177) cmpb r2,#040 blt 2$ cmpb r2,#0177 bge 2$ call putc r2 ; putc(c); br 9$ 2$: call putc #'\ ; else { putc('\\'); cmpb r2,#015 ; switch(c){ bne 3$ mov #'r,r2 ; case '\r': putc('r'); break; br 8$ 3$: cmpb r2,#012 bne 4$ mov #'n,r2 ; case '\n': putc('n'); break; br 8$ 4$: cmpb r2,#011 bne 5$ mov #'t,r2 ; case '\t': putc('t'); break; br 8$ 5$: cmpb r2,#010 bne 6$ mov #'b,r2 ; case '\b': putc('b'); break; br 8$ 6$: cmpb r2,#014 bne 7$ mov #'p,r2 ; case '\014': putc('p'); break; br 8$ 7$: mov r2,r0 ; default: asl r0 ; putc(((c>>6)&3)+'0'); asl r0 swab r0 bic #177774,r0 add #'0,r0 call putc r0 mov r2,r0 asr r0 ; putc(((c>>3)&7)+'0'); asr r0 asr r0 bic #177770,r0 add #'0,r0 call putc r0 bic #177770,r2 ; putc((c&7)+'0'); add #'0,r2 8$: call putc r2 9$: dec r4 bgt 1$ 10$: jmp rrtn putd: ;putd(n){ tst 2(sp) ; if(n<0){ putc('-'); n= -n; } bpl putu ; putu(n); } call putc #'- neg 2(sp) ;br putu putu: mov 2(sp),r0 ;putu(u) unsigned u;{ cmp r0,#10. ; if(u>=10) putu(u/10); blt 10$ mov r1,-(sp) mov r2,-(sp) mov #16.,r2 clr r1 1$: sec rol r0 rol r1 sub #10.,r1 bpl 2$ add #10.,r1 dec r0 2$: dec r2 bne 1$ mov (sp)+,r2 mov r1,4(sp) mov (sp)+,r1 call putu r0 10$: add #'0,2(sp) ; putc(u%10 + '0'); } jmp putc puto: mov 2(sp),r0 ;puto(o){ bit #0177770,r0 ; if(o&0177770) puto((o>>3)&017777); beq 1$ asr r0 asr r0 asr r0 bic #160000,r0 call puto r0 1$: bic #177770,2(sp) ; putc((o&7) +'0'); } add #'0,2(sp) jmp putc putt: jsr r5,rsav ;putt (s, i) int *s; { mov 4(r5),r2 ; mov r2,r4 ; add 6(r5),r4 ; while (s <= &s[i]) clr r3 ; for (j = 8; j--; ) { br 1$ 2$: call puto (r2)+ ; puto (*s++); call putc #040 ; putc (' '); 1$: cmp r2,r4 ; } bhis 3$ ; dec r3 ; bgt 2$ ; call putc #012 ; mov #8.,r3 ; br 2$ ; 3$: call putc #012 ; jmp rrtn ; atoi: jsr r5,rsav ;atoi(s) char *s;{ int sign, base, n; clr -(sp) ; sign= 0; mov #10.,r4 ; base= 10; mov 4(r5),r2 cmpb @r2,#'- ; if(*s=='-'){ sign++; s++; } bne 1$ inc @sp inc r2 br 2$ 1$: cmpb @r2,#'0 ; else if(*s=='0'){ base= 8; s++; } bne 2$ mov #8.,r4 inc r2 2$: clr r0 ; for(n=0; *s>='0' && *s<='9'; ) n= n*base + *s - '0'; 3$: movb (r2)+,r3 cmpb r3,#'0 blt 10$ cmpb r3,#'9 bgt 10$ sub #'0,r3 mov r4,r1 4$: add r0,r3 dec r1 bgt 4$ mov r3,r0 br 3$ 10$: tst (sp)+ ; return sign? -n:n; } beq 11$ neg r0 11$: jmp rrtn getline:jsr r5,rsav ;getline(){ char *s; call putc #': ; putc(':'); mov #lbuf,r4 ; for(s=lbuf; (*s=getc())!='\n'; s++) 1$: call getc movb r0,@r4 beq 5$ cmpb r0,#012 beq 8$ cmpb r0,#015 beq 1$ inc r4 br 1$ 5$: sub #lbuf,r4 ; if(*s==0) return s>lbuf? s-lbuf: -1; bne 10$ dec r4 br 10$ 8$: clrb @r4 ; *s= 0; sub #lbuf,r4 ; return s-lbuf; } 10$: mov r4,r0 jmp rrtn match: jsr r5,rsav ;match(st,s) char *st, *s;{ char *t; mov 4(r5),r4 ; for(t=st; *t==*s || *t==(*s&~040); t++) mov 6(r5),r3 1$: movb @r3,r0 cmpb r0,@r4 beq 2$ bic #040,r0 cmpb r0,@r4 bne 5$ 2$: tstb (r3)+ ; if(*s++==0) return 1; beq 10$ inc r4 br 1$ 5$: cmp r4,4(r5) ; if(t>st && *t<=' ') return 1; blos 9$ cmpb @r4,#040 blos 10$ 9$: clr r0 ; return 0; } br 11$ 10$: mov #1,r0 11$: jmp rrtn cscan: jsr r5,rsav ;cscan(){ int c, i; movb @cp,r0 ; if(*cp!='\\') return *cp++; inc cp cmpb r0,#'\ bne 10$ movb @cp,r1 ; cp++; cmpb r1,#'0 ; if(*cp>='0' && *cp<='7'){ blt 3$ cmpb r1,#'7 bgt 3$ clr r0 ; for(i=3, n=0; i-->0 && *cp>='0' && *cp<='7'; ) mov #3,r4 2$: asl r0 ; n= n<<3 + *cp++ -'0'; asl r0 asl r0 sub #'0,r1 add r1,r0 inc cp dec r4 beq 10$ movb @cp,r1 cmpb r1,#'0 blt 10$ cmpb r1,#'7 bgt 10$ br 2$ ; return n; } 3$: mov r1,r0 ; switch(*cp){ beq 10$ ; case 0: return 0; bis #040,r1 cmpb r1,#'n ; case 'n': cp++; return '\n'; bne 5$ mov #12,r0 br 9$ 5$: cmpb r1,#'t ; case 't': cp++; return '\t'; bne 6$ mov #11,r0 br 9$ 6$: cmpb r1,#'r ; case 'r': cp++; return '\r'; bne 7$ mov #15,r0 br 9$ 7$: cmpb r1,#'b ; case 'b': cp++; return '\b'; bne 8$ mov #10,r0 br 9$ 8$: cmpb r1,#'p ; case 'p': cp++; return '\014'; bne 9$ mov #14,r0 9$: inc cp ; default: return *cp++; 10$: jmp rrtn ; } } .if eq,OS init: reset clr ll clr ln clr r0 clr r1 1$: tst (r1)+ mov r1,(r0)+ clr (r0)+ tst (r1)+ cmp r0,#1000 blo 1$ rts pc TTY= 0177560 MAXL= 80. lb: .blkb MAXL ll: 0 ln: 0 getc: jsr r5,rsav ;getc(){ cmp ln,ll ; if(ln>=ll) blt 10$ clr ln ; for(ln=0, ll=0; llrsr&DONE)==0) ; bpl 1$ mov @#TTY+2,r2 ; switch(c=TTY->rdb&0177) bic #177600,r2 cmpb r2,#025 ; case CTRLU: bne 2$ clr r1 ; ll= 0; call putc #012 ; putc('\n'); br 8$ ; break; 2$: cmpb r2,#0177 ; case DELETE: bne 3$ tst r1 ; if(ll) beq 8$ dec r1 ; ll--; call putc #'# ; putc('#'); br 8$ ; break; 3$: cmpb r2,#015 ; case '\r': bne 4$ mov #012,r2 ; c= '\n'; br 5$ 4$: cmpb r2,#012 ; case '\n': bne 6$ 5$: movb r2,lb(r1) ; lb[ll++]= c; inc r1 call putc r2 ; putc(c); br 9$ ; goto out; 6$: movb r2,lb(r1) ; default: inc r1 ; lb[ll++]= c; call putc r2 ; putc(c); 8$: cmp r1,#MAXL ; if(ll>=MAXL) goto out; blt 1$ 9$: mov r1,ll 10$: mov ln,r1 ;out: return lb[ln++]; movb lb(r1),r0 inc r1 mov r1,ln jmp rrtn putc: ;putc(c){ cmpb 2(sp),#012 ; if(c=='\n') putc('\r'); bne 1$ call putc #015 1$: tstb @#TTY+4 ; while((TTY->tsr&DONE)==0) ; bpl 1$ mov 2(sp),r0 ; return (TTY->tdb= c); } movb r0,@#TTY+6 rts pc stacklo:.=.+400 stack: .endc .if eq,OS-1 getc: .ttyin ;getc(){ return ttyin(); } rts pc putc: cmpb 2(sp),#012 ;putc(c){ bne 1$ ; if(c=='\n') ttyout('\r'); .ttyout #015 1$: .ttyout 2(sp) ; ttyout(c); } rts pc .endc .if eq,OS-2 IO.RLB= 01000 IO.WLB= 0400 IE.EOF= -10. MAXL= 80. char: 0 lb: .blkb MAXL ln: 0 ll: 0 iost: 0,0 getc: call doalun ;getc(){ return qiow(); } cmp ln,ll ; if(ln>=ll){ blt 10$ clr ln ; ln= 0; ll= qiow(&lb); qiow$s #IO.RLB, #2, #52., , #iost, , <#lb, #MAXL> mov iost+2,r0 movb #012,lb(r0) ; lb[ll++]= eof()? 0:'\n'; cmpb #IE.EOF,iost bne 9$ clrb lb(r0) 9$: inc r0 mov r0,ll call putc #012 10$: mov ln,r0 ; return lb[ln++]; } inc ln movb lb(r0),r0 rts pc putc: call doalun ;putc(c){ cmpb 2(sp),#012 ; if(c=='\n') putc('\r'); bne 1$ call putc #015 1$: mov 2(sp),char qiow$s #IO.WLB, #2, #52., , , , <#char, #1> rts pc alun: 0 doalun: tst alun bne 1$ alun$s #2, #"TI, #0 inc alun call putc #012 1$: rts pc .endc rsav: mov r5,r0 mov sp,r5 .irp a, mov a,-(sp) .endr jmp @r0 rres: tst (sp)+ .irp a, mov (sp)+,a .endr rts r5 rrtn: sub #10,r5 mov r5,sp .irp a, mov (sp)+,a .endr rts pc .csect sdata .even .end ibic .TITLE BSCLI .IDENT /000008/ ; Edit 04/14/80 ; REV C: 01/01/82 ; COPYRIGHT (C) 1974, 1975, 1976 ; BY DIGITAL EQUIPMENT CORPORATION ; 146 MAIN STREET ; MAYNARD, MASS. ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ON A SINGLE ; COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLUSION OF ; THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES ; THEREOF, MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ; OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO ; AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE ; SOFTWARE SHALL AT ALL TIMES REMAIN IN DIGITAL'S NAME. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT ; NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL ; EQUIPMENT CORPORATION. ; ; DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. ; ; WRITTEN BY ; ; ; MODIFIED BY ; ROOT .GLOBL FTABI,BKGI FTABI: .WORD FTBL .enabl lc .globl gpib, ibup FTBL: .word gpibnm .word ibupnm .word 0 BKGI: .WORD 0 gpibnm: .byte 4 .ascii "GPIB" .even .word gpib ibupnm: .byte 4 .ascii "IBUP" .even .word ibup .GLOBL UACTST UACTST: .IFDF $CALL .GLOBL HIFSAV TST HIFSAV(R5) ;ATTEMPT TO ALLOCATE ARRAY WHILE HIFREE ; IS MESSED UP BEQ RET ;NO .GLOBL ERRUAC ERRUAC: ERTEXT UAC, RET: .ENDC ;$CALL RTS PC ;THE FOLLOWING ROUTINES ARE CALLED FROM WITHIN THE BASIC-11 INTERPRETER ;AND ARE NOT TO BE CALLED FROM ANYWHERE ELSE. ;RETNTR IS CALLED FROM THE RETURN STATEMENT ;XEQNTR IS CALLED BEFORE THE EXECUTION OF EACH STATEMENT. ;RDYNTR IS CALLED AT THE READY MESSAGE. ;BYENTR IS CALLED FROM THE BYE COMMAND. ;THE ENTRY POINTS ARE MADE AVAILABLE SO THAT REAL TIME OPERATIONS MAY ;BE PERFORMED. THEY ARE DUMMIED OUT HERE WITH AN RTS PC. ;********************************************************************* ;***************THE FOLLOWING ROUTINES ARE FOR USE BY***************** ;**************THE DEC BASIC-11 DEVELOPMENT GROUP ONLY**************** ;********************************************************************* .GLOBL RETNTR,XEQNTR,RDYNTR,BYENTR RETNTR: XEQNTR: RDYNTR: BYENTR: RTS PC .IF DF $CALL ;THE FOLLOWING .PSECTS ARE REQUIRED TO ENSURE THAT ROUTINES IN ;SYSLIB ARE PART OF BASIC'S ROOT SEGMENT. ALL CODE ADDED TO THIS MODULE ;BY USERS OF BASIC MUST PRECEDE THE ABOVE ".GLOBL UACTST". ; NOTE: NOT ALL SYSLIB ROUTINES ARE ACCESSIBLE FROM BASIC. ; .PSECT SYS$I,RW,I .PSECT SYS$O,RW,I .PSECT SYS$S,RW,D .ENDC ;$CALL .END .TITLE GPIB EXAMPLE PROGRAM ; EDIT 01/19/81 ; REV C: 01/01/82 ; EXAMPLE #1 HP3455A VOLTMETER ; PRECONDITIONS: ; GPIB INTERFACE INSTALLED AS SYSTEM CONTROLLER ; DRIVER PROGRAM EDITTED TO REFLECT GPIB INTERFACE SWITCH SETTINGS ; ; SET UP HP3455A VOLTMETER: ; TALK ONLY SWITCH OFF ; ADDRESS SELECTED (E.G. A5=1,A4=1,A3=0,A2=0,A1=0) ; ; MAKE DEVICE TABLE ENTRY IN IBUP MODULE: ; E.G., ; DEVICE 0130, 070, 0, 2, 012, 2 ;HP3455A SLOT 1 ; ; ASSEMBLE DRIVER AND UTILITY PROGRAMS ; ASSEMBLE EXAMPLE PROGRAM AND ; LINK TO DRIVER AND UTILITY PROGRAMS ; .MCALL .EXIT AC0=%0 .MACRO CALL SUB ARG1 ARG2 ARG3 ARG4 ARG5 ARG6 N=0 .IRP ARGN, .IF NB,ARGN MOV ARGN,-(SP) N=N+1 .ENDC .ENDR MOV #N,-(SP) MOV SP,R5 JSR PC,SUB ADD #2*,SP .ENDM CALL .GLOBL MAIN,IBUP,GPIB,ATOF,PRINTF MAIN: CALL IBUP #FOUR #MINUS1 TST R0 BMI REMERR CALL IBUP #TWO #ONE TST R0 BMI CLRERR CALL IBUP #ZERO #ONE #OBUF #SIX TST R0 BMI WRTERR SETF CLRF AC0 MOV #1,I LOOP: CMP I,#10 BGT ELOOP CALL IBUP #THREE #ONE TST R0 BMI TRGERR ;MAY HAVE TO WAIT HERE IF DEVICE REQUIRES TIME ;TO CAPTURE A MEASUREMENT CALL IBUP #ONE #ONE #IBUF #SIXTEN TST R0 BLE RDERR CALL ATOF #IBUF #X ADDF X,AC0 INC I BR LOOP ELOOP: DIVF FTEN,AC0 STF AC0,X CALL PRINTF #X .EXIT REMERR: HALT ;;ERROR SETTING REMOTE---CHECK SYSTEM CONTROLLER SWITCH CLRERR: HALT ;;ERROR SENDING DEVICE CLEAR---CHECK DEVICE TABLE ENTRIES WRTERR: HALT ;;ERROR SENDING DATA---CHECK DEVICE TABLE ENTRIES TRGERR: HALT ;;ERROR SENDING DEVICE TRIGGER---CHECK DEVICE TABLE ENTRIES RDERR: HALT ;;ERROR READING DATA---CHECK DEVICE TABLE ENTRIES MINUS1: -1 ZERO: 0 ONE: 1 TWO: 2 THREE: 3 FOUR: 4 SIX: 6 SIXTEN: 16. X: .BLKW 2 I: 0 FTEN: .FLT2 10. OBUF: .ASCII /F3R7T3/ IBUF: .BLKB 16. .EVEN ; THE EXISTENCE OF THE FOLLOWING ROUTINES IS ASSUMED: ; ATOF(STRING,X) WHICH CONVERTS AN ASCII STRING TO A FLOATING POINT NUMBER ; PRINTF(X) WHICH CONVERTS A FLOATING POINT NUMBER TO ASCII AND PRINTS IT OUT .END MAIN C EXAMPLE #1 HP3455A VOLTMETER C EDIT 09/01/81 C REV C: 01/01/82 C PRECONDITIONS: C GPIB INTERFACE INSTALLED AS SYSTEM CONTROLLER C DRIVER PROGRAM EDITTED TO REFLECT GPIB INTERFACE SWITCH SETTINGS C C SET UP HP3455A VOLTMETER: C TALK ONLY SWITCH OFF C ADDRESS SELECTED (E.G. A5=1,A4=1,A3=0,A2=0,A1=0) C C MAKE DEVICE TABLE ENTRY IN IBUP MODULE: C E.G., C DEVICE 0130, 070, 0, 2, 012, 2 ;HP3455A SLOT 1 C C ASSEMBLE DRIVER AND UTILITY PROGRAMS C COMPILE FORTRAN PROGRAM AND C LINK TO DRIVER AND UTILITY PROGRAMS C BYTE V(16) C PUT ALL DEVICES IN REMOTE MODE WITH LOCAL LOCKOUT J=IBUP(4,-1) C CLEAR THE VOLTMETER J=IBUP(2,1) C PUT HP3455A IN FAST AC VOLTS, AUTO RANGE, HOLD/MANUAL TRIGGER J=IBUP(0,1,'F3R7T3',6) C AVERAGE TEN READINGS AND PRINT THE RESULT S=0.0 DO 10 I=1,10 C TRIGGER THE VOLTMETER J=IBUP(3,1) C READ THE VOLTAGE J=IBUP(1,1,V,16) DECODE(J,100,V) X 100 FORMAT(E14.5) S=S+X 10 CONTINUE X=S/10.0 PRINT 999, X 999 FORMAT('AVERAGE=',E14.5) END 10 REM EXAMPLE #1 HP3455A VOLTMETER 20 REM EDIT 01/19/81 21 REM REV C: 01/01/82 25 REM PRECONDITIONS: 30 REM GPIB INTERFACE INSTALLED AS SYSTEM CONTROLLER 40 REM DRIVER PROGRAM EDITTED TO REFLECT GPIB INTERFACE SWITCH SETTINGS 50 REM 60 REM SET UP HP3455A VOLTMETER: 70 REM TALK ONLY SWITCH OFF 80 REM ADDRESS SELECTED (E.G. A5=1,A4=1,A3=0,A2=0,A1=0) 90 REM 100 REM MAKE DEVICE TABLE ENTRY 105 REM E.G., 110 REM DEVICE 0130, 070, 0, 2, 012, 2 ;HP3455A SLOT 1 120 REM 130 REM ASSEMBLE DRIVER AND UTILITY PROGRAMS 140 REM LINK DRIVER AND UTILITY PROGRAMS TO BASIC (REF. BASIC MANUAL) 150 REM 160 REM PUT ALL DEVICES IN REMOTE MODE WITH LOCAL LOCKOUT 170 CALL "IBUP"(4,-1) 180 REM CLEAR THE VOLTMETER 190 CALL "IBUP"(2,1) 200 REM PUT HP3455A IN FAST AC VOLTS, AUTO RANGE, HOLD/MANUAL TRIGGER 210 CALL "IBUP"(0,1,'F3R7T3') 220 REM AVERAGE TEN READINGS AND PRINT THE RESULT 230 S=0 240 FOR I=1 TO 10 250 REM TRIGGER THE VOLTMETER 260 CALL "IBUP"(3,1) 270 REM READ THE VOLTAGE 280 CALL "IBUP"(1,1,V$,16) 290 S=S+VAL(SEG$(V$,1,13)) 300 NEXT I 310 PRINT S/10 320 END .enabl lc .title IBV2 - GPIB11V-2 RT11 Driver .nlist bex, ttm, cnd .list me ; Rev. D.10 ; This software is provided solely for use with ; the National Instruments GPIB11V-2 ; Copyright 1980 National Instruments ; Jeffrey Kodosky ; May 1980 ; Edit 09/01/81 ; REV C: 01/01/82 ; V1: 11/12/82 Corrected to run under the XM monitor ; REV D: 12/14/82 ; V1: 01/21/83 SPBYTE needs to be conditional on ONLYC ; V2: 04/06/83 Timeout support added. ; V3: 07/14/83 Timeout error repaired. ; V4: 01/01/85 Corrected BCR read discrepancy. ; V5: 09/04/85 Timer block updated. ; rsv not cleared when IFC occurs. ; Edit the following assignments to reflect the GPIB11V-2 switch settings UADDR= 0167710 ; Q-BUS address VECT= 0310 ; Vector address PRI= 0240 ; Interrupt priority PPENAB= 1 ; 1 to include PP code, 0 to eliminate PP code TRI= 0 ; 4 for Three-state highspeed, 0 for Normal timing SAC= 1 ; 1 for System Controller, 0 for Not System Controller EXT= 1 ; 2 for Extended, 1 for Normal GPIB addressing MSA= 0140 ; Msa&037 for Extended, 0140 for Normal GPIB addressing MA= 025 ; GPIB address ; Edit the following assignments to reflect the desired software environment ONLYC= 0 ; 0 for more than one Controller on the GPIBus, 1 for a single Controller on the GPIBus ; (ONLYC implies SAC, i.e., only a single Controller on the GPIBus means ; that the GPIB11V-2 is the System Controller) PS= 0177776 .macro Exclude mfps psave mtps #PRI .endm Exclude .macro Unexclude mtps psave .endm Unexclude INACTIVE= 0 ; Software controller states IDLE= 1 INCHARGE= 2 STANDBY= 3 CADS= 4 GO= 1 ; Control/status register bits OUT= 2 SEL= 4 ECC= 010 IE= 0100 LMR= 0200 DONE= 0200 CIC= 0400 ATN= 01000 EOI= 02000 OCSW= 02000 TCS= 04000 DAV= 04000 SRQIE= 010000 SRQ= 010000 INT= 020000 DMAENAB=020000 NEX= 040000 REN= 040000 IFC= 0100000 DIR= 0 ; Internal register addresses DOR= 0 ISR1= 1 IMR1= 1 ISR2= 2 IMR2= 2 SPS= 3 SPM= 3 ADS= 4 ADM= 4 CPT= 5 AUX= 5 AD0= 6 ADR= 6 AD1= 7 EOS= 7 ERRIE= 4 ; Internal register bits ENDIE= 020 CPTIE= 0200 DMAI= 020 DMAO= 040 SRQS= 0100 RSV= 0100 TA= 2 LA= 4 LON= 0100 TON= 0200 DL= 040 DT= 0100 ARS= 0200 .CLKR= 040 ; Hidden register addresses & offsets .PPR= 0140 .AUXA= 0200 .AUXB= 0240 CLKR= 0 PPR= 1 AUXA= 2 AUXB= 3 U= 020 ; Hidden register bits BIN= 020 S= 010 REOS= 4 HLDE= 2 HLDA= 1 CPTENAB=1 PACS= 1 ; Software status bits MON= 2 TIM= 4 IST= 011 ; Special interface functions NIST= 1 VSC= 017 NVSC= 7 SEOI= 6 FH= 3 IR= 2 PON= 0 OK= 1 ASYNOP= 0 ; Error codes ENONE= -1 ; No command byte available (READCOMMAND) ECACFLT= -2 ; ATN not unasserted after IFC sent (bus problem) ENOTCAC= -3 ; Not Active Controller for operation requiring CAC (software problem) ENOTSAC= -4 ; Not System Controller for operation requiring SAC (software problem) EIFCLR= -5 ; IFC caused operation to abort (bus problem) ETIMO= -6 ; Operation did not complete within allotted time (bus problem) ENOFUN= -7 ; Non-existent function code (software problem) ENOIBDEV= -9. ; No Listeners addressed or no devices connected (bus problem) EIDMACNT= -10. ; Internal DMA completed without bcr going to 0 (hardware problem) ENOPP= -11. ; PP operation attempted on three-state GPIB (software problem) EITIMO= -12. ; Internal DMA did not complete within allotted time (hardware problem) EINEXM= -13. ; Internal DMA aborted due to non-existent memory (software/hardware problem) ENEXMEM= -14. ; GPIB DMA aborted due to non-existent memory (software/hardware problem) ECNTRS= -15. ; Bar and bcr are inconsistent following GPIB DMA (hardware problem) ECADS= -18. ; ATN not unasserted after control passed (bus problem) RQCSTB= ; Service request status bytes RQTSTB= RQLSTB= RQC= 1 ; Asynchronous op codes CAC= 2 TAC= 3 LAC= 4 WSRQ= 5 TCT= 011 ; GPIB multiline messages PPC= 5 PPU= 025 SCG= 0140 IN= 0 ITIMO= 25 ; Internal loopcount timeout GTIMO= 10. ; Default GPIB timeout in seconds BSIZ= 040 ; Monitor buffer size RD= WT= RDIR= WTIR= .mcall .drdef, .inten .drdef IB, 370, spfun$, 0, UADDR, VECT .asect . = 0 bcr: .blkw 1 ;struct ibv2 { bar: .blkw 1 ; int bcr, bar, csr; /* Unibus registers */ csr: .blkw 1 ; char ccf, xba; ccf: .blkb 1 ; char hidden[4]; /* Hidden registers */ xba: .blkb 1 ; char internal[8]; /* Internal registers */ hidden: .blkb 4 internal:.blkb 8. cstate: .blkb 1 ; char cstate; istr: .blkb 1 ; char istr; op: .blkb 1 ; char op; .even ans: .blkw 1 ; int ans; timo: .blkw 1 ; int timo; /* Watchdog timer */ owner: .blkw 1 ; int owner; /* GPIB owning process */ rdbcr: .blkw 1 ; int rdbcr, rdbar, rdcsr; rdbar: .blkw 1 rdcsr: .blkw 1 rdintern:.blkb 8. ; char rdinternal[8]; .if eq,ONLYC mbuf: .blkb BSIZ ; char mbuf[BSIZ]; .even iidx: .blkw 1 ; int iidx, oidx, cnt; oidx: .blkw 1 cnt: .blkw 1 .endc IBSLEN: ; } ib; r0= %0 r1= %1 r2= %2 r3= %3 r4= %4 r5= %5 sp= %6 pc= %7 .if ne,MMG$T .mcall .synch MONLOW= 54 QCOMP= 270 .endc .macro SU instr src dst instr ibv2+src,@#UADDR+dst .endm SU .macro US instr src dst instr @#UADDR+src,ibv2+dst .endm US .macro xU instr src dst instr src,@#UADDR+dst .endm xU .macro Ux instr src dst .if nb,dst instr @#UADDR+src,dst .iff instr @#UADDR+src .endc .endm Ux .macro SS instr src dst instr ibv2+src,ibv2+dst .endm SS .macro xS instr src dst instr src,ibv2+dst .endm xS .macro Sx instr src dst .if nb,dst instr ibv2+src,dst .iff instr ibv2+src .endc .endm Sx .macro addr loc dst mov pc,dst add #loc-.,dst .endm addr .macro Xfer rw a n r xU mov #-+,bcr mov ibv2xmem,r0 mov ibv2phys,r1 add #a,r1 bcc .+4 inc r0 ; propagate carry to xba xU mov r1,bar swab r0 Sx bisb ccf,r0 xU mov r0,ccf Sx mov csr,r0 bic #^C,r0 bis #rw,r0 xU mov r0,csr jsr pc,iwait .endm Xfer .macro cjmp t f .macro j't' a ?b b'f' b jmp a b: .endm j't' .macro j'f' a ?b b't' b jmp a b: .endm j'f' .endm cjmp .irp j,<,> cjmp j .endr NFNS= 17. .psect ibdvr begin= . .drbeg ib ;gpib(f,a1,a2) Exclude ; Exclude; Sx clr ans ; ib.ans= 0; Sx tstb cstate ; if(ib.cstate==INACTIVE && (x=init())<0) goto quit bne 1$ jsr pc,init bcs 9$ 1$: .if ne,TIM$IT Unexclude jsr pc,sttimo Exclude .endc mov ibcqe,r5 ; if(f<0 || f>=NFNS) x= ENOFUN; movb Q$FUNC(r5),r0 bne 2$ mov #-3,r0 tst Q$WCNT(r5) bpl 2$ inc r0 neg Q$WCNT(r5) 2$: com r0 cmp r0,#NFNS bhis 8$ asl r0 ; else x= (*ibfn[f])(a1,a2); jsr r0,@pc add #ibfn-.,r0 add r0,@sp add @(sp)+,r0 jsr pc,@r0 br 9$ 8$: mov #ENOFUN,r0 9$: ;quit: tst r0 ; if(x==ASYNOP) wait(); beq 3$ xS mov r0,ans Unexclude br ibcmpl ; else iodone(x); 3$: Unexclude rts pc ibfn: ;int (*ibfn[])()= { command - ibfn ; &command, &write, &read, &transfer, write - ibfn ; &clear, &remote, &local, ¶llel, read - ibfn ; &passcontrol, &setstatus, &monitor, &readcommand, transfer - ibfn ; &setparameters, &testsrq, &finish }; clear - ibfn remote - ibfn local - ibfn parallel - ibfn passcontrol - ibfn setstatus - ibfn monitor - ibfn readcommand - ibfn setparameters - ibfn testsrq - ibfn finish - ibfn status - ibfn spbyte - ibfn .if ne,TIM$IT ibtimo: mov (sp),-(sp) clr 2(sp) mtps #7*40 .inten 0,pic mov r0,-(sp) mov r1,-(sp) jsr pc,ibstop mov (sp)+,r1 mov (sp)+,r0 xS bicb #TIM,istr ;jmp ibcmpl .endc ibcmpl: mov ibcqe,r5 beq 3$ .if ne,TIM$IT jsr pc,cltimo .endc Sx tst ans bpl 1$ bis #hderr$,@Q$CSW(r5) 1$: tst (r5) beq 2$ .if ne,MMG$T mov (r5),syncr0 movb Q$JNUM(r5),r5 asr r5 asr r5 asr r5 mov r5,syncjb addr ibcqe,r4 mov @#MONLOW,r5 jsr pc,@QCOMP(r5) .synch sync,PIC br 11$ bis #30000,@#PS Sx mov ans,-(sp) mtpi (r0) 11$: rts pc .iff Sx mov ans,@0(r5) .endc 2$: .drfin ib 3$: rts pc init: ;init() char *cp; .if ne,MMG$T KISAR0= 172340 addr ibv2,r2 mov r2,r1 bic #160000,r2 ash #-12.,r1 bic #177761,r1 mov KISAR0(r1),r1 ashc #6,r0 add r2,r1 adc r0 .iff addr ibv2,r1 clr r0 .endc mov r1,ibv2phys mov r0,ibv2xmem Sx clr csr ; ib.csr= 0; IB->csr= LMR; xU mov #LMR,csr addr ibv2+hidden,r0 ; cp= &ib.hidden[0]; movb #.CLKR+5,(r0)+ ; *cp++= _CLKR | 5; movb #.PPR+U,(r0)+ ; *cp++= _PPR | U; movb #.AUXA,(r0)+ ; *cp++= _AUXA; ; *cp++= _AUXB | TRI | CPT_ENAB; movb #.AUXB+TRI+CPTENAB,(r0)+ ; cp= &ib.internal[0]; clrb (r0)+ ; *cp++= 0; movb #CPTIE+ERRIE,(r0)+; *cp++= CPT_IE | ERR_IE; clrb (r0)+ ; *cp++= 0; clrb (r0)+ ; *cp++= 0; movb #EXT,(r0)+ ; *cp++= EXT; ; *cp++= ib.hidden[CLKR]; Sx movb hidden+CLKR,(r0)+ movb #ARS+MSA,(r0)+ ; *cp++= ARS | MSA; clrb (r0)+ ; *cp++= 0; clr (r0)+ ; ib.cstate = ib.istr = 0; clr (r0)+ ; ib.op= 0; clr (r0)+ ; ib.ans= 0; mov #GTIMO,(r0)+ ; ib.timo= GTIMO; jsr pc,irload ; if((x=irload())<0) return x; bcs 10$ xS movb #IDLE,cstate ; ib.cstate= IDLE; xS mov #IE,csr ; IB->csr= ib.csr= IE; xU mov #IE,csr .if eq,ONLYC Sx clr iidx ; ib.iidx= ib.oidx= ib.cnt= 0; Sx clr oidx Sx clr cnt .endc clr r0 ; return 0; 10$: rts pc ibstop: ;ibstop() xS bic #DMAENAB+GO,csr ; IB->csr= (ib.csr=& ~(DMA_ENAB|GO)); SU mov csr,csr US mov bcr,rdbcr ; ib.rdbcr= IB->bcr; US mov bar,rdbar ; ib.rdbar= IB->bar; .if eq,ONLYC clr r0 jsr pc,rqs ; if(rqs(0)>=0) ib.ans= ETIMO; bcs 1$ .endc xS mov #ETIMO,ans 1$: Sx clrb op ; ib.op= 0; rts pc irload: ;irload() if((x=xfer(WTIR,&ib.internal[ISR1],7,ISR1))<0) return x; Xfer WTIR internal+ISR1 7 ISR1 bcs 10$ ; ib.internal[AUX]= ib.hidden[AUXA]; SS movb hidden+AUXA,internal+AUX xS movb #MA,internal+ADR; ib.internal[ADR]= MA; ; if((x=xfer(WTIR,&ib.internal[AUX],2,AUX))<0) return x; Xfer WTIR internal+AUX 2 AUX bcs 10$ ; if((x=xfer(WTIR,&ib.hidden[AUXB],1,AUX))<0) return x; Xfer WTIR hidden+AUXB 1 AUX bcc lun0 ; return lun(ib.internal[ADM]); 10$: rts pc lun: ;lun(newadm) /* Note: rsv is cleared and not restored*/ xS cmpb r0,internal+ADM ; if(ib.internal[ADM]==newadm) return OK; beq .9$ xS movb r0,internal+ADM ; ib.internal[ADM]= newadm; lun0: Sx clrb internal+AUX ;lun0: ib.internal[AUX]= PON; ; if((x=xfer(WTIR,&ib.internal[ADM],2,ADM))<0) return x; Xfer WTIR internal+ADM 2 ADM bcs .10$ .if eq,ONLYC .if ne,PPENAB Xfer WTIR hidden+PPR 1 AUX bcs .10$ ; if((x=xfer(WTIR,&ib.hidden[PPR],1,AUX))<0) return x; xS bitb #S,istr ; if(ib.istr&S) beq .9$ ; return ldaux(IST); mov #IST,r0 jsr pc,ldaux bcs .10$ .endc .endc .9$: clr r0 ; return OK; inc r0 .10$: rts pc command: ;command(bp,n) char bp[n]; jsr pc,tcs. ; if((x=tcs())<0) bcc 3$ .if eq,ONLYC tst Q$WCNT(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ mov #RQCSTB,r0 ; if((x=rqs(RQC_STB))<0) return x; jsr pc,rqs bcs 1$ xS movb #RQC,op ; ib.op= RQC; jsr pc,ldr ; ldr(bp,n); clr r0 ; return ASYNOP; 1$: ; else .endc rts pc ; return x; 3$: mov #TON,r0 ; if((x=lun(TON))<0) return x; jsr pc,lun bcs 10$ tst Q$WCNT(r5) ; if(n==0) return OK; beq 9$ xS movb #CAC,op ; ib.op= CAC; xS bic #ECC,csr ; return xfer(WT,bp,n,0); jmp wtxfer 9$: mov #OK,r0 10$: rts pc write: ;write(bp,n) char bp[n]; mov #TON,r0 ; if((x=gts(TON))<0) jsr pc,gts bcc 3$ .if eq,ONLYC tst Q$WCNT(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ jsr pc,rdads ; if((x=rdads())<0) return x; bcs 10$ xS bitb #TA,rdintern+ADS; if((ib.rdinternal[ADS]&TA)==0) bne 3$ mov #RQTSTB,r0 ; if((x=rqs(RQT_STB))<0) return x; jsr pc,rqs bcc 3$ ; else 1$: .endc rts pc ; return x; 3$: tst Q$WCNT(r5) ; if(n==0) return OK; beq 9$ xS movb #TAC,op ; ib.op= TAC; xS bitb #2,internal beq 4$ ; return xfer(WT,bp,n,(ib.internal[0]&2? SEOI:0)); xS bis #ECC,csr xS movb #SEOI,ccf br wtxfer 4$: xS bic #ECC,csr br wtxfer 9$: mov #OK,r0 10$: rts pc wtxfer: xS bis #WT,csr jsr pc,ldr mov #DMAO,r0 br ibxfer rdxfer: xS bic #OUT,csr xS bis #RD,csr jsr pc,ldr mov #DMAI,r0 ibxfer: ;xfer(rw,bp,n,ccfn) char bp[n]; ; if(ccfn) ib.ccf= ccfn; ib.csr=| ECC; ; else ib.csr=& ~ECC; ; ldr(bp,n); ib.csr= ib.csr&~OUT | rw; ibxfr0: xS cmpb r0,internal+IMR2; x= rw&OUT? DMAO:DMAI; beq 1$ ; if(x!=ib.internal[IMR2]) xS movb r0,internal+IMR2; ib.internal[IMR2]= x; Xfer WTIR internal+IMR2 1 IMR2 bcc 1$ ; if((x=xfer(WTIR,&ib.internal[IMR2],1,IMR2))<0) Sx clr op ; ib.op= 0; br 10$ ; return x; 1$: SU mov bcr,bcr ; IB->bcr= ib.bcr; SU mov bar,bar ; IB->bar= ib.bar; SU mov ccf,ccf ; IB->ccf= ib.ccf; IB->xba= ib.xba; SU mov csr,csr ; IB->csr= ib.csr; clr r0 ; return ASYNOP; 10$: rts pc read: ;read(bp,n) char bp[n]; mov #LON,r0 ; if((x=gts(LON))<0) jsr pc,gts bcc 3$ .if eq,ONLYC tst Q$WCNT(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ jsr pc,rdads ; if((x=rdads())<0) return x; bcs 10$ xS bitb #LA,rdintern+ADS; if((ib.rdinternal[ADS]&LA)==0) bne 3$ mov #RQLSTB,r0 ; if((x=rqs(RQL_STB))<0) return x; jsr pc,rqs bcc 3$ ; else 1$: .endc rts pc ; return x; 3$: tst Q$WCNT(r5) ; if(n==0) return OK; beq 9$ Sx movb internal,r0 ; if(ib.internal[0]&2<<4) ib.hidden[AUXA]=| REOS | (ib.internal[0]&1<<4? 0:BIN); bitb #2*16.,r0 beq 4$ xS bisb #REOS,hidden+AUXA bitb #1*16.,r0 bne 4$ xS bisb #BIN,hidden+AUXA 4$: bitb #4*16.,r0 ; if(ib.internal[0]&4<<4) ib.internal[IMR1]=& ~END_IE; beq 41$ xS bicb #ENDIE,internal+IMR1 br 42$ ; else ib.internal[IMR1]=| END_IE; 41$:xS bisb #ENDIE,internal+IMR1 Sx cmpb cstate,#STANDBY ; if(ib.cstate==STANDBY) bne 42$ xS bisb #HLDE,hidden+AUXA; ib.hidden[AUXA]=| HLDE; 42$:SS movb hidden+AUXA,internal+AUX ; ib.internal[AUX]= ib.hidden[AUXA]; Xfer WTIR internal+IMR1 7 IMR1 bcs 10$ ; if((x=xfer(WTIR,&ib.internal[IMR1],7,IMR1))<0) return x; xS movb #LAC,op ; ib.op= LAC; Sx movb hidden+AUXA,r0 ; if(ib.cstate==STANDBY) x= ib.hidden[AUXA]= ib.hidden[AUXA]&~HLDE|HLDA; Sx cmpb cstate,#STANDBY ; else x= 0; bne 5$ ; return xfer(RD,bp,n,x); xS bis #ECC,csr bic #HLDE,r0 bis #HLDA,r0 xS movb r0,ccf xS movb r0,hidden+AUXA br 6$ 5$: xS bic #ECC,csr 6$: jmp rdxfer 9$: mov #OK,r0 10$: rts pc transfer: ;transfer() mov #EXT,r0 ; if((x=gts(EXT))<0) return x; jsr pc,gts bcs 10$ mov #OK,r0 ; return OK; 10$: rts pc clear: ;clear() jsr pc,unhold ; if((x=unhold())<0) return x; bcs 10$ .if ne,SAC Sx mov csr,r0 ; IB->csr= ib.csr | IFC; bis #IFC,r0 xU mov r0,csr jsr pc,wait100 ; wait100us(); xU bit #ATN,csr ; if(IB->csr&ATN) beq 1$ mov #ECACFLT,r0 ; return ECACFLT; br 10$ 1$: xS movb #INCHARGE,cstate; ib.cstate= INCHARGE; xS bis #ATN+SRQIE+CIC,csr SU mov csr,csr ; IB->csr= (ib.csr=| ATN | SRQ_IE | CIC); mov #TON,r0 ; return lun(TON); jmp lun .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc 10$: rts pc remote: ;remote() .if ne,SAC xS bis #REN,csr ; IB->csr= (ib.csr=| REN); SU mov csr,csr mov #OK,r0 ; return OK; .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc rts pc local: ;local() .if ne,SAC xS bic #REN,csr ; IB->csr= (ib.csr=& ~REN); SU mov csr,csr mov #OK,r0 ; return OK; .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc rts pc parallel: ;parallel() .if ne,PPENAB jsr pc,tcs. ; if((x=tcs())<0) return x; bcs 10$ mov #LON,r0 ; if((x=lun(LON))<0) return x; jsr pc,lun bcs 10$ xS bis #EOI,csr ; IB->csr= (ib.csr=| EOI); SU mov csr,csr Xfer RDIR rdintern+CPT 1 CPT bcs 10$ ; if((x=xfer(RDIR, &ib.rdinternal[CPT],1,CPT))<0) return x; xS bic #EOI,csr ; IB->csr= (ib.csr=& ~EOI); SU mov csr,csr ; IB->csr= ib.csr; mov #400,r0 ; return ib.rdinternal[CPT] | 0400; Sx bisb rdintern+CPT,r0 .iff mov #ENOPP,r0 ; return ENOPP; .endc 10$: rts pc passcontrol: ;passcontrol() .if eq,ONLYC Sx cmpb cstate,#INCHARGE; if(ib.cstate!=INCHARGE) beq 1$ mov #ENOTCAC,r0 ; return ENOTCAC; br 10$ 1$: movb #EXT,r0 ; if((x=lun(EXT))<0) return x; jsr pc,lun bcs 10$ xS bic #SRQIE+ATN+CIC,csr SU mov csr,csr ; IB->csr= (ib.csr=& ~(SRQ_IE | ATN | CIC)); xS movb #IDLE,cstate ; ib.cstate= IDLE; mov #OK,r0 ; return OK; .iff mov #ENOIBDEV,r0 ; return ENOIBDEV; .endc 10$: rts pc setstatus: ;setstatus(s) .if eq,ONLYC .if ne,PPENAB xS bitb #S,istr ; if((ib.istr&S) ^^ s) bne 2$ tst Q$WCNT(r5) beq 9$ xS bisb #S,istr mov #IST,r0 br 5$ 2$: tst Q$WCNT(r5) bne 9$ xS bicb #S,istr mov #NIST,r0 5$: jsr pc,ldaux ; return ldaux((ib.istr=^ S)? IST : NIST); bcs 10$ .endc .endc 9$: mov #OK,r0 ; return OK; 10$: rts pc monitor: ;monitor(m) .if eq,ONLYC tst Q$WCNT(r5) ; if(m) ib.istr=| MON; beq 1$ xS bisb #MON,istr br 5$ 1$: xS bicb #MON,istr ; else ib.istr=& ~MON; 5$: .endc mov #OK,r0 ; return OK; rts pc readcommand: ;readcommand() .if eq,ONLYC clr r0 Sx tst cnt ; if(ib.cnt<=0) return ENONE; ble 9$ Sx dec cnt ; ib.cnt--; addr ibv2+mbuf,r1 ; x= ib.mbuf[ib.oidx++]; Sx add oidx,r1 bisb @r1,r0 Sx inc oidx Sx cmp oidx,#BSIZ ; if(ib.oidx>=BSIZ) ib.oidx= 0; blt 5$ Sx clr oidx 5$: bis #400,r0 ; return x|0400; br 10$ 9$: dec r0 10$: rts pc .iff mov #ENONE,r0 ; return ENONE; rts pc .endc setparameters: ;setparameters(xrmd,eod,timo) .if eq,MMG$T mov Q$BUFF(r5),r4 xS movb (r4)+,internal ; ib.internal[0]= xrmd; xS movb (r4)+,internal+EOS; ib.internal[EOS]= eod; xS movb (r4),timo ; ib.timo= timo; .iff mov r5,r4 jsr pc,@$gtbyt xS movb (sp)+,internal ; ib.internal[0]= xrmd; jsr pc,@$gtbyt xS movb (sp)+,internal+EOS; ib.internal[EOS]= eod; jsr pc,@$gtbyt xS movb (sp)+,timo ; ib.timo= timo; .endc mov #OK,r0 ; return OK; rts pc testsrq: ;testsrq(wait) mov #OK,r0 ; if(IB->csr&SRQ) return OK; xU bit #SRQ,csr bne 10$ neg r0 xS bit #CIC,csr ; if(ib.csr&CIC) IB->csr= (ib.csr=| SRQ_IE); beq 10$ xS bis #SRQIE,csr SU mov csr,csr tst Q$WCNT(r5) ; if (wait) { beq 10$ xS movb #WSRQ,op ; ib.op = WSRQ clr r0 ; return ASYNOP; } 10$: rts pc ; return ENONE; finish: ;finish() Sx clrb cstate ; ib.cstate= INACTIVE; Sx clr csr ; ib.csr= 0; xU mov #LMR,csr ; IB->csr= LMR; mov #OK,r0 ; return OK; rts pc spbyte: .if eq, ONLYC clr r0 jsr pc,rqs bcs 10$ mov Q$WCNT(r5),r0 jsr pc,rqs bcs 10$ .endc mov #OK,r0 10$: rts pc status: ;status (buf, count) mov r5,r4 mov r2,-(sp) ; (save r2) addr ibv2,r2 mov r2,r0 mov Q$WCNT(r5),r1 cmp r1,#IBSLEN blos 1$ mov #IBSLEN,r1 1$: mov r1,-(sp) ; (this will be the return value) add r0,r1 mov Q$BUFF(r5),r0 2$: cmp r2,r1 beq 3$ .if ne,MMG$T movb (r2)+,-(sp) jsr pc,@$ptbyt .iff movb (r2)+,(r0)+ .endc br 2$ 3$: mov (sp)+,r0 ; return count; bne 4$ mov #OK,r0 4$: mov (sp)+,r2 ; (replace r2) rts pc abort: mov r0,-(sp) mov r1,-(sp) jsr pc,ibstop .if ne,TIM$IT jsr pc,cltimo .endc mov (sp)+,r1 mov (sp)+,r0 .drfin ib ;ibint() .drast ib, , abort Sx movb op,-(sp) mov r0,-(sp) mov r1,-(sp) jsr pc,ibint0 ibintxt:mov (sp)+,r1 mov (sp)+,r0 tstb (sp)+ beq 1$ Sx tstb op jeq ibcmpl 1$: rts pc ibint0: mov ibcqe,r5 US mov csr,rdcsr ;ib.rdcsr= IB->csr; US mov bcr,rdbcr ;ib.rdbcr= IB->bcr; US mov bar,rdbar ;ib.rdbar= IB->bar; .if eq,SAC Sx tst rdcsr ;if(ib.rdcsr&IFC) bpl 5$ xS bic #DMAENAB+SRQIE+ATN+CIC+GO,csr SU mov csr,csr ; IB->csr= (ib.csr=& ~(DMA_ENAB|SRQ_IE|ATN|CIC|GO)); Sx tstb cstate ; if(ib.cstate!=INACTIVE) beq 4$ xS movb #IDLE,cstate ; ib.cstate= IDLE; ; ib.hidden[AUXA]= _AUXA; xS movb #.AUXA,hidden+AUXA xS movb #FH,internal+AUX; ib.internal[AUX]= FH; xS movb #EXT,internal+ADM; ib.internal[ADM]= EXT; Sx clrb internal+IMR2 ; ib.internal[IMR2]= 0; jsr pc,irload ; if(irload()>=0) ib.ans= EIFCLR; bcs 3$ movb #EIFCLR,r0 3$: xS mov r0,ans 4$: Sx clrb op ; ib.op= 0; rts pc ; return; 5$: .endc chksrq: ;if((IB->csr&SRQ) && (ib.csr&SRQ_IE)) xS bit #SRQ,rdcsr beq 5$ xS bit #SRQIE,csr beq 5$ xS bic #SRQIE,csr ; IB->csr= (ib.csr=& ~SRQ_IE) & ~GO; Sx mov csr,r0 bic #GO,r0 xU mov r0,csr xS cmpb #WSRQ,op bne 1$ mov #OK,r0 jmp quit 1$: Sx tst owner ; if(ib.owner) psignal(ib.owner,SRQINT); beq 5$ ; signal owner 5$: chkint: xS bit #INT,rdcsr ;if(IB->csr&INT) jeq chkdone Ux mov bcr,r1 ;x= IB->bcr; Sx mov csr,r0 ; IB->csr= ib.csr & ~(DMA_ENAB|GO); bic #DMAENAB+GO,r0 xU mov r0,csr US mov csr,rdcsr ;ib.rdcsr= IB->csr; US mov bcr,rdbcr ;ib.rdbcr= IB->bcr; Sx tst rdbcr bne 14$ tst r1 beq 15$ 14$: Sx dec rdbcr 15$: US mov bar,rdbar ;ib.rdbar= IB->bar; Xfer RDIR rdintern+ISR1 5 ISR1 jcs quit ; if((x=xfer(RDIR,&ib.rdinternal[ISR1],5,ISR1))<0) goto quit; xS bitb #ERRIE,rdintern+ISR1 beq 1$ ; if(ib.rdinternal[ISR1]&ERR_IE) ib.ans= ENOIBDEV; xS mov #ENOIBDEV,ans jmp chkdone 1$: .if eq,ONLYC ; else if(ib.rdinternal[ISR1]&CPT_IE) xS bitb #CPTIE,rdintern+ISR1 beq 10$ Sx movb rdintern+CPT,r0 ; mbfsto(ib.rdinternal[CPT]); jsr pc,mbfsto .if ne,PPENAB xS bitb #PACS,istr ; if((ib.istr&PACS) && ib.rdinternal[CPT]>=SCG) beq 2$ xS bicb #PACS,istr ; ib.istr=& ~PACS; cmpb r0,#SCG blt 2$ xS movb r0,hidden+PPR ; ib.hidden[PPR]= ib.rdinternal[CPT]; br 8$ ; goto lpe; .endc 2$: cmpb r0,#TCT ; switch(ib.rdinternal[CPT]) bne 5$ ; case TCT: xS bitb #TA,rdintern+ADS; if((ib.rdinternal[ADS]&TA)==0) break; beq 9$ jsr pc,valid ; if((x=valid())<0) goto quit; jcs quit xS movb #CADS,cstate br chkdone ; break; 5$: .if ne,PPENAB cmpb r0,#PPC ; case PPC: bne 6$ xS bitb #LA,rdintern+ADS; if(ib.rdinternal[ADS]&LA) beq 6$ xS bisb #PACS,istr ; ib.istr=| PACS; br 9$ ; break; 6$: cmpb r0,#PPU ; case PPU: bne 9$ ; ib.hidden[PPR]= _PPR | U; xS movb #.PPR+U,hidden+PPR 8$: Xfer WTIR hidden+PPR 1 AUX jcs quit ; lpe: if((x=xfer(WTIR,&ib.hidden[PPR],1,AUX))<0) goto quit; ; break; .endc 9$: jsr pc,valid ; if((x=valid())<0) goto quit; jcs quit 10$: .endc xS bitb #ENDIE,internal+IMR1; if(ib.internal[IMR1]&END_IE) beq chkdone ; ib.internal[IMR1]=& ~END_IE; xS bicb #ENDIE,internal+IMR1 Xfer WTIR internal+IMR1 1 IMR1 jcs quit ; if((x=xfer(WTIR,&ib.internal[IMR1],1,IMR1))<0) goto quit; chkdone: ;chkdone: Sx tstb rdcsr ;if((IB->csr&DONE) && (ib.csr&GO)) bpl chktct xS bit #GO,csr beq chktct Sx dec csr ; ib.csr=& ~GO; xS bit #NEX,rdcsr ; if(ib.rdcsr&NEX) ib.ans= ENEXMEM; beq 2$ xS mov #ENEXMEM,ans 2$: .if eq,ONLYC clr r0 ; if((x=rqs(0))<0) goto quit; jsr pc,rqs bcs quit .endc Sx mov rdbcr,r0 ; x= ib.rdbcr - ib.bcr; /* number of bytes transferred */ Sx sub bcr,r0 SS sub bar,rdbar ; if(ib.rdbar - ib.bar != x) x= ECNTRS; Sx cmp rdbar,r0 beq 3$ mov #ECNTRS,r0 3$: Sx tst ans ; if(ib.ans==0) bne wake quit: ;quit: ib.ans= x; xS mov r0,ans wake: Sx clrb op ; ib.op= 0; rts pc chktct: .if eq,ONLYC Sx cmpb op,#RQC ;else if(ib.op==RQC && (IB->csr&CIC)) bne 10$ xU bit #CIC,csr beq 10$ mov #TON,r0 ; if((x=lun(TON))<0) goto quit; jsr pc,lun bcs quit xS movb #CAC,op ; ib.op= CAC; mov #DMAO,r0 xS bic #ECC,csr ; if((x=xfer(WT,ib.bar,ib.bcr,0))<0) xS bis #WT,csr jsr pc,ibxfr0 bcs quit ; goto quit; .endc 10$: rts pc ;return; gts: ;gts(newadm) mov r0,-(sp) jsr pc,uncads ; if((x=uncads())<0) return x; bcs 2$ jsr pc,unhold ; if((x=unhold())<0) return x; 2$: mov (sp)+,r1 bcs 10$ mov r1,r0 Sx cmpb cstate,#STANDBY ; if(ib.cstate==STANDBY) bne 1$ Sx cmpb internal+ADM,r0 ; return (ib.internal[ADM]==newadm)? 0:ENOIBDEV; beq 9$ mov #ENOIBDEV,r0 br 12$ 1$: Sx cmpb cstate,#IDLE ; if(ib.cstate==IDLE) return ENOTCAC; beq 11$ jsr pc,lun ; if((x=lun(newadm))<0) return x; bcs 10$ xS bic #ATN,csr ; IB->csr= (ib.csr=& ~ATN); SU mov csr,csr xS movb #STANDBY,cstate ; ib.cstate= STANDBY; 9$: clr r0 10$: rts pc 11$: mov #ENOTCAC,r0 12$: sec rts pc tcs.: ;tcs() mov #ECADS,r0 jsr pc,uncads bcs 10$ Sx cmpb cstate,#INCHARGE; if(ib.cstate==INCHARGE) return 0; beq 9$ Sx cmpb cstate,#IDLE ; if(ib.cstate==IDLE) return ENOTCAC; beq 11$ xS bis #ATN,csr ; IB->csr= (ib.csr=| ATN); SU mov csr,csr xS movb #INCHARGE,cstate; ib.cstate= INCHARGE; br unhold ; return unhold(); 9$: clr r0 10$: rts pc 11$: mov #ENOTCAC,r0 sec rts pc unhold: ;unhold() xS bitb #HLDE+HLDA,hidden+AUXA beq 9$ ; if(ib.hidden[AUXA]&(HLDE|HLDA)) ; ib.hidden[AUXA]= _AUXA; xS movb #.AUXA,hidden+AUXA mov #FH,r0 jsr pc,ldaux bcs 10$ Xfer WTIR hidden+AUXA 1 AUX bcs 10$ ; if((x=ldaux(FH))<0 || (x=xfer(WTIR,&ib.hidden[AUXA],1,AUX))<0) return x; 9$: clr r0 ; return 0; 10$: rts pc uncads: ; uncads () .if eq,ONLYC ; xS cmpb #CADS,cstate ; if (ib.cstate == CADS) bne 1$ ; xU bit #ATN,csr ; if (IB->csr & ATN) beq 2$ ; mov #ECADS,r0 ; return ECADS; sec ; rts pc ; else { 2$: xS movb #INCHARGE,cstate; ib.cstate = INCHARGE; xS bis #ATN+SRQIE+CIC,csr; ib.csr |= ATN | SRQIE | CIC; SU mov csr,csr ; IB->csr = ib.csr 1$: ; .endc ; clr r0 ; } rts pc ; return 0; ; } ldr: ;ldr(bp,n) char bp[n]; mov Q$WCNT(r5),r0 neg r0 ; ib.bcr= -n; xS mov r0,bcr .if eq,MMG$T xS mov Q$BUFF(r5),bar ; ib.bar= bp; Sx clrb xba .iff mov r5,r4 add #Q$BUFF,r5 jsr pc,@$mpptr xS mov (sp)+,bar ; ib.bar= bp; mov (sp)+,r0 ash #-4,r0 xS movb r0,xba mov r4,r5 .endc rts pc .if eq,ONLYC mbfsto: ;mbfsto(c) xS bitb #MON,istr ; if((ib.istr&MON)==0) return; beq 10$ Sx cmp cnt,BSIZ ; if(ib.cnt>=BSIZ) return; bge 10$ Sx inc cnt ; ib.cnt++; addr ibv2+mbuf,r1 ; ib.mbuf[ib.iidx++]= c; Sx add iidx,r1 movb r0,@r1 Sx inc iidx Sx cmp iidx,#BSIZ ; if(ib.iidx>=BSIZ) ib.iidx= 0; blt 10$ Sx clr iidx 10$: rts pc ; return; rdads: ;rdads() Xfer RDIR rdintern+ADS 1 ADS rts pc ; return xfer(RDIR,&ib.rdinternal[ADS],1,ADS) rqs: ;rqs(r) xS cmpb r0,internal+SPM ; if(ib.internal[SPM]==r) return 0; bne 1$ clr r0 br 10$ 1$: xS movb r0,internal+SPM ; ib.internal[SPM]= r; Xfer WTIR internal+SPM 1 SPM 10$: rts pc ; return xfer(WTIR,&ib.internal[SPM],1,SPM); valid: mov #VSC,r0 ;valid() return ldaux(VSC); .endc ldaux: ;ldaux(c) xS movb r0,internal+AUX ; ib.internal[AUX]= c; Xfer WTIR internal+AUX 1 AUX rts pc ; return xfer(WTIR,&ib.internal[AUX],1,AUX); iwait: mov #ITIMO,r0 1$: Ux mov csr,r1 tstb r1 bmi 2$ dec r0 bne 1$ mov #EITIMO,r0 br 9$ 2$: bit #NEX,r1 bne 7$ Ux tstb bcr+1 bne 8$ Sx mov csr,r0 bic #^C,r0 xU mov r0,csr clr r0 br 10$ 7$: mov #EINEXM,r0 br 9$ 8$: mov #EIDMACNT,r0 9$: sec 10$: rts pc wait100:mov #100.,r0 ;wait100us() 1$: dec r0 bne 1$ rts pc .if ne,TIM$IT sttimo: Sx tstb timo beq tmoret Sx clrb timo+1 Sx mov timo,r0 mov r0,-(sp) swab r0 ; *(tmoret-2) = ib.timo * 60; ror r0 ror r0 asl (sp) asl (sp) sub (sp)+,r0 mov r0,tmoret-2 addr ibtimo,r0 ; ticmpl = &ibtimo; mov r0,ticmpl movb Q$JNUM(r5),r0 asr r0 asr r0 asr r0 mov r0,tijnum mov #177000+IB$COD,tisqnc xS bisb #TIM,istr .timio timblk, 0, 0 ; /* Start timer */ tmoret: rts pc cltimo: xS bitb #TIM,istr beq 1$ .ctimio timblk xS bicb #TIM,istr 1$: rts pc timblk: .word 0 .word 0 .word 0 tijnum: .word 0 tisqnc: .word 177000+IB$COD .word -1 ticmpl: .word 0 .endc ibv2: .rept IBSLEN/2 0 .endr ibv2phys:0 ibv2xmem:0 .if ne,MMG$T sync: 0 syncjb: 0,0,0 syncr0: 0,-1,0 .endc psave: 0 .drend ib .psect ibdvr size= .-begin .end .enabl lc .title IB2DP - GPIB11V-2 Driver .nlist bex, ttm, cnd ; Rev. D.10 ; This software is provided solely for use with ; the National Instruments GPIB11V-2 ; Copyright 1980 National Instruments ; Jeffrey Kodosky ; June 1979 ; Edit 09/01/81 ; REV C: 01/01/82 ; REV D: 12/15/82 ; V1: 01/21/83 SPBYTE needs to be conditional on ONLYC ; V2: 09/26/83 Fix sign extension problem when writing to CCF ; V3: 01/01/85 Corrected BCR read discrepancy. ; V4: 09/04/85 rsv not cleared when IFC occurs. ; Bugs: Extended memory ignored in Xfer and ldr ; Edit the following assignments to reflect the GPIB11V-2 switch settings UADDR= 0167710 ; Q-BUS address VECT= 0310 ; Vector address PRI= 0240 ; Interrupt priority PPENAB= 1 ; 1 to include PP code, 0 to eliminate PP code TRI= 0 ; 4 for Three-state highspeed, 0 for Normal timing SAC= 1 ; 1 for System Controller, 0 for Not System Controller EXT= 1 ; 2 for Extended, 1 for Normal GPIB addressing MSA= 0140 ; Msa&037 for Extended, 0140 for Normal GPIB addressing MA= 025 ; GPIB address ; Edit the following assignments to reflect the desired software environment OS= 0 ; 0 for Stand-alone, 1 for Operation under RT as a user interrupt service routine BASIC= 0 ; 0 for FORTRAN/MACRO interface, 1 for BASIC interface ASYNCH= 0 ; 0 for Synchronous I/O operations (return when DMA complete) ; 1 for Asynchronous I/O operations (return when DMA initiated) ; (ibwait() must be called prior to issuing another I/O operation) ONLYC= 0 ; 0 for more than one Controller on the GPIBus, 1 for a single Controller on the GPIBus ; (ONLYC implies SAC, i.e., only a single Controller on the GPIBus means ; that the GPIB11V-2 is the System Controller) DIAG= 0 ; 0 for Normal software module, 1 for Special diagnostic support module ; (software timeout loops contain code to jsr pc,idlefn where ; idlefn() is a global user provided function) .macro Exclude mfps -(sp) mov (sp),psave bis #340,(sp) bic #<^C>&0377,(sp) mtps (sp)+ .endm Exclude .macro Unexclude mtps psave .endm Unexclude .iif ne,DIAG, .globl idlefn .if eq,OS-1 .iif gt,VECT-476, .error bad vector .endc .if ne,ONLYC .iif eq,SAC, .error must be SAC if ONLYC .endc INACTIVE= 0 ; Software controller states IDLE= 1 INCHARGE= 2 STANDBY= 3 CADS= 5 GO= 1 ; Control/status register bits OUT= 2 SEL= 4 ECC= 010 IE= 0100 LMR= 0200 DONE= 0200 CIC= 0400 ATN= 01000 EOI= 02000 OCSW= 02000 TCS= 04000 DAV= 04000 SRQIE= 010000 SRQ= 010000 INT= 020000 DMAENAB=020000 NEX= 040000 REN= 040000 IFC= 0100000 DIR= 0 ; Internal register addresses DOR= 0 ISR1= 1 IMR1= 1 ISR2= 2 IMR2= 2 SPS= 3 SPM= 3 ADS= 4 ADM= 4 CPT= 5 AUX= 5 AD0= 6 ADR= 6 AD1= 7 EOS= 7 ERRIE= 4 ; Internal register bits ENDIE= 020 CPTIE= 0200 DMAI= 020 DMAO= 040 SRQS= 0100 RSV= 0100 TA= 2 LA= 4 LON= 0100 TON= 0200 DL= 040 DT= 0100 ARS= 0200 .CLKR= 040 ; Hidden register addresses & offsets .PPR= 0140 .AUXA= 0200 .AUXB= 0240 CLKR= 0 PPR= 1 AUXA= 2 AUXB= 3 U= 020 ; Hidden register bits BIN= 020 S= 010 REOS= 4 HLDE= 2 HLDA= 1 CPTENAB=1 PACS= 1 ; Software status bits MON= 2 IST= 011 ; Special interface functions NIST= 1 VSC= 017 NVSC= 7 SEOI= 6 FH= 3 IR= 2 PON= 0 OK= 1 ASYNOP= 0 ; Error codes ENONE= -1 ; No command byte available (READCOMMAND) ECACFLT= -2 ; ATN not unasserted after IFC sent (bus problem) ENOTCAC= -3 ; Not Active Controller for operation requiring CAC (software problem) ENOTSAC= -4 ; Not System Controller for operation requiring SAC (software problem) EIFCLR= -5 ; IFC caused operation to abort (bus problem) ETIMO= -6 ; Operation did not complete within allotted time (bus problem) ENOFUN= -7 ; Non-existent function code (software problem) ENOIBDEV= -9. ; No Listeners addressed or no devices connected (bus problem) EIDMACNT= -10. ; Internal DMA completed without bcr going to 0 (hardware problem) ENOPP= -11. ; PP operation attempted on three-state GPIB (software problem) EITIMO= -12. ; Internal DMA did not complete within allotted time (hardware problem) EINEXM= -13. ; Internal DMA aborted due to non-existent memory (software/hardware problem) ENEXMEM= -14. ; GPIB DMA aborted due to non-existent memory (software/hardware problem) ECNTRS= -15. ; Bar and bcr are inconsistent following GPIB DMA (hardware problem) ECADS= -18. ; ATN not unasserted after control passed (bus problem) RQCSTB= ; Service request status bytes RQTSTB= RQLSTB= RQC= 1 ; Asynchronous op codes CAC= 2 TAC= 3 LAC= 4 WSRQ= 5 TCT= 011 ; GPIB multiline messages PPC= 5 PPU= 025 SCG= 0140 IN= 0 ITIMO= 25 ; Internal loopcount timeout GTIMO= 10. ; Default GPIB timeout in seconds SECOND= 25000. ; Loop constant for one second BSIZ= 040 ; Monitor buffer size RD= WT= RDIR= WTIR= bcr= 0 ;struct ibv2 { bar= 2 ; int bcr, bar, csr; /* Unibus registers */ csr= 4 ; char ccf,xba; ccf= 6 ; char hidden[4]; /* Hidden registers */ xba= 7. ; hidden= 8. internal= 12. ; char internal[8]; /* Internal registers */ cstate= 20. ; char cstate; istr= 21. ; char istr; op= 22. ; char op; ans= 24. ; int ans; timo= 26. ; int timo; /* Watchdog timer */ owner= 28. ; int owner; /* GPIB owning process */ rdbcr= 30. ; int rdbcr, rdbar, rdcsr; rdbar= 32. rdcsr= 34. rdintern= 36. ; char rdinternal[8]; .if eq,ONLYC mbuf= 44. ; char mbuf[BSIZ]; iidx= 44.+BSIZ ; int iidx, oidx, cnt; oidx= 46.+BSIZ cnt= 48.+BSIZ .endc ; } ib; .iif eq,ONLYC, IBSLEN= 50.+BSIZ .iif ne,ONLYC, IBSLEN= 44. r0= %0 r1= %1 r2= %2 r3= %3 r4= %4 r5= %5 sp= %6 pc= %7 .macro SU instr src dst instr ibv2+src,@#UADDR+dst .endm SU .macro US instr src dst instr @#UADDR+src,ibv2+dst .endm US .macro xU instr src dst instr src,@#UADDR+dst .endm xU .macro Ux instr src dst .if nb,dst instr @#UADDR+src,dst .iff instr @#UADDR+src .endc .endm Ux .macro SS instr src dst instr ibv2+src,ibv2+dst .endm SS .macro xS instr src dst instr src,ibv2+dst .endm xS .macro Sx instr src dst .if nb,dst instr ibv2+src,dst .iff instr ibv2+src .endc .endm Sx .macro addr loc dst mov pc,dst add #loc-.,dst .endm addr .macro Xfer rw a n r xU mov #-+,bcr addr ibv2+a,r1 xU mov r1,bar ;convert to physical address! Sx mov csr,r0 bic #^C,r0 bis #rw,r0 xU mov r0,csr jsr pc,iwait .endm Xfer .macro cjmp t f .macro j't' a ?b b'f' b jmp a b: .endm j't' .macro j'f' a ?b b't' b jmp a b: .endm j'f' .endm cjmp .irp j,<,> cjmp j .endr NFNS= 17. begin= . .globl gpib gpib: .if ne,BASIC .globl $arger, $bomb, $find, $alc, $store, $dealc, $msg cmpb 1(r5),#202 jne gpib0 mov @-2(r5),r4 bic #200,r4 cmp r4,#1023 bne argerr mov @2(r5),r0 cmp r0,#NFNS jcc b9$ cmpb @r5,bcntbl(r0) bne argerr movb fcntbl(r0),fblk mov 2(r5),fblk+2 mov -2(r5),r4 asl r0 jmp @pretbl(r0) b.write:mov 4(r4),r4 bic #200,r4 cmp r4,#1023 bne argerr mov 6(r5),fblk+10 mov -2(r5),r4 b.command: mov 2(r4),r4 bit #1,r4 bne argerr mov (r4)+,r1 mov @r4,r0 bic #200,r1 cmp r1,#1100 bne argerr mov #100,r1 jsr pc,$find mov r0,fblk+4 mov #fblk+16,fblk+6 mov r1,fblk+16 br b.call argerr: jmp $arger b.read: tst (r4)+ mov (r4)+,r3 bit #1,r3 bne argerr cmp (r3)+,#1100 bne argerr mov @r3,strref mov #tmpstr,fblk+4 mov #fblk+6,r3 mov r5,r2 add #6,r2 mov #3,r0 br b.t2 b.setstatus: b.monitor: b.setparm: mov #1,r0 tst (r4)+ mov #fblk+4,r3 mov r5,r2 cmp (r2)+,(r2)+ b.t2: mov (r4)+,r1 bic #200,r1 cmp r1,#1023 bne argerr mov (r2)+,(r3)+ dec r0 bgt b.t2 br b.call b.parallel: cmp 2(r4),#1023 bne argerr ;br b.call b.call: mov r5,-(sp) mov #fblk,r5 jsr pc,gpib0 mov (sp)+,r5 cmp r0,#ENONE blt b10$ mov @2(r5),r1 asl r1 jmp @postbl(r1) b.rd: tst r0 bpl 1$ clr r0 1$: mov #100,r1 jsr pc,$alc bcs b11$ mov #tmpstr,r3 2$: dec r1 bmi 3$ movb (r3)+,(r0)+ br 2$ 3$: mov sp,r0 mov strref,r1 jsr pc,$store jsr pc,$dealc rts pc b.pp: b.rc: b.sr: mov r0,@4(r5) b.rtn: rts pc b9$: mov #ENOFUN,r0 b10$: com r0 b11$: asl r0 mov bemsg(r0),r1 jsr pc,$bomb ;no return bemsg: bemsg1, emsg2, emsg3, emsg4, emsg5, emsg6, emsg7, emsg8 emsg9, emsg10, emsg11, emsg12, emsg13, emsg14, emsg15 bemsg1: .asciz /alc--no space/ emsg2: .asciz /CAC conflict/ emsg3: .asciz /not CAC/ emsg4: .asciz /not SAC/ emsg5: .asciz /IFC abort/ emsg6: .asciz /timeout/ emsg7: .asciz /bad fctn code/ emsg8: .asciz /?/ emsg9: .asciz /no listeners/ emsg10: .asciz /bcr error/ emsg11: .asciz /no PP/ emsg12: .asciz /ir timeout/ emsg13: .asciz /ir nex memory/ emsg14: .asciz /nex memory/ emsg15: .asciz /bcr-bar error/ .even .csect gpib tmpstr: .blkb 256. strref: 0 fblk: .blkw 8. .csect bcntbl: .byte 2, 3, 5, 1, 1, 1, 1, 2, 1, 2, 2, 2, 2, 2, 1 fcntbl: .byte 3, 4, 5, 1, 1, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1 pretbl: b.command, b.write, b.read, b.call, b.call, b.call, b.call b.parallel, b.call, b.setstatus, b.monitor, b.call, b.setparm b.call, b.call postbl: b.rtn, b.rtn, b.rd, b.rtn, b.rtn, b.rtn, b.rtn, b.pp, b.rtn b.rtn, b.rtn, b.rc, b.rtn, b.sr, b.rtn gpib0: .endc ;gpib(f,a1,a2,a3,a4) Exclude ; Exclude; Sx clr ans ; ib.ans= 0; Sx tstb cstate ; if(ib.cstate==INACTIVE && (x=init())<0) goto quit bne 1$ jsr pc,init bcs 9$ 1$: mov @2(r5),r0 ; if(f<0 || f>=NFNS) x= ENOFUN; cmp r0,#NFNS bhis 8$ asl r0 ; else x= (*ibfn[f])(a1,a2,a3,a4); jsr r0,@pc add #ibfn-.,r0 add r0,@sp add @(sp)+,r0 jsr pc,@r0 br 9$ 8$: mov #ENOFUN,r0 9$: Unexclude ;quit: Unexclude; .if eq,ASYNCH tst r0 ; return x==ASYNOP? ibwait() : x; beq ibwait .iff .globl ibwait ; return x; .endc rts pc ibfn: ;int (*ibfn[])()= { command - ibfn ; &command, &write, &read, &transfer, write - ibfn ; &clear, &remote, &local, ¶llel, read - ibfn ; &passcontrol, &setstatus, &monitor, &readcommand, transfer - ibfn ; &setparameters, &testsrq, &finish, &status, clear - ibfn ; &spbyte }; remote - ibfn local - ibfn parallel - ibfn passcontrol - ibfn setstatus - ibfn monitor - ibfn readcommand - ibfn setparameters - ibfn testsrq - ibfn finish - ibfn status - ibfn spbyte - ibfn ibwait: ;ibwait() Sx mov timo,r0 bne 2$ ; if((i= ib.timo)==0) i--; 1$: dec r0 2$: mov #SECOND,r1 3$: Sx tstb op ; while(ib.op && i) beq 4$ .iif ne,DIAG, jsr pc,idlefn tst r0 ; if(i>0) i--; bmi 3$ beq 4$ dec r1 bne 3$ br 1$ 4$: Exclude ; Exclude; Sx tstb op ; if(ib.op) ibstop(); beq 5$ jsr pc,ibstop 5$: Sx mov ans,r0 ; x= ib.ans; Unexclude ; Unexclude; rts pc ; return x; init: ;init() char *cp; Sx clr csr ; ib.csr= 0; IB->csr= LMR; xU mov #LMR,csr addr ibv2+hidden,r0 ; cp= &ib.hidden[0]; movb #.CLKR+5,(r0)+ ; *cp++= _CLKR | 5; movb #.PPR+U,(r0)+ ; *cp++= _PPR | U; movb #.AUXA,(r0)+ ; *cp++= _AUXA; ; *cp++= _AUXB | TRI | CPT_ENAB; movb #.AUXB+TRI+CPTENAB,(r0)+ ; cp= &ib.internal[0]; clrb (r0)+ ; *cp++= 0; movb #CPTIE+ERRIE,(r0)+; *cp++= CPT_IE | ERR_IE; clrb (r0)+ ; *cp++= 0; clrb (r0)+ ; *cp++= 0; movb #EXT,(r0)+ ; *cp++= EXT; ; *cp++= ib.hidden[CLKR]; Sx movb hidden+CLKR,(r0)+ movb #ARS+MSA,(r0)+ ; *cp++= ARS | MSA; clrb (r0)+ ; *cp++= 0; clr (r0)+ ; ib.istr= ib.op= 0; clr (r0)+ ; ib.ans= 0; mov #GTIMO,(r0)+ ; ib.timo= GTIMO; jsr pc,irload ; if((x=irload())<0) return x; bcs 10$ xS movb #IDLE,cstate ; ib.cstate= IDLE; mov #VECT,r1 .if eq,OS-1 .mcall .protect, .print, .exit sub #6,sp .protect sp,r1 bcs 11$ add #6,sp .endc addr ibint r0 mov r0,(r1)+ .iif eq,OS-1, mov #340,@r1 .iif eq,OS, mov #PRI,@r1 xS mov #IE,csr ; IB->csr= ib.csr= IE; xU mov #IE,csr .if eq,ONLYC Sx clr iidx ; ib.iidx= ib.oidx= ib.cnt= 0; Sx clr oidx Sx clr cnt .endc clr r0 ; return 0; 10$: rts pc .if eq,OS-1 11$: .print #emsg .exit emsg: .asciz /GPIB11V-2 vector conflict/ .even .endc ibstop: ;ibstop() xS bic #DMAENAB+GO,csr ; IB->csr= (ib.csr=& ~(DMA_ENAB|GO)); SU mov csr,csr US mov bcr,rdbcr ; ib.rdbcr= IB->bcr; US mov bar,rdbar ; ib.rdbar= IB->bar; .if eq,ONLYC clr r0 jsr pc,rqs ; if(rqs(0)>=0) ib.ans= ETIMO; bcs 1$ .endc xS mov #ETIMO,ans 1$: Sx clrb op ; ib.op= 0; rts pc irload: ;irload() if((x=xfer(WTIR,&ib.internal[ISR1],7,ISR1))<0) return x; Xfer WTIR internal+ISR1 7 ISR1 bcs 10$ ; ib.internal[AUX]= ib.hidden[AUXA]; SS movb hidden+AUXA,internal+AUX xS movb #MA,internal+ADR; ib.internal[ADR]= MA; ; if((x=xfer(WTIR,&ib.internal[AUX],2,AUX))<0) return x; Xfer WTIR internal+AUX 2 AUX bcs 10$ ; if((x=xfer(WTIR,&ib.hidden[AUXB],1,AUX))<0) return x; Xfer WTIR hidden+AUXB 1 AUX bcc lun0 ; return lun(ib.internal[ADM]); 10$: rts pc lun: ;lun(newadm) /* Note: rsv is cleared and not restored*/ xS cmpb r0,internal+ADM ; if(ib.internal[ADM]==newadm) return OK; beq .9$ xS movb r0,internal+ADM ; ib.internal[ADM]= newadm; lun0: Sx clrb internal+AUX ;lun0: ib.internal[AUX]= PON; ; if((x=xfer(WTIR,&ib.internal[ADM],2,ADM))<0) return x; Xfer WTIR internal+ADM 2 ADM bcs .10$ .if eq,ONLYC .if ne,PPENAB Xfer WTIR hidden+PPR 1 AUX bcs .10$ ; if((x=xfer(WTIR,&ib.hidden[PPR],1,AUX))<0) return x; xS bitb #S,istr ; if(ib.istr&S) beq .9$ ; return ldaux(IST); mov #IST,r0 jsr pc,ldaux bcs .10$ .endc .endc .9$: clr r0 ; return OK; inc r0 .10$: rts pc command: ;command(bp,n) char bp[n]; jsr pc,tcs. ; if((x=tcs())<0) bcc 3$ .if eq,ONLYC tst @6(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ mov #RQCSTB,r0 ; if((x=rqs(RQC_STB))<0) return x; jsr pc,rqs bcs 1$ xS movb #RQC,op ; ib.op= RQC; jsr pc,ldr ; ldr(bp,n); clr r0 ; return ASYNOP; 1$: ; else .endc rts pc ; return x; 3$: mov #TON,r0 ; if((x=lun(TON))<0) return x; jsr pc,lun bcs 10$ tst @6(r5) ; if(n==0) return OK; beq 9$ xS movb #CAC,op ; ib.op= CAC; xS bic #ECC,csr ; return xfer(WT,bp,n,0); jmp wtxfer 9$: mov #OK,r0 10$: rts pc write: ;write(bp,n,mode) char bp[n]; mov #TON,r0 ; if((x=gts(TON))<0) jsr pc,gts bcc 3$ .if eq,ONLYC tst @6(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ jsr pc,rdads ; if((x=rdads())<0) return x; bcs 10$ xS bitb #TA,rdintern+ADS; if((ib.rdinternal[ADS]&TA)==0) bne 3$ mov #RQTSTB,r0 ; if((x=rqs(RQT_STB))<0) return x; jsr pc,rqs bcc 3$ ; else 1$: .endc rts pc ; return x; 3$: tst @6(r5) ; if(n==0) return OK; beq 9$ xS movb #TAC,op ; ib.op= TAC; bitb #2,@10(r5) beq 4$ ; return xfer(WT,bp,n,(mode&2? SEOI:0)); xS bis #ECC,csr xS movb #SEOI,ccf br wtxfer 4$: xS bic #ECC,csr br wtxfer 9$: mov #OK,r0 10$: rts pc wtxfer: xS bis #WT,csr jsr pc,ldr mov #DMAO,r0 br ibxfer rdxfer: xS bic #OUT,csr xS bis #RD,csr jsr pc,ldr mov #DMAI,r0 ibxfer: ;xfer(rw,bp,n,ccfn) char bp[n]; ; if(ccfn) IB->ccf= ib.ccf= ccfn; ib.csr=| ECC; ; else ib.csr=& ~ECC; ; ldr(bp,n); ib.csr= ib.csr&~OUT | rw; ibxfr0: xS cmpb r0,internal+IMR2; x= rw&OUT? DMAO:DMAI; beq 1$ ; if(x!=ib.internal[IMR2]) xS movb r0,internal+IMR2; ib.internal[IMR2]= x; Xfer WTIR internal+IMR2 1 IMR2 bcc 1$ ; if((x=xfer(WTIR,&ib.internal[IMR2],1,IMR2))<0) Sx clr op ; ib.op= 0; br 10$ ; return x; 1$: SU mov bcr,bcr ; IB->bcr= ib.bcr; SU mov bar,bar ; IB->bar= ib.bar; SU mov ccf,ccf ; IB->ccf= ib.ccf;IB->xba= ib.xba; SU mov csr,csr ; IB->csr= ib.csr; clr r0 ; return ASYNOP; 10$: rts pc read: ;read(bp,n,mode,eod) char bp[n]; mov #LON,r0 ; if((x=gts(LON))<0) jsr pc,gts bcc 3$ .if eq,ONLYC tst @6(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ jsr pc,rdads ; if((x=rdads())<0) return x; bcs 10$ xS bitb #LA,rdintern+ADS; if((ib.rdinternal[ADS]&LA)==0) bne 3$ mov #RQLSTB,r0 ; if((x=rqs(RQL_STB))<0) return x; jsr pc,rqs bcc 3$ ; else 1$: .endc rts pc ; return x; 3$: tst @6(r5) ; if(n==0) return OK; beq 9$ movb @10(r5),r0 ; if(mode&2) ib.hidden[AUXA]=| REOS | (mode&1? 0:BIN); bitb #2,r0 beq 4$ xS bisb #REOS,hidden+AUXA xS movb @12(r5),internal+EOS bitb #1,r0 ; ib.internal[EOS]= eod; bne 4$ xS bisb #BIN,hidden+AUXA 4$: bitb #4,r0 ; if(mode&4) ib.internal[IMR1]=& ~END_IE; beq 41$ xS bicb #ENDIE,internal+IMR1 br 42$ ; else ib.internal[IMR1]=| END_IE; 41$:xS bisb #ENDIE,internal+IMR1 Sx cmpb cstate,#STANDBY ; if(ib.cstate==STANDBY) bne 42$ xS bisb #HLDE,hidden+AUXA; ib.hidden[AUXA]=| HLDE; 42$:SS movb hidden+AUXA,internal+AUX ; ib.internal[AUX]= ib.hidden[AUXA]; Xfer WTIR internal+IMR1 7 IMR1 bcs 10$ ; if((x=xfer(WTIR,&ib.internal[IMR1],7,IMR1))<0) return x; xS movb #LAC,op ; ib.op= LAC; Sx movb hidden+AUXA,r0 ; if(ib.cstate==STANDBY) x= ib.hidden[AUXA]= ib.hidden[AUXA]&~HLDE|HLDA; Sx cmpb cstate,#STANDBY ; else x= 0; bne 5$ ; return xfer(RD,bp,n,x); xS bis #ECC,csr bic #HLDE,r0 bis #HLDA,r0 xS movb r0,ccf xS movb r0,hidden+AUXA br 6$ 5$: xS bic #ECC,csr 6$: jmp rdxfer 9$: mov #OK,r0 10$: rts pc transfer: ;transfer() mov #EXT,r0 ; if((x=gts(EXT))<0) return x; jsr pc,gts bcs 10$ mov #OK,r0 ; return OK; 10$: rts pc clear: ;clear() jsr pc,unhold ; if((x=unhold())<0) return x; bcs 10$ .if ne,SAC Sx mov csr,r0 ; IB->csr= ib.csr | IFC; bis #IFC,r0 xU mov r0,csr jsr pc,wait100 ; wait100us(); xU bit #ATN,csr ; if(IB->csr&ATN) beq 1$ mov #ECACFLT,r0 ; return ECACFLT; br 10$ 1$: xS movb #INCHARGE,cstate; ib.cstate= INCHARGE; xS bis #ATN+SRQIE+CIC,csr SU mov csr,csr ; IB->csr= (ib.csr=| ATN | SRQ_IE | CIC); mov #TON,r0 ; return lun(TON); jmp lun .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc 10$: rts pc remote: ;remote() .if ne,SAC xS bis #REN,csr ; IB->csr= (ib.csr=| REN); SU mov csr,csr mov #OK,r0 ; return OK; .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc rts pc local: ;local() .if ne,SAC xS bic #REN,csr ; IB->csr= (ib.csr=& ~REN); SU mov csr,csr mov #OK,r0 ; return OK; .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc rts pc parallel: ;parallel() .if ne,PPENAB jsr pc,tcs. ; if((x=tcs())<0) return x; bcs 10$ mov #LON,r0 ; if((x=lun(LON))<0) return x; jsr pc,lun bcs 10$ xS bis #EOI,csr ; IB->csr= (ib.csr=| EOI); SU mov csr,csr Xfer RDIR rdintern+CPT 1 CPT bcs 10$ ; if((x=xfer(RDIR, &ib.rdinternal[CPT],1,CPT))<0) return x; xS bic #EOI,csr ; IB->csr= (ib.csr=& ~EOI); SU mov csr,csr ; IB->csr= ib.csr; mov #400,r0 ; return ib.rdinternal[CPT] | 0400; Sx bisb rdintern+CPT,r0 .iff mov #ENOPP,r0 ; return ENOPP; .endc 10$: rts pc passcontrol: ;passcontrol() .if eq,ONLYC Sx cmpb cstate,#INCHARGE; if(ib.cstate!=INCHARGE) beq 1$ mov #ENOTCAC,r0 ; return ENOTCAC; br 10$ 1$: movb #EXT,r0 ; if((x=lun(EXT))<0) return x; jsr pc,lun bcs 10$ xS bic #SRQIE+ATN+CIC,csr SU mov csr,csr ; IB->csr= (ib.csr=& ~(SRQ_IE | ATN | CIC)); xS movb #IDLE,cstate ; ib.cstate= IDLE; mov #OK,r0 ; return OK; .iff mov #ENOIBDEV,r0 ; return ENOIBDEV; .endc 10$: rts pc setstatus: ;setstatus(s) .if eq,ONLYC .if ne,PPENAB xS bitb #S,istr ; if((ib.istr&S) ^^ s) bne 2$ tst @4(r5) beq 9$ xS bisb #S,istr mov #IST,r0 br 5$ 2$: tst @4(r5) bne 9$ xS bicb #S,istr mov #NIST,r0 5$: jsr pc,ldaux ; return ldaux((ib.istr=^ S)? IST : NIST); bcs 10$ .endc .endc 9$: mov #OK,r0 ; return OK; 10$: rts pc monitor: ;monitor(m) .if eq,ONLYC tst @4(r5) ; if(m) ib.istr=| MON; beq 1$ xS bisb #MON,istr br 5$ 1$: xS bicb #MON,istr ; else ib.istr=& ~MON; 5$: .endc mov #OK,r0 ; return OK; rts pc readcommand: ;readcommand() .if eq,ONLYC clr r0 Sx tst cnt ; if(ib.cnt<=0) return ENONE; ble 9$ Sx dec cnt ; ib.cnt--; addr ibv2+mbuf,r1 ; x= ib.mbuf[ib.oidx++]; Sx add oidx,r1 bisb @r1,r0 Sx inc oidx Sx cmp oidx,#BSIZ ; if(ib.oidx>=BSIZ) ib.oidx= 0; blt 5$ Sx clr oidx 5$: bis #400,r0 ; return x|0400; br 10$ 9$: dec r0 10$: rts pc .iff mov #ENONE,r0 ; return ENONE; rts pc .endc setparameters: ;setparameters(t) xS mov @4(r5),timo ; ib.timo= t; mov #OK,r0 ; return OK; rts pc testsrq: ;testsrq() mov #1,r0 ; if(IB->csr&SRQ) return OK; xU bit #SRQ,csr bne 10$ neg r0 xS bit #CIC,csr ; if(ib.csr&CIC) IB->csr= (ib.csr=| SRQ_IE); beq 10$ xS bis #SRQIE,csr SU mov csr,csr tst @4(r5) ; if (wait) { beq 10$ ; xS movb #WSRQ,op ; ib.op = WSRQ clr r0 ; return ASYNOP; } 10$: rts pc ; return ENONE; spbyte: .if eq, ONLYC clr r0 jsr pc,rqs bcs 10$ mov @4(r5),r0 jsr pc,rqs bcs 10$ .endc mov #OK,r0 10$: rts pc status: ;status (buf, count) mov r2,-(sp) ; (save r2) addr ibv2,r2 mov r2,r0 mov @6(r5),r1 cmp r1,#IBSLEN blos 1$ mov #IBSLEN,r1 1$: mov r1,-(sp) ; (this will be the return value) add r0,r1 mov 4(r5),r0 2$: cmp r2,r1 beq 3$ movb (r2)+,(r0)+ br 2$ 3$: mov (sp)+,r0 ; return count; bne 4$ mov #OK,r0 4$: mov (sp)+,r2 ; (replace r2) rts pc finish: ;finish() Sx clrb cstate ; ib.cstate= INACTIVE; Sx clr csr ; ib.csr= 0; xU mov #LMR,csr ; IB->csr= LMR; mov #OK,r0 ; return OK; rts pc ibint: ;ibint() .if eq,OS-1 .mcall .inten .inten ,PIC mov r0,r4 mov r1,r5 jsr pc,ibint0 mov r5,r1 mov r4,r0 rts pc .iff mov r0,-(sp) mov r1,-(sp) jsr pc,ibint0 mov (sp)+,r1 mov (sp)+,r0 rti .endc ibint0: US mov bcr,rdbcr ;ib.rdbcr= IB->bcr; US mov bar,rdbar ;ib.rdbar= IB->bar; US mov csr,rdcsr ;ib.rdcsr= IB->csr; .if eq,SAC Sx tst rdcsr ;if(ib.rdcsr&IFC) bpl 5$ xS bic #DMAENAB+SRQIE+ATN+CIC+GO,csr SU mov csr,csr ; IB->csr= (ib.csr=& ~(DMA_ENAB|SRQ_IE|ATN|CIC|GO)); Sx tstb cstate ; if(ib.cstate!=INACTIVE) beq 4$ xS movb #IDLE,cstate ; ib.cstate= IDLE; ; ib.hidden[AUXA]= _AUXA; xS movb #.AUXA,hidden+AUXA xS movb #FH,internal+AUX; ib.internal[AUX]= FH; xS movb #EXT,internal+ADM; ib.internal[ADM]= EXT; Sx clrb internal+IMR2 ; ib.internal[IMR2]= 0; jsr pc,irload ; if(irload()>=0) ib.ans= EIFCLR; bcs 3$ movb #EIFCLR,r0 3$: xS mov r0,ans 4$: Sx clrb op ; ib.op= 0; rts pc ; return; 5$: .endc chksrq: ;if((IB->csr&SRQ) && (ib.csr&SRQ_IE)) xU bit #SRQ,csr beq 5$ xS bit #SRQIE,csr beq 5$ xS bic #SRQIE,csr ; IB->csr= (ib.csr=& ~SRQ_IE) & ~GO; Sx mov csr,r0 bic #GO,r0 xU mov r0,csr Sx cmpb op,#WSRQ bne 55$ mov #OK,r0 jmp quit 55$:Sx tst owner ; if(ib.owner) psignal(ib.owner,SRQINT); beq 5$ ; signal owner 5$: chkint: xU bit #INT,csr ;if(IB->csr&INT) jeq chkdone Ux mov bcr,r1 ;x= IB->bcr; Sx mov csr,r0 ; IB->csr= ib.csr & ~(DMA_ENAB|GO); bic #DMAENAB+GO,r0 xU mov r0,csr US mov csr,rdcsr ;ib.rdcsr= IB->csr; US mov bcr,rdbcr ;ib.rdbcr= IB->bcr; Sx tst rdbcr bne 14$ tst r1 beq 15$ 14$: Sx dec rdbcr 15$: US mov bar,rdbar ;ib.rdbar= IB->bar; Xfer RDIR rdintern+ISR1 5 ISR1 jcs quit ; if((x=xfer(RDIR,&ib.rdinternal[ISR1],5,ISR1))<0) goto quit; xS bitb #ERRIE,rdintern+ISR1 beq 1$ ; if(ib.rdinternal[ISR1]&ERR_IE) ib.ans= ENOIBDEV; xS mov #ENOIBDEV,ans jmp chkdone 1$: .if eq,ONLYC ; else if(ib.rdinternal[ISR1]&CPT_IE) xS bitb #CPTIE,rdintern+ISR1 beq 10$ Sx movb rdintern+CPT,r0 ; mbfsto(ib.rdinternal[CPT]); jsr pc,mbfsto .if ne,PPENAB xS bitb #PACS,istr ; if((ib.istr&PACS) && ib.rdinternal[CPT]>=SCG) beq 2$ xS bicb #PACS,istr ; ib.istr=& ~PACS; cmpb r0,#SCG blt 2$ xS movb r0,hidden+PPR ; ib.hidden[PPR]= ib.rdinternal[CPT]; br 8$ ; goto lpe; .endc 2$: cmpb r0,#TCT ; switch(ib.rdinternal[CPT]) bne 5$ ; case TCT: xS bitb #TA,rdintern+ADS; if((ib.rdinternal[ADS]&TA)==0) break; beq 9$ xS movb #CADS,cstate ; ib.cstate = CADS; jsr pc,valid ; if((x=valid())<0) goto quit; jcs quit br chkdone 5$: .if ne,PPENAB cmpb r0,#PPC ; case PPC: bne 6$ xS bitb #LA,rdintern+ADS; if(ib.rdinternal[ADS]&LA) beq 6$ xS bisb #PACS,istr ; ib.istr=| PACS; br 9$ ; break; 6$: cmpb r0,#PPU ; case PPU: bne 9$ ; ib.hidden[PPR]= _PPR | U; xS movb #.PPR+U,hidden+PPR 8$: Xfer WTIR hidden+PPR 1 AUX jcs quit ; lpe: if((x=xfer(WTIR,&ib.hidden[PPR],1,AUX))<0) goto quit; ; break; .endc 9$: jsr pc,valid ; if((x=valid())<0) goto quit; jcs quit 10$: .endc xS bitb #ENDIE,internal+IMR1; if(ib.internal[IMR1]&END_IE) beq chkdone ; ib.internal[IMR1]=& ~END_IE; xS bicb #ENDIE,internal+IMR1 Xfer WTIR internal+IMR1 1 IMR1 jcs quit ; if((x=xfer(WTIR,&ib.internal[IMR1],1,IMR1))<0) goto quit; chkdone: ;chkdone: Ux tstb csr ;if((IB->csr&DONE) && (ib.csr&GO)) bpl chktct xS bit #GO,csr beq chktct Sx dec csr ; ib.csr=& ~GO; xS bit #NEX,rdcsr ; if(ib.rdcsr&NEX) ib.ans= ENEXMEM; beq 2$ xS mov #ENEXMEM,ans 2$: .if eq,ONLYC clr r0 ; if((x=rqs(0))<0) goto quit; jsr pc,rqs bcs quit .endc Sx mov rdbcr,r0 ; x= ib.rdbcr - ib.bcr; /* number of bytes transferred */ Sx sub bcr,r0 SS sub bar,rdbar ; if(ib.rdbar - ib.bar != x) x= ECNTRS; Sx cmp rdbar,r0 beq 3$ mov #ECNTRS,r0 3$: Sx tst ans ; if(ib.ans==0) bne wake quit: ;quit: ib.ans= x; xS mov r0,ans wake: Sx clrb op ; ib.op= 0; rts pc chktct: .if eq,ONLYC Sx cmpb op,#RQC ;else if(ib.op==RQC && (IB->csr&CIC)) bne 10$ xU bit #CIC,csr beq 10$ mov #TON,r0 ; if((x=lun(TON))<0) goto quit; jsr pc,lun bcs quit xS movb #CAC,op ; ib.op= CAC; mov #DMAO,r0 xS bic #ECC,csr ; if((x=xfer(WT,ib.bar,ib.bcr,0))<0) xS bis #WT,csr jsr pc,ibxfr0 bcs quit ; goto quit; .endc 10$: rts pc ;return; gts: ;gts(newadm) mov r0,-(sp) jsr pc,unhold ; if((x=unhold())<0) return x; bcs 2$ jsr pc,uncads 2$: mov (sp)+,r1 bcs 10$ mov r1,r0 Sx cmpb cstate,#STANDBY ; if(ib.cstate==STANDBY) bne 1$ Sx cmpb internal+ADM,r0 ; return (ib.internal[ADM]==newadm)? 0:ENOIBDEV; beq 9$ mov #ENOIBDEV,r0 br 12$ 1$: Sx cmpb cstate,#IDLE ; if(ib.cstate==IDLE) return ENOTCAC; beq 11$ jsr pc,lun ; if((x=lun(newadm))<0) return x; bcs 10$ xS bic #ATN,csr ; IB->csr= (ib.csr=& ~ATN); SU mov csr,csr xS movb #STANDBY,cstate ; ib.cstate= STANDBY; 9$: clr r0 10$: rts pc 11$: mov #ENOTCAC,r0 12$: sec rts pc tcs.: ;tcs() jsr pc,uncads bcs 10$ Sx cmpb cstate,#INCHARGE; if(ib.cstate==INCHARGE) return 0; beq 9$ Sx cmpb cstate,#IDLE ; if(ib.cstate==IDLE) return ENOTCAC; beq 11$ xS bis #ATN,csr ; IB->csr= (ib.csr=| ATN); SU mov csr,csr xS movb #INCHARGE,cstate; ib.cstate= INCHARGE; br unhold ; return unhold(); 9$: clr r0 10$: rts pc 11$: mov #ENOTCAC,r0 sec rts pc unhold: ;unhold() xS bitb #HLDE+HLDA,hidden+AUXA beq 9$ ; if(ib.hidden[AUXA]&(HLDE|HLDA)) ; ib.hidden[AUXA]= _AUXA; xS movb #.AUXA,hidden+AUXA mov #FH,r0 jsr pc,ldaux bcs 10$ Xfer WTIR hidden+AUXA 1 AUX bcs 10$ ; if((x=ldaux(FH))<0 || (x=xfer(WTIR,&ib.hidden[AUXA],1,AUX))<0) return x; 9$: clr r0 ; return 0; 10$: rts pc uncads: ; uncads () .if eq,ONLYC xS cmpb #CADS,cstate ; if (ib.cstate == CADS) bne 1$ ; xU bit #ATN,csr ; if (IB->csr & ATN) beq 2$ ; mov #ECADS,r0 ; return ECADS; sec ; rts pc ; else { 2$: xS movb #INCHARGE,cstate; ib.cstate = INCHARGE; xS bis #ATN+SRQIE+CIC,csr; ib.csr |= ATN | SRQIE | CIC; SU mov csr,csr ; IB->csr = ib.csr 1$: ; .endc clr r0 ; } rts pc ; return 0; ; } ldr: mov @6(r5),r0 ;ldr(bp,n) char bp[n]; neg r0 ; ib.bcr= -n; xS mov r0,bcr xS mov 4(r5),bar ; ib.bar= bp; rts pc .if eq,ONLYC mbfsto: ;mbfsto(c) xS bitb #MON,istr ; if((ib.istr&MON)==0) return; beq 10$ Sx cmp cnt,BSIZ ; if(ib.cnt>=BSIZ) return; bge 10$ Sx inc cnt ; ib.cnt++; addr ibv2+mbuf,r1 ; ib.mbuf[ib.iidx++]= c; Sx add iidx,r1 movb r0,@r1 Sx inc iidx Sx cmp iidx,#BSIZ ; if(ib.iidx>=BSIZ) ib.iidx= 0; blt 10$ Sx clr iidx 10$: rts pc ; return; rdads: ;rdads() Xfer RDIR rdintern+ADS 1 ADS rts pc ; return xfer(RDIR,&ib.rdinternal[ADS],1,ADS) rqs: ;rqs(r) xS cmpb r0,internal+SPM ; if(ib.internal[SPM]==r) return 0; bne 1$ clr r0 br 10$ 1$: xS movb r0,internal+SPM ; ib.internal[SPM]= r; Xfer WTIR internal+SPM 1 SPM 10$: rts pc ; return xfer(WTIR,&ib.internal[SPM],1,SPM); valid: mov #VSC,r0 ;valid() return ldaux(VSC); .endc ldaux: ;ldaux(c) xS movb r0,internal+AUX ; ib.internal[AUX]= c; Xfer WTIR internal+AUX 1 AUX rts pc ; return xfer(WTIR,&ib.internal[AUX],1,AUX); iwait: mov #ITIMO,r0 1$: Ux mov csr,r1 tstb r1 bmi 2$ dec r0 bne 1$ mov #EITIMO,r0 br 9$ 2$: bit #NEX,r1 bne 7$ Ux tstb bcr+1 bne 8$ Sx mov csr,r0 bic #^C,r0 xU mov r0,csr clr r0 br 10$ 7$: mov #EINEXM,r0 br 9$ 8$: mov #EIDMACNT,r0 9$: sec 10$: rts pc wait100:mov #100.,r0 ;wait100us() 1$: .iif ne,DIAG, jsr pc,idlefn dec r0 bne 1$ rts pc ibv2: .rept IBSLEN/2 0 .endr psave: 0 size= .-begin .end .enabl lc .title IV2DRV - GPIB11V-2 RSX11M Driver .nlist bex, ttm, cnd ; Rev. D.10 ; This software is provided solely for use with ; the National Instruments GPIB11V-2 ; Copyright 1980 National Instruments ; Jeffrey Kodosky ; April 1980 ; Edit 09/01/81 ; REV C: 01/01/82 ; V1: 06/22/82 Setparameters parameters now obtained from ; IRP instead of UCB ; REV D: 09/29/82 ; V1: 04/21/83 No fork$ in abort or timeout routines ; V2: 09/26/83 Now correctly handles 22-bit addressing ; V3: 01/01/85 Corrected IIDX offset ; Corrected BCR read discrepancy ; IODONE now called at fork level, not device level ; V4: 09/04/85 rsv not cleared when IFC occurs. LD$IB=0 ; Edit the following assignments to reflect the GPIB11V-2 switch settings UADDR= 0167710 ; Q-BUS address VECT= 0310 ; Vector address PRI= 0240 ; Interrupt priority PPENAB= 1 ; 1 to include PP code, 0 to eliminate PP code TRI= 0 ; 4 for Three-state highspeed, 0 for Normal timing SAC= 1 ; 1 for System Controller, 0 for Not System Controller EXT= 1 ; 2 for Extended, 1 for Normal GPIB addressing MSA= 0140 ; Msa&037 for Extended, 0140 for Normal GPIB addressing MA= 025 ; GPIB address ; Edit the following assignments to reflect the desired software environment ONLYC= 0 ; 0 for more than one Controller on the GPIBus, 1 for a single Controller on the GPIBus ; (ONLYC implies SAC, i.e., only a single Controller on the GPIBus means ; that the GPIB11V-2 is the System Controller) .macro Exclude mfps -(sp) mov @sp,psave bis #340,@sp bic #<^C>&0377,@sp mtps (sp)+ .endm Exclude .macro Unexclude mtps psave .endm Unexclude INACTIVE= 0 ; Software controller states IDLE= 1 INCHARGE= 2 STANDBY= 3 CADS= 4 GO= 1 ; Control/status register bits OUT= 2 SEL= 4 ECC= 010 IE= 0100 LMR= 0200 DONE= 0200 CIC= 0400 ATN= 01000 EOI= 02000 OCSW= 02000 TCS= 04000 DAV= 04000 SRQIE= 010000 SRQ= 010000 INT= 020000 DMAENAB=020000 NEX= 040000 REN= 040000 IFC= 0100000 DIR= 0 ; Internal register addresses DOR= 0 ISR1= 1 IMR1= 1 ISR2= 2 IMR2= 2 SPS= 3 SPM= 3 ADS= 4 ADM= 4 CPT= 5 AUX= 5 AD0= 6 ADR= 6 AD1= 7 EOS= 7 ERRIE= 4 ; Internal register bits ENDIE= 020 CPTIE= 0200 DMAI= 020 DMAO= 040 SRQS= 0100 RSV= 0100 TA= 2 LA= 4 LON= 0100 TON= 0200 DL= 040 DT= 0100 ARS= 0200 .CLKR= 040 ; Hidden register addresses & offsets .PPR= 0140 .AUXA= 0200 .AUXB= 0240 CLKR= 0 PPR= 1 AUXA= 2 AUXB= 3 U= 020 ; Hidden register bits BIN= 020 S= 010 REOS= 4 HLDE= 2 HLDA= 1 CPTENAB=1 PACS= 1 ; Software status bits MON= 2 IST= 011 ; Special interface functions NIST= 1 VSC= 017 NVSC= 7 SEOI= 6 FH= 3 IR= 2 PON= 0 OK= 1 ASYNOP= 0 ; Error codes ENONE= -1 ; No command byte available (READCOMMAND) ECACFLT= -2 ; ATN not unasserted after IFC sent (bus problem) ENOTCAC= -3 ; Not Active Controller for operation requiring CAC (software problem) ENOTSAC= -4 ; Not System Controller for operation requiring SAC (software problem) EIFCLR= -5 ; IFC caused operation to abort (bus problem) ETIMO= -6 ; Operation did not complete within allotted time (bus problem) ENOFUN= -7 ; Non-existent function code (software problem) ENOIBDEV= -9. ; No Listeners addressed or no devices connected (bus problem) EIDMACNT= -10. ; Internal DMA completed without bcr going to 0 (hardware problem) ENOPP= -11. ; PP operation attempted on three-state GPIB (software problem) EITIMO= -12. ; Internal DMA did not complete within allotted time (hardware problem) EINEXM= -13. ; Internal DMA aborted due to non-existent memory (software/hardware problem) ENEXMEM= -14. ; GPIB DMA aborted due to non-existent memory (software/hardware problem) ECNTRS= -15. ; Bar and bcr are inconsistent following GPIB DMA (hardware problem) ENOUMR= -16. ; No unibus map register available (try again) ECADS= -18. ; ATN not unasserted after controll passed (bus problem) RQCSTB= ; Service request status bytes RQTSTB= RQLSTB= RQC= 1 ; Asynchronous op codes CAC= 2 TAC= 3 LAC= 4 WSRQ= 5 TCT= 011 ; GPIB multiline messages PPC= 5 PPU= 025 SCG= 0140 IN= 0 ITIMO= 25 ; Internal loopcount timeout GTIMO= 2 ; Default GPIB timeout in seconds BSIZ= 040 ; Monitor buffer size RD= WT= RDIR= WTIR= bcr= 0 ;struct ibv2 { bar= 2 ; int bcr, bar, csr; /* Unibus registers */ csr= 4 ; char ccf, xba; ccf= 6 ; char hidden[4]; /* Hidden registers */ xba= 7 ; char internal[8]; /* Internal registers */ hidden= 8. internal= 12. cstate= 20. ; char cstate; istr= 21. ; char istr; op= 22. ; char op; ans= 24. ; int ans; timo= 26. ; int timo; /* Watchdog timer */ owner= 28. ; int owner; /* GPIB owning process */ rdbcr= 30. ; int rdbcr, rdbar, rdcsr; rdbar= 32. rdcsr= 34. rdintern= 36. ; char rdinternal[8]; .if eq,ONLYC mbuf= 44. ; char mbuf[BSIZ]; iidx= 44.+BSIZ ; int iidx, oidx, cnt; oidx= 46.+BSIZ cnt= 48.+BSIZ .endc ; } ib; .iif eq,ONLYC, IBSLEN= 50.+BSIZ .iif ne,ONLYC, IBSLEN= 44. r0= %0 r1= %1 r2= %2 r3= %3 r4= %4 r5= %5 sp= %6 pc= %7 .mcall pktdf$, ucbdf$, scbdf$, hwddf$, intsv$ pktdf$ ucbdf$ scbdf$ hwddf$ .macro SU instr src dst instr ibv2+src,@#UADDR+dst .endm SU .macro US instr src dst instr @#UADDR+src,ibv2+dst .endm US .macro xU instr src dst instr src,@#UADDR+dst .endm xU .macro Ux instr src dst .if nb,dst instr @#UADDR+src,dst .iff instr @#UADDR+src .endc .endm Ux .macro SS instr src dst instr ibv2+src,ibv2+dst .endm SS .macro xS instr src dst instr src,ibv2+dst .endm xS .macro Sx instr src dst .if nb,dst instr ibv2+src,dst .iff instr ibv2+src .endc .endm Sx .macro addr loc dst mov #loc,dst .endm addr .macro Xfer rw a n r xU mov #-+,bcr mov ibv2xmem,r0 mov ibv2phys,r1 add #a,r1 adc r0 ; propagate carry to XBA xU mov r1,bar swab r0 Sx bisb ccf,r0 xU mov r0,ccf Sx mov csr,r0 bic #^C,r0 bis #rw,r0 xU mov r0,csr jsr pc,iwait .endm Xfer .macro cjmp t f .macro j't' a ?b b'f' b jmp a b: .endm j't' .macro j'f' a ?b b't' b jmp a b: .endm j'f' .endm cjmp .irp j,<,> cjmp j .endr NFNS= 20. begin= . $ibtbl:: ibini, ibcan, ibout, ibpwf ibini: ;gpib() call $gtpkt ; for(;;) bcs ibretn ; getpacket(&f,&a1,&a2); Exclude ; Exclude; mov r1,r3 Sx clr ans ; ib.ans= 0; Sx tstb cstate ; if(ib.cstate==INACTIVE && (x=init())<0) goto quit bne 1$ jsr pc,init bcs 9$ 1$: movb I.FCN+1(r3),r0 ; if(f<0 || f>=NFNS) x= ENOFUN; cmp r0,#NFNS bhis 8$ asl r0 ; else x= (*ibfn[f])(a1,a2); jsr pc,@ibfn(r0) br 9$ 8$: mov #ENOFUN,r0 9$: ;quit: tst r0 bne ibdone mov r5,cntbl movb S.ITM(r4),S.CTM(r4) Unexclude ibretn: return ibdone: mov r0,r1 ; if(x==ASYNOP) wait(); bpl 1$ mov #IE.DNR&0377,r0 ; else iodone(x); br 2$ 1$: mov #IS.SUC&0377,r0 2$: Unexclude call $iodon br ibini ibfn: ;int (*ibfn[])()= { cancel ; &cancel, &write, &read, &nofn, write ; &nofn, &command, &transfer, read ; &clear, &remote, &local, ¶llel, nofn ; &passcontrol, &setstatus, &monitor, &readcommand, nofn ; &setparameters, &testsrq, &finish, &status, command ; &spbyte }; transfer clear remote local parallel passcontrol setstatus monitor readcommand setparameters testsrq finish status spbyte ibpwf: Sx clrb cstate return ibcan: cmp r1,I.TCB(r0) beq ibout return ibout: jsr pc,ibstop clr cntbl br ibq ibcompl:clr cntbl call $fork ibq: Exclude Sx mov ans,r0 br ibdone init: ;init() char *cp; .if df,M$$MGE mov #ibv2,r2 bic #160000,r2 mov @#KISAR5,r1 clr r0 ashc #6,r0 add r2,r1 adc r0 .iff mov #ibv2,r1 clr r0 .endc mov r1,ibv2phys mov r0,ibv2xmem Sx clr csr ; ib.csr= 0; IB->csr= LMR; xU mov #LMR,csr addr ibv2+hidden,r0 ; cp= &ib.hidden[0]; movb #.CLKR+6,(r0)+ ; *cp++= _CLKR | 6; movb #.PPR+U,(r0)+ ; *cp++= _PPR | U; movb #.AUXA,(r0)+ ; *cp++= _AUXA; ; *cp++= _AUXB | TRI | CPT_ENAB; movb #.AUXB+TRI+CPTENAB,(r0)+ ; cp= &ib.internal[0]; clrb (r0)+ ; *cp++= 0; movb #CPTIE+ERRIE,(r0)+; *cp++= CPT_IE | ERR_IE; clrb (r0)+ ; *cp++= 0; clrb (r0)+ ; *cp++= 0; movb #EXT,(r0)+ ; *cp++= EXT; ; *cp++= ib.hidden[CLKR]; Sx movb hidden+CLKR,(r0)+ movb #ARS+MSA,(r0)+ ; *cp++= ARS | MSA; clrb (r0)+ ; *cp++= 0; clr (r0)+ ; ib.istr= ib.op= 0; clr (r0)+ ; ib.ans= 0; mov #GTIMO,(r0)+ ; ib.timo= GTIMO; movb #GTIMO,S.ITM(r4) jsr pc,irload ; if((x=irload())<0) return x; bcs 10$ xS movb #IDLE,cstate ; ib.cstate= IDLE; xS mov #IE,csr ; IB->csr= ib.csr= IE; xU mov #IE,csr .if eq,ONLYC Sx clr iidx ; ib.iidx= ib.oidx= ib.cnt= 0; Sx clr oidx Sx clr cnt .endc clr r0 ; return 0; 10$: rts pc ibstop: ;ibstop() xS bic #DMAENAB+GO,csr ; IB->csr= (ib.csr=& ~(DMA_ENAB|GO)); SU mov csr,csr US mov bcr,rdbcr ; ib.rdbcr= IB->bcr; US mov bar,rdbar ; ib.rdbar= IB->bar; .if eq,ONLYC clr r0 jsr pc,rqs ; if(rqs(0)>=0) ib.ans= ETIMO; bcs 1$ .endc xS mov #ETIMO,ans 1$: Sx clrb op ; ib.op= 0; rts pc irload: ;irload() if((x=xfer(WTIR,&ib.internal[ISR1],7,ISR1))<0) return x; Xfer WTIR internal+ISR1 7 ISR1 bcs 10$ ; ib.internal[AUX]= ib.hidden[AUXA]; SS movb hidden+AUXA,internal+AUX xS movb #MA,internal+ADR; ib.internal[ADR]= MA; ; if((x=xfer(WTIR,&ib.internal[AUX],2,AUX))<0) return x; Xfer WTIR internal+AUX 2 AUX bcs 10$ ; if((x=xfer(WTIR,&ib.hidden[AUXB],1,AUX))<0) return x; Xfer WTIR hidden+AUXB 1 AUX bcc lun0 ; return lun(ib.internal[ADM]); 10$: rts pc lun: ;lun(newadm) /* Note: rsv is cleared and not restored*/ xS cmpb r0,internal+ADM ; if(ib.internal[ADM]==newadm) return OK; beq .9$ xS movb r0,internal+ADM ; ib.internal[ADM]= newadm; lun0: Sx clrb internal+AUX ;lun0: ib.internal[AUX]= PON; ; if((x=xfer(WTIR,&ib.internal[ADM],2,ADM))<0) return x; Xfer WTIR internal+ADM 2 ADM bcs .10$ .if eq,ONLYC .if ne,PPENAB Xfer WTIR hidden+PPR 1 AUX bcs .10$ ; if((x=xfer(WTIR,&ib.hidden[PPR],1,AUX))<0) return x; xS bitb #S,istr ; if(ib.istr&S) beq .9$ ; return ldaux(IST); mov #IST,r0 jsr pc,ldaux bcs .10$ .endc .endc .9$: clr r0 ; return OK; inc r0 .10$: rts pc cancel: jsr pc,ibstop ;cancel() ibstop(); nofn: mov #OK,r0 ;nofn: return OK; rts pc command: ;command(bp,n) char bp[n]; jsr pc,tcs. ; if((x=tcs())<0) bcs 10$ mov #TON,r0 ; if((x=lun(TON))<0) return x; jsr pc,lun bcs 10$ tst U.CNT(r5) ; if(n==0) return OK; beq 9$ xS movb #CAC,op ; ib.op= CAC; xS bic #ECC,csr ; return xfer(WT,bp,n,0); jmp wtxfer 9$: mov #OK,r0 10$: rts pc write: ;write(bp,n) char bp[n]; mov #TON,r0 ; if((x=gts(TON))<0) jsr pc,gts bcc 3$ .if eq,ONLYC tst U.CNT(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ jsr pc,rdads ; if((x=rdads())<0) return x; bcs 10$ xS bitb #TA,rdintern+ADS; if((ib.rdinternal[ADS]&TA)==0) bne 3$ mov #RQTSTB,r0 ; if((x=rqs(RQT_STB))<0) return x; jsr pc,rqs bcc 3$ ; else 1$: .endc rts pc ; return x; 3$: tst U.CNT(r5) ; if(n==0) return OK; beq 9$ xS movb #TAC,op ; ib.op= TAC; xS bitb #2,internal beq 4$ ; return xfer(WT,bp,n,(ib.internal[0]&2? SEOI:0)); xS bis #ECC,csr xS movb #SEOI,ccf br wtxfer 4$: xS bic #ECC,csr br wtxfer 9$: mov #OK,r0 10$: rts pc wtxfer: xS bis #WT,csr jsr pc,ldr mov #DMAO,r0 br ibxfer rdxfer: xS bic #OUT,csr xS bis #RD,csr jsr pc,ldr mov #DMAI,r0 ibxfer: ;xfer(rw,bp,n,ccfn) char bp[n]; ; if(ccfn) IB->ccf= ib.ccf= ccfn; ib.csr=| ECC; ; else ib.csr=& ~ECC; ; ldr(bp,n); ib.csr= ib.csr&~OUT | rw; ibxfr0: xS cmpb r0,internal+IMR2; x= rw&OUT? DMAO:DMAI; beq 1$ ; if(x!=ib.internal[IMR2]) xS movb r0,internal+IMR2; ib.internal[IMR2]= x; Xfer WTIR internal+IMR2 1 IMR2 bcc 1$ ; if((x=xfer(WTIR,&ib.internal[IMR2],1,IMR2))<0) Sx clr op ; ib.op= 0; br 10$ ; return x; 1$: SU mov bcr,bcr ; IB->bcr= ib.bcr; SU mov bar,bar ; IB->bar= ib.bar; SU mov ccf,ccf ; IB->ccf= ib.ccf; IB->xba = ib.xba; SU mov csr,csr ; IB->csr= ib.csr; clr r0 ; return ASYNOP; 10$: rts pc read: ;read(bp,n) char bp[n]; mov #LON,r0 ; if((x=gts(LON))<0) jsr pc,gts bcc 3$ .if eq,ONLYC tst U.CNT(r5) ; if(n && x==ENOTCAC) beq 1$ cmp r0,#ENOTCAC bne 1$ jsr pc,rdads ; if((x=rdads())<0) return x; bcs 10$ xS bitb #LA,rdintern+ADS; if((ib.rdinternal[ADS]&LA)==0) bne 3$ mov #RQLSTB,r0 ; if((x=rqs(RQL_STB))<0) return x; jsr pc,rqs bcc 3$ ; else 1$: .endc rts pc ; return x; 3$: tst U.CNT(r5) ; if(n==0) return OK; beq 9$ Sx movb internal,r0 ; if(ib.internal[0]&2<<4) ib.hidden[AUXA]=| REOS | (ib.internal[0]&1<<4? 0:BIN); bitb #2*16.,r0 beq 4$ xS bisb #REOS,hidden+AUXA bitb #1*16.,r0 bne 4$ xS bisb #BIN,hidden+AUXA 4$: bitb #4*16.,r0 ; if(ib.internal[0]&4<<4) ib.internal[IMR1]=& ~END_IE; beq 41$ xS bicb #ENDIE,internal+IMR1 br 42$ ; else ib.internal[IMR1]=| END_IE; 41$:xS bisb #ENDIE,internal+IMR1 Sx cmpb cstate,#STANDBY ; if(ib.cstate==STANDBY) bne 42$ xS bisb #HLDE,hidden+AUXA; ib.hidden[AUXA]=| HLDE; 42$:SS movb hidden+AUXA,internal+AUX ; ib.internal[AUX]= ib.hidden[AUXA]; Xfer WTIR internal+IMR1 7 IMR1 bcs 10$ ; if((x=xfer(WTIR,&ib.internal[IMR1],7,IMR1))<0) return x; xS movb #LAC,op ; ib.op= LAC; Sx movb hidden+AUXA,r0 ; if(ib.cstate==STANDBY) x= ib.hidden[AUXA]= ib.hidden[AUXA]&~HLDE|HLDA; Sx cmpb cstate,#STANDBY ; else x= 0; bne 5$ ; return xfer(RD,bp,n,x); xS bis #ECC,csr bic #HLDE,r0 bis #HLDA,r0 xS movb r0,ccf xS movb r0,hidden+AUXA br 6$ 5$: xS bic #ECC,csr 6$: jmp rdxfer 9$: mov #OK,r0 10$: rts pc transfer: ;transfer() mov #EXT,r0 ; if((x=gts(EXT))<0) return x; jsr pc,gts bcs 10$ mov #OK,r0 ; return OK; 10$: rts pc clear: ;clear() jsr pc,unhold ; if((x=unhold())<0) return x; bcs 10$ .if ne,SAC Sx mov csr,r0 ; IB->csr= ib.csr | IFC; bis #IFC,r0 xU mov r0,csr jsr pc,wait100 ; wait100us(); xU bit #ATN,csr ; if(IB->csr&ATN) beq 1$ mov #ECACFLT,r0 ; return ECACFLT; br 10$ 1$: xS movb #INCHARGE,cstate; ib.cstate= INCHARGE; xS bis #ATN+SRQIE+CIC,csr SU mov csr,csr ; IB->csr= (ib.csr=| ATN | SRQ_IE | CIC); mov #TON,r0 ; return lun(TON); jmp lun .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc 10$: rts pc remote: ;remote() .if ne,SAC xS bis #REN,csr ; IB->csr= (ib.csr=| REN); SU mov csr,csr mov #OK,r0 ; return OK; .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc rts pc local: ;local() .if ne,SAC xS bic #REN,csr ; IB->csr= (ib.csr=& ~REN); SU mov csr,csr mov #OK,r0 ; return OK; .iff mov #ENOTSAC,r0 ; return ENOTSAC; .endc rts pc parallel: ;parallel() .if ne,PPENAB jsr pc,tcs. ; if((x=tcs())<0) return x; bcs 10$ mov #LON,r0 ; if((x=lun(LON))<0) return x; jsr pc,lun bcs 10$ xS bis #EOI,csr ; IB->csr= (ib.csr=| EOI); SU mov csr,csr Xfer RDIR rdintern+CPT 1 CPT bcs 10$ ; if((x=xfer(RDIR, &ib.rdinternal[CPT],1,CPT))<0) return x; xS bic #EOI,csr ; IB->csr= (ib.csr=& ~EOI); SU mov csr,csr ; IB->csr= ib.csr; mov #400,r0 ; return ib.rdinternal[CPT] | 0400; Sx bisb rdintern+CPT,r0 .iff mov #ENOPP,r0 ; return ENOPP; .endc 10$: rts pc passcontrol: ;passcontrol() .if eq,ONLYC Sx cmpb cstate,#INCHARGE; if(ib.cstate!=INCHARGE) beq 1$ mov #ENOTCAC,r0 ; return ENOTCAC; br 10$ 1$: movb #EXT,r0 ; if((x=lun(EXT))<0) return x; jsr pc,lun bcs 10$ xS bic #SRQIE+ATN+CIC,csr SU mov csr,csr ; IB->csr= (ib.csr=& ~(SRQ_IE | ATN | CIC)); xS movb #IDLE,cstate ; ib.cstate= IDLE; mov #OK,r0 ; return OK; .iff mov #ENOIBDEV,r0 ; return ENOIBDEV; .endc 10$: rts pc setstatus: ;setstatus(s) .if eq,ONLYC .if ne,PPENAB xS bitb #S,istr ; if((ib.istr&S) ^^ s) bne 2$ tst I.PRM+2(r3) beq 9$ xS bisb #S,istr mov #IST,r0 br 5$ 2$: tst I.PRM+2(r3) bne 9$ xS bicb #S,istr mov #NIST,r0 5$: jsr pc,ldaux ; return ldaux((ib.istr=^ S)? IST : NIST); bcs 10$ .endc .endc 9$: mov #OK,r0 ; return OK; 10$: rts pc monitor: ;monitor(m) .if eq,ONLYC tst I.PRM+2(r3) ; if(m) ib.istr=| MON; beq 1$ xS bisb #MON,istr br 5$ 1$: xS bicb #MON,istr ; else ib.istr=& ~MON; 5$: .endc mov #OK,r0 ; return OK; rts pc readcommand: ;readcommand() .if eq,ONLYC clr r0 Sx tst cnt ; if(ib.cnt<=0) return ENONE; ble 9$ Sx dec cnt ; ib.cnt--; addr ibv2+mbuf,r1 ; x= ib.mbuf[ib.oidx++]; Sx add oidx,r1 bisb @r1,r0 Sx inc oidx Sx cmp oidx,#BSIZ ; if(ib.oidx>=BSIZ) ib.oidx= 0; blt 5$ Sx clr oidx 5$: bis #400,r0 ; return x|0400; br 10$ 9$: dec r0 10$: rts pc .iff mov #ENONE,r0 ; return ENONE; rts pc .endc setparameters: ;setparameters(xrmd,eod,timo) xS movb I.PRM(r3),internal; ib.internal[0]= xrmd; xS movb I.PRM+1(r3),internal+EOS;ib.internal[EOS]= eod; movb I.PRM+2(r3),r0 ; ib.timo= timo; movb r0,S.ITM(r4) xS mov r0,timo mov #OK,r0 ; return OK; rts pc testsrq: ;testsrq(wait) mov #OK,r0 ; if(IB->csr&SRQ) return OK; xU bit #SRQ,csr bne 10$ neg r0 xS bit #CIC,csr ; if(ib.csr&CIC) IB->csr= (ib.csr=| SRQ_IE); beq 10$ xS bis #SRQIE,csr SU mov csr,csr tstb I.PRM+2(r3) ; if (wait) { beq 10$ xS movb #WSRQ,op ; ib.op = WSRQ clr r0 ; return ASYNOP; } 10$: rts pc ; return ENONE; spbyte: .if eq,ONLYC clr r0 jsr pc,rqs bcs 10$ mov I.PRM+2(r3),r0 jsr pc,rqs bcs 10$ .endc mov #OK,r0 10$: rts pc status: ;status () jsr pc,uphys ; User's buffer phys. addr. in r0-r1 jsr pc,mapr6 ; Map r0-r1 by APR6, return VA in r0 mov U.CNT(r5),r1 cmp r1,#IBSLEN blos 1$ mov #IBSLEN,r1 1$: add r1,r0 add #ibv2,r1 br 3$ 2$: movb -(r1),-(r0) 3$: cmp r1,#ibv2 bhis 2$ mov #OK,r0 rts pc mapr6: mov r1,-(sp) ashc #10.,r0 mov r0,@#KISAR6 mov #*256.+6,@#KISDR6 mov (sp)+,r0 bic #177700,r0 bis #140000,r0 rts pc uphys: .if df,M$$MGE&M$$EXT movb U.BUF+1(r5),r0 .iff mov U.BUF(r5),r0 ash #-4,r0 .endc mov U.BUF+2(r5),r1 rts pc finish: ;finish() Sx clrb cstate ; ib.cstate= INACTIVE; Sx clr csr ; ib.csr= 0; xU mov #LMR,csr ; IB->csr= LMR; mov #OK,r0 ; return OK; rts pc $ibint:: ;ibint() intsv$ IB, PRI, 1 tst r5 beq 2$ mov U.SCB(r5),r4 2$: mov r0,-(sp) mov r1,-(sp) jsr pc,ibint0 mov (sp)+,r1 mov (sp)+,r0 Sx tstb op bne 1$ tst r5 jne ibcompl 1$: jmp $intxt ibint0: US mov bcr,rdbcr ;ib.rdbcr= IB->bcr; US mov bar,rdbar ;ib.rdbar= IB->bar; US mov csr,rdcsr ;ib.rdcsr= IB->csr; .if eq,SAC Sx tst rdcsr ;if(ib.rdcsr&IFC) bpl 5$ xS bic #DMAENAB+SRQIE+ATN+CIC+GO,csr SU mov csr,csr ; IB->csr= (ib.csr=& ~(DMA_ENAB|SRQ_IE|ATN|CIC|GO)); Sx tstb cstate ; if(ib.cstate!=INACTIVE) beq 4$ xS movb #IDLE,cstate ; ib.cstate= IDLE; ; ib.hidden[AUXA]= _AUXA; xS movb #.AUXA,hidden+AUXA xS movb #FH,internal+AUX; ib.internal[AUX]= FH; xS movb #EXT,internal+ADM; ib.internal[ADM]= EXT; Sx clrb internal+IMR2 ; ib.internal[IMR2]= 0; jsr pc,irload ; if(irload()>=0) ib.ans= EIFCLR; bcs 3$ movb #EIFCLR,r0 3$: xS mov r0,ans 4$: Sx clrb op ; ib.op= 0; rts pc ; return; 5$: .endc chksrq: ;if((IB->csr&SRQ) && (ib.csr&SRQ_IE)) xU bit #SRQ,csr beq 5$ xS bit #SRQIE,csr beq 5$ xS bic #SRQIE,csr ; IB->csr= (ib.csr=& ~SRQ_IE) & ~GO; Sx mov csr,r0 bic #GO,r0 xU mov r0,csr xS cmpb #WSRQ,op bne 1$ mov #OK,r0 jmp quit 1$: Sx tst owner ; if(ib.owner) psignal(ib.owner,SRQINT); beq 5$ ; signal owner 5$: chkint: xU bit #INT,csr ;if(IB->csr&INT) jeq chkdone Ux mov bcr,r1 ;x= IB->bcr; Sx mov csr,r0 ; IB->csr= ib.csr & ~(DMA_ENAB|GO); bic #DMAENAB+GO,r0 xU mov r0,csr US mov csr,rdcsr ;ib.rdcsr= IB->csr; US mov bcr,rdbcr ;ib.rdbcr= IB->bcr; Sx tst rdbcr bne 14$ tst r1 beq 15$ 14$: Sx dec rdbcr 15$: US mov bar,rdbar ;ib.rdbar= IB->bar; Xfer RDIR rdintern+ISR1 5 ISR1 jcs quit ; if((x=xfer(RDIR,&ib.rdinternal[ISR1],5,ISR1))<0) goto quit; xS bitb #ERRIE,rdintern+ISR1 beq 1$ ; if(ib.rdinternal[ISR1]&ERR_IE) ib.ans= ENOIBDEV; xS mov #ENOIBDEV,ans jmp chkdone 1$: .if eq,ONLYC ; else if(ib.rdinternal[ISR1]&CPT_IE) xS bitb #CPTIE,rdintern+ISR1 beq 10$ Sx movb rdintern+CPT,r0 ; mbfsto(ib.rdinternal[CPT]); jsr pc,mbfsto .if ne,PPENAB xS bitb #PACS,istr ; if((ib.istr&PACS) && ib.rdinternal[CPT]>=SCG) beq 2$ xS bicb #PACS,istr ; ib.istr=& ~PACS; cmpb r0,#SCG blt 2$ xS movb r0,hidden+PPR ; ib.hidden[PPR]= ib.rdinternal[CPT]; br 8$ ; goto lpe; .endc 2$: cmpb r0,#TCT ; switch(ib.rdinternal[CPT]) bne 5$ ; case TCT: xS bitb #TA,rdintern+ADS; if((ib.rdinternal[ADS]&TA)==0) break; beq 9$ jsr pc,valid ; if((x=valid())<0) goto quit; jcs quit xS movb #CADS,cstate ; ib.cstate= CADS; br chkdone 5$: .if ne,PPENAB cmpb r0,#PPC ; case PPC: bne 6$ xS bitb #LA,rdintern+ADS; if(ib.rdinternal[ADS]&LA) beq 6$ xS bisb #PACS,istr ; ib.istr=| PACS; br 9$ ; break; 6$: cmpb r0,#PPU ; case PPU: bne 9$ ; ib.hidden[PPR]= _PPR | U; xS movb #.PPR+U,hidden+PPR 8$: Xfer WTIR hidden+PPR 1 AUX jcs quit ; lpe: if((x=xfer(WTIR,&ib.hidden[PPR],1,AUX))<0) goto quit; ; break; .endc 9$: jsr pc,valid ; if((x=valid())<0) goto quit; jcs quit 10$: .endc xS bitb #ENDIE,internal+IMR1; if(ib.internal[IMR1]&END_IE) beq chkdone ; ib.internal[IMR1]=& ~END_IE; xS bicb #ENDIE,internal+IMR1 Xfer WTIR internal+IMR1 1 IMR1 jcs quit ; if((x=xfer(WTIR,&ib.internal[IMR1],1,IMR1))<0) goto quit; chkdone: ;chkdone: Ux tstb csr ;if((IB->csr&DONE) && (ib.csr&GO)) bpl chktct xS bit #GO,csr beq chktct Sx dec csr ; ib.csr=& ~GO; xS bit #NEX,rdcsr ; if(ib.rdcsr&NEX) ib.ans= ENEXMEM; beq 2$ xS mov #ENEXMEM,ans 2$: .if eq,ONLYC clr r0 ; if((x=rqs(0))<0) goto quit; jsr pc,rqs bcs quit .endc Sx mov rdbcr,r0 ; x= ib.rdbcr - ib.bcr; /* number of bytes transferred */ Sx sub bcr,r0 SS sub bar,rdbar ; if(ib.rdbar - ib.bar != x) x= ECNTRS; Sx cmp rdbar,r0 beq 3$ mov #ECNTRS,r0 3$: Sx tst ans ; if(ib.ans==0) bne wake quit: ;quit: ib.ans= x; xS mov r0,ans wake: Sx clrb op ; ib.op= 0; rts pc chktct: .if eq,ONLYC Sx cmpb op,#RQC ;else if(ib.op==RQC && (IB->csr&CIC)) bne 10$ xU bit #CIC,csr beq 10$ mov #TON,r0 ; if((x=lun(TON))<0) goto quit; jsr pc,lun bcs quit xS movb #CAC,op ; ib.op= CAC; mov #DMAO,r0 xS bic #ECC,csr ; if((x=xfer(WT,ib.bar,ib.bcr,0))<0) xS bis #WT,csr jsr pc,ibxfr0 bcs quit ; goto quit; .endc 10$: rts pc ;return; gts: ;gts(newadm) mov r0,-(sp) jsr pc,uncads ; if((x=uncads())<0) return x; bcs 2$ jsr pc,unhold ; if((x=unhold())<0) return x; 2$: mov (sp)+,r1 bcs 10$ mov r1,r0 Sx cmpb cstate,#STANDBY ; if(ib.cstate==STANDBY) bne 1$ Sx cmpb internal+ADM,r0 ; return (ib.internal[ADM]==newadm)? 0:ENOIBDEV; beq 9$ mov #ENOIBDEV,r0 br 12$ 1$: Sx cmpb cstate,#IDLE ; if(ib.cstate==IDLE) return ENOTCAC; beq 11$ jsr pc,lun ; if((x=lun(newadm))<0) return x; bcs 10$ xS bic #ATN,csr ; IB->csr= (ib.csr=& ~ATN); SU mov csr,csr xS movb #STANDBY,cstate ; ib.cstate= STANDBY; 9$: clr r0 10$: rts pc 11$: mov #ENOTCAC,r0 12$: sec rts pc tcs.: ;tcs() mov #ECADS,r0 jsr pc,uncads ; if ((x = uncads ()) < 0) bcs 10$ ; return x; Sx cmpb cstate,#INCHARGE; if(ib.cstate==INCHARGE) return 0; beq 9$ Sx cmpb cstate,#IDLE ; if(ib.cstate==IDLE) return ENOTCAC; beq 11$ xS bis #ATN,csr ; IB->csr= (ib.csr=| ATN); SU mov csr,csr xS movb #INCHARGE,cstate; ib.cstate= INCHARGE; br unhold ; return unhold(); 9$: clr r0 10$: rts pc 11$: mov #ENOTCAC,r0 sec rts pc uncads: ; uncads () .if eq,ONLYC ; xS cmpb #CADS,cstate ; if (ib.cstate == CADS) bne 1$ ; xU bit #ATN,csr ; if (IB->csr & ATN) beq 2$ ; mov #ECADS,r0 ; return ECADS; sec ; rts pc ; else { 2$: xS movb #INCHARGE,cstate; ib.cstate = INCHARGE; xS bis #ATN+SRQIE+CIC,csr; ib.csr |= ATN | SRQIE | CIC; SU mov csr,csr ; IB->csr = ib.csr 1$: ; .endc ; clr r0 ; } rts pc ; return 0; ; } unhold: ;unhold() xS bitb #HLDE+HLDA,hidden+AUXA beq 9$ ; if(ib.hidden[AUXA]&(HLDE|HLDA)) ; ib.hidden[AUXA]= _AUXA; xS movb #.AUXA,hidden+AUXA mov #FH,r0 jsr pc,ldaux bcs 10$ Xfer WTIR hidden+AUXA 1 AUX bcs 10$ ; if((x=ldaux(FH))<0 || (x=xfer(WTIR,&ib.hidden[AUXA],1,AUX))<0) return x; 9$: clr r0 ; return 0; 10$: rts pc ldr: mov U.CNT(r5),r0 ;ldr(bp,n) char bp[n]; neg r0 ; ib.bcr= -n; xS mov r0,bcr xS mov U.BUF+2(r5),bar ; ib.bar= bp; .if df,M$$MGE&M$$EXT movb U.BUF+1(r5),r0 .iff mov U.BUF(r5),r0 ash #-4,r0 .endc xS movb r0,xba rts pc .if eq,ONLYC mbfsto: ;mbfsto(c) xS bitb #MON,istr ; if((ib.istr&MON)==0) return; beq 10$ Sx cmp cnt,BSIZ ; if(ib.cnt>=BSIZ) return; bge 10$ Sx inc cnt ; ib.cnt++; addr ibv2+mbuf,r1 ; ib.mbuf[ib.iidx++]= c; Sx add iidx,r1 movb r0,@r1 Sx inc iidx Sx cmp iidx,#BSIZ ; if(ib.iidx>=BSIZ) ib.iidx= 0; blt 10$ Sx clr iidx 10$: rts pc ; return; rdads: ;rdads() Xfer RDIR rdintern+ADS 1 ADS rts pc ; return xfer(RDIR,&ib.rdinternal[ADS],1,ADS) rqs: ;rqs(r) xS cmpb r0,internal+SPM ; if(ib.internal[SPM]==r) return 0; bne 1$ clr r0 br 10$ 1$: xS movb r0,internal+SPM ; ib.internal[SPM]= r; Xfer WTIR internal+SPM 1 SPM 10$: rts pc ; return xfer(WTIR,&ib.internal[SPM],1,SPM); valid: mov #VSC,r0 ;valid() return ldaux(VSC); .endc ldaux: ;ldaux(c) xS movb r0,internal+AUX ; ib.internal[AUX]= c; Xfer WTIR internal+AUX 1 AUX rts pc ; return xfer(WTIR,&ib.internal[AUX],1,AUX); iwait: mov #ITIMO,r0 1$: Ux mov csr,r1 tstb r1 bmi 2$ dec r0 bne 1$ mov #EITIMO,r0 br 9$ 2$: bit #NEX,r1 bne 7$ Ux tstb bcr+1 bne 8$ Sx mov csr,r0 bic #^C,r0 xU mov r0,csr clr r0 br 10$ 7$: mov #EINEXM,r0 br 9$ 8$: mov #EIDMACNT,r0 9$: sec 10$: rts pc wait100:mov #100.,r0 ;wait100us() 1$: dec r0 bne 1$ rts pc ibv2: .rept IBSLEN/2 0 .endr ibv2phys:0 ibv2xmem:0 psave: 0 cntbl: 0 size= .-begin .end .enabl lc .title IB2TAB - GPIB11-2 RSX11M Driver Data Structures .nlist bex, ttm, cnd ; This software is provided solely for use with ; the National Instruments GPIB11-2. ; Copyright 1980 National Instruments ; Jeffrey Kodosky ; April 1980 ; Edit 01/19/81 ; REV C: 01/01/82 ; REV D: 09/29/82 ; V1: 09/26/83 Now correctly handles 22-bit addressing LD$IB=0 ; Edit the following assignments to reflect the GPIB11-2 switch settings UADDR= 0167710 ; Unibus address VECT= 0310 ; Vector address PRI= 0240 ; Interrupt priority .ident /01/ .mcall devdf$,hwddf$,ucbdf$ devdf$ hwddf$ ucbdf$ ; Device Control Block $ibdat:: ibdcb: .word 0,.ib0 .ascii /IB/ .byte 0,0 .word ibnd-ibst .if df,LD$IB .word 0 .iff .word $ibtbl .endc .word 177777,177730,0,0 .word 17,13,0,0 .if df,L$$DRV .word 0 .endc ; ; Unit Control Block ibst=. .if df,M$$MUP .word 0,0 .endc .ib0:: .word ibdcb,.-2 .byte UC.PWF!UC.NPR,0,0,0 .if df M$$MGE&M$$EXT .word DV.EXT .iff .word 0 .endc .word 0,0,64. .word ibscb,0 .blkw 3 ibnd=. ; .if ndf,LD$IB .asect ; Interrupt Vector .=VECT .word $ibint .word 340 .psect .endc ; Status Control Block ibscb: .word 0,ibscb .byte PRI,VECT/4 .byte 0,10. .byte 0,0 .word UADDR .blkw 5 .if df,L$$DRV&M$$MGE .blkw 1 .endc $ibend::.end