1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-15 04:16:21 +00:00
Files
PDP-10.its/src/sysen1/xxfile.mta224
2018-05-05 19:37:20 +01:00

2696 lines
57 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.
TITLE NX
O=0
A=1
B=2
C=3
D=4
E=5
F=6
G=7
T=15 ; CONTAINS NUMBER OF STY
U=16 ; USER INDEX, USED IN STATUS CODE
P=17
.xcref O,A,B,C,D,E,F,G,P
DSKI==0 ; FILE INPUT
OUTCHN==1 ; NON-INTERACTIVE OUTPUT
TTYI==2 ; TTY INPUT
TTYO==3 ; TTY OUTPUT
ECHO==4 ; ECHO AREA OUTPUT (COMMANDS)
STYI==5 ; STY INPUT
STYO==6 ; STY OUTPUT
; DEVICE CODES USED
SNTTY==1
SNTDS==2
SNSTY==25
; BLOCKS ON INPUT CHAIN
OUTBLK==6 ; LENGTH OF BLOCK
OUTNXT==0 ; NEXT BLOCK ON CHAIN
OUTTYP==1 ; TYPE
OUTLEN==2 ; LENGTH
OUTPTR==3 ; BYTE POINTER
OUTTLN==4 ; TOTAL LENGTH OF SOURCE
OUTRED==5 ; NUMBER OF CHARS READ SO FAR
; TYPES FOR BLOCKS
$TFILE==1
$TTEXT==2
; OFFSETS INTO FILE NAME BLOCKS
DEV==0
SNM==1
FN1==2
FN2==3
; OFFSETS INTO ERROR STRING BLOCKS
ERRBLK==5 ; LENGTH OF BLOCK
ENEXT==0 ; NEXT BLOCK IN CHAIN OR 0
EMATCH==1 ; NEXT CHAR TO BE MATCHED
EMATLN==2 ; # OF CHARACTERS LEFT TO MATCH
ESTRING==3 ; BEGINNING OF STRING
ELENGTH==4 ; LENGTH OF STRING
; DECREMENT BYTE POINTER
DEFINE DBP AC
ADD AC,[70000,,]
TLNE AC,400000
ADD AC,[347777,,-1]
TERMIN
LOC 40
0
JSR UUOH
-TSINTL,,TSINT
LOC 100
UUOERR==1 ; WE WANT AN ERROR UUO
.INSRT TAA;UUOS >
; BLOCKS
PDLLEN==200
PDL: BLOCK PDLLEN
INBLEN==50
INPBUF: BLOCK INBLEN
INPBU1: BLOCK INBLEN
DBUFLN==50
DSKBUF: BLOCK DBUFLN
JCLBUF: BLOCK 50
TTYBUF: BLOCK 50
STTBUF: BLOCK 50 ; BUFFER FOR STATUS LINE
; VARIABLES
XUNAME: 0
SNAME: 0
HSNAME: 0
FILFIL: 0 ; BLOCK FOR PARSING INPUT FILE NAMES
0
0
0
FILFDF: SIXBIT /DSK/
0
0
SIXBIT />/
OUTFIL: SIXBIT /NUL/
SIXBIT /HUDINI/
0
SIXBIT />/
OUTFDF: SIXBIT /NUL/
SIXBIT /HUDINI/
0
SIXBIT />/
CDEFAU: 0
SYSVER: 0 ; VERSION OF SYSTEM INITIALIZED IN
IERRST: 0 ; LIKE ERRSTK, FOR INPUT FAILURE ERRORS
ERRSTK: 0 ; IF NON-ZERO, SET P TO THIS AND DO
; .CALL DISMIS AFTER ERROR
STIFLG: 0 ; IF -1, READING FROM STY
STOFLG: 0 ; IF -1, WRITING TO STY
LSTLEN: 0
LSTPTR: 0
LSTTMP: 0
LSTOLN==4
LSTOUT: BLOCK LSTOLN
LSTBUF: BLOCK 2*LSTOLN ; STUFF FOR CTRL-T
ESCAPE: ^^ ; ESCAPE CHARACTER
CTRLT: ^T ; STATUS CHARACTER
PRSW: 0 ; IF -1, LEAVE STY AS PRINTING TERMINAL
COMGLN: 0 ; FIRST ARG TO COMND--GET LINE
COMPRT: 0 ; SECOND ARG--PRINT CRAP
ECHOQ: 0 ; -1 IF ECHO AREA SET UP
TTYQ: 0 ; -1 IF TTY OPEN
TTYOPT: 0 ; TTY OPTION WORD FOR OUR TTY
TOERS: 0 ; SET FROM TTYOPT BY GETLIN
ECCPOS: 0 ; SET BY GETLIN--USED FOR FLUSHING ENTIRE LINE
CTTST1: 0
CTTST2: 0
CTTSTS: 0 ; CURRENT TTYGET SETTINGS
SIIFLG: 0 ; USED TO CAUSE RESUMPTION OF SII AFTER COMMAND
NTTST1: 030202,,020202 ; NORMAL CASE IS TO INTERRUPT ONLY ON
NTTST2: 030202,,020202 ; CTRLS, ACTIVATE ON EVERYTHING
TTTST1: 030303,,030303 ; WHEN IN TTY INPUT, EVERYTHING INTERRUPTS
TTTST2: 030303,,030303
STYST1: 0
STYST2: 0 ; TTYSTn WORDS FOR STY
STHIGH: 0 ; HEIGHT OF STY SCREEN
STVPOS: -1 ; VERTICAL POSITION (ONLY IF OUTPUT TO FILE)
STHPOS: 0 ; HORIZONTAL POSITION
INPSRC: 0 ; POINTER TO CHAIN OF INPUT BLOCKS
JOBFRC: 0 ; IF NON-ZERO, # OF JOB ALL INPUT MUST GO TO
FILOPQ: 0 ; FILE SPECIFIED BY CURRENT BLOCK IS OPEN
CTRLM: 0 ; LAST CHAR 'SENT' WAS CTRL-M
FORCSW: 0 ; IF -1, OUTPUT SHOULD BE FORCED
FORCTM: 0 ; USED IN SNDCOM FOR SPECIAL HACK W/ FORCE SWITCH
LSTBLK: 0
0
4
440700,,[ASCII /0U/] ; LAST BLOCK TO BE SENT--LOG OUT
4
0
CINPLN: 0 ; # CHARACTERS GOBBLED FROM STYI
DSKOUT: 0 ; OUTPUT TO NORMAL DEVICE (OUTCHN)
TTYSRC: 0 ; READING FROM TTY, SO PRINT THERE
DSKCHN: 0 ; OUTCHAN IS TTY-TYPE (0) OR DSK (-1)
NULOUT: -1 ; NO OUTPUT CHANNEL (INCLUDING TTY)
NOCNSL: 0 ; SET -1 BY ERROR UUO IF NO CONSOLE WHEN RUNS
CNSFLS: 0 ; IF E SWITCH--DIE IF ERROR AND NO TTY
STYTRY: 0 ; IF 0, TRY MANY TIMES TO OPEN STY WHEN DEV FULL
ERESET: 0 ; SET BY SENDIT--RESET ALL ERROR STRINGS
ERRORS: DEFER1 ; INITIALLY LOOK FOR *ERROR* AND ?U?
DEFER1: DEFER2
440700,,[ASCII /*ERROR*/]
7
440700,,[ASCII /*ERROR*/]
7
DEFER2: DEFER3
440700,,[ASCIZ /?U?/]
3
440700,,[ASCIZ /?U?/]
3
DEFER3: 0
440700,,[ASCII /??/]
2
440700,,[ASCII /??/]
2
START: MOVE P,[-PDLLEN,,PDL-1]
.RSYSI A,
CAME A,SYSVER
PUSHJ P,INIT
PUSHJ P,TTYOP1 ; OPEN TTY FOR READING, SET UP OPTION WORD,...
PUSHJ P,JCLHAK
PUSHJ P,STYOPN ; SET UP STY, CAUSE IT TO ASK FOR INPUT
MOVE B,[200000,,A]
MOVEI A,300. ; EVERY FIVE SECONDS
.REALT B,
JFCL ; PROBABLY NEVER SKIPS WITH THIS CALL...
JFCL
.HANG
TTYSU: .SOPTIO,,A
.SMSK2,,[<1_TTYO>\<1_TTYI>\<1_STYO>\<1_STYI>]
.RXUNAM,,XUNAME
.RSNAME,,SNAME
.RHSNA,,HSNAME
TTYSUS: TTYSU-.,,TTYSU
TTYOP1: SETZM TTYQ
.SUSET [.ROPTIO,,A]
TLNE A,OPTDDT
.VALUE [ASCIZ \..SAFE/-1
P\]
TLO A,<OPTINT\OPTOPC>
MOVE B,TTYSUS
.SUSET B ; SET UP MASKS, READ XUNAME, SNAME, SET OPTION
MOVE B,SNAME
MOVEM B,SNM+FILFDF
MOVEM B,FN1+OUTFDF
MOVE B,HSNAME
MOVEM B,SNM+OUTFDF ; DEFAULT OUTPUT DIRECTORY
.SUSET [.RCNSL,,A]
JUMPL A,CPOPJ ; IF CNSL IS <0, IN A DAEMON'S TREE, SO FLUSH
SETOM TTYQ ; WE HAVE TTY
.CALL [SETZ
SIXBIT /OPEN/
[.UAI,,TTYI]
[SIXBIT /TTY/]
[SIXBIT /TTY/]
SETZ [SIXBIT /TTY/]]
.LOSE %LSFIL
.CALL [SETZ
SIXBIT /OPEN/
[.UAO+%TJPP2+%TJMOR,,ECHO]
[SIXBIT /TTY/]
[SIXBIT /TTY/]
SETZ [SIXBIT /TTY/]]
.LOSE %LSFIL
.CALL [SETZ
SIXBIT /CNSGET/
MOVEI TTYI
MOVEM
MOVEM
MOVEM
MOVEM
SETZM TTYOPT] ; READ TTY OPTION WORD
.LOSE %LSSYS
.CALL [SETZ
SIXBIT /TTYGET/
MOVEI TTYI
MOVEM A
MOVEM A
SETZM CTTSTS]
.LOSE %LSSYS
MOVE A,NTTST1
MOVEM A,CTTST1
MOVE A,NTTST2
MOVEM A,CTTST2
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI TTYI
NTTST1
SETZ NTTST2] ; SET UP TTY INTERRUPTS
.LOSE %LSSYS
POPJ P,
SUBTTL STY INITIALIZATION
; OPEN STY, SET UP BITS TO BE SOMETHING LIKE OURS. WHEN DONE, CAUSE
; INTERRUPT ON STYO SO WE'LL BE LOGGED IN AND ALL.
STYOPN: PUSH P,A
STYOPC: .CALL [SETZ
SIXBIT /OPEN/
[<10\.UAI>,,STYI] ; DON'T HANG ON INPUT
[SIXBIT /STY/]
[SIXBIT /STY/]
[SIXBIT /STY/]
SETZB A] ; ERROR CODE
JRST STYLOS
.CALL [SETZ
SIXBIT /OPEN/
[.UAO,,STYO] ; HANG ON OUTPUT
[SIXBIT /STY/]
[SIXBIT /STY/]
SETZ [SIXBIT /STY/]]
.LOSE %LSFIL
.CALL [SETZ
SIXBIT /RFNAME/
MOVEI STYO
SETZM A] ; 'Snn
.LOSE %LSSYS
LDB T,[300600,,A]
SUBI T,20
IMULI T,10
LDB A,[220600,,A]
ADDI T,-20(A)
ADD T,NFSTTY ; GET TTY NUMBER WE GOT
PUSHJ P,STYSET
SKIPE NULOUT
JRST PROCED
SKIPN TTYSRC ; CAN'T :PROCED IF TTY INPUT
SKIPN DSKCHN ; OR NON-DISK OUTPUT
JRST STYOP1
PROCED: SKIPE TTYQ ; IF NO TTY, DON'T :PROCED
.VALUE [ASCIZ /:PROCED
/]
STYOP1: .SUSET [.SIIFPIR,,[<1_STYO>]] ; CAUSE IT TO ASK FOR INPUT
.SUSET [.SMASK,,[%PIRLT\%PIATY]] ; ENABLE WORD ONE INTERRUPTS
POP P,A
POPJ P,
; HERE IF LOSSAGE OPENING STY
STYLOS: SKIPE STYTRY
SOSG STYTRY
STYLS1: .CALL [SETZ
SIXBIT /LOSE/
[STYOPC,,%LSFIL]
SETZI STYOPC] ; REPORT LOSSAGE
CAIE A,%EFLDV ; ONLY IF DEVICE FULL ERROR
JRST STYLS1
MOVEI A,<10.*30.>
.SLEEP A,
JRST STYOPC ; TRY AGAIN
; SET UP STY'S BITS
STYSET: PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E
SKIPE TTYQ ; IF NO TTY, THEN PRINTING TERMINAL
SKIPE PRSW ; OR IF USER GAVE /P SWITCH
JRST STYSE1
MOVE A,TTYOPT
TRO A,%TPTEL ; TREAT CRLF AS CR (TELNET PROTOCOL)
MOVEI C,0
DPB C,[$TPPLF,,A] ; NO PADDING OF LINE FEEDS
DPB C,[$TPPCR,,A] ; NO PADDING OF CR
DPB C,[$TPPTB,,A] ; NO PADDING OF TABS
TDZ A,[%TOMOR\%TORAW\%TOHDX,,%TPCBS\%TPORS]
.CALL [SETZ
SIXBIT /RSSIZE/
MOVEI TTYI
MOVEM D
SETZM E]
.LOSE %LSSYS ; GET SCREEN SIZE OF THIS
CAIG D,60.
SUBI D,2
MOVEM D,STHIGH ; HEIGHT OF STY'S SCREEN
SUBI E,1 ; ALLOW FOR ! COLUMN
MOVE C,[-STYBLN,,STYBLK]
.CALL [SETZ
SIXBIT /TTYVAR/
MOVEI STYO
SETZ C]
.LOSE %LSSYS
.CALL [SETZ
SIXBIT /SCPOS/
MOVEI STYO
MOVEI 0
SETZI 0]
.LOSE %LSSYS
.CALL [SETZ
SIXBIT /TTYGET/
MOVEI STYO
MOVEM B
MOVEM C
SETZM A]
.LOSE %LSSYS
TLO A,%TSMOR ; TURN OFF MORE HACKING
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI STYO
B
C
SETZ A]
.LOSE %LSSYS
STYSTO: .CALL [SETZ
SIXBIT /TTYVAR/
MOVEI STYO
[SIXBIT /TTYCOM/]
MOVEI O
SETZ [TLO %TCRFS]]
.LOSE %LSSYS ; SET UP REFUSE MODE
POP P,E
POP P,D
POP P,C
POP P,B
POP P,A
POPJ P,
STYSE1: .CALL [SETZ
SIXBIT /TTYVAR/
MOVEI STYO
[SIXBIT /TTYOPT/]
MOVEI O
SETZ [TRO %TPTEL]] ; JUST TURN ON TELNET PROTOCOL AND FLUSH
.LOSE %LSSYS
JRST STYSTO
STYBLK: SIXBIT /TCTYP/
MOVEI O,%TNSFW ; SOFTWARE TTY
SIXBIT /TTYOPT/
MOVE O,A ; SET TTYOPT APPROPRIATELY
SIXBIT /HEIGHT/
MOVE O,D ; SCREEN HEIGHT
SIXBIT /WIDTH/
MOVE O,E ; SCREEN WIDTH
STYBLN==.-STYBLK
SUBTTL STY OUTPUT
; SHIPS BITS OUT TO THE STY. PRINTS UNTIL HAS SENT ACTIVATION OR INTERRUPT
; CHARACTER; THE PRINTING MAY BE BROKEN BY THE OCCURRENCE OF CARRIAGE RETURNS
; (WHICH GET TURNED INTO JUST CR INSTEAD OF CRLF), COMMANDS, AND SUCH.
; DATA STRUCTURE IS A LINKED LIST:
; OUTTYP ; TYPE OF INPUT SOURCE--FILE, STRING IN JCL, ETC.
; OUTNXT ; NEXT BLOCK OR 0
; OUTLEN ; # OF CHARACTERS AVAILABLE HERE
; OUTPTR ; BYTE POINTER TO NEXT AVAILABLE CHARACTER
; THE ROUTINE FOR DETERMINING WHETHER A CHARACTER IS AN ACTIVATION/INTERRUPT
; CHAR IS STOLEN MORE OR LESS DIRECTLY FROM THE SYSTEM.
SNDSTR: PUSH P,O
PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
PUSH P,E
PUSH P,F
PUSH P,U
.CALL [SETZ
SIXBIT /TTYGET/
MOVEI STYO
MOVEM STYST1
SETZM STYST2]
.LOSE %LSSYS ; GET THE BITS FOR THE TTY
.CALL [SETZ
SIXBIT /STYGET/
MOVEI STYO
MOVEM B
MOVEM B ; OWNER OF TTY
MOVEM C
SETZM C] ; STY STATUS
.LOSE %LSSYS
SKIPN A,JOBFRC ; CHECKING JOB HACK?
JRST SNCONS
CAME A,B ; SAME JOB?
ERROR [ASCIZ /Job changed when not allowed./]
; THE FOLLOWING IS MAINLY FOR PUB, GOD HELP IT.
SNCONS: TLNE C,400000
JRST SNCONT ; WANTS INPUT, SO GO
AOJE B,SNCONT ; NOT LOGGED IN YET, SO FEED IT THE CTRL-Z
MOVEI U,-1(B)
IMUL U,LUBLK
MOVE A,@UPC
TLNE A,%PCUSR
JRST SNDOUT ; IN USER MODE, SO DOESN'T REALLY CARE
MOVE A,@LSUUO
CAME A,[.HANG] ; PUB WOULD BE IN .HANG IF IT WANTED INPUT
JRST SNDOUT ; LAST UUO NOT HANG, SO NOT WAITING FOR ANYTHING
SNCONT: PUSHJ P,SNSTRT ; INITIALIZE O AND F
SNDLOP: PUSHJ P,SNGCHR ; PICK UP A CHAR IN A
CAMN A,ESCAPE ; COMMAND STARTER?
JRST SNDCOM ; GO PROCESS A COMMAND
SNDLP1: ADDI O,1 ; # CHARS TO SEND
SKIPE CTRLM
JRST [SETZM CTRLM ; IF LAST WAS CTRLM, CTRL-J IS NO-OP
CAIE A,^J
JRST .+1
MOVEI B,0
JRST SNDACT]
CAIN A,^M
SETOM CTRLM
PUSHJ P,GETGRP ; GET TYPE OF CHAR IN B, CLOBBERING C & D
SNDACT: TRNN B,%TGACT+%TGINT ; ACTIVATES OR INTERRUPTS?
JRST SNDLOP ; NO, GO DO THE NEXT ONE
PUSHJ P,SENDIT ; DO THE SEND--COUNT IN O, BPTR IN OUTPTR(E)
SKIPE FORCSW ; FORCING?
JRST SNDLOP ; GO SEND SOME MORE
SNDOUT: POP P,U
POP P,F
POP P,E
POP P,D
POP P,C
POP P,B
POP P,A
POP P,O
POPJ P,
; INTERFACE FOR COMMANDS IN FILE
SNDCOM: PUSHJ P,SENDIT ; SEND OUT WHAT WE HAVE
PUSHJ P,SNSTRT ; RESET O AND F
PUSHJ P,SNGCHR ; GET COMMAND INTO A
MOVEM F,OUTPTR(E) ; SAVE F AWAY
SETZM FORCTM ; SAVE STATE OF FORCSW
SKIPE FORCSW
SETOM FORCTM
SKIPE ECHOQ ; ECHO AREA EXISTS?
JRST [OCTLP ECHO,"C ; CLEAR
OASC ECHO,[ASCIZ /Command: /]
JRST .+1]
PUSHJ P,COMND
PUSHJ P,SNGLIN ; INSTRUCTION TO GET A LINE
PUSHJ P,SNGPRT ; INSTRUCTION TO DO OUTPUT
JRST SNDOUT ; FLUSH FROM HERE IF COMND DIDN'T SKIP
SKIPN FORCTM ; WAS FORCSW FORMERLY ON?
JRST SNCONT ; NO, RETURN TO LOOP
SKIPE FORCSW ; DID ITS STATE JUST CHANGE?
JRST SNCONT ; NO, RETURN TO LOOP
JRST SNDOUT ; YES, FLUSH IMMEDIATE
; ROUTINE TO GET A LINE OF TEXT FOR THE COMMAND READER. RETURN LENGTH
; IN A, POINTER IN B. ALWAYS SKIPS
SNGLIN: PUSH P,O
PUSH P,C
PUSH P,E
PUSH P,F
PUSHJ P,SNSTRT ; SET UP O AND F
MOVE B,[440700,,TTYBUF]
SNGLLP: PUSHJ P,SNGCHR
CAIN A,^M
JRST SNGLCR ; ENCOUNTERED CR
IDPB A,B
AOJA O,SNGLLP ; GET THE NEXT CHAR
SNGLCR: MOVEI A,0
IDPB A,B ; MAKE IT ASCIZ
PUSHJ P,SNGCHR ; THROW AWAY THE LINEFEED
MOVEM F,OUTPTR(E) ; AND UPDATE THE CURRENT SOURCE
MOVEI A,TTYBUF
PUSHJ P,SNGPRT ; PRINT IF APPROPRIATE
MOVE A,O
MOVE B,[440700,,TTYBUF]
POP P,F
POP P,E
POP P,C
POP P,O
AOS (P)
POPJ P,
; CALL WITH POINTER TO ASCIZ IN A, DUMP OUTPUT TO SUITABLE PLACE.
SNGPRT: SKIPN ECHOQ
POPJ P,
OASC ECHO,(A)
POPJ P,
; INITIALIZE O, E, AND F FOR SENDING ROUTINE
SNSTRT: SKIPN E,INPSRC
ERROR [ASCIZ /Requesting input when none available./]
MOVEI O,0
MOVE F,OUTPTR(E)
POPJ P,
; GET A CHARACTER FROM THE INPUT SOURCE INTO A. SEND CURRENT STUFF IF
; HAVE TO CHANGE INPUT SOURCE.
SNGCHR: SOSGE OUTLEN(E) ; ANY LEFT IN THIS SOURCE?
JRST SNGMOR ; NO, GET MORE
ILDB A,F
AOS OUTRED(E)
POPJ P,
SNGMOR: PUSHJ P,SENDIT ; SEND OUT CURRENT STUFF
MOVE A,OUTTYP(E) ; TYPE
CAIE A,$TFILE ; A FILE?
JRST SNGNXT ; NO, SO GET NEXT ONE
SKIPN FILOPQ ; IS THE FILE OPEN?
JRST SNGNXT ; NO
PUSHJ P,FILNXT
MOVEM C,OUTPTR(E)
MOVEM B,OUTLEN(E)
SNGCON: PUSHJ P,SNSTRT
JRST SNGCHR ; TRY IT NOW
; HERE IF THE CURRENT SOURCE IS EXHAUSTED.
SNGNXT: PUSH P,B
PUSH P,C
SNGNX1: SKIPN A,OUTNXT(E)
JRST SNGTOT ; NOTHING HERE
MOVE B,OUTTYP(A)
CAIE B,$TFILE ; FILE?
JRST [MOVE B,OUTLEN(A)
MOVEM B,OUTTLN(A) ; SET UP TOTAL LENGTH FOR TEXT
JRST SNGTOT]
PUSHJ P,FILOPN ; TRY TO OPEN IT
ERROR 1,(A) ; LOST
.CALL [SETZ
SIXBIT /FILLEN/
MOVEI DSKI
SETZM OUTTLN(A)]
.LOSE %LSSYS
PUSHJ P,FILNXT
MOVEM C,OUTPTR(A)
MOVEM B,OUTLEN(A)
SNGTOT: MOVEM A,INPSRC
POP P,C
POP P,B
JRST SNGCON ; TRY AGAIN
; HERE TO SHIP A STRING OUT. LENGTH IS IN O, BPTR IS IN OUTPTR(E).
; ALSO UPDATES OUTPTR(E), WHICH WILL CONTAIN THE CONTENTS OF F WHEN
; WE'RE DONE. STORES SOME STUFF IN LSTOUT AND LSTLEN FOR CTRL-T.
SENDIT: EXCH F,OUTPTR(E)
JUMPE O,CPOPJ
PUSH P,A
PUSH P,B
MOVE A,F
TLNN A,760000
ADDI A,1
HRLS A
HRRI A,LSTOUT
BLT A,LSTOUT+LSTOLN-1 ; BLT 3 WORDS
MOVE A,F
HRRI A,LSTOUT
MOVEM A,LSTPTR ; SAVE BPTR
MOVEM O,LSTLEN ; AND LENGTH
POP P,B
POP P,A
.CALL [SETZ
SIXBIT /SIOT/
MOVEI STYO
F
SETZ O]
.LOSE %LSSYS
SETOM ERESET ; ERROR STRINGS WILL BE RESET
POPJ P,
SUBTTL FILE HACKERS
; OPEN FILE DESCRIBED IN (A): LENGTH OF NAME IS OUTLEN(A), POINTER IS OUTPTR(A).
; SKIP IF FILE EXISTS.
FILOPN: PUSH P,A
PUSH P,B
SETZM FN1+FILFIL
SETZM FN2+FILFIL
MOVE B,OUTLEN(A)
MOVE A,OUTPTR(A)
PUSHJ P,FILPRS
FILFDF,,FILFIL
.CALL [SETZ
SIXBIT /OPEN/
[.UAI,,DSKI]
DEV+FILFIL
FN1+FILFIL
FN2+FILFIL
SETZ SNM+FILFIL]
JRST FILPOP
AOS -2(P)
SETOM FILOPQ ; HAVE SOMETHING OPEN
FILPOP: POP P,B
POP P,A
CPOPJ: POPJ P,
; PARSE A FILE NAME. POINTER IS IN A, LENGTH IN B, BLOCK TO USE IS
; @(P)
FILPRS: PUSH P,C
PUSH P,D
PUSH P,E
PUSH P,F
MOVEI E,0
MOVE F,@-4(P)
HLRM F,CDEFAU
SETZM DEV(F)
SETZM SNM(F)
SETZM FN1(F)
SETZM FN2(F) ; ZERO THE SLOTS
AOS -4(P)
FILOLP: MOVE C,[440600,,E]
FILOL1: ILDB D,A
CAIN D,":
JRST [JUMPE E,FILOLE ; DON'T STORE NULL NAME
MOVEM E,DEV(F)
MOVEI E,0
JRST FILOLE]
CAIN D,";
JRST [JUMPE E,FILOLE
MOVEM E,SNM(F)
MOVEI E,0
JRST FILOLE]
CAIE D,40
CAIN D,^I
JRST FILFLD
CAIN D,^J
JRST FILFLD
TLNN C,770000 ; WORD ALREADY FULL?
JRST FILOLE ; IGNORE THIS CHAR
SUBI D,40
CAIL D,100
SUBI D,40
IDPB D,C ; STUFF IT IN
SOJG B,FILOL1
FILOUT: PUSHJ P,FILFL1
; FILL IN THE DEFAULTS AND SUCH
MOVE E,CDEFAU
HRLI E,-4
FILDEF: PUSHJ P,DEFHAK
ADDI F,1
AOBJN E,FILDEF
POP P,F
POP P,E
POP P,D
POP P,C
POPJ P,
FILOLE: SOJLE B,FILOUT ; RAN OUT OF CHARACTERS
JRST FILOLP
DEFHAK: SKIPE (F) ; NEED SOMETHING FROM DEFAULT
JRST [MOVE C,(F)
MOVEM C,(E)
POPJ P,]
MOVE C,(E)
MOVEM C,(F)
POPJ P,
; HERE WITH EITHER FN1 OR FN2 IN E
FILFL1: JUMPE E,CPOPJ
PUSH P,A
SKIPN FN1(F)
JRST [MOVEM E,FN1(F)
JRST FILFL2]
MOVEM E,FN2(F)
FILFL2: MOVEI E,0
POP P,A
POPJ P,
; HERE WITH FN1 OR FN2 IN E, TERMINATED BY SPACE OR SOMETHING
FILFLD: PUSHJ P,FILFL1
JRST FILOLE
; COME HERE TO OPEN FILE PARSED INTO OUTFIL, SET PARAMETERS APPROPRIATELY.
OUTHCK: PUSH P,A
PUSH P,B
.CALL [SETZ ; DO THE OPEN
SIXBIT /OPEN/
[.UAO,,OUTCHN]
DEV+OUTFIL
FN1+OUTFIL
FN2+OUTFIL
SETZ SNM+OUTFIL]
.LOSE %LSFIL
OUTHAK: .STATUS OUTCHN,A
JUMPE A,[SETZM DSKCHN ; OUTCHAN DOESN'T LOOK LIKE DSK
SETZM DSKOUT ; DOESN'T EXIST
SKIPN TTYSRC
SETOM NULOUT ; IF INPUT ISN'T FROM TTY, THERE'S NO OUTPUT
JRST OUTHCO]
SETOM DSKCHN
ANDI A,77 ; ISOLATE DEVICE
CAIE A,SNTTY
CAIN A,SNTDS ; TTY AND DISPLAY TTY AREN'T DISK-LIKE
SETZM DSKCHN
CAIN A,SNSTY
SETZM DSKCHN ; NOR IS STY
SETZM NULOUT
SETOM DSKOUT
SKIPN TTYQ ; HAVE WE OPENED TTY?
JRST OUTHCO ; NO, SO DON'T DO SCML
MOVEI B,2
CAIE A,SNTDS
MOVEI B,0
.CALL [SETZ ; SET UP ECHO AREA IF OUTPUT IS TO DISPLAY TTY
SIXBIT /SCML/
MOVEI ECHO
SETZ B]
.LOSE %LSSYS
MOVEM B,ECHOQ ; B IS 0 IF THERE'S NO ECHO AREA
OUTHCO: POP P,B
POP P,A
POPJ P,
; HERE TO SET ALL THE SWITCHES WITHOUT OPENING THE CHANNEL
OUTHC1: PUSH P,A
PUSH P,B
JRST OUTHAK
; GET BUFFER AT LEAST PARTIALLY FULL OF CRUFT. SKIP IF ANYTHING. CLOSE
; DSKI IF THROUGH WITH IT, AND CLEAR FLAG. RETURN LENGTH OF BUFFER IN B,
; POINTER IN C.
FILNXT: SKIPN FILOPQ
JRST CPOPJ ; FLUSH IMMEDIATE
MOVEI B,5*DBUFLN
MOVE C,[010700,,DSKBUF-1] ; SO FLUSHING OF PADDING WILL WORK RIGHT
.CALL [SETZ
SIXBIT /SIOT/
MOVEI DSKI
C
SETZ B]
.LOSE %LSSYS
JUMPE B,FILNXO ; FULL BUFFER
.CLOSE DSKI, ; DIDN'T GET BUFFER FULL, SO DONE
SETZM FILOPQ
PUSH P,A ; ADJUST FOR PADDING
PUSH P,D
MOVEI D,4
PADLOP: LDB A,C
CAIN A,C
JRST [DBP C ; BACK UP THE BPTR
ADDI B,1 ; AOSING HERE SOSES LATER
SOJG D,PADLOP
JRST .+1]
POP P,D
POP P,A
FILNXO: SUBI B,5*DBUFLN
MOVNS B ; GET # CHARS
JUMPE B,CPOPJ ; NONE HERE
MOVE C,[440700,,DSKBUF]
POPJ P,
SUBTTL GET CHARACTER GROUP
; GETS BYTE IN B, GROUP NUMBER IN C, BYTE POINTER IN D; TAKES CHAR IN A
; USED BY SNDSTR
GETGRP: PUSH P,E
PUSH P,A
MOVE B,A
IDIVI B,5
POP P,A
LDB C,GRPBPT(C) ; GET GROUP BITS
MOVEI D,STYST1
CAIL C,6
JRST GETGR2
LDB E,[301400,,SBTBL(C)] ; LOAD LH OF BYTE PTR
GETGR1: DPB E,[301400,,D] ; MAKE TTYST1 OR TTYST2 APPROPRIATE BYTE POINTER
LDB B,D
POP P,E
POPJ P,
GETGR2: LDB E,[301400,,SBTBL-6(C)]
MOVEI D,STYST2
JRST GETGR1
SBTBL: 360600,,
300600,,
220600,,
140600,,
060600,,
000600,,
DEFINE GGRPTB A,B,C,D,E
A_29.+B_22.+C_15.+D_8+E_1
TERMIN
GRPTBL: GGRPTB 0,0,0,0,0
GGRPTB 0,0,6,13,7
GGRPTB 7,0,0,11,0
GGRPTB 0,0,0,0,6
GGRPTB 0,0,0,0,0
GGRPTB 0,0,10,0,0
GGRPTB 0,0,13,3,3
GGRPTB 3,3,3,3,3
GGRPTB 5,5,4,4,3
GGRPTB 4,3,4,2,2
GGRPTB 2,2,2,2,2
GGRPTB 2,2,2,3,3
GGRPTB 5,4,5,3,3
REPEAT 5,GGRPTB 1,1,1,1,1
GGRPTB 1,5,3,5,4
GGRPTB 4,3,1,1,1
REPEAT 4,GGRPTB 1,1,1,1,1
GGRPTB 1,1,1,5,3
GGRPTB 5,3,12,0,0
GRPBPT: 350700,,GRPTBL(B)
260700,,GRPTBL(B)
170700,,GRPTBL(B)
100700,,GRPTBL(B)
010700,,GRPTBL(B)
SUBTTL STY INPUT
; COME HERE TO GOBBLE CHARACTERS FROM THE STY INPUT CHANNEL AND
; SEND THEM TO THE APPROPRIATE OUTPUT DEVICE(S). NOTE THAT THE
; STY'S TTY IS A SOFTWARE TTY, SO WE READ IN 8-BIT BYTES AND CONVERT
; WHERE REQUIRED. READ UNTIL OUT OF CHARACTERS.
RECSTR: PUSH P,O
PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,D
MOVE C,[440700,,INPBU1]
MOVEI D,5*INBLEN
RECNXT: MOVEI B,0 ; SO RECGET WILL READ
RECLOP: PUSHJ P,RECGET ; GET A CHAR
JRST RECPRT ; NONE LEFT
SKIPE NULOUT ; THROW AWAY SOME INPUT
JRST RECLPP
CAILE O,177 ; ASCII?
JRST RECDSP ; HACK FOR DISPLAY CODES
AOS STHPOS ; UPDATE HORIZONTAL POSITION
RECLPP: PUSHJ P,RECPUT ; STUFF INTO OUTPUT, PRINT IF FULL
JRST RECLOP ; GET THE NEXT ONE
RECPRT: SKIPE NULOUT
JRST RECPR1 ; NUL OUTPUT, SO FLUSH
PUSHJ P,RECBUO ; PRINT BUFFER TO APPROPRIATE PLACES
RECPR1: MOVE B,CINPLN
CAIL B,4*INBLEN
JRST RECNXT ; GOT FULL BUFFER, SO TRY AGAIN
RECOUT: POP P,D
POP P,C
POP P,B
POP P,A
POP P,O
POPJ P,
; READ CHARS FROM STY. RETURN # READ IN B, POINTER TO INPBUF IN A
RECDOR: MOVE A,[440800,,INPBUF]
MOVEI B,4*INBLEN
.CALL [SETZ
SIXBIT /SIOT/
MOVEI STYI
A
SETZ B]
.LOSE %LSSYS
SUBI B,4*INBLEN
MOVNS B ; # CHARS READ
MOVE A,[440800,,INPBUF]
POPJ P,
; GET A CHARACTER FROM STY BUFFER. CURRENT LENGTH IN B, POINTER IN A.
; SKIP IF SUCCESSFUL.
RECGET: JUMPE B,RECMOR
RECGT1: ILDB O,A
SOJA B,POPJ1 ; SOS COUNT, RETURN
RECMOR: PUSHJ P,RECDOR ; READ A BUFFER FULL
JUMPE B,CPOPJ ; NONE LEFT
MOVEM B,CINPLN
JRST RECGT1
POPJ1: AOS (P) ; SKIP IF GOT A CHAR
POPJ P,
; SOME ROUTINES MAY COME HERE IF RECGET DOESN'T SKIP, TO SEE IF THE LOSSAGE
; IS TRANSIENT. ALGORITHM IS SUBJECT TO CHANGE WITHOUT NOTICE.
INPERR: MOVEI O,30.
.SLEEP O, ; SLEEP FOR A SECOND, TO LET THINGS SETTLE
PUSHJ P,RECGET ; CAN WE WIN IMMEDIATE?
JRST RECER1
POPJ P, ; YES, RETURN
RECER1: PUSH P,A
PUSH P,B
.CALL [SETZ
SIXBIT /STYGET/
MOVEI STYO
MOVEM A
MOVEM A
MOVEM A
MOVEM A
SETZM B]
.LOSE %LSSYS
JUMPL A,RETRY1 ; JUMP IF OUTPUT CLAIMS TO BE AVAILABLE
TLNN B,200000 ; SKIP IF OUTPUT BUFFER HAS ROOM
JRST RETRY2 ; NO ROOM?
; OUTUT BUFFER HAS ROOM, NO OUTPUT AVAILABLE. WE ARE REALLY CHOMPING.
POP P,B
POP P,A
PUSHJ P,RECGET ; LAST CHANCE
CAIA
POPJ P, ; WON, SOMEHOW
ERROR 2,[ASCIZ /Ran out of chars during cursor positioning command./]
.VALUE ; SORRY, AS.
POPJ P,
; HERE IF OUTPUT IS AVAILABLE (GOSPEL ACCORDING TO STYGET)
RETRY1: TLNN B,200000 ; ROOM IN OUTPUT BUFFER?
JRST [POP P,B
POP P,A
PUSHJ P,RECGET
CAIA
POPJ P,
ERROR 2,[ASCIZ /Chars here, no room in buffer, but I can't get any?/]
.VALUE
POPJ P,]
POP P,B
POP P,A
PUSHJ P,RECGET ; GET IT
CAIA
POPJ P, ; GOT IT
ERROR 2,[ASCIZ /STYGET says chars here when there aren't any./]
.VALUE
POPJ P,
; HERE IF NO ROOM IN OUTPUT BUFFER, BUT NO CHARS AVAILABLE
RETRY2: POP P,B
POP P,A
PUSHJ P,RECGET
CAIA
POPJ P, ; GOT OUTPUT ANYWAY
ERROR 2,[ASCIZ /No room in buffer, but no chars available./]
.VALUE
POPJ P,
; PUT CHARACTER IN O INTO OUTPUT BUFFER (IN C). PRINT BUFFER IF BECOMES FULL
; (COUNT IS IN D) AND DON'T SKIP;
; RECPUT CHECKS FOR ERRORS, RECPU1 DOESN'T
RECPU1: PUSH P,A
IDPB O,C
SETOM ERESET
SOJG D,POPAJ
JRST RECPPR
RECPUT: PUSH P,A
IDPB O,C
SUBI D,1
SKIPE A,ERRORS ; ERRORS TO LOOK FOR?
PUSHJ P,RECERR
JUMPG D,POPAJ
RECPPR: PUSHJ P,RECBUO ; GO PRINT BUFFER
MOVE C,[440700,,INPBU1]
MOVEI D,5*INBLEN
POPAJ: POP P,A
POPJ P,
; HERE TO CHECK FOR ERROR STRINGS
RECERR: SKIPE TTYSRC
POPJ P, ; DON'T CHECK IF TTY INPUT
SKIPE ERESET
PUSHJ P,RECRST ; RESET EVERYBODY
SETZM ERESET
PUSH P,B
RECELP: SKIPG EMATLN(A)
JRST RECELE ; ALREADY MATCHED?
ILDB B,EMATCH(A)
CAIN O,(B)
JRST [SOSE EMATLN(A) ; ALL OUT?
JRST RECELE ; NO
PUSHJ P,RECBUO
MOVE C,[440700,,INPBU1]
MOVEI D,5*INBLEN
ERROR [ASCIZ /ERROR string found./]
JRST .+1]
MOVE B,ESTRING(A)
MOVEM B,EMATCH(A) ; RESET, SINCE DIDN'T MATCH
MOVE B,ELENGTH(A)
MOVEM B,EMATLN(A)
RECELE: SKIPE A,ENEXT(A)
JRST RECELP ; GO TO NEXT
POP P,B
POPJ P,
; RESET ALL ERROR BLOCKS
RECRST: PUSH P,B
RECRSL: MOVE B,ESTRING(A)
MOVEM B,EMATCH(A)
MOVE B,ELENGTH(A)
MOVEM B,EMATLN(A)
SKIPE A,ENEXT(A)
JRST RECRSL
MOVE A,ERRORS
POP P,B
POPJ P,
; HERE TO PRINT OUTPUT BUFFER TO SUITABLE PLACES. # OF CHARACTERS LEFT
; IS IN D. MAY CLOBBER C AND D.
RECBUO: SKIPE NULOUT
POPJ P, ; NO OUTPUT, SO FLUSH
SUBI D,5*INBLEN
MOVNS D ; # CHARACTERS
JUMPE D,CPOPJ
PUSH P,D
SKIPN DSKOUT ; NORMAL OUTPUT?
JRST TTYCHK
SKIPE TTYSRC
JRST [SKIPN DSKCHN ; IF INPUT FROM TTY, MAY NOT WANT TO OUTPUT
JRST TTYCHK
JRST .+1]
MOVE C,[440700,,INPBU1]
.CALL [SETZ
SIXBIT /SIOT/
MOVEI OUTCHN
MOVSI %TJDIS
C
SETZ D]
.LOSE %LSSYS
TTYCHK: POP P,D
SKIPN TTYSRC ; IN TTY INPUT?
POPJ P,
MOVE C,[440700,,INPBU1]
.CALL [SETZ
SIXBIT /SIOT/
MOVEI TTYO
MOVSI %TJDIS ; DISPLAY MODE
C
SETZ D]
.LOSE %LSSYS
POPJ P,
; JRST HERE TO TURN DISPLAY CODE INTO SUITABLE CHARACTERS FOR OUTPUT.
; IF DOES PRINTING, JRSTS TO RECPR1, ELSE TO RECLOP.
; CHARACTER IS IN O; A, B, C,D MUST NOT BE TOUCHED.
RECDSP: TRZ O,200
ASH O,1 ; MULTIPLY BY 2
ADDI O,DSPTBL+1
ADD O,DSKCHN ; OUTPUT TO DISK? (VAL IS 0 OR -1)
PUSH P,E
SKIPL E,@O ; IF TABLE ENTRY < 0, POINTER TO ASCIZ STRING
JRST [PUSHJ P,(E)
JRST RECDOT]
HRLI E,440700
RECDLP: ILDB O,E
JUMPE O,RECDOT
PUSHJ P,RECPU1 ; DON'T CHECK FOR ERROR STRINGS
AOS STHPOS ; UPDATE HORIZONTAL POSITION
JRST RECDLP
RECDOT: POP P,E
JRST RECLOP
; SPECIAL ROUTINES FOR HAIRY CRAP
; %TDMOV, FOLLOWED BY %TDMVO, FOR TTY OUTPUT
RTDMOV: PUSHJ P,RECGET
PUSHJ P,INPERR
PUSHJ P,RECGET ; OLD POSITION
PUSHJ P,INPERR
RTDMVO: MOVEI E,"V
PUSHJ P,CP1ARG
MOVEI E,"H
PUSHJ P,CP1ARG
POPJ P,
CP1ARG: MOVEI O,^P ; TAKES LETTER IN A, PUTS ^P<arg><num>
PUSHJ P,RECPU1 ; IN STRING, WHERE <num> IS 8+next input char
MOVEI O,(E)
PUSHJ P,RECPU1
PUSHJ P,RECGET
PUSHJ P,INPERR
ADDI O,10
PUSHJ P,RECPU1
POPJ P,
; %TDMOV &C FOR FILE OUTPUT
RTDMVD: PUSH P,F
MOVE F,STVPOS
MOVE E,STHPOS
JRST RTDMV1
RTDMOD: PUSH P,F
PUSHJ P,RECGET ; OLD VERTICAL POS
PUSHJ P,INPERR
MOVE F,O
PUSHJ P,RECGET ; OLD HORIZONTAL POS
PUSHJ P,INPERR
MOVE E,O
RTDMV1: PUSHJ P,RECGET ; NEW VERTICAL POS
PUSHJ P,INPERR
MOVEM O,STVPOS
SUBM O,F ; CHANGE IN VERTICAL POS
CAIGE F,0
ADD F,STHIGH ; IF <0, ADD HEIGHT
JUMPE F,RTDMVH
CAILE F,3
MOVEI F,3 ; LEAVE US NOT BE RIDICULOUS
MOVEI E,0 ; SINCE DOING CR'S, HPOS WILL BE ZERO
RTDCRL: MOVEI O,^M
PUSHJ P,RECPU1
MOVEI O,^J
PUSHJ P,RECPU1
SOJG F,RTDCRL ; STUFF OUT SUITABLE CRLFS
RTDMVH: PUSHJ P,RECGET ; NEW HORIZONTAL POS
PUSHJ P,INPERR
MOVEM O,STHPOS
CAIG O,(E) ; > THAN OLD?
JRST RTDMDN ; NO, LEAVE
SUBM O,E
RTDSPL: MOVEI O,40
PUSHJ P,RECPU1
SOJG E,RTDSPL
RTDMDN: POP P,F
POPJ P,
; CRLF FOR FILE OUTPUT
RTDNWL: MOVEI O,^M
PUSHJ P,RECPU1
MOVEI O,^J
PUSHJ P,RECPU1
AOS E,STVPOS
CAIL E,STHIGH
SETOM STVPOS ; ZERO VERTICAL POSITION ON WRAPAROUND
SETZM STHPOS
POPJ P,
RTDCLR: SETOM STVPOS ; SO VERTICAL POSITION WORKS
PUSHJ P,RTDNWL
POPJ P,
; %TDNOP, %TDMV1, %TDMTF, %TDMTN, %TDBS, %TDLF, %TDRCR, %TDORS, %TDQOT
RTDNOP: POPJ P,
; %TDILP, %TDDLP, %TDICP, %TDDCP
RTDILP: MOVEI E,"[ ; INSERT LINE
JRST RTDXXX
RTDDLP: MOVEI E,"\
JRST RTDXXX
RTDICP: MOVEI E,"^
JRST RTDXXX
RTDDCP: MOVEI E,"_
RTDXXX: PUSHJ P,RECGET ; GET NUMBER TO DO
PUSHJ P,INPERR
JUMPLE O,CPOPJ
PUSH P,F
MOVE F,O
RTDXXL: MOVEI O,^P
PUSHJ P,RECPU1
MOVE O,E
PUSHJ P,RECPU1
SOJG F,RTDXXL
POP P,F
POPJ P,
; TABLE FOR DISPLAY CODES
DSPTBL: RTDMOD
RTDMOV ; %TDMOV--200
RTDNOP
RTDNOP ; %TDMV1--201
RTDNOP
SETZ [ASCIZ /E/] ; %TDEOF--202
RTDNOP
SETZ [ASCIZ /L/] ; %TDEOL--203
RTDNOP
SETZ [ASCIZ /K/] ; %TDDLF--204
RTDNOP
RTDNOP ; %TDMTF--205
RTDNOP
RTDNOP ; %TDMTN--206
RTDNWL
SETZ [ASCIZ /
/] ; %TDCRL--207
RTDNOP
RTDNOP ; %TDNOP--210
RTDNOP
RTDNOP ; %TDBS--211
RTDNOP
RTDNOP ; %TDLF--212
RTDNOP
RTDNOP ; %TDRCR--213
RTDNOP
RTDNOP ; %TDORS--214
RTDNOP
RTDNOP ; %TDQOT--215
SETZ [ASCIZ / /]
SETZ [ASCIZ /F/] ; %TDFS--216
RTDMVD
RTDMVO ; %TDMVO--217
RTDNWL
SETZ [ASCIZ /C/] ; %TDCLR--220
SETZ [ASCIZ //]
SETZ [ASCIZ //] ; %TDBEL--221
RTDNOP
RTDNOP ; %TDINT--222
RTDILP
RTDILP ; %TDILP--223
RTDDLP
RTDDLP ; %TDDLP--224
RTDICP
RTDICP ; %TDICP--225
RTDDCP
RTDDCP ; %TDDCP--226
RTDNOP
RTDNOP ; %TDBOW--227
RTDNOP
RTDNOP ; %TDRST--230
SUBTTL JCL PARSER
JCLHAK: .SUSET [.ROPTIO,,A]
TLNE A,OPTCMD
.BREAK 12,[..RJCL,,JCLBUF]
IBLOCK C,OUTBLK ; GET AN INITIAL BLOCK
MOVEM C,INPSRC
PUSHJ P,JCLFST ; GET STRING foo0U:GAG 0<CR>
MOVEM A,OUTLEN(C)
MOVEM B,OUTPTR(C)
MOVE A,[440700,,JCLBUF]
PUSH P,A
JCLLP1: MOVEI B,0
JCLLOP: MOVEM A,(P)
ILDB O,A
CAIE O,40
CAIN O,^I
JRST JCLLOP
CAIA
JCLLNX: ILDB O,A
CAIE O,"/
CAIN O,"[
JRST JCLFLD ; END A FILE NAME
CAIE O,",
CAIN O,"\
JRST JCLFLD
CAIE O,^C
CAIN O,^M
JRST JCLFLD
JUMPE O,JCLFLD
CAIN O,"_
JRST JCOUTF ; OUTPUT FILE
AOJA B,JCLLNX
JCLFLD: JUMPE B,JCLFL1
IBLOCK D,OUTBLK
MOVEM D,OUTNXT(C) ; CHAIN BLOCKS
MOVEM B,OUTLEN(D)
POP P,OUTPTR(D)
MOVEI B,$TFILE
MOVEM B,OUTTYP(D)
MOVE C,D
MOVEI B,0
PUSH P,A
JCLFL1: CAIE O,^C
CAIN O,^M
JRST JCLDON
JUMPE O,JCLDON
CAIN O,",
JRST JCLLOP
CAIN O,"\
JRST JCLTTY
CAIN O,"[
JRST JCLTXT
CAIN O,"/
JRST JCLSW
.VALUE
JCLTTY: IBLOCK D,OUTBLK
MOVEI B,$TTEXT
MOVEM B,OUTTYP(D)
MOVE B,[440700,,[ASCII /B/]]
MOVEM B,OUTPTR(D)
MOVEI B,2
MOVEM B,OUTLEN(D)
MOVEM D,OUTNXT(C)
MOVE C,D
MOVEI B,0
JRST JCLLOP
JCLSW: ILDB O,A
CAIE O,"P
CAIN O,"p
SETOM PRSW ; SUPPRESS FANCY HACKING W/ STY
CAIE O,"E
CAIN O,"e
SETOM CNSFLS ; DIE IF ERROR WITH NO TTY
CAIE O,"S
CAIN O,"s
JRST [MOVEI O,360. ; TRY 360. TIMES TO OPEN (EVERY 10 SEC)
MOVEM O,STYTRY
JRST JCLLOP]
JRST JCLLOP
JCLTXT: PUSH P,C
MOVEM A,-1(P)
MOVNI B,1
PUSHJ P,STRGET ; NEW BPTR IN A, LEN IN B, PTR IN C
IBLOCK D,OUTBLK ; POINTER FOR CROCK
MOVEM C,OUTPTR(D)
MOVEM B,OUTLEN(D)
MOVEI B,$TTEXT
MOVEM B,OUTTYP(D)
POP P,C
MOVEM D,OUTNXT(C)
MOVE C,D
JRST JCLLP1
JCLDON: MOVEI A,LSTBLK
MOVEM A,OUTNXT(C) ; LSTBLK HAS STUFF TO LOG OUT
POP P,A
POPJ P,
; CONS UP STRING TO LOG IN, SAY :GAG 0. RETURN LENGTH IN A, PTR IN B.
JCLFST: PUSH P,C
PUSH P,D
PUSH P,E
PUSH P,F
IBLOCK B,4 ; MAXIMUM LENGTH IS 17. CHARS
HRLI B,440700
PUSH P,B
MOVEI A,1
MOVEI C,^Z
IDPB C,B ; STUFF OUT CTRL-Z
MOVE C,XUNAME
MOVE D,[440600,,C]
JCLUNM: TLNN D,770000
JRST JCLFS1
ILDB E,D
JUMPE E,JCLFS1
ADDI E,40
IDPB E,B
AOJA A,JCLUNM
JCLFS1: MOVE C,[440700,,[ASCIZ /0U:GAG 0
/]]
JCLFLP: ILDB D,C
JUMPE D,JCLFS2
IDPB D,B
AOJA A,JCLFLP
JCLFS2: POP P,B
POP P,F
POP P,E
POP P,D
POP P,C
POPJ P,
; OUTPUT FILE SPECIFICATION. LENGTH OF FILE SPEC IS IN B, POINTER
; TO FIRST CHAR IS (P). A MUST BE RESTORED, B ZEROED BEFORE RETURN.
JCOUTF: EXCH A,(P)
JUMPE B,JCOUTO
MOVE O,[SIXBIT /DSK/]
MOVEM O,DEV+OUTFDF
PUSHJ P,FILPRS ; PARSE A FILE NAME
OUTFDF,,OUTFIL ; INTO BLOCK STARTING HERE
PUSHJ P,OUTHCK ; SET PARAMETERS
MOVEI B,0
JCOUTO: MOVE A,(P)
JRST JCLLOP
; TAKE A STRING WITH '^foo' FOR CONTROL CHARACTERS, COPY IT SOMEPLACE
; AND SUBSTITUTE REAL CHARS. TAKES POINTER TO STRING IN A, -1 IN B
; IF ']' IS TERMINATOR FOR STRING. IF B >0, IT'S CHAR COUNT OF STRING.
; RETURNS UPDATED POINTER IN A, LENGTH IN B, STRING POINTER IN C.
STRGET: PUSH P,O
PUSH P,D
PUSH P,E
PUSH P,F
PUSH P,A ; SAVE ARGS
PUSH P,B
MOVEI B,0 ; ACCUMULATE CHAR COUNT
MOVE C,(P)
STRLP1: ILDB O,A
CAIN O,"]
JUMPL C,STRLE1
CAIN O,"^
JRST [IBP A
SOJA C,STRLD] ; EAT NEXT CHAR
CAIN O,^Q
JRST [SUBI C,1
ILDB O,A
JRST .+1]
STRLD: ADDI B,1
JUMPL C,STRLP1 ; IF C<0, ONLY ] TERMINATES
SOJG C,STRLP1
; # CHARS IS IN B, STRING PTR IS -1(P), TERM CONDITION IS (P)
STRLE1: PUSH P,B
ADDI B,1 ; MAKE SURE HAVE A CHAR AT END SO ASCIZ
IDIVI B,5
JUMPE C,.+2
ADDI B,1
IBLOCK B,(B) ; STORAGE FOR STRING
HRLI B,440700
PUSH P,B
MOVE C,-2(P) ; GET TERMINATING CONDITION BACK
MOVE A,-3(P) ; GET STRING BACK
STRLP2: ILDB O,A
CAIN O,"]
JUMPL C,STRLE2
CAIN O,"^
JRST STRCTL
CAIN O,^Q
JRST [SUBI C,1
ILDB O,A
JRST .+1]
STRDEP: IDPB O,B
JUMPL C,STRLP2
SOJG C,STRLP2
STRLE2: POP P,C ; NEW STRING
POP P,B ; LENGTH
SUB P,[2,,2]
POP P,F
POP P,E
POP P,D
POP P,O
POPJ P,
; HACKERY FOR CTRL CHARS
STRCTL: SUBI C,1
ILDB O,A
CAIN O,"?
JRST [MOVEI O,177
JRST STRDEP]
CAIL O,100
SUBI O,100
CAIL O,40
SUBI O,40
JRST STRDEP
SUBTTL COMMAND PARSER
; CALL COMND WITH A CHARACTER IN A (INDICATING WHICH COMMAND WE HAVE)
; AND TWO ARGUMENTS FOLLOWING THE CALL: THE FIRST IS AN INSTRUCTION
; USED TO GET A LINE OF TEXT (FOR COMMANDS WHICH TAKE THAT), RETURNING
; THE LENGTH IN A AND AN ILDB POINTER TO THE FIRST CHAR IN B; THE SECOND IS
; USED TO DO PRINTING, BY HAVING THE ADDRESS OF THE FIRST WORD OF AN
; ASCIZ STRING STUFFED INTO A--THUS OASC WILL NOT WORK.
; WHEN CALLED FROM SNDSTR, THE TWO ARGS ARE PUSHJ P,SNGLIN AND PUSHJ P,SNGPRT;
; WHEN CALLED FROM THE TTY INTERRUPT HANDLER, THEY ARE PUSHJ P,GETLIN
; AND PUSHJ P,TTYPRT.
; ROUTINES SKIP IF COMND SHOULD SKIP. FAILURE TO SKIP INDICATES THAT
; THE ROUTINE CALLING COMND SHOULD PROBABLY FLUSH IMMEDIATE (AS, FOR
; EXAMPLE, WHEN SNDSTR CALLS IT WITH THE 'B' COMMAND).
COMND: PUSH P,B
PUSH P,C
PUSH P,D
MOVE B,@-3(P) ; PICK UP FIRST ARG
MOVEM B,COMGLN
AOS -3(P)
MOVE B,@-3(P)
MOVEM B,COMPRT
AOS -3(P)
CAIN A,177 ; NULL COMMAND
JRST COMEXO ; EXIT VIA SKIP
CAME A,CTRLT ; QUOTED CTRL-T?
CAMN A,ESCAPE ; QUOTED ESCAPE?
JRST [.IOT STYO,A
JRST COMEXO]
CAIN A,"?
JRST COMINF ; PRINT INFO ON COMMANDS
CAIL A,"A
CAIL A,"z
JRST COMERR ; ILLEGAL COMMAND
CAIL A,"a
SUBI A,40
CAILE A,"Z
JRST COMERR ; ILLEGAL COMMAND
SUBI A,"A
ASH A,1
PUSHJ P,PRCOM ; PRINT COMMAND DESC
PUSHJ P,@COMTBL(A) ; EXECUTE COMMAND
CAIA ; COMMAND ROUTINES SKIP IF COMND SHOULD
COMEXO: AOS -3(P) ; STUFF THE CHARACTER OUT, WHATEVER IT WAS
COMEXD: POP P,D
POP P,C
POP P,B
POPJ P,
; PRINT COMMAND DESCRIPTION
PRCOM: PUSH P,A
MOVE A,COMTBL+1(A)
XCT COMPRT ; DO THE PRINT
POP P,A
POPJ P,
; PRINT BRIEF DESCRIPTION OF COMMANDS TO CONVENIENT PLACE
COMINF: SKIPE TTYSRC
JRST COMIN0
.CALL [SETZ
SIXBIT /OPEN/
[.UAO,,TTYO]
[SIXBIT /TTY/]
[SIXBIT /TTY/]
SETZ [SIXBIT /TTY/]]
.LOSE %LSFIL
COMIN0: OCTLP TTYO,"T
OCTLP TTYO,"L
OASCR TTYO,COMDSC ; PRINT DESCRIPTION
SKIPE TTYSRC
JRST COMEXO
.CLOSE TTYO,
JRST COMEXO
COMDSC: ASCIZ \Commands:
The intercept character is initially ctrl-^. Some commands may
request a line of text; in a file, this must be terminated by
crlf. From the tty, ctrl-Z and ctrl-_ may be given normally to
the 'Command:' prompt, since super-image input is turned off.
<escape char> Send escape character out on sty.
A Abort input source--flush current file/string
B Begin tty input. The state of the current file is saved.
C Change output file. Takes line containing new output file.
D DDT. Return to ddt.
E Error strings. Which output strings cause an error. May be
several, separated by commas.
F Force input. Text through the next 'F' command will be fed to
receiving job whether it wants it or not. Useful for PUB &c.
H Halt job. Sends control-Z out, begins tty input.
I Intercept character. Takes line containing new intercept.
J Undoes effect of 'R' command.
P Proced XXFILE.
Q Quit XXFILE.
R Remain in job. All input must go to the job which currently has
the tty, until a 'J' command has been given. Ignored if input
from tty.
S Stop tty input. Returns to whatever the source was before.
T Ctrl-T character. Takes line containing replacement for ^T.
V Valret string. Takes line and valrets it. Control characters,
including crlf, may be included by typing as <uparrow>-char:
crlf--^M.
Line editor: <rubout> erases a char; ctrl-W a word; ctrl-U, ctrl-X,
and ctrl-@ erase the entire line. Carriage return terminates.
Attempts to rubout past the beginning of the line abort the
command.\
; DISPATCH TABLE FOR COMMANDS
COMTBL: CABORT ; A--ABORT CURRENT INPUT SOURCE
[ASCIZ /Abort input source/]
CTTYB ; B--BEGIN TTY INPUT
[ASCIZ /Begin tty input/]
CCHANG ; C--CHANGE OUTPUT FILE (TAKES A LINE)
[ASCIZ /Change output file/]
CDDT ; D--RETURN TO SUPERIOR
[ASCIZ /DDT/]
CERROR ; E--SET ERROR STRINGS (TAKES A LINE)
[ASCIZ /Error strings/]
CFORCE ; F--FORCE INPUT
[ASCIZ /Force input/]
COMER1 ; G
[ASCIZ /Illegal command/]
CHALT ; H--HALT JOB
[ASCIZ /Halt job/]
CINTER ; I--SET INTERCEPT CHARACTER (TAKES A LINE)
[ASCIZ /Set intercept character/]
CNREMA ; J
[ASCIZ /Job may change/]
COMER1 ; K
[ASCIZ /Illegal command/]
COMER1 ; L
[ASCIZ /Illegal command/]
COMER1 ; M
[ASCIZ /Illegal command/]
COMER1 ; N
[ASCIZ /Illegal command/]
COMER1 ; O
[ASCIZ /Illegal command/]
CPROCE ; P--PROCED SELF
[ASCIZ /Proceed/]
CQUIT ; Q--QUIT
[ASCIZ /Quit/]
CREMAN ; R--DON'T CHANGE JOBS UNTIL J COMMAND
[ASCIZ /Remain in this job/]
CTTYE ; S--STOP TTY INPUT
[ASCIZ /Stop TTY input/]
CCTRLT ; T
[ASCIZ /'Ctrl-T' character/]
COMER1 ; U
[ASCIZ /Illegal command/]
CVALUE ; V
[ASCIZ /Valret string/]
COMER1 ; W
[ASCIZ /Illegal command/]
COMER1 ; X
[ASCIZ /Illegal command/]
COMER1 ; Y
[ASCIZ /Illegal command/]
COMER1 ; Z
[ASCIZ /Illegal command/]
; COMMANDS. ROUTINES MAY USE A, B, C, AND D WITHOUT PUSHING THEM.
; IF THE ROUTINE SKIPS, IT SHOULD PUT A CHARACTER IN A TO BE THE NEXT
; ONE SENT TO THE JOB. ROUTINES SHOULD USUALLY SKIP RETURN.
; ILLEGAL COMMAND
COMER1: JRST POPJ1
COMERR: OASC ECHO,[ASCIZ /Illegal command/]
JRST COMEXO
; ABORT CURRENT INPUT SOURCE--'A' COMMAND
CABORT: SKIPN A,INPSRC ; IS THERE ONE?
JRST POPJ1
SKIPN B,OUTNXT(A) ; CAN'T ABORT THE LAST ONE
JRST POPJ1
MOVEM B,INPSRC
JRST POPJ1
; START TTY INPUT--'B' COMMAND
CTTYB: SKIPE TTYSRC ; ALREADY STARTED?
JRST POPJ1 ; YES, SO FLUSH
PUSHJ P,SETTTY ; SET IT UP
OASC TTYO,[ASCIZ /Begin TTY input: /]
POPJ P, ; DON'T SKIP
; CHANGE OUTPUT FILE--'C' COMMAND
CCHANG: PUSHJ P,CPRMPT ; PRINT A PROMPT
XCT COMGLN ; GET A LINE INTO A AND B
JRST POPJ1
JUMPE A,CCHFLS ; 0-LENGTH INPUT-->FLUSH OUTPUT CHANNEL
EXCH A,B ; SHUFFLE THE AC'S
PUSHJ P,FILPRS
OUTFDF,,OUTFIL ; PARSE THE NAME INTO OUTFIL
PUSHJ P,OUTHCK ; SET EVERYTHING UP PROPERLY
JRST POPJ1
CCHFLS: .CLOSE OUTCHN,
PUSHJ P,OUTHC1 ; HACK ALL THE SWITCHES
JRST POPJ1
; PRINT A PROMPT.
CPRMPT: MOVEI A,[ASCIZ /: /]
XCT COMPRT
POPJ P,
; DDT--'D' COMMAND
CDDT: .SUSET [.SIPIRQC,,[%PIC.Z]]
JRST POPJ1
; SET ERROR STRINGS--'E' COMMAND
CERROR: PUSHJ P,CPRMPT ; PRINT A PROMPT
XCT COMGLN ; GET NEW ONES
JRST POPJ1 ; IF DOESN'T SKIP, IGNORE IT
SETZM ERRORS
JUMPE A,POPJ1
PUSH P,E ; GET AN EXTRA AC
PUSH P,B ; SAVE BPTR
CERLST: MOVEI C,0
CERLOP: ILDB D,B
CAIN D,",
SOJA A,CERMAK ; UPDATE COUNT AND MAKE THE NEW BLOCK
CAIN D,^Q ; QUOTE CHARACTER?
JRST [ILDB D,B ; GOBBLE THE NEXT CHAR
SOJG A,CERLOP ; AND DON'T UPDATE THE COUNT
JRST CERMAK]
ADDI C,1 ; LENGTH OF STRING
SOJG A,CERLOP
; MAKE A NEW ERROR BLOCK. LENGTH OF STRING IS IN C, POINTER TO FIRST
; CHAR IS (P).
CERMAK: JUMPE C,CERMAE ; NO NULL STRINGS ALLOWED
IBLOCK E,ERRBLK ; GET AN ERROR BLOCK
MOVE D,ERRORS
MOVEM D,ENEXT(E)
MOVEM E,ERRORS ; SPLICE IT INTO CHAIN
MOVEM C,EMATLN(E)
MOVEM C,ELENGTH(E) ; SET UP LENGTHS
IDIVI C,5
SKIPE D
ADDI C,1 ; # WORDS NEEDED FOR STRING
IBLOCK C,(C) ; GET STORAGE FOR IT
HRLI C,440700
MOVEM C,EMATCH(E)
MOVEM C,ESTRING(E) ; STUFF OUT BPTRS
EXCH B,(P) ; GET POINTER TO FIRST CHAR
MOVE E,ELENGTH(E) ; GET LENGTH
CERCLP: ILDB D,B
CAIN D,^Q
ILDB D,B
IDPB D,C ; STUFF THE CHARACTER OUT
SOJG E,CERCLP
MOVE B,(P)
CERMAE: JUMPN A,CERLST ; IF CHARS LEFT, GO GET THE NEXT ONE
POP P,B
POP P,E
JRST POPJ1
; TOGGLE STATE OF OUTPUT FORCING--'F' COMMAND
CFORCE: SETCMM FORCSW
JRST POPJ1
; HALT JOB--'H' COMMAND
CHALT: .IOT STYO,[^Z]
PUSHJ P,CTTYB
POPJ P,
JRST POPJ1
; SET INTERCEPT CHARACTER--'I' COMMAND
CINTER: PUSHJ P,CPRMPT
XCT COMGLN ; GET A LINE OF INPUT
JFCL
JUMPE A,POPJ1 ; NULL INPUT
ILDB A,B
MOVEM A,ESCAPE ; NEW INTERCEPT
JRST POPJ1
; UNDO EFFECTS OF 'R' COMMAND--'J' COMMAND
CNREMA: SETZM JOBFRC ; JUST CLEAR THE FLAG
JRST POPJ1
; PROCED XXFILE--'P' COMMAND
CPROCE: .VALUE [ASCIZ /:PROCED
J/]
JRST POPJ1
; QUIT--'Q' COMMAND
CQUIT: .SUSET [.ROPTIO,,A]
TLNE A,OPTDDT
.VALUE [ASCIZ \..SAFE/0
P\]
.CLOSE OUTCHN,
.CLOSE STYI,
.CLOSE STYO,
.LOGOUT 1,
; FORCE INPUT TO GO TO THE CURRENT JOB UNTIL 'J' COMMAND--'R' COMMAND
CREMAN: .CALL [SETZ
SIXBIT /STYGET/
MOVEI STYO
MOVEM A
SETZM A]
.LOSE %LSSYS
JUMPL A,CPOPJ ; NOBODY HAS THE STY
MOVEM A,JOBFRC ; OTHERWISE, A HAS THE INDEX
JRST POPJ1
; STOP TTY INPUT--'S' COMMAND
CTTYE: SKIPN TTYSRC
JRST POPJ1 ; NOT IN TTY INPUT
PUSHJ P,RSTTTY ; FROB ALL THE SWITCHES AND CHANNELS AND SUCH
.CALL [SETZ
SIXBIT /STYGET/
MOVEI STYO
MOVEM A
MOVEM A ; JOB OWNING TTY
MOVEM B
SETZM B] ; WAITING FOR CHARS? (BIT 1.1)
.LOSE %LSSYS ; READ STATUS OF TTY
JUMPL A,CTTYST
TLNN B,400000 ; SEE IF TTY WANTS CHARS
POPJ P, ; NOPE
CTTYST: .SUSET [.SIIFPIR,,[<1_STYO>]] ; CAUSE THE INTERRUPT
POPJ P,
; SET CTRL-T CHARACTER--'T' COMMAND
CCTRLT: PUSHJ P,CPRMPT
XCT COMGLN
JFCL
JUMPE A,POPJ1
ILDB A,B
MOVEM A,CTRLT
JRST POPJ1
; VALRET STRING--'V' COMMAND
CVALUE: PUSHJ P,CPRMPT ; PRINT PROMPT
XCT COMGLN ; GET A LINE
JRST POPJ1
JUMPE A,POPJ1
EXCH A,B
PUSHJ P,STRGET ; GET STRING INTO B AND C
HRRZS C
.VALUE (C)
JRST POPJ1
SUBTTL TTY INTERACTIONS
; COME HERE TO SET THINGS UP FOR TTY INTERACTIONS--APPROPRIATE TTYSETS,
; MOVING OF CURSOR, SETTING UP OF ECHO AREA (IF IT DOESN'T ALREADY EXIST),
; AND SO ON. UNFORTUNATELY, ALL CHARACTERS INTERRUPT IN THIS MODE.
; REQUIREMENTS: THIS WILL OFTEN FALL IN THE MIDDLE OF A FILE, SO IT
; MIGHT BE NICE IF EVERYTHING WERE CONSISTENT. WHEN THE 'B' COMMAND IS
; GIVEN FROM A FILE, IT WILL BE; WHEN GIVEN FROM THE TTY, WE WIN ONLY
; BECAUSE TTYI INTERRUPTS ARE DEFERRED BY STYO INTERRUPTS.
SETTTY: PUSH P,A
PUSH P,B
PUSH P,C
.SUSET [.SAMSK2,,[<1_STYO>]] ; DISABLE STYO INTERRUPTS
.SUSET [.SIDF2,,[<1_TTYI>]] ; DEFER TTY INTERRUPTS (IF NOT ALREADY)
.SUSET [.SAIFPI,,[<1_STYO>]] ; AND FLUSH ANY PENDING STY INTERRUPTS
MOVE A,TTTST1
MOVEM A,CTTST1
MOVE A,TTTST2
MOVEM A,CTTST2
MOVE A,CTTSTS
TLO A,%TSSII
MOVEM A,CTTSTS
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI TTYI
TTTST1
TTTST2
SETZ A] ; ENABLE INTERRUPTS, SUPER-IMAGE INPUT
.LOSE %LSSYS
SKIPN ECHOQ ; DOES ECHO AREA EXIST?
JRST [MOVEI A,2
.CALL [SETZ
SIXBIT /SCML/
MOVEI TTYI
SETZ A]
.LOSE %LSSYS
MOVEM A,ECHOQ
JRST .+1] ; TURN IT ON
.CALL [SETZ
SIXBIT /OPEN/
[.UAO,,TTYO]
[SIXBIT /TTY/]
[SIXBIT /TTY/]
SETZ [SIXBIT /TTY/]]
.LOSE %LSFIL ; OPEN TTY FOR NORMAL OUTPUT
SETOM TTYSRC ; SET FLAG SO RECBUO WILL USE THIS
SETZM NULOUT ; THERE IS SOME OUTPUT CHANNEL
.CALL [SETZ
SIXBIT /TTYGET/
MOVEI STYO
MOVEM A
MOVEM B
SETZM C]
.LOSE %LSSYS
TLO C,%TSMOR
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI STYO
A
B
SETZ C]
.LOSE %LSSYS
.CALL [SETZ
SIXBIT /TTYVAR/
MOVEI STYO
[SIXBIT /TTYOPT/]
MOVEI 0
SETZ [TLO %TOMOR]]
.LOSE %LSSYS ; TURN ON MORE HACKING IN OTHER JOB
.CALL [SETZ
SIXBIT /RCPOS/
MOVEI STYO
SETZM A]
.LOSE %LSSYS
HLRZ B,A
HRRZS A
OVPOS TTYO,(B)
OHPOS TTYO,(A) ; MOVE CURSOR TO CORRESPOND WITH IMAGE
OCTLP TTYO,"L ; FLUSH TO END OF LINE
SKIPN DSKOUT ; IS THERE ANOTHER OUTPUT CHANNEL OPEN?
JRST SETTTO
SKIPN DSKCHN ; IS IT DISK-STYLE?
SETZM DSKOUT ; NO, SO FLUSH IT--DON'T WANT TWO TTYO CHANNELS
SETTTO: SETZM DSKCHN ; DO OUTPUT FOR TTY, NOT FOR DSK
POP P,C
POP P,B
POP P,A
POPJ P,
; INVERT SETTTY.
RSTTTY: PUSH P,A
PUSH P,B
PUSH P,C
MOVE A,NTTST1
MOVEM A,CTTST1
MOVE A,NTTST2
MOVEM A,CTTST2
MOVE A,CTTSTS
TLZ A,%TSSII
MOVEM A,CTTSTS ; TURN OFF SUPER-IMAGE INPUT
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI TTYI
NTTST1
NTTST2
SETZ A]
.LOSE %LSSYS
SETZM TTYSRC
PUSHJ P,OUTHC1 ; SET OUTPUT FLAGS CORRECTLY
.CLOSE TTYO,
.CALL [SETZ
SIXBIT /TTYGET/
MOVEI STYO
MOVEM A
MOVEM B
SETZM C]
.LOSE %LSSYS
TLZ C,%TSMOR
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI STYO
A
B
SETZ C]
.LOSE %LSSYS
.CALL [SETZ
SIXBIT /TTYVAR/
MOVEI STYO
[SIXBIT /TTYOPT/]
MOVEI O
SETZ [TLZ %TOMOR]]
.LOSE %LSSYS
.SUSET [.SIMSK2,,[<1_STYO>]] ; RE-ENABLE STYO INTERRUPTS
POP P,C
POP P,B
POP P,A
POPJ P,
; TTY INTERRUPT HANDLER
TTYINT: MOVEI O,TTYI ; O, A, B ALREADY PUSHED
.ITYIC O, ; GET THE CHAR IN O
.CALL DISMIS
CAME O,ESCAPE ; ESCAPE CHARACTER?
JRST TTYOTC ; NO, SEE IF WANT TO SHIP TO STY OR DO CTRL-T
.CALL [SETZ
SIXBIT /TTYFLS/
MOVEI TTYI
ANDI 1]
.LOSE %LSSYS ; FLUSH STUFF TYPED AHEAD
PUSH P,C
SKIPN TTYSRC ; INPUT FROM TTY?
JRST TTYCOM
MOVE C,CTTSTS
TLZN C,%TSSII ; TURN OFF SUPER-IMAGE INPUT
JRST TTYCOM ; NOT ON, SO NO NEED
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI TTYI
CTTST1
CTTST2
SETZ C]
.LOSE %LSSYS
MOVNI A,2
MOVEM A,SIIFLG ; SET FLAG FOR REALTIME INTERRUPT
TTYCOM: PUSHJ P,ECINIT ; CLEAR/CR IN "ECHO AREA"
OASC ECHO,[ASCIZ /Command: /]
TTYGCM: .CALL TTYIOT ; READ THE COMMAND CHAR
.LOSE %LSSYS
SETZM SIIFLG ; CLEAR THE FLAG
MOVE A,O
PUSHJ P,COMND
PUSHJ P,GETLIN
PUSHJ P,TTYPRT
JFCL ; DOESN'T MATTER
TTYCFL: SKIPN TTYSRC
JRST TTYEND
MOVE A,CTTSTS
TLO A,%TSSII
MOVEM A,CTTSTS
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI TTYI
CTTST1
CTTST2
SETZ A]
.LOSE %LSSYS ; TURN SII BACK ON
TTYEND: POP P,C
.CALL DISMIS ; AND FLUSH
; COME HERE TO SEE IF CHAR WANTS TO GO OUT TO STY
TTYOTC: .CALL [SETZ
SIXBIT /TTYFLS/
MOVEI TTYI
ANDI 1]
.LOSE %LSSYS
CAMN O,CTRLT ; CONTROL T?
JRST TTYCTT
SKIPN TTYSRC ; INPUT IS TTY?
.CALL DISMIS ; NO
.IOT STYO,O ; YES, SO SHIP IT.
.CALL DISMIS
; NORMAL IOT FOR READ CHARS FROM TTY (INTO O, AS IT TURNS OUT)
TTYIOT: SETZ
SIXBIT /IOT/
MOVEI TTYI
MOVSI %TIECH+%TIINT+%TIACT
SETZ O ; READ NO MATTER WHAT
; ROUTINE TO CLEAR ECHO AREA IF IT EXISTS, OTHERWISE PRINT CR
ECINIT: SKIPE ECHOQ
JRST [OCTLP ECHO,"C ; CLEAR THE ECHO AREA IF IT EXISTS
POPJ P,]
OASCR ECHO,[0]
POPJ P,
SUBTTL JOB STATUS
; HERE TO DISPLAY STATUS OF JOB AT OTHER END OF STY. WHEN DONE,
; JUST DO .CALL DISMIS
TTYCTT: PUSHJ P,ECINIT ; WILL GO IN ECHO AREA
.SUSET [.SADF2,,[<1_STYO>]] ; ALLOW STYO INTERRUPTS HERE
PUSH P,C
PUSH P,D
PUSH P,E
PUSH P,F
PUSH P,U
MOVEI E,0
MOVE F,[440700,,STTBUF] ; INITIALIZE AC'S FOR UUOS
OASCB E,"T
OOCTA E,T ; PRINT 'Tnn'
HRRZ U,@TTYSTS ; PICK UP THE USER INDEX (TTYSTS IS (T))
CAIN U,777777 ; LOGGED OUT?
JRST [OASCA E,[ASCIZ / Logged out./]
JRST TTOTST] ; YES, FLUSH IMMEDIATE (ALMOST)
OASCB E,40
MOVE A,U
IDIV A,LUBLK
OOCTA E,A ; USER INDEX
OASCB E,40
OSIXA E,@JNAME
OASCB E,40
OSIXA E,@USYSNM ; JNAME AND SNAME
OASCB E,40
SKIPN STIFLG ; ARE WE GETTING INPUT?
JRST TTSTOF
OASCA E,[ASCIZ /<=/]
TTSTOF: SKIPN STOFLG ; ARE WE SENDING STUFF?
JRST TTSTST
SKIPN STIFLG
OASCB E,"=
OASCB E,">
; PRINT STATUS OF JOB
TTSTST: PUSHJ P,JSTATU ; GROSS ROUTINE RIPPED OFF FROM WHOIML
OASCB E,40
MOVE A,@JTMU
ADDI A,9830.
IDIVI A,19661. ; MAGICALLY PRODUCES %
ODECA E,A
OASCA E,[ASCIZ /% /]
MOVE A,@UTRNTM ; TIME USED
MOVEI C,0
IDIVI A,25000. ; IN 10TH'S
IDIVI A,36000. ; HOURS
JUMPE A,UTRNT1 ; DON'T PRINT IF 0
ODECA E,A
OASCB E,":
MOVNI C,1 ; SET FLAG
UTRNT1: MOVE A,B
IDIVI A,600. ; MINUTES
JUMPN C,[CAIGE A,10.
OASCB E,"0
ODECA E,A
JRST UTRNT2]
JUMPE A,UTRNT3
MOVNI C,1
ODECA E,A
UTRNT2: OASCB E,":
UTRNT3: MOVE A,B
IDIVI A,10. ; SECONDS
JUMPN C,[CAIGE A,10.
OASCB E,"0
JRST .+1]
ODECA E,A
OASCB E,".
ODECA E,B
OASCB E,40
TTOTST: .SUSET [.SIDF2,,[<1_STYO>]]
SKIPN A,INPSRC
JRST [MOVEI B,100. ; READ EVERYTHING
JRST PERCRD]
MOVE B,OUTRED(A)
IMULI B,100.
IDIV B,OUTTLN(A) ; % OF CURRENT SOURCE READ
PERCRD: ODECA E,B
OASCA E,[ASCIZ /%RD /]
MOVE F,[440700,,STTBUF]
.CALL [SETZ
SIXBIT /SIOT/
MOVEI ECHO
F
SETZ E]
.LOSE %LSSYS
SKIPN B,LSTLEN
JRST TTSTOT
MOVE A,LSTPTR ; POINTER TO SAVED STUFF
LDB C,[360600,,A]
IDIVI C,7 ; # OF CHARS IN FIRST WORD
ADDI C,<LSTOLN-1>*5 ; MAX # OF CHARS WE HAVE
CAIL B,(C)
MOVEI B,(C) ; IF LESS THAN # SAVED, USE IT
ILDB C,A
CAIE C,^J
JRST [DBP A
JRST LSLNF] ; FLUSH LEADING CTRL-J
SUBI B,1
LSLNF: MOVEM B,LSTTMP
MOVE C,[440700,,LSTBUF]
LSLOOP: ILDB O,A ; PICK UP CHAR
CAILE O,^Z
JRST LSLOPE
ADDI O,100
MOVEI D,"^
IDPB D,C
AOS LSTTMP
LSLOPE: IDPB O,C
SOJG B,LSLOOP
MOVE A,[440700,,LSTBUF]
.CALL [SETZ
SIXBIT /SIOT/
MOVEI ECHO
A
SETZ LSTTMP]
.LOSE %LSSYS
TTSTOT: POP P,U
POP P,F
POP P,E
POP P,D
POP P,C
.CALL DISMIS ; ALL DONE
; HACK TO PRINT STATUS OF JOB WHOSE INDEX IS IN U, STOLEN FROM WHOIML
JSTATU: MOVEI A,0
SKIPN @PICLR
MOVEI A,"* ; HACKING INTERRUPT
SKIPN @IDF1
SKIPE @IDF2
MOVEI A,"* ; HACKING INTERRUPT
SKIPGE B,@USWST
MOVEI A,"_ ; DESIRED OUT
SKIPGE @USWSCD
MOVEI A,"> ; SWAP-BLOCKED
SKIPE A
OASCB E,(A)
SKIPE A,@USTP ; RUNNING?
JRST JRUN1
SKIPE @FLSINS ; BLOCKED?
JRST JHAIR
MOVE B,@UPC
TLNN B,%PCUSR ; USER MODE?
JRST JEHAIR ; EXEC MODE
MOVE A,@JTMU
ADDI A,9830.
IDIVI A,19661.
MOVEI B,6
CAIGE A,2
JRST [MOVE B,A
JRST JRUNST]
CAIG A,10.
JRST [MOVEI B,2
JRST JRUNST]
CAIG A,49.
JRST [MOVEI B,3
JRST JRUNST]
CAIG A,79.
JRST [MOVEI B,4
JRST JRUNST]
CAIG A,89.
MOVEI B,5
JRUNST: OASCA E,@RUNTBL(B)
JSTAT2: SKIPN A,@RPCL ; RPCLSR'ING?
POPJ P,
SKIPL A
OASCB E,">
SKIPG A
OASCB E,"<
ANDI A,-1
IDIV A,LUBLK
OOCTA E,A
POPJ P,
; NOT RUNNING. USTP IS IN A
JRUN1: LSHC A,-30.
OOCTA E,A ; LEFT TWO DIGITS OF USTP
OASCB E,"!
LSH B,-6
OOCTA E,B
JRST JSTAT2 ; GO CHECK FOR PCLSR-ING
; NON-ZERO FLSINS. USWST IS IN B
JHAIR: TLNN B,200000
JRST HAIR
MOVE A,[SIXBIT /IPAGE/]
TLNN B,10000
MOVE A,[SIXBIT /PAGE/]
OSIXA E,A
JRST JSTAT2
; IN EXEC MODE, FOLLOWED BY HAIR FOR SYS CALLS.
JEHAIR: OASCB E,"+
HAIR: SKIPGE A,@SV40
JRST IOTUUO
LSH A,-27.
CAIG A,47 ; SKIP IF TOO BIG FOR SYS UUO
CAIGE A,40 ; SKIP IF SYS UUO
SKIPA A,[SIXBIT /UUO/] ; USER UUO
XCT UUOTB-40(A) ; DISPATCH/PICK UP MNEMONIC
HAIR1: OSIXA E,A
JRST JSTAT2
IOTUUO: LDB A,[270300,,A]
MOVE A,UIOTAB(A)
JRST HAIR1
UIOTAB: IRPS A,,[BLKI DATAI BLKO DATAO CONO CONI CONSZ CONSO]
SIXBIT /A/
TERMIN
UUOTB: JRST AIOT ; IOT
MOVE A,[SIXBIT /OPEN/]
JRST AOPER ; .OPER
JRST ACALL ; .CALL
MOVE A,[SIXBIT /USET/]
MOVE A,[SIXBIT /BREAK/]
MOVE A,[SIXBIT /STATUS/]
MOVE A,[SIXBIT /ACCESS/]
AIOT: LDB C,[270400,,@SV40] ; .IOT, GET AC
MOVEI D,0
AIOT1: MOVEI A,@IOCHNM
ADD A,U
HRRZ C,(A)
PUSHJ P,AIOTNM
JRST JSTAT2
AIOTNM: MOVEI B,(C)
HLL A,@CLSTB
TLNN A,100040
JRST AIOTN1
HLRZ C,(A)
SKIPA A,@JBDEV
AIOTN1: HLLZ A,@DCHSTB
OSIXA E,A
MOVEI C,(B)
MOVE O,@IOTTB
TLNE O,400000
JRST [OASCB E,"B
JRST AIOTN2]
CAMN D,[SIXBIT /SIOT/]
JRST [OASCB E,"S
JRST AIOTN2]
AIOTN2: MOVEI C,"I
TLNE O,200000
MOVEI C,"O
OASCB E,(C)
POPJ P,
; HACK .CALL
ACALL: LDB C,[270400,,@SV40] ; AC
JUMPE C,ACALLO
OSIX @CALSXB
JRST JSTAT2
ACALLO: MOVE C,@LSCALL
CAME C,[SIXBIT /SIOT/]
CAMN C,[SIXBIT /IOT/]
JRST ACALL1
OSIXA E,@LSCALL
JRST JSTAT2
ACALL1: SKIPE C,@UUAC
MOVE D,@LSCALL
JRST AIOT1
; HACK .OPER
AOPER: HRRZ C,@SV40
MOVE A,CALSXB
SUB A,OPRSXB
CAML C,A
MOVEI C,0
OSIXA E,@OPRSXB
JRST JSTAT2
RUNTBL: [ASCIZ /MULTIX/]
[ASCIZ /TENEX/]
[ASCIZ /WALK/]
[ASCIZ /RUN/]
[ASCIZ /FLY/]
[ASCIZ /ZOOM/]
[ASCIZ /WARP/]
SUBTTL TTY READER
; ROUTINE FOR PRINTING WHEN IN COMMAND READER FROM TTY
; CALLED WITH ADDRESS OF ASCIZ IN A.
TTYPRT: OASC ECHO,(A)
POPJ P,
; ROUTINE TO READ A LINE FROM TTY FOR COMMAND READER
; RETURN LENGTH OF LINE IN A, POINTER TO IT IN B.
; SKIPS USUALLY, FAILING ONLY IF RUBOUT TYPED WHEN BUFFER EMPTY
; (TO ALLOW USER TO ABORT).
GETLIN: PUSH P,C
PUSH P,D
MOVE C,TTYOPT
SETZM TOERS
TLNE C,%TOERS
SETOM TOERS ; SET UP FOR ERASURE IF POSSIBLE
.CALL [SETZ
SIXBIT /RCPOS/
MOVEI ECHO
MOVEM C
SETZM ECCPOS]
.LOSE %LSSYS ; SAVE CURRENT CURSOR POSITION
GETRST: MOVEI A,0
MOVE B,[440700,,TTYBUF]
GETLOP: .CALL TTYIOT ; READ A CHARACTER INTO C
.LOSE %LSSYS
CAIN O,177 ; RUBOUT?
JRST RUBOUT
CAIN O,^W ; WORD FLUSH?
JRST WDFLUS
CAIE O,^X
CAIN O,^U
JRST LNFLUS ; FLUSH WHOLE LINE
JUMPE O,LNFLUS
CAIE O,^L
CAIN O,^D
JRST BREDIS ; REDISPLAY BUFFER
CAIE O,^M
.IOT ECHO,O ; ECHO THE CHARACTER--EXCEPT CTRL-M
CAIN O,^Q ; QUOTE CHARACTER
JRST QUOTER
GETPUT: CAIN O,^M
JRST GETLO1 ; DONE
IDPB O,B ; STUFF INTO BUFFER
AOJA A,GETLOP ; GET THE NEXT ONE
GETLO1: AOS -2(P) ; SKIP--> USE THIS DATA
GETLOT: OASC ECHO,[ASCIZ / [CR]/]
MOVE B,[440700,,TTYBUF]
POP P,D
POP P,C
POPJ P,
; QUOTE A CHAR
QUOTER: .CALL TTYIOT ; READ THE CHAR
.LOSE %LSSYS
SKIPN TOERS
JRST QUOTOT ; NOTHING SPECIAL
OCTLP ECHO,"X
OCTLP ECHO,"X ; FLUSH THE ^Q
QUOTOT: .IOT ECHO,O
JRST GETPUT
; FLUSH THE WHOLE LINE
LNFLUS: SKIPN TOERS ; ON A DISPLAY?
JRST [OASCR [ASCIZ /XXX?/]
JRST GETRST]
PUSHJ P,RSTPOS ; RESTORE CURSOR POSITION
OCTLP ECHO,"E ; CLEAR TO END OF FILE
JRST GETRST
; RESTORE CURSOR POSITION TO ORIGINAL
RSTPOS: SKIPN TOERS
POPJ P,
PUSH P,A
HLRZ A,ECCPOS
OVPOS ECHO,(A)
HRRZ A,ECCPOS
OHPOS ECHO,(A)
POP P,A
POPJ P,
; REDISPLAY BUFFER
BREDIS: PUSHJ P,RSTPOS
OCTLP ECHO,"E
PUSH P,A
PUSH P,B
MOVE B,[440700,,TTYBUF]
.CALL [SETZ
SIXBIT /SIOT/
MOVEI ECHO
B
SETZ A]
.LOSE %LSSYS
POP P,B
POP P,A
POPJ P,
RUBOUT: JUMPE A,GETLOT ; FLUSH IF RUBOUT WHEN BUFFER EMPTY
PUSHJ P,DORUB ; DO THE RUBOUT, GET CHAR KILLED INTO C
JRST GETLOP ; AND RETURN
DORUB: SUBI A,1
LDB C,B ; PICK UP CHAR BEING FLUSHED
DBP B ; UPDATE POINTER
SKIPN TOERS
JRST RUBECH ; IF CAN'T ERASE, ECHO
OCTLP ECHO,"X ; ERASE ONE
CAIN C," ; ALTMODE IS ONLY ONE LONG
POPJ P,
CAIE C,177
CAIGE C,40
OCTLP ECHO,"X ; ERASE ANOTHER, SOMETIMES
POPJ P,
RUBECH: .IOT ECHO,C
POPJ P,
; FLUSH A WORD
WDFLUS: JUMPE A,GETLOT ; FLUSH IMMEDIATE
WDLP1: PUSHJ P,DORUB ; FLUSH A CHAR
PUSHJ P,BREAK ; WAS IT A BREAK?
JUMPN A,WDFLU1 ; NO, AND THERE ARE CHARACTERS LEFT
JUMPN A,WDLP1 ; YES, FLUSH ANOTHER
JRST GETLOP ; ALL DONE
WDFLU1: PUSHJ P,DORUB
PUSHJ P,BREAK
JUMPN A,WDFLU1 ; KEEP FLUSHING UNTIL BREAK ENCOUNTERED
JRST GETLOP
; IS CHAR IN C A BREAK?
BREAK: CAIE C,"?
CAIN C,".
JRST BREAKW
CAIE C,"!
CAIN C,",
JRST BREAKW
CAIE C,40
CAIN C,^I
JRST BREAKW
CAIE C,"-
CAIN C,^J
BREAKW: AOS (P)
POPJ P,
SUBTTL INTERRUPTS
; INTERRUPT TABLE
ACPUSH==400003 ; PUSH O,A,B, + DEBUGGING VARIABLES
TSINT: ACPUSH,,P ; P IS AC STACK
%PIATY ? 0 ? %PIRLT\%PIATY ? <1_TTYI>\<1_STYO>\<1_STYI> ? TSATTY
0 ? <1_TTYO> ? 0 ? <1_STYI>\<1_STYO> ? [.CALL DISMIS]
0 ? <1_STYI> ? 0 ? <1_STYO>\<1_STYI> ? TSSTYI
0 ? <1_STYO> ? %PIRLT ? <1_TTYI>\<1_STYO> ? TSSTYO
0 ? <1_TTYI> ? 0 ? <1_TTYI>\<1_STYO> ? TTYINT
%PIRLT ? 0 ? %PIRLT\%PIATY ? 0 ? TSRLT
TSINTL==.-TSINT
TSRLT: AOSE SIIFLG ; NEED TO TURN SII BACK ON?
JRST TSRLT1
SKIPN TTYSRC
JRST TSRLT2
HRRZ A,-6(P) ; PICK UP OLD PC
CAIE A,TTYGCM ; HANGING IN IOT?
JRST [SETOM SIIFLG
JRST TSRLT1] ; NOPE
MOVEI A,TTYCFL
HRRM A,-6(P) ; CAUSE DISMISS TO RIGHT PLACE
TSRLT1: SKIPE TTYSRC
.CALL DISMIS
TSRLT2: SKIPE @INPSRC ; LAST INPUT BLOCK?
.CALL DISMIS
.CALL [SETZ
SIXBIT /STYGET/
MOVEI STYO
MOVEM A
MOVEM A
MOVEM B
SETZM B]
.CALL DISMIS ; PROBABLY DON'T HAVE IT YET
JUMPL A,CQUIT ; FLUSH IF LOGGED OUT
TLNN B,400000 ; DOES HACKER WANT INPUT?
.CALL DISMIS
.SUSET [.SIIFPIR,,[<1_STYO>]] ; GIVE HIM SOME
.CALL DISMIS
; ATTY INTERRUPT
TSATTY: MOVE O,-6(P) ; PICK UP THE PC
TLNE O,%PC1PR ; BEING SINGLE-STEPPED, SO FLUSH
.CALL DISMIS
SKIPE TTYSRC ; INPUT FROM TTY?
JRST TSATY1 ; YES, SO HAVE WORK TO DO
SKIPN DSKOUT ; OUTPUT SOMEWHERE?
.CALL DISMIS ; NO
SKIPE DSKCHN ; AND TO TTY-LIKE DEVICE?
.CALL DISMIS
SKIPE NULOUT
.CALL DISMIS
TSATY1: .CALL [SETZ
SIXBIT /RCPOS/
MOVEI STYO
SETZM A]
.LOSE %LSSYS
HLRZ B,A ; GET VERTICAL POS
HRRZS A
SKIPN TTYSRC
JRST [OVPOS OUTCHN,(B)
OHPOS OUTCHN,(A)
OCTLP OUTCHN,"L ; CLEAR TO END OF LINE
JRST TSATTO]
OVPOS TTYO,(B)
OHPOS TTYO,(A)
OCTLP TTYO,"L
MOVE A,CTTSTS
TLO A,%TSSII
MOVEM A,CTTSTS
.CALL [SETZ
SIXBIT /TTYSET/
MOVEI TTYO
CTTST1
CTTST2
SETZ A]
.LOSE %LSSYS
TSATTO: .CALL DISMIS
TSSTYI: MOVEM P,IERRST ; SAVE STACK FOR RETURNS
SETOM STIFLG
PUSHJ P,RECSTR
SETZM IERRST
SETZM STIFLG
.CALL DISMIS
DISMIS: SETZ
SIXBIT /DISMIS/
MOVSI ACPUSH
SETZ P
TSSTYO: MOVE O,ERRSTK
MOVEM P,ERRSTK
PUSH P,O
SETOM STOFLG
PUSHJ P,SNDSTR
SETZM STOFLG
POP P,ERRSTK
.CALL DISMIS
SUBTTL ERROR UUO
; COME HERE FROM UUO HANDLER. O-E HAVE BEEN PUSHED, EFFECTIVE
; ADDRESS IS IN UUOE, CONTENTS OF EFF ADDR IN UUOE, AC IN E.
UERROR: .SUSET [.SPICLR,,[0]] ; NO INTERRUPTS
SETZM NOCNSL
SKIPL CNSFLS ; SWITCH SET?
JRST UERRGO
.SUSET [.RCNSL,,A] ; CONSOLE?
SKIPL A
JRST UERRGO
SETOM NOCNSL
.SUSET [.RIOS+OUTCHN,,A]
JUMPN A,UERRGT
.CALL [SETZ
SIXBIT /OPEN/
[.UAO,,OUTCHN]
[SIXBIT /NUL/]
[SIXBIT /NUL/]
SETZ [SIXBIT /NUL/]]
.LOSE %LSFIL
UERRGT: .IOPUSH OUTCHN,
.IOPOP ECHO, ; WHAT A HACK
OASCR ECHO,[0]
UERRGO: SETOM ERESET ; CAUSE ERROR STRINGS TO BE RESET NEXT TIME
MOVE A,UUOE(P) ; SAVE EFFECTIVE ADDRESS
CAIE E,2 ; IF INPUT ERROR, DON'T GO TO TTY INPUT
SKIPGE NOCNSL ; SIMILARLY IF NOCNSL
JRST UERRO0
SKIPN TTYSRC
PUSHJ P,SETTTY ; SET UP TTY INPUT
UERRO0: SKIPL NOCNSL
OCTLP ECHO,"C
SOJE E,UERFIL ; FILE-TYPE ERROR
SOJE E,UERINP ; INPUT FAILURE
UERRO1: OASC ECHO,[ASCIZ /ERROR: /]
OASC ECHO,(A)
UERROT: SKIPN ERRSTK
JRST UERREX
SKIPGE NOCNSL
JRST CQUIT ; FLUSH
MOVE P,ERRSTK ; HAVE A PLACE TO DISMISS TO
.CALL DISMIS ; WILL RESET .PICLR
UERREX: .SUSET [.SPICLR,,[-1]]
SKIPGE NOCNSL
JRST CQUIT
JRST UUORET
UERFIL: OASC ECHO,[ASCIZ /ERROR: /]
MOVEM A,INPSRC ; ADVANCE THE POINTER
MOVE B,OUTPTR(A)
MOVE C,OUTLEN(A)
.CALL [SETZ
SIXBIT /SIOT/
MOVEI ECHO
B
SETZ C]
.LOSE %LSSYS
OASC ECHO,[ASCIZ / not found./]
SETZM OUTLEN(A)
JRST UERROT
UERINP: OASC ECHO,[ASCIZ /ERROR: /]
OASC ECHO,(A) ; PRINT THE MSG
SKIPN IERRST
JRST UERREX
MOVE P,IERRST
SKIPGE NOCNSL
JRST CQUIT
.CALL DISMIS ; AND AWAY WE GO
SUBTTL INITIALIZATION
; CALL WITH SYSTEM VERSION IN A
INIT: MOVEM A,SYSVER
MOVE A,[-200,,200]
MOVEI B,0
.CALL [SETZ
SIXBIT /CORBLK/
MOVEI %CBRED
MOVEI %JSELF
A
MOVEI %JSABS
SETZ B]
.LOSE %LSSYS ; CONS UP SYSTEM
MOVE A,USRVAR ; USER VARIABLES
PUSHJ P,DOEVAL
IOR B,[U,,400000] ; WILL ALL BE VAL+400000(U)
MOVE A,SYSCON ; CONSTANTS
PUSHJ P,DOEVAL
JFCL
MOVE A,SYSTBL
PUSHJ P,DOEVAL
IOR B,[C,,400000] ; VAL+400000(C)
MOVE A,TTYVAR
PUSHJ P,DOEVAL
IOR B,[T,,400000]
.SUSET [.ROPTIO,,A]
TLNE A,OPTDDT ; ONLY DUMP IF UNDER DDT
.VALUE [ASCIZ / :PDUMP SYS2;TS XXFILE
P/]
POPJ P,
DOEVAL: MOVE B,(A)
.EVAL B,
.VALUE
XCT @(P)
MOVEM B,1(A)
ADD A,[2,,2]
JUMPL A,DOEVAL
AOS (P)
POPJ P,
; CRUFT TO EVAL
USRVRS: IRPS X,,[JNAME:USYSNM:JTMU:UTRNTM:PICLR:IDF1:IDF2:USWST:
USWSCD:USTP:FLSINS:UPC:LSUUO:RPCL:SV40:LSCALL:UUAC]
SQUOZE 0,X
X: 0
TERMIN
USRVAR: USRVRS-.,,USRVRS
SYSCNS: IRPS X,,[LUBLK:NFSTTY]
SQUOZE 0,X
X: 0
TERMIN
SYSCON: SYSCNS-.,,SYSCNS
SYSTBS: IRPS X,,[IOCHNM:CLSTB:DCHSTB:IOTTB:JBDEV:CALSXB:OPRSXB]
SQUOZE 0,X
X: 0
TERMIN
SYSTBL: SYSTBS-.,,SYSTBS
TTYVRS: IRPS X,,[TTYSTS]
SQUOZE 0,X
X: 0
TERMIN
TTYVAR: TTYVRS-.,,TTYVRS
CONSTA
VARIAB
FREBOT: .+2
FRETOP: <<./2000>+1>*2000
END START