> RemDespl  Remote Print Despooler  ??-??-89 V1.00 (0 28-07-89 V1.02 ARBS: Initial release (?) 28 11-02-90 V1.02d RobCowell: Printer type selection token for century number F0 03-07-98 V1.90 JGH: Completely rewritten P2 20-07-98 V1.91 JGH: Multiple ports allowed ZD 20-07-98 V1.92 JGH: Uses %PrintQ.rpsNet!Stn, vdu2 after *fx5 dL 26-06-99 V1.93 JGH: Proper closing, Q to quit, -poll/-run/-quit opts nC 12-07-99 V1.94 JGH: Temp'y: *PRINTOUT files always send LFs xL 24-12-99 V1.95 JGH: , , , , cr/lf handling I 02-02-00 V1.96 JGH: Fixed PrBuf loop bug, use$ bug, tidied errors : 0&87:23;2,53;0;0;0:A$=OS_GetEnv:::end ;ver$="1.96":ver%=("&"+(10*ver$)):delay%=30:F%=0:G%=0 4qt$="":qtime%=0:title("Remote Print Despooler") 9qt$=cl(" -q",1):A%=cl("-r",1):A%:qtime%=+6000*A% 2aud$=cl("-a",1):A%=cl("-p",1):A%:delay%=A% fcl("-?",0):"Syntax: "run$" ((:)... -poll delay -runtime time -quit command":end : ܊fx(130,0)<>&FFFF:"Please turn 2nd processor off"'"and re-run the Despooler."'"Event code needs to be in I/O memory";:A%=(200):end /@%=&90A:timeout%=2:svIdle$="Despooler idle" PN$=A$:"Initialising...";  BPrMax%=16 : will be set back to 8 automatically if necessary B PrName$(PrMax%),PrNum%(PrMax%),Banner$(PrMax%),Port%(PrMax%) 6 A%=0 PrMax%:PrNum%(A%)=&FF:PrName$(A%)=6," ") ")PrName$(A%)="":Banner$(A%)=18," "): ,: 63 ctrl% &100,FSOp% &80,prod% 9,data% &400,TC%15 @$name%=FSOp%+9:X%=ctrl%:Y%=X%256 J7AssemOpen:anfs=anfs:AssemEventcode:svT(svIdle$) T ^13;39;13; h("Checking network and %PrintQ..."; r.A%=&13:!X%=8:&FFF1:Stn%=X%?1:Net%=GetNet |1LD$="%PRINTQ.rps"+d0(Net%,3)+"!"+d0(Stn%,3) $"CDir "+LD$:"Access "+LD$+" L" -T%=FS_Cli("Rename "+LD$+".* %PrintQ.Z*") : 13;39;13; YPN$="":'"Enter printer names to despool using"'"syntax: (:)":'" "PN$ 0PN$=ucase(PN$+" "):parse(PN$):DecodeNames +title("Remote Print Despooler"):*FX229 #"Polling for these printers:" A%=1num% !(A%-1)*10)""PrName$(A%);: 8fx(206,&FF00)&80:''"Disconnecting REMOTE":*ROFF +rx%=SetUpRx(&9F,0,prod%,9): EventInit line%=5+(num%-2)4 /0,line%)135157132;:28,0,24,39,line%+2 : :: GOTO comes back here & DtD 0&X%=ctrl%:Y%=X%256::svT(svIdle$) :%time$=FS_Time:status("Polling") DBN$=poll:N$="":status("Idle"):wait: If none waiting, pause N8A%=(0):N$<>""(qtime%<>0 >qtime%)(A%&DF)="Q" XN$="":shutdown:end b&time$=FS_Time:status("Printing") l6status$=N$:crlf%=0:raw%=0:alf%=0:use$="": tRD vCprintout%=(access_byte=&23): Is it a *PRINTOUT reference file? : 9"FX5,"+Port%(flag%):2:status("Doing banner file") 2Banner$(flag%)="":F%=0 F%=(Banner$(flag%)) 5UsrStn%=getstn(LD$+"."+N$):UsrStn$=stn(UsrStn%) G%=(LD$+"."+N$) 1?X%=G%:X%!1=data%:X%!5=&19:X%!9=0:A%=3:&FFD1 9 I%=0 14:TC%?I%=data%?I%:: Copy time info to TC% +data%?25=13:UsrName$=$(data%+15):*FX3,4 >status$=status$+" "+UsrName$+" "+UsrStn$+" ":svT(status$) a" "UsrStn$" "UsrName$;(11-UsrName$)"printed at "d0(TC%?7,2)":"d0(TC%?8,2)":"d0(TC%?9,2) B" Despooling "N$" on "PrName$(flag%)" to "port(Port%(flag%)) *FX3 &printout%:t%=FindFile:#G%:G%=t% (aud$<>"": Output audit information Bstatus("Doing starttext"):doban():status("Doing printout")  4G%:PrText "Error: Unable to access ";name$ 4status("Doing endtext"):doban():F%:#F%:F%=0  $3::"DELETE "+LD$+"."+N$:T\B *: 4,PrText:x%=1:time$=FS_Time:status("") >"":status("Printing"):#G%:G%=0:use$+name$:2: H4?X%=G%:length%=#G%:printout%:X%!9=0 X%!9=&19 R3:length%:SoFar%=X%!9/length%*100 SoFar%=100 \(status("Printed data "+SoFar%+"%") f7X%!1=data%:X%!5=&400:A%=3:&FFD1:crlf%=0:ScanCRLF pX%!5<>&400:PrBuffer zX%!5<>0:#G%:G%=0: : PrBuffer 8 I%=data% data%+&3FF-X%!5:?I%<>9: 1,?I%:x%=x%+1 ?I%=9:raw%:1,9 2?I%=9:raw%:A%=1(8-(x%8)):1,32:x%=x%+1: +?I%=13:x%=1:crlf%=2:1,10:alf%:1,10 +?I%=10:x%=1:crlf%=3:1,13:alf%:1,10  ?I%=10:crlf%=1:alf%:1,10 : : ,ScanCRLF: What line terminators used?  printout% raw%:crlf%=0: 5A%=$data%:A%=0 ?data%<>13:crlf%=3:: LF only 3A%>(&3FF-X%!5):crlf%=3:: small file, LF only 8A%=0:data%?1=10:crlf%=1:: CR,LF at start of file Adata%?(A%-1)=10 data%?(A%+1)=10:crlf%=1:: LF,CR or CR,LF $crlf%=2:: CR only .: 8CloseAll BF%:A%=F%:F%=0:#A% LG%:A%=G%:G%=0:#A% V `: jG (Error while idle OR error in printing error handler) comes here: t::=17:T\B dDD ~ & Error while printing comes here: :: DtD 3:CloseAll 6 =17:" * Flushed *":"DELETE "+LD$+"."+N$:T\B : = Non-Escape error while idle or printing continues here: :::" at line ";  DtD svT("Trying to recover") $status("Attempting to restart") -T%=FS_Cli("RENAME "+LD$+".* %PRINTQ.Z*") wait:"Restarted OK":T\B   shutdown .status("Shutting down"):CloseAll:*FX13,4 3?&220=?OldEVNTV:?&221=OldEVNTV?1: 28,0,24,39,0 (!"Access "+LD$:"Delete "+LD$ 2%"Station shutting down"':end: <: Fend:qt$="":A$=13: P,A$=qt$:qt$="":A$=42:A$:A$=13: A$ Z d: n*ݤcl(l$,n%):l$=32 A$<>"":A$=" "+A$ xbI%=A$,l$):l$="":I%>0n%>0:l$=A$,A$+" "," ",I%+1)+1):A$,I%,1)<>" ":l$=l$,l$+" "," ")-1) qI%:A$,I%,1)=" ":A$=A$,2+(A$<>32),I%-2-(I%=1)) I%:A$=A$,I%-1)+A$,A$+" "," ",A$+" "," ",I%)+l$)+1) *A$=strip(A$):n%:=strip(l$) =I%<>0 : title(T$)::132;157;135;141;(16- T$/2);T$'132;157;135;141;(16- T$/2);T$'135;157;132" (C)1999 J.G.Harston. Version "ver$:  +status(s$):s$=s$+22," "),22):*FX3,4 Qvpos%=:26:3,line%)time$" Status: "s$:28,0,24,39,line%+2:0,vpos%);:*FX3   ?ݤFindFile:?X%=G%:X%!1=data%:X%!5=512:X%!9=&100:A%=3:&FFD1 ?A%=data%:name$="":name$=name$+"."+$A%:A%=A%+1+$A%:?A%=13 N%:I%=I%+N%:TbF: if we've done this lot then do some more JAPrinterMatch(P%?17 15)=0:DrF: check logical printer num Taccess_byte=P%?18 &3F ^-A%=P%?10:P%?10=13:N$=strip($P%):P%?10=A% h`access_byte=&21 access_byte=&23:T%=FS_Cli("Rename %PrintQ."+N$+" "+LD$+"."+N$):T%=0:=N$ r::P%=P%+27:Z%=Z%+1:D@F |: )ݤFS_Cli(A$):!X%=((A$)+8)*256:X%!4=0 "$(X%+7)=A$:A%=&14:&FFF1:=X%?3  :ݤgetstn(A$):!X%=&12000000:X%?1=(A$)+9:X%!4=&40000000 O$(X%+8)=A$:A%=&14:&FFF1:X%?3:'"FS error in getstn ";X%?3": "$(X%+4):end =(X%!5 &FFFF)  0ݤFS_Time:!X%=&10000700:X%!4=0:A%=&14:&FFF1  =d0(X%?6,2)+":"+d0(X%?7,2)  0gettime:!X%=&10000700:X%!4=0:A%=&14:&FFF1 7X%?3:'"FS error in gettime ";X%?3": "$(X%+4):end TC%!10=X%!4:TC%?14=X%?8:  /ݤgetdir(N%): Scan %PrintQ to find entries !X%=&3001200:X%!4=0 &9X%?8=N%:X%?9=4 : N%=entry point, 4=number to examine 0$$(X%+10)="%PrintQ":A%=&14:&FFF1 :]X%?3:'"FS error in getdir ";X%?3": "$(X%+4):svT("FS error "+~X%?3):=0 svT(svIdle$) D-=X%?4 : returns number examined N X%ݤGetNet: Assembles in data area b-zp=&A8:tx_tries=&AA:rx_tries=&AB:rply=&9D l&pass=0 2 2:P%=data%:[OPT pass v5.norxcb:.rxdata:\ Reads data over following code: BRK:BRK:EQUS "Rxcb?":BRK ,.getnet:\On exit; A=local network number LDA #3:STA tx_tries *TAX:LDA #&34:JSR &FFF4:\ Delete Rxcb#3 /JSR rxoprd:LDA rxcb:BEQ norxcb:\ Can't open  .tx_again 'LDA #&82:STA txcb:\ 'What net' call #LDX #txcb 255:LDY #txcb 256 ALDA #&10:JSR &FFF1:LDA txcb:BEQ tx_again:\ Loop until started  .txwait 6LDA #50:JSR &FFF4:TXA:BMI txwait:\ Poll until done +ROL A:BMI tx_again:\ Try again if error +LDA #0:STA rx_tries:\Poll rx (for 25ms)  .rxwait  *LDA #51:LDX rxcb:JSR &FFF4:TXA:BMI rx1 BIT &FF:BMI escaped  3DEC rx_tries:BNE rxwait:\ wait approx 256*100us *DEC tx_tries:BNE tx_again 4(JSR delete_rx:LDA #0:RTS:\ timed out >.rx1 H,JSR rxoprd:LDA rxdata:RTS:\ read message R.delete_rx \LDX rxcb:LDA #52:JMP &FFF4 f .escaped p#LDA #&7E:JSR &FFF4:\ Ack escape zJSR delete_rx !BRK:EQUB 17:EQUS "Escape":BRK  .rxoprd 6LDX #rxcb 255:LDY #rxcb 256:LDA #&11:JMP &FFF1  .txcb =EQUB 0:EQUB &9C:EQUW &FFFF:EQUS "BRIDGE":EQUB rply:EQUB 0  .rxcb >EQUB 0:EQUB &7F:EQUB rply:EQUW 0:EQUD rxdata:EQUD rxdata+2 ]::=(getnet)&FF  1doban(Start%):F%=0:: No banner file open / Start%<>0 - Do StartText; =0 - Do EndText ( I%,J%,B%,TB%,AB%,T$,A%,T2$,NC%,TI% 5?X%=F%:X%!9=0:B%=:TB%=:AB%=:T$="":T2$="":NC%=0 $TI%=TC%+10: Point to start time  =X%!1=data%:X%!5=&400:A%=3:&FFD1: Read 1k of banner file $%B%=: I%=data% data%+&3FF-X%!5 . ?I%=124:B%=:t~J 8 B%:TNK B TB%:TvK L ?I%<>60:t\I V AB%:AB%=:t\I ` T2$="" Start%:tRI j I%=1 (T2$) t 1,(T2$,I%,1)) ~ NC%=NC%+1   T2$="":T$="" :: AB%:TvK > T2$=T2$+(?I%): ?I%>64:T$=T$+(?I% &5F) T$=T$+(?I%) ( ?I%<>62:D^K: ...AND LEN(T$)<11 4 T$="" T$="":Start%=Start%:dpJ  T$="":NC%=0:T2$="" 9 T$,4)="T$="":T2$="spooled output":printout%:T2$=name$ , T$="":T2$="":gettime:TI%=TC%+10 $ T$="":T2$="":TI%=TC%+5 T$="":T2$="":TI%=TC% / T$="" T$="":T2$=d0(TI%?2,2) 1 T$="" T$="":T2$=d0(TI%?3,2) (1 T$="" T$="":T2$=d0(TI%?4,2) 25 T$="<12HOURS>":T2$=" "+((TI%?2+11) 12+1),2) <2 T$<>"" TI%?2>11:T2$="pm" T2$="am" F* T$="":T2$=" "+(?TI% 31),2) P" T$="":T2$=st(?TI% 31) Z,T$="":T2$=Month(TI%?1 16) d$T$="":T2$=Mon(TI%?1 16) n'T$="":T2$=d0(TI%?1 16,2) x8T$="":T2$=d0((?TI% &E0)2+TI%?1 16+1981,2) :T$="":T2$=(((?TI% &E0)2+TI%?1 16+1981)100) T$="":T2$="":raw%= T$="":T2$="":raw%= T$="":T2$="":alf%= T$="":T2$="":alf%= 0T$,5)="63:?I%=?I% &1F  ?I%=63:?I%=&7F " ?I%=33:TB%=:D^K , TvK 6:: Start%:DTK @ TB%: 1,?I%+128 1,?I% J NC%=NC%+1 T TB%=:B%= ^:::X%!5<>0: h: rlݤport(A%):A%>4:="User"+A% ="SinkParallelSerialUserNet","0105131923",A%*2+1,2),"48643",A%+1,1)) |#ݤd0(A%,N%)="00000000"+A%,N%) Fݤstn(A%):="Stn",A%<256)+d0(A%256,3),A%>255)+"."+d0(A%256,3)  QݤMon(A%):="?0?janfebmaraprmayjunjulaugsepoctnovdec?13?14?15",(A%15)*3+1,3) ݤMonth(A%):A%=A%15:="?0?JanuaryFebruaryMarchAprilMayJuneJulyAugustSeptemberOctoberNovemberDecember?13?14?15?","01041119242932364046556270788184",A%*2+1,2),"3785534469788444",A%+1,1)) (ݤst(A%):A%=1 A%=21 A%=31:="st" A%=2 A%=22:="nd" A%=3 A%=23:="rd" ="th"  ݤucase(A$):A$="":="" NB$,A%:A%=1A$:A$,A%,1)>="`":B$=B$+(A$,A%,1)&DF) B$=B$+A$,A%,1) :=B$  4ݤfx(A%,X%):Y%:Y%=X%256:=(&FFF4 &FFFF00)256 <ݤfile($name%,A%):?X%=name%:X%?1=name%256:=(&FFDD)&FF  &parse(parse$):num%=1: 0parse$=strip(parse$) ::parse$<>"":PrName$(num%)=GetNameOrNumber:num%=num%+1 Dparse$="":num%=num%-1: N XݤGetNameOrNumber bparse$=strip(parse$) lI%=parse$+" "," ") v,name$=parse$,I%-1):parse$=parse$,I%+1) =name$  3ݤstrip(s$):s$,1)=" ":s$=s$,2):s$,1)<>" " +s$,1)=" ":s$=s$,s$-1):s$,1)<>" " =s$  DecodeNames pA%=1num%:Port%(A%)=1:I%=PrName$(A%),":"):I%:Port%(A%)=PrName$(A%),I%+1):PrName$(A%)=PrName$(A%),I%-1)  NumberDone%=0:PN%=0:I%=1: 9!X%=&41000900:X%!4=&1000000:X%?8=I% 15:A%=&14:&FFF1 #X%?3=&6D:X%?3=0:PrMax%=8:TjM X%?3<>0:fatal(X%+4): +J%=10: J%=J%-1:X%?J%<>32:X%?(J%+1)=13 =PN$=ucase($(X%+4)):X%?36=13:BF$=$(X%+13):X%?13=0:BF$="" BF$<>"":BF$="$*."+BF$ GetNumber:I%=I%+1 *:: I%>PrMax% 4fail%=:test%=1 PrMax% >UPrNum%(test%)=&FF PrName$(test%)<>"": PrName$(test%)" not recognised":fail%= H*:fail%:'"Aborted":Z=(300):A$=13: R \: fGetNumber:test%=1 num% pmPrName$(test%)=PN$:PrNum%(test%)=I% 15:Banner$(test%)=BF$:PrName$(test%)=PN$:NumberDone%=NumberDone%+1 z: : ݤPrinterMatch(check%) =flag%=0:test%=1 num%:PrNum%(test%)=check%:flag%=test% :=flag%  'wait:now%=::prodded%=CheckProd / >now%+delay%*100 (-1)<>0 prodded%:  ݤSetUpRx(p%,st%,b%,l%) 6?X%=0:X%?1=&7F:X%?2=p%:X%!3=st%:X%!5=b%:X%!9=b%+l% A%=&11:&FFF1:=?X%  'ReadRx(n%):?X%=n%:A%=&11:&FFF1:  'ݤPollRx(X%):A%=&33:=(&FFF4)&8000  $"ݤCheckProd:PollRx(rx%)=0:= .(ReadRx(rx%):reason%=prod%!6 &FFFF 8Gprod%?6=13:name$=strip(ucase($prod%)):rx%=SetUpRx(&9F,0,prod%,9) Breason%<>&FFFF:= Lname$="PRINT":= V7flag%=:test%=1num%:PrName$(test%)=name$:flag%= ` :=flag% j tݤSafeOpen($name%,type%) ~/anfs:=OpenCMOS(type%) =OpenNMOS(type%)  ݤOpenNMOS(type%)  A%,X%,Y%,then%:then%= :X%=FSOp%:Y%=X%256 HX%?0=0:X%?1=10+$name%:X%?2=0:X%!3=6:X%?7=1: $(X%+9)=$name% already type%=&C0:X%?8=0 X%?8=1 1A%=&14:&FFF1:Err%=X%?3:Err%=&C2:wait1(100) '(Err%<>&C2)(>then%+timeout%*100) Err%=0:=convert(X%?4) Err%=&D6:=0 6=0::fatal("Error "+$(X%+4)+" while opening file") : (ݤconvert(FsChn%):=32+(FsChn%)/(2)  : ݤOpenCMOS(type%)  A%,X%,Y%,then%:then%= (X%=name%:Y%=X%256: 2A%=type%:A%=(Open)&FF <A%=&FF =&C2:wait1(100) F,A%<>&FF <>&C2 >then%+timeout%*100 P4A%=&FF:=0::"Error:"::" while opening file": Z=A% d: nAssemOpen: code% &40 x,pass=0 2 2:P%=code%:[OPT pass:.Open 7LDX &202:STX BRKVst:LDX &202+1:STX BRKVst+1:PHP:SEI ALDX #(OpenFail 256):STX &202:LDX #(OpenFail 256):STX &202+1 PLP:TSX:STX SPst /LDX #(name%256):LDY #(name%256):JSR &FFCE  .OpenDone ?PHP:SEI:LDY BRKVst:STY &202:LDY BRKVst+1:STY &202+1:PLP:RTS  .OpenFail &LDX SPst:TXS:LDA #&FF:BNE OpenDone .SPst:BRK:.BRKVst:EQUW 0  ]::  'ݤanfs:A%=&13:?X%=15:&FFF1:T%=X%?2 X%?2=T%&AA:&FFF1:=X%?2=T%  fatal(A$):CloseAll  "Fatal Error: "A$:end " , 60wait1(delay%):delay%=+delay%:>delay%: @ J"AssemEventcode: code1% &180 T/ pass=0 2 2:P%=code1%:[OPT pass:.event ^PHP:CMP #4:BNE NotOurEvent hPHA:TYA:PHA:TXA:PHA r,LDX rx:LDA #&33:JSR &FFF4:TXA:BMI ReadRx |).exit \ if nothing received then exit PLA:TAX:PLA:TAY:PLA .NotOurEvent PLP:JMP (OldEVNTV) :  .ReadRx  LDA rx:STA RxBlk & LDX #RxBlk 256:LDY #RxBlk 256 8 LDA #&11:JSR &FFF1 \ read the rx block < LDA RxBlk+3:STA TxCopy+2 \ set tx station number  LDA RxBlk+4:STA TxCopy+3  LDX #7 % LDA #0:STA NameFlg1:STA NameFlg2  .Name1Lp  LDA RxBuffer,X  CMP SvName1,X:BEQ the_same1  INC NameFlg1 & .the_same1 0CMP SvName2,X : BEQ the_same2 D INC NameFlg2 N .the_same2 XDEX:BPL Name1Lp bLDA NameFlg1:BEQ GoTx lLDA NameFlg2:BNE NewRx v .GoTx  LDA #5:STA tries  LDY #&6F  LDA (&9C),Y  BMI GoTx  PHA  .transmit  JSR SetUpTx  DEC tries:BEQ exit_transmit & LDX #TxBlk 256:LDY #TxBlk 256  LDA #&10:JSR &FFF1  .PollTx  LDA #&32:JSR &FFF4 TXA:BMI PollTx  BNE transmit   .exit_transmit  LDA #&6F   PLA * STA (&9C),Y 4 .NewRx >/JSR SetUpRx:LDX #RxBlk 256:LDY #RxBlk 256 H0LDA #&11:JSR &FFF1:LDA RxBlk:STA rx:JMP exit R: \.EventInit f#LDX #RxBlk 256:LDY #RxBlk 256 p'LDA #&11:JSR &FFF1:LDA RxBlk:STA rx z1LDA &220:STA OldEVNTV:LDA &221:STA OldEVNTV+1 5LDA #event 256:STA &220:LDA #event 256:STA &221 LDA #14:LDX #4:JMP &FFF4 :  .SetUpRx  LDX #12  .RxLp -LDA RxCopy,X:STA RxBlk,X:DEX:BPL RxLp:RTS :  .SetUpTx  LDX #11  .t_loop  LDA TxCopy,X:STA TxBlk,X  DEX:BPL t_loop  RTS  .tries EQUB 0  .rx EQUB 0 $.NameFlg1:EQUB 0 ..NameFlg2:EQUB 0 8.OldEVNTV:EQUW 0 B .RxBlk LCEQUB 0:EQUB &7F:EQUB &B0:EQUW 0:EQUD RxBuffer:EQUD RxBuffer+&10 V .RxCopy ` EQUB 0 j EQUB &7F t*EQUB &B0 :\ Listen on port &B0 ~-EQUW 0 :\ Listen to any station 5EQUD RxBuffer :\ Put received data in RxBuffer -EQUD RxBuffer+&10:\ Addr of end of buffer  .TxBlk 9EQUB 0:EQUB &B1:EQUW 0:EQUD TxBuffer:EQUD TxBufferEnd  .TxCopy #EQUB &80 :\ Control byte +EQUB &B1 :\ Transmit on port &B1 5EQUW 0 :\ Space to insert station number /EQUD TxBuffer :\ Addr of data to transmit *EQUD TxBufferEnd:\ Addr of end of data .SvName1:EQUS "DESPOOL " .SvName2:EQUS " "  .TxBuffer  EQUB 0 :\ No error ;EQUB 0 :\ Base port for future exchanges - none +EQUB ver% :\ Binary version number (!EQUS "DESPOOL ":\ Server type 2 .svLen 126:A%<>A$:A$="" 7A%=A$+" "," "):run$=A$,A%-1):run$<>"":=A$,A%+1) =""