1
0
mirror of synced 2026-02-14 20:05:59 +00:00
Files
lisper.cpus-pdp8/tss8/system/ts8a.pal
brad 0e9bfd9d85
2010-04-02 12:36:00 +00:00

1372 lines
33 KiB
Plaintext
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.
/EDUSYSTEM 50 MONITOR FOR MELROSE HIGH SCHOOL #495AB
/COPYRIGHT 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/THIS SECTION DEFINES THE HARDWARE CONFIGURATION ON WHICH INDIVIDUAL
/EDUSYSTEM 50 MONITORS ARE TO RUN.
/FOR EACH STATEMENT, THE COMMENT INDICATES THE POSSIBLE RESPONSES.
CPU=2 /1 IF CPU IS PDP-8; 0 IF CPU IS PDP-8/I;
/2 IF CPU IS PDP-8/E
CORMEM=70 /HIGHEST DATA FIELD SELECT. FOR 12K SYSTEM,
/RESPOND 20. FOR 16K SYSTEM, RESPOND 30, ETC. (70 MAX)
PHONES=0 /1 IF DC08 INCLUDES 689AG;
/0 IF IT DOES NOT OR IF TTY INTERFACING IS OTHER THAN DC08
EAE=0 /20 IF PROCESSOR INCLUDES EAE; 0 IF IT DOES NOT
RF08=0 /40 IF SYSTEM DISC IS DF32; 0 IF SYSTEM DISK IS RF08
RS08=1 /NUMBER OF DISCS ON THE SYSTEM, WHETHER DF/DS OR RF/RS.
/RESPOND WITH 1, 2, 3, OR 4.
PUNCH=1 /1 IS SYSTEM INCLUDES PUNCH; 0 IF IT DOES NOT
TC01=1 /1 IF SYSTEM INCLUDES DECTAPE(S); 0 IF IT DOES NOT
RK05=1 /NUMBER OF RK05 CARTRIDGE DISK DRIVES ON THE SYSTEM; 0 TO 4
CDR=1 /1 IF SYSTEM INCLUDES CARD READER; 0 IF IT DOES NOT
LPT=1 /1 IF SYSTEM INCLUDES LINE PRINTER; 0 IF NO LINE PRINTER
DECIMAL /MONITOR CAPACITY FOR THIS SYSTEM
JOBMAX=20 /NUMBER OF SIMULTANEOUS USERS (20 MAXIMUM)
/THE FOLLOWING ENTRIES DEFINE THE NUMBER OF TERMINALS
/ATTACHED TO THE SYSTEM, AND ALSO THE METHOD OF INTERFACING
CONTTY=1 /WE ALWAYS HAVE A CONSOLE ( K00 )
DC08A=0 /NUMBER OF TERMINALS INTERFACED VIA DC08A (PDP-8/I ONLY, 19 MAX.)
DC08LO=0 /LOWEST HARDWARE LINE NUMBER UTILIZED ON DC08A; USUALLY 0
PT08=0 /NUMBER OF TERMINALS INTERFACED VIA PT08 (PDP-8 & PDP-8/I ONLY)
KL8=16 /NUMBER OF ADDITIONAL TERMINALS INTERFACED VIA KL8 (PDP-8/E ONLY, 19 MAX.)
/PARAMETERS VERSION 8.24 (01-JANUARY-75)
/
/
/
/
/COPYRIGHT (C) 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS
/SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-
/VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
/EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
/THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
/SOFTWARE SHALL REMAIN IN DEC.
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
/WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
/MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR
/RELIABILITY OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT
/SUPPLIED BY DEC.
OCTAL
PLT=0
IFNZRO CPU < IFNZRO DC08A <ILLEGAL CONFIGURATION>>
IFNZRO 24-JOBMAX&4000 <ILLEGAL CONFIGURATION>
IFNZRO 23-KL8-PT08&4000 <ILLEGAL CONFIGURATION>
IFNZRO 24-DC08A&4000 <ILLEGAL CONFIGURATION>
IFZERO DC08A <D689=0>
IFNZRO DC08A < IFNZRO PHONES <D689=4>
IFZERO PHONES <D689=0>>
NULINE=DC08A+PT08+KL8 /EVERY TERMINAL EXCEPT THE CONSOLE
SWDEX=5 /DISK TRACK OF THE FIRST USER SWAP TRACK
STOMIN=5 /MINIMUM # FREE STORAGE BLOCK FORR NEW JOB
IFZERO RF08-40 <
IFZERO RS08-1 <DSKSIZ=10>
IFZERO RS08-2 <DSKSIZ=20>
IFZERO RS08-3 <DSKSIZ=30>
IFZERO RS08-4 <DSKSIZ=40>
DSKEXT=DSKSIZ-1>
IFZERO RF08 <DSKSIZ=RS08^100 /# 4K DISC TRACKS
DSKEXT=RS08^100+77>
CLOCKR=144 /MILLISECONDS PER TICK
TICMIN=1130 /600 TICKS PER MINUTE
INCLK2=0322 /INITIAL CLOCK
INCLK1=7400
TICSPS=12 /NUMBER OF SYSTEM TICKS PER SECOND
INIDEX=10 /INIT DISC EXTENSION
TS8DEX=30 /FIELD 0 DISC EXTENSION*2^3
ERPDEX=0 /ERPDISK EXTENSION*4
ERPWC=0 /ERP WORD COUNT
FIPDEX=4 /FIP DISC EXTENSION*4
FIPWC=0 /FIP WORD COUNT
SIDEX=ERPDEX /SI DISC EXTENSION*4
SIWC=ERPWC /SI WORD COUNT
LIBACT=2 /LIBRARY ACCOUNT #
BRKINI=4000 /INITIAL USER BREAK MASK
/IOT DEFINITIONS
IFNZRO DC08A < /DC08A,DL8I IOTS
TTIL=6401 /INCREMENT LINE REGISTER
TTI=6402 /TELETYPE INPUT COMMAND
TTO=6404 /TELETYPE OUTPUT COMMAND
TTCL=6411 /CLEAR LINE REGISTER
TTLL=6412 /LOAD LINE REGISTER, CLEAR AC
TTRL=6414 /READ LINE REGISTER
T1SKP=6421 /SKIP ON CLOCK FLAG
T1OFF=6422 /TURN CLOCK OFF
T1ON=6424 /TURN CLOCK ON
TTIR=6461 /INCREMENT THE R REG.
TTCR=6471 /CLEAR THE R REG.
TTLR=6472 > /LOAD THE R REG.
/EXTENDED MEMORY
CDF=6201 /CHANGE TO DATA FIELD 0
CIF=6202 /CHANGE TO INSTRUCTION FIELD 0
CINT=6204 /CLEAR USER IOT
RDF=6214 /READ DATA FIELD
RIF=6224 /READ INSTRUCTION FIELD
RIB=6234 /READ INTERRUPT BUFFER
RMF=6244 /RESTORE MEMORY FIELD
SINT=6254 /SKIP ON USER IOT
CUF=6264 /USER FLAG OFF
SUF=6274 /USER FLAG ON
/EAE
MUY=7405 /MULTIPLY
DVI=7407 /DIVIDE
NMI=7411 /NORMALIZE
SHL=7413 /SHIFT ARITHMETIC LEFT
ASR=7415 /ARITHMETIC SHIFT RIGHT
LSR=7417 /LOGICAL SHIFT RIGHT
MQL=7421 /LOAD MQ
SCL=7403 /STEP COUNTER LOAD FROM MEMORY
SCA=7441 /STEP COUNTER TO AC
MQA=7501 /MQ TO AC
IFZERO CPU-2 <
DPSZ=7451 /MODE B ONLY - SKIP IF AC&MQ ARE CLEAR
SWBA=7447 /CHANGE MODE TO A
SWAB=7431 /CHANGE MODE TO B (ALSO DOES MQL)
ACS=7403 /AC(7:11) TO SC; AC CLEARED
SGT=6006 /SKIP ON GT FLAG
>
/LINE PRINTER IOTS
LSF=6661 /SKIP ON CHAR FLAG SET
LCF=6662 /CLEAR CHAR FLAG
LSRP=6663 /SKIP ON NOT READY OR ON ERROR
LLC=6664 /TRANSMIT CHAR TO PRINTER
LSP=6665 /SET PROGRAM INTERRUPT; LP08/LE8
LPC=6666 /TRANSMIT CHAR & CLEAR FLAG
LCP=6667 /CLEAR PROGRAM INTERRUPT
LIE=6665 /AC11 TO INTERRUPT ENABLE; LS08/LS8E
/CTY
TPC=6044 /LOAD TELEPRINTER AND PRINT
/DISC (DF32)
DCMA=6601 /CLEAR
DMAR=6603 /READ
DMAW=6605 /WRITE
DCEA=6611 /CLEAR DISC EXTENDED ADDRESS
DEAL=6615 /LOAD EXTENDED ADDRESS
DFSE=6621 /SKIP ON ERROR
DFSC=6622 /SKIP ON COMPLETION
DEAC=6616 /READ EXTENDED ADDRESS
/DISC (RF08)
DSAC=6612
DORS=6614
DIML=6615
DIMA=6616
DCXA=6641
DXAL=6643
/CARD READER IOT'S
RCSF=6631
RCRA=6632
RCRB=6634
RCNO=6635 /8E ONLY
RCRC=6636 /8E ONLY
RCNI=6637 /8E ONLY
RCSD=6671
RCSE=6672
RCRD=6674
RCSI=6675 /8E ONLY
RCTF=6677 /8E ONLY
/RK05 IOT'S
IFZERO PHONES<
DSKP= 6741
CDLR= 6742
DLAG= 6743
DLCA= 6744
DRST= 6745
DLDC= 6746
DMAINT= 6747 >
IFNZRO PHONES <
DSKP= 6751
DCLR= 6752
DLAG= 6753
DLCA= 6754
DRST= 6755
DLDC= 6756
DMAINT= 6757 >
/DECTAPE
DTRA=6761
DTCA=6762
DTXA=6764
DTSF=6771
DTRB=6772
DTLB=6774
IFZERO CPU <
/KW8I REAL TIME CLOCK
CECI=6137 /CLEAR AND ENABLE CLOCK AND INTERRUPT
CSCF=6133 /SKIP AND CLEAR FLAG IF FLAG
>
IFZERO CPU-1 <
CECI=6315 /CLOCK ENABLE
CSCF=6301 /SKIP ON CLOCK FLAG
CCF=6302 /CLEAR CLOCK FLAG, CLEAR ENABLE AND CLEAR BUFFER
CLB=6304 > /LOAD BUFFER FROM AC
IFZERO CPU-2 <
CECI=6131 /CLOCK ENABLE
CSCF=6133 /SKIP AND CLEAR FLAG IF FLAG
/POWER FAIL IOT
SPL=6102 /SKIP IF POWER LOW
/ 8/E PROCESSOR IOT
SRQ=6003 /SKIP ON INTERRUPT REQUEST
GTF=6004 /LINK TO AC0, GT FLAG TO AC1
RTF=6005 /AC0 TO LINK, AC1 TO GT FLAG
CAF=6007 > /CLEAR ALL FLAGS
IFZERO CPU-4 <
CLLE=6135 /AC11 TO INTERRUPT ENABLE FOR CLOCK
CLCL=6136 /CLEAR CLOCK FLAG
CLSK=6137 /SKIP ON CLOCK FLAG
SPL=6102 /SKIP POWER LOW
CAL=6133 > /CLEAR AC LOW FLAG
IFNZRO DC08A <
/689AG
SRF=6701 /SKIP IF RING FLAG
SCF=6711 /SKIP IF CARRIER FLAG
DFCRF=6742 /CLEAR RING FLAG
CTG=6721 /CLEAR GROUP COUNTER
RRS=6702 /READ RING STATUS
ITG=6731 /INCREMENT GROUP COUNTER
STR=6722 /SET TERMINAL READY
EDF=6704 /ENABLE DATAPHONE FEATURES
DDF=6714 /DISABLE DATAPHONE FEATURES
CTR=6724 /CLEAR TERMINAL FLAG
CCF=6741 /CLEAR CARRIER FLAG
RCS=6712 /READ CARRIER STATUS
>
/FIP IOTS (IN ABBREVIATED FORM)
SEGS=0006 /RETURN NUMBER OF FREE SEGMENTS ON DISK
ASD=0040 /ASSIGN
REL=0042 /RELEASE
REN=0200 /RENAME
OPEN=0201 /OPEN
CLOS=0202 /CLOSE
RFILE=6603 /READ FILE
PROT=0204 /PROTECT
WFILE=6605 /WRITE FILE
CRF=0210 /CREATE
EXT=0211 /EXTEND
RED=0212 /REDUCE
FINF=6613 /FILE INFORMATION
LIN=0214 /LOGIN
LOUT=0215 /LOGOUT
WHO=6616 /WHO
/DEVICE DATA BLOCK
DDBSTS=0 /WORD 1, STATUS AND UNIT NUMBER
DXON=2000 /XOFF SENT FLAG
DSI=1000 /DESTINATION IS S.I. FLAG
DFULL=400 /KEYBOARD BUFFER IS FULL
DUPL=200 /CONSOLE IN DUPLEX MODE
SICOM=100 /COMMAND WAITING
DECHO=400 /CAUSE SI TO RE-ECHO CURRENT INPUT BUFFER
/DEVICE UNIT NUMBER IS IN BITS 6-11
DDBJN=1 /WORD 2, JOB NUMBER IN 7-11
DDBBRK=2 /BREAK MASK
DDBTIM=3 /TIME THAT DEVICE WAS ASSIGNED
DDBINP=4 /BUFFER FILL POINTER
DDBINC=5 /BUFFER TOTAL COUNT
DDBOUC=6 /BUFFER EMPTY COUNT
DDBOUP=7 /BUFFER EMPTY POINTER
/JOB DATA AREA
JOBSTS=0 /STATUS
/STR0
JSRUN=4000 /RUN BIT
JSEREN=2000 /USER ERROR ENABLE
JCOMBD=1000 /LAST TIME THE JOB RAN AS COMPUTE BOUND
JSPEEK=400 /ALLOW "PEEK" AND "LOGOUT" IOT'S
JSACC=200 /JOB LOGGED IN UNDER PRIVILEGED ACCOUNT (1, 2, OR 3)
JSIOT=100 /NON-RESIDENT IOT
JSIOTC=40 /COPY IOT RESULT TO USER
JSEXON=20 /EXECUTE ONLY
JSINER=10 /INHIBIT ERROR REPORT FROM SI. (UNTIL NEXT COMMAND)
/BITS 9-11 ARE SYSTEM ERROR CODE
UUOERF=1 /IOT ERROR
SWPRER=2 /SWAP READ ERROR
SWPWER=3 /SWAP WRITE ERROR
DSKERR=5 /DISC ERROR
HUNGDV=6 /HUNG DEVICE
/STR1
JSTIME=4000 /TIME IS UP
JSF0=2000 /FILE 0 IS NOT BUSY
JSF1=1000 /FILE 1 IS NOT BUSY
JSF2=400 /FILE 2 IS NOT BUSY
JSF3=200 /FILE 3 IS NOT BUSY
JSDEL=100 /KEYBOARD DELIMITER SEEN
JSLPT=40 /LINE PRINTER BUFFER IN USE BUT NOT FULL
JSTEL=20 /TELEPRINTER OUTPUT BUFFER IN USE BUT NOT FULL
JSPTR=10 /CHARACTERS IN READER BUFFER
JSPTP=4 /PUNCH BUFFER IN USE BUT IS NOT FULL
JSERR=2 /SYSTEM ERROR DETECTED
JSWAIT=1 /JOB NOT IN WAIT STATE
JOBSTB=2 /DEVICE STATUS REGISTER (FOR RK05, DECTAPE, AND CARD READER)
JOBWMK=3 /WAIT MASK
JOBSRA=5 /JOB RESTART ADDRESS
JOBERR=6 /JOB ERROR RESTART ADDRESS
JOBLNK=7 /IOT LINKAGE
JOBSWR=10 /SWITCH REGISTER
JOBREG=11 /PC LINK AC
JOBEAE=14 /MQ MODE GT SC
JOBACC=16 /ACCOUNT NUMBER
JOBF0=17 /POINTER TO FILE 0 CONTROL
JOBF1=20 /POINTER TO FILE 1 CONTROL
JOBF2=21 /POINTER TO FILE 2 CONTROL
JOBF3=22 /POINTER TO FILE 3 CONTROL
JOBRTM=23 /LOW ORDER RUN TIME
JOBRTH=24 /HI ORDER RUN TIME
/FILE CONTROL BLOCK - POINTED TO BY JOBFX, X=0,1,2,3
FILWPT=0 /POINTER TO FILE RETRIEVAL WINDOW
FILSCT=1 /SEGMENT NUMBER OF FIRST WINDOW ENTRY
FILPRO=2 /FILE PROTECTION - BIT 9
FILPAR=3 /POINTER TO RFILE OR WFILE PARAMETER BLOCK
FILDA=4 /DISC ADDRESS OF RFILE OR WFILE
FILWC=6 /-WORD COUNT OF RFILE OR WFILE
FILRES=7 /POINTER TO FILPIF IN USER AREA
/FILE RETRIEVAL WINDOW
/WORD 0: UFD LINK TO NEXT GROUP OF 7 SEGMENT POINTERS
/WORDS 1-7: SEVEN SEGMENT ADDRESSES
/RFILE OR WFILE PARAMETER BLOCK - POINTED AT BY FILPAR
FILPFN=0 /FUNCTION: 0603 OR 0605
FILPDX=1 /DISC EXTENSION
FILPIF=2 /INTERNAL FILE # (BITS 10-11) AND FIELD # (BITS 7-9)
FILPWC=3 /-WORD COUNT FOR THIS TRANSFER
FILPCA=4 /CORE ADDRESS FOR THIS TRANSFER
FILPDA=5 /DISC ADDRESS
FILPRA=6 /EXEC RETURN ADDRESS FOR THIS TRANSFER
FILPCT=7 /POINTER TO FILE CONTROL BLOCK
/CORE TABLE CONTROL FLAGS
SWAP=4000 /SWAP REQUEST
LOCK=2000 /LOCK IN CORE
NOTRUN=1000 /HAS NOT BEEN SCHEDULED TO RUN
FIP=400 /FILE PHANTOM
SI=200 /SYSTEM INTERPRETER
NOHOLD=140 /INHIBIT "NOTRUN" STATUS AFTER FOUR CONSECUTIVE FILE TRANSFERS
CJOB=37 /BITS 7-11 CONTAIN THE JOB #
/FIP TABLE DEFINITIONS
SATSIZ=530
JTABLE=6000
ENTABL=JTABLE+JOBMAX+1
UTABLE=ENTABL+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX
RTABLE=UTABLE+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX+JOBMAX
/TABLES
CORTBL=7001 /CORE ASSIGNMENT TABLE
L2QTB=CORTBL+7
IFZERO DC08A <DCSIZE=0>
IFNZRO DC08A <DCSIZE=400> /SIZE OF FIELD 1 DC08A CODE PLUS 689AG CODE
OUTREG=200 /ACTIVE OUTPUT REGISTERS (TTY'S, LPT & PTP)
SKPTBL=OUTREG+NULINE+3 /START OF IOT SKIP TABLE
SKPTP=SKPTBL+NULINE+NULINE+3 /POSITION OF PUNCH SKIP IN SKIP TABLE
RINGIN=SKPTP+3 /KEYBOARD INPUT RING BUFFER
ENDBUF=OUTREG+200 /END OF KEYBOARD INPUT BUFFER
INPUTS=ENDBUF-RINGIN%2 /NUMBER OF POSSIBLE ENTRIES IN THE KEYBOARD RING BUFFER
DATFLD=CDF 10 /MONITOR DATA FIELD SELECT
IFZERO EAE-20 <MQREG=1>
IFZERO EAE <IFNZRO CPU&7776 <MQREG=1>
IFZERO CPU&7776 <MQREG=0>>
IFNZRO OUTREG&1 <YOU GOOFED>
/SUPER CRITICAL LOCATIONS
/THESE LOCATIONS ARE USED TO LINK TS8, TS8II, FIP, SI AND INIT.
/IT MAY BE NECESSARY TO ADJUST THEM ACCORDINGLY
/DEFINED IN TS8:
WSCHED=2573 /ADDRESS FOR WAIT
GETJTB=401 /GETJTA
CORSRC=1317 /SEARCH CORE TABLE
OVERLA=5171 /FILE STUFF
READFI=574 /MORE FILE STUFF
CONDBA=132 /DEVTBL POINTER USED BY "PRINT" ETC.
RETB=611 /RETURN A BLOCK TO FREE CORE
GETB=1405 /GET A BLOCK OF FREE CORE
GETDB0=1447 /GET A DDB
CLK1=51 /LOW ORDER DAYTIME CLOCK
CLK2=50 /HIGH ORDER DAYTIME CLOCK
DATE=166 /12 BIT DATE WORD
TTCHAR=31 /SAVE REG. FOR CONSOLE CHARACTERS
KBD00=3201 /PROCESS KEYBOARD INPUT
PRINT0=1205 /TYPE OUT A CHARACTER
OVRLA1=562 /MORE FILE STUFF
RUNFI=605 /SI FILE TRANSFER INITIALIZER
L2SF=103 /LEVEL 2 SAVED MODE AND FIELD
SICLR=6572 /SI CLEAR LINKED BUFFER
TIMSI=2421 /TIMER FOR SI "COMWAT"
SIWAIT=1702 /NUMBER OF SI COMMANDS BEING WAITED ON
TIMFIP=2423 /TIMER FOR FIPLOCK
FIPLOK=2724 /CORTBL STATUS CHECK FOR FORCE OUT
CLKINI=322 /CONVERT HARDWARE CLOCK TO SYSTEM-TICKS (100 MS)
BLT0=1602 /BLOCK TRANSFER FROM CORE TO CORE
KBDSQ=3213 /ADDRESS OF JMS TO ^S/^Q CODE
/DEFINED IN TS8II:
F1TCNT=175 /SI DDB CHARACTER COUNT
F1ECNT=176 /SI DDB EMPTY COUNT
F1BUF=177 /SI DDB EMPTY BLOCK POINTER
DTJOB=20 /JOB OWNING THE DECTAPE CONTROLLER
RKJOB=54 /JOB OWNING RK05 CONTROLLER
DTSI=1175 /SI TERMINATE A DECTAPE ON TIMER
DATA1=2200+DCSIZE
DEVTBL=DATA1+140
DEVTBE=DEVTBL+NULINE+NULINE+2
JOBTBL=DEVTBE+22
CLKTBL=JOBTBL+JOBMAX+1
TTYTBL=CLKTBL+JOBMAX+1
PRGTBL=TTYTBL+JOBMAX+1
DSUTBL=PRGTBL+JOBMAX+JOBMAX+JOBMAX-7
FIPBLK=7720 /FIXED BLOCK FOR FIP IO
WINBAS=7730 /ADDRESS OF THE BASIC WINDOW
OUTDIF=-OUTREG^2+DEVTBL /FOR LINKING BETWEEN OUTREG AND DEVTBL
F1OFFJ=164 /FOR OFF/ON COMMANDS USED BY SI
IFNZRO DEVTBL&1 <YOU GOOFED>
/DEFINED IN SI
DTSIDT=7270 /RETURN FROM STOPPING A DECTAPE ON TIMER
VERBRK=7600 /START OF INSTALLATION DEFINED LOGIN MESSAGE
/TS8 VERSION 8.24 (01-JANUARY-75)
/
/
/
/
/COPYRIGHT (C) 1975
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/
/THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY
/ON A SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH
/THE INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS
/SOFTWARE, OR ANY OTHER COPIES THEREOF, MAY NOT BE PRO-
/VIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHER PERSON
/EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO AGREES TO
/THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE
/SOFTWARE SHALL REMAIN IN DEC.
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE
/WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COM-
/MITMENT BY DIGITAL EQUIPMENT CORPORATION.
/
/DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR
/RELIABILITY OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT
/SUPPLIED BY DEC.
VERNUM=30
/PAGE 0
FIELD 3 /LOAD THIS INTO TRACK 3 ON DISK
*1
JMP I .+1
C0200, 200
WS0, 0 /WORKING STORAGE FOR MAIN FLOW
WS1, 0
JOBSWA, 0
*10
ACX10, 0 /FOR INTERRUPT SERVICE
ACX11, RINGIN-1 /INPUT RING BUFFER POINTER (LEVEL 1)
DSPAR, 0 /DISK HANDLER
L2Q, L2QTB-1 /LEVEL 2 QUEUE
L2QE, L2QTB-1 /LEVEL 2 EMPTY POINTER
AXS1, 0 /MISCELLANEOUS LEVEL 2 AUTO-INDEX
AXS2, 0 / "
DSKPTR, DSUTBL+6 /DISK REQUEST QUEUE POINTER
SIDATA=20 /SYSTEM INTERPRETER DATA
*SIDATA
COMPTR, DEVTBL /POINTER TO LAST DEVTBL ENTRY SCANNED
SIBUF, 0 /BUFFER STATE
SICNT, 0
COMDSP, 0 /FIP RETURN DISPATCH
SIFLG, 0 /COMMAND FLAGS
SICHAR, 0 /SAVE LAST CHAR FROM COMMAND SCAN
SIREG, 0 /USER AC, LINK, PC
0
0
TTCHAR, 0 /TTY CHARACTER
CONSTANTS=SIDATA+12
*CONSTANTS
C0002, 2
C0003, 3
C0004, 4
C0007, 7
C0037, 37
C0100, 100
C1000, 1000
C7770, 7770
JOBCON=CONSTANTS+11 /JOB CONTROL
*JOBCON
JOBTIM, 0 /NUMBER OF TICKS RUN
JOBTBA, JOBTBL /JOB TABLE ADDRESS
FRSTOR=JOBCON+3
*FRSTOR
FREE, 0 /POINTER TO HEAD OF FREE STORAGE
FRECNT, 0 /# FREE BLOCKS AVAILABLE
TIMDAT=FRSTOR+2 /CLOCK AND DATE
*TIMDAT
/CLOCK
CLK2, 0
CLK1, 0
SCHDAT=TIMDAT+2
*SCHDAT /SCHEDULING DATA
COMCNT, 0 /NUMBER OF COMMANDS AWAITING EXECUTION
SQREQ, 0 /SWAP REQUEST FLAG
FINISH, 0 /+(I)-(O) FIELD OF JOB BEING SWAPPED
FIT, 0 /JOB # TO BE SWAPPED IN
FORCE, 0 /FIELD TO BE SWAPPED OUT
DATEND=60 /END OF FIELD 0 PAGE 0 DATA
FIPDAT=155 /DATA REFERENCED BY FIP
*FIPDAT
FIPJOB, 0 /JOB NOW (OR SOON TO BE) RUNNING FIP
C0400, 400
SEGSIZ=C0400 /# WORDS PER SEGMENT
*160
JOB, 0 /# OF CURRENT JOB
JOBDAT, . /ADDRESS OF CURRENT JOB DATA LIST. MUST RESIDE IN DATA FIELD.
C7000,
CORTBA, CORTBL-1 /CORE ALLOCATION TABLE
DEVTBA, DEVTBL /DEVICE TABLE
DSUTBA, DSUTBL /USER DISC REQUEST QUEUE
DSBUSY, -1 /DISC BUSY COUNT
/THE DATE IS KEPT AS A 12 BIT NUMBER IN THE FORMAT
/DATE=((YEAR-1974)*12+(MONTH-1))*31+DAY-1
DATE, 0
FISUBL=400
BLTA, BLT0 /BLOCK TRANSFER
BLT=JMS I BLTA
CORSRA, CORSRC
CORE=JMS I CORSRA
GETBA, GETB
GETBLK=JMS I GETBA
GETDBA, GETDB0 /GET A DATA BLOCK
GETDDB=JMS I GETDBA
PRINTA, PRINT0 /TYPE OUT A CHARACTER
PRINT=JMS I PRINTA
GETJT0, GETJTB /GET JOB DATA TABLE ADDRESS
GETJTA=JMS I GETJT0
GIRSCA, GIRSC /STORE CHARACTER IN BUFFER
STORE=JMS I GIRSCA
RETBA, RETB /RETURN BLOCK TO FREE STORAGE
RETBLK=JMS I RETBA
WAITA, WSCHED
WAIT=JMP I WAITA
/SUBROUTINE DISPATCHES
SUBDSP=DATEND
*SUBDSP
IOR=JMS I .
IOR0 /INCLUSIVE OR
UUOEXT=JMP I .
UUDEX1 /UUO EXIT
FIUSER, DSUSER /QUEUE FILE REQUEST IN DSUBTL
ERROR=JMS I .
SYSERR /SYSTEM ERROR
TTYUSE=JMS I .
TTYSRC /FIND USER TTY
SCHED=JMP I .
SCHEDA, SCHEDI /SCHEDULE NEXT JOB NOW CORE RESIDENT
RSCHED=JMP I .
RSCHEA, SCHED0 /FIND NEXT JOB TO BE RUN
EXIT=JMP I .
EXITA, L2EXIT /LEAVE LEVEL 2
REDO=JMP I .
REDO0 /REPEAT IOT LATER WHEN (HOPEFULLY) IT CAN BE COMPLETED
KEY=JMS I .
KBD00 /PROCESS KEYBOARD INPUT INTO A USER'S INPUT BUFFER
SAVJOB=JMS I .
SAVJO0 /SAVE THE STATUS OF THE CURRENT JOB
RESJOB=JMS I .
RESJO0 /RESTORE THE PREVIOUSLY SAVED STATUS
START=JMP I . /START USER JOB
SUJ
DSGO=JMS I .
DSGO0 /START DISK REQUEST
GETJTW=JMS I .
GETJW0 /GET CONTENT OF JOB STATUS WORD (CURRENT JOB)
GETJTI=JMS I .
GETJI0 /GET CONTENT OF JOB STATUS WORD (ANY JOB)
DISMIS=JMP I .
DISMI0 /DISMISS INTERRUPTS
RUNABL=JMS I .
RUNTST /TEST IF SPECIFIED JOB IS RUNNABLE
SETFLG, PTSTAR
L2CON=SUBDSP+23 /LEVEL 2 (EXEC) CONTROL
*L2CON
L2SF, 100 /RELOCATION AND MODE
L2SV0, NULJOB /SAVED PC
L2SVLK, 0 /SAVED LINK
L2SA, 0 /SAVED ACCUMULATOR
FETCH=JMS I .
TOF /RETRIEVE A CHARACTER FROM A LINKED FREE CORE BLOCK
CLOCK, -1 /NUMBER OF SYSTEM TICKS PENDING ON LEVEL 2 (MINUS 1)
DEAD, 0 /CORTBL-1 OF JOB THAT SHOULD BE PUSHED OUT
SCHNEW, 0 /-1 TO ALLOW FULL TIME SLICES
C0010, 10
IFNZRO DC08A <
D6FLAG, -1 /ALLOW 689 ANSWER ONLY ONE TIME IN L2Q
D6ANSR, ANSWER >
/ROOM FOR PATCHES!!
*CONDBA
0 /POINTER TO DEVTBL POSITION CURRENTLY UNDER CONSIDERATION
CONDDB, 0 /ADDRESS OF DDB UNDER CONSIDERATION
SEGLMK, 7400 /-WRDSEG
C7400=SEGLMK
BASWIN, -WINBAS-1
CJOBDA= JOBDAT
C0006, 6
C0070, 70
SEGSM1, /WRDSEG-1
C0377, 377
C0005, 5
C0600, 600
C3777, 3777
C6203, 6203
QUANTM,
C7776, 7776
C0177, 177
CURJOB, 0 /NUMBER OF JOB INTERRUPTED BY FILE TRANSFER
*150
UDF=JMS . /SELECT FIELD OF CURRENT JOB
WS2, 0
UUDF, 0 /DATA FIELD SELECT FOR FIELD OF CURRENT JOB
JMP I .-2
INTRC, 0 /TRACK # TO BE SWAPPED IN (DF32 0X00) (RF08 000X)
OUTTRC, 0 /TRACK # TO BE SWAPPED OUT
*42
FANCOR, CORTBL+1 /FIELD OF PHANTOM I.E. FIELD 2
*57
BONUS, 0 /JOB # JUST BROKEN OUT OF I/O WAIT
*157
SWPIOA, SWPIO
*45
SWPREA, SWPRET
/FIELD 0 PAGE DIRECTORY
IOTS=4000
DISC=IOTS+1400 /DISC CONTROL
*200
/PRIORITY LEVEL 0 (HIGHEST PRIORITY)
/KEEPS TRACK OF REAL TIME
/ALWAYS ENTERED BY CLOCK FLAG
/DISMISSES TO LEVEL 1 IF INTERRUPT WAS NOT FROM LEVEL 1
/OTHERWISE, DISMISSES TO INTERRUPTED LOCATION.
INT,
IFZERO CPU-2 <
SPL /POWER FAILURE?
JMP INTX0 /NO
JMP I .+1 /YES, HURRY UP AND SERVICE IT
POWINT
INTX0, >
IFZERO CPU-4 <
SPL /POWER LOW
SKP /NO
JMP .-2 /WAIT FOR POWER
CAL > /CLEAR POWER LOW CONDITION
SINT /USER IOT? (HAS TO BE CHECKED FIRST!!!)
IFZERO DC08A <JMP INT0 >
IFNZRO DC08A <SKP >/DC08?
JMP I UUOA /YES, GO SAVE LEVEL 2 STUFF
IFNZRO DC08A <
T1SKP /CLOCK?
JMP INT0 /NO, KEEP LOOKING
ISZ CLKCNT /YES, IS A SYSTEM TICK UP YET?
JMP I T8DISA /NO, RUN DC08 INTERRUPT SERVICE
DCA CLKIT /SAVE AC AT INTERRUPT
TAD L2TIMA /SCHEDULE L2TIME ON L2QUE
ISZ CLOCK /BUMP NUMBER OF TICKS TO COUNT AT LEVEL 2
CLA SKP /ALREADY SCHEDULED
DCA I L2Q
TAD CLKINI /RESET TIMER FOR NEXT TICK
DCA CLKCNT
TAD CLKIT /GET AC AT INTERRUPT
JMP I T8DISA /RUN DC08 SERVICE
T8DISA, T8DIS>
/INTERRUPTS OTHER THAN 680 (LEVEL 1)
/DISMISSES TO LEVEL 2 IF NOT FROM LEVEL 1 OR 2.
INTAC, 0 /AC AT LEVEL 1
INTLK, 0 /LINK AT LEVEL 1
UUOA, UUO0
INT0, DCA INTAC /SAVE AC AND LINK
RAR
DCA INTLK
IFZERO DC08A <
IFNZRO CPU-4 <CSCF> /SKIP AND CLEAR FLAG IF FLAG
IFZERO CPU-4 <CLSK> /SKIP IF CLOCK FLAG
JMP DTINT
IFZERO CPU-4 <CLCL> /CLEAR CLOCK FLAG
IFZERO CPU-1 <
CLA CMA /KW08
CCF CLB /CLEAR FLAG AND LOAD BUFFER
CECI > /ENABLE
ISZ CLKCNT /IT WAS CLOCK - WAS IT A SYSTEM TICK
JMP DISMI1 /NO - NOTHING TO DO THEN
TAD CLKINI /YES - SET FOR NEXT SYSTEM TICK
DCA CLKCNT
ISZ CLOCK
JMP DISMI1
TAD L2TIMA /SCHEDULE A SYSTEM TICK ON LEVEL 2
JMP DISMI0 >
DTINT, JMS DTCHK
DISMIS
IFNZRO D689 <
SRF
JMP D6CF
DFCRF /CLEAR THE RING FLAG
ISZ D6FLAG /HAVE WE GOTTEN MORE THAN ONE FLAG?
DISMIS /YES! DON'T OVERFLOW L2Q
TAD D6ANSR
DISMIS /SCHEDULE PHONE ANSWERING ON L2Q
D6CF, SCF
JMP RFINT
CCF /A CARRIER HAS CHANGED
TAD DFM4
DCA I TIM68A /TAKE A LOOK AT IT IN FOUR SECONDS
DISMIS
DFM4, -4
TIM68A, TIM689 >
RFINT,
IFZERO RF08-40 <DFSE /DF32 DISK ERROR?
JMP I DSWAIT /YES
DFSC /DF32 DISK COMPLETION FLAG?
JMP I INT2 /NOPE
>
IFZERO RF08 <DFSC DFSE /RF08 DISK?
JMP I INT2 /NO
DFSE > /RF08 ERROR?
ISZ DSWAIT /NO ERROR - TRANSFER OK
JMP I DSWAIT
DSWAIT, 0 /SET BY DISK SERVICE
INT2,
IFNZRO CDR <INTCDR> /CONTINUE IN THE INTERRUPT CHAIN
IFZERO CDR <RINT>
DTCHK, 0
IFNZRO CDR <RCSF > /CARD READER?
IFZERO CDR <JMP .+6 >
JMP .+5
CIF DATFLD-1
CDF
JMP I .+1
CDL11
IFNZRO RK05 < DSKP > /RK05?
IFZERO RK05 < JMP .+5 >
JMP .+4
CIF DATFLD
JMP I .+1
RKL11
IFNZRO TC01 <DTSF > /DECTAPE?
IFZERO TC01 <JMP .+11 >
JMP .+10
DTRA
AND C0004
SNA CLA
JMP .+4
CIF DATFLD
JMP I .+1
DTL11
ISZ DTCHK
F1RTN, JMP I DTCHK /THESE 3 DEVICES RETURN HERE FROM FIELD 1
INT7, TAD CLKIT
DCA I L2Q /QUEUE REQUEST
DISMI1, TAD INTLK /RESTORE LINK AND AC
CLL RAL
TAD INTAC
DISMI2, RMF /RESTORE IF, DF, & MODE
ION
JMP I 0 /BACK TO INTERRUPTED PROGRAM
L2TIMA, L2TIME
REST0,
CLKIT, 0 /TEMPORARY FOR AC
CLKCNT, -3 /WILL INITIALIZE ITSELF TO THE CORRECT VALUE
*322
CLKINI, 0 /SET BY INIT TO CAUSE 1 SYSTEM TICK TO = 100 M.S.
/DISMIS ROUTINE
/ENTERED FROM INTERRUPT HANDLER TO ENTER LEVEL 2 FROM LEVEL 1
/AC = ADDRESS OF LEVEL 2 SERVICE ROUTINE
/ OR 0 IF NO LEVEL 2 SERVICE REQUIRED
DISMI0,
C6201, CDF
SNA /DISMISS INTERRUPTS?
JMP DISMI1 /NO - BACK TO WHATEVER WAS GOING ON BEFORE
DCA CLKIT /SAVE DISPATCH
RIB /MODE BIT = 100
AND C0100
SNA CLA /FROM USER MODE?
JMP INT7 /NO - QUEUE REQUEST UNTIL LATER
TAD INTAC /MOVE THE AC TO LEVEL 2
DCA L2SA
TAD INTLK /MOVE LINK TO LEVEL 2
DCA L2SVLK
TAD 0 /MOVE PC TO LEVEL 2
DCA L2SV0
RIB
DCA L2SF /FIELDS AND MODE TO LEVEL 2
ION /DISMISS TO EXEC MODE, FIELD 0, LEVEL 2
JMP I CLKIT
/RESTORE INTERRUPTED STATE
RESTOR, DCA REST0 /POINTER TO SAVED INFO
TAD I REST0 /SAVED FIELDS AND STATE
AND C0070 /GET INSTRUCTION FIELD
TAD C6203
DCA RCIF /CIF FOR PROPER FIELD
TAD I REST0
CLL RTL
RAL
AND C0070 /CDF FOR RETURN
TAD C6201 /NOT NECESSARILLY EQUAL TO INSTRUCTION FIELD
DCA RCDF
TAD I REST0
AND C0100 /USER PROGRAM, FIP OR SI?
SZA CLA
SUF /USER MODE; SET USER FLAG
ISZ REST0
TAD I REST0 /PC
DCA 0
ISZ REST0
TAD I REST0 /LINK
CLL RAL
ISZ REST0
CLA
TAD I REST0 /AC
RCIF, 0
RCDF, 0
ION
JMP I 0 /BACK TO INTERRUPTED PROGRAM
/RETURN ADDRESS OF LINKED TABLE ENTRY
/CALL TAD TABLE ENTRY ADDRESS
/ GETJTA
/ ENTRY NAME (NUMBER)
/ RETURN
GETJTB, 0
DCA GETJT1 /SAVE JOBTABLE ADDRESS
TAD I GETJTB /ENTRY #
DCA GETJT2
RDF /FIELD CALLED FROM
TAD C6203
DCA GETJT3 /SO WE CAN GET BACK
DATFLD /CHANGE TO DATA FIELD
DCA I GETJTZ /CLEAR FLD 1 LOC. 0
GETJ1, TAD I GETJT1 /GET JOBTBL ENTRY
CLL /TO LET CALLER KNOW IT DOESN'T EXIST
SNA /LINK 0?
JMP GETJ3 /YES - RETURN 0
DCA GETJT1 /NO, JOB DATA ADDRESS
TAD GETJM7
TAD GETJT2 /ARE WE IN PROPER BLOCK?
SPA /ENTRY<7?
JMP .+3 /YES
DCA GETJT2 /NO, LINK TO NEXT
JMP GETJ1 /AND TRY AGAIN
STL CLA IAC /SET LINK TO LET CALLER KNOW WE WERE SUCCESSFUL
TAD GETJT2 /INDEX INTO BLOCK
TAD GETJT1 /START OF BLOCK
GETJ3, ISZ GETJTB /SKIP CALLING ARGUMENT
GIRSB,
GETJT3, 0 /BACK TO CALLING FIELD
JMP I GETJTB
GETJTZ, 0 /POINTER TO LOC. 0 OF FIELD 1 (NOT FOR TEMPORARY STORAGE)
GIRSCT, /POINTER TO ITEM COUNT
GETJT1, 0
GIRST,
GETJT2, 0
GETJM7, -7
/STORE CHARACTER
/CALL WITH ADDRESS OF DDB IN AC, CHARACTER IN TTCHAR
/ STORE
/ ADDRESS OF ROUTINE TO CHECK BUFFER SIZE
/ WON'T FIT
/ OK
EMPTY=WS1
DBINPA=C0004
GIRSC, 0
TAD DBINPA
DCA GIRSB /POINTS TO ADDRESS OF BUFFER
TAD I GIRSB
SNA /IS BUFFER SET UP? (I.E. IS FILL POINTER NON ZERO?)
JMP GIRSC8 /NO - GO GET A BUFFER
DCA GIRSCT /POINTER TO FILL COUNT
ISZ I GIRSCT /ANY ROOM LEFT?
JMP GIRSC1 /YES
CDF
TAD I GIRSC /GET ADDRESS OF SIZE SUBROUTINE
DATFLD
DCA GIRST
TAD GIRSB
IAC /POINT TO CHARACTER COUNT
JMS I GIRST /GO CHECK BUFFER SIZE
JMP GIRSC0 /BUFFER ALREADY FULL - NO ROOM FOR THIS ENTRY
GIRS11, CLL CLA CMA RTL /IS THERE ENOUGH (I.E. 3 BLOCKS) FREE CORE LEFT?
TAD FRECNT
SPA SNA CLA
JMP GIRSC0 /NO - DON'T GIVE HIM ANOTHER BUFFER NOW
TAD GIRSCT /OK - GET A BUFFER
CDF
GETBLK /NO, LINK NEW BUFFER
JMP GIRSC0 /NONE AVAILABLE
DATFLD
TAD I GIRSCT /POINTER TO HEAD OF NEW BUFFER
DCA I GIRSB /BUFFERS NOW CHAINED TOGETHER
GIRSC7, TAD I GIRSB
DCA GIRSCT /POINT TO NEW FILL COUNT
TAD GIRSIZ /INITIALIZE CHAR COUNT TO -12
DCA I GIRSCT /AND SAVE IN NEW BLOCK
GIRSC1, TAD I GIRSCT /ARE WE DOING LAST THREE CHARACTERS IN BLOCK?
TAD C0003
SMA
STL RAL /YES SO MULT. BY 2 THEN ADD 1
SPA /PACK?
STL CIA /NO - GET ADDRESS WITHIN BUFFER
TAD I GIRSB /START OF BUFFER
DCA GIRSCT /ADDRESS TO STORE CHARACTER
TAD TTCHAR
SNL /PACK?
JMP GIRSC4 /YES
AND C0377
GIRSC5, DCA I GIRSCT /STORE CHARACTER
ISZ GIRSB /POINT TO CHARACTER COUNT
ISZ I GIRSB /COUNT THIS ENTRY
ISZ GIRSC /INDICATE SUCCESS
GIRSC3, ISZ GIRSC /TO SKIP PAST ARG.
JMP I GIRSC
GIRSC4, RTL /SHIFT BITS TO LEFT
RTL
AND C7400
TAD I GIRSCT /AND SAVE IN CURRENT LOCATION IN BUFFER
DCA I GIRSCT
ISZ GIRSCT /NEXT LOCATION IN BUFFER
TAD TTCHAR /GET LOW 4 BITS FROM CHARACTER
RTR
RTR
RAR
AND C7400 /AND COMBINE WITH PREVIOUS CHARACTER
TAD I GIRSCT /SAVE THE WHOLE MESS
JMP GIRSC5 /AND AWAY
GIRSC8, CDF /ATTACH A BUFFER TO FILL POINTER
TAD GIRSB /LINK ADDRESS
GETBLK
JMP GIRSC3 /CAN'T GET ONE - TOO BAD
DATFLD /OK - SET UP POINTERS
STL RTL / 2 PLUS
TAD GIRSB /ADDRESS OF FILL POINTER
DCA EMPTY / = ADDRESS OF EMPTY COUNT
STA
TAD GIRSIZ /-13 TO THE EMPTY COUNT
DCA I EMPTY
ISZ EMPTY /NOW INITIALIZE THE EMPTY POINTER
TAD I GIRSB /SET EMPTY POINTER EQUAL TO FILL POINTER
DCA I EMPTY /SINCE IT'S THE ONLY BUFFER
JMP GIRSC7
GIRSC0, DATFLD /COULDN'T SQUEEZE CHARACTER IN
STA /BUT WE ALREADY BUMPED FILL COUNT
DCA I GIRSCT /INDICATE CURRENT BLOCK IS STILL FULL
JMP GIRSC3 /AND EXIT WITHOUT SKIPPING
GIRSIZ, -12 /10 (DECIMAL) CHARACTERS/BLOCK
OVRLA1, JMS I FIUSER
WAIT
REMJOB, 0
TAD SCHNEW /GET NEW JOB MASK
AND JOB /AND THE CURRENT JOB
DCA CURJOB /IF THERE'S A JOB; REMEMBER HIM/HER
SAVJOB /SAVE HIS/HER STATE
STA
DCA SCHNEW /SET MASK FOR FULL SLICE
JMP I REMJOB
READFI, TAD SIREG /FIND RESIDENT FIELD FOR THIS JOB
FILCON, DCA WS0
JMS REMJOB /BUMP OFF THE PRESENT USER - BUT MAYBE REMEMBER WHO [S]HE IS
TAD WS0
CORE
CJOB /ANY FIELD WITH THIS JOB IN IT IS OK
HLT /IF IT'S NOT THERE IT'S DOOMS DAY FOR ALL
DCA L2SF /RESTORE FOR THIS JOB
TAD WS0
RUNFI, RESJOB /RESTORE LEVEL TWO FOR THIS JOB
GETJTW /GET ADDRESS OF FILE PARAMETER BLOCK
JOBLNK
JMP I SIFILA /AND OFF TO THE FILE HANDLER
/RETURN BLOCK TO FREE LIST
/CALL TAD BLOCK ADDRESS
/ RETBLK
/ RETURN WITH LINK IN AC
RETB, 0
DCA RETB1 /SAVE BLOCK ADDRESS
RDF
TAD C6203
DCA RETF /FOR RETURNING TO CALLER
TAD RETB1
CLL
TAD RETEND /SEE IF IT'S FIP'S BLOCK OR A FILL COUNT FOR A LINKED BUFFER
SZL CLA
JMP RETF /IT IS - DON'T RELEASE IT
TAD RETB1
SNA
HLT /SHOULD NEVER RETURN 0000
AND C0007
SZA
HLT /SHOULD ALWAYS BE XXX0
DATFLD
TAD I RETB1 /NOW GET THE LINK, IF ANY
DCA RETBL /SAVE IT
TAD FREE /GET OLD START OF FREE LIST
DCA I RETB1 /PUT IT IN LINK
TAD RETB1 /PUT ADDRESS OF THIS BLOCK
DCA FREE /AS START OF FREE LIST
ISZ FRECNT /INCREMENT FREE
TAD RETBL
RETF, 0 /RETURN WITH LINK
JMP I RETB
RETEND, -FIPBLK
SIFILA, SIFILE
SJCOPY, JSIOTC
SUJERR= C0007
/RESTART USER JOB AT RESTART ADDRESS
GIR90, CIA /NEGATE THE JOB NUMBER
TAD JOB /IS THE JOB CURRENTLY RUNNING?
SZA CLA
JMP GIR91 /NO
TAD I WS0
DCA L2SV0 /SET PC=RESTART ADDRESS
DCA L2SVLK /SET LINK=0
DCA L2SA /SET AC=0
JMP I GIR0A /LEAVE
GIR91, TAD I WS0
DCA I JOBSWA /SET PC=RESTART ADD
ISZ JOBSWA
STA
DCA I JOBSWA /SET LINK=-1 SO WE'LL REMEMBER TO CLEAR HIS'HER LINK & AC LATER
JMP I GIR0A
GIR0A, KBD01
CNOTR, -NOTRUN-1
/START USER JOB
SUJ, TAD L2SF /CLEAR NOTRUN FLAG SO JOB CAN BE SWAPPED
AND C0007 /GET CORTBL INDEX
TAD CORTBA
DCA SUJSRC /POINTS TO ENTRY IN CORTBL FOR THIS JOB
TAD I SUJSRC /GET CORTBL ENTRY
AND CNOTR /CLEAR NOT RUN BIT
DCA I SUJSRC /SAVE ENTRY
TAD JOB /IS IT A PHANTOM?
AND C0600
SUJ2, SZA CLA
EXIT /YES - WE'RE ALL SET
SUJ5, GETJTW /NO, IOT RESULTS TO USER?
JOBSTS
AND SJCOPY /IOTC BIT IN STR0
DATFLD
SNA
JMP SUJ4 /NO - WAS THERE A SYSTEM ERROR?
CMA /CLEAR THE BIT
AND I JOBSWA /JSIOTC:=0
DCA I JOBSWA /SAVE NEW STR0
CDF /GET # ARGUMENTS TO RETURN
GETJTW
JOBLNK
DCA SUJSRC /POINTS TO WORD1 OF PARAMETER BLOCK
DATFLD
TAD I SUJSRC /IOT IN QUESTION
CDF
RAR /SAVE "WHO FINF" INDICATOR IN LINK
AND C0004
SNA CLA /WAS BIT 8 ON?
JMP SUJ3 /NO - MUST HAVE BEEN AN RFILE OR WFILE WINDOW TURN
CML CMA RAL
CLL RTL /CA=-3 FOR "WHO"; AC=-7 FOR "FINF"
DCA SUJCNT /SAVE COUNT
TAD SUJSRC /RETURN PARAMETER BLOCK
RETBLK
CLA
ISZ SUJSRC /POINTS TO WORD 2 OF BLOCK
TAD UUDF /TRANSFER RESULTS TO USER'S FIELD
DCA SUJDFS /...SET FIELD IN BLT CALL
TAD L2SA /POINTS TO USER'S PARAMETERS
DCA SUJDES /SAVE FOR BLT
DCA L2SA /CLEAR HIS/HER AC
BLT /MOVE RESULTS TO USER
DATFLD /FROM FIELD 1
SUJSRC, 0 /SOURCE ADDRESS
RETBL,
SUJDFS, 0 /TO USER FIELD
RETB1,
SUJDES, 0 /AT THIS ADDRESS
SUJCNT, 0 /-WORD COUNT
TAD JOB
RUNABL /IS [S]HE STILL RUNNABLE?
WAIT /NO - JUST NEEDED TO PASS THE INFO TO HIM/HER
JMP SUJ5
SUJ3, TAD SUJSRC /UFILE RETURN
JMP I SIFILA
SUJ4, ISZ JOBSWA /POINT AT STR1
TAD I JOBSWA
STL RTR /PLACE SYSTEM ERROR PENDING BIT IN LINK
SNL /IS THERE AN ERROR?
JMP SUJ2 /NO; GO CLEAR AC AND EXIT
/ROUTINE TO START USER JOB AT ERROR ADDRESS
/DOES A JMS TO ERROR ADDRESS
/USER PC AT TIME OF ERROR TO ADDRESS; JMP TO ADD+1
CLL RTL /CLEAR THE ERROR PENDING BIT
DCA I JOBSWA /TO AVOID A SECOND JMS TO HIS ERROR ROUTINE
TAD JOBSWA
TAD C0005
DCA JOBSWA /POINTS TO ERROR RESTART ADD
TAD I JOBSWA /ERROR ADDRESS
DCA WS0
TAD L2SV0 /OLD PC
UDF /GET USER'S FIELD
DCA I WS0 /SAVE OLD PC
IAC
TAD WS0 /ERROR ADDRESS + 1
DCA L2SV0 /NEW PC
EXIT
/PAPER TAPE READER SERVICE FOR TSS/8
UPTR, JMS I PTRCHK /DOES [S]HE OWN DEVICE?
PTRDEV, DEVTBE /POINTS TO READER ENTRY IN DEVTBL
TAD URCBI /CHECK FOR "RCB"
TAD UUOCAL
SNA CLA
JMP URCB /IT IS!
JMS I PTRIOT /ANALYZE IOT
JMP URRS /READ A STRING
PTRFL, JSPTR /READER FLAG
JMP I PTRSKP /WE ALWAYS SKIP
SNL CLA /RRB?
UUOEXT /NO - MUST HAVE BEEN RFC - SO WHAT!
DCA WS0 /SET READER'S BREAK MASK TO 0
DATFLD
TAD I PTRDEV /ADDRESS OF DDB
FETCH /FETCH A CHARACTER FROM READER BUFFER
JMP PSTWT0 /NONE AVAILABLE - START READER
DCA PTRCH /SAVE FOR NEXT RRB
CDF
TAD PTRACA /POINTS TO L2SA
IOR /OR CHARACTER INTO L2SA
PTRCH, 0
UUOEXT /EXIT TO USER
PTRSKP, UUOEX2
URRS, DATFLD
TAD I PTRDEV /GET DDB ADDRESS
DCA CONDDB
JMS I PSTRIN /TRANSFER STRING TO USER
JMP PSTWT0 /INSUFFICIENT NUMBER OF CHARACTERS IN BUFFER
UUOEXT
URCB, DATFLD
TAD I PTRDEV /CLEAR THE ENTIRE READER BUFFER
JMS I PTRCLR
UUOEXT
PSTWT0, STA
L2PTR1, DCA PTRSET /REMEMBER WHY WE ARE HERE
CDF CIF /SELECT F0 AND INHIBIT INTERRUPTS
TAD I PTRTIM /IS THE READER BUSY?
SNA CLA
RFC /START THE READER
CLL STA RAL /AC=-2
DCA I PTRTIM /SET READER TIMER
DCA I RCNTA /NO LIMIT UNTIL IT'S READ AT LEAST ONE BLOCK WORTH
ISZ PTRSET /FROM UUO OR LEVEL 2?
EXIT /LEVEL 2 - FINISHED
STA
TAD L2SV0 /BACK UP HIS PC FOR A REDO
DCA L2SV0
TAD PTRFL
UUOEXT /NOW WAIT FOR THE READER
PTRSIZ, 0
DCA PTRSET /SAVE POINTER TO CHARACTER COUNT
ISZ PTRSIZ /WE ALWAYS SUCCEED
CDF CIF /NO INTERRUPTS WHILE WE CHECK THE READER'S STATUS
TAD I PTRTIM
SMA CLA /IS IT STILL RUNNING?
JMP PTRSI2 /NO - JUST MAKE SURE THE FLAG IS SET
TAD FRECNT /HOW'S THE SUPPLY OF FREE CORE?
TAD C7770
SMA SZA CLA
TAD PTRFUL /MINUS NUMBER ALLOWED
DATFLD
TAD I PTRSET /PLUS CURRENT CHARACTER COUNT
CDF
SMA
STA /SHUT DOWN THE READER AFTER THE NEXT CHARACTER
DCA I RCNTA
TAD I RCNTA
TAD C0100
SMA CLA
PTRSI2, JMS PTRSET /SET THE READER FLAG IN STR1
JMP I PTRSIZ
L2PTR, JMS PTRSET /WAKE HIM/HER UP - [S]HE'S HUNG
TAD I PTRDEV /DDB?
SNA
EXIT /NO
DCA AXS2 /YES - SAVE IT, WE'LL NEED THE JOB # FROM IT
TAD AXS2
TAD C0004
DCA WS0
TAD I WS0 /IS IT EMPTY?
SZA CLA
EXIT /NO - SO IT ISN'T OFFICIALLY HUNG YET
TAD I AXS2 /JOB OWNING PTR
CDF
ERROR /REPORT THE HUNG READER TO HIM/HER
HUNGDV
EXIT
PTRSET, 0
DATFLD
TAD PTRDEV /READER'S POSITION IN DEVTBL
DCA CONDBA
TAD PTRFL
JMS I SETFLG /SET JSPTR IN STR1
JMP I PTRSET
PTRCHK, DEVCHK
PTRIOT, UKT1
PSTRIN, UKREAD
PTRTIM, TIMPTR
RCNTA, RCNT
URCBI, -6017
PTRCLR, CLRBUF
PTRFUL, -240