diff --git a/tss8/rf.dsk b/tss8/rf.dsk new file mode 100644 index 0000000..b395eed Binary files /dev/null and b/tss8/rf.dsk differ diff --git a/tss8/rim.txt b/tss8/rim.txt new file mode 100644 index 0000000..1cae2da --- /dev/null +++ b/tss8/rim.txt @@ -0,0 +1,29 @@ +7756 6014 +7757 6011 +7760 5357 +7761 6016 +7762 7106 +7763 7006 +7764 7510 +7765 5374 +7766 7006 +7767 6011 +7770 5367 +7771 6016 +7772 7420 +7773 3776 +7774 3376 +7775 5357 +7776 0000 + +rf08 boot + +0000 +7750 +7600 +6603 +6622 +5352 +5752 +7750 + diff --git a/tss8/system/NOTES.txt b/tss8/system/NOTES.txt new file mode 100644 index 0000000..ce84a26 --- /dev/null +++ b/tss8/system/NOTES.txt @@ -0,0 +1,31 @@ +README + +fipb.pal +fipa.pal +fipc.pal + +inita.pal +initb.pal +initc.pal + +link.pal + +param.pal + +si.pal + +ts8a.pal +ts8b.pal +ts8c.pal +ts8d.pal +ts8e.pal +ts8f.pal + +---- + +si +fip +xddt? +ts8 +init +link diff --git a/tss8/system/README b/tss8/system/README new file mode 100644 index 0000000..f0b369e --- /dev/null +++ b/tss8/system/README @@ -0,0 +1,52 @@ +This directory contains the source code to the TSS/8.24 timesharing system +for the PDP-8. This copy comes from a source listing that I borrowed from +the Melrose (Mass.) High School in 1984, typed in to my PDP-8/E (which came +from the Belmont High School but ran Melrose H.S.'s monitor), and proofread. +Then I cleverly dumped it to TSS/8 PUTR DECtapes for "safekeeping", and it +took me over a decade to get around to extracting the data (on a PDP-11), +and three more years to get around to finishing reverse-engineering PUTR.SAV's +DECtape format! But here the files are, finally. + +This should be an almost 100% vanilla DEC source set, unless some typos +crept in. The only change I made was to fix comments that refer to the user +as "HIM" to say "HIM/HER". What can I say, I was going through a P.C. phase. +Also, I inadvertantly had EDIT.SAV set in the mode where it expands any two +spaces to a tab on input from a file, so some things look funny, like the +DEC copyright notice. The source for each 4 K component is broken into +pieces small enough to fit into the free space on my system's RF08/RS08 +disk when I was typing it in, they should be concatenated before actual use. + +This version is set up for an 8/E with 32 KW of core, one RF08/RS08 256 KW +disk unit, a PC8E/PC04 high speed paper tape reader/punch, an RK05, line +printer, card reader, and a bazillion KL8E terminals (I used an LC8E for K00, +which worked fine). It seems to be a good sport about running with missing +hardware (my machine had no RK05, LP, or card reader, and ran this monitor +fine), except the RF08 of course. + +There are lots of conditionals to tweak if you want to change the +configuration. Normally this was done by DEC, they'd rebuild it using +the PAL-10 cross-assembler on a TOPS-10 system and ship the binaries (and +maybe a hardcopy listing) to the customer. I'm not sure what needs to be +changed to make it build under PAL-8 on OS/8 but I've heard it's been done. +PAL-D (the TSS/8 assembler) doesn't support conditionals at all, so it +certainly couldn't be used... + +CPU=4 seems to be a valid setting for the CPU model, although its meaning +is not documented. Maybe it's for the PDP-8/A? + +The sources to SI (the System Interpreter, i.e. command line interface) were +typed in separately a few years later, I ran out of steam typing in the +original listing so I photocopied the SI part so I could return the listing. +SI was typed into an IBM PC so it doesn't have the problem with two blanks +being translated into a tab. Also, I split off the "parameters" and "linking" +sections into PARAM.PAL and LINK.PAL since it looks like they were constant +prefix files for assembling all five components, those parts should probably +be hacked off of the other sources so that one centralized file can adjust +each. + +Thank you very much to Bob McCann, who if I'm not mistaken was the person at +Melrose HS who loaned me the listing (in 1983 or 1984). And thank you to +Ron Diamond (who went to M.H.S.) for brainstorming about M.H.S. faculty to +remind me of Bob's name (sorry, it was a long time ago!). + +John Wilson , 18-May-2000. diff --git a/tss8/system/fipa.pal b/tss8/system/fipa.pal new file mode 100644 index 0000000..57bc1d9 --- /dev/null +++ b/tss8/system/fipa.pal @@ -0,0 +1,1195 @@ +/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 IF 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.) + /PARAMATERS 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 > +IFNZRO 24-JOBMAX&4000 +IFNZRO 23-KL8-PT08&4000 +IFNZRO 24-DC08A&4000 +IFZERO DC08A +IFNZRO DC08A < IFNZRO PHONES + IFZERO PHONES > +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 FOR NEW JOB +IFZERO RF08-40 < +IFZERO RS08-1 +IFZERO RS08-2 +IFZERO RS08-3 +IFZERO RS08-4 +DSKEXT= DSKSIZ-1> +IFZERO RF08 +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 /ERP DISC 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 < + +DBSZ= 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 +DCLR= 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= 40 /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 INTERPRETOR +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 +IFNZRO DC08A /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 +IFZERO EAE + IFZERO CPU&7776 > +IFNZRO OUTREG&1 + /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 (100MS) +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 I/O +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 + +/DEFINED IN SI: + +DTSIDT= 7270 /RETURN FROM STOPPING A DECTAPE ON TIMER +VERBRK= 7600 /START OF INSTALLATION DEFINED LOGIN MESSAGE + /FIP 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. + /FIP HANDLES ALL NON-RESIDENT FILE IOT'S + +/RUNS IN AN UPPER FIELD IN PLACE OF USER IT IS SERVING + +/RUNS IN EXEC MODE + +FIELD 1 /FIP LOADS ONTO DISK TRACK 1 + +*0 + JMP I .+1 + FIP0 +LNS01, LNS0 +RETBK1, RETBKS +LNK01, LNK0 +ZDS1, DS1 / + +*10 +INDEX, 0 /ONLY REGISTER AVAILABLE IN FIP FOR INDEXING +P5400, 5400 +P2000, 2000 +P0077, 0077 +P0007, 7 +FIDEXP, /TO REPLACE FIDEXP, FIPDEX WHERE FIPDEX=4 +P0004, 4 +FIPFLD, /FIELD WE ARE RUNNING IN +C0020, 20 +C002, +FILPRP, FILPRO + + +FIPDAT= 155 /DATA REFERENCED BY FIP +*FIPDAT + +FIPJOB, . +C0400, 400 +SEGSIZ= C0400 /# WORDS PER SEGMENT +FIBASE, SWDEX+JOBMAX /BASE ADDRESS OF ALLOCATABLE DISC STORAGE +JOB, . /# OF CURRENT JOB +JOBDAT, . /ADDRESS OF CURRENT JOB DATA LIST. MUST RESIDE IN DATA FIELD. +P7000, +CORTBA, CORTBL-1 /CORE ALLOCATION TABLE +DEVTBA, DEVTBL /DEVICE TABLE +DEVEND, DEVTBE /START OF ASSIGNABLE DEVICE TABLE +DSBUSY, . /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, . + 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 PRINITA +GETJT0, GETJTB /GET JOB DATA TABLE ADDRESS +GETJTA= JMS I GETJT0 +RETBA, RETB /RETURN BLOCK TO FREE STORAGE +RETBLK= JMS I RETBA +WAITA, WSCHED +WAIT= JMP I WAITA +DEVOVR, JOBTBL /END OF DEVICE TABLE; START OF JOB TABLE + +*20 +FIUSAC, 0 /SAVED USER AC +FIJOB, 0 /JOB NUMBER FILE PHANTOM IS REPRESENTING +FIOPTR, 0 /POINTER TO FIELD 0 IOT +GDRETP, 0 /RETRIEVAL POINTER, SET BY GD0 ROUTINE +WNDREM, 0 /REMAINDER FROM DIVISION BY 7 +BUFSTA, 0 /BUFFER STATUS, 7777 IF FULL +BUFMOD, 1 /BUFFER MODIFIED IF =0; UNCHANGED IF =1 +SATSTA, 0 /SATSTATUS, 7777 IF CHANGED THIS RUN +TABSTA, 0 /TABLE STATUS, 7777 IF CHANGED THIS RUN + +/POINTERS TO FILE PHANTOM'S INTERNAL TABLES + +JOBTAB, JTABLE /TABLE OF PROJ,PROG NUMBERS FOR ALL ACTIVE JOBS +ENTEND, /END OF ENTRY TABLE +UFDTBL, UTABLE /TABLE OF ALL ACCESSED UFD'S +UFDEND, /TOP OF UFD TABLE +RETTBL, RTABLE /TABLE OF RETRIEVAL INFORMATION FOR ALL ACCESSED UUFD'S +ENTTBL, ENTABL-10 /TABLE REFLECTING STATE OF ALL POSSIBLE FILE NUMBERS +BUFFER, 5400 /BUFFER FOR DIRECTORY MANIPULATIONS +SATBOT, -SATSIZ /BOTTOM OF STORAGE ALLOCATION TABLE + /SUBROUTINE POINTERS + +DE01, DE0 /GET A DIRECTORY ENTRY +DS01, DS0 /DIRECTORY SEARCH +GE01, GE0 /GET A DIRECTORY WORD INTO CORE +GD01, GD0 /GET A FILE DIRECTORY ENTRY INTO CORE +WRT1, WRITE /MAKE SURE THE BUFFER IS EMPTY +DTE01, DTE0 +FIO01, FIPIO /COMMON DISC I/O ROUTINE +SATL1, SATLOK /GET A FREE SEGMENT FROM SAT +TF01, TF0 /FREE AN ENTRY ON UFD TABLE +UC01, UC0 /USER-OWNER FILE CHECK +UFO01, UFO0 /OPEN A UFD +UTS01, UTS0 /SEARCH UFD TABLE FOR PROJ,PROG NUMBER +CL01, CL0 /CLOSE A FILE +WND201, WND20 /DIVIDE BY SEVEN +FIEXIT, FIX0 /EXIT ROUTINE +BLDP1, BLDP /BUILD A POINTER TO ENTTBL +ENR01, ENR0 +REL01, REL00 +WR01, WR0 +GTBLO1, GTBLOK +EBLD0, EBLD +JBLD0, JBLD +FIX401, FIX40 +IFN01, IFN0 +LGI201, LGI20 /-1 TO USER AC +FGETJT= JMS I . + FGETJ0 +DIRBAD, BADDIR + +/CONSTANTS + +C0006, 6 +C0200, 200 +P0037, 37 +P0003, 3 +P6000, 6000 +P0777, 777 +C0605, 6605 +C0005, 5 +C0603, 6603 +C7774, -4 +C4400, 4400 +C7771, 7771 +P7770, 7770 + CFLD= CDF 20 /FIP IS ALWAYS IN FIELD 2 +EXQ1, +UTPRNU, 0 /USED BY UTS0 ROUTINE TO HAVE THE PTR TO UFD TABLE WHILE SEARCHING +CFH, 0 /THIS LOCATION IS USED FOR TEMP STORAGE BY MANY ROUTINES +ACC01, ACT01 /SEE IF CALLING USER IS ACCOUNT 1 +BASCO1, BASCO0 /SEE IF THE FILE IS BASIC +BASSWT, 0 /SWITCH FOR BASIC +C0010, 10 +C7700, 7700 +BASWIN, WINBAS /FIELD 1 ADDRESS OF BASIC WINDOW +BAS1A, BAS0 /CREATES A BASIC WINDOW +SEGLIM, 0 +REWNDC, +REL6, 0 + + + +FIOSTK, 0 /STACK HOLDING IOT LINKAGE + 0 + 0 + 0 + 0 + 0 + 0 + 0 + +FLPARB, 0 /TABLE FOR READ OR WRITE PARAMETER CONSTRUCTION + 0 + 0 + 0 + 0 + 0 + OVERLA + 0 + +/ROUTINE TO RELEASE FREE BLOCK, (IF ANY), IF IT IS +/NECESSARY TO ABORT FIP FOR SOME REASON. +RETURN, TAD FIOSTK /GET THE IOT THAT BROUGHT US HERE + CMA /IS THERE A PARAMETER BLOCK? + AND C4010 + SZA CLA + JMP I FIEXIT /NONE, OK TO EXIT + DATFLD + TAD I FIOPTR /GET THE BLOCK + JMS I RETBK1 /RETURN IT SO IT WON'T BE LOST FOREVER + CLA + JMP I FIEXIT /NOW IT'S OK TO LEAVE + +C4010, 4010 /MASK FOR FINF AND WHO + /FILE PHANTOM START +/FIP'S FIRST JOB IS TO PICK UP THE IOT WHICH IT IS TO PERFORM +/AND THE PARAMETERS WHICH GO ALONG WITH IT (IF ANY). THESE +/ARE MOVED INTO AN 8-WORD BLOCK CALLED 'FIOSTK.' THE FIRST REG- +/ISTER IN THIS BLOCK CONTAINS THE IOT, PARAMETERS FOLLOW +*200 + +FIP0, CLL CLA IAC + DCA BUFMOD /MARK BUFFER AS NOT MODIFIED + DCA SATSTA /CLEAR SAT STATUS + DCA TABSTA /CLEAR TABLE STATUS + TAD BUFSTA /IS THERE VALID DATA IN THE BUFFER? + SZA CLA + IAC /YES; RE-CALCULATE DISK PARAMETERS IF NEEDED + DCA BUFSTA + 6201 /CDF FIELD ZERO + TAD I JOB /GLOBAL TO "JOB" + AND P0037 + DCA FIJOB /SAVE IT + CFLD + FGETJT /SAVE USER AC + JOBREG+2 + DCA FIUSAC /ADDRESS OF USER'S AC + FGETJT + JOBLNK /IOT REQUEST WORD + DCA FIOPTR /POINTER TO IOT LINKAGE + DATFLD + TAD I FIUSAC + DCA FIUSAC /USER'S AC + TAD I FIOPTR /PICK UP LINKAGE + AND IC7400 /IS IT AN IOT? (IF IT IS, JOBLNK WILL HAVE BITS 0-3 CLEARED) + SNA CLA + JMP FIP2 /IS AN IOT, SO GO MOVE IT INTO FIOSTK (AC IS PARAMETER) + TAD I FIOPTR /IS A POINTER, PICK UP LINKAGE + DCA FIP6 /POINTER TO LINKAGE TABLE + CFLD + 6202 /CIF FIELD 0 + BLT /MOVE IOT PARAMETERS INTO FIOSTK + DATFLD +FIP6, 0 + 6221 /CDF THIS FIELD + FIOSTK /IOT LINKAGE BUFFER + -10 + TAD FIOSTK + SPA CLA /WILL THE IOT PARAMETER BLOCK BE NEEDED TO RETURN PARS? + JMP FIP4 /YES, SO DON'T RETURN IT + TAD FIP6 + JMS I RETBK1 /RETURN THE IOT PARAMETER BLOCK TO FREE CORE + CLA CLL + DATFLD + DCA I FIOPTR /CLEAR JOBLNK TO AVOID CONFUSION LATER + CFLD + /COMES HERE WHEN IOT AND ITS PARAMETERS ARE COMFORTABLY +/NESTLED IN FIOSTK +FIP4, TAD IOTABL + DCA FITPTR /TABLE POINTER +FIP5, ISZ FITPTR /PICK UP IOT FROM TABLE + TAD I FITPTR + SNA /END OF TABLE? + JMP I LGI201 /DON'T KNOW WHAT TO DO SO PASS BACK AN ERROR AT LEAST + CIA /NO + TAD FIOSTK /IOT FROM USER + SZA CLA /DISPATCH? + JMP FIP5 /NO + TAD IOTABL /YES, FIND PROPER POINTER + CIA + TAD FITPTR + TAD IODSPA + DCA FITPTR + TAD I FITPTR /PICK UP DISPATCH ADDRESS + DCA FITPTR + TAD FIOSTK /IS THIS AN IOT WHICH DOES REQUIRE PARAMETERS TO BE + /RETURNED IN AN IOT PARAMETER BLOCK? + SMA CLA /...IF SO, USER AC CONTAINS A PTR TO WHERE THEY WILL GO + DCA FIUSAC /CLEAR USER AC + JMP I FITPTR /DISPATCH + +/COMES HERE FOR A "SHORT" IOT. SAVED AC IS ONLY PARAMETER +/PUT IT IN FIOSTK+1 +FIP2, TAD I FIOPTR /PICK UP IOT + DCA FIOSTK /PLACE ON STACK + TAD FIUSAC /USER ACCUMULATOR + DCA FIOSTK+1 /SIMULATE LINKAGE + JMP FIP4-2 + IOTABL, . /TABLE OF USER FILE IOT'S + ASD /ASSIGN A DEVICE + REL /RELEASE A DEVICE + REN /RENAME A FILE + OPEN /OPEN A FILE + CLOS /CLOSE A FILE + RFILE /FILE READ (WINDOW MOVE) + PROT /FILE PROTECTION + WFILE /FILE WRITE (WINDOW MOVE) + CRF /CREATE A FILE + EXT /EXTEND A FILE + RED /REDUCE A FILE + FINF /FILE INFORMATION + LIN /LOGIN + LOUT /LOGOUT + WHO /RETURN PASSWORD + SEGS /RETURN # OF DISK SEGMENTS AVAILABLE + 0 + +IODSPA, IODISP-1 +FITPTR, 0 +IC7400, 7400 + /ROUTINE TO GET A DIRECTORY ENTRY INTO CORE + +/CALLING SEQUENCE: +/ TAD (INTERNAL FILE NUMBER) +/ JMS GD0 +/ RETURN (BUFFER POINTER IN AC, 0=ERROR) + +GD0, 0 + JMS I EBLD0 + DCA GDUFDP + TAD I GDUFDP /RELATIVE POSITION IN UFD TABLE + JMS I BLDP1 + DCA GDRETP /POINTER TO UFD RETRIEVAL INFORMATION + ISZ GDUFDP + TAD I GDUFDP /PICK UP ENTRY ADDRESS WITHIN UFD + DCA GD1 + TAD GDRETP + JMS I GE01 /GET ENTRY INTO CORE +GD1, 0 + JMP I GD0 +GDUFDP, 0 + +IFN0, 0 + TAD FIOSTK+1 + AND P0003 + DCA FIOSTK+1 + JMP I IFN0 + +EBLD, 0 + DCA CFH + TAD FIJOB + CLL RTL + TAD CFH + RAL + TAD ENTTBL + JMP I EBLD + +WR0, 0 /WRITE OUT THE CONTENTS OF THE BUFFER + TAD C0605 /WRITE IOT + DCA FLPARB /I/O PARAMETER BLOCK + JMS I FIO01 /PERFORM THE WRITE + HLT /ERROR ON WRITE, TOO BAD + CLA IAC + DCA BUFMOD /SET NOT-MODIFIED STATUS + JMP I WR0 + /ROUTINE TO OPEN A FILE + +OPN0, JMS I BASCO1 /IF BASIC SET BASSWT TO -1 + DCA OPENTT /PTR TO ENTTBL + JMS I JBLD0 /PROJ PROG # OF THIS JOB IN AC + DCA PRJPRO /SAVE PROJ, PROG # + TAD FIOSTK+2 + SNA /IF [S]HE OWNS THE FILE THEN FIOSTK+2 IS 0 + JMP OPNOWN /YES, [S]HE DOES + CIA + TAD PRJPRO /IF [S]HE HAS MENTIONED THE PROJ, PROG # + SNA CLA /CHECK IF [S]HE IS THE OWNER + JMP OPNOWN + STA + TAD FIOSTK+2 /TRYING TO OPEN ACCOUNT 1 FILE? + SZA CLA + JMP .+6 /NO, OK + TAD FIOSTK+3 /WHOSE UFD? + CIA + TAD PRJPRO /HIS/HER OWN? + SZA CLA + JMP OPN3 /NO, TELL HIM/HER FILE NOT FOUND + TAD FIOSTK+2 + AND C7700 /TAKE OUT JUST THE PROJ # OF THE FILE + CIA + TAD PRJPRO /DOES IT AGREE WITH JOB'S PROJ #? + AND C7700 + SNA CLA + TAD P0003 /4 IN AC SAME PROJ # + CLL IAC /1 IN AC DIFF PROJ # + JMP .+4 +OPNOWN, TAD PRJPRO + DCA FIOSTK+2 + TAD C0010 /10 IN AC IF [S]HE OWNS THE FILE + DCA PRJPRO /STORE PROTECTIVE BITS FOR READ CASE + TAD FIOSTK+2 /PICK UP THE PROJ PROG # OF THE FILE + JMS I UTS01 /SEARCH OPEN UFD TABLE RETURN WITH PTR IN AC + JMP OPN6 /UFD NOT OPEN, GO OPEN IT +OPN2, DCA I OPENTT /SAVE ITS RELATIVE PTR IN ENTTBL + TAD I OPENTT /GET RELATIVE ADDRESS OF UFD TBL + JMS I BLDP1 /BUILD A PTR TO RETTBL ENTRY + DCA FIOSTK+2 /SAVE IT + JMS I DS01 /3 WORD SEARCH + FIOSTK+2 + JMP OPN3 /NO SUCH FILE + TAD P0007 /PTR TO RETRIEVAL ENTRY IN BUFFER + DCA OPBUFP + ISZ OPENTT + TAD I ZDS1 /GET THIS FILE'S DIRECTORY ADDRESS + DCA I OPENTT /SAVE IN SECOND WORD OF ENTTBL ENTRY + CLL CMA RTL /-3 IN AC + TAD OPBUFP /PTR TO PROTECTION BIT + JMS I OPN11A /CHECK PROTECTION OF THE FILE +PRJPRO, 0 + TAD I OPBUFP /ADD POINTER TO FIRST RETRIEVAL WINDOW AND + DCA PRJPRO /SAVE WITH PROTECTION BIT + TAD OPNFI0 /JOB STATUS WORD FILE FOR FILE 0 + TAD FIOSTK+1 + DCA OPACSC /FOR LINKING A BLOCK + TAD I OPBUFP /GET RETRIEVAL WINDOW + DCA OPBUFP /SAVE IT + TAD FIOSTK+2 + JMS I GE01 /GET RETRIEVAL WINDOW IN CORE +OPBUFP, 0 + DCA OPENTT /SAVE THE BUFFER ADDRESS + FGETJT /GET THE ADDRESS OF JOB STATUS FOR THIS FILE +OPACSC, 0 + DCA OPACSC /SAVE POINTER + TAD OPACSC + JMS I GTBLO1 /GET A BLOCK LINKED FOR FILE CONTROL + JMP OPNOT /NO FREE CORE; CAN'T OPEN THEN + DCA OPBUFP /SAVE IT TO BUILD THE FILE CONTROL BLOCK + ISZ BASSWT + JMP OPN123 + TAD I BASWIN /IS BASIC WINDOW ALREADY SET UP? + IAC + SNA CLA /YES THEN HAS -1 + JMP OPRET1 /BASIC WINDOW ALREADY LOADED + TAD OPENTT /BUFFER ADDRESS OF THE WINDOW + JMS I BAS1A /CREATE BASIC WINDOW +OPRET1, TAD BASWIN /PUT BASIC WINDOW POINTER IN CONTROL BLOCK + DCA I OPBUFP +OPRET, CFLD + CLA CMA /ACCESS COUNT IN UFDTBL + TAD I UTPRNU /INCREASE BY -1 + DCA I UTPRNU + DATFLD + ISZ OPBUFP + ISZ OPBUFP /POINTS TO PROTECTION BIT + TAD PRJPRO + DCA I CPBUFP /PUT IN THE WRITE PROT BIT CREATED BEFOREHAND + JMP I .+1 /EXIT AND WRITE OUT TABLES + TABOUT + +OPN123, TAD OPBUFP /LINK A BLOCK + JMS I GTBLO1 + JMP OPN4 /NO FREE CORE, CAN'T OPEN + DCA OPENTU + CFLD + CIF + BLT + CFLD /SOURCE +OPENTT, 0 + DATFLD +OPENTU, 0 + -10 + JMP OPRET + OPN5, SNA /DID THE ACCOUNT EXIST? + JMP OPNOT /YES; LACK OF ROOM IN UFDTBL +OPN3, STL CLA RTR /NOT FOUND ERROR +OPNPRE, TAD P2000 /PROTECTED + TAD P2000 +OPNOT, CLL CML RAR /NOT OPEN, LACK OF SYSTEM RESOURCES + DCA FIUSAC + TAD FIOSTK+1 + JMS I EBLD0 /BE SURE TO REMOVE ALL THE POINTERS PUT IN BY OPEN + DCA OPENTT + DCA I OPENTT + JMP I FIEXIT + +OPN4, TAD I OPACSC /CONTROL BLOCK ADDR + JMS I RETBK1 /RETURN IT + DATFLD + DCA I OPACSC /CLEAR POINTER FROM JOB BLOCKS + CFLD + JMP OPNOT /TELL HIM/HER WE COULDN'T OPEN + +OPN6, TAD FIOSTK+2 /PICK UP PROJ PROG # + JMS I UFO01 /OPEN UFD + JMP OPN5 /NO LUCK, ERROR + JMP OPN2 /OPENED RELATIVE POSITION IN AC + + +OPNFI0, JOBF0 +OPN11A, OPN11 + + + +/ROUTINE TO CLOSE A FILE + +*600 + +CLS0, DCA CLSIFN /INTERNAL FILE NUMBER + TAD C7774 + DCA CLCNTR /COUNTER FOR BIT SCAN +CLS1, TAD FIOSTK+1 /PICK UP BIT PATTERN + RAL + DCA FIOSTK+1 + SZL + JMP CLS3 +CLS2, ISZ CLSIFN /NEXT FILE NUMBER + ISZ CLCNTR /DONE ALL FOUR? + JMP CLS1 /NO, KEEP AT IT + JMP I FIEXIT /THROUGH +CLS3, TAD CLSIFN /PICK UP INTERNAL FILE NUMBER + JMS CL0 /CLOSE THE FILE + JMP CLS2 /LOOK FOR MORE + +CLSIFN, 0 +CLCNTR, 0 + +/ROUTINE TO DO ACTUAL FILE CLOSE +CL0, 0 + JMS I EBLD0 + DCA CLENTP + TAD CFH + JMS I LNK01 /RETURNS WITH PTR TO FILE CONTROL BLOCK FROM JOB STATUS BLOCK + SNA + JMP CL3 /FILE WAS NOT OPEN + DCA CLPARP /SAVE IT + DCA I CFH /CLEAR POINTER TO FILE CONTROL BLOCK --- INDICATES FILE CLOSED + CFLD /SET DATA FIELD TO THIS FIELD + TAD CLPARP /POINTER TO PARAMETER BLOCK + JMS I CLOBA /PROPERLY CLOSE TESTING FOR BASIC + DCA CLO3 /SWITCH SET TO -1 IF BASIC FILE + CLA CMA CLL + TAD I CLENTP /RELATIVE POINTER TO UFD RETRIEVAL TABLE + CLL RTL + IAC + TAD UFDTBL + DCA CLUFDP /POINTER TO ACCESS COUNTER + DCA I CLENTP /CLEAR PTR IN ENTTBL TO INDICATE FILE IS CLOSED + CLA CMA + DCA TABSTA /SET TABLE STATUS TO WRITE OUT + ISZ I CLUFDP /REMOVE THIS JOB FROM ACCESS COUNT IN UFDTBL + JMP I CL0 + /THIS WAS THE ONLY GUY USING THIS UFD, SO CLOSE IT OUT + ISZ CLO3 /IS IT BASIC FILE BEING CLOSED? + JMP CL11 /NO, PROCEED FURTHER + DATFLD /YES, JUST ZERO ONE LOC IN FIELD 1 + DCA I BASWIN + CFLD +CL11, CLA CMA /NO ONE IS NOW ACCESSING THIS UFD + TAD CLUFDP + JMS I TF01 /FREE A TABLE ENTRY +CL3, CFLD + JMP I CL0 + +CLOBA, CLOBAS +CLPARP, 0 +CLENTP, 0 +CLUFDP, 0 + +/SKIPS IF NO OTHER USER IS ACCESSING THIS FILE +ENR0, 0 + TAD FIOSTK+1 + JMS I EBLD0 + DCA ENR1 /PTR INTO ENTTBL + ISZ ENR1 + TAD I ENR1 /GET ADDR IN ENTTBL + DCA ENR1 + TAD GDRETP /RTABLE + JMS I ENS01 /HOW MANY PEOPLE HAVE THIS FILE OPEN? +ENR1, 0 + SKP /FOUND THE SAME FILE OPEN + ISZ ENR0 /...ONLY ONE WHO HAS IT OPEN + JMP I ENR0 + +ENS01, ENS0 + +/CHANGE THE PROTECTION OF A FILE + +PRT0, TAD FIOSTK+1 /PICK UP INTERNAL FILE NUMBER + RTR + RTR + RAR + AND P0003 /AND OFF PROTECTION BITS + DCA PRIFNU /INTERNAL FILE NUMBER + TAD PRIFNU + JMS I UC01 /CHECK TO SEE IF USER IS OWNER + JMP PRT1 /ERROR RETURN, USER IS NOT OWNER + JMS I ACC01 /IS [S]HE UNDER ACCOUNT 1? + JMP PRT1+1 /YES; ERROR - [S]HE MUST USE #RENAME# + TAD PRIFNU + JMS I GD01 /GET THIS DIRECTORY ENTRY INTO CORE + SNA + JMP I DIRBAD /**************DEBUG************* + TAD P0004 + DCA PRENTP /POINTER TO PROTECTION BITS OF THIS FILE + TAD C7637 + AND FIOSTK+1 /PICK UP NEW PROTECTION BITS + DCA I PRENTP /RESTORE + DCA BUFMOD /SCHEDULE WRITE + JMP I FIEXIT + +PRT1, SZA CLA /ERROR + CLL CML RAR + CLL CML RAR + DCA FIUSAC + JMP I FIEXIT + +CLO3, +PRIFNU, 0 +PRENTP, 0 +C7637, 7637 + + +WHO0, JMS I JBLD0 + DCA PAS1 + CMA /ONE WORD SEARCH + JMS I DS01 /SEARCH THE MFD FOR THIS ACC'T # + PAS0 + JMP I DIRBAD /************DEBUG ONLY*********** + DCA PAS1 + TAD I PAS1 /GET ACC'T # FROM UFD FILE NAME BLOCK + ISZ PAS1 + DCA FIOSTK+1 /STORE ACC'T # + TAD I PAS1 + ISZ PAS1 + DCA FIOSTK+2 /STORE FIRST TWO CHRS OF PASSWORD + TAD I PAS1 + DCA FIOSTK+3 /STORE LAST TWO CHARS OF PASSWORD + JMP I PAINF5 /GO STORE THIS INFORMATION FOR RETURN TO MONITOR + +PAINF5, INF5 +PAS0, RTABLE +PAS1, +JBLD, 0 + TAD FIJOB + TAD JOBTAB + CFLD + DCA CFH + TAD I CFH + JMP I JBLD + +/ROUTINE TO MOVE THE RETRIEVAL WINDOW IN FIELD ZERO +*1000 + +WND0, TAD FIOSTK+2 /PICK UP INTERNAL FILE NUMBER + AND P0003 /AND OFF FIELD BITS + JMS I EBLD0 + DCA WNENTP /POINTER TO RETRIEVAL INFORMATION POINTER + TAD I WNENTP + JMS I BLDP1 /GENERATE ABSOLUTE PTR INTO RETTBL + DCA WNRETP /RETRIEVAL POINTER + TAD FIOSTK+7 + DCA WNFCBP /PTR TO THIS FILE'S FILE CONTROL BLOCK + TAD FIOSTK+5 + DCA WND5 /LOW ORDER DISK ADDRESS + DCA WNDCNT /GET INTO CORE + TAD WNDCCT /INITIALIZE COUNT + DCA WNDSCT + TAD C0177 + AND FIOSTK+1 /GET HIGH ORDER FILE ADDRESS + DCA WNDIRP + TAD SEGSIZ /GET RID OF ADDRESS WITHIN SEGMENT + CLL CIA + AND WND5 + RAL + TAD WNDIRP /NOW HAVE FILE SEGMENT #; NEED TO SHIFT IT + SKP + RAL + ISZ WNDSCT /SHIFT SEGCCT TIMES? + JMP .-2 + DCA WNSEGC + DATFLD /WNSEGC NOW HAS SEGMENT NUMBER TO GET + TAD I WNFCBP /PICK UP FIELD 0 WINDOW POINTER + DCA WNDPTR /PNTS TO FILE RETRIEVAL WINDOW FOR THIS FILE + ISZ WNFCBP + TAD I WNFCBP /PICK UP NUMBER OF CURRENT SEGMENT IN WINDOW + DCA WNCURS /CURRENT SEGMENT IN WINDOW + TAD WNSEGC /SEGMENT TO GET + JMS I WND201 /DIVIDE BY 7 (IGNORE REMAINDER) + JMS WND30 /MULTIPLY BY 7 + DCA WNSEGC /FIRST SEGMENT IN PROPER WINDOW + CLA CMA + TAD I WNDPTR /GET FIRST WORD OF FILE RETRIEVAL WINDOW + SNA CLA /=7777? + JMP WND6 /INVALID WINDOW POINTER + TAD WNCURS /CURRENT SEGMENT AT TOP OF CURRENT CORE WINDOW + CIA + \ No newline at end of file diff --git a/tss8/system/fipb.pal b/tss8/system/fipb.pal new file mode 100644 index 0000000..1a7de02 --- /dev/null +++ b/tss8/system/fipb.pal @@ -0,0 +1,1268 @@ +/NOW SEE IF THE SEGMENT BEING SOUGHT IS ONE WHICH FOLLOWS +/THOSE WHICH ARE PRESENTLY IN THE CORE WINDOW. IF THE +/SOUGHT BLOCK DOES FOLLOW THE PRESENT ONE, WE CAN LOOK +/THROUGH THE RETRIEVAL INFORMATION BLOCKS STARTING AT THE ONE +/NOW IN CORE. OTHERWISE, WE MUST START AT THE VERY BEGINNING +/OF THE LIST OF FILE RETRIEVAL INFORMATION BLOCKS + TAD WNSEGC + SPA SNA + JMP WND6 /PREVIOUS BLOCK, SO MUST START AT BEGINNING OF STRING + JMS I WND201 /DIVIDE BY 7 + CIA + DCA WNDCNT /MOVE FORWARD THIS MANY WINDOWS + TAD WNDPTR +WND10, DCA WNDIRP + TAD I WNDIRP /PICK UP ADDRESS OF NEXT WINDOW + CFLD /CHANGE TO CURRENT FIELD + SNA + JMP WND13 /END OF STRING + DCA WND11 + TAD WNRETP /POINTER TO UFD RETRIEVAL INFORMATION + JMS I GE01 /GET ENTRY INTO CORE +WND11, 0 + ISZ WNDCNT /HAVE WE MOVED AHEAD ENOUGH BLOCKS? + JMP WND10 /NOT PROPER WINDOW, KEEP LOOKING + DCA WNDIRP +WND13, 6202 /CIF FIELD 0 + BLT + 6221 /SOURCE FIELD (ALWAYS 2) +WNDIRP, 0 /SOURCE + DATFLD /DESTINATION FIELD +WNDPTR, 0 /DESTINATION + -10 /WORD COUNT + TAD WNDCNT /CORRECT FOR WINDOWS THAT WEREN'T THERE + JMS WND30 /MULTIPLY BY 7 + TAD WNSEGC /SEGMENT NUMBER OF FIRST IN WINDOW + DATFLD + DCA I WNFCBP /FILE CONTROL BLOCK POINTER + ISZ WNFCBP /POINT AT PROTECTION WORD IN CONTROL BLOCK + TAD I WNFCBP /GET CURRENT STATUS + AND P0007 /SAVE ONLY STATUS BITS + TAD WND11 /ADD IN POINTER TO CURRENT RETRIEVAL WINDOW + DCA I WNFCBP /AND SAVE + JMP I .+1 /GO SET #JSIOTC# BEFORE EXITING + INF6 + +WND6, CFLD /CHANGE TO CURRENT FIELD + CLA CLL + TAD WNSEGC /SEGMENT TO GET INTO IN CORE WINDOW + JMS I WND201 /DIVIDE BY 7 + CMA + DCA WNDCNT /WINDOW NUMBER TO GET INTO CORE + ISZ WNENTP + TAD I WNENTP /UFD ENTRY ADDRESS OF OPEN FILE + DCA WND5 + TAD WNRETP /RETRIEVAL INFORMATION POINTER + JMS I GE01 /GET ENTRY INTO CORE +WND5, 0 + TAD P0007 + JMP WND10 + +/ROUTINE TO MULTIPLY A NUMBER BY 7 + +WNDSCT, +WND30, 0 + DCA CFH + TAD CFH + CLL RAL + TAD CFH + CLL RAL + TAD CFH + JMP I WND30 + +WNFCBP, 0 +WNENTP, 0 +WNRETP, 0 +WNDCNT, 0 +WNSEGC, 0 +WNDCCT, 7773 +WNCURS, 0 +C0177, 177 + + +IODISP, + ASD1 + REL1 + REN0 + OPN0 + CLS0 + WND0 + PRT0 + WND0 + CRF0 + EXT0 + RED0 + INF0 + LGI0 + LGO0 + WHO0 + SEGS0 + +*1200 + +/ROUTINE TO CREATE A NEW FILE + +CRF0, TAD FIOSTK+1 + SNA CLA + JMP CRF30 + JMS I JBLD0 + JMS I UTS01 /SEARCH THE UFD TABLE + JMP I DIRBAD /***************DEBUG************** + JMS I BLDP1 /BUILD A PTR TO RETTBL + DCA FIOSTK /MAKE A LINKAGE FOR DIRECTORY SEARCH + JMS I ACC01 /IS IT ACCOUNT 1? + CMA /YES; MAKE IT A ONE WORD SEARCH + JMS I DS01 /SEARCH THE DIRECTORY FOR THIS NAME + FIOSTK /POINTER TO SEARCH PARAMETERS + JMP CRF2 /COULD NOT FIND THIS NAME, CONTINUE + DCA CRBUFP /FOUND A FILE OF THIS NAME IN UFD. PTR INTO CRBUFP + JMS I ACC01 /SEE IF THIS IS ACCOUNT 1 + JMP CRF30 /CAN'T DELETE UFD'S AS THOUGH THEY ARE FILES + TAD I ZDS1 /POINTER TO "DS1"=ADDR WITHIN UFD WHERE THIS FILE NAME'S BLOCK IS + DCA CRF11 /UFD ADDRESS OF DIRECTORY ENTRY + TAD FIOSTK + JMS I CRENS /SEARCH ENT TABLE FOR ACCESSES TO THIS FILE +CRF11, 0 /UFD ADDR OF DIRECTORY ENTRY + JMP CRF10 /ERROR, FILE IS OPEN +/COMES HERE IF A FILE BY THIS NAME ALREADY EXISTS, BUT NO ONE HAS OPENED IT + TAD CRF11 + DCA I CRGD11 /GD1 + TAD FIOSTK + DCA GDRETP + TAD CRBUFP /PTR TO WHERE IN CORE BUFFER THE UFD BLOCK FOR THIS FILE IS + JMS I SAVCRA /DELETE THE EXISTING FILE OF THIS NAME + JMS I DS01 /SEARCH THE UFD FOR AN EXISTING FILE OF THE SAME NAME + FIOSTK + SKP /NONE THERE, SO OKAY TO CREATE ONE + JMP I DIRBAD /**************DEBUG ONLY********** + /NOW ALL SET TO CREATE THE FILE. TO DO THIS, WE NEED TWO BLOCKS OF +/THE UFD -- ONE FOR A NAME BLOCK AND THE SECOND FOR A FILE RETRIEVAL INFORMATION +/BLOCK. THESE BLOCKS ARE OBTAINED BY TWO CALLS TO DE0. AFTER THE FIRST, +/A DUMMY 7777 IS PUT IN THE FOUND BLOCK TO PREVENT THE SECOND CALL +/TO DE0 FROM FINDING THE SAME BLOCK. IF BOTH BLOCKS CANNOT BE OBTAINED, +/THE CREATE CANNOT BE EXECUTED. +CRF2, DCA CRLINK /ADDR OF LINK WORD OF LAST ENTRY IN UFD CHAIN + ISZ UTPRNU /POINTS AT LOGIN DISK QUOTA + TAD I UTPRNU /-SEGMENTS ALLOWED WHILE LOGGED IN + TAD SEGLIM /PLUS NUMBER OF SEGMENTS FOUND WHILE SEARCHING HIS/HER DIRECTORY + ISZ UTPRNU /POINT AT HOLD REG FOR SEGMENT COUNT + SMA CLA /IS [S]HE ALLOWED ONE MORE? + JMP CRF1 /NO; TELL HIM/HER DIRECTORY FULL + TAD FIOSTK /POINTER TO RETRIEVAL INFORMATION + JMS I DE01 /FIND AN EMPTY DIRECTORY ENTRY + JMP CRF1 /ERROR, NO AVAILABLE ENTRIES + DCA CRF4 /ADDRESS OF THIS ENTRY + JMS CRF40 /GET THIS ENTRY INTO CORE + CLA CMA + DCA I CRBUFP /SIMULATE A USED ENTRY + DCA BUFMOD /SCHEDULE WRITE + TAD FIOSTK + JMS I DE01 /FIND ANOTHER ENTRY + JMP CRF51 /ERROR + DCA CRF3 + TAD FIOSTK + JMS I GE01 /MAKE SURE SECOND ENTRY IS IN CORE +CRF3, 0 + DCA INDEX + JMS I SATL1 /FIND A FREE SEGMENT IN THE SAT + SNA + JMP CRF20 /COULD NOT FIND A FREE SEGMENT + /AT THIS POINT, WE HAVE A DISC SEGMENT AND TWO BLOCKS FROM THE +/UFD. THIS IS ALL THAT IS NEEDED, SO GO AHEAD AND EXECUTE THE CREATE + DCA CRF11 /SAVE SEGMENT NUMBER + TAD CRF11 + DCA I INDEX /PUT IT IN THE FIRST BLOCK OF RETRIEVAL + DCA BUFMOD /SCHEDULE WRITE + JMS CRF40 /GET FIRST FOUND ENTRY INTO CORE + TAD FIOSTK+1 /TRANSFER FILE NAME INTO DIRECTORY ENTRY + DCA I CRBUFP + TAD CRBUFP /MOVE POINTER TO AUTO-INDEX + DCA INDEX + TAD FIOSTK+2 + DCA I INDEX + TAD FIOSTK+3 + DCA I INDEX + DCA I INDEX /ZERO LINK (THIS IS THE LAST FILE) + TAD CRPROT /PICK UP PROTECTION BITS + DCA I INDEX /STORE INITIAL PROTECTION CODE + JMS I CRFUFA /GO SEE IF WE'RE CREATING A NEW ACCOUNT + CDF /CDF FIELD 0 + TAD I DATE /GLOBAL TO DATE + CFLD /CHANGE TO CURRENT FIELD +CRFUFR, DCA I INDEX /STORE DATE OF CREATION + TAD CRF3 /POINTER TO RETRIEVAL + DCA I INDEX /SET UP PTR TO RETRIEVAL INFORMATION + DCA BUFMOD /SCHEDULE WRITE + TAD FIOSTK /GET LAST ENTRY ON STRING INTO CORE + JMS I GE01 +CRLINK, 0 + DCA CRBUFP /PTR TO WHERE THE PRESENT LAST ENTRY IS + TAD CRF4 + DCA I CRBUFP + DCA BUFMOD /SCHEDULE WRITE + JMS I ACC01 /IS [S]HE CREATING A NEW UFD? + JMP CRFUFZ /YES + IAC +CRFSEG, TAD SEGLIM /STORE SEGMENT COUNT IN THE UFDTBL + DCA I UTPRNU + JMP I .+1 /REMEMBER TO WRITE OUT THE TABLES + TABOUT + +CRFUFZ, TAD CRF11 + JMS I SCL01 /WRITE OUT DIRECTORY BLOCK & CLEAR NEW UFD BLBOCK + JMP I FIEXIT /DON'T MODIFY THE MFD'S ENTRY IN THE UFDTBL + CRF20, STL RTR /DISK FULL + STL RTR + DCA FIUSAC /SAVE PARTIAL ERROR CODE +CRF51, JMS CRF40 /GET FIRST ENTRY BACK AGAIN + DCA I CRBUFP /ZERO OUT THE -1 WE PUT THERE + DCA BUFMOD /SCHEDULE WRITE +CRF1, CLA CLL CML RTR + CLL CML RAR + TAD FIUSAC /GET PARTIAL ERROR CODE + DCA FIUSAC /SAVE ERROR CODE; EITHER DISK FULL OR DIRECTORY FULL + JMP CRFSEG /GO SAVE SEGMENT COUNT ANYWAY +CRF30, CLA CLL CML RTR +CRF10, TAD C4400 + DCA FIUSAC /SAVE ERROR CODE; EITHER FILE IN USE OR BAD FILE NAME + JMP I FIEXIT + +CRF40, 0 + TAD FIOSTK + JMS I GE01 +CRF4, 0 + DCA CRBUFP + JMP I CRF40 + + +CRPROT, 12 +CRGD11, GD1 +CRENS, ENS0 +SAVCRA, SAVCRE +SCL01, SCL0 +CRFUFA, CRFUFD +CRBUFP, 0 + /ROUTINE TO EXTEND A FILE + +*1400 + +EXT0, JMS EXT1 /MAKE SURE IT'S OKAY TO EXTEND THIS FILE + TAD P0007 /...EXT1 RETURNS WITH PTR TO NAME BLOCK FOR THIS FILE + DCA EXBUFP /SAVE POINTER TO RETRIEVAL CHAIN + JMS I EXTQUA /CHECK THE DISK QUOTA FOR THIS USER +/NOW TRACE THROUGH TO LAST RETRIEVAL INFORMATION BLOCK FOR THIS FILE +EXT4, TAD I EXBUFP + SNA /END OF CHAIN? + JMP EXT3 /YES + DCA EXWNDP /WINDOW POINTER + TAD EXWNDP + JMS EXGE0 /GET WINDOW INTO CORE + DCA EXBUFP /SAVE POINTER TO NEXT RETRIEVAL WINDOW + JMP EXT4 /KEEP LOOKING FOR END + +EXT3, TAD C7771 + DCA EXT1 /7 SEGS PER WINDOW +EXT5, ISZ EXBUFP + TAD I EXBUFP /PICK UP ENTRY IN WINDOW + SNA CLA /IS IT THE FIRST FREE? + JMP EXT7 /YES, FIND A SEGMENT + ISZ EXT1 /END OF WINDOW? + JMP EXT5 /NO, KEEP LOOKING +EXT9, TAD GDRETP /RETRIEVAL POINTER + JMS I DE01 /FIND AN EMPTY ENTRY + JMP EXT20 /PARTIALLY SATISFIED + DCA EXNFRE /FREE SEGMENT ADDRESS + TAD EXWNDP /CURRENT WINDOW POINTER + JMS EXGE0 /GET IT INTO CORE + DCA EXBUFP + JMS I SATL1 /GET A FREE DISK SEGMENT FOR THE NEXT WINDOW + SNA + JMP EXT20 /THERE ARE NONE; AVOID LINKING TO NEXT WINDOW + DCA EXPROP /SAVE UNTIL WINDOWS ARE LINKED UP + TAD EXNFRE /NEXT FREE WINDOW + DCA I DXBUFP /LINK IT ONTO CHAIN + DCA BUFMOD /SCHEDULE WRITE + TAD EXNFRE + DCA EXWNDP /UPDATE CURRENT WINDOW POINTER + TAD EXWNDP + JMS EXGE0 /GET NEW WINDOW INTO CORE + IAC + DCA EXBUFP /POINTER TO FIRST ENTRY OF NEW WINDOW + TAD C7771 /ALLOW 7 ENTRIES IN NEW WINDOW + DCA EXT1 + TAD EXPROP /GET DISK SEGMENT + EXT12, DCA I EXBUFP /STORE SEGMENT IN RETRIEVAL WINDOW + DCA BUFMOD /SCHEDULE WRITE + ISZ I EXQ1 /INCREMENT TOTAL COUNT IN UFDTBL + ISZ EXBUFP /INCR WINDOW POINTER + ISZ EXSEGC /HAVE WE EXTENDED FAR ENOUGH? + JMP EXT6 /NO +EXT20, TAD EXSEGC + CIA + DCA FIUSAC /NUMBER OF SEGMENTS WE FAILED TO FIND + TAD FIOSTK+1 /REQUEST IS SATISFIED + JMS I GD01 /GET DIRECTORY ENTRY INTO CORE + TAD C0005 + DCA EXBUFP /POINTER TO SEGMENT COUNT + TAD FIOSTK+2 /NUMBER OF WORDS TO BE ADDED + TAD I EXBUFP /NUMBER ALREADY IN FILE + TAD EXSEGC /MINUS NUMBER WE FAILED TO GET + DCA I EXBUFP /UPDATE ENTRY + DCA BUFMOD /SCHEDULE WRITE + JMP I .+1 /EXIT AND WRITE OUT TABLES + TABOUT + +EXT6, ISZ EXT1 /END OF CURRENT WINDOW? + SKP /NOT YET + JMP EXT9 /YES, TRY LINKING TO ANOTHER +EXT7, JMS I SATL1 /GET A FREE SEGMENT FROM SAT + SNA + JMP EXT20 /PARTIALLY SATISFIED + JMP EXT12 /SAVE NEW SEGMENT +EXGE0, 0 /GET WORD OF THIS UFD INTO CORE + DCA EXGE1 + TAD GDRETP + JMS I GE01 +EXGE1, 0 + JMP I EXGE0 + +EXT30, TAD C4400 + JMP EXT10+2 + +EXT10, CLL CML RAR + CLL CML RAR + DCA FIUSAC + JMP I FIEXIT + +EXTQUA, EXTQU0 +EXFCBP, 0 +EXPROP, 0 +EXBUFP, 0 +EXWNDP, 0 +EXSEGC, 0 +EXNFRE, 0 + /ROUTINE TO SET UP TO ALTER A FILE (BY EITHER EXTENDING IT OR +/REDUCING IT). CHECK PROTECTION CODE TO SEE IF THIS IS ALLOWED. MAKE SURE +/NO ONE ELSE HAS THIS FILE OPEN. JMP TO ERROR EXIT ON EITHER OF THESE CON- +/DITIONS. IF ALL IS OKAY. RETURN WITH PTR TO UFD NAME BLOCK ENTRY +EXT1, 0 + JMS I IFN01 /MASK OFF BITS 0-9 OF FIOSTK+1 + TAD FIOSTK+1 /INTERNAL FILE NUMBER + JMS I LNK01 /GET PTR TO APPROPRIATE FILE CONTROL BLOCK + SNA + JMP EXT10+1 /ERROR, FILE NOT OPEN + DCA EXFCBP /FILE CONTROL BLOCK POINTER + JMS I ACC01 /AS [S]HE UNDER ACCOUNT1? + JMP EXT2 /YES; SKIP PROTECTION CHECK + TAD FILPRP /GLOBAL TO "FILPRO" + TAD EXFCBP + DCA EXPROP /POINTER TO PROTECTION BIT + DATFLD /CDF FIELD 1 + TAD I EXPROP /PICK UP PROTECTION BIT + CFLD /CHANGE TO CURRENT FIELD + AND P0004 /STRAIN OFF ANY EXTRANEOUS BITS + SZA CLA + JMP EXT10 /WRITE PROTECTED +EXT2, TAD FIOSTK+1 /INTERNAL FILE NUMBER + JMS I GD01 /GET DIRECTORY ENTRY INTO CORE + DCA REL6 /POINTS TO WHERE UFD NAME BLOCK IS IN CORE + JMS I ENR01 /IS THIS THE ONLY USER WHO HAS THIS FILE OPEN? + JMP EXT30 /NO, SO ABORT AND RETURN ERROR CODE + TAD FIOSTK+2 /ARE ANY SEGMENTS INVOLVED? + SNA + JMP I FIEXIT /NO, NOTHING TO DO THEN + CIA + DCA EXSEGC /SAVE NEGATIVE COUNT + DATFLD + TAD I EXFCBP /GET POINTER TO CURRENT WINDOW + DCA EXPROP + IAC + DCA I EXPROP /INVALIDATE THE WINDOW + CFLD + TAD REL6 + JMP I EXT1 + /ROUTINE TO REDUCE A FILE + +*1600 + +RED0, JMS I EXT11 /MAKE SURE IT'S OKAY TO REDUCE THIS FILE + DCA REBUFP /...IF OKAY, RETURNS WITH PTR TO FILE NAME BLOCK + JMS I ACC01 /IS [S]HE UNDER ACCOUNT 1? + JMS I REDUFD /SEE IF [S]HE'S REDUCING A UFD + TAD REBUFP + TAD C0005 + DCA RELINK /NOW POINTS TO NUMBER OF SEGMENTS PRESENTLY IN FILE + TAD FIOSTK+2 /SEGMENTS TO BE REMOVED + SPA /IS IT NEGATIVE? + JMP RED5 /YES; DELETE THE ENTIRE FILE + CIA + TAD I RELINK + SMA SZA /DELETE THE FILE? + JMP RED6 /NO, REDUCE IT +RED5, CLA CLL /YES, WIPE IT OUT AND CLOSE + TAD REBUFP + JMS RED1 /WIPE OUT THE FILE NAME BLOCK FROM THE UFD + TAD FIOSTK+1 /INTERNAL FILE NUMBER + JMS I CL01 /CLOSE THIS FILE SINCE IT NO LONGER EXISTS + JMP I FIEXIT +RED6, DCA I RELINK /UPDATE SEGMENT COUNT + DCA BUFMOD /SCHEDULE WRITE + TAD I RELINK + DCA CFH + ISZ RELINK + ISZ RELINK + TAD I RELINK + DCA RELINK /POINTER TO FIRST WINDOW ON CHAIN + TAD CFH + JMS RED40 /WIPE OUT REST OF FILE + JMP I FIEXIT + +REDGD1, GD1 + +RED40, 0 + JMS I WND201 /DIVIDE BY 7 + CMA + DCA REWNDC /NUMBER OF WHOLE WINDOWS WHICH ARE TO REMAIN + TAD RELINK /GET POINTER TO FIRST RETRIEVAL WINDOW + JMS I RED302 /ROUTINE TO DO ACTUAL REDUCTION + JMP I RED40 + +EXT11, EXT1 +LINK01, LINK0 +RED302, RED30 +REDUFD, REDUF0 +REBUFP, 0 + /ROUTINE TO DELETE A FILE + +UFBUFP, +RED1, 0 + DCA REBUFP /PTR TO THE UFD ENTRY FOR THE FILE + TAD REBUFP + TAD P0003 + DCA RELINK /LINK TO NEXT FILE NAME IN THIS UFD + TAD I RELINK + DCA RED3 + TAD I REDGD1 /UFD ADDR OF THIS DIRECTORY ENTRY + DCA RED4 + TAD REBUFP + TAD P0007 + DCA RELINK /NOW POINTS TO A RETRIEVAL BLOCK FOR THIS FILE + TAD I RELINK + DCA RELINK +RED2, DCA I REBUFP /CLEAR OUT FIRST WORD OF ENTRY + ISZ REBUFP + TAD REBUFP + AND P0007 + SZA CLA /END OF CURRENT WINDOW? + JMP RED2 /NO, KEEP CLEARING + DCA BUFMOD /SCHEDULE WRITE + JMS I LINK01 +RED4, 0 /UFD ADDR OF THIS DIRECTORY ENTRY +RED3, 0 /UFD ADDR OF DIRECTORY ENTRY WHICH IS NEXT IN THE CHAIN + JMS RED40 /GO WIPE OUT ACTUAL FILE + JMP I RED1 + /ROUTINE TO EXTEND A UFD + +/CALLING SEQUENCE: +/ TAD (RETRIEVAL POINTER) +/ JMS UFD0 +/ ERROR RETURN +/ NORMAL RETURN + +UFD0, 0 + DCA UFRETP /RETRIEVAL POINTER + TAD C7771 + DCA CFH /COUNTER FOR OVERSIZE UFD +/NOW SCAN DOWN THE UFD'S FILE RETRIEVAL BLOCK +UFD2, TAD I UFRETP + SNA CLA + JMP UFD1 /FOUND THE END OF THE LIST OF SEGMENT NUMBERS + ISZ UFRETP /POINT TO NEXT SEGMENT NUMBER + ISZ CFH /UFD ALREADY MAXIMUM SIZE? + JMP UFD2 /NO, LOOK AT NEXT WORD + JMP I UFD0 /YES, ERROR RETURN + +/COMES HERE WHEN IT HAS FOUND THE END OF THE RETRIEVAL BLOCK'S LIST OF SEGMENTS +UFD1, JMS I SATL1 /GET A FREE SEGMENT FROM SAT + SNA + JMP I UFD0 /NO MORE FREE SEGMENTS + DCA I UFRETP /ADD TO RETRIEVAL INFORMATION + TAD UFRETP + JMS I ENS31 /CONVERT ABS RETTBL PTR TO A RELATIVE ENTRY NUMBER + CLL RTL /...TIMES FOUR + TAD UFDTBL /...PLUS BASE ADDR OF UFDTBL + DCA CFH /POINTER TO PROJ,PROG NUMBER OF FILE OWNER + TAD I CFH /PICK UP PROJ,PROG NUMBER + JMS I UFO61 /GO GET THE RETRIEVAL INFO FOR THIS GUY'S UFD INTO CORE + JMP I DIRBAD /*************DEBUG ONLY*********** + DCA UFBUFP /PTR TO RETRIEVAL INFORMATION + ISZ UFBUFP + TAD I UFBUFP + SZA CLA /SCAN TO END OF LIST OF SEGMENT NUMBERS + JMP .-3 + TAD I UFRETP /GET NUMBER OF NEW SEGMENT + DCA I UFBUFP /PUT IT IN RETRIEVAL BLOCK LIST + DCA BUFMOD /SCHEDULE WRITE + STA + DCA TABSTA /SET TABLE STATUS TO CHANGE + TAD I UFRETP /NEW SEGMENT NUMBER + JMS SCL0 /ZERO OUT THE NEW SEGMENT + ISZ UFD0 /SET UP NORMAL RETURN + JMP I UFD0 + +ENS31, ENS3 +UFO61, UFO6 + /ROUTINE TO ZERO OUT A DISC SEGMENT +/IT ZEROES THE CORE BUFFER THEN EXECUTES A CALL +/TO RD301 (THE ACTUAL READ NEVER HAPPENS). +/THUS, THE SYSTEM THINKS THAT THE SEGMENT BEING +/CLEARED IS ACTUALLY IN CORE. IT WILL BE WRITTEN OUT LATER. +SCL0, 0 + DCA UFRETP /SEGMENT NUMBER + JMS I WRT1 /MAKE SURE THE BUFFER IS EMPTY + TAD P7400 + DCA CFH /SET UP COUNTER FOR CLEARING SEGMENT + TAD BUFFER + DCA UFBUFP +UFD3, DCA I UFBUFP /START TO CLEAR BUFFER AREA + ISZ UFBUFP + ISZ CFH + JMP UFD3 + STA + TAD UFRETP /SEGMENT NUMBER + JMS I SCL11 /NOW FAKE A READ + DCA BUFMOD /SCHEDULE WRITE + JMP I SCL0 +RELINK, +UFRETP, 0 +SCL11, SCL1 +P7400, 7400 + +/ROUTINE TO PROVIDE FILE INFORMATION + +*2000 + +INF0, JMS I IFN01 /GET INTERNAL FILE NUMBER IN FIOSTK+1 + TAD FIOSTK+1 /INTERNAL FILE NUMBER + JMS I EBLD0 + DCA CFH /RELATIVE POINTER TO UFD RETRIEVAL INFORMATION + TAD I CFH /GET PTR TO RETTBL OUT OF ENTTBL + SNA /DOES IT EXIST? + JMP INF1 /NO, SO FILE IS NOT OPEN + CIA + CLL CMA RTL /SUBTRACT ONE; MULTIPLY BY FOUR + TAD UFDTBL + DCA INUFDP /POINTER TO USER PROJ,PROG NUMBER + TAD I INUFDP + DCA FIOSTK+2 /SET UP LINKAGE FOR GD0 + TAD FIOSTK+1 /INTERNAL FILE NUMBER + JMS I GD01 /GET DIRECTORY ENTRY FOR THIS FILE INTO CORE + CIA + CMA + DCA INDEX /SET UP INDEX REGISTER FOR TRANSFER + TAD I INDEX /OF NAME AND OTHER DIRECTORY INFORMATION + DCA FIOSTK+3 + TAD I INDEX + DCA FIOSTK+4 + TAD I INDEX + DCA FIOSTK+5 + ISZ INDEX + TAD I INDEX + DCA FIOSTK+6 + TAD I INDEX + DCA FIOSTK+7 +INF5, DATFLD + TAD I FIOPTR /PICK UP JOBLNK WORD FROM JOB STATUS BLOCK + DCA INF4 /DESTINATION IN FIELD 0 + CFLD /CHANGE TO PRESENT FIELD + 6202 /CIF FIELD 0 + BLT /MOVE FIOSTK INFORMATION INTO IOT PARAMETER BLOCK + 6221 /SOURCE FIELD + FIOSTK /SOURCE + DATFLD /DESTINATION FIELD +INF4, 0 /DESTINATION + -10 /WORD COUNT + INF6, CDF + TAD I OURFLD + AND C0200 + SZA CLA + JMP I FIEXIT /WE WERE CALLED BY SI - DON'T SET JSIOTC OR WE'LL GAG + DATFLD + TAD I JOBDAT /GLOBAL TO "JOBDAT" + IAC + DCA INSPTR /NOW POINTS TO STATUS WORD + TAD INIOTC /JSIOTC + CMA + AND I INSPTR /SET JSIOTC TO INDICATE THAT FIP + TAD INIOTC /...IS RETURNING INFORMATION IN THE IOT PAR. BLOCK + DCA I INSPTR + JMP I FIEXIT /EXIT + +INF1, DCA FIOSTK+2 + JMP INF5 + +INUFDP, 0 +INSPTR, 0 +OURFLD, CORTBL+1 +INIOTC, 40 + + +/ROUTINE TO SKIP IF CALLING USER IS NOT SYSTEM MANAGER +ACT01, 0 + JMS I JBLD0 /GET PPN + CLL RAR + SZA CLA /IS IN ACCOUNT 1? + ISZ ACT01 /NO; SKIP ON RETURN + JMP I ACT01 + /LOGIN ROUTINE + +LGI0, TAD RETTBL /MFD RETRIEVAL IS IN ENTRY 0 + DCA FIOSTK+1 /SET UP PTR TO RETRIEVAL INFORMATION CONTAINED IN RETTBL + TAD FIOSTK+2 /ACCOUNT #0 + SNA CLA + JMP LGI20 /UNAUTHORIZED ACCOUNT + JMS I DS01 /SEARCH THE MFD (AC=0 TO INDICATE 3-WORD SEARCH) + FIOSTK+1 /ADDR OF PTR TO RETRIEVAL INFORMATION OF DIRECTORY TO BE SEARCHED + JMP LGI20 /COULD NOT FIND ENTRY IN MFD + DCA LGMFDP /OK TO LOG IN - POINTER TO DIRECTORY ENTRY IS IN ACC. + TAD FIOSTK+2 /PROJ,PROG NUMBER + JMS I UTS01 /SEARCH THE UFD TABLE + SKP /THIS PROJ,PROG NUMBER NOT THERE + JMP LGI1 /UFD ALREADY ON TABLE - RETURNS WITH ITS RELATIVE POSITION IN TABLE + TAD FIOSTK+2 /PROJ,PROG NUMBER + JMS I UFO01 /OPEN THE UFD - I.E. MAKE AN ENTRY IN UFDTBL, RETTBL + JMP LGI20 /COULD NOT FIND ROOM ON TABLE + +LGI1, CLA CMA + TAD I UTPRNU + DCA I UTPRNU /ACCOUNT FOR NEW ENTRY IN ACCESS COUNT + +/COMES HERE WHEN THE UFDTBL & RETTBL HAVE BEEN UPDATED +/TO INCLUDE THIS LOGIN + + FGETJT + JOBSTS + DCA LGI3 /ADDRESS OF STR0 + TAD FIOSTK+2 /ACCOUNT NUMBER? + AND C7774 /IS IT LESS THAN 4? + SNA CLA + TAD C0200 /YES - SET ACCOUNT PRIVILEGE BIT + DATFLD + DCA I LGI3 /AND SAVE IT + JMS I JBLD0 + CLA + TAD FIOSTK+2 /PROJ,PROG NUMBER + JMP I .+1 + RESET + +LGI20, CFLD + CLA CMA /COULD NOT LOGIN - RETURN WITH 7777 + DCA FIUSAC /INDICATE INABILITY TO LOG IN + JMP I FIEXIT + +GTB1, +LGMFDP, 0 + + /DIRECTORY SEARCH + +/CALLING SEQUENCE: +/ CLA OR CIA (3 OR 1 WORD SEARCH) +/ JMS DS0 +/ POINTER-----------------RETRIEVAL STACK POINTER +/ RETURN IF NOT FOUND NA +/ GOOD RETURN ME +/ (POINTER IN AC) XX + +*2200 +DS0, 0 + SNA CLA /SKIP IF ONE WORD SEARCH + CLL CML RTL /THREE WORD COMPARE + CMA + DCA DSWDNR /MINUS NUMBER OF WORDS TO COMPARE + TAD I DS0 /PICK UP POINTER TO RETRIEVAL INFORMATION + DCA DSRETS + ISZ DS0 + TAD DSM160 /SET UP COUNTER ON # ENTRIES CHECKED + DCA DSKCNT + TAD I DSRETS /GET RETRIEVAL POINTER + CIA + TAD RETTBL + SNA CLA + STA /INHIBIT SEGMENT COUNTING OF THE MFD + DCA SEGLIM /ZERO SEGMENT COUNTER +DS2, DCA DS1 + TAD I DSRETS /GET PTR TO RETRIEVAL INFORMATION BLOCK + JMS I GE01 /GET THE ENTRY INTO CORE +DS1, 0 /WORD NUMBER -- I.E. THE ADDR WITHIN THE DIRECTORY + SNA + JMP BADDIR /FOULED-UP DIRECTORY! + DCA DSENTP /STORE POINTER TO ENTRY + TAD C0005 + TAD DSENTP + DCA DSCNTR /POINTS TO SEGMENT COUNT + TAD SEGLIM /THE TOTAL FOR THIS UFD + SPA /IS IT A UFD? + JMP DS4 /NO; SEE IF WE SHOULD RESET THE MFD + TAD I DSCNTR /ADD THIS FILE'S COUNT + DCA SEGLIM /SAVE NEW TOTAL +DS3, TAD DSWDNR /NUMBER OF WORDS TO COMPARE + DCA DSCNTR + TAD DSRETS + DCA DSOBJT /POINTER TO OBJECT NAME + TAD DSENTP + DCA DSENT /POINTER TO NAME IN BUFFER +DSCOM2, TAD I DSENT + ISZ DSENT + CIA + ISZ DSOBJT + TAD I DSOBJT + SZA CLA + JMP DSCOM1 /NOT FOUND + ISZ DSCNTR + JMP DSCOM2 /LOOK AT NEXT WORD OF NAME + ISZ DS0 /FOUND THE ENTRY + TAD DSENTP /PICK UP POINTER + JMP I DS0 /RETURN +/THIS ENTRY IS NOT THE ONE WE'RE LOOKING FOR, SO WE MUST +/GO LOOK AT THE NEXT ONE. IN THIS ENTRY IS A RELATIVE PTR TO THE NEXT ONE +/GET IT. +DSCOM1, ISZ DSKCNT /BAD DIRECTORY? + JMP DSCOM3 /IT ISN'T BAD AT THIS POINT +BADDIR, DCA RESFLG /CLEAR AC AND RESET FLAG + TAD P5400 /YES, INDICATE BAD DIRECTORY AND GET OUT + DCA FIUSAC /ONCE AGAIN, GOODNESS TRIUMPHS OVER EVIL + JMP RETURN /GO CLEAN UP BEFORE ABORTING +DSCOM3, TAD P0003 /CREATE POINTER TO NEXT ENTRY + TAD DSENTP + DCA DSCNTR + TAD I DSCNTR + SZA /IS THIS THE END OF THE DIRECTORY CHAIN? + JMP DS2 /NO, SO CONTINUE SEARCH + TAD P0003 + TAD DS1 + JMP I DS0 +DS4, TAD RESFLG /SHOULD WE RESET? + SZA CLA + JMP DS3 /NO + DCA I DSCNTR /CLEAR CPU TIME ACCUMULATOR + ISZ DSCNTR + DCA I DSCNTR /CLEAR DEVICE TIME ACCUMULATOR + DCA BUFMOD /REMEMBER TO WRITE IT BACK + JMP DS3 +DSWDNR, 0 +ENRETP, +DSRETS, 0 +ENADDR, +DSENTP, 0 +DSOBJT, 0 +DSENT, 0 +DSM160, -161 /-MAXIMUM # FILES USER CAN OWN (+2) +/RETURN A BLOCK OF FREE CORE +RESFLG, +RETBKS, 0 + CFLD + CIF + RETBLK + JMP I RETBKS +/RETURN A LINKED LIST OF FREE BLOCKS +ENTPTR, +DSKCNT, +RETBLS, 0 + SNA + JMP I RETBLS + JMS RETBKS + JMP .-3 + /SEARCH ENTTBL FOR OPENINGS TO FILE +/CALLING SEQUENCE: +/ TAD (RETRIEVAL POINTER) +/ JMS ENS0 +/ UFD ADDRESS OF DIRECTORY ENTRY +/ RETURN - FOUND AN ACCESS +/ RETURN - FOUND NO ACCESS + +DSCNTR, +ENS0, 0 + JMS I ENS30 + DCA ENRETP /RELATIVE POINTER + TAD I ENS0 /GET FILE DIRECTORY ADDRESS + CIA + DCA ENADDR + ISZ ENS0 /SKIP PAST ARG + TAD ENTTBL + DCA ENTPTR +ENS2, TAD ENRETP + CMA + TAD I ENTPTR + ISZ ENTPTR + SZA CLA + JMP ENS1 /DIFFERENT UFD ACCESS + TAD I ENTPTR /SAME UFD, SAME FILE? + TAD ENADDR + SZA CLA + JMP ENS1 /DIFFERENT FILE + TAD FIOSTK /WHICH IOT BROUGHT US HERE? + TAD ENSCRF /IF IT'S "CRF" ONE MATCH IS ENOUGH + SNA CLA + JMP I ENS0 /IT WAS; GET OUT + TAD FIOSTK+1 /FOUND A SIMILAR ENTRY + JMS I EBLD0 /SEE IF WE FOUND THE ENTRY FOR + CMA /THE GUY WHO CAUSED THE CALL TO + TAD ENTPTR /ENS0; IF IT IS, IGNORE THIS MATCH + SZA CLA + JMP I ENS0 /FOUND A SIMILAR ENTRY; DIFFERENT ENTTBL ENTRY +ENS1, ISZ ENTPTR + TAD ENTPTR + CIA + TAD ENTEND /END OF ENT TABLE + SZA CLA + JMP ENS2 /KEEP LOOKING + ISZ ENS0 /SKIP ON RETURN + JMP I ENS0 +ENS30, ENS3 +ENSCRF, -CRF + /ROUTINE TO LOOK IN THE SAT FOR A FREE SEGMENT + +/CALLING SEQUENCE: +/ JMS SATLOK +/ RETURN (SEGMENT NUMBER IN AC, 0=NONE AVAILABLE) +*2400 +SATLOK, 0 + CLA CMA CLL RAL /7776 + DCA SATMSK /MAKE TWO PASSES OF THE TABLE + TAD I SATCNT /# OF AVAILABLE DISC SEGMENTS + SNA /ARE THERE ANY? + JMP I SATLOK /NO, SO FORGET IT + CIA + CMA + DCA I SATCNT /DECREMENT SATCNT + DCA SATCT2 + CLA CMA + DCA SATSTA /SET SAT STATUS TO WRITE OUT +/LOOK FOR A WORD IN SAT TABLE WITH A ZERO BIT IN IT +SAT1, TAD I SATPNT /GET A WORD FROM SAT TABLE + CMA + SZA CLA /ARE ALL BITS SET TO ONE? + JMP SAT2 /NO, SO WE'VE FOUND A SEGMENT + ISZ SATPNT /WAS THIS THE LAST WORD IN THE SAT TABLE? + JMP SAT1 /NO, SO KEEP LOOKING + TAD SAT5 /START LOOKING FROM THE BEGINNING + DCA SATPNT /PTR INTO SAT TABLE + ISZ SATMSK + JMP SAT1 /MAKE 1 MORE PASS + DCA I SATCNT /SOMETHING WRONG.. BETTER AVOID L2Q OVERFLOW + /BY SAYING NO SEGMENTS AVAILABLE + JMP I SATLOK +SAT5, -SATSIZ+2 + +/WE FOUND A SAT WORD WITH A ZERO BIT. NOW FIND THAT BIT. +SAT2, CLL CML RAR /4000 INTO ACC. + DCA SATMSK + ISZ SATCT2 + TAD I SATPNT /GET WORD FROM SAT TABLE + AND SATMSK /IS THE BIT CORRESPONDING TO THE ONE IN SATMSK SET? + SNA + JMP SAT3 /NO, SO WE FOUND THE ZERO BIT + RAR /MOVE MASK BIT ONE TO THE RIGHT + JMP SAT2+1 /...AND LOOK AT THE NEXT BIT + + /FOUND THE BIT WITHIN THE WORD - SATCNT INDICATES WHICH ONE IT IS +SAT3, TAD SATMSK + TAD I SATPNT + DCA I SATPNT /SET THE BIT IN SATTBL TO INDICATE THAT THIS SEGMENT IS NOW ALLOCATED + TAD SATPNT + TAD C0526 + DCA SATMSK +/NOW CALCULATE THE NUMBER OF THE DISC SEGMENT +/WHICH CORRESPONDS TO THIS BIT IN THE SAT TABLE + TAD SATMSK + CLL RAL + TAD SATMSK + RTL + TAD SATCT2 + JMP I SATLOK /EXIT WITH DISC SEGMENT NUMBER IN AC + + +SATPNT, -SATSIZ+2 +SATCNT, -SATSIZ+1 +SATEMP, +SATCT2, 0 +SATMSK, 0 + /ROUTINE TO RELEASE A SEGMENT IN SAT + +/CALLING SEQUENCE: +/ TAD (SEGMENT NUMBER) +/ JMS SATREL + +/DIVIDE SEGMENT NUMBER BY 14 (12 DECIMAL) +/QUOTIENT INDICATES WHICH WORD IN SAT TABLE CORRESPONDS +/TO THIS DISC SEGMENT. REMAINDER INDICATES WHICH BIT IN +/THAT WORD. +SATREL, 0 + TAD P2000 /SUBTRACT 14 X 400 + SZL /WAS THE SEGMENT THAT BIG? + JMP .+3 /YES + TAD P6000 /NO, ADD 14 X 400 + CLL /UN-DO THE LINK + RAL /SHIFT OUT A BIT OF THE QUOTIENT + ISZ CFH + JMP SATREL+1 /MORE TO DO YET + DCA SATPNT /REMAINDER IN LINK THRU AC2; QUOTIENT IN AC3 THRU AC11 + TAD SATPNT + AND P7000 + RTL + RTL + CMA /NEGATE THE REMAINDER + DCA SATEMP + TAD SATPNT + AND P0777 /JUST THE QUOTIENT THIS TIME + TAD SAT5 + DCA SATPNT + CLL CMA + RAR + ISZ SATEMP /SET UP A MASK CORRESPONDING TO PROPER BIT + JMP .-2 + AND I SATPNT /CLEAR SAT TABLE BIT; SEGMENT IS NOW AVAILABLE + DCA I SATPNT + ISZ I SATCNT /UPDATE THE AVAILABLE SEGMENTS COUNT + CLL STA + DCA SATSTA /REMEMBER WE CHANGED THE SAT TABLE + JMP I SATREL + /ACTUAL I/O ROUTINE +/SET UP ALL I/O PARAMETERS IN #FLPARB#, AND JMS FIPIO + +FIPIO, 0 + TAD FIPFLD + RAR + DCA FLPARB+2 /='S FIELD WE'RE IN TIMES 4 + CDF + TAD I JOB + AND C0400 /FIP OR SI CORTBL BIT ON? + SNA CLA + JMP .+3 /SI + TAD FIJOB + DCA I FIPJOB /FIP - KEEP HIGH PRIORITY ON THE SCHEDULER + TAD FIRETP /POINTER TO FIORET + DCA 1 /RETURN ADDRESS - SET TO RETURN BELOW WHEN FIP IS RESTARTED + TAD FIO3 /GET FIPBLK + DATFLD + DCA I FIUTBA + CFLD + CIF 00 + BLT /MOVE DISC TRANSFER PARAMETERS INTO FREE BLOCK LINKED TO DSUTBL + CFLD /FIP ALWAYS IN FIELD 2 + FLPARB /PARAMETER BLOCK + DATFLD /DESTINATION FIELD +FIO3, FIPBLK /DESTINATION + -10 /WORD COUNT + CDF CIF 00 + ISZ I DSBUSY /GLOBAL TO "DSBUSY" + WAIT /DISK BUSY + JMP I OVER /GO TO FIELD 0 TO INITIATE THE TRANSFER + +/MONITOR RETURNS CONTROL HERE AFTER COMPLETING THE TRANSFER +FIORET, CLA /RETURNS FROM DISC I/O COME HERE + TAD C0200 /RESET THE FIP STARTING ADDRESS + DCA 1 /... TO 0200 + FGETJT + JOBSTS + DATFLD + DCA FIPTR1 + TAD I FIPTR1 /PICK UP #JOBSTS# + CFLD /CHANGE TO CURRENT FIELD + TAD P0003 + AND P0007 /CHECK ERROR BITS + SZA CLA + ISZ FIPIO /NO DISC TRANSFER ERROR + JMP I FIPIO /EXIT WITHOUT SKIPPING TO INDICATE DISC TRANSFER ERROR + +FIPTR1, 0 +FIUTBA, DSUTBL+4+4 +FIRETP, FIORET +C0526, 0526 +OVER, OVRLA1 + /ROUTINE TO GET A DIRECTORY WORD INTO CORE +/CALLING SEQUENCE: +/ TAD (POINTER TO RETRIEVAL INFORMATION) +/ JMS GE0 +/ WORD NUMBER +/ RETURN (BUFFER POINTER IN AC. 0 IF NON-EXISTENT) + +*2600 + +GE0, 0 + DCA GERETP /STORE RETRIEVAL INFORMATION POINTER + TAD I GE0 + CLL RAL + RTL + RTL + AND P0007 + TAD GERETP + DCA GERETP + TAD I GERETP + SNA + JMP GE3 + CIA + CMA + DCA RDTEMP +/FILE READ ROUTINE, CHECKS TO SEE IF BUFFER IS FULL. +/IF SO, IS IT THE SEGMENT WE ARE TRYING TO READ? +/IF YES, LEAVE. IF NO, WRITE OUT THE BUFFER +/BEFORE READING THE PROPER SEGMENT. + TAD RDCURR /MAY THE DESIRED SEGMENT ALREADY BE IN THE BUFFER + CIA + TAD RDTEMP + SNA CLA + TAD BUFSTA /PROBABLY; IS THE DATA STILL VALID? + SPA + JMP RD3 /YES + SNA /MAYBE + JMS I WRT1 /WRONG SEGMENT, SO WRITE IT OUT (IF MODIFIED) + DCA BUFSTA /SAVE BUFFER STATUS + TAD RDTEMP + JMS RD30 /SET UP PARAMETERS FOR A READ OPERATION + TAD BUFSTA /WAS THE CORRECT DATA IN THE BUFFER AFTER ALL? + SZA CLA + JMP RD3 /YES; ONLY NEEDED TO SET THE DISK PARAMETERS + JMS I FIO01 /PERFORM THE READ + JMP I DIRBAD /ERROR ON READ + IAC + DCA BUFMOD /NEW DATA AS YET UNCHANGED +RD3, CLA CMA + DCA BUFSTA /SET BUFFER STATUS TO FULL + TAD C0377 + AND I GE0 /ADDRESS WITHIN SEGMENT + TAD BUFFER /CREATE A POINTER +GE3, ISZ GE0 + JMP I GE0 /RETURN + GERETP, 0 +RDTEMP, 0 +RDCURR, 0 +K7400, 7400 +C0377, 0377 + + + +/ROUTINE TO DIVIDE A NUMBER BY 7 +/REMAINDER IS LEFT IN WNDREM, PAGE 0 + +WND20, 0 + DCA WNDREM + DCA CFH + TAD WNDREM +WND24, TAD C7771 + SPA + JMP WND21 + ISZ CFH + JMP WND24 +WND21, TAD P0007 + DCA WNDREM + TAD CFH + JMP I WND20 + + /ROUTINE TO SET UP FOR A READ. +/ENTER WITH SEGMENT NUMBER. THIS IS CONVERTED TO +/A PHYSICAL DISC ADDRESS. +RD30, 0 + DCA RDCURR /SAVE SEGMENT NUMBER + TAD RDCURR + CLL RTR + RTR + DCA RDTEMP + TAD RDTEMP + RAR + AND K7400 + DCA FLPARB+5 + TAD RDTEMP + AND C0377 + TAD FIBASE + CLL RTL + DCA FLPARB+1 + CFLD /CHANGE TO CURRENT FIELD + TAD K7400 + DCA FLPARB+3 /WORD COUNT (ONE BUFFER) + CLA CMA + TAD BUFFER + DCA FLPARB+4 /CORE ADDRESS + TAD C0603 /READ IOT + DCA FLPARB + JMP I RD30 + FIPFIP= C0400 + + +FIX301, FIX30 +C5600, 5600 +USENAM, 0 /CALLED ONLY ONCE BY RE-NAME ROUTINE + TAD FIOSTK+1 /TO SEE IF THE NEW NAME EXISTS IN DIRECTORY + DCA FIOSTK + JMS I JBLD0 + JMS I UTS01 + JMP I DIRBAD + JMS I BLDP1 + DCA FIOSTK+1 + JMS I DS01 + FIOSTK+1 + ISZ USENAM /NO FILE OF THIS NAME FOUND - OK TO RENAME + CLA + JMP I USENAM + +NUCOR, CORSRC-2 +C7437, SWAP LOCK NOTRUN FIP CJOB +JOBMX, -JOBMAX +FIPLOC, FIPLOK +FIPTIM, TIMFIP + +REL1, TAD FIOSTK+1 /RELEASE A DEVICE + SPA /DON'T LET THE USER RELEASE CONSOLES + JMS I REL01 + CLA + JMP I FIEXIT + + +FIX50, TAD I FIOPTR + AND FIPFIP /GLOBAL TO "FIP" + SNA CLA /IF FIP BIT IS NOT SET, FIP WAS CALLED BY SI + JMP I FIX301 /GET THE SYSTEM INTERPRETER BACK INTO CORE + TAD C5600 + AND I FIOPTR + DCA I FIOPTR /CLEAR OUT THE LOCK BIT + TAD JOBMX + DCA CFH /SAVE COUNT OF JOBS TO SCAN + STL RTL + TAD I NUCOR + SMA + JMP FIX51 + DCA I FIPTIM + TAD C7437 + DCA I FIPLOC +FIX51, CLA + DATFLD + TAD FIJOB + TAD DEVOVR + DCA INDEX + FIX50L, TAD INDEX + TAD JEND + SZA CLA + JMP .+3 + TAD DEVOVR + DCA INDEX + TAD I INDEX + SZA + JMS I FIX5CK + ISZ CFH + JMP FIX50L + JMP I .+1 + FIXOUT +JEND, -JOBTBL-JOBMAX +FIX5CK, FIXSCH +/ROUTINE TO FREE AN ENTRY ON THE UFD TABLE AND RETTBL + +/CALLING SEQUENCE: +/ TAD (POSITION ON UFDTBL) +/ JMS TF0 +/ RETURN + + +TF0, 0 + DCA TFUFDP /POSITION ON TABLE + DCA I TFUFDP /CLEAR OWNER'S PROJ,PROG NUMBER + TAD UFDTBL /BEGINNING OF TABLE + CIA + TAD TFUFDP + CLL RTR /RELATIVE POSITION ON TABLE + IAC + JMS I BLDP1 /BUILD A PTR TO RETTBL + DCA TFUFDP /POINTER TO RETRIEVAL INFORMATION + TAD P7770 /8 WORDS PER ENTRY + DCA TFCNTR +TF1, DCA I TFUFDP /ZERO OUT THE ENTRY + ISZ TFUFDP + ISZ TFCNTR + JMP TF1 + JMP I TF0 + +TFUFDP, 0 +TFCNTR, 0 + + /ROUTINE TO CHECK WHETHER THE FILE A USER +/IS ATTEMPTING TO ACCESS IS HIS/HERS OR SOMEONE ELSE'S. + +/CALLING SEQUENCE: +/ TAD (INTERNAL FILE NUMBER) +/ JMS UC0 +/ ERROR RETURN (AC=0 IF FILE NOT OPEN) +/ NORMAL RETURN + +UC0, 0 + JMS I EBLD0 + DCA UCENTP + TAD I UCENTP /PICK UP ENTRY FOR THIS FILE OF THIS USER'S + SNA + JMP I UC0 /FILE NOT OPEN + CIA + CLL CMA RTL /SUBTRACT ONE; MULTIPLY BY FOUR + TAD UFDTBL + DCA UCUFDP /POINTER TO OPEN UFD TABLE + JMS I JBLD0 + CIA + TAD I UCUFDP + SNA /SKIP IF DIFFERENT + ISZ UC0 /CORRECT RETURN + JMP I UC0 + +UCENTP, 0 +UCUFDP, 0 + /LOGOUT ROUTINE + +LGO0, JMS I ACC01 /IS IT FROM ACCOUNT 1? + TAD FIOSTK+1 /YES; SEE IF [S]HE WANTS TO RESET + TAD FIJOB /SEE IF HIS/HER AC=JOB + SNA CLA + JMP I LGRESA /GO CLEAR EVERYBODY'S CPU & DEVICE TIME ACCUMULATORS + TAD FIOSTK+1 /DID [S]HE SET HIS/HER AC= TO HIS/HER JOB #? + CIA + TAD FIJOB + SZA CLA + JMP I LGO1A /NO; SO SEE IF [S]HE WANTS COUNT OF USERS UNDER HIS/HER ACCOUNT + JMS I LNS01 /RELEASE ALL HIS/HER DEVICES + JMP .+3 + JMS I REL01 + JMP .-3 /KEEP GOING + JMS I CL01 /CLOSE FILE 0 + IAC + JMS I CL01 /CLOSE FILE 1 + CLL CML RTL + JMS I CL01 /CLOSE FILE 2 + TAD P0003 + JMS I CL01 /CLOSE FILE 3 + JMS I JBLD0 + DCA LOSRRI+1 /DELIVER TO CALLING SEQUENCE FOR SEARCH + TAD CFH + DCA LOJOBP + CLA CMA + JMS I DS01 /FIND MFD ENTRY; 1 WORD SEARCH + LOSRRI + JMP I DIRBAD /************DEBUG ONLY*********** + TAD C0006 + DCA LOSRRI+1 /POINTER TO CP TIME COUNTER + FGETJT + JOBRTM /JOB RUN TIME IN STATUS + DCA FIOSTK+6 /INTS TO LOW ORDER RUN TIME + DATFLD + TAD I FIOSTK+6 + RTR + RTR + RTR /USE ONLY HIGH ORDER OF LOW ORDER RUN TIME + AND P0077 + DCA FIOSTK+7 + ISZ FIOSTK+6 + TAD I FIOSTK+6 + CFLD /BACK TO THIS FIELD + AND P0077 + CLL RTL + RTL + RTL + TAD FIOSTK+7 + TAD I LOSRRI+1 + DCA I LOSRRI+1 /LOW ORDER TIME UPDATE + DCA BUFMOD /SCHEDULE WRITE + \ No newline at end of file diff --git a/tss8/system/fipc.pal b/tss8/system/fipc.pal new file mode 100644 index 0000000..6878767 --- /dev/null +++ b/tss8/system/fipc.pal @@ -0,0 +1,1329 @@ + TAD I LOJOBP /PICK UP PROJ,PROG NUMBER + JMS I UTS01 /SEARCH UFD TABLE + JMP LGO2 /OOPS!! MIGHT AS WELL TRY TO LEAVE GRACEFULLY + ISZ I UTPRNU /REMOVE THIS JOB FROM ACCESS COUNT + JMP LGO2 + CLA CMA /LAST USER ACCESSING THIS UFD + TAD UTPRNU + JMS I TF01 /FREE THE UFD TABLE ENTRY +LGO2, CLA + DCA I LOJOBP /REMOVE USER FROM JOB TABLE + TAD LGO4A /KLUDGE FIEXIT TO RETURN TO LGO4 + DCA LGKLUJ +TABOUT, CLA CMA + DCA TABSTA /FORCE TABLES OUT + JMP I FIEXIT +LOJOBP, 0 + +LOSRRI, RTABLE + 0 +LGO4A, LGO4 +LGO1A, LGO1 +LGKLUJ, FIX500 +LGRESA, LGRES0 + /ROUTINE TO OPEN A UFD + +/CALLING SEQUENCE: +/ TAD (PROJ,PROG NUMBER) +/ JMS UFO0 +/ ERROR RETURN (AC=0 IF TABLES FULL; OTHERWISE UFD NOT FOUND) +/ NORMAL RETURN (POSITION ON TABLE IN AC) + +*3200 + +UFO0, 0 + JMS UFO6 /GO GET THE RETR. INFO FOR THIS GUY'S UFD INTO CORE + JMP I UFO0 /COULDN'T GET IT + DCA UOBUFP /POINTER TO RETRIEVAL INFORMATION + TAD UFDTBL + IAC + DCA UOUFDP /UFD TABLE POINTER +/SEARCH FOR A FREE SLOT IN UFDTBL +UFO3, TAD I UOUFDP + SNA CLA + JMP UFO2 /FOUND A FREE SLOT ON THE TABLE + TAD UOUFDP /THIS SLOT IS OCCUPIED + TAD P0004 + DCA UOUFDP /NEXT POSITION (ACCES COUNT ENTRY) + TAD UFDEND /ARE WE AT THE END OF THE TABLE + CMA + TAD UOUFDP + SNA CLA /HAVE WE SEARCHED THE WHOLE TABLE? + JMP I UFO0 /NO ROOM ON TABLE + JMP UFO3 /LOOK AT NEXT SLOT + +/COMES HERE WITH UOUFDP POINTING TO A FREE SLOT IN UFDTBL +UFO2, CLL STA RAL /AC=-2 + TAD UOUFDP /BACK UP THE POINTER + DCA INDEX + TAD UFORET+1 + JMS I UFQUOA /LOAD THE UFD TABLE + STA + TAD UFDTBL + CIA + TAD INDEX + CLL RTR + DCA UFO6 /RELATIVE POSITION ON TABLE + TAD UFO6 + JMS I BLDP1 /GENERATE A PTR INTO RETTBL + DCA UFORET /RETRIEVAL POINTER + TAD C7771 + DCA CFH /COUNTER FOR TRANSFER TO TABLE + /NOW MOVE RETRIEVAL INFORMATION FOR THIS GUY'S +/UFD INTO RETTBL +UFO4, ISZ UOBUFP + TAD I UOBUFP + DCA I UFORET + ISZ UFORET + ISZ CFH /ENTIRE RETRIEVAL BLOCK TRANSFERRED? + JMP UFO4 /NO, KEEP IT UP + ISZ UFO0 /YES, PREPARE FOR NORMAL RETURN + TAD UFO6 /PICK UP RELATIVE POSITION + JMP I UFO0 + +UFORET, 0 + 0 +UFQUOA, UFQUOT +UOUFDP= UTPRNU +UOBUFP, 0 + + +UFO6, 0 + DCA UFORET+1 /SET UP CALLING SEQUENCE FOR MFD SEARCH + TAD RETTBL + DCA UFORET + CMA + JMS I DS01 /ONE WORD MASTER FILE DIRECTORY SEARCH FOR PROJ,PROG MATCH + UFORET + JMP I UFO6 /COULD NOT FIND UFD ENTRY + TAD P0004 /POINT AT DISK QUOTA WORD + DCA UFORET + TAD I UFORET + AND P0077 /SAVE ONLY LOGIN QUOTA + DCA SEGLIM /SAVE FOR LATER + TAD P0003 + TAD UFORET + DCA UFORET /POINTER TO UFD RETRIEVAL INFORMATION + TAD I UFORET + DCA UFO1 + TAD RETTBL /POINTER TO RET. INFO OF FILE BEING SEARCHED (IN THIS CASE, THE MFD) + JMS I GE01 /GET RETRIEVAL INFORMATION INTO CORE +UFO1, 0 + ISZ UFO6 + JMP I UFO6 + /ROUTINE TO SEARCH UFD TABLE FOR PROJ,PROG NUMBER + +/CALLING SEQUENCE: +/ TAD (PROJ,PROG NUMBER) +/ JMS UTS0 +/ NOT FOUND RETURN +/ NORMAL RETURN (RETRIEVAL POSITION IN AC) + +UTS0, 0 + DCA UTPR1 /PROJ,PROG NUMBER + TAD UFDTBL /PTR TO HEAD OF UFDTBL + DCA UTUPTR +UTS1, TAD UFDEND /END OF UFD TABLE + CIA + TAD UTUPTR + SNA CLA + JMP I UTS0 /COULD NOT FIND PROJ,PROG NUMBER ON TABLE + TAD I UTUPTR + CIA + TAD UTPR1 + SNA CLA + JMP UTS3 /FOUND ENTRY, GET POINTER + TAD UTUPTR /STEP UP ONE SLOT + TAD P0004 + DCA UTUPTR + JMP UTS1 /LOOK IN THE NEXT ENTRY +UTS3, TAD UFDTBL + CIA + TAD UTUPTR + CLL RTR /RELATIVE POSITION ON TABLE + IAC /THE RELATIVE POSITION + ISZ UTPRNU /UTPRNU POINTS TO ACCESS COUNT OF THIS PROJ, PROG # + ISZ UTS0 + JMP I UTS0 + +DVT1, +UTPR1, 0 +UTUPTR= UTPRNU + +DVT0, 0 /COMPUTE DEVICE TIME AT RELEASE + DCA DVT1 /ELAPSED DEVICE TIME + JMS I JBLD0 + DCA DVT3 /PROJ,PROG NUMBER OF CURRENT USER + CLA CMA + JMS I DS01 /SEARCH MFD FOR PROJ,PROG NUMBER + DVT4 + JMP I DIRBAD /***********DEBUG ONLY*********** + TAD C0005 + DCA CFH /POINTER TO DEVICE TIME WORD + TAD DVT1 + TAD I CFH /UPDATE USER'S CUMULATIVE DEVICE TIME + DCA I CFH + DCA BUFMOD /SCHEDULE WRITE + DATFLD + JMP I DVT0 + +DVT4, RTABLE +DVT3, 0 + + + +/COMES HERE IF FIP WAS CALLED BY S.I. +/READ S.I. BACK IN AND RETURN TO IT +FIX30, CFLD /CHANGE TO CURRENT FIELD + TAD C0603 + DCA FLPARB /SET UP READ IOT + DCA FLPARB+1 /SI IS ON TRACK 0 OF THE DISC + JMS I FIX401 + JMS I FIO01 /RETURN WILL BE TO SI + + +SCL1, 0 + JMS I RD301 /SET UP DISK PARAMETERS + STA + DCA BUFSTA /FUDGE TO APPEAR THAT READ WAS DONE + JMP I SCL1 + +RD301, RD30 + /EXIT ROUTINE +/COMES HERE WHEN FIP HAS COMPLETED ITS TASK +/FIRST, SEE IF ANY INTERNAL FILES HAVE BEEN CHANGED +/THOSE THAT HAVE CHANGED MUST BE WRITTEN BACK OUT TO DISC +*3400 +/*** ANY DATA FIELD IS OK AT THIS POINT!! + +FIX0, JMS I WRT1 /MAKE SURE THE BUFFER IS EMPTY + ISZ TABSTA /CHECK TABLE STATUS + JMP FIX1 /NOTHING CHANGED IN TABLES + TAD JOBTAB /BOTTOM OF TABLE AREA + JMP FIX2 /SAVE TABLES BEFORE EXIT + +FIX1, ISZ SATSTA /CHECK SAT STATUS + JMP FIX20 /NOTHING TO BE SAVED, EXIT + TAD SATBOT /BOTTOM OF SAT +FIX2, JMS I FIX401 + TAD FIDEXP /GLOBAL TI "FIPDEX" + DCA FLPARB+1 /MEMORY FIELD + TAD C0605 + DCA FLPARB /WRITE IOT + JMS I FIO01 /PERFORM THE WRITE + HLT /ERROR ON WRITE, FATAL + +/ALL DISC TABLES ARE NOW UP TO DATE (*** ANY DATA FIELD IS OK AT THIS POINT!!) +FIX20, FGETJT + JOBSTS + DCA FIOPTR + DATFLD + TAD I FIOPTR + AND FISIOT + DCA I FIOPTR + CFLD + FGETJT /RESTORE USER AC + JOBREG+2 + DCA FIOPTR /ADDRESS OF USER'S AC + TAD FIUSAC + DATFLD + DCA I FIOPTR + CDF + TAD C002 /FIP ALWAYS RUNS IN FIELD 2 SO ADD 2 TO CORTBL + TAD CORTBA /GLOBAL TO "CORTBL" + DCA FIOPTR /POINTS TO THIS FIELD'S ENTRY IN CORTBL + JMP I .+1 +FIX500, FIX50 + +FISIOT, -JSIOT-1 + /ROUTINE TO DETERMINE IF A DEVICE IS ASSIGNED TO THIS JOB + +/CALLING SEQUENCE: +/ TAD (DEVICE NUMBER) +/ JMS DTE0 +/ 0 (SET BY DTE0 TO POINT TO ENTRY IN DEVTBL) +/ RETURN (DEVICE NOT ASSIGNED TO THIS JOB) +/ RETURN (DEVICE ASSIGNED) + +DTE0, 0 + SPA + JMP DTE10 /NON-TTY DEVICE + TAD NULNM1 /CHECK FOR VALID TTY NUMBER + SMA + JMP DTE6 /INVALID TTY NUMBER + CLL RAL /TWO WORDS PER TTY +DTE4, TAD DEVEND /FIND LOCATION IN DEVTBL +DTE5, CFLD + DCA I DTE0 /RETURN ARGUMENT + TAD I DTE0 + ISZ DTE0 + DCA DTE2 + DATFLD + TAD I DTE2 /GET POINTER TO DDB + SNA /IS THERE ONE? + JMP I DTE0 /NO, RETURN + DCA DTE2 /YES + ISZ DTE2 + TAD I DTE2 /GET JOB NUMBER + CIA + TAD FIJOB /NUMBER OF CURRENT JOB + AND P0037 + SNA CLA /DOES DEVICE BELONG TO THIS JOB? + ISZ DTE0 /YES + JMP I DTE0 /RETURN +DTE6, STA + TAD DEVTBA /POINT TO DUMMY DEVTBL ENTRY + JMP DTE5 + + +DTE2, 0 +NULNM1, -NULINE-1 +P3777, 3777 +NUDEVM, DEVTBE-JOBTBL +NUDEV, JOBTBL-DEVTBE + +DTE10, AND P3777 + TAD NUDEVM /CHECK DEVICE NUMBER FOR VALIDITY + SMA + JMP DTE6 /INVALID DEVICE NUMBER + TAD NUDEV /GET DEVICE NUMBER BACK + JMP DTE4 /GO FINISH UP + LNK0, 0 /GET FILE LINKAGE + TAD LNKF + DCA LNK1 + FGETJT +LNK1, 0 + DCA CFH + DATFLD + TAD I CFH /PTR TO FILE CONTROL BLOCK + JMP I LNK0 +LNKF, JOBF0 +SAV1, +FGETJ0, 0 + CFLD + TAD I FGETJ0 + DCA .+4 + TAD JOBDAT + CIF + GETJTA + 0 + ISZ FGETJ0 + JMP I FGETJ0 +SAVCRE, 0 + DCA SAV1 + TAD SAV1 /FILE ADDR + TAD P0004 /PTR TO PROTECTION BITS IN FILE + DCA SAV2 + TAD I SAV2 /GET THE PROTECTION BITS + AND C0020 /IS IT WRITE PROTECTED AGAINST THE OWNER? + SZA CLA + JMP I EXT10A /YES, RETURN WITH PROT. VIOLATION MESSAGE + TAD SAV1 /NO, REDUCE THE FILE TO 0 SEGS + JMS I RED11 /GO DO REDUCTION + JMP I SAVCRE /RETURN +RED11, RED1 +EXT10A, EXT10 +SAV2, +CRFUFD, 1 + JMS I ACC01 /IS THIS ACCOUNT 1? + JMP CRFUF1 /YES + IAC + DCA I INDEX /FILE SIZE INITIALLY 1 + JMP I CRFUFD /BACK FOR THE DATE +CRFUF1, DCA I INDEX /ZERO CPU TIME + JMP I .+1 /GO ZERO DEVICE TIME ALSO + CRFUFR +/CONVERT AN ABSOLUTE PTR INTO RETTBL TO A RELATIVE ENTRY NUMBER +ENS3, 0 + CIA + TAD RETTBL /REL. PTR TO ADDRESS WITHIN RETTBL + CIA + AND P7770 /ANY POINTER WITHIN THE BLOCK IS OK + CLL RTR + RAR /DIVIDE BY 8 + JMP I ENS3 + /ROUTINE TO ASSIGN A DEVICE + +*3600 +ASD1, TAD FIOSTK+1 + SMA /TTY? + JMP I LGI201 /DON'T LET HIM/HER ASSIGN TTY'S! RETURN WITH AC=7777 + JMS I DTE01 /IS THIS DEVICE ASSIGNED TO THIS JOB? +ASD2, 0 /SET BY DTE01 TO POINT TO PROPER ENTRY IN DEVTBL + SKP + JMP ASD4 /YES + TAD I ASD2 /GET DDB ADDRESS FOR THIS DEVICE + SZA /ZERO? + JMP ASD11 /NO, SO SOMEONE HAS IT +/COMES HERE IF OKAY TO MAKE THIS ASSIGNMENT + CFLD /CHANGE TO CURRENT FIELD + TAD ASD2 + 6202 /CIF FIELD 0 + GETDDB /GET A BLOCK FROM THE FREE LIST AND LINK IT INTO DEVTBL + JMP I LGI201 /NO BLOCK.. REDO IN CASE OF USER OTHERWISE ERROR RETURN FOR SI + DATFLD + TAD I ASD2 /PICK DDB ADDRESS FROM DEVTBL + DCA CFH /SAVE IT + TAD FIOSTK+1 + AND P0037 /CLEAR BIT 0 + DCA I CFH /SET TO REFLECT THE DEVICE NUMBER + ISZ CFH + TAD FIJOB + DCA I CFH /PLUG IN THE JOB NUMBER +ASD7, CFLD + JMP I FIEXIT + +/COMES HERE IF ONE JOB ATTEMPTS TO ASSIGN AN ALREADY ASSIGNED DEVICE +ASD11, IAC + DCA CFH + TAD I CFH + SNA + CMA + DCA FIUSAC /DELIVER TO USER'S AC + JMP ASD7 /EXIT + +ASD4, TAD FIOSTK+1 + CLL RAL + SZA CLA /PTR? + JMP ASD7 /NO + TAD I ASD2 + CIF 00 + JMS I ASDCLR /CLEAR THE READER BUFFER + JMP ASD7 +ASDCLR, SICLR + /ROUTINE TO PERFORM ACTUAL REDUCTION + +/CALLING SEQUENCE: +/ TAD (NUMBER OF SEGMENTS TO REMAIN) +/ JMS RED30 +/ RETRIEVAL CHAIN POINTER +/ UFD RETRIEVAL POINTER +/ RETURN + + +/FIRST TRACE THRU THE LINKED LIST OF FILE INFORMATION +/RETRIEVAL BBLOCKS UNTIL WE GET TO THE ONE IN WHICH THE +/NEW LAST SEGMENT IS +RED30, 0 + DCA RED31 /LINKAGE TO RETRIEVAL CHAIN + TAD GDRETP /PICK UP RETRIEVAL POINTER + JMS I GE01 /GET THIS WORD INTO CORE +RED31, 0 + DCA REBUFF + TAD I REBUFF /PICK UP LINK TO NEXT + DCA RED31 /SAVE LINK + TAD WNDREM /DELETING ENTIRE WINDOW? + SNA CLA + JMP RED36 /YES, REMOVE LINK TO LAST WINDOW AS WELL +RED37, ISZ REWNDC /AT END OF CHAIN? + JMP RED30+2 /NO, KEEP SAVING + DCA I REBUFF /YES, TERMINATE IT +/FOUND RETRIEVAL BLOCK IN WHICH TO CHOP OFF +/THE LIST OF SEGMENTS. +/START DELETING THE SEGMENT NUMBERS AND RETURNING +/THE ACTUAL DISC SEGMENTS TO THE POOL + TAD WNDREM + IAC /GET POINTER TO FIRST SEGMENT TO BE DELETED + TAD REBUFF + DCA REBUFF /POINTER TO FIRST SEGMENT TO REMOVE + DCA SEGLIM /CLEAR SEGMENT COUNTER + TAD WNDREM /NUMBER OF SEGMENTS TO LEAVE IN RET. WINDOW +RED32, TAD C7771 /7 SEGMENTS PER RETRIEVAL WINDOW + DCA REWNDC /SAVE COUNT + DCA BUFMOD /REMEMBER TO WRITE OUT THE BUFFER +RED33, TAD REDM9 + DCA CFH /SET COUNT FOR SATREL DIVIDE + STL STA + TAD I REBUFF /PICK UP THE SEGMENT NUMBER + SZL /IS IT A REAL SEGMENT + JMP RED38 /NO; END OF WINDOW, END OF FILE + JMS I SATREA /RELEASE IT ON SAT + DCA I REBUFF /CLEAR THE CCELL + ISZ SEGLIM /COUNT SEGMENT + ISZ REBUFF + ISZ REWNDC /END OF CURRENT RETRIEVAL WINDOW? + JMP RED33 /NO, CONTINUE + TAD RED31 /YES, MOVE TO NEXT + SNA /END OF CHAIN? + JMP RED39 /YES, EXIT + RED34, DCA RED35 /NO + TAD GDRETP + JMS I GE01 /GET NEXT WINDOW +RED35, 0 + DCA REBUFF + TAD I REBUFF + DCA RED31 /SET UP LINK TO NEXT + DCA I REBUFF /CLEAR FIRST WORD OF WINDOW + ISZ REBUFF + JMP RED32 /KEEP WIPING OUT + +RED36, STL CLA RTL /ARE WE TWO WINDOWS FROM THE END YET? + TAD REWNDC + SZA CLA + JMP RED37 /NOT EXACTLY + DCA I REBUFF /YES, CLEAR LINK TO NOW EMPTY WINDOW + DCA BUFMOD /SCHEDULE WRITE + JMP RED37 + +RED38, CLA + DCA I REBUFF /CLEAR TO END OF WINDOW + ISZ REBUFF + ISZ REWNDC /ARE WE THERE YET? + JMP RED38 /NO +RED39, TAD GDRETP /GET RETRIEVAL POINTER + JMS I ENS32 /CONVERT IT INTO A RELATIVE ENTRY NUMBER + STL RTL /TIMES 4 PLUS 2 + IAC + TAD UFDTBL /POINTS TO WORD3 OF UFDTBL ENTRY + DCA REBUFF + TAD I REBUFF /HAS HIS/HER SEGMENT COUNT BEEN SET UP YET? + SNA CLA + JMP I RED30 /NO; SO JUST EXIT + TAD SEGLIM /NUMBER OF SEGMENTS WE REMOVED FROM THIS FILE + CIA + TAD I REBUFF /SUBTRACT FROM THOSE THAT WE KNEW ABOUT + DCA I REBUFF /UPDATE UFDTBL ENTRY + STA + DCA TABSTA /REMEMBER TO WRITE OUT THE TABLES + JMP I RED30 /EXIT + +ENS32, ENS3 +REDM9, -11 +SATREA, SATREL +REBUFF, 0 + *4000 +/RENAME ROUTINE + +REN0, JMS I ACC01 /IS IT ACCOUNT 1? + JMP PASSQU /YES; GO CHANGE PASSWORD AND DISK QUOTA + JMS I IFN01 + TAD FIOSTK+1 /PICK UP INTERNAL FILE NUMBER + JMS I UC01 /USER-OWNER CHECK + JMP I REN1A /USER NOT OWNER, ERROR + JMS I FILNAM /CHECK IF THIS NEW NAME IS IN DIRECTORY + JMP I BADNAM /YES, DON'T RENAME + TAD FIOSTK /PICK UP INTERNAL FILE NUMBER NOW SHIFTED TO FIOSTK + JMS I GD01 /GET THIS DIRECTORY ENTRY INTO CORE + DCA REENTP /POINTER TO DIRECTORY ENTRY + TAD REENTP + TAD P0004 + DCA REPRTP /POINTER TO PROTECTION BITS + TAD I REPRTP /PICK UP PROTECTION BITS + AND C0020 /WRITE PROTECTED AGAINST OWNER? + SZA + JMP I REN1A /YES, ERROR + TAD FIOSTK+2 /TRANSFER NEW NAME TO DIRECTORY + SNA /IS IT A NULL NAME? + JMP I BADNAM /YES, DON'T RENAME + DCA I REENTP + ISZ REENTP + TAD FIOSTK+3 + DCA I REENTP + ISZ REENTP + TAD FIOSTK+4 + DCA I REENTP + DCA BUFMOD /SCHEDULE WRITE + JMP I FIEXIT /EXIT FROM FILE PHANTOM +REN1A, REN1 +FILNAM, USENAM +BADNAM, CRF30 +SEGS0, TAD I SEGCNT + DCA FIUSAC + JMP I FIEXIT +SEGCNT, -SATSIZ+1 +SIFLD, CORTBL+1 + +PASSQU, CDF 00 + TAD I SIFLD /IS THIS REQUEST FROM SI? + AND C0200 + CFLD + SZA + JMP I REN1A + TAD FIOSTK+1 /OR IS [S]HE TRYING ACCOUNT 0? + SNA + JMP I BADNAM /YES; ERROR + JMP I .+1 + PASQU0 + /BUILD A RETRIEVAL POINTER GIVEN RELATIVE POSITION ON RETTBL + +/CALLING SEQUENCE: +/ TAD (RELATIVE POSITION) +/ JMS BLDP +/ RETURN (POINTER IN AC) + +REENTP, +BLDP, 0 + DCA CFH + CLA CMA + TAD CFH + CLL RAL + RTL + TAD RETTBL + JMP I BLDP +/JMS I LINK01 +/MISSING SEGMENT ADD +/REPLACEMENT + +LINK0, 0 + DCA LINK1 + TAD GDRETP + JMS I GE01 +LINK1, 0 /GET A DIRECTORY WORD INTO CORE + TAD P0003 + DCA LINK2 + TAD I LINK2 + CIA + TAD I LINK0 + SZA CLA /SEARCH THROUGH UFD UNTIL WE FIND ENTRY BEING SOUGHT + JMP LINK3 + ISZ LINK0 + TAD I LINK0 /TAKE A BLOCK OUT OF THE CHAIN + DCA I LINK2 + DCA BUFMOD /SCHEDULE WRITE + ISZ LINK0 + JMP I LINK0 + +REPRTP, +LINK2, 0 + +LINK3, TAD I LINK2 + JMP LINK0+1 + /ROUTINE TO SET UP A UFDTBL ENTRY AS FOLLOWS: +/WORD 0: PROJECT, PROGRAMMER NUMBER +/WORD 1: -ACCESS COUNT +/WORD 2: -DISK SEGMENT QUOTA (LOGIN) +/WORD 3: ACTUAL NUMBER OF SEGMENTS OWNED. +/(WORDS 1 AND 3 ARE INITIALLY SET TO 0.) +/WORD 3 IS LOADED BY "CREATE," OR BY "EXTEND" IF IT HAS NOT PREVIOUSLY +/BEEN LOADED. "CREATE" & "EXTEND" ALWAYS MODIFY WORD 3, "REDUCE" ONLY +/MODIFIES WORD 3 IF IT IS NON-ZERO. + +UFQUOT, 0 + DCA I INDEX /SAVE PROJECT, PROGRAMMER NUMBER + DCA I INDEX /ZERO ACCESSES SO FAR + TAD SEGLIM /LOGGED IN QUOTA + CLL RAL /TIMES 2 + TAD SEGLIM /THREE + RAL /SIX + RTL /TWENTY FOUR + TAD SEGLIM /TWENTY FIVE + CIA /NEGATE + DCA I INDEX /SAVE LOGGED-IN SEGMENT QUOTA + DCA I INDEX /NO KNOWN SEGMENTS AS OF YET + JMP I UFQUOT + /ROUTINE TO GET THE NUMBER OF A DEVICE ATTACHED TO THIS JOB + +/CALLING SEQUENCE: +/ JMS LNS0 +/ RETURN IF NONE AVAILABLE +/ NORMAL RETURN (DEVICE NUMBER IN AC) + +LNS0, 0 + TAD DEVTBA /GLOBAL TO #DEVTBL# + DCA CFH + DATFLD /CDF FIELD 0 +LNS4, TAD I CFH /PICK UP POINTER TO DDB + SNA + JMP LNS2 /DEVICE UNASSIGNED + IAC + DCA LNS3 /POINTER TO SECOOND WORD OF DDB + TAD I LNS3 + AND P0037 /PICK OFF THE JOB NUMBER OF OWNER + CIA + TAD FIJOB /NUMBER OF CURRENT JOB + SNA CLA + JMP LNS5 /THIS DEVICE IS OURS +LNS2, ISZ CFH + TAD CFH + CMA + TAD DEVOVR /GLOBAL TO "JOBTBL" + SZA CLA + JMP LNS4 /CONTINUE LOOKING DOWN TABLE +LNS7, CFLD /MAKE SURE WE ARE IN THIS FIELD + JMP I LNS0 /FOUND NOW DEVICES + +LNS5, TAD DEVEND + CIA + TAD CFH + ISZ LNS0 + SMA + JMP LNS6 + TAD LNS10 + CLL RAR + JMP LNS7 + +LNS6, TAD C4000 + JMP LNS7 + +LNS10, DEVTBE-DEVTBL +LNS3, 0 +C4000, 4000 + /ROUTINE TO RELEASE A DEVICE + +*4200 + +REL00, 0 + JMS I DTE01 /IS THIS DEVICE ASSIGNED TO THIS USER? +REL5, 0 /SET BY DTE0 TO POINT TO DEVTBL ENTRY FOR THIS DEVICE + JMP REL13 /NO, SO DON'T RELEASE IT + TAD I REL5 + DCA REL6 /SAVE ADDRESS OF DDB FOR LATER + TAD REL6 + TAD P0003 /POSITION OF TIME IN DDB + DCA REL2 + TAD I REL2 /GET TIME ASSIGNED + CIA + DCA REL2 /-TIME ASSIGNED + CDF + TAD I RELCK1 /GET TIME NOW + RTL + RTL + AND P0007 /JUST SIGNIFICANT PART OF LOW ORDER TIME + DCA REL3 + TAD I RELCK2 + DATFLD + RTL + RAL + AND P7770 /JUST INSIGNIFICANT PART OF HI ORDER + TAD REL3 /TIME AT RELEASE + CLL + TAD REL2 /-TIME AT ASSIGNMENT + DCA REL2 /TIME WE OWNED IT + TAD REL2 + SNL /GONE THRU MIDNITE WHILE ASSIGNED? + TAD RELCON /YES, FUDGE TO PROPER VALUE + SZA + JMS I DVT01 /RECORD TIME SINCE WE USED A MEASURABLE AMOUNT + STL + TAD REL5 + TAD RELCDR /IS IT A CARD READER OR DECTAPE OR RK05? + SPA + RAR /NO - IS IT A KEYBOARD OR THE PTR? + SNL + JMP REL11 /EITHER KEYBOARD, PTR, CDR, DTA, OR RK05 + TAD RELREG /EITHER PTP OR LPT + REL8, DCA REL6 /ENTER HERE FROM REL12 FOR TELEPRINTER + STA + TAD I REL5 + DCA INDEX /POINT TO WORD 0 OF DDB (AUTOINDEXED) + TAD I INDEX /CHECK STATUS IF TELEPRINTER + SPA CLA + JMP REL4 /[S]HE'S IN THE ^S CONDITION - FLUSH HIM/HER OUT + DCA I INDEX /CLEAR THE JOB NUMBER + ISZ INDEX + ISZ INDEX + TAD I INDEX /CHECK FILL POINTER + SZA CLA + JMP REL9 /STILL BUSY - LET "CONOUT" RELEASE IT + TAD REL6 + SZA CLA /ASSIGNABLE DEVICE? + JMP REL7 /YES +REL4, TAD I REL5 + CIF 00 + JMS I RELTBL /MAKE SURE THE BUFFER IS CLEAR + DATFLD + TAD I REL5 /RELEASE THE DDB + JMS I RETBK1 + CLA + DATFLD + DCA I REL5 +REL9, CFLD + JMP I REL00 +REL7, CIF 20 /INHIBIT INTERRUPTS + TAD I REL6 + CLL RAL + SNA + JMP REL4 + SPA + STL + RAR + DCA I REL6 + JMP REL9 + REL11, SMA CLA /IS IT A KEYBOARD OR THE PTR? + JMP REL12 /NO + TAD REL6 + CIF 00 + JMS I RELTBL /FLUSH OUT THE BUFFER +REL12, TAD REL6 + JMS I RETBK1 /RELEASE THE DDB + CLA + DATFLD + DCA I REL5 /REMOVE FROM DEVTBL + TAD DEVEND + CIA + TAD REL5 + SMA CLA + JMP REL9 + ISZ REL5 + JMP REL8 + +REL13, CDF + TAD I JOB + AND C0200 + CFLD + SZA CLA /CALLED BY SI?? + JMP I LGI201 /YES, INDICATE ERROR WITH AC=-1 + JMP I REL00 /NO, UUO CALL +RELREG, OUTREG+NULINE+3 +RELCDR, -DEVTBE-4 +DVT01, DVT0 +REL2, 0 +REL3, 0 +RELCK1, CLK1 +RELCK2, CLK2 +RELCON, 3227 /FUDGE FOR MIDNIGHT OVERFLOW +RELTBL, SICLR +P0100, 100 +FIXSCH, 0 + IAC + DCA REL5 + TAD I REL5 + AND P0100 + SNA CLA + JMP I FIXSCH + TAD DEVOVR + CIA + TAD INDEX +FIXOUT, CIF CDF + DCA I FIPJOB + WAIT + EXCEED, 215;212;"[;" ;" ;" ;" ;" ;" ;" ;"E;"X;"C;"E;"E;"D;"I;"N;"G + " ;"D;"I;"S;"K;" ;"Q;"U;"O;"T;"A;"];215;212;0 +/COMPLETION OF LOGOUT ROUTINE +/REMOVES JOB FROM PERMANENT MONITOR TABLES +/MUST BE DONE LAST, SINCE WE NEED THE JOB STATUS BLOCKS +/TO INDICATE ANY ERRORS IN THE FIP I/O + +LGO4, TAD LGO500 /RESTORE THE FIP EXIT + CFLD + DCA I LGOFIX + TAD FIJOB /SEE IF [S]HE OWNS ANY CORE FIELDS + CIF + CORE /SEARCH CORE TABLE FOR HIM/HER + FIP SI CJOB + JMP LGO5 /NO; NOTHING TO RELEASE + AND P0007 /YES; RELEASE THE FIELD + TAD CORTBA + DCA CFW /POINTS TO ENTRY IN CORTBL + CDF + DCA I CFH /ZERO THE ENTRY +LGO5, TAD FIJOB /RETURN STATUS BLOCKS + TAD DEVOVR /START OF JOB TABLE (END OF DEVTBL) + DCA LGO6 /POINTS TO JOB TABLE ENTRY + DATFLD + TAD I LGO6 /GET ADDRESS OF JOB STATUS + JMS I LGOBLS /RETURN STATUS + DATFLD + DCA I JOBDAT /CLEAR JOBDAT + DCA I LGO6 /CLEAR POINTER IN JOBTABLE + CDF + DCA I JOB /CLEAR JOB (SO SAVJOB WON'T SAVE US) + JMP I .+1 /AND NOW GO DO FIX50 +LGO500, FIX50 +LGOBLS, RETBLS +LGOFIX, FIX500 +LGO1, TAD FIOSTK+1 /LOGOUT WITH AC=0? + SZA CLA + JMP I LGI201 /NO, SO IT'S AN ERROR + TAD FIJOB + TAD JOBTAB + DCA CFH /GET HIS/HER PROJ-PROG # + TAD I CFH + CIA + DCA FIOSTK+2 /SAVE HIS/HER # + TAD JOBTAB + DCA INDEX /INITIALIZE TO START OF TABLES + TAD LGOMAX /-JOBMAX + DCA FIOSTK+3 /COUNT OF JOBS TO CHECK + DCA FIOSTK+4 /COUNT OF MATCHES + TAD I INDEX + TAD FIOSTK+2 /COMPARE + SNA CLA + ISZ FIOSTK+4 /EXACT MATCH - INDEX COUNT + ISZ FIOSTK+3 /DONE? + JMP .-5 /NO + STA /YES - RETURN # OF MATCHES -1 + TAD FIOSTK+4 + DCA FIUSAC + JMP I FIEXIT /AND AWAY + +LGOMAX, -JOBMAX + OPN11, 0 + DCA OPN13 + TAD FIOSTK+2 /GET RETRIEVAL POINTER OF UFD BEING ACCESSED + CIA + TAD RETTBL /IS IT THE MFD? + SNA CLA + JMP OPN14 /MFD OR UFD, READ OK/WRITE NEVER OK + JMS I ACC01 /IS [S]HE THE SYSTEM MANAGER? + JMP OPN12 /YES; SKIP PROTECTION CHECK + TAD I OPN11 /GET PROPER TEST BITS + AND P0007 /JUST TEST FOR READ PROTECTION FIRST + AND I OPN13 /COMPARE AGAINST FILE'S PROTECTION WORD + SZA CLA + JMP I OPNPRA /PROTECTION ERROR + TAD I OPN11 /READ OK, GET TEST BITS FOR WRITE + CLL RAL /CHECK FOR WRITE PROTECTION + AND I OPN13 +OPN12, CMA + DCA LGO6 /-1 IF OK TO WRITE + TAD I ZDS1 /SOME MORE CONDITIONS TO TEST + DCA OPN13 + TAD FIOSTK+2 + JMS I OPN16 /IS [S]HE THE ONLY PERSON TO OPEN THE FILE? +OPN13, 0 + JMP OPN14 /NO + TAD BASSWT + CIA + DATFLD + SZA + DCA I BASWIN /MAKE SURE THE BASIC WINDOW GETS LOADED + CFLD + ISZ LGO6 /IS [S]HE ALLOWED TO MODIFY IT? +OPN14, TAD P0004 /NO, SO WRITE PROTECT BIT IS ON + ISZ OPN11 /SKIP ON RETURN + JMP I OPN11 +OPN16, ENS0 +OPNPRA, OPNPRE + + +LGO6, +FIX40, 0 + DCA FLPARB+3 + TAD FLPARB+3 + DCA FLPARB+5 + CLA CMA + TAD FLPARB+5 + DCA FLPARB+4 + JMP I FIX40 + *4600 +TTYTBA, TTYTBL +CLK1A, CLK1 +CLK2A, CLK2 +RESET, DCA I CFH + FGETJT + JOBACC + DCA ADDR + DATFLD + TAD FIOSTK+2 + DCA I ADDR /PLUG HIS/HER ACCOUNT # INTO HIS JOB STATUS BLOCKS + TAD FIJOB /GET JOB # + TAD TTYTBA + DCA ADDR + TAD I ADDR /GET LINE # + CLL RAL + TAD DEVTBA /FIND THE DDB + DCA ADDR + TAD P0003 + TAD I ADDR + DCA ADDR + CDF + TAD I CLK1A + RTL + RTL + AND P0007 + DCA CFH + TAD I CLK2A + RTL + RAL + AND P7770 + TAD CFH + DATFLD /NOW RESET THE + DCA I ADDR /ASSIGN TIME + JMP I .+1 /THEN EXIT + TABOUT + BASCO0, 0 + JMS I IFN01 /JUST RETURN INTERNAL FILE # IN FIOSTK+1 + TAD FIOSTK+1 + JMS I CL01 /CLOSE ANY FILE THAT IS OPEN + TAD FIOSTK+3 /MAY BE + SNA /IS IT A NULL FILE NAME? + JMP I OPN3A /YES, ERROR RETURN + TAD OPN3A+1 /COMPARE BA + SZA CLA + JMP BASSET /NO MATCH + TAD FIOSTK+2 /IS ACCT # 2? + SNA + JMS I JBLD0 /WHAT'S HIS/HER ACCOUNT? + CLL RTR + SNA CLA + TAD FIOSTK+4 /COMPARE SI + TAD OPN3A+2 + SNA CLA + TAD FIOSTK+5 + TAD OPN3A+3 /COMPARE C + SNA CLA + CMA /IF BASIC, BASSWT=-1 +BASSET, DCA BASSWT /IF NOT, BASSWT=0 + TAD FIOSTK+1 + JMS I EBLD0 /GET PTR TO ENTTBL WORD 1 RELATIVE PTR WORD 2 ADDRESS IN UFD + JMP I BASCO0 /RETURN +OPN3A, OPN3 + -4241 /-BA + -6351 /-SI + -4300 /-C + +CLOBAS, 0 + JMS I RETBK1 + DCA BAS3 + TAD BAS3 + CIA + TAD BASWIN + SNA CLA + JMP CLOBA1 + TAD BAS3 + JMS I RETBK1 + CLA SKP +CLOBA1, CLA CMA + JMP I CLOBAS + BAS0, 0 + DCA BAS1 /SAVE BUFFER ADDRESS OF RETRIEVAL WINDOW + TAD BASWIN /BASIC WINDOW ADDRESS + DCA ADDR /GET BUFFER ADDRESS READY +BAS5, TAD BAS1 / + DCA BAS2 + TAD C7771 + DCA BAS3 /COUNT OF 7 SEGS PER WINDOW +BAS4, ISZ BAS2 + CFLD + TAD I BAS2 /PICK UP THE SEG # + ISZ ADDR + SNA + JMP BAS6 + DATFLD + DCA I ADDR /SAVE IT IN WINDOW + ISZ BAS3 /COUNT + JMP BAS4 /STILL IN SAME BLOCK + CFLD + TAD I BAS1 /CHANGE THE BLOCK + SNA + JMP BAS6 /NO MORE SEGMENTS + DCA BAS1 + TAD FIOSTK+2 /GET THIS BLOCK OF UFD IN BUFFER + JMS I GE01 +BAS1, 0 + DCA BAS1 /SAVE THE BUFFER ADDRESS CONTAINING THE NEEDED BLOCK + JMP BAS5 /CONTINUE +BAS6, SNA + TAD I BAS1 + SZA CLA + JMP I BAS123 /BASIC MUST BE 39 SEGMENTS OR LESS TO USE SPECIAL WINDOW + TAD ADDR + SMA CLA + JMP .+5 + DATFLD + DCA I ADDR + ISZ ADDR + JMP .-2 + DATFLD + CLA CMA + DCA I BASWIN /-1 IN FIRST WORD TO MARK BASIC WINDOW + JMP I BAS0 +ADDR, 0 +BAS2, 0 +BAS3, 0 +BAS123, OPN123 + /ROUTINE TO LET SYSTEM MANAGER CHANGE PASSWORDS AND DISK QUOTAS + +UFDNAM, RTABLE + 0 + +PASQU0, DCA UFDNAM+1 /SAVE ACCOUNT NUMBER TO SEARCH FOR + CMA + JMS I DS01 /SEARCH MFD FOR THIS ACCOUNT + UFDNAM + JMP PASNOT /ACCOUNT NOT FOUND IN MFD + DCA INDEX /SAVE POINTER TO OLD PASSWORD + TAD FIOSTK+2 /FIRST TWO CHARACTERS OF NEW PASSWORD + DCA I INDEX /SAVE IN MFD NAME BLOCK + TAD FIOSTK+3 /SECOND TWO CHARACTERS OF NEW PASSWORD + DCA I INDEX /SAVE IN MFD + ISZ INDEX /SKIP PAST LINK TO NEXT UFD + TAD FIOSTK+4 /GET NEW DISK QUOTA + DCA I INDEX /SAVE NEW QUOTA + DCA BUFMOD /REMEMBER TO WRITE OUT THE MFD SEGMENT + TAD FIOSTK+1 /SEE IF THIS ACCOUNT IS CURRENTLY IN THE UFDTBL + JMS I UTS01 + JMP I FIEXIT /NOT THERE + ISZ UTPRNU /POINTS TO -QUOTA ENTRY + STA + TAD FIOSTK+1 /IS IT THE QUOTA FOR THE "GRACE SPACE"? + SNA CLA + JMP PASQU1 /YES + TAD FIOSTK+4 /TRIM OFF THE LOGOUT PORTION OF THE QUOTA + AND P0077 + DCA FIOSTK+4 + TAD FIOSTK+4 + CLL RAL /MULTIPLY BY TWO + TAD FIOSTK+4 /THREE + RAL /SIX + RTL /TWENTY FOUR +PASQU1, TAD FIOSTK+4 /TWENTY FIVE; OR ACTUAL COUNT IF FOR "GRACE SPACE" + CIA /NEGATE THE RESULT + DCA I UTPRNU /SAVE AWAY IN THE UFDTBL + JMP I .+1 + TABOUT + +PASNOT, TAD P7000 /RETURN FILE NOT FOUND + DCA FIUSAC + JMP I FIEXIT + /SUBROUTINE TO FIND AN EMPTY DIRECTORY ENTRY + +/CALLING SEQUENCE: +/ TAD (POINTER TO UFD RETRIEVAL INFORMATION) +/ JMS DE0 +/ BAD RETURN (COULD NOT FIND A FREE ENTRY) +/ NORMAL RETURN (POINTER TO ENTRY IN AC) + +DE0, 0 + DCA DERETP /SAVE RETRIEVAL PTR + DCA DE2 /ZERO THE ADDRESS IN UFD + TAD BUFSTA /IS THERE A SEGMENT IN THE BUFFER? + SMA CLA + JMP DE7 /NO, SO START FROM THE BEGINNING + TAD I GERETA /GET THE SEGMENT IN CORE + CMA + DCA NSEGCR + TAD DERETP /GET RETRIEVAL PTR FOR INCREMENT + DCA UFDPTR +DE5, TAD I UFDPTR + SNA /IS THERE A SEGMENT? + JMP DE7 /NO, START FROM 0 LOC IN UFD + TAD NSEGCR /YES, DOES IT AGREE WITH THE SEGMENT IN CORE? + SNA CLA + JMP DE6 /YES, START SEARCHING AT THIS POINT + TAD DE2 /NO, INCREMENT THE ADDR + TAD C0400 + DCA DE2 + ISZ UFDPTR /POINT TO NEXT SEGMENT IN RETRIEVAL BLOCK + JMP DE5 /GO BACK +DE7, DCA DE2 /INDICATE THAT SEARCH IS FROM WORD 0 + STA +DE6, DCA I UFD01 /SAVE SECOND PASS FLAG +DE1, TAD DERETP + JMS I GE01 /GET ENTRY INTO CORE +DE2, 0 + SNA /SKIP IF ENTRY EXISTS + JMP DE4 /DID NOT EXIST, EXTEND UFD + DCA DEBUFP + TAD I DEBUFP /FIRST WORD OF ENTRY + SZA CLA + JMP DE3 /NOT EMPTY, LOOK AT NEXT ENTRY + ISZ DEBUFP /ZERO COULD MEAN END OF STRING OF RETRIEVAL INFORMATION BLOCKS + TAD I DEBUFP /LOOK AT SECOND WORD OF ENTRY + SZA CLA /IF ZERO, EMPTY ENTRY + JMP DE3 /NOT EMPTY, KEEP LOOKING + TAD DE2 /PICK UP ENTRY POINTER + SNA /ENTRY 0 NEVER AVAILABLE + JMP DE3 + ISZ DE0 /POINT TO NORMAL RETURN + JMP I DE0 + DE3, TAD C0010 /INCREMENT TO NEXT ENTRY + TAD DE2 + DCA DE2 /SAVE NEXT ENTRY INDEX + JMP DE1 /LOOK AT NEXT ONE + +DE4, ISZ I UFD01 /HAVE WE TRIED FROM THE BEGINNING YET? + JMP DE7 /NO, WELL TRY IT THEN... + TAD DERETP + JMS I UFD01 /TRY EXTENDING THE UFD + JMP I DE0 /TOO BAD, CAN'T EXTEND UFD + JMP DE1 /NOW WE HAVE PLENTY OF ROOM +DEBUFP, 0 +UFD01, UFD0 +DERETP, 0 +UFDPTR, 0 +GERETA, RDCURR +NSEGCR, 0 + +/ROUTINE TO OUTPUT QUOTA EXCEEDED MESSAGE +EXTEL0, 0 + DATFLD + TAD FIJOB /CURRENT JOB NUMBER + TAD TTYTAB /POINTS AT POSITION IN TTYTBL + DCA DE0 + TAD I DE0 /GET CONSOLE NUMBER FOR THIS JOB + STL RAL /TIMES 2 PLUS 1 + TAD DEVTBA /INDEX TO OUTPUT DDB + CDF + DCA I CONDVA /STORE FOR FIELD 0 PRINT ROUTINE + CFLD + TAD EXTMES /GET MESSAGE POINTER + DCA INDEX +EXTEL1, TAD I INDEX /GET CHARACTER OF THE MESSAGE + SNA /ANY LEFT? + JMP I EXTEL0 /NO; SO GO EXTEND + CIF CDF 00 + DCA I FICHAR /STORE FOR PRINT OUT ROUTINE + CFLD + PRINT /SEND MESSAGE #[EXCEEDING DISK QUOTA]# + JMP I EXTEL0 /RAN OUT OF SPACE IN THE OUTPUT BUFFER (TOO BAD!) + JMP EXTEL1 /BACK FOR NEXT CHARACTER + +TTYTAB, TTYTBL +CONDVA, CONDBA +EXTMES, EXCEED-1 +FICHAR, TTCHAR + /ROUTINE TO CLEAR ALL CPU AND DEVICE TIME ACCUMULATORS IN THE MFD +/THIS IS USED BY THE #RESET# FUNCTION IN THE CUSP #CAT# +LGRES0, CLA IAC /SET RESET FLAG IN DIRECTORY SEARCH ROUTINE + DCA I RETBK1 + TAD RETBK1 + DCA EXQ1 /SET POINTER SO FLAG WILL CLEAR ON COMPLETION + TAD RETTBL + DCA GDRETP /SET RETRIEVAL POINTER + JMS LOQUO /GO DO THE RESET + CMA /SHOULD RETURN A ZERO IN AC + JMP EXTQU1 + +/ROUTINE TO COUNT TOTAL SEGMENTS OWNED BY A UFD AND +/SAVE THE RESULT IN WORD 3 OF THE UFDTBL ENTRY FOR THE RESPECTIVE UFD +/CALL: +/ EXQ1 POINTS TO WORD 3 OF CORRECT UFDTBL ENTRY +/ JMS LOQUO +/ RETURN (ENTRY 3 LOADED, TOTAL ALSO IN AC) + +EXQ3, +LOQUO, 0 + DCA WNDREM /FUDGE A FILE NAME BEGINNING WITH TWO SPACES + JMS I DS01 /SEARCH DIRECTORY TO DETERMINE SEGMENT COUNT + GDRETP /(HOPE NO ONE SCRAMBLES LOC. 23-26 ON PAGE 0!!) + CLA SKP /GOOD - COULDN'T FIND SUCH A FILE + JMP I DIRBAD /FOUND IT! OOPS! + TAD SEGLIM /GET THE TOTAL FROM THE DIRECTORY SEARCH + DCA I EXQ1 /SAVE IN UFDTBL + TAD FIOSTK+1 /INTERNAL FILE NUMBER? + SMA /IF THIS IS NOT A "RESET" WE MUST RELOAD + JMS I GD01 /THE CORRECT DIRECTORY SEGMENT + DCA REL6 /SAVE POINTER TO NAME BLOCK + TAD SEGLIM /RETURN WITH CURRENT TOTAL + JMP I LOQUO + + +EXTQU8, CLA /WE'VE BEEN HERE BEFORE FOR THIS GUY + CFLD + TAD EXQ2 /WILL THIS EXTEND CARRY + TAD I EXQ1 /THIS FILE ACROSS THE QUOTA BOUNDARY AGAIN? + SMA SZA CLA /(I.E. HAS [S]HE REDUCED SINCE LAST EXTEND?) + JMP EXTQU9 /NO; [S]HE'S STILL ABOVE QUOTA, EXTEND QUIETLY +EXTQU6, TAD EXFILE /ADDRESS WITHIN MESSAGE TO STORE FILE NAME + DCA INDEX + JMS EXTNAM /CHAR 1 & 2 OF FILE NAME + JMS EXTNAM /CHAR 3 & 4 OF FILE NAME + JMS EXTNAM /CHAR 5 & 6 OF FILE NAME + JMS I EXTELL /NOTIFY USER THAT QUOTA IS BEING EXCEEDED +EXTQU9, CLA + JMP I EXTQU0 /EXIT TO EXTEND FILE AS REQUESTED + +EXTQU5, TAD FIOSTK+2 /NUMBER OF SEGMENTS [S]HE WON'T GET +EXTQU1, DCA FIUSAC /PASS RESULT BACK TO THE USER + JMP I FIEXIT + /ROUTINE TO CHECK LOGIN QUOTA BEFORE EXTENDING A FILE + +EXTQU0, 0 + TAD GDRETP /COMPARE RETRIEVAL POINTER + CIA + TAD RETTBL /AGAINST THE MFD'S ENTRY + SNA CLA /IS IT FROM THE SYSTEM MANAGER? + JMP I VIOLAT /GET OUT QUICK, BEFORE [S]HE DESTROYS THE SYSTEM + TAD FIOSTK+2 /NUMBER OF SEGMENTS TO BE ADDED + SPA /IS [S]HE BEING REASONABLE? + JMP EXTQU1 /NO - [S]HE DESERVES TO FAIL! + CLL CIA + TAD I SATSEG /ARE THERE THAT MANY SEGMENTS LEFT ON THE SYSTEM? + SNL CLA + JMP EXTQU5 /NO; SO DON'T GIVE ANY + TAD GDRETP /RETRIEVAL POINTER + JMS I ENS33 /CONVERT TO RELATIVE ENTRY NUMBER + STL RTL /TIMES FOUR PLUS TWO + TAD UFDTBL /POINTS AT -LOGIN QUOTA + DCA EXQ1 /SAVE POINTER + TAD I EXQ1 /GET NEGATIVE QUOTA + DCA EXQ2 /AND SAVE + ISZ EXQ1 /POINTS AT CURRENTLY OWNED COUNT + TAD I EXQ1 /GET HIS/HER PRESENT TOTAL + SNA /HAS THE COUNT BEEN SET UP YET? + JMS LOQUO /NO; GO FIGURE IT OUT + TAD FIOSTK+2 /ADD THE NUMBER [S]HE WANTS + TAD EXQ2 /AND SUBTRACT FROM QUOTA + SPA SNA /WILL THIS EXCEED THE QUOTA FOR THIS ACCOUNT? + JMP EXTQU9 /NO; GO EXTEND + TAD I GRACE /WILL IT GO BEYOND THE #GRACE SPACE#? + SMA SZA CLA + JMP EXTQU5 /YES; DON'T BOTHER EXTENDING + TAD FIOSTK+1 /SEE IF THIS FILE IS ALREADY IN THE GRACE AREA + JMS I LNK01 /GET POINTER TO FILE CONTROL BLOCK + TAD FILPRP /POINT TO STATUS WORD + DCA EXQ3 + DATFLD + TAD I EXQ3 /GET CURRENT STATUS FOR THIS FILE + RAR + SZL /IS THIS FILE IN THE GRACE AREA? + JMP EXTQU8 /MAYBE; SEE IF [S]HE'S REENTERING + STL RAL /SET GRACE BIT + DCA I DXQ3 + CFLD + JMP EXTQU6 /SEND MESSAGE, THEN GO EXTEND + /ROUTINE TO PLANT FILE NAME INTO "EXCEEDING QUOTA" MESSAGE + +EXTNAM, 0 + TAD I REL6 /GET PART OF FILE NAME + RTR + RTR + RTR + AND P0077 /SAVE LEFT BYTE + TAD P0240 /CONVERT TO ASCII + DCA I INDEX /STORE IN THE MESSAGE AREA + TAD I REL6 /NOW FOR THE RIGHT BYTE + AND P0077 + TAD P0240 /CONVERT TO ASCII + DCA I INDEX /SAVE RIGHT BYTE + ISZ REL6 /POINT TO NEXT CHARACTER + JMP I EXTNAM + +/ROUTINE TO CHECK FOR THE SAFE REDUCTION OF A UFD +/TWO CONDITIONS MUST BE MET: +/ THE ACCOUNT CANNOT BE IN USE TO ANYONE +/ THE ACCOUNT MUST HAVE AN EMPTY DIRECTORY + +EXQ2, +REDUF0, 0 + TAD GDRETP /GET RETRIEVAL POINTER + CIA + TAD RETTBL /IS [S]HE TRYING TO REDUCE A UFD? + SZA CLA + JMP I REDUF0 /NO; LET HIM/HER REDUCE NORMAL FILES + TAD I REL6 /GET THE ACCOUNT NUMBER OF THE UFD IN QUESTION + JMS I UTS01 /LOOK IT UP IN THE UFD TABLE + JMP REDUF1 /NOT THERE - GOOD + CLA + TAD C4400 /TELL HIM "FILE IN USE" + JMP EXTQU1 +REDUF1, TAD I REL6 /GET THE ACCOUNT NUMBER OF THE UFD TO BE DELETED + JMS I UFO01 /LOAD ITS RETRIEVAL WINDOW INTO RTABLE + JMP EXTQU5 /COULDN'T; PAS HIS/HER OWN AC BACK AS AN ERROR INDICATION + JMS I BLDP1 /MAKE A RETRIEVAL POINTER + DCA GDRETP /SAVE IT FOR THE SEARCH + ISZ EXQ1 /POSITION UFDTBL POINTER FOR THIS ACCOUNT + ISZ EXQ1 /TO POINT TO THE SEGMENT ACCUMULATOR + JMS LOQUO /SEE IF THIS UFD STILL CONTAINS FILES + CLL STA RTL /AC=-3 + TAD EXQ1 /POSITION WE'VE BEEN ASSIGNED ON UFDTBL + JMS I TF01 /FREE THE POSITION + TAD I EXQ1 /DID [S]HE OWN ANY SEGMENTS? + SZA CLA + JMP I VIOLAT /STILL SOME FILES IN THERE! + STA + DCA FIOSTK+2 /FORCE HIM/HER TO COMPLETELY DELETE THIS UFD + JMP I REDUF0 + + VIOLAT, PRT1+1 +ENS33, ENS3 +SATSEG, -SATSIZ+1 +EXFILE, EXCEED+2 +EXTELL, EXTEL0 +P0240, 240 +GRACE, UTABLE+2 + +$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$%&$ + \ No newline at end of file diff --git a/tss8/system/inita.pal b/tss8/system/inita.pal new file mode 100644 index 0000000..4510ab3 --- /dev/null +++ b/tss8/system/inita.pal @@ -0,0 +1,1223 @@ +/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 IF 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.) + /PARAMATERS 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 > +IFNZRO 24-JOBMAX&4000 +IFNZRO 23-KL8-PT08&4000 +IFNZRO 24-DC08A&4000 +IFZERO DC08A +IFNZRO DC08A < IFNZRO PHONES + IFZERO PHONES > +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 FOR NEW JOB +IFZERO RF08-40 < +IFZERO RS08-1 +IFZERO RS08-2 +IFZERO RS08-3 +IFZERO RS08-4 +DSKEXT= DSKSIZ-1> +IFZERO RF08 +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 /ERP DISC 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. +/EXTEDED 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 < + +DBSZ= 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 +DCLR= 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= 40 /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 INTERPRETOR +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 +IFNZRO DC08A /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 +IFZERO EAE + IFZERO CPU&7776 > +IFNZRO OUTREG&1 + /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 (100MS) +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 I/O +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 + +/DEFINED IN SI: + +DTSIDT= 7270 /RETURN FROM STOPPING A DECTAPE ON TIMER +VERBRK= 7600 /START OF INSTALLATION DEFINED LOGIN MESSAGE + /INIT 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. + /RIM AUTO-LOADER FOR TSS/8 INIT + RIM1= 7757 + RIM2= 7760 +*7400 + FIX, DCA RD1 /SAVE SKIP IOT +*7401 + TAD K5 +*7402 + TAD RD1 +*7403 + DCA RD2 /SAVE READ IOT +*7404 + RIF /CURRENT FIELD +*7405 + CMA +*7406 + AND KCDF /CREATE CDF FOR FIELD 0 OR 2 +*7407 + DCA KCDF +*7410 + KCDF, CDF 20 +*7411 + JMS FRM /READ NEXT FRAME; SKIP ON RETURN +*7412 + LOOP, DCA SUM /SAVE NEW CHECKSUM +*7413 + TAD CHAR0 +*7414 + DCA CHAR1 /SAVE LEFT BYTE +*7415 + JMS READ +*7416 + DCA CHAR2 /SAVE RIGHT BYTE +*7417 + JMS FRM /LOOK AHEAD +*7420 + JMP CHKSUM /WE HAVE THE CHECKSUM +*7421 + JMS ASSMBL /ASSEMBLE BOTH BYTES +*7422 + SNL /DATA OR ORIGIN? +*7423 + JMP OSAVE /DATA +*7424 + DCA ORG /SAVE NEW ORIGIN +*7425 + ADD, TAD CHAR1 +*7426 + TAD CHAR2 /SUM BOTH BYTES +*7427 + TAD SUM /WITH THE OLD SUM +*7430 + JMP LOOP +*7431 + OSAVE, DCA I ORG /SAVE DATA + *7432 + ISZ ORG /INCREMENT ADDRESS +*7433 + RM200, 7600 /COVER SKIP WITH CONSTANT +*7434 + JMP ADD +*7435 + CHKSUM, JMS ASSMBL /ASSEMBLE CHECKSUM BYTES +*7436 + CIA +*7437 + TAD SUM /SUBTRACT CALCULATED SUM +*7440 + SZA /OK? +*7441 + HLT /NO; ERROR +*7442 + STL RTL /AC=2 +*7443 + TAD KCDF /PLUS CDF TO "INIT'S" FIELD +*7444 + DCA K5 /SAVE +*7445 + K5, 5 /CIF CDF TO FIELD 0 OR 2 +*7446 + JMP 0 /JUMP INTO INIT +*7447 + READ, 0 +*7450 + RD1, HLT /SKIP IOT +*7451 + JMP .-1 +*7452 + RD2, HLT /READ IOT +*7453 + DCA CHAR0 +*7454 + TAD CHAR0 +*7455 + JMP I READ +*7456 + FRM, 0 +*7457 + JMS READ /READ A FRAME +*7460 + TAD RM200 +*7461 + SPA /IS IT DATA/ORIGIN? +*7462 + ISZ FRM /YES; SKIP ON RETURN +*7463 + SPA SNA CLA /FIELD SETTING? +*7464 + JMP I FRM /NO +*7465 + JMP FRM+1 /YES; IGNORE IT +*7466 + ASSMBL, 0 +*7467 + TAD CHAR1 /LEFT BYTE +*7470 + CLL RTL +*7471 + RTL +*7472 + RTL /SHIFTED INTO POSITION +*7473 + TAD CHAR2 /PLUS RIGHT BYTE +*7474 + JMP I ASSMBL +*7475 + ORG, 0 +*7476 + CHAR0, 24 /CHECKSUM CORRECTION; RIGHT BYTE +*7477 + CHAR1, 0 +*7500 + CHAR2, 0 +*7501 + SUM, 6000 /CHECKSUM CORRECTION; LEFT BYTE +*7601 + RIMJMP, TAD RIMFIX +*7602 + DCA RIM2 /RESTORE RIM LOADER +*7603 + TAD RIM1 /GET SKIP IOT +*7604 + JMP I FIXA +*7605 + RIMFIX, JMP RIM1 +*7606 + FIXA, FIX +*RIM2 + JMP RIMJMP /EXIT FROM RIM + /PAGE 0 + +FIELD 2 /INIT LOADS ONTO DISK TRACK 2 + +*0 + JMP I SUPERA /JUST IN CASE!! +SUPERA, SUPER + + +*10 +AXS1, . +AXS2, . + +SIDATA= 20 /SYSTEM INTERPRETER DATA + +CONSTANTS=SIDATA+12 +*CONSTANTS +C0002, 2 +C0003, 3 +C0004, 4 +C0007, 7 +C0037, 37 +C0100, 100 +C1000, 1000 +C7770, 7770 +C7600, 7600 +C7763, 7763 +DM32, +C7740, 7740 + +JOBCON= CONSTANTS+11 /JOB CONTROL + +FRSTOR= JOBCON+3 +*FRSTOR + +FREE, . /POINTER TO HEAD OF FREE STORAGE +FRECNT, . /# FREE BLOCKS AVAILABLE + + +TIMDAT= FRSTOR+2 /CLOCK AND DATE +*TIMDAT + +/CLOCK +CLK2, . +CLK1, . + + +SCHDAT= TIMDAT+2 + +DATEND= 60 /END OF FIELD 0 PAGE 0 DATA + + + +FIPDAT= 155 /DATA REFERENCED BY FIP +*FIPDAT+1 + +C0400, 400 +SEGSIZ= C0400 /# WORDS PER SEGMENT + CORTBA, CORTBL-1 /CORE ALLOCATION TABLE +DSUTBA, DSUTBL /USER DISC REQUEST QUEUE + +/THE DATE IS KEPT AS A 12 BIT NUMBER IN THE FORMAT +/DATE=((YEAR-1974)*12+(MONTH-1))*31+DAY-1 + +*DATE +DATE, . + +CORSRA, CORSRC +WAITA, WSCHED +WAIT= JMP I WAITA + + +/SUBROUTINE DISPATCHES + +SUBDSP= DATEND +*SUBDSP + +CHDFA, 0 +INIF, HLT + JMP I CHDFA + +CHDF= JMS CHDFA + +CJOBMX, -JOBMAX +INBUF, INBUFA +NUMBIA, NUMBI0 +CHAR, 0 +NUMHO, 0 + 0 + 0 +CORCNT, 0 + +C0010, 10 +C6201, 6201 +C0200, 0200 +C0177, 0177 + +COMGEA, COMGE0 +DISCA, DISC0 +DISCHA, DISCH0 +YESNO= JMS I . + YESNO0 +MESSAG= JMS I . + MESSA0 +OCTIN= JMS I . + OCTIN0 +GETIN= JMS I . + GETIN0 +OUTTLS= JMS I . +OUTA, OUT +INKRB= JMS I . + IN +ZERO1= JMS I . + ZERO +CHEKCC= JMS I . + CCCHEK +SWBASE, SWDEX /SWAP TRACK FOR JOB 1 +C7777, -1 +MC0377, -377 +OSF, OSTRAP +OST, 7607 +OSC, -16 +OSA, 7607 +OSTAB, . + RBOOT + 7746 + -7 + 7746 + KBOOT + 26 + -4 + 26 +KBOOT, DLCA + DLDC + DLAG + JMP 31 +OSTRAP, +NOPUNCH +*7607 +ENPUNCH + TAD KA + DCA 7754 + TAD KA + DCA 7755 + DTLB + TAD KB + DTLA + DTSF + JMP .-1 + TAD KC + JMP .-4 +KA, 7577 +KB, 600 +KC, 220 +/PAGE ASSIGNMENTS + + INIP= 1000 + /PROGRAM TO OPEN AND MODIFY SINGLE DISC REGISTERS + +*0200 +DISCLK, TAD KCR /PUT OUT A CR, LF + OUTTLS + TAD KLF + OUTTLS +/ NOW GET AN ADDRESS FROM THE KEYBOARD + JMS OTIN + JMP DISCLK /: IS ONLY VALID TERMINATOR + JMP DISCLK / " " +/DISC ADDRESS FOLLOWED BY ":" HAS BEEN ENTERED +DISPLA, JMS SPACE /PROVIDE ELEGANT FORMAT + JMS I POPEN /GET REG FROM DISC + TAD OPNREG /GET THIS VALUE + JMS I PHACK /DISPLAY IT + JMS SPACE /CONTINUE POLICY OF ELEGANT FORMATING + JMS I PSAVE /SAVE VALUE, VALUE1 +/REGISTER IS OPEN ---- WAIT FOR A MODIFY + JMS OTIN + JMP SHUT /TERMINATOR WAS CR + JMP CLSOPN /TERMINATOR WAS LF + +/: WAS TYPED ---- MUST BE NEW DISC ADDRESS + JMP DISPLAY + +/CARRIAGE RETURN MEANS CLOSE REGISTER +/FIRST, SEE IF IT WAS MODIFIED +SHUT, TAD INPUT + SPA CLA + JMP DISCLK /NO MODIFY +/OPEN REGISTER WAS MODIFIED, SO CHANGE ON THE DISC + TAD VALUE1 + DCA OPNREG + JMS I PCLOSE /WRITE VALUE OUT +/NOW SEND OUT LF AND START AGAIN + JMP DISCLK +/LINE FEED MEANS CLOSE REGISTER AND OPEN THE NEXT ONE +CLSOPN, TAD INPUT + SPA CLA + JMP .+4 /NO MODIFY +/VALUE WAS MODIFIED, SO WRITE OUT NEW ONE + TAD VALUE1 + DCA OPNREG + JMS I PCLOSE +/RESPOND TO LF WITH CR + TAD KCR + OUTTLS + TAD KCR + OUTTLS /FOR TIMING (??) + +/NOW RESTORE ADDR WORD TO VALUE1 + JMS I PRESTOR +/NOW INCREMENT ADDRESS IN VALUE, VALUE1 + JMS I PNEXTAD + /NOW TYPE OUT THIS NEW ADDRESS + TAD VALUE + JMS I PHACK + TAD VALUE1 + JMS I PHACK + TAD KCOLON + OUTTLS + JMP DISPLAY + +/TYPE TWO SPACES + +SPACE, 0 + TAD KSPACE + OUTTLS + TAD KSPACE + OUTTLS + JMP I SPACE +KSPACE, 0240 + +KCOLON, 0272 +KCR, 0215 +KLF, 0212 +POPEN, XOPEN +PCLOSE, CLOSE +PNEXTAD, NEXTAD + PSAVE, SAVE +PRESTOR, RESTOR +PHACK, HACK +/ROUTINE TO INPUT AN OCTAL NUMBER +/ECHOES INPUT IF IT WAS VALID +/CALL: JMS OTIN +/ CR TERMINATOR +/ LF TERMINATOR +/ : TERMINATOR +/ +/RETURNS WITH "DOUBLE PRECISION" INPUT IN +/VALUE AND VALUE1 +/INPUT=0 IF THERE WAS ANY, ELSE -1 + +OTIN, 0 + CLA CMA + DCA INPUT /NO INPUT YET + DCA VALUE /SUBTOTAL + DCA VALUE1 + SKP + + OUTTLS +LISTEN, INKRB + DCA YCHAR +/IS THE INPUT A VALID TERMINATOR? + TAD YCHAR + TAD KMCOLON /COLON? + SNA + JMP COEXIT /YES + TAD KMLF /LF? + SNA + JMP LFEXIT /YES + TAD KMCR /CR? + SNA + JMP CREXIT /YES +/NOT A VALID TERMINATOR --- IS IT A VALID OCTAL DIGIT? + TAD KMEIGHT + STL + TAD C0010 + SZL /IS IT A VALID OCTAL DIGIT? + JMP NOTOK /NO +/COMES HERE WITH A VALID OCTAL DIGIT + ISZ INPUT /REMEMBER THAT THERE IS INPUT + NOP +/NOW ADD THIS DIGIT TO THE DOUBLE PRECISION TOTAL + DCA XCHAR +/FIRST, SHIFT HIGH-ORDER WORD LEFT ONE PLACE + TAD VALUE + CLL RAL + CLL RAL + CLL RAL + DCA VALUE +/NOW GET LEFT-MOST LOW-ORDER DIGIT + TAD VALUE1 + RTL + RTL + AND C0007 + /MOVE THIS DIGIT INTO THE HIGH ORDER WORD + TAD VALUE + DCA VALUE +/NOW ADD NEW INPUT DIGIT + TAD VALUE1 + CLL RAL + CLL RAL + CLL RAL + TAD XCHAR + DCA VALUE1 + TAD YCHAR + JMP LISTEN-1 /NOW GO ECHO INPUT + +COEXIT, ISZ OTIN +LFEXIT, ISZ OTIN +CREXIT, TAD YCHAR + OUTTLS /ECHO TERMINATOR + JMP I OTIN + +NOTOK, CLA + MESSAG + NOTOK1 + JMP OTIN+1 +NOTOK1, TEXT " ?_" + + +VALUE, 0 +VALUE1, 0 +OPNREG, 0 +YCHAR, 0 +XCHAR, 0 +INPUT, -1 + +KMCOLON, -0272 +KMLF, -0212+": +KMCR, -0215+212 +KMEIGHT, -0270+215 + +*0400 +XOPEN, 0 + JMS CONVERT /MAKE A DISC ADDRESS OUT OF VALUE, VALUE1 + TAD READCOM /WE ARE READING + JMS DISK + JMP I XOPEN +READCOM, 6603 /DMAR + +/ROUTINE TO CLOSE A DISC REGISTER +CLOSE, 0 + TAD WRITECOM + JMS DISK + JMP I CLOSE +WRITECOM, 6605 /DMAW + +/DISC TRANSFER ROUTINE +DISK, 0 + DCA DISCIOT /READ IOT OR WRITE IOT +/NOW HAVE TO SET UP 7750,7751 IN FIELD 0 +/REMEMBER WHAT FIELD WE'RE IN NOW +/SO WE CAN RESTORE + RIF + TAD .+2 + DCA XFIELD + CDF /NOW GO TO DATA FIELD 0 + CLA CMA + DCA I P7750 /LOOKING FOR ONE WORD + TAD POPNREG + DCA I P7751 /READ INTO OPNREG +/7750, 7751 ARE SET --- RESTORE DATA FIELD +/ALSO, SET DISC TO TRANSFER INTO THIS FIELD +XFIELD, 0 + RIF + IFZERO RF08-40 + 6615 /DIML; FIELD , NO INTERRUPTS +IFZERO RF08 + CLA /DEAL DOESN'T CLEAR AC + TAD I PDISCLO /PICK UP LOW ADDRESS +DISCIOT, 0 /DMAR OR DMAW + 6621 /DFSE -- ANY ERRORS? +IFZERO RF08 +IFZERO RF08-40 + DCMA /DON'T LEAVE DISK FLAG UP + JMP I DISK /YES + +P7750, 7750 +P7751, 7751 + +PDISCHI, DISCHI +PDISCLO, DISCLO +POPNREG, OPNREG-1 + + + +/ROUTINE TO CONVERT THE DOUBLE PRECISION NUMBER +/IN VALUE, VALUE1 INTO AN RF08 DISC ADDRESS +/PUT IT IN DISCHI, DISCLO + +CONVERT, 0 + CLA + TAD I PVALUE +IFZERO RF08-40 + DCA I PDISCHI + TAD I PVALU1 + DCA I PDISCLO + JMP I CONVERT +PVALUE, VALUE +PVALU1, VALUE1 + +/ROUTINE TO TYPE THE 4 OCTAL DIGITS IN THE AC +/ON THE TELEPRINTER + +HACK, 0 + CLL RAL + DCA XHACK + TAD KM4 + DCA XCNT /4 DIGITS +YHACK, TAD XHACK + RTL + RAL + DCA XHACK + TAD XHACK + AND C0007 + TAD K260 + OUTTLS + ISZ XCNT + JMP YHACK + JMP I HACK +XCNT, 0 +DISCHI, 0 +DISCLO, 0 +XHACK, 0 +KM4, -4 +K260, 260 + +/ROUTINE TO GET A CHAR FROM THE KEYBOARD +IN, 0 + KSF + JMP .-1 + JMS CCCHEK /IS IT A CONTROL-C? + KRB + AND C0177 + TAD C0200 /IN CASE OF PARITY TERMINALS + JMP I IN /RETURN + +CCCHEK, 0 + KSR + JMP I CCCHEK + KRS /WHAT'S THE CHARACTER? + AND C0177 /PARITY TERMINAL? + TAD KCRC + SMA + CML + SNA CLA + JMP I SUPERA /[S]HE WANTS TO RESTART - ^C + JMP I CCCHEK /NO ^C + +KCRC, -3 /- ^C, STRIPPED OF PARITY BIT + +/ROUTINE TO TELEPRINT A CHAR + +OUT, 0 + NOP /CHANGE TO "KSF" IF DESIRED TO TERMINATE PRINT-OUT UPON TYPE-AHEAD + SKP /NO + JMP OUT0 /YES; DON'T WASTE TIME WITH FURTHER PRINTING + TLS + TSF + JMP .-1 +OUT0, CLA + CHEKCC + JMP I OUT + /ROUTINE TO INCREMENT THE DOUBLE-PRECISION VALUE +/IN VALUE, VALUE1 + +NEXTAD, 0 + CLA + ISZ I PVALU1 + JMP I NEXTAD + ISZ I PVALUE + JMP I NEXTAD + +/ROUTINE TO SAVE VALUE, VALUE1 +SAVE, 0 + TAD I PVALUE + DCA SAVE1 + TAD I PVALU1 + DCA SAVE2 + JMP I SAVE + +/ROUTINE TO RESTORE VALUE, VALUE1 +RESTOR, 0 + TAD SAVE1 + DCA I PVALUE + TAD SAVE2 + DCA I PVALU1 + JMP I RESTOR +SAVE1, 0 +SAVE2, 0 + + *600 +LOGMES, 0 /PUT MESSAGE OF THE DAY IN SI + YESNO + LOGM1 /"PROMO?" + JMP I LOGMES /NO + DISC /YES, READ SI INTO FIELD 1 + 6603 + SIDEX+1 + DISCHK /SHECK FOR DISK OK +LOG2LG, MESSAG /MESSAGE TOO LONG + LOGM2 /"END WITH ALTMODE" + STA + TAD LOGST /VERBRK + DCA AXS1 + TAD LOGST + DCA NUMHO /FOR GETCH + IAC + DCA NUMHO+1 + DATFLD /LOGIN MESSAGE TO FIELD 1 +LOGNEX, JMS I GETCHA /GET A CHARACTER INTO BUFFER + JMP LOG2LG /MESSAGE TOO LONG + TAD MC0377 /IS IT AN ESCAPE OR ALTMODE? + IAC /TEST FOR MODEL 35 ALTMODE + SZA + IAC /TEST FOR ALTMODE + SZA + TAD LOGESC /TEST FOR ESCAPE + SZA CLA + JMP LOGNEX /NOT ESCAPE OR ALTMODE, GET ANOTHER CHAR + TAD AXS1 + DCA CHAR + DCA I CHAR /A 0 ENDS THE MESSAGE IN SI + CHDF + MESSAG /ECHO $CR-LF + LOGM3 + DISC /WRITE OUT SI + 6605 + SIDEX+1 + DISCHK /CHECK FOR DISK OK + JMP I LOGMES + +LOGST, VERBRK /START OF INSTALLATION MESSAGE OF THE DAY +GETCHA, GETCH +LOGESC, 375-233 /ALT MODE MINUS ESCAPE + \ No newline at end of file diff --git a/tss8/system/initb.pal b/tss8/system/initb.pal new file mode 100644 index 0000000..9de475f --- /dev/null +++ b/tss8/system/initb.pal @@ -0,0 +1,1184 @@ +OCI260, -260 +OCTINT, 0 + +OCTIN0, 0 + DCA OCTINT + STA + TAD INBUF + DCA AXS1 +OCTIN1, TAD I AXS1 + DCA AXS2 + TAD AXS2 + TAD OCI260 + SPA + JMP OCTIN2 + TAD C7770 + SMA + JMP OCTIN2 + TAD C0010 + DCA AXS2 + TAD OCTINT + CLL RTL + RAL + TAD AXS2 + DCA OCTINT + JMP OCTIN1 +OCTIN2, CLL CLA + TAD OCTINT + JMP I OCTIN0 + +/AFTER LOAD OR DUMP, BOOT BACK TO WHATEVER OPERATING SYSTEM IS ON THE RF08. +/THIS WAY, INIT CAN BE USED TO LOAD/DUMP OS/8. +RBOOT, 6641 /DCXA /CLEAR RF08 EXTENDED DISK ADDRESS + DCEA /AND EVERYTHING ELSE + -200 /CLA + DMAR + DFSC + 5352 /JMP . + 5752 /JMP I .-1 + CRLF= LOGM2+10 +LOGM2, TEXT "END WITH ALTMODE_" +LOGM3, TEXT "$_" +SYSTEM, TEXT "SYSTEM" +LIBARY, TEXT "LIBRARY" +OPRAT, TEXT "OPERATOR" +PASWRD, TEXT " PASSWORD? " +TAB, -01 + -11 + -21 + -41 + -51 /THE NEXT WORD MUST BE POSITIVE +MSG, TEXT "_SI" + TEXT "_FIP" + TEXT "_INIT" + TEXT "_TS8" + TEXT "_PUTR" +UPAROW, TEXT " ^ " + *INIP + +/ZERO OUT FIRST 6 TRACKS IN PREPARATION FOR BUILDING NEW SYSTEM + +SBUILD, YESNO + REALLY + JMP I SUPERA /LUCKILY WE CAUGHT HIM/HER + ZERO1 /ZERO FIELD 1 + TAD C0051 /START AT TRACK 5, FIELD 1 +SB2, DCA SB3 + DISC + DMAW /WRITE A FIELD OF ZEROES TO DISK +SB3, .-. + DISCHK /MAKE SURE DISK IS OK + TAD SB3 + TAD C7770 /GO TO PREVIOUS TRACK + SMA /ARE WE THROUGH? + JMP SB2 /NO + TAD MSGA /INITIALIZE ADDRESS OF MESSAGES + DCA MSGB + TAD TABA /INITIALIZE TABLE POINTER + DCA TABB +BUILD1, MESSAG /ASK FOR A TAPE +MSGB, .-. + TAD I PATXAD + DCA SB3 + MESSAG + UPAROW /" ^ " +SB4, +IFNZRO CPU&7776 <6030> /ON 8E, CLEAR FLAG, BUT NO READER RUN +IFZERO CPU&7776 /CLEAR FLAG + INKRB /WAIT FOR A KEY TO BE PRESSED + TAD C7600 /LEADER? + SZA + TAD C7763 /CARRIAGE RETURN? + SZA CLA + JMP SB4 /NO + STA + DCA FLAG + +/ROUTINE TO PATCH THE DISK. A BINARY TAPE IS READ, AND THE CORRESPONDING +/WORDS ON A DISK TRACK ARE PATCHED. THE FIELD SETTING ON THE TAPE +/DETERMINES WHICH TRACK WILL BE PATCHED. A TAPE WITHOUT A FIELD SETTING +/WILL PATCH TRACK 5. A TAPE WITHOUT AN ORIGIN WILL LOAD STARTING AT 0 +/HENCE A SAVE FORMAT TAPE WILL LOAD PROPERLY INTO THE SWAP TRACK FOR +/JOB NUMBER 1. + +PATCH, DISC + DMAR /READ TRACK 5 INTO CORE +C0051, 0051 /TO PATCH IT IF NO FIELD SETTING + DISCHK /MAKE SURE THE DISK IS OK + TAD .-2 /NOW REMEMBER WHAT IS IN FIELD 1 + DCA PATW /SO IT WILL BE PROPERLY RE-WRITTEN + TAD PATW + DCA PATR + CDF 10 /USE FIELD 1 AS BUFFER + JMS I BINTA /READ THE BINARY TAPE + JMP PATFLD /A FIELD SETTING HAS BEEN ENCOUNTERED + SNA /END OF TAPE - WAS THERE A CHECKSUM ERROR? + JMS PATRW /NO, SO WRITE OUT FIELD 1 + ISZ FLAG /WHERE DID WE COME FROM? + JMP I SUPERA /BACK TO SUPERVISOR + CHDF + SZA CLA /CONTINUE BUILDING - WAS THERE ERROR? + JMP BHUH /YES - TRY AGAIN + TAD I TABB /NO - WAS RIGHT TAPE LOADED? + TAD PATR + SZA CLA + JMP BHUH /NO - TRY AGAIN + IAC + TAD SB3 /ADDRESS OF LAST CHARACTER TYPED + 1 + DCA MSGB /SET UP FOR NEXT MESSAGE + ISZ TABB + TAD I TABB /ARE WE THROUGH? + SPA CLA + JMP BUILD1 /NO + JMP I .+1 /YES + SUPREF + +BHUH, MESSAG + HUH2 + JMP BUILD1 + +PATXAD, BUFPTR +MSGA, MSG+7 /AC IS -7 WHEN THIS IS TADDED +TABA, TAB +FLAG, 0 +TABB, 0 + +PATFLD, IAC /TRACK IS IN BITS 6-8, MAKE IT FIELD 1 + DCA PATR /AND SAVE IT + JMS PATRW /WRITE PREVIOUS TRACK; READ NEW ONE + JMP I BINT3A /AND CONTINUE +BINT3A, BINT3 +BINTA, BINTAP + +PATRW, 0 + DISC + DMAW /WRITE THE PREVIOUS TRACK +PATW, .-. /TRACK FOR PREVIOUS PATCHING + DISCHK /MAKE SURE THE DISK IS OK + DISC + DMAR /READ IN NEW TRACK +PATR, 1 /TRACK FOR UPCOMING PATCHING + DISCHK /MAKE SURE THE DISK IS OK + TAD PATR + DCA PATW /REMEMBER WHICH TRACK WE'RE WORKING ON + JMP I PATRW /AND RETURN + +/SYSTEM INITIALIZATION + +SYSINI, DISC /READ INIT INTO FIELD 2 + DMAR + 0022 + DISCHK /MAKE SURE DISK IS OK + CIF CDF 20 /NOW GO THERE + JMP .+1 + TAD .-2 + DCA INIF /SET UP CHDF + JMS I SYSPER /INITIALIZE FIP + DISC /LOAD FIELD 0 + 6603 + TS8DEX + DISCHK /CHECK FOR DISK OK + TAD DVTBA + DCA INIT0 +SYSI1, TAD I INIT0 + DCA CHDFA + JMS I CHDFA + ISZ INIT0 + JMP SYSI1 + +SYSPER, PERSET +INIT0, 0 /VARIABLE DVTB POINTER +DVTBA, DVTB /ADDRESS OF DVTB +XTELL, TEXT "_EXEC DDT LOADED_" + +DVTB, CLEAR /READ MONITOR II INTO DATFLD + CORINI + DSKINI + DATEIN + TIMEIN + START + *INIP+200 +/NUMBER INPUT +/CALL NUMBIN +/ NOT A NUMBER +/ # IN AC + +NUMBIN= JMS I NUMBIA + +NUMBI0, 0 + DCA NUMAGN /NUMBER MAGNITUDE + CLL STA RTL /MAXIMUM OF TWO DIGITS IN NUMBER + DCA NUMCNT + JMS I NUMSKP /SKIP LEADING TABS AND SPACES + JMP I NUMBI0 /NOTHING THERE +NUMBI1, TAD CHAR + TAD NUMM9 + SMA SZA + JMP NUMBI3 /NOT A NUMBER + TAD NUMP9 + SPA + JMP NUMBI3 /NOT A NUMBER + DCA CHAR + ISZ NUMCNT + SKP + JMP I NUMBI0 /TOO MANY DIGITS + TAD NUMAGN / * 1 + CLL RTL / * 4 + TAD NUMAGN / * 5 + RAL / * 10 + TAD CHAR + DCA NUMAGN + COMGET + JMP NUMBI3 /NO MORE CHARACTERS + JMP NUMBI1 + +NUMBI3, CLA + TAD C0003 /HAVE ANY DIGITS BEEN FOUND? + TAD NUMCNT + SNA CLA + JMP I NUMBI0 /NO + ISZ NUMBI0 + TAD NUMAGN + JMP I NUMBI0 + +NUMAGN= NUMHO+1 +NUMCNT, 0 +NUMSKP, SKIPS +NUMM9, -"9 +NUMP9, 11 + START, 0 + DTCA + PCF + + IFZERO D689-4 < + EDF /TURN ON DATA PHONES + DFCRF + CCF > + + TSF /WAIT FOR CONSOLE FLAG FROM DIALOG + JMP .-1 + TCF + RRB + KCC + CIF CDF + IFNZRO DC08A < + T1ON > + IFZERO DC08A < + IFZERO CPU-1 < + CLL CMA /LOAD CLOCK BUFFER + CCF CLB > + > + IFZERO DC08A < +IFNZRO CPU-4 +IFZERO CPU-4 + > + + IFZERO LPT-1 /CLEAR INTERRUPT FOR LPT + + ION + WAIT + + +REALLY, TEXT "BUILD? " + +/ASK WHETHER TO READ OR WRITE +RW, 0 + CLA CLL + RIF + TAD C6201 + DCA INIF /INITIALIZE CHDF + CHDF + TAD I RW + DCA .+2 +RW1, MESSAG + .-. /CRLF OR "TAPE " + MESSAG + RDORWT /READ OR WRITE? + GETIN + TAD I INBUF /FIRST CHARACTER + TAD RWMR /R? + CLL + SZA /YES + TAD RWMW /W? SET LINK + SZA CLA + JMP RW1 /NOT R OR W + RTL /0 FOR R, 2 FOR W + ISZ RW + JMP I RW +RWMR, -"R +RWMW, "R-"W + +KEBOOT, IAC + CLL RTL +RFBOOT, TAD OSTAB + DCA AXS1 + TAD I AXS1 + DCA OSF + TAD I AXS1 + DCA OST + TAD I AXS1 + DCA OSC + TAD I AXS1 + DCA OSA +/BOOTWTRAP FOR DEVICE OF YOUR CHOICE -- SET FOR DECTAPE HERE +OSB, CHDF + TAD I OSF + CDF + DCA I OST + ISZ OSF + ISZ OST + ISZ OSC + JMP OSB + DTRA DTXA /MAKE LAST TAPE FLAP (LOAD/DUMP) + CDF CIF + JMP I OSA + *INIP+400 + +FREND, -FIPBLK /END OF FREE CORE +LODDTA, LODDT /LOAD XDDT INTO FIELD 1 +XDDFLG, -1 +CORFLD, 0 +CORLNK, 0 +CORJMS, 0 /ISZ I CONDBA IF ^S/^Q FEATURE DISABLED +CORCSQ, KBDSQ /LOCATION OF JMS FOR ^S FEATURE + +CORINI, 0 + ISZ XDDFLG /DID [S]HE WANT EXEC DDT? + JMS I LODDTA /YES + TAD CORJMS + CDF + SZA + DCA I CORCSQ /NO! + TAD CORFLD /HOW MANY USER FIELDS DID [S]HE SAY + SNA /NO RESPONSE + IAC /ASSUME 1 USER FIELD + DCA CORCNT + TAD CORCNT + CMA /INIT CORE SEARCH ROUTINE + DCA AXS1 + CLL CMA RTL + TAD CORSRA + DCA AXS2 + IAC + TAD AXS1 + DCA I AXS2 + TAD CORTBA + CMA + TAD AXS1 + DCA I AXS2 + TAD CORTBA + DCA AXS2 + CLL CML RTR /ASSIGN AND LOCK DATFLD + DCA I AXS2 /NOW UNLOCK ALL USER FIELDS + ISZ AXS1 + JMP .-2 + STL RTL + TAD CORCNT + CLL RTL + DCA CORCNT + TAD CORCNT + TAD DSUTBA + TAD C0010 /MUST START IN MULTIPLE OF 8 + AND C7770 + DCA I FREE + TAD I FREE + DATFLD + DCA CORLNK + TAD CORGEA + DCA CORF1 +CORIN1, TAD CORLNK + TAD C0010 + DCA AXS2 +CORIN4, TAD AXS2 + TAD FREND + SNA CLA + JMP CORIN2 /DONE + TAD AXS2 + DCA I CORLNK + TAD AXS2 + DCA CORLNK + ISZ AXS1 + JMP CORIN1 + HLT /OOPS!!! +CORIN2, TAD I CORF1 /ANY EXTRA FREE CORE TO BE GENERATED? + SNA + JMP CORIN3 + DCA AXS2 + ISZ CORF1 + TAD I CORF1 + CIA + DCA FREND + ISZ CORF1 + JMP CORIN4 +CORIN3, DCA I CORLNK /LAST LINK IS ZERO + TAD AXS1 + IAC + CDF + DCA I FRECNT + CHDF + JMP I CORINI + + + + +CORF1, 0 +CORGEA, RINGIN +FRETEL, 0 + MESSAG + CY50 + IFNZRO CPU-2 + IFZERO CPU-2 + JMP I FRETEL +LOGM1, TEXT "_NEW LOGIN MESSAGE? " +FREQUE, TEXT "60 HERTZ POWER? " + CY50, TEXT "50 HERTZ ASSUMED_" + *INIP+600 + +/SKIP LEADING SPACES AND TABS +/CALL JMS SKIPS +/ BUFFER EMPTY +/ NORMAL RETURN + +SKISPA, -240 +SKITAB, 240-211 + +SKIPS, 0 +SKIPS1, COMGET + JMP I SKIPS /NONE LEFT + TAD SKISPA + TAD CHAR + SZA + TAD SKITAB + SNA CLA + JMP SKIPS1 + ISZ SKIPS + JMP I SKIPS + +MESSA0, 0 + RDF + TAD C6201 + DCA MESSA2 + CHDF + TAD I MESSA0 + DCA BUFPTR + ISZ MESSA0 +MESSA1, TAD I BUFPTR /PICK UP NEXT WORD + SNA /DONE? + JMP MESSA2 /YES + RTR /GET LEFT HALF OF WORD + RTR + RTR + JMS PRINTI /PRINT IT + TAD I BUFPTR + AND K0077 + SNA /DONE? + JMP MESSA2 /YES + JMS PRINTI /PRINT IT + ISZ BUFPTR /NEXT WORD + JMP MESSA1 + +MESSA2, .-. /CDF TO RESTORE DATA FIELD + JMP I MESSA0 /RETURN + + +PRINTI, 0 + AND K0077 + TAD K7741 + SNA /BACKARROW? + JMP PRCRLF /YUP - TIME FOR CARRIAGE RETURN, LINE FEED + SPA + TAD C0100 /RESTORE BIT 5 + TAD C0037 +PRINT2, OUTTLS /PRINT THE CHARACTER + JMP I PRINTI /RETURN + +PRCRLF, TAD CM215 /GET A CARRIAGE RETURN + CIA + OUTTLS + TAD C0212 /AND NOW LINE FEED + JMP PRINT2 + +BUFPTR, 0 +K0077, 0077 +K7741, 7741 + +GETIN0, 0 +GETIN1, STA + TAD INBUF + DCA AXS1 /FOR GETCH + TAD INBUF + DCA NUMHO + TAD GETIN3 /MINUS THE LAST LOCATION IN THE BUFFER + DCA NUMHO+1 +GETIN2, JMS GETCH /GET A CHARACTER INTO THE BUFFER + JMP GETIN1 /BUFFER FULL; TRY AGAIN + TAD CM212 /HAS [S]HE TYPED A CR (OR LINE FEED)? + SNA CLA + JMP I GETIN0 /YES, WE'RE ALL THROUGH HERE + JMP GETIN2 /NO, GET ANOTHER CHARACTER + +GETIN3, -INBUFA-20 +CM212, -212 +CM215, -215 +C0212, 212 + /SUBROUTINE TO GET A CHARACTER, AND PUT IT IN THE BUFFER. +/RETURN CALL PLUS 1 IF TOO MANY CHARACTERS WERE TYPED. +/RETURN CALL PLUS 2 WITH CHARACTER IN AC IS THE NORMAL RETURN. +/UPON RUBOUT, ECHOES RUBBED CHARACTERS, BUT NOT PAST BEGINNING OF BUFFER. + +GETCH, 0 +GETESC, 377-233 +GETCH1, INKRB +GETCH2, DCA CHAR + TAD CHAR + TAD MC0377 + SNA /IS IT A RUBOUT? + JMP GETCH3 /YES, GO WORRY ABOUT IT + TAD GETESC /IS IT ESCAPE? + SZA CLA /YES; DON'T ECHO + TAD CHAR + OUTTLS /ECHO CHARACTER + TAD AXS1 + TAD NUMHO+1 /THIS SHOULD BE MINUS THE LAST ADDRESS IN THE BUFFER + SMA CLA /HAVE WE OVERRUN THE END OF THE BUFFER? + JMP GETCH5 /YES + TAD CHAR + DCA I AXS1 /ALL OK, NOW SAVE THE CHAR IN THE BUFFER + TAD CHAR + TAD CM215 + SZA CLA /WAS THAT A CARRIAGE RETURN? + JMP GETCH4 /NO + TAD C0212 /GET LINE FEED AND ECHO, STORE IT + JMP GETCH2 + +GETCH3, TAD AXS1 /[S]HE TYPED A RUBOUT + DCA CHAR /SAVE BUFFER POINTER + TAD AXS1 + CIA + TAD NUMHO /THIS SHOULD BE THE INITIAL VALUE OF AXS1 + SMA SZA CLA /IS [S]HE BACKING UP TOO FAR? + JMP GETCH1 /YES, JUST IGNORE THE RUBOUT + TAD I CHAR /GOT GET THE RUBBED-OUT CHARACTER + OUTTLS /AND ECHO IT + STA + TAD AXS1 /NOW BACK UP AXS1 + DCA AXS1 + JMP GETCH1 + +GETCH4, TAD CHAR /PUT CHAR IN AC FOR RETURN + ISZ GETCH //SKIP ON RETURN + JMP I GETCH /AND RETURN + +GETCH5, MESSAG /THE DUMMY IS TOO PROLIFIC WITH THE TYPING!! + HUH + JMP I GETCH + *INIP+1000 + +/INIT BOOTSTRAP - LOAD TRACK 2 INTO FIELD 0 + + +INBOOT, DCA DATEIN /SAVE AC + DISC + DMAR /READ TRACK 2 TO FIELD 0 + 0020 + TAD DATEIN /RESTORE AC + DFSC + JMP .-1 + CIF CDF /AWAY TO FIELD 0, IF WE AREN'T THERE ALREADY + DCA CHDFA /AC SAYS WHERE TO JUMP + TAD C6201 + DCA I INIFA + JMP I CHDFA /SO JUMP THERE + +SUPREF, TAD SUPFUG /REFRESH +SUPST, TAD SYSINA /START + JMP INBOOT /BOOT IN FRESH COPY OF INIT + +INIFA, INIF +SYSINA, SYSINI +SUPFUG, REFCO0-SYSINI + +/DATE INPUT +/DATE=((YEAR-1974)*12+(MONTH-1))*31+DAY-1 + +DATMUL, DMUL +CMCR, -215 +C0012, 14 +C0031, 37 + DECIMAL +DM13, -13 +D11, 11 +D31, 31 +DM74, -74 + OCTAL +DATMON, 0 +DATDAY, 0 + +DATEIN, 0 + CLA CLL + MESSAG /MONTH-DAY-YEAR: + DATMES + GETIN + STA + TAD INBUF + DCA AXS1 + NUMBIN /MONTH + JMP DATEIN+1 + TAD DM13 + STL IAC + TAD D11 + SZL /0 /55 TICKS PER SYSTEM TICK IF DC08A; INITIALIZED AT REFRESH TIME +IFZERO DC08A <-12> /IN CASE OF PDP-8/A +CLKINA, CLKINI +TIMCK2, -INCLK2-1 +TIMCK1, -INCLK1 +C660, TICMIN /TICKS PER MINUTE + DECIMAL +DM24, -24 +D24, 24 +DM60, -60 +D60, 60 + OCTAL + +TIMEIN, 0 + CLA CLL + MESSAG + TIMESS /TIME: + GETIN + STA + TAD INBUF + DCA AXS1 + DCA CHAR + NUMBIN + JMP TIMEIN+1 + TAD DM24 + STL + TAD D24 + SZL /HOURS BETWEEN 0 AND 23? + JMP TIMEIN+1 /NO + DCA NUMHO+1 + DCA NUMHO + TAD D60 + JMS DMUL + DCA CHAR + NUMBIN + JMP TIMEIN+1 + TAD DM60 + STL + TAD D60 + SZL /MINUTES BETWEEN 0 AND 59? + JMP TIMEIN+1 /NO + TAD NUMHO+2 + DCA NUMHO+1 + DCA NUMHO + TAD C660 + JMS DMUL + CLL + CDF + TAD NUMHO+2 + TAD TIMCK1 + DCA I CLK1 + RAL + TAD NUMHO+1 + TAD TIMCK2 + DCA I CLK2 + TAD FREQ + DCA I CLKINA + CHDF + JMP I TIMEIN + +DMUL, 0 + DCA MP2 /MULTIPLIER + TAD NUMHO+1 /LOW ORDER MULTIPLICAND + JMS MP4 + DCA NUMHO+2 /LOW ORDER + TAD MP5 + DCA NUMHO+1 /HIGH ORDER + TAD NUMHO /HIGH ORDER MULTIPLICAND + SNA + JMP I DMUL + JMS MP4 + TAD NUMHO+1 + DCA NUMHO+1 + RAL /GET CARRY + TAD MP5 + DCA NUMHO + JMP I DMUL + + +MP4, 0 + DCA MP1 + DCA MP5 + TAD M12 + DCA MP3 + CLL + TAD MP1 + RAR + DCA MP1 + TAD MP5 + SNL + JMP .+3 + CLL + TAD MP2 + RAR + DCA MP5 + ISZ MP3 + JMP MP4+6 + TAD MP1 + RAR + CLL + JMP I MP4 + +MP1, 0 +MP2, 0 +MP3, 0 +MP5= CHDFA +M12, -14 + CORMES, TEXT "# USER FIELDS - " + + +INBUFA= . + ZBLOCK 20 /INPUT BUFFER FOR INIT INPUT + *INIP+1600 + +/DECTAPE - READ OR WRITE ONE FIELD +/JMS TO DTRORW WITH DESIRED FIELD IN DTFLD, BEGINNING BLOCK MINUS +/ONE IN DTBLOK, DESIRED DRIVE IN CONTROLLER, AND DTFUNC +/0050 FOR A WRITE OR 0030 FOR A READ. + +DTRORW, 0 + STA + DCA DTCAS /START CA AT -1 + TAD C7740 + DCA DTBLCT /40 BLOCKS PER FIELD + DTRA + AND C0200 /IS TAPE MOVING?? + SNA CLA + TAD C0600 /NO - START IT THE OTHER WAY + DTXA +DTSR1, TAD C7773 + DCA DTRY /TRY 5 TIMES UPON ERROR +DTSR2, DTLB /BLOCK NUMBERS TO THIS FIELD + DCA I C7755 /AT LOCATION 0 + TAD C0010 /START SEARCHING +DTSR3, DTXA + JMS DTWAIT /WAIT + DTRA + RTL + RTL /DIRECTION BIT TO LINK + CLA + TAD DTBLOK /DESIRED BLOCK - 1 + CMA /-DESIRED BLOCK + SZL /FUDGE IF GOING IN REVERSE + TAD C0003 + TAD 0 /REAL BLOCK - DESIRED BLOCK (+3?) + SNA CLA /WHAT DO WE DO NOW? + SNL + JMP DTSR7 /KEEP GOING, MAYBE REVERSE DIRECTION + TAD C7600 /WE'RE THERE, MAKE WC=-200 + DCA I C7754 + TAD DTCAS + DCA I C7755 /SET UP CA + TAD DTFLD + DTLB /SET UP FIELD FOR TRANSFER + TAD DTFUNC + DTXA /SET UP FOR READ OR WRITE + JMS DTWAIT /WAIT + TAD I C7755 /SAVE NEW CURRENT ADDRESS + DCA DTCAS + DTRA /REMOVE ANY FUNCTION FROM CONTROLLER + AND C0077 + DTXA + ISZ DTBLOK /TIME FOR NEXT BLOCK + ISZ DTBLCT /ARE WE THROUGH? + JMP DTSR1 /NO + TAD DTBLOK /YES - + TAD CM2677 /END OF TAPE?? + SPA CLA + JMP I DTRORW /NO + TAD C0400 /YES + DTXA /REWIND TAPE + DTRA + TAD C1000 /GO TO NEXT DRIVE + AND C7000 + DCA DTBLOK + CHEKCC /STALL + DTRA DTXA + CHEKCC /STALL + TAD DTBLOK + DTXA /REMEMBER IT IN THE CONTROLLER + DCA DTBLOK /START AT BLOCK 1 + CHEKCC /STALL + JMP I DTRORW /RETURN +DTSR7, SNL /REVERSE DIRECTION? + JMP DTSR3 /NO + TAD C0400 + ISZ DTRY /COUNT AN ERROR + JMP DTSR3 /AND GO REVERSE DIRECTION + TAD C7600 /AC=200 + DTXA /STOP THE TAPE + MESSAG + TAPMIS + JMP I SUPERA + +TAPMIS, TEXT "_DECTAPE ERROR" + +DTRY, 0 +DTBLCT, 0 /COUNT OF BLOCKS TO R/W FOR ONE FIELD +DTBLOK, 0 /CURRENT DESIRED BLOCK MINUS ONE +DTFLD, 0 /DECTAPE FIELD IN BITS 6-8 +DTFUNC, 0 /DECTAPE FUNCTION, 30 FOR READ, 50 FOR WRITE +DTLA= 6766 /SHOULDN'T BE HERE, BUT PUT IT IN WHILE I REMEMBER +DTCAS, 0 +C7773, 7773 +C7754, 7754 +C7755, 7755 +CM2677, -2677 +C0077, 0077 +C7000, 7000 +STATB, 0 /FOR DIAGNOSTIC PURPOSES + /MOST RECENT DECTAPE STATUS B ON ERROR + +/DTWAIT - SUBROUTINE TO WAIT FOR DECTAPE COMPLETION FLAG + + + DTWAIT, 0 + DTSF + JMP .-1 /WAIT FOR FLAG + CHEKCC + DTRB + SMA CLA /ANY ERROR? + JMP I DTWAIT /NO + DTRB + DCA STATB /FOR DIAGNOSTIC PURPOSES + TAD STATB + AND C0400 /SELECT ERROR? + SZA CLA + JMP DTWSEL /YES +DTWGOR, DTRA + AND C0377 /REMOVE FUNCTION FROM CONTROLLER + DTXA + TAD C0600 /GO IN REVERSE + DTXA + JMP DTSR2 +DTWSEL, DCA 0 + DTXA /SELECT ERROR! +C0600, 0600 /WASTE TIME - SELECT ERROR RETURNS AFTER +C0377, 0377 /WASTE TIME - 5 MICROSECONDS AFTER DTXA + CHEKCC + DTRB /IS IT STILL THERE? + SPA CLA + JMP DTWSEL /YES, TRY AGAIN + ISZ 0 /NO, WAIT A WHILE + JMP DTWSEL+1 + JMP DTWGOR /OK, IT SEEMS TO BE GONE + + *INIP+2000 + +/4K DISK READ OR WRITE + + +LOAD, JMS I RWB /GO TO INITIALIZE CHDF, PRINT MESSAGE, + CRLF /AND DETERMINE READ OR WRITE + TAD C6603 /MAKE A DMAW OR A DMAR + + DCA RORW + MESSAG + FIELD1 + GETIN + TAD I INBUF + AND C0007 + DCA FLDNUM + MESSAG + TRACK + GETIN + OCTIN + CLL RTL + RAL + TAD FLDNUM + DCA FLDNUM + DISC +RORW, 0 +FLDNUM, 0 + DISCHK /CHECK FOR DISK OK + JMP LOAD + +C6603, 6603 +RWB, RW + ASCI7, +CLEAR, 0 + CLA + DISC /READ MONITOR II INTO FIELD 1 + 6603 + TS8DEX+11 + DISCHK /CHECK FOR OK DISK COMPLETION + TAD CLR1 + JMS ZERO /ZERO OUT FREE CORE + JMP I CLEAR + +CLR1, JOBTBL + +ASCI6, +ZERO, 0 /CLEAR FIELD 1 FROM C(AC) TO 7777 + DCA CLR2 /BEGINNING ADDRESS + DATFLD + DCA I CLR2 + ISZ CLR2 + JMP .-2 + CHDF + JMP I ZERO +ASCNT, +CLR2, 0 + /ROUTINE TO MOVE XDDT INTO DATFLD + +LODDT, 0 + TAD KM4400 + DCA I FRENDA /MAKE FRECORE STOP AT 4400 + STA + TAD K4400 + DCA AXS1 /POINTS TO ORIGINAL + TAD AXS1 + DCA AXS2 /POINTS TO COPY +LODDT1, CHDF + TAD I AXS1 + DATFLD + DCA I AXS2 + ISZ DDTSIZ /ARE WE DONE YET? + JMP LODDT1 + DCA I XOPA /CHANGE ^C TO JUMP TO FIELD 0 + CHDF + MESSAG + XTELL + JMP I LODDT /YES + +XOPA, XOP +K4400, 4400 +KM4400, -4400 +FRENDA, FREND +DDTSIZ, 4400-7577 /THIS GETS DESTROYED, BUT WHAT THE HECK + +DDTMES, TEXT "LOAD EXEC DDT AT START-UP? " + \ No newline at end of file diff --git a/tss8/system/initc.pal b/tss8/system/initc.pal new file mode 100644 index 0000000..c9e9cc1 --- /dev/null +++ b/tss8/system/initc.pal @@ -0,0 +1,888 @@ +/ROUTINE TO CONVERT ASCII TO TSS/8 SIXBIT + +ASCSIX, 0 + CLL STA RAL /SET AC=-2 + DCA ASCNT + TAD INBUF + DCA ASCI6 /INPUT BUFFER + TAD I ASCSIX + DCA ASCI7 /POINTER TO OUTPUT VECTOR + ISZ ASCSIX +ASCI1, JMS ASCGET /GET ONE CHARACTER + CLL RTL + RTL + RTL /SHIFT TO HIGH ORDER + DCA I ASCI7 /SAVE THE CHARACTER + CHDF + JMS ASCGET /GO GET ANOTHER CHARACTER + TAD I ASCI7 /PACK IT IN WITH THE LAST ONE + DCA I ASCI7 /AND SAVE IT + ISZ ASCI7 + CHDF + ISZ ASCNT /DONE? + JMP ASCI1 /NO + JMP I ASCSIX /YES, EXIT + +ASC240, -240 + +ASCGET, 0 /GET A PASSWORD CHARACTER, EXIT UPON CARRIAGE RETURN + TAD I ASCI6 /GET NEXT CHARACTER + TAD ASCCR + SNA CLA /IS IT CR? + JMP I ASCSIX /YES, RETURN + TAD I ASCI6 + ISZ ASCI6 + TAD ASC240 /PASSWORDS ARE STORED IN EXCESS 240 CODE + DATFLD + JMP I ASCGET + +ASCCR, -215 +CSQ, TEXT "ENABLE ^S FEATURE? " + *INIP+2200 + +/USES INIT'S BINARY LOADER TO LOAD INTO FIELD 1 + ZERO1 /ZERO FIELD 1 + DATFLD +Y1, JMS I BINLD /GO LOAD BINARY TAPE + SKP /FIELD SETTING ENCOUNTERED + JMP I SUPERA /END OF TAPE + DCA DISC0 /SAVE IT + RDF + CIA + TAD DISC0 /IS IT THE CURRENT FIELD ANYWAY? + SNA CLA + JMP I BINT3B /YES - SO IT'S OK + TAD DISC0 /NO - LET HIM/HER KNOW ABOUT IT + HLT + CLA /IGNORE FIELD SETTING + JMP I BINT3B + +BINLD, BINTAP +BINT3B, BINT3 + +Y, JMS I STFLDA + JMP Y1 + +STFLDA, STFLD + +RDORWT, TEXT "READ OR WRITE - " +FIELD1, TEXT "FIELD NUMBER - " +TRACK, TEXT "TRACK NUMBER - " +TAPMES, TEXT "_TAPE " + TIMESS, TEXT "HR:MIN - " +NUMBLK, TEXT "# - " +YN, TEXT "YES OR NO... " + /DISK READ OR WRITE +/CALL DISC +/ FUNCTION +/ DEAL ARGUMENTS (DISC EXTENSION IN BITS 1-8; MEMORY FIELD IN BITS 9-11) +/ DISCHK +/ RETURN HERE WHEN OK + +DISC= JMS I DISCA +DISCHK= JMS I DISCHA + + +DISC0, 0 + RDF + TAD C6201 + DCA DISC2 + CHDF + TAD I DISC0 + DCA DISROW + ISZ DISC0 + TAD I DISC0 + DCA DEALSV /SAVE THE DEAL ARGUMENTS + TAD DEALSV +IFZERO RF08-40 < ISZ DISC0 + CLL RTL + RAL + DEAL + CLA CLL> +IFZERO RF08 < RTL + RAL + AND C0070 + DIML + TAD I DISC0 + CLL RTR + ISZ DISC0 + RAR + DXAL> + CDF + DCA I C7750 + STA + DCA I C7751 +DISROW, 0 + JMP I DISC0 + +C0070, 70 +C7750, 7750 +C7751, 7751 + + +/SUBROUTINE TO WAIT FOR DISK COMPLETION, CHECK FOR ERRORS, AND +/IF THERE ARE ANY ERRORS, RETRY THE OPERATION. + +DISCH0, 0 + CLL STA RTL + DCA RFTRY /TRY 3 TIMES +IFZERO RF08 + IFNZRO RF08 + JMP .-1 /WAIT FOR THE DISK TO FINISH + DFSE /ERROR? +IFZERO RF08-40 /DF32 SKIPS BACKWARDS + JMP DISC2 /NO + DIMA + AND DSKFLG /CHECK WLS, DRL, PER + CDF + SNA + TAD I C7750 /MAYBE NXD - IS WC=0? +DISC2, .-. /CDF -- RESTORE DATA FIELD + SNA /OK? + JMP I DISCH0 /I GUESS SO + ISZ RFTRY /3 TRIES YET? + CLA SKP + JMP DISERR /DISK WRITE LOCKED, PARITY ERROR, OR DRL + TAD DISROW /GET OLD DMAR OR DMAW + DCA .+2 + DISC + 0 +DEALSV, 0 /DEAL ARGUMENTS SAVED BY LAST DISC CALL + JMP DISCH0+3 + +DSKFLG, IFZERO RF08 <1005> + IFZERO RF08-40 <0007> +RFTRY, 0 /RETRY COUNT FOR DISK ERRORS + +DISERR, MESSAG + DISKER + JMP I SUPERA +DISKER, TEXT "_DISK ERROR" + *INIP+2400 + +/DISC DUMP ON DTA1 +/DECTAPE BLOCK 40N+1=DISC TRACK N + +DSKDMP, JMS I RWA /GO TO INITIALIZE CHDF, PRINT MESSAGE, + TAPMES /AND DETERMINE READ OR WRITE + DCA DTA + MESSAG + NUMBLK + GETIN + OCTIN + CIA + SNA +DSKSUP, TAD DSKSZ + DCA LDFCNT /SAVE DISK TRACK COUNT + DCA RFFUNC /WELL, FOLKS, THE FOLLOWING ROUTINE + CHDF /ONLY WORKS IN FIELD 0, SO HERE + TAD I RFFUNC /WE GO, MOVING EVERYTHING DOWN TO + CDF /FIELD 0 SO THAT IT WILL BE HAPPY + DCA I RFFUNC + ISZ RFFUNC + JMP .-5 + CIF CDF /AND DOWN TO FIELD 0! + JMP .+1 + TAD .-2 + DCA INIF /SET UP CHDF FOR FIELD 0 + TAD DTA /IS IT LOAD OR DUMP?? + CLL + SNA CLA + STL + SNL /SKIP IF READ + TAD C0020 + TAD C0030 + DCA I DTFUNA /SAVE FUNCTION FOR DECTAPE + TAD RFDMAR + SZL /SKIP IF DISK READ + TAD C0002 /MAKE IT DMAW + DCA RFFUNC /SAVE DMAR OR DMAW + TAD LDFCNT + RAL + DCA LDFCNT /FUDGE LDFCNT SO THAT IT ISZES TO 0 AT THE RIGHT TIME + DCA I DTBLKA /START AT DECTAPE BLOCK 1 + TAD C1000 + DTLA /START WITH DECTAPE DRIVE 1 + IAC + DCA RFTRAK /START WITH RF08/DF32 TRACK 0 FIELD 1 + TAD C0010 + DCA I DTFLDA /START WITH DECTAPE FIELD 1 + TAD DTA + SZA CLA /LOAD OR DUMP? + JMP DMPINI /MUST BE DUMP + JMS I DTRWA /READ FIRST TRACK FROM DECTAPE + DISC /READ OR WRITE - START OPERATION ONLY +RFFUNC, 0 /DMAR OR DMAW + RFTRAK, 0 /BITS 1-8=TRACK, 9-11=FIELD + ISZ LDFCNT /DONE LOADING? + JMP LD2 /NO + DISCHK /YES - LAST WRITE OK?? + JMP LDSTOP +LD2, TAD RFTRAK /WHAT FIELD DOES DECTAPE GO TO NOW? + RTR + SPA CLA + TAD C0010 + TAD C0010 + DCA I DTFLDA + JMS I DTRWA /READ/WRITE DECTAPE + ISZ LDFCNT /DONE DUMPING??? + JMP DMPJMP /NO + DCMA /MAKE SURE THE DISK IS STOPPED +LDSTOP, TAD C0400 /YES - REWIND LAST DECTAPE + DTXA + JMP I .+1 + RFBOOT /NOW GO BOOT WHATEVER IS ON RF08/DF32 +DMPJMP, DISKCHK /DISK OK?? + TAD RFTRAK + RAR + SZL CLA + TAD C0002 + TAD C0007 + TAD RFTRAK + DCA RFTRAK + JMP RFFUNC-1 +DMPINI, DISC +RFDMAR, DMAR + 1 + JMP DMPJMP + +SUPDMP, STA +SUPLOD, DCA DTA /SET DTA NON-0 FOR LOAD, 0 FOR DUMP + JMP DSKSUP /AND GO LOAD OR DUMP + +DTA, 0 +DSKSZ, -DSKSIZ +LDFCNT, 0 +DTFUNA, DTFUNC +DTBLKA, DTBLOK +DTFLDA, DTFLD +DTRWA, DTRORW +C0020, 0020 +C0030, 0030 +RWA, RW + TAPERR, TEXT "_TAPE READ ERROR" +HUH, TEXT "_WHAT?_PLEASE TRY AGAIN_" +HUH2= HUH+3 + /FILE PHANTOM AND DISK REFRESHER + +/WRITE NEW MFD ON DISC DIRECTLY ABOVE THE SWAPPING AREA +PAGE +FIPR4, 0 +FIPASC, ASCSIX +MFD1, MFDT-1 + +FIPREF, ZERO1 /ZERO FIELD 1 + MESSAG /"SYSTEM" + SYSTEM + MESSAG /"PASSWORD" + PASWRD + GETIN + JMS I FIPASC /CONVERT PASSWORD TO SIXBIT + 0011 /GOOES AT WORD 11, 12 OF MFD + MESSAG /"LIBRARY" + LIBARY + MESSAG /"PASSWORD" + PASWRD + GETIN + JMS I FIPASC /CONVERT PASSWORD TO SIXBIT + 0041 /AND PUT IT AT WORDS 41,42 OF MFD + MESSAG /"OPERATOR" + OPRAT + MESSAG /"PASSWORD" + PASWRD + GETIN + JMS I FIPASC /CONVERT PASSWORD TO SIXBIT + 0061 /AND PUT IT AT WORDS 61,62 OF MFD + TAD MFD1 /INITIALIZE POINTER + DCA AXS1 +FIPR2, TAD I AXS1 /GET ADDRESS OF DATA TO BE STORED IN MFD + SNA /ARE WE THROUGH? + JMP FIPR3 /YES + DCA FIPR4 /SAVE IT + TAD I AXS1 /GET DATA TO STORE + DATFLD + DCA I FIPR4 /STORE IT IN THE MFD + CHDF + JMP FIPR2 /GO FOR MORE + +FIPR3, TAD SWBASE + TAD JBMXP /"JOBMAX" + CLL RTL + STL RAL /MAKE IT FIELD 1 + DCA .+3 + DISC + DMAW /WRITE OUT THE MFD + .-. + DISCHK + /INITIALIZE STORAGE ALLOCATION TABLE "SAT" +/THE SAT TABLE RESIDES IN FIP AT 7777 AND EXTENDS +/DOWN THROUGH 7777-(SATSIZ-1). EACH BIT POSITION REPRESENTS 1 SEGMENT +/OF FILE STORAGE. +/SEGMENT 0 IS BIT 0 OF 7252, +/SEGMENT 1 IS BIT 1 OF 7252, ETC. 7252=7777-(SATSIZ+2). +/LOCATION SATCNT=7777-(SATSIZ-1)+1 CONTAINS THE COUNT OF AVAILABLE +/SEGMENTS. A SEGMENT IS AVAILABLE IF ITS SAT BIT HAS THE +/VALUE 0. + + JMS I FIPRFD /FIP TO FIELD 1 + TAD CJTABL + ZERO1 /CLEAR ALL FIP TABLES AND RETRIEVAL INFORMATION + TAD SWDEXP + TAD CJOBMX + TAD DSKSZP /"DSKSIZ" + CLL RTL + RTL + TAD C7777 /CAN'T USE LAST SEGMENT ON DF32 + DCA STORE0 /NUMBER OF DISK SEGMENTS + CLA CMA + DATFLD + DCA I SATBOT /"-255" + CLL STA RTL /SUBTRACT THREE SEGMENTS (FOR 1,2,3 UFD'S) + TAD STORE0 /SET SATCNT TO # DISC SEGMENTS-2 + DCA I SATCNT /"-254" + TAD K7000 /MARK SEGMENTS 1,2,3 FOR MFD, UFD USAGE + DCA I SATTBL + TAD STORE0 /MORE THAN 4000 SEGMENTS. + SMA + JMP .+6 /NO OK + TAD CM4004 /SUBTRACT 4004 + DCA STORE0 + TAD C0253 /253 WORDS=4004 SEGS + DCA COUNT + TAD STORE0 + TAD C7764 /-14 + ISZ COUNT /COUNT # ZERO WORDS IN SAT + SMA + JMP .-3 + DCA STORE0 + STA + TAD COUNT + TAD SATTBL + DCA COUNT + STL RAL + ISZ STORE0 + JMP .-2 + DCA I COUNT /MARK END OF FILE STORAGE AS ALLOCATED + JMP FIPRF5 +FIPRF4, CLA CMA + DCA I COUNT +FIPRF5, ISZ COUNT + JMP FIPRF4 + DISC + DMAW + 0011 /FIP IS TRACK 1, FIELD 1 + DISCHK /MAKE SURE THE DISK IS OK + JMP I SUPERA +SATTBL, -SATSIZ+2 +K7000, 7000 + +COUNT, 0 +SWDEXP, -SWDEX +JBMXP, JOBMAX +C7764, -14 +DSKSZP, DSKSIZ +STORE0, 0 +FIPRFD, FIPRD +CJTABL, JTABLE +SATBOT, -SATSIZ +SATCNT, -SATSIZ+1 +C0253, 253 +CM4004, -4004 +FIPREM, TEXT "_WRITE ZERO SYSTEM DIRECTORY? " + *INIP+3000 + JMP I .+1 + INBOOT + + +/MFD SEGMENT #S TO INBUF + +FRD0, 0 + TAD SWBASE + TAD JBMAX + CLL RTL + STL RAL + DCA FRD1 + DISC + DMAR +FRD1, 0 + DISCHK /MAKE SURE THE DISK IS OK + TAD K0020 + DCA AXS1 + TAD INBUF + DCA AXS2 + TAD K7771 + DCA Z1 +FRD2, DATFLD + TAD I AXS1 + CHDF + DCA I AXS2 + ISZ Z1 + JMP FRD2 + DATFLD + TAD I FGRACE /FETCH SIZE OF "GRACE SPACE" + CHDF + DCA I AXS2 + JMP I FRD0 + +JBMAX, JOBMAX +FGRACE, 0014 +K0020, 0020 + +Z1, +FIPRD, 0 + DISC + DMAR + 0011 /FIP IS TRACK 1, READ INTO FIELD 1 + DISCHK /MAKE SURE THE DISK IS OK + JMP I FIPRD + +Z0, JMS I STFLDB /SET DATA FIELD TYPED + DCA Z1 + DCA I Z1 /ZERO OUT A FIELD + ISZ Z1 + JMP .-2 + JMP I SUPERA + +STFLDB, STFLD + /TABLE USED TO CONSTRUCT VIRGIN MFD +/INCLUDES ENTRIES FOR ACCOUNTS 1, 2, 3 +/EACH PAIR OF NUMBERS INCLUDES FIRST THE MFD ADDRESS, THEN ITS CONTENTS + +MFDT, 3;10 /DUMMY POINTER + 10;1 /ACCOUNT NUMBER 1 + 13;40 /NEXT ACCOUNT STARTS AT 40; LINK TO IT + 14;12 /DEFAULT "GRACE SPACE" OF 10 SEGMENTS PAST QUOTA + 17;20 /SEGMENT LIST IS AT 20 + 21;1 /MFD STARTS WITH SEGMENT 1 ONLY + 30 /AN EXTRA BLOCK IS USED HERE. THE REASON IS SO THAT THE + 7777 /LAST ACCOUNT IN A SEGMENT WON'T HAVE ITS RETRIEVAL + /BLOCK IN THE NEXT SEGMENT. + 40;2 /ACCOUNT 2 + 43;60 /LINK TO NEXT ACCOUNT AT 60 + 44;7777 /NO LIMIT ON DISK SEGMENTS + 47;50 /SEGMENT LIST IS AT 50 + 51;2 /ACCOUNT 2 UFD STARTS WITH ONLY SEGMENT 2 + 60;3 /ACCOUNT 3 + 64;7777 /NO LIMIT ON DISK SEGMENTS + 67;70 /SEGMENT LIST IS AT 70 + 71;3 /ACC. 3 UFD OWNS SEGMENT 3 ONLY, INITIALLY + 0 /TABLE TERMINATOR + CRTABL, RTABLE-1 /MFD SEGMENT #S +CUTABL, UTABLE +SATCON, SATSIZ+1 +CJOBTB, JTABLE-1 /START OF AREA TO CLEAR IN FIP + +PERSET, 0 + JMS FRD0 /MFD SEGMENT #S TO INBUF + JMS FIPRD /FIP TO FIELD 1 + TAD CJOBTB /CLEAR FIP TABLES + DCA AXS1 + DATFLD + DCA I AXS1 + TAD AXS1 /HAVE WE REACHED BOTTOM OF SAT? + TAD SATCON + SZA CLA + JMP .-4 /NO + TAD CRTABL /MOVE MFD SEGMENT #S TO RTABLE + DCA AXS1 + TAD INBUF + DCA AXS2 + TAD K7771 + DCA Z1 +PERSE3, CHDF + TAD I AXS2 + DATFLD + DCA I AXS1 + ISZ Z1 + JMP PERSE3 + CLL CLA CML RAL + DCA I CUTABL /UTABLE=1 + CMA + ISZ CUTABL + DCA I CUTABL /UTABLE+1=-1 + ISZ CUTABL + CHDF + TAD I AXS2 + DATFLD + CIA + DCA I CUTABL /UTABLE+2=-"GRACE SPACE" + CHDF + DISC + DMAW + 0011 /WRITE FIP FROM FIELD 1, TO TRACK 1 + DISCHK /MAKE SURE THE DISK IS OK + JMP I PERSET + +K7771, 7771 + +/THERE'S ALWAYS SOMEONE WHO WILL TRY TO LOAD INIT INTO THE SAME FIELD AS +/THE BINARY LOADER. GIVE HIM/HER A MESSAGE IF [S]HE DOES!! + +*4200 + CLA + RIF + TAD C6201 + DCA INIF + MESSAG + OOPS + HLT + JMP .-4 +OOPS, TEXT "_PLEASE DON'T TRY TO LOAD INIT WITH THE BINARY LOADER " +*.-1 + TEXT "LOCATED IN FIELD 2!" +*7632 + JMP I SUPERA /THIS INSTRUCTION SHOULD INTERCEPT ANY BINARY + /LOADER IN PROGRESS IN THIS FIELD. + /INIT SUPERVISOR +/OVERLAYS XDDT PERMANENT SYMBOL TABLE + + *4200 +SUPER, CLA /SET DATA FIELD + RIF + TAD C6201 + DCA INIF + CHDF + DTRA + AND C0200 + DTXA /STOP ANY DECTAPE WHICH MAY BE MOVING AFTER AN ERROR + TAD OUT1 + DCA OUTA /RESTORE TTY OUTPUT +IFZERO CPU-2 <6030> /DO HIM/HER A FAVOR IF IT'S AN 8/E +IFNZRO CPU-2 <6032> /NOT QUITE AS HELPFUL, BUT NECESSARY + + MESSAG + LDXRS /LOAD, DUMP, START AND OTHER THINGS IN THE LIST OF COMMANDS?? + GETIN /WAIT FOR REPLY + TAD SUPTBA /ADDRESS OF TABLE OF LETTERS + DCA AXS1 /SAVE IT AUTO-INDEX +SUPER2, TAD I AXS1 /GET A LETTER FROM TABLE + SNA /END OF TABLE? + JMP SUPHUH /YES - LET HIM/HER TRY AGAIN + TAD I INBUF /ADD ON FIRST CHARACTER TYPED + SNA CLA /THIS ONE? + JMP SUPER3 /YES - DISPATCH + ISZ AXS1 /NO - PASS UP DISPATCH ADDRESS + JMP SUPER2 /NEXT + +SUPER3, TAD I AXS1 /GET DISPATCH ADDRESS + DCA CHDFA + JMP I CHDFA /AND DISPATCH + +SUPHUH, CLA + MESSAG + HUH + JMP SUPER + +SUPTBA, SUPTBL-1 +OUT1, OUT + STFLD, 0 + CHDF + TAD I STFAD /WHAT WAS THE SECOND CHARACTER TYPED? + TAD STFM8 + CLL + TAD C0010 + SNL + JMP SUPHUH + CLL RTL + RAL + TAD C6201 + DCA .+1 + .-. + JMP I STFLD +STFAD, INBUFA+1 +STFM8, -"8 +/REFRESHER CONTROL + +LOGSMA, LOGMES +REFFLD, CORFLD +REFDDT, XDDFLG +NOCSQ, ISZ CONDBA +REFCSQ, CORJMS +IFZERO DC08A < +REFREQ, FREQ +CYC50, FRETEL +CYC60, +IFNZRO CPU-2 <-6> +IFZERO CPU-2 <-14> > + +REFCO0, JMS I LOGSMA /CHECK FOR NEW SI LOGIN MESSAGE + DISC /READ INIT INTO FIELD 1 + DMAR + 21 + DISCHK /IS IT OK? + YESNO /LAOD XDDT? + DDTMES + STA + DATFLD + DCA I REFDDT /INITIALIZE XDDT LOAD FLAG +REFCO1, CHDF + MESSAG /# USER FIELDS - + CORMES + GETIN + OCTIN + DATFLD + DCA I REFFLD /INITIALIZE NUMBER OF USER FIELDS + TAD I REFFLD + CLL IAC + TAD C7770 + SZL CLA /IS HIS/HER ANSWER REASONABLE? + JMP REFCO1 /NO + CHDF + YESNO + CSQ /DOES [S]HE WANT ^S FEATURE? + TAD NOCSQ /NO + DATFLD + DCA I REFCSQ +IFZERO DC08A < IFNZRO CPU-4 < + CHDF + YESNO + FREQUE /60 HERTZ? + JMS I CYC50 + TAD CYC60 + DATFLD + DCA I REFREQ > > + CHDF + DISC /WRITE OUT INIT + DMAW + 21 + DISCHK /MAKE SURE IT'S OK + YESNO /DO YOU WANT TO REFRESH? + FIPREM + JMP I SUPERA /NO + JMP I .+1 + FIPREF /GO REFRESH + +SUPTBL, -"L + SUPLOD /LOAD + -"D + SUPDMP /DUMP + -"I + SUPREF /INITIALIZE + -"S + SUPST /START + -"X + 7000 /XDDT + -"B + SBUILD /BUILD + -"P + DISCLK /PATCH + -"T + DSKDMP /LOAD OR DUMP; YOU CHOOSE HOW MANY TRACKS + -"O + PATCH /LOAD AN OVERLAY TAPE + -"C + LOAD /READ OR WRITE 4K TO "C" OR + -"Y + Y /READ BINARY TAPE TO A SELECTED FIELD + -"Z + Z0 /ZERO A SELECTED FIELD + -"M + MF0 /MATCH A SELECT FIELD WITH FIELD 1 + -"W + CD0 /DUMP A SELECTED FIELD + -"E + OSB /EXIT TO SOME OPERATING SYSTEM + -"R + RFBOOT /BOOT TO OPERATING SYSTEM ON RF08/DF32 + -"K + KEBOOT /ROOT TO RK8E + 0 /TABLE TERMINATOR + +/FOLLOWING THIS COMMENT, YOU WILL FIND XDDT. ONLY IT MIGHT BE A +/LITTLE HARD TO SEE, SINCE IT'S XLISTED. + + + *5400 + 70 /PATCH FIELD SELECT FOR XDDT + + *6400 + 4434 + 4434 + 4434 + +*4724 + 6031 /PATCH TO FIX XDDT BUGS ON 8E +*4726 + 5376 +*4776 + 6032 + 5772 +*5004 /^C CODE + TSF + JMP .-1 /WAIT FOR FLAG FROM ^C +XOP, SKP /NOP IF XDDT IS EXEC DDT + CIF CDF 0 + JMP I .+1 + 4200 +*5523 + 1222 +*5547 + 7000 +*5572 + 7760 /GIVE THE TTY FLAG MORE TIME +*6045 + 5225 /DON'T GO TO BINARY LOADER + /BINARY LOADER SUBROUTINE +/CALLING SEQUENCE: CDF TO FIELD TO LOAD TAPE INTO +/ JMS BINTAP +/ JMP ? /RETURN WITH FIELD SETTING IN AC6-8 +/ /JMP BINT3 WHEN DESIRED ACTION HAS BEEN TAKEN +/ ? /RETURN WITH CHECKSUM IN THE AC + +*7600 + +BINTAP, 0 + KCC /BRING UP FLAG ON LS READER, AC=0 + RFC /BRING UP FLAG ON HS READER + TAD M200 + DCA TEMP /INITIALIZE DELAY TIME +BLORI, +BINF, KSF /LS READER FLAG YET? + JMP .+3 /NO + TAD BLORI /YES --- + JMP .+4 + RSF /HS READER FLAG YET? + JMP BINIL /NO + TAD BHIRI /YES + DCA BINRD+1 /SAVE HI/LO SWITCH + JMS BFR /READ TAPE-LEADER? + JMP .+2 /YES - GO FIND END OF LEADER + JMP .-2 /NO - FIND LEADER BEFORE ANYTHING + JMS BFR /READ TAPE - LEADER? + JMP .-1 /YES - KEEP LOOKING + DCA ORIGIN /INITIALIZE ORIGIN FOR SAVE TAPES +GO, DCA BINCHK /CLEAR OUT OR UPDATE CHECKSUM +BINT2, TAD FRAME /WHAT WAS IT? + TAD C7500 + SMA + JMP BINFLD /MUST HAVE BEEN A FIELD SETTING + TAD MASK /NOW GET THE FRAME BACK + DCA WORD1 + JMS BINRD /GET NEXT FRAME + DCA WORD2 + JMS BFR /NOW LOOK AHEAD FOR LEADER/TRAILER + JMP BINC /TRAILER! GO DO CHECKSUM + JMS ASSEMB /ASSEMBLE WORD + SZL /ORIGIN? + JMP BINORG /ORIGIN + DCA I ORIGIN /STORE AWAY DATA + ISZ ORIGIN /PREPARE FOR NEXT +M200, CLA 400 +BINT4, TAD WORD1 /NOW UPDATE THE CHECKSUM + TAD WORD2 + TAD BINCHK /ADD IN OLD CHECKSUM + JMP GO /AND GO SAVE IT AND CONTINUE + +BINC, JMS ASSEMB /ASSEMBLE THE CHECKSUM + CIA + TAD BINCHK /COMPUTE FINAL CHECKSUM +BINC2, ISZ BINTAP /SKIP ON RETURN + SNA /CHECKSUM OK? + JMP I BINTAP /YES + DCA BINCHK /SAVE IT + MESSAG /TELL HIM/HER ABOUT BAD CHECKSUM + TAPERR + TAD BINCHK /GET CHECKSUM + JMP I BINTAP /AND RETURN; CHECKSUM IN AC + +BINFLD, AND K0070 /GET FIELD BITS + JMP I BINTAP /AND GO PROCESS THEM + +SWITCH, +ASSEMB, 0 + TAD WORD1 + CLL RTL + RTL + RTL + TAD WORD2 + JMP I ASSEMB +BINIL, JMS DELAY + JMP BINF + +/HERE IS THE REAL BINARY LOADER! + + JMS BINTAP /GO AND BINARY LOAD + JMP .+3 /FOUND A FIELD SETTING +M376, HLT /FINISHED - CHECKSUM IN AC +BEGIN, JMP .-3 /CONTINUE - [S]HE WANTS ANOTHER TAPE READ + TAD K6201 /MAKE A CDF + DCA .+1 /SAVE IT +TEMP, .-. + JMP BINT3 /AND CONTINUE + +/MORE BINARY LOAD JUNK + +/BFR - READ TAPE, IGNORING FRAMES BRACKETED BY RUBOUTS +/SKIP ON RETURN IF LEADER NOT FOUND + +BFR, 0 + DCA SWITCH /SET THE SWITCH (OR RESET IT) + TAD M200 + DCA TEMP + JMS BINRD /GET A CHARACTER + TAD M376 /TEST FOR 377; RUBOUT + SPA SNA CLA + JMP .+4 /NOT RUBOUT + ISZ SWITCH /YES; COMPLEMENT SWITCH + CMA + JMP BFR+1 + TAD SWITCH + SZA CLA /IS THE SWITCH SET? + JMP BFR+2 /YES; IGNORE THE DATA + TAD FRAME /WHAT WAS THE CHARACTER AGAIN? + AND MASK + TAD M200 + SZA CLA /WAS IT LEADER? + ISZ BFR /NO, SKIP ON RETURN + JMP I BFR /AND RETURN + +BINT3, JMS BFR /GET NEXT FRAME + JMP BINC /HUH? LEADER/TRAILER FOLLOWING FIELD SETTING OR ORIGIN!! + JMP BINT2 /AND PROCESS IT + +BINRD, 0 + HLT /KSF OR ELSE JMP HIR + JMP BINDL + KRB + DCA FRAME + TAD FRAME + JMP I BINRD +BHIR, RSF + JMP BINDL + RRB RFC + JMP .-6 + +*7750 /WC & CA; INIT WILL READ INTO FIELD 0 OK + .+1;. +BINDL, JMS DELAY + JMP BINRD+1 + +WORD1, .-. /DECTAPE WC & CA +WORD2, .-. + +/MORE BINARY LOAD JUNK + +BINORG, DCA ORIGIN /SAVE ORIGIN + JMP BINT4 + +DELAY, 0 + ISZ FRAME + JMP I DELAY + ISZ TEMP + JMP I DELAY + STA /TIME OUT - GIVE HIM/HER ERROR MESSAGE + JMP BINC2 + +BHIRI, JMP BHIR +BINCHK, 0 /CHECKSUM ACCUMULATION +ORIGIN, 0 /CURRNET ADDRESS +FRAME, 0 +C7500, 7500 +MASK, 0300 +K0070, 0070 +K6201, 6201 + +*7777 + JMP BEGIN /BINARY LOADER?!! +$ $ $ $ $!!!!!!!!!! + \ No newline at end of file diff --git a/tss8/system/link.pal b/tss8/system/link.pal new file mode 100644 index 0000000..64e8e7c --- /dev/null +++ b/tss8/system/link.pal @@ -0,0 +1,61 @@ +/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: + +MSCHED=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 (100MS) +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 + +/DEFINED IN SI + +DTSIDT=7270 /RETURNED FROM STOPPING A DECTAPE ON TIMER +VERBRK=7600 /START OF INSTALLATION DEFINED LOGIN MESSAGE diff --git a/tss8/system/param.pal b/tss8/system/param.pal new file mode 100644 index 0000000..c897cd6 --- /dev/null +++ b/tss8/system/param.pal @@ -0,0 +1,450 @@ +/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. + +/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 + /4 is defined too (PDP-8/A???) + +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 IF 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.) + +OCTAL +PLT=0 +IFNZRO CPU < IFNZRO DC08A > +IFNZRO 24-JOBMAX&4000 +IFNZRO 23-KL8-PT08&4000 +IFNZRO 24-DC08A&4000 +IFZERO DC08A +IFNZRO DC08A < IFNZRO PHONES + IFZERO PHONES > +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 FOR NEWJOB +IFZERO RF08-40 < +IFZERO RS08-1 +IFZERO RS08-2 +IFZERO RS08-3 +IFZERO RS08-4 +DSKEXT=DSKSIZ-1> +IFZERO RF08 +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 /ERP DISC 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 ADDRESSES + +/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 +DCLR= 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=40 /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 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 +IFNZRO DC08A /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 +IFZERO EAE + IFZERO CPU&7776 > +IFNZRO OUTREG&1 diff --git a/tss8/system/si.pal b/tss8/system/si.pal new file mode 100644 index 0000000..5ac817e --- /dev/null +++ b/tss8/system/si.pal @@ -0,0 +1,4456 @@ +/SI 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. + +/SI PAGE 0 +FIELD 0 /SI LOADS ONTO DISK TRACK 0 + +*0 + CLA CLL +C6201, CDF /CHANGE TO FIELD ZERO + JMP I .+1 +SI1, COM +SKIP= JMS I . + SKIPS + + IX1=10 + IX2=11 + IX3=12 + IX4=13 + IX5=12 + + *10 + . /IX1 + . /IX2 + . /IX3 + . /IX4 +C4000, 4000 +C0200, 200 +NOPUNCH +*6622 +ENPUNCH + DMAR /FOR BOOT-STRAPPING + JMP . /FOR BOOT-STRAPPING + +SIDATA=20 /SYSTEM INTERPRETER DATA +*SIDATA + +COMPTR, . /POINTER TO LAST DEVTBL ENTRY SCANNED, INITIALIZE TO DEVTBL-1 +CONDVA, CONDBA /DEVTBL POSITION OF OUTPUT SIDE +SITCNT, F1TCNT +COMDSP, . /FIP RETURN DISPATCH +SIFLG, . /COMMAND FLAGS +SICHAR, . /SAVE LAST CHAR FROM COMMAND SCAN +SIREG, . /USER AC, LINK, PC + . + . +TTCHAR, . /TTY CHARACTER + +CONSTANTS=SIDATA+12 +*CONSTANTS +C0002, 2 +C0003, 3 +C0004, 4 +C0007, 7 +C0037, 37 +C0100, 100 +C1000, 100 +C7770, 7770 +C0010, 10 + +JOBCON=CONSTANTS+11 /JOB CONTROL +*JOBCON + +JOBTIM, . /-#TICKS REMAINING TO RUN +JOBTBA, JOBTBL /JOB TABLE ADDRESS +C0006, 6 + +FRSTOR=JOBCON+3 +*FRSTOR + +FREE, . /POINTER TO HEAD OF FREE STORAGE +FRECNT, . /# FREE BLOCKS AVAILABLE + + +TIMDAT=FRSTOR+2 /CLOCK AND DATE +*TIMDAT + +/CLOCK +CLK2, . +CLK1, . + + +SCHDAT=TIMDAT+2 +*SCHDAT /SCHEDULING DATA + +COMCNT, . /NUMBER OF COMMANDS WAITING EXECUTION + + + +FIPDAT=155 /DATA REFERENCED BY FIP +*FIPDAT+1 + +C0400, 400 +SEGSIZ=C0400 /#WORDS PER SEGMENT +FIBASE, SWDEX+JOBMAX /BASE ADDRESS OF ALLOCATABLE DISC STORAGE +JOB, . /# OF CURRENT JOB +JOBDAT, . /ADDRESS OF CURRENT JOB DATA LIST, MUST RESIDE IN DATA FIELD. +CORTBA, CORTBL-1 /CORE ALLOCATION TABLE +DEVTBA, DEVTBL /DEVICE TABLE +DSUTBA, DSUTBL /USER DISC REQUEST QUEUE +DSBUSY, . /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, . + + +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 +KBDA, KBD00 /INPUT KEYBOARD CHARACTERS +KEY=JMS I KBDA +RETBA, RETB /RETURN BLOCK TO FREE STORAGE +RETBLK=JMS I RETBA +WAITA, WSCHED +WAIT=JMP I WAITA + + + *SCHDAT+1 + +SIJOB, 0 +CHDFA, 0 /TEMP LOC USED BY MANY ROUTINES +CHDF=6221 +COMDB0, 0 /ADDRESS OF COMMAND DDB +COMRDB, 0 /RESPONSE DEVTBL ADDRESS +COMBFA, COMBUF-1 +COMTBE, 0 /COMMAND TABLE ENTRY ADDRESS +COMFLG, 0 /COMMAND CONTROL FLAGS +IOTPAR, . /IOT PARAMETER BLOCK +IOTP0, 0 +IOTP1, 0 +IOTP2, 0 +IOTP3, 0 +IOTP4, 0 +IOTP5, 0 +IOTP6, 0 +IOTP7, 0 +CHAR, 0 /CURRENT SCAN CHARACTER +NUMHO, 0 /HIGH ORDER FOR NUMBIN + 0 + 0 +TEXTS=JMS I . + CTEXT /ASCII READ +DECRCA, DECRC0 /DECREMENT COMCNT +NUMBIA, NUMBI0 /NUMBER CONVERT +ASCOUA, ASCOU0 /ASCII OUTPUT +ENDTSA, ENDTS0 /TEST FOR END OF COMMAND +COMGEA, COMGE0 /GET COMMAND STRING CHARACTER +COMERA, COMERR /ERROR RETURN +COMEXA, COMRET /OK RETURN +COMEXP, COMRET /FOR RESETTING COMEXA +ASCSIA, ASCSI0 /ASCII TO SIXBIT +GETFBA, GETFB0 /GET FREE BLOCK +GETBAA, GETTB0 /GET JOB TABLE ADDRESS +RETDBA, RETDB0 /RETURN BLOCK +RETBKA, RETBK0 /RETURN BLOCKS +IOTEND, FIPEND +LNGIOT, FOPEN1 /LONG IOT +SHTIOT, ACSET /SHORT IOT +CALFIA, CALFI0 /FIP OVERLAY +RESPDA, RESPDB /GET RESPONSE DDB +EXITA, COMEXT +EXIT=JMP I EXITA +GETWRA, GETWR0 /GET STATUS WORD +OCTASA, OCTAS0 /OCTAL TO ASCII +BUFDEA, BUFDE0 /BUFFER DELETE +RETPAA, RETPA0 /RETURN PARAMETERS +CORES=JMS I . + CORSER +ASSCOR=JMS I . + ASSCO0 +RELCOR=JMS I . + RELCO0 +TTYTBA, TTYTBL /START OF TTY TABLE +SIERR=JMS I . + SYSER0 +SWBASE, SWDEX /START OF SWAPPING TRACKS +ACCTIN= JMS I . + ACC0 +P7777, -1 +C7700, 7700 +JOBONC, -JOBMAY +SIECNT, F1ECNT /DDB EMPTY COUNT +SIBUF, F1BUF /DDB EMPTY POINTER +COMES1, COMLGM +COMWAA, COMDEL +COMWAT=JMP I COMWAA + +/SI PAGE DIRECTORY + +SCAN=200 +SUBR=SCAN+1400 +COMMAN=SUBR+1200 +CTABLE=COMMAN+3000 +ERPAGE=CTABLE+1000 + + +/COMMAND CONTROL FLAGS + +NOLOG=4000 /LOGIN NOT REQUIRED +USERM=2000 /REFERENCES USER MEMORY +USAVE=1000 /SAVE USER REGISTERS +UREST=400 /RESTORE USER REGISTERS + +PRBUF=200 /PRINT BUFFER +PRQM=100 /PRINT ? +PRPER=40 /PRINT . +PRCRLF=20 /PRINT CRLF +NOMESS=10 /NO MESSAGE +/BITS 9-11 CONTAIN # FREE BLOCKS REQUIRED + +*SCAN + +DEVTND, -DEVTBE+1 +COMSIC=C0100 /SICOM +COMFND=IOTP7 /COUNT OF SEARCH MATCHES +COMLNK=IOTP5 +COMNXT=IOTP6 +COMSET, RESTBP + +COM, TAD I JOB + AND C0037 + DCA SIJOB + TAD SIJOB + SZA CLA /FIP RETURN? + JMP COMFIP /YES + TAD I COMPTR + DCA IX1 + TAD IX1 + DCA IOTP0 + DATFLD +COM1, ISZ IX1 /DON'T BOTHER LOOKING AT THE OUTPUT SIDE + TAD DEVTND + TAD IX1 + SZA CLA /END OF TABLE? + JMP COM1 /NO + STA + TAD DEVTBA /YES, RESET TO BEGIN OF TABLE + DCA IX1 +COM2, TAD I IX1 /GET TABLE ENTRY + SZA + JMP COM3 +COM4, TAD IX1 /SCANNED ENTIRE TABLE? + CIA + TAD IOTP0 + SZA CLA + JMP COM1 /NO + CDF + DCA I COMCNT +COMEXT, RELCOR /RELEASE COR + CIF CDF + DCA I COMDSP + WAIT /RESCHEDULE + +SIWATA, SIWAIT +SITIMA, TIMSI + +COM3, DCA COMDB0 + TAD I COMDB0 /COMMAND WAITING? + AND COMSIC + SNA CLA + JMP COM4 /NO + TAD COMDB0 /SET JOB # + IAC + DCA COMTBE + TAD I COMTBE + CDF + AND C0037 + DCA SIJOB + TAD IX1 + DCA I COMPTR + TAD SIJOB + TAD I JOB + DCA I JOB + TAD SIJOB + DATFLD + SNA + JMP COM31 + TAD JOBTBA + DCA CHDFA + TAD I CHDFA +COM31, DCA I JOBDAT + TAD I JOBDAT /DO WE HAVE JOB? + SNA + JMP COM33 /NO + IAC + DCA CHDFA /ADDRESS OF STR0 + JMS I COMLRA /CHECK FOR RUBOUT AND LINE-FEED + TAD C7367 + AND I CHDFA /CLEAR OUT THE R PRIVILEGE & ERROR REPORT INHIBIT BITS + DCA I CHDFA /SAVE IT +COM33, JMS I COMSET /SETUP BUFFER POINTERS + DCA COMRDB + DCA COMFLG +COM32, DCA CHAR + TAD COMBFA /GET COMMAND NAME + TEXTS + CIA + TAD COMBFA /NULL? + SZA CLA + JMP I COM41A + TAD CHAR + SZA CLA + ENDTST /END OF COMMAND? + JMP I COM64A /YES + JMP COM32 /TRY TO FIND A VALID COMMAND + +C7367, -JSPEEK-JSINER-1 +COM64A, COM64 +COMLRA, COMLRB +COM41A, COM41 + +COMFIP, TAD I COMDSP + SNA + JMP COMFI2 + DCA IOTP0 + DCA I COMDSP + TAD I SIFLG /RESTORE CONTROL FLAGS. + DCA COMFLG + TAD I SICHAR + DCA CHAR + TAD I COMPTR + DCA COMDB0 + DATFLD + TAD I COMDB0 + DCA COMDB0 + TAD I JOBDAT + SNA + JMP COMFI1 + IAC + DCA CHDFA + TAD C0003 + TAD I CHDFA + AND C0007 /WAS THERE A SYSTEM DISK ERROR? + SZA CLA +COMFI1, ISZ IOTP0 + CHDF + JMP I IOTP0 +COMFI2, CHDF + JMP I .+1 + SYSERR + +COMDEL, CDF /SI MUST WAIT FOR SOME REASON + TAD I COMCNT /NUMBER OF COMMANDS LEFT TO DO + TAD I SIWATA /PLUS THOSE ALREADY WAITING + DCA I SIWATA + DCA I COMCNT /WE'LL RELOAD THE COUNT WHEN THE TIMER RUNS OUT + STA + DCA I SITIMA /WAIT FOR ONE SECOND + EXIT +PAGE + +COMTBA, COMTBL +COM9A, COM9 +COM91A, COM91 +COM41, DCA COMFND /SEARCH COMMAND TABLE + TAD COMTBA +COM6, DCA COMLNK + TAD I COMLNK + SNA + JMP I COM9A /END OF TABLE + DCA COMNXT + TAD COMLNK + TAD C0003 + DCA IX2 + TAD COMBFA + DCA IX3 +COM5, TAD IX2 + CMA + TAD COMNXT + SNA CLA + JMP COM99 /EXACT MATCH + TAD I IX3 + SNA + JMP COM8 + TAD I IX2 + SNA CLA + JMP COM5 + JMP COM7 +COM8, ISZ COMFND /PARTIAL MATCH + TAD COMLNK + DCA COMTBE +COM7, TAD COMNXT + JMP COM6 + + +COM99, TAD I IX3 + SNA CLA + JMP I COM91A /EXACT + JMP COM7 +COMECH, DECHO +COMLBT, -SICOM-DECHO-1 +COMPST, STRNG0 +COMPNT, RESTBP + +COMLRB, 0 + TAD I COMDB0 + AND COMECH + SNA CLA + JMP I COMLRB + JMS I COMPNT + DCA CHAR +DCA COMRDB + DCA COMFLG + JMS I COMPST + ASCOUT + CRLF + NOP + GETWRD + JOBSTS + SPA CLA + JMP COMLRR + ASCOUT + PERIOD + NOP +COMECC, ASCOUT + VERBRK + NOP + DATFLD + TAD COMLBT + AND I COMDB0 + DCA I COMDB0 + DECRCT + EXIT +COMLRR, ASCOUT + CB + NOP + JMP COMECC +CB, "^ + "B + 0 + +SWITCH, TAD JBSWR +RESTRT, TAD JBSRA + DCA .+2 + GETTBA + 0 + JMP BRK0 + +JBSWR, JOBSWR-JOBSRA +JBSRA, JOBSRA + +BREAK, TAD COMDB0 /DDB ADDRESS + TAD C0002 +BRK0, DCA IOTP1 /POINTER TO APPROPRIATE REGISTER + ENDTST /ARGUMENT? + SKP /NO; TELL HER WHAT IT IS + JMP BRK1 /YES, NEW VALUE FOR MASK + DATFLD + TAD I IOTP1 /GET BREAK MASK + CHDF + OCTASC /CONVERT TO ASCII + IOTP2 /STORE IN IOTP3,4,5,6,7 + ASCOUT /OUTPUT A CRLF + CRLF + NOP + ASCOUT + IOTP3 + NOP + JMP I COMEXA + +BRK1, NUMBIN + -267 + JMP I COMERA /INVALID CHARACTER IN STRING + DATFLD + DCA I IOTP1 + JMP I COMEXA + +STARS, 215;212;"*;"*;"*;240;0 +FM5400, "B;"A;"D;240;"D;"I;"R;"E;"C;"T;"O;"R;"Y;0 + +/ROUTINE TO SEE IF JOB IS RUNNING WHEN COMMAND REQUIRING FIP IS ISSUED. +/IF SO, WE CAN'T HONOR COMMAND +/THE MESSAGE "TYPE ^BS FIRST" IS GIVEN + +/CALL TAD IOT ENTRY FROM COMMAND TABLE +/ JMS FIPCHK +/ RETURN IF OK TO PROCEED [OTHERWISE RETURN IS TO COMEXT] +/ IF NOT RUNNING BUT JOB IS BUSY WITH FIP OR FILE I/O, EXIT VIA COMWAT + + +FIPCHK, 0 + DCA IOTP0 /SAVE THE IOT + GETWRD /IT'S A CALL TO FIP; IS SHE RUNNING? + JOBSTS /IF SO HER RUN BIT IS ON + SPA + JMP FIPCH2 /SHE'S TURNED ON SO DON'T HONOR COMMAND + AND C0140 /DOES SHE STILL HAVE A FIP REQUEST IF HER OWN PENDING? + SZA CLA + COMWAT /YES DON'T CONFUSE THE ISSUE + ISZ IOTP7 + DATFLD + TAD I IOTP7 /STR1 + RAR + CMA RAL + ISZ IOTP7 + ISZ IOTP7 + AND I IOTP7 /WAIT MASK 1 + AND FILES + CHDF + CLL RAR + SNA SZL CLA /IS SHE WAITING FOR A FILE TRANSFER? + JMP I FIPCHK /NO; SO LET HER PROCEED + COMWAT /WAIT FOR THINGS TO COOL OFF + +FIPCH2, CLA + TAD IOTP0 + SPA + AND C0010 /EITHER FINF, DMAR, OR DMAW + SNA CLA + JMP I FIPCHK /WANTS TO EXAMINE OR DEPOSIT + TAD COMFLG + AND P7377 /DON'T RESTORE REGISTERS SINCE THEY ARE NOT SAVED + DCA COMFLG + TAD FIPTCB + JMP I COMEXA /"TYPE ^BS FIRST" + +FIPTCB, TYCRLB +C0140, JSIOT JSIOTC +P7377, 7377 +FILES, JSF0 JSF1 JSF2 JSF3 JSWAIT + +WAIT1, TAD I DTJOBA + CIA + TAD SIJOB /DOES SHE CURRENTLY OWN THE CONTROLLER, OR IS SHE JUST WAITING IN THE QUEUE + SNA CLA + JMP I COMEXA /SHE OWNS IT - DON'T BOTHER HER + + JMP I .+1 /GO DO THE STUFF COMMON WITH THE RK05 + DTSIDT + +K5, 5 + +WAIT2, TAD I IOTP7 /GET POINTER TO HER TIMER + TAD K5 + DCA CHDFA + STA + DCA I CHDFA /SET HER TIMER=1 SECOND + STA + TAD SIJOB + TAD JOBTBA + CIF DATFLD + JMP I .+1 /FORCE THE TIMER TO RUN - JUST FOR HER JOB + DTSI +DTJOBA, DTJOB + +ACCBUF, " ;" ;"[;0;0;0;0;0;"];0 + +SYSET6, "H /HUNG DEVICE + "U + "N + "G + 240 + "D + "E + "V + "I + "C + "E +SYRING, 207;207;207 + 0 + +*724 /DO NOT MOVE ANYTHING IN THIS AREA + /IT IS VITAL FOR BOOT-STRAPPING +NOPUNCH +*7730 /THIS IS WHERE IT WILL ACTUALLY EXECUTE +ENPUNCH +IFZERO RF08 < +TRBOOT, 2 +FLBOOT, 20 +GOBOOT, DCMA + CLA + TAD FLBOOT + DIML + TAD TRBOOT + DXAL + > +IFZERO RF08-40 < + NOP;NOP;NOP /FOR SIZE +TRBOOT, 220 +GOBOOT, DCMA + CLA + TAD TRBOOT + DEAL + > + STA + DCA CABOOT + DCA WCBOOT + DMAR + DFSC + JMP .-1 + CIF CDF 20 + JMP 0 +WCBOOT, -3 /READ 3 WORDS AFTER OVERLAYING ITSELF +CABOOT, 6621 /OVERLAY OUR CURRENT "JMP ." WE'RE EXECUTING AT 6623 +NOPUNCH +*6622 +ENPUNCH + GOBOOT + JMP I .-1 +*750 +GETACC, 0 + TAD JOBTBA + CIF + GETJTA + JOBACC + DCA CHDFA + DATFLD + TAD I CHDFA + CHDF + OCTASC + ACCBUF+2 + TAD ACCBUF+6 + DCA ACCBUF+7 + TAD ACCBUF+5 + DCA ACCBUF+6 + TAD ACOMMA + DCA ACCBUF+5 + JMP I GETACC +ACOMMA, ", +SYBELL, ASCOUT + SYRING + NOP + EXIT + +CUSERM=CLA CLL CML RTR /AC =2000 + +COM9, STA + TAD COMFND + SZA CLA + JMP COM99A /NOT UNIQUE OR NOT FOUND + JMP COM91Z +FIPCOM, FIPCHK +COM91, TAD COMLNK + DCA COMTBE +COM91Z, ISZ COMTBE /GET COMMAND FLAGS + TAD I COMTBE + DCA COMFLG + TAD COMFLG /ENOUGH FREE STORE? + AND C0007 + CIA + CDF + TAD I FRECNT + CHDF + SPA CLA + COMWAT /NO + CUSERM /AC=2000 + AND COMFLG /USER MEMORY REFERENCE? + SNA CLA + JMP COM16 /NO + STL RAR /AC=SWAP + TAD SIJOB /YES, IS USER BEING SWAPPED? + CORES + SZA CLA + COMWAT +COM16, ISZ COMTBE + TAD SIJOB + SZA CLA + TAD I COMTBE /STORE IOT + SZA /NON RESIDENT IOT? + JMS I FIPCOM /YES--IS SHE RUNNING A PROGRAM? + TAD IOTPAR + DCA IX1 + TAD C7770 + DCA CHDFA + TAD I COMTBE /FIX UP IOTP0 + DCA I IX1 + ISZ CHDFA + JMP .-2 + ISZ COMTBE + TAD I COMTBE + DCA COMTBE + TAD COMFLG + SPA CLA /LOGIN REQUIRED? + JMP I COMTBE /NO, DISPATCH + TAD SIJOB + SNA CLA /NULL JOB? + JMP I COM12A + TAD COMFLG /SAVE REGISTERS? + AND C1000 + SNA CLA + JMP I COMTBE /NO, DISPATCH + GETTBA + JOBREG + DCA COMREG + CIF + BLT + DATFLD +COMREG, 0 + CDF + SIREG + -3 + DATFLD /PC=-1 + STA + DCA I COMREG + CHDF + JMP I COMTBE +COM12A, COM12 + +COM99A, TAD SIJOB /IS SHE LOGGED IN? + SNA CLA + TAD COMES1 /NO, SO SEND "LOGIN PLEASE" + JMP I COMERA + +CALFIP=JMP I CALFIA + +CALFI0, STA CLL RAL /SAVE RETURN ADDRESS + TAD COMTBE + CDF + DCA I COMDSP + TAD COMFLG /SAVE FLAGS + DCA I SIFLG + TAD CHAR + DCA I SICHAR + TAD CALFBA +LOADUS, DCA CALFI2 + CHDF + TAD CALFI4 + TAD DSUTBA + GETFBL + COMWAT + DCA CALFI1 + ASSCOR + CIF CDF + TAD SIJOB + TAD C0200 + DCA I JOB + CHDF + BLT + CHDF +OFF5, /SOURCE FIELD +CALFI2, 0 /SOURCE ADDR + DATFLD /DESTINATION FLD +CALFI1, 0 /DESTINATION ADDR + -10 + CIF CDF + ISZ I DSBUSY + WAIT + JMP I .+1 + OVRLA1 +DEPEXA, TAD CALFI5 + JMP LOADUS +CALFI5, IOTP0 + +CALFBA, .+1 + DMAR + FIPDEX +CALFI4, 10 /MEMORY EXT IN 7-9 + -FIPWC + -1 + 0 + OVERLA + 0 + +OFF3A, ACTNM1 +OFF4, 7774 /ALLOW ONLY ACCOUNTS 1, 2 & 3 TO LOGIN +OFFJOB, F1OFFJ +OFFLIN, TAD OFF4 +ON, DCA OFF5 + JMS I OFF3A /CHECK ACCOUNT NUMBER + TAD OFF5 /.. 0 IF ON + DATFLD + DCA I OFFJOB /STORE IT IN FIELD 1 + JMP I COMEXA /RETURN +COMFLE, PRQM+PRBUF +COPRBF, PRBUF +COMESF, NOMESS +COMQM, PRQM +COMCRF, PRCRLF +COMELF, PRPER+PRCRLF +CO18A, COM18 +COMURE, UREST +COMURM, -UREST-1 +MSEMI, -273 +MCR, -215 + +COM12, TAD COMFLG + AND COMURM + DCA COMFLG + TAD COMES1 + +COMERR, DCA COMESA + TAD COMFLG + AND C7700 + TAD COMELF /SET FLAGS FOR ERROR MESSAGE + DCA COMFLG + TAD COMESA + SZA CLA + JMP COMRET+1 + TAD COMFLE + TAD COMFLG + SKP +COM64, TAD COMELF + DCA COMFLG + +COMRET, DCA COMESA + CHDF + TAD COMFLG /RESTORE REGISTERS +AND COMURE + SNA CLA + JMP COMRE0 + GETTBA + JOBREG + DCA .+6 + CIF + BLT + CDF + SIREG + DATFLD + 0 + -3 +COMRE0, TAD COMFLG /MESSAGE? + AND COMESF + SZA CLA + JMP COM10 /NO + ASCOUT + CRLF + NOP + TAD COMFLG + AND COPRBF + SNA CLA /PRINT BUFFER? + JMP COMRE3 /NO, DELETE COMMAND + JMS I CORSET /YES, RESTORE BUFFER POINTER +COMRE1, COMGET /GET A CHAR + JMP COMRE3 /NONE + STL RTL + ENDTST /LAST CHARACTER OF COMMAND LINE? + JMP COMRE3 /YES; DON'T ECHO THIS ONE + RESDDB + CIF CDF + DCA I CONDVA + TAD CHAR + DCA I TTCHAR + CHDF + PRINT + JMP COMRE1 + JMP COMRE1 +COMRE3, SKPCOM /SKIP TO END OF COMMAND + NOP + BUFDEL /DELETE TO CURRENT POINTER + TAD COMESA + SNA CLA + JMP COM11 + ASCOUT /OUTPUT MESSAGE + JMP COM10 /WON'T FIT +COM11, TAD COMFLG /PRINT ?? + AND COMQM + SNA CLA + JMP COM13 /NO + ASCOUT + QQEST + JMP COM10 +COM13, TAD COMFLG /PRINT CRLF? + AND COMCRF + SNA CLA + JMP COM10 + ASCOUT + CRLF + NOP +COM10, TAD CHAR + TAD MSEMI + SNA CLA + JMP I COM22A + DECRCT /DECREMENT COMCNT + JMP I CO18A /YES +COM22A, COM22 +CORSET, RESTBP +LOGIF2, DCA .+4 /SAVE POINTER TO TIME ASCII STRING + TAD COMEXP /RESTORE COMRET + DCA COMEXA + ASCOUT /OUTPUT TIME MESSAGE + 0 + JMP I COMEXA /NO ROOM, SO DON'T PROCEED + TAD CHAR /ENDED WITH RETURN? + TAD MCR + SNA CLA + TAD VERBRA /YES, SO OUTPUT MESSAGE OF THE DAY + JMP I COMEXA /DONE AT LAST + +VERBRA, VERBRK-2 +SKPCOA, SKPCO0 /SKIP TO END OF COMMAND +SKPCOM=JMS I SKPCOA + + +LOGE0, "A;"L;"R;"E;"A;"D;"Y;240;"L;"O;"G;"G;"E;"D;240;"I;"N;0 +COMMSI, -SICOM-DECHO-1 +COMPF, PRPER +COMCLN, -272 +COMKEY, -JSDEL-1 +COMKEF= C0100 + +COM18, DATFLD + TAD COMDB0 /JOB DEFINED? + SNA /HAS SHE JUST LOGGED OUT? + JMP COM22 + IAC + DCA CHDFA + TAD I COMDB0 + AND COMMSI + DCA I COMDB0 + TAD I CHDFA + AND C0037 + SNA CLA + JMP COM17 /NO + CHDF + GETWRD + JOBSTS + DATFLD + SMA CLA /IS JOB RUNNING? + JMP COM20 /NO + TAD I COMDB0 + AND COMSIF + DCA I COMDB0 /SAVE WITH FLAG CLEARED + TAD COMPF + CMA + AND COMFLG + DCA COMFLG + ISZ IOTP7 + TAD CHAR + TAD COMCLN + SZA CLA + JMP COM21 + TAD I IOTP7 + AND COMKEY + TAD COMKEF + DCA I IOTP7 +COM21, STL RTL + TAD IOTP7 + DCA NUMHO + IAC + TAD NUMHO + DCA NUMHO+1 + TAD I NUMHO+1 + SNA + TAD I NUMHO + SZA CLA + JMP COM19 + ISZ I NUMHO + TAD I IOTP7 + RAR + STL RAL + DCA I IOTP7 +COM19, TAD CHAR /GET TERMINATING CHARACTER + TAD MCRS + SZA CLA /WAS IT CR + JMP COM22 /NO; LEAVE OUTPUT MODE AS IS + RESDDB /DETERMINE DEVTBL ADDRESSES FOR THIS TERMINAL + STA + TAD COMRDB + DCA QON /SAVE KEYBOARD DEVTBL POINTER + DATFLD + TAD I COMRDB /GET ADDRESS OF OUTPUT DDB + DCA IOTP7 + TAD I IOTP7 + SMA CLA /^S MODE? + JMP COM22 /NO + TAD CTRLQ /YES; FORCE A ^Q THROUGH THE INPUT ROUTINES + CIF CDF 00 + DCA I TTCHAR + CHDF + KEY /PUSH IT THRU +QON, .-. /DEVTBL ADDRESS +CTRLQ, "Q-100 /"KEY" CAN'T FAIL +COM22, CLA + CHDF + TAD COMFLG + AND COMPF + SNA CLA + EXIT + ASCOUT + PERIOD + EXIT + EXIT +COM20, CIF 00 + TAD COMDB0 + JMS I SICLRA + JMP COM19 +COMSIF, -DSI-1 +COM17, CIF CDF 00 + TAD I COMPTR /DELETE THE INPUT DDB SINCE WE'RE DONE + DCA CHDFA + DATFLD + DCA I CHDFA + TAD COMDB0 + JMS I SICLRA + TAD COMDB0 + RETDBL + JMP COM22 + +MCRS, -215 +SICLRA, SICLR + +/ROUTINE TO GET TEXT STRING FROM USERS INPUT BUFFER TO LAST PAGE +/OF SI, WHERE THEY STORE LOGIN MESSAGE + +/CALL JMS STRNG0 +/ RETURN + +STRNG0, 0 + TAD STRBRK /SET UP POINTERS + DCA IOTP0 /POINTS TO START OF BUFFER + TAD IOTP0 + DCA IOTP1 /POINTS TO END OF BUFFER + SKIP /SKIP SPACES AND TABS + JMP STREND /END OF INPUT BUFFER REACHED +STRNG1, TAD CHAR /SAVE CHARACTER IN BUFFER + DCA I IOTP1 + ISZ IOTP1 /READY FOR NEXT CHARACTER + SKP + JMP I COMERA /HOW COULD SHE TYPE SO MUCH? + COMGET /GET ANOTHER CHARACTER + JMP STREND /NONE + JMP STRNG1 /AND LOOK AT IT + +STREND, DCA I IOTP1 /END THE STRING + JMP I STRNG0 /RETURN + +STRBRK, VERBRK + + +*SUBR + +/GET A TEXT STRING +/CALL TAD ADDRESS OF BUFFER -1 +/ TEXTS +/ RETURN WITH POINTER TO LAST CHAR IN AC + +CTEXA, -241 +CTEXZ, -340 +CTEXCN, -272 +CTEX6, -6 +CTEXBF, 0 /BEGIN OF BUFFER +CTEXNU, 0 /NUMBER OF CHARACTERS + +CTEXT, 0 + DCA IX1 /INITIALIZE INDEX + TAD IX1 + CIA + DCA CTEXBF + DCA CTEXNU + SKIP /SKIP SPACES AND TABS + JMP CTEXT4 +CTEXT3, TAD CHAR + TAD CTEXCN + CLL RAR + SNA CLA /COLON OR SEMICOLON? + JMP CTEXT4 /YES + TAD CHAR /NO + TAD CTEXA + SPA CLA + JMP CTEXT4 /NO + TAD CHAR + TAD CTEXZ + SMA CLA + JMP CTEXT4 /NO + TAD CTEXNU /STORE CHARACTER + TAD CTEX6 + SMA CLA + JMP .+3 + TAD CHAR + DCA I IX1 + ISZ CTEXNU + COMGET /GET ANOTHER CHAR + SKP /NONE + JMP CTEXT3 +CTEXT4, DCA I IX1 /CLEAR NEXT POSITION + STA + TAD IX1 + JMP I CTEXT + +/SKIP LEADING SPACES AND TABS +/CALL JMS SKIPS +/ BUFFER EMPTY +/ NORMAL RETURN + +SKISPA, -240 +SKITAB, -211 + +SKIPS, 0 + JMP .+3 +SKIPS1, COMGET + JMP I SKIPS /NONE LEFT + TAD CHAR + SNA + JMP .-4 + TAD SKISPA + SNA CLA + JMP SKIPS1 + TAD SKITAB + TAD CHAR + SNA CLA + JMP SKIPS1 + ISZ SKIPS + JMP I SKIPS + +/GET A CHARACTER FROM COMMAND STRING +/CALL COMGET +/ NONE LEFT +/ RETURN WITH CHARACTER IN CHAR + +TC7766, 7766 +TC7400, 7400 +C0377, 377 +COMGET=JMS I COMGEA +COMGE0, 0 + CLA + DATFLD + TAD I SITCNT + SNA + JMP COMGE3 + ISZ COMGE0 + CIA + CMA + DCA I SITCNT + ISZ I SIECNT + JMP COMGE1 + TAD TC7766 + DCA I SIECNT + TAD I SIBUF + DCA COMGT1 + TAD I COMGT1 + DCA I SIBUF +COMGE1, TAD I SIECNT + TAD C0003 + SMA + STL RAL + SPA + STL CIA + TAD I SIBUF + DCA COMGT1 + TAD I COMGT1 + SZL + JMP COMGE2 + AND TC7400 + DCA COMGT2 + ISZ COMGT1 + TAD I COMGT1 + AND TC7400 + CLL RTR + RTR + TAD COMGT2 + RTR + RTR +COMGE2, AND C0377 + DCA CHAR +COMGE3, CHDF + JMP I COMGE0 + +/GET A FREE BLOCK AND RETURN ITS ADDRESS +/CALL TAD FIELD 1 LINK +/ GETFBL +/ NONE AVAILABLE +/ ADDR IN AC + +GETFBL=JMS I GETFBA + +COMGT1, +GETFB0, 0 + DCA CHDFA + TAD CHDFA + CIF + GETBLK + JMP I GETFB0 + DATFLD + TAD I CHDFA + CHDF + ISZ GETFB0 + JMP I GETFB0 + + +/SEARCH FOR JOB IN CORE +/CALL TAD SEARCH ITEM +/ CORES +/ RETURN WITH CORE ARG IN AC + +COMGT2, +CORSER, 0 + CIF + CORE + SWAP SI CJOB + CLA + JMP I CORSER + + + + +JOBNO, "J;"O;"B;240;0 +KSPACE, 240;240;"K;0 + + +/NUMBER INPUT +/CALL NUMBIN +/ -N N=7,9 IN ASCII +/ NOT A NUMBER +/ # IN AC + +NUMBIN=JMS I NUMBIA + +ASCOT0, +NUMSGN, 0 /SIGN +NUMAGN=NUMHO+1 /MAGNITUDE +ASCOT1, +NUMCNT, 0 /DIGIT COUNT +NUMCOM, 240-254 /" "-"," +NUMPLS, -253 /+ +NUMINU, -255 /- +NUMZER, -260 +NUMM5, -5 +NUMB17, 17 +NUMDSP, JMP NUMDEC + +NUMBI0, 0 + TAD I NUMBI0 /SET CONVERSION DISPATCH + AND C0002 + SNA CLA + TAD C0010 + TAD NUMDSP + DCA NUMDEC-1 + DCA NUMSGN /INITIALIZE + DCA NUMAGN + DCA NUMHO + DCA NUMCNT + SKIP /SKIP SPACES AND TABS + JMP NUMBI4 /BUFFER EMPTY + TAD CHAR + TAD NUMPLS /+? + SNA CLA + JMP NUMBI1 /YES + TAD CHAR + TAD NUMINU /-? + SZA CLA + JMP NUMBI2 /NO + ISZ NUMSGN +NUMBI1, COMGET /GET A CHARACTER + JMP NUMBI3 +NUMBI2, TAD CHAR + TAD NUMZER + SPA CLA /DIGIT? + JMP NUMBI3 /NO + TAD CHAR + TAD I NUMBI0 + SMA SZA CLA + JMP NUMBI3 + TAD CHAR + AND NUMB17 + DCA CHDFA + ISZ NUMCNT + TAD NUMCNT /MORE THAN 4 DIGITS? + TAD NUMM5 + SPA CLA + JMP NUMBI5 /NO + TAD NUMHO /SHIFT HIGH ORDER + CLL RTL + RAL + AND C7770 + DCA NUMHO + TAD NUMAGN + CLL RTL + RTL + AND C0007 + TAD NUMHO + DCA NUMHO +NUMBI5, TAD NUMAGN + CLL RTL + RAL + AND C7770 + . +NUMDEC, CLL + TAD NUMAGN + SZL + ISZ NUMHO + CLL + TAD NUMAGN + SZL + ISZ NUMHO + CLL + TAD CHDFA + SZL + ISZ NUMHO + DCA NUMAGN + JMP NUMBI1 + +NUMBI3, TAD C7540 /-SPACE + TAD CHAR /WAS TERMINATOR A SPACE? + SNA + JMP NUMBI6 /YES, OK + TAD NUMCOM /NO- IS IT A "," + SNA CLA + JMP NUMBI6 /YES + ENDTST /NO--WAS IT AN ACCEPTABLE END CHAR? + SKP /YES, OK + JMP NUMBI4 /NO, COMPLAIN + +NUMBI6, TAD NUMCNT /ANY VALID DIGITS IN STRING? + SNA CLA + JMP NUMBI4 /NOPE + ISZ NUMBI0 /YES, IT WAS A VALID STRING. + TAD NUMSGN + CLL RAR + CLA + TAD NUMAGN + SZL + CIA +NUMBI4, ISZ NUMBI0 + JMP I NUMBI0 +C7540, -240 /-SPACE + +/OUTPUT ASCII MESSAGE +/CALL TAD ADDR OF DEVTBL ENTRY OR 0 IF RESPONSE DDB +/ ASCOUT +/ POINTER TO MESSAGE (TERMINATED BY 0 +/ WON'T FIT +/ OK + +ASCOUT=JMS I ASCOUA + + +ASCOU0, 0 + SNA + RESDDB +ASCOU3, CDF + DCA I CONDVA + CHDF + TAD I ASCOU0 + DCA ASCOT1 + ISZ ASCOU0 +ASCOU1, TAD I ASCOT1 /GET NEXT CHAR + SNA /END OF STRING + JMP ASCOU2 /YES + CIF CDF /NO, STORE IT IN BUFFER + DCA I TTCHAR + CHDF + PRINT + JMP I ASCOU0 /WON'T FIT + ISZ ASCOT1 + JMP ASCOU1 +ASCOU2, ISZ ASCOU0 + JMP I ASCOU0 + +*SUBR+400 + +/GET JOB TABLE ADDRESS +/CALL GETTBA +/ RELATIVE ADDRESS +/ RETURN + +GETTBA=JMS I GETBAA + +GETTB0, 0 + CHDF + TAD I GETTB0 + DCA GETTB1 + ISZ GETTB0 + TAD JOBDAT + CIF + GETJTA +GETTB1, 0 + JMP I GETTB0 +/GET RESPONSE DEVTBL ADDRESS +/CALL RESDDB +/ ADDR IN AC AND COMRDB + +RESDDB=JMS I RESPDA + +RESPDB, 0 + CDF + IAC + TAD I COMPTR + DCA COMRDB + TAD COMRDB + CHDF + JMP I RESPDB + +/DELETE BUFFER TO CURRENT POINTER +/CALL JMS BUFDEL +/ RETURN + +BUFDEL=JMS I BUFDEA + +BUFDT0, 0 +BUFDE0, 0 + TAD COMDB0 + SNA + JMP I BUFDE0 /NO, NOTHING TO DELETE + TAD C0004 + DCA BUFDT0 + DATFLD + TAD I BUFDT0 + SNA CLA + JMP BUFDE3 + TAD COMDB0 + TAD C0007 + DCA BUFDT0 +BUFDE1, TAD I SIBUF + CIA + TAD I BUFDT0 + SNA CLA + JMP BUFDE2 + TAD I BUFDT0 + CHDF + RETDBL + DATFLD + DCA I BUFDT0 + JMP BUFDE1 +BUFDE2, TAD C0003 + TAD COMDB0 + DCA IX1 + TAD I SITCNT + SNA + JMP BUFDE4 + ISZ IX1 + DCA I IX1 + TAD I SIECNT + DCA I IX1 +BUFDE3, CHDF + JMP I BUFDE0 + +BUFDE4, TAD I BUFDT0 + CHDF + RETBKS + DATFLD + DCA I IX1 + DCA I IX1 + DCA I IX1 + DCA I IX1 + CHDF + JMP I BUFDE0 + +/DECREMENT COMCNT +/CALL DECRCT +/ RETURN + +DECRCT=JMS I DECRCA + +DECRC0, 0 + CDF + STA + TAD I COMCNT + SPA + CLA + DCA I COMCNT + CHDF + JMP I DECRC0 +ASSIND, "A;"S;"S;"I;"G;"N;"E;"D;0 +S3757, 3757 + +S, GETWRD + JOBSTS + DATFLD + AND S3757 /TURN OFF HER RUN BIT + DCA I IOTP7 + CHDF + +IFNZRO TC01 RK05 CDR < + GETWRD + JOBWMK+1 + DATFLD + AND C0007 + TAD .+3 + DCA .+1 + .-.> + JMP I .+1 + SEXIT /NO WAIT 2 CONDITIONS TAKE S EXIT +IFNZRO TC01 RK05 CDR < +IFNZRO TC01 < + WAIT1 /DECTAPE CONTROLLER WAIT + WAIT2> /DECTAPE TIMER WAIT +IFZERO TC01< + SEXIT + SEXIT> +IFNZRO RK05 < + WAIT3> /WAITING FOR THE RK05 +IFZERO RK05 < + SEXIT> + IFNZRO CDR < + SEXIT> /NOTHING SPECIAL FOR THE CARD READER AT THIS TIME +IFZERO CDR < + SEXIT> + SEXIT + SEXIT + SEXIT> +SEXIT, JMP I COMEXA +SPACES, " ;" ;" ;" ;0 + +IFZERO MQREG-1 < + +WHERMQ, 240 /SP MQ= + 315 + 321 + 275 + 0 > + + + +/RUN USER PROGRAM "LOGOUT" TO DELETE FILES FOR THIS GUY +/"LOGOUT" ISSUES USER LOUT IOT TO MAKE JOB GO AWAY + + JMP I LOGRER /SYSTEM ERROR ON OPEN + JMP I LOGR1 /"LOGOUT" SAVE FILE OPENED + +LOGOUT, TAD LOGMA /GET POINTER TO "LOGOUT" STRING + JMP I .+1 /USER CODE FROM "SYSTAT" TO FINISH UP + SYSTAT+1 + +LOGRER, RERR +LOGR1, R1 +LOGMA, LOGOMA-1 + +*SUBR+600 + +/ASCII TO SIXBIT CONVERT +/CALL ASCSIX +/ SOURCE-1 (TERMINATED BY 0) +/ DESTINATION-1 +/ RETURN + +ASCSIX=JMS I ASCSIA + +ASC240, -240 + +ASCSI0, 0 + TAD I ASCSI0 + DCA IX1 + ISZ ASCSI0 + TAD I ASCSI0 + DCA IX2 + ISZ ASCSI0 +ASCSI1, TAD I IX1 + SNA + JMP I ASCSI0 /THAT'S ALL + TAD ASC240 /CONVERT TO SIXBIT + CLL RTL /NO + RTL + RTL + DCA CHDFA + TAD I IX1 + SNA + JMP ASCSI2 + TAD ASC240 + TAD CHDFA + DCA I IX2 + JMP ASCSI1 +ASCSI2, TAD CHDFA + DCA I IX2 + JMP I ASCSI0 + +/SKIP TO END OF COMMAND +/CALL SKPCOM +/ EMPTY BUFFER +/ NORMAL RETURN + + +SKPCO0, 0 +SKPCO1, ENDTST /END? + JMP SKPCO2 /YES + COMGET /NO, GET NEXT CHAR + JMP I SKPCO0 /NONE + JMP SKPCO1 +SKPCO2, ISZ SKPCO0 + JMP I SKPCO0 + + +/RETURN BLOCK TO FREE STORAGE +/CALL TAD ADDR OF BLOCK +/ RETDBL +/ RETURN + +RETDBL=JMS I RETDBA + +RETDB0, 0 + CIF + RETBLK + JMP I RETDB0 + +/RETURN LINKED BLOCKS TO FREE STORAGE +/CALL TAD ADDRESS OF BLOCK +/ RETBKS +/ RETURN + +RETBKS=JMS I RETBKA + +RETBK0, 0 + SNA + JMP I RETBK0 + RETDBL + JMP .-3 + +/OCTAL TO ASCII CONVERT +/CALL TAD OCTAL # +/ OCTASC +/ BUFFER ADDR-1 +/ RETURN + +OCTASC=JMS I OCTASA + +OCTASN=ASSCO0 +OCTACT=RELCO0 +OCT260, 0 + +OCTAS0, 0 + DCA OCTASN + TAD C0004 + CIA + DCA OCTACT + TAD I OCTAS0 + DCA IX1 + ISZ OCTAS0 + TAD OCTASN + CLL RAL + SKP +OCTAS1, TAD OCTASN + RTL + RAL + DCA OCTASN + TAD OCTASN + AND C0007 + TAD OCT260 + DCA I IX1 + ISZ OCTACT + JMP OCTAS1 + DCA I IX1 + JMP I OCTAS0 + +/ASSIGN THIS FIELD TO JOB +/CALL ASSCOR + +ASSCO0, 0 + CDF + TAD I JOB + DCA I SICORE + CHDF + JMP I ASSCO0 + +/RELEASE THIS FIELD +/CALL RELCOR + +SICORE, CORTBL+1 + +RELCO0, 0 + CDF + TAD C0200 + DCA I SICORE + CHDF + JMP I RELCO0 + +ASSIG9, ASCOUT /TELL USER WHAT SHE GOT + CRLF + NOP + JMS ASSUNI + ASCOUT + ASSIND /TYPE "ASSIGNED" +C0260, 260 + JMP I COMEXA /AND LEAVE + +ASSOUT, 0 /TYPE CHARACTER IN AC OUT; + CIA /FOLLOWED BY SPACE + DCA ASSBUF /CALLED WITH - CHAR IN AC + ASCOUT + ASSBUF /TYPE STRING + NOP + JMP I ASSOUT + +ASSUNI, 0 /ROUTINE TO TYPE OUT UNIT NAME + GETWRD /FIRST FIGURE OUT WHAT SHE WANTED + JOBREG /PC CONTAINS ORIGINAL REQUEST + AND C0037 + DCA IOTP0 /DEVICE # + TAD IOTP0 /WHAT KIND OF DEVICE + TAD C7773 /-5 + SPA /DEVICE #'S .GE. 5 ARE DTA + JMP ASSG10 /NOT DTA + DCA IOTP0 /UNIT # + TAD IOTP0 + AND C7770 + SNA CLA + TAD C0007 + TAD ASSDK + JMS ASSOUT /TYPE "D SPACE" (or K space) + TAD IOTP0 + AND C0007 + TAD C0260 + CIA +ASSG11, JMS ASSOUT /TYPE "N SPACE"; N=0,1,...,7 + JMP I ASSUNI /RETURN + +ASSG10, TAD ASSTBZ /END OF ASSIGNMENT TABLE + DCA IOTP0 / +UNIT # -5 = PTR TO ASSTBL + TAD I IOTP0 + JMP ASSG11 /TYPE OUT DEVICE ASSIGNED + +ASSDK, -"K +C7773, 7773 +ASSTBZ, ASSD +ASSBUF, 0 + 240 + 0 + +*SUBR+1000 + +/SIXBIT TO ASCII CONVERT +/CALL JMS SIXASC +/ SIXBIT ADDR (TERMINATED BY 0 OR SIXTH CHAR) +/ ASCII BUFFER-1 +/ RETURN + +SIXM6, -3 +SIXCNT, 0 +SIXADR, 0 +SIX240=WHERLK +C0077, 77 + +SIXASC, 0 + SNA + TAD SIXM6 /COUNT + DCA SIXCNT + TAD I SIXASC + DCA SIXADR + ISZ SIXASC + TAD I SIXASC + DCA IX2 + ISZ SIXASC +SIXAS2, TAD I SIXADR + AND C7700 + SNA + JMP SIXAS1 + CLL RTR + RTR + RTR + TAD SIX240 + DCA I IX2 + TAD I SIXADR + AND C0077 + SNA + JMP SIXAS1 + TAD SIX240 + DCA I IX2 + ISZ SIXADR + ISZ SIXCNT + JMP SIXAS2 +SIXAS1, DCA I IX2 /CLEAR LAST WORD + JMP I SIXASC + +/RETURN PARAMETERS +/CALL RETPAR +/ RETURN + +RETPAR=JMS I REPAA + + +RETPA0, 0 + GETWRD + JOBLNK + IAC + DCA RETPA1 + CIF + BLT + DATFLD /SOURCE FLD +RETPA1, 0 /SOURCE ADDR + CHDF /DESTINATION FIELD + IOTP0 /DEST ADDR + -7 /-COUNT + STA /RETURN PARAMETER LBLOCK TO FREE STORAGE + TAD RETPA1 + CIF + RETBLK + CLA + JMP I RETPA0 +/SAVE/RESTORE BUFFER POINTERS +/CALL JMS RESTBP +/ RETURN + + +RESTBP, 0 + TAD COMDB0 + TAD C0004 + DCA IX1 + DATFLD + TAD I IX1 + DCA I SITCNT + TAD I IX1 + DCA I SIECNT + TAD I IX1 + DCA I SIBUF + CHDF + JMP I RESTBP + +SAVNAM, TAD SIJOB /PRGTBL INDEX=3*JOB + TAD SIJOB + TAD SIJOB + TAD PRGTBA /START OF PRGTBL-3 (NO ENTRY FOR JOB 0) + DCA IX1 + DATFLD + TAD IOTP3 /TRANSFER 3 WORD BLOCK + DCA I IX1 + TAD IOTP4 + DCA I IX1 + TAD IOTP5 + DCA I IX1 + CHDF + TAD C0003 /FILE 3 + DCA IOTP1 + JMP I LNGIOT /GO DO OPEN + +PRGTBA, PRGTBL-3-1 + + +HASITM, " ;" ;"H;"A;"S;" ;" ;0 + +/ROUTINE TO GET USER'S ACCOUNT # IN FORM M,N OR M +/CALL +/ ACCTIN +/ ILLEGAL CHARACTER IN STRING +/ RETURN WITH ACCOUNT # IN AC + +ACC0, 0 + DCA ACC1 /CLEAR # +ACC3, NUMBIN /GET ONE COMPONENT + -"7 + JMP ACC4 /COULDN'T DO IT + TAD ACC1 /ACCUMULATE INTO TOTAL + DCA ACC1 + TAD CHAR /TERMINATOR A COMMA + TAD ACCOMA + SNA CLA + JMP ACC2 /YES-- SO SHIFT NUMBER THUS FAR INTO LEFT HALF OF WORD + TAD ACC1 /NO- RETURN WHOLE # + ISZ ACC0 /SKIP TO INDICATE GOODNESS +ACC4, JMP I ACC0 + +ACC2, TAD ACC1 /SHIFT IT LEFT 6 PLACES + CLL RTL + RTL + RTL + DCA ACC1 /SAVE IT + COMGET /GET PAST THE OFFENDING COMMA + JMP ACC4 /NONE LEFT, BUT WE NEED ONE--ERROR + JMP ACC3 /GET NEXT PART OF NUMBER + +ACC1, 0 +ACCOMA, -", +WHERLK, 240 /SP L= + 314 + 275 + 0 + +*COMMAN + +LOGINE, JMS LOGIE0 + SIERR + JMP I COMEXA + +LOGIE0, 0 + TAD COMDB0 + SNA + JMP LOGIE1 + IAC + DCA IOTP0 + DATFLD + TAD I IOTP0 + AND C7700 + DCA I IOTP0 + CHDF +LOGIE1, RESDDB + DATFLD + CLA + TAD I COMRDB + SNA + JMP LOGIE2 + IAC + DCA IOTP0 + DCA I IOTP0 +LOGIE2, CDF + TAD I JOB /SET JOB = 0 + AND C7700 + DCA I JOB + TAD SIJOB + TAD JOBTBA /SET JOBTBL ENTRY=0 + DCA CHDFA + DATFLD + DCA I CHDFA + TAD I JOBDAT /RETURN JOB STATUS BLOCKS + CHDF + RETBKS + DATFLD + DCA I JOBDAT + CHDF + JMP I LOGIE0 +LOGUNA, UNACCT + +LOGINF, GETWRD + JOBREG+2 + SNA CLA + JMP LOGIF1 /HOW DID SHE TERMINATE COMMAND + JMS LOGIE0 + TAD LOGUNA + JMP I COMEXA +LOGIF1, ASCOUT /FINISH TYPING MESSAGES ON LOGIN +VERSMA, VERSIM /FIRST OUTPUT VERSION # + JMP I COMEXA + TAD SIJOB /NOW OUTPUT JOB# + JMS I LOGJPR /PRINT #JOB, ACCOUNT & CONSOLE# + ASCOUT + SPACES + JMP I COMEXA + TAD LOGFA2 /FUDGE COMRET TO GO TO LOGIF2 ON COMPLETION + DCA COMEXA / OF TIME EVALUATION + TAD SIJOB /PUT "LOGIN" IN PRGTBL FOR THIS JOB + TAD SIJOB + TAD SIJOB /PRGTBL INDEX IS 3*JOB# + TAD LOGPRG /START OF PRGTBL-3-1 + DCA IX1 + DATFLD + TAD LOGN5A /LO + DCA I IX1 + TAD LOGN5B /GI + DCA I IX1 + TAD LOGN5C /N + DCA I IX1 + JMP I .+1 /NOW GO DO TIME EVALUATION + TIME3 + +LOGPRG, PRGTBL-3-1 +LOGN5A, 5457 /LO +LOGN5B, 4751 /GI +LOGN5C, 5600 /N + + + +VERSIN, TAD VERSMA /TYPE OUT VERSION # + JMP I COMEXA + +LOGJPR, USRJPR /PRINT USER # +LOGFA2, LOGIF2 + + + + +IOTSET, GETTBA + JOBLNK + DCA CHDFA + TAD IOTP0 + DATFLD + DCA I CHDFA + CHDF + CALFIP /EXECUTE IOT +LOGME0, LOGE0 +LOGME1, LOGE1 +LOGME2, ILLREQ + JMP LOGINE /FIP ERROR RETURN + JMP LOGINF /OK RETURN +LOGIN, TAD SIJOB + SZA CLA + JMP LOGIN2 + TAD JOBTBA /JOB # AVAILABLE? + DCA IX4 + DATFLD + TAD JOBONC + DCA CHDFA +LOGIN1, TAD I IX4 + SNA CLA + JMP LOGIN4 /GOT A JOB # + ISZ CHDFA + JMP LOGIN1 +LOGIN3, TAD LOGME1 /CAPACITY EXCEEDED + SKP +LOGIN6, TAD LOGME2 /NUMBER REQUIRED + DCA IOTP0 + CDF + TAD I JOB + AND C7700 + DCA I JOB + TAD IOTP0 + JMP I COMERA +LOGIN2, TAD LOGME0 /CONSOLE IN USE + JMP I COMERA +LOGIN4, TAD JOBTBA /SAVE JOB # + CIA + TAD IX4 + DCA SIJOB + TAD SIJOB + CDF + TAD I JOB + DCA I JOB + CHDF + ACCTIN /GET ACCT # + JMP LOGIN6 /NOT A NUMBER + DCA IOTP2 + DATFLD + TAD IOTP2 + AND I OFFMSK + CHDF + SZA CLA + JMP I LOGI3A + TAD COMBFA /GET PASSWORD IN ASCII + TEXTS + CLA + ASCSIX /CONVERT TO SIXBIT + COMBUF-1 + IOTP3-1 + CDF + TAD I FRECNT + TAD LOGMIN + SPA CLA + JMP I LOGI3A + TAD SIJOB /PUT ENTRY IN TTYTBL + TAD TTYTBA + DCA IOTP7 + RESDDB + STA + TAD COMDB0 + DCA IX1 + TAD DEVTBA + CIA + TAD COMRDB + DATFLD + CLL RAR + DCA I IOTP7 + TAD I IOTP7 + TAD I COMDB0 + DCA I IX1 + TAD SIJOB + DCA I IX1 + STL RAR + DCA I IX1 + TAD I COMRDB + SZA + JMP LOGIN5 + TAD COMRDB + CHDF + GETFBL +LOGDDB, 0 +LOGIN5, DCA LOGDDB + DATFLD + TAD I IOTP7 + DCA I LOGDDB + ISZ LOGDDB + TAD SIJOB + DCA I LOGDDB + CHDF + TAD IX4 /INITIALIZE JOB STATUS + GETFBL + 0 + DCA IX1 + TAD IX1 + ISZ IX1 + GETFBL +LOGMIN, -STOMIN /MINIMUM FREE STORAGE FOR NEW JOB + GETFBL +OFFMSK, F1OFFJ + STA + TAD IX1 + DATFLD + DCA I JOBDAT +IFZERO CPU+EAE-22 < /8E WITH EAE: + CHDF + GETWRD /SC IS BUMPED OVER 2 BITS AND MODE AND GT ARE + JOBEAE+1 /IN BITS 10 AND 11 + CLA CLL CML RTL + DATFLD + DCA I IOTP7 > /SET TO MODE A, GT OFF. + DCA IOTP7 + CHDF + GETTBA + JOBLNK + GETFBL + NOP + DCA LOGPMA + DATFLD + ISZ I IX1 /SET JSWAIT IN STR1 + ISZ IX1 + ISZ I IX1 /SET JSWAIT IN WAIT MASK + CHDF + CIF + BLT + CHDF /SOURCE FLD + IOTPAR+1 /SOURCE ADDR + DATFLD /DEST FLD +LOGPMA, 0 /DEST ADDR + -10 /-COUNT + CALFIP +LOGI3A, LOGIN3 + +EXAMI1, CHDF + ASCOUT + CRLF + JMP I EXAMI5 + TAD IOTP3 + DCA NUMHO + TAD COMBFA + DCA IX2 + DCA IOTP4 +EXAMI3, TAD I IX2 + OCTASC + IOTPAR + ASCOUT + IOTP0 + JMP I EXAMI5 + ISZ NUMHO + SKP + JMP I EXAMI5 + ASCOUT + SPACE + JMP I EXAMI5 + JMP EXAMI3 + +EXAMI5, DEPOS3 + + + +*COMMAN+400 + +ASSTBL, . + -"R + -"P + -"I + -"L + -"C +ASSD, -"D +ASSK, -"K /****** THIS TABLE MUST BE FOLLOWED BY A POSITIVE NUMBER +ASSCAL, IOTSET +ASSBFA, -COMBUF + + SIERR + JMP ASSIGF +ASSIGN, JMS W2BUSY /SEE IF WAIT 2 IS BUSY + TAD COMBFA + TEXTS + DCA CHDFA /POINTER TO LAST CHAR IN AC + TAD ASSBFA /ONE CHARACTER ONLY? + TAD CHDFA + SZA CLA + JMP ASSIG4 /NO + TAD ASSTBL + DCA IOTP2 +ASSIG2, ISZ IOTP2 + TAD I IOTP2 + SMA + JMP ASSIG4-1 + TAD I CHDFA + SZA CLA /MATCH? + JMP ASSIG2 /NO + TAD I CHDFA /YES, RK05? + TAD ASSK + SZA + JMP ASSIGD /NO, CHECK FOR DECTAPE? + NUMBIN + -"7 + JMP ASSGK2 /WE MUST FIND A DRIVE +ASSGK1, DCA IOTP1 + TAD IOTP1 + AND C7774 + SZA CLA + JMP ASSIG4 + TAD C0015 + JMP ASSG3K + +ASSGK2, TAD ASSRK5 + DCA IX2 + TAD C7774 + JMS ASSSUB + AND C0003 + JMP ASSGK1 +ASSIGD, TAD C0007 /"K-"D + SZA CLA + JMP ASSIG3 /NO, MUST BE SOME OTHER DEVICE + NUMBIN /YES, GET UNIT # + -"7 + JMP ASSIG6 /SHE WANTS US TO CHOOSE FOR HER +ASSIG7, DCA IOTP1 + TAD IOTP1 /IS UNIT # .LE. 7? + AND C7770 + SZA CLA + JMP ASSIG4 /NO...ERROR +ASSIG3, TAD ASSTBL + IAC + CIA + TAD IOTP2 +ASSG3K, TAD IOTP1 + TAD C4000 +ACSET, DCA IOTP1 /SAVE AC IN BOTH USER'S AC AND PC + GETTBA + JOBREG + DCA CHDFA + TAD IOTP1 + DATFLD + DCA I CHDFA + ISZ CHDFA + ISZ CHDFA /NOW POINTS TO USERS AC + TAD IOTP1 + DCA I CHDFA + CHDF + JMP I ASSCAL + +C0015, 15 +C7774, 7774 + +ASSIG6, TAD ASSDTA /POSITION OF DTA IN DRVTBL-1 + DCA IX2 + TAD C7770 /ONLY EIGHT POSSIBILITIES + JMS ASSSUB + AND C0007 + JMP ASSIG7 + +ASSSUB, 0 + DCA IX1 + DATFLD + TAD I IX2 /PICK UP DEVTBL ENTRY + SNA CLA /AVAILABLE? + JMP ASSG60 /YES + ISZ IX1 /NO...TRY THE NEXT ONE + JMP .-4 +ASSIG8, CLA /NO MORE TO TRY + TAD ASSNON + JMP I COMEXA /"NO SUCH DEVICE" + +ASSG60, TAD IX1 /GOT ONE; UNIT # IN BITS 8-11 IF IX1 + JMP I ASSSUB + + + +ASSNON, NONSUC /NO SUCH DEVICE +ASSG9A, ASSIG9 +ASSDTA, DEVTBE+5-1 +ASSRK5, DEVTBE+5+10-1 + + + + SIERR + JMP RELF +RELEAS, JMP ASSIGN + +RELF, GETWRD + JOBREG+2 + SZA CLA +ASSIG4, TAD .+2 + JMP I COMEXA + ILLREQ + + +W2BUSY, 0 + GETWRD + JOBWMK+1 /GET JOB WAIT MASK 2 + SNA CLA /IS SHE WAITING FOR ANYTHING???? + JMP I W2BUSY /NO BACK TO WHATEVER + TAD WAITMS /WAIT FOR I/O COMPLETION + JMP I COMEXA +WAITMS, WAITIO + +ASSIGF, GETWRD /HOW DID WE FARE IN FIP + JOBREG+2 + SNA + JMP I ASSG9A /WE GOT IT TELL THE USER + SPA + JMP ASSIG8 /FAILED + DCA IOTP0 + ASCOUT + CRLF + NOP + TAD IOTP0 /OWNER + JMS I ASSUPN + ASCOUT + HASITM + NOP + JMS I ASSUNA + ASCOUT + CRLF + NOP + JMP I COMEXA + +ASSUPN, USRJPR +ASSUNA, ASSUNI + + + SIERR + JMP I IOTEND +FOPEN, NUMBIN /FILE # + -267 + JMP I COMERA + AND C0003 + DCA IOTP1 + JMS NULLNA + ASCSIX + COMBUF-1 + IOTP3-1 + ENDTST + JMP FOPEN1 + ACCTIN /ACCOUNT # + SKP + DCA IOTP2 +FOPEN1, GETTBA + JOBLNK + GETFBL + COMWAT /NONE, TRY LATER + DCA FOPEN2 + CIF + BLT + CHDF /SOURCE FLD + IOTPAR+1 /SOURCE ADDR + DATFLD /DEST FLD +FOPEN2, 0 /DEST ADDR + -10 /-COUNT + CALFIP + + SIERR + JMP I IOTEND +CLOSE, NUMBIN + -267 + JMP CLOSE2 + AND C0003 + CMA + DCA IOTP2 + STL + RAR + ISZ IOTP2 + JMP .-2 + DCA IOTP2 + TAD IOTP1 + AND IOTP2 + SNA CLA + TAD IOTP2 + TAD IOTP1 + DCA IOTP1 + JMP CLOSE +CLOSE2, TAD IOTP1 + SNA + TAD C4000 + JMP I SHTIOT + + + SIERR + JMP I IOTEND +CREATE, JMS NULLNA + ASCSIX + COMBUF-1 + IOTP1-1 + JMP I LNGIOT +NULLNA, 0 + TAD COMBFA + TEXTS /READ IN THE NAME + CIA + TAD COMBFA /WAS IT A NULL NAME + SNA CLA + JMP I COMERA /YES + JMP I NULLNA + + + SIERR + JMP I IOTEND +RENAME, NUMBIN /FILE # + -267 + JMP I COMERA + AND C0003 + DCA IOTP1 + JMS NULLNA + ASCSIX + COMBUF-1 + IOTP2-1 + JMP I LNGIOT + + SIERR + JMP I IOTEND +EXTEND, +REDUCE, NUMBIN /FILE # + -267 + JMP I COMERA + AND C0003 + DCA IOTP1 + NUMBIN + -271 + JMP I COMERA + DCA IOTP2 + JMP I LNGIOT + + + +C7637, 7637 + + SIERR + JMP I IOTEND +PROTEC, NUMBIN /FILE # + -267 + JMP I COMERA + AND C0003 + CLL RTL + RTL + RAL + DCA IOTP1 + NUMBIN + -267 + JMP I COMERA + AND C7637 + TAD IOTP1 + JMP I SHTIOT + + +*COMMAN+1000 + +ST3770, 3770 +ST7377, 7377 +STERF, -JSWAIT-JSERR-JSDEL-1 +STACHK, W2BUSY + +START, JMS I STACHK /CAN'T START IKF I/O IN PROGRESS + ENDTST /END OF COMMAND? + JMP START1 /YES +START0, GETTBA /NO, SET STARTING ADDRESS + JOBREG + DCA IOTP2 + ENDTST + JMP START2 /NO STARTING ADDRESS FOR "R" OR "RUN" ASSUME 0 + GETWRD + JOBSTS + AND ST7377 /CLEAR "R PRIV. BIT" + DATFLD + DCA I IOTP7 + CHDF + NUMBIN + -267 + JMP I COMERA /NON-ACTAL ADDRESS +START2, DATFLD + DCA I IOTP2 + ISZ IOTP2 /CLEAR LINK & AC + DCA I IOTP2 + ISZ IOTP2 + DCA I IOTP2 +IFZERO CPU+EAE-22 < + CHDF + GETWRD + JOBEAE+1 + RTR + STL RAL + CLL RAL + DATFLD + DCA I IOTP7 > /ZERO OUT GT, AND SET MODE A + CHDF + GETTBA /RESET STATUS + JOBSTS + DCA IX1 + DATFLD + DCA I IX1 + DCA I IX1 /THIS IS CLEARING OUT PART OF JOB STATUS BLOCK 1 + DCA I IX1 + DCA I IX1 + CHDF +START1, GETWRD /JSRUN=1 + JOBSTS + AND ST3770 /CLEAR ERROR FLAGS + JSSTOP + TAD C4000 + DATFLD + DCA I IOTP7 + ISZ IOTP7 + TAD I IOTP7 + AND STERF + IAC /JSWAIT=1 + DCA I IOTP7 + ISZ IOTP7 + ISZ IOTP7 + CLL CLA CMA RAL + AND I IOTP7 + IAC + DCA I IOTP7 + CHDF + JMP I COMEXA + +/ +JOBS10=C0010 + +WHERE, JMS WHEPRT /ANSWER TO WHERE COMMAND + JMP I COMEXA + +WHEPRT, 0 + TAD WHEVEC /SET POINTER TO WHLST + DCA IX2 + TAD JOBS10 /INITIALIZE WHERE3 TO SWITCH REG + DCA WHERE3 + +WHERE1, TAD I IX2 /GET TEXT ADDRESS + SNA + JMP I WHEPRT /DONE + DCA WHERE2 + ASCOUT /PRINT TEXT +WHERE2, 0 + NOP + GETWRD /GET JSB WORD +WHERE3, 0 + JMP I IX2 /JUMP TO PROCESS JSB WORD +WHEVEC, WHLST-1 + +WHERE4, OCTASC /PRINT 4 OCTAL DIGITS + COMBUF-1 + ASCOUT + COMBUF + NOP +WHERE5, ISZ WHERE3 /GO TO NEXT JSB WORD + JMP WHERE1 + +WHERE6, SPA CLA + IAC + TAD K0260 + DCA I WHACA /SAVE WHERE IT WILL BE PRINTED + JMP WHERE5 + +IFZERO CPU+EAE-22 < /ON 8E WITH EAE: +WHERE7, RTR /GT FLAG IFF BIT 10=0, 11=0 + SMA SNL CLA + IAC + TAD K0260 + DCA I GT /SAVE WHERE IT WILL BE PRINTED + CML RAL /LINK HAS EAE MODE, SET FOR MODE A + TAD C0301 + DCA I WHSCA /SAVE WHERE IT WILL BE PRINTED + JMP WHERE1 +GT, WHERSC+5 + +WHERE8, RAR CLL /8E WITH EAE: SC IS BUMPED 2 BITS + RAR CLL + JMP WHERE4 > + + +WHLST, WHERSW + JMP WHERE4 + WHERPC + JMP WHERE4 + WHERLK + JMP WHERE6 +WHACA, WHERAC + JMP WHERE4 +IFZERO MQREG-1 < + WHERMQ + JMP WHERE4 +IFZERO CPU+EAE-22 < + WHERGT + JMP WHERE7 > +IFNZRO EAE < +WHSCA, WHERSC +IFZERO CPU-2 +IFNZRO CPU-2 > > + 0 + +C0301, 301 +K0260, 260 + +*4200 +/TEST FOR END OF COMMAND STRING +/CALL ENDTST WITH CHARACTER IN CHAR +/ END RETURN +/ NOT END + +ENDTST=JMS I ENDTSA + +ENDTS0, 0 + TAD ENDTBA + DCA IX5 + TAD I IX5 + SNA + JMP .+5 + TAD CHAR + SZA CLA + JMP .-5 + SKP + ISZ ENDTS0 + JMP I ENDTS0 + +ENDTBA, . + -273 /; + -272 /: + -215 /CR + -212 /LF + -213 /VT + -214 /FF + 0 + + +/GET USER STATE WORD +/CALL GETWRD +/ RELATIVE ADDRESS +/ RETURN WITH USER WORD IN AC, ADDRESS IN IOTP7 + +GETWRD=JMS I Z GETWRA + +GETWR0, 0 + TAD I GETWR0 + DCA GETWR1 + ISZ GETWR0 + GETTBA +GETWR1, 0 + DCA IOTP7 + DATFLD + SZL + TAD I IOTP7 + CHDF + JMP I GETWR0 + +/ROUTINE TO FORCE A STRING INTO AN INPUT BUFFER +/USER MUST BE LOGGED IN AS ACCOUNT 1 OR 3 TO SUCCEED + +FORSE, JMS I ACCNT1 /IS THIS ACCOUNT # 1 OR 3 + NUMBIN /GET CONSOLE # + -"7 + JMP I COMERA /BAD CONVERSION, QUIT + CLL RAL /*2 FOR DEVTBL INDEX + TAD DEVTBA /+START OF DEVTBL + DCA FORDEV + TAD FORDEV + TAD FOR5 + SMA CLA + JMP I COMERA + DATFLD + TAD I FORDEV /DOES SHE HAVE A DDB? + CHDF + SZA CLA + JMP FOR0 /YES + TAD FORDEV /NO; GET ONE + CIF + GETDDB + JMP I COMERA /NONE TO GET- NEVER HAPPENS + DATFLD + TAD I FORDEV + DCA BRO8 + TAD C1000 + DCA I BRO8 + CHDF +FOR0, JMS I FORSTG /GET INPUT STRING +FOR7, TAD I IOTP0 + TAD FORFOR /CHECK FOR FORM FEED + SNA + JMP I COMEXA /IT IS; SO EXIT + TAD FORARW /NO, MAYBE IT'S A ^? + SZA CLA + JMP FOR2 + ISZ IOTP0 /IT IS SO MAKE THE NEXT CHARACTER A CONTROL CHARACTER + TAD C0100 +FOR2, CMA + AND I IOTP0 /GET CHARACTER + SNA /END OF STRING? + JMP I COMEXA /YES, FINISH UP + CIF CDF + DCA I TTCHAR /SET UP GIR CALL + CHDF /BACK UP HERE, SO GIR WILL RETURN PROPERLY + KEY /PUSH CHARACTER THRU PROPER CHANNELS +BROAD4, +FORDEV, 0 /DEVTBL ADDRESS + JMP FOR3 /DIDN'T FIT FOR SOME REASON + ISZ IOTP0 /NEXT CHARACTER + JMP FOR7 +FOR3, BUFDEL /DELETE FORCE COMMAND + TAD FOR6 + DCA COMFLG /PRINT ?? AT END OF FAILED TEXT STRING + TAD IOTP0 + JMP I COMERA /EXIT; PRINT THE PORTION OF THE COMMAND THAT DIDN'T FIT +FOR5, -DEVTBE +FOR6, 167 +FORFOR, -"L+100 /-FORM FEED +FORARW, "L-100-"^ +ACCNT1, ACTNM1 + + + +/ROUTINE TO TYPE A MESSAGE ON EVERYBODY'S CONSOLE AT ONCE +/THE USER MUST BE LOGGED IN UNDER ACCOUNT 1 OR 3 + +BROAD, JMS I ACCNT1 /ONLY ACCOUNT 1 OR 3 + JMS I FORSTG /GET STRING INPUT + TAD BROLN /INITIALIZE FOR ALL CONSOLES + DCA IOTP3 + TAD DEVTBA /GET POINTER TO FIRST OUTPUT DDB + IAC + DCA IOTP4 + DCA BROAD4 /TO REMEMBER WHETEHR WE SUCCEED + +BROAD3, JMS BRO8 /PUSH STRING CR-LF STARS THRU + STARS + JMS BRO8 /OUTPUT MESSAGE + VERBRK + JMS BRO8 /CR-LF + CRLF +BROAD2, ISZ IOTP4 /ON TO NEXT CONSOLE + ISZ IOTP4 + ISZ IOTP3 /ARE WE DONE? + JMP BROAD3 /NO, CONTINUE + TAD BROAD4 + SZA CLA /DID ANY FAIL? + TAD BROBUS /YES + TAD BROOK + JMP I COMEXA + +BRO8, 0 + TAD I BRO8 + DCA .+3 + TAD IOTP4 + ASCOUT + 0 + ISZ BROAD4 + ISZ BRO8 + JMP I BRO8 + +BROBUS, BUSY-OK +BROOK, OK +BROLN, -NULINE-1 +FORSTG, STRNG0 + +*COMMAN+1400 +FSIXAS, SIXASC +FDECOU, DECOUT + + SIERR + JMP F2 +F, NUMBIN /INTERNAL FILE # + -267 + JMP I COMERA + AND C0003 + DCA IOTP1 + JMP I LNGIOT +F2, RETPAR + ASCOUT + CRLF + NOP + TAD IOTP1 /ACCT # + SNA + JMP I COMEXA /FILE NOT OPEN + OCTASC + COMBUF-1 + JMS FOUT + STA + TAD IOTP1 + SNA CLA + JMP F4 /DON'T GIVE AWAY A PASSWORD + JMS I FSIXAS /FILE NAME + IOTP2 + COMBUF-1 + JMS FOUT + TAD IOTP5 /PROTECTION + CLL RTL +F3, RTL + RTL + JMS USRPR + ASCOUT + SPACE + JMP I COMEXA + TAD IOTP5 + JMS USRPR + ASCOUT + SPACE + JMP I COMEXA + STA + TAD IOTP1 + SNA CLA + JMP I COMEXA /UFD; SIZE NOT RETURNED + TAD COMBFA + DCA IX1 + TAD IOTP6 /SIZE + JMS I FDECOU + DCA I IX1 + JMS FOUT + JMP I COMEXA + +F4, TAD IOTP5 /LOGOUT QUOTA + CLL RAL + RTL + JMP F3 /SHIFT AN EXTRA PLACE + +FOUT, 0 + ASCOUT + COMBUF + JMP I FOUT + ASCOUT + SPACE + JMP I FOUT + JMP I FOUT + + +USER, ASCOUT /TELL USER WHERE SHE IS + CRLF + JMP I COMEXA /NO ROOM, SO SKIP IT + ENDTST /THIS JOB? + JMP USER1 /YES + NUMBIN /NO; WHAT JOB THEN? + -267 /OCTAL JOB # +USER1, TAD SIJOB /ASSUME THIS JOB +USER2, SPA + CIA + DCA IOTP0 /SAVE JOB # + TAD IOTP0 /VALID JOB #? + TAD USEMAX /-HIGHEST JOB # - 1 + SMA CLA + JMP I COMERA /NO SUCH JOB + DATFLD /IS THE JOB LOGGED IN? + TAD IOTP0 + TAD JOBTBA + DCA IOTP1 /POINTER TO JOBTBL + TAD I IOTP1 /ADDRESS OF JOB STATUS + SNA CLA + JMP I COMEXA /NOT LOGGED IN; SAY NOTHING + CHDF /BACK UP HERE + TAD IOTP0 /JOB # + JMS USRJPR /PRINT "JOB ACCOUNT & CONSOLE" + JMP I COMEXA + +USEMAX, -JOBMAX-1 + +USRJPR, 0 /PRINT "JOB NN" + DCA IOTP7 /SAVE # + ASCOUT + JOBNO + JMP I USRJPR /NO ROOM + TAD IOTP7 /JOB # + JMS USRPR /PRINT # + TAD IOTP7 + JMS I USRACC /FIND HER ACCOUNT NUMBER + ASCOUT + ACCBUFF + JMP I USRJPR + ASCOUT + KSPACE + JMP I USRJPR + DATFLD + TAD IOTP7 /GET HER TTY # + TAD TTYTBA /POINTS TO ENTRY IN TTYTBL + DCA IOTP1 + TAD I IOTP1 /GET TTY # + CHDF + JMS USRPR + JMP I USRJPR +USRACC, GETACC + +USRPR, 0 /PRINT OCTAL # AS MM + OCTASC + COMBUF-1 /SNEAKY WAY TO SUPPRESS LEADING 00 + ASCOUT + COMBUF+2 + NOP + JMP I USRPR + +*COMMAN+1600 + +R4A, R4 +R6A, R6 +R6B, COMEXT +STARTA, START0 +RRFILE, RFILE +RLSA, RLS +RUNLOD, LOAD +RUNSAV, SAVE1 +SETPRA, SETPRV + + JMP RERR + JMP R1 +RUN, JMP I RUNLOD +RERR, SIERR + JMP I COMERA + + + JMP RERR + JMP R1 +R, JMS I SETPRA /SET THE R PRIVILEGE BIT + STL RTL /AC=LIBACT + JMP I RUNSAV + +R1, GETWRD /RETURN FROM OPEN + JOBREG+2 + SZA CLA + JMP I IOTEND + GETTBA + JOBLNK + GETFBL + COMWAT + DCA I R4A + TAD R6A + DCA EXITA + JMP I STARTA +R6, TAD R6B /RESTORE NORMAL EXIT + DCA EXITA + TAD C0003 + TAD C4000 + DCA IOTP2 /FILE 3 + STA + DCA IOTP4 /CORE ADDRESS + TAD RRFILE + DCA IOTP0 + IAC /CALL RLS WITH NONZERO AC FOR R AND RUN + JMS I RLSA + + TAD SIJOB + CORES + SZA + JMP R8 + CORES + SZA + JMP R8 + ASSCOR + TAD C0122 /USER MODE, FIELD 2 +R7, CIF CDF + DCA I RL2SF /FIELD OF JOB + TAD SIJOB + JMP I .+1 + RUNFI + +R8, DCA NUMHO /SAVE FIELD INFO + TAD R6B /RESTORE EXIT + DCA EXITA + RELCOR + TAD NUMHO + AND C0007 + TAD CORTBA + DCA IOTP0 + CDF + TAD SIJOB + DCA I IOTP0 + TAD NUMHO + JMP R7 +RL2SF, L2SF +C0122, 122 + + + + JMP RERR + JMP R1 +SYSTAT, TAD SYSMA /SYSTAT COMMAND + DCA IX1 /POINTER TO FILE NAME + JMS I SETPRA /SET THE R PRIVILEGE BIT + TAD I IX1 /PUT "SYSTAT" OR "LOGOUT" IN IOTP3,4,5 + DCA IOTP3 + TAD I IX1 + DCA IOTP4 + TAD I IX1 + DCA IOTP5 + STL RTL /AC=LIBACT + DCA IOTP2 + JMP I .+1 + SAVNAM /GO SAVE NAME; THEN OPEN FILE + +SYSMA, SYSM-1 + +SWFILE, WFILE + + JMP RERR + JMP SAVE2 +SAVE, JMP I .+1 + SAVE3 +SAVE2, GETWRD + JOBF3 /WRITE PROTECTED? + TAD C0002 + DCA IOTP0 + DATFLD + TAD I IOTP0 /POINTS TO PROTECTION WORD IN FILE CONTROL BLOCK + AND C0004 + CHDF + SZA CLA + JMP SAVPRO /WRITE PROTECTED + TAD SWFILE + JMP I .+1 + LOAD2 + +SAVPRO, TAD SFMS + JMP I COMERA + +SFMS, FM6000 /"PROTECTION VIOLATION" + +IFZERO CPU+EAE-22 < +WHERGT, 240 /SP MODE= + 315 + 317 + 304 + 305 + 275 + 0 +WHERSC, 240 /SP SP GT=X SC= + 240 + 307 + 324 + 275 + 330 + 240 + 323 + 303 + 275 + 0 > +IFZERO CPU+EAE-20 < +WHERSC, 240 /SP SC= + 323 + 303 + 275 + 0 > + +*COMMAN+2003 + +LOADER, RERR +LRFILE, RFILE +LOADUA, LOADUS +SAVCHK, W2BUSY + + JMP I LOADER + JMP LOAD1 +LOAD, +SAVE3, ACCTIN + SKP +SAVE1, DCA IOTP2 /ACCOUNT # + ENDTST + JMP I COMERA + JMS I SAVCHK /SEE IF I/O IN PROGRESS + TAD COMBFA + TEXTS + CLA + ASCSIX + COMBUF-1 + IOTP3-1 /FILE NAME + JMP I .+1 /SAVE PROGRAM NAME IN PRGTBL + SAVNAM + +LOAD1, TAD LRFILE +LOAD2, DCA IOTP0 + GETWRD /ERROR? + JOBREG+2 + SZA CLA + JMP I IOTEND /YES + GETTBA /NO, SET UP RFILE OR WFILE + JOBLNK + GETFBL + COMWAT + DCA R4 + CLL CML RTR /AC=2000 + TAD C0003 /FILE # + DCA IOTP2 + STA /DEFAULT CORE ADDRESS + DCA IOTP4 + ENDTST /ANY PARAMETERS? + JMP LOAD4 /NO + NUMBIN /YES, FILE ADDRESS 02 CAN BE 6 DIGITS! + -267 + JMP LOAD4 + DCA IOTP5 /LEAST SIGN, 12 BITS + TAD NUMHO + DCA IOTP1 /HIGH ORDER + ENDTST + JMP LOAD4 + NUMBIN /STARTING CORE ADDRESS + -267 + JMP LOAD4 + TAD IOTP4 + DCA IOTP4 + ENDTST + JMP LOAD4 + NUMBIN /LAST CORE ADDRESS + -267 + CLA CMA + CIA + TAD IOTP4 + DCA IOTP3 /WORD COUNT +LOAD4, TAD SIJOB /SET UP XFER BLOCK TO LOAD USER AREA + TAD LOADM1 + TAD SWBASE + CHDF + CLL RTL + DCA LOADEX + TAD LOAD5A + DCA EXITA + JMP I COMEXA +LOAD5, JMS RLS + TAD SIJOB + CORES + SZA + JMP I LOAD6A /JOB IS IN CORE + TAD LOADUB + JMP I LOADUA + +LOAD6A, R8 +LOAD5A, LOAD5 +LOADUB, .+1 + DMAR +LOADEX, 0 + 10 + 0 +LOADM1, -1 + 0 + OVERLA + READFI + +RJSF3, JSF3+1 +C5600, 5600 + +RLS, 0 + SNA CLA /CALLED FROM RUN? + JMP RLS1 /NO + GETWRD /YES; INITIALIZE JOB STATUS + + JOBSTS + AND C5600 /CLEAR ERROR FLAGS + DATFLD + DCA I IOTP7 /POINTS TO STR0 + ISZ IOTP7 + TAD I IOTP7 /GET STR1 + AND C0100 /SAVE DELIMITER BIT IF SET + IAC /TURN ON THE DUMMY WAIT BIT + DCA I IOTP7 /POINTS TO STR1 + ISZ IOTP7 + DCA I IOTP7 /POINTS TO JOBSTB +RLS1, CHDF + GETWRD /F3 WAIT + JOBWMK + CLA + TAD RJSF3 + DATFLD + DCA I IOTP7 + ISZ IOTP7 /CLEAR WAIT MASK 2 AS WELL + DCA I IOTP7 + TAD SIJOB + CIF CDF + DCA I SIREG + TAD I SIREG + DCA I JOB + CHDF + BLT + 6221 /SOURCE FIELD (ALWAYS 2) + IOTP0 + DATFLD +R4, 0 + -6 + JMP I RLS + +*COMMAN+2200 + +C7766, 7766 +DEPO3A, DEPOS3 + +DEPOSI, NUMBIN /STARTING ADDRESS + -267 + JMP I COMERA + DCA IOTP5 /LOW ORDER DISC ADDRESS + TAD C7766 + DCA IOTP1 + TAD COMBFA + DCA IX1 +DEPOS2, NUMBIN /CONVERT ARGUMENT LIST + -267 + JMP DEPOS1 + DCA I IX1 + ISZ IOTP1 + JMP DEPOS2 +DEPOS1, TAD IX1 + CIA + TAD COMBFA + SNA + JMP I COMERA /NOTHING TO DEPOSIT + DCA IOTP3 /-WORD COUNT + TAD SIJOB + CORES + SZA + JMP DEPOS4 + TAD DEPO3A + +EXAMI2, DCA SI1 /RETURN ADDRESS + TAD COMBFA + DCA IOTP4 /CORE ADDRESS-1 + CLA CMA /-1 IN AC + TAD SIJOB + TAD SWBASE + CLL RTL + DCA IOTP1 /DISC EXTENSION + TAD C0010 + DCA IOTP2 + TAD DEPEX2 + DCA IOTP6 + DCA IOTP7 + TAD IOTP3 /ARE WE GOING INTO NEXT JOB'S DISK IMAGE? + CLL CMA /WORD COUNT -1 + TAD IOTP5 /WC+ADDRESS>7777? + SNL CLA + JMP I DEPEX /OK TO PROCEED + TAD COMA /RESET DISPATCH ADDRESS + DCA SI1 + JMP I COMERA /EVIL ONCE AGAIN AVERTED +DEPEX, DEPEXA +DEPEX2, OVERLA + +/RETURN AFTER READING OR WRITING USER AREA + +DEPOS3, TAD COMA + DCA SI1 + JMP I COMEXA + +COMF, CHDF + +COMA, COM +C0070, 70 + +DEPOS4, AND C0070 + TAD C6201 + DCA DEDEF + TAD IOTP5 + DCA DEDEA + TAD COMF + DCA DESRF + TAD BUFFER + DCA DESRA + JMS DEMOVE + JMP I COMEXA + +DEMOVE, 0 + TAD IOTP3 + DCA DECNT + CIF + BLT +DESRF, 0 /FROM FLD +DESRA, 0 /FROM ADDR +DEDEF, 0 /TO FLD +DEDEA, 0 /TO ADDR +DECNT, 0 /-COUNT + JMP I DEMOVE + +EXAMIN, NUMBIN /STARTING ADDRESS + -267 + JMP I COMERA + DCA IOTP5 + NUMBIN + -271 + IAC + SNA + IAC + CIA + DCA IOTP3 + TAD IOTP3 /IS COUNT WAY OUT OF LINE? + SMA CLA + JMP I COMERA /YES + TAD IOTP3 + CIA + TAD C7766 + SMA SZA CLA + JMP I COMERA + TAD SIJOB + CORES + SZA + JMP EXAMI4 + TAD EXAM1A + JMP EXAMI2 + +EXAM1A, EXAMI1 +BUFFER, COMBUF + +EXAMI4, AND C0070 + TAD C6201 + DCA DESRF + TAD IOTP5 + DCA DESRA + TAD COMF + DCA DEDEF + TAD BUFFER + DCA DEDEA + JMS DEMOVE + JMP I EXAM1A + + +FORJOB, 240 + 306 /F + 317 /O + 322 /R + 240 + 312 /J + 317 /O + 302 /B + 240 + 0 + +*COMMAN+2400 + + +TICLK2, INCLK2 +TICLK1, INCLK1 +JOBRSA, JOBRES /RESTORE JOBDAT + +TIME, ENDTST /ARGUMENT? + JMP TIME1 /NO, THIS JOB + NUMBIN + -267 + JMP TIME1 + DCA IOTP0 /LEGAL JOB #? + TAD IOTP0 + TAD JOBONC + SMA SZA CLA + JMP I COMERA /NO + TAD IOTP0 /JOB 0? + SNA CLA + JMP TIME3 /YES, TIME OF DAY + DATFLD + TAD IOTP0 + TAD JOBTBA + DCA IOTP0 + TAD I IOTP0 + SNA /LOGGED IN? + JMP TIME5 /NO + DATFLD + DCA I JOBDAT + +TIME2, CHDF + GETWRD + JOBRTM + DCA NUMHO+1 + GETWRD + JOBRTH /HI ORDER TIME +TIME4, DCA NUMHO + JMS PTIME + JMS I JOBRSA /RESTORE JOBDAT IF ALTERED + TAD COMBFA + IAC +TIME5, CHDF + JMP I COMEXA + +TIME1, TAD SIJOB + SZA CLA + JMP TIME2 + +TIME3, CDF + TAD I CLK1 + CLL + TAD TICLK1 + DCA NUMHO+1 + SZL + IAC + TAD I CLK2 + TAD TICLK2 + CHDF + JMP TIME4 + +/ROUTINE TO CONVERT VALUE IN NUMHO AND NUMHO+1 (IN TICKS) +/TO HOURS, MINUTES AND SECONDS. +/THE RESULT IS STORED IN COMBUF AS HH:MM:SS + +PTIME, 0 /ENTER WITH AC=0 + TAD COMBFA /START OF OUTPUT BUFFER + DCA IX1 + TAD PTABX /SET UP TABLE FETCH (LOW) + DCA PTIMX + TAD PTABX1 /SET UP TABLE FETCH (HIGH) + DCA PTIMX1 + + TAD PTFORM /FORMAT MASK + DCA PTCONT + +PTLOOP, TAD PT0260 /INITIALIZE DIGIT COUNTER + DCA PTDIGI + CLL /DIVIDE LOOP + TAD NUMHO+1 /DOUBLE PRECISION ADD +PTIMX, NOP /(TAD PTAB1+N) + DCA NUMHO+2 /SAVE LOW ORDER REMAINDER + RAL /GET OVERFLOW + TAD NUMHO /ADD HIGH ORDER +PTIMX1, NOP /(TAD PTAB+N) + SNL + JMP PTIMA /DIVIDE OVERFLOW + DCA NUMHO /RESTORE REMAINDER + TAD NUMHO+2 /LOW ORDER RESTORE + DCA NUMHO+1 + ISZ PTDIGI /COUNT THIS SUBTRACTION + JMP PTIMX-2 /CONTINUE LOOP + + + +PTIMA, ISZ PTIMX /ADVANCE TABLE FETCH + ISZ PTIMX1 /ADVANCE TABLE FETCH + CLA /CLEAR OUT REMAINDER + TAD PTDIGI + DCA I IX1 /STORE ASCII DIGIT + TAD PTCONT + SNA /TEST FOR ALL DONE + JMP I PTIME /EXIT + RAL CLL /TEST FOR COLON PRINT + DCA PTCONT /RESTORE FORMAT + SZL /PRINT COLON? + JMP PTLOOP /CONTINUE LOOP + TAD PTCOLN /ADD COLON TO OUTPUT + DCA I IX1 + JMP PTLOOP /CONTINUE LOOP + + + +PTABX, TAD PTAB1 /TABLE FETCH LOW +PTABX1, TAD PTAB /TABLE FETCH HIGH +PTFORM, 5200 /FORMAT FOR OUTPUT +PT0260, 260 +PTCOLN, 272 /ASCII COLON + +PTDIGI, 0 /ASCII DIGIT BUILT HERE +PTCONT, 0 /LOOP CONTROL +C0005, 5 + +/SUBROUTINE TO SET R PRIVILEGE BIT +/SET BY R COMMAND, AND IN ADDITION K, LOGOUT, AND SYSTAT COMMANDS +/ALLOWS PRIVILEGED IOT'S; IE LOGOUT, PEEK + +SETPRV, 0 + GETWRD + JOBSTS + DATFLD + TAD C0400 /PRIVILEGE BIT + DCA I IOTP7 /SAVE IT + TAD C0005 + TAD IOTP7 + DCA IOTP7 + DCA I IOTP7 /CLEAR HER RESTART ADDRESS + CHDF + JMP I SETPRV /AND RETURN + +SYSM, 6371 /SY + 6364 /ST + 4164 /AT + + +/DOUBLE PRECISION WORDS...HIGH ORDER BITS +PTAB, 7650 /-TICKS PER 10 HRS + 7767 /-TICKS PER 1 HR + 7776 /-TICKS PER 10 MIN + 7777 /-TICKS PER 1 MIN + 7777 /-TICKS PER 10 SEC + 7777 /-TICKS PER 1 SEC + +/DOUBLE PRECISION WORDS...LOW ORDER BITS +PTAB1, 0700 /-TICKS PER 10 HRS + 1540 /-TICKS PER 1 HR + 4220 /-TICKS PER 10 MIN + 6650 /-TICKS PER 1 MIN + 7634 /-TICKS PER 10 SEC + 7766 /-TICKS PER 1 SEC + + *5600 + +/ROUTINE TO CONVERT CONTENTS OF AC INTO DECIMAL CHARACTER STRING +/STORE STRING USING IX1 AS BUFFER POINTER +/ONLY DECIMAL VALUES <4000 (DECIMAL) ARE VALID + +DECOUT, 0 + DCA BCDI /SAVE VALUE + TAD BCDC + DCA BCDP /RESET TABLE POINTER + CLL CMA RTL /AC:=-3 + DCA NUMHO /SET DIGIT COUNTER + DCA JOBRES /CLEAR OUTPUT FLAG + TAD BCDT + DCA BCDN /SET MAGIC BIT + TAD BCDI /RECALL CURRENT VALUES + CLL +BCDP, TAD BCDTB /SUBTRACT BIT VALUE + SZL /SKIP IF TOO LARGE + DCA BCDI /SAVE NEW VALUE + CLA + TAD BCDN /RECALL CONSTRUCTION WORD + RAL + ISZ BCDP /ADVANCE TABLE POINTER + SNL /SKIP IF CHARACTER ASSEMBLED + JMP BCDP-3 /KEEP AT IT + DCA BCDN /SAVE CURRENT ASSEMBLY WORD + TAD BCDN + AND DEC17 /MASK OUT BCD CHARACTER + SZA /ZERO SUPPRESSION? + JMP .+4 /NON ZERO- PROCEED + TAD JOBRES /PRECEDING OUTPUT? + SNA CLA + JMP .+4 /NO; DON'T TYPE THE 0 + TAD DEC260 + DCA I IX1 /STORE IN BUFFER + ISZ JOBRES /SET OUTPUT FLAG + ISZ NUMHO /3 DIGITS ASSEMBLED? + JMP BCDP-2 /NO, REPEAT + TAD BCDI /NOW GET LAST DIGIT + TAD DEC260 /CONVERT TO ASCII + DCA I IX1 /STORE IN BUFFER + JMP I DECOUT /RETURN + +DEC260, 260 +DEC17, 17 +BCDC, TAD BCDTB +BCDI, 0 +BCDN, 0 +BCDT, 2104 /MAGIC BITS +BCDTB, -3720 /-2000 DECIMAL + -1750 /-1000 DECIMAL + -1440 /-800 + -0620 /-400 + -0310 /-200 + -0144 /-100 + -0120 /-80 + -0050 /-40 + -0024 /-20 + -0012 /-10 + + +/ROUTINE TO RESTORE JOBDAT IF IT HAS BEEN KLUGED + +JOBRES, 0 + TAD SIJOB + SNA /IS SHE LOGGED IN? + JMP .+7 /NO; JOBDAT IS NOT RELEVANT + DATFLD /YES + TAD JOBTBA /START OF JOBTBL + DCA IOTP7 + TAD I IOTP7 + DCA I JOBDAT /NOW JOB AND JOBDAT AGREE + CHDF + JMP I JOBRES /RETURN + +/ROUTINE TO SEE IF A CONSOLE IS "ACTIVE" +/ACTIVE IS DEFINED AS HAVING A NONZERO +/FILL OR EMPTY POINTER ON INPUT OR OUTPUT SIDES +/CALL TAD DEVTBL POINTER +/ JMS TALK1 +/ RETURN IF ACTIVE +/ RETURN IF NOT ACTIVE +/ IF INPUT DDB DOES NOT EXIST, CONSOLE IS INACTIVE + +TALK1, 0 + DCA IOTP2 /DEVTBL POINTER + DATFLD + TAD I IOTP2 /DDB ADDRESS + SNA /EXISTING? + JMP TALK12 /NOT YET + TAD C0004 + DCA IOTP2 /POINTS TO FILL PTR + TAD I IOTP2 /FILL PTR + SZA CLA / =0? + JMP TALK13 /NO - SEE IF SHE IS UNDER A PRIVILEGED ACCOUNT +TALK12, ISZ TALK1 /YES; CONSOLE IS THUS INACTIVE + JMP I TALK1 /RETURN + +TALK13, CHDF + GETWRD + JOBSTS + AND C0200 + SZA CLA + JMP TALK12 /SHE IS - LET HER DO THE TALK + JMP I TALK1 + +ACTNM1, 0 + GETWRD /CHECK ACCOUNT # + JOBACC + TAD P7777 + CLL RTR /ALLOW EITHER ACCOUNT 1 OR ACCOUNT 3; NOONE ELSE!!!! + SZA CLA + JMP I COMERA /NOT ACCOUNT #; ERROR + JMP I ACTNM1 + +COMLGM, 314 /L + 317 /O + 307 /G + 311 /I + 316 /N + 240 + 320 /P + 314 /L + 305 /E + 301 /A + 323 /S + 305 /E + 0 +ILLREQ, 311 /I + 314 /L + 314 /L + 305 /E + 307 /G + 301 /A + 314 /L + 240 + 322 /R + 305 /E + 321 /Q + 325 /U + 305 /E + 323 /S + 324 /T + 215 + 212 + 0 +QQEST, 277 /? + 277 /? + 0 +PERIOD, 256 /. + 0 + +*CTABLE + + 0 +COMBUF, 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + +FIPFLS=PRPER+USAVE+UREST + +COMTBL, CL1 /LOGIN O1 S1; + NOLOG+PRPER+PRCRLF /IOTP2:=O1 ACCOUNT # + LIN /IOTP3-4:=S1 PASSWORD + LOGIN /RESP: VERSION # HR:MIN + -314 /. + -317 + -307 + -311 + -316 +CL1, CL2 /LOGOUT; + USERM+2 /RESP: . + OPEN /. + LOGOUT + -314 + -317 + -307 + -317 + -325 + -324 +CL2, CL3 /TIME; + NOLOG+PRPER+PRCRLF /RESP: HR:MIN + 0 /. + TIME + -324 + -311 + -315 + -305 +CL3, CL4 /ASSIGN L1 O1; + FIPFLS+2 /AC0-5:=DEVICE # OF L1 + ASD /AC6-11:=O1 UNIT # + ASSIGN /ERROR: AC NOT 0 + -301 /RESP: + -323 /. + -323 + -311 + -307 + -316 +CL4, CL5 /RELEASE L1 O1; + FIPFLS+2 /SAME AS ASSIGN + REL + RELEAS + -322 + -305 + -314 + -305 + -301 + -323 + -305 +CL5, CL7 /TALK C1 S1 + NOLOG+PRPER+PRCRLF /C1=CONSOLE TO TALK TO + 0 /S1=MESSAGE TO TRANSMIT + TALK /RESP: BUSY IF TARGET TTY IS ACTIVE + -"T / OTHERWISE CRLF + -"A + -"L + -"K +CL7, CL8 /OPEN O1 S1 O2; + FIPFLS+2 /IOTP1:=O1 INTERNAL FILE # + OPEN /IOTP2:=O2 ACCOUNT # + FOPEN /IOTP3-5:=S1 FILE NAME + -317 /ERROR: AC NOT 0 + -320 /RESP: + -305 /. + -316 +CL8, CL9 /CLOSE S1; + FIPFLS+2 /ACI:=1 I=0,1,2,3 + CLOS /ERROR: AC NOT 0 + CLOSE /RESP: + -303 /. + -314 + -317 + -323 + -305 +CL9, CL10 /CREATE S1; + FIPFLS+2 /IOTP1-3:=S1 FILE NAME + CRF /ERROR: AC NOT 0 + CREATE /RESP: + -303 /. + -322 + -305 + -301 + -324 + -305 +CL10, CL12 /RENAME O1 S1; + FIPFLS+2 /IOTP1:=O1 INTERNAL FILE # + REN /IOTP2-4:=S1 NEW NAME + RENAME /ERROR: AC NOT 0 + -322 /RESP; + -305 /. + -316 + -301 + -315 + -305 +CL12, CL13 /REDUCE O1 D1; + FIPFLS+2 /IOTP1:=O1 INTERNAL FILE # + RED /IOTP2:=D1 # SEGMENTS TO REMOVE + REDUCE /ERROR: AC NOT 0 + -322 /RESP: + -305 /. + -304 + -325 + -303 + -305 +CL13, CL14 /EXTEND O1 D1; + FIPFLS+2 /SAME AS REDUCE + EXT + EXTEND + -305 + -330 + -324 + -305 + -316 + -304 +CL14, CL15 /PROTECT O1 O2; + FIPFLS+2 /AC5-6:=O1 INTERNAL FILE # + PROT /AC7-11:=O2 NEW PROTECTION + PROTEC /ERROR: AC NOT 0 + -320 /RESP: + -322 /. + -317 + -324 + -305 + -303 + -324 +CL15, CL17 /F O1; + FIPFLS+3 /IOTP1:=O1 INTERNAL FILE # + FINF /ERROR: AC NOT 0 + F /RESP: ACCT # FILE NAME PROT SIZE + -306 /. +CL17, CL18 /SAVE S1 O1 O2 O3; + USAVE+UREST+PRPER+2+USERM + OPEN + SAVE + -323 + -301 + -326 + -305 +CL18, CL19 /LOAM0G1 S1 O2 O3 O4 + USAVE+UREST+PRPER+USERM+2 + OPEN + LOAD + -314 + -317 + -301 + -304 +CL19, CL20 /START O1; + 0 + 1 /FORCE IT THROUGH "FIPCHK" + START + -323 + -324 + -301 + -322 + -324 +CL20, CL21 /S; + PRPER + 0 + S + -323 +CL21, CL22 /WHERE; + PRPER+3 + 0 + WHERE + -327 + -310 + -305 + -322 + -305 +CL22, CL23 /USER O1; + NOLOG+PRPER+3 + 0 + USER + -325 + -323 + -305 + -322 +CL23, CL29 /SWITCH O1; + PRPER + 0 + SWITCH + -323 + -327 + -311 + -324 + -303 + -310 +CL29, CL32 /DUPLEX; + PRPER+PRCRLF + 0 + DUPLEX + -304 + -325 + -320 + -314 + -305 + -330 + +CL32, CL33 /R S1 O1 + USERM+2 /S1=FILE NAME + OPEN /O1=STARTING ADDRESS; 0000 IF OMITTED + R + -322 +CL33, CL34 /RUN C1 S1 O1 + USERM+2 /C1=ACCOUNT OF FILE OWNER (OPTIONAL) + OPEN /S1=FILE NAME + RUN /O1=STARTING ADDRESS; 0000 IF OMITTED + -322 + -325 + -316 +CL34, CL35 /EXAMINE C1 D1 + PRPER+USERM+1 /C1=STARTING ADDRESS + DMAR + EXAMIN /D1=# OF LOCATIONS TO EXAMINE + -305 + -330 + -301 + -315 + -311 + -316 +CL35, CL36 /DEPOSIT C1 C2 C3 ... C13 + PRPER+USERM+1 /C1=STARTING ADDRESS + DMAW /C2,...,C13=NEW VALUES + DEPOSI + -304 + -305 + -320 + -317 + -323 + -311 /no ending T??? PROTECT has one! +CL36, CL37 /VERSION + NOLOG+PRPER+PRCRLF /RESP: TSS8/.C1 + 0 + VERSIN /C1=VERSION # + -326 + -305 + -322 + -323 + -311 + -317 +CL37, CL38 /BREAK O1 + PRPER+PRCRLF + 0 + BREAK + -"B + -"R + -"E + -"A + -"K + +CL38, CL39 /RESTART O1 + PRPER + 0 + RESTRT + -"R + -"E + -"S + -"T + -"A + -"R +CL39, CL40 /UNDUPLEX + PRPER+PRCRLF + 0 + UNDUPL + -"U + -"N + -"D + -"U + -"P + -"L +CL40, CL41 /SYSTAT + USERM+2 + OPEN + SYSTAT + -"S + -"Y + -"S + -"T + -"A + -"T +CL41, CL42 /KJOB + USERM+2 /EQUIVALENT TO .R LOGOUT + OPEN + LOGOUT + -"K + -"J + -"O + -"B +CL42, CL43 /BROADCAST S1 + PRPER+PRCRLF+7 /SEND MESSAGE TO ALL CONSOLES + 0 /MUST BE LOGGED IN AS ACCT 1 OR 3 + BROAD + -"B + -"R + -"O + -"A + -"D + -"C +CL43, CL44 /FORCE C1 S1 + PRPER+PRCRLF+7 /FORCE STRING S1 INTO INPUT BUFFER OF CONSOLE C1 + 0 /USER MUST BE LOGGED IN AS ACCT 1 OR 3 + FORSE /ANY "LETTER" PRECEEDED BY "^" WILL BECOME A CONTROL CHARACTER + -"F /"^S", "^Q", "^B" OR "^C" ARE THE MOST USEFUL + -"O + -"R + -"C + -"E +CL44, CL45 /ON LINE + PRPER+PRCRLF + 0 + ON + -"O + -"N +CL45, CL46 /OFFLINE + PRPER+PRCRLF + 0 + OFFLIN + -"O + -"F + -"F +CL46, 0 + +UNACCT, 325 /U + 316 /N + 301 /A + 325 /U + 324 /T + 310 /H + 317 /O + 322 /R + 311 /I + 332 /Z + 305 /E + 304 /D + 240 + 301 /A + 303 /C + 303 /C + 317 /O + 325 /U + 316 /N + 324 /T + 240 + 0 + +LOGE1, 306 /FULL + 325 + 314 + 314 + 0 + +WHERPC, 240 /SP PC= + 320 + 303 + 275 + 0 +WHERAC, 240 /SP SP AC= + 240 + 301 + 303 + 275 + 0 +WHERSW, 215 /CR LF SW= + 212 + 240 + 323 + 327 + 275 + 0 + +TYCRLB, "T;"Y;"P;"E;240;"^;"B;"S;240;"F;"I;"R;"S;"T;215;212;0 +NONSUC, "D;"E;"V;"I;"C;"E;240;;"N;"O;"T;240;"A;"V;"A;"I;"L;"A;"B;"L;"E +CRLF, 215 + 212 + 0 + +TALK, ENDTST /END OF COMMAND + JMP I COMERA /YES + NUMBIN /GET CONSOLE # + -267 + JMP TALK6 /IGNORE "K" +TALK7, SPA + CIA /MAKE SURE IT'S POSITIVE + DCA IOTP0 + TAD IOTP0 /VALIDITY CHECK + TAD TALKMX /-HIGHEST CONSOLE # + SMA CLA + JMP I COMERA + TAD IOTP0 + CLL RAL + TAD DEVTBA /POINTER TO DEVTBL + DCA IOTP4 + TAD IOTP4 + JMS I TALK1A /INPUT SIDE INACTIVE? + JMP TALKNO /NO + ISZ IOTP4 /POINTS TO OUTPUT SIDE + TAD IOTP4 + JMS I TALK1A /OUTPUT SIDE INACTIVE? + JMP TALKNO /NO + CDF /GET # OF CALLING CONSOLE + TAD I COMPTR + TAD TALKXX + CLL RAR + CHDF + OCTASC + COMBUF-1 /AND PUT IN COMBUF + JMS TALK5 /"CRLF** K" + TALKM1 + JMS TALK5 /"MM" + COMBUF+2 + TAD SIJOB + SNA + JMP .+4 + JMS I TALKAC + JMS TALK5 /OUTPUT HER ACCOUNT NUMBER + ACCBUF + JMS TALK5 /" ** " + TALKM2 + DCA NUMHO /MAKE CHAR,NUMHO TWO WORD VECTOR +TALK2, JMS TALK5 /PUT CHAR IN DESTINATION BUFFER + CHAR + COMGET /GET NEXT CHARACTER + JMP TALK4 /END OF MESSAGE + JMP TALK2 + +TALK4, JMS TALK5 + CRLF + JMP I COMEXA + +TALKAC, GETACC +TALKXX, -DEVTBL +TALKNO, TAD TABSYM /"BUSY" + JMP I COMEXA + + + +TALK6, TAD CHAR /WAS IT A K? + TAD TALKMK + SZA CLA + JMP TALK7 /NO, ASSUME OPR + TAD TALKZE /MAKE CHARACTER A "0" + DCA CHAR + JMP TALK+2 + +TALKMK, -"K + + +TALK5, 0 /OUTPUT A CHARACTER + TAD I TALK5 /BUFFER ADDRESS + DCA .+3 + TAD IOTP4 /DEVTBL ADDRESS + ASCOUT + 0 + JMP TALKNO /NO ROOM...INDICATE BUSY + ISZ TALK5 /SKIP ARGUMENT + JMP I TALK5 + +TABSYM, BUSY +TALKZE, "0 +TALK1A, TALK1 +TALKMX, -NULINE-1 + + +LOGOMA, 5457 /LO + 4757 /GO + 6564 /UT + +TALKM1, 215;212;"*;"*;240;"K;0 +BUSY, "B;"U;"S;"Y;0 +OK, "O;"K +SPACE, 240 + 0 + +*ERPAGE + +SYSDSI, DSI +SYSPRT, WHEPRT +SYDING, SYBELL +SY3760, 3760 +CONCLR, SICLR +SYSEJN, USRPR + +SYSERR, TAD SIJOB + TAD TTYTBA + DCA COMDB0 /POINTER TO TTYTBL + DATFLD + TAD I COMDB0 + CLL RAL /UNIT*2= POSITION IN DEVTBL + TAD DEVTBA + DCA COMDB0 + TAD COMDB0 + CDF + DCA I COMPTR + DCA COMRDB + DATFLD + TAD I COMDB0 + DCA COMDB0 + TAD SYSDSI + CMA + AND I COMDB0 + TAD SYSDSI + DCA I COMDB0 + CHDF + JMS SYSER0 + TAD IOTP6 + AND C0010 + SZA CLA + JMP I SYDING + TAD IOTP6 + SPA CLA + JMS I SYSPRT + ASCOUT + CRLF + NOP + ASCOUT + PERIOD + NOP + EXIT + +SYSER0, 0 + GETWRD + JOBSTS + AND C0007 + TAD SYSETB + DCA SYSER1 + DATFLD + TAD I IOTP7 + DCA IOTP6 + TAD IOTP6 + AND SY3760 + TAD C0010 + DCA I IOTP7 + ISZ IOTP7 /POINTS TO STR1 + CLL STA RTL + AND I IOTP7 + DCA I IOTP7 + CHDF + TAD IOTP6 + AND C0010 + SZA CLA + JMP I SYSER0 + TAD I SYSER1 + DCA SYSER1 + RESDDB + DATFLD + DCA CHDFA + TAD I CHDFA + CIF + JMS I CONCLR /MAKE ROOM FOR THE ERROR MESSAGE + ASCOUT + CRLF + JMP SYSER2 + ASCOUT +SYSER1, 0 + NOP +SYSER2, ASCOUT + FORJOB + JMP SYSER4 + TAD SIJOB + JMS I SYSEJN + ASCOUT + CRLF + NOP +SYSER4, JMP I SYSER0 + +SYSETB, .+1 + QQEST + SYSET1 + SYSET2 + SYSET3 + QQEST + SYSET5 + SYSET6 + QQEST + +SYSET1, 311 /ILLEGAL IOT + 314 + 314 + 305 + 307 + 301 + 314 + 240 + 311 + 317 + 324 + 0 +SYSET2, +SYSET3, 323 /SWAP ERROR + 327 + 301 + 320 + 240 + 305 + 322 + 322 + 317 + 322 + 0 +SYSET5, 304 /DISK ERROR + 311 + 323 + 313 + 240 + 305 + 322 + 322 + 317 + 322 + 0 + + +/RETURN FOR FILE COMMANDS + +FIPEND, GETWRD + JOBREG+2 + SNA + JMP I COMEXA + CIA + DCA IOTP1 + TAD FIPETB + DCA IX1 +FIPEN1, TAD I IX1 + SNA + JMP FIPEN2 /NOT IN TABLE + TAD IOTP1 + SZA CLA + JMP FIPEN1 + TAD IX1 /GET MESSAGE ADDRESS + TAD FIPMTB + DCA IOTP1 + TAD I IOTP1 + JMP I COMERA + +FIPEN2, ASCOUT + CRLF + NOP + ASCOUT + FAILBY + NOP + TAD COMBFA + DCA IX1 + TAD IOTP1 + CIA + JMS I FIPDEC + DCA I IX1 + ASCOUT + COMBUF + NOP + ASCOUT + SEGMTA + NOP + JMP I COMEXA +DUPLEX, TAD C0200 /DUPLEX BIT +UNDUPL, DCA IOTP0 + DATFLD + TAD I COMDB0 /WORD 1 OF DDB + AND P7577 /CLEAR BIT + TAD IOTP0 /SET BIT + DCA I COMDB0 /SAVE IT + JMP I COMEXA +P7577, 7577 + +FIPDEC, DECOUT + +RKJOBA, RKJOB + +WAIT3, TAD I RKJOBA + CIA + TAD SIJOB + SNA CLA /DOES SHE OWN THE RK05 CONTROLLER? + JMP I COMEXA /YES - LET HER FINISH +DTSIDT, DCA I IOTP7 /CLEAR OUT WAIT 2 MASK + CLL STA RAL + TAD IOTP7 + DCA IOTP7 + STA + DCA I IOTP7 /-1 TO DEV. STATUS REG + CHDF + GETWRD + JOBREG+2 + DATFLD + DCA I IOTP7 /CLEAR HER AC + JMP I COMEXA + +WAITIO, "W;"A;"I;"T;" ;"F;"O;"R;" ;"I;"/;"O;215;212;0 +FAILBY, 306 /F + 301 /A + 311 /I + 314 /L + 305 /E + 304 /D + 240 + 302 /B + 331 /Y + 240 + 0 + +SEGMTA, 240 + 323 /S + 305 /E + 307 /G + 315 /M + 305 /E + 316 /N + 324 /T + 323 /S + 0 + +FIPETB, . + 4000 /FILE NOT OPEN + 4400 /FILE IN USE + 5000 /DIRECTORY FULL + 5400 /BAD DIRECTORY + 6000 /PROTECTION VIOLATION + 6400 /BAD FILE NAME + 7000 /FILE NOT FOUND + 7400 /DISK FULL + 0 +FIPMTB, .-FIPETB + FM4000 + FM4400 + FM5000 + FM5400 + FM6000 + FM6400 + FM7000 + FM7400 + +FM6400, "B;"A;"D;240;"F;"I;"L;"E;240;"N;"A;"M;"E;0 + +FM7000, 306 + 311 + 314 + 305 + 240 + 316 + 317 + 324 + 240 + 306 + 317 + 325 + 316 + 304 + 0 +FM4400, 306 + 311 + 314 + 305 + 240 + 311 + 316 + 240 + 325 + 323 + 305 + 0 +FM5000, 304 + 311 + 322 + 305 + 303 + 324 + 317 + 322 + 331 + 240 + 306 + 325 + 314 + 314 + 0 +FM6000, 320 + 322 + 317 + 324 + 305 + 303 + 324 + 311 + 317 + 316 + 240 + 326 + 311 + 317 + 314 + 301 + 324 + 311 + 317 + 316 + 0 +FM4000, 316 + 311 + 314 + 305 + 240 + 316 + 317 + 324 + 240 + 317 + 320 + 305 + 316 + 0 +FM7400, 304 + 311 + 323 + 313 + 240 + 306 + 325 + 314 + 314 + 0 +TALKM2, 240;"*;"*;215;212;0 +VERSIM, 215;212;"T;"S;"S;"/;"8;".;"2;"4;207;240;240;0 + + *VERBRK-2 + 215 + 212 +/VERBRK, + ZBLOCK 200 /LOGIN MESSAGE GOES HERE + + +$$$$$$ diff --git a/tss8/system/ts8a.pal b/tss8/system/ts8a.pal new file mode 100644 index 0000000..4c5fd6b --- /dev/null +++ b/tss8/system/ts8a.pal @@ -0,0 +1,1372 @@ +/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 > +IFNZRO 24-JOBMAX&4000 +IFNZRO 23-KL8-PT08&4000 +IFNZRO 24-DC08A&4000 +IFZERO DC08A +IFNZRO DC08A < IFNZRO PHONES + IFZERO PHONES > +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 +IFZERO RS08-2 +IFZERO RS08-3 +IFZERO RS08-4 +DSKEXT=DSKSIZ-1> +IFZERO RF08 +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 +IFNZRO DC08A /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 +IFZERO EAE + IFZERO CPU&7776 > +IFNZRO OUTREG&1 + /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 + +/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 + IFNZRO DC08A /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 /SKIP AND CLEAR FLAG IF FLAG +IFZERO CPU-4 /SKIP IF CLOCK FLAG + JMP DTINT +IFZERO CPU-4 /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 +IFZERO RF08 /RF08 ERROR? + ISZ DSWAIT /NO ERROR - TRANSFER OK + + JMP I DSWAIT +DSWAIT, 0 /SET BY DISK SERVICE +INT2, +IFNZRO CDR /CONTINUE IN THE INTERRUPT CHAIN +IFZERO CDR +DTCHK, 0 +IFNZRO CDR /CARD READER? +IFZERO CDR + 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 /DECTAPE? +IFZERO TC01 + 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 + \ No newline at end of file diff --git a/tss8/system/ts8b.pal b/tss8/system/ts8b.pal new file mode 100644 index 0000000..433460b --- /dev/null +++ b/tss8/system/ts8b.pal @@ -0,0 +1,1263 @@ +/ROUTINE TO HANDLE EASY DECTAPE STUFF +/LIKE DTSF AND DTRB +/DTSF ALWAYS SKIPS + +UDTRBS, ISZ L2SV0 /BUMP HIS PC +PTRACA, L2SA /TRICKY, TRICKY +UDTRB, GETJTW /GET LAST VALUE OF STATUS B + JOBSTB + DCA L2SA /GIVE IT TO USER + UUOEXT + +C4000, 4000 +MCSCQ, -4044 /COVERS BOTH ^Q AND ^S + +CONSQ, 0 + ISZ CONDBA /POINT TO OUTPUT SIDE IN DEVTBL + TAD TTCHAR + CLL RTR + TAD MCSCQ /CHECK FOR ^Q AND ^S + SZA CLA + JMP I CONSQ /NEITHER + TAD I CONDBA + SNA + JMP I CONSQ /DOESN'T HAVE AN OUTPUT DDB - SO ^S/^Q MEANS NOTHING + DCA WS2 /ADDRESS OF OUTPUT DDB + TAD I WS2 + AND C3777 /CLEAR THE BIT FIRST + SNL /NOW WHICH WAS IT? + TAD C4000 /^S - SET THE BIT TO INHIBIT HIS/HER TTY FROM PRINTING + DCA I WS2 /SAVE UPDATED STATUS + SZL /WHICH WAS IT AGAIN? + JMS TYPE /^Q - START HIM/HER TYPING IF [S]HE HAS ANYTHING TO TYPE + JMP I .+1 /TAKE SUCCESSFUL EXIT THROUGH "KEY" + KBDXIT + /MULTI-FIELD ROUTINE TO OUTPUT TO A TTY, PTP, OR LPT +/CALL: CONDBA CONTAINS POINTER TO POSITION IN DEVTBL +/ TTCHAR CONTAINS CHARACTER TO BE OUTPUT +/ PRINT +/ NO ROOM IN OUTPUT BUFFER +/ OK + +PRINT0, 0 + RDF + TAD C6203 + DCA PRINTX /REMEMBER FROM WHENCE WE CAME + DCA EMPTY /CLEAR EMPTY BUFFER INDICATOR +PRINT1, DATFLD + TAD I CONDBA /GET ADDRESS OF DDB + SNA + JMP PRINT2 + STORE /STASH THE CHARACTER IN HIS BUFFER + OUTSIZ /ADDRESS OF SIZE CHECK ROUTINE FOR OUTPUT + JMP PRINTX /WOULDN'T FIT + ISZ PRINT0 /OK - SKIP ON RETURN + TAD EMPTY /WAS THE BUFFER EMPTY? + SZA CLA + JMS TYPE /YES - BETTER START THE HARDWARE +PRINTX, .-. /FIELD SELECT + JMP I PRINT0 /AND BACK +PRINT2, TAD CONDBA /NO BUFFER SETUP YET + CDF + GETBLK /CREATE A PSEUDO DDB + JMP PRINTX /NO BLOCKS AVAILABLE + JMP PRINT1 +TTOFLB, TTOFLG + +CORSR4, +TYPE, 0 + TAD CONDBA /DEVTBL POINTER + TAD OUTOFF /MINUS DIF. + CLL RAR /DIVIDE BY 2 + DCA OUTSIZ / = OUTREG POINTER + CIF /NO INTERRUPTS + TAD I OUTSIZ + AND C4001 + SZA CLA /CHECK SERVICE AND CHARACTER FLAGS + JMP I TYPE /CHARACTER WILL BE TAKEN BY AN INTERRUPT + STL RAR + TAD I OUTSIZ /SET THE SERVICE FLAG + DCA I OUTSIZ + CDF + DCA I TTOFLB /SCHEDULE LEVEL 2 TO PRINT IT + JMP I TYPE + CORSR2, +OUTSIZ, 0 + DCA TYPE /SAVE POINTER TO CHARACTER COUNT + TAD I TYPE /CURRENT COUNT + SPA /DOES IT INCLUDE A FILLER CHARACTER COUNT + AND C0377 /YES - DISREGARD IT + DCA TYPE /THE ACTUAL COUNT TO COMPARE WITH + TAD PRINTX + AND C0070 + SZA CLA + JMP OUTSI1 /CALLED FROM SI + TAD CONDBA + CLL + TAD LPTSIZ /ALLOW LINE PRINTER BUFFER TO GOBBLE UP ABOUT 40% OF FREE CORE + AND FRECNT + AND C0400 /DON'T LOOK AT TOO MUCH FREE CORE + SNA + TAD FRECNT + SZL + CLL RTL /THE LINE PRINTER GETS 4 TIMES AS MUCH + CIA +OUTSI2, TAD TYPE /CURRENT COUNT + TAD OUTLIM + SPA CLA + ISZ OUTSIZ /STILL ROOM + JMP I OUTSIZ +OUTSI1, TAD C7366 + JMP OUTSI2 + +C4001, 4001 +C7366, 7366 +OUTLIM, 25 +LPTSIZ, -DEVTBE-3 +OUTOFF, -OUTDIF + /SEARCH FOR JOB IN CORE +/CALL TAD JOB # +/ JMS CORSRC +/ MASK +/ NOT THERE, AC:=0 +/ THERE, SAVE FIELD IN AC + + +/THESE TWO WORDS MUST IMMEDIATELY PRECEDE CORSRC +/THEY MUST ALSO BE ORIGINED AT CORSRC-2 +*CORSRC-2 + +CORCNT, 0 /INIT TO -NUMBER OF USER FIELDS +CORTBE, 0 /INIT TO -((END OF CORTBL)+1) + +CORSRC, 0 /ENTER WITH BIT PATTERN TO MATCH + AND I CORSRC /MASK AS SPECIFIED + CIA + DCA CORSR4 /-WHAT WE WANT + RDF /FIGURE OUT WHENCE WE CAME + TAD C6203 + DCA CORSR3 /SO WE CAN RETURN + TAD I CORSRC /GET THE MASK + DCA CORSR2 /SAVE IT + ISZ CORSRC /SKIP PAST MASK IN CALL + CDF + TAD CORCNT /-# ENTRIES TO CHECK + DCA AXS1 /USED AS COUNTER +CORSR1, ISZ CORTBP /INCREMENT TABLE POINTER + TAD CORTBP /ARE WE AT END OF TABLE? + TAD CORTBE + SPA CLA + JMP CORSR5 /NO + STL RTL + TAD CORTBA /YES, START ALL OVER AT FIELD 2 + DCA CORTBP +CORSR5, TAD I CORTBP /GET TABLE ENTRY + AND CORSR2 /MASK IT + TAD CORSR4 /COMPARE WITH DESIRED ENTRY + SNA CLA + JMP CORSR6 /FOUND IT! + ISZ AXS1 /NOT YET + JMP CORSR1 /KEEP GOING +CORSR3, 0 /RETURN WITH AC=0 + JMP I CORSRC + CORSR6, TAD CORTBA /WE HAVE IT; GET CORTBL INDEX + CIA + TAD CORTBP + DCA AXS1 /FIELD # + TAD CORSR4 /WE HAVE TO SET MODE BIT APPROPRIATELY + CIA /RECOMPLEMENT CALLING JOB # + AND C0600 /A PHANTOM? + SNA CLA /EXEC MODE? + TAD C0010 /NO - SET USER MODE BIT + TAD AXS1 /SET UP SAVE FIELD + CLL RTL /SHIFT AND ADD DATA FIELD + RAL + TAD AXS1 + ISZ CORSRC /SKIP TO INDICATE SUCCESS + JMP CORSR3 /BACK +CORTBP, CORTBL+1 / "ROUND-ROBIN" POINTER + +/WHEN THE USER EXECUTES A "SEA" IOT, +/WE MUST DO TWO THINGS: +/ 1) SET THE ERROR ENABLE BIT IN STR0 +/ 2) SAVE THE USER'S AC IN THE JOB DATA AREA +/ JSEREN IS SET HERE +/ WE GO TO USEA1 TO SAVE THE ERROR ADDRESS +/JSEREN MAY BE CLEARED BY .RUN, START, OR +/A USER EXECUTING A "CLEAR STATUS" IOT. + +USEA, DATFLD /SET JSEREN WHEN USER EXECUTES SEA + TAD I CJOBDA /POINTS TO WORD 0 OF JOB DATA AREA + IAC /POINTS TO STR0 + IOR /OR IN JSEREN + JSEREN + CDF + JMP I .+1 + USEA1 /GO PICK UP ERROR ADDRESS + +/GET A BUFFER FROM FREE LIST +/CALL TAD (ADDRESS TO STORE LINK) +/ GETBLK +/ NONE AVAILABLE +/ OK WITH LINK STORED + +GETB, +GETDB2, 0 + DCA GETBT /SAVE ADDRESS TO SAVE PTR + RDF /SAVE CALLING FIELD + TAD C6203 + DCA GETB1 /SO WE CAN GET BACK + DATFLD + TAD FREE /ANY BUFFERS LEFT? + SNA + JMP GETB1 /NONE LEFT + DCA I GETBT /STORE LINK IN ADDRESS SPECIFIED + STA /NOW WE'LL BE GOOD GUYS + TAD FREE /AND PREPARE TO CLEAR THE BUFFER + DCA AXS1 + TAD I FREE /REMOVE FROM FREE LIST + DCA FREE /SET NEW POINTER TO FREE LIST + ISZ GETB /INDICATES SUCCESS + STA /DECREMENT FREE COUNT + TAD FRECNT + DCA FRECNT + TAD C7770 /8 WORDS TO ZERO + DCA GETBT + DCA I AXS1 + ISZ GETBT /DONE? + JMP .-2 /NO +GETB1, 0 /RETURN + JMP I GETB + +USTM, TAD L2SA /GET UNITS OF TIME IN AC + DCA USTM1 /SAVE IT + DCA L2SA /ZERO USER'S AC + TAD USTM1 + SNA /ANY TIME SPECIFIED? + UUOEXT /NO, SO DON'T SLEEP + JMP I USTM2 /YES, GO PUT TO SLEEP +USTM2, DOUSTM + /GET A DATA BLOCK +/CALL TAD LINK +/ GETDDB +/ NONE AVAILABLE +/ OK + + +GETDB0, +DEVWT0, 0 + DCA GETDB1 /ADDRESS OF DDB POINTER (USUALLY IN DEVTBL) + RDF + TAD C6203 + DCA GETDB5 /SAVE CALLING FIELD SO WE CAN GET OUT + CDF + TAD GETDB1 /GET A BUFFER FROM FREE CORE + GETBLK + JMP GETDB5 /SORRY + DATFLD + ISZ GETDB0 /SUCCESSFUL RETURN + TAD I GETDB1 + TAD C0003 + DCA GETDB1 /SAVE IT + TAD CLK1 /GET LOW ORDER CLOCK + RTL /AND SHIFT BITS 0-2 INTO AC 9-11 + RTL + AND C0007 /GET MOST SIGNIFICANT BITS FROM LOW ORDER + DCA GETDB2 /SAVE THEM + TAD CLK2 /GET HIGH ORDER TIME + RTL /SHIFT LEFT 3 PLACES + RAL + AND C7770 /KEEP BITS 0-8 + TAD GETDB2 /ADD COMPONENT DERIVED FROM CLK1 + DCA I GETDB1 /SAVE IN DDB +GETDB5, 0 /RETURN + JMP I GETDB0 + + + +CTIMER, -5 +TIMCOA, TIMCON +CONJMS, JMSTIM +TTIMEB, TTIMER +L2OUT, TAD CTIMER /AC=-5 + DCA I TIMCOA /RESET THE OUTPUT MASTER TIMER + TAD CONJMS + DCA I TTIMEB /PLACE THE TIMER "HOOK" IN CONOUT + DCA I TTOFLC /SCHEDULE CONOUT FOR LEVEL 2 + /BEFORE DISMISSING BACK TO USER JOB, IT IS A GOOD IDEA TO CHECK AND SEE IF ANY OTHER +/LEVEL 2 PROCESSING HAS BEEN SCHEDULED WHILE WE WERE WORKING ON THE LAST REQUEST +/WE CAN ASCERTAIN IF THIS IS THE CASE BY COMPARING THE L2QUE EMPTY AND +/FILL POINTERS -- IF THEY ARE EQUAL, THEN WE'RE DONE, AND CAN GO TO L2EX1, +/WHERE BOTH POINTERS ARE RESET. IF UNEQUAL, WE GET THE NEXT ENTRY POINTED +/TO BY L2QE, AND DISPATCH TO IT LEAVE LEVEL 2 + +L2EXIT, CDF + IOF /NO INTERRUPTS WHILE CHECKING L2QUE STATUS + CLA + TAD I L2KEY + SZA CLA + JMP I CONINP /KEYBOARDS NEED SERVICE - TAKE CARE OF THEM FIRST +L2EX0, TAD L2Q /ARE FILL AND EMPTY POINTERS EQUAL? + CIA + TAD L2QE /-FILL PTR + EMPTY PTR + SNA CLA + JMP L2EX1 /YES - WE ARE CAUGHT UP + TAD I L2QE /NO; GET ADDRESS FROM L2QUE + DCA JOBSWA + ION /INTERRUPT BACK ON + JMP I JOBSWA /DISPATCH + +L2EX1, TAD L2QTA + DCA L2QE + TAD L2QTA + DCA L2Q /RESET FILL POINTER + TAD I TTOFLC + SNA CLA + JMP I CONOUA /PRINTERS NEED SERVICE + TAD L2SFA + JMP I .+1 /NOW BACK TO WORK + RESTOR + +TTOFLC, TTOFLG +CONOUA, CONOUT +L2QTA, L2QTB-1 +L2KEY, KEYC +CONINP, CONIN +L2SFA, L2SF +KBDJOA, DEVJOB + GETDB1, +CLST0, +KBDDLM, 0 /ROUTINE TO SET DELIMITER FLAG IN STR1 + TAD CONDDB + JMS I KBDJOA /GET JOB # + DCA BONUS /GIVE HIM/HER HIGHEST SCHEDULER PRIORITY + TAD C0100 /JSDEL + JMS I SETFLG /SET HIS/HER DELIMITER BIT + JMP I KBDDLM /AND BACK + +GETBT, +USTM1, +CLSTR1, 0 /ROUTINE TO CLEAR BITS IN STR1 + CMA /ENTER WITH BITS TO CLEAR IN AC + DCA CLST0 /SAVE MASK OF BITS TO SAVE + CDF + GETJTW /GET CURRENT SETTING OF STR1 + JOBSTS+1 + AND CLST0 /CLEAR SELECTED BITS + DATFLD + DCA I JOBSWA /SAVE CLEARED STATUS REGISTER + JMP I CLSTR1 /RETURN + +URK050, TAD C0005 +UDTXA0, TAD C0002 + CLL RAR + CIF DATFLD-1 /FIELD 1 DTA UUO SERVICE + JMP I .+1 + UUDTRK + *FISUBL+1202 +/BLOCK TRANSFER +/CALL BLT +/ 62S1 SELECT SOURCE DATA FIELD +/ SOURCE +/ 62D1 SELECT DESTINATION DATA FIELD +/ DESTINATION +/ -NUMBER WORDS +/ RETURN +BLT0, +RUNTDB, 0 + TAD I BLT0 /GET SOURCE FIELD SELECT + DCA BLT1 /SAVE + ISZ BLT0 /POINTS TO SOURCE ADDRESS + STA + TAD I BLT0 /CORE ADDRESS -1 OF SOURCE + DCA AXS1 /AUTO INDEX + ISZ BLT0 /POINTS TO DESTINATION FIELD SELECT + TAD I BLT0 /GET DESTINATION SELECT + DCA BLT2 /SAVE + ISZ BLT0 /POINTS TO DEST. ADD + STA + TAD I BLT0 /DEST. ADD-1 + DCA AXS2 /AUTO INDEX + ISZ BLT0 /POINTS TO -WORD COUNT + TAD I BLT0 + DCA BLTC /SAVE + ISZ BLT0 /RETURN ADDRESS + RDF + TAD C6203 + DCA BLTF /SAVE RETURN FIELD SELECT +BLT1, 0 /SELECT SOURCE DATA FIELD + TAD I AXS1 +BLT2, 0 /SELECT DESTINATION DATA FIELD + DCA I AXS2 + ISZ BLTC /DONE? + JMP BLT1 /NO +BLTF, 0 /RETURN + JMP I BLT0 + + /TEST JOB FOR RUNNABILITY +/CALL TAD JOB # +/ RUNABL +/ NOT RUNNABLE +/ RUNNABLE + +BLTC, +RUNTST, 0 /COME HERE WITH JOB # IN AC + TAD JOBTBA /TO GET JOBTABLE ADDRESS + GETJTI /GET STR0 + JOBSTS + SMA /RUN BIT ON? + JMP RUNTS3 /NO + DATFLD /YES, SEE IF IT RAN AS A COMPUTE BOUND JOB LAST TIME + AND C1000 /IS BIT 1000 ON SHOWING THAT IT WAS A COMPUTE BOUND JOB? + SNA /SNA + JMP RUNTS2 /NO, IT MAY BE READY TO RUN - TEST FURTHER + CMA /LAST TIME IT WAS COMPUTE BOUND, SKIP THIS TURN + AND I JOBSWA /CLEAR THE BIT 1000, SO THAT IT WILL RUN NEXT TIME + DCA I JOBSWA + JMP RUNTS1 /RETURN BY NOT RUNNABLE EXIT +RUNTS2, ISZ JOBSWA /GET THE ADDRESS OF STR1 + TAD I JOBSWA + ISZ JOBSWA + ISZ JOBSWA /POINT TO WAIT MASK 1 + AND I JOBSWA /ANY STR1-MASK1 MATCHES? + SZA CLA + ISZ RUNTST /YES +RUNTS1, CDF /NO + JMP I RUNTST +RUNTS3, AND RC0147 + SNA /FIP REQUEST STILL PENDING? OR ANY ERRORS SINCE HE STOPPED? + JMP I RUNTST /NONE + AND C0007 /IS IT FOR FIP OR SI? + SNA CLA + JMP RUNTS1-1 /FIP - LET HIM FINISH UP SO WE DON'T LOSE A FREE CORE BLOCK + DATFLD + CLL CMA RTR + AND I JOBSWA /CLEAR HIS ERROR ENABLE + DCA I JOBSWA + JMP RUNTS1-1 /ERROR - LET SI REPORT IT NOW + +RC0147, JSIOT JSIOTC UUOERF SWPRER SWPWER DSKERR HUNGDV +SIWAIT, 0 + + +L2SI, TAD SIWAIT /NUMBER OF SI COMMANDS IN "WAIT" + TAD COMCNT /PLUS NEW COMMANDS + DCA COMCNT /NOW THEY'RE ALL BACK ON-LINE + DCA SIWAIT /NONE NOW IN WAIT STATE + EXIT + /SET SYSTEM ERROR CODE +/CALL TAD JOB # +/ JMS SYSERR +/ ERROR CODE +/ NORMAL RETURN + + +SYSERR, 0 + AND C0037 /JOB # ONLY + SNA /IS IT JOB 0? + JMP SYSER1-1 /YES, RETURN + TAD JOBTBA /POINTER TO JOBTBL + GETJTI /GET CURRENT VALUE OF STR0 + JOBSTS + AND C0007 /EXTRACT ANY ERROR CODE IN THERE + SZA CLA /ANY OLD BITS? + JMP SYSER1 /YES; DON'T CONFUSE THE ISSUE + TAD I SYSERR /GET THE ERROR CODE SUPPLIED + DATFLD + TAD I JOBSWA /ADD IT TO OLD VALUE OF STR0 + DCA I JOBSWA /SAVE THE WHOLE MESS + ISZ JOBSWA + TAD JOBSWA /POINTS TO STR1 + IOR /SET THE "ERROR HAS OCCURRED" BIT IN STR1 + JSERR + CDF +SYSER1, ISZ SYSERR /SKIP ARGUMENT IN CALL + JMP I SYSERR /RETURN +/SKIP IF DISK NOT ACTIVE +/CALL TAD FIELD # +/ JMS DSKACT +/ ACTIVE +/ NOT ACTIVE + +DSUSTA, +DAUTBL, DSUTBL-1 + +DSKACT, 0 + CLL RTL /FIELD # *4 IS MAJOR INDEX IN DSUTBL + TAD DAUTBL /START OF TABLE -1 + DCA AXS1 /AUTO INDEX + DATFLD + TAD I AXS1 /FILE 1 BUSY? + TAD I AXS1 / " 2 " + TAD I AXS1 / " 3 " + TAD I AXS1 / " 4 " + CDF + SNA CLA /IF ANY ONE WAS BUSY, AC.NE.0 + ISZ DSKACT /NO ACTIVITY; INDEX RETURN + JMP I DSKACT /AND OFF + /START USER DISC REQUEST FROM QUEUE +/IF THIS ROUTINE IS CALLED, THERE HAD +/BETTER BE SOMETHING IN SQREQ OR DSUTBL +/FOR IT TO FIND. IT WON'T STOP LOOKING! +/CALL JMS DSUSER +/ RETURN + +DSUSER, 0 + TAD SQREQ /IS A SWAP REQUESTED? + SZA CLA + JMP DSUSR5 /YES, DO IT FIRST + DATFLD +DSUSR4, TAD I DSKPTR /GET ENTRY FROM DSUTBL + SNA /IS IT A REQUEST? + JMP DSUSR4 /NO - CHECK NEXT POSITION + CMA + SNA /END OF LIST? + JMP DSUSR2 /YES + CMA /REAL REQUEST FLIP IT BACK AGAIN + CDF + DSGO /YES, START IT UP + JMP I DSUSER /AND BACK +DSUSR5, JMS I SWPIOA /START A SWAP DISK I/O + JMP I DSUSER /RETURN BACK + + +DSUSR2, TAD DSUSTA /START OF DSU TABLE +7 + TAD C0007 + DCA DSKPTR + JMP DSUSR4 + *2000 + +/KEYBOARD SERVICE +/ENTERED WHENEVER CHARACTER IS RECEIVED. --==-- HIGHEST PRIORITY ON LEVEL 2 + +BELL=1000 +KLOST, 0 /NUMBER OF CHARACTERS LOST BECAUSE OF OVERFLOW SINCE THE SYSTEM WAS LAST STARTED +TYPEA, TYPE +KEYB, RINGIN /POINTER TO INPUT RING BUFFER +KEYCNT, -INPUTS +KEYA, KEYC +KEYSIZ, -INPUTS /SIZE OF KEYBOARD INPUT RING BUFFER +CONIN, DCA I SETFLG /CLEAR THE SCHEDULER REQUEST FLAG +CONIN3, STA + CDF + IOF + TAD I KEYA + SMA /ARE WE FINISHED? + JMP CONIN4 /NO +CONEXT, CDF + AND I SETFLG /DID WE AROUSE ANYONE? + SZA CLA + RSCHED /IF NULL JOB IS RUNNING WE MAY TERMINATE IT + EXIT + +CONIN4, DCA I KEYA /DECREMENTED COUNT + TAD I KEYA /CHECK FOR OVERFLOW + TAD KEYSIZ + SMA SZA CLA + JMP CONIN0 /OVERFLOW - SKIP AROUND TO THE FIRST ENTRY + DATFLD + TAD I KEYB /GRAB A CHARACTER FROM THE RING BUFFER + DCA TTCHAR + ISZ KEYB + ION + TAD I KEYB /LINE NUMBER + SPA + JMP HIPTR /HIGH SPEED READER + CLL RAL /TIMES 2 + TAD DEVTBA + DCA CONINA /POSITION IN DEVICE TABLE + TAD I CONINA + SZA CLA + JMP CONIN1 + TAD CONINA /NO DDB SETUP YET + CDF + GETBLK /ESTABLISH A PSEUDO DDB FOR THE TIME BEING + JMP CONIN2 /NONE AVAILABLE - DON'T BOTHER WITH BELLS + DATFLD + TAD I CONINA + IOR + DSI /SET NEW CONSOLE IN SI MODE + CONIN1, CDF + KEY /PROCESS THIS CHARACTER +CONINA, .-. + SKP /NO ROOM - RING BELL + JMP CONIN2 + DATFLD + TAD I CONDBA /POINTS TO OUTPUT SIDE + SNA + JMP CONIN2 /NO DDB DON'T BOTHER WITH BELLS + IOR + BELL /RING-A-DING TOO BAD!! + JMS I TYPEA /REMEMBER WE WANT TO RING HIS/HER CHIME + JMP CONIN2 +CONIN0, ISZ KLOST /COUNT A LOST CHARACTER +KEYBA, RINGIN /NOP + ISZ KEYB +CONIN2, ISZ KEYB + ISZ KEYCNT /END OF RING BUFFER? + JMP CONIN3 /NO + TAD KEYBA + DCA KEYB /RESET POINTER + TAD KEYSIZ + DCA KEYCNT /AND THE COUNT + JMP CONIN3 + +PTRPTR, DEVTBE +HIPTR, AND I PTRPTR /GET DDB ADDRESS OF PTR + SNA + JMP CONIN2 /OOPS - [S]HE RELEASED IT + STORE /STASH ITS CHARACTER AWAY + PTRSIZ /SIZE CHECK ROUTINE + SKP + JMP CONIN2 /ALL IS WELL + CDF /OOPS! - RAN OUT OF FREE CORE + IOF + ISZ I KEYA /UN-COUNT THE CHARACTER + STA + TAD KEYB + DCA KEYB /BACK UP THE RING BUFFER POINTER + JMP I .+1 /AND BACK TO THE REMAINDER OF L2 SERVICE + L2EX0 /JUST PAST THE HI-PRIORITY CHECK POINT + /CHECK DEVICE ASSIGNMENT AND ASSIGN IF AVAILABLE +/CALLING SEQUENCE: +/ JMS DEVCHK +/ DEVTBL ADDRESS FOR THE DESIRED DEVICE +/ RETURN - IF OK TO USE +/ IF NOT OK THE RETURN IS THROUGH "UUOERR" +DEVCHK, 0 + TAD I DEVCHK /GET DEVTBL POINTER + ISZ DEVCHK /INDEX PAST PARAMETER + DCA WS2 /DEVTBL ADDRESS + RDF /THE FIELD FROM WHERE WE CAME + TAD C6203 + DCA DEVEXT + DATFLD + TAD I WS2 /DDB ADDRESS + SZA /IN USE? + JMP DEVCH1 /YES + TAD WS2 + CDF + GETDDB /GET DATA BLOCK + REDO + DATFLD + TAD I WS2 /ADDRESS OF DDB + DCA WS1 + TAD WS2 /DEVTBE+UNIT# + TAD DEVCH0 /-DEVTBE + + DCA I WS1 /SAVE IN WORD 0 OF DDB + ISZ WS1 /POINTS TO JOB # IN DDB + TAD JOB + AND C0037 + DCA I WS1 /SAVE OWNER JOB +DEVEXT, 0 + JMP I DEVCHK /RETURN + +DEVCH1, DCA AXS1 /NOW POINTS TO WORD 0 OF DDB + TAD JOB + CIA + TAD I AXS1 /DOES THIS JOB OWN DEVICE? + SNA CLA + JMP DEVEXT + JMP I .+1 + UUOERR +DEVCH0, -DEVTBE + + +UUOCAL=WS0 +UUOADD=WS1 + +/ SAVE MACHINE STATUS WHEN USER EXECUTES IOT +/WE MUST CHECK USER IOT FLAG BEFORE ANYTHING ELSE, EVEN CLOCK FLAG +/IF WE DON'T, AND CLOCK INTERRUPTS WITHIN 8 MICROSECONDS AFTER USER +/EXECUTES IOT, THEN WE WOULD TRIP ON CLOCK FLAG, AND NOT BE ABLE TO +/FIGURE OUT WHAT IOT THE USER EXECUTED. + +UUO0, DCA L2SA /WE MUST HAVE BEEN IN USER MODE WHEN INTERRUPT OCCURRED! + RAR /SAVE LINK + DCA L2SVLK + TAD 0 + DCA L2SV0 /SAVE PC + RIB + DCA L2SF /SAVE FIELDS AND MODE + CINT /CLEAR FLAG + ION + STA + TAD L2SV0 /BACK UP USER PC TO POINT TO IOT IN QUESTION + DCA UUOADD + UDF /SELECT USER DATA FIELD + TAD I UUOADD /GET THE IOT THAT CAUSED ENTRY HERE + DCA UUOCAL + CDF + TAD UUOTBA /START SCANNING THE IOT TABLE + DCA AXS1 + TAD UUOCAL + AND C7770 /GET DEVICE CODE + CIA + DCA UUOC77 /SAVE-CODE + JMS UUOSR /FIRST SEE IF IT IS MICRO-CODED + JMP UUO22 +UUO3, TAD AXS1 /YES, NOW COMPUTE ADDRESS OF SERVICE ROUTINE + TAD UUOTLL /OFFSET BETWEEN IOT TABLE AND DISPATCH TABLE + DCA UUOC77 /POINTS TO DISPATCH ENTRY + TAD I UUOC77 /GET DISPATCH ADDRESS + DCA UUOC77 /SAVE IT + JMP I UUOC77 /AND JUMP TO IT +UUO7, JMS UUOSR /CHECK FOR NON-RESIDENT IOTS WHICH RETURN ARGUMENTS + UUOEXT /UNDEFINED + JMP UUO8 /FIND # OF ARGUMENTS TO SEND TO FIP + UUO22, TAD UUOCAL /IS IT AN IOT AT ALL? + AND C1000 + SZA CLA + JMP I UHALTA /IT'S A HLT, OSR, OR SOME COMBINATION + TAD UUOCAL /IT'S NOT MICROCODED + CIA + DCA UUOC77 /-IOT CAUSING INTERRUPT + JMS UUOSR /CHECK FOR NON-MICRO-CODED RESIDENT IOTS + SKP + JMP UUO3 /FOUND ONE; NOW GO GET DISPATCH ADDRESS AND AWAY--- + JMS UUOSR /SEARCH FOR SHORT NON-RESIDENT IOTS + JMP UUO7 +UUO6, TAD UUOCAL /THROW AWAY BITS 0-2 OF IOT + AND C0377 + DCA UUOCAL /AND SAVE IT +UUO8, TAD AXS1 /NOW FIND NUMBER OF ARGUMENTS + TAD UUOTLL /THIS POINTS TO # IN UUOTBL + JMS GETUSP /GET USER PARAMENTERS +UFILE4, TAD CJOBDA /GET POINTER TO STR0 + GETJTA + JOBSTS + DATFLD /OR IN "NON-RESIDENT IOT" BIT + IOR /SO FIP WILL RUN IN PLACE OF THIS JOB + JSIOT + TAD FIPJOB /ANYTHING CURRENTLY SCHEDULED? + SZA CLA + WAIT /YES - FIP WILL PICK US UP LATER + TAD JOB + DCA FIPJOB /SO THE SCHEDULER WILL TAKE US AS SOON AS POSSIBLE + WAIT /AND WAIT FOR FIP + +UUOSR, 0 /SEARCH FOR MATCH + TAD I AXS1 /GET ENTRY FROM TABLE + SNA /LAST ENTRY? + JMP I UUOSR /YES, RETURN + TAD UUOC77 /NO, CHECK FOR MATCH + SZA CLA /MATCH? + JMP .-5 /NO, KEEP GOING + ISZ UUOSR /YES, SKIP + JMP I UUOSR /AND RETURN + +UHALTA, UHALT +UUOTBA, UUOTBL-1 +UUOTLL, UUODTB-UUOTBL + /THIS ROUTINE COPIES THE PARAMETERS SUPPLIED BY THE +/USER PROGRAM INTO *BLOCK IN FREE CORE, WHICH IS POINTED +/TO BY JOBLNK. +/THE IOT ITSELF IS SAVED IN THE FIRST WORD OF THE PARAMETER BLOCK +/IF NO ARGUMENTS ARE REQUIRED, JOBLNK CONTAINS THE IOT, +/RATHER THAN A POINTER TO THE IOT PARAMETER BLOCK. +/FIP CAN TELL BY EXAMINING BITS 0-3 OF JOBLNK; IF THEY ARE +/NON-ZERO, JOBLNK IS AN ADDRESS; IF ZERO, JOBLNK IS THE IOT ITSELF. +/NOW YOU KNOW WHY THE START OF THE FREE CORE LIST MUST ALWAYS BE +/ON OR AFTER 400 OCTAL IN FIELD ONE? + +UUODAC, DSKACT + +GETUSP, 0 /ENTER WITH PTR -# ARGUEMTS TO GET + DCA UUOC77 /SAVE IT + CDF + TAD CJOBDA /OK - NOW GET PTR TO JOBLNK + GETJTA + JOBLNK + DCA UUOLNK /AND SAVE IT + TAD I UUOC77 + SNA /ANY ARGUMENTS? + JMP GETUS1 /NO - JUST SAVE IOT IN JOBLNK + CDF + DCA UUOC77 /YES. SAVE # ARGUMENTS + CLL CLA CMA RAL /CAN WE GET PARAMETER BLOCKS? + TAD FRECNT + SPA SNA CLA + REDO /NO - TRY LATER + TAD UUOLNK /PUT ADDRESS OF LINKAGE BLOCK IN UUOLNK + GETBLK /GET A FREE BLOCK + HLT /WHAT? "FRECNT" SAID THERE WERE PLENTY!! + DATFLD + TAD I UUOLNK /GET ADDRESS OF PARAMETER BLOCK + CDF + DCA UUOLNK /SAVE IT IN BLT CALLING SEQUENCE + STA /GET POINTER TO USER PARAMETERS-1 + TAD L2SA + DCA UUSRC /SAVE FOR BLT CALL + TAD UUDF /MOVE USER PARAMETERS TO LINKAGE AREA IN DATFLD + DCA .+2 + BLT + 0 /SOURCE FIELD SELECT +UUSRC, 0 /SOURCE ADDRESS + DATFLD /DESTINATION FIELD SELECT +UUOLNK, 0 /DESTINATION ADDRESS +UUOC77, 0 /-#WORDS +GETUS1, TAD UUOCAL /NOW GET IOT + DATFLD + DCA I UUOLNK /AND SAVE IT IN APPROPRIATE PLACE + CDF + JMP I GETUSP /RETURN + /STASH LEVEL 2 REQUESTS FROM FIELD 1 + + +QUEUE0, 0 + DCA I L2Q /QUEUE REQUEST FROM FIELD 1 + CIF DATFLD + JMP I QUEUE0 /AND BACK + +L2689, +IFNZRO D689 < + CIF DATFLD + JMP I .+1 /TO FIELD 1 689 CARRIER SERVICE + DFCARR > +IFNZRO DC08A <*2364 +T8OUT, CLA /DC08A CODE CALLED FROM "CONOUT" + TAD T8OBF2 /FIND ACTIVE OUTPUT REGISTER + TAD WS0 + DCA UUOSR + TAD TTCHAR /CHARACTER TO BE OUTPUT + CLL RAL + TAD T8STOP + DCA I UUOSR /STASH IT COMPLETE WITH STOP & START BITS + JMP I .+1 + CONTLS+1 +T8OBF2, SKPTBL-OUTREG+1 +T8STOP, 3000 > +IFNZRO CPU&7776 <*2360 +KLEN, SKPTBL-1 +KDEV, SKPTBL-1 +TIMER4, CLA + TAD KDEV /END OF LIST; RE-SET THE POINTER + DCA KLEN +L2TIME=. + ISZ KLEN /MAKE SURE THAT THE KL8E'S STAY ENABLED + DATFLD + TAD I KLEN + CDF + SMA + JMP TIMER4 /END OF LIST, RESET POINTER FOR NEXT TIME + TAD C0004 /CONSTRUCT A "KIE" + DCA .+2 + IAC + .-. + CLA > + *2400 +IFZERO CPU&7776 +L2TIM2, ISZ CLK1 /UPDATE LOW ORDER DAY CLOCK + JMP L2TIM3 /NOTHING UNUSUAL + ISZ CLK2 /UPDATE HIGH ORDER TIME. WOW! + JMP L2TIM3 + ISZ DATE /WOULD YOU BELIEVE IT'S MIDNIGHT! + TAD ICLK2 /REINITIALIZE THE CLOCK FOR ANOTHER + DCA CLK2 /24 HOURS WORTH OF TICKS + TAD ICLK1 /AND BUMP THE DATE ONE + DCA CLK1 /(EVERY MONTH HAS 31 DAYS FOR OUR PDP-8) +L2TIM3, CIF DATFLD /DECREMENT TIMERS + JMS I TIMERA /ROUTINE TO RUN TIMERS +TIMCON, -5 /TIMES OUT EVERY FIVE SECONDS + L2OUT /SCHEDULE "CONOUT-TIMER" SERVICE +TIMPTR, 0 /NON-ZERO IF BUSY + L2PTR /WHERE TO GO WHEN READER HANGS +TIMCDR, 0 /NON-ZERO IF BUSY + L2CDR /WHERE TO GO IF THE CARD READER HANGS +TIMSI, 0 /NON-ZERO WHEN SI IS IN THE WAIT STATE + L2SI /WHERE TO GO WHEN IT TIMES OUT +TIMFIP, 0 /NON-ZERO IF "FIPLOCK" IS ON + L2FIP /WHERE TO GO TO TURN "FIPLOCK" OFF +TIM689, 0 /NON-ZERO IF ACTIVE + L2689 /WHERE TO GO TO CHECK CARRIER STATUS +TIMER3, ISZ JOBTIM + NOP + CIF /INHIBIT INTERRUPTS WHILE WE UN-BUMP THE CLOCK + CLL STA + TAD CLOCK + DCA CLOCK + SZL /HAVE WE COUNTED ALL THE SCHEDULED SYSTEM TICKS? + JMP L2TIM2 /NO + /"RSCHED" IS ENTERED AT THIS POINT +/RSCHED'S FUNCTION IS TO FIND JOBS TO RUN, REGARDLESS +/OF WHERE THEY MAY CURRENTLY RESIDE. IF THEY ARE IN CORE, +/GOOD; IF NOT, THE NECESSARY STEPS WILL BE TAKEN TO +/BRING THEM INTO CORE. IN THE LATTER CASE, WE WILL THEN +/GO OFF AND FIND SOMETHING TO DO WHILE THE NON-RESIDENT +/JOB IS MADE RESIDENT. + +SCHED0, TAD JOB /GET CURRENT JOB + AND C0600 + SZA CLA + EXIT /?? - DON'T BUMP OFF A PHANTOM! + TAD SCHNEW /IS THIS SOMETHING THAT CAN BE BUMPED OFF? + SNA + JMP SCHE12 /YES - GET RID OF HIM/HER + TAD JOBTIM /HAS [S]HE USED A FULL TIME SLICE YET? + SPA SNA CLA + EXIT /NO, GO BACK TO HIM/HER +SCHE12, ION + SAVJOB /YES. SAVE ITS STATE. SET JOB=0 + STA + DCA SCHNEW /SET FOR FULL TIME SLICES + TAD CURJOB /DID FILE TRANSFER PROCESSING CUT INTO SOMEONE'S TIME SLICE? + SZA + JMP SCHEI6 /YES - START IT BACK UP + TAD NXTMAX + DCA I NXTJCA /NUMBER OF JOBS TO CONSIDER + TAD SQREQ /SWAP REQUEST IN PROGRESS? + SNA CLA /IF SO, THERE IS NO POINT IN GOING FURTHER NOW. + JMP SCHED1 /NO - PROCEED + /SCHEDULE NEXT RESIDENT JOB +/THIS IS THE ENTRY FOR "SCHED" +/WE ONLY COME HERE IF A SWAP IS IN PROGRESS +/OR IF WE FIND THE JOB WE REALLY +/WANT TO RUN IS CURRENTLY INDISPOSED TO RUNNING. SCHED +/WILL FIND SOME RESIDENT JOB TO RUN. IF NO JOB IS +/RUNNABLE OR RESIDENT, JOB 0 (THE NULL JOB) IS RUN. + +SCHEDI, TAD FANCOR /CHECK FOR PHANTOMS FIRST SO + DCA WS0 /START AT FIELD 2 + TAD I SCHMUC /NUMBER OF USER CORE FIELDS TO CONSIDER + CLL RAL /TIMES 2 + DCA I NXTCNA /ON THE SECOND PASS WE MAY PICK UP A COMPUTE-BOUND JOB + TAD I SCHMUC /NUMBER OF FIELDS + DCA WS1 +SCHEI3, TAD I WS0 + AND C1000 /CHECK FOR "NOTRUN" + SZA + JMP SCHEI4 /WE FOUND ONE + ISZ WS0 + ISZ WS1 + JMP SCHEI3 /TRY AGAIN + JMP I SCHNXT /LOOK FOR SOMEONE TO RUN ON BORROWED TIME + +SCHEI4, CMA + AND I WS0 /REMOVE THE "NOTRUN" BIT + DCA I WS0 + TAD I WS0 + AND C0600 /IS IT A PHANTOM? + SZA CLA + JMP SCHEI5 /YES - THEN IT MUST BE READY TO EXECUTE + TAD I WS0 + AND C0037 + RUNABL /IS IT RUNNABLE? + JMP SCHEI3+4 /NO +SCHEI5, TAD I WS0 /YES - IT MUST BE RUNNABLE +SCHEI2, DCA SCHNJN /IS JOB IN CORE? + TAD SCHNJN /SEARCH CORTBL FOR HIM/HER + CORE + SWAP LOCK FIP SI CJOB + SCHED /NOT THERE; HAVE TO SWAP HIM/HER IN LATER + DCA L2SF /YES - SET UP SAVE FIELD + TAD SCHNJN /RESTORE REST OF LEVEL 2 REGISTERS + RESJOB + START /START JOB + +SCHEI6, DCA SCHNJN /SAVE JOB NUMBER + DCA CURJOB /CLEAR "REMEMBERED" JOB + JMP SCHEI2+1 /NOW GO START HIM/HER BACK UP + SCHNXT, NXTCO1 +ICLK1, -INCLK1 +ICLK2, -INCLK2-1 +SCHNJN=WS0 +SCHSI=C0200 +TIMERA, TIMER0 +NXTMAX, -JOBMAX-1 +NXTJCA, NXTJCT +SCHMUC, CORCNT +NXTCNA, NXTCNT +L2CDR, DATFLD + TAD I UUCDR1 + DCA AXS1 + TAD I AXS1 + CDF + ERROR /PASS HUNG DEVICE ERROR TO THE USER + HUNGDV +CDL20, CIF DATFLD-1 + JMP I .+1 + CDL21 +UUCDR0, IAC + IAC + DCA UUOCAL /SAVE THE IOT INDICATOR + JMS I CDRCHK /SEE IF IT'S OK FOR HIM/HER TO USE THE CARD READER +UUCDR1, DEVTBE+4 + TAD UUOCAL /ALL IS WELL + CIF DATFLD-1 + JMP I .+1 /OFF TO THE CARD READER HANDLER + UUCDR +CDRCHK, DEVCHK +REDO0, STA /IF WE CAN'T FINISH AN IOT FOR LACK OF SYSTEM + TAD L2SV0 /FACILITIES, WE BACK UP THE USER'S PC TO POINT + DCA L2SV0 /TO THE SAME IOT AND HOPE THAT LATER ON THINGS WILL LOOSEN UP. +WSCHED, CDF /THE USER PROGRAM IS TO GO INTO A WAIT + JMP SCHE12 + + +SCHED1, TAD FIT /SOMETHING LEFT FROM LAST PASS THROUGH SCHEDULER? + AND C0037 /JOB ONLY + SZA + JMP SCHED4 /YES + TAD COMCNT /SI REQUESTED? + SNA CLA + JMP SCHED6 /NO + TAD SCHSI + JMP SCHED8 /YES - SCHEDULE IT +SCHED6, TAD FIPJOB /SOMETHING WAITING FOR FIP? + SNA + JMP SCHE13 /NO SPECIFIC JOB +SCHED4, DCA FIT /SAVE IT + TAD FIT + RUNABL /IS IT STILL GOOD? + SKP /NO + JMP SCHED5 /YES - CHECK IT OUT +SCHE13, JMS I SCHNXA /GET NEXT RUNNABLE JOB + DCA FIT /SAVE JOB # + DCA BONUS /BONUS JOB ALREADY PICKED UP +SCHED5, TAD FIT + TAD JOBTBA + GETJTI /GET CONTENTS OF STR0 + JOBSTS + RTL /PUT ERROR ENABLE IN THE LINK + AND SCFIP /NEED FIP? + SZA + JMP SCHED7 /YES; SCHEDULE FIP FOR HIM/HER + DATFLD + TAD I JOBSWA /GET STR0 AGAIN + CDF + AND C0007 /ANY ERROR BITS ON? + SZA SNL CLA /EVEN IF THERE ARE WE'LL LET HIM/HER HANDLE IT IF [S]HE'S ENABLED (LINK=1) + TAD SCHSI /CALL SI TO HANDLE ERROR +SCHED7, TAD FIT /UPDATE "FIT" IF THERE'S A NEED FOR FIP OR SI +SCHED8, DCA FIT + TAD FIT +SCHED3, AND C0600 /IS FIT JOB FIP OR SI? + SNA CLA + JMP SCHE11 /NO + TAD I FANCOR /IS FIP OR SI IN CORE? + AND FIT /IS IT THE PROPER PHANTOM? + AND C0600 + SNA CLA + JMP SCHE15 /NO - SCHEDULE THEIR SWAP IN + TAD I FANCOR /YES - IS THE PHANTOM IN USE? + AND C0037 /JOB # + SZA CLA + JMP SCHED9 /YES - NOT MUCH TO DO NOW + SCLOCK /LOCK PHANTOM FOR THIS JOB + TAD FIT /NO - LOCK PHANTOM FOR THIS USER + DCA I FANCOR /INDICATE THAT THIS FIELD IS NOW LOCKED + SCHED9, DCA FIT /CLEAR FIT + FANFLD /DISK ACTIVITY HERE? + JMS I SCDACT + JMP SCHE13 /YES - FORGET ABOUT PHANTOM FOR NOW + TAD I FANCOR /NO + JMP I .+1 /NOW GO FINISH BOOKKEEPING + SCHEI2 + +SCHNXA, NXTJOB +SCFIP= C0400 /FIP +SCLOCK= CLA CLL CML RTR /LOCK BIT AC=2000 +SCDACT, DSKACT +FANFLD= CLA STL RTL /PHANTOMS ALWAYS RUN IN FIELD 2 + +SCHE15, TAD I FANCOR /FANFLD LOCKED, SWAPPED, OR NOTRUN? + AND C7000 + SZA CLA + JMP SCHE13 /YES - GO FIND SOMETHING ELSE TO DO NOW + TAD I FANCOR /IS THERE CURRENTLY A USER JOB IN FANFLD? + AND C0037 /IS THERE A USER JOB IN FANFLD? + SZA CLA + JMP SCHE16 /YES, FORCE IT OUT + FANFLD /NO; FINISH:=FANFLD + JMP SCHE14 + +SCHE16, TAD I FANCOR /IS A PHANTOM IN HERE? + AND C0600 + SZA CLA + JMP SCHE13 /YES, GO FIND ANOTHER JOB TO RUN + DCA DEAD /DON'T GO LOOKING FOR AN ALTERNATIVE FIELD! + FANFLD /FORCE JOB OUT OF FANFLD + DCA FORCE + JMP SCHFR1 +SCHE10, CORE /FIRST LOOK FOR A FIELD WITH NOTHING IN IT + SWAP LOCK NOTRUN FIP SI NOHOLD CJOB + SKP /NO SUCH FIELDS + JMP SCHE19 /FOUND ONE TO USE + TAD DEAD /ARE THERE ANY OLD DEAD JOBS STILL IN CORE? + SZA + JMP SCHDED /YES - SEE IF WE CAN GET RID OF IT +SCHE18, CORE /LET'S TRY AGAIN +FIPLOK, SWAP LOCK NOTRUN CJOB + JMP SCNOUT /NO, SCAN FOR OUTPUT +SCHE19, AND C0007 /YES +SCHE14, DCA FINISH /FINISH:=FIELD # + TAD FINISH /SET SWAP BIT IN CORTBL ENTRY + TAD CORTBA + DCA SUJT2 /POINTS TO CORTBL ENTRY + STL RAR /AC=4000 (SWAP) + TAD FIT /JOB TO SWAP IN + DCA I SUJT2 /SAVE IN CORTBL + JMP I SCSWAP /SWAP IN + SCNOUT, TAD SCNSVP /RESTORE CORTBBL POINTER FOR OUTPUT SCANNING +SCHDED, DCA I SCNSV1 + CORE /SCAN FOR AVAILABLE FIELD + LOCK+NOTRUN+FIP+SI + JMP SCHE17 /ARE WE STUCK? + AND C0007 + DCA FORCE /FIELD TO SWAP OUT + TAD I SCNSV1 /PICK UP POSITION OF POINTER + DCA SCNSVP /SAVE FOR THE NEXT TIME +SCHFR1, TAD FORCE /DISC XFER IN PROGRESS? + JMS I SCDACT + JMP SCHE17 /SEE IF WE CAN TAKE ONE MORE LOOK AROUND + TAD FORCE + TAD CORTBA + DCA SUJT2 /CORTBL POINTER TO FORCED FIELD + DCA DEAD + TAD FORCE + CIA + DCA FINISH /SET FINISH=-FORCE (TO INDICATE SWAP OUT) + JMP I .+1 /NOW GO SET UP THE OUTSWAP + SWPOUT +SCHE17, TAD DEAD /CAN WE LOOK FURTHER? + SNA CLA + SCHED /NO - WE'RE STUCK + DCA DEAD /YES - GUESS WE GOT BAD ADVICE + JMP SCHE18 /GO TAKE ANOTHER LOOK + +SCSWAP, SWAPIN +SUJT2= WS0 +SCNSVP, CORTBL+1 /VALUE OF CORTBL POINTER AFTER LAST SEARCH +SCNSV1, CORTBP /POINTS TO CORTBL POINTER IN CORE SEARCH ROUTINE + + +SCHE11, TAD FIT /IS FIT JOB IN CORE? + CORE + SWAP LOCK FIP SI CJOB + JMP SCHE10 /NO - [S]HE HAS TO BE SWAPPED IN + DCA L2SF /SAVE FIELD + TAD FIT /RESTORE LEVEL 2 REGISTERS + RESJOB + DCA FIT /CLEAR FIT + START /START JOB + SWERER= C0002 /SWPRER + +SWPRET, JMP SWERR /ERROR ON SWAP + TAD CORTBA /GET A POINTER TO THIS FIELD'S + TAD FINISH /ENTRY IN CORTBL + DCA SQREQ + TAD FIT /JOB SWAPPED IN + TAD C1000 /NOT RUN BIT +SWGOD1, DCA I SQREQ /STORE IT IN THE CORTABLE + DCA FINISH + DCA FIT /SET ALL CONCERNED WORDS TO ZERO + DCA FORCE + DCA SQREQ + JMS I SWSCON /SEE IF ANY MORE DISC I/O WAITING TO BE ATTENDED TO + RSCHED /RE SCHEDULE +SWSCON, DSKCON + +SWERR, TAD FINISH /ERROR WHILE SWAPPING OUT OR SWAPPING IN? + SPA + CIA /DURING SWAP OUT + TAD CORTBA + DCA SQREQ /POINTER TO CORTBA FOR THIS FIELD + TAD FINISH + SPA CLA + JMP SWER1 /WHILE SWAPPING OUT; CODE=3 + TAD SWERER /WHILE SWAPPING IN; CODE=2 + DCA SWPER1 + TAD FIT +SWER2, AND C0037 /GET THE JOB # + SNA /IS IT A PHANTOM? + JMP SWGOD1 /YES, SO NO ERROR CODE TO SET + ERROR /NO JOB BEING SWAPPED IN SO HAVE TO SET ERROR CODE +SWPER1, 0 /ERROR CODE + JMP SWGOD1 /CLEAR ALL THE CONCERNED WORDS BEFORE LEAVING +SWER1, TAD SWER3 /ERROR CODE + DCA SWPER1 + TAD I SQREQ /JOB BEING SWAPPED OUT + JMP SWER2 +SWER3= C0003 +REMJOA, REMJOB +SCHFAN, JMS I REMJOA /REMEMBER WHO'S RUNNING + SCHED /GO RUN THE PHANTOM + /BOOTSTRAP FOR CRASH RECOVERY, USED TO BRING INIT INTO HIGHEST MEMORY FIELD +BOOT, CDF /IN THE (VERY RARE) EVEN THE SYSTEM + STA /SHOULD CRASH, THIS ROUTINE MAY + DCA I B7751 /BE STARTED AT 4200 OF FIELD 0 + DCA I B7750 /WC AND CA + TAD DSKFLD /HIGHEST FIELD + IFZERO RF08 < + DIML + CLA STL RTL + DXAL /TRACK 2 + > + IFZERO RF08-40 < + DEAL + NOP /FOR SIZE + CLA + > + DMAR + DFSC /WAIT + JMP .-1 + CIF CDF+CORMEM + JMP 0 /OFF TO INIT + +B7751, 7751 +B7750, 7750 +DSKFLD, + IFZERO RF08 + IFZERO RF08-40 + /SAVE JOB REGISTERS +/THIS ROUTINE IS USED TO SAVE THE LEVEL 2 REGISTERS +/IN THE JOB DATA AREA. AFTER SAVING THIS +/INFORMATION, JOB IS SET TO 0 TO INDICATE +/THAT NULJOB IS RUNNING +/CALL SAVJOB +/ RETURN + +SAVJO0, 0 + TAD JOB /IS NULJOB RUNNING ALREADY? + SNA + JMP I SAVJO0 /YES - NOTHING TO SAVE + AND C0600 + SZA CLA /IS A PHANTOM RUNNING? + JMP SAVJO3 /YES + TAD CJOBDA /MOVE LEVEL TWO REGISTERS TO JOB DATA AREA + GETJTA + JOBREG + DCA .+5 + BLT /MOVE PC, LINK, AC TO JOB DATA AREA + CDF /FROM FIELD 0 + L2SV0 + DATFLD + 0 + -3 +IFNZRO MQREG < + GETJTW /IF THERE'S AN MQ AND MAYBE AN EAE, SAVE THEM TOO + JOBEAE +IFNZRO CPU-1 < + CLA MQA MQL > /LOAD AC FROM MQ, CLEAR MQ +IFZERO CPU-1 < + CLA MQA > /LOAD AC FROM MQ + DATFLD + DCA I JOBSWA > /SAVE IN JOB MQ +IFNZRO EAE < + ISZ JOBSWA /GET POINTER TO JOB SC +IFNZRO CPU-2 < + SCA /GET SC + DCA I JOBSWA > /AND SAVE IT +IFZERO CPU-2 < + SCA /GET SC + CLL RTL /MAKE ROOM FOR MODE AND GT + DCA I JOBSWA /SAVE SC + DPSZ /SKIPS IF MODE B + ISZ I JOBSWA /INCR IF MODE A + SGT /CHECK GT FLAG + ISZ I JOBSWA /INCR, IF GT=0 OR IF MODE A + > > /IF MODE=A THERE MAY BE JUNK IN THE AC AT THIS POINT BUT + /BITS 7-11 ARE GUARANTEED CLEAR + + \ No newline at end of file diff --git a/tss8/system/ts8c.pal b/tss8/system/ts8c.pal new file mode 100644 index 0000000..838ac30 --- /dev/null +++ b/tss8/system/ts8c.pal @@ -0,0 +1,1294 @@ +SAVJO3, TAD JOB /DO WE HAVE A JOB #? + AND C0037 + SNA CLA + JMP SAVJO2 /NOT YET + CLA IAC /CORRECT THE CLOCK SINCE IT'S ALWAYS ONE BEHIND + TAD CLOCK /ADD IN ANY TIME [S]HE HASN'T BEEN CHARGED FOR YET + TAD JOBTIM /TO THE NUMBER OF TICKS [S]HE HAS ACCUMULATED + DCA JOBTIM /NOW IT'S OK TO PUT HIM/HER AWAY + CDF /GET POINTER TO LOW ORDER RUNTIME + GETJTW + JOBRTM + CLL + TAD JOBTIM /# TICKS [S]HE USED + DATFLD + DCA I JOBSWA /SAVE THE NEW CUMULATIVE TIME + ISZ JOBSWA + SZL /OVERFLOW INTO HIGH ORDER? + ISZ I JOBSWA /BUMP IT; WOULD NEED 16777216 TICKS FOR THIS TO SKIP!! + TAD SCHNEW /WAS THIS JOB TO HAVE A FULL SLICE? + TAD JOBTIM /ANY PART OF HIS/HER TIME SLICE STILL LEFT? + SPA SNA CLA + JMP SAVJO2 /YES, SO THIS JOB IS NOT A COMPUTE BOUND JOB AT THIS STAGE + TAD I CJOBDA + IAC /STR0 + IOR /MAKE HIM/HER COMPUTE BOUND + JCOMBD +SAVJO2, DCA JOB /SIMULATE NULJOB + DATFLD + DCA I CJOBDA /CLEAR POINTER TO CURRENT JOB DATA AREA + CDF + JMP I SAVJO0 /AND EXIT + +RUNULL, SCHNUL +DEBUG, /RESTART FOR DEBUGGING +IFZERO DC08A < + IFZERO CPU-1 < /SET PDP-8 CLOCK COUNT + STA + CCF CLB > +IFNZRO CPU-4 +IFZERO CPU-4 > +IFNZRO DC08A < T1ON > /TURN ON DC08 CLOCK +IFZERO D689-4 < EDF > /REENABLE DATA PHONES + DCA SCHNEW /ENABLE SCHEDULER TO BUMP NULL JOB + JMP I RUNULL + *3200 + +/PROCESS KEYBOARD INPUT CHARACTERS (MAY BE PSEUDO-INPUT) + +/MULTI-FIELD ROUTINE +/CALL: CHARACTER IN "TTCHAR" +/ JMS KBD +/ DEVTBL POINTER +/ RETURN; NO ROOM - CHARACTER NOT STORED +/ RETURN; CHARACTER STORED +/ +KBDCNT=WS2 +KBDSIB, -212 /DO NOT MOVE FROM BEGINNING OF A PAGE - SEE "DUPSI" +IFNZRO KBDSIB&177 + +KBD00, 0 + TAD I KBD00 /GET DEVTBL POINTER + DCA CONDBA + RDF + TAD C6203 + DCA KBDNSX /REMEMBER FROM WHENCE WE CAME + ISZ KBD00 + DATFLD + TAD I CONDBA /GET DDB ADDRESS + DCA CONDDB +KBDSQ, JMS I KBDCON /CHECK ^S/^Q; (ISZ CONDBA IF FEATURE DISABLED) + TAD I CONDDB /YES - GET DDB STATUS + AND C0100 + SZA CLA /"SICOM" SET? + JMP KBDNSX /YES - EXIT + TAD TTCHAR /CHECK FOR ^B, ^C + TAD KBDMCB + CLL RAR + SZA CLA /IS IT ^B OR ^C? + JMP KBD05 /NOTHING SPECIAL ABOUT THIS ONE + TAD CONDDB + JMS I KBDCLB /CLEAR HIS/HER INPUT BUFFER + TAD TTCHAR + RAR + SNL CLA /WAS IT ^B OR ^C? + JMS I KBDCHK /WAS ^B TYPED IN USER MODE? + JMP KBD04 /CLEAR OUTPUT + TAD I CONDDB + TAD C1000 /PUT THIS TTY IN SI MODE + DCA I CONDDB + KBD02, TAD KBDUPA + DCA TTCHAR /CHANGE TO ^ + CDF + PRINT /STASH "^" IN HIS/HER OUTPUT BUFFER + "B /WE DON'T CARE IF "PRINT" FAILS + TAD .-1 + DCA TTCHAR /CHANGE TO B +KBD01, CLL STA RTR + RTR + DATFLD + AND I CONDDB /CLEAR "FULL" STATUS + DCA I CONDDB +KBD03, TAD I CONDDB /GET DDB STATUS BITS + AND DUPSI + ISZ CONDDB + SZA CLA /DUPLEX OR SI MODE? + TAD I CONDDB + SNA CLA /AND LOGGED IN? + JMP KBDXIT /NO - SO DON'T ECHO + CDF + PRINT /STASH (TTCHAR) IN HIS/HER OUTPUT BUFFER +KBDUPA, "^ /WE DON'T CARE IF "PRINT" FAILS +KBDXIT, ISZ KBD00 /SHOW SUCCESS +KBDNSX, .-. /BACK TO THE CALLING FIELD + JMP I KBD00 +KBD04, TAD I CONDBA + JMS I KBDCLB /CLEAR THE OUTPUT BUFFER + TAD TTCHAR + RAR + SNL CLA /WAS IT ^B OR, OR ^C? + JMP KBD02 /IT WAS ^B + JMS I KBDCHK /USER MODE? + JMP KBDSSI /NO, GO TO SI FOR DOT OR ^B + JMP I KBDCCA /YES, GO DO ^C BUSINESS +KBD05, TAD C7770 /IS THERE PLENTY OF FREE CORE? + TAD FRECNT + SPA CLA + JMP KBDNSX /NO + JMS I KBDCHK /WHICH MODE? + JMS I KBDLRA /SI - CHECK FOR LINE-FEED AND RUBOUT + TAD I CONDDB + AND C0400 /"FULL" FLAG SET? + SZA CLA + JMP KBDNSX /YES - EXIT + TAD CONDDB + STORE /STASH (TTCHAR) IN HIS/HER INPUT BUFFER + KBD06 /FOR SIZE CHECK + JMP KBDNSX /STORE FAILED; BUFFER ALREADY FULL + JMS I KBDCHK /WHICH MODE? + JMP KBD08 /SI + STL RTL /AC=2 + TAD CONDDB /POINT TO BREAK MASK + DCA KBDCNT + TAD I KBDCNT /GET THE BREAK MASK + JMS I BRKTSA /IS IT A BREAK CHARACTER? + JMS I KBDBRK /GO SET DEL BIT IN STR1 AND PUT HIS/HER JOB NUMBER IN BONUS + DATFLD + JMP KBD03 /SEE IF WE SHOULD ECHO + KBDBRK, KBDDLM +KBDCCA, GIR9 +KBDLRA, KBDLRB +DUPSI, +KBD08, TAD KBDSIB /USED AS CONSTANT (MASK) SEE "KBD03+1" + TAD TTCHAR + AND KBDSIM + SZA CLA /IS THIS A BREAK FOR SI? + JMP KBD03 /NO +KBD11, ISZ COMCNT /TO SCHEDULE "SI" + TAD I CONDDB + TAD C0100 /SET "SICOM" + DCA I CONDDB /SAVE NEW KEYBOARD STATUS + JMP KBDXIT /EXIT WITHOUT ECHOING THE DELIMITING CHARACTER + +KBDCON, CONSQ +BRKTSA, BRKTST +KBDMCB, -"B+100 /-^B +KBDCLB, CLRBUF +KBDCHK, KBDMOD +KBD09, TAD CONDDB + TAD C0005 + DCA KBDCNT /POINTS TO CHARACTER COUNT IN DDB + TAD I KBDCNT + CIA + DCA KBDCNT /NUMBER OF CHARACTERS TO SPIN THROUGH THE BUFFER + DCA WS0 /FAKE HIS/HER BREAK MASK TO ZERO +KBD10, TAD CONDDB + FETCH /FETCH A CHARACTER + JMP KBDSSI /BUFFER EMPTY + DCA TTCHAR /SAVE IT + ISZ KBDCNT /RUB THIS ONE? + SKP + JMP KBD03 /YES - PRINT IT + TAD CONDDB + STORE /NO - PUT IT BACK + ALLOK /NO LIMIT +KB0040, DECHO /NOP /CAN'T FAIL + JMP KBD10 + +KBDSIM, /THE FOLLOWING INSTRUCTION IS USED AS A CONSTANT +KBDSSI, TAD KB0040 /SET "DECHO"; SCHEDULE SI TO PRINT CURRENT LINE + JMP KBD11 /PRECEDED BY EITHER "." OR "^B" + +IFNZRO KB0040&177-174 + *3400 + +/KEYBOARD IOTS + +/SEE IF THE USER IS GOING TO EXECUTE A "JMP .-1" AFTER A NON-SKIPPING "KSF" + +JMPTST, TAD UUOADD /ADDRESS OF THE "KSF" + AND C0177 /JUST THE PAGE ADDRESS BITS + TAD C5200 /MAKE UP THE REQUIRED "JMP" INSTRUCTION + CIA + UDF /SELECTS USER'S FIELD + TAD I L2SV0 /USER'S INSTRUCTION + DATFLD + SNA + JMP JMPTS1 /WE CAUGHT HIM/HER! + TAD C0200 /MAYBE IT'S A PAGE 0 "JMP" + SZA CLA + JMP JMPTS0 /NO - MUST BE SOMETHING ELSE - LET HIM/HER CONTINUE + TAD CC7600 /WILL WE BE ON PAGE 0? + AND UUOADD + SNA CLA +JMPTS1, TAD UKEYFL /PUT HIM/HER TO SLEEP - SO [S]HE DOESN'T WASTE OUR TIME +JMPTS0, DCA UKEYC /SAVE WAIT CCONDITION + STL RTR + AND I CONDDB + SNA CLA /NEED XON? + JMP JMPTS2 /NO + TAD UKXON + DCA TTCHAR + ISZ CONDBA /POINT TO OUTPUT SIDE + CDF + PRINT /SEND XON + WAIT /DIDN'T FIT - TRY AGAIN LATER + CLL STA RTR + DATFLD + AND I CONDDB /CLEAR XOFF BIT + DCA I CONDDB +JMPTS2, TAD UKEYC /WAIT FOR FLAG; EXCEPT KSF WITHOUT JMP .-1 + UUOEXT + +IFNZRO JMPTST&4177 +UKL2SA, L2SA +UKEY0A, UKT0 +UKEY1A, UKT1 + +UKWAIT, STA /BACK UP HIS/HER PC + TAD L2SV0 + DCA L2SV0 + JMP JMPTS1 /SEE IF XON SHOULD BE SENT + +UKXON, 221 + UKEY, JMS I UKEY0A /MAKE SURE [S]HE'S NOT IN SI MODE + JMS I UKEY1A /WHAT DOES [S]HE WANT TO DO? + JMP UKEYRS /READ STRING +UKEYFL, JSDEL JSERR /DELIMITER FLAG OR ERROR FLAG +C5200, JMP JMPTST /MAKE SURE [S]HE'S NOT HANGING ON "JMP .-1" + RAR + SPA CLA + DCA L2SA /KCC - CLEAR AC + SNL CLA /IS KRB OR KRS REQUESTED? + UUOEXT /NO - ALL DONE + DATFLD + TAD CONDDB + FETCH /GET A CHARACTER FROM THE BUFFER + JMP UKWAIT /NONE AVAILABLE + DCA UKEYC /SAVE CHARACTER + TAD UKL2SA /OR INTO USER'S AC + CDF + IOR /IT WOULD PROBABLY BE ADEQUATE TO JAM IT INTO HIS/HER AC +UKEYC, 0 + UUOEXT /AND BACK TO USER + +UKREAD, 0 + DCA WS0 /SAVE THE BREAK MASK + TAD L2SA /POINTS TO PARAMETERS IN USER AREA + IAC + DCA WS1 /ADDR OF USER BUFFER POINTER + UDF + TAD I WS1 /USER BUFFER ADDRESS + DCA AXS2 +UKEYR1, DATFLD + TAD CONDDB + FETCH /GET A CHARACTER + JMP I UKREAD /THEY'RE FRESH OUT + UDF /SELECT USER FIELD + DCA TTCHAR + TAD TTCHAR + DCA I AXS2 + ISZ I WS1 /UPDATE USER POINTER +MRUB, -377 /NOP + TAD WS0 /IS IT A DELIMITER? + ISZ I L2SA /DONE? + JMS BRKTST + CLA SKP /WE'RE FINISHED + JMP UKEYR1 /BACK FOR MORE + DCA L2SA /CLEAR AC + ISZ UKREAD /SKIP ON RETURN + JMP I UKREAD + /READ INPUT STRING + +UKEYRS, DATFLD + STL RTL + TAD CONDDB /ADDRESS OF DDB + DCA WS0 /POINTS TO BREAK MASK + TAD I WS0 /GET BREAK MASK + JMS UKREAD /READ STRING + JMP UKWAIT /WAIT FOR HIM/HER TO TYPE SOME MORE + UUOEXT + +BRKTST, 0 + CDF + SPA SNA + JMP BRKTS2 + DCA WS0 /SAVE THE BREAK MASK + TAD BRKTBA /ADDRESS OF BREAK TABLE + DCA AXS1 + TAD TTCHAR /CHARACTER TO COMPARE WITH TABLE +BRKTS1, ISZ AXS1 /SKIP OVER MASK + TAD I AXS1 /-HIGH END OF RANGE + CLL + TAD I AXS1 /+NUMBER OF CHARACTERS IN THIS RANGE + SNL + JMP BRKTS1 /NOT IN THIS GROUP +CC7600, CLA 400 /WE FOUND IT + TAD I AXS1 /GET THE MASK + AND WS0 /COMPARE IT WITH OUR MASK +BRKTS2, SNA CLA /IS IT A BREAK CHARACTER? + ISZ BRKTST /NO + JMP I BRKTST +BRKTBA, BRKTBL-2 + +MLF, 377-212 +KBD09A, KBD09 + +KBDLRB, 0 + TAD MRUB + TAD TTCHAR + SNA + JMP I KBD09A /RUBOUT + TAD MLF + SZA CLA + JMP I KBDLRB /NORMAL CHARACTER + JMP I .+1 /LINE-FEED + KBDSSI + *3600 + +IFZERO CPU-2 < /TEMPORARY POWER FAIL HANDLER FOR 8/E +POWINT, CLA + DCA 0 /CLEAR LOCATION 0 SO WE'LL FALL THROUGH IT + + TAD POW2 /CLOBBER LOCATION 2 (C0200) SO WE'LL COME TO "POWST" + /WHEN THE JUICE RETURNS + + DCA 2 + HLT /POWER FAILURE; WILL START AT POWST WHEN POWER COMES UP + +POW2, POWST + +POWST, DCA WS1 + ISZ WS0 /WE DELAY ABOUT A MINUTE TO MAKE SURE + JMP .-1 /THE DISK IS UP TO SPEED + ISZ WS1 + JMP .-3 + JMP I .+1 /NOW GO CALL INIT + BOOT + +USGT, SGT /SKIP ON PDP-8/E GREATER THAN FLAG (EAE) + UUOEXT + JMP I .+1 /CAUSE SKIP ON RETURN + UUOEX2 +> +IFNZRO CPU&7776 < +UGTF, SGT /PDP-8/E "GET FLAGS" SIMULATOR + SKP + STL RTR /POSITION OF GT FLAG + TAD L2SVLK /AND GIVE HIM/HER THE LINK + DCA L2SA + UUOEXT + +URTF, CLA STL IAC RTR /AC=6000 + AND L2SA /SAVE ONLY LINK AND GT BITS OF HIS/HER AC + RTF /RESTORE AS REQUESTED + CLA RAR /FETCH NEW LINK + DCA L2SVLK /SAVE FOR THE USER + UUOEXT +> + IFNZRO DC08A < +DC08B= DC08A+4%5 +T8FITH, -DC08B +T8TTIA, T8TTI +T8LC, -1 +T8SF, 0 +T8SV0, 0 +T8SVLK, 0 +T8SA, 0 +T8FLG, 0 +T8CNT0, -1 /SO IT WILL INITIALIZE ITSELF THE FIRST TIME IT'S USED +T8CNT1, 0 +T8CNT2, 0 +T8N5, -5 +T8OBA, SKPTBL+PT08+KL8+2 +T8OBF, 0 +T8NLN, -DC08A +T8LINE, DC08LO-SKPTBL-PT08-KL8-2 +RESTA, RESTOR +T8SFA, T8SF +T8BF2, OUTREG-SKPTBL-1 +T8TMP, 0 +T83000, 3000 +TTOFLD, TTOFLG +T8RTN, DISMI2 +T8DIS, T1ON /RE-ENABLE THE CLOCK + ISZ T8LC + JMP I T8RTN /ALREADY SERVICING DC08 + DCA T8SA /SAVE AC + RAR + DCA T8SVLK /AND LINK + TAD 0 + DCA T8SV0 /AND PC + RIB + DCA T8SF /FIELD & MODE + DCA T8FLG /CLEAR DC08A LEVEL 2 SERVICE FLAG +T8IN, TAD T8FITH + TTCR TTLR /LIMIT INPUT TO 1/5 OF THE LINES + DCA T8CNT2 /SAVE ALSO AS THE OUTPUT LINE COUNT + ION + CIF DATFLD + JMP I T8TTIA /TAKE A PASS THROUGH THE TTI STRING + /RETURNS HERE AFTER SERVICING INPUT SIDE (TTI'S) +T8OUT1, ISZ T8CNT0 /BUMP DIVIDE BY 5 COUNTER + JMP T8OUT2 /CONTINUE CURRENT PASS + TAD T8N5 + DCA T8CNT0 /RESET MAJOR COUNTER + TAD T8OBA + DCA T8OBF /RESET OUTPUT BUFFER POINTER + TAD T8NLN + DCA T8CNT1 /RESET TOTAL NUMBER OF LINES COUNTER +T8OUT2, TAD T8CNT1 + SMA CLA /ANYTHING LEFT THIS PASS? + JMP T8EXT /NO + TAD T8LINE /LINE NUMBER TO START AT + TAD T8OBF /COMPUTED FROM CURRENT BUFFER POSITION + TTCL TTLL /LOAD IT INTO THE DC08A + CLA +T8OUT3, TAD I T8OBF /BITS TO BE OUTPUT + SZA + JMP T8OUT5 /MUST BE SOMETHING THERE + TTIL /NOTHING - JUST BUMP THE LINE NUMBER +T8OUT4, ISZ TIOBF /BUMP THE BUFFER POINTER + ISZ T8CNT1 /AND THE TOTAL LINE COUNT + SKP + JMP T8EXT /FINISHED + ISZ T8CNT2 /CURRENT PASS COCUNT + JMP T8OUT3 /ONTO THE NEXT LINE +T8EXT, IOF + STL STA /DECREMENT THE INTERRUPT COUNT + TAD T8LC + DCA T8LC + SNL /ALL ACCOUNTED FOR? + JMP T8IN /NO - MAKE ANOTHER ROUND + TAD T8FLG /DOES THE DC08 REQUIRE LEVEL 2 + TAD L2Q /OR SOMETHING ELSE? + CIA + TAD L2QE + AND T8SF /ALLOW "L2EXIT" ONLY IF FROM USER MODE + AND C0100 + SZA CLA /HOW SHOULD WE EXIT? + JMP T8EXIT /VIA L2EXIT + TAD T8SFA /BACK TO WHERE WE CAME FROM + CDF + JMP I RESTA + /MOVE THE ACTIVE REGISTERS OVER TO LEVEL 2 +T8EXIT, TAD T8SVLK /THE LINK + DCA L2SVLK + TAD T8SA /THE AC + DCA L2SA + TAD T8SV0 /THE PC + DCA L2SV0 + TAD T8SF /FIELDS & MODE + DCA L2SF + EXIT +T8OUT5, TTO TTIL /OUTPUT A BIT + SZA + JMP T8OUT8 /SAVE THE REMAINING BITS FOR NEXT TIME +T8OUT6, TAD T8OBF /OUR POSITION + TAD T8BF2 /MINUS THE OFFSET + DCA T8TMP /SECOND BUFFER + TAD I T8TMP + RAR + SNL /ANYTHING WAITING? + JMP T8OUT7 /NO + AND C0377 + CLL RAL + TAD T83000 /NOW THE STOP BITS & START BIT ARE IN PLACE + DCA I T8OBF /SAVE IT TO BE OUTPUT NEXT TIME + STL IAC RTR + DCA I T8TMP /SET BOTH HARDWARE BUSY AND SERVICE FLAGS + CDF + DCA I TTOFLD /SET "CONOUT" FLAG + DATFLD + ISZ T8FLG /SCHEDULE LEVEL 2 FOR US + JMP T8OUT4 +T8OUT7, STL CLA RAR + AND I T8TMP + DCA I T8TMP /CLEAR EVERYTHING EXCEPT SERVICE FLAG +T8OUT8, DCA I T8OBF + JMP T8OUT4 + +T8IN1, 0 + IOF + DCA I ACX11 /STASH IT IN THE RING BUFFER + TTRL + TAD T8BASE /MAKE DC08A LINE NUMBER = KXX + JMS I T8INPA /FINISH HOUSE-CLEANING + ISZ T8FLG /SCHEDULE LEVEL 2 + CIF DATFLD + JMP I T8IN1 /BACK TO FIELD 1 +T8BASE, PT08+KL8-DC08LO+1 +T8INPA, ACINT9 +>/END OF FIELD 0 DC08A CODE + *4000 + +/ THIS WILL RUN A "ROUND ROBIN" OF CORE RESIDENT JOBS + +NXTCO1, DCA SCHNEW /ANY JOB STARTED FROM HERE MAY BE THROWN OFF +NXTCOR, ISZ NXTCNT /HAVE WE CHECK ALL ENTRIES? + TAD NXTCNT + SMA SZA CLA + JMP I NXTNUL /YES; NOTHING RUNNABLE EXCEPT NULL JOB +NXTCO2, ISZ NXTCOP /BUMP CORTBL POINTER + TAD NXTCOP /ARE WE PAST THE END OF THE TABLE? + TAD I NXTEND + SZA CLA /? + JMP .+3 /NOT YET + TAD FANCOR /YES, START AT THE BEGINNING AGAIN + DCA NXTCOP /ALL SET + TAD I NXTCOP /GET CORTBL ENTRY + SNA /IS THERE ANYTHING IN THERE? + JMP NXTCO4 /NO; CLEAR DEAD JOB POINTER (A FREE FIELD IS BETTER) + AND C6600 /IS IT BEING SWAPPED, LOCKED, OR A PHANTOM? + SZA CLA + JMP NXTCOR /YES - SO IT'S NOT A USEFULL FIELD NOW + TAD I NXTCOP + AND C0037 + RUNABL + JMP NXTCO3 /NOT RUNNABLE + TAD I NXTCOP /TRY TO RUN THIS ONE + AND C0037 /GET JOBTBL INDEX + TAD JOBTBA /GET POINTER TO JOB DATA + GETJTI /GET VALUE OF STR0 + JOBSTS + AND C0107 /DOES [S]HE WANT TO RUN FIP OR SI FOR ERROR? + SZA CLA + JMP NXTCOR /HAVE TO WAIT 'TIL LATER + TAD I NXTCOP + JMP I .+1 /GO RUN THIS ONE + SCHEI2 +NXTCO3, STA + TAD NXTCOP /POINTER-1 OF DEAD JOB + DCA DEAD /SAVE IT + TAD NXTCOP + TAD NXTFLD /FIELD INDEX ONLY + JMS I NXTDSK /IS THERE DISK ACTIVITY IN THIS FIELD? +NXTCO4, DCA DEAD /YES; SO [S]HE'S NOT REALLY DEAD-WOOD THEN + JMP NXTCOR /KEEPLOOKING +NXTNUL, SCHNUL +NXTFLD= C1000 /-CORTBL+1 +NXTDSK, DSKACT +NXTCOP, CORTBL+1 /ROUND ROBIN CORTBL POINTER +NXTEND, CORTBE /END OR CORTBL +C0107, 107 +C6600, SWAP+LOCK+FIP+SI + UHALSA, L2SA +UHALT, TAD UUOCAL /IS IT AN OSR? + AND C0004 + SNA CLA /OSR? + JMP UHALT1 /NO + CDF + GETJTW /YES, GET CURRENT VALUE OF SWITCHES + JOBSWR + DCA UHALT2 /OR IT INTO AC + TAD UHALSA /WHICH IS RIDICULOUS, SINCE OSR + IOR /IS UNIVERSALLY CODED AS LAS, AND +NXTCNT, +UHALT2, 0 /A SIMPLE "DCA L2SA" WOULD DO +UHALT1, TAD UUOCAL /NOW SEE IF IT WAS MICROCODED + AND C0002 /HALT? + SNA CLA + UUOEXT + JMS I USBCSI /LOCATE HIS/HER DDB AND SEE IF [S]HE'S IN SI MODE + TAD FRECNT /USER HAS EXECUTED HLT + TAD C7770 + SPA SNA CLA /IF WE'RE SHORT ON FREE CORE, TRY LATER + REDO + GETJTW /CLEAR HIS/HER RUN BIT + JOBSTS + AND C3777 /CLEAR JSRUN + DATFLD + DCA I JOBSWA + TAD CONDBA /CONDBA WAS SET UP BY THE JMS TO UKT0 + JMS UHLTMS /NOW TYPE ^BS FOR HIM/HER + WAIT + +UHLTMS, 0 + DCA UHLTM1 /SET DEVTBL POINTER + RDF + TAD UHMES /EITHER TYPE ^BS OR ^BS;K + DCA AXS2 + CDF +UHLTM0, TAD I AXS2 /GET A CHARACTER + SPA SNA + JMP UHLTM2 /END OF TEXT + DCA TTCHAR /SAVE IT + KEY /RUN IT INTO HIS/HER INPUT BUFFER +UHLTM1, .-. + NOP + JMP UHLTM0 /GET ANOTHER ONE +UHLTM2, SZA CLA /WHERE DID WE COME FROM? + CIF DATFLD /BACK TO 689 SERVICE + JMP I UHLTMS + + UHMES, . + "B-100 + "S + "; + "K + 215 +C7377, 7377 +USBCLR, CLRBUF +USBFLG, CLSTR1 + "B-100 + "S + 213 + 0 +USBCSI, UKT0 + +/SELECTIVE BUFFER CLEAR +USBC, JMS I USBCSI /CHECK FOR SI MODE + DATFLD + TAD L2SA + CLL RAL + SMA CLA /CLEAR INPUT BUFFER? + JMP USBC3 /NO + TAD CONDDB /INPUT DDB ADDRESS + JMS I USBCLR /CLEAR INPUT BUFFER + TAD C0100 + JMS I USBFLG /CLEAR FLAG + TAD I CONDDB + AND C7377 /CLEAR FULL BIT + DCA I CONDDB +USBC3, TAD L2SA /WHAT IS REQUESTED? + SMA CLA /CLEAR OUTPUT BUFFER? + JMP USBC4 /NO + ISZ CONDBA /POINT TO OUTPUT SIDE + TAD I CONDBA + JMS I USBCLR /CLEAR OUTPUT BUFFER +USBC4, DCA L2SA /CLEAR HIS/HER AC + UUOEXT + + + + + + + +*4200 + +/STANDARD BOOTSTRAP AND RESTART ADDRESSES + + JMP I .+2 /INIT BOOTSTRAP + JMP I .+2 /RESTART ADDRESS + BOOT + DEBUG + FILERC, 0 /ROUTINE TO RECOVER FROM DISK ERRORS +FILUSA, 0 /AND SET ERROR CODES FOR USER +FILEWC, 0 /ERROR CODES ARE: +FILER1= WS2 / 1 PARITY + / 2 END OF FILE + / 3 FILE NOT OPEN + / 4 PROTECTION VIOLATION +FJSF3, -JSF3-1 +FILECA= C0004 /FILPCA +FILECT= C0007 /FILPCT +FILEIF= C0002 /FILPIF +C6000, 6000 +FILERR, 0 + DCA FILERC /ERROR CODE + CLL CLA CMA RAL /AC:=-2 + TAD FILERC /ERROR CODE - .GT.2? + SPA SNA CLA /PROTECTED OR NOT OPEN? + JMP FILER2 /NO + GETJTW /GET ADDRESS OF PARAMETER BLOCK + JOBLNK + RETBLK /RETURN IT TO FREE CORE + CLA + TAD L2SA /GET POINTER TO PARAMETERS IN USER AREA + TAD F0005 + DCA FILERR /POINTS TO SIXTH USER PARAMETER (ERROR CODE) + TAD FILERC /GET ERROR + UDF /SELECT USER FIELD + DCA I FILERR /PASS ERROR TO USER + CDF + DCA L2SA /CLEAR HIS/HER AC + UUOEXT /AND BACK TO HIM/HER + +FILER2, TAD I FILERR /END OF FILE OR PARITY ERROR... + TAD FILEIF /GET ADDRESS OF FILE PARAMETER BLOCK + DCA FILER5 /POINTS TO WORD 3 OF BLOCK + DATFLD + TAD I FILER5 /WAS FILE CALL ORIGINATED BY SI? + AND C6000 /BITS 0-1 WILL BE SET IF SO... + SNA CLA + JMP FILER4 /NO - IT CAME FROM USER PROGRAM + TAD I FILER5 /YES - GET FIELD # FOR TRANSFER + RTR + AND C0007 /MASK OUT FILE # BITS + TAD CORTBA /INDEX INTO CORTBL + DCA FILUSA /SAVE POINTER TO CORTBL ENTRY FOR THIS TRANSFER + CDF + TAD I FILUSA /GET CORTBL ENTRY + AND C0037 /EXTRACT JOB # + DCA FILUSA /SAVE JOB # + CLL CMA RAL /AC=-2 + TAD FILERC /IS IT AN END OF FILE? + SNA CLA + JMP FILER3 /YES; WE'RE ALMOST DONE THEN + TAD FILERC /NO - WAS THERE ANY ERROR AT ALL? + SNA CLA + JMP FILER3 /NO + TAD FILUSA /PARITY ERROR - SET SYSTEM ERROR CODE IN STR0 + ERROR +F0005, DSKERR +FILER3, ISZ FILERR /INDEX PAST CALLING ARGUMENT + CDF + JMP I FILERR /AND BACK + + + +FILER4, TAD I FILER5 /UPDATE USER CONTROL TO INDICATE ERROR CODE + RAL /SHIFT FIELD # INTO BITS 6-8 + AND C0070 /SAVE IT + TAD FILCDF /GENERATE "UDF" + DCA FILER5 /USER FIELD SELECT + CDF + TAD I FILERR /PARAMETER BLOCK ADDRESS + DCA FILEWC /SAVE IT + TAD FILEWC + DATFLD + TAD FILECA + DCA FILER1 /POINTS TO CORE ADDRESS IN PARAMETER BLOCK + TAD I FILER1 /GET CORE ADDRESS + DCA FILER1 /SAVE IT + TAD FILEWC /START OF PARAMETERS + TAD FILECT /+7 + DCA FILUSA /POINTS TO PTR TO FILE CONTROL + TAD I FILUSA /GET ADDRESS OF FILE CONTROL + TAD C0006 /POINTS TO WORD COUNT IN FILE CONTROL + DCA FILEWC /SAVE IT + TAD FILEWC + IAC + DCA FILUSA /POINTS TO POINTER TO USER PARAMETERS + TAD I FILUSA /GET POINTER TO USER ARGUMENTS + DCA FILUSA /SAVE + TAD I FILEWC /GET WORD COUNT TO GO FROM CONTROL BLOCK +FILER5, 0 /SELECT USER FIELD + DCA I FILUSA /SAVE IN USER AREA + ISZ FILUSA /POINTS TO WORD 4 OF USER ARGUMENTS + TAD FILER1 /GET LATEST CORE XFER ADDRESS + DCA I FILUSA /SAVE FOR USER + ISZ FILUSA + ISZ FILUSA /POINTS TO WORD 6 (ERROR WORD) + TAD FILERC /GET ERROR CODE + DCA I FILUSA /PASS ON TO USER +FILCDF, CDF + JMP FILER3 /AND BACK + BRKTBL, -"Z-1 /LETTERS + "Z-"A+1 + 2000 + + "A-"9-1 /NUMBERS + "9-"0+1 + 1000 + + "0-211-1 /HORIZONTAL TAB + 211-211+1 + 0400 + + 211-215-1 /LF, VT, FF, CR + 215-212+1 + 0200 + + 212-";-1 /! @ # DOLLAR % & ' ( ) * + , - . / : ; + ";-"!+1 + 0100 + + "!-240-1 /SPACE + 240-240+1 + 0040 + + 240-"@-1 /< = > ? @ + "@-"<+1 + 0020 + + "<-"_-1 /[ \ ] _ + "_-"[+1 + 0010 + + "[-377-1 /RUBOUT + 377-377+1 + 0004 + + 377-376-1 /ALTMODE + 376-375+1 + 0002 + + 375-377-1 /EVERYTHING ELSE + 377-0+1 + 0001 + *4400 + +/RFILE AND WFILE IOTS + +UFILE, TAD UFILWA /NO, GET USER PARAMETERS + JMS I UFPARM /AND MOVE TO PARAMETER BLOCK + TAD I UFLNKA /ADDRESS OF PARAMETER BLOCK + TAD UFIPIF + DCA UFPARA /POINTS TO WORD 3 OF BLBOCK + DATFLD + TAD I UFPARA /CLEAR ALL BUT FILE # IN BLOCK + AND C0003 + DCA I UFPARA /SAVE IT + TAD L2SA /ADDRESS OF USER PARAMETERS + TAD UFIPWC /+2 + DCA UFILE1 /POINTS TO WORD COUNT IN USER AREA + TAD I UFPARA /FILE # +SIFIL1, CDF + TAD UFJF0 /RELATIVE ADDRESS OF FILE 0 POINTER + DCA UFJOBF /RELATIVE ADDR OF FILE POINTER FOR THIS FILE + GETJTW +UFJOBF, 0 /POINTER TO FILE CONTROL INFO + SNA + JMP UFILER+1 /FILE NOT OPEN + DCA UFJOBF /SAVE POINTER TO FILE CONTROL + DATFLD + TAD I UFPARA /FILE # + JMS I UFIGJF /GENERATE CORRESPONDING FILE BIT IN STR1 + DCA UFIJSF /FILE STATUS FLAG + TAD L2SF /USER'S FIELD # + AND C0007 + CLL RTL /*4 + DCA JOBSWA /SAVE + TAD I UFPARA /GET FILE # + ORIGINATING STATUS INFO + AND C7743 /CLEAR FIELD # + TAD JOBSWA /SET FIELD # + DCA I UFPARA /SAVE IN PARAMETERS + TAD UFJOBF /SAVE GLOBAL PARAMETERS + IAC /POINTS TO WORD 2 OF CONTROL BLOCK + DCA AXS1 /CONTROL INDEX + CLL CLA CMA RTL /AC:=-3 + TAD UFPARA + DCA AXS2 /PARAMETER INDEX POINTS TO START OF PARAMETERS-1 + TAD I AXS2 /WRITE AND PROTECTED? + AND I AXS1 + AND C0004 /CHECK ONLY FOR WRITE PROTECT + SZA CLA + JMP UFILER /YES - ERROR + TAD AXS2 /NO, SET FILPAR = START OF PARAMETER BLOCK + DCA I AXS1 + TAD I AXS2 /DISC EXTENSION FROM PARAMETERS + DCA I AXS1 /TO CONTROL BLOCK + ISZ AXS2 /SKIP FIELD + TAD I AXS2 /SAVE WC + DCA JOBSWA + ISZ AXS2 /SKIP CORE ADDRESS FOR NOW + TAD I AXS2 /DISC ADDRESS + DCA I AXS1 /TO CONTROL BLOCK + TAD UFIRET /RETURN ADDRESS + DCA I AXS2 /TO PARAMETER BLOCK + TAD UFJOBF /POINTER TO FILE CONTROL + DCA I AXS2 /TO PARAMETER BLOCK + TAD JOBSWA /WORD COUNT + DCA I AXS1 /TO CONTROL BLOCK + TAD UFILE1 /POINTS TO WC IN USER AREA + SNA /IS THIS AN SI REQUEST? + JMP .+3 /YES + DCA I AXS1 /NO, SAVE POINTER TO WC IN CONTROL BLOCK + DCA L2SA /CLEAR USER AC + TAD UFJOBF /POINTER TO CONTROL BLOCK + TAD UFPAR2 /+3 + DCA UFILPA /POINTS TO POINTER IN CONTROL BLOCK POINTING TO PARAM. BLOCK + TAD UFJOBF /POINTS TO FILE CONTROL + JMS I UFILIX /GET SEGMENT INDEX + JMP I UFIL4A /NOT IN CORE - DO A WINDOW TURN + JMP UFILE2 /NON-EXISTENT DISC ADDRESS + JMS I UFICTB /OK, SET UP TRANSFER BLOCK - POINTER TO SEGMENT # IN AC +UFILPA, 0 /POINTER TO FILPAR + TAD I UFILPA /ADDRESS OF PARAMETERS + JMS I UFIQUE /QUEUE THE REQUEST IN DSUTBL + ISZ DSBUSY /DISC BUSY? + SKP /YES + JMS I FIUSER /NO, START TRANSFER + TAD UFIJSF /CLEAR FILE STATUS BIT + UUOEXT /EXIT + +SIFILE, DATFLD /HANDLE SI FILE TRANSFERS + TAD UFIPIF + DCA UFPARA /POINTS TO FILE # IN PARAMETERS + DCA UFILE1 + TAD I UFPARA /GET FILE # + AND C0003 /ONLY FILE # + JMP SIFIL1 /REST IS SAME AS USER PROGRAMS + UFILE2, GETJTW /NON-EXISTENT DISK ADDRESS + JOBLNK /GET ADDRESS OF PARAMETERS + DCA UFILE1 /SAVE IT + JMP .+3 +UFILER, IAC /PROTECTED + IAC /NOT OPEN + TAD C0002 /EOF + CDF + JMS I UFERR /FILE ERROR ROUTINE +UFILE1, 0 /POINTS TO PARAMETER BLOCK + TAD UFILE1 + RETBLK /RETURN PARA BLK + CLA + TAD CURJOB /DID WE BUMP SOMEONE ELSE OFF? + SZA CLA + WAIT /YES - GO BACK TO HIM/HER + UUOEXT /NO - BACK TO THIS USER + +UFPARA= WS0 /ADDR OF USER PARAMETERS +UFIJSF= WS1 /FILE STATUS FLAG +C7743, 7743 +UFILWA, UFILCT +UFJF0, JOBF0 +UFPAR2= C0003 /FILPAR +UFIPIF= C0002 /FILPIF +UFIPWC= C0002 /FILPWC + +UFPARM, GETUSP +UFLNKA, UUOLNK +UFERR, FILERR +UFILIX, FILIX +UFIRET, DSURET +UFICTB, FILCTB +UFIGJF, GETJFX +UFIQUE, DSQUE +UFIL4A, UFILE4 + +RKL20, CIF DATFLD-1 + JMP I .+1 + RKL21 + /RETURN CONTENT OF JOB STATUS FOR CURRENT JOB +/CALL +/ GETJTW +/ RELATIVE ADDRESS OF WORD +/ RETURN (CONTENTS IN AC, ABSOLUTE ADD IN JOBSWA) + +GETJW0, 0 + TAD I GETJW0 /GET RELATIVE ADDRESS + DCA .+3 /SAVE IT + TAD CJOBDA /POINTER TO CURRENT JOB STATUS + GETJTI /GETCONTENTS + 0 + ISZ GETJW0 /INDEX RETURN + JMP I GETJW0 + + + +*4600 + +/RETURN NUMBER OF NEXT RUNNABLE JOB IN AC +/CALL JMS NXTJOB +/ RETURN WITH JOB # IN AC + +FILCDA, +NXTJCT, 0 +NXTJBN, 0 /NEXT JOB # +NXTJMM, -JOBMAX + +FILCT2, +NXTJOB, 0 + DCA FIT /CLEAR FIT + TAD BONUS /IS THERE ANY JOB BROKEN OUT OF KEYBOARD WAIT? + RUNABL /IS IT RUNNABLE? + JMP NXTJ1 /NO, GET THE NEXT JOB + TAD BONUS /THIS JOB + JMP I NXTJOB +NXTJ1, ISZ NXTJCT /HAVE WE TRIED ALL JOBS? + SKP /NO, KEEP GOING + SCHED /TRY FOR A RESIDENT JOB + TAD NXTJBN /IS IT TIME TO WRAP AROUND TO JOB 1? + TAD NXTJMM + SNA CLA + DCA NXTJBN /YES + ISZ NXTJBN /INCREMENT NUMBER OF JOB UNDER CONSIDERATION +NXTJ2, TAD NXTJBN /IS THE JOB RUNNABLE? + RUNABL + JMP NXTJ1 /NO, CONTINUE JOB TABLE ROUND ROBIN + TAD NXTJBN /YES, RETURN WITH JOB NO. IN AC + JMP I NXTJOB + /CONSTRUCT TRANSFER BLOCK +/CALL TAD SEGMENT WINDOW POINTER +/ JMS FILCTB +/ POINTER TO FILPAR + +FILCPD= C0004 /FILPDA-FILPDX +FILCWC= C7776 /FILPWC-FILPDA +FILCSW= JOBSWA /POINTER TO SEGMENT WINDOW +FILCPA= WS2 /POINTER TO FILPAR & FILDA +FILCWA, 0 +FILCPX, 0 /POINTER TO FILPDX, FILPDA & FILPWC + +FILCTB, 0 + DCA FILCSW /SAVE POINTER TO SEGMENT IN WINDOW + TAD I FILCTB + DCA FILCPA /ADDRESS OF POINTER TO PARAMETER BLOCK + ISZ FILCTB /SKIP ARGUMENT IN CALL + DATFLD + TAD I FILCPA /GET ADDRESS OF PARAMETERS + IAC /POINTS TO WORD 2 OF PARAMETERS + DCA FILCPX + ISZ FILCPA /POINTS TO DISK EXTENSION IN CONTROL BLOCK + CLA CMA + TAD I FILCSW /GET SEGMENT # + CLL RAR + RTR + RTR /MULTIPLY BY 400 SEG SIZE + DCA FILCT2 /SAVE "PRODUCT" + TAD FILCT2 + RAL + AND SEGSM1 /THROW OUT CONTRIBUTION FROM HI ORDER BITS OF EXTENSION + TAD FIBAS1 /START OF LOGICAL FILE AREA + CLL RTL + DCA I FILCPX /SAVE IN DISK EXTENSION IN PARAMETER BLOCK + TAD FILCT2 /NOW GET LOW ORDER ADDRESS + AND SEGLMK + DCA FILCT2 /AND SAVE IT + TAD FILCPX /SET DISC ADDRESS + TAD FILCPD + DCA FILCPX /POINTS TO LOW ORDER ADDRESS IN PAR. BLOCK + TAD FILCPA + IAC + DCA FILCDA /POINTS TO LOW ORDER ADDRESS IN CONTROL BLOCK + TAD I FILCDA /GET WORD ADDRESS SUPPLIED BY USER + AND SEGSM1 /(WORD IN SEGMENT) + TAD FILCT2 /+ WORD ADDRESS FROM SEGMENT ARITHMETIC + DCA I FILCPX /SAVE IT IN PARAMETER BLOCK + TAD FILCPX /SET WORD COUNT + TAD FILCWC + DCA FILCPX /POINTS TO WORD COUNT IN PARAMETER BLOCK + DCA I FILCPX /NOTHING TRANSFERRED YET + TAD FILCDA + IAC + DCA FILCWA /POINTS TO WORD COUNT IN CONTROL BLOCK + FILCT1, TAD SEGSM1 /SEGS12-1 + AND I FILCDA /LOW ORDER ADDRESS IN CONTROL BLOCK + DCA FILCT2 /DISC ADDRESS MOD SEGS!Z + TAD I FILCWA /GET -WC FROM CONTROL BLOCK + CLL CIA /+WC + TAD FILCT2 /IF WE DO ENTIRE WC WILL WE GO INTO NEXT + AND SEGLMK / SEGMENT? + SNA CLA + SZL + JMP FILCT3 + TAD I FILCWA /NO + JMP .+3 +FILCT3, TAD SEGLMK /SUBTRACT SEGS12 FROM WC, SO WE STAY IN SAME SEGMENT + TAD FILCT2 + DCA FILCT2 /WORD COUNT FOR TRANSFER + TAD FILCT2 /UPDATE WORD COUNT IN PARAMETER BLOCK + TAD I FILCPX /OLD VALUE + DCA I FILCPX /NEW VALUE + TAD FILCT2 /UPDATE WORD COUNT IN FILE CONTROL BLOCK + CIA /+WC + TAD I FILCWA /OLD -WC + DCA I FILCWA /NEW -WC + TAD I FILCWA /ARE WE DONE? + SNA CLA + JMP I FILCTB /YES + TAD FILCT2 /INCREMENT DISC ADDRESS + CLL CIA /+WC + TAD I FILCDA /OLD DISC ADDRESS + DCA I FILCDA /NEW DISC ADDRESS + SZL /OVERFLOW? + ISZ I FILCPA /YES - INDEX DISC EXTENSION + TAD I FILCSW /GET CURRENT SEGMENT # + CLL CMA /-(SEGMENT # +1) + DCA FILCT2 /SAVE IT + ISZ FILCSW /POINTS TO NEXT SEGMENT IN WINDOW + TAD FILCSW /ARE WE STILL IN THE WINDOW? + AND C0007 + SZA CLA /NEXT POINTER IN CORE? + JMP FILCT4 /YES, SEE IF NEXT SEGMENT IS CONTIGUOUS + TAD BASWIN /NO, IS IT BASIC? + TAD FILCSW /COMPARE THE WINDOW ADDRESS WITH BASIC WINDOW ADDRESS + SNL CLA + JMP I FILCTB /NO, RETURN +FILCT4, TAD I FILCSW /GET THE NEXT SEGMENT + TAD FILCT2 /CONTIGUOUS SEGMENTS? + SNA CLA + JMP FILCT1 /YES - CONTINUE THE TRANSFER + JMP I FILCTB /RETURN +FIBAS1, SWDEX+JOBMAX + /TAKE CARE OF DUPLEX AND UNDUPLEX IOT'S + +UDUP, TAD C0200 /DUPLEX BIT IN DDB WORD 1 +UUND, DCA WS0 /WS0 CONTAINS BIT TO ADD FOR BOTH IOT'S + TAD JOB + TTYUSE /FIND INPUT DDB + DCA WS1 /ADDRESS OF DDB + DATFLD + TAD I WS1 /WORD ONE OF DDB + AND C7577 /CLEAR DUPLEX BIT + TAD WS0 /SET IT AS CALLED FOR + DCA I WS1 + UUOEXT + +C7577, 7577 + *5000 + +/TELEPRINTER IOT'S + +UTELC= WS0 + + +UTEL, JMS UKT0 /FIND THE CONSOLE # ATTACHED TO JOB + ISZ CONDBA /POINT TO OUTPUT SIDE +UULPT, TAD UJSTEL /TTY FLAG +UUPTP, DCA UOUTFL /SAVE THE DEVICE'S FLAG + JMS UKT1 /WHAT IS REQUESTED BY USER? + JMP UTELS /SEND A STRING (6XX0) +UOUTFL, JSTEL /DEVICE FLAG POSITION IN STR1 + JMP I UTELS1 /UNCONDITIONAL SKIP ON USER "TSF, PSF, OR LSF" + SNA CLA /6XX4 OR 6XX2 + UUOEXT /6XX2 - IF WE CLEAR FLAGS WE MAY DIE + TAD L2SA /6XX4 + DCA TTCHAR + PRINT /OUTPUT THE CHARACTER + SKP /NO ROOM - REDO LATER + UUOEXT /OK - ALL DONE + STA /BACK UP HIS/HER PC + TAD L2SV0 + DCA L2SV0 + JMP UTELS6 +UTELS5, DCA L2SA /CLEAR USER'S AC + TAD UKT0 /KEEP HIM/HER RUNNING IF WE WERE ABLE TO ACCEPT ANY CHARACTERS + SNA CLA +UTELS6, TAD UOUTFL /MAKE HIM/HER WAIT FOR DEVICE FLAG + UUOEXT /AND AWAY +UJSTEL, JSTEL + +UKT0, 0 + TAD JOB + TTYUSE /GET ADDR OF INPUT DDB + DCA CONDDB /SAVE IT + DATFLD /GET CONTENTS OF FIRST WORD OF DDB + TAD I CONDDB /UNIT # + FLAGS IN AC + CDF + AND C1000 + SNA CLA /CONSOLE IN SI MODE? + JMP I UKT0 /NO - OK TO CONTINUE + GETJTW + JOBWMK + CLA + DATFLD + DCA I JOBSWA /CLEAR HIS/HER WAIT MASK TO HANG HIM/HER UP + REDO /SI WILL WAKE HIM/HER UP TO TRY AGAIN LATER + UJSPTP= C0004 +/ "SEND-A-STRING" + + +UTELS, UDF /SELECT USER'S FIELD + TAD I L2SA + SNA CLA + JMP UTELS4 /USER'S W.C. IS ZERO - SO SEND NOTHING + DCA UKT0 + TAD L2SA + IAC + DCA UTELC /POINTS TO ADDRESS OF STRING IN USER AREA + TAD I UTELC /GET ADDRESS-1 OF STRING + DCA AXS2 /SAVE POINTER TO STRING +UTELS3, TAD I AXS2 /GET CHARACTER FROM USER + CDF + DCA TTCHAR + PRINT /OUTPUT THE CHARACTER + JMP UTELS5 /BUFFER FULL + UDF + ISZ I UTELC /BUMP ADDRESS IN USER AREA + ISZ UKT0 /DOESN'T MATTER THAT WE MAY SKIP THIS + ISZ I L2SA /BUMP USER'S WORD COUNT + JMP UTELS3 /KEEP GOING +UTELS4, DCA L2SA /ALL DONE --- CLEAR USER AC + JMP I UTELS1 /EXIT AND SKIP +UTELS1, UUOEX2 + +/LINE PRINTER UUO'S + +ULPT, JMS I UPTLPA + DEVTBE+3 /LINE PRINTER POSITION IN DEVTBL + TAD .-1 + DCA CONDBA /IT'S OK TO USE THE PRINTER + TAD UJSTEL /LPT FLAG (20+20=40) + JMP UULPT + +/PAPER TAPE PUNCH UUO'S + +UPTP, JMS I UPTLPA /OK TO USE PUNCH? + DEVTBE+1 /PUNCH'S POSITION IN THE DEVTBL + TAD .-1 + DCA CONDBA /PASS ON THE PUNCH'S POSITION + TAD UJSPTP /PUNCH FLAG + JMP UUPTP +UPTLPA, DEVCHK + /ROUTINE TO ANALYZE IOT'S +/CALLING SEQUENCE: +/ IOT IN UUOCAL +/ JMS UKT1 +/ RETURN FOR STRING IOT +/ FLAG TO CHECK IN STR1 +/ RETURN FOR NON-SKIPPING FLAG TESTS +/ RETURN FOR EVENT TIMES 2 AND 4 (AC=BIT 9 OF IOT; LINK=BIT 10) +/ ILLEGAL MICRO-CODING RESULTS IN "NOP" +/ SKIPPING FLAG RESULTS IN INCREMENT OF USER PC +UKT1, 0 + TAD UUOCAL + AND C0007 + SNA /STRING? + JMP I UKT1 /YES + ISZ UKT1 + CLL RAR /NO + SNL /SKIP TEST? + JMP UKT12 /NO + SZA CLA /YES - ANYTHING ELSE? + UUOEXT /YES - BAD MICRO-CODING + GETJTW /GET HIS/HER STR1 + JOBSTS+1 + AND I UKT1 /FLAG TO CHECK + CLL RTR /IGNORE THE ERROR FLAG + ISZ UKT1 /INDEX PAST ARGUMENT + SNA CLA /FLAG SET? + JMP I UKT1 /NO - DON'T SKIP + JMP I UTELS1 /YES - SKIP ON EXIT +UKT12, ISZ UKT1 + ISZ UKT1 + CLL RAR + JMP I UKT1 /INDEX RETURN + UUOERR, CDF /SET "ILLEGAL IOT" ERROR CODE + TAD JOB + ERROR + UUOERF /CODE=1 +USYN, WAIT /AND BACK TO THE SCHEDULER + +USTMT1= WS0 +SLEEP, TAD JOB + SNA CLA /PROBABLE TROUBLE DUE TO EAE + EXIT + TAD C0002 +DOUSTM, CIA /NEGATE + DCA DDSTM1 /SAVE - # UNITS OF TIME + TAD JOB /SET CLKTBBL ENTRY FOR THIS JOB + TAD CLKTBA + DCA USTMT1 /POINTS TO THIS JOB'S ENTRY + TAD DOSTM1 + DATFLD + DCA I USTMT1 /SET TABLE ENTRY + STL RAR /SET AC=JSTIME + UUOEXT /EXIT AND WAIT +DOSTM1, 0 +CLKTBA, CLKTBL /JOB TIMER TABLE ADDRESS + +*5171 +OVERLA, SKP /ERROR + JMP I OVER1A /OK, FINISH UP + TAD I FANCOR /GET NUMBER OF JOB IN TROUBLE + ERROR /PASS ERROR TO USER + DSKERR + JMP I OVER1A /NOW FINISH UP +OVER1A, OVERL1 + /NULL JOB IS THE ONLY INSTRUCTION IN FIELD 0 WHICH +/IS EXECUTED IN USER MODE. +/IT IS RUN WHENEVER THERE IS NOTHING ELSE +/TO DO, OR NOTHING ELSE THAT CAN BE DONE. +/ +/WHEN DEBUGGING THE MONITOR, IT IS POSSIBLE +/TO STOP (VIA THE PDP-8 OPERATOR CONSOLE) THE MONITOR +/TO ENTER XDDT. THIS MAY ONLY BE DONE +/WHEN THE SYSTEM IS IN NULJOB. IF THE +/SYSTEM IS STOPPED WHEN NOT IN NULJOB, IT MAY +/BE RESTARTED BY HITTING "CONTINUE," AND THEN +/STOPPED AGAIN. KEEP TRYING - EVENTUALLY YOU'LL CATCH IT. +/DO NOT STOP THE SYSTEM (AND EXPECT TO GET AWAY WITH IT) +/IF ANY I/O IS IN PROGRESS. + +/IF THE SYSTEM IS STOPPED IN NULJOB, IT MAY BE +/RESTARTED AT LOCATION 4201 IN FIELD 0. + + + +NULJOB, JMP . /IT'S A BIGGY, ISN'T IT? + \ No newline at end of file diff --git a/tss8/system/ts8d.pal b/tss8/system/ts8d.pal new file mode 100644 index 0000000..abd1d12 --- /dev/null +++ b/tss8/system/ts8d.pal @@ -0,0 +1,1279 @@ +/RETURN FILE WINDOW INDEX +/CALL TAD POINTER TO FILE CONTROL +/ JMS FILIX +/ SEGMENT ADDRESS NOT IN WINDOW +/ NON-EXISTENT FILE ADDRESS +/ OK RETURN WITH ADDRESS OF SEGMENT POINTER + +FILIDA= C0004 /FILDA + +FILIX, 0 + DCA FILICN /SAVE POINTER TO FILE CONTROL + TAD FILICN + TAD FILIDA /4 + DATFLD + DCA FILSP2 /POINTS TO FILE EXTENSION IN CONTROL BLOCK + TAD I FILSP2 /FILE EXTENSION + AND C0177 /LIMIT FILE SIZE TO 1777777 (?!?) + DCA FILSP1 /HIGH ORDER COMPONENT OF SEG # + ISZ FILSP2 /POINTS TO LOW ARDER ADD + TAD I FILSP2 /LOW ORDER ADDRESS + AND SEGLMK /GET RID OF ADDRESS IN SEGMENT + CLL RAL + TAD FILSP1 /HIGH ORDER PART + RTL /"DIVIDE" BY 400 SEG SIZE + RTL + CIA /-(SEGMENT# -1) + DCA FILISN + TAD FILICN + IAC + DCA FILICA /POINTS TO SEGMENT # INDEX IN WINDOW + TAD I FILICN /POINT TO WINDOW + DCA FILICN + TAD I FILICN /GET WORD 1 OF WINDOW + AND C0007 /VALID WINDOW? + SZA + JMP FILIX5 /NO, IT IS A BASIC WINDOW + TAD I FILICA /YES + TAD FILISN + SMA SZA /FILSCT-SN>0? + JMP FILIX2 /YES, SEGMENT POINTER NOT IN CORE + TAD C0006 /FILSCT+6-SN<0? + SMA + JMP FILIX1 + CLA /YES, SEGMENT POINTER NOT IN CORE + TAD I FILICN /ANY MORE SEGMENTS? + SNA CLA + ISZ FILIX /NO, NON-EXISTENT FILE ADDRESS +FILIX2, CLA +FILIX3, CDF + JMP I FILIX /RETURN + FILIX5, AND C0006 /IS IT BASIC OR INVALID WINDOW? + SNA CLA + JMP FILIX3 /INVALID WINDOW + TAD FILISN /GET -(SEG # -1) + TAD BASWIN + CIA /AC=SEG # -1 + SPA + JMP FILIX4 + JMP FILIX2-1 /BASIC BUT NON-EXISTENT +FILIX1, CIA + TAD C0007 /WINDOW INDEX + TAD FILICN /START OF WINDOW +FILIX4, DCA FILICA /POINTS TO SEGMENT # + ISZ FILIX /SEGMENT ADDRESS IN CORE - EXIT + TAD I FILICA /GET SEGMENT # FOR THIS FILE ADDRESS + SNA CLA + JMP FILIX3 /ZERO SEGMENT NUMBER IS NOT A SEGMENT! + TAD FILICA /EXIT WITH POINTER TO THIS SEGMENT IN AC + ISZ FILIX + JMP FILIX3 + +FILISN, 0 +FILICN, 0 + /RETURN USER RUN TIME +/USER CALLS WITH ADDRESS OF THREE WORD BLOCK +/WORD 1 CONTAINS THE JOB # +/THE HI AND LO ORDER RUN TIMES ARE RETURNED IN WORDS 2 AND 3 + +UURT, UDF /USER FIELD + TAD I L2SA /JOB # + JMS I JOBCHB /SEE IF IT'S A VALID JOB + JMP UURT0 /IT WASN'T + TAD JOBTBA + GETJTI /LOW ORDER RUNTIME + JOBRTM + ISZ JOBSWA +UURT0, DCA UCOP2 + DATFLD + TAD I JOBSWA + DCA UCOP1 + JMP UCOPY2-2 /COPY IN USER AREA +JOBCHB, JOBCHK + + +/RETURN THE TIME OF DAY IN SYSTEM TICKS SINCE MIDNIGHT. +/USER CALLS WITH ADDRESS OF TWO WORD BLOCK IN AC. +/HI AND LOW ORDER PARTS RETURNED IN WORDS 1 AND 2. + +UTOD, TAD CLK1 /-TIME TILL MIDNIGHT + CLL + TAD INKLK1 /TIME AT MIDNIGHT + DCA UCOP2 /LOW ORDER TIME NOW + RAL + TAD CLK2 /-TIME TILL MIDNIGHT + TAD INKLK2 /TIME AT MIDNIGHT + DCA UCOP1 /TIME NOW (HIGH ORDER) + JMP UCOPY2 /COPY IN USER AREA + +INKLK1, INCLK1 +INKLK2, INCLK2 + + /RETURN THE USER'S STATUS REGISTERS +/CALLED WITH ADDRESS OF THREE WORD BLOCK IN AC + +UCKS, GETJTW + JOBSTS + DCA UCOP0 /STATUS 0 + DATFLD + ISZ JOBSWA + TAD I JOBSWA /STATUS 1 + DCA UCOP1 + ISZ JOBSWA + TAD I JOBSWA + DCA UCOP2 /STATUS 2 + UDF /SELECT USER FIELD + TAD UCOP0 + DCA I L2SA + ISZ L2SA /BUMP POINTER + NOP +UCOPY2, UDF /FOR LATER ENTRIES + TAD UCOP1 /SECOND WORD + DCA I L2SA + ISZ L2SA + NOP + TAD UCOP2 /THIRD WORD + DCA I L2SA + DCA L2SA /CLEAR USER AC + UUOEXT + +DEVJO0, +UCOP0, +FILSP1, 0 + +UCOP1, +FILSP2, 0 + +UCOP2, 0 + /ROUTINE TO EXTRACT JOB NUMBER FROM DDB +/CALL +/ TAD (DDB ADDRESS) +/ JMS DEVJOB +/ RETURN WITH JOB # IN AC + +FILICA, +DEVJOB, 0 + IAC + DCA DEVJO0 /POINTS TO WORD 1 OF DDB + DATFLD + TAD I DEVJO0 /GET WORD 1 + AND C0037 /IGNORE JUNK + JMP I DEVJOB /RETURN +C7037, SWAP LOCK NOTRUN CJOB +FIPLOA, FIPLOK +L2FIP, TAD C7037 /OK - ALLOW FIP TO BE OVER-WRITTEN BY USER JOBS AGAIN + DCA I FIPLOA + EXIT + +/WE ENTER THIS ROUTINE AT LEVEL 2 +/AFTER COMPLETING A DISK TRANSFER +/IF A FILE TRANSFER IS INVOLVED, WE CONTINUE +/WITH IT +/IF OVERLAY, WE GO TO OVERLAY CONTROL +/IF OVERLAY IS COMPLETED WE FORCE THE SCHEDULER TO RUN THE PHANTOM + +DSURT1= WS0 +DSURT2= WS1 + +DSURDA= C0004 /FILDA + +DSUET1= WS0 + + +DSURET, IAC /ERROR IN DISK TRANSFER + DCA DSKCOD /SAVE ERROR CODE + TAD DSKPTR /POINTS TO REQUEST CURRENTLY RUNNING + TAD DSUMTB /FIND RELATIVE INDEX IN TABLE + CLL RTR /DIVIDE BY FOUR + AND C0007 /SAVE FIELD + TAD CORTBA /INDEX INTO CORTBL + DCA DSUCOR + TAD I DSUCOR /GET CORTBL ENTRY + AND C0037 /EXTRACT JOB # + TAD JOBTBA /POINTS TO JOBTBL + DCA DSUJTE /SAVE JOBTBL ADDRESS + TAD DSUJTE + GETJTA /GET ADDRESS OF STR0 + JOBSTS + DCA DSUJST /SAVE IT + TAD DSKCOD /IS THERE AN ERROR? + SZA + JMP DSURER /YES - JMP OUT OF THE ROUTINE AS QUICKLY AS POSSIBLE + JMS DSUPAR /PARAMETER BLOCK ADDRESS + TAD DSURDA + DCA DSURT1 /POINTS TO WORD 5 OF PARAMETERS + TAD I DSURPA /ADDRESS OF PARAMETERS + IAC + DCA DSURT2 /POINTS TO DISK EXTENSION IN PARAMETERS + DATFLD + TAD I DSURT1 /DISC EXTENSION FROM CONTROL... + DCA I DSURT2 / ... TO PARAMETERS + TAD DSURT2 + TAD C0004 + DCA DSURT2 /POINTS TO DISC ADDRESS IN PARAMETERS + ISZ DSURT1 /POINTS TO DISC ADDRESS IN FILE CONTROL + TAD I DSURT1 /DISC ADDRESS FROM CONTROL... + DCA I DSURT2 / ...TO PARAMETERS + ISZ DSURT1 /POINTS TO WORD COUNT IN FILE CONTROL + CLL CMA RAL + TAD DSURT2 + DCA DSURT2 /POINTS TO WORD COUNT IN PARAMETERS + TAD I DSURT2 /SAVE TEMPORARILY -WC FROM PARAMETERS + CIA + DCA DSKCOD + TAD I DSURT1 /MOVE WC FROM FILE CONTROL... + DCA I DSURT2 / ...TO PARAMETERS + ISZ DSURT2 /POINTS TO CORE ADD IN PARAM. + TAD DSKCOD /UPDATE CORE ADD BY COUNT TRANSFERRED + TAD I DSURT2 + DCA I DSURT2 /SAVE NEW AADD + TAD I DSURT1 /GET WORD COUNT FROM CONTROL + CDF +C7640, SZA CLA /ARE WE DONE? + JMP DSURE2 /NO +DSURER, DCA DSKCOD /SAVE ERROR STATUS IF IT IS AN ERROR + TAD I DSURPA /GET ADDRESS OF PARAMETER BLOCK + DCA .+3 /FOR CALL TO FILERR + TAD DSKCOD /ERROR CODE + JMS I DSUFEA /HANDLE ERROR + 0 + CLL + TAD I DSUCOR + TAD C7640 /SET "NOTRUN" IF NOT INHIBITED + AND DSHOLD /SAVE "NOTRUN," "NOHOLD," & AND JOB + SNL /ANY MORE BONUSES DUE? + DCA I DSUCOR /YES - SET "NOTRUN" SO [S]HE WON'T BE SWAPPED OUT BEFORE BEING RUN AGAIN +DSURE1, DCA DSFLAG + ISZ DSUJST /SET INACTIVE FLAG IN STR1 + TAD DSKPTR /FIGURE OUT WHICH INTERNAL FILE # + TAD DSUMTB + JMS I DGETJX + DATFLD + TAD I DSUJST /NOW SET FILE READY & DUMMY WAIT BIT + DCA I DSUJST /SAVE STR1 + JMS DSURE4 + ISZ DSFLAG /THIS TRANSFER COMPLETE? + RSCHED /YES - BUMP OOFF THE NULL JOB IF POSSIBLE + TAD I DSUCOR + JMP I .+1 /GO SET UP FOR THE NEXT PART OF THIS TRANSFER + FILCON +DSURPA, DSPARM +DSUFEA, FILERR + /MOVE SEGMENT WINDOW + +DSURE2, TAD DSUJTE /SET JOBLNK + GETJTA + JOBLNK + DCA DSKCOD /SAVE POINTER TO JOBLNK + TAD I DSURPA /GET ADDRESS OF PARAMETER BLOCK + DATFLD + DCA I DSKCOD /AND SAVE IN JOBLNK + CDF + DCA I DSURPA /CLEAR DSPARM + STA /-1 TO SET TRANSFER INCOMPLETE FLAG + JMP DSURE1 + +DSUCOR, 0 +DSHOLD, NOTRUN NOHOLD CJOB +DSUMTB, -DSUTBL +DGETJX, GETJFX +DSKCT, DSKCON +DSKCOD, 0 + + +DSURE4, 0 + TAD DSKPTR /CURRENT REQUEST POINTER + DCA DSUET1 + DATFLD + DCA I DSUET1 /CLEAR THIS REQUEST + CDF + TAD I DSURPA /RETURN PARAMETER BLOCK IF FINISHED + SZA + RETBLK /OK - RETURN IT + JMS I DSKCT /DECREMENT BUSY - START ANY TRANSFER THAT'S WAITING + JMP I DSURE4 + DSUJST, 0 /POINTER TO JOB STATUS +DSUJTE, 0 /JOB TABLE ENTRY + +DSFLAG, +DSUPAR, 0 /GET PARAMETER BLOCK ADDRESS + TAD I DSURPA /GET ADDRESS + TAD C0007 /GET POINTER TO LAST WORD IN BLOCK + DCA DSUET1 + DATFLD + TAD I DSUET1 /GET ADDRESS OF FILE CONTROL + CDF + JMP I DSUPAR /EXIT + +OVERL1, JMS DSUPAR /GET ADDRESS OF FILE CONTROL, & CLEAR DSFLAG + SZA + JMP OVE2 + TAD I FANCOR + TAD C1000 /NOT RUN YET + DCA I FANCOR + TAD SCHPHA +OVE2, DCA DSFLAG /DISPATCH ADDRESS + JMS DSURE4 + JMP I DSFLAG + +SCHPHA, SCHFAN + +/GET JSFX +/CALL TAD FILE # +/ JMS GETJFX +/ RETURN WITH JSFX IN AC +GETJFX, 0 + AND C0003 /FILE # ONLY + CMA + DCA TRAC /-SHIFT COUNT + STL RAR + RAR + ISZ TRAC /DONE? + JMP .-2 + JMP I GETJFX /YES, EXIT WITH BIT SET IN AC + +USIZE, TAD SEGSIZ /RETURN SEGMENT SIZE IN AC + JMP UUAC +UUSE, TAD JOB /RETURN JOB # IN AC + JMP UUAC + TICSPS /# TICKS PER SECOND +URCR, TAD .-1 /RETURN CLOCK RATE +UUAC, DCA L2SA + UUOEXT + /ROUTINE TO RECOGNIZE AND REPLY TO ^C + +GIR9, TAD CONDDB + JMS I PTJOB /GET HIS/HER JOB NUMBER FROM THE DDB + CDF + TAD JOBTBA + DCA WS1 + TAD WS1 /POINTS TO JOB DATA AREA + GETJTI + JOBSTS+1 /GET STR1 + AND GIRFCL /CLEAR TIMER, AND DELIMITER FLAGS & JSWAIT + DATFLD + DCA I JOBSWA + STL RTL + TAD JOBSWA + DCA WS0 /POINTS AT WAIT MASK 1 + TAD I WS0 /ARE WE WAITING FOR A FILE TRANSFER? + AND GIRFIL + ISZ WS0 /POINTS AT WAIT 2 + TAD I WS0 /OR - WAITING FOR DECTAPE, RK05, OR CARDREADER? + SNA CLA + ISZ I JOBSWA /NO - SET DUMMY WAIT BIT + ISZ WS0 /POINT TO RESTART ADDRESS + CDF + TAD WS1 /GET POIONTER TO JOBREG + GETJTI + JOBREG + CLA + TAD CONDDB /GET JOB NUMBER + JMS I PTJOB /AC=JOB; DATA FIELD=1 + JMP I .+1 + GIR90 /OFF TO PART TWO + +GIRCBF, CLRBUF +GIRFIL, JSF0+JSF1+JSF2+JSF3 +GIRFCL, -JSTIME-JSDEL-JSWAIT-1 + SWBASE= C0004 /SWAP TRACK OF JOB 1 (SWDEX-1) + + + + +/ROUTINE TO SET UP SWAP +/CORTBL POINTER TO FIELD TO SWAPPED OUT IN WS0 +/FINISH= +FIELD # FOR SWAP IN; FINISH= -FIELD # FOR SWAP OUT +/FIT=JOB TO BE SWAPPED IN OR PHANTOM TO BE BROUGHT IN +/FORCE=FIELD TO BE SWAPPED OUT +/ENTER AT SWAPIN FOR SWAP IN +/ENTER AT SWPOUT FOR SWAP OUT + + +SWPOUT, TAD WS0 /OR SWAP BIT INTO CORTBL + IOR + SWAP + TAD I WS0 /JOBS ARE THE ONLY ONES TO BE SWAPPED OUT + JMS TRAC /GET THE TRACK # FOR THIS JOB + DCA OUTTRC /SAVE IT +SWAPIN, TAD FINISH /FINISH HAS FIELD # FOR SWAP ACTIVITY + OR - + SPA + CIA /GET THE ABSOLUTE VALUE + CLL RTL + RAL /IN POSITION 00X0 + DCA SQREQ /SAVE IT FOR SETTING UP DISC I/O + TAD FIT /IS A PHANTOM NEEDED? + AND C0600 + SNA + JMP SWAP1 /NO JOB IS TO BROUGHT IN + AND C0400 /IS FIP NEEDED? + SZA CLA + IFZERO RF08-40 /YES, DF32 NEEDS TRACK IN POSITION 0X00 + IFZERO RF08 /YES, RF08 NEEDS TRACK IN POSITION 000X +SWAP3, DCA INTRC + ISZ DSBUSY /IS ANY DISC ACTIVITY GOING ON? + SCHED /YES, SO FIND A RESIDENT JOB + JMS I SWPIOA /NO, START THE SWAP I/O + SCHED /FIND A RESIDENT JOB IN THE MEANTIME +SWAP1, TAD FIT /GET THE JOB # TO BE SWAPPED IN + JMS TRAC /GET ITS TRACK # + JMP SWAP3 + +/ROUTINE TO SET FLAG IN USER STATUS REG AND EXIT +/CALLING SEQUENCE: +/ CONDBA POINTS TO POSITION IN DEVTBL +/ TAD (FLAGS TO SET) +/ JMS PTSTAR +/ RETURN + +PTSTAR, 0 + DCA PTFLAG /SAVE FLAGS TO SET + TAD I CONDBA + JMS I PTJOB /GET JOB # FROM DDB + SNA + JMP I PTSTAR + TAD JOBTBA /START OF JOB TABLE + DCA TRAC + STL RTL + TAD I TRAC /ADDRESS OF STR1 + IOR /OR IN FLAGS +PTFLAG, 0 + JMP I PTSTAR +PTJOB, DEVJOB + + + /DECTAPE HANDLER CODE +/FOR DISK TRANSFERS TO OR FROM USER SWAP AREA +/ALSO FOR ALL LEVEL 2 COMPLETION + +DTDSF0, 0 /MAY RETURN UP TO 4 TIMES - EACH +1 FROM THE LAST + DCA I DTDQUE /PUT THE DECTAPE'S DISK REQUEST IN THE QUEUE + CDF + ISZ DSBUSY /DISK ALREADY BUSY? + SKP + JMS I FIUSER /NO, START IT +DTDXF0, CIF DATFLD + JMP I DTDSF0 /BACK TO DECTAPE HANDLER +DTL20, CIF DATFLD /LEVEL 2 DISPATCHER + JMP I DTLEV2 +DTDEF0, ERROR /DECTAPE DISK ERROR + SWPRER +DTDCF0, ISZ DTDSF0 /INCR. RETURN + JMP DTDXF0 +DTDSK, ISZ DTDSF0 /DISK ERROR - SKIP ON RETURN + DATFLD + DCA I DTDQUE /REMOVE REQUEST FROM QUEUE + CDF + JMS DSKCON /START ANYTHING ELSE THAT'S WAITING + JMP DTDCF0 +DTLEV2, DTL21 /POINTER TO DECTAPE LEVEL 2 COMPLETION ENTRY +DTDQUE, DSUTBL+7 /POSITION FOR FIELD 1 REQUESTS + +DSKCON, 0 + STA CLL /REDUCE COUNT FOR DSBUSY + TAD DSBUSY + DCA DSBUSY + SZL /IS THERE ANYTHING ELSE TO RUN? + JMS I FIUSER /YES -- START NEXT TRANSFER + JMP I DSKCON + +TRAC, 0 + AND C0037 /JUST GET THE JOB # + TAD SWBASE /TRACK # WHERE SWAP AREA BEGINS -1 TO TAKE CARE OF JOB 1 + IFZERO RF08-40< CLL RTL;RTL;RTL >/TRACK # IN POSITION 0X00 FOR DF32 + JMP I TRAC /RETURN + *6000 + +KBDMOD, 0 + TAD I CONDDB + AND C1000 + SNA CLA /USER MODE? + ISZ KBDMOD /YES; CAUSE SKIP ON EXIT + JMP I KBDMOD + +XOFF= 3000 +KBDFUL, -130 +KBDOFF, -70 +OFFBRK, KBDDLM + +KBD06, 0 /SIZE CHECK FOR KEYBOARD INPUT + DCA KBDMOD /SAVE POINTER TO CHARACTER COUNT + TAD I KBDMOD + TAD KBDFUL + SMA CLA /BUFFER FULL? + JMP KBD07 /YES + ISZ KBD06 /SKIP ON RETURN - OK TO GIVE ANOTHER BLOCK + TAD I KBDMOD + TAD KBDOFF /TIME FOR XOFF? + SPA CLA + JMP I KBD06 /NO + TAD I CONDDB /GET DDB FLAGS + RTL + SZL SPA /SHOULD "XOFF" BE SENT? + JMP I KBD06 /NO - EITHER IT HAS ALREADY BEEN SENT OR [S]HE'S IN SI MODE + STL RTR /YES - REMEMBER TO SEND "XON" LATER + DCA I CONDDB + TAD I CONDBA /POINT TO WORD 2 OF OUTPUT SIDE + IOR + XOFF /SCHEDULE XOFF TO BE SENT + JMS I TYPEC + JMS I OFFBRK /SET KEYBOARD FLAG + JMP I KBD06 +KBD07, TAD C0400 + TAD I CONDDB /SET BUFFER FULL BIT + DCA I CONDDB + JMP I KBD06 /EXIT - NO SKIP +TYPEC, TYPE + +ALLOK, 0 + ISZ ALLOK /WE DON'T CARE HOW BIG THE BUFFER IS + DCA KBDMOD + TAD I KBDMOD /THE COUNT + TAD KBDFUL /THE LIMIT + SMA SZA CLA + JMP I ALLOK /TOO MANY - DON'T CLEAR "FULL STATUS" + TAD I CONDDB + AND CC7377 + DCA I CONDDB + JMP I ALLOK +CC7377, 7377 + +/SEARCH FOR TTY +/CALL TAD JOB # +/ TTYUSE +/ RETURN WITH DDB ADDR IN AC, 0 IF NOT FOUND +TTYSRC, 0 + AND C0037 /GET JOB # + TAD TTYTBA /START OF TTY TABLE + DCA CONDBA + DATFLD + TAD I CONDBA /GET UNIT # FROM TABLE + CLL RAL /POSITION IN DEVTBL + TAD DEVTBA /POINTER TO DEVTBL + DCA CONDBA + TAD I CONDBA /DDB ADDRESS + CDF + JMP I TTYSRC +TTYTBA, TTYTBL + +JOBCHA, JOBCHK +UCON, TAD L2SA /PICK UP JOB NO. + JMS I JOBCHA /SEE IF IT'S A VALID JOB + JMP UCON0 /IT WASN'T + TTYUSE /GET DDB ADDRESS + DCA WS0 + DATFLD + TAD I WS0 /GET WORD 1 OF DDB + AND C0037 /ISOLATE CONSOLE NO. + SKP +UCON0, STA /RETURN A -1 + DCA L2SA /STASH IT IN HIS/HER AC + UUOEXT +/DATE +UDATE, TAD DATE + JMP UCON0+1 /RETURN DATE IN AC + /RESTORE JOB REGISTERS +/CALL TAD JOB # +/ RESJOB +/ RETURN + +RESCOR, FIP SI CJOB + +RESJO0, 0 + AND RESCOR /CLEAR CORE STATUS BITS + DCA JOB /AND SAVE IN JOB + TAD JOB + AND C0037 + TAD JOBTBA + DCA RESJO1 /JOBTBL POINTER FOR THIS JOB + DATFLD + TAD I RESJO1 /GET ADDRESS OF JOB DATA AREA + DCA I CJOBDA /AND SAVE IN FIELD 1 + CDF + TAD CLOCK /SUBTRACT THE CLOCKS STILL PENDING ON LEVEL 2 + CMA + DCA JOBTIM /THE NET RESULT IS ZERO TICKS WHEN WE ACTUALLY START HIM/HER + DCA L2SV0 /SET PC=0 IN ANTICIPATION OF PHANTOMS + TAD JOB /IS IT A PHANTOM? + AND C0600 + SZA CLA + JMP I RESJO0 /YES; WE'RE RESTORED! + +/ +/ NOW RESTORE THE EAE REGISTERS IF THEY EXIST +/ + +IFZERO EAE-20 < + IFZERO CPU-2 < /PDP-8E + GETJTW /PICK UP SC (AC5:9), THE MODE + GT FLAG IN AC10 + 11 + JOBEAE+1 /IF AC10-11=00 THEN MODE=B GT=1 + CMA /IF AC10-11=01 THEN MODE=B GT=0 + /IF AC10-11=10 THEN MODE=A GT IS ALWAYS 0 IN MODE A + SWAB /SWITCH TO MODE B AND LOAD THE MQ + MQA LSR /SHIFT INTO THE GT FLAG (SETS TEMPORARILY IF WE WANT MODE A) + 1 /MQ IS ALSO COPIED BACK INTO THE AC + CMA RAR /POSITION THE SC FOR LOADING AND PUT THE MODE INTO THE LINK + ACS /AC LOADS SC, AC IS CLEARED + SZL /WHICH MODE? + SWBA /"A," SO SWITCH MODES AND CLEAR THE GT FLAG + > +IFNZRO CPU-1 < /SORRY - THE PDP-8 CAN'T RESTORE ITS STEP COUNTER + IFNZRO CPU-2 < / PDP-8/I AND PDP-12 + GETJTW /PICK UP SC + JOBEAE+1 + CMA /COMPLEMENT AND STORE FOR + DCA .+2 / OLD-STYLE EAE + SCL /LOAD SC + 0 >>> + IFZERO MQREG-1 < + GETJTW /RESTORE MQ + JOBEAE + MQL > + + TAD RESJO1 + GETJTA /GEET ADDRESS OF PC IN JOB DATA AREA + JOBREG /MOVE PC, LINK, AC TO LEVEL 2 REGISTERS + DCA RESJO1 + BLT + DATFLD +RESJO1, 0 +UDFCDF, CDF + L2SV0 + -3 + TAD L2SF + AND C0070 + TAD UDFCDF + DCA UUDF /SET UP IN CASE OF USER INTERRUPT + ISZ L2SVLK /DID [S]HE JUST TYPE CONTROL C? + JMP I RESJO0 /ALL RESTORED + DCA L2SA /YES - MAKE SURE HIS/HER AC AND LINK ARE CLEARED + JMP I RESJO0 + +IFNZRO DC08A < +ANSWER, CIF DATFLD-1 /DISPATCH TO FIELD 1 TO ANSWER PHONE + JMP I .+1 + DFRING >/END D689 + + *6200 + +/SERVICE ALL AC TRANSFER OUTPUT DEVICES (TELEPRINTERS, PAPER TAPE PUNCH, AND LINE PRINTER) + +/IF FILLER CHARACTERS ARE NEEDED, THE NEXT 3 WORDS MUST BE PATCHED ACCORDING TO YOUR NEEDS + /THE VALUE OF DEVTBL IS ASSEMBLED HERE FOR YOUR CALCULATING CONVENIENCE +FILHI, DEVTBL /-(DEVTBL+2*(KXX+1)) WHERE KXX IS THE HIGHEST LINE REQUIRING FILLER CHARACTERS +FILLO, 0 /2 TIMES NUMBER OF LINES REQUIRING FILLER CHARACTERS +FILLC, 0 /-(ASCII CHAR.) TO LOOK FOR - 7 BITS ONLY (CR=7763; LF=7766) + +TTIMEA, TTIME +JMSTIM= JMS I TTIMEA +CONCNT, -NULINE-3 +IFNZRO DC08A + T8OUT> /PASS OUTPUT CHARACTER TO DC08A + *6206 +DEVOUT, OUTDIF +CONREG= C0200 +CONDEV, SKPTP+1 +TTOFLA, TTOFLG +CONLPF, JSLPT +C0014, 14 +IFNZRO OUTREG-200 + +CONOUT, DCA I SETFLG /CLEAR SCHEDULER FLAG + ION + ISZ I TTOFLA /SHOW THAT OUTPUT IS BEING SERVICED + DATFLD + TAD CONREG + DCA WS0 /OUTPUT REGISTER TABLE POINTER FOR OUTPUT SCAN + TAD CONCNT + DCA WS1 /NUMBER OF LINES TO CHECK + PUNCH & LINE PRINTER +CONOU0, TAD I WS0 +TTIMER, SPA CLA /DOES THIS DEVICE HAVE A REQUEST? + JMP CONOU2 /YES +CONOU1, ISZ WS0 /BUMP POINTER + ISZ WS1 /AND THE COUNT + JMP CONOU0 + TAD CONSKP /RESTOORE THE NORMAL INSTRUCTION + DCA TTIMER + STA + LSRP /LP08 OR LE8 ERROR? + LIE /OK - TURN ON INTERRUPT ENABLE + JMP I .+1 + CONEXT + +CONOU2, JMS CONGET /FIND HIS/HER DDB + DCA CONDDB + TAD I CONDDB /GET OUTPUT STATUS + SPA + JMP CONOU9 /[S]HE HAS TYPED ^S + RTL +CONSKP, SPA CLA + JMP CONJAM /SPECIAL CHARACTERS +CONOU3, TAD CONDDB + FETCH /GET A CHARACTER + JMP CONOU9 /BUFFER EMPTY +CONOU4, DCA TTCHAR + TAD TTCHAR /CHECK FOR CARRIAGE RETURN (FOR SERIAL LA30'S @ 300 BAUD) + AND C0177 /LET'S KEEP DAWNWOOD JUNIOR HIGH HAPPY + TAD FILLC + SZA CLA + JMP CONOU5 /NORMAL CHARACTER + TAD CONDBA + TAD FILHI /HI LINE LIMIT FOR FILLERS + CLL + TAD FILL0 /LO LINE LIMIT FOR FILLERS + SNL CLA + JMP CONOU5 /NO FILLERS FOR THIS LINE + TAD CONDDB + TAD C0005 + DCA WS2 /POINTER TO DDB CHARACTER COUNT + STL RAR + TAD I WS2 /INDICATE THE NEED FOR FILLERS + DCA I WS2 +CONOU5, IOF + TAD I WS0 /WHAT'S THE HARDWARE DOING? + RTL + SNL CLA /HARDWARE BUSY FLAG IN THE LINK + JMP CONOU6 /NOTHING - SEND TO IT + TAD TTCHAR + RAL /SET THE CHARACTER READY FLAG +CONOU8, ION + DCA I WS0 /NEW LINE STATUS + JMP CONOU1 /CHECK NEXT LINE +CONOU6, TAD WS1 + IAC + SZA /LINE PRINTER? + JMP CONOU7 /NO - EITHER TTY OR PTP + LIE /DISABLE LS08/LS8E INTERRUPTS + LCP /DISABLE LP08/LE8 INTERRUPTS + ION + TAD CONLPF + JMS I SETFLG /SET THE LINE PRINTER FLAG FOR THE USER + TAD TTCHAR + JMP CONLP2 +CONLP1, TAD CONDDB + FETCH /NO - GET ANOTHER CHARARCTER FOR THE LINE PRINTER + JMP CONOU9 /LINE PRINTER BUFFER IS EMPTY + LSF /IS IT READY FOR THE NEXT CHARACTER ALREADY? + JMP CONOU4 /NO - JUST TUCK THIS ONE AWAY FOR AN INTERRUPT TO TAKE +CONLP2, LPC + STL CLA RTR + DCA I WS0 /REMEMBER THE HHARDWARE IS BUSY + JMP CONLP1 + CONJAM, TAD I CONDDB + AND C0037 /REMOVE THE JAM REQUEST + DCA I CONDDB + TAD C0007 /BELL? + SZL + TAD C0014 /NO - "XOFF" + JMP CONOU4 + +CONOU7, TAD CONDEV + DCA CONTLS + TAD I CONTLS + TAD C0005 /CONSTRUCT TLS, PLS, OR "JMP T8OUT" + DCA CONTLS + TAD TTCHAR +CONTLS, .-. /TLS, PLS, OR "JMP T8OUT" + STL CLA RTR /AC=2000 + ION + DCA I WS0 + JMP CONOU3 /GET ANOTHER CHARACTER + +CONGET, 0 + TAD WS0 + STL RAL /TIMES 2 PLUS 1 + TAD DEVOUT + DCA CONDBA /DEVTBL POINTER + TAD I CONDBA /IS THERE A DDB FOR THIS DEVICE? + SZA + JMP I CONGET +CONOU9, CLL STA RAR + CIF /NO INTERRUPTS + AND I WS0 + DCA I WS0 /CLEAR THE REQUEST FLAG + TAD I CONDBA /DOES [S]HE EXIST? + SNA + JMP CONOU1 /NO - SO WE'RE FINISHED + DCA AXS1 + TAD I AXS1 /JOB + SZA CLA + JMP CONOU1 /STILL DEFINED + DCA I CONDBA /CLEAR HIM/HER FROM DEVTBL + TAD CONDDB /TIME TO RELEASE THE DDB + CDF + RETBLK + DATFLD + STA +TTIME2, TAD AXS1 /ADDRESS OF DDB + JMS I CONCLR /FLUSH OUT BUFFER + DCA I WS0 + JMP I .+1 + CONOU2 + TOFA1, +TTIME, 0 + AND C1000 +C7740, SZA SMA CLA /SMA HERE TO MAKE CONSTANT + JMP TTIME1 /OOPS! + CIF /NO INTERRUPTS + TAD I WS0 + SZA SMA /REQUEST OR INACTIVE? + TAD C1000 /NO - SET TIMER BIT + SMA /HOW SHALL WE EXIT? + ISZ TTIME /SKIP - [S]HE'S CURRENTLY ACTIVE + DCA I WS0 /SAVE UPDATED STATUS + JMP I TTIME /AND AWAY +TTIME1, JMS I CONGEA /HUNG - FIND HIS/HER DDB + DCA AXS1 + JMS I CONSEA /WAKE HIM/HER UP + STL RTL + TAD WS1 + SPA CLA /WHICH DEVICE IS IT? + JMP TTIME2 /TELEPRINTER + TAD I AXS1 /JOB OWNING DEVICE + SNA + JMP TTIME2-1 /NO JOB, HUNG -- LET'S GET RID OF HIS/HER BUFFER!! + CDF + ERROR /PASS THE ERROR TO HIM/HER + HUNGDV + DATFLD + JMP I CONO1A /TRY AGAIN NOW + +CONGEA, CONGET +CONSEA, CONSET +CONO1A, CONOU1 +CONCLR, CLRBUF + +TOFT1, +TOFSET, 0 /ONLY CALLED BY "TOF + TAD TOF + SPA CLA /CALLED FROM INPUT OR OUTPUT HANDLER? + JMS I CONSEA /SET OUTPUT FLAGS + JMP I TOFSET + /RETRIEVE A CHARACTER FROM LINKED BUFFER +/CALL: DDB ADDRESS IN AC +/ JMS TOF +/ RETURN BUFFER EMPTY +/ RETURN CHARACTER IN AC + +TOF, 0 + TAD C0005 /INDEX TO COUNT + DCA TOFA1 + TAD I TOFA1 + SNA + JMP I TOF /ALREADY EMPTY + ISZ TOF /SHOW SUCCESS + SPA + JMP TOF3 /GENERATE A FILLER + TAD C7740 + SNA + JMS TOFSET /TIME TO SET STR1 BIT + TAD C0037 /AC NOW = COUNT -1 + SNA + JMP TOF4 /THIS WILL BE THE LAST CHARACTER +TOF0, DCA I TOFA1 + ISZ TOFA1 /POINT TO EMPTY COUNT + ISZ I TOFA1 /ANY LEFT IN THIS BLOCK? + JMP TOF1 /MUST BE + TAD TC7766 + DCA I TOFA1 /RESET THE EMPTY COUNT + ISZ TOFA1 /EMPTY BLOCK + TAD I TOFA1 + CDF + RETBLK /RETURN THE EMPTY BLOCK + DATFLD + DCA I TOFA1 /LINK TO NEXT BLOCK + TAD TC7766 + JMP TOF1+2 +TOF1, TAD I TOFA1 /GET THE COUNT TO DETERMINE POSITION WITHIN THE BLOCK + ISZ TOFA1 /POINT TO EMPTY BLOCK + TAD C0003 + SMA /UNPACK? + STL RAL /YES (MULT BY 2 THEN ADD 1) FUDGE POSITION + SPA /UNPACK? + STL CIA /NO - MAKE OFFSET POSITIVE - SET LINK TO INDICATE NO UNPACKING NEEDED + TAD I TOFA1 /ADD OFFSET TO EMPTY BLOCK POINTER + DCA TOFA1 + TAD I TOFA1 /GET CHARACTER; OR AT LEAST PART OF IT + SZL /UNPACK? + JMP TOF2 /NO + AND C7400 /SAVE PERTINENT BITS + DCA TOFT1 + ISZ TOFA1 + TAD I TOFA1 /GET THE OTHER HALF OF THE CHARACTER + AND C7400 /THROW AWAY THE JUNK + CLL RTR /START MOVING IT INTO PLACE + RTR + TAD TOFT1 /GET THE M.S. BITS + RTR + RTR /THAT SHOULD DO IT +TOF2, AND C0377 /CLEAR ANY JUNK LEFT OVER + JMP I TOF /AND AWAY +TOF3, TAD C0400 /INCR. FILLER COUNT + DCA I TOFA1 + JMP I TOF /EXIT WITH FILLER (NULL) CHARACTER +TOF4, JMS TOFSET /SET THE STR1 BIT FOR THIS DEVICE + STA + TAD TOFA1 + DCA TOFT1 /POINTS TO FILL BLOCK POINTER + TAD I TOFT1 + CDF + RETBLK /RETURN THE LAST BLOCK OF THE BUFFER + DATFLD + AND TOF + SMA CLA /CALLED FROM INPUT OR OUTPUT HANDLER? + TAD WS0 /INPUT - CHECK FOR NON-ZERO BREAK-MASK + SNA CLA + JMP TOF5 /NO "JSDEL" TO CLEAR + TAD C0100 + JMS I TOFCLR /CLEAR JSDEL - THIS IS THE LAST CHARACTER +TOF5, DCA I TOFT1 /CLEAR FILL POINTER SO WE KNOW WE'RE EMPTY + JMP TOF0 + +TC7766, 7766 +TOFCLR, CLSTR1 + /ROUTINE TO ALLOW SI & FIP TO CLEAR BUFFERS BY WAY OF FIELD 0 ROUTINE +SICLR, 0 + JMS I CONCLR + CIF CDF 20 /BACK TO FIELD 2 + JMP I SICLR + +/CLEAR STATUS +UCLS, GETJTW /ADDRESS OF STR0 TO JOBSWA + JOBSTS + CLA CLL CMA RTL /-3 IN AC + DCA WS0 + TAD C2407 /DON'T LET HIM/HER MESS UP STR0 + SKP +Y1, STA /LET HIM/HER ANYTHING IN STR1 AND D.S.R. + UDF /UP TO USER FIELD + AND I L2SA /GET BITS TO CLEAR + CMA + DATFLD + AND I JOBSWA /CLEAR THEM + DCA I JOBSWA /SAVE NEW VALUE + ISZ L2SA /BUMP POINTER +C0020, 20 /NOP + ISZ JOBSWA /BUMP POINTER + ISZ WS0 /COUNT, 3 STATUS WORDS TO CLEAR + JMP Y1 + DCA L2SA /CLEAR HIS/HER AC + UUOEXT +C2407, JSEREN JSPEEK UUOERF SWPRER SWPWER DSKERR HUNGDV + + +/RETURN CONTENT OF STATUS WORD IN AC +/CALL TAD POINTER TO JOB STATUS ADDRESS +/ GETJTI +/ RELATIVE ADDR OF WORD +/ RETURN (ADDRESS OF WORD IN JOBSWA) + +CLR0, +GETJI0, 0 + CDF + DCA JOBSWA /SAVE POINTER TO JOB STATUS + TAD I GETJI0 /GET POSITION IN LIST + DCA .+3 /SAVE IT + TAD JOBSWA /NOW GET ADDRESS OF THIS ENTRY + GETJTA + 0 + DCA JOBSWA /SAVE IT + DATFLD + SZL /IF LINK=0 THERE'S NOTHING TO GET + TAD I JOBSWA /GET CONTENTS OF THAT ADDRESS + CDF + ISZ GETJI0 /INDEX RETURN + JMP I GETJI0 + /RETURN ALL BLOCKS OF LINKED BUFFER TO FREE CORE (EXCEPT DDB) +/CLEAR ENTRIES IN DDB SO WE KNOW IT'S EMPTY +CLRBUF, 0 + SNA + JMP I CLRBUF /OOPS! + TAD C0004 /POINT TO WORD 4 (FILL POINTER + DCA CLR0 + TAD I CLR0 + SNA CLA + JMP I CLRBUF /BUFFER ALREADY EMPTY + DCA I CLR0 /CLEAR FILL POINTER + ISZ CLR0 + DCA I CLR0 /CLEAR CHARACTER COUNT + ISZ CLR0 + ISZ CLR0 + TAD I CLR0 /EMPTY BLOCK POINTER + CDF + RETBLK /RETURN A BLOCK TO FREE CORE + SZA + JMP .-2 /DELETE ANOTHER BLOCK + DATFLD + DCA I CLR0 /CLEAR THE EMPTY BLOCK POINTER + JMP I CLRBUF + + + + + +SCHNUL, TAD C0100 /RUN NULL JOB IN USER MODE + DCA L2SF /FIELD 0; USER MODE + TAD SCHNJA + DCA L2SV0 + ISZ NULAC /BUMP NULL JOB'S AC + TAD NULAC + DCA L2SA /RESTORE IT + EXIT /OFF TO NULL JOB + +NULAC, 0 +SCHNJA, NULJOB + /ROUTINE TO SET EITHER JSTEL, JSLPT, OR JSPTP IN STR1 + +CONSET, 0 + CLA STL RTL + TAD WS1 /FROM POSITION IN OUTREG DETERMINE DEVICE FLAG POSITION + SNA + JMP .+4 /IT'S THE PUNCH + SMA CLA /SKIP IF TELEPRINTER + TAD C0020 /IT'S THE LINE PRINTER + TAD CC0014 + TAD C0004 + JMS I SETFLG /SET THE APPROPRIATE BIT IN STR1 + JMP I CONSET + +/QUEUE DISC REQUEST +/CALL TAD ADDRESS OF TRANSFER BLOCK +/ JMS DSQUE +/ RETURN + +DSQFLD= C0002 /FILPIF + +DSQUE, 0 + DCA DSQUE1 /SAVE ADDRESS OF PARAMETER BLOCK + TAD DSQUE1 /NOW GET POINTER TO WORD WITH FIELD & FILE DATA + TAD DSQFLD + DCA DSQUE2 /SAVE POINTER + DATFLD + TAD I DSQUE2 /GET FIELD # (BITS 7-9) AND FILE # (BITS 10-11) + AND C0037 /USE THIS VALUE AS DSUTBL INDEX + TAD DSUTBA + DCA DSQUE2 /SAVE POINTER TO DSUTBL + TAD DSQUE1 /GET PARAMETER ADDRESS + DCA I DSQUE2 /SAVE IN DSUTBL +UPEEK3, CDF /AND EXIT + JMP I DSQUE + +/SUBROUTINE TO CHECK FOR PRIVILEGE CONDITION FOR USER DOING UUO +/PRIVILEGE BITS ARE SET EITHER BY THE ACCOUNT NUMBER BEING LESS THAN +/FOUR (FIP) OR BY A REQUEST TO RUN A LIBRARY PROGRAM USING R, KJOB, +/SYSTAT, OR LOGOUT. THE LATTER BIT IS SET BY SI, AND CLEARED EVERY +/TIME THAT SI IS ENTERED. + +DSQUE1, +PRIV, 0 + GETJTW + JOBSTS /GET STR0 + AND C0600 /IS EITHER PRIVILEGE BIT SET? + SZA CLA + JMP I PRIV /YES, OK + JMP I .+1 /NO, ERROR; INVALID IOT + UUOERR + /LOGOUT IS A PRIVILEGED IOT, UNLESS THE AC=0 + +ULOGO, TAD L2SA /IS AC=0? + SZA CLA + JMS PRIV /NO - CHECK FOR PRIVILEGE + ISZ AXS1 /FUDGE SO AXS1 WILL LEAD TO A 0 + JMP I .+1 /NOW JUMP DIRECTLY TO THE NON-RESIDENT + UUO6 /UUO CODE + +/PEEK IS A PRIVILEGED IOT +UPEEK, JMS PRIV /MAKE SURE A PRIVILEGE BIT IS SET + STA /BACK UP HIS/HER AC + TAD L2SA + DCA AXS1 /BECAUSE OF AUTO-INDEX + UDF + TAD I AXS1 /GET CORE-FIELD + AND C0010 /LET HIM/HER SEE FIELDS 0,1 + /COULD PROBABLY LET HIM/HER SEE MORE, BUT HAVE + /TO WORRY ABOUT NON-EXISTENT CORE. + TAD UPEEK3 /MAKE A CDF + DCA UPEEK1 + STA + TAD I AXS1 /BEGINNING MONITOR ADDRESS-1 + DCA AXS2 + TAD I AXS1 /BEGINNING USER ADDRESS + DCA WS0 + TAD I AXS1 /MINUS HOW MANY WORDS + DCA L2SA +DSQUE2, +UPEEK1, .-. /CDF TO MONITOR FIELD + TAD I AXS2 /GET WORD + UDF /USER DATA FIELD + DCA I WS0 /GET RID OF WORD + ISZ WS0 +CC0014, 14 /NOP + ISZ L2SA /THROUGH? + JMP UPEEK1 /NO + UUOEXT /YES -- AND HIS/HER AC=0!! + + *CORTBL + LOCK /DATFLD + LOCK /FIELD 2 + LOCK /FIELD 3 + LOCK /FIELD 4 + LOCK /FIELD 5 + LOCK /FIELD 6 + LOCK /FIELD 7 + +/THE ABOVE ARE UNLOCKED BY INIT AS A FUNCTION OF # USER FIELDS + + + *L2QTB +ZBLOCK 20 /LEVEL 2 QUEUE + /COMBINED RESIDENT IOTS +UUOTBL, 6040 /TELEPRINTER + 6660 /LPT + 6030 /KEYBOARD + 6010 /READER + 6020 /PUNCH + 6500 /RESERVED FOR FUTURE USE + 0 + +/UNCOMBINED RESIDENT IOTS + + 6603 /RFILE + 6605 /WFILE + 6200 /CKS - CHECK STATUS + 6405 /CLS - CLEAR STATUS + 6400 /KSB - SET KEYBOARD BREAK + 6401 /SBC - SELECTIVE BUFFER CLEAR + 6402 /DUP - DUPLEX TELETYPE CONSOLE + 6403 /UND - UNDUPLEX TTY + 6411 /URT - USER RUN TIME + 6412 /TOD - TIME OF DAY + 6413 /RCR - RETURN CLOCK RATE + 6414 /DATE + 6415 /SYN - QUANTUM SYNCHRONIZATION + 6416 /STM - SET TIMER + 6417 /SRA - SET RESTART ADDRESS + 6617 /ACT - RETURN ACCOUNT NUMBER + 6420 /TSS - SKIP ON TSS/8 + 6421 /USE - USER + 6422 /CON - USER CONSOLE + 6423 /PEEK - LOOK IN MONITOR CORE + 6430 /SSW - SET SWITCH REGISTER + 6431 /SEA - SET ERROR ADDRESS + 6614 /SIZE + 6004 /GTF - GET FLAGS ( LINK AND GT ONLY ) + 6005 /RTF - RESTORE FLAGS (LINK AND GT ONLY) + 6006 /SGT - SKIP ON EAE GT FLAG + 6764 /DTXA - DECTAPE READ OR WRITE + 6771 /DTSF - DECTAPE SKIP + 6772 /RDS - READ DEVICE STATUS REGISTER (DT, RK, & CDR) + 6773 /DTSF RDS - MICROCODED + 6743 /DLAG - RK05 READ OR WRITE + 6632 /RCRA - READ CARD ALPHA + 6634 /RCRB - READ CARD BINARY + 6636 /RCRC - READ CARD COMPRESSED + 6615 /LOGOUT - MUST BE LAST IN GROUP, SEE ULOGO FOR DETAILS + 0 + /NON-RESIDENT IOTS + + + 6440 /ASD - ASSIGN DEVICE + 6442 /REL - RELEASE DEVICE + + 6601 /OPEN - OPEN FILE + 6602 /CLOS - CLOSE FILE + 6600 /REN - RENAME FILE + 6604 /PROT - PROTECT FILE + + 6610 /CRF - CREATE FILE + 6611 /EXT - EXTEND FILE + 6612 /RED - REDUCE FILE + 6406 /SEGS - RETURN NUMBER OF FREE DISK SEGMENTS + 0 + +/LONG NON-RESIDENT IOTS + + 6613 /FINF + 6616 /WHO + 0 + + + /MICRO-CODED RESIDENT IOT DISPATCH + +UUODTB, UTEL /TELEPRINTER +IFNZRO LPT /LINE PRINTER +IFZERO LPT + UKEY /KEYBOARD + UPTR /READER +IFNZRO PUNCH /PUNCH +IFZERO PUNCH + UUOERR /RESERVED FOR FUTURE USE + 0 + + +/NON-MICRO-CODED RESIDENT IOT DISPATCH + + UFILE + UFILE + UCKS + UCLS + UKSB + USBC + UDUP + UUND + UURT + UTOD + URCR + UDATE + USYN + USTM + USRA + UACC + UTSS + UUSE + UCON + UPEEK + USSW + USEA + USIZE + IFNZRO CPU&7776 +IFZERO CPU&7776 +IFZERO CPU-2 +IFNZRO CPU-2 +IFNZRO TC01 +IFZERO TC01 + UUOEX2 + UDTRB + UDTRBS +IFNZRO RK05 +IFZERO RK05 +IFNZRO CDR < + UUCDR0+2 + UUCDR0+1 +IFNZRO CPU&7776 +IFZERO CPU&7776 > +IFZERO CDR + ULOGO /LOGOUT - MUST BE FOLLOWED BY A 0 + /SEE ULOGO FOR DETAILS + 0 + +/-# ARGUMENTS FOR NON-RESIDENT IOTS + + 0 /ASD + 0 /REL +UFILCT, -6 /OPEN + 0 /CLOS + -6 /REN + 0 /PROT + -4 /CRF + -4 /EXT + -4 /RED + 0 /SEGS + 0 + -2 /FINF + -2 /WHO + 0 + \ No newline at end of file diff --git a/tss8/system/ts8e.pal b/tss8/system/ts8e.pal new file mode 100644 index 0000000..7a8c0e2 --- /dev/null +++ b/tss8/system/ts8e.pal @@ -0,0 +1,1329 @@ + VERNUM +UTSS, TAD .-1 /SKIP ON TSS/8 + DCA L2SA /AND RETURN VERSION # IN AC +UUOEX2, ISZ L2SV0 /POSITIVE FLAG TEST EXIT + NOP + +/ENTRY FOR UUOEXT +/SETS UP WAIT MASK 1 IF THERE ARE ANY WAIT CONDITIONS FOR STR1 +/IF THERE IS NOTHING TO WAIT FOR, WE EXIT BACK TO THE USER + + +UUOEX1, SNA + JMP UUOEX3 /NO WAIT CONDITIONS + CDF + DCA WS0 /SAVE BITS TO CLEAR + GETJTW /SET UP WAIT MASK + JOBWMK + CLA IAC + TAD WS0 /WAIT ON THIS FLAG+JSWAIT + DATFLD + DCA I JOBSWA /SET WAIT MASK 1 + TAD I JOBSWA + JMS I CLEAR1 /CLEAR SAME BITS IN STR1 + WAIT +CLEAR1, CLSTR1 + +UUOEX3, DATFLD + TAD I JOBDAT + IAC + DCA JOBSWA /POINTS TO STR0 + TAD I JOBSWA + SMA CLA /STILL RUNNABLE? + WAIT /NO + ISZ JOBSWA + CLL STA RAL /AC=7776 + AND I JOBSWA + IAC /MAKE SURE JSWAIT IS SET + DCA I JOBSWA + ISZ JOBSWA + ISZ JOBSWA /POINT TO WAIT MASK + IAC + DCA I JOBSWA /FORCE DUMMY WAIT BIT ONLY + EXIT + /SET SWITCH REGISTER, RESTART ADD, ERROR ADD, OR KEYBOARD BREAK + +UKSBRK= C0002 /DDBBRK + +UKSB, TAD JOB + TTYUSE /FIND USER INPUT TTY DDB + TAD UKSBRK + DCA JOBSWA /POINTS TO BREAK MASK IN DDB + TAD L2SA /USER AC + DATFLD + SZA + JMP UKSB1 /[S]HE HAS NEW MASK -- GO PICK IT UP + TAD I JOBSWA /[S]HE WANTS TO READ OLD MASK + JMP UKSB1+1 /GIVE IT TO HIM/HER +USSW, TAD C0002 /SET AC=2 +USEA1, IAC /AC=AC+1 +USRA, TAD C0005 /AC=AC+5 + DCA .+2 /SAVE RELATIVE ADDRESS + GETJTW /GET POINTER + 0 /POSITION IN LIST + CLA /WE ONLY WANTED POINTER + TAD L2SA /GET CONTENTS OF USER AC + DATFLD +UKSB1, DCA I JOBSWA /SAVE IN JOB DATA AREA + DCA L2SA + UUOEXT /AND AWAY + + +RINTA, RINT +CDTIMA, TIMCDR +INTCDR, RCSD + JMP I RINTA /CONTINUE IN INTERRUPT SKIP CHAIN + RCRD /CLEAR CARD DONE FLAG + TAD I CDTIMA + SNA CLA /WERE WE EXPECTING AN INTERRUPT? + DISMIS /NO + DCA I CDTIMA /NO MORE INTERRUPTS ALLOWED - WE FINISHED THIS CARD + TAD .+2 + DISMIS /SCHEDULE LEVEL 2 + CDL20 +/ACCOUNT NUMBER +UACC, TAD L2SA + JMS JOBCHK /SEE IF IT'S A VALID JOB + JMP UACC0 /IT WASN'T - RETURN A ZERO + TAD JOBTBA + GETJTI /GET THE ACCOUNT NUMBER OF THE JOB + JOBACC +UACC0, DCA L2SA /RETURN IT TO HIM/HER + UUOEXT + IOR1, +JOBCHK, 0 + SNA /SPECIFIC JOB? + TAD JOB /NO - HIS/HER OWN JOB + DCA WS1 + TAD WS1 + CLL + TAD JOBS /IS IT REALLY A JOB? + SNL CLA + TAD WS1 + TAD JOBTBA + DCA JOBSWA + DATFLD + TAD I JOBSWA /IS THERE REALLY A JOB? + SNA CLA + JMP I JOBCHK /NO - RETURN WITHOUT SKIP + ISZ JOBCHK + TAD WS1 /JOB NUMBER REQUESTED + JMP I JOBCHK +JOBS, -JOBMAX-1 + +DTRKHG, 0 + ERROR /DECTAPE OR RK05 IS HUNG + HUNGDV /REPORT IT TO THE USER + CIF DATFLD /BACK TO FIELD 1 + JMP I DTRKHG +/INCLUSIVE OR +/CALL TAD ADDRESS OF WORD TO SET +/ IOR +/ BITS TO SET +/ RETURN + +IOR0, 0 + DCA IOR1 /SAVE ADDRESS TO SET + RDF /FIELD TO SET IT IN + TAD .+2 /COMPUTE FIELD SELECT - FOR THAT FIELD + DCA IOR2 /SAVE IT + CDF + TAD I IOR0 /GET BITS TO SET +IOR2, 0 /SET FIELD AGAIN + DCA IOR2 /SAVE THEM + TAD IOR2 + CMA + AND I IOR1 /CLEAR THE BITS IF ALREADY SET + TAD IOR2 /NOW SET THEM + DCA I IOR1 /SAVE NEW VALUE + ISZ IOR0 /SKIP ARGUMENT IN CALL + JMP I IOR0 /RETURN + + *7400 +IFNZRO DC08A < +JMPDC8= JMP I . /SKIP OVER DC08A VECTORS + .+3 +DC8REG= JMP . /SKIP OVER DC08A ACTIVE REGISTERS + IAC + ISZ ACFLG /SWITCH TO OUTPUT SIDE + TAD DCCNT + TAD ACX10 + DCA ACX10 /SKIP OVER THE DC08A ENTRIES IN THE TABLE + JMP ACINT1 /BACK TO WORK +DCCNT, DC08A-1 > +*7410 + +RINT, DCA SRVFLG /CLEAR LEVEL 2 REQUEST FLAG + DATFLD + RSF + JMP ACINT + RRB /GET CHARACTER FROM THE READER + DCA I ACX11 /PUT IT IN THE RING BUFFER + CDF + ISZ RCNT /ENOUGH?? + JMP RINT1 /NO - SEE IF THERE'S STILL ROOM IN THE RING BUFFER +RINT0, DCA I RTIM + DATFLD + CMA + JMP ACINT8 /READER IS LINE # 7777 +RINT1, TAD KEYC /IS THERE ENOUGH ROOM LEFT IN THE RING-BUFFER? + TAD RLIM + SMA CLA + JMP RINT2 + RFC /KEEP THE READER GOING + CLL CMA RAL /SET TIMER FOR 2 MORE SECONDS + JMP RINT0 +RINT2, TAD RL2A + DCA I L2Q /SCHEDULE THE READER TO BE RESTARTED AFTER THE BUFFER HAS BEEN EMPTIED + ISZ SRVFLG /REMEMBER WE WANT LEVEL 2 + JMP RINT0 + +RLIM, -NULINE-1 +RL2A, L2PTR1 +RTIM, TIMPTR +RCNT, 0 + +OUTIOT= ISZ ACFLG +ENDIOT= JMP ACINT6 + ACINT, CLL STA RAL /AC=-2 + DCA ACFLG /START BY CHECKING FOR INPUT + TAD ACTBLA /ADDRESS OF THE SKIP IOT'S + DCA ACX10 + STL RTL +ACINT0, TAD HIPRO + DCA HICNT /SHORT LOOP COUNT TO PROTECT HI-PRIORITY DEVICES + DATFLD +ACINT1, ISZ HICNT + JMP ACINT2-2 + JMS I HIPRIA /GO CHECK RK, DT, & CDR + SNA /ANYTHING REQUESTED? + JMP ACINT0 /NO + DCA I L2Q /QUEUE THEIR REQUEST FOR THEM + ISZ SRVFLG /REMEMBER IT + JMP ACINT0 /RE-INITIALIZE THE COUNT + TAD I ACX10 + DCA ACINT2 +ACINT2, .-. /DEVICE SKIP + JMP ACINT1 /NOT THIS ONE + TAD ACINT2 + TAD C0005 /GENERATE READ OR SEND IOT + ISZ ACFLG + JMP ACINT7 /MUST BE A KEYBOARD + DCA ACINT3 /SAVE THE TLS, PLS, OR LPC + TAD ACX10 + TAD ACOUT /DETERMINE THE LINE NUMBER + DCA ACFLG /THIS LINE'S OUTPUT REGISTER + TAD I ACFLG + RAR + SNL + JMP ACINT5 /NOTHING WAITING TO GO +ACINT3, .-. + CLA STL IAC + RTR + DCA I ACFLG /HARDWARE BUSY AND REQUEST FLAGS SET + DCA TTOFLG /SCHEDULE LEVEL 2 +ACINT4, TAD L2Q /POSITION OF FILL POINTER + TAD L2QBOT /MINUS L2QTB-1 + CIA + TAD SRVFLG /DON'T COUNT THE ONES WE JUST PUT IN + SNA CLA /SHOULD WE SCHEDULE LEVEL 2? + TAD EXITA /YES + DISMIS + ACINT5, CLA IAC + TAD ACINT2 + DCA .+1 +HICNT, .-. /TCF, PCF, OR LCF + STL CLA RAR /AC=4000 + AND I ACFLG + DCA I ACFLG /NO MORE INTERRUPTS EXPECTED FROM THIS LINE +ACEXIT, TAD SRVFLG /ANY REQUESTS? + SZA CLA + JMP ACINT4 /YES - MAKE SURE THEY'RE SCHEDULED + DISMIS /NOTHING SPECIAL + +ACINT6, LSRP /LP08/LE8 ERROR? + JMP ACEXIT /NO, MUST BE AN UNDEFINED INTERRUPT + LCP /CLEAR INTERRUPT ENABLE + JMP ACEXIT + +ACINT7, DCA ACFLG /SAVE THE KRB IOT +ACFLG, .-. + SNA + JMP ACEXIT /THROW AWAY NULL CHARACTERS + AND C0177 + TAD C0200 /FORCE ON THE "PARITY" BIT + DCA I ACX11 /STASH IT IN THE RING BUFFER + TAD ACTBLA + CMA + TAD ACX10 /LINE NUMBER CAUSING INTERRUPT +ACINT8, JMS ACINT9 /STASH LINE NUMBER & UPDATE POINTERS ETC. + JMP ACINT4 /SCHEDULE LEVEL 2 IF WE WERE IN USER MODE +ACINT9, 0 + DCA I ACX11 /STASH AWAY THE LINE NUMBER + ISZ KEYC /COUNT THE ENTRY + ISZ ACCNT /END OF RING BUFFER + JMP I ACINT9 /NO + TAD ACRING + DCA ACX11 /YES - RESET POINTER + TAD ACSIZE + DCA ACCNT /AND THE COUNT + JMP I ACINT9 + +SRVFLG, 0 +TTOFLG, 1 /NON-ZERO WHEN SERVICE IS NOT REQUIRED +ACRING, RINGIN-1 +ACCNT, -INPUTS +ACSIZE, -INPUTS +KEYC, 0 +HIPRO, +IFNZRO CPU-2 < -4 > +IFZERO CPU-2 < -6 > +HIPRIA, DTCHK +ACTBLA, SKPTBL-1 +ACOUT, OUTREG-SKPTBL-NULINE-2 +L2QBOT, -L2QTB+1 + *7600 +/SYSTEM DISK HANDLERS FOR TSS/8 +/ SWPIO - HANDLES ALL SWAPS (ONLY SWAPS) +/ DSGO0 - HANDLES ALL OTHER TRANSFERS INCLUDING OVERLAYS + +SWPIO, 0 / + CLA CLL CMA RTL /=3 IN AC + DCA DSERRI /# OF TRIES + JMS SWPIT /START THE SWAP + JMP I SWPIO /RETURN + +SWPIT, 0 + TAD SWPA /RETURN ADDRESS FOR INTERRUPT CHAIN + DCA I DSWATA /SAVE IT +IFZERO RF08 < + TAD SQREQ /FIELD TO BE SWAPPED OUT + TAD C0500 /INTERRUPT ON ERROR AND ON COMPLETION + DIML > + DCA DSWC /WORD COUNT + CMA + DCA DSMA /CORE ADDRESS + TAD FINISH /IN OR OUT? + SMA CLA + JMP SWPIN /IN + TAD OUTTRC /GET THE TRACK # TO BE SWAPPED OUT +IFZERO RF08-40 < + TAD SQREQ /FIELD TO BE SWAPPED OUT + DEAL + CLA > +IFZERO RF08 < + DXAL > + DMAW + JMP I SWPIT +SWPIN, TAD INTRC /GET THE TRACK TO READ IN +IFZERO RF08-40 < + TAD SQREQ /FIELD TO BE SWAPPED OUT + DEAL + CLA > +IFZERO RF08 < + DXAL > + DMAR + JMP I SWPIT + + +SWPA, SWPTR /RETURN ADDRESS AFTER SWAP + + SWPTR, JMP SWPERR /OOPS + TAD FINISH /DID WE JUST SWAP IN OR OUT? + SMA + JMP SWPOK /IN; SO WE'RE FINISHED + CIA + DCA FINISH /SAVE IT + JMS SWPIO /START SWAP IN + DISMIS /GO BACK TO WHAT WE WERE DOING + +SWPERR, JMS DSERR /GO TO COMMON ERROR ROUTINE + JMP SWPBAD /SORRY - IT'S OFFICIALLY BAD + JMS SWPIT /TRY AGAIN + JMP DSERRX /GO TO COMMON RETRY EXIT + +SWPOK, CLA IAC /SWAP OK; SKIP ON RETURN +SWPBAD, TAD SWPREA /DISPATCH TO LEVEL 2 SWAP COMPLETION + JMP OK /CLEAR DISK FLAG AND EXIT + +DSERR, 0 +IFZERO RF08 < + STA /SET WC TO CAUSE IMMEDIATE OVERFLOW + DCA DSWC /ONLY SAFE WAY TO STOP THIS DISK + DSAC /SEE IF THE DISK IS STILL BUSY + SKP /THINGS ARE QUIET OUT THERE + DISMIS /WAIT A FEW MICRO-SECONDS + DORS /GET THE STATUS BITS + DCMA /CLEAR EVERYTHING + DCXA /INCLUDING THE TRACK ADDRESS + AND C0004 /DO WE HAVE DRL? + SNA > +IFZERO RF08-40 /STOP DF32 + ISZ DSERRI /NO; SO COUNT IT AS AN ERROR + ISZ DSERR /OK TO RETRY ON RETURN +IFZERO RF08 < + SZA CLA + TAD SLEEPA > /BETTER KNOCK OFF THE EAE USER + DCA DSGO0 /SAVE ADDRESS; IF ANY + JMP I DSERR /BACK TO CALLER + /START DISC TRANSFER +/CALL TAD ADDRESS OF PARAMETERS +/ DSGO +/ RETURN + +DSGO0, 0 + DCA DSPARM + CLA CLL CMA RTL + DCA DSERRI + JMS DSTRYA + JMP I DSGO0 + +DSTRYA, 0 + TAD DSRETA + DCA I DSWATA + CLA CMA /ADDRESS OF PARA-1 FOR INDEX REGISTER + TAD DSPARM + DCA DSPAR + DATFLD + TAD I DSPAR /FUNCTION + DCA DSRORW + TAD I DSPAR /DISC EXTENSION +IFZERO RF08-40 < + CLL RTL + CLL RAL + TAD I DSPAR /MEMORY EXTENSION + CLL RAL + DEAL + CLA> +IFZERO RF08 < + CLL RTR + DXAL + TAD I DSPAR + CLL RAL + AND C0070 + TAD C0500 + DIML /LOAD INTERRUPT ENNABLE AND MEMORY EXTENSION +> + TAD I DSPAR + DCA DSWC + TAD I DSPAR + DCA DSMA + TAD I DSPAR + CDF +DSRORW, 0 + JMP I DSTRYA + DSERR1, JMS DSERR /DO COMMON ERROR ROUTINE + JMP DSGBAD /GIVE UP + JMS DSTRYA /TRY AGAIN +DSERRX, TAD DSGO0 /POSSIBLY AN EAE JOB TO GO TO SLEEP + DISMIS + +DSRET, JMP DSERR1 /ERROR + IAC +DSGBAD, DATFLD + TAD I DSPAR +OK, DCMA + DISMIS /BACK TO MONITOR + +DSPARM, 0 +DSRETA, DSRET +DSWATA, DSWAIT +C0500, 500 + + *7750 +DSWC, DSMA /FOR LOADING INTO FIELD 0 ON INITIALIZATION +DSMA, DSMA /(SINCE THE 4K TRANSFER OVERWRITES THE DATA BREAK LOCATIONS) +SLEEPA, SLEEP +DSERRI, 0 + 0 /FOR DECTAPE SERVICE + 0 /FOR DECTAPE SERVICE +FIELD 4 /FORCE TS8II INTO TRACK 4 AT BUILD TIME + /TS8II 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. + *0 +ZBLOCK 10 /IF ANY OF THESE BECOMES NON-ZERO, FIND OUT WHY! + +*10 +K0030, 30 +K0614, 614 +K0500, 500 +IX3, 0 + +IX4, JOBTBL /WAIT 2 UNQUEUER POINTER +A15, 0 /DECTAPE - FOR EXTRACTING USER INFO. FROM DDB +A16, 0 /BLTF1 - USER FIELD POINTER +A17, 0 /BLTF1 - DATFLD POINTER + +DTJOB, 0 +DTBUF, 0 +DTST, 0 +DTBLKP, 0 +DTBLK, 0 +DTCOM, 0 +DTUCA, 0 +DTTIME, 0 +DTREMB, 0 +DTGOA, DTGO +DTERRA, DTERR +DTBUFA, ENDBUF-1 +DTCAP, 7755 +M2702, -2702 +M201, -201 +K0214, 214 +K0070, 70 +K0400, 400 +K7400, 7400 +K0002, 2 +K0037, 37 +K0005, 5 +K0020, 20 +K7770, 7770 +K0377, 377 +K0006, 6 +K1000, 1000 +K0600, 600 +RKJOB, 0 +RKCORE, 0 +RKCOM, 0 +RKSECT, 0 +RKCNT, 0 +RKBLKS, 0 +RKTIME, 0 +SLEEPB, SLEEP +RKERRA, RKERR +DTRKHA, DTRKHG +WAIT2, WAITS2 +AWAKEN, WAKEUP +DTCHKA, DEVCHK + QUEUE1, QUEUE0 +BLTF1A, BLTF1 +JOBTAB, JOBTBL + +INTS1, 0 /INTERRUPT TEMPORARY STORAGE +INTS2, 0 +TEMP0, 0 /WORKING STORAGE +TEMP1, 0 +TEMP2, 0 +TEMP3, 0 +TEMP4, 0 +K0007, 7 +K0010, 10 +K0200, 200 +K0204, 204 +K0040, 40 +K0004, 4 +K6201, 6201 +K7000, 7000 +K7700, 7700 +K7774, 7774 +K0003, 3 +L2SAP, L2SV0+2 /POINTS TO L2SA IN FIELD 0 +UDF1, 0 /SELECT USER FIELD + 0 + JMP I .-2 + +JOBCNT, -JOBMAX +UDFP, UUDF +DTRKJA, DTRKJB + +F1SCH, 0 +EXITF1= JMP . +K6203, CIF CDF + TAD F1SCH + SNA CLA /ANYTHING JUST OUT OF WAIT? + JMP I .+4 /NO - NORMAL LEVEL 2 EXIT + DCA F1SCH /YES - CLEAR FLAG + JMP I .+1 /IF NULL JOB IS RUNNING RE-SCHEDULE + SCHED0 + L2EXIT + +INTRTN= JMP . + CIF CDF + JMP I .+1 + F1RTN /DISMISS INTERRUPT FROM HI-PRIORITY DEVICE + /JOB TABLE ADDRESS TO TEMP0 +/CALL TAD JOB # +/ JMS GETTBA +/ TABLE ENTRY +/ RETURN WITH ADDRESS IN TEMP0 + +GETTBA, 0 + DATFLD + DCA TEMP0 /SAVE JOB # + TAD I GETTBA /PICK UP ARGUMENT + DCA .+5 + TAD TEMP0 /JOB # + TAD JOBTAB /START OF JOBTBL + CIF + JMS I GETTB1 /GETJTA + 0 + DCA TEMP0 /ADDRESS TO TEMP0 + ISZ GETTBA + JMP I GETTBA +GETTB1, GETJTB + + + *160 +JOB, . /POINTER TO CURRENT JOB NUMBER +CJOBDA, 0 /POINTER TO JOB STATUS BLOCK, CURRENT JOB +CORTBA, CORTBL-1 +DEVTBA, DEVTBL +F1OFFJ, 0 /MASK FOR LOGIN; MODIFIED BY THE "ON & OFF" COMMANDS (ON=0; OFF=7774) +WAITF1= JMP . + CIF CDF + JMP I WAIT1 +WAIT1, WSCHED + + *170 + NULINE /SYSTEM PARAMETERS CONVENIENT FOR SYSTAT + JOBMAX + DEVTBL +UPTIM2, 0 /HIGH ORDER UPTIME IN SECONDS +UPTIM1, 0 /LOW ORDER UPTIME IN SECONDS + +/DDB POINTERS FOR USE BY SI +F1TCNT, 0 /DDB CHARACTER COUNT +F1ECNT, 0 /DDB EMPTY COUNT +F1BUF, 0 /DDB EMPTY BLOCK + *OUTREG + ZBLOCK SKPTBL-OUTREG + +KSKIP= KSF-30 +TSKIP= TSF-40 +*SKPTBL + + KSF /K00 /SKIP IOT FOR CONSOLE KEYBOARD +IFZERO DC08A < + KSKIP+400 /K01 /KEYBOARD SKIP IOTS FOR PT08 AND KL8E + KSKIP+420 /K02 + KSKIP+440 /K03 + KSKIP+460 > /K04 + KSKIP+340 /K05; K01 IF DC08A WITH PT08'S + KSKIP+110 /K06; K02 IF DC08A WITH PT08'S +IFNZRO CPU-1 < + KSKIP+300 > /K07; K03 IF DC08A WITH PT08'S + KSKIP+320 /K10; K04 IF DC08A WITH PT08'S + KSKIP+500 /K11; K05 IF DC08A WITH PT08'S + KSKIP+520 /K12; K06 IF DC08A WITH PT08'S + KSKIP+540 /K13; K07 IF DC08A WITH PT08'S + KSKIP+560 /K14; K10 IF DC08A WITH PT08'S + KSKIP+700 /K15 + KSKIP+360 /K16 + KSKIP+720 /K17 + KSKIP+060 /K20 + KSKIP+140 /K21 + KSKIP+160 /K22 + KSKIP+050 /K23 + + +IFNZRO DC08A < +*SKPTBL+PT08+KL8+1 + DC8REG + ZBLOCK DC08A > /DC08A ACTIVE OUTPUT REGISTERS + + +IFZERO DC08A <*SKPTBL+NULINE+1 + OUTIOT > /SWITCH TO OUTPUT SIDE + TSF /K00 /SKIP IOT FOR CONSOLE TELEPRINTER +IFZERO DC08A < + TSKIP+410 /K01 /TELEPRINTER SKIP IOTS FOR PT08 AND KL8E + TSKIP+430 /K02 + TSKIP+450 /K03 + TSKIP+470 > /K04 + TSKIP+350 /K05; K01 IF DC08A WITH PT08'S + TSKIP+120 /K06; K02 IF DC08A WITH PT08'S +IFNZRO CPU-1 < + TSKIP+310 > /K07; K03 IF DC08A WITH PT08'S + TSKIP+330 /K10; K04 IF DC08A WITH PT08'S + TSKIP+510 /K11; K05 IF DC08A WITH PT08'S + TSKIP+530 /K12; K06 IF DC08A WITH PT08'S + TSKIP+550 /K13; K07 IF DC08A WITH PT08'S + TSKIP+570 /K14; K10 IF DC08A WITH PT08'S + TSKIP+710 /K15 + TSKIP+370 /K16 + TSKIP+730 /K17 + TSKIP+070 /K20 + TSKIP+150 /K21 + TSKIP+170 /K22 + TSKIP+650 /K23 +IFNZRO DC08A < +*SKPTBL+NULINE+PT08+KL8+3 + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 /DC08A OUTPUT VECTOR + JMPDC8 > /DC08A OUTPUT VECTOR +*SKPTP +IFNZRO PUNCH /PUNCH +IFZERO PUNCH +IFNZRO LPT /LINE PRINTER +IFZERO LPT + ENDIOT /TERMINATES LIST + *RINGIN +/ADDITIONAL FREE CORE GENERATION TABLE +/REFERENCED BY INIT AT START TIME +/ THE FOLLOWING AREAS WILL BECOME PART OF FREE CORE: + +IFZERO TC01 RK05 CDR < + ENNDBUF;FCE4 > + +IFNZRO TC01 RK05 CDR < +IFZERO TC01 < + ENDBUF;FCE1 > +IFZERO RK05 < + FCB2;FCE2 + FCB4;FCE4 > +IFZERO CDR < + FCB3;FCE3 > > +IFNZRO DC08A < +IFNZRO D689 < + FCB5;FCE5 > +IFZERO D689 < + FCB5;DATA1 > > + 0 /TO TERMINATE THE LIST +NOPUNCH + ZBLOCK ENDBUF-. /KEYBOARD INPUT RING BUFFER +ENPUNCH +*ENDBUF +NOPUNCH + ZBLOCK 201 /DECTAPE BUFFER +ENPUNCH +*. + + /DECTAPE LEVEL 1 ENTRY + +DTL11, TAD DTREMB /PREVIOUS ERRORS FROM THIS TRANSFER + DTRB /"OR'ED" WITH ANY NEW ERRORS + DCA DTREMB + DTRB /WERE THERE ANY ERRORS? + SMA + JMP I DTXOR /A-OK! + AND K0500 /WHAT WAS IT? + SNA /SELECT ERROR OR TIMING ERROR + JMP DTSR0 /NO - MUST BE MARK, END, OR PARITY + AND K0400 + SZA CLA /TIMING ERROR? + JMP DTSR1 /NO - SELECT ERROR - DON'T RETRY + CLL CMA RAL /AC=-2 + TAD I DTERRA /TIMING ERROR WAS OUR FAULT - INTERRUPT OFF TOO LONG + DCA I DTERRA /DON'T CHARGE HIM/HER FOR THE TURN-AROUNDS +DTSR0, ISZ I DTERRA /COUNT A TURN-AROUND + JMP DTSR2 /OK - CONTINUE SEARCHING +DTSR1, TAD DTREMB /ACCUMULATED ERROR STATUS + RAL + STL RAR /MAKE SURE THE ERROR BIT IS SET + JMP DTSTOP /SHUT HIM/HER DOWN +DTSR2, CDF + TAD DTBLKP + DCA I DTCAP /RESTORE CA TO POINT INTO WORD 2 OF HIS/HER DDB + DTRA /CURRENT STATUS + AND K0377 + DTXA /CLEAR GO, FUNCTION, AND INTERRUPT ENABLE + TAD K0614 /SWITCH DIRECTIONS, GO, SEARCH AND ENABLE +DTSRCH, JMS DTXOR /CONTINUE SEARCHING +DTSR3, TAD DTCOM + RTL + RTL + STA CML RAL /AC=-1 IF FORWARDS R/W; AC=-2 IF REVERSE R/W + DCA DTDIR + TAD I DTBLKP + TAD M2702 + SNL CLA /ARE WE AT A REASONABLE BLOCK NUMBER? + JMP DTSR0 /NO -- TURN AROUND + TAD DTBLK + TAD M2702 + SNL CLA /DOES [S]HE WANT A REASONABLE BLOCK? + JMP DTSR1 /NO -- QUIT LOOKING FOR IT + DTRA /WHICH WAY ARE WE GOING? + RTL + RTL + CLA /PRESENT DIRECTION IS IN THE LINK + TAD DTBLK /BLOCK WANTED + CIA + TAD I DTBLKP /BLOCK FOUND + SNA /ARE WE THERE? + JMP DTSR5 /YES - SEE IF WE ARE GOING IN THE RIGHT DIRECTION + ISZ DTDIR /NO + CIA /REVERSE R/W - NEGATE AC + SMA + JMP DTSR4 /SKIP SOME CODE - WE'RE ON THE WRONG SIDE OF THE BLOCK + SZL /L=1 MEANS WE'RE GOING THE WRONG WAY + TAD K0003 /MAKE ROOM FOR TURN-AROUND + CMA + AND K7770 + SNA /ARE WE CLOSE? + JMS DTSR7 /YES - GO CHECK BUFFER STATUS +DTSR4, AND K7700 /ARE WE TOO FAR AWAY? + SZA SNL SMA + JMP DTSR6 /PUT HIM/HER ON THE TIMER + SNL CLA /ARE WE GOING IN THE RIGHT DIRECTION? + JMP DTSRCH /CONTINUE IN THE SAME DIRECTION + JMP DTSR0 /GO TURN AROUND + +DTSR5, JMS DTSR7 /CHECK ON BUFFER STATUS + ISZ DTDIR + CML /CORRECT LINK FOR REVERSE R/W + SNL /ARE WE GOING IN THE RIGHT DIRECTION? + JMP DTSRCH /NO - CAUSE OVER-SHOOT FOR TURN-AROUND + TAD M201 + CDF + DCA I DTWCP /SET UP DECTAPE WORD COUNT + TAD DTBUFA + DCA I DTCAP /SET UP DECTAPE CURRENT ADDRESS + TAD DTCOM + AND K0040 /READ OR WRITE? + CLL RAR + TAD K0030 + JMS DTXOR /CHANGE FROM SEARCH TO READ OR WRITE +DTSTOP, ISZ DTBUF /ASSIGN THE BUFFER - IF [S]HE DOESN'T ALREADY HAVE IT + AND K7701 + DCA I DTERRA /SAVE STATUS B FOR HIM/HER + DTRA + AND K0400 + SZA CLA /WHICH WAY ARE WE GOING? + TAD K7774 + TAD K0002 + TAD I DTBLKP /REMEMBER WHERE WE WILL FINALLY STOP + DCA I DTBLKP + DTRA + AND K0204 /CLEAR GO & INTERRUPT ENABLE + JMP DTSRCH /TO STOP THE TAPE + DTWCP, 7754 +K7701, 7701 +K0014, 14 + +DTSR6, RTR /DIVIDE BY 100 + RTR + RTR + CIA + DCA DTBUF /-SECONDS TO WIND ON TIMER + TAD K0003 + TAD I DTST + DCA DTDIR /POINTS TO USER WORD 1 + DTRA + AND K0400 + SZA CLA /WHICH WAY SHOULD WE SET THE BRAKES LATER? + ISZ I DTDIR /SET BIT 11 TO SHOW REVERSE + TAD K0014 + JMP DTSRCH /KEEP HIM/HER MOVING WITH INT. DISABLED + +DTSR7, 0 + TAD DTCOM + AND K0020 /IS THIS A READ? + TAD DTBUF /OR - IS THE BUFFER LOADED FOR A WRITE? + SZA CLA + JMP I DTSR7 /PROCEED + JMP DTSTOP+2 /STOP AND WAIT FOR THE BUFFER TO BE LOADED + +DTDIR, +DTXOR, DTSTOP /WHERE TO RETURN ON SUCCESSFUL INTERRUPT + DTXA /ZAP IN THE NEW FUNCTION + DTRA + RTR + RAR + SZL CLA /DID WE STOP? + CML CMA RTL + DCA DTTIME /LOAD THE CONTROLLER TIMER + SNL + TAD DTL2 /WE'RE DONE - SCHEDULE LEVEL 2 + INTRTN +DTL2, DTL20 + /DECTAPE LEVEL 2 COMPLETION +DTL21, TAD DTBUF /WHAT KIND OF COMPLETION? + SNA + JMP DTEND4 /END OF A SEARCH - TAPE NOW IN POSITION FOR THE WRITE + SPA CLA + JMP DTEND6 /THIS DRIVE HAS BEEN PUT ON TIMER + TAD DTCOM + AND K0020 + SNA /WAS IT A READ OR WRITE? + JMP DTEND3 /WRITE - [S]HE'S ALL DONE + JMS DTDATA /READ - TRANSFER HIS/HER DATA BACK TO HIM/HER + EXITF1 /WAIT FOR DISK TO FINISH +DTEND3, TAD DTJOB + JMS I AWAKEN /TAKE HIM/HER OUT OF WAIT STATUS +DTERR, 0 +DTEND4, DCA DTJOB /CONTROLLER IS FREE +DTEND5, JMS I DTGOA /TRY TO START A DECTAPE TRANSFER + EXITF1 + +DTEND6, TAD DTBUF + DCA I A15 /SAVE -SECONDS TO WIND TAPE + ISZ I DTST /CHANGE TO DECTAPE TIMER WAIT + JMP DTEND4 /FIND SOMETHING ELSE TO DO + +/MOVE 201 WORDS TO/FROM USER, FROM/TO DATFLD +/USER MAY BE IN CORE OR ON HIS/HER SWAP TRACK +DTDATA, 0 + DCA TEMP1 /SAVE READ/WRITE INDICATOR: 0=WRITE, 20=READ + CIF + TAD DTJOB + JMS I COREA /NOW FIND OUT WHERE [S]HE IS + SWAP LOCK FIP SI CJOB + JMP DTDA1 /[S]HE'S IN HIS/HER SWAP TRACK + AND K0070 /SAVE HIS/HER FIELD + TAD K6201 + DCA UDF1+1 /UDF1 IS FIXED FOR BLTF1 + TAD DTBUFA + DCA A17 /POINTS TO DECTAPE BUFFER IN DATFLD + TAD DTUCA + DCA A16 /USER BUFFER POINTER + TAD TEMP1 + CLL CMA RTR + RTR + RAR + JMS I BLTF1A /L=0 FOR READ, L=1 FOR WRITE; AC=-201 + ISZ DTDATA /SKIP - DATA HAS ALREADY BEEN MOVED + JMP I DTDATA + DTDA1, IAC + TAD DTUCA + CLL IAC + TAD K0200 + SNL /DO WE HAVE A WRAP-AROUNND SITUATION? + CLA /NO - WE CAN DO THE WHOLE THING AT ONCE + TAD M201 + DCA DTDWC /WC FOR DISK TRANSFER + TAD DTBUFA + DCA DTDCA /CA FOR DISK TRANSFER + TAD DTJOB + TAD K0004 + CLL RTL + DCA DTDHI /TRACK ADDRESS FOR DISK TRANSFER + TAD TEMP1 + SZA CLA + STL RTL + TAD DTDMAR + DCA DTDIOT /DMAR OR DMAW FOR DISK TRANSFER + IAC + TAD DTUCA + JMS DTDGO /START THE DISK + JMP I DTDATA /EXIT - NO SKIP - MUST WAIT FOR DISK + +/DISK PARAMETER BLOCK FOR DECTAPE HANDLER +DTDIOT, 0 +DTDHI, 0 + 7 +DTDWC, 0 +DTDCA, 0 +DTDLO, 0 + DTDSK +DTDPAR, DTDIOT + +COREA, CORSRC +DTDMAR, DMAR +DTDISK, DTDSF0 + +DTDGO, 0 + DCA DTDLO /DISK ADDRESS TO START AT + TAD DTDPAR + CIF + JMS I DTDISK /NOW GO TO TS8 TO START OUR REQUEST + JMP I DTDGO /RETURN HERE AFTER STARTING THE DISK + JMP DTDCMP /RETURN HERE AFTER A GOOD DISK TRANSFER + SKP /RETURN HERE AFTER A BAD DISK TRANSFER + JMP DTEND3 /RETURN HERE AFTER REPORTING THE DISK ERROR + TAD DTJOB /JOB IN TROUBLE + CIF CDF + JMP I .+1 /GO REPORT THE ERROR - MAKE IT SWPRER + DTDEF0 + + DTDCMP, TAD DTDWC + CIA + TAD M201 + SNA /DO WE NEED A SECOND PASS? + JMP DTDCM0 /NO - IT'S DONE + DCA DTDWC + TAD DTDLO /YES - HAVE WE ALREADY DONE IT? + SNA + JMP DTDCM0 /ALL FINISHED! + CIA + TAD DTDCA /UPDATE THE DISK'S C.A. + DCA DTDCA + JMS DTDGO /START THE DISK AGAIN + EXITF1 + +DTDCM0, TAD DTBUF /WAS IT A READ OR A WRITE? + SZA CLA + JMP DTEND3 /READ - WE'RE FINISHED + ISZ DTBUF /ASSIGN THE BUFFER TO HIM/HER NOW + TAD A15 /GO RESTART HIS/HER WRITE + JMP DTEND5 + +DTLOAD, 0 + DCA DTDGO /SAVE THE DESIRED STATUS A + DTRA + DCA DTDATA /AND THE PRESENT STATUS A + TAD DTDGO + AND DTDATA /WHERE WILL CARRIES BE GENERATED + CIA + CLL RAL /WE WANT TO CANCEL THE CARRIES + TAD DTDGO /NOW ADD THEM TOGETHER + TAD DTDATA /NOW WE HAVE THE "XOR" OF THE "PRESENT" AND THE "DESIRED" STATUS A + DTXA /"XOR" IT INTO THE CONTROLLER + JMP I DTLOAD /THE RESULT WILL BE THE DESIRED STATUS A + +STSI, DCA IX4 /SI - WANTS TO STOP A TAPE ON TIMER + CLL CMA RAL + DCA TEMP1 /ONLY STOP ONE TAPE + DCA TEMP2 /PREVENT HIM/HER FROM GOING BACK INTO DECTAPE CONTROLLER WAIT +K7001, IAC + JMS DTIMER /STOP HIM/HER + CIF 20 + JMP I .+1 /BACK TO SI + DTSIDT + /START OR RESTART A DECTAPE READ OR WRITE FOR THE USER + +DTGO, 0 + SZA /ARE WE RESTARTING AFTER A TIMER KILLED US? + JMP DTGO1 /YES - SO WE DON'T NEED TO LOOK AT THE QUEUE + TAD DTJOB + SZA CLA /IS THE CONTROLLER BUSY? + JMP I DTGO /CONTROLLER IS ALREADY BUSY + DCA DTBUF /BUFFER IS EMPTY + JMS I DTRKJA /FIND SOMEONE WAITING FOR THE CONTROLLER + -1 + JMP I DTGO /NOTHING WAITING +DTGO1, AND K7770 + DCA A15 + TAD I A15 /PULL JOB NUMBER FROM DDB + DCA DTJOB + TAD DTJOB + JMS GETTBA /FIND WAIT 2 + JOBWMK+1 + TAD TEMP0 + DCA DTST /SAVE ITS POINTER FOR LATER + ISZ A15 + TAD A15 /ADDRESS TO DUMP BLOCK NUMBERS INTO + DCA DTBLKP + ISZ A15 + TAD I A15 /USER WORD 1 -- UNIT, DIR, FUNC. + DCA DTCOM + TAD I A15 /USER WORD 2 -- BLOCK NUMBER WANTED + DCA DTBLK + TAD I A15 /USER WORD 3 -- USER'S C.A. + DCA DTUCA + TAD DTCOM /DIRECTION FOR THIS OPERATION + AND K0400 +K7740, SZA SMA CLA + TAD DTREV + TAD K0006 /AC=-5 FOR REVERSE R/W; AC=+6 FOR FORWARD R/W + TAD I DTBLKP /GET BLOCK FROM LAST TIME + TAD K0020 /BIAS BY 20 TO AVOID NEG. NUMBERS AND ZERO + STL CIA + TAD K0020 + TAD DTBLK /BLOCK WE WANT + SZL + CIA /AC=ABSOLUTE VALUE OF DIFFERENCE + AND K7740 + DCA TEMP4 /SAVE THAT RESULT FOR LATER + TAD DTCOM + AND K7000 /SAVE ONLY THE UNIT + SZL /LINK=INITIAL SEARCH DIRECTION + TAD K0400 /SEARCH REVERSE INITIALLY + JMS I DTLOAA /LOAD THE CONTROLLER + TAD DTCOM /LOAD THE DECTAPE BUFFER IF: + AND K0020 / ******* [S]HE'S DOING A WRITE + TAD TEMP4 / ******* THE DESIRED BLOCK IS FAIRLY CLOSE + TAD DTBUF / ******* THE BUFFER IS EMPTY + SZA CLA + JMP DTGO2 /AT LEAST ONE OF THE ABOVE IS FALSE + JMS I DTGETW /MOVE 201 WORDS FROM USER (CORE OR SWAP TRACK) TO DATFLD + JMP DTGO3 /WAIT FOR THE DISK TO FINISH + ISZ DTBUF /ASSIGN THE BUFFER TO HIM/HER +DTGO2, TAD DTSR3A + DCA I DTXORA /SET UP FOR SEARCH MODE + DCA DTREMB /CLEAR ERROR ACCUMULATOR + CDF + TAD DTBLKP + DCA I DTCAP /SET UP CA FOR THE BLOCK NUMBERS + CIF DATFLD /INHIBIT INTERRUPTS + TAD K0010 /ALL DATA BREAKS ARE TO DATFLD + DTLB + TAD K7770 + DCA I DTERRA /ALLOW 10 CHANGES OF DIRECTION + TAD K0214 + DTXA /GO, SEARCH, INT. ENABLE + CLL CMA RTL /SET CONTROLLER TIMER FOR 3 SECONDS +DTGO3, DCA DTTIME + JMP I DTGO + +DTREV, -13 +DTSR3A, DTSR3 +DTGETW, DTDATA +DTXORA, DTXOR +DTLOAA, DTLOAD + DTIMER, 0 + JMS I DTRKJA /FIND A JOB IN DECTAPE TIMER WAIT + -2 + JMP DTIME3 /ALL DONE + TAD K0005 + DCA TEMP3 /POINTER TO TIMER COUNT +DTIME1, CLL CMA RTL /AC=-3 + ISZ I TEMP3 /IS HIS/HER TIMER UP? + JMP DTIMER+1 + TAD TEMP3 /YES - JAM ON THE BRAKES + DCA TEMP4 /POINT TO USER WORD 1 + CIF DATFLD /INHIBIT INTERRUPTS + DTRA /GET STATUS OF CURRENT UNIT + AND K0004 /SAVE ENABLE + SZA /IS IT REALLY DOING SOMETHING? + TAD K0200 /YES - CLEAR GO AND ENABLE + DTXA + TAD I TEMP4 + AND K7001 /SAVE UNIT AND CURRENT DIRECTION + TAD K0377 /MOVE THE DIRECTION BIT INTO POSITION + AND K7400 + JMS I DTLOAA /STOP HIM/HER!!! + TAD K7770 + AND I TEMP4 + DCA I TEMP4 /CLEAR "BRAKE" BIT + TAD TEMP2 + TAD I TEMP0 + DCA I TEMP0 /PUT HIM/HER BACK IN DECTAPE WAIT + JMP DTIME1 /CHECK FOR OTHER DRIVES TO STOP +DTIME3, TAD TEMP4 + SNA CLA + JMP DTIME4 /NOTYING STOPPED THIS TIME + TAD DTTIME /WAS ANYTHING IMPORTANT GOING ON? + SZA CLA + TAD A15 /YES - LET'S GET BACK TO IT + JMS I DTGOA /START SOMETHING +DTIMEX, JMP I DTIMER +DTIME4, CIF DATFLD /INHIBIT INTERRUPTS + TAD DTTIME /IS THE CONTROLLER BUSY? + SZA CLA /NO + ISZ DTTIME /YES - BUMP CONTROLLER TIMER + JMP I DTIMER + DTRA /IT'S HUNG + AND K0204 + DTXA /STOP THE TAPE (IF IT'S EVEN MOVING) + STA + DCA I DTERRA /LET HIM/HER KNOW THE TRANSFER PROBABLY DIDN'T HAPPEN + IAC + DCA DTBUF + DCA DTCOM + TAD DTJOB + JMS DTRKER /REPORT THE ERROR & SCHEDULE LEVEL 2 + DTL20 + JMP I .+1 /BACK THROUGH THE TIMER CODE + DTIMEX + FCE1= .+1&7770 +DTRKER, 0 + CIF CDF + JMS I DTRKHA /REPORT THE HUNG DEVICE + TAD I DTRKER /GET THE L2 DISPATCH ADDRESS + ISZ DTRKER /BUMP PAST THE ARG. + CIF CDF + JMS I QUEUE1 /PUT IT ON LEVEL 2 QUEUE + JMP I DTRKER + +UUDTRK, DCA TEMP2 + TAD I L2SAP /GET USER AC + DCA TEMP1 + SNL /DON'T CLEAR THE AC IF IT'S AN RK05 REQUEST + DCA I L2SAP /CLEAR HIS/HER AC + TAD I UDFP /GET THE "CDF" FOR HIS/HER FIELD + DCA UDF1+1 + JMS UDF1 /CHANGE TO USER FIELD + TAD I TEMP1 /GET WORD 1 OF HIS/HER PARAMETERS + SZL /RK05? + JMP URK05 /YES + RTL + RTL + AND K0007 /AC=UNIT NUMBER +UDTXAD, TAD DTDEVA /INDEX INTO THE DEVICE TABLE + DCA UDTDDB + DATFLD + CIF /FIELD 0 ROUTINE + JMS I DTCHKA /SEE IF [S]HE OWNS THIS UNIT +UDTDDB, 0 + STA + TAD TEMP1 + DCA A16 + TAD I UDTDDB + TAD K0003 /SET UP TO MOVE PARAMETERS + DCA A17 + CLL CMA RTL /L=1; AC=-3 + JMS I BLTF1A /MOVE 3 WORDS FROM UDF TO DATFLD + TAD I UDTDDB + TAD TEMP2 + JMS I WAIT2 /SET WAIT 2 CONDITION FOR DECTAPE OR RK05 + TAD TEMP2 + CLL RTR + SZL CLA /RK05? + JMP RK05GO /YES + JMS I DTGOA /NO - TRY TO START THE DECTAPE + WAITF1 + +URK05, CLL RAR + AND K0003 /RK05 UNIT # + TAD K0010 /DISPLACE TO RK05 DDB'S + JMP UDTXAD +DTDEVA, DEVTBE+5 + /SEARCH FOR A JOB WAITING FOR A "WAIT 2" CONDITION +/CALLING SEQUENCE: +/ AC=0 COMPLETE PASS; AC NON-ZERO FINISH CURRENT PASS +/ JMS DTRKJB +/ MINUS WAIT CONDITION NUMBER +/ RETURN - NO JOBS FOUND +/ RETURN - CONTENTS OF WAIT 2 IN AC + +DTRKJB, 0 + SZA CLA /DO WE WANT A FULL PASS? + JMP DTRK2 /NO - JUST COMPLETE FROM WHERE WE LEFT OFF + TAD JOBCNT + DCA TEMP1 /SET COUNT FOR JOBMAX +DTRK1, TAD IX4 /CHECK POSITION OF RING POINTER + TAD DTRKEN + SZA CLA + JMP .+3 + TAD JOBTAB /RESET RING POINTER + DCA IX4 + TAD I IX4 + SNA /IS THIS JOB DEFINED? + JMP DTRK2 /NO + TAD K0005 /POINT AT WAIT 2 + DCA TEMP0 + TAD I TEMP0 + AND K0007 + TAD I DTRKJB + SZA CLA /IS [S]HE WAITING FOR OUR CONDITION? + JMP DTRK2 /NOPE + TAD I TEMP0 /PUT THE CONTENTS OF WAIT 2 IN THE AC + ISZ DTRKJB /CAUSE SKIP ON EXIT + JMP DTRK3 +DTRK2, ISZ TEMP1 /MORE? + JMP DTRK1 +DTRK3, ISZ DTRKJB /INDEX PAST ARGUMENT ON RETURN + JMP I DTRKJB + +DTRKEN, -CLKTBL+1 + /MOVE DATA TO/FROM DATFLD FROM/TO USER CORE +/ USER'S POINTER IN "A16" +/ DATFLD POINTER IN "A17" +/CALLING SEQUENCE: +/ AC=-NUMBER OF WORDS; LINK=0 FROM DATFLD TO USER, LINK=1 FROM USER TO DATFLD +/ JMS BLTF1 +/ RETURN +BLTF1, 0 + DCA TEMP1 /SAVE NUMBER OF WORDS TO MOVE +BL0, SNL /WHICH DIRECTION? + JMP BL1 + JMS UDF1 /FROM USER + TAD I A16 + DATFLD /TO DATFLD + DCA I A17 + JMP BL2 +BL1, TAD I A17 /FROM DATFLD + JMS UDF1 + DCA I A16 /TO USER + DATFLD +BL2, ISZ TEMP1 /MORE? + JMP BL0 /YES + JMP I BLTF1 + +WAKEUP, 0 + ISZ F1SCH /SET FLAG TO SCHEDULE THIS USER IMMEDIATELY IF POSSIBLE + JMS GETTBA /FIND STR1 + JOBSTS+1 + CLL STA RAL /AC=7776 + AND I TEMP0 /CLEAR JSWAIT + IAC + DCA I TEMP0 /NOW WE CAN BE SURE THAT IT IS SET + ISZ TEMP0 /NOW UPDATE THE DEVICE STATUS REGISTER + TAD I WAKEUP + DCA I TEMP0 /THE NEW D.S.R. + ISZ TEMP0 + ISZ I TEMP0 /TURN ON DUMMY WAIT BIT IN WAIT MASK 1 + ISZ TEMP0 + DCA I TEMP0 /TAKE HIM/HER OUT OF WAIT + ISZ WAKEUP + JMP I WAKEUP + FCB2= .+7&7770 +RKREDO, REDO0 +RK05GO, CIF CDF + TAD RKJOB /WHO OWNS THE CONTROLLER? + SZA CLA + JMP I RKREDO /[S]HE'LL HAVE TO WAIT + TAD I JOB + DCA RKJOB /[S]HE NOW OWNS THE CONTROLLER + DCA I L2SAP /ZERO AC IN CASE TRANSFER DOESN'T START + CIF DATFLD + TAD RKJOB + JMS GETTBA /GET WAIT 2 + JOBWMK+1 + CLL CMA RTL /AC=-3 + DCA RKERR /3 TRIES ON ERROR + DCA RKBLKS /CLEAR SUCCESSFULL TRANSFER COUNTER + JMS USRLOK /LOCK HIM/HER IN HIS/HER FIELD + DCA RKCORE /SAVE THE CORTBL POINTER + TAD I TEMP0 /POINTS TO DDB WORD 4 (-1) + JMS I RKGOA /START UP THE RK05 DISK + SZA CLA + JMP RKL21 /DIDN'T EVEN GET OFF THE GROUND + CLL STA RAL + DCA RKTIME /SET TIMER FOR 2 SECONDS + WAITF1 +RKL21, ION + CDF + CLL STA RTR + AND I RKCORE + DCA I RKCORE /UNLOCK HIS/HER FIELD + DCA RKCORE + TAD RKJOB + JMS GETTBA /FIND HIS/HER AC + JOBREG+2 + TAD RKBLKS + DCA I TEMP0 /PASS NUMBER OF BLOCKS TRANSFERRED BACK TO THE USER + TAD RKJOB +RKEND2, JMS I AWAKEN /TAKE HIM/HER OUT OF WAIT STATUS +RKERR, 0 + DCA RKJOB /FREE THE CONTROLLER + JMS I DTRKJA /LOOK FOR OTHERS WAITING FOR THE CONTROLLER + -3 + EXITF1 /NOBODY ELSE WANTS IT + AND K7770 + DCA IX3 + TAD I IX3 /EXTRACT THE JOB # FROM THE DDB + JMP RKEND2 +RKGOA, RKGO +FCE2= .+1&7770 + \ No newline at end of file diff --git a/tss8/system/ts8f.pal b/tss8/system/ts8f.pal new file mode 100644 index 0000000..e66bddb --- /dev/null +++ b/tss8/system/ts8f.pal @@ -0,0 +1,620 @@ +/ROUTINE TO SET A WAIT 2 CONDITION FOR THE CURRENT USER +/ (FOR DECTAPE, RK05, OR CARDREADER) +/ ENTER WITH DESIRED WAIT 2 STATUS IN THE AC + +WAITS2, 0 + DCA TEMP2 + CDF + TAD I JOB /GET USER JOB NUMBER + JMS GETTBA + JOBWMK + DCA I TEMP0 /CLEAR WAIT MASK 1 + ISZ TEMP0 + TAD TEMP0 /GET WAIT NUMBER + DCA I TEMP0 /NOW [S]HE'S WAITING + JMP I WAITS2 + +/ROUTINE TO LOCK CURRENT USER IN HIS/HER CORE FIELD +/ RETURNS WITH CORTBL POINTER IN AC +USRLOK, 0 + CDF + TAD I L2SFP /POINTER TO LEVEL 2 SAVE FIELD + AND K0007 /JUST THE FIELD + TAD CORTBA /DISPLACEMENT INTO THE CORE TABLE + DCA TEMP2 + STL RTR /AC=2000 + TAD I TEMP2 + DCA I TEMP2 /LOCK IN CORE + DATFLD + TAD TEMP2 /NOW RETURN WITH POINTER INTO CORE TABLE + JMP I USRLOK +L2SFP, L2SF + +FCB3= .+7&7770 +CDCNT, 0 +CDCORE, 0 +CDTIMR, TIMCDR +CDL21, CLL CMA RTR /AC=5777 + AND I CDCORE + DCA I CDCORE /UNLOCK THE CORE FIELD + TAD CDJOB + JMS GETTBA /FIND HIS/HER AC + JOBREG+2 + TAD CDCNT + DCA I TEMP0 /PUT THE COLUMN COUNT IN HIS/HER AC + TAD CDJOB + JMS I AWAKEN /TAKE HIM/HER OUT OF WAIT STATUS +CDBUF, 0 + EXITF1 + CDL11, TAD I CDTIMR + SNA CLA /WERE WE EXPECTING AN INTERRUPT? + JMP CDIOT /NO + ISZ CDCNT /COUNT A COLUMN + ISZ CDBUF /BUMP THE USER'S POINTER +CDJOB, 0 /JOB OWNING THE CARD READER - (COVERS THE "ISZ SKIP") +CDREAD, .-. /THE PROPER READ IOT IS PLACED HERE +CDFLD, .-. /CDF TO THE USER'S FIELD + DCA I CDBUF /STASH A COLUMN IN THE USER'S BUFFER + INTRTN +CDIOT, RCRA /CLEAR UNWANTED INTERRUPT + CLA + INTRTN +UUCDR, CLL RAL /TIMES 2 + TAD CDIOT /CONSTRUCT READ IOT + DCA CDREAD /EITHER ALPHA, BINARY, OR COMPRESSED (8E ONLY) + TAD I L2SAP + DCA CDBUF /SAVE THE USER'S BUFFER POINTER + DCA I L2SAP /CLEAR USER AC - IN CASE THE READER ISN'T READY + TAD I UDFP + DCA CDFLD /SAVE CDF TO USER'S FIELD + TAD I JOB + DCA CDJOB + DCA CDCNT /ZERO COLUMN COUNT + IOF +IFZERO CPU&7776 < JMP .+4 > +IFNZRO CPU&7776 < RCTF > /CLEAR 8E TRANSITION FLAG + IAC + RCNO /ENABLE CARD READER INTERRUPTS + CLA + RCSE /START CARD READER + JMP UUCDRB /NOT READY - PUT HIM/HER TO SLEEP BEFORE CONTINUING + JMS USRLOK /LOCK HIM/HER IN HIS/HER FIELD + DCA CDCORE /SAVE POINTER TO CORTBL + TAD K0004 + JMS I WAIT2 /MAKE HIM/HER WAIT FOR THE CARD READER + CIF CDF + CLL CMA RAL /AC=-2 + DCA I CDTIMR /SET CARD READER TIMER + JMP I WAIT1 +UUCDRB, CIF CDF + JMP I SLEEPB /PUT HIM/HER TO SLEEP FOR A COUPLE OF SECONDS +*2000 +FCE3= .&7770 + FCB4= .+7&7770 +RKL11, DRST /GET CONTROLLER STATUS + CLL RAL /IGNORE THE DONE BIT + SZA + JMP RKSR1 /ERROR!!!!! + ISZ RKBLKS /COUNT A SUCCESSFUL TRANSFER + TAD RKCMD + SNA /ARE WE FINISHED? + JMP RKSR2 /YES + DLDC /LOAD THE NEW COMMAND + TAD RKSECT + DLAG /LOAD THE NEW SECTOR - WE'RE OFF AND RUNNING AGAIN + JMS RKNXT /SET UP FOR THE NEXT BLOCK (IF ANY) + CLL STA RAL + DCA RKTIME /SET CONTROLLER TIMER FOR 2 MORE SECONDS + CLL STA RTL + DCA I RKERRA /THREE ERRORS + INTRTN + +RKSR1, ISZ I RKERRA + JMP RKSR4 /STILL OK TO RETRY + DRST +RKSR2, DCA I RKERRA /FINAL STATUS FOR THE USER + DLDC /CLEAR CONTROLLER STATUS AND COMMAND REGISTERS + DCA RKTIME + TAD RKL2 /SCHEDULE LEVEL 2 + INTRTN +RKSR4, AND K1012 /SAVE SPECIAL CASE ERROR BITS + SNA +RKSRE, JMP RKSR5+1 /DON'T RECAL. OR PUT CURRENT JOB TO SLEEP + AND K0010 + SZA CLA + JMP RKSR5 /PUT CURRENT JOB TO SLEEP AND RE-TRY + IAC + DCLR /IN CASE WE HAVE SOMETHING REALLY IN TROUBLE + TAD RKCOM + AND K0006 /SAVE ONLY THE UNIT # + TAD K0600 /ENABLE INTERRUPT ON SEEK COMPLETION + DLDC + STL RTL + DCLR /RE-CALIBRATE + TAD RKSRE + DCA RKL11 /CHANGE LEVEL 1 + CLL STA RTL /ALLOW 3 SECONDS FOR THE RE-CALIBRATE + DCA RKTIME + DCLR + INTRTN + RKSR5, TAD SLEEPB + DCA INTS2 + CLL CMA RTL /AC=-3 + TAD IX3 /POINTER TO DDB WORD 4 (-1) + JMS RKGO /RE-TRY + SNA /ANYTHING BAD? + TAD INTS2 /NO - HOW ABOUT PUTTING SOMEONE TO SLEEP? + INTRTN +K1012, 1012 +RKL2, RKL20 +RKFLD, -CORTBL+51 +RKGO, 0 + DCA IX3 /SAVE THE DDB POINTER + IAC + DCLR /CLEAR THE CONTROLLER + TAD I IX3 /USER WORD 1 + CLL RTR + RAR + DCA RKCOM /SAVE COMMAND DIVIDED BY 10 + TAD RKCOM + AND K0037 /PAGE COUNT + SNA + TAD K0040 /FOR 0 OR 40 GIVE HIM/HER 40 + CMA + TAD RKBLKS + TAD RKBLKS /ADD NUMBER OF PAGES ALREADY TRANSFERRED + DCA RKCNT + TAD RKCOM + AND K7400 /SAVE FUNCTION, DRIVE, AND HI ORDER SECTOR BIT + TAD RKCORE /POINTER TO CORTBL ENTRY + TAD RKFLD /EXTRACT FIELD NUMBER AND INSERT INTERRUPT ENABLE AND HALF BLOCK BITS + CML RTL /"RKFLD" COMPLEMENTED THE LINK + RAL + DCA RKCOM /SAVE THE CONSTRUCTED COMMAND REGISTER + TAD RKBLKS /NUMBER OF SECTORS ALREADY TRANSFERRED + TAD I IX3 + DCA RKSECT /STARTING SECTOR NUMBER FROM THE USER + SZL + ISZ RKCOM /BUMP HI ORDER BIT + TAD RKBLKS /NUMBER OF BLOCKS ALREADY TRANSFERRED + CLL RTR /TIMES 400 + RTR + RAR + TAD I IX3 + IAC /WE ADD ONE SINCE THE CONTROLLER WANTS THE REAL ADDRESS + DLCA /LOAD USER'S CA INTO THE CONTROLLER + JMS RKCMD /GENERATE FIRST COMMAND + IOF + DLDC /LOAD CONTROLLER COMMAND REGISTER + TAD RKSECT + DLAG /LOAD IN THE DESIRED SECTOR - WE ARE OFF AND RUNNING + JMS RKNXT /SET UP FOR THE NEXT SECTOR (IF ANY) + TAD RKDRST + DCA RKL11 /FIX FIRST WORD OF INTERRUPT SERVICE + DSKP /ARE WE TRYING TO DO SOMETHING BAD? + JMP I RKGO /NO - EVERYTHING IS PEACHY +RKDRST, DRST + DCA I RKERRA /SAVE ERROR STATUS - NO RE-TRIES WILL BE MADE + DLDC /CLEAR CONTROLLER STATUS AND COMMAND REGISTERS + TAD RKL2 /RETURN WITH L2 DISPATCH + JMP I RKGO + +RKCMD, 0 + ISZ RKCNT + TAD RKCNT + SMA CLA /ANY MORE BLOCKS TO GO? + JMP RKDONE /NO - CLOSE IT OUT + ISZ RKCNT /HALF BLOCK? + TAD K7700 /NO - REMOVE THE HALF BLOCK BIT FROM THE COMMAND + TAD RKCOM /GET THE COMMAND + JMP I RKCMD + +RKNXT, 0 + ISZ RKSECT /BUMP SECTOR + TAD RKSECT + SNA + ISZ RKCOM /BUMP HI-ORDER SECTOR BIT + AND K0037 + SZA CLA /WILL WE SEEK ON THIS ONE? + TAD K1000 /NO - DO A READ ALL OR WRITE ALL + DCA INTS1 + JMS RKCMD /CHECK FOR HALF BLOCK AND COMPLETION + TAD INTS1 +RKDONE, DCA RKCMD /SAVE THE NEW COMMAND REGISTER + JMP I RKNXT +PAGE +FCE4= .&7770 + IFNZRO DC08A < +T8ASSM, 0 + AND T83770 /THE CHARACTER ONLY + SNA + JMP T8ASS1 /IGNORE NULL CHARACTERS + CLL RTR /BRING THE CHARACTER INTO POSITION + RAR + AND T80177 + TAD K0200 /FORCE ON THE PARITY BIT + CIF 00 /STASH IT AWAY + JMS I T8IN1A /THAT'S DONE IN FIELD 0 + ION +T8ASS1, CLL STA RTL /AC=-3 + TAD T8ASSM + DCA T8T /POINTS TO THE LSW + TAD I T8T + AND T83770 /SAVE ONLY THE LINE NUMBER + DCA I T8T + ISZ T8T /POINTS TO THE CAW + STL RTR /AC=2000 + DCA I T8T /RESET THE FLAG BIT + TTIR /BUMP THE "R" REGISTER + JMP I T8ASSM +T80177, 177 +T83770, 3770 +T8IN1A, T8IN1 +T8T, 0 + T8TTI, TTI + DC08LO^10+0 /LSW LINE # PT08+DC08LO+1 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+10 /LSW LINE # PT08+DC08LO+2 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+20 /LSW LINE # PT08+DC08LO+3 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+30 /LSW LINE # PT08+DC08LO+4 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+40 /LSW LINE # PT08+DC08LO+5 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+50 /LSW LINE # PT08+DC08LO+6 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+60 /LSW LINE # PT08+DC08LO+7 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+70 /LSW LINE # PT08+DC08LO+10 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+100 /LSW LINE # PT08+DC08LO+11 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+110 /LSW LINE # PT08+DC08LO+12 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+120 /LSW LINE # PT08+DC08LO+13 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+130 /LSW LINE # PT08+DC08LO+14 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+140 /LSW LINE # PT08+DC08LO+15 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+150 /LSW LINE # PT08+DC08LO+16 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+160 /LSW LINE # PT08+DC08LO+17 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+170 /LSW LINE # PT08+DC08LO+20 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+200 /LSW LINE # PT08+DC08LO+21 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+210 /LSW LINE # PT08+DC08LO+22 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+220 /LSW LINE # PT08+DC08LO+23 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED + TTI + DC08LO^10+230 /LSW LINE # PT08+DC08LO+24 + 2000 /CAW + JMS T8ASSM /CHARACTER FULLY ASSEMBLED +*T8TTI+DC08A+DC08A+DC08A+DC08A + CIF 00 + JMP I .+1 /BACK TO THE REST OF THE DC08A SERVICE + T8OUT1 + + FCB5= .+7&7770 +*2360 + +FCE5= .&7770 + +DFCLS0, ZBLOCK 4 +DFCNO0, ZBLOCK 4 +DFL2S0, ZBLOCK 4 + -1 /TO END TABLE +DFL2DL= . + 1-DC08LO+PT08+KL8;11-DC08LO+PT08+KL8 + 21-DC08LO+PT08+KL8;31-DC08LO+PT08+KL8 + + +DFRING, CTG /CLEAR THE GROUP COUNTER + TAD K7774 + DCA TEMP0 /COUNTER FOR GROUP SEARCH +DFRNG1, RRS /READ RING STATUS + SZA + STR /ACKNOWLEDGE RING(S) + CLA + ITG /INCREMENT THE GROUP COUNTER + ISZ TEMP0 /LOOKED AT ALL LINES? + JMP DFRNG1 /NO, KEEP LOOKING + STA + IOF + DCA I .+2 /DATA FLD=0 HERE, I HOPE. RESET COUNTER + EXITF1 + D6FLAG + +DFCLSI, 0 +DFCNWI, 0 +DFCLST, DFCLS0 +DFCNOW, DFCNO0 +DFCNTR, 0 +DFCSET, 0 + TAD DFCLST + DCA DFCLSI /POINTER TO STATUS AT LAST INTERRUPT + TAD DFCNOW + DCA DFCNWI /POINTER TO STATUS AT THIS INTERRUPT + TAD K7774 + DCA DFCNTR /COUNTER FOR COMPARISONNS + CTG /CLEAR GROUP COUNTER + JMP I DFCSET + DFCARR, JMS DFCSET /INITIALIZE STATUS +DFCAR1, RCS /READ CARRIER STATUS + DCA I DFCNWI /PLACE ON TABLE + ISZ DFCNWI + ITG /INCREMENT THE GROUP COUNTER + ISZ DFCNTR /READ ALL FOUR GROUPS? + JMP DFCAR1 /NO, READ NEXT + JMS DFCSET + TAD DFL2ST + DCA DFL2SI +DFCAR2, TAD I DFCNWI + CMA + AND I DFCLSI + SZA /ANY LINES CLEARED? + JMP DFCAR3 /YES, ACKNOWLEDGE +DFCAR5, TAD I DFCLSI + CMA + AND I DFCNWI + SZA + JMS DFCAR6 + ISZ DFCLSI + ISZ DFCNWI + ISZ DFL2SI + ITG /INCREMENT THE GROUP COUNTER + ISZ DFCNTR /ALL LINES CHECKED? + JMP DFCAR2 /NO + JMS DFCSET +DFCAR4, TAD I DFCNWI /TRANSFER THIS STATUS TABLE TO LAST + DCA I DFCLSI + ISZ DFCNWI + ISZ DFCLSI + ISZ DFCNTR + JMP DFCAR4 + JMP DFL200 + +DFCAR3, CTR /CLEAR TERMINAL READY + JMS DFCAR6 + JMP DFCAR5 /LOOK AT OTHER GROUPS + +DFCAR6, 0 + DCA TEMP4 /BIT TO SET + TAD TEMP4 + CMA + AND I DFL2SI + TAD TEMP4 + DCA I DFL2SI + JMP IDFCAR6 + DFL200, TAD DFL2ST /INITIALIZE PSEUDO GROUP CTR + DCA DFL2SG + +DFL22, TAD K7770 /EIGHT PHONES + DCA TEMP0 + IAC + DCA TEMP1 /SELECT EACH LINE IN GROUP + +DFL21, TAD I DFL2SG + SNA + JMP DFL23 + SPA + EXITF1 + AND TEMP1 + SZA CLA + JMP DFL25 + +DFL26, TAD TEMP1 + CLL RAL + DCA TEMP1 + ISZ TEMP0 + JMP DFL21 +DFL23, DCA I DFL2SG + ISZ DFL2SG + JMP DFL22 + +DFGBLK, GETB +DFL25, TAD DFL2SG + TAD DFL2C + DCA TEMP2 + TAD I TEMP2 + TAD TEMP0 + TAD K0010 + CLL RAL + TAD DFVTBA + DCA TEMP3 + TAD I TEMP3 + SZA CLA + JMP .+5 /YES + TAD TEMP3 + CIF + JMS I DFGBLK + JMP DFL26 + TAD TEMP3 + CIF CDF + JMS I DFUMES + JMP DFL26 + +DFL2SG, 0 +DFL2C, DFL2DL-DFL2S0 +DFVTBA= DEVTBA +DFL2SI, 0 +DFL2ST, DFL2S0 +DFUMES, UHLTMS + > + *DATA1 +/ROUTINE TO DECREMENT TIMERS +/THEY ARE BUMPED ONCE EACH SECOND +/THUS A USER CAN MEASURE UP TO 1 HOUR, 8 MINUTES, 15 SECONDS + +TIMER0, 0 + ISZ TIMBIG /HAVE WE GONE THROUGH A SECOND YET? + JMP F0TIMT /NO - DID WE FINISH ALL THE TIMERS LAST TIME? + TAD TICSEC /REFRESH SECOND TIMER + DCA TIMBIG + + TAD JOBCNT + DCA TIMET1 + TAD TIMTB1 /START OF CLKTBL + DCA TIMET2 +TIMER1, DATFLD + TAD I TIMET2 + SZA CLA + ISZ I TIMET2 + JMP TIMER2 + TAD TIMEJM /SET TIMER FLAG + TAD TIMET1 + JMS GETTBA /GET PTR TO STATUS 1 + JOBSTS+1 + TAD TEMP0 /DOES THE JOB STILL EXIST? + SNA CLA + JMP TIMER2 /NO + TAD I TEMP0 /YES, SET JSTIME IN STR1 + RAL + STL RAR + DCA I TEMP0 +TIMER2, ISZ TIMET2 + ISZ TIMET1 + JMP TIMER1 + ISZ UPTIM1 /INDEX LOW ORDER UPTIME + SKP + ISZ UPTIM2 /INDEX HI ORDER UPTIME +TIMEJM, JOBMAX+1 /NOP +IFZERO TC01 < JMP .+3 > +IFNZRO TC01 < STA > + DCA TEMP2 /ENABLE TRANSFER BACK TO DECTAPE CONTROLLER WAIT + JMS I TIMEDT /RUN DECTAPE TIMERS +IFZERO RK05 < JMP F0TIMR > +IFNZRO RK05 < CIF DATFLD > /NO INTERRUPTS + TAD RKTIME + SZA CLA /ACTIVE? + ISZ RKTIME /YES, BUMP TIMER + JMP F0TIMR /ALL IS WELL + IAC + DCLR /STOP WHATEVER IS GOING ON WITH THE RK05 + STA + DCA I RKERRA /SHOW THAT TRANSFER WAS TERMINATED + TAD RKJOB + JMS I RKHUNG /REPORT THE ERROR + RKL20 + /ROUTINE TO DUMP VALUE OF ONE CORE CELL INTO MQ +/RUNS AT EACH SYSTEM TICK +/TO USE, SET THE DESIRED CORE ADDRESS IN THE SWITCH REGISTER +/TO SELECT FIELDS, CLEAR SR TO 0, AND SET THE DESIRED +/FIELD IN THE LOW ORDER BITS OF THE SR. + +/THIS MEANS THAT YOU CANNOT ADDRESS LOCATIONS 0,1,2, OR 3 + +/IF THIS ROUTINE IS RUNNING, THE EAE IS NOT MUCH USE +/TO USER PROGRAMS. SORRY ABOUT THAT. + +TIMOUT, JMP TIMEX /LAS /INSERT THE "LAS" (7604) TO ENABLE DISPLAY + AND K7774 /TRYING A FIELD SELECT? + SNA + JMP DISPL1 /YES, GO CHANGE THE FIELD + LAS /NO; WHAT WAS THAT ADDRESS AGAIN? + DCA TEMP0 +DISFLD, CDF /ASSUME FIELD 0 TO START + TAD I TEMP0 /PICK UP CONTENTS OF SPECIFIED ADDRESS + MQL /DUMP IT IN THE MQ +TIMEX, CIF CDF /BACK TO FIELD 0 + JMP I TIME3A /RETURN + +TIMIT, TIMER3 +TIME3A, TIMER3 +TIMBIG, -TICSPS /ACTIVE COUNTER +TICSEC, -TICSPS /STARTING VALUE OF TIMBIG +TIMET1= TEMP4 +TIMET2= TEMP2 +TIMTB1, CLKTBL+1 +TIMEDT, DTIMER +RKHUNG, DTRKER + +DISPL1, LAS /WHAT WAS THAT FIELD AGAIN? + CLL RAL + RTL + TAD K6201 /BUILD FIELD SELECT + DCA DISFLD + JMP DISFLD-1 /NOW GO LOOK + + DEVDMB= JOBTBL-2 +*DEVTBL-1 + DEVDMB /DUMMY USED BY FIP RELEASE + ZBLOCK DEVTBE-DEVTBL + 0 /WE ALLOW THE READER EVEN IF NOT CONFIGURED FOR ONE + /THIS ALLOWS FIELD SERVICE TO USE THEIR PMK01 + IFZERO PUNCH + IFNZRO PUNCH <0> + DEVDMB + IFZERO LPT + IFNZRO LPT <0> + IFZERO CDR + IFNZRO CDR <0> + IFZERO TC01 + IFNZRO TC01 + IFNZRO RK05 + IFNZRO .-JOBTBL+1 + IFNZRO .-JOBTBL+1 + IFNZRO .-JOBTBL+1 + IFNZRO .-JOBTBL+1 + -1 /TERMINATES ASSIGNABLE DEVICE TABLE + +/JOBTBL, CLKTBL, TTYTBL, PRGTBL, & DSUTBL ARE SET UP BY INIT + + +*FIPBLK + ZBLOCK 10 /FIP'S FIXED PARAMETER BLOCK + +*WINBAS + ZBLOCK 50 /BASIC'S WINDOW + + +$$$$$$$$$$$$$$$$$$$$$$$$$$$$ + \ No newline at end of file diff --git a/tss8/tss8.zip b/tss8/tss8.zip new file mode 100644 index 0000000..1054a46 Binary files /dev/null and b/tss8/tss8.zip differ diff --git a/tss8/tss8_boostrap.txt b/tss8/tss8_boostrap.txt new file mode 100644 index 0000000..010a13a --- /dev/null +++ b/tss8/tss8_boostrap.txt @@ -0,0 +1,65 @@ +Loading TSS/8 +------------- + +Note: your environment must have a functioning second Teletype; that is, you cannot +at present run Foreground/Background if your host system is VMS or OS/2. + +1. Load the paper-tape bootstrap: + + sim> load tss8_init.bin + +2. Enable the RF08, if it is not enabled, and disable the DF32, if it is enabled: + + sim> set rf enabled + sim> set df disabled + +3. Mount the TSS/8 disk image of the RF08: + + sim> attach rf tss8_rf.dsk + +4. Assign a TCP/IP port to the Telnet listener for the extra terminals: + + sim> attach tti1 -- 4000 typically works + +5. Run the bootstrap: + + sim> run 24200 + +5. TSS/8 will boot and go through its startup dialog + + LOAD, DUMP, START, ETC? START + MONTH-DAY-YEAR: mm:dd:yy -- numeric, yy in range [74:85] + HR:MIN - hh:mm -- numeric, 24 hour format + (type cr to get attention) + + . + + and is now ready for login. The list of accounts and passwords: + + PPN Password + [0,1] VH3M + [0,2] LXHE + [0,3] SHUG + [77,77] + [1,10] WBCN + [20,1] DT + [20,2] PT + [20,3] TSS8 + [20,4] EDIT + [20,5] 4TH + [1,50] JERK + +6. Login using one of the existing accounts. The login command won't echo: + + .LOGIN 2 LXHE -- privileged library account + + TSS/8.24 JOB 01 [00,02] K00 23:23:06 + + SYSTEM IS DOWN, INC. + +7. The system is now ready for commands. To get a directory listing: + + .R CAT + +8. Other users can log in by connecting, from a Telnet client, to localhost + on the port specified in the attach tti1 command. diff --git a/tss8/tss8_init.bin b/tss8/tss8_init.bin new file mode 100644 index 0000000..a3d6d36 Binary files /dev/null and b/tss8/tss8_init.bin differ diff --git a/tss8/tss8_init.v b/tss8/tss8_init.v new file mode 100644 index 0000000..ddc8fb3 --- /dev/null +++ b/tss8/tss8_init.v @@ -0,0 +1,2458 @@ +// tss8 bootstrap +ram[15'o7400] = 12'o3250; +ram[15'o7401] = 12'o1245; +ram[15'o7402] = 12'o1250; +ram[15'o7403] = 12'o3252; +ram[15'o7404] = 12'o6224; +ram[15'o7405] = 12'o7040; +ram[15'o7406] = 12'o210; +ram[15'o7407] = 12'o3210; +ram[15'o7410] = 12'o6221; +ram[15'o7411] = 12'o4256; +ram[15'o7412] = 12'o3301; +ram[15'o7413] = 12'o1276; +ram[15'o7414] = 12'o3277; +ram[15'o7415] = 12'o4247; +ram[15'o7416] = 12'o3300; +ram[15'o7417] = 12'o4256; +ram[15'o7420] = 12'o5235; +ram[15'o7421] = 12'o4266; +ram[15'o7422] = 12'o7420; +ram[15'o7423] = 12'o5231; +ram[15'o7424] = 12'o3275; +ram[15'o7425] = 12'o1277; +ram[15'o7426] = 12'o1300; +ram[15'o7427] = 12'o1301; +ram[15'o7430] = 12'o5212; +ram[15'o7431] = 12'o3675; +ram[15'o7432] = 12'o2275; +ram[15'o7433] = 12'o7600; +ram[15'o7434] = 12'o5225; +ram[15'o7435] = 12'o4266; +ram[15'o7436] = 12'o7041; +ram[15'o7437] = 12'o1301; +ram[15'o7440] = 12'o7440; +ram[15'o7441] = 12'o7402; +ram[15'o7442] = 12'o7126; +ram[15'o7443] = 12'o1210; +ram[15'o7444] = 12'o3245; +ram[15'o7445] = 12'o5; +ram[15'o7446] = 12'o5000; +ram[15'o7447] = 12'o0; +ram[15'o7450] = 12'o7402; +ram[15'o7451] = 12'o5250; +ram[15'o7452] = 12'o7402; +ram[15'o7453] = 12'o3276; +ram[15'o7454] = 12'o1276; +ram[15'o7455] = 12'o5647; +ram[15'o7456] = 12'o0; +ram[15'o7457] = 12'o4247; +ram[15'o7460] = 12'o1233; +ram[15'o7461] = 12'o7510; +ram[15'o7462] = 12'o2256; +ram[15'o7463] = 12'o7750; +ram[15'o7464] = 12'o5656; +ram[15'o7465] = 12'o5257; +ram[15'o7466] = 12'o0; +ram[15'o7467] = 12'o1277; +ram[15'o7470] = 12'o7106; +ram[15'o7471] = 12'o7006; +ram[15'o7472] = 12'o7006; +ram[15'o7473] = 12'o1300; +ram[15'o7474] = 12'o5666; +ram[15'o7475] = 12'o0; +ram[15'o7476] = 12'o24; +ram[15'o7477] = 12'o0; +ram[15'o7500] = 12'o0; +ram[15'o7501] = 12'o6000; +ram[15'o7601] = 12'o1205; +ram[15'o7602] = 12'o3360; +ram[15'o7603] = 12'o1357; +ram[15'o7604] = 12'o5606; +ram[15'o7605] = 12'o5357; +ram[15'o7606] = 12'o7400; +ram[15'o7760] = 12'o5201; + +ram[15'o20000] = 12'o5401; +ram[15'o20001] = 12'o4200; +ram[15'o20010] = 12'o10; +ram[15'o20011] = 12'o11; +ram[15'o20032] = 12'o2; +ram[15'o20033] = 12'o3; +ram[15'o20034] = 12'o4; +ram[15'o20035] = 12'o7; +ram[15'o20036] = 12'o37; +ram[15'o20037] = 12'o100; +ram[15'o20040] = 12'o1000; +ram[15'o20041] = 12'o7770; +ram[15'o20042] = 12'o7600; +ram[15'o20043] = 12'o7763; +ram[15'o20044] = 12'o7740; +ram[15'o20046] = 12'o46; +ram[15'o20047] = 12'o47; +ram[15'o20050] = 12'o50; +ram[15'o20051] = 12'o51; +ram[15'o20156] = 12'o400; +ram[15'o20157] = 12'o7000; +ram[15'o20160] = 12'o2610; +ram[15'o20166] = 12'o166; +ram[15'o20167] = 12'o1317; +ram[15'o20170] = 12'o2573; +ram[15'o20060] = 12'o0; +ram[15'o20061] = 12'o7402; +ram[15'o20062] = 12'o5460; +ram[15'o20063] = 12'o7754; +ram[15'o20064] = 12'o2555; +ram[15'o20065] = 12'o1200; +ram[15'o20066] = 12'o0; +ram[15'o20067] = 12'o0; +ram[15'o20070] = 12'o0; +ram[15'o20071] = 12'o0; +ram[15'o20072] = 12'o0; +ram[15'o20073] = 12'o10; +ram[15'o20074] = 12'o6201; +ram[15'o20075] = 12'o200; +ram[15'o20076] = 12'o177; +ram[15'o20077] = 12'o2136; +ram[15'o20100] = 12'o3300; +ram[15'o20101] = 12'o3335; +ram[15'o20102] = 12'o2153; +ram[15'o20103] = 12'o1615; +ram[15'o20104] = 12'o654; +ram[15'o20105] = 12'o1667; +ram[15'o20106] = 12'o534; +ram[15'o20107] = 12'o510; +ram[15'o20110] = 12'o3043; +ram[15'o20111] = 12'o520; +ram[15'o20112] = 12'o5; +ram[15'o20113] = 12'o7777; +ram[15'o20114] = 12'o7401; +ram[15'o20115] = 12'o136; +ram[15'o20116] = 12'o7607; +ram[15'o20117] = 12'o7762; +ram[15'o20120] = 12'o7607; +ram[15'o20121] = 12'o121; +ram[15'o20122] = 12'o705; +ram[15'o20123] = 12'o7746; +ram[15'o20124] = 12'o7771; +ram[15'o20125] = 12'o7746; +ram[15'o20126] = 12'o132; +ram[15'o20127] = 12'o26; +ram[15'o20130] = 12'o7774; +ram[15'o20131] = 12'o26; +ram[15'o20132] = 12'o6744; +ram[15'o20133] = 12'o6746; +ram[15'o20134] = 12'o6743; +ram[15'o20135] = 12'o5031; +ram[15'o20136] = 12'o1222; +ram[15'o20137] = 12'o3354; +ram[15'o20140] = 12'o1222; +ram[15'o20141] = 12'o3355; +ram[15'o20142] = 12'o6774; +ram[15'o20143] = 12'o1223; +ram[15'o20144] = 12'o6766; +ram[15'o20145] = 12'o6771; +ram[15'o20146] = 12'o5216; +ram[15'o20147] = 12'o1224; +ram[15'o20150] = 12'o5215; +ram[15'o20151] = 12'o7577; +ram[15'o20152] = 12'o600; +ram[15'o20153] = 12'o220; +ram[15'o20200] = 12'o1263; +ram[15'o20201] = 12'o4506; +ram[15'o20202] = 12'o1264; +ram[15'o20203] = 12'o4506; +ram[15'o20204] = 12'o4273; +ram[15'o20205] = 12'o5200; +ram[15'o20206] = 12'o5200; +ram[15'o20207] = 12'o4253; +ram[15'o20210] = 12'o4665; +ram[15'o20211] = 12'o1366; +ram[15'o20212] = 12'o4672; +ram[15'o20213] = 12'o4253; +ram[15'o20214] = 12'o4670; +ram[15'o20215] = 12'o4273; +ram[15'o20216] = 12'o5221; +ram[15'o20217] = 12'o5230; +ram[15'o20220] = 12'o5207; +ram[15'o20221] = 12'o1371; +ram[15'o20222] = 12'o7710; +ram[15'o20223] = 12'o5200; +ram[15'o20224] = 12'o1365; +ram[15'o20225] = 12'o3366; +ram[15'o20226] = 12'o4666; +ram[15'o20227] = 12'o5200; +ram[15'o20230] = 12'o1371; +ram[15'o20231] = 12'o7710; +ram[15'o20232] = 12'o5236; +ram[15'o20233] = 12'o1365; +ram[15'o20234] = 12'o3366; +ram[15'o20235] = 12'o4666; +ram[15'o20236] = 12'o1263; +ram[15'o20237] = 12'o4506; +ram[15'o20240] = 12'o1263; +ram[15'o20241] = 12'o4506; +ram[15'o20242] = 12'o4671; +ram[15'o20243] = 12'o4667; +ram[15'o20244] = 12'o1364; +ram[15'o20245] = 12'o4672; +ram[15'o20246] = 12'o1365; +ram[15'o20247] = 12'o4672; +ram[15'o20250] = 12'o1262; +ram[15'o20251] = 12'o4506; +ram[15'o20252] = 12'o5207; +ram[15'o20253] = 12'o0; +ram[15'o20254] = 12'o1261; +ram[15'o20255] = 12'o4506; +ram[15'o20256] = 12'o1261; +ram[15'o20257] = 12'o4506; +ram[15'o20260] = 12'o5653; +ram[15'o20261] = 12'o240; +ram[15'o20262] = 12'o272; +ram[15'o20263] = 12'o215; +ram[15'o20264] = 12'o212; +ram[15'o20265] = 12'o400; +ram[15'o20266] = 12'o406; +ram[15'o20267] = 12'o546; +ram[15'o20270] = 12'o554; +ram[15'o20271] = 12'o562; +ram[15'o20272] = 12'o462; +ram[15'o20273] = 12'o0; +ram[15'o20274] = 12'o7240; +ram[15'o20275] = 12'o3371; +ram[15'o20276] = 12'o3364; +ram[15'o20277] = 12'o3365; +ram[15'o20300] = 12'o7410; +ram[15'o20301] = 12'o4506; +ram[15'o20302] = 12'o4507; +ram[15'o20303] = 12'o3367; +ram[15'o20304] = 12'o1367; +ram[15'o20305] = 12'o1372; +ram[15'o20306] = 12'o7450; +ram[15'o20307] = 12'o5351; +ram[15'o20310] = 12'o1373; +ram[15'o20311] = 12'o7450; +ram[15'o20312] = 12'o5352; +ram[15'o20313] = 12'o1374; +ram[15'o20314] = 12'o7450; +ram[15'o20315] = 12'o5353; +ram[15'o20316] = 12'o1375; +ram[15'o20317] = 12'o7120; +ram[15'o20320] = 12'o1073; +ram[15'o20321] = 12'o7430; +ram[15'o20322] = 12'o5356; +ram[15'o20323] = 12'o2371; +ram[15'o20324] = 12'o7000; +ram[15'o20325] = 12'o3370; +ram[15'o20326] = 12'o1364; +ram[15'o20327] = 12'o7104; +ram[15'o20330] = 12'o7104; +ram[15'o20331] = 12'o7104; +ram[15'o20332] = 12'o3364; +ram[15'o20333] = 12'o1365; +ram[15'o20334] = 12'o7006; +ram[15'o20335] = 12'o7006; +ram[15'o20336] = 12'o35; +ram[15'o20337] = 12'o1364; +ram[15'o20340] = 12'o3364; +ram[15'o20341] = 12'o1365; +ram[15'o20342] = 12'o7104; +ram[15'o20343] = 12'o7104; +ram[15'o20344] = 12'o7104; +ram[15'o20345] = 12'o1370; +ram[15'o20346] = 12'o3365; +ram[15'o20347] = 12'o1367; +ram[15'o20350] = 12'o5301; +ram[15'o20351] = 12'o2273; +ram[15'o20352] = 12'o2273; +ram[15'o20353] = 12'o1367; +ram[15'o20354] = 12'o4506; +ram[15'o20355] = 12'o5673; +ram[15'o20356] = 12'o7200; +ram[15'o20357] = 12'o4503; +ram[15'o20360] = 12'o362; +ram[15'o20361] = 12'o5274; +ram[15'o20362] = 12'o4077; +ram[15'o20363] = 12'o3700; +ram[15'o20364] = 12'o0; +ram[15'o20365] = 12'o0; +ram[15'o20366] = 12'o0; +ram[15'o20367] = 12'o0; +ram[15'o20370] = 12'o0; +ram[15'o20371] = 12'o7777; +ram[15'o20372] = 12'o7506; +ram[15'o20373] = 12'o60; +ram[15'o20374] = 12'o7775; +ram[15'o20375] = 12'o7725; +ram[15'o20400] = 12'o0; +ram[15'o20401] = 12'o4251; +ram[15'o20402] = 12'o1205; +ram[15'o20403] = 12'o4213; +ram[15'o20404] = 12'o5600; +ram[15'o20405] = 12'o6603; +ram[15'o20406] = 12'o0; +ram[15'o20407] = 12'o1212; +ram[15'o20410] = 12'o4213; +ram[15'o20411] = 12'o5606; +ram[15'o20412] = 12'o6605; +ram[15'o20413] = 12'o0; +ram[15'o20414] = 12'o3234; +ram[15'o20415] = 12'o6224; +ram[15'o20416] = 12'o1220; +ram[15'o20417] = 12'o3225; +ram[15'o20420] = 12'o6201; +ram[15'o20421] = 12'o7240; +ram[15'o20422] = 12'o3644; +ram[15'o20423] = 12'o1250; +ram[15'o20424] = 12'o3645; +ram[15'o20425] = 12'o0; +ram[15'o20426] = 12'o6224; +ram[15'o20427] = 12'o6615; +ram[15'o20430] = 12'o1646; +ram[15'o20431] = 12'o6643; +ram[15'o20432] = 12'o7200; +ram[15'o20433] = 12'o1647; +ram[15'o20434] = 12'o0; +ram[15'o20435] = 12'o6621; +ram[15'o20436] = 12'o7610; +ram[15'o20437] = 12'o7402; +ram[15'o20440] = 12'o6622; +ram[15'o20441] = 12'o5235; +ram[15'o20442] = 12'o6601; +ram[15'o20443] = 12'o5613; +ram[15'o20444] = 12'o7750; +ram[15'o20445] = 12'o7751; +ram[15'o20446] = 12'o503; +ram[15'o20447] = 12'o504; +ram[15'o20450] = 12'o365; +ram[15'o20451] = 12'o0; +ram[15'o20452] = 12'o7200; +ram[15'o20453] = 12'o1660; +ram[15'o20454] = 12'o3646; +ram[15'o20455] = 12'o1661; +ram[15'o20456] = 12'o3647; +ram[15'o20457] = 12'o5651; +ram[15'o20460] = 12'o364; +ram[15'o20461] = 12'o365; +ram[15'o20462] = 12'o0; +ram[15'o20463] = 12'o7104; +ram[15'o20464] = 12'o3305; +ram[15'o20465] = 12'o1306; +ram[15'o20466] = 12'o3302; +ram[15'o20467] = 12'o1305; +ram[15'o20470] = 12'o7006; +ram[15'o20471] = 12'o7004; +ram[15'o20472] = 12'o3305; +ram[15'o20473] = 12'o1305; +ram[15'o20474] = 12'o35; +ram[15'o20475] = 12'o1307; +ram[15'o20476] = 12'o4506; +ram[15'o20477] = 12'o2302; +ram[15'o20500] = 12'o5267; +ram[15'o20501] = 12'o5662; +ram[15'o20502] = 12'o0; +ram[15'o20503] = 12'o0; +ram[15'o20504] = 12'o0; +ram[15'o20505] = 12'o0; +ram[15'o20506] = 12'o7774; +ram[15'o20507] = 12'o260; +ram[15'o20510] = 12'o0; +ram[15'o20511] = 12'o6031; +ram[15'o20512] = 12'o5311; +ram[15'o20513] = 12'o4320; +ram[15'o20514] = 12'o6036; +ram[15'o20515] = 12'o76; +ram[15'o20516] = 12'o1075; +ram[15'o20517] = 12'o5710; +ram[15'o20520] = 12'o0; +ram[15'o20521] = 12'o6031; +ram[15'o20522] = 12'o5720; +ram[15'o20523] = 12'o6034; +ram[15'o20524] = 12'o76; +ram[15'o20525] = 12'o1333; +ram[15'o20526] = 12'o7500; +ram[15'o20527] = 12'o7020; +ram[15'o20530] = 12'o7650; +ram[15'o20531] = 12'o5401; +ram[15'o20532] = 12'o5720; +ram[15'o20533] = 12'o7775; +ram[15'o20534] = 12'o0; +ram[15'o20535] = 12'o7000; +ram[15'o20536] = 12'o7410; +ram[15'o20537] = 12'o5343; +ram[15'o20540] = 12'o6046; +ram[15'o20541] = 12'o6041; +ram[15'o20542] = 12'o5341; +ram[15'o20543] = 12'o7200; +ram[15'o20544] = 12'o4511; +ram[15'o20545] = 12'o5734; +ram[15'o20546] = 12'o0; +ram[15'o20547] = 12'o7200; +ram[15'o20550] = 12'o2661; +ram[15'o20551] = 12'o5746; +ram[15'o20552] = 12'o2660; +ram[15'o20553] = 12'o5746; +ram[15'o20554] = 12'o0; +ram[15'o20555] = 12'o1660; +ram[15'o20556] = 12'o3370; +ram[15'o20557] = 12'o1661; +ram[15'o20560] = 12'o3371; +ram[15'o20561] = 12'o5754; +ram[15'o20562] = 12'o0; +ram[15'o20563] = 12'o1370; +ram[15'o20564] = 12'o3660; +ram[15'o20565] = 12'o1371; +ram[15'o20566] = 12'o3661; +ram[15'o20567] = 12'o5762; +ram[15'o20570] = 12'o0; +ram[15'o20571] = 12'o0; +ram[15'o20600] = 12'o0; +ram[15'o20601] = 12'o4502; +ram[15'o20602] = 12'o1531; +ram[15'o20603] = 12'o5600; +ram[15'o20604] = 12'o4500; +ram[15'o20605] = 12'o6603; +ram[15'o20606] = 12'o1; +ram[15'o20607] = 12'o4501; +ram[15'o20610] = 12'o4503; +ram[15'o20611] = 12'o714; +ram[15'o20612] = 12'o7240; +ram[15'o20613] = 12'o1247; +ram[15'o20614] = 12'o3010; +ram[15'o20615] = 12'o1247; +ram[15'o20616] = 12'o3067; +ram[15'o20617] = 12'o7001; +ram[15'o20620] = 12'o3070; +ram[15'o20621] = 12'o6211; +ram[15'o20622] = 12'o4650; +ram[15'o20623] = 12'o5210; +ram[15'o20624] = 12'o1114; +ram[15'o20625] = 12'o7001; +ram[15'o20626] = 12'o7440; +ram[15'o20627] = 12'o7001; +ram[15'o20630] = 12'o7440; +ram[15'o20631] = 12'o1251; +ram[15'o20632] = 12'o7640; +ram[15'o20633] = 12'o5222; +ram[15'o20634] = 12'o1010; +ram[15'o20635] = 12'o3066; +ram[15'o20636] = 12'o3466; +ram[15'o20637] = 12'o4060; +ram[15'o20640] = 12'o4503; +ram[15'o20641] = 12'o725; +ram[15'o20642] = 12'o4500; +ram[15'o20643] = 12'o6605; +ram[15'o20644] = 12'o1; +ram[15'o20645] = 12'o4501; +ram[15'o20646] = 12'o5600; +ram[15'o20647] = 12'o7600; +ram[15'o20650] = 12'o1711; +ram[15'o20651] = 12'o142; +ram[15'o20652] = 12'o7520; +ram[15'o20653] = 12'o0; +ram[15'o20654] = 12'o0; +ram[15'o20655] = 12'o3253; +ram[15'o20656] = 12'o7240; +ram[15'o20657] = 12'o1064; +ram[15'o20660] = 12'o3010; +ram[15'o20661] = 12'o1410; +ram[15'o20662] = 12'o3011; +ram[15'o20663] = 12'o1011; +ram[15'o20664] = 12'o1252; +ram[15'o20665] = 12'o7510; +ram[15'o20666] = 12'o5302; +ram[15'o20667] = 12'o1041; +ram[15'o20670] = 12'o7500; +ram[15'o20671] = 12'o5302; +ram[15'o20672] = 12'o1073; +ram[15'o20673] = 12'o3011; +ram[15'o20674] = 12'o1253; +ram[15'o20675] = 12'o7106; +ram[15'o20676] = 12'o7004; +ram[15'o20677] = 12'o1011; +ram[15'o20700] = 12'o3253; +ram[15'o20701] = 12'o5261; +ram[15'o20702] = 12'o7300; +ram[15'o20703] = 12'o1253; +ram[15'o20704] = 12'o5654; +ram[15'o20705] = 12'o6641; +ram[15'o20706] = 12'o6611; +ram[15'o20707] = 12'o7600; +ram[15'o20710] = 12'o6603; +ram[15'o20711] = 12'o6622; +ram[15'o20712] = 12'o5352; +ram[15'o20713] = 12'o5752; +ram[15'o20714] = 12'o516; +ram[15'o20715] = 12'o440; +ram[15'o20716] = 12'o2711; +ram[15'o20717] = 12'o2410; +ram[15'o20720] = 12'o4001; +ram[15'o20721] = 12'o1424; +ram[15'o20722] = 12'o1517; +ram[15'o20723] = 12'o405; +ram[15'o20724] = 12'o3700; +ram[15'o20725] = 12'o4437; +ram[15'o20726] = 12'o0; +ram[15'o20727] = 12'o2331; +ram[15'o20730] = 12'o2324; +ram[15'o20731] = 12'o515; +ram[15'o20732] = 12'o0; +ram[15'o20733] = 12'o1411; +ram[15'o20734] = 12'o222; +ram[15'o20735] = 12'o122; +ram[15'o20736] = 12'o3100; +ram[15'o20737] = 12'o1720; +ram[15'o20740] = 12'o522; +ram[15'o20741] = 12'o124; +ram[15'o20742] = 12'o1722; +ram[15'o20743] = 12'o0; +ram[15'o20744] = 12'o4020; +ram[15'o20745] = 12'o123; +ram[15'o20746] = 12'o2327; +ram[15'o20747] = 12'o1722; +ram[15'o20750] = 12'o477; +ram[15'o20751] = 12'o4000; +ram[15'o20752] = 12'o7777; +ram[15'o20753] = 12'o7767; +ram[15'o20754] = 12'o7757; +ram[15'o20755] = 12'o7737; +ram[15'o20756] = 12'o7727; +ram[15'o20757] = 12'o3723; +ram[15'o20760] = 12'o1100; +ram[15'o20761] = 12'o3706; +ram[15'o20762] = 12'o1120; +ram[15'o20763] = 12'o0; +ram[15'o20764] = 12'o3711; +ram[15'o20765] = 12'o1611; +ram[15'o20766] = 12'o2400; +ram[15'o20767] = 12'o3724; +ram[15'o20770] = 12'o2370; +ram[15'o20771] = 12'o0; +ram[15'o20772] = 12'o3720; +ram[15'o20773] = 12'o2524; +ram[15'o20774] = 12'o2200; +ram[15'o20775] = 12'o4040; +ram[15'o20776] = 12'o3640; +ram[15'o20777] = 12'o4000; +ram[15'o21000] = 12'o4502; +ram[15'o21001] = 12'o1263; +ram[15'o21002] = 12'o5401; +ram[15'o21003] = 12'o4510; +ram[15'o21004] = 12'o1243; +ram[15'o21005] = 12'o3210; +ram[15'o21006] = 12'o4500; +ram[15'o21007] = 12'o6605; +ram[15'o21010] = 12'o0; +ram[15'o21011] = 12'o4501; +ram[15'o21012] = 12'o1210; +ram[15'o21013] = 12'o1041; +ram[15'o21014] = 12'o7500; +ram[15'o21015] = 12'o5205; +ram[15'o21016] = 12'o1304; +ram[15'o21017] = 12'o3223; +ram[15'o21020] = 12'o1305; +ram[15'o21021] = 12'o3307; +ram[15'o21022] = 12'o4503; +ram[15'o21023] = 12'o0; +ram[15'o21024] = 12'o1703; +ram[15'o21025] = 12'o3210; +ram[15'o21026] = 12'o4503; +ram[15'o21027] = 12'o775; +ram[15'o21030] = 12'o6030; +ram[15'o21031] = 12'o4507; +ram[15'o21032] = 12'o1042; +ram[15'o21033] = 12'o7440; +ram[15'o21034] = 12'o1043; +ram[15'o21035] = 12'o7640; +ram[15'o21036] = 12'o5230; +ram[15'o21037] = 12'o7240; +ram[15'o21040] = 12'o3306; +ram[15'o21041] = 12'o4500; +ram[15'o21042] = 12'o6603; +ram[15'o21043] = 12'o51; +ram[15'o21044] = 12'o4501; +ram[15'o21045] = 12'o1243; +ram[15'o21046] = 12'o3321; +ram[15'o21047] = 12'o1321; +ram[15'o21050] = 12'o3325; +ram[15'o21051] = 12'o6211; +ram[15'o21052] = 12'o4715; +ram[15'o21053] = 12'o5310; +ram[15'o21054] = 12'o7450; +ram[15'o21055] = 12'o4316; +ram[15'o21056] = 12'o2306; +ram[15'o21057] = 12'o5401; +ram[15'o21060] = 12'o4060; +ram[15'o21061] = 12'o7640; +ram[15'o21062] = 12'o5300; +ram[15'o21063] = 12'o1707; +ram[15'o21064] = 12'o1325; +ram[15'o21065] = 12'o7640; +ram[15'o21066] = 12'o5300; +ram[15'o21067] = 12'o7001; +ram[15'o21070] = 12'o1210; +ram[15'o21071] = 12'o3223; +ram[15'o21072] = 12'o2307; +ram[15'o21073] = 12'o1707; +ram[15'o21074] = 12'o7710; +ram[15'o21075] = 12'o5222; +ram[15'o21076] = 12'o5677; +ram[15'o21077] = 12'o2014; +ram[15'o21100] = 12'o4503; +ram[15'o21101] = 12'o3553; +ram[15'o21102] = 12'o5222; +ram[15'o21103] = 12'o1664; +ram[15'o21104] = 12'o766; +ram[15'o21105] = 12'o752; +ram[15'o21106] = 12'o0; +ram[15'o21107] = 12'o0; +ram[15'o21110] = 12'o7001; +ram[15'o21111] = 12'o3325; +ram[15'o21112] = 12'o4316; +ram[15'o21113] = 12'o5714; +ram[15'o21114] = 12'o7732; +ram[15'o21115] = 12'o7600; +ram[15'o21116] = 12'o0; +ram[15'o21117] = 12'o4500; +ram[15'o21120] = 12'o6605; +ram[15'o21121] = 12'o0; +ram[15'o21122] = 12'o4501; +ram[15'o21123] = 12'o4500; +ram[15'o21124] = 12'o6603; +ram[15'o21125] = 12'o1; +ram[15'o21126] = 12'o4501; +ram[15'o21127] = 12'o1325; +ram[15'o21130] = 12'o3321; +ram[15'o21131] = 12'o5716; +ram[15'o21132] = 12'o4500; +ram[15'o21133] = 12'o6603; +ram[15'o21134] = 12'o22; +ram[15'o21135] = 12'o4501; +ram[15'o21136] = 12'o6223; +ram[15'o21137] = 12'o5340; +ram[15'o21140] = 12'o1336; +ram[15'o21141] = 12'o3061; +ram[15'o21142] = 12'o4756; +ram[15'o21143] = 12'o4500; +ram[15'o21144] = 12'o6603; +ram[15'o21145] = 12'o30; +ram[15'o21146] = 12'o4501; +ram[15'o21147] = 12'o1360; +ram[15'o21150] = 12'o3357; +ram[15'o21151] = 12'o1757; +ram[15'o21152] = 12'o3060; +ram[15'o21153] = 12'o4460; +ram[15'o21154] = 12'o2357; +ram[15'o21155] = 12'o5351; +ram[15'o21156] = 12'o4122; +ram[15'o21157] = 12'o0; +ram[15'o21160] = 12'o1172; +ram[15'o21161] = 12'o3705; +ram[15'o21162] = 12'o3005; +ram[15'o21163] = 12'o340; +ram[15'o21164] = 12'o404; +ram[15'o21165] = 12'o2440; +ram[15'o21166] = 12'o1417; +ram[15'o21167] = 12'o104; +ram[15'o21170] = 12'o504; +ram[15'o21171] = 12'o3700; +ram[15'o21172] = 12'o3031; +ram[15'o21173] = 12'o1407; +ram[15'o21174] = 12'o2124; +ram[15'o21175] = 12'o2034; +ram[15'o21176] = 12'o2413; +ram[15'o21177] = 12'o1246; +ram[15'o21200] = 12'o0; +ram[15'o21201] = 12'o3070; +ram[15'o21202] = 12'o7346; +ram[15'o21203] = 12'o3242; +ram[15'o21204] = 12'o4643; +ram[15'o21205] = 12'o5600; +ram[15'o21206] = 12'o1066; +ram[15'o21207] = 12'o1244; +ram[15'o21210] = 12'o7540; +ram[15'o21211] = 12'o5232; +ram[15'o21212] = 12'o1245; +ram[15'o21213] = 12'o7510; +ram[15'o21214] = 12'o5232; +ram[15'o21215] = 12'o3066; +ram[15'o21216] = 12'o2242; +ram[15'o21217] = 12'o7410; +ram[15'o21220] = 12'o5600; +ram[15'o21221] = 12'o1070; +ram[15'o21222] = 12'o7106; +ram[15'o21223] = 12'o1070; +ram[15'o21224] = 12'o7004; +ram[15'o21225] = 12'o1066; +ram[15'o21226] = 12'o3070; +ram[15'o21227] = 12'o4477; +ram[15'o21230] = 12'o5232; +ram[15'o21231] = 12'o5206; +ram[15'o21232] = 12'o7200; +ram[15'o21233] = 12'o1033; +ram[15'o21234] = 12'o1242; +ram[15'o21235] = 12'o7650; +ram[15'o21236] = 12'o5600; +ram[15'o21237] = 12'o2200; +ram[15'o21240] = 12'o1070; +ram[15'o21241] = 12'o5600; +ram[15'o21242] = 12'o0; +ram[15'o21243] = 12'o1602; +ram[15'o21244] = 12'o7507; +ram[15'o21245] = 12'o11; +ram[15'o21246] = 12'o0; +ram[15'o21247] = 12'o6762; +ram[15'o21250] = 12'o6022; +ram[15'o21251] = 12'o6041; +ram[15'o21252] = 12'o5251; +ram[15'o21253] = 12'o6042; +ram[15'o21254] = 12'o6012; +ram[15'o21255] = 12'o6032; +ram[15'o21256] = 12'o6203; +ram[15'o21257] = 12'o6131; +ram[15'o21260] = 12'o6667; +ram[15'o21261] = 12'o6001; +ram[15'o21262] = 12'o5570; +ram[15'o21263] = 12'o225; +ram[15'o21264] = 12'o1114; +ram[15'o21265] = 12'o477; +ram[15'o21266] = 12'o4000; +ram[15'o21267] = 12'o0; +ram[15'o21270] = 12'o7300; +ram[15'o21271] = 12'o6224; +ram[15'o21272] = 12'o1074; +ram[15'o21273] = 12'o3061; +ram[15'o21274] = 12'o4060; +ram[15'o21275] = 12'o1667; +ram[15'o21276] = 12'o3300; +ram[15'o21277] = 12'o4503; +ram[15'o21300] = 12'o0; +ram[15'o21301] = 12'o4503; +ram[15'o21302] = 12'o3224; +ram[15'o21303] = 12'o4505; +ram[15'o21304] = 12'o1464; +ram[15'o21305] = 12'o1316; +ram[15'o21306] = 12'o7100; +ram[15'o21307] = 12'o7440; +ram[15'o21310] = 12'o1317; +ram[15'o21311] = 12'o7640; +ram[15'o21312] = 12'o5277; +ram[15'o21313] = 12'o7006; +ram[15'o21314] = 12'o2267; +ram[15'o21315] = 12'o5667; +ram[15'o21316] = 12'o7456; +ram[15'o21317] = 12'o7773; +ram[15'o21320] = 12'o7001; +ram[15'o21321] = 12'o7106; +ram[15'o21322] = 12'o1121; +ram[15'o21323] = 12'o3010; +ram[15'o21324] = 12'o1410; +ram[15'o21325] = 12'o3115; +ram[15'o21326] = 12'o1410; +ram[15'o21327] = 12'o3116; +ram[15'o21330] = 12'o1410; +ram[15'o21331] = 12'o3117; +ram[15'o21332] = 12'o1410; +ram[15'o21333] = 12'o3120; +ram[15'o21334] = 12'o4060; +ram[15'o21335] = 12'o1515; +ram[15'o21336] = 12'o6201; +ram[15'o21337] = 12'o3516; +ram[15'o21340] = 12'o2115; +ram[15'o21341] = 12'o2116; +ram[15'o21342] = 12'o2117; +ram[15'o21343] = 12'o5334; +ram[15'o21344] = 12'o6765; +ram[15'o21345] = 12'o6203; +ram[15'o21346] = 12'o5520; +ram[15'o21400] = 12'o60; +ram[15'o21401] = 12'o3054; +ram[15'o21402] = 12'o7777; +ram[15'o21403] = 12'o0; +ram[15'o21404] = 12'o0; +ram[15'o21405] = 12'o0; +ram[15'o21406] = 12'o3213; +ram[15'o21407] = 12'o0; +ram[15'o21410] = 12'o2202; +ram[15'o21411] = 12'o4601; +ram[15'o21412] = 12'o1205; +ram[15'o21413] = 12'o6201; +ram[15'o21414] = 12'o7440; +ram[15'o21415] = 12'o3606; +ram[15'o21416] = 12'o1203; +ram[15'o21417] = 12'o7450; +ram[15'o21420] = 12'o7001; +ram[15'o21421] = 12'o3072; +ram[15'o21422] = 12'o1072; +ram[15'o21423] = 12'o7040; +ram[15'o21424] = 12'o3010; +ram[15'o21425] = 12'o7146; +ram[15'o21426] = 12'o1167; +ram[15'o21427] = 12'o3011; +ram[15'o21430] = 12'o7001; +ram[15'o21431] = 12'o1010; +ram[15'o21432] = 12'o3411; +ram[15'o21433] = 12'o1157; +ram[15'o21434] = 12'o7040; +ram[15'o21435] = 12'o1010; +ram[15'o21436] = 12'o3411; +ram[15'o21437] = 12'o1157; +ram[15'o21440] = 12'o3011; +ram[15'o21441] = 12'o7132; +ram[15'o21442] = 12'o3411; +ram[15'o21443] = 12'o2010; +ram[15'o21444] = 12'o5242; +ram[15'o21445] = 12'o7126; +ram[15'o21446] = 12'o1072; +ram[15'o21447] = 12'o7106; +ram[15'o21450] = 12'o3072; +ram[15'o21451] = 12'o1072; +ram[15'o21452] = 12'o1160; +ram[15'o21453] = 12'o1073; +ram[15'o21454] = 12'o41; +ram[15'o21455] = 12'o3446; +ram[15'o21456] = 12'o1446; +ram[15'o21457] = 12'o6211; +ram[15'o21460] = 12'o3204; +ram[15'o21461] = 12'o1323; +ram[15'o21462] = 12'o3322; +ram[15'o21463] = 12'o1204; +ram[15'o21464] = 12'o1073; +ram[15'o21465] = 12'o3011; +ram[15'o21466] = 12'o1011; +ram[15'o21467] = 12'o1200; +ram[15'o21470] = 12'o7650; +ram[15'o21471] = 12'o5301; +ram[15'o21472] = 12'o1011; +ram[15'o21473] = 12'o3604; +ram[15'o21474] = 12'o1011; +ram[15'o21475] = 12'o3204; +ram[15'o21476] = 12'o2010; +ram[15'o21477] = 12'o5263; +ram[15'o21500] = 12'o7402; +ram[15'o21501] = 12'o1722; +ram[15'o21502] = 12'o7450; +ram[15'o21503] = 12'o5313; +ram[15'o21504] = 12'o3011; +ram[15'o21505] = 12'o2322; +ram[15'o21506] = 12'o1722; +ram[15'o21507] = 12'o7041; +ram[15'o21510] = 12'o3200; +ram[15'o21511] = 12'o2322; +ram[15'o21512] = 12'o5266; +ram[15'o21513] = 12'o3604; +ram[15'o21514] = 12'o1010; +ram[15'o21515] = 12'o7001; +ram[15'o21516] = 12'o6201; +ram[15'o21517] = 12'o3447; +ram[15'o21520] = 12'o4060; +ram[15'o21521] = 12'o5607; +ram[15'o21522] = 12'o0; +ram[15'o21523] = 12'o271; +ram[15'o21524] = 12'o0; +ram[15'o21525] = 12'o4503; +ram[15'o21526] = 12'o1555; +ram[15'o21527] = 12'o7126; +ram[15'o21530] = 12'o5724; +ram[15'o21531] = 12'o3716; +ram[15'o21532] = 12'o527; +ram[15'o21533] = 12'o4014; +ram[15'o21534] = 12'o1707; +ram[15'o21535] = 12'o1116; +ram[15'o21536] = 12'o4015; +ram[15'o21537] = 12'o523; +ram[15'o21540] = 12'o2301; +ram[15'o21541] = 12'o705; +ram[15'o21542] = 12'o7740; +ram[15'o21543] = 12'o0; +ram[15'o21544] = 12'o6660; +ram[15'o21545] = 12'o4010; +ram[15'o21546] = 12'o522; +ram[15'o21547] = 12'o2432; +ram[15'o21550] = 12'o4020; +ram[15'o21551] = 12'o1727; +ram[15'o21552] = 12'o522; +ram[15'o21553] = 12'o7740; +ram[15'o21554] = 12'o0; +ram[15'o21555] = 12'o6560; +ram[15'o21556] = 12'o4010; +ram[15'o21557] = 12'o522; +ram[15'o21560] = 12'o2432; +ram[15'o21561] = 12'o4001; +ram[15'o21562] = 12'o2323; +ram[15'o21563] = 12'o2515; +ram[15'o21564] = 12'o504; +ram[15'o21565] = 12'o3700; +ram[15'o21600] = 12'o7540; +ram[15'o21601] = 12'o27; +ram[15'o21602] = 12'o0; +ram[15'o21603] = 12'o4477; +ram[15'o21604] = 12'o5602; +ram[15'o21605] = 12'o1200; +ram[15'o21606] = 12'o1066; +ram[15'o21607] = 12'o7440; +ram[15'o21610] = 12'o1201; +ram[15'o21611] = 12'o7650; +ram[15'o21612] = 12'o5203; +ram[15'o21613] = 12'o2202; +ram[15'o21614] = 12'o5602; +ram[15'o21615] = 12'o0; +ram[15'o21616] = 12'o6214; +ram[15'o21617] = 12'o1074; +ram[15'o21620] = 12'o3243; +ram[15'o21621] = 12'o4060; +ram[15'o21622] = 12'o1615; +ram[15'o21623] = 12'o3264; +ram[15'o21624] = 12'o2215; +ram[15'o21625] = 12'o1664; +ram[15'o21626] = 12'o7450; +ram[15'o21627] = 12'o5243; +ram[15'o21630] = 12'o7012; +ram[15'o21631] = 12'o7012; +ram[15'o21632] = 12'o7012; +ram[15'o21633] = 12'o4245; +ram[15'o21634] = 12'o1664; +ram[15'o21635] = 12'o265; +ram[15'o21636] = 12'o7450; +ram[15'o21637] = 12'o5243; +ram[15'o21640] = 12'o4245; +ram[15'o21641] = 12'o2264; +ram[15'o21642] = 12'o5225; +ram[15'o21643] = 12'o0; +ram[15'o21644] = 12'o5615; +ram[15'o21645] = 12'o0; +ram[15'o21646] = 12'o265; +ram[15'o21647] = 12'o1266; +ram[15'o21650] = 12'o7450; +ram[15'o21651] = 12'o5257; +ram[15'o21652] = 12'o7510; +ram[15'o21653] = 12'o1037; +ram[15'o21654] = 12'o1036; +ram[15'o21655] = 12'o4506; +ram[15'o21656] = 12'o5645; +ram[15'o21657] = 12'o1307; +ram[15'o21660] = 12'o7041; +ram[15'o21661] = 12'o4506; +ram[15'o21662] = 12'o1310; +ram[15'o21663] = 12'o5255; +ram[15'o21664] = 12'o0; +ram[15'o21665] = 12'o77; +ram[15'o21666] = 12'o7741; +ram[15'o21667] = 12'o0; +ram[15'o21670] = 12'o7240; +ram[15'o21671] = 12'o1064; +ram[15'o21672] = 12'o3010; +ram[15'o21673] = 12'o1064; +ram[15'o21674] = 12'o3067; +ram[15'o21675] = 12'o1305; +ram[15'o21676] = 12'o3070; +ram[15'o21677] = 12'o4311; +ram[15'o21700] = 12'o5270; +ram[15'o21701] = 12'o1306; +ram[15'o21702] = 12'o7650; +ram[15'o21703] = 12'o5667; +ram[15'o21704] = 12'o5277; +ram[15'o21705] = 12'o5203; +ram[15'o21706] = 12'o7566; +ram[15'o21707] = 12'o7563; +ram[15'o21710] = 12'o212; +ram[15'o21711] = 12'o0; +ram[15'o21712] = 12'o144; +ram[15'o21713] = 12'o4507; +ram[15'o21714] = 12'o3066; +ram[15'o21715] = 12'o1066; +ram[15'o21716] = 12'o1114; +ram[15'o21717] = 12'o7450; +ram[15'o21720] = 12'o5341; +ram[15'o21721] = 12'o1312; +ram[15'o21722] = 12'o7640; +ram[15'o21723] = 12'o1066; +ram[15'o21724] = 12'o4506; +ram[15'o21725] = 12'o1010; +ram[15'o21726] = 12'o1070; +ram[15'o21727] = 12'o7700; +ram[15'o21730] = 12'o5361; +ram[15'o21731] = 12'o1066; +ram[15'o21732] = 12'o3410; +ram[15'o21733] = 12'o1066; +ram[15'o21734] = 12'o1307; +ram[15'o21735] = 12'o7640; +ram[15'o21736] = 12'o5356; +ram[15'o21737] = 12'o1310; +ram[15'o21740] = 12'o5314; +ram[15'o21741] = 12'o1010; +ram[15'o21742] = 12'o3066; +ram[15'o21743] = 12'o1010; +ram[15'o21744] = 12'o7041; +ram[15'o21745] = 12'o1067; +ram[15'o21746] = 12'o7740; +ram[15'o21747] = 12'o5313; +ram[15'o21750] = 12'o1466; +ram[15'o21751] = 12'o4506; +ram[15'o21752] = 12'o7240; +ram[15'o21753] = 12'o1010; +ram[15'o21754] = 12'o3010; +ram[15'o21755] = 12'o5313; +ram[15'o21756] = 12'o1066; +ram[15'o21757] = 12'o2311; +ram[15'o21760] = 12'o5711; +ram[15'o21761] = 12'o4503; +ram[15'o21762] = 12'o3550; +ram[15'o21763] = 12'o5711; +ram[15'o22000] = 12'o3234; +ram[15'o22001] = 12'o4500; +ram[15'o22002] = 12'o6603; +ram[15'o22003] = 12'o20; +ram[15'o22004] = 12'o1234; +ram[15'o22005] = 12'o6622; +ram[15'o22006] = 12'o5205; +ram[15'o22007] = 12'o6203; +ram[15'o22010] = 12'o3060; +ram[15'o22011] = 12'o1074; +ram[15'o22012] = 12'o3617; +ram[15'o22013] = 12'o5460; +ram[15'o22014] = 12'o1221; +ram[15'o22015] = 12'o1220; +ram[15'o22016] = 12'o5200; +ram[15'o22017] = 12'o61; +ram[15'o22020] = 12'o1132; +ram[15'o22021] = 12'o3137; +ram[15'o22022] = 12'o2471; +ram[15'o22023] = 12'o7563; +ram[15'o22024] = 12'o14; +ram[15'o22025] = 12'o37; +ram[15'o22026] = 12'o7763; +ram[15'o22027] = 12'o13; +ram[15'o22030] = 12'o37; +ram[15'o22031] = 12'o7666; +ram[15'o22032] = 12'o0; +ram[15'o22033] = 12'o0; +ram[15'o22034] = 12'o0; +ram[15'o22035] = 12'o7300; +ram[15'o22036] = 12'o4503; +ram[15'o22037] = 12'o2113; +ram[15'o22040] = 12'o4505; +ram[15'o22041] = 12'o7240; +ram[15'o22042] = 12'o1064; +ram[15'o22043] = 12'o3010; +ram[15'o22044] = 12'o4465; +ram[15'o22045] = 12'o5235; +ram[15'o22046] = 12'o1226; +ram[15'o22047] = 12'o7121; +ram[15'o22050] = 12'o1227; +ram[15'o22051] = 12'o7430; +ram[15'o22052] = 12'o5235; +ram[15'o22053] = 12'o3232; +ram[15'o22054] = 12'o4465; +ram[15'o22055] = 12'o5235; +ram[15'o22056] = 12'o1044; +ram[15'o22057] = 12'o7120; +ram[15'o22060] = 12'o1230; +ram[15'o22061] = 12'o7430; +ram[15'o22062] = 12'o5235; +ram[15'o22063] = 12'o3233; +ram[15'o22064] = 12'o4465; +ram[15'o22065] = 12'o5235; +ram[15'o22066] = 12'o1231; +ram[15'o22067] = 12'o7510; +ram[15'o22070] = 12'o5235; +ram[15'o22071] = 12'o3070; +ram[15'o22072] = 12'o1224; +ram[15'o22073] = 12'o4622; +ram[15'o22074] = 12'o1232; +ram[15'o22075] = 12'o1071; +ram[15'o22076] = 12'o3070; +ram[15'o22077] = 12'o3067; +ram[15'o22100] = 12'o1225; +ram[15'o22101] = 12'o4622; +ram[15'o22102] = 12'o1070; +ram[15'o22103] = 12'o7440; +ram[15'o22104] = 12'o5235; +ram[15'o22105] = 12'o1233; +ram[15'o22106] = 12'o1071; +ram[15'o22107] = 12'o6201; +ram[15'o22110] = 12'o3566; +ram[15'o22111] = 12'o4060; +ram[15'o22112] = 12'o5634; +ram[15'o22113] = 12'o1517; +ram[15'o22114] = 12'o1624; +ram[15'o22115] = 12'o1055; +ram[15'o22116] = 12'o401; +ram[15'o22117] = 12'o3155; +ram[15'o22120] = 12'o3105; +ram[15'o22121] = 12'o122; +ram[15'o22122] = 12'o7240; +ram[15'o22123] = 12'o0; +ram[15'o22124] = 12'o0; +ram[15'o22125] = 12'o6211; +ram[15'o22126] = 12'o1072; +ram[15'o22127] = 12'o1160; +ram[15'o22130] = 12'o3072; +ram[15'o22131] = 12'o7240; +ram[15'o22132] = 12'o3472; +ram[15'o22133] = 12'o6601; +ram[15'o22134] = 12'o4060; +ram[15'o22135] = 12'o5724; +ram[15'o22136] = 12'o0; +ram[15'o22137] = 12'o1410; +ram[15'o22140] = 12'o3066; +ram[15'o22141] = 12'o1066; +ram[15'o22142] = 12'o1223; +ram[15'o22143] = 12'o7650; +ram[15'o22144] = 12'o5347; +ram[15'o22145] = 12'o2336; +ram[15'o22146] = 12'o5736; +ram[15'o22147] = 12'o7240; +ram[15'o22150] = 12'o1010; +ram[15'o22151] = 12'o3010; +ram[15'o22152] = 12'o5736; +ram[15'o22153] = 12'o0; +ram[15'o22154] = 12'o1753; +ram[15'o22155] = 12'o2353; +ram[15'o22156] = 12'o3360; +ram[15'o22157] = 12'o4503; +ram[15'o22160] = 12'o0; +ram[15'o22161] = 12'o4505; +ram[15'o22162] = 12'o1464; +ram[15'o22163] = 12'o1376; +ram[15'o22164] = 12'o7450; +ram[15'o22165] = 12'o5372; +ram[15'o22166] = 12'o1377; +ram[15'o22167] = 12'o7640; +ram[15'o22170] = 12'o5373; +ram[15'o22171] = 12'o2353; +ram[15'o22172] = 12'o5753; +ram[15'o22173] = 12'o4503; +ram[15'o22174] = 12'o3271; +ram[15'o22175] = 12'o5357; +ram[15'o22176] = 12'o7462; +ram[15'o22177] = 12'o7765; +ram[15'o22200] = 12'o4321; +ram[15'o22201] = 12'o3203; +ram[15'o22202] = 12'o4340; +ram[15'o22203] = 12'o0; +ram[15'o22204] = 12'o4277; +ram[15'o22205] = 12'o1067; +ram[15'o22206] = 12'o4763; +ram[15'o22207] = 12'o1041; +ram[15'o22210] = 12'o3070; +ram[15'o22211] = 12'o4764; +ram[15'o22212] = 12'o1467; +ram[15'o22213] = 12'o4763; +ram[15'o22214] = 12'o2067; +ram[15'o22215] = 12'o5221; +ram[15'o22216] = 12'o4503; +ram[15'o22217] = 12'o724; +ram[15'o22220] = 12'o5401; +ram[15'o22221] = 12'o2070; +ram[15'o22222] = 12'o5211; +ram[15'o22223] = 12'o4503; +ram[15'o22224] = 12'o724; +ram[15'o22225] = 12'o4511; +ram[15'o22226] = 12'o5205; +ram[15'o22227] = 12'o4321; +ram[15'o22230] = 12'o3241; +ram[15'o22231] = 12'o1241; +ram[15'o22232] = 12'o3254; +ram[15'o22233] = 12'o4321; +ram[15'o22234] = 12'o3243; +ram[15'o22235] = 12'o1243; +ram[15'o22236] = 12'o3271; +ram[15'o22237] = 12'o4340; +ram[15'o22240] = 12'o4277; +ram[15'o22241] = 12'o0; +ram[15'o22242] = 12'o1467; +ram[15'o22243] = 12'o0; +ram[15'o22244] = 12'o7041; +ram[15'o22245] = 12'o1467; +ram[15'o22246] = 12'o7640; +ram[15'o22247] = 12'o5254; +ram[15'o22250] = 12'o4511; +ram[15'o22251] = 12'o2067; +ram[15'o22252] = 12'o5241; +ram[15'o22253] = 12'o5401; +ram[15'o22254] = 12'o0; +ram[15'o22255] = 12'o1467; +ram[15'o22256] = 12'o7640; +ram[15'o22257] = 12'o5263; +ram[15'o22260] = 12'o7604; +ram[15'o22261] = 12'o7710; +ram[15'o22262] = 12'o5250; +ram[15'o22263] = 12'o1067; +ram[15'o22264] = 12'o4763; +ram[15'o22265] = 12'o4764; +ram[15'o22266] = 12'o1467; +ram[15'o22267] = 12'o4763; +ram[15'o22270] = 12'o4764; +ram[15'o22271] = 12'o0; +ram[15'o22272] = 12'o1467; +ram[15'o22273] = 12'o4763; +ram[15'o22274] = 12'o4503; +ram[15'o22275] = 12'o724; +ram[15'o22276] = 12'o5250; +ram[15'o22277] = 12'o0; +ram[15'o22300] = 12'o7240; +ram[15'o22301] = 12'o6666; +ram[15'o22302] = 12'o1320; +ram[15'o22303] = 12'o6046; +ram[15'o22304] = 12'o7200; +ram[15'o22305] = 12'o6661; +ram[15'o22306] = 12'o5312; +ram[15'o22307] = 12'o1317; +ram[15'o22310] = 12'o3106; +ram[15'o22311] = 12'o5314; +ram[15'o22312] = 12'o6041; +ram[15'o22313] = 12'o5305; +ram[15'o22314] = 12'o4503; +ram[15'o22315] = 12'o724; +ram[15'o22316] = 12'o5677; +ram[15'o22317] = 12'o2355; +ram[15'o22320] = 12'o213; +ram[15'o22321] = 12'o0; +ram[15'o22322] = 12'o4503; +ram[15'o22323] = 12'o3235; +ram[15'o22324] = 12'o4505; +ram[15'o22325] = 12'o4504; +ram[15'o22326] = 12'o1041; +ram[15'o22327] = 12'o7120; +ram[15'o22330] = 12'o1073; +ram[15'o22331] = 12'o7430; +ram[15'o22332] = 12'o5737; +ram[15'o22333] = 12'o7006; +ram[15'o22334] = 12'o7004; +ram[15'o22335] = 12'o1074; +ram[15'o22336] = 12'o5721; +ram[15'o22337] = 12'o4233; +ram[15'o22340] = 12'o0; +ram[15'o22341] = 12'o4503; +ram[15'o22342] = 12'o2347; +ram[15'o22343] = 12'o4505; +ram[15'o22344] = 12'o4504; +ram[15'o22345] = 12'o3067; +ram[15'o22346] = 12'o5740; +ram[15'o22347] = 12'o2324; +ram[15'o22350] = 12'o122; +ram[15'o22351] = 12'o2440; +ram[15'o22352] = 12'o124; +ram[15'o22353] = 12'o4055; +ram[15'o22354] = 12'o4000; +ram[15'o22355] = 12'o0; +ram[15'o22356] = 12'o6666; +ram[15'o22357] = 12'o6661; +ram[15'o22360] = 12'o5357; +ram[15'o22361] = 12'o7200; +ram[15'o22362] = 12'o5755; +ram[15'o22363] = 12'o462; +ram[15'o22364] = 12'o253; +ram[15'o22365] = 12'o3714; +ram[15'o22366] = 12'o1701; +ram[15'o22367] = 12'o454; +ram[15'o22370] = 12'o4004; +ram[15'o22371] = 12'o2515; +ram[15'o22372] = 12'o2054; +ram[15'o22373] = 12'o4023; +ram[15'o22374] = 12'o2401; +ram[15'o22375] = 12'o2224; +ram[15'o22376] = 12'o5440; +ram[15'o22377] = 12'o524; +ram[15'o22400] = 12'o377; +ram[15'o22401] = 12'o4000; +ram[15'o22402] = 12'o7766; +ram[15'o22403] = 12'o322; +ram[15'o22404] = 12'o7455; +ram[15'o22405] = 12'o400; +ram[15'o22406] = 12'o1130; +ram[15'o22407] = 12'o7750; +ram[15'o22410] = 12'o30; +ram[15'o22411] = 12'o7704; +ram[15'o22412] = 12'o74; +ram[15'o22413] = 12'o0; +ram[15'o22414] = 12'o7300; +ram[15'o22415] = 12'o4503; +ram[15'o22416] = 12'o3261; +ram[15'o22417] = 12'o4505; +ram[15'o22420] = 12'o7240; +ram[15'o22421] = 12'o1064; +ram[15'o22422] = 12'o3010; +ram[15'o22423] = 12'o3066; +ram[15'o22424] = 12'o4465; +ram[15'o22425] = 12'o5214; +ram[15'o22426] = 12'o1207; +ram[15'o22427] = 12'o7120; +ram[15'o22430] = 12'o1210; +ram[15'o22431] = 12'o7430; +ram[15'o22432] = 12'o5214; +ram[15'o22433] = 12'o3070; +ram[15'o22434] = 12'o3067; +ram[15'o22435] = 12'o1212; +ram[15'o22436] = 12'o4271; +ram[15'o22437] = 12'o3066; +ram[15'o22440] = 12'o4465; +ram[15'o22441] = 12'o5214; +ram[15'o22442] = 12'o1211; +ram[15'o22443] = 12'o7120; +ram[15'o22444] = 12'o1212; +ram[15'o22445] = 12'o7430; +ram[15'o22446] = 12'o5214; +ram[15'o22447] = 12'o1071; +ram[15'o22450] = 12'o3070; +ram[15'o22451] = 12'o3067; +ram[15'o22452] = 12'o1206; +ram[15'o22453] = 12'o4271; +ram[15'o22454] = 12'o7100; +ram[15'o22455] = 12'o6201; +ram[15'o22456] = 12'o1071; +ram[15'o22457] = 12'o1205; +ram[15'o22460] = 12'o3451; +ram[15'o22461] = 12'o7004; +ram[15'o22462] = 12'o1070; +ram[15'o22463] = 12'o1204; +ram[15'o22464] = 12'o3450; +ram[15'o22465] = 12'o1202; +ram[15'o22466] = 12'o3603; +ram[15'o22467] = 12'o4060; +ram[15'o22470] = 12'o5613; +ram[15'o22471] = 12'o0; +ram[15'o22472] = 12'o3341; +ram[15'o22473] = 12'o1070; +ram[15'o22474] = 12'o4312; +ram[15'o22475] = 12'o3071; +ram[15'o22476] = 12'o1060; +ram[15'o22477] = 12'o3070; +ram[15'o22500] = 12'o1067; +ram[15'o22501] = 12'o7450; +ram[15'o22502] = 12'o5671; +ram[15'o22503] = 12'o4312; +ram[15'o22504] = 12'o1070; +ram[15'o22505] = 12'o3070; +ram[15'o22506] = 12'o7004; +ram[15'o22507] = 12'o1060; +ram[15'o22510] = 12'o3067; +ram[15'o22511] = 12'o5671; +ram[15'o22512] = 12'o0; +ram[15'o22513] = 12'o3340; +ram[15'o22514] = 12'o3060; +ram[15'o22515] = 12'o1343; +ram[15'o22516] = 12'o3342; +ram[15'o22517] = 12'o7100; +ram[15'o22520] = 12'o1340; +ram[15'o22521] = 12'o7010; +ram[15'o22522] = 12'o3340; +ram[15'o22523] = 12'o1060; +ram[15'o22524] = 12'o7420; +ram[15'o22525] = 12'o5330; +ram[15'o22526] = 12'o7100; +ram[15'o22527] = 12'o1341; +ram[15'o22530] = 12'o7010; +ram[15'o22531] = 12'o3060; +ram[15'o22532] = 12'o2342; +ram[15'o22533] = 12'o5320; +ram[15'o22534] = 12'o1340; +ram[15'o22535] = 12'o7010; +ram[15'o22536] = 12'o7100; +ram[15'o22537] = 12'o5712; +ram[15'o22540] = 12'o0; +ram[15'o22541] = 12'o0; +ram[15'o22542] = 12'o0; +ram[15'o22543] = 12'o7764; +ram[15'o22544] = 12'o4340; +ram[15'o22545] = 12'o2523; +ram[15'o22546] = 12'o522; +ram[15'o22547] = 12'o4006; +ram[15'o22550] = 12'o1105; +ram[15'o22551] = 12'o1404; +ram[15'o22552] = 12'o2340; +ram[15'o22553] = 12'o5540; +ram[15'o22554] = 12'o0; +ram[15'o22555] = 12'o0; +ram[15'o22556] = 12'o0; +ram[15'o22557] = 12'o0; +ram[15'o22560] = 12'o0; +ram[15'o22561] = 12'o0; +ram[15'o22562] = 12'o0; +ram[15'o22563] = 12'o0; +ram[15'o22564] = 12'o0; +ram[15'o22565] = 12'o0; +ram[15'o22566] = 12'o0; +ram[15'o22567] = 12'o0; +ram[15'o22570] = 12'o0; +ram[15'o22571] = 12'o0; +ram[15'o22572] = 12'o0; +ram[15'o22573] = 12'o0; +ram[15'o22574] = 12'o0; +ram[15'o22600] = 12'o0; +ram[15'o22601] = 12'o7240; +ram[15'o22602] = 12'o3327; +ram[15'o22603] = 12'o1044; +ram[15'o22604] = 12'o3323; +ram[15'o22605] = 12'o6761; +ram[15'o22606] = 12'o75; +ram[15'o22607] = 12'o7650; +ram[15'o22610] = 12'o1364; +ram[15'o22611] = 12'o6764; +ram[15'o22612] = 12'o1330; +ram[15'o22613] = 12'o3322; +ram[15'o22614] = 12'o6774; +ram[15'o22615] = 12'o3732; +ram[15'o22616] = 12'o1073; +ram[15'o22617] = 12'o6764; +ram[15'o22620] = 12'o4337; +ram[15'o22621] = 12'o6761; +ram[15'o22622] = 12'o7006; +ram[15'o22623] = 12'o7006; +ram[15'o22624] = 12'o7200; +ram[15'o22625] = 12'o1324; +ram[15'o22626] = 12'o7040; +ram[15'o22627] = 12'o7430; +ram[15'o22630] = 12'o1033; +ram[15'o22631] = 12'o1000; +ram[15'o22632] = 12'o7650; +ram[15'o22633] = 12'o7420; +ram[15'o22634] = 12'o5300; +ram[15'o22635] = 12'o1042; +ram[15'o22636] = 12'o3731; +ram[15'o22637] = 12'o1327; +ram[15'o22640] = 12'o3732; +ram[15'o22641] = 12'o1325; +ram[15'o22642] = 12'o6774; +ram[15'o22643] = 12'o1326; +ram[15'o22644] = 12'o6764; +ram[15'o22645] = 12'o4337; +ram[15'o22646] = 12'o1732; +ram[15'o22647] = 12'o3327; +ram[15'o22650] = 12'o6761; +ram[15'o22651] = 12'o334; +ram[15'o22652] = 12'o6764; +ram[15'o22653] = 12'o2324; +ram[15'o22654] = 12'o2323; +ram[15'o22655] = 12'o5212; +ram[15'o22656] = 12'o1324; +ram[15'o22657] = 12'o1333; +ram[15'o22660] = 12'o7710; +ram[15'o22661] = 12'o5600; +ram[15'o22662] = 12'o1156; +ram[15'o22663] = 12'o6764; +ram[15'o22664] = 12'o6761; +ram[15'o22665] = 12'o1040; +ram[15'o22666] = 12'o335; +ram[15'o22667] = 12'o3324; +ram[15'o22670] = 12'o4511; +ram[15'o22671] = 12'o6765; +ram[15'o22672] = 12'o4511; +ram[15'o22673] = 12'o1324; +ram[15'o22674] = 12'o6764; +ram[15'o22675] = 12'o3324; +ram[15'o22676] = 12'o4511; +ram[15'o22677] = 12'o5600; +ram[15'o22700] = 12'o7420; +ram[15'o22701] = 12'o5217; +ram[15'o22702] = 12'o1156; +ram[15'o22703] = 12'o2322; +ram[15'o22704] = 12'o5217; +ram[15'o22705] = 12'o1042; +ram[15'o22706] = 12'o6764; +ram[15'o22707] = 12'o4503; +ram[15'o22710] = 12'o2712; +ram[15'o22711] = 12'o5401; +ram[15'o22712] = 12'o3704; +ram[15'o22713] = 12'o503; +ram[15'o22714] = 12'o2401; +ram[15'o22715] = 12'o2005; +ram[15'o22716] = 12'o4005; +ram[15'o22717] = 12'o2222; +ram[15'o22720] = 12'o1722; +ram[15'o22721] = 12'o0; +ram[15'o22722] = 12'o0; +ram[15'o22723] = 12'o0; +ram[15'o22724] = 12'o0; +ram[15'o22725] = 12'o0; +ram[15'o22726] = 12'o0; +ram[15'o22727] = 12'o0; +ram[15'o22730] = 12'o7773; +ram[15'o22731] = 12'o7754; +ram[15'o22732] = 12'o7755; +ram[15'o22733] = 12'o5101; +ram[15'o22734] = 12'o77; +ram[15'o22735] = 12'o7000; +ram[15'o22736] = 12'o0; +ram[15'o22737] = 12'o0; +ram[15'o22740] = 12'o6771; +ram[15'o22741] = 12'o5340; +ram[15'o22742] = 12'o4511; +ram[15'o22743] = 12'o6772; +ram[15'o22744] = 12'o7700; +ram[15'o22745] = 12'o5737; +ram[15'o22746] = 12'o6772; +ram[15'o22747] = 12'o3336; +ram[15'o22750] = 12'o1336; +ram[15'o22751] = 12'o156; +ram[15'o22752] = 12'o7640; +ram[15'o22753] = 12'o5362; +ram[15'o22754] = 12'o6761; +ram[15'o22755] = 12'o365; +ram[15'o22756] = 12'o6764; +ram[15'o22757] = 12'o1364; +ram[15'o22760] = 12'o6764; +ram[15'o22761] = 12'o5214; +ram[15'o22762] = 12'o3000; +ram[15'o22763] = 12'o6764; +ram[15'o22764] = 12'o600; +ram[15'o22765] = 12'o377; +ram[15'o22766] = 12'o4511; +ram[15'o22767] = 12'o6772; +ram[15'o22770] = 12'o7710; +ram[15'o22771] = 12'o5362; +ram[15'o22772] = 12'o2000; +ram[15'o22773] = 12'o5363; +ram[15'o22774] = 12'o5354; +ram[15'o23000] = 12'o4630; +ram[15'o23001] = 12'o724; +ram[15'o23002] = 12'o1227; +ram[15'o23003] = 12'o3223; +ram[15'o23004] = 12'o4503; +ram[15'o23005] = 12'o3235; +ram[15'o23006] = 12'o4505; +ram[15'o23007] = 12'o1464; +ram[15'o23010] = 12'o35; +ram[15'o23011] = 12'o3224; +ram[15'o23012] = 12'o4503; +ram[15'o23013] = 12'o3245; +ram[15'o23014] = 12'o4505; +ram[15'o23015] = 12'o4504; +ram[15'o23016] = 12'o7106; +ram[15'o23017] = 12'o7004; +ram[15'o23020] = 12'o1224; +ram[15'o23021] = 12'o3224; +ram[15'o23022] = 12'o4500; +ram[15'o23023] = 12'o0; +ram[15'o23024] = 12'o0; +ram[15'o23025] = 12'o4501; +ram[15'o23026] = 12'o5200; +ram[15'o23027] = 12'o6603; +ram[15'o23030] = 12'o1267; +ram[15'o23031] = 12'o0; +ram[15'o23032] = 12'o7200; +ram[15'o23033] = 12'o4500; +ram[15'o23034] = 12'o6603; +ram[15'o23035] = 12'o41; +ram[15'o23036] = 12'o4501; +ram[15'o23037] = 12'o1242; +ram[15'o23040] = 12'o4243; +ram[15'o23041] = 12'o5631; +ram[15'o23042] = 12'o2424; +ram[15'o23043] = 12'o0; +ram[15'o23044] = 12'o3253; +ram[15'o23045] = 12'o6211; +ram[15'o23046] = 12'o3653; +ram[15'o23047] = 12'o2253; +ram[15'o23050] = 12'o5246; +ram[15'o23051] = 12'o4060; +ram[15'o23052] = 12'o5643; +ram[15'o23053] = 12'o0; +ram[15'o23054] = 12'o0; +ram[15'o23055] = 12'o1301; +ram[15'o23056] = 12'o3702; +ram[15'o23057] = 12'o7240; +ram[15'o23060] = 12'o1300; +ram[15'o23061] = 12'o3010; +ram[15'o23062] = 12'o1010; +ram[15'o23063] = 12'o3011; +ram[15'o23064] = 12'o4060; +ram[15'o23065] = 12'o1410; +ram[15'o23066] = 12'o6211; +ram[15'o23067] = 12'o3411; +ram[15'o23070] = 12'o2303; +ram[15'o23071] = 12'o5264; +ram[15'o23072] = 12'o3677; +ram[15'o23073] = 12'o4060; +ram[15'o23074] = 12'o4503; +ram[15'o23075] = 12'o1161; +ram[15'o23076] = 12'o5654; +ram[15'o23077] = 12'o5006; +ram[15'o23100] = 12'o4400; +ram[15'o23101] = 12'o3400; +ram[15'o23102] = 12'o1400; +ram[15'o23103] = 12'o4601; +ram[15'o23104] = 12'o1417; +ram[15'o23105] = 12'o104; +ram[15'o23106] = 12'o4005; +ram[15'o23107] = 12'o3005; +ram[15'o23110] = 12'o340; +ram[15'o23111] = 12'o404; +ram[15'o23112] = 12'o2440; +ram[15'o23113] = 12'o124; +ram[15'o23114] = 12'o4023; +ram[15'o23115] = 12'o2401; +ram[15'o23116] = 12'o2224; +ram[15'o23117] = 12'o5525; +ram[15'o23120] = 12'o2077; +ram[15'o23121] = 12'o4000; +ram[15'o23122] = 12'o0; +ram[15'o23123] = 12'o7344; +ram[15'o23124] = 12'o3253; +ram[15'o23125] = 12'o1064; +ram[15'o23126] = 12'o3243; +ram[15'o23127] = 12'o1722; +ram[15'o23130] = 12'o3231; +ram[15'o23131] = 12'o2322; +ram[15'o23132] = 12'o4351; +ram[15'o23133] = 12'o7106; +ram[15'o23134] = 12'o7006; +ram[15'o23135] = 12'o7006; +ram[15'o23136] = 12'o3631; +ram[15'o23137] = 12'o4060; +ram[15'o23140] = 12'o4351; +ram[15'o23141] = 12'o1631; +ram[15'o23142] = 12'o3631; +ram[15'o23143] = 12'o2231; +ram[15'o23144] = 12'o4060; +ram[15'o23145] = 12'o2253; +ram[15'o23146] = 12'o5332; +ram[15'o23147] = 12'o5722; +ram[15'o23150] = 12'o7540; +ram[15'o23151] = 12'o0; +ram[15'o23152] = 12'o1643; +ram[15'o23153] = 12'o1363; +ram[15'o23154] = 12'o7650; +ram[15'o23155] = 12'o5722; +ram[15'o23156] = 12'o1643; +ram[15'o23157] = 12'o2243; +ram[15'o23160] = 12'o1350; +ram[15'o23161] = 12'o6211; +ram[15'o23162] = 12'o5751; +ram[15'o23163] = 12'o7563; +ram[15'o23164] = 12'o516; +ram[15'o23165] = 12'o102; +ram[15'o23166] = 12'o1405; +ram[15'o23167] = 12'o4036; +ram[15'o23170] = 12'o2340; +ram[15'o23171] = 12'o605; +ram[15'o23172] = 12'o124; +ram[15'o23173] = 12'o2522; +ram[15'o23174] = 12'o577; +ram[15'o23175] = 12'o4000; +ram[15'o23200] = 12'o4510; +ram[15'o23201] = 12'o6211; +ram[15'o23202] = 12'o4617; +ram[15'o23203] = 12'o7410; +ram[15'o23204] = 12'o5401; +ram[15'o23205] = 12'o3300; +ram[15'o23206] = 12'o6214; +ram[15'o23207] = 12'o7041; +ram[15'o23210] = 12'o1300; +ram[15'o23211] = 12'o7650; +ram[15'o23212] = 12'o5620; +ram[15'o23213] = 12'o1300; +ram[15'o23214] = 12'o7402; +ram[15'o23215] = 12'o7200; +ram[15'o23216] = 12'o5620; +ram[15'o23217] = 12'o7600; +ram[15'o23220] = 12'o7732; +ram[15'o23221] = 12'o4623; +ram[15'o23222] = 12'o5202; +ram[15'o23223] = 12'o4241; +ram[15'o23224] = 12'o2205; +ram[15'o23225] = 12'o104; +ram[15'o23226] = 12'o4017; +ram[15'o23227] = 12'o2240; +ram[15'o23230] = 12'o2722; +ram[15'o23231] = 12'o1124; +ram[15'o23232] = 12'o540; +ram[15'o23233] = 12'o5540; +ram[15'o23234] = 12'o0; +ram[15'o23235] = 12'o611; +ram[15'o23236] = 12'o514; +ram[15'o23237] = 12'o440; +ram[15'o23240] = 12'o1625; +ram[15'o23241] = 12'o1502; +ram[15'o23242] = 12'o522; +ram[15'o23243] = 12'o4055; +ram[15'o23244] = 12'o4000; +ram[15'o23245] = 12'o2422; +ram[15'o23246] = 12'o103; +ram[15'o23247] = 12'o1340; +ram[15'o23250] = 12'o1625; +ram[15'o23251] = 12'o1502; +ram[15'o23252] = 12'o522; +ram[15'o23253] = 12'o4055; +ram[15'o23254] = 12'o4000; +ram[15'o23255] = 12'o3724; +ram[15'o23256] = 12'o120; +ram[15'o23257] = 12'o540; +ram[15'o23260] = 12'o0; +ram[15'o23261] = 12'o1022; +ram[15'o23262] = 12'o7215; +ram[15'o23263] = 12'o1116; +ram[15'o23264] = 12'o4055; +ram[15'o23265] = 12'o4000; +ram[15'o23266] = 12'o4340; +ram[15'o23267] = 12'o5540; +ram[15'o23270] = 12'o0; +ram[15'o23271] = 12'o3105; +ram[15'o23272] = 12'o2340; +ram[15'o23273] = 12'o1722; +ram[15'o23274] = 12'o4016; +ram[15'o23275] = 12'o1756; +ram[15'o23276] = 12'o5656; +ram[15'o23277] = 12'o4000; +ram[15'o23300] = 12'o0; +ram[15'o23301] = 12'o6214; +ram[15'o23302] = 12'o1074; +ram[15'o23303] = 12'o3351; +ram[15'o23304] = 12'o4060; +ram[15'o23305] = 12'o1700; +ram[15'o23306] = 12'o3330; +ram[15'o23307] = 12'o2300; +ram[15'o23310] = 12'o1700; +ram[15'o23311] = 12'o3363; +ram[15'o23312] = 12'o1363; +ram[15'o23313] = 12'o7006; +ram[15'o23314] = 12'o7004; +ram[15'o23315] = 12'o332; +ram[15'o23316] = 12'o6615; +ram[15'o23317] = 12'o1700; +ram[15'o23320] = 12'o7112; +ram[15'o23321] = 12'o2300; +ram[15'o23322] = 12'o7010; +ram[15'o23323] = 12'o6643; +ram[15'o23324] = 12'o6201; +ram[15'o23325] = 12'o3733; +ram[15'o23326] = 12'o7240; +ram[15'o23327] = 12'o3734; +ram[15'o23330] = 12'o0; +ram[15'o23331] = 12'o5700; +ram[15'o23332] = 12'o70; +ram[15'o23333] = 12'o7750; +ram[15'o23334] = 12'o7751; +ram[15'o23335] = 12'o0; +ram[15'o23336] = 12'o7346; +ram[15'o23337] = 12'o3366; +ram[15'o23340] = 12'o6623; +ram[15'o23341] = 12'o5340; +ram[15'o23342] = 12'o6621; +ram[15'o23343] = 12'o5351; +ram[15'o23344] = 12'o6616; +ram[15'o23345] = 12'o365; +ram[15'o23346] = 12'o6201; +ram[15'o23347] = 12'o7450; +ram[15'o23350] = 12'o1733; +ram[15'o23351] = 12'o0; +ram[15'o23352] = 12'o7450; +ram[15'o23353] = 12'o5735; +ram[15'o23354] = 12'o2366; +ram[15'o23355] = 12'o7610; +ram[15'o23356] = 12'o5367; +ram[15'o23357] = 12'o1330; +ram[15'o23360] = 12'o3362; +ram[15'o23361] = 12'o4500; +ram[15'o23362] = 12'o0; +ram[15'o23363] = 12'o0; +ram[15'o23364] = 12'o5340; +ram[15'o23365] = 12'o1005; +ram[15'o23366] = 12'o0; +ram[15'o23367] = 12'o4503; +ram[15'o23370] = 12'o3372; +ram[15'o23371] = 12'o5401; +ram[15'o23372] = 12'o3704; +ram[15'o23373] = 12'o1123; +ram[15'o23374] = 12'o1340; +ram[15'o23375] = 12'o522; +ram[15'o23376] = 12'o2217; +ram[15'o23377] = 12'o2200; +ram[15'o23400] = 12'o4736; +ram[15'o23401] = 12'o3255; +ram[15'o23402] = 12'o3325; +ram[15'o23403] = 12'o4503; +ram[15'o23404] = 12'o3266; +ram[15'o23405] = 12'o4505; +ram[15'o23406] = 12'o4504; +ram[15'o23407] = 12'o7041; +ram[15'o23410] = 12'o7450; +ram[15'o23411] = 12'o1326; +ram[15'o23412] = 12'o3327; +ram[15'o23413] = 12'o3261; +ram[15'o23414] = 12'o4060; +ram[15'o23415] = 12'o1661; +ram[15'o23416] = 12'o6201; +ram[15'o23417] = 12'o3661; +ram[15'o23420] = 12'o2261; +ram[15'o23421] = 12'o5214; +ram[15'o23422] = 12'o6203; +ram[15'o23423] = 12'o5224; +ram[15'o23424] = 12'o1222; +ram[15'o23425] = 12'o3061; +ram[15'o23426] = 12'o1325; +ram[15'o23427] = 12'o7100; +ram[15'o23430] = 12'o7650; +ram[15'o23431] = 12'o7120; +ram[15'o23432] = 12'o7420; +ram[15'o23433] = 12'o1334; +ram[15'o23434] = 12'o1335; +ram[15'o23435] = 12'o3730; +ram[15'o23436] = 12'o1317; +ram[15'o23437] = 12'o7430; +ram[15'o23440] = 12'o1032; +ram[15'o23441] = 12'o3261; +ram[15'o23442] = 12'o1327; +ram[15'o23443] = 12'o7004; +ram[15'o23444] = 12'o3327; +ram[15'o23445] = 12'o3731; +ram[15'o23446] = 12'o1040; +ram[15'o23447] = 12'o6766; +ram[15'o23450] = 12'o7001; +ram[15'o23451] = 12'o3262; +ram[15'o23452] = 12'o1073; +ram[15'o23453] = 12'o3732; +ram[15'o23454] = 12'o1325; +ram[15'o23455] = 12'o7640; +ram[15'o23456] = 12'o5316; +ram[15'o23457] = 12'o4733; +ram[15'o23460] = 12'o4500; +ram[15'o23461] = 12'o0; +ram[15'o23462] = 12'o0; +ram[15'o23463] = 12'o2327; +ram[15'o23464] = 12'o5267; +ram[15'o23465] = 12'o4501; +ram[15'o23466] = 12'o5301; +ram[15'o23467] = 12'o1262; +ram[15'o23470] = 12'o7012; +ram[15'o23471] = 12'o7710; +ram[15'o23472] = 12'o1073; +ram[15'o23473] = 12'o1073; +ram[15'o23474] = 12'o3732; +ram[15'o23475] = 12'o4733; +ram[15'o23476] = 12'o2327; +ram[15'o23477] = 12'o5305; +ram[15'o23500] = 12'o6601; +ram[15'o23501] = 12'o1156; +ram[15'o23502] = 12'o6764; +ram[15'o23503] = 12'o5704; +ram[15'o23504] = 12'o1322; +ram[15'o23505] = 12'o4501; +ram[15'o23506] = 12'o1262; +ram[15'o23507] = 12'o7010; +ram[15'o23510] = 12'o7630; +ram[15'o23511] = 12'o1032; +ram[15'o23512] = 12'o1035; +ram[15'o23513] = 12'o1262; +ram[15'o23514] = 12'o3262; +ram[15'o23515] = 12'o5260; +ram[15'o23516] = 12'o4500; +ram[15'o23517] = 12'o6603; +ram[15'o23520] = 12'o1; +ram[15'o23521] = 12'o5305; +ram[15'o23522] = 12'o7240; +ram[15'o23523] = 12'o3325; +ram[15'o23524] = 12'o5211; +ram[15'o23525] = 12'o0; +ram[15'o23526] = 12'o7700; +ram[15'o23527] = 12'o0; +ram[15'o23530] = 12'o2726; +ram[15'o23531] = 12'o2724; +ram[15'o23532] = 12'o2725; +ram[15'o23533] = 12'o2600; +ram[15'o23534] = 12'o20; +ram[15'o23535] = 12'o30; +ram[15'o23536] = 12'o1267; +ram[15'o23537] = 12'o3724; +ram[15'o23540] = 12'o120; +ram[15'o23541] = 12'o540; +ram[15'o23542] = 12'o2205; +ram[15'o23543] = 12'o104; +ram[15'o23544] = 12'o4005; +ram[15'o23545] = 12'o2222; +ram[15'o23546] = 12'o1722; +ram[15'o23547] = 12'o0; +ram[15'o23550] = 12'o3727; +ram[15'o23551] = 12'o1001; +ram[15'o23552] = 12'o2477; +ram[15'o23553] = 12'o3720; +ram[15'o23554] = 12'o1405; +ram[15'o23555] = 12'o123; +ram[15'o23556] = 12'o540; +ram[15'o23557] = 12'o2422; +ram[15'o23560] = 12'o3140; +ram[15'o23561] = 12'o107; +ram[15'o23562] = 12'o111; +ram[15'o23563] = 12'o1637; +ram[15'o23564] = 12'o0; +ram[15'o23600] = 12'o0; +ram[15'o23601] = 12'o3122; +ram[15'o23602] = 12'o4054; +ram[15'o23603] = 12'o4510; +ram[15'o23604] = 12'o4503; +ram[15'o23605] = 12'o727; +ram[15'o23606] = 12'o4503; +ram[15'o23607] = 12'o744; +ram[15'o23610] = 12'o4505; +ram[15'o23611] = 12'o4601; +ram[15'o23612] = 12'o11; +ram[15'o23613] = 12'o4503; +ram[15'o23614] = 12'o733; +ram[15'o23615] = 12'o4503; +ram[15'o23616] = 12'o744; +ram[15'o23617] = 12'o4505; +ram[15'o23620] = 12'o4601; +ram[15'o23621] = 12'o41; +ram[15'o23622] = 12'o4503; +ram[15'o23623] = 12'o737; +ram[15'o23624] = 12'o4503; +ram[15'o23625] = 12'o744; +ram[15'o23626] = 12'o4505; +ram[15'o23627] = 12'o4601; +ram[15'o23630] = 12'o61; +ram[15'o23631] = 12'o1202; +ram[15'o23632] = 12'o3010; +ram[15'o23633] = 12'o1410; +ram[15'o23634] = 12'o7450; +ram[15'o23635] = 12'o5244; +ram[15'o23636] = 12'o3200; +ram[15'o23637] = 12'o1410; +ram[15'o23640] = 12'o6211; +ram[15'o23641] = 12'o3600; +ram[15'o23642] = 12'o4060; +ram[15'o23643] = 12'o5233; +ram[15'o23644] = 12'o1112; +ram[15'o23645] = 12'o1342; +ram[15'o23646] = 12'o7106; +ram[15'o23647] = 12'o7124; +ram[15'o23650] = 12'o3253; +ram[15'o23651] = 12'o4500; +ram[15'o23652] = 12'o6605; +ram[15'o23653] = 12'o0; +ram[15'o23654] = 12'o4501; +ram[15'o23655] = 12'o4746; +ram[15'o23656] = 12'o1347; +ram[15'o23657] = 12'o4510; +ram[15'o23660] = 12'o1341; +ram[15'o23661] = 12'o1063; +ram[15'o23662] = 12'o1344; +ram[15'o23663] = 12'o7106; +ram[15'o23664] = 12'o7006; +ram[15'o23665] = 12'o1113; +ram[15'o23666] = 12'o3345; +ram[15'o23667] = 12'o7240; +ram[15'o23670] = 12'o6211; +ram[15'o23671] = 12'o3750; +ram[15'o23672] = 12'o7346; +ram[15'o23673] = 12'o1345; +ram[15'o23674] = 12'o3751; +ram[15'o23675] = 12'o1337; +ram[15'o23676] = 12'o3736; +ram[15'o23677] = 12'o1345; +ram[15'o23700] = 12'o7500; +ram[15'o23701] = 12'o5307; +ram[15'o23702] = 12'o1353; +ram[15'o23703] = 12'o3345; +ram[15'o23704] = 12'o1352; +ram[15'o23705] = 12'o3340; +ram[15'o23706] = 12'o1345; +ram[15'o23707] = 12'o1343; +ram[15'o23710] = 12'o2340; +ram[15'o23711] = 12'o7500; +ram[15'o23712] = 12'o5307; +ram[15'o23713] = 12'o3345; +ram[15'o23714] = 12'o7240; +ram[15'o23715] = 12'o1340; +ram[15'o23716] = 12'o1336; +ram[15'o23717] = 12'o3340; +ram[15'o23720] = 12'o7124; +ram[15'o23721] = 12'o2345; +ram[15'o23722] = 12'o5320; +ram[15'o23723] = 12'o3740; +ram[15'o23724] = 12'o5327; +ram[15'o23725] = 12'o7240; +ram[15'o23726] = 12'o3740; +ram[15'o23727] = 12'o2340; +ram[15'o23730] = 12'o5325; +ram[15'o23731] = 12'o4500; +ram[15'o23732] = 12'o6605; +ram[15'o23733] = 12'o11; +ram[15'o23734] = 12'o4501; +ram[15'o23735] = 12'o5401; +ram[15'o23736] = 12'o7252; +ram[15'o23737] = 12'o7000; +ram[15'o23740] = 12'o0; +ram[15'o23741] = 12'o7773; +ram[15'o23742] = 12'o24; +ram[15'o23743] = 12'o7764; +ram[15'o23744] = 12'o100; +ram[15'o23745] = 12'o0; +ram[15'o23746] = 12'o4040; +ram[15'o23747] = 12'o6000; +ram[15'o23750] = 12'o7250; +ram[15'o23751] = 12'o7251; +ram[15'o23752] = 12'o253; +ram[15'o23753] = 12'o3774; +ram[15'o23754] = 12'o3727; +ram[15'o23755] = 12'o2211; +ram[15'o23756] = 12'o2405; +ram[15'o23757] = 12'o4032; +ram[15'o23760] = 12'o522; +ram[15'o23761] = 12'o1740; +ram[15'o23762] = 12'o2331; +ram[15'o23763] = 12'o2324; +ram[15'o23764] = 12'o515; +ram[15'o23765] = 12'o4004; +ram[15'o23766] = 12'o1122; +ram[15'o23767] = 12'o503; +ram[15'o23770] = 12'o2417; +ram[15'o23771] = 12'o2231; +ram[15'o23772] = 12'o7740; +ram[15'o23773] = 12'o0; +ram[15'o24000] = 12'o5601; +ram[15'o24001] = 12'o2000; +ram[15'o24002] = 12'o0; +ram[15'o24003] = 12'o1112; +ram[15'o24004] = 12'o1235; +ram[15'o24005] = 12'o7106; +ram[15'o24006] = 12'o7124; +ram[15'o24007] = 12'o3212; +ram[15'o24010] = 12'o4500; +ram[15'o24011] = 12'o6603; +ram[15'o24012] = 12'o0; +ram[15'o24013] = 12'o4501; +ram[15'o24014] = 12'o1237; +ram[15'o24015] = 12'o3010; +ram[15'o24016] = 12'o1064; +ram[15'o24017] = 12'o3011; +ram[15'o24020] = 12'o1372; +ram[15'o24021] = 12'o3240; +ram[15'o24022] = 12'o6211; +ram[15'o24023] = 12'o1410; +ram[15'o24024] = 12'o4060; +ram[15'o24025] = 12'o3411; +ram[15'o24026] = 12'o2240; +ram[15'o24027] = 12'o5222; +ram[15'o24030] = 12'o6211; +ram[15'o24031] = 12'o1636; +ram[15'o24032] = 12'o4060; +ram[15'o24033] = 12'o3411; +ram[15'o24034] = 12'o5602; +ram[15'o24035] = 12'o24; +ram[15'o24036] = 12'o14; +ram[15'o24037] = 12'o20; +ram[15'o24040] = 12'o0; +ram[15'o24041] = 12'o4500; +ram[15'o24042] = 12'o6603; +ram[15'o24043] = 12'o11; +ram[15'o24044] = 12'o4501; +ram[15'o24045] = 12'o5640; +ram[15'o24046] = 12'o4654; +ram[15'o24047] = 12'o3240; +ram[15'o24050] = 12'o3640; +ram[15'o24051] = 12'o2240; +ram[15'o24052] = 12'o5250; +ram[15'o24053] = 12'o5401; +ram[15'o24054] = 12'o4241; +ram[15'o24055] = 12'o3; +ram[15'o24056] = 12'o10; +ram[15'o24057] = 12'o10; +ram[15'o24060] = 12'o1; +ram[15'o24061] = 12'o13; +ram[15'o24062] = 12'o40; +ram[15'o24063] = 12'o14; +ram[15'o24064] = 12'o12; +ram[15'o24065] = 12'o17; +ram[15'o24066] = 12'o20; +ram[15'o24067] = 12'o21; +ram[15'o24070] = 12'o1; +ram[15'o24071] = 12'o30; +ram[15'o24072] = 12'o7777; +ram[15'o24073] = 12'o40; +ram[15'o24074] = 12'o2; +ram[15'o24075] = 12'o43; +ram[15'o24076] = 12'o60; +ram[15'o24077] = 12'o44; +ram[15'o24100] = 12'o7777; +ram[15'o24101] = 12'o47; +ram[15'o24102] = 12'o50; +ram[15'o24103] = 12'o51; +ram[15'o24104] = 12'o2; +ram[15'o24105] = 12'o60; +ram[15'o24106] = 12'o3; +ram[15'o24107] = 12'o64; +ram[15'o24110] = 12'o7777; +ram[15'o24111] = 12'o67; +ram[15'o24112] = 12'o70; +ram[15'o24113] = 12'o71; +ram[15'o24114] = 12'o3; +ram[15'o24115] = 12'o0; +ram[15'o24116] = 12'o6524; +ram[15'o24117] = 12'o6265; +ram[15'o24120] = 12'o531; +ram[15'o24121] = 12'o5777; +ram[15'o24122] = 12'o0; +ram[15'o24123] = 12'o4202; +ram[15'o24124] = 12'o4240; +ram[15'o24125] = 12'o1321; +ram[15'o24126] = 12'o3010; +ram[15'o24127] = 12'o6211; +ram[15'o24130] = 12'o3410; +ram[15'o24131] = 12'o1010; +ram[15'o24132] = 12'o1320; +ram[15'o24133] = 12'o7640; +ram[15'o24134] = 12'o5330; +ram[15'o24135] = 12'o1316; +ram[15'o24136] = 12'o3010; +ram[15'o24137] = 12'o1064; +ram[15'o24140] = 12'o3011; +ram[15'o24141] = 12'o1372; +ram[15'o24142] = 12'o3240; +ram[15'o24143] = 12'o4060; +ram[15'o24144] = 12'o1411; +ram[15'o24145] = 12'o6211; +ram[15'o24146] = 12'o3410; +ram[15'o24147] = 12'o2240; +ram[15'o24150] = 12'o5343; +ram[15'o24151] = 12'o7324; +ram[15'o24152] = 12'o3717; +ram[15'o24153] = 12'o7040; +ram[15'o24154] = 12'o2317; +ram[15'o24155] = 12'o3717; +ram[15'o24156] = 12'o2317; +ram[15'o24157] = 12'o4060; +ram[15'o24160] = 12'o1411; +ram[15'o24161] = 12'o6211; +ram[15'o24162] = 12'o7041; +ram[15'o24163] = 12'o3717; +ram[15'o24164] = 12'o4060; +ram[15'o24165] = 12'o4500; +ram[15'o24166] = 12'o6605; +ram[15'o24167] = 12'o11; +ram[15'o24170] = 12'o4501; +ram[15'o24171] = 12'o5722; +ram[15'o24172] = 12'o7771; + +ram[15'o24200] = 12'o7200; +ram[15'o24201] = 12'o6224; +ram[15'o24202] = 12'o1074; +ram[15'o24203] = 12'o3061; +ram[15'o24204] = 12'o4503; +ram[15'o24205] = 12'o4210; +ram[15'o24206] = 12'o7402; +ram[15'o24207] = 12'o5203; +ram[15'o24210] = 12'o3720; +ram[15'o24211] = 12'o1405; +ram[15'o24212] = 12'o123; +ram[15'o24213] = 12'o540; +ram[15'o24214] = 12'o417; +ram[15'o24215] = 12'o1647; +ram[15'o24216] = 12'o2440; +ram[15'o24217] = 12'o2422; +ram[15'o24220] = 12'o3140; +ram[15'o24221] = 12'o2417; +ram[15'o24222] = 12'o4014; +ram[15'o24223] = 12'o1701; +ram[15'o24224] = 12'o440; +ram[15'o24225] = 12'o1116; +ram[15'o24226] = 12'o1124; +ram[15'o24227] = 12'o4027; +ram[15'o24230] = 12'o1124; +ram[15'o24231] = 12'o1040; +ram[15'o24232] = 12'o2410; +ram[15'o24233] = 12'o540; +ram[15'o24234] = 12'o211; +ram[15'o24235] = 12'o1601; +ram[15'o24236] = 12'o2231; +ram[15'o24237] = 12'o4014; +ram[15'o24240] = 12'o1701; +ram[15'o24241] = 12'o405; +ram[15'o24242] = 12'o2240; +ram[15'o24243] = 12'o0; +ram[15'o24243] = 12'o1417; +ram[15'o24244] = 12'o301; +ram[15'o24245] = 12'o2405; +ram[15'o24246] = 12'o440; +ram[15'o24247] = 12'o1116; +ram[15'o24250] = 12'o4006; +ram[15'o24251] = 12'o1105; +ram[15'o24252] = 12'o1404; +ram[15'o24253] = 12'o4062; +ram[15'o24254] = 12'o4100; +ram[15'o27632] = 12'o5401; + +// bootstrap starts here +ram[15'o24200] = 12'o7200; +ram[15'o24201] = 12'o6224; +ram[15'o24202] = 12'o1074; +ram[15'o24203] = 12'o3061; +ram[15'o24204] = 12'o4060; +ram[15'o24205] = 12'o6761; +ram[15'o24206] = 12'o75; +ram[15'o24207] = 12'o6764; +ram[15'o24210] = 12'o1240; +ram[15'o24211] = 12'o3106; +ram[15'o24212] = 12'o6030; +ram[15'o24213] = 12'o4503; +ram[15'o24214] = 12'o2365; +ram[15'o24215] = 12'o4505; +ram[15'o24216] = 12'o1237; +ram[15'o24217] = 12'o3010; +ram[15'o24220] = 12'o1410; +ram[15'o24221] = 12'o7450; +ram[15'o24222] = 12'o5233; +ram[15'o24223] = 12'o1464; +ram[15'o24224] = 12'o7650; +ram[15'o24225] = 12'o5230; +ram[15'o24226] = 12'o2010; +ram[15'o24227] = 12'o5220; +ram[15'o24230] = 12'o1410; +ram[15'o24231] = 12'o3060; +ram[15'o24232] = 12'o5460; +ram[15'o24233] = 12'o7200; +ram[15'o24234] = 12'o4503; +ram[15'o24235] = 12'o3550; +ram[15'o24236] = 12'o5200; +ram[15'o24237] = 12'o4345; +ram[15'o24240] = 12'o534; +ram[15'o24241] = 12'o0; +ram[15'o24242] = 12'o4060; +ram[15'o24243] = 12'o1657; +ram[15'o24244] = 12'o1260; +ram[15'o24245] = 12'o7100; +ram[15'o24246] = 12'o1073; +ram[15'o24247] = 12'o7420; +ram[15'o24250] = 12'o5233; +ram[15'o24251] = 12'o7106; +ram[15'o24252] = 12'o7004; +ram[15'o24253] = 12'o1074; +ram[15'o24254] = 12'o3255; +ram[15'o24255] = 12'o0; +ram[15'o24256] = 12'o5641; +ram[15'o24257] = 12'o2556; +ram[15'o24260] = 12'o7510; +ram[15'o24261] = 12'o600; +ram[15'o24262] = 12'o1403; +ram[15'o24263] = 12'o1402; +ram[15'o24264] = 12'o2132; +ram[15'o24265] = 12'o1405; +ram[15'o24266] = 12'o2402; +ram[15'o24267] = 12'o1524; +ram[15'o24270] = 12'o7764; +ram[15'o24271] = 12'o4661; +ram[15'o24272] = 12'o4500; +ram[15'o24273] = 12'o6603; +ram[15'o24274] = 12'o21; +ram[15'o24275] = 12'o4501; +ram[15'o24276] = 12'o4502; +ram[15'o24277] = 12'o3104; +ram[15'o24300] = 12'o7240; +ram[15'o24301] = 12'o6211; +ram[15'o24302] = 12'o3663; +ram[15'o24303] = 12'o4060; +ram[15'o24304] = 12'o4503; +ram[15'o24305] = 12'o2544; +ram[15'o24306] = 12'o4505; +ram[15'o24307] = 12'o4504; +ram[15'o24310] = 12'o6211; +ram[15'o24311] = 12'o3662; +ram[15'o24312] = 12'o1662; +ram[15'o24313] = 12'o7101; +ram[15'o24314] = 12'o1041; +ram[15'o24315] = 12'o7630; +ram[15'o24316] = 12'o5303; +ram[15'o24317] = 12'o4060; +ram[15'o24320] = 12'o4502; +ram[15'o24321] = 12'o3164; +ram[15'o24322] = 12'o1264; +ram[15'o24323] = 12'o6211; +ram[15'o24324] = 12'o3665; +ram[15'o24325] = 12'o4060; +ram[15'o24326] = 12'o4502; +ram[15'o24327] = 12'o1544; +ram[15'o24330] = 12'o4667; +ram[15'o24331] = 12'o1270; +ram[15'o24332] = 12'o6211; +ram[15'o24333] = 12'o3666; +ram[15'o24334] = 12'o4060; +ram[15'o24335] = 12'o4500; +ram[15'o24336] = 12'o6605; +ram[15'o24337] = 12'o21; +ram[15'o24340] = 12'o4501; +ram[15'o24341] = 12'o4502; +ram[15'o24342] = 12'o3754; +ram[15'o24343] = 12'o5401; +ram[15'o24344] = 12'o5745; +ram[15'o24345] = 12'o3603; +ram[15'o24346] = 12'o7464; +ram[15'o24347] = 12'o3523; +ram[15'o24350] = 12'o7474; +ram[15'o24351] = 12'o3522; +ram[15'o24352] = 12'o7467; +ram[15'o24353] = 12'o2014; +ram[15'o24354] = 12'o7455; +ram[15'o24355] = 12'o2015; +ram[15'o24356] = 12'o7450; +ram[15'o24357] = 12'o7000; +ram[15'o24360] = 12'o7476; +ram[15'o24361] = 12'o1000; +ram[15'o24362] = 12'o7460; +ram[15'o24363] = 12'o200; +ram[15'o24364] = 12'o7454; +ram[15'o24365] = 12'o3400; +ram[15'o24366] = 12'o7461; +ram[15'o24367] = 12'o1041; +ram[15'o24370] = 12'o7475; +ram[15'o24371] = 12'o3000; +ram[15'o24372] = 12'o7447; +ram[15'o24373] = 12'o3221; +ram[15'o24374] = 12'o7446; +ram[15'o24375] = 12'o4046; +ram[15'o24376] = 12'o7463; +ram[15'o24377] = 12'o2227; +ram[15'o24400] = 12'o7451; +ram[15'o24401] = 12'o2200; +ram[15'o24402] = 12'o7473; +ram[15'o24403] = 12'o1334; +ram[15'o24404] = 12'o7456; +ram[15'o24405] = 12'o1322; +ram[15'o24406] = 12'o7465; +ram[15'o24407] = 12'o1320; +ram[15'o24410] = 12'o0; +ram[15'o25400] = 12'o70; +ram[15'o26400] = 12'o4434; +ram[15'o26401] = 12'o4434; +ram[15'o26402] = 12'o4434; +ram[15'o24724] = 12'o6031; +ram[15'o24726] = 12'o5376; +ram[15'o24776] = 12'o6032; +ram[15'o24777] = 12'o5772; +ram[15'o25004] = 12'o6041; +ram[15'o25005] = 12'o5204; +ram[15'o25006] = 12'o7410; +ram[15'o25007] = 12'o6203; +ram[15'o25010] = 12'o5611; +ram[15'o25011] = 12'o4200; +ram[15'o25523] = 12'o1222; +ram[15'o25547] = 12'o7000; +ram[15'o25572] = 12'o7760; +ram[15'o26045] = 12'o5225; +ram[15'o27600] = 12'o0; +ram[15'o27601] = 12'o6032; +ram[15'o27602] = 12'o6014; +ram[15'o27603] = 12'o1243; +ram[15'o27604] = 12'o3304; +ram[15'o27605] = 12'o6031; +ram[15'o27606] = 12'o5211; +ram[15'o27607] = 12'o1205; +ram[15'o27610] = 12'o5214; +ram[15'o27611] = 12'o6011; +ram[15'o27612] = 12'o5274; +ram[15'o27613] = 12'o1367; +ram[15'o27614] = 12'o3336; +ram[15'o27615] = 12'o4306; +ram[15'o27616] = 12'o5220; +ram[15'o27617] = 12'o5215; +ram[15'o27620] = 12'o4306; +ram[15'o27621] = 12'o5220; +ram[15'o27622] = 12'o3371; +ram[15'o27623] = 12'o3370; +ram[15'o27624] = 12'o1372; +ram[15'o27625] = 12'o1373; +ram[15'o27626] = 12'o7500; +ram[15'o27627] = 12'o5263; +ram[15'o27630] = 12'o1374; +ram[15'o27631] = 12'o3354; +ram[15'o27632] = 12'o4335; +ram[15'o27633] = 12'o3355; +ram[15'o27634] = 12'o4306; +ram[15'o27635] = 12'o5250; +ram[15'o27636] = 12'o4265; +ram[15'o27637] = 12'o7430; +ram[15'o27640] = 12'o5356; +ram[15'o27641] = 12'o3771; +ram[15'o27642] = 12'o2371; +ram[15'o27643] = 12'o7600; +ram[15'o27644] = 12'o1354; +ram[15'o27645] = 12'o1355; +ram[15'o27646] = 12'o1370; +ram[15'o27647] = 12'o5223; +ram[15'o27650] = 12'o4265; +ram[15'o27651] = 12'o7041; +ram[15'o27652] = 12'o1370; +ram[15'o27653] = 12'o2200; +ram[15'o27654] = 12'o7450; +ram[15'o27655] = 12'o5600; +ram[15'o27656] = 12'o3370; +ram[15'o27657] = 12'o4503; +ram[15'o27660] = 12'o3537; +ram[15'o27661] = 12'o1370; +ram[15'o27662] = 12'o5600; +ram[15'o27663] = 12'o375; +ram[15'o27664] = 12'o5600; +ram[15'o27665] = 12'o0; +ram[15'o27666] = 12'o1354; +ram[15'o27667] = 12'o7106; +ram[15'o27670] = 12'o7006; +ram[15'o27671] = 12'o7006; +ram[15'o27672] = 12'o1355; +ram[15'o27673] = 12'o5665; +ram[15'o27674] = 12'o4360; +ram[15'o27675] = 12'o5205; +ram[15'o27676] = 12'o4200; +ram[15'o27677] = 12'o5302; +ram[15'o27700] = 12'o7402; +ram[15'o27701] = 12'o5276; +ram[15'o27702] = 12'o1376; +ram[15'o27703] = 12'o3304; +ram[15'o27704] = 12'o0; +ram[15'o27705] = 12'o5332; +ram[15'o27706] = 12'o0; +ram[15'o27707] = 12'o3265; +ram[15'o27710] = 12'o1243; +ram[15'o27711] = 12'o3304; +ram[15'o27712] = 12'o4335; +ram[15'o27713] = 12'o1300; +ram[15'o27714] = 12'o7750; +ram[15'o27715] = 12'o5321; +ram[15'o27716] = 12'o2265; +ram[15'o27717] = 12'o7040; +ram[15'o27720] = 12'o5307; +ram[15'o27721] = 12'o1265; +ram[15'o27722] = 12'o7640; +ram[15'o27723] = 12'o5310; +ram[15'o27724] = 12'o1372; +ram[15'o27725] = 12'o374; +ram[15'o27726] = 12'o1243; +ram[15'o27727] = 12'o7640; +ram[15'o27730] = 12'o2306; +ram[15'o27731] = 12'o5706; +ram[15'o27732] = 12'o4306; +ram[15'o27733] = 12'o5250; +ram[15'o27734] = 12'o5224; +ram[15'o27735] = 12'o0; +ram[15'o27736] = 12'o7402; +ram[15'o27737] = 12'o5352; +ram[15'o27740] = 12'o6036; +ram[15'o27741] = 12'o3372; +ram[15'o27742] = 12'o1372; +ram[15'o27743] = 12'o5735; +ram[15'o27744] = 12'o6011; +ram[15'o27745] = 12'o5352; +ram[15'o27746] = 12'o6016; +ram[15'o27747] = 12'o5341; +ram[15'o27750] = 12'o7751; +ram[15'o27751] = 12'o7751; +ram[15'o27752] = 12'o4360; +ram[15'o27753] = 12'o5336; +ram[15'o27754] = 12'o0; +ram[15'o27755] = 12'o0; +ram[15'o27756] = 12'o3371; +ram[15'o27757] = 12'o5244; +ram[15'o27760] = 12'o0; +ram[15'o27761] = 12'o2372; +ram[15'o27762] = 12'o5760; +ram[15'o27763] = 12'o2304; +ram[15'o27764] = 12'o5760; +ram[15'o27765] = 12'o7240; +ram[15'o27766] = 12'o5253; +ram[15'o27767] = 12'o5344; +ram[15'o27770] = 12'o0; +ram[15'o27771] = 12'o0; +ram[15'o27772] = 12'o0; +ram[15'o27773] = 12'o7500; +ram[15'o27774] = 12'o300; +ram[15'o27775] = 12'o70; +ram[15'o27776] = 12'o6201; +ram[15'o27777] = 12'o5301; diff --git a/tss8/tss8_rf.dsk b/tss8/tss8_rf.dsk new file mode 100644 index 0000000..6d55d56 Binary files /dev/null and b/tss8/tss8_rf.dsk differ diff --git a/tss8/tss8_rf.dsk.orig b/tss8/tss8_rf.dsk.orig new file mode 100644 index 0000000..e0434ca Binary files /dev/null and b/tss8/tss8_rf.dsk.orig differ