File M1.PA (PAL assembler source file)

Directory of image this file is from
This file as a plain text file

/******** TOPS-8 MONITOR (M1) ********
/LAST EDIT 23-NOV-1977, HOU (NEW IDL LOOP LIKE RSX11D)
/LAST EDIT: 20-NOV-77, HOU (DR8EA INTERFACED CENTRONICS LINE PRINTER)
/LAST EDIT: 24-DEC-76, ELC (MEMMNG SUPPORT, VERSION 6B)
/LAST EDIT:  8-NOV-76, ELC (STEPCOUNTER BUG)
/LAST EDIT: 20-FEB-76, ELC
/LAST EDIT:  5-FEB-76, ELC (ALTMODE ECHO AND NEW PTP EMULATOR)
/LAST EDIT:  8-DEC-75, ELC
/LAST EDIT:  6-OCT-75, ELC
/LAST EDIT:  2-OCT-75, ELC+JV
/LAST EDIT: 23-SEPT-75, JV
/LAST EDIT: 19-SEPT-75, JV
/LAST EDIT: 3-SEPT-75, ELC
/LAST EDIT: 2-SEPT-75, ELC
/LAST EDIT: 28-AUG-75, ELC
/LAST EDIT: 26-AUG-75, JV
/LAST EDIT: 22-AUG-75, JV
/LAST EDIT: 20-AUG-75, JV+ELC
/LAST EDIT: 19-AUG-75, ELC
/LAST EDIT: 18-AUG-75, ELC
/LAST EDIT:  9-AUG-75, ELC
/LAST EDIT:  6-AUG-75, JV+ELC
/LAST EDIT:  5-AUG-75, ELC
/LAST EDIT: 31-JULY-75, ELC
/LAST EDIT: 21-JULY-75, JV
/LAST EDIT: 10-JULY-75, ELC+JV
/LAST EDIT: 20-MAY-75, ELC+JV
/LAST EDIT: 29-APRIL-75FEBRUARY-75, ELC

/**********************************************************  M U L T I   8   ********************
/******************************************************
/******************************************************

/	REALTIME-FOREGROUND / TIMESHARING BACKGROUND
/	   THE PDP8
/		   COMPUTERHONI 1972-9/1975
/		MED
/		RIJSWIJK,THE NETHERLCARDOZO 11/1973-
/		DEPARTMENT OF PHYSIOLOGY
/		STATE UNIVERSITY UTRECHT,
/		THE NETHERLANDS
/
/		JAN VERBURG 2/1975-12/1975
/		DEPARTMENT OF MATHEMATICS
/		TECHNICAL UNIVERSITY DELFT
/		DELFT, THE NETHERLANDS
/
/	DISTRIBUTED BY WESTVRIES COMPUTER CONSULTING BV,
/	    P.O. BOX 26, OOSTZAAN, THE NETHERLANDS.
/		PHONE 02984 - 1819
/
	VERSHI="6
	VERSLO="D

/ / IDLE PATTERN GENERATOR / IFNDEF IDLPAT <IDLPAT=1> / / / XLIST XLISTX /LIST ONLY IF LIST ALL /THE SYMBLS PASS1, PASS2 AND PASS3 ARE USED TO DISTINGUISH /THE VARIOUS ASSEMBLER PASSES. EACH SYMBOL IS NONZERO ONLY /DURING THAT PASS. IFNZRO PASS2 <PASS3=1;PASS2=0> IFNZRO PASS1 <PASS2=1;PASS1=0> IFNDEF PASS1 <PASS1=1;PASS2=0;PASS3=0> /NOTE THAT UP TO THIS POINT THE USE OF PASS# WILL GIVE TROUBLE. /TO ENABLE SWITCHING OF FIELD DURING ASSEMBLY, THE SYMBOLS /DOTF## ARE USED TO REMEMBER HOW FAR EACH FIELD HAS BEEN FILLED. /HERE THEY ARE INITIALIZED: DOTF00=200 DOTF10=200 DOTF20=200 DOTF50=200 DOTF60=200 CONFIGURATION MNEMONICS=2 PDP8I=3 PDP8E=4 ICATION: PROGER=1 /PROGRAMMING ERROR CODE TIMEOUT=2 /TIMEOUT CODE HRDERR=4 /UNRECOVERABLE I/O ERROR EOMERR=10 /END-OF-MEDIUM WARNING /EQUATES FOR LISTING CONTROL: LZERO=3777 /LIST PAGE ZERO CODE LSKIPS=5777 ONIT=6777 /LIST THE MONIIST THE BG-EMULATOR LREDENT TASKS (TASKS) LSYSM DRIVER CODE LPWRUP=7737 /LIST THE POWERUP PROGRAM LDATA=7757 /LIST THE DATAAREA LCONFG=7767 /LIST THE CONFIGURATION PART LLOCAL=7773 /LIST ALL LOCAL INSERTED CODE LTEXT=7775 /LIST PROGRAM DESCRIPTIONS /INSTRUCTIONS THAT ARE MISSING IN PAL8 CINT=6204 SINT=6254 SUF=6274 SCL=7403 ASC=7403 SCA=7441 SWAB=7431 SWBA=7447 DPSZ=7451 AC0001=CLA CLL IAC AC0002=CLA STL RTL AC2000=CLA STL RTR AC4000=CLA STL RAR AC3777=CLL STA RAR AC7775=CLL STA RTL AC7776=CLL STA RAL AC7777=CLA CMA ACM1=CLA CMA ACM2=AC7776 ACM3=AC7775
XLIST -LCONFG-1&XLISTX IFNDEF CONFIG < /CONFIGURATION SPECIFIED ON SEPARATE FILE /***************************************************** /******** C O N F I G U R A T I O N **************** /***************************************************** CONFIG=1 /OR DEFINED DURING FIRST PASS BGFLDS=2 /NUMBER OF FIELDS FOR BACKGROUND FIELDS=4 /NUMBER OF FIELDS FOR FOREGROUND /SELECT YOUR MACHINE TYPE BY EQUATING PDPTYP TO /ONE OF /PDP8, PDP8S, PDP8L, PDPDP8E /IF YOUR MACHINETIC ELEMENT /THEN DEFI. "EAE=1". EAE=1 /DEFINE THE MAXIMUM NUMBER OF TASKS IN THE SYSTEM: MAXNAM=70 /DEFINE THE NUMBER OF BACKGROUNDS: /IF BGMAX=0, THE BACKGROUND EMULATOR WILL BE LEFT OUT BGMAX=4 /DEFINE NUMBER OF SOFTFSLOT GIVES THE /NUMBERLOTS. SOFSLOT=24 /ORD FREE CORE BLOCKLETSYOUR SYSTEM DEVICE BY DEFINING ONE OF THE SYMBOLS: /SYDF32, SYRF08, SYRK08, SYRK8E. EQUATE THE SYMBOL TO THE NUMBER OF /DRIVES /DEFINE SY3010 FOR THE SYSTEM INDUSTRIES MODEL 3010 CONTROLER /IF THERE IS NO DISK, DEFINE THE SYMBOL NODISK SYRK8E=1 /IF YOU NEED MORE ROOM IN MONFLD, YOU MAY MOVE THE SYSTEM DISK HANDLER /TO FIELD 1 BY DEFINING SYSFLD=10: SYSFLD=10
/IF YOU HAVE THE 8/E UNTRAP OPTION LIKE FYSIOLOGY-UTRECHT /DEFINE: FYSUNTRP=1 /IF YOU HAVE A PLAIN PDP8 DEFINE 'KM8E' /KM8E=1 /SPECIFY YOUR HARDWARE CLOCK FREQUENCY HWTICK=62 /DEFINE THE FREQUENCY OF THE DIAGNOSTIC TIMER DGNTICK=12
/DEFINE FOR EACH TERMINAL HOW MANY FILLER CHARS IT NEEDS AND /AFTER WHAT CHARACTER, I.E. /T1FILL=3; T1CHAR=215 GIVES 3 NULL'S AFTER EACH CR T1CHAR=0; T1FILL=0 T2CHAR=0; T2FILL=0 T3CHAR=0; T3FILL=0 T4CHAR=0; T4FILL=0 T5CHAR=0; T5FILL=0 T6CHAR=0; T6FILL=0 T7CHAR=0; T7FILL=0 /DEFINE NON-STANDARD TERMINAL OUTPUT BUFFER LENGTHS: BG2OLN=530 BG3OLN=530 /FOR 1200 BTHE DEVICE TYPES YOU HAV/FOR DEC LINEPRINTER, # ERTAPE READER PP8E=1 /PAPERTAPE PUNCH /VC8E=1 /POINT PLOT DISPLAY /XY8E=1 /PLOTTER /TM8E=1 /MAGTAPE CONTROL /CR8E=1 /CARDREADER /CM8E=1 /MARKSENSE READER /KP8E=1 /POWER FAIL DETECT DK8EA=1 /LINE FREQUENCY CLOCK /DK8EC=1 /REAL TIME CRISTAL CLOCK /DK8EP=1 /PROGRAMMABLE CLOCK /RFCLOCK=1 /YOU MAY USE THE PHOTOCEL OF RF08 AS CLOCK FYSCLOCK=1 /FYSIOLOGY UTRECHT HAS HOME-MADE CLOCK /MP8E=1 /MEMORY PARITY OPTION TC08=1 /DECTAPE CONTROL (DATA BREAK) /TD8E=1 /TD8E DECTAPE CONTROL.(NOT IN REAL-TIME) KL8E2=0450 /SECOND TELETYPE;DEVICE #;KEYBOARD IS LOWER KL8E3=0430 /THIRD TELETYPE;DEV# OF KEYBOARD. KL8E4=0470 /FOURTH TELETYPE; DEV # OF KEYBOARD AX08=1 /AX08 LAB SYSTEM /TONCLK=1 /SPECIAL FYSIOLOGY PROGRAMMABLE CLOCK /DF32=1 /NONSYSTEM DF32, ONE PLATTER /DF32=2 /NONSYSTEM DF32, TWO PLATTERS, (ETC.) DP8E=1 /SYNCHRONOUS MODEM INTERFACE /KW8IA=1 /PDP8I LINE FREQUENCY CLOCK MF8E=1 /611-SCOPE CONTROL A-LA VAN MONTFORT /DR8EA=1 /12 CHANNEL BUFFERED DALOG-TO-DIGITAL CONVERTE DEVICE NUMBERS; THIS ALY ORDERED SKIPCHAIN. STA IS RESERVED FOR THE BREAK CHARACTER INTERRUPT. /THERE SHOULD BE NO GAPS IN THE SKIPCHAIN, SO NUMBERS MUST /CLIMB UP. /INTDEV TELLS THE MONITOR HOW MANY DEVICES CAN RUN /'CONNECTED' DIRECTLY TO THE INTERRUPT. /STHE SKIPCHAIN: END OF SKV AND MAXDEV THERE CAN B TELLS THE MONITOR HOW MS /THERE ARE. THE NUMBER OF INTERRUPT SLOTS IS THEN /MAXSLOT=MAXDEV+SOFSLOT. (INCLUDES SLOT 0) /ASSIGN SKPDEV AND MAXDEV ONE HIGHER THAN LAST EMBRACED DEV#. NOPUNCH /(THIS BRIGHT IDEA STEMS FROM ED SMALLENBURG) *1 /THIS IS ONLY TO DEFINE SOME SYMBOLS AX08AD,. /AX08 ADC-DONE FLAG / ADC,. /AD8EA ADC-DONE FLAG AX08RC,. /AX08 RC-CLOCK CLOCK,. /PROGRAMMABLE CLOCK SYS,. /SYSTEM DISK TRAP,. /TIMESHARING TRAP DTA,. /DECTAPE AX08SM,. /AX08 SMITT TRIGGERS DP8ECD,. /DP8E CHARACTER DETECT FLAG DP8ERO,. /DP8E RECIEVE WC OVERFOW DP8ETO,. /DP8E TRANSMIT WC OVERFLOW TIMER,. /SYSTEM LINECLOCK / DSK,. /NONSYSTEM DISK PTR,. /PAPERTAPE READER DP8ERG,. /DP8E RING FLAG DP8ECA,. /DP8E CARRIER ON/OFF DP8EBE,. /DP8E DATABREAK BUS ERROR / CRD,. /CARDREADER / MTA,. /INDUSTRY COMPATIBLE MAGTAPE / DPL,. /KV08 OR VC8E / PLOT,. /INCREMENTAL PLOTTER / POWER,. /POWER FAILURE OPTION / PARITY,. /MEMORY PARITY OPTION / FRIDO,. /DR8EA BUFFERET OF THE INTERRUPTS WILLD MODE. /THUS WE CAN SAON PAGE ZERO: INTDEV=. PTP,. /PAPERTAPE PUNCH KB1,. /SYSTEM KEYBOARD KB2,. /KEYBOARD 2 KB3,. /KEYBOARD 3 KB4,. /KEUBOARD 4 TTY1,. /SYSTEM TELEPRINTER TTY2,. /TELEPRINTER 2 TTY3,. /TELEPRINTER 3 TTY4,. /TELEPRINTERERROR FLAG AX08XT,. /A. /KV8/I OR MF8E SCOPE EA ERROR FLAG LPTER,. OY,. /KV08 JOYSTICK (USES TWO SLOTNUMBERS) SKPDEV=. /END OF SKPCHAIN. MAXDEV=. /END OF ALL DEVICE SLOTS. ENPUNCH
/DEFINE THE TIMESHARING SLICES: SLICE1=DGNTICK^4%12 /SHORT SLICE (0.4 SECOND) SLICE2=5^DGNTICK /LONG SLICE (5 SECONDS) /DEFINE 'DAYTIM' IF YOU WANT TO KEEP TRACK OF MILLISEC, SEC, /MINUTES, HOURS AND DAY'S: DAYTIM=1 /IF YOU WANT TO RESERVE SOME LOCATIONS FOR LOCAL USE, /DEFINE COMLNG AND THE LAYOUT OF YOUR COMMON BLOCK IN THIS WAY: NOPUNCH *0 /MAKE A FEW RELATIVE SYMBOLS UT200, ZBLOCK 2 /MYFLAG,0 /TABLE5,ZBLOCK 5 / .... / .... / .... COMLNG=. /COMMON BLOCK ONLY EXISTS IF COMLNG IS DEFINED. ENPUNCH / /IF YOU ENTER THE SYMBOLS 'MYFLAG', 'TABLE5' ETC. IN THE /'SYMBLS' FILE, YOU GET THEM IN THE MONITOR SYMBOLS FILE 'MS.PA. /DEFINE THE MAXIMUM NUMBER OF GIANT IOT'S GIGAMX=11 > /END OF CONFIGURATION PART
/ABBREVIATIONS /Q =A QUEUE; A ROTATING BUFFER; FIRST IN FIRST OUT /PTR =POINTER /FLD =FIELD /FC =FREE OCATION AREA /BLK =BLOCUNIT OF 8 WORDS IN FC /TER /TEM =TEMPORARILY ,SOFTWARE SWITCH;SEMAPHORE /PRI =PRIORITY /ADM =ADMINISTRATION(OF Q'S AND BUFFERS) /INT =INTERRUPT /BG =BACKGROUND /FG =FOREGROUND /// =(TRHEE SLASHES)PROGRAM RUNS WITH INTERRUPT OFF. // =(TWO SLASHES)DATAFIELFIELD /TCB =TASK CONTROCONTROL BLOCK POINTER // =(ONE SPACE AFTER TAB =(THREE SPACES)ARGUMENT OF SUBROUTINE
IFNZRO PASS1 < /ASSEMBLE IN FIRST PASS ONLY ! /CONFIGURATING LOGIC: IFNDEF GIGAMX <GIGAMX=10 /BY DEFAULT > IFDEF SYRF08 <RFORDF=1> IFDEF SYDF32 <RFORDF=1> IFDEF TC08 <TAPE=TC08> IFDEF TD8E <TAPE=TD8E> IFZERO BGMAX-2&4000 < IFDEF SYRK8E <SWAPLG=100 /RK8E HAS SPECIAL SWAP-FORMAT > IFNDEF SYRK8E <SWAPLG=40 > > MAXSLOT=MAXDEV+SOFSLOT IFZERO BGMAX <MONFLD=00;BGFLDS=00> IFDEF KM8E <MONFLD=00;BGFLD=FIELDS^10> IFDEF TNOUNTRP <MONFLD=BGFLDS^10;BGFLD=00> IFDEF FYSUNTRP <MONFLD=00;BGFLD=FIELDS^10> IFDEF MEMMNG <MONFLD=00;BGFLD=FIELDS^10> DGNCNT=HWTICK%DGNTICK IFZERO DGNCNT <DGNCNT=1> IFZERO PDPTYP-PDP8E <CLRKBF=6000> IFNZRO PDPTYP-PDP8E <CLRKBF=6002> IFDEF SYRF08 <IFDEF RFCLOCK <RFINTS=300/FOTOCEL INT ENABLE> IFNDEF RFCLOCK <RFINTS=100/FOTOCEL INT DISABLE>> IFZERO BGFLDS+FIELDS-1 <ONLY4K,> IFDEF RFCLOCK < IFNZRO SYS-TIMER&4000 <RFCERR,XERROR>> XLISTX=0 /IFNDEF XLISTX <XLISTX=-LTEXT-1 /DEFAULT LIST ALL B <BRKCHR=234 /SYSTEM BRE IFNZRO BGMAX <IFNDEF BUFL=BG1OLN+44+4 IFZERO2OLN <BG2OLN=30> BGBUFL=BGBUFL+BG2OLN+44+4 IFZERO BGMAX-3&4000 <IFNDEF BG3OLN <BG3OLN=30> BGBUFL=BGBUFL+BG3OLN+44+4 IFZERO BGMAX-4&4000 <IFNDEF BG4OLN <BG4OLN=30> BGBUFL=BGBUFL+BG4OLN+44+4 IFZERO BGMAX-5&4000 <IFNDEF BG5OLN <BG5OLN=30> BGBUFL=BGBUFL+BG5OLN+44+4 IFZERO BGMAX-6&4000 <IFNDEF BG6OLN <BG6OLN=30> BGBUFL=BGBUFL+BG6OLN+44+4 IFZERO BGMAX-7&4000 <IFNDEF BG7OLN <BG7OLN=30> BGBUFL=BGBUFL+BG7OLN+44+4 >>>>>>>
DATORG=0 IFDEF COMLNG < DATORG=DATORG+COMLNG /THIS MUCH NEEDS THE USER > DATORG=MAXNAM^12+DATORG DATORG=FREEMAX^10+DATORG DATORG=MAXSLOT^2+DATORG IFDEF TAPE <DATORG=DATORG+10 /DECTAPE CURRENT POSITION TABLE > IFDEF KL8E2 <DATORG=DATORG+40 IFDEF KL8E3 <DATORG=DATORG+20 IFDEF KL8E4 <DATORG=DATORG+20 IFDEF KL8E5 <DATORG=DATORG+20 IFDEF KL8E6 <DATORG=DATORG+20 IFDEF KL8E7 <DATORG=DATORG+20>>>>>> IFNDEF NODISK < DATORG=INTDEV-1+DATORG /CLRTAB DATORG=DATORG+40 /FOR DSKTAB DATORG=FIELDS^40-13+DATORG /COREMAP (+-) IFNZRO BGMAX <10+GIGAMX+DATORG IFZERO+2+DATORG>>> TEST1=DATOERO MONFLD-2&4000 <MAXENIFNZRO MONFLD-2&4000 <MAXEND=7600>> /MONFLD=0,1 DATORG=MAXEND-DATORG IFNDEF SYSFLD <SYSFLD=MONFLD> /END OF PASS1 ONLY CODE >
XLIST -LTEXT-1&XLISTX /******************************************************** /E Z E R O ************************************PAGE ZERO CONSISTS OF TH A MEMORY FIELD. /BECAUSE THE PDP8 HAS A SPECIAL ADDRESSING MODE THAT ALLOWS A /MEMORY REFERENCE INSTRUCTION TO REFERENCE THE CONTENTS OF PAGE /ZERO FROM EVERY LOCATION IN MEMORY, IT PLAYS AN CRUCIAL ROLE IN /THE COMMUNICATION BETWEEN THE VARIOUS PARTS OF THE SYSTEM. IN /ADDITION, THE HARDWARE INTERRUPT FACILITY USES LOCATION 00000 /AS INTERRUPT ENTRY POINT. IN TOPS-8 PAGE ZERO IS USED FOR THE /FOLLOWING PURPOSES: / /- RECEIPT OF INTERRUPTS: CONTROL IS TRANSFERRED TO / THE THE INTERRUPT HANDLER, WHICH STARTS AT 177. / /- LOCATIONS 10 TROUGH 17 CONTAIN THE HARDWARE AUTOINCREMENT / REGISTERS. THEY ARE LABELED 'AUTO10' TO 'AUTO17'. PLEASE NOTE / THAT AUTO13 HAS BEEN RESERVED FOR EXCLUSIVE USE BY INTERRUPT / SERVICE ROUTINES. THUS INTERRUPT SERVICE ROUTINES SHOULD USE / ONLY AUTO13, AND NON-INTERRUPT ROUTINES SHOULD USE ONLY / AUTOINCREMENT REGISTERS OTHER THAN AUTO13. / /- BECAUSE OF THE STATED INPORTANCE OF PAGE ZERO 11 LOCATIONS / ARE ASSIGNED TERS THAT MAY BE USED / THE MONITOR ROUTINES ANTHESE REGISTERS BY INTERITTED. / THE REGISTERS ARE NAMED 'ZTEM1' ... 'ZTEM7','BASE' AND 'X'. / 'BASE' AND 'X' ARE USED BY THE 'REENTRANT TASK SUPPORT / ROUTINES' PACKAGE. IN THAT CASE BASE HOLDS THE ADDRESS OF THE / FIRST WORD OF THA, AND X IS USED AS / NDEXED LOCATIONS. (FOR FT 'REENTRANT TASK SUPPORSO USED / BY THE 'DEFER' ROUTINE. / /- PAGE ZERO CONTAINS A NUMBER OF POINTERS TO SYSTEM ROUTINES. / THEY CONFORM TO THE FOLLOWING NAMING CONVENTION: THEY HAVE A / NAME FORMED BY THE NAME OF THE LABEL THEY POINT TO PRECEEDED / BY A LETTER 'Z'.
/- PAGE ZERO CONTAINS TWO ENTRY POINTS TO THE MONITOR, LABELED / 'MONITOR' FOR PROGRAMMED REQUESTS, / 'ALARM' FOR TASK ABORTION IN CASE OF FATAL ERROR. / IN ADDITION THERE ARE A FEW SHORT ROUTINES: / CDTOIF(=A JMS): THE INSTRUCTION 'CDTOIF' SETS THE DATAFIELD / EQUAL TO THE CURRENT INSTRUCTION FIELD ('C'HANGE-'D'ATAFIELD- / -'TO'-'I'NSTRUCTION-'F'IELD) / THE SUBROUTINE DEFER (USE 'JMS DEFER') REPLACES / THE CONTENTS OF THE ACCUMULATOR BY THE CONTENTS OF THE MEMORY / LOCATION IT ADDRESSES. / /- PAGE ZERO CONTAINS SOME 32(OCTAL) OFTEN USED CONSTANTS, / LABELED LIKE C1234 OR M1234. / /- THE REST OF PAGE ZERO IS USED EXCLUSIVELY BY THE MONITOR. THIS / MEANS THAT THIS AREA IS FREE IN FIELDS OTHER TELD. IT CONTAINS SOME LOINE / REGISTERS DURING TABLE THAT HOLDS / THSES OF 'CONNECTED' TASKS, THE / SOFTWARE STATUS (IN LOCATION CURTSK). / /NOTE THAT ALL THE CONTENTS OF PAGE 0 IS COPIED INTO PAGE 0 /OF EVERY FOREGROUND FIELD BY 'POWERUP'. THEREFORE THE /SUBROUTINES AND ALL ST BE ADDRES- /SED IN ANY&XLISTX FIELD MONFLD%10POINT *0 0 ///JUST F /MONITOR CALLING SEQUENCE: / / TAD AC / JMS MONITOR / FUNCTION OPTION(S) / PARAMETER (OPTIONAL) / ERROR RETURN (OPTIONAL) / MONITOR,0 /MONITOR ENTRY POINT DCA MONAC /SAVE CALLERS AC TAD MYCDF /INDICATE FROM WHICH FIELD WE COME CIF MONFLD /PREPARE JUMP TO TRUE MONITOR CODE JMP I .+1 /GO ! XMONITR /ADDRESS OF TRUE MONITOR CODE *10 AUTO10, 0 / AUTO11, 0 / AUTO12, 0 / AUTO13, 0 ///*** INTERRUPT ROUTINES ONLY ! *** AUTO14, 0 / AUTO15, 0 / AUTO16, 0 / AUTO17, 0 / /GENERAL STORAGE LOCATIONS FOR THE USER AND THE MONITOR X, CDF CIF 10 /INITIALISATION ZTEM1, JMP I ZTEM2 ZTEM2, PWRUP ZTEM3, 0 ZTEM4, 0 ZTEM5, 0 ZTEM6, 0 ZTEM7, 0 BASE, 0 /BASE REGISTER FOR 'SETBASE', 'GET' AND 'PUT' INTAC, 0 ///SAVED AC DURING INTERRUPT PROCESSING INTFLD, 0 ///SAVED FLAGS DURING INTERRUPT PROCESSING ZMYCDF, MYCDF /POINTER TO 'CDF THISFIELD' ZMYCIF, MYCIF /POINTER TO 'CIF THISFIELD' ZMYCDIF,MYCDIF /POINTER TO 'CDF CIF THISFIELD' ZHRDINT,HRDPROCESSOR ZSKPEND,SKPENBREAKR,BREAKR ///KEYBOARION ROUTINE ZSOFINT,SOFERRUPT ZRESERV,RESERV /RESERV AN INTERRUPT SLOT ZDISPATCH,DISPATCH /DISPATCHER ZFSTEXT,FSTEXT ///IMMEDIATE RETURN FROM INTERRUPT
/USEFULL CONSTANTS /C1, 1 C2, 2 /THESE CONSTANTS ARE TO AVOID A ROTATE C3, 3 /COMBINED WITH IAC,WHICH IS IMPOSSIBLE C4, 4 /ON OLDER PDP8'S. C7, 7 /C10, 10 C17, 17 C37, 37 C70, 70 C77, 77 /C100, 100 C177, 177 C200, 200 C212, 212 C215, 215 C240, 240 C260, 260 C3700, 3700 /C4000, 4000 C6201, 6201 M1000, C7000, 7000 M400, C7400, 7400 C7520, M260, -260 M215, -215 C7600, M200, -200 C7700, M100, -100 C7770, M10, -10 C7771, M7, -7 C7774, M4, -4 C7775, M3, -3 /C7776, /M2, -2 C7777, M1, -1
/ABORT ROUTINE: / / JMS ALARM /ABORT CURRENT TASK / ALARM, 0 CDF CIF MONFLD JMP I .+1 ALARM0 /CHANGE DATA FIELD TO THE CURRENT INSTRUCTION FIELD /ROUTINE AIDS IN RELOCATABLE PROGRAMMING / CDTOIF=JMS . 0 MYCDF, CDF MONFLD /ADAPTED BY POWERUP FOR EACH FIELD JMP I .-2 MYCIF, CIF MONFLD /ADAPTED BDF MONFLD /FOR EACH FIELBY THE MONITOR KILL FUNCIS DERAILED TO THIS POINXKILL, JMS MONITOR HALT SWPOUT CLEAR/THIS IS THE SUICIDE REQUEST THAT /ACTUALY KILLS A KILLED TASK /THE DEFER ROUTINE DOES AN EXTRA INDERECT REFERENCING CYCLE / DEFER, 0 /ROUTINE TO FETCH CONTENTS OF LOCA BY AC TAD I X /*** UER
IFNZRO BGMAX < BSFAG BG-SCHEDULER/EMULATORISTERS OF THE CURRENT BG IN CORE.> CURTSK, 0 /HAS 3 MEANINGS: =0 THERE IS NO TASK /RUNNING; LT 0:FOREGROUND TASK RUNNING; /GT 0:BACKGROUND JOB RUNNING. CONTAB, ZBLOCK INTDEV-1 /CONNECTED INTERRUPT ADDRESSES *CONTAB+TIMER-1 CLKINT ///LINECLOCK INTERRUPT HANDLER IFNDEF NODISK < *CONTAB+SYS-1 SYSINT ///SYSTEM DISK INTERRUPT ROUTINE ENTRY > *CONTAB+INTDEV-1 /END OF CONTAB / HEADS AND TAILS: / FHEAD, FRECOR /HEAD OF FREECORE CHAIN IHEAD, 0 /INTERRUPT Q ITAIL, IHEAD MHEAD, 0 /PRIORITY 1 Q MTAIL, MHEAD CHEAD, 0 /CORE-WAITERS Q CTAIL, CHEAD / / SYSTEM TABLE REFERENCE ADDRESS / IFPOS .-176 <ERROR, REFERR> *176 SYSREF, REFTAB
XLIST -LTEXT-1&XLISTX /********************************************************* /******* I N T E R R U P T H A N D L E R *********** /********************************************************* /THE INTERRUPT HANDLER IS BASED ON THE FOLLOWING OBSERVATIONS: /THOUGH A TRUE MULTI-PRIORITY INTERRUPTHAN AN APROACH WOULD COMBINND TIME- /OVERHEAD WITHIN INTERRUPT RESPONSETIMPTS DURING INTERRUPT ROUTINES NECCESIATES /THE STORING OF THE PROCESSOR STATUS (AC AND FLAGS) IN /A STACK. SUCH A STACK MUST ANTICIPATE THE WORST CASE OF RECURRING /INTERRUPTS SO A LARGE AREA MUST BE RESERVED FOR NE INTERRUPT AT A TIME W /DISABLED IS VERY EFFIM COMPLEXITY AND /TIME S CAN BE HANDLED WITHIN 50 MICROSEC. /TO INSURE THE BEST RETAINABLE RESPONSE CHARACTERISTIC FOR THE /FASTEST DEVICES (HIGHSPEED SAMPLING OF ANALOG DATA, RK8E DISK, /DECTAPE) USE IS MADE OF THE SECONDARY PRIORITY STRUCTURE OF THE /CLASICAL SKIPCHAIN. CRITICAL DEVICES ARE PUT IN FRONT AND /AFTER THE PROCESSING OF AN INTERRUPT THE SKIPCHAIN IS REENTERED /AT THE BEGINNING. FOR PDP8E MACHINES ADVANTAGE IS TAKEN FROM THE /SKIP-ON-INTERRUPT-REQUEST INSTRUCTION TO PREVENT UNNECCESSARY /SCANS TROUGH THE SKIPCHAIN. IN TOPS-8 THE SKIPCHAIN MUST /BE VERY FLEXIBLE IN ORDER TO: / /- BE ABLE TO CONFIGURATE IT FOR WIDELY DIFFERING HARDWARE. /- BE ABLE TO EXTEND THE NUMBER OF ENTRIES IN THE SKIPCHAIN FOR / VERY LARGE INSTALLATIONS, /- BE ABLE TO ROUTE CERTAIN INTERRUPTS DIRECTLY TO TASKS / THAT HAVE BEEN LOADED BY THE MONITOR AND REQUIRE A FAST / RESPONSE TO THAT INTERRUPT, E.G. THE DECTAPE DRIVER. / /THE CURRENT IMPLEMENTATION GIVES ALL THESE POSSIBILITIES WITHOUT SERVICE TIME. THE SKIPCES, ONE PER POSSIBLE INTORDS /EACH. THE GENERAL / /WORD 0: SKIP-IOT ///MY FLAG ? /WORD 1: JMP .+3 ///NO, JUMP TO NEXT ENTRY /WORD 2: CLEAR-IOT ///CLEAR THE DEVICE FLAG /WORD 3: JMS I Z HRDINT ///DECLARE APROPRIATE EVENT / /THE SYSTEM ROUTINE 'HRDINT' USES DDRESS /TO DETERMINE TH INTERRUPTING DEVICE. /D FOR THE CORRESPONDING HEDULING A WAITING TASK.
/NOTE THAT THE SKIPCHAIN IS OF OPTIMUM SPEED: 2.4 MICROSEC. FOR /PDP8E OMNIBUS DEVICES. (COMPARED TO 4.8 MICROSEC. FOR THE LINKED /SKIPCHAIN OF RTS/8). FURTHER, BY STARTING THE SKIPCHAIN AT AN /SPECIAL VALUED ADDRESS, THE SKIPCHAIN MAY CROSS /PAGEBOUNDARIES. (THE PAGEBOUND FALLS BETWEEN WORD 0 AND WORD 1). /AT LAST, BECAUSE EACH ENTRY IS EXACT 4 WORDS LONG, THE SKIPCHAIN /CAN BE ADDRESSED BY INDEXING. THUS IT IS POSSIBLE TO PATCH IT /AT RUNTIME. GIVEN THE DEVICE'S INTERNAL NUMBER THE TOPS-8 /MONITOR CAN PATCH A SKIPCHAIN ENTRY TO: / /WORD 0: SKIP-IOT ///MY FLAG ? /WORD 1: JMP .+3 ///NO, JUMP TO NEXT ENTRY /WORD 2: CDF CIF UFLD ///SETUP FOR TASKS FIELD /WORD 3: JMP I Z CONTAB+N///JMP TO CONNECTED TASK / /CONTAB IS A TABLE ON PAGE ZERO WITH ONE ENTRY FOR EACH DEVICE /THAT HAS THE 'CONNECT'-CAPABILITY. (E.G. TELETYPES ARE NEVER USED /IN CONNECTED MODE. CONNECTABLE DEVICES ARE NORMALY CLUSTERRED IN /THE FIRST PART OF THE SKIPCH THE /RESPONSIBILITY OFLEAR THE DEVICE FLAG. /IGURATED BY CONDITIONAL NTRY TAKES THE FORM: / /IFDEF MYDEVICE < ///ASSEMBLE ONLY IF 'MYDEV' PRESENT IN / ///CONFIGURATION /*MYD^4+SKPBASE ///ORIGIN ON PROPPER OFFSET, ACORDING TO / ///INTERNAL DEVICE NUMBER 'MYD' / SKIP-IOT ///MY FLAG ? / JMP .+3 ///NO, JUMP TO NEXT ENTRY / CLEAR-IOT ///CLEAR THE DEVICE FLAG / JMS I ZHRDINT ///DECLARE APROPRIATE EVENT / ///END OF CONDITIONAL ASSEMBLY >
/EVENTS: /======= / /AN EVENT IS AN ENTRY IN THE 'HRDLST', EACH ENTRY TAKING 2 WORDS. / /WORD 0: STATUS /WORD 1: STATE / /EVENTS ARE USED TO SYNCHRONISE TASKS WITH RESPECT TO EXTERNAL /INTERRUPTS OR OTHER TASKS. THUS AN EVENT IS THE SOFTWARE /GENERALISATION OF A DEVICE FLAG. THE STATE WORD (WORD 1) /OF AN EVENT VARIABLE CAN TAKE FOUR VALUES: / /ZERO- THE EVENT IS FREE. NO TASK IS WAITING, / THERE HAS BEEN NO INTERRUPT YET. / /ONE(1)-AN EVENT HAS BEEN RECORDED, BUT NO TASK IS YET / WAITING FOR IT. / /TWO(2)-THE EVENT VARIABLE HAS BEEN RESERVED BY SOME TASK / AND WILL EVENTNISE TWO TASKS. / /NEGNS THE TCBP OF THE TASK THIS EVENT. / /THE PO EVENTVARIABLE ARE DEPICTED /IN THIS FIGURE: / / !----------! !----------! / ! ! ! ! / !'WAITING' ! <- WAIT-REQUEST <- !'RESERVED'! / ! ! ! ! / !----------! !----------! / ! ^ / ! / ! ! / ERV- >> V / INTERRUT INTERRUPT / ! ^ ! / ! ! / ! / V ! / V / !---------! !----------! / ! ! <- WAIT-REQUEST <---! ! / ! 'FREE' ! !'SIGNALED'! / ! !---> INTERRUPT ----> ! ! / !---------! !----------! /
/THE STATUS WORD (WORD 0) SERVES SEVERAL PURPOSES. /FIRST, AN INTERRUPT CAN BE ACCOMPANIED BY ONE WORD OF INFORMATION, /E.G. THE COMPLETION STATUS OF AN IO-REQUEST. IN CASE THE INTERRUPT /COMES BEFORE THE TASK HAS ISSUED A WAIT-REQUEST, THIS COMPLETION /STATUS IS HELD IN THE STATUS WORD OF THE EVENT VARIABLE. WHEN THE /TASK ISSUES A WAIT-REQUEST, THE STATUS IS TRANFERED TO ITS AC. /SECOND, THE STATUS WORD HOLDS THE TIMEOUT COUNTER DURING A WAIT, /THUS WHEN THE EVENT VARIABLE IS IN THE 'WAITING' STATE. THE DIAG- /NOSTIC TIMER TASK SCANS THE 'HRDLST' AT EVERY SYSTEM TICK AND /INCREMENTS ALL STATUS WORDS THAT HOLD A NEGATIVE VALUE. IF A TIME- /OUTCOUNTER OVERFLOWS, THE DIAGNOSTIC TIMER TASK SENDS AN INTERRUPT /TO THAT EVENT, WITH A COMPLETION STATUS /THE VALUE OF A COMPLETE POSITIVE, OR ELSE /WIOUNTER BY THE DIAGNOSTIC-1&XLISTX IFZERO .-200&4000 <ZEROER,XERROR /PAGE ZERO EXCEEDED ! > *177 INT, DCA INTAC /// IFZERO PDPTYP-PDP8E < IFNDEF ONLY4K <GTF> IFDEF ONLY4K <RAR>> IFNZRO PDPTYP-PDP8E <RAR> DCA INTFLD SKP0, JMP X // CLA CLL SKPBAS=SKP0-3AGS. *KB1^4+SKPBAS KS JMP .+3 /// JMS I REAK CHARACTER IFNDEF KL8E2 <NOP ///ONE WORD SPARE > IFDEF KL8E2 < BRKLST ///POINTER TO ADDITIONAL INFORMATION *KB2^4+SKPBAS 6001+KL8E2 ///TEST SECONDARY KEYBOARD FLAG JMP .+3 /// JMS I ZBREAKR ///CHECK FOR BREAK CHAR BRKLST+4 ///POINTER TO ADDITIONAL INFO> IFDEF KL8E3 < *KB3^4+SKPBAS ///TEST THIRD KEYBOARD 6001+KL8E3 /// JMP .+3 /// JMS I ZBREAKR ///CHECK FOR BREAK CHAR BRKLST+10 > ///PNTR TO MORE IFDEF KL8E4 < *KB4^4+SKPBAS ///TEST FOURTH KEYBOARD 6001+KL8E4 /// JMP .+3 /// JMS I ZBREAKR ///CHECK FOR BREAK CHAR BRKLST+14 > ///PNTR TO MORE IFDEF KL8E5 < *KB5^4+SKPBAS ///TEST FIFTH KEYBOARD 6001+KL8E5 /// JMP .+3 /// JMS I ZBREAKR ///CHECK FOR BREAK CHAR BRKLST+20 > ///PNTR TO MORE IFDEF KL8E6 < *KB6^4+SKPBAS ///TEST SIXTH KEYBOARD 6001+KL8E6 /// JMP .+3 /// JMS I ZBREAKR ///CHECK FOR BREAK CHAR BRKLST+24 > ///PNTR TO MORE IFDEF KL8E7 < *KB7^4+SKPBAS ///TEST SEVENTH KEYBOARD 6001+KL8E7 /// JMP .+3 //CK FOR BREAK CHAR BRKL
/TEST THE TELETYPE F TSF ///TEST TELETYPE F ///CLEAR TELEPRINTER FLAG JMS I ZHRDINT /// IFDEF KL8E2 < *TTY2^4+SKPBAS 6011+KL8E2 ///TEST SECONDARY TELETYPE FLAG JMP .+3 /// 6012+KL8E2 ///CLEAR TTY FLAG JMS I ZHRDINT ///> IFDEF KL8E3 < *TTY3^4+EST TELETYPE 3 FLAG J/// JMS I ZHRDINT > //4+SKPBAS 6011+KL8E4 // JMP .+3 /// 6012+KL8E4 /// JMS I ZHRDINT > /// IFDEF KL8E5 < *TTY5^4+SKPBAS 6011+KL8E5 ///TEST TELETYPE 5 FLAG JMP .+3 /// 6012+KL8E5 /// JMS I ZHRDINT > /// IFDEF KL8E6 < *TTY6^4+SKPBAS 6011+KL8E6 ///TEST TELETYPE 6 FLAG JMP .+3 /// 6012+KL8E6 /// JMS I ZHRDINT > /// IFDEF KL8E7 < *TTY7^4+SKPBAS 6011+KL8E7 ///TEST TELETYPE 7 FLAG JMP .+3 /// 6012+KL8E7 /// JMS I ZHRDINT > ///
IFNZRO BGMAX < *TRAP^4+SKPBAS SINT ///TEST USER INTERRUPT FLAG JMP .+3 /// JMP I .+1 ///JUMP TO CENTRAL EMULATOR TRAPINT ///> IFDEF LE8E < *LPT^4+SKPBAS 6661 ///TEST LINEPRINTER FLAG JMP .+3 /// 6662 ///CLEAR PRINTER FLAG JMS I ZHRDINT /// *LPTER^4+SKPBAS 6663 ///SKIP ON LINEPRINTER ERROR JMP .+3 /// 6667 ///DISABLE LPT INTERRUPTS JMS I ZHRDINT ///>> IFDEF LE8C <IFNZRO LE8C < 6504 /// READ LINEPRINTER FLAG 6503 /// CLEAR LINEPRINTER FLAG SPA CLA /// SKIP IF FLAG NOT SET JMS I ZHRDINT /// DECLARE EVENT *LPTERCLL;CLA CLL;CLA CLL >> NTRON < *LPT^4+SKPBAS IALLY INTERFACED JMP PRINTER 6152 ///ON DEVICE CHANNEL 15 JMS I ZHRDINT ///>> IFDEF PR8E < *PTR^4+SKPBAS RSF ///TEST PAPERTAPE READER FLAG JMP .+3 /// RRB ///CLEAR READER FLAG JMS I ZHRDINT ///> IFDEF PP8E < *PTP^4+SKPBAS PSF ///TEST PUNCHER FLAG JMP .+3 /// PCF ///CLEAR PUNCHER FLAG JMS I ZHRDINT ///> IFDEF KL8P < /// SERIAL READER PUNCH IFDEF HSR < /// READER ENTRY *HSR^4+SKPBAS 6001+KL8P JMP .+3 6002+KL8P JMS I ZHRDINT > IFDEF HSP < /// PUNCH ENTRY 6011+KL8P JMP .+3 6012+KL8P JMS I ZHRDINT > > IFDEF TC08 < *DTA^4+SKPBAS NOP ///HANDLER WILL DROP DTSF HERE JMP .+3 /// NOP ///CAN'T CLEAR FLAG JMS I ZHRDINT ///> IFDEF RFCLOCK < *TIMER^4+SKPBAS 6616 ///READ DISK FLAGS SMA CLA ///PHOTOCEL ? SKP /// JMP I CONTAB+TIMER-1 ///> IFDEF KV08 < *DPL^4+SKPBAS 6071 ///TEST KV08 FLAG JMP .+3 /// 6072 ///CLEAR KV08 FLAG JMS I ZHRDINT ///>
IFDEF SYRF08 < *SYS^4+SKPBAS 6623 ///DISK INTERRUPT ? JMP .+3 / JMP I CONTAB+SYS-1 ///4+SKPBAS 6622 ///DISK/// CDF CIF SYSFLD ////> IFDEF FYSCLOCK < *TIMER^4+SKPBAS 6173 ///LINECLOCK ? CLEAR FLAG ! JMP .+3 /// 6174 ///ENABLE INTERRUPTS FOR SURE JMP I CONTAB+TIMER-1 /// > IFDEF SYRK8E < *SYS^4+SKPBAS DSKP ///DONE FLAG ? JMPD /// JMP I CONTAB+SYS *SYS^4+SKPBAS DSDD / /// CIF CDF SYSFLD ////GOTO SYSTEM DISK HANDLER > IFDEF RK8E < *DSK^4+SKPBAS ///RK8E AS NON-SYSTEM DEVICE 6741 ///DONE ? JMP .+3 /// 6742 ///CLEAR FLAG JMS I ZHRDINT ///> IFDEF DF32 < ///DF32 AS NONSYSTEM DEVICE *DSK^4+SKPBAS 6622 ///SKIP IN DISK INTERRUPT JMP .+3 /// 6601 /// JMS I ZHRDINT ///> IFDEF RF08 < ///RF08 AS NON-SYSTEM DEVICE *DSK^4+SKPBAS 6622 /// JMP .+3 6601 /// JMS I ZHRDINT ///>
IFDEF MT8E < *MTA^4+SKPBAS 6723 /// JMP .+3 /// 6725 /// JMS I ZHRDINT ///> IFDEF VC8E < *DPL^4+SKPBAS 6052 /// JMP .+3 /// 6051 ///CLEAR FLAG JMS I ZHRDINT ///> IFDEF CR8E < *CRD^4+SKPBAS 6675 ///INTERRUPT BEING GENERATED ? JMP .+3 /// 6635 ///READ CONDITIONS OUT: INHIBBIT INT JMS I ZHRDINT ///(USE CARDREADER CONNECTED) > IFDEF DK8EP < *TIMER^4+SKPBAS 6131 ///CLOCK INT ? JMP .+3 /// 6135 /// JMP I CONTAB+TIMER-1 ///> IFDEF DK8EA < *TIMER^4+SKPBAS 6133 ///SKIP ON CLOCK FLAG AND CLAER FLAG JMP .+3 /ERRUPTS FOR SURE JMP IIS A REAL CLOCK INTERRUPER^4+SKPBAS 6133 ///SEAR FLAG JMP .+3 /// 6131 ///ENABLE INTERRUPTS FOR SURE JMP I CONTAB+TIMER-1 ///THIS IS A REAL CLOCK INT > IFDEF KP8E < *POWER^4+SKPBAS 6102 ///SKIP ON POWER LOW JMP .+3 /// HLT ///NOT YET IMPLEMENXY8E < *PLOT^4+SKPBAS R FLAG JMP .+3 /// LAG JMS I ZHRDINT /// T^4+SKPBAS 6321 ///SKIP ON CRYSTAL CLOCK FLAG JMP .+3 ///SHOULD NOT BE ENABLED 6352 ///CLEAR XTAL CLOCK FLAG JMP I ZFSTEXT ///100 MICROSEC IS REALLY TOO FAST *AX08RC^4+SKPBAS 6341 ///SKIP ON RC CLOCK JMP .+3 /// 6354 ///CLEAR RC-FLAG JMS I ZHRDINT /// *AX08AD^4+SKPBAS 6332 ///SKIP ON ADC DONE JMP .+3 /// 6362 ///READ ADC TO CLEAR FLAG JMS I ZHRDINT /// *AX08ER^4+SKPBAS 6322 ///SKIP ON ADC TIMING ERROR JMP .+3 /// 6351 ///CLEAR ERROR FLAG JMP I ZFSTEXT ///DON'T USE DISCONNECTED *AX08SM^4+SKPBAS 6335 ///READ AND CLEAR SMITT TRIGGERS AND C7400 ///MASK OF LEVEL INPUTS SZA ///SMITT TRIGGERS FIRED ? JMS I ZHRDINT ///YES > IFDEF TONCLK < ///SPECIAL FYSIOLOGY CLOCK *CLOCK^4+SKPBAS 6161 ///SKIP ON SPECIAL CRYSTAL CLOCK JMP .+3 /// 6162 ///CLEAR FLAG JMS I ZHRDINT /// > IFDEF DR8EA < /12-CHANNEL BUFFERED DIGITAL I/O *FRIDO^4+SKPBAS 6502 ///SKIP ON IN-FLAG JMP .+3 /// SKP ///(CLEAR FLAG TAKES 2 LOCT ///USE IT CONNECTED. >SKPBAS 6534 ///SKIP O+3 /// 6533 ///CLEAR I ZHRDINT ///BETTER USE IT CONNECTED *ADCER^4+SKPBAS 6535 ///SKIP ON TIMING ERROR FLAG JMP .+3 /// 6530 ///CLEAR FLAGS AND ENABLES JMS I ZHRDINT ///CAN BE CONNECTED >
IFDEF DP8E < *DP8ECD^4+SKPBAS 64 DETECT FLAG JMP .+3 E (USE CONNECTED !) JM^4+SKPBAS 6402 ///REC.+3 /// 6401 ///CLEAR DP8E JMS I ZHRDINT /// *DP8ETO^4+SKPBAS 6403 ///TRANSMIT WC OVERFLOW JMP .+3 /// 6401 ///CLEAR DP8E JMS I ZHRDINT /// *DP8ERG^4+SKPBAS 6410 ///SKIP ON RING FLAG JMP .+3 /// 6401 ///CLEAR DP8E JMS I ZHRDINT /// *DP8ECA^4+SKPBAS 6411 ///SKIP ON CARRIER ON/OFF JMP .+3 /// 6401 ///CLEAR DP8E JMS I ZHRDINT /// *DP8EBE^4+SKPBAS 6416 ///SKIP ON BUS ERROR JMP .+3 /// 6401 /// JMS I ZHRDINT ///> IFDEF MF8E < *DPL^4+SKPBAS 6571 ///SKIP ON SCOPE FLAG, CLEAR FLAG JMP .+3 /// NOP /// JMS I ZHRDINT /// > IFDEF KV08 < *JOY-4^4+SKPBAS 6051 ///TEST JOYSTICK FLAG JMP .+3 ///SKIPS IF NO INTERRUPT ! NOP ///THIS REALLY IS A STRANGER SKP ///WE MUST INSURE THAT IT WILL SKP ///CROSS THE PAGEBOUND JMP .+3 /// 6052 ///CLEAR THE JOYSTICK FLAG JMS I ZHRDINT ///> IFDEF KW8IA < *TIMER^4+SKPBAS 6133 ///SKIP ON FLAG, CLEAR FLAG JMP .+3 /// 6137 ///ENABLE INTERRUPTS FOR SURE J TRUE CLOCK INTERRUPT >PBAS 6143 ///R1 INTER 6142 ///YES, CLEAR FL /^^^^^^ INSERT NEW SKIPCHAIN ELEMENTS HERE ^^^^^^^^^^^^^^^^
/NOW COME A FEW THINGS AT THE VERY END OF THE SKIPCHAIN: *SKPDEV^4+SKPBAS IFZERO PDPTYP-PDP8E< SKPEND, ///TRY TO KILL ILLEGAL INTERRUPTS - IFDEF TC08 <6766 ///DISABLE TC08 INTERRUPTS AND KILL FLAGS > IFDEF TONCLK <6060 ///DISABLE KV08 INTS (FYSIOLOGY UTRECHT) > JMP I ZFSTEXT> /// IFNZRO PDPTYP-PDP8E< JMP I ZSKPEND> ///
O=27 IFDEF DAYTIM <O=O+37> IFDEF KL8E2 <O=O+10> IFNZRO .-1&177+O&200 <PAGE /O IS WHAT WE NEED IN THIS PAGE > CLKINT, CLA CLL ///CLOCK INTERRUPT HANDLER IFDEF DAYTIM < ///OPTIONAL TIME-OF-DAY CLOCK TAD TIME ///GET NUMBER OF MILLISEC'S TAD (MSEC ///ADD ONE CLOCK TICK DCA TIME ///AND UPDATE MSEC COUNTER SNL ///OVERFLOW ? JMP CLKIN1 ///NO, READY DECIMAL TAD (-1000 / ///YES, RESET TO -1000 (DECIMAL) DCA TIME / /// ISZ TIME+1 / ///INCREMENT SECONDS COUNTER JMP CLKIN1 / ///NO OVERFLOW, READY TAD (-60 / ///RESET SECONDS TO -60 (DECIMA ISZ TIME+2 / ///INCREMMP CLKIN1 / ///NO OVERFL/ ///RESET MINUTES COUNT/ /// ISZ TIME+3 / ///INCREMENT HOURS COUNTER JMP CLKIN1 / ///NO OVERFLOW, READY TAD (-24 / ///MIDNIGHT ! RESET HOURS TO -24 OCTAL DCA TIME+3 ///(DECIMAL) TAD DATE ///DATE IN OS/8 FORMAT TAD (10S OF 32 DAY'S) DCA DATISZ I (TIMER^2+HRDLST //TAD (TIMER /// INSOF, JAGNOSTIC TIMER TASK 0 ///STATUS 0 IFDEF DAYTIM < DECIMAL MSEC=1000%HWTICK / TIME, -1000 / ///MILLISECONDS-1000 -60 / ///SECONDS-60 -60 / ///MINUTES-60 -24 / ///HOURS-24 OCTAL > DATE, 0 ///DATE IN OS8 FORMAT, ///INITIALISED AT POWERUP
IFDEF KL8E2 < /IF MORE THEN ONE TELETYPE BREAKR, 0 ///ROUTINE CHECKS FOR BREAKCHAR INPUT ACM1 ///ON ALL TTY'S TAD I BREAKR ///FETCH POINTER TO ADDITIONAL INFO. DCA AUTO13 ///AUTO13 IS FOR INTERRUPT ROUTINES TAD I AUTO13 ///FETCH CLEAR-IOT DCA .+1 /// HLT ///WILL BECOME CLEAR-IOT TAD I AUTO13 ///AC MUST BE ZERO! FETCH READ-IOT DCA .+2 /// TAD C200 ///FORCE PARITY-BIT ON HLT ///WILL BECOME READ-IOT TAD (-BRKCHR ///COMPARE WITH BREAKCHARACTER SZA CLA /// JMP BREAK1 ///NO MATCH ISZ AUTO13 ///SKIP PAST DEV# TAD I AUTO13 ///FETCH HANDLER NAME E.G. "K^100+"0&3777 DCA .+2 ///AND GIVE IT AS STATUS TO "CD" JMS I ZSOFINT ///INTERRUPT ON SLOT # 0 0 ///BECOMSK BREAK1, TAD I AUTO13SOF ///MAKE INTERRUPT FO2 < /BUT IF THERE'S ONLY, 0 ///ROUTINE CHECKS FOR BREAKCHAR INPUT CLRKBF+30 ///CLEAR-IOT TAD C200 ///FORCE PARITY-BIT ON KRS ///READ-IOT TAD (-BRKCHR ///COMPARE WITH BREAKCHARACTER SZA CLA /// JMP BREAK1 ///NO MATCH JMS I SLOT # 0 "K^100+"1&377STATUS TO CD BREAK1, TANT ///MAKE INTERRUPT FOR0. THAT'S ALL > PAGE /RESERVE A LOT OF ROOM FOR LONG SKIPCHAINS
/ENTRYPOINT TO GIVE AN SOFT INTERRUPT. ENTER WITH: / IOF /// / TAD (SLOT NUMBER/// / CDF CURRENT FIELD/// / CIF MONFLD /// / JMS I ZSOFINT /// / STATUS / /THE STATUS WILL BE RETURNED TO THE TASK AFTER A WAIT SOFINT, .-. /// CLL RAL /// AND C177 /// TAD (HRDLST /// DCA HRDINT /// TAD I SOFINT ///FETCH STATUS DCA SOFINT /// CDF MONFLD /// TAD SOFINT ///FETCH STATUS JMP HRD2 /// /THIS IS THE COMMON INTERRUPT HANDLER WHICH TRANSLATES A /HARDWARE INTERRUPT INTO A SOFTWARE EVENT. THE EVENT NUMBER IS /COMPUTED FROM THE CALL-ADDRESS OUT OF THE SKIPCHAIN. EVENT-STATUS /IS ZERO HRDINT, .-. ///COMPUTE DEVICE # FROM RETURN CLA ///YOU NEVER KNOW DCA SOFINT ///CLEAR STATUS TAD HRDINT /// TAD (-SKP0 /// CLL RAR ///DEVIDE BY 2 TAD (HRDLST ///AC IS DEVICE # *2 DCA HRDINT /// HRD2, DCA I HRDINT /// ISZ HRDINT /// TAD I HRDINT /// SPA ///IOWAIT ? J ///AC:=1 DCA I HRDINTED" JMP FSTEXT ///RESNT1, TAD M3 /// DCA IR IN INTQ TAD I ITAIL /// DCA ITAIL /// DCA I ITAIL ///CLEAR THREAD DCA I HRDINT ///MAKE SLOT "FREE" TAD C4 /// TAD ITAIL /// DCA AUTO13 /// PTR TO AC OF WAITER TAD SOFINT ///FETCH STATUS DCA I AUTGE
EVENT, ISZ EVENTFL INT'S NOP /// FSTEXT PDPTYP-PDP8E < ///PDP8ET- SRQ ///CHAIN ONLY WHEN NECESSARY. SKP CLA > ///PDP8I ALWAYS DOES,TO ENHANCE JMP I (SKP0 ///RESPONSE TIME:INCREASES OVERHEAD. IFNZRO PDPTYP-PDP8E < SKPEND, CDF MONFLD /// CLA /// > TAD EVENTFL /// SNA CLA /// JMP INTEXT+1 /// DCA EVENTFL ///RESET EVENTFLAG TAD CURTSK /// SPA /// JMP INTEXT ///DON'T INTERRUPT FG IFNZRO BGMAX < SZA CLA /// JMS I (RSAVE ///SAVE STATUS OF BG > JMP DISPATCH /// EVENTFL,0 ///EVENTFLAG TO ENHANCE RESPONSE TIME INTEXT, CLA /// TAD INTFLD /// IFZERO PDPTYP-PDP8E < IFNDEF ONLY4K < RTF /// CLA /// (WHY SO SILLY ?) IFNZRO BGMAX < IFDEF FYSUNTRP < TAD CURTSK ///FYSUNTRP MAY LOSE UMODE SMA SZA CLA ///BG-MODE ? SUF ///Y, SET U-MODE FLOP >> TAD INTAC /// JMP I 0 /// > IFDEF ONLY4K < CLL RAL // TAD INTAC /// ION /// JMP I 0 ///>> IFNZRO PDPTYP-PDP8E < CLL RAL /// TAD INTAC /// RMF ///SAVEFIELD IS STILL OK ION /// JMP I 0 ///>
DISPATCH,CLA /// ION // NULLTSK MODE IFZERO PDLPAT < LAS /GET SWITCTAD I X / MQL /DISPL SWITCHES >> IFNZRO PDPTYP-PDP8E <IFDEF EAE < LAS /GET SWITCH REGISTER DCA X TAD I X MQL /DISPLAY LOCATION ADDRESSED BY SWITCHES >> TAD IHEAD / SZA /INTQ ? JMP DISP1 / TAD MHEAD / SZA /MAINQ ? JMP DISP2 / IFNZRO BGMAX <TAD I BJOB/LOOK AT STATUS OF BG IN CORE IFZERO BGMAX-2&4000 <AND (-LONG-1 > SNA CLA JMP I (DISP3 /GO RUN BG> IFNZRO PDPTYP-PDP8E <IFNDEF EAE < LAS DCA X TAD I X /DISPLAY IN AC>> IFNZRO IDLPAT < NULLOP, CLA CLL TAD NULNK / GET LINK RAL TAD NULAC / GET AC MQL NULWEI, ISZ NULCTR JMP .-1 ISZ NULCTR JMP .-1 ISZ NULCTR JMP .-1 ISZ NULCTR JMP .-1 CLA CLL TAD NULNK RAL TAD NULAC RAR DCA NULAC RAR DCA NULNK > NULL, JMP NULLOP /GO IDLING IFNZRO IDLPAT < NULNK, 0 NULAC, 7600 NULCTR, 0 > DISP1, TAD C3 /MAKE CURTSK DCA CURTSK / IFDEF ONLY4K <IOF> /// IFNDEF ONLY4K<CIF MONFLD>/// TAD I IHEAD /// SZA ///Q EMPTY ? JMP .+3 /// TAD (IHEAD /// DCA ITAIL ///ADJUION> /// DCA IHEAD ///P2, TAD C3 / DCA CURTZA / JMP .+3 / TA/ DCA MHEAD / JMP I (START / PAGE
XLIST -LMONIT-1&XLISTX /******************************************************** /************** M O N I T O R *********************** /******************************** /PAGE ZERO ASSIGNMERS PC MONAC=ZTEM3 /CAL=ZTEM4 /CALLERS LINK + CTION WORD PARAM=ZTEM6 /PARAMETER NEWTSK=ZTEM7 /CURTSK OF NEW TSK XMONITR,DCA MONCDF /SAVE USERS CALLING FIELD TAD C6201 RDF /FETCH USERS DATAFIELD RAR /ROTATE IN LINK DCA MONLDF MONCDF, CDF //CHANGE TO CALLERS FIELD TAD I (MONAC //GET HIS AC INTO THIS FIELD DCA MONAC // TAD I (MONITOR DCA MONPC TAD I MONPC //FETCH FUNCTION WORD DCA FUNCTION ISZ MONPC TAD I MONPC //FETCH PARAMETERWORD CDF MONFLD DCA PARAM TAD FUNCTION CLL RTR AND C17 /STRIP OPTION BITS TAD (FUNTAB /INDEX IN FUNCTION DISPATCH TABLE DCA ZTEM1 TAD I ZTEM1 DCA ZTEM1 JMP I ZTEM1 /GOTO FUNCTION CODING
/FUNCTION EQUATES: PRECEDE=0000 /NO OPTIONS OR PARAMETERS SIGNAL=0004 /OPTIONS:'RELEASE', 'HALT','SWPOUT', 'CLEAR' /PARAM=DEV#,AC=STATUS HALT=0010 /OPTIONS:'RELEASE', 'SIGNAL', 'SWPOUT', 'CLEAR' CALL=0020 /PARAM=NAME OR PCBP, OPTION: RELEASE, SWPOUT ACKNLG=0024+CONTINUE RETURN=0030 /OPTIONS:'RELEASE', /'CLEAR, 'CONTINUE', 'SWPOUT' STOP=0034 /PT=0040 /PARAM=NAME OR PCRELEASE','SWPOUT', PARAMAM=#PAGES RELBLK=0054 /T PAGE OF BUFFER KILL=0060 /PARAM IS NAME OF TASK TO KILL STALL=0064 /PARAM IS NUMBER OF TICKS. OPTIONS: RELEASE, SWPOUT SUSPND=0070 /STOP CURRENT TASK, NO PARAM, NO OPTIONS /OPTION BITS: RELEASE=4000 CLEARPOUT=4002 /STANDARD CURN+CLEAR RUN=CALL+CONTN: OPTIONS: 'RELEASE', 'RE IS A RETURN ONLY WHEN 'CONTINUE IS REQUESTED /NO ERRORRETURN RETRN0, TAD CURTSK TAD M4 DCA ZTEM6 /POINTS TO BLNK CLA CMA /BCKLNK IS BIASED ! TAD I ZTEM6 SMA /RETURN FROM 'RUN' OR 'CALL' ? JMP RETRN1 /'RUN', AC=0 DCA NEWTSK JMS BLDNEW /BUILD NEW CHECKPOINT FOR NEW TASK TAD NEWTSK JMS I (MAININ /SCHEDULE NEW TASK RETRN1, TAD FUNCTION RTL SPA CLA /'CLEAR' ? JMP .+3 CLA CMA /SUBSTRACT ONE FROM BACKLINK TAD I ZTEM6 /TO REOPEN IT FOR PREVIOUS CALLER DCA I ZTEM6 /CLEAR BACKLINK IFNDEF NODISK <JMS I (RELESE> /TEST FOR RELEASE OPTION TAD FUNCTION RAR SNL CLA /'CONTINUE' ? JMP I ZDISPATCH /NO ISZ I ZTEM6 /MAKE HIM BUSY AGAIN JMP MONRTN+1 /YES MONRTN, ISZ MONPC /SKIP OVER ERRORRETURN TAD IHEAD SZA CLA /IF INTERRUPT TASKS ARE WAITING ... JMP I (PRECE /... LET THEM GO FIRST. TAD MONLDF STL RAL /LOAD LINK, MAKE CDF DCA MONCIF-1 TAD MONCDF IAC /MAKES A 'CIF' DCA MONCIF TAD MONAC /LOAD AC CDF MONCIRECT RETURN TO USER
/ 'RELEASE', 'SWPOUT' /NTURN THE AC CONTAINS THEITH AC=0 IF ALL OK. HOWEVER, NORMALLY /AC=STATUS: /1: THERE WAS SOMEBODY ALREADY WAITING:PROGR. ERROR /2: TIMED OUT /4: HARD ERROR WAIT0, ISZ MONPC /THERE IS A PARAMETER INDEED TAD PARAM SPA /NEGATIVE SLO/CLEAR AC AND RETURN CLST /INDEX IN HRDLST D ZTEM1 IOF ///NO TRIC/// SPA ///SLOT ALREADY IN WAIT ? JMP WAIT2 ///YES CLL RAR /// SNL CLA ///IS SLOT 'INTERRUPTED' ? JMP WAIT1 ///NO DCA I ZTEM1 ///YES,MAKE IT FREE ION /// TAD I X ///FETCH STATUS DCA MONAC /DROP IN USERS AC JMP MONRTN+1 /BACK TO CALLER WAIT1, TAD CURTSK /// DCA I ZTEM1 ///PUT SLOT IN 'WAIT' TAD MONAC /// TIMEOUT VALUE DCA I X /// JMS BLDCUR /// ION /// IFNDEF NODISK <JMS I (RELESE /RELEASE OPTION> JMP I ZDISPATCH /WHO'S NEXT ? WAIT2, ACM2 ///(-PROGER-1 WAIT3, CMA /FOR NEG SLOTNO GIVE COMPLEMENT AS STATUS DCA MONAC / JMP I (PRECE /QUIETLY RETURN
BLDNEW, .-. /BUILD A NEW CHECKPOINT FOR NEWTSK TAD NEWTSK SMA /TCBP MUST BE NEGATIVE ! HLT /* DON'T ALLOW SYSTEM TO FORGET ERROR * DCA AUTO14 /SET UP POINTER TAD MONLDF / DCA I AUTO14 /PASS L + CDF OF CALLER TAD MONAC DCA I AUTO14 /AND PASS CALLERS AC JMP I BLDNEW /RETURN BLDCUR, .-. /BUILD NEW CHECKPOINT FOR CALLER TAD CURTSK SMA /TCBP SHOULD DON'T ALLOW SYSTEM TO F14 /SET UP POINTER TADLOAD L + CDF TAD MONAC TAD MONPC / DCA I AUTO14 /LOAD PC JMP I BLDCUR /RETURN PAGE
/GETNEW PUTS THE TCB POINTER OF A TASK INDICATED BY /PARAM IN NEWTSK AND RETURNS THE BACKLINK OF THIS TASK. /IF PARAM IS POSITIF, PARAM IS TAKEN AS THE /REAL NAME AND A SEARCH IS MADE THROUGH ASSLST AND NAMLST, / ELSE PARAM IS TAKEN AS THE TCBP. WHEN A NAME HAS TO BE F /SEARCHED, THE RESULT IS PLUGGED IN THE REQUEST TO AVOID /REPEATED SEARCHES FOR THE SAME THING. GETNEW, .-. TAD PARAM /NAME OR TCBP SPA JMP GETN2 SNA JMS ALARM /NAME SHOULDN'T BE ZERO ! CIA DCA ZTEM1 TAD (ASSLST-1 DCA AUTO14 /INITIALISE POINTER TAD PARAM DCA I (MAXNAM^2+ASSLST/DROP NAME AT END OF LISTS GETN1, TAD ZTEM1 /7-CYCLE SEARCH LOOP TAD I AUTO14 /COMPARE WITH NEXT ENTRY SZA CLA JMP GETN1 /MISMATCH TAD AUTO14 /MATCHED ! TAD (-MAXNAM^2-ASSLST SNA CLA /FOUND AT END OF TABLE JMP MONER1 /NAME NOT IN SYSTEM TAD I (MONCDF DCA GETCDF /CDF TO CALLERS FIELD TAD AUTO14 TAD (-ASSLSN ASSLST ? TAD (MAXNAM RTL TAD (TCBTAB+4 /TCDF, CDF DCA I MONPC TAD I MONPC CDF MONFLD GETN2, DCA NEWTSK TAD NEWTSK TAD M4 DCA ZTEM1 /POINTS TO BLNK TAD I ZTEM1 ISZ MONPC /SKIP ERRORRETURN;OVFLO IMPOSSIBLE JMP I GETNEW
/FUNCTION 'CALL' /ERRORRETURN IF NAME UNKL0, JMS GETNEW SNA A TAD CURTSK SZA CLAMONERR /NO CALL1, TAD F RAR SNL CLA /CONTINUE OPTION ? JMP CALL2 TAD CURTSK JMS MAININ /RUN: SCHEDULE CALLER SKP CLA CALL2, TAD CURTSK IAC /MAKE IT BUSY DCA I ZTEM1 /SET BACKLINK ISZ MONPC /NORMAL RETURN JMS I (BLDCUR JMS I (BLDNEW ACM2 /AC:=-2 TAD NEWTSK DCA ZTEM1 /POINTER TO 'SA' TAD I ZTEM1 /FETCH START ADDR DCA I AUTO14 /DROP IN PC (AUTO14 STILL /SET BY BLDNEW...) TAD NEWTSK JMS MAININ /SCHEDULE NEW TASK IFNDEF NODISK <TAD FUNCTION SPA CLA JMS I (RELESE > JMP I ZDISPATCH MAININ, .-. SMA /TCBP SHOULD BE NEGATIVE ! HLT /DON'T ALLOW SYSTEM TO FORGET ERROR * TAD M3 /MAKE PNTR TO THREAD DCA I MTAIL / TAD I MTAIL / DCA MTAIL DCA I MTAIL /CLEAR THREAD JMP I MAININ /RETURN
MONER1, ISZ MONPC MONERR, CLA PRECE, JMS I (BLDCUR TAD CURTSK JMS MAININ /SCHEDULE ERRORRETURN JMP I ZDISPATCH START, TAD I CURTSK /STATUSBITS RTR SZL JMP START1 /TASK HAS STOPBIT SET IFNDEF NODISK < SPA /TASK IN CORE ? JMP I T2, AND C70 TAD (CIF DCA AUTO14 TAD I AULOAD LINK, MAKE CDF DC/AC DCA ZTEM1 TAD I AUTO14 /PC SNA JMS ALARM /PC=0 ?? DCA ZTEM2 TAD ZTEM1 STACDF, CDF STACIF, CIF JMP I ZTEM2 /GO ! START1, RAR STL RTL /SET 'STOPPED' RAL DCA I CURTSK JMP I ZDISPATCH /WHNCTION 'STOP' /ERRORRETP0, JMS I (GETNEW CLATL RTL /SET 'STOP' DCTN SUSPN0, TAD I CURTSK AND C7771 TAD (6 DCA I CURTSK /SET STOP AND STOPPED JMS I (BLDCUR /BUILD HIM A CHECKPOINT JMP I ZDISPATCH /FUNCTION 'RESTRT' /ERRORRETURN: UNKNOWN NAME RESTR0, JMS I (GETNEW CLA TAD I NEWTSK AND C4 SNA CLA /WAS TASK ACTUALLY STOPPED ? JMP REST1 /NO, CLEAR STOPBIT, DON'T SCHEDULE TAD NEWTSK JMS I (MAININ REST1, TAD I NEWTSK AND C7771 /CLEAR 'STOP' AND 'STOPPED' DCA I NEWTSK JMP I (MONRTN ACKN0, JMS I (RESERV / JMP ACKN1 /NO SLOT AVAILABLE JMS ALARM /NO SLOT AVAILABLE DCA MONAC /GIVE THE SLOT # IN HIS AC JMP I (RETRN0 /PERFORM THE RETURN FUNCTION NOW /ACKN1, ACM2 /RESET TASKS PC AND PERFORM A PRECEDE / TAD MONPC / DCA MONPC / JMP I (PRECE /LET OTHERS PRECEDE UNTIL SLOT IS AVAILABLE
/FUNCTION 'SIGNAL' + 'HALT': OPTIONS 'RELEASE', 'CLEAR' /FUNCTION 'HALT'+ 'SIGNAL': OPTIONS 'RELEASE', 'CLEAR' /FUNCTION 'SIGNAL' /PARAM=DEV #, AC=STATUS SIGHLT, SIGNL0, TAD PARAM CLL RAL AND C177 /DEFDEX IN HRDLST DCA ZTEMTUS IOF /// DCA I Z TAD I ZTEM1 ///FETCH TING ? JMP SIGNL1 ///NO JMS I (MAININ ///YES, SCHEDULE WAITER IAC /// TAD I ZTEM1 /// DCA AUTO10 ///POINTER TO AC IN TCB TAD MONAC ///FETCH STATUS DCA I AUTO10 ///STORE IN WAITERS AC SKP /// SIGNLON /// DCA I ZTEM1 //REE TAD FUNCTION AND FOR 'HALT' JMP I (MOTION 'HALT: OPTIONS 'RELEASE', 'CLEAR' HALT0, TAD CURTSK TAD M4 DCA ZTEM1 TAD FUNCTION RTL SPA CLA /CLEAR OPTION ? JMP .+3 /YES CLA CMA /NO, RESET BACKLINK TO NOT BUSY TAD I ZTEM1 / DCA I ZTEM1 /CLEAR THE BACKLINK IFNDEF NODISK <JMS I (RELESE /CHECK FOR RELESE OPTION> JMP I ZDISPATCH
IFNDEF NODISK < /REQUEST A NUMBER OF PAGES: /PARAM=- NUMBER OF PAGES /ON RETURN AC + DATAFIELD POINT TO FIRST PAGE REQPA0, ISZ MONPC /THERE IS A PARAMETER TAD PARAM SPA /PARAM MUST BE NEGATIVE ! JMS I (HOLE JMP I (MONERR /NOT SO MUCH AVAILABLE DCA ZTEM1 CLA CMA TAD ZTEM1 DCA AUTO10 /POINTS IN COREMAP JMP REQPA2 REQPA1, ACM2 /AC:=-2 DCA I AUTO10 /SET THIS PAGE OCUPIED REQPA2, ISZ PARAM JMP REQPA1 /NEXT ONE PLEASE CLA CMA /LAST SLOT := -1 DCA I AUTO10 TAD ZTEM1 TAD (-CORMAP AND C37 /PAGEBITS IFZERO PDPTYP-PDP8E < BSW CLL RAL > IFNZRO PDPTYP-PDP8E < CLL RTR RTR RTR > DCA MONAC /POINTS TO FIRST WORD OF BLOCFLD^4-CORMAP CLL RTR LL RAR DCA MONLDF JM IMPLICIT PRECEDE >
FUALT0 SIGHLT CALL0 ACKN0 RETRN0 STOP0 RESTR0 WAIT0 IFNDEF NODISK < REQPA0 RELPA0 > IFDEF NODISK < DISPATCH DISPATCH > KILL0 STALL0 SUSPN0 DISPATCH PAGE
IFNDEF NODISK < /RELEASE A COREAREA: /MONAC IS ADDRESS IN FIRST PAGE OF AREA /DATAFIELD IS FIELD OF AREA RELPA0, TAD MONLDF RAL AND C70 CLL RTL DCA ZTEM1 /FIELD^40 TAD I (MONCDF CLL RAR DCA MONLDF /RESET USERS FIELD TO HIS /INSTRUCTION FIELD TAD MONAC AND C7600 IFZERO PDPTYP-PDP8E <BSW;CLL RAR> IFNZRO PDPTYP-PDP8E <CLL RTL;RTL;RTL> TAD ZTEM1 TAD (-MONFLD^4+CORMAP DCA MONAC JMP .+4 ISZ I MONAC JMP RELPA1 /ERROR ! ISZ MONAC ISZ I MONAC JMP .-4 DCA MONAC JMS I (RELSUB /ACTIVATE WAITERS IN COREQ JMP I (MONRTN+1 RELPA1, ACM2 TAD I MONAC /RESET MODIFIED LOCATION DCA I MONAC JMS ALARM /ABORT THIS DIRTY BOY >
ALARM0, CLA CLL TAD CURTSK DCA ERRTSK JMP I ZDISPATCH ERRTSK, 0 KILL0, JMS I (GETNEW CLA TAD I NEWTSK RAR ? JMP I (MONRTN /YESD NEWTSK TAD C3 DCA D (XKILL DCA I ZTEM1 /ILL. JMP I (MONRTN /MONITOR 'STALL' MAY BE ENTERED WITH PARAM G.T.0 /OR PARAM L.T.0 STALL0, TAD PARAM SMA /NEGATE IF POSITIVE CIA SNA ACM1 /MINIMUM DELAY IS ONE TICK DCA MONAC JMS I ZRESERV S AVAILABLE DCA PARAMACM2 /RESET CALLERS PRONPC /HE MAKES A SECOND TPRECEDE JMP I (PRECE
/RESERV RESERVES A FREE SLOT IN HRDLST /THE INDEX IS RETURNED IN THE AC /THERE IS NO TASK CIRCULATION IN BETWEEN, /AND ZTEM REGISTERS REMAIN UNALTERED. / / CDTOIF / CIF MONFLD / JMS I ZRESERV / JMP ERROR /NO SLOTS AVAILABLE;AC=0, LINK PRESERVED / NORMAL RETURN /AC=SLOT NUMBER, LINK IS PRESERVED RESERV, 0 CLA CML TAD I ZMYCDIF DCA RESEXT /SETUP RETURN CDF MONFLD TAD (HRDLST+MAXDEV+MAXDEV DCA AUTO10 /POINTS TO FIRST ASSIGNABLE SLOT TAD (-MAXSLOT+MAXDEV DCA RESTM1 RES1, TAD I AUTO10 SNA CLA JMP RES2 ISZ AUTO10 ISZ RESTM1 JMP RES1 CML /PRESERVE THE LINK ! JMP RESEXT /NO SLOT AVAILABLE RES2, ISZ RESERV TAD AUTO10 DCA RESTM2 TAD C2 /PRESERVE THE LINK ! DCA I RESTM2 /MAKE SLOT RESERVED (=2) TAD RESTM1 TAD (MAXSLOT /COMPUTE DEV # RESEXT, CDF CIF JMP I RESERV RESTM1, 0 /TEMP COUNTER RESTM2, /=SETBASE /PNTR TO SLOT TO BE RESERVED
/******************************************************N T R A N T T A S K ************************************ SETBASE,CK# OF CURTASK CDF MONFLD /WHICH IS USED AS REENTRANCY BASE CML STA /BY REENTRANT, CORERESIDENT TASKS TAD CURTSK / DCA BASE / TAD I BASE / DCA BASE JMP I SETBASE /LINK HAS BEEN PRESERVED ! GET, 0 / VALUE CLA TAD I GET TAD BASE /ADD BASE VA-REGISTER ! TAD I X ALUE IN AC PUT, 0 /ROUTINE TO STORE AC IN RELATIVE LOCATION DCA GET /SAVE THE AC TAD I PUT /FETCH OFFSET ISZ PUT TAD BASE /ADD BASE DCA X /USES THE X-REGISTER ! TAD GET /GET STORED AC DCA I X /AND DROP IN ADDRESSED LOCATION JMP I PUT /RETURN WITH AC CLEAR PAGE



Feel free to contact me, David Gesswein djg@pdp8online.com with any questions, comments on the web site, or if you have related equipment, documentation, software etc. you are willing to part with.  I am interested in anything PDP-8 related, computers, peripherals used with them, DEC or third party, or documentation. 

PDP-8 Home Page   PDP-8 Site Map   PDP-8 Site Search