Trailing-Edge
-
PDP-10 Archives
-
decuslib20-04
-
decus/20-0118/loadvt.mac
There is 1 other file named loadvt.mac in the archive. Click here to see a list.
TITLE LOADVT VS11 2-MAY-75
; DEC-11-GPBAA-B-LA
;
; COPYRIGHT (C) 1974
; DIGITAL EQUIPMENT CORPORATION
; MAYNARD, MASSACHUSETTS 01754
; THE INFORMATION IN THIS SOURCE LISTING IS SUBJECT TO
; CHANGE WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A
; COMMITTMENT BY DIGITAL EQUIPMENT CORPORATION.
; DIGITAL EQUIPTMENT CORPORATION ASSUMES NO RESPONSIBILITY
; FOR ANY ERRORS THAT MAY APPEAR IN THIS LISTING.
; THIS SOFTWARE IS FURNISHED TO THE PURCHASER
; UNDER A LICENSE FOR USE ON A SINGLE COMPUTER
; SYSTEM AND CAN BE COPIED (WITH INCLUSION OF DIGITAL'S
; COPYRIGHT NOTICE) ONLY FOR USE IN SUCH SYSTEM, EXCEPT AS
; MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL.
; DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
; FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT
; THAT IS NOT SUPPLIED BY DIGITAL.
; WRITTEN BY JACK BURNESS.
; THIS PROGRAM CAN LOAD THE VT40 FROM ANY DEVICE THAT
; HAS A PDP-11 BINARY TAPE IN PDP-10 IMAGE FORMAT. IT WILL CONVERT
; THE 8 BIT CHARACTERS TO 6 BIT CHARACTERS FOR DATA TRANSMISSION.
; IT WILL ISSUE A 175-123 TO RESET THE VT40 AND A 175-114
; TO START LOADING IT. IT CAN ALSO RECOGNIZE A BAD CHECKSUM
; FROM THE VT40 BY THE 175-102 CHARACTERS.
IFNDEF NONREN, <TWOSEG>
LOC 137
^D10 ;VERSION NUMBER FOR RUN TIME.
IFNDEF NONREN, <RELOC 400000>
IFDEF NONREN, <RELOC>
TITLE: SIXBIT /LOADVT/
SUBTTL: SIXBIT /VS11 /
ENTRY START
EXTERNAL .JBREL, .JBFF
; CCLSW=1 GIVES NEW COMMAND LANGUAGE FEATURES
IFNDEF CCLSW,<CCLSW==1> ;NORMALLY ASSEMBLE WITH CCL FEATURES
IFE CCLSW,<TEMPC==0> ;TMPCOR UUO FLAG
IFNDEF TEMPC,<TEMPC==1> ;NORMALLY USE CCL WITH TMPCOR UUO
SUBTTL VARIABLE PARAMETERS
PAGSIZ= ^D54 ; NUMBER OF LINES ON A PAGE
NUMBUF= 4 ; NUMBER OF BUFFERS PER DEVICE
CORINC= 2000 ; CORE INCREMENT
SPL= 4 ; SYMBOLS PER LINE (SYMBOL TABLE LISTING)
SPLTTY= 3 ; SYMBOLS PER LINE (TTY)
DATLEN= ^D350 ; DATA BLOCK LENGTH
RLDLEN= ^D40
WPB= 10 ; MACRO BLOCK SIZE
CPL1= ^D72 ; CHARACTERS PER LOGICAL LINE
CPL2= ^D83 ; CHARACTERS PER PHYSICAL LINE
CPL3= ^D144 ; CHARACTERS PER .PDP10 LINE
PDPLEN= 100 ; PUSH-DOWN POINTER LENGTH
CRFLEN= ^D36 ; CREF SYMBOLS/LINE MAX
COLLPT= ^D128 ;CPL LPT
COLTTY= ^D72 ;CPL TTY
BKT1= 1
BKT2= 2
BKT3= 3
BKT4= 4
BKT6= 6
SUBTTL ACCUMULATOR ASSIGNMENTS
%00= 0 ; ACCUMULATION OF SIXBIT SYMBOL, SCRATCH
%01= 1 ; SYMBOL VALUE AND FLAGS SET BY SRCH. SCRATCH
%02= 2 ; SCRATCH
%03= 3 ; UNIVERSAL SCRATCH
%04= 4 ; UNIVERSAL SCRATCH +1
%05= 5 ; LOCATION COUNTER
%06= 6 ; SCRATCH
%07= 7 ; SYMBOL TABLE SEARCH INDEX
%10= 10 ; EXPRESSION OR TERM VALUE, SCRATCH
%11= 11 ; SCRATCH
%12= 12 ; MACRO STORAGE BYTE POINTER
%13= 13 ; LINE BUFFER BYTE POINTER
%14= 14 ; CURRENT CHARACTER (ASCII)
%15= 15 ; LH - ASSEMBLER FLAGS, RH - ERROR FLAGS
%16= 16 ; EXEC FLAGS
%17= 17 ; PUSH-DOWN POINTER
SUBTTL FLAG REGISTERS
; %16 - LH
LSTBIT= 000001 ; 1- SUPRESS LISTING OUTPUT
BINBIT= 000002 ; 1- SUPRESS BINARY OUTPUT
CSWBIT= 000004 ; 1- SUPRESS CROSS REFERENCE
ESWBIT= 000010 ; 1- LIST OCTAL
MSWBIT= 000020 ; 1- SUPRESS MACRO LISTING
NSWBIT= 000040 ; 1- SUPRESS ERRORS ON TTY
RSWBIT= 000100 ; 1- REPRODUCE SOURCE
TTYBIT= 000200 ; 1- LISTING IS ON TTY
ERRBIT= 000400 ; 1- ERROR MESSAGES ENABLED
; %16 - RH
ARWBIT= 000001 ; 1- LEFT ARROW SEEN
EXTBIT= 000002 ; 1- EXPLICIT EXTENSION SEEN
SWTBIT= 000004 ; 1- ENTER SWITCH MODE
INFBIT= 000010 ; 1- VALID INFORMATION SEEN
FFBIT= 000020 ; 1- FORM-FEED SEEN
ENDBIT= 000400 ; 1- END OF ALL INPUT FILES
SLABIT= 001000 ; 1- SWITCH MODE ENTERED WITH A </>
NULBIT= 010000 ; 1- NON-NULL COMMAND STRING
HDRBIT= 040000 ; 1- TIME FOR NEW LISTING PAGE
SEQBIT= 100000 ; 1- SEQUENCE NUMBER SEEN
MODBIT= 200000 ; 1- USER MODE AC'S SET
; %15 - LH
ENDFLG= 000020 ; 1- END OF SOURCE ENCOUNTERED
RSWFLG= 000040 ; 1- LINE TO BE SUPPRESSED IN REDUCTION
TTYFLG= 000100 ; 1- TTY MODE LISTING FORMAT
CONFLG= 000200 ; 1- CONCATENATION CHARACTER SEEN
EXTFLG= 000400 ; 1- EXTENSION LINE
TRNFLG= 001000 ; 1- TRUNCATION MODE
P10FLG= 002000 ; 1- .PDP10 MODE
LEDNUL= 004000 ; 1- NULL LEADER FROM OPEN FILE.
TRLNUL= 010000 ; 1- NULL TRAILER FROM OPEN FILE.
XSWFLG= 020000 ; 1- RECREATE OBJECT
FLTFLG= 040000 ; 1- ERROR ENCOUNTERED IN FLOATING ROUTINE
ISWFLG= 100000 ; 1- /I SEEN
P1F= 400000 ; 1- PASS 1 IN PROGRESS
SUBTTL MISCELLANEOUS PARAMETERS
TTYDEV= 000010 ; 1- DEVICE IS A TTY
PTRDEV= 000200 ; 1- DEVICE IS A PTR
LPTDEV= 040000 ; 1- DEVICE IS A LPT
CDRDEV= 100000 ; 1- DEVICE IS A CDR
IODATA= 200000 ; 1- IO DATA ERROR
IODEV= 100000 ; 1- IO PARITY ERROR
IOWRLK= 400000 ; 1- IO WRITE LOCK ERROR
IOBKTL= 040000 ; 1- IO BLOCK TOO LARGE
IOEOF= 020000 ; 1- END OF FILE ON IO DEVICE
; DEVICE PARAMETERS
BIN= 1
LST= 2
SRC= 3
CMD= 4
ILLCHR= 1 ;ILLEGAL CHARACTER SUBSTITUTE
ELLCHR= 2 ;END OF LOGICAL LINE CHARACTER
INBIT= 2 ;DEVICE CAN DO INPUT
ALMODE= 1 ;ASCII LINE MODE
; OPDEFS
OPDEF RESET [CALLI 0]
OPDEF DEVCHR [CALLI 4]
OPDEF CORE [CALLI 11]
OPDEF EXIT [CALLI 12]
OPDEF DATE [CALLI 14]
OPDEF APRENB [CALLI 16]
OPDEF MSTIME [CALLI 23]
OPDEF RUNTIM [CALLI 27]
OPDEF ZBINK [CLOSE BIN,]
OPDEF OUTCHR [TTCALL 1,]
OPDEF OUTSTR [TTCALL 3,]
OPDEF INCHWL [TTCALL 4,]
OPDEF IONEOU [TTCALL 15,]
OPDEF WAIT [CALLI 10]
OPDEF INCHRS [TTCALL 2,]
OPDEF SLEEP [CALLI 31]
DEFINE GENM40 (A,B,C,D,E,F) ;GEN MOD 40
<
XWD $'A*50*50+$'B*50+$'C , $'D*50*50+$'E*50+$'F
>
SUBTTL EXEC
START: ;MAIN ENTRY POINT
IFN CCLSW,<
TDZA 0,0 ;NORMAL ENTRY, CLEAR CCL FLAG
SETOM 0 ;CCL ENTRY, SET FLAG
MOVEM 0,CCLFLA ;SAVE FLAG
>
NULFIL: RESET ;RESET ALL I/O
SKIPN MESSF ;MESSAGE LEFT?????
PUSHJ %17,VT40R ;NOPE. RESET.
SETZM MESSF ;RESET FLAG NOW.
HRRZ %00,.JBFF
ADDI %00,204*NUMBUF*2+200+200 ;ACCOUNT FOR POSSIBLE CCL FILES
CORE %00,
HALT .
MOVE %17,[IOWD PDPLEN,PDPSTK]
IFN CCLSW,<
SKIPE CCLFLA
PUSHJ %17,DSKNIT ;INIT DSK: FOR COMMAND FILE
;SKIP RETURN
>
OUTCHR ["*"]
NXTCCL:
MOVE %00,[XWD BZCOR,BZCOR+1]
SETZB %01,BZCOR
BLT %00,EZCOR-1
PUSHJ %17,CORSET ;SET UPPER CORE
MOVSI %16,BINBIT!LSTBIT!CSWBIT
SETZ %15, ;CLEAR ASSEMBLER FLAG REGISTER
MOVE %01,.JBFF
HRLI %01,(POINT 7,)
MOVEM %01,TTIPNT
START1:
IFN CCLSW,<
SKIPE CCLFLA
PUSHJ %17,GETCMD ;READ A CHARACTER FROM COMMAND FILE
SKIPN CCLFLA
>
INCHWL %02
IDPB %02,%01
CAIE %02,LF
CAIN %02,ALTMOD
TDZA %02,%02
JRST START1
IDPB %02,%01
MOVEI %01,1(%01)
MOVEM %01,.JBFF
MOVSI %01,(SIXBIT /TTY/)
PUSHJ %17,GETLST ;INITIALIZE THE LISTING FILE
MOVE %05,TTIPNT
MOVEM %05,TTISAV ;SAVE TTI POINTER
MOVSI %01,(SIXBIT /DSK/)
PUSHJ %17,GETSRC ;INITIALIZE THE SOURCE FILE
MOVEI %10,[ASCIZ ./R REQUIRES LISTING FILE.]
TLNE %16,LSTBIT ;IF NO LISTING FILE
TLNN %16,RSWBIT ; BUT /R SEEN,
CAIA
JRST ERROR ; ERROR
IFN CCLSW,<
SKIPE CCLFLA
OUTSTR [ASCIZ /LOADVT: /] ;ANNOUNCE YOURSELF
>
SKIPN CCLFLA
OUTSTR [BYTE (7) CRR, LF, 0] ;CONFIRM ALL'S WELL
PUSHJ %17,ACEXCH ;SAVE EXEC AC'S
TLO %15,LEDNUL ;TELL OPEN INPUT TO PRODUCE NULL LEADER NOW.
MOVEI %03,4 ;TELL IT TO PRODUCE 4 CHARACTERS OF IT.
MOVEM %03,SRCNUL
MOVEI %03,MAJOR
PUSHJ %17,0(%03) ;CALL THE ASSEMBLER
SKPINC ;CLEAR ANY ^O
JFCL
IFN CCLSW,<
SKIPN CCLFLA
>
PUSHJ %17,ACEXCH ;SWAP AC'S
IFN CCLSW,<
EXTERNAL .JBERR
JRST EXIT
>
;INITIALIZE A LISTING FILE
;COLLECTS A DEVICE NAME IN AC %01, A FILE NAME IN XE AND
;AN OPTIONAL FILENAME EXTENSION, THE DEVICE IS INITIALIZED IN
;ASCII LINE MODE ON CHANNEL 2, IF THE DEVICE IS A TTY, THE
;TTYLST FLAG IS SET TO 1, AND THE INBUF/OUTBUF INDEX IS INCREMENTED.
GETLST: MOVSI %13,(Z LST,) ;SET SWITCH AC
SETZM XE
PUSHJ %17,GETNAM ;GET A DEVICE AND FILE NAME
SKIPA %03,[SIXBIT /BINARY/] ;IF NULL, AVOID WASTED CYLCE.
MOVE %03,[SIXBIT /BINARY/]
SKIPN XE ;EXPLICIT CREF NAME?
MOVEM %03,XE ; NO, GIVE IT DEFAULT
TRON %16,EXTBIT ;EXPLICIT EXTENSION?
MOVSI %14,(SIXBIT /LOD/) ; NO, SUPPLY ONE
GETLS2: MOVE %00,[INIT LST,10]
MOVSI %02,LSTBUF ;GET BUFFER HEADER ADDRESS
PUSHJ %17,INISET ;INITIALIZE LISTING FILE
MOVE %00,%01
DEVCHR %00, ;GET DEVICE CHARACTERISTICS
OUTBUF LST,NUMBUF
TLNE %13,777000 ;IS THERE A SWITCH TO PROCESS?
XCT %13 ;EXECUTE THE ASSEMBLED UUO
TRZN %16,EXTBIT ;WAS THERE AN EXTENSION?
MOVSI %14,(SIXBIT /LOD/) ;NO
HLLZM %14,XE1 ;SAVE EXTENSION IN LOOKUP BLOCK
ENTER LST,XE ;ENTER FILE NAME IN DIR.
JRST ERRNR ;DIRECTORY FULL
TLZ %16,LSTBIT ;INDICATE A GOOD LISTING FILE
TLNE %16,TTYBIT ;TOGGLE MODE?
TLC %15,TTYFLG ; YES
POPJ %17,
;INITIALIZE A SOURCE FILE
;COLLECTS A DEVICE NAME IN AC %01, A FILE NAME IN XE AND
;AN OPTIONAL FILE NAME EXTENSION. THE DEVICE IS INITIALIZED
;IN ASCII LINE MODE ON CHANNEL 3, AND THE FILE NAME ASSOCIATED
;WITH THE SOURCE FILE IS USED AS THE TITLE ON THE LISTING.
GETSRC: MOVSI %13,(Z SRC,) ;SET SWITCH AC
SETZM XE
TRNE %16,ARWBIT ;GIVE ERROR IF ARROW NOT GIVEN.
PUSHJ %17,GETNAM ;GET A DEVICE NAME AND FILE NAME
JRST ERRSE ;COMMAND ERROR IF A NULL
MOVE %00,[INIT SRC,10]
TLNE %15,XSWFLG
HRRI %00,10
MOVEI %02,SRCBUF ;GET BUFFER HEADER ADDRESS
PUSHJ %17,INISET ;INITIALIZE THE SOURCE DEVICE
MOVEI %05,.JBFFS
EXCH %05,.JBFF ;SET TO TOP OF INPUT BUFFER
INBUF SRC,NUMBUF
MOVEM %05,.JBFF ;RESTORE .JBFF
TLNE %13,777000 ;IS THERE A SWITCH TO PROCESS?
XCT %13 ;EXECUTE THE ASSEMBLED UUO
TRZE %16,EXTBIT ;WAS AN EXPLICIT EXTENSION SEEN?
JRST SRC3A ;YES, LOOK FOR IT
MOVSI %14,(SIXBIT /BIN/)
HLLZM %14,XE1 ;NO, TRY .PAL FIRST
LOOKUP SRC,XE
CAIA
POPJ %17,
MOVSI %14,(SIXBIT /BIN/)
HLLZM %14,XE1
LOOKUP SRC,XE
TDZA %14,%14 ;NOT FOUND, TRY BLANK
POPJ %17, ;FOUND
SRC3A: HLLZM %14,XE1 ;SAVE EXTENSION IN LOOKUP BLOCK
LOOKUP SRC,XE ;LOOKUP FILE NAME
JRST ERRCF ;FILE NOT FOUND
POPJ %17, ;EXIT
SUBTTL COMMAND STRING DECODER
;EXEC COMMAND STRING DISPATCHING
;THIS ROUTINE PICKS UP CHARACTERS FROM THE EXEC TTY BUFFER AND
;DISPATCHES TO THE PROPER ROUTINE DEPENDING ON THE TYPE OF
;CHARACTER. A TABLE OF BYTES AND BYTE POINTERS ALLOWS EACH CHARAC-
;TER IN THE ASCII SET TO BE TREATED INDIVIDUALLY.
GETNAM: SETZ %14, ;CLEAR SYMBOL WORD
MOVE %06,[POINT 6,%14]
GETCMN: PUSHJ %17,GETTTI ;GET NEXT CHARACTER
CAIN %05,"[" ;PROJECT-PROGRAMMER PAIR?
JRST LFTBRA ;YES
CAIGE %10,4 ;MODIFY CODE IF .GE. 4
TRNN %16,SWTBIT ;MODIFY IF SWITCH IS ON
ADDI %10,4 ;CHANGE DISPATCH BY ADDING 4
HRRZ %02,DSPTCH(%10) ;LOAD RIGHT HALF DISPATCH
CAIL %10,10 ;SKIP IF CORRECT
HLRZ %02,DSPTCH-10(%10);OTHERWISE, GET LEFT HALF DSPTCH
JRST @%02 ;GO TO CORRECT ROUTINE
GETTTI: ILDB %05,TTIPNT ;GET A CHARACTER FROM TTY BUFFER
MOVE %10,%05 ;ANOTHER COPY OF IT IN AC %10
IDIVI %10,8 ;TRANSLATE TO 4-BIT CODE
ADD %10,[POINT 4,BITE,] ;SET BYTE POINTER
IBP %10 ;MOVE TO PROPER BYTE
SOJGE %11,.-1 ;TEST FOR END
LDB %10,%10 ;OK, FETCH BYTE
CAIN %10,4 ;IS IT A NULL?
JRST GETTTI ;YES, TRY AGAIN
POPJ %17, ;NO, EXIT
;COMMAND DISPATCH TABLE AND BYTE POINTERS
DSPTCH: XWD GETCMN, ERRBS ;IGNORED CHAR, BAD CHAR(SWITCH)
XWD SWTCH, SWTCHA ;<(>, LETTER(SWITCH MODE)
XWD COLON, ERRBS ;<:>, NUMBER(SWITCH MODE)
XWD PERIOD, SWTCHE ;<.>,<)>ESCAPE SWITCH MODE
XWD LFTARW, ERRIC ;<_> OR <=>, BAD CHAR (NORMAL MODE)
XWD COMMA, STORE ;<,>,ALPHABETICH CHAR (NORMAL)
XWD CARRTN, STORE ;<CR>,NUMERIC CHAR (NORMAL)
XWD SLASH, ERRIC ;</>, <)> ILLEGAL ESCAPE
IFN CCLSW,<
XWD RUNUUO,0 ;<!>
XWD INDFIL,0 ;<@>
>
IFE CCLSW,<
XWD ERRIC,0
XWD ERRIC,0
>
;BYTE TABLE FOR DISPATCHING
;CLASSIFICATION BYTE CODES
; BYTE DISP CLASSIFICATION
; 00 00 ILLEGAL CHARACTER, SWITCH MODE
; 01 01 ALPHABETIC CHARACTER, SWITCH MODE
; 02 02 NUMERIC CHARACTER, SWTICH MODE
; 03 03 SWITCH MODE ESCAPE, SWITCH MODE
; 00 04 ILLEGAL CHARACTER, NORMAL MODE
; 01 05 ALPHABETIC CHARACTER, NORMAL MODE
; 02 06 NUMERIC CHARACTER, NORMAL MODE
; 03 07 SWITCH MODE ESCAPE, NORMAL MODE
; 04 10 IGNORED CHARACTER
; 05 11 ENTER SWITCH MODE WITH A <(>
; 06 12 DEVICE DELIMITER, <:>
; 07 13 FILE EXTENSION DELIMITER, <.>
; 10 14 OUTPUT SPEC. DELIMITER, <_> OR <=>
; 11 15 FILE DELIMITER, <,>
; 12 16 COMMAND TERMINATOR, <CR>
; 13 17 ENTER SWITCH MODE WITH </>
; 14 20 CCL FILE DELIMITER <!>
; 15 21 INDIRECT FILE DELIMITER <@>
;BYTE TABLE:
BITE:
BYTE (4) 4, , , , , , ,
BYTE (4) , 4,12, 4, 4,12, ,
BYTE (4) , , , , , , ,
BYTE (4) , ,12,12, , , ,
BYTE (4) 4,14, 4, , , , ,
BYTE (4) 5, 3, , ,11, , 7,13
BYTE (4) 2, 2, 2, 2, 2, 2, 2, 2
BYTE (4) 2, 2, 6, , ,10, ,14
BYTE (4) 15, 1, 1, 1, 1, 1, 1, 1
BYTE (4) 1, 1, 1, 1, 1, 1, 1, 1
BYTE (4) 1, 1, 1, 1, 1, 1, 1, 1
BYTE (4) 1, 1, 1, , , , ,10
BYTE (4) , , , , , , ,
BYTE (4) , , , , , , ,
BYTE (4) , , , , , , ,
BYTE (4) , , , , ,12, , 4
;LEFT ARROW PROCESSOR
LFTARW: TRO %16,ARWBIT ;SET APPROPIATE FLAGS
TRNN %16,EXTBIT ;IS THIS A FILE NAME EXTENSION?
MOVEM %14,XE ;NO, ITS A FILE NAME
TRZE %16,INFBIT ;IS THIS A NULL FILE?
CPOPJ1: AOS (%17) ;GOOD EXIT
CPOPJ: POPJ %17, ;...
;PERIOD PROCESSOR
PERIOD: TRO %16,EXTBIT ;SET FLAG FOR EXPLICIT EXTENSION
MOVEM %14,XE ;SAVE THE FILE NAME
JRST GETNAM ;RE-ENTER THE GETNAM ROUTINE
;COLON PROCESSOR
COLON: MOVE %01,%14 ;SET UP NEW DEVICE NAME
JRST GETNAM ;RETURN FOR MORE COMMAND
;COMMA PROCESSOR
COMMA: TRZN %16,INFBIT ;IS THIS A NULL FILE?
TRNE %16,ARWBIT ;ONLY LOOK FOR THEM IF NO _
SKIPA ;NOT A NULL FILE
POPJ %17, ;NULL FILE, EXIT
COMMA1: TRNN %16,EXTBIT ;DO WE HAVE A FILE NAME EXTENSION?
MOVEM %14,XE ;NO, IT WAS A FILE NAME
JRST CPOPJ1 ;GOOD EXIT
;CARRIAGE RETURN PROCESSOR
CARRTN: TRNN %16,NULBIT ;IS THIS JUST A RANDOM CR?
JRST NULFIL ;YES, RESTART COMPLETELY
TRO %16,ENDBIT ;IS THIS A NORMAL MODE COMMAND?
TRNN %16,ARWBIT ;YES, HAS A LEFT ARROW BEEN SEEN?
JRST ERRSE ;NO, SYNTAX ERROR
JRST COMMA1 ;YES, TREAT IT LIKE A COMMA
;THE FOLLOWING TWO ROUTINES HANDLE ALPHANUMERIC CHARACTERS
;FOUND IN THE COMMAND STRING. IN NORMAL MODE, THE CHARACTER
;IS DEPOSITED TO FORM A SIXBIT SYMBOL. IN SWITCH MODE, THE
;PROPER INSTRUCTION IS EXECUTED WITH THE AID OF A DISPATCH
;TABLE. THEN, IF SWITCH MODE WAS ENTERED WITH A SLASH, THE
;EXEC EXITS FROM SWITCH MODE.
STORE: TRO %16,INFBIT!NULBIT;TURN ON BITS FOR CR ROUTINE
SUBI %05,40 ;CONVERT SIXBIT TO ASCII
TLNE %06,770000 ;DON'T STORE IF NO ROOM FOR CHAR
IDPB %05,%06 ;PLOP THE CHARACTER INTO AC %14
JRST GETCMN ;RETURN
SWTCHA: MOVEI %11,-"A"(%05)
MOVE %10,[POINT 4,BYTAB]
IBP %10
SOJGE %11,.-1
LDB %11,%10
JUMPE %11,ERRBS
CAIG %11,SWTABA-SWTAB;THIS SWITCH LEGAL FOR INPUT?
TRNN %16,ARWBIT ; NO, ERROR IF "_" SEEN
CAIA ;OK
JRST ERRWF ; ERROR, SWITCH IN WRONG FIELD
XCT SWTAB-1(%11)
JRST ERRBS
TRZE %16,SLABIT ;CALLED BY A SLASH?
TRZ %16,SWTBIT ;YES, EXIT FROM SWITCH MODE
JRST GETCMN ;NO, RETURN FOR MORE CHARACTERS
;THE FOLLOWING THREE ROUTINES HANDLE THE CONTROL CHARACTERS
;IN THE COMMAND STRING WHICH CAUSE THE EXEC TO ENTER INTO AND
;EXIT FROM SWITCH MODE. THERE ARE TWO TYPES OF SWITCH MODE,
;DEPENDING ON WHETHER IT IS ENTERED WITH A </> OR A <(>.
SLASH: TRO %16,SLABIT ;TURN ON THE SPECIAL SWITCH MODE
SWTCH: TROA %16,SWTBIT ;TURN ON NORMAL SWITCH MODE
SWTCHE: TRZ %16,SWTBIT ;TURN OFF THE NORMAL SWITCH MODE
JRST GETCMN ;RETURN FOR MORE CHARACTERS
;DISPATCH TABLE FOR SWITCHES
DEFINE SETSW (LETTER, INSTRUCTION) <
INSTRUCTION
Y=<"LETTER"-"A">-^D9*<X=<"LETTER"-"A">/^D9>
SETCOD \X,Y>
DEFINE SETCOD (X,Y)
<BYTAB'X=BYTAB'X!<.-SWTAB>B<4*Y+3>>
BYTAB0= 0
BYTAB1= 0
BYTAB2= 0
SWTAB:
SWTABA:
BYTAB: +BYTAB0
+BYTAB1
+BYTAB2
LFTBRA: SETZM XE3 ;CLEAR NUMBER
LFTBR1: HRLZS XE3 ;COMMA, MOVE TO LEFT HALF
LFTBR2: PUSHJ %17,GETTTI ;GET NEXT CHAR
CAIN %05,"]" ;TERMINAL?
JRST GETCMN ;YES, EXIT
CAIN %05,"," ;SEPARATOR?
JRST LFTBR1 ;YES
CAIL %05,"0" ;TEST FOR OCTAL NUMBER
CAILE %05,"7"
JRST ERRIC ;IMPROPER CHARACTER
HRRZ %10,XE3 ;OK, GET PREVIOUS VALUE
IMULI %10,8
ADDI %10,-"0"(%05) ;ACCUMULATE NEW NUMBER
HRRM %10,XE3
JRST LFTBR2
;THE FOLLOWING CODE IS USED FOR PROCESSING THE COMMAND
;STRINGS FOR THE CCL COMMAND FEATURES
IFN CCLSW,<
DSKNIT: ;INIT DSK FOR CCL
IFN TEMPC,<
HRRZ %00,.JBFF ;USE .JBFF AS START OF CCL BUFFER
HRRM %00,CMDPNT ;DUMMY UP BUFFER HEADER
HRRM %00,TMPFIL+1 ;SET UP TMPCOR READ BLOCK
SOS TMPFIL+1 ;MAKE IT PROPER IOWD FORMAT
HRRI %01,(SIXBIT /P11/)
HRLM %01,TMPFIL ;SETUP NAME OF FILE TO BE READ
MOVNI %01,200 ;AND WORD COUNT
HRLM %01,TMPFIL+1 ;IN READ BLOCK
MOVE %01,[XWD 2,TMPFIL] ;SET UP AC FOR A READ
TMPCOR %01, ;READ AND DELETE "P11" FILE
JRST TMPEND ;NO FILE IN CORE TRY DISK
ADD %00,%01 ;GET END OF FILE
MOVEM %00,.JBFF ;UPDATE .JBFF SO FILE ISN'T WIPED OUT
HRLM %00,.JBFFI ;SAVE FOR LATER
IMULI %01,5 ;CALCULATE CHARACTER COUNT
MOVEM %01,CMDCNT ;STORE IN BUFFER HEADER
MOVSI %01,(POINT 7,,) ;BYTE POINTER
HLLM %01,CMDPNT ;BUFFER HEADER NOW SETUP
SETOM TMPFLA ;MARK THAT TMPCOR UUO IN PROGRESS
JRST CPOPJ1
TMPEND:
MOVEI %00,3 ;INIT 3 DIGIT COUNTER
PJOB %02, ;GET JOB NUMBER
DSKNI1: IDIVI %02,^D10 ;GET LAST DIGIT
ADDI %03,"0"-40 ;CONVERT TO SIXBIT
LSHC %03,-6 ;SLIDE CHAR INTO AC4
SOJG %00,DSKNI1 ;3 CHARS YET?
HRRI %04,(SIXBIT /P11/) ;YES, GET FILENAME ###P11.TMP
MOVEM %04,XE ;SAVE FILE NAME IN LOOKUP DIRECTORY
MOVSI %04,(SIXBIT /TMP/) ;SET UP EXTENSION
MOVEM %04,XE1 ;SAVE EXTENSION IN LOOKUP DIRECTORY
SETZM XE3 ;ZERO PROJ,PROG #'S
MOVEI %00,ALMODE ;ASCII LINE DATA MODE
MOVSI %01,(SIXBIT /DSK/)
MOVEI %02,CMDBUF ;GET BUFFER HEADER ADDRESS
OPEN CMD,%00 ;INIT DSK OK?
JRST DSKNI2 ;NO, TYPE MESSAGE
LOOKUP CMD,XE ;LOOKUP ###P11, TMP ON DISK
JRST DSKNI2 ;FILE NOT FOUND
INBUF CMD,1 ;ONE INPUT BUFFER
MOVE %00,.JBFF
HRLM %00,.JBFFI
JRST CPOPJ1 ;FILE FOUND, SKIP RETURN
DSKNI2: MOVE %00,.JBFF
HRLM %00,.JBFFI
JRST ERRCF1
GETCM3: MOVNI %00,5 ;SKIP OVER SEQUENCE NUMBER
ADDM %00,CMDCNT ;REDUCE COUNT BY 5 BYTES
AOS CMDPNT ;ADVANCE POINTER, FALL THROUGH
GETCMD: SOSG CMDCNT ;ANY CHARACTERS LEFT?
PUSHJ %17,GETCM1 ;NO GET ANOTHER BUFFER FULL
ILDB %05,CMDPNT ;GET CHARACTER
MOVE %00,@CMDPNT ;CHECK FOR SEQUENCE NUMBER
TRNE %00,1
JRST GETCM3 ;BY-PASS THE SEQUENCE NUMBER
CAIN %05,175 ;OLD ALTMODE?
MOVEI %05,33 ;YES, MAKE IT NEW ALTMODE
CAIL %05,140 ;IS CHARACTER LOWER CASE?
TRZ %05,40 ;YES, CHANGE TO UPPER CASE
MOVE %02,%05
POPJ %17, ;EXIT WITH CHARACTER
GETCM1:
IFN TEMPC,<
SKIPE TMPFLA ;IS A TMPCOR UUO GOING?
JRST GETCM2 ;YES, THEN WE ARE DONE?
>
IN CMD,
POPJ %17, ;NO ERRORS OR END OF FILE
STATZ CMD,IODATA!IODEV!IOBKTL
JRST ERRCMD ;DATA ERRORS
GETCM2:
JSP %10,DELFIL ;DELETE FILE
EXIT
DELFIL: SKIPE INDFLA ;DON'T DELETE IF INDIRECT FILE
JRST (%10)
CLOSE CMD,0 ;CLOSE COMMAND FILE
SETZB %04,%05
SETZB %06,%07
IFN TEMPC,<
SKIPE TMPFLA ;TMPCOR BEING USED?
JRST (%10) ;YES, DON'T RENAME FILE?
>
RENAME CMD,%04
JFCL
JRST (%10) ;RETURN
RUNUUO: ;PASS PROGRAM CONTROL TO NEXT PROGRAM (LNKX11)
SKIPN %01
MOVSI %01,(SIXBIT /SYS/) ;IF NO DEVICE, ASSUME SYS:
TRNN %16,EXTBIT ;PERIOD TYPED?
MOVEM %14,XE ;NO, THEN FILE NAME IS IN %14
TRNN %16,EXTBIT ;PERIOD TYPED?
MOVEI %14,0 ;NO, ASSUME 0 EXTENSION
HLLZM %14,XE1 ;SAVE IN DIRECTORY
JSP %10,DELFIL ;DELETE COMMAND FILE
MOVE %00,[XWD 1,%01] ;START INCREMENT,,6 WORD RUN BLOCK ADR
;%01 = DEVICE
MOVE %02,XE ;GET FILENAME
MOVE %03,XE1 ;GET EXTENSION
SETZB %04,%06
MOVE %05,XE3 ;GET PROJ,PROG
RUN %00, ;START NEXT PROGRAM
JSP %10,ERROR ;RUN FAILED
ASCIZ /LINKAGE ERROR FOR 23/
INDFIL: TRNN %16,EXTBIT ;SET UP THE FILENAME IF NECESSARY
MOVEM %14,XE
TRNN %16,ARWBIT ;NORMAL MODE
TLNN %16,BINBIT ;OR BINARY SPECIFIED?
JRST ERRIC ;YES, ILLEGAL CHARACTER
MOVE %00,[INIT CMD,ALMODE]
SKIPN %01 ;INIT CMD FOR @ FILE
MOVSI %01,(SIXBIT /DSK/)
MOVEI %02,CMDBUF
PUSHJ %17,CMDSET
XWD INBIT,1_ALMODE ;LEGAL BITS FROM DEVCHR
TRZE %16,EXTBIT ;EXTENSION?
JRST INDFI1 ;YES, DON'T TRY ASSUMPTIONS
MOVSI %14,(SIXBIT /CMD/)
HLLZM %14,XE1
LOOKUP CMD,XE
TDZA %14,%14 ;TRY NULL EXTENSION
JRST INDFI2
INDFI1: HLLZM %14,XE1
LOOKUP CMD,XE
JRST ERRCF ;CANNOT FIND COMMAND FILE
INDFI2: SETOM CCLFLA ;NON-STANDARD COMMAND STRING
SETOM INDFLA ;SET INDIRECT FLAG
INBUF CMD,1 ;SINGLE BUFFER
MOVE %14,.JBFF
HRLM %14,.JBFFI ;SAVE DATA RESTORE ADDRESS
JRST NXTCCL
>
;CALL: PUSHJ %17,CMDSET
; XWD BITS1,BITS2 ;LEGAL BITS ON DEVCHR
; RETURN
CMDSET: MOVE %03,%01 ;GET DEVICE NAME
DEVCHR %03,
SETCMM %03 ;COMPLEMENT BITS
TDNE %03,@(%17) ;WERE ALL BITS ONE?
JRST ERRNIT ;NO
AOS (%17) ;YES, SKIP RETURN
;FULL THROUGH
INISET: MOVE %03,[JRST ERRNA];ERROR EXIT FOR INIT
MOVSI %04,(POPJ %17,)
JRST %00
SUBTTL EXEC ERROR ROUTINES
ERRCMD: MOVEI %10,[ASCIZ /DEVICE INPUT ERROR FOR COMMAND STRING/]
JRST ERROR
ERRNIT: MOVEI %10,[ASCIZ /IMPROPER IO FOR DEVICE 2/]
JRST ERROR
IFN CCLSW,<
ERRCF1: SETZM CCLFLA ;LOOKUP FOR DSK:###P11.TMP FAILED
>
ERRCF: MOVEI %10,[ASCIZ /CANNOT FIND 234/]
JRST ERROR
ERRID: MOVEI %10,[ASCIZ /INPUT DATA ERROR 234/]
JRST ERROR
ERRBS: MOVEI %10,[ASCIZ /1 IS A BAD SWITCH/]
JRST ERROR
ERRIC: MOVEI %10,[ASCIZ /1 IS AN ILLEGAL CHARACTER/]
JRST ERROR
ERRNA: MOVEI %10,[ASCIZ /2 IS NOT AVAILABLE/]
JRST ERROR
ERRNR: MOVEI %10,[ASCIZ /NO ROOM FOR 234/]
JRST ERROR
ERRSE: MOVEI %10,[ASCIZ /SYNTAX ERROR IN COMMAND STRING/]
JRST ERROR
ERRNC: MOVEI %10,[ASCIZ /INSUFFICIENT CORE/]
JRST ERROR
ERRWF: MOVEI %10,[ASCIZ /1 ILLEGAL SWITCH FOR INPUT/]
JRST ERROR
ERRTF: MOVEI %10,[ASCIZ /TOO MANY INPUT FILES/]
JRST ERROR
ERRTB: MOVEI %10,[ASCIZ /2 ILLEGAL FOR BINARY OUTPUT/]
JRST ERROR
ERRLD1: MOVEI %10,[ASCIZ / LOAD ERROR ON FILE 234/]
JRST ERROR
ERRLD2: MOVEI %10,[ASCIZ / TELETYPE INPUT FORBIDDEN DURING LOADING PROCESS.
LOAD ABORTED DURING FILE:234/]
JRST ERROR
ERROR: ;NON-RECOVERABLE ERROR MESSAGE
PUSHJ %17,VT40R ;RESET VT40.
SETOM MESSF ;AND LEAVE INFO AROUND.
PUSH %17,%10 ;STACK MESSAGE ADDRESS
TRNE %16,MODBIT ;HAVE WE EXEC AC'S?
PUSHJ %17,ACEXCH ; NO, GET THEM
POP %17,%10 ;RESTORE MESSAGE POINTER
MOVSI %16,ERRBIT!LSTBIT!BINBIT ;FUDGE FLAGS
PUSHJ %17,LSTCR
MOVEI %02,"?"
PUSHJ %17,LSTOUT
PUSHJ %17,LSTSP ;TYPE SPACE
PUSHJ %17,LSTMCR
PUSHJ %17,LSTCR
JRST START
LSTMCR: PUSHJ %17,LSTMSG
JRST LSTCR ;LIST MESSAGE AND CRR
LSTMSG: TLOA %10,(POINT 7,,) ;SET BYTE POINTER AND SKIP
LSTMS4: PUSHJ %17,LSTOUT ;TYPE CHARACTER
LSTMS5: ILDB %02,%10 ;GET CHARACTER
JUMPE %02,CPOPJ ;TEST FOR END
CAIL %02,"1" ;TEST FOR SWITCH
CAILE %02,"5"
JRST LSTMS4 ;NO, TYPE THE CHARACTER
PUSHJ %17,@[EXP ERR1,ERR2,ERR3,ERR4,DNC]-"1"(%02)
JRST LSTMS5 ;GET NEXT CHARACTER
ERR1: MOVE %02,%05 ;GET IMPROPER CHARACTER
JRST LSTOUT ;DUMP IT
ERR2: MOVE %00,%01 ;GET DEVICE NAME
PUSHJ %17,LSTSIX ;TYPE IT
MOVEI %02,":"
JRST LSTOUT ;TYPE ":"
ERR3: MOVE %00,XE ;GET FILE NAME
JRST LSTSIX ;TYPE IT
ERR4: HLLZ %00,XE1 ;GET EXTENSION
JUMPE %00,CPOPJ ;EXIT IF NULL
MOVEI %02,"."
PUSHJ %17,LSTOUT ;TYPE "."
JRST LSTSIX
EXIT: CLOSE SRC, ;CLOSE THE SOURCE DEVICE
CLOSE LST, ;CLOSE THE LISTING FILE
TLON %16,LSTBIT ;WAS THERE A LISTING FILE?
PUSHJ %17,LSTTST ;YES, TEST FOR FINAL ERROR
TRNN %16,ENDBIT ;END OF COMMAND STRING?
JRST ERRTF ; NO, MARK ERROR
IFN CCLSW,<
SKIPN CCLFLA ;RESTART IF NOT CCL MODE
JRST START
HLRZ %00,.JBFFI
MOVEM %00,.JBFF ;RESTORE DATA AREA
RELEAS LST,0
RELEAS BIN,0
RELEAS SRC,0
EXIT6: PUSHJ %17,GETCMD ;GET NEXT COMMAND CHAR
CAIL %05,12 ;THROW AWAY REST
CAILE %05,15 ;OF LAST LINE
CAIA
JRST EXIT6
MOVSI %05,070000 ;BACK UP BYTE
ADDM %05,CMDPNT ;POINTER ONE BYTE
AOS CMDCNT
JRST NXTCCL ;GO DO NEXT COMMAND
>
IFE CCLSW,<
JRST START ;BACK TO BEGINNING
>
CORSET: ;INIT DYNAMIC MEMORY
HRRZ %00,.JBREL ;GET TOP OF CORE
MOVEM %00,SYMTOP
SUBI %00,2 ;GET POINTER TO BOTTOM OF TABLE
MOVEM %00,SYMBOT ;STORE IT
MOVSI %00,(1B0)
MOVEM %00,@SYMBOT ;STORE LOWER BUMPER
SETCAM %00,@SYMTOP ; AND UPPER BUMPER
POPJ %17,
ACEXCH: ;SWAP AC'S
TRC %16,MODBIT ;TOGGLE MODE BIT
EXCH %00,AC00
EXCH %01,AC01
EXCH %02,AC02
EXCH %03,AC03
EXCH %04,AC04
EXCH %05,AC05
EXCH %06,AC06
EXCH %07,AC07
EXCH %10,AC10
EXCH %11,AC11
EXCH %12,AC12
EXCH %13,AC13
EXCH %14,AC14
POPJ %17,
SUBTTL EXEC ROUTINES USING ASSEMBLER AC'S
LST3SP: ;LIST SPACES
PUSHJ %17,LSTSP
LST2SP: PUSHJ %17,LSTSP
LSTSP: MOVEI %02,SPACE
JRST LSTOUT
LSTNUM: TROA %02,"0" ;LIST NUMERIC
LSTASC: ADDI %02,40 ;CONVERT SIXBIT TO ASCII
JRST LSTOUT
LSTCR: TDZA %02,%02 ;LIST CR-LF
LSTTAB: MOVEI %02,TAB ;LIST A TAB
LSTOUT: ;LISTING ROUTINE
TLNN %16,LSTBIT!RSWBIT ;LISTING REQUESTED?
PUSHJ %17,LPTOUT ; YES
TLNE %16,ERRBIT ;ERROR LISTING?
TLNE %16,NSWBIT!TTYBIT ; YES, TO TTY?
POPJ %17, ; NO
JUMPE %02,LSTOU1 ;BRANCH IF CR-LF
OUTCHR %02 ;LIST CHARACTER
POPJ %17, ;EXIT
LSTOU1: OUTSTR [BYTE (7) CRR, LF, 0]
POPJ %17, ;CR-LF TO TTY
LPTOUT: ;OUTPUT TO LISTING DEVICE
LSTDMP: SOSG LSTCNT ;DECREMENT ITEM COUNT
PUSHJ %17,LIST1 ;EMPTY ENTIRE BUFFER
IDPB %02,LSTPNT ;STORE THE CHARACTER
CAIN %02,LF ;IF LINE FEED
TLNN %16,TTYBIT ;AND LISTING IS ON TTY,
POPJ %17,
;DUMP THE BUFFER
LIST1: OUTPUT LST, ;EMPTY A BUFFER
LSTTST: STATO LST,IODATA!IODEV!IOWRLK ;CHECK FOR ERRORS
POPJ %17, ;NO, EXIT
MOVEI %10,[ASCIZ /LOAD FILE OUTPUT ERROR/]
JRST ERROR ;TYPE MESSAGE
CHAR: TLNE %15,LEDNULTRLNUL ;ANY NULL'S AROUND?
JRST CHAR7 ;YEP. TAKE CARE OF THEM.
SOSGE SRCCNT ;DECREMENT ITEM COUNT
JRST CHAR4 ;GET ANOTHER BUFFER IF NECESSARY
ILDB %14,SRCPNT
POPJ %17, ;ACCEPT IT
CHAR4: INPUT SRC, ;CALL MONITIOR FOR A BUFFER
STATZ SRC, IODATA+IODEV+IOBKTL+IOWRLK
JRST ERRID ;INPUT TRANSMISSION ERROR
STATO SRC, IOEOF ;WAS AN END OF FILE REACHED?
JRST CHAR ;GET NEXT CHAR
CHAR5: CLOSE SRC,
TRNN %16,ENDBIT ;CRR SEEN BY COMMAND SCANNER?
JRST CHAR6 ; NO, GET NEXT SOURCE
TLO %15,ENDFLG ;YES, FLAG END
POPJ %17,
CHAR6: TLO %15,TRLNUL ;TELL ABOUT NULL TRAILER.
SETZ %14, ;PREPARE TO RETURN A NULL.
JRST CHAR8 ;AND TAKE CARE OF IT NOW.
CHAR7: SETZ %14, ;CLEAR RETURN REGISTER NOW.
SOSLE SRCNUL ;ALL DONE WITH NULL'S
POPJ %17, ;NOPE. KEEP UP THE GOOD WORK.
TLZE %15,LEDNUL ;LEADER ON?
POPJ %17, ;YEP. ALL DONE. EXIT NOW.
TLC %15,LEDNUL!TRLNUL ;TURN OFF TRAILER, TURN ON LEADER.
PUSHJ %17,ACEXCH ;GET EXEC AC'S
PUSHJ %17,GETSRC ;GET THE NEXT SOURCE FILE
TRO %16,HDRBIT ;START NEW FILE
PUSHJ %17,ACEXCH ;SAVE EXEC AC'S AND RETURN
CHAR8: MOVEI %01,4 ;SET UP FOR FOUR NULL'S
MOVEM %01,SRCNUL
POPJ %17, ;AND EXIT.
SUBTTL ASSEMBLER PROPER
; THESE ARE THE LISTING ERROR FLAGS.
ERRA= 400000
ERRB= 200000
ERRD= 100000
ERRE= 040000
ERRI= 020000
ERRL= 010000
ERRM= 004000
ERRO= 002000
ERRP= 001000
ERRQ= 000400
ERRR= 000200
ERRT= 000100
ERRU= 000040
ERRN= 000020
ERRZ= 000010 ;MARGINAL INSTRUCTION
ERRP1= 000001
MAJOR: TRZ %16,HDRBIT ;CLEAR HEADER FLAG.
WAIT LST, ;WAIT UNTIL I/O STOPS ON CHANNEL.
PUSHJ %17,ISREP ;REPLY THERE?
JRST CLENUP ;NOPE. PROBABLY SOME OTHER DEVICE.
MAJORE: ANDI %02,177 ;JUST 7 BITS, PLEASE.
CAIE %02,175 ;IS IT 175?
JRST ERRLD2 ;NO. RANDOM CHARACTERS. IGNORE.
PUSHJ %17,ISREP ;GET NEXT CHARACTER.
JRST ERRLD2 ;NOT ONE THERE. ERROR.
ANDI %02,177 ;AGAIN JUST 7 BITS.
CAIN %02,"B" ;IS IT "BAD"
JRST ERRLD1 ;YEP. GIVE ERROR MESSAGE.
CAIE %02,"G" ;IS IT GOOD?
JRST ERRLD2 ;NOT GOOD. MUST BE TYPED IN CRAP.
CLENUP: INCHRS %02 ;WAIT FOR ALL INPUT TO FINISH.
JRST .+2
JRST .-2
PUSHJ %17,VT40R ;RESET VT40
TLNE %15,ENDFLG ;ALL DONE?
POPJ %17,0 ;YEP. EXIT
SETZ %05, ;CLEAR WHICH CHAR COUNTER.
PUSHJ %17,VT40L ;LOAD VT40
PUSHJ %17,VTNULL ;GIVE LEADER.
LOADX: MOVEI %07,^D500 ;CHECK INPUT EVERY 500 CHARACTERS.
LOADDO: PUSHJ %17,LOADLP ;LOAD A CHARACTER.
SOJG %07,LOADDO ;LOOP UNTIL SOMETHING HAPPENS.
JUMPLE %07,CHKLD ;IT HAPPENED. COUNTER ZERO?
PUSHJ %17,VTNULL ;NO. MUST BE END OF FILE.
PUSHJ %17,LIST1 ;DUMP ALL BUFFERS.
JRST MAJOR ;AND CHECK FOR RETURN INDICATION.
CHKLD: INCHRS %02 ;WAS A CHAR SENT?????
JRST LOADX ;NOPE. RECYCLE.
JRST MAJORE ;YEP. GO UP AND DO IT AGAIN.
ISREP: INCHRS %02 ;TEST FOR A CHAR.
JRST .+2 ;NO
JRST CPOPJ1 ;RETURN NOW.
MOVEI %02,1 ;SLEEP FOR ONE SECOND.
SLEEP %02,
INCHRS %02 ;ANYTHING YET?
POPJ %17, ;NOPE.
JRST CPOPJ1 ;YET. RETURN NOW.
SEND6: ANDI %01,77 ;CLEAN OFF CRAP.
TRNN %01,40 ;LOWER HALF?
ADDI %01,100 ;YEP. RAISE IT UP TO LEGAL CHARACTER.
IMUL %01,[2010040201]
AND %01,[21042104377]
IDIVI %01,17_7 ;AND CORRECT PARITY.
ANDI %02,377
JRST LPTOUT ;SEND TO OUTPUTER.
GETCHR: PUSHJ %17,CHAR
TRNN %16,HDRBIT ;END OF THIS FILE.
TLNE %15,ENDFLG ;OR TOTAL END.
JRST .+2 ;YEP.
POPJ %17,
POP %17,%02 ;POP OFF STRAY ITEM.
JRST CPOPJ1 ;AND RETURN NOW.
LOADLP: AOJA %05,@[EXP SCH1,SCH2,SCH3](%05) ;DISPATCH.
SCH1: PUSHJ %17,GETCHR ;GET A CHARACTER NOW.
MOVE %12,%14 ;SAVE
MOVE %01,%14
LSH %01,-2
JRST SEND6 ;SEND IT OUT NOW.
SCH2: PUSHJ %17,GETCHR ;GET SECOND CHAR.
MOVE %01,%12
ANDI %01,3
LSH %01,4
MOVE %12,%14
LSH %14,-4
ANDI %14,17
IOR %01,%14
JRST SEND6
SCH3: SETZ %05, ;RESET DISPATCHER.
PUSHJ %17,GETCHR ;GET LAST CHARACTER OF 3/4
MOVE %01,%14 ;GET 2 BITS.
LSH %01,-6 ;SHIFT OVER TWO BITS.
ANDI %01,3 ;CHOP OFF CRAP.
LSH %12,2 ;SHIFT OVER 12 2 PLACES.
IOR %01,%12 ;MAKE INTO A GOODY.
PUSHJ %17,SEND6 ;SEND OUT SIX BITS NOW.
MOVE %01,%14 ;GET THE LAST 6
JRST SEND6 ;AND SEND THEM ALSO.
vt40r: movei %00,altmod
ioneou %00 ;because of feebleness in the monitor.
movei %00,322
ioneou %00
POPJ %17,
vt40l: movei %00,altmod
ioneou %00
movei %00,314
ioneou %00
POPJ %17,
VTNULL: MOVEI %07,5
SETZ %02,
PUSHJ %17,LPTOUT
SOJG %07,.-1
POPJ %17,0
DNC: IDIVI %11,^D10
HRLM %12,0(%17)
SKIPE %11
PUSHJ %17,DNC
HLRZ %02,0(%17)
JRST LSTNUM
LSTSIX: MOVSI %06,(POINT 6,%00,)
LSTSI1: ILDB %02,%06
JUMPE %02,CPOPJ
ADDI %02," "
PUSHJ %17,LSTOUT
TLNE %06,770000
JRST LSTSI1
POPJ %17,
IFNDEF NONREN, <RELOC 0>
PDPSTK: BLOCK PDPLEN
BZCOR:
AC00: BLOCK 1
AC01: BLOCK 1
AC02: BLOCK 1
AC03: BLOCK 1
AC04: BLOCK 1
AC05: BLOCK 1
AC06: BLOCK 1
AC07: BLOCK 1
AC08: BLOCK 1
AC09: BLOCK 1
AC10: BLOCK 1
AC11: BLOCK 1
AC12: BLOCK 1
AC13: BLOCK 1
AC14: BLOCK 1
.JBFFS: BLOCK 204*NUMBUF
MESSF: BLOCK 1
TTIPNT: BLOCK 1
TTISAV: BLOCK 1
XESAVE: BLOCK 1
XE: BLOCK 1
XE1: BLOCK 1
XE2: BLOCK 1
XE3: BLOCK 1
LSTBUF: BLOCK 1
LSTPNT: BLOCK 1
LSTCNT: BLOCK 1
SRCBUF: BLOCK 1
SRCPNT: BLOCK 1
SRCCNT: BLOCK 1
SRCNUL: BLOCK 1
TMPFIL: BLOCK 2
TTLFLA: BLOCK 1
SYMBOT: BLOCK 1
SYMTOP: BLOCK 1
EZCOR:
CCLFLA: BLOCK 1
TMPFLA: BLOCK 1
INDFLA: BLOCK 1
.JBFFI: BLOCK 1
CMDBUF: BLOCK 1
CMDPNT: BLOCK 1
CMDCNT: BLOCK 1
LF=12
ALTMOD=175
CRR=15
TAB=11
SPACE=40
IFNDEF NONREN, <RELOC>
END START