From 6f3a50c4c6f167ef7a99dae25f6dcfd57aa072e2 Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Thu, 3 Nov 2022 08:35:46 +0100 Subject: [PATCH] ITSCOM - ITS-SITS communication. --- Makefile | 2 +- build/misc.tcl | 5 + build/timestamps.txt | 1 + src/bee/itscom.20 | 253 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 260 insertions(+), 1 deletion(-) create mode 100755 src/bee/itscom.20 diff --git a/Makefile b/Makefile index 30f2d719..0a55b876 100644 --- a/Makefile +++ b/Makefile @@ -44,7 +44,7 @@ SRC = syseng sysen1 sysen2 sysen3 sysnet kshack dragon channa \ mits_s rab stan_k bs cstacy kp dcp2 -pics- victor imlac rjl mb bh \ lars drnil radia gjd maint bolio cent shrdlu vis cbf digest prs jsf \ decus bsg muds54 hello rrs 2500 minsky danny survey librm3 librm4 \ - klotz atlogo clusys cprog r eb cpm mini nova sits nlogo + klotz atlogo clusys cprog r eb cpm mini nova sits nlogo bee DOC = info _info_ sysdoc sysnet syshst kshack _teco_ emacs emacs1 c kcc \ chprog sail draw wl pc tj6 share _glpr_ _xgpr_ inquir mudman system \ xfont maxout ucode moon acount alan channa fonts games graphs humor \ diff --git a/build/misc.tcl b/build/misc.tcl index 32461fcd..8687890f 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -1680,6 +1680,11 @@ expect ":KILL" respond "*" ":palx hlogo_@hlogo\r" expect ":KILL" +# ITSCOM, ITS-SITS communication. +respond "*" ":cwd bee\r" +respond "*" ":palx itscom\r" +expect ":KILL" + # TORTIS respond "*" ":midas;324 radia;_tortis\r" expect ":KILL" diff --git a/build/timestamps.txt b/build/timestamps.txt index 4a18ea5e..269031d9 100644 --- a/build/timestamps.txt +++ b/build/timestamps.txt @@ -54,6 +54,7 @@ bawden/probe.258 198906261502.52 bawden/shutdn.6 199002020121.48 bawden/u.14 198502212133.11 bawden/uptime.1 198606230218.09 +bee/itscom.20 197509130056.46 bkph/bull.43 197507160659.47 bkph/grade.30 197507160700.38 bkph/lines.138 197011230739.11 diff --git a/src/bee/itscom.20 b/src/bee/itscom.20 new file mode 100755 index 00000000..0aaa3b56 --- /dev/null +++ b/src/bee/itscom.20 @@ -0,0 +1,253 @@ + .TITLE 10-11 COMUNICATIONS PACKAGE +.INSRT SITS;SITMAC > +.INSRT SITS;SITSS SYMS +FOO==0 + +.MACRO CROCK A,MESSAGE + MES'A=. + FOOBAR==. + .ASCII ÍESSAGEŠ MES'A'L==.-FOOBAR + .EVEN +.ENDM + +.MACRO MESS MESSAGE + CROCK \FOO,^/MESSAGE/ + FOO==FOO+1 +.ENDM + +MESS ^/INPUT TO LONGî/ +MESS ^/DISK NUMBER: / +MESS ^/DIRECTORY: / +MESS ^/FILE NAME: / +MESS ^/INPUT FILE: / +MESS ^/CANT COPY ROOTî/ +MESS ^/CANT MUTATE TO DIRECTORYî/ +MESS ^/CANT ADD FILE TO DIRECTORYî/ +MESS ^/CANT OPEN ITSî/ +MESS ^/PDP11U/ +MESS ^/NLODER / + + .BLKW 40 +PDL: + .BLKW 2 ;FOR THE INTERRRUPT PROCESSOR +PDL1: +ITSTTY: 1 ;TTY FOR ITS +ITSCAP: 0 +OLDPTR: .BLKW 2 ;STORAGE FOR THE POINTER TO THE START OF LAST BLOCK IN FILE +SYMFLG: 0 ;ZERO MEANS NO SYMBOLS YET +TTYCAP==3 +FILLEN==40. +FILBLK: .BLKB FILLEN+2 ;PLACE FOR FILE NAME AND EXTRA BYTE FOR SURE +FILCAP: 0 +PATCH: .BLKW 100 + +START: MOV #PDL,P + SAVE <,#.TIECM!.TICVM!.TLIPM!.TIRST,#TTYCAP> + BIS #.TTMOV,(P) ;SET THE TTY STATUS + $INVOK + SAVE <#-1,ITSTTY,#.TTCAP*400> + .INVOK ;CREATE THE ITS TTY + BNE ITSOPN ;GOT IT + ADD #6,P ;POP ARGUMENTS + SAVE <#MES10,#-MES10L,#TTYCAP> ;OUTPUT ERROR MESSAGE + $BLKO + BPT + BR START +ITSOPN: REST ITSCAP ;SAVE IT + SAVE <,#.TIMGO!.TIMGI!.TIRST,ITSCAP> ;SET IT TO IMAGE IN IMAGE OUT + BIS #.TTMOV,(P) ;SET THE STATUS + $INVOK +TRYAGA: SAVE <#MES1,#-MES1L,#TTYCAP> + $BLKO ;FIND OUT WHICH DISK + JSR PC,GETLIN ;GET THE LINE + BEQ TRYAGA ;TRY AGAIN + MOV #4,B ;THE DEFAULT DIRECTORY + CMP A,#FILBLK ;IS IT NULL? + BEQ DEFDIR ;JUST USE THE DEFAULT + CMP A,#FILBLK+1 ;BETTER BE ONLY ONE BYTE + BNE TRYAGA ;TRY AGAIN + MOV FILBLK,B ;GET THE BYTE + SUB #'0-10,B ;TURN IT INTO CAPABILITY INDEX +DEFDIR: SAVE <#-1,,B> ;COPY THE APPROPRIATE ROOT CAPABILITY + BIS #.CPYCP,(P) ;COPY IT + .INVOK + BNE GODROT ;SO FAR OKAY + ADD #6,P ;POP OFF STUFF + SAVE <#MES5,#-MES5L,#TTYCAP> + $BLKO ;SAY ERROR IN ROOT COPY + BR TRYAGA ;AND TRY AGAIN +GODROT: REST FILCAP ;THE FILE CAPABILITY + SAVE <#MES2,#-MES2L,#TTYCAP> + $BLKO ;ASK FOR DIRECTORY + JSR PC,GETLIN ;GET THE LINE FROM TTY + BNE MUTRUT ;NO + CMP A,#FILBLK ;ANY INPUT + BEQ GODMUT ;DONT MUTATE IT +ERR: SAVE <,,FILCAP> ;DELETE THE FILE CAPABILITY + BIS #.DELCP,(P) ;DELETE IT + $INVOK + BR TRYAGA ;TRY AGAIN +MUTRUT: CMP A,#FILBLK ;ANY INPUT + SAVE <,#FILBLK,FILCAP> ;MUTATE THE RUT TO THE DIRECTORY + BIS #.FAMU,(P) + .INVOK + BNE GODMUT ;GOT IT + ADD #6,P ;POP JUNK + SAVE <#MES6,#-MES6L,#TTYCAP> + $BLKO ;OUTPUT MESSAGE + BR ERR ;DELETE CAPABILITY AND TRY AGAIN +GODMUT: SAVE <#MES3,#-MES3L,#TTYCAP> + $BLKO ;ASK FOR THE FILE NAME + JSR PC,GETLIN ;GET THE LINE + BEQ ERR ;FAILED SO DELETE AND TRY AGAIN + SAVE <#0,#FILBLK,FILCAP> + BIS #.FAAD,(P) ;ADD THE FILE WITH THAT NAME TO THE DIRECTORY + .INVOK ;ADD IT + BNE GODADD ;ADDED IT SUCESSFULLY + ADD #6,P ;GO IT + SAVE <#MES7,#-MES7L,#TTYCAP> + $BLKO ;COMPLAIN ABOUT NOT ADDING IT + BR ERR +GODADD: SAVE <,#FILBLK,FILCAP> ;TRY TO MUTATE TO IT + BIS #.FAMU,(P) + $INVOK ;MUTATE TO IT. + SAVE <#MES4,#-MES4L,#TTYCAP> + $BLKO ;ASK FOR ITS FILE NAME + JSR PC,GETLIN ;GET THE ITS FILE LINE + SUB #FILBLK,A ;GET THE NUMBER OF BYTES + MOV A,F ;SAVE IT + BEQ ERR ;GOT TO HAVE A FILE NAME + SAVE <#32,ITSCAP> ;OUTPUT A ^Z TO ITS + $BYTO + JSR PC,WAIT10 ;WAIT FOR THE 10 TO RESPOND + SAVE <#MES11,#-MES11L,ITSCAP> ;OUTPUT STRING TO LOG IN AS PDP11 + $BLKO + NEG F ;NEGATIVE BYTE COUNT + JSR PC,WAIT10 ;WAIT FOR THE 10 + SAVE <#MES12,#-MES12L,ITSCAP> ;OUTPUT THE STRING TO START NLODER + $BLKO + SAVE <#FILBLK,F,ITSCAP> ;OUTPUT FILE NAME + $BLKO ;OUTPUT THE FILE NAME TO ITS + SAVE <,#.TIRST,ITSCAP> ;RESET THE INPUT BUFFER + BIS #.TTBIS,(P) ;JUST SET THE FLAG + $INVOK + SAVE <#15,ITSCAP> ;OUTPUT CR + $BYTO + SAVE #INTRUP ;FOR THE INTERRUPT HANDLER + $FORK ;START IT UP + CLR SYMFLG ;SAY WE HAVEN'T LOADED SYMBOLS YET +WATLOP: CLR F ;THE CHECKSUM + JSR PC,REDBYT ;READ A BYTE + CMP D,#1 ;IS IT THE START OF A BLOCK + BNE WATLOP ;YES + JSR PC,REDBYT ;THROW AWAY A 0 + MOV #OLDPTR,D ;POINT TO THE STORAGE FOR IT + SAVE <,,FILCAP> ;READ THE POINTER + BIS #.FARP,(P) + $INVOK + REST <(D)+,(D)+> ;PUT AWAY THE POINTER + SAVE <#1,FILCAP> ;OUTPUT TO THE FILE + $BYTO ;OUTPUT THE BYTE TO START + MOV #5,E ;THE NUMBER OF BYTES LEFT (JUST A KLUDGE TO GET CONSTANT 3) + JSR PC,GWORD ;GET A WORD INTO A + SUB E,A ;ALREADY GRABBED 3 BYTES + CMP E,A ;IS IT NOW 3 (IMPLYING LENGTH OF 6) + BEQ CHKDON ;SEE IF WE ARE DONE + MOV A,E ;NEW BYTE COUNT +RECEV: JSR PC,GWORD ;GET WORD INTO A + TST E ;ANY MORE BYTES + BGT RECEV + INCB F ;IS THE CHECKSUM 0? + BNE BADBLK ;NO + SAVE <#4,ITSCAP> ;SEND A GOOD ACKNOWLEDGE + $BYTO + BR WATLOP ;GET THE NEXT BLOCK +BADBLK: SAVE <#6,ITSCAP> ;SEND A BAD ACKNOWLEDGE + $BYTO + MOV #OLDPTR+4,E ;POINT TO START OF THIS BLOCK IN THE FILE + SAVE <-(E),-(E),FILCAP> ;RESET THE POINTER TO POINT TO THE START (OVERWRITE THE + ;BAD BLOCK + BIS #.FASP,(P) ;SET THE POINTER + $INVOK + BR WATLOP ;TRY AGAIN + +CHKDON: TST SYMFLG ;HAVE WE RECEIVED THE SYMBOLS YET? + BEQ .+4 ;NO +FINIS: BPT ;DONE + COM SYMFLG ;SET THE FLAG + BR WATLOP ;PRETEND TO RECEIVE A NEW PROGRAM (MAINLY THE SYMBOL TABLE) + +WAIT10: SAVE ;FOR THE 3 BYTI'S + $BYTI ;INPUT 3 BYTES + TST (P)+ + $BYTI + TST (P)+ + $BYTI + TST (P)+ + SAVE <#23,ITSCAP> ;OUTPUT A ^S + $BYTO + RTS PC + +;THE 10 PROGRAM SENDS LOW 6 BITS, THEN 4 BITS, THEN 6 BITS =>16 BITS +GWORD: JSR PC,REDBYT ;READ A BYTE + MOV D,A ;PLACE TO RETURN THE WORD OR BYTE + JSR PC,REDBYT ;GET THE TOP OF THIS BYTE + SWAB D ;PUT INTO THE TOP BYTE + ASR D + ASR D ;SHIFT IT DOWN TO COVER TOP 2 BITS OF BOTTOM BYTE + BIS D,A ;SET IT IN + MOV A,D ;COPY IT + BIC #177400,D ;CLEAR THE TOP BYTE + ADD D,F ;FIX UP THE CHECKSUM + SAVE ;THE FILE CAPABILITY + $BYTO ;WRITE OUT THE BYTE + DEC E ;DECREMENT THE BYTE COUNT + BEQ DONE ;DONE NO MORE BYTES + JSR PC,REDBYT ;GET THE OTHER BYTE + SWAB D ;PUT INTO THE TOP BYTE + ASL D + ASL D ;PUT THE CHAR INTO THE TOP 6 BITS + BIS D,A ;SET IT INTO THE TOTAL WORD + MOV A,D ;COPY IT AGAIN + SWAB D ;WANT THE TOP BYTE THIS TIME + BIC #177400,D ;CLEAR THE BOTTOM BYTE (REMEMBER THEY ARE SWABBED HERE) + ADD D,F ;FIX UP CHECKSUM + SAVE ;OUTPUT THIS BYTE TO + $BYTO +DONE: DEC E ;ONE LESS BYTE + RTS PC + +REDBYT: SAVE ITSCAP + $BYTI + REST D + BIC #177600,D ;CLEAR ALL BUT THE BOTTOM BITS + SUB #40,D ;THIS IS A KLUDGE TO AVOID CONTROL CHARACTERS + RTS PC +INTRUP: MOV #PDL1,P ;SET UP P + SAVE <,#.TIRST,#TTYCAP> + BIS #.TTBIS,(P) ;BIS SET THE RESET FLAG + $INVOK ;RESET THE TTY +CTZLOP: SAVE #TTYCAP + $BYTI + CMPB (P)+,#32 ;IS IT CONTROL Z? + BNE .+4 ;NO + BPT + BR CTZLOP ;JUST CONTINUE +GETLIN: MOV #FILBLK,A ;THE POINTER TO WHERE TO PUT THE DATA + MOV #FILLEN,B ;NUMBER OF BYTES IN INPUT BUFFER +CHARLP: SAVE #TTYCAP + $BYTI ;GET A BYTE + CMPB (P),#15 ;IS IT CARRIAGE RETURN + BEQ CHARDN ;YES, WE ARE DONE + MOVB (P)+,(A)+ ;PUT IT INTO THE BUFFER + SOB B,CHARLP ;TRY UNTIL IT IS FULL + SAVE <#MES0,#-MES0L,#TTYCAP> + $BLKO ;OUTPUT LINE TO LONG + SEZ + RTS PC +CHARDN: TST (P)+ ;POP CHARCTER + CLRB (A) ;MAKE SURE THERE IS A ZERO BYTE + CLZ + RTS PC +.END START + \ No newline at end of file