1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-25 03:37:00 +00:00
PDP-10.its/src/sysen2/cftp.475
Eric Swenson 28710a9690 Added ITS support for CHTN and CFTP (Telnet and FTP over Chaosnet).
To actually use these programs, however, the emulator needs to get
updated to support Chaosnet (over UDP, for example).
2016-11-26 21:59:06 +01:00

3491 lines
61 KiB
Plaintext
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;-*-Midas-*-
Title :CFTP - Chaos File Transfer for ITS (ala MMcM)
F=0 ;Flag word
A=1 ;General porpoise
B=2
C=3
D=4
E=5
T=6 ;Temporary
TT=7
T3=10
I=11
J=12
H=13
U=14
Q=15
BC=16
P=17
Call=<PUSHJ P,>
Return=<POPJ P,>
Save=<PUSH P,>
Rest=<POP P,>
Noop=<TRN>
.INSRT SYSTEM;CHSDEF
PDLen==40 ;PDList
JCLen==20 ;JCL buffer
BufLen==2000 ;Binary buffer, words made from %CODAT packets
HostP==100 ;Page to maps HOSTS2 in
AscBLn==<%CPMXC*2+4>/5
TTYi==1
TTYo==2
CHAOSi==3 ;Control connection.
CHAOSo==4
DSKi==5 ;For the sent/got file.
DSKo==6
HOSTi==7 ;For mapping on HOSTS2
cDATAi==10 ;Data connection.
cDATAo==11
ERRi==12
YOWi==13 ;You don't wanna know.
TTYoo==14
TESTi==15 ;For testing whether a device/directory exists.
PUOMin==23 ;Minimum UUO opcode.
.CHNL==215
%coSYN==201
%coASY==202
%coNOT==203 ;Notification packet
;;;
;;; Right-half flags
;;;
F%EOL==:1_0 ;EOL in input line?
F%TNX==:1_1 ;You are connected to a TENEX or TWENEX
F%CTL==:1_2 ;You have a control connection to a site.
F%NOD==:1_3 ;No Default transfer mode, since was explicitly set.
F%10==:1_4 ;You are connected to a PDP-10
F%UNIX==:1_5 ;You are connected to a UNIX
F%LOG==:1_6 ;You are logged in to the connected site.
F%DAT==:1_7 ;A data connection is open.
F%OFI==:1_8.
F%IFI==:1_9.
;free
F%TYPE==:1_11.
F%HEAD==:1_12.
F%SUB==:1_13.
F%VAX==:1_14. ;Connected to a VAXen
F%SPC==:1_16.
F%ITS==:1_17.
;;;
;;; Left-half flags
;;;
F%SEND==:1_18. ;This is a SEND, as opposed to a GET.
F%ODD==:1_19. ;Last packet didn't end on word boundry
F%LEFT==:1_20.
F%RIGH==:1_21.
F%NOEK==:1_22. ;Do not echo input.
F%QUOT==:1_23. ;Found a ^Q (quote) in LPARSE
F%FN1==:1_24. ;We have a FN1 in LPARSE
;;;
;;; YOW database offsets
;;;
LYOW==8.
NYOW==2000/LYOW
Y$WHEN==0
Y$FROM==1
Y$TO==2
Y$BITS==3
Y$BAUD==4
Y$UNAME==5
Y$TAG==6
Y$UN==7
IFNDEF KLp,[
PRINTX /Assemble for a KL? Non-0 if so. KLp==/
.TTYMAC FOO
KLp==FOO
TERMIN
];IFNDEF
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; Macros
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Define SYSCAL op,args
.Call [Setz ? Sixbit /op/ ? args ((Setz))]
Termin
Define CMD &string
[Asciz string],,.kark.
.kark.==.kark.+1
Termin
Define DEFUUO name,handle
name=.gack._<9.*3>
handle
.gack.==.gack.+1
Termin
Define TYPE &string
AType [Asciz string]
Termin
Define ETYPE &string
%Type [Asciz string]
Termin
Define BSTART &string
CBINIT [Asciz string]
Termin
Define BTEXT &string
CBText [Asciz string]
Termin
Define .SAVE list
IRPS FOOBAR,,[list]
Save FOOBAR
Termin
Termin
Define .REST list
IRPS FOOBAR,,[list]
Rest FOOBAR
Termin
Termin
Define EXHALE chnl=CHAOSo
Syscal PKTIOT,[%Climm,,chnl
%Climm,,Packet]
Termin
Define INHALE chnl=CHAOSi
Syscal PKTIOT,[%Climm,,chnl
%Climm,,Packet]
Termin
Define DBP ac
Add ac,[70000,,0]
Skipge ac
Sub ac,[430000,,1]
Termin
Define SPACE
Movei T,40
Idpb T,Q
Termin
Define NL
Movei T,.CHNL
Idpb T,Q
Termin
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; Random storage
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Loc 100
UUOH: 0
Ldb U,[331100,,40] ;Get Opcode
Cail U,PUOMin
Caile U,PUOMax
.Break
Movem A,ACsave+A
Move A,[B,,ACsave+B] ;Save registers A-U
BLT A,ACsave+U
Hrrz A,40 ;E.A. in A
Call @UUOTAB-PUOMin(U) ;Dispatch
Move U,[ACsave+A,,A]
BLT U,U ;Restore regs, and then return.
Jrst 2,@UUOH
UUOTab:
.gack.==PUOMin
DEFUUO AType,UATYP
DEFUUO FType,UFTYP
DEFUUO %Type,UETYP
DEFUUO 6Type,U6TYP
DEFUUO LType,ULTYP
DEFUUO CBInit,UBST
DEFUUO CBText,UBTEX
DEFUUO CBNum,UBNUM
PUOMax==.gack.
TSint:
LOC 41
Jsr UUOH
-TSintL,,TSint
LOC TSint
P
%PiIOC ? 0 ? 0 ? -1 ? IOCerr
0 ? 1_TTYi ? 0 ? 1_TTYi ? TTYint
0 ? 1_TTYoo ? 0 ? 1_TTYoo+1_TTYi ? More
TSintL==.-TSint
PDList: -PDLen,,.
Block PDLen
JCLbuf: Block JCLen
-1
1.0^32. ;Random floating-point output cruft
1.0^16.
FT8: 1.0^8
1.0^4
1.0^2
1.0^1
FT: 1.0^0
1.0^-32.
1.0^-16.
1.0^-8
1.0^-4
1.0^-2
FT01: 1.0^-1
FT0==FT01+1
FCP: Camle A,FT0(C)
Camge A,FT(C)
0, FT0(C)
EXPSGN: "- ? "+
.AOP .RDATE
CDate: .BYTE 7
<.LDB 220600,.AVAL1,>+40 ? <.LDB 140600,.AVAL1,>+40 ? "/
<.LDB 060600,.AVAL1,>+40 ? <.LDB 000600,.AVAL1,>+40 ? "/
<.LDB 360600,.AVAL1,>+40 ? <.LDB 300600,.AVAL1,>+40 ? 0
.BYTE
Verse: Ascii /1.6/
Ralph: .FNAM2 ;FN2 of this program (Ed#)
Debug: 0 ;Non-zero if debugging.
Alpha: 0 ;Flag for hacking ^W rubout correctly.
Lowerp: 0 ;Lowercasing wildcarding mumble mumble?
UsITS: 0 ;Out ITS-name: {AI|ML|DM|MC}
Mode: 0 ;.uao/.uio
gPromp: 0 ;BP to prompt you have PARSE
HostN: 0 ;subnet,,host# where you are connected.
Tem1: 0 ;Temporary stuff for floating-point output.
DatMod: 0 ;0=Ascii, -1=Binary full word, +1=Binary n-bit byte
RawMod: 0 ;Raw-mode ASCII transfer?
DatBSz: 0 ;Byte-size of binary transfer
BytSiz: 0
oChan: 0 ;Channel we are outputting to.
NBytes: 0 ;Number of bytes transferred...
MTypea: 0 ;Address in HSOST2 are of connected machines type
MOpera: 0 ;Likewise, for the machine's OS
TabTop: 0 ;Used in PARSE - Top of command table.
STime: 0 ;Start time, in 60th, of transfer.
Time: 0 ;Total time of transfer, in 60ths.
NBits: 0 ;Number of bits sent/got in last file
LastW: 0 ;LastWidth, for doing columnation in PARSE ?
TranID: 0 ;Transaction ID, for FILE protocol niceity
Yow: 0 ;Are we having fun yet??
Place: 0 ;How do you rate?
gLinBP: 0 ;BP to buffer where text is going, in GLINE
BinBP: 0 ;BP to BINBUF, for approriate size bytes.
BPW: 0 ;Bytes Per Word
ErrCod: 0 ;Error code, 5-char max ASCII string
ErrTyp: 0 ;Error type, one character ascii
RespBP: 0 ;Response BP \
RespNB: 0 ;Response NB /
Base: 0 ;Base for typing, used by %D and %O
TempT: 0 ;Temporary crap
Uname: 0
XUNAME: 0
SNAME: 0
OurNum: 0
RFilBP: 0 ;BP to "real" filename returned by OPEN
TypeBP: 0 ;BP to type of file in the -*- xxx -*- line
ACsave: Block 20
IFH: Ascii /I/
OFH: Ascii /O/
Connam: Asciz /FILE/
Number: Block 2
TimBuf: Block 10
CmdBuf: Block 50
String: Block 20
TSite: Block 20
Site: Block 20
CProm: Block 20
User: Block 20
Pass: Block 20
File: 0
OFile: Block 20
NFile: Block 20
DFile: Block 20
Dirfil: Block 20
Dirnam: Block 20
AscBuf: Block AscBLn
ODevic: 0
Device: 0
Direct: 0
FN1: 0
FN2: 0
DDev: 0
DDir: 0
DFN1: 0
DFN2: 0
TemDev: 0
TemSna: 0
TemFN1: Sixbit /_CFTP_/
TemFN2: Sixbit /OUTPUT/
DirAut: Block 5
DirBSz: 0
DirCre: Block 5
DirDel: 0
DirNRp: 0
DirBlk: Block 2
DirByt: Block 2
DirLnk: Block 10
DirNBk: 0
DirPVm: 0
DirLst==.-1
.kark.==-1
HlpCmd: CMD "*"
TopCmd: CMD "ACCESS"
CMD "ASCII"
CMD "BINARY"
CMD "BYTE-SIZE"
CMD "CONNECT"
CMD "CWD"
CMD "DELETE"
CMD "DIRECTORY"
CMD "DISABLE"
CMD "DISCONNECT"
CMD "ENABLE"
CMD "EXIT"
CMD "EXPUNGE"
CMD "GET"
CMD "HELP"
CMD "INFORMATION"
CMD "LOGIN"
CMD "PDP-10"
CMD "PUT"
CMD "QUIT"
CMD "RAW-ASCII"
CMD "RENAME"
CMD "SEND"
CMD "SET"
CMD "SUBMIT"
CMD "TYPE"
CMD "WINNERS"
ncmd1==.-TopCmd
0
CmdLoc: .ACESS
.ASKI
.BINAR
.BYTES
.CONNE
.CWD
.DELET
.DIREC
.DISAB
ClsAll
.ENABL
.EXIT
.EXPUN
.GET
.HELP
Status
.LOGIN
.PDP10
.SEND
.EXIT
.RAW
.RENAM
.SEND
.SET
.SUBMI
.TTYPE
.WINNE
ncmd2==.-CmdLoc
IFN ncmd2-ncmd1, .FATAL Command table mismatch
SetCmd: [Asciz /DEBUGGING/],,.DEBUG
[Asciz /LOWER-CASING/],,.LOWER
[Asciz /TRANSFER-MODE/],,.TRANS
[Asciz /YOW-MODE/],,.YOWP
0
TraCmd: [Asciz /ASCII/],,.ASKI
[Asciz /BINARY/],,.BINAR
[Asciz /BYTE-SIZE/],,.BYTES
[Asciz /PDP-10/],,.PDP10
[Asciz /RAW-ASCII/],,.RAW
0
YNCmd: [Asciz /FALSE/],,0
[Asciz /NIL/],,0
[Asciz /NO/],,0
[Asciz /OFF/],,0
[Asciz /ON/],,-1
[Asciz /T/],,-1
[Asciz /TRUE/],,-1
[Asciz /YES/],,-1
0
DirTab: [Asciz /AUTHOR/],,DirAut
[Asciz /BYTE-SIZE/],,DirBSz
[Asciz /CREATION-DATE/],,DirCre
[Asciz /DELETED/],,DirDel
[Asciz /DONT-REAP/],,DirNRP
[Asciz /LENGTH-IN-BLOCKS/],,DirBlk
[Asciz /LENGTH-IN-BYTES/],,DirByt
[Asciz /LINK-TO/],,DirLnk
[Asciz /NOT-BACKED-UP/],,DirNBK
[Asciz /PHYSICAL-VOLUME/],,DirPVm
0
TypTab: [Asciz "FAIL"],,[Asciz "FAI"]
[Asciz "Fundamental"],,[Asciz "TXT"]
[Asciz "MACRO"],,[Asciz "MAC"]
[Asciz "MIDAS"],,[Asciz "MID"]
[Asciz "SCHEME"],,[Asciz "SCM"]
[Asciz "TECO"],,[Asciz "EMACS"]
[Asciz "TEXT"],,[Asciz "TXT"]
0
Lower: 0.0 ;delta
5.0 ;5
10.0 ;5
25.0 ;15
50.0 ;25
100.0 ;50
150.0 ;50
225.0 ;75
350.0 ;125
nCats==.-Lower
Cats: [Asciz "?DEAD?"]
[Asciz "Crawl"]
[Asciz "Walk"]
[Asciz "Trot"]
[Asciz "Run"]
[Asciz "Fly"]
[Asciz "*Whoosh*"]
[Asciz "-Zoom->"]
[Asciz "--Warp-->"]
ComBuf: Block %CPMXW
Packet: Block %CPMXW
$$CHAOS==1
$$HSTMAP==1
$$HST3==1
$$HOSTNM==1
$$SYMLOOK==1
$$ANALYZE==1
$$ERRHAN==1
$$CONNECT==1
$$OWNHST==1
$$HSTSIX==1
.INSRT SYSENG;NETWRK
$$OUT==1
.INSRT SYSENG;DATIME
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; Actual body of the program. Gee...
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Begin: Move P,PDList ;Book 1, Chapter 1, Verse I.
Setz F,
Syscal OPEN,[%Clbit,,.uao\%TjDIS
%Climm,,TTYo
[Sixbit /TTY/]]
.Lose %lsFile
Syscal OPEN,[%Clbit,,.uai
%Climm,,TTYi
[Sixbit /TTY/]]
.Lose %lsFile
Movei A,HostP ;Page#
Movei B,HOSTi
Call NETWRK"HSTMAP
Jrst [Type "Can't get HOSTS3 databse"
Jrst Die]
Move A,[NETWRK"NW%CHS]
Call NETWRK"OWNHST
.Lose
Movem A,OurNum
Syscal SSTATU,[Repeat 5,%Clout,,T
%Clout,,UsITS]
.Lose %lsSYS
.Suset [-6,,[.rUIND,,T ;For making I&O File-Handles
.sOPTION,,[OPTINT,,] ;New-style interrupts
.sMASK,,[%PiIOC] ;Catch IOC errors
.rUNAME,,Uname
.rXUNAME,,XUNAME
.rSNAME,,SNAME]]
Move A,DDir
Movem A,DFN1
Move A,[350700,,IFH] ;File-Handle in form Ixxx and Oxxx,
Move B,[350700,,OFH] ;where xxx is your job# backwards.
MIandH: IDivi T,10.
Addi TT,"0
Idpb TT,A
Idpb TT,B
Jumpn T,MIandH
Move T,[030202,,020202] ;Interrupts still on,
Move TT,T ;but only <CR> echoes.
Syscal TTYSET,[%Climm,,TTYi ? T ? TT]
.Lose
Move A,UsITS
Movei B,Verse
Move C,Ralph
Movei D,CDate
EType "MIT-%1' CFTP Version %2S Ralph %3' [%4S]
Type '?<cr>' for a list of commands, or 'HELP' for full help."
.Break 12,[..rJCL,,JCLbuf]
Skipn JCLbuf
Jrst Comand
Move J,[440700,,JCLbuf]
.Iot TTYo,[^M]
Jrst Coman1
Unwind: Trne F,F%IFI
Call ClsIFI
Trne F,F%OFI
Jrst [Trnn F,F%CTL
Jrst .+1
Call DELEWO
Call ClsOFI
Jrst .+1]
Comand: Move P,PDList
Movei A,[Asciz /CFTP>/]
Trne F,F%CTL
Movei A,CProm
Movei I,CmdBuf
Call gLine ;Get a line of TTY input.
Jrst Comand ;Nothing specified.
Coman1: Movei H,TopCmd
Call Parse ;Is this a top-level command?
Jrst Lazy
Call @CmdLoc(B)
Jrst Comand
Lazy: Movei A,String
Call NETWRK"HSTLOOK
Jrst [Movei T,[Asciz /?Unknown: /]
Skipe ErrTyp
Movei T,[Asciz /?Ambiguous: /]
AType (T)
AType String
Jrst Comand]
Call Con1
Jrst Comand
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; All the rest is subroutines to do the commands...
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.HELP: Movei H,HlpCmd
Call Parse
Jrst [Movei A,BadHlp
Skipe ErrTyp
Movei A,HlpAll
AType (A)
Return]
Cail B,777777
Jrst .HELP0
AType @HlpTxt(B)
Return
BadHlp: Asciz "I dunno about that. Type '?<cr>' for a list of commands."
HlpAll: Asciz "Type 'HELP *<cr>' for full help, or 'HELP command<cr>' for help
with a specific command. '?<cr>' lists all the commands known,
and then some."
.HELP0: Type |
CFTP is the ITS user interface to a foreign Chaosnet FILE server
(FILE is the Lisp Machine file service protocol).
CFTP can be invoked from DDT with a command line, e.g.,
:CFTP CONNECT OZ
(or, using the "lazy connect" facility)
:CFTP OZ
Briefly, the CFTP commands are (where lowercase denotes metasyntax,
and foreign-filename is an uninterpreted string where every character is
significant except for leading white space):
|
Setz A,
.HELP1: Skipn TopCmd(A)
Return
AType @HlpTxt(A)
.Iot TTYo,[^M]
.Iot TTYo,[^M]
Aoja A,.HELP1
HlpTxt: [Asciz | ACCESS tops-20-directory
Equivalent to doing a TOPS-20 ACCESS command on the remote system
(you must supply brackets in the directory name, e.g. <FOO>)|]
[Asciz | ASCII
Sets transfer mode to 7-bit ASCII, translated from the 8-bit
LispMachine character set. Same as SET TRANSFER-MODE ASCII.|]
[Asciz | BINARY
Sets the transfer mode to binary, 16-bit data. Equivalent to
SET TRANSFER-MODE BINARY|]
[Asciz | BYTE-SIZE n
Sets the transfer mode to binary, with n-bit bytes. Same as
SET TRANSFER-MODE BYTE-SIZE n|]
[Asciz | CONNECT hostname
Requests FILE service from the foreign host named.
Sets the data tranfer mode to PDP-10 if foreign host is a PDP-10,
otherwise, sets the transfer mode to ASCII;
sets the lower-casing switch on iff the foreign host is a UNIX.|]
[Asciz | CWD tops-20-directory
Equivalent to a TOPS-20 CONNECT command on the remote system
(you must supply brackets in the directory name, e.g., <FEE>)|]
[Asciz | DELETE foreign-filename
Delete the specified file|]
[Asciz | DIRECTORY foreign-filename
Gives a directory listing of any files on the foreign system
which match the (potentially "wild-carded") foreign-filename;
the fields listed are:
D if the file is deleted, a D appears at the left margin
V physical volume on which the file resides, if any
Name the full filename
Blocks number of system-dependent "blocks" the file occupies
Bytes length of the file in bytes
size the size of bytes in the file
N if !, means the file is not backed up yet
R if $, means the file is marked as "resisting archival"
Created the time and date the file was created or last written
Author the user who created or last wrote the file|]
[Asciz | DISABLE
Disable your TWENEX capabilities.|]
[Asciz | DISCONNECT
Shut down the current session|]
[Asciz | ENABLE
Enable your TWENEX capabilities.|]
[Asciz | EXIT
Does a disconnect and exits CFTP|]
[Asciz | EXPUNGE tops-20-directory
Equivalent to the TOPS-20 command EXPUNGE tops-20-directory|]
[Asciz | GET foreign-filename
Local file: local-filename
Retrieves the file named by foreign-filename in the prevailing
transfer mode (see SET TRANSFER-MODE) to the local file named
by local-filename; tries to be helpful by defaulting the local
filename|]
[Asciz | HELP command or *
Prints this type of help text for the specified command (and
all it's subcommands), or on ALL commandsw if * is given.|]
[Asciz | INFORMATION
Tells relevant information about the current session (to which
host you're currently connected, as whom you're logged in,
the current data transfer mode, whether lower-casing is in
effect, etc.)|]
[Asciz | LOGIN foreign-username [password]
Attempts to log you in as the given foreign username;
it will prompt you for a password if it needs it|]
[Asciz | PDP-10
Sets the transfer mode to be PDP-10 words, 36-bit binary|]
[Asciz | PUT local-filename
Foreign file: foreign-filespec
Is the same as SEND (see below)|]
[Asciz | QUIT
Is a synonym of EXIT|]
[Asciz | RAW-ASCII
Sets the transfer mode to ASCII, and does not translate the LispM
character set, or quote funny characters - Takes it raw. Same as
SET TRANSFER-MODE RAW-ASCII|]
[Asciz | RENAME foreign-filename-1
New file: foreign-filename-2
Renames the first foreign file to the given second foreign file
name|]
[Asciz | SEND local-filename
To foreign file:
Sends the specified local file (non-wildcarded) to the given
foreign file; or, if the local-filename is wildcarded,
Prefix string for each foreign file:
Sends each local file implied by the wildcarded local-filename
to a remote file of the same name and type (NAME.TYP), possibly
prefixed by the string prompted for; if the generation is
wildcarded in local-filename (e.g., FOO.BAR.*), then sends
each local file to a remote file of the same name, type, and
generation (NAME.TYP.i); SET LOWER-CASING controls whether
the resulting foreign filename is lower-cased or not (useful
for transfers to UNIX systems)
Sorry, ffolks, but wildcard sending is not yet done.|]
[Asciz | SET DEBUGGING ON, OFF, or similar booleans
Turns debugging (tracing) information on or off (default is ON)
SET LOWER-CASING boolean
Turns lower-casing on or off (default is ON); see SEND and CONNECT
SET TRANSFER-MODE ASCII
Sets the data transfer mode to ASCII
(top-level synonym: ASCII)
SET TRANSFER-MODE BINARY
Sets the data transfer mode to binary, 16-bit data
(top-level synonym: BINARY)
SET TRANSFER-MODE BYTE-SIZE n
Sets the data transfer mode to binary, n-bit data
(top-level synonym: BYTE-SIZE)
SET TRANSFER-MODE PDP-10
Sets the data transfer mode to be PDP-10 style: 36-bit, binary.
(top-level synonym: PDP-10)|]
[Asciz | SUBMIT local-filename
Foreign file: foreign-filename
Is the same as the SEND command, except the sent file is also
submitted as a batch file (to be run NOW) on the foreign site.|]
[Asciz | TYPE foreign-filename
Types the given file (GETs it in ASCII mode) on the terminal|]
[Asciz | WINNERS
Show the list of current transfer winners|]
ncmd3==.-HlpTxt
IFN ncmd3-ncmd1, .FATAL You are missing help for some commands!
Constants
.WINNE: Syscal OPEN,[%Clbit,,.uii
%Climm,,YOWi
[Sixbit /DSK/]
[Sixbit /YOW/]
[Sixbit /BIN/]
[Sixbit /GREN/]]
Jrst [EType "Can't find database? %E<>"
Return]
Move T,[444400,,Yowloc]
Movei TT,2000
Syscal SIOT,[%Climm,,YOWi ? T ? TT]
.Lose
.Close YOWi,
Movei T3,1
Setz Q,
Type "
Rank Who Speed From To When
---- --- ------ ------ ------ -----------------<2D>"
.WIN1: Skipn Yowloc(Q)
Return
EType " #%10D "
Move B,[440700,,Yowloc+Y$TAG(Q)]
Skipe Yowloc+Y$TAG(Q)
AType (B)
IFN KLp,FIXR C,Yowloc+Y$BAUD(Q)
.ELSE [
MOVE C,Yowloc+Y$BAUD(Q)
MULI C,400
TSC C,C
ASH D,-243(C)
MOVE C,D
];Not KL
EType " %3D "
Move A,Yowloc+Y$FROM(Q)
Call NETWRK"HSTSIX
Move A,[0]
EType "%1' "
Move A,Yowloc+Y$TO(Q)
Call NETWRK"HSTSIX
Move A,[0]
EType "%1' "
Move A,Yowloc+Y$WHEN(Q)
Move D,[440700,,TimBuf]
Call DATIME"TWDASC
Movei A,TimBuf
EType "%1S<31>"
Addi Q,LYOW
Caig Q,LYOW*NYOW
Aoja T3,.WIN1
Return
.SET: Movei H,SetCmd
Call Parse
Jrst [Type "Invalid SET option"
Jrst Comand]
Jrst (B)
.DEBUG: Movei H,YNCmd
Call Parse
Seto B,
Hrl B,B
Movem B,Debug
Return
.LOWER: Movei H,YNCmd
Call Parse
Seto B,
Movem B,Lowerp
Return
.YOWP: Movei H,YNCmd
Call Parse
Seto B,
Hrl B,B
Movem B,Yow
Return
.TRANS: Movei H,TraCmd
Call Parse
Jrst [Type "Invalid TRANSFER-MODE"
Jrst Comand]
Jrst (B)
.ASKI: Tro F,F%NOD
.ASKJ: Setzm DatMod
Setzm RawMod
Setzm DatBSz
Return
.BINAR: Setom DatMod
Setzm RawMod
Setzm DatBSz
Tro F,F%NOD
Return
.Raw: Setzm DatMod
Setom RawMod
Setzm DatBSz
Tro F,F%NOD
Return
.BYTES: Call gNumber
Jrst [Type "Byte-size expected"
Jrst Comand]
Cail B,1
Caile B,16.
Jrst [Type "Byte-size must be from 1 to 16 bits"
Jrst Comand]
Movem B,DatBSz
Setom DatMod
Setzm RawMod
Tro F,F%NOD
Return
.PDP10: Tro F,F%NOD
.PDP11: Movei T,1
Movem T,DatMod
Setzm RawMod
Movei T,12.
Movem T,DatBSz
Return
.CONNE: Movei A,TSite
Call gString
Jrst [Type "You must specify a site to connect to"
Jrst Comand]
Movei A,TSite
Call NETWRK"HSTLOOK
Jrst [Type "Unknown site: "
AType TSite
Jrst Comand]
Con1: Movem A,HostN
Call ClsAll
Hlrz T,(B)
Add T,NETWRK"HSTADR ;Address of SITE entry in T
Hrrz TT,1(T)
Add TT,NETWRK"HSTADR ;Address of machine type in TT
Movem TT,MTypea
Move T3,(TT)
Trz F,F%10\F%UNIX\F%TNX\F%ITS\F%VAX
Came T3,[Ascii "DEC-10"] ;(Really only comparing 1st
Camn T3,[Ascii "PDP10"] ;5 characters...)
Tro F,F%10
Came T3,[Ascii "DEC-KS10"]
Camn T3,[Ascii "DEC-20"]
Tro F,F%10
Hlrz TT,1(T)
Add TT,NETWRK"HSTADR
Movem TT,MOpera
Move T3,(TT)
Camn T3,[Ascii /UNIX/]
Tro F,F%UNIX
Came T3,[Ascii "TOPS20"]
Camn T3,[Ascii /TOPS-/]
Tro F,F%TNX
Camn T3,[Ascii "TOPS10"]
Tro F,F%TNX
Camn T3,[Ascii /ITS/]
Tro F,F%ITS
Move B,HostN
Call NETWRK"HSTSRC
Movei A,[Asciz /HOST-WITH-NO-NAME/] ;This should not fail
Hrli A,440700
Push P,A
Move B,[440700,,Site]
Move C,[440700,,CProm]
Con2: Ildb T,A
Jumpe T,Con3
Idpb T,B
Jrst Con2
Con3: Pop P,A
Con4: Ildb T,A
Jumpe T,Con5
Cain T,".
Jrst Con5
Idpb T,C
Jrst Con4
Con5: Movei T,"> ;Finish off prompt,
Idpb T,C
Setz T,
Idpb T,B ;and tie them off.
Idpb T,C
Trnn F,F%NOD
Jrst [Call .PDP11
Trnn F,F%10 ;If no particular mode specified, try
Call .ASKJ ;to do the right thing.
Jrst .+1]
Trne F,F%UNIX
Setzm Lowerp ;No lowercasing on Unix's.
Call OPNCTL ;Open a control connection.
Status: Movei A,Site
Move B,MTypea
Move C,MOpera
Trne F,F%CTL
EType " Connected to %1S (a %2S running %3S)<29>"
Movei A,User
Trne F,F%LOG
EType " You are logged in as %1S<31>"
Call ShoMod
Skipe Lowerp
Type " Lower-casing filenames in wildcard sends<64>"
Skipe Yow
Jrst [Type " You're having fun!<21>"
Skipe A,Place
EType " In fact, you're currently ranked #%1D!<21>"
Jrst .+1]
Skipe Debug
Type " Debugging"
Return
ShoMod: Movei A,[Asciz /ASCII/]
Skipe DatMod
Movei A,[Asciz /BINARY/]
Setz B,
Skiple DatMod
Movei B,[Asciz /PDP10 /]
Skipe RawMod
Movei B,[Asciz /Raw /]
EType " %2S%1S mode transfers"
Skipn A,DatBSz
Jrst Shom1
Skiple DatMod
Movei A,36.
EType ", %1D-bit bytes"
Shom1: .Iot TTYo,[^M]
Return
.ACESS: Skipa H,[[Asciz / ACCESS/]]
.CWD: Movei H,[Asciz / CWD/]
Trnn F,F%CTL
Jrst NoConn
Call gDir
Jrst Comand
Call gPass1
.CWD0: CBInit (H)
NL
Skipe Dirnam
Jrst [CBText Dirnam
NL
Skipn Pass
Jrst .+1
CBText Pass
NL
Jrst .+1]
Call ComSnd
Call ComRs1
Skipa
Jrst .CWD1
Move A,ErrCod
Came A,[Ascii /IP?/]
Camn A,[Ascii /PI?/]
Skipa
Jrst PktErr
Call gPass2
Return
Jrst .CWD0
.CWD1: Move A,RespBP
EType " Connected to %1S"
Return
.DELET: Trnn F,F%CTL
Jrst NoConn
Call gOFile
Jrst Comand
Call oProbe
BStart " DELETE"
NL
CBText OFile
NL
Call ComSnd
Call ComRs1
Jrst PktErr
Movei A,OFile
EType " %1S deleted"
Return
DELEWO: CBInit OFH
BText " DELETE"
Call ComSnd
; Call SndSyn
Call ComRs1
Jrst PktErr
Return
.DIREC: Trnn F,F%CTL
Jrst NoConn
Setzm Dirfil
Movei A,Dirfil
Call gString
Jfcl
Call ChkDat
.DIR0: CBInit IFH
BText " DIRECTORY"
NL
CBtext Dirfil
NL
Call ComSnd
Call ComRsl
Jrst .DIR0
Tro F,F%IFI
Trz F,F%HEAD
.DIR1: Setzm File
Setzm DirAut ;Zero status stuff and snag
Move T,[DirAut,,DirAut+1] ;a new file.
BLT T,DirLst
Move A,[440700,,File]
Call DatLin
Jrst ClsIFI ;No more? We're done...
.DIR2: Move C,[440700,,String]
.DIR3: Call DatByt ;Grab a directory option.
Return
Caie T,40
Cain T,.CHNL
Jrst .DIR4
Idpb T,C
Jrst .DIR3
.DIR4: Camn C,[440700,,String]
Jrst DirPrt ;No more options - Print this line.
Movem T,TempT
Setz T,
Idpb T,C
Movei H,DirTab
Call Parse1
Jrst DirFll
Move T,TempT
Cain T,.CHNL
Jrst [Move A,[Ascii /T/]
Movem A,(B)
Jrst .DIR2]
Move A,[440700,,(B)]
Call DatLin
Noop
Jrst .DIR2
DirFll: Call DatByt ;Skip over the data part of
Return ;this option and continue.
Caie T,.CHNL
Jrst DirFll
Jrst .DIR2
DirPrt: Skipn File
Jrst .DIR1
Tron F,F%HEAD
Type "
DV Filename Blocks Bytes(size) NR Created Author<6F>"
Movei T,40
Skipn A,DirDel
Move B,[Ascii /NIL/]
Came B,[Ascii /NIL/]
Movei T,"D"
.Iot TTYo,T
.Iot TTYo,[" ]
Skipe DirPVm
AType DirPVm
Movei T,5
Call DirPos
AType File
Movei T,33.
Call DirPos
Skipe DirLnk
Jrst [Type "==> "
AType DirLnk
Jrst Dirp1]
Skipe DirBlk
Jrst [AType DirBlk
Movei T,38.
Call DirPos
AType DirByt
Jrst .+1]
Skipe DirBSz
Jrst [.Iot TTYo,["(]
AType DirBSz
.Iot TTYo,[")]
Jrst .+1]
Movei T,50.
Call DirPos
Movei T,40
Skipn B,DirNBk
Move B,[Ascii /NIL/]
Came B,[Ascii /NIL/]
Movei T,"!
.Iot TTYo,T
Movei T,40
Skipn B,DirNRp
Move B,[Ascii /NIL/]
Came B,[Ascii /NIL/]
Movei T,"$
.Iot TTYo,T
Dirp1: Movei T,53.
Call DirPos
AType DirCre
.Iot TTYo,[" ]
AType DirAut
.Iot TTYo,[^M]
Jrst .DIR1
DirPos: Syscal RCPOS,[%Climm,,TTYo
%Clout,,A]
.Lose %lsSys
Hrrz A,A
Caml A,T
Jrst [.Iot TTYo,[^M]
Jrst Dirps1]
Sub T,A
Dirps1: Sojl T,CPopj
.Iot TTYo,[" ]
Jrst Dirps1
.ENABL: Trnn F,F%CTL
Jrst NoConn
BStart " ENABLE-CAPABILITIES ALL"
NL
Call ComSnd
Call ComRs1
Jrst PktErr
Type "Capabilities enabled."
Return
.DISAB: Trnn F,F%CTL
Jrst NoConn
BStart " DISABLE-CAPABILITIES ALL"
NL
Call ComSnd
Call ComRs1
Jrst PktErr
Type "Capabilities disabled."
Return
.QUIT:
.EXIT: Call ClsAll
Jrst Die
.EXPUN: Trnn F,F%CTL
Jrst NoConn
Call gDir
Noop
.EXP1: BStart " EXPUNGE"
NL
Skipe Dirnam
Jrst [CBText Dirnam
NL
Jrst .+1]
Call ComSnd
Call ComRsl
Jrst .EXP1
Move A,RespBP
Move B,RespNB
Move C,[440700,,Number]
.EXP2: Sojl B,.EXP3
Ildb T,A
Cail T,"0
Cail T,"9
Jrst .EXP3
Idpb T,C
Aoja D,.EXP2
.EXP3: Setzb T,Dirnam
Idpb T,C
Move C,[440700,,Dirnam]
.EXP4: Sojl B,.EXP5
Ildb T,A
Caie T,40
Cain T,.CHNL
Jrst .EXP5
Idpb T,C
Jrst .EXP4
.EXP5: Setz T,
Idpb T,C
Movei A,Dirnam
Movei B,Number
EType " %1S expunged, %2S page(s) freed"
Return
.TTYPE: Setzm DatMod
Setzm RawMod
Setzm DatBSz
Movei T,TTYoo
Movem T,oChan
.Suset [.sIMSK2,,[1_TTYoo]]
Tro F,F%TYPE
Jrst .GEY
.GET: Movei T,DSKo
Movem T,oChan
.GEY: Trnn F,F%CTL
Jrst NoConn
Tlz F,(F%SEND)
Call ChkDat
Call gFFile
Return
.GET0: CBInit IFH
BText " OPEN READ"
Movei T,OFile
Movem T,File
Call ComOpn
Jrst .GET0
Call gSize ;Get size of incoming file.
Move A,RFilBP ;BP to real filename
EType "Truename: %1S<31>"
Call ITSify ;Make default local filespec
Syscal OPEN,[%Clbit,,.uii
%Climm,,TESTi
DDev
[Sixbit ".FILE."]
[Sixbit "(DIR)"]
DDir]
Jrst [Call Dunno0 ;Default device and sname
Jrst .+2]
.Close TESTi,
Tro F,F%IFI
Trne F,F%TYPE
Jrst [Movsi T,(Sixbit /TTY/)
Movem T,TemDev
Exch T,Device
Movem T,ODevice
Jrst .GET1]
Call gLFile
Jfcl
Call Merge ;Merge in defaults
Movei T,.UIO
Skipn RawMod
Skipn DatMod
.GET1: Movei T,.UAO
Movem T,Mode
Syscal OPEN,[%Clbtw,,Mode
oChan
TemDev
TemFN1
TemFN2
TemSna]
Jrst [Movei A,TemDev
EType "Can't open temporary file %1L -- %E"
Jrst Unwind]
Skipn B,DatBSz
Jrst [Movei B,7
Skipe DatMod
Movei B,16.
Jrst .+1]
Movem B,BytSiz
Movei A,OFile
Movei B,Device
EType " %1S --> %2L ...<2E>"
Setzm NBytes
.PDTime T,
Movem T,STime ;Start time
Call RedLup
.PDTime T,
Sub T,STime
Movem T,Time
Trne F,F%TYPE
Jrst .GET2
Syscal RENMWO,[oChan ? FN1 ? FN2]
Jrst [EType "Can't rename to real names -- %E"
Jrst Unwind]
.GET2: Syscal CLOSE,[oChan]
.Lose %lsSys
Call ClsIFI
Trnn F,F%TYPE
Jrst pZoom
Move T,ODevice
Movem T,Device ;Restore the device default
Trz F,F%TYPE
Jrst pZoom
.LOGIN: Trnn F,F%CTL
Jrst NoConn
Call gUser
Jrst Comand
Call gPass1
.LOG1: BStart " LOGIN "
CBText User
SPACE
Skipe Pass
Jrst [CBText Pass
SPACE
Jrst .+1]
.LOG2: Call ComSnd
Call ComRs1
Skipa
Jrst Logdin
Move A,ErrCod
Came A,[Ascii /IP?/]
Camn A,[Ascii /PI?/]
Skipa
Jrst PktErr
Call gPass2
Return
Jrst .LOG1
Logdin: Tro F,F%LOG
Move A,RespBP
Move B,RespNB
Move C,[440700,,User]
Logdun: Sojl B,Logdpr
Ildb T,A
Cain T,40
Jrst Logdpr
Idpb T,C
Jrst Logdun
Logdpr: Setz T,
Idpb T,C
FndNam: Sojl B,CPopj
Ildb T,A
Caie T,.CHNL
Jrst FndNam
Movem A,NameBP'
FndCma: Sojl B,CPopj
Ildb T,A
Cain T,",
Jrst AhaCma
Caie T,.CHNL
Jrst FndCma
Move A,NameBP
Push P,A
Jrst Fnord
AhaCma: Push P,A
AhaCm0: Sojl B,CPopj
Ildb T,A
Cain T,40
Jrst [Movem A,(P)
Jrst AhaCm0]
Fnord: Ildb T,A
Caie T,40
Cain T,.CHNL
Skipa
Jrst Fnord
Setz T,
Dpb T,A
Pop P,A
SayHi: EType "Hello, %1S<31>"
Return
.RENAM: Trnn F,F%CTL
Jrst NoConn
Call gOFile
Jrst Comand
Call gNFile
Jrst Comand
Call oProbe
BStart " RENAME"
NL
CBText OFile
NL
CBText NFile
NL
Call ComSnd
Call ComRs1
Jrst PktErr
Call nProbe
Movei A,OFile
Movei B,NFile
EType " %1S renamed to %2S"
Return
.SUBMI: Troa F,F%SUB
.SEND: Trz F,F%SUB
Trnn F,F%CTL
Jrst NoConn ;No connection yet.
Tlo F,(F%SEND)
Call ChkDat ;Get a data connection if needed
Call gLFile ;Get the local filename.
Jrst Comand
Call Dunno ;Set up DDev/etc
Call Merge ;and set Device, etc from them.
Call Wildp
Jrst .SEND1
Type "Wildcard sending not yet supported"
Return
.SEND1: Skipn B,DatBSz
Jrst [Movei B,7
Skipe DatMod
Movei B,16.
Jrst .+1]
Movem B,BytSiz
Movei T,.UAI
Skipe DatMod
Movei T,.UII
Syscal OPEN,[%Clbtw,,T
%Climm,,DSKi
Device ? FN1 ? FN2 ? Direct]
Jrst [Movei A,Device
EType "Can't open local file %1L -- %E"
Return]
Syscal RFNAME,[%Climm,,DSKi
%Clout,,Device ? %Clout,,FN1
%Clout,,FN2 ? %Clout,,Direct]
Jfcl
Call SXLate ;Translate this filename for the default.
Movei A,Device
EType "Truename: %1L<31>"
Syscal FILLEN,[%Climm,,DSKi
%Clout,,T ? %Clout,,TT]
Setz T,
IMul T,TT
Movem T,NBits
Call gFFile
Jrst [Skipn DFile
Jrst [Type "There's no foreign file default!"
.Close DSKi,
Jrst Comand]
Call FdFalt
Jrst .+1]
SndLu1: CBInit OFH
Movei A,[Asciz / OPEN WRITE/]
Trne F,F%SUB
Movei A,[Asciz / OPEN WRITE SUBMIT/]
CBText (A)
Movei T,OFile
Movem T,File
Call ComOpn
Jrst SndLu1
Tro F,F%OFI
Movei A,OFile
Movei B,Device
EType " %2L --> %1S ...<2E>"
Setzm NBytes
.PDTime T,
Movem T,STime
Call WrtLup
.PDTime T,
Sub T,STime
Movem T,Time
Call ClsOFI
Call GetTru
.Close DSKi,
Jrst pZoom
NoConn: Type "(Not connected to any host)"
Return
Die: Skipe Debug
.Value
.Logout 1,
Constants
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; The good stuff - Chaosnet frotzing
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
OpnCtl: Call ClsAll
Movei A,CHAOSi
Move B,HostN
Movei C,Connam
Movei D,5
Call NETWRK"CHACON
Jrst [Type "<22>(Can't get control connection)<29>"
Jrst Unwind]
Skipe Debug
Type "<D> Opened control connection<6F>"
Setzm TranID
Tro F,F%CTL
Return
ClsAll: Trne F,F%DAT
Call ClsDat
Trne F,F%CTL
Call ClsCtl
Trz F,F%LOG
Return
ClsCtl: Skipe Debug
Call SndEOF
.Close CHAOSi,
.Close CHAOSo,
Trz F,F%CTL
Movei A,Site
EType " Closing connection to %1S<31>"
Return
ClsDat: Movei A,OFH
Skipe Debug
EType "<D> Closing data connection [%1S]<5D>"
.Close cDATAi,
.Close cDATAo,
Trz F,F%DAT
Return
ChkDat: Trne F,F%DAT
Return
OpnDat: BStart " DATA-CONNECTION "
CBText IFH
SPACE
CBText OFH
Call ComSnd
Movei A,cDATAi
Move B,HostN
Movei C,OFH
Movei D,5
Call NETWRK"CHALSN
Jrst [Type "<22>(Can't get data connection)<29>"
Jrst Unwind]
Call ComRs1
Jrst PktErr
Movei A,OFH
Skipe Debug
EType "<D> Got data connection [%1S]<5D>"
Tro F,F%DAT
Return
ComSnd: Setz T,
Idpb T,Q ;Ascizize command buffer.
Move A,[440800,,Packet+%CPKDT]
Move B,[440800,,ComBuf]
Setz C,
ComSn1: Ildb T,B
Jumpe T,ComSn2
Idpb T,A
Aoj C,
Caie C,%CPMXC
Jrst ComSn1
ComSn2: Dpb C,[$CPKNB Packet]
Movei T,%coDAT
Dpb T,[$CPKOP Packet]
Skipn Debug
Jrst ComSn3
Type "<D> Sending:
<D> "
Call PrtBuf
ComSn3: Exhale
Jrst BadCon
Return
SndEOF: Type "<D> Sending EOF on control channel<65>"
Movei T,%coEOF
Dpb T,[$CPKOP Packet]
Exhale
Noop
Return
ComRsl: Call ComRs1
Skipa
Jrst Popj1
Move A,ErrCod
Came A,[Ascii /NLI/]
Jrst PktErr
EType "Error: %1M<31>"
Call gUser1
Jrst Unwind
Call .LOG1
Return
ComRs1: Call CtlPkr
ComRse: Skipn Debug
Jrst ComRs0
Type "<D> Received:
<D> "
Call PrtBuf
ComRs0: Move A,[440800,,Packet+%CPKDT]
Ldb B,[$CPKNB Packet]
Call gAtom ;TID
Call gAtom ;FH
Call gAtom
Came T,[Ascii /ERROR/]
Jrst [Aos (P)
Jrst ComRs2]
Call gAtom
Movem T,ErrCod
Call gAtom
Lsh T,-<4*7+1>
Movem T,ErrTyp
ComRs2: Movem A,RespBP
Movem B,RespNB
Return
CtlPkr: Setzm Packet
Move T,[Packet,,Packet+1]
BLT T,Packet+%CPMXW-1 ;Zero the packet
Inhale
Jrst BadCon
Ldb T,[$CPKOP Packet]
Cain T,%coDAT
Return
Cain T,%coASY
Jrst AsyErr
Move A,[440800,,Packet+%CPKDT]
Ldb B,[$CPKNB Packet]
Movem A,RespBP
Movem B,RespNB
Cain T,%coNOT ;Notification packet
Jrst CtlNot
Cain T,%coLOS
Jrst [Type "LOS! - Connection lost<73>"
Call ClsAll
Jrst Unwind]
Cain T,%coCLS
Jrst [Type "CLS! - Connection closed<65>"
Call ClsAll
Jrst Unwind]
UnKnop: EType "Received packet with unknown opcode - %6O??<3F>"
Call ClsAll
Jrst Unwind
CtlNot: EType "Notification from FILE server:
%M"
Jrst CtlPkr
gAtom: Setz T,
Move TT,[440700,,T]
Movei C,5
gAtom1: Sojl B,CPopj
Ildb D,A
Caie D,40
Cain D,.CHNL
Return
Jumpe C,gAtom1
Idpb D,TT
Soja C,gAtom1
PrtBuf: Move A,[440800,,Packet+%CPKDT]
Ldb B,[$CPKNB Packet]
Prtb1: Sojl B,PrtEOP
Ildb T,A
Xct LMASCP(T)
Jrst Prtb1
PrtEOP: Type "<EOP><3E>"
Return
BadCon: Call ClsAll
Type "<22>Connection broken (foreign server probably died)"
Trz F%IFI\F%OFI
Jrst Unwind
PktErr: EType "Error: %M"
Jrst Unwind
AsyErr: Call ComRse
EType "(Error: %M)"
Jrst Unwind
ClsIFI: Trz F,F%IFI
CBInit IFH
BText " CLOSE"
Call ComSnd
Call ComRs1
Jrst PktErr
Call SmrKin
Return
ClsOFI: Trz F,F%OFI
CBInit OFH
BText " CLOSE"
Call ComSnd
; Call SndSyn
Call ComRs1
Jrst PktErr
Return
SndSyn: Skipe Debug
Type "<D> Sending control synchronous mark<72>"
Movei T,%coSYN
Dpb T,[$CPKOP Packet]
Exhale
Jrst BadCon
Return
Smrkin: Inhale cDATAi ;Wait for a synch mark.
Jrst BadCon
Ldb T,[$CPKOP Packet]
Cain T,%coSYN
Return
Cain T,%coASY
Jrst AsyErr
Cain T,%coNOT
Jrst MorNot
Cain T,%coEOF
Jrst Smrkin
Caie T,%coDAT
Cain T,%coDWD
Jrst Smrkin
Jrst Unknop
MorNot: EType "
Notification from FILE server (while awaiting synch mark):
%M"
Jrst Smrkin
nProbe: Skipa T,[NFile]
oProbe: Movei T,OFile
Movem T,File
Probe1: BStart " OPEN PROBE"
Call ComOp1
Jrst Probe1
Return
ComOpn: Movei A,[Asciz / CHARACTER/]
Skipe DatMod
Movei A,[Asciz / BINARY/]
CBText (A)
Skipe RawMod
BText " RAW SUPER-IMAGE"
ComOp1: Skipn DatBSz
Jrst ComOp2
BText " BYTE-SIZE "
CBNum DatBSz
ComOp2: NL
CBText @File
NL
Call ComSnd
Call ComRsl
Return
Aos (P)
Jrst GetTru
gSize: MOVE A,[440800,,Packet+%CPKDT]
MOVEI C,6
GSIZE1: ILDB T,A
CAIE T,40
JRST GSIZE1
SOJN C,GSIZE1
Setz C,
GSize2: Ildb T,A
Cail T,"0
Caile T,"9
Jrst gSize3
IMuli C,10.
Addi C,-"0(T)
Jrst gSize2
gSize3: SKIPN RAWMOD ;This stuff purloined, obviously.
SKIPN DATMOD
JRST [IDIVI C,5 ;Turn ASCII bytes into words.
JRST GSIZE4]
MOVEI T,^D36
IDIV T,DATBSZ
IDIV C,T
GSIZE4: IMULI C,^D36
MOVEM C,NBITS
Ildb T,A
Caie T,200\^M
Jrst .-2
Movem A,RFilBP ;Save BP to real filename.
Ildb T,A
Caie T,200\^M
Jrst .-2
Setz T,
Dpb T,A ;Make filename ASCIZ
Return
GetTru: Move A,RespBP
Move B,RespNB
Gett1: Sojl B,[Type "(Badly formatted response)"
Jrst Unwind]
Ildb T,A
Caie T,.CHNL
Jrst Gett1
Move TT,File
Move C,[440700,,(TT)]
Gett2: Sojl B,Gett3
Ildb T,A
Cain T,.CHNL
Jrst Gett3
Idpb T,C
Jrst Gett2
Gett3: Setz T,
Idpb T,C
Return
;;;
;;; DATpkr/lin/byt are for grabbing text out of a packet
;;; received on the DATA-CONNECTION pair. All of them
;;; non-skip if there is no more data.
;;;
DatPkr: Inhale cDATAi
Jrst BadCon
Ldb T,[$CPKOP Packet]
Cain T,%coEOF
Return
Cain T,%coASY
Jrst [Trz F,F%IFI
Jrst AsyErr]
Caie T,%coDAT
Cain T,%coDWD
Jrst Popj1
Jrst Unknop
DatLin: Call DatByt
Return
DatLn1: Cain T,.CHNL
Jrst DatLnf
Idpb T,A
Call DatByt
Skipa
Jrst DatLn1
DatLnf: Setz TT,
Idpb TT,A
Jrst Popj1
DatByt: Sojge BC,[Ildb T,Q
Jrst Popj1]
Call DatPkr
Return
Move Q,[440800,,Packet+%CPKDT]
Ldb BC,[$CPKNB Packet]
Jrst DatByt
;;;
;;; The goods for grabbing incoming packets and stuffing them
;;; down the oChan channel (which may actually be open on TTY or
;;; something)
;;;
RedLup: .Suset [.sIMSK2,,[1_TTYi]] ;Turn on TTY interrupts
Skipe RawMod
Jrst RedRaw
Skipn DatMod
Jrst RedAsc
Movei A,36.
Skipn C,DatBSz
Movei C,16.
IDiv A,C
Movem A,BPW ;Bytes per Word
Lsh C,3*8.
Add C,[440000,,E]
Movem C,BinBP ;n-bit byte pointer into AC E.
Setz D,
RedBin: Call DatPkr
Jrst [Call Binfls
Jrst TTYoff]
Move T,[442000,,Packet+%CPKDT] ;16-bit pointer into data portion...
Ldb TT,[$CPKNB Packet] ;Number of 8-bit bytes -->
Lsh TT,-1 ;Number of 16-bit bytes.
Addm TT,NBytes
Tlne F,(F%ODD) ;Don't reset these pointers/BPs
Jrst Redb2 ;if we got smeared out over a
Redb1: Move A,BinBP ;couple of packets last time.
Move B,BPW
Setz E,
Redb2: Sojl TT,Redb3 ;Grab BPW 16-bit bytes from packet
Ildb T3,T ;and build them in E, making a full
Idpb T3,A ;36-bit word.
Sojg B,Redb2
Movem E,BinBuf(D)
Cail D,Buflen-1 ;We have filled a buffer... dump it
Call Binfla ;to disk and reset stuff.
Aoja D,Redb1
Redb3: Came B,BPW ;Did we end on a packet boundry?
Tloa F,(F%ODD)
Tlz F,(F%ODD)
Jrst RedBin
Binfla: Aoj D,
Binfls: Move I,[444400,,BinBuf]
Syscal SIOT,[oChan ? I ? D]
.Lose %lsSys
Seto D,
Return
RedRaw: Call DatPkr
Jrst TTYoff
Move T,[440800,,Packet+%CPKDT]
Ldb TT,[$CPKNB Packet]
Addm TT,NBytes
Syscal SIOT,[oChan ? T ? TT]
.Lose
Jrst RedRaw
RedAsc: Setz BC, ;Force a get of a new packet
Movei A,AscBLn*5
Move B,[440700,,AscBuf]
RedAs1: Call DatByt
Jrst [Call Redfls
Jrst TTYoff]
Xct LM2Asc(T)
Call Redout
Jrst RedAs1
Redout: Sosge A
Call Redfls-1 ;Output this buffer
Redou1: Idpb T,B
Return
Setz A,
Redfls: Move T3,[440700,,AscBuf]
Movei TT,AscBLn*5
Sub TT,A ;Number of fresh bytes...
Addm TT,NBytes
Syscal SIOT,[oChan ? T3 ? TT]
.Lose
Movei A,AscBLn*5-1 ;Reset counter/BP
Move B,[440700,,AscBuf]
Return
Quote: Save T
Movei T,177 ;Quote with a RUBOUT
Call Redout
Rest T
Return
;;;
;;; Grab input from the file open on DSKi, stuff it into packets,
;;; and cram down down the DATA-CONNECTION
;;;
WrtLup: Skipe RawMod
Jrst WrtRaw
Skipn DatMod
Jrst WrtAsc
Movei A,36.
Skipn C,DatBSz
Movei C,16.
IDiv A,C
Movem A,BPW ;Bytes per Word
Lsh C,3*8.
Add C,[440000,,BinBuf]
Movem C,BinBP
Setz D,
WrtBin: Move A,[442000,,Packet+%CPKDT] ;Pointer to start of data area.
Movei B,<%CPMXC/2> ;Number of 16-bit bytes.
WrtBon: Sojl D,[Move T,[444400,,BinBuf] ;If we have run
Movei TT,Buflen ;of buffered
Syscal SIOT,[%Climm,,DSKi ? T ? TT] ;disk input, get
.Lose ;another slab.
Movei D,Buflen
Sub D,TT
Jumpe D,[Call Pktfls ;End of file. Flush the partially
Jrst WrtEOF] ;made packet and we're done.
Move C,BinBP
IMul D,BPW ;Number of words * bytes per word
Jrst .] ;is the number of 16-bit bytes.
Ildb T,C
Idpb T,A
Sosg B ;We just filled a packet. Send
Call Pktfls ;it off...
Jrst WrtBon
Pktfls: Movei T3,%coDWD ;Binary data...
Dpb T3,[$CPKOP Packet]
Movei T3,<%CPMXC/2>
Sub T3,B
Addm T3,NBytes
Lsh T3,1 ;Turn number of 16-bit bytes into
Dpb T3,[$CPKNB Packet] ;number of 8-bit ones.
Exhale cDATAo
Jrst BadCon
Move A,[442000,,Packet+%CPKDT]
Movei B,<%CPMXC/2>
Return
WrtRaw: Move T,[440800,,Packet+%CPKDT]
Movei TT,%CPMXC
Syscal SIOT,[%Climm,,DSKi ? T ? TT] ;Such data directly into
.Lose %lsSys ;the packet...
Movei T,%CPMXC
Sub T,TT
Jumpe T,WrtEOF ;Eck, there was no data.
Addm T,NBytes
Dpb T,[$CPKNB Packet]
Movei TT,%coDAT ;Plain old data.
Dpb TT,[$CPKOP Packet]
Exhale cDATAo
Jrst BadCon
Jrst WrtRaw
WrtAsc: Setz BC,
Movei A,%CPMXC
Move B,[440800,,Packet+%CPKDT]
WrtAs1: Call Ascin
Jrst AscEOF ;No more characters.
Skipn DatMod
Xct Asc2LM(T) ;If not RAW mode, do the
Idpb T,B ;translation stuff...
Sosg A
Call AscFls
Jrst WrtAs1
AscFls: Movei TT,%CPMXC
Sub TT,A
Dpb TT,[$CPKNB Packet]
Movei TT,%coDAT
Dpb TT,[$CPKOP Packet]
Exhale cDATAo
Jrst BadCon
Movei A,%CPMXC
Move B,[440800,,Packet+%CPKDT]
Return
Ascin: Sojge BC,[Ildb T,C
Jrst Popj1]
Movei D,AscBLn*5
Move E,[440700,,AscBuf]
Syscal SIOT,[%Climm,,DSKi ? E ? D]
.Lose %lsSys
Movei BC,AscBLn*5
Sub BC,D
Jumpe BC,CPopj ;Out of data
Cail BC,AscBln*5 ;Is this the last bufferful?
Jrst Ascin2 ; Nope.
Ibp E ;Sort-of normalize us to pointing after
Ascin1: DBP E ;last byte, then start backing up...
Ldb T,E ;Get byte from end...
Cain T,^C ;Last-word ^C padding?
Soja BC,Ascin1 ;real stuff.
Ascin2: Addm BC,NBytes
Move C,[440700,,AscBuf]
Jrst Ascin
AscEOF: Call AscFls
WrtEOF: Call DatEOF
Skipe Debug
Type "<D> Sending data synchronous mark<72>"
Movei T,%coSYN
Dpb T,[$CPKOP Packet]
Exhale cDATAo
Jrst PktErr
Return
DatEOF: Skipe Debug
Type "<D> Sending EOF on data channel<65>"
Movei T,%coEOF
Dpb T,[$CPKOP Packet]
Exhale cDATAo
Jrst PktErr
Syscal FINISH,[%Climm,,cDatao] ;Wait for the EOF to be ACK'd
Noop
Return
TTYoff: .Suset [.sMSK2,,[0]] ;Disable TTY interrupts.
Return
LMASCP: Type "<NUL>"
Repeat 210-1,.Iot TTYo,T
Type "<BS>"
Type "<TAB>"
Type "<FF>"
Type "<213>"
Type "<214>"
Type "<NL>"
Repeat 377-216,.Iot TTYo,T
Type "<377>"
LM2Asc: Repeat 10,Noop ;0 through 7, leave alone
Repeat 3,Call Quote
Noop ;^M stays as uparrow
Repeat 2,Call Quote
Repeat 177-16,Noop
Repeat 11,Call Quote
Repeat 3,Trz T,200
Call Quote
Trz T,200
Call [Movei T,^M
Call Redout
Movei T,^J
Return]
Repeat 377-216,Call Quote
SKIPA
Asc2LM: Repeat 10,Noop
Repeat 3,Tro T,200
Noop
Tro T,200
Call [Call Ascin
Jrst AscEOF
Movei T,.CHNL
Return]
Repeat 177-16,Noop
Call [Call Ascin
Jrst AscEOF
Xct AscQ(T)
Return]
AscQ: Repeat 10,Tro T,200
Repeat 3,Noop
Tro T,200
Repeat 2,Noop
Repeat 177-16,Tro B,200
Noop
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; User interface
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6Typer: Setz TT,
Rotc T,6
Addi TT,40
.Iot TTYo,TT
Jumpn T,6Typer
Return
ATyper: Hrli A,440700
AT1: Ildb T,A
Jumpe T,CPopj
.Iot TTYo,T
Jrst AT1
pZoom: Move A,NBytes
IMul A,BytSiz
Move B,Time
IFN KLp,FLTR B,B ;Float
.ELSE FSC B,233
FDVR B,[60.0] ;Seconds in B
Move C,A
IFN KLp,FLTR C,C
.ELSE FSC C,233
FDVR C,B
FDVR C,[1000.0]
EType "%1D bits in %2F seconds = %3F KBaud"
pZoom1: Skipn Yow
Return
Movsi T,-nCats
Caml C,Lower(T)
Aobjn T,.-1
Move A,Cats-1(T)
EType " [%1S]<5D>"
pZoom2: Syscal OPEN,[%Clbit,,.uii
%Climm,,YOWi
[Sixbit /DSK/]
[Sixbit /YOW/]
[Sixbit /BIN/]
[Sixbit /GREN/]]
Jrst [EType "No YOW database? %E<>"
Return]
Movsi T,-1
Syscal CORBLK,[%Climm,,%CBNDW\%CBNDR
%Climm,,%JSelf
%Climm,,YOWpage
%Climm,,YOWi
T]
Jrst [EType "Can't map in YOW databse? %E<>"
.Close YOWi,
Return]
Setz A,
pZoom3: Caml C,Yowloc+Y$BAUD(A)
Jrst pZoom4
Addi A,LYOW
Caig A,NYOW*LYOW
Jrst pZoom3
.Close YOWi,
Type "Sorry, but you don't place."
Return
pZoom4: Move D,A
IDivi D,LYOW
Aoj D, ;This rating.
Caml D,Place
Movem D,Place ;Only update if this rating is better.
EType "
Congradulations!! You just placed #%4D in our all-time transfers!<21>"
Cail A,NYOW
Jrst pZoom5 ;Last place, nobody scrolls off.
Hrroi E,-NYOW(D) ;NYOW - (D) = #blocks to scroll,
Imuli E,-LYOW ;is number of words.
Hrli E,40000(E) ;400000+#words,,0
Hrri E,LYOW*<NYOW-1>+YOWLoc-1
; Foop
Pop E,LYOW(E)
Jumpl E,.-1
pZoom5: Move Q,A
Call DATIME"TIMGET
Movem A,Yowloc+Y$WHEN(Q)
Tlnn F,(F%SEND)
Jrst [Move T,HostN ;Getting: From them, to us.
Movem T,Yowloc+Y$FROM(Q)
Move T,OurNum
Movem T,Yowloc+Y$TO(Q)
Jrst pZoomm]
Move T,OurNum ;Sending: From us, to them.
Movem T,Yowloc+Y$FROM(Q)
Move T,HostN
Movem T,Yowloc+Y$TO(Q)
pZoomm: Move T,NBytes
IMul T,BytSiz
Movem T,Yowloc+Y$BITS(Q)
Movem C,Yowloc+Y$BAUD(Q)
Move T,Uname
Movem T,Yowloc+Y$UNAME(Q)
Setz B,
Caile D,10.
Jrst pZoom7
Type "
-----
Please enter your initials: "
Move A,[440700,,B]
Movei TT,3 ;Get 3 characters.
pZoom6: .Iot TTYi,T
Cail T,"a
Trz T,40 ;lc -> UC
Cail T,"A
Caile T,"Z
Jrst pZoom6 ;Only letters, please.
Idpb T,A
.Iot TTYo,T ;Save and echo.
Sojn TT,pZoom6
Type "
-----
"
pZoom7: Movem B,Yowloc+Y$TAG(Q)
.Close YOWi,
Type "You have been saved in the database.<2E>"
Return
gOFile: Movei A,OFile
Call gITStr
Skipa
Jrst Popj1
Movei A,[Asciz /Old filename: /]
gOF1: Movei I,OFile
Call gLine
Return
Tro F,F%EOL
Jrst Popj1
gFFile: Movei A,OFile
Call gITStr
Skipa
Jrst Popj1
Tlne F,(F%SEND)
Jrst [Movei A,DFile
Skipe DFile
EType /[Default is "%1S"]/
Jrst .+1]
Movei A,[Asciz /Foreign filename: /]
Movei I,OFile
Call gLine
Return
Tro F,F%EOL
Jrst Popj1
FdFalt: Skipa B,[440700,,OFile]
LdFalt: Move B,[440700,,NFile]
Move A,[440700,,DFile]
FdF1: Ildb T,A
Idpb T,B
Jumpn T,FdF1
Return
gNFile: Movei A,NFile
Call gITStr
Skipa
Jrst Popj1
Movei A,[Asciz /New filename: /]
gNF1: Movei I,NFile
Call gLine
Return
Jrst Popj1
gLFile: Movei A,NFile
Call gStr0
Skipa
Jrst gLF1
Movei A,DDev
Tlnn F,(F%SEND)
EType /[Default is "%1L"]/
Movei A,[Asciz /Local filename: /]
Movei I,NFile
Call gLine
Jrst [Tlnn F,(F%SEND)
Aos (P)
Return]
Tro F,F%EOL
gLF1: Movei A,NFile
Movei B,Device
Call LParse
Jrst Popj1
Merge:
IRP default,,[DDev,DDir,DFN1,DFN2]final,,[Device,Direct,FN1,FN2]
Move T,default
Skipn final
Movem T,final
TERMIN
Move T,Device
Movem T,TemDev
Move T,Direct
Movem T,TemSna
Return
gUser: Movei A,User
Call gString
Skipa
Jrst Popj1
gUser1: Movei A,[Asciz /Username: /]
Movei I,User
Call gLine
Return
Tro F,F%EOL
Jrst Popj1
gPass1: Setzm Pass
Movei A,Pass
Call gString
Noop
Return
gPass2: Movei A,[Asciz /Password: /]
Tlo F,(F%NOEK)
Movei I,Pass
Call gLine
Jrst .+3
Tro F,F%EOL
Aos (P)
Tlz F,(F%NOEK)
Return
gDir: Setzm Dirnam
Movei A,Dirnam
Call gString
Skipa
Jrst Popj1
Movei A,[Asciz /Directory: /]
Movei I,Dirnam
Call gLine
Return
Tro F,F%EOL
Jrst Popj1
;;;
;;; GLINE: Grab a line from the TTY into CMDBUF. Handles <rubout>,
;;; ^W (delete word), ^R (re-type line), and ^U (delete line).
;;; Skips if there was any input (which is Ascizized)
;;;
gLine: Hrli I,440700
Movem I,gLinBP
Movem A,gPrompt
Setz B,
Trz F,F%EOL
tProm: .Iot TTYo,[^P]
.Iot TTYo,["A]
LType gPrompt
tText: Jumpe B,gChar
Tlne F,(F%NOEK)
Jrst gChar
Move A,gLinBP
Move TT,B
tT1: Ildb T,A
.Iot TTYo,T
Sojn TT,tT1
gChar: .Iot TTYi,T
Cain T,^M
Jrst gLined
Cain T,177
Jrst [Jumpe B,Beep
Call R$U$B
Jrst gChar]
Cain T,^L
Jrst [.Iot TTYo,[^P]
.Iot TTYo,["C]
Jrst tProm]
Cain T,^W
Jrst Ctrl$W
Cain T,^R
Jrst [Call Cline
Jrst tProm]
Caie T,^D
Cain T,^U
Jrst [Call CLine
Setz B,
Move I,gLinBP
Jrst tProm]
Caie T,^V ;Quoting characters locally and on
Cain T,^Q ;TENEX/TWENEX
Jrst dChar
Caige T,40
Jrst Beep ;Don't like random control chars
dChar: Idpb T,I ;the same TTYSTx group!!
Tlnn F,(F%NOEK)
.Iot TTYo,T
Aoja B,gChar
gLined: .Iot TTYo,T ;Echo that CRLF
Setz T,
Idpb T,I
Move TT,gLinBP
Ildb T,TT
Caie T,"; ;Comment lines.
Cain T,"!
Jrst [Setz B,
Move I,gLinBP
Jrst tProm]
Move J,gLinBP
Skipe B
Aos (P)
Return
Beep: .Iot TTYo,[^G]
Jrst gChar
Ctrl$W: Jumpe B,Beep
Setzm Alpha
CW1: Jumpe B,gChar
Ldb T,I
Cail T,"a
Trz T,40 ;lc -> UC
Cail T,"A
Caile T,"Z
Jrst [Skipe Alpha
Jrst gChar
Jrst .+2]
Setom Alpha
Call R$U$B
Jrst CW1
R$U$B: Ldb T,I
Setz TT,
Dpb TT,I
DBP I
Soj B,
.Iot TTYo,[^P]
.Iot TTYo,["X]
Return
CLine: .Iot TTYo,[^P] ;Goes to leftmost column of the current line
.Iot TTYo,["H] ;and does a Clear-EOL.
.Iot TTYo,[8.]
.Iot TTYo,[^P]
.Iot TTYo,["L]
Return
;;;
;;; SCHAFF: Wades through the input line skipping whitespaces
;;; until something interesting is found. Skip-returns
;;; if there is munchable input.
;;;
sChaff: Ildb T,J
Caie T,40
Cain T,^I
Jrst sChaff
Jumpe T,[Tro F,F%EOL
Return]
DBP J
Popj1: Aos (P)
CPopj: Return
;;;
;;; GSTRING: Get a string of characters (terminated by <space> or
;;; <eol>) from the input line, store starting at the
;;; address given in A. Skip-returns if there is a non-
;;; null string.
;;;
gITStr: Trne F,F%ITS
gStr0: Troa F,F%SPC
gStrin: Trz F,F%SPC
Trne F,F%EOL
Return ;Can't get a string if nothing there.
Call sChaff
Return
Hrli A,440700
Setz B,
gS1: Ildb T,J
Caie T,^M
Skipn T
Jrst [Tro F,F%EOL
Jrst gS2]
Cain T,",
Jrst gS2
Cain T,40
Trne F,F%SPC
Skipa
Jrst gS2
Idpb T,A
Aoja B,gS1
gS2: Setz T,
Idpb T,A
Skipe B
Aos (P)
Return
;;;
;;; GNUMBER: Get a decimal number from the input line. Skips if there
;;; were some digits ending in <space> or <eol>
;;;
gNumbe: Trne F,F%EOL
Return
Call sChaff
Return
Setzb B,C ;Accumulated number.
gN1: Ildb T,J
Jumpe T,[Tro F,F%EOL
Jrst gN2]
Cain T,40
Jrst gS2
Cail T,"0
Caile T,"9
Jrst [Type "Non-digit in numeric field"
Return]
IMuli B,10.
Addi B,-"0(T)
Aoja C,gN1
gN2: Skipe C
Aos (P)
Return
TBLUK: Move J,A
Trz F,F%EOL
Jrst Parse0
;;;
;;; PARSE: Parse for a command-name. Takes in H the location of
;;; the command-name table. Skip-returns if there was a
;;; unique match, with B having the RH of the table-word.
;;; C has the number of matches: C=0 means none, C>1 means
;;; the command was ambiguous.
;;;
Parse: Trne F,F%EOL
Return
Parse0: Call sChaff
Return
Movei A,String
Call gString
Return
Parse1: Movem H,TabTop
Setz C, ;Number of matches.
P1: Skipn (H)
Jrst Check
Hlrz A,(H) ;Address of command string...
Hrli A,440700
Move D,[440700,,String]
Call UpCase ;Uppcase the token we're matching.
P2: Ildb T,D
Jumpe T,PWin
Cain T,"?
Jrst ShoOpt
Ildb TT,A
Skipe TT
Came T,TT
Jrst P3
Jrst P2
ShoOpt: Type "Keyword, one of:<3A>"
Move B,TabTop
Shoo0: Movei D,4
Movei E,8.
Shoo1: Skipn (B)
Jrst Comand
Hlrz A,(B)
Hrli A,440700
Setz C,
.Iot TTYo,[^I]
Caige E,8.
.Iot TTYo,[^I]
Shoo2: Ildb T,A
Jumpe T,Shoo3
.Iot TTYo,T
Aoja C,Shoo2
Shoo3: Soje D,[.Iot TTYo,[^M]
Aoja B,Shoo0]
Move E,C
Aoja B,Shoo1
PWin: Aoj C,
Hrrz B,(H)
P3: Aoja H,P1
Check: Movem C,ErrTyp
Cain C,1
Aos (P)
Return
;;;
;;; UPCASE: Uppercase string pointed to by D, in place.
;;;
UPCASE: Push P,D
UpCas0: Ildb T,D
Jumpe T,UpCas1
Cail T,"a
Trz T,40
Dpb T,D
Jrst UpCas0
UpCas1: Pop P,D
Return
;;
;; SXLATE: Translate this filename into an approximation of the
;; others machines filespec, for defaulting purposes.
;;
SXLATE: Setzm DFile
Trne F,F%ITS ;Other machine an ITS?
Jrst [Move A,[440700,,DFile]
Move T,Device
Call 6TCopy
Movei B,":
Idpb B,A
Move T,SName
Call 6TCopy
Movei B,";
Idpb B,A
Move T,FN1
Call 6TCopy
Movei B,40
Idpb B,A
Move T,FN2
Call 6TCopy
Setz B,
Idpb B,A
Return]
Move T,FN2
Call Nump ;See if FN2 is a number
Jrst SX0 ; Nope.
Skipe DatMod
Jrst [Move T,[444400,,CmdBuf]
Movei A,80./5
Jrst .+3]
Move T,[440700,,CmdBuf] ;Yes, so suck in first 80. characters
Movei A,80. ;of the file
Syscal SIOT,[%Climm,,DSKi ? T ? A]
Jrst UnkTyp
.Access DSKi,[0] ;Set pointer back to top.
Skipe DatMod
Jrst [Movei TT,80./5
Sub TT,A
IMuli TT,5
Jrst .+3]
Movei TT,80.
Sub TT,A ;#Bytes read from file.
Move T,[440700,,CmdBuf] ;and have a little look at it.
Movei TT,80.
FndTyp: Sojl TT,UnkTyp
Ildb A,T
FndTy0: Caie A,"- ;We're looking for "-*-"
Jrst FndTyp
Sojl TT,UnkTyp
Ildb A,T
Caie A,"*
Jrst FndTy0
Sojl TT,UnkTyp
Ildb A,T
Caie A,"-
Jrst FndTy0
Call SkpSpc
Jrst UnkTyp
Movem T,TypeBP ;Found it! Save BP to following text.
FTypEn: Sojl TT,UnkTyp ;This is cheating. Should really look
Ildb A,T ;for -*- again.
Cain A,": ;Oops, look for TAG:VALUE
Jrst ChkTag ;type construct.
Cain A,40
Jrst FndEnd
Caie A,"; ;Multi-tag things have values ending in ";"
Cain A,"- ;else (ahem) assume this is the - in -*-
Jrst FndEnd
Jrst FTypEn
ChkTag: Setz A, ;Found a tag, sigh.
Dpb A,T
Move A,TypeBP ;See if it's MODE:something
Move B,[440700,,[Asciz "Mode"]]
Call STCMP
Jrst NxtMod ;Nope, look for next tag.
Call SkpSpc
Jrst UnkTyp
Harumf: Movem T,TypeBP ;save BP to next start-of-type
Aoja TT,FTypEn ;and look again
SkpSpc: Sojl TT,CPopj ;Yep! Skip past whitespace...
Ildb A,T
Caie A,^I
Cain A,40
Jrst .-3
DBP T
Jrst Popj1
NxtMod: Sojl TT,UnkTyp ;skip ahead to the next mode.
Ildb A,T
Cain A,"*
Jrst UnkTyp
Caie A,";
Jrst NxtMod
Call SkpSpc
Jrst UnkTyp
Jrst Harumf
FndEnd: Setz A, ;Write over the terminating byte.
Dpb A,T
Jrst LukTyp ;and look it up.
LukTyp: Move A,TypeBP
Movei H,TypTab
Call TBLUK
Skipa B,TypeBP
Hrli B,440700
Movem B,TypeBP
Jrst SX0
UnkTyp: Move A,[440700,,[Asciz "TXT"]]
Movem A,TypeBP
SX0: Trne F,F%TNX ;TENEX/TWENEX?
Jrst TNXify
; Trne F,F%UNIX
; Jrst [ ...
; Call UNIXfy
; Return]
Return ;Something we don't know about.
Nump: Setzm Number
Nump0: Setz TT,
Rotc T,6
Cail TT,'0
Caile TT,'9
Return
Jumpn T,Nump0
Setom Number
Jrst Popj1
STCMP: .Save [T,TT]
STCMP0: Ildb T,A
Cail T,"a
Trz T,40
Ildb TT,B
Cail TT,"a
Trz TT,40
Came T,TT
Jrst STCMP1
Skipn T
Skipe TT
Jrst STCMP0
Aos -2(P)
STCMP1: .Rest [TT,T]
Return
;;;
;;; ITSIFY: Parse the foreign filespec (if twenex) and turn
;;; it into a ITS-style one, in DFILE. AC A has BP
;;; to file to be translated.
;;;
ITSify: Setzm Device ;Always look here
Setzm Direct
Setzm FN1
Setzm FN2
Trnn F,F%ITS
Jrst TNXp
Movei B,DDev
Jrst LParse
TNXp: Trnn F,F%TNX
Jrst Dunno
Tlz F,(F%RIGHT\F%LEFT)
Setz TT,
Move B,[440700,,DFile]
Movem B,StDev'
TNX1: Ildb T,A
Caie T,"[
Cain T,"<
Jrst [Tlo F,(F%LEFT)
JRST TNX1]
Caie T,">
Cain T,"]
Jrst [Tlo F,(F%RIGHT)
Movei T,";
Jrst TNX2]
Cain T,".
Jrst [Tlne F,(F%LEFT)
Tlne F,(F%RIGHT)
Skipa
Jrst [Move B,StDev
Jrst TNX1]
Jumpn TT,[Setz T,
Jrst TNX2]
Movei T,40
Aoja TT,TNX2]
TNX2: Idpb T,B
Cain T,":
Movem B,StDev
Jumpn T,TNX1
Movei A,DFile
Movei B,DDev
Jrst LParse
IFN 0,[
VAXp: Trnn F,F%VAX
Jrst UNIXp
;
; eventually
;
Return
UNIXp: Trnn F,F%UNIX
Return
;
; more eventually
;
Return
];Vax, Unix, etc
Dunno: Move T,XUNAME
Movem T,DFN1
Movsi T,(Sixbit ">")
Movem T,DFN2
Dunno0: Movsi T,(Sixbit "DSK")
Movem T,DDev
Move T,SNAME
Movem T,DDir
Return
;;;
;;; TNXIFY: Turn an ITS-filespec into a TNX one.
;;;
TNXify: Move A,[440700,,DFile]
Skipe T,Device
Jrst [Call 6TCopy
Movei B,":
Idpb B,A
Jrst .+1]
Skipe T,Direct
Jrst [Movei B,"[
Idpb B,A
Call 6TCopy
Movei B,"]
Idpb B,A
Jrst .+1]
Skipe T,FN1
Jrst [Call 6TCopy
Movei B,".
Idpb B,A
Jrst .+1]
Skipe T,FN2
Jrst [Skipe Number
Call CpyTyp
Call 6TCopy
Jrst .+1]
Setz B,
Idpb B,A
Return
CpyTyp: Move T,TypeBP
Ildb B,T
Jumpe B,[Movei B,".
Idpb B,A
Move T,FN2
Return]
Idpb B,A
Jrst CpyTyp+1
6TCopy: Movei B,^V
7TCopy: Setz TT,
Rotc T,6
Addi TT,40
Caie TT,40
Cain TT,":
Idpb B,A
Caie TT,".
Cain TT,";
Idpb B,A
Idpb TT,A
Jumpn T,7TCopy
Return
;;;
;;; WILDP: See if the ITS filespec has some wildcards.
;;;
WILDP: Setz A,
Move C,[440600,,FN1]
Call Wild1
Move C,[440600,,FN2]
Call Wild1
Skipe A
Aos (P)
Return
Wild1: Ildb T,C
Cain T,'*
Aoja A,CPopj
Tlne C,770000
Jrst Wild1
Return
;;;
;;; LPARSE: Parse (A) and turn into DEVICE/DIRECT/FN1/FN2 (B)
;;;
LParse: Tlz F,(F%FN1\F%QUOTE)
Setzm (B)
Setzm 1(B)
Setzm 2(B)
Setzm 3(B)
Tlnn A,-1
Hrli A,440700
LP0: Move C,[440600,,D]
Setz D,
LP1: Ildb T,A
Jumpe T,LP3
Tlne F,(F%QUOTE)
Jrst [Tlz F,(F%QUOTE)
Jrst LP1a]
Cain T,^Q
Jrst [Tlo F,(F%QUOTE)
Jrst LP1]
Cain T,":
Jrst SavDev
Cain T,";
Jrst [Jumpe D,LP1
Movem D,1(B)
Jrst LP0]
Cain T,40
Jrst LP2
LP1a: Tlnn C,770000
Jrst LP1
Cail T,"a
Trz T,40
Subi T,40
Idpb T,C
Jrst LP1
SavDev: Jumpe D,LP1
Trne F,F%TNX
Jrst [Camn D,[Sixbit "PS"]
Movsi D,(Sixbit "DSK")
Came D,[Sixbit "OZ"]
Camn D,[Sixbit "EE"]
Movsi D,(Sixbit "DSK")
Came D,[Sixbit "XX"]
Camn D,[Sixbit "SPEECH"] ;Is this right for Speech?
Movsi D,(Sixbit "DSK")
Jrst .+1]
Trne F,F%ITS
Jrst [Came D,[Sixbit "AI"]
Camn D,[Sixbit "MC"]
Movsi D,(Sixbit "DSK")
Jrst .+1]
Movem D,0(B)
Jrst LP0
LP2: Jumpe D,LP1
Skipa
LP3: Jumpe D,CPopj
Movei TT,2(B)
Tlne F,(F%FN1)
Movei TT,3(B)
Movem D,(TT)
Tlo F,(F%FN1)
Skipe T
Jrst LP0
Return
PutChr: .Iot TTYo,T
Return
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; UUOs
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ULTYP: Move A,(A)
UATYP: Hrli A,440700
UA1: Ildb C,A
Jumpe C,CPopj
.Iot TTYo,C
Jrst UA1
UFTYP: Hrli A,440700
Move B,A
Ldb C,[220400,,40]
Setz D,
UF1: Ildb E,B
Skipe E
Aoja D,UF1
Sub C,D
UF2: Sojl C,UA1
.Iot TTYo,[" ]
Jrst UF2
U6TYP: Move A,(A)
U61: Setz B,
Rotc A,6
Addi B,40
Caie B,40
Cain B,";
.Iot TTYo,[^Q]
Cain B,":
.Iot TTYo,[^Q]
.Iot TTYo,B
Jumpn A,U61
Jrst CPopj
UBST: Move Q,[440800,,ComBuf]
Movei B,"T
Idpb B,Q
Aos B,TranID
Call UBN0
Movei B,40
Idpb B,Q
UBTEX: Hrli A,440700
UBST3: Ildb B,A
Jumpe B,CPopj
Idpb B,Q
Jrst UBST3
UBNUM: Move B,(A)
UBN0: Setz D,
UBN1: IDivi B,10.
Save C
Aoj D,
Jumpn B,UBN1
UBN2: Rest C
Addi C,"0
Idpb C,Q
Sojn D,UBN2
Return
;;;
;;; GP typeout macro. Types a string on the terminal, with
;;; special functions turned on with "%":
;;;
;;; %nS Print the ASCIZ string at (ACn)
;;; %nD Print ACn as decimal
;;; %nO Print ACn as octal
;;; %nF Print ACn as a floating-point number
;;; %n' Print ANc as a sixbit word
;;; %nL Print ITS filespec starting at (ACn), Dev/Dir/FN1/FN2.
;;; Knows not to print extra stuff for TTY device.
;;; %M Print remainder of control packet (usually an error code)
;;; %E Print last ITS error message (.BCHNL)
;;;
UETYP: Move U,A
Hrli U,440700
UE1: Ildb B,U
Jumpe B,CPopj
Caie B,"%
Jrst [.Iot TTYo,B
Jrst UE1]
Setz B,
UEAN: Ildb A,U
Cail A,"0
Caile A,"7
Jrst [Move C,A
Cail C,"a
Trz C,40
Jrst UE2]
Lsh B,3
Addi B,-"0(A)
Jrst UEAN
UE2: Caie C,"S ;String output.
Jrst UE3
Move D,ACsave(B)
Jumpe D,UE1
Tlnn D,-1
Hrli D,440700
UES1: Ildb B,D
Jumpe B,UE1
.Iot TTYo,B
Jrst UES1
UE3: Caie C,"D ;Decimal output.
Jrst UE4
Movei E,10.
UERAD: Movem E,Base
Move B,ACsave(B)
Setz D,
UED1: IDiv B,Base
Push P,C
Aoj D,
Jumpn B,UED1
UED2: Rest B
Addi B,"0
.Iot TTYo,B
Sojn D,UED2
Jrst UE1
UE4: Caie C,"O
Jrst UE5
Movei E,8.
Jrst UERAD
UE5: Caie C,"F ;Floating-point output.
Jrst UE6
Move A,ACsave(B)
Call UEF0
Jrst UE1
UEF0: Jumpg A,UEF1
Jumpe A,UEF2
Movns A
.Iot TTYo,["-]
Tlze A,400000
Jrst UEF2
UEF1: Setz B,
Tlnn A,400
.Iot TTYo,["#] ;Not normalized.
Camge A,FT01
Jrst UEF4
Caml A,FT8
Aoja B,UEF4
UEF2: Setzb C,Tem1
Muli A,400
Ashc B,-243(A)
Move A,B
Call UEF5
.Iot TTYo,[".]
Movni A,10
Add A,Tem1
Move T,C
UEF3: Move D,T
Muli D,10.
Addi D,"0
.Iot TTYo,D
Skipe T
Aojl A,UEF3
Return
UEF4: Movni C,6
Setz T3,
UEF4A: Addi T3,1(T3)
Xct FCP(B)
Sosa T3
Fmpr A,@FCP+1(B)
Aojn C,UEF4A
Save EXPSGN(B)
Call UEF2
.Iot TTYo,["E]
Rest D
.Iot TTYo,D
Move A,T3
UEF5: Skipe A
Aos Tem1
IDivi A,10.
Hrlm B,(P)
Jumpe A,UEF5A
Call UEF5
UEF5A: Hlrz D,(P)
Addi D,"0
.Iot TTYo,D
Return
UE6: Caie C,"M
Jrst UE7
Move A,RespBP
Move B,RespNB
UE6A: Sojl B,CPopj
Ildb T,A
.Iot TTYo,T
Jrst UE6A
UE7: Caie C,"E
Jrst UE8
Syscal OPEN,[%Clbit,,.uai
%Climm,,ERRi
[Sixbit /ERR/]
%Climm,,1]
Return
UE7A: .Iot ERRi,T
Caige T,40
Jrst [.Close ERRi,
.Iot TTYo,[^M]
Return]
.Iot TTYo,T
Jrst UE7A
UE8: Caie C,"L
Jrst UE9
Save A
Move D,ACSave(B)
Move A,0(D)
Call U61
.Iot TTYo,[":]
Trne F,F%TYPE
Jrst UE8A
Move A,1(D)
Call U61
.Iot TTYo,[";]
Move A,2(D)
Call U61
.Iot TTYo,[" ]
Move A,3(D)
Call U61
UE8A: Rest A
Jrst UE1
UE9: Caie C,"'
Jrst UE10
Move A,ACSave(B)
Call U61
Jrst UE1
UE10: .Iot TTYo,["%]
.Iot TTYo,C
Jrst UE1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
;;
;; Interrupt level routines
;;
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TTYint: Save T
Movei T,TTYi
.ITYIC T,
Jrst Disms1
Cain T,^P
Jrst pStats
Caie T,^S
Cain T,^G
Skipa
Jrst Disms1
Type "<22>Aborting...<2E>"
Call TTYoff
Abort: Trnn F,F%SEND
Jrst Abort1
.Close DSKi, ;Abort sending of local file. Close it,
Call DatEOF
Call DELEWO ;reset flags and go back to command...
Call ClsOFI
Jrst Dismis
Abort1: Syscal DELEWO,[oChan] ;Abort reception of foreign
Noop ;file: Close and delete the
Abort2: Syscal CLOSE,[oChan] ;local copy...
.Lose %lsSys
Call ClsIFI
IFN 0,[
Skipe Debug
Type "<D> Waiting for synchronous mark<72>"
Abort3: Inhale cDATAi
Jrst PktErr
Ldb T,[$CPKOP Packet]
Caie T,%coSYN
Jrst Abort3
];IFN 0
Dismis: Rest T ;Clean stack...
Syscal TTYFLS,[%Clbit,,0
%Climm,,TTYi]
Noop
Syscal DISMIS,[P ? %Climm,,Comand]
.Lose
pStats: .SAVE [A,B,C] ;^P while you are in a transfer
Move A,NBytes ;gives us the stats...
IMul A,BytSiz
Move B,A
IMuli B,100.
IDiv B,NBits
EType "[%1D bits = %2D%]<5D>"
.REST [C,B,A]
Jrst Disms1
More: Type "--More--"
Save T
.Iot TTYi,T
Caie T,40
Jrst [Type "Flushing<6E>"
Jrst Abort2]
.Iot TTYo,[^M]
Disms1: Rest T
Syscal TTYFLS,[%Clbit,,0
%Climm,,TTYi]
Noop
Syscal DISMIS,[P]
.Lose
IOCerr: Type "<22>Yow! Something is seriously wrong! IOC error!!...
Closing everything... turning off all flags... flushing world.<2E><>"
Trz F,F%DAT\F%CTL\F%LOG\F%IFI\F%OFI
.Close cDATAi,
.Close cDATAo, ;reset EVERYTHING
.Close CHAOSi,
.Close CHAOSo,
.Close DSKi, ;Just in case, close
Syscal DELEWO,[oChan] ;anything that might
Skipa ;be open...
Syscal CLOSE,[oChan]
Noop
Syscal DISMIS,[P ? %Climm,,Unwind]
.Lose %lsSys
BinBuf: Block Buflen
Variables
Constants
YOWpag==<._-12>+1
LOC YOWpag*2000
YOWloc: 0
Block 1777
Expunge .kark.,.gack.
End Begin