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-75, ELC+JV
/LAST EDIT: 7-FEBRUARY-75, ELC

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

/	REALTIME-FOREGROUND / TIMESHARING BACKGROUND
/	     OPERATING  SYSTEM FOR THE PDP8
/		   COMPUTERS
/
/
/
/		FLOOR ANTHONI 1972-9/1975
/		MEDICAL BIOLOGICAL LAB TNO
/		RIJSWIJK,THE NETHERLANDS
/
/		ERNST LOPES CARDOZO 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 DOTF30=200 DOTF40=200 DOTF50=200 DOTF60=200 DOTF70=200 /EQUATES FOR CONFIGURATION MNEMONICS PDP8=0 PDP8S=1 PDP8L=2 PDP8I=3 PDP8E=4 /EQUATES FOR TASK COMMUNICATION: 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 /LIST SKIPCHIAN ETC. LMONIT=6777 /LIST THE MONITOR PART LEMULA=7377 /LIST THE BG-EMULATOR LRESMOD=7577 /LIST THE RESIDENT TASKS (TASKS) LSYSDRV=7677 /LIST THE SYSTEM 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 THE FOLLOWING SYMBOLS: /PDP8, PDP8S, PDP8L, PDP8I OR PDP8E. PDPTYP=PDP8E /IF YOUR MACHINE HAS AN EXTENDED ARITHMETIC ELEMENT /THEN DEFINE THE SYMBOL "EAE", I.E. "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 SOFTWARE INTERRUPT SLOTS. SOFSLOT GIVES THE /NUMBER OF VARIABLE INTERRUPT SLOTS. SOFSLOT=24 /DEFINE THE NUMBER OF 8-WORD FREE CORE BLOCKLETS FREEMAX=3 /DEFINE YOUR 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 /FOR 1200 BAUD TERMINAL BG3OLN=530 /FOR 1200 BAUD TERMINAL /DEFINE THE DEVICE TYPES YOU HAVE: /KV08=1 LE8E=120 /FOR DEC LINEPRINTER, # OF COLUMNS PR8E=1 /PAPERTAPE 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 DIGITAL I/O /AD8EA=1 /ANALOG-TO-DIGITAL CONVERTER
/DEFINE THE INTERNAL DEVICE NUMBERS; THIS ALSO GENERATES /A PRIORITY ORDERED SKIPCHAIN. START WITH NUMBER 1. /ZERO 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. /SKPDEV TELLS THE SIZE OF THE SKIPCHAIN: END OF SKIPCHAIN. /BETWEEN SKPDEV AND MAXDEV THERE CAN BE FAKE DEVICES. /MAXDEV TELLS THE MONITOR HOW MANY FIXED INTERRUPT SLOTS /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 BUFFERED DIGITAL I/O
/THE REST OF THE INTERRUPTS WILL NOT BE USED IN CONNECTED MODE. /THUS WE CAN SAVE ON THE CONNECT TABLE ON PAGE ZERO: INTDEV=. LPT,. /LINEPRINTER 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,. /TELEPRINTER 4 AX08ER,. /AX08 ADC ERROR FLAG AX08XT,. /AX08 CRYSTAL CLOCK DPL,. /KV8/I OR MF8E SCOPE CONTROL / ADCER,. /AD8EA ERROR FLAG LPTER,. /LE8E ERROR FLAG / 0;JOY,. /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 CORE;DYNAMIC STORAGE ALLOCATION AREA /BLK =BLOCK /BLKLT =BLOCKLET;ONE UNIT OF 8 WORDS IN FC /LST =LIST /CHAR =CHARACTER /TEM =TEMPORARILY /BUF =BUFFER /FLG =FLAG,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)DATAFIELD NOT EQUAL INSTRUCTION FIELD /TCB =TASK CONTROL BLOCKLET /TCBP =TASK CONTROL BLOCK POINTER /TAB =TABLE /TB =TABLE / =(ONE SPACE AFTER TAB)NOT ALWAYS EXECUTED / =(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 BUT TEXT > IFNDEF BRKCHR <BRKCHR=234 /SYSTEM BREAK CHAR. CTRL/SHIFT/L > IFNZRO BGMAX <IFNDEF BG1OLN <BG1OLN=30> BGBUFL=BG1OLN+44+4 IFZERO BGMAX-2&4000 <IFNDEF BG2OLN <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 <DATORG=BGMAX^32+BGBUFL+110+GIGAMX+DATORG IFZERO BGMAX-1 <DATORG=BGMAX^2+2+DATORG>>> TEST1=DATORG IFNDEF MAXEND < IFZERO MONFLD-2&4000 <MAXEND=7750> /MONFLD=2,3,.. IFNZRO MONFLD-2&4000 <MAXEND=7600>> /MONFLD=0,1 DATORG=MAXEND-DATORG IFNDEF SYSFLD <SYSFLD=MONFLD> /END OF PASS1 ONLY CODE >
XLIST -LTEXT-1&XLISTX /******************************************************** /***************** P A G E Z E R O ******************** /******************************************************** /PAGE ZERO CONSISTS OF THE FIRST 200 LOCATIONS OF 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 AS GENERAL PURPOSE REGISTERS THAT MAY BE USED / AS TEMPORARIES BY BOTH THE MONITOR ROUTINES AND THE TASKS. / USE OF THESE REGISTERS BY INTERRUPTROUTINES IS NOT PERMITTED. / 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 THE RELATIVE ADDRESSED AREA, AND X IS USED AS / POINTER TO THE VARIOUS INDEXED LOCATIONS. (FOR FURTHER DETAILS / SEE AT 'REENTRANT TASK SUPPORT'). NOTE THAT 'X' IS ALSO 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 THAN THE / MONITOR'S FIELD. IT CONTAINS SOME LOCATIONS TO SAVE THE MACHINE / REGISTERS DURING INTERRUPT PROCESSING, A TABLE THAT HOLDS / THE INTERRUPT ENTRY ADDRESSES 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 STATIONNARY PARAMETERS CAN BE ADDRES- /SED IN ANY FIELD.
XLIST -LZERO-1&XLISTX FIELD MONFLD%10 ///INTERRUPT ENTRY POINT *0 0 ///JUST FOR FUN JMP INT /// /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,HRDINT ///COMMON INTERRUPT PROCESSOR ZSKPEND,SKPEND ///END OF SKIPCHAIN ZBREAKR,BREAKR ///KEYBOARD BREAK CHARACTER DETECTION ROUTINE ZSOFINT,SOFINT ///GENERATE SOFT INTERRUPT 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 BY POWERUP MYCDIF, CIF CDF MONFLD /FOR EACH FIELD /KILL REQUEST USED BY THE MONITOR KILL FUNCTION. THE KILLED /TASK IS DERAILED TO THIS POINT AND KILLS ITSELF. / XKILL, 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 LOCATION DCA X /ADDRESSED BY AC TAD I X /*** USES X ! **** JMP I DEFER
IFNZRO BGMAX < BSFLAG, 0 /COMMUNICATION FLAG BG-SCHEDULER/EMULATOR BJOB, BG1 /PNTR TO REGISTERS 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 /CORE-WAITERS Q / / SYSTEM TABLE REFERENCE ADDRESS / *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 INTERRUPTHANDLER IS FEASABLE, /SUCH AN APROACH WOULD COMBINE A RELATIVE HIGH CORE AND TIME- /OVERHEAD WITH A VERY MODEST DECREASE IN INTERRUPT RESPONSETIME. /RE-ENABLING INTERRUPTS 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 THE PURPOSE. /SERVING ONE INTERRUPT AT A TIME WITH THE INTERRUPT SYSTEM /DISABLED IS VERY EFFICIENT IN TERMS IF PROGRAM COMPLEXITY AND /TIME OVERHEAD; MOST INTERRUPTS 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 /COMPROMISING INTERRUPT SERVICE TIME. THE SKIPCHAIN IS BUILD /OF ENTRIES, ONE PER POSSIBLE INTERRUPT SOURCE, OF FOUR WORDS /EACH. THE GENERAL FORMAT OF AN ENTRY IS: / /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 THE VALUE OF THE RETURNADDRESS /TO DETERMINE THE INTERNAL NUMBER OF THE INTERRUPTING DEVICE. /THEN AN EVENT IS DECLARED FOR THE CORRESPONDING EVENT #, /EVENTUALLY SCHEDULING 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 SKIPCHAIN). IN THIS CASE IT IS THE /RESPONSIBILITY OF THE CONNECTED TASK TO CLEAR THE DEVICE FLAG. / /THE SKIPCHAIN IS CONFIGURATED BY CONDITIONAL ASSEMBLY. A COMPLETE /ENTRY 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 EVENTUALLY BE USED TO SYNCHRONISE TWO TASKS. / /NEG.- THE STATE WORD CONTAINS THE TCBP OF THE TASK CURRENTLY / WAITING FOR THIS EVENT. / /THE POSSIBLE TRANSITIONS OF AN EVENTVARIABLE ARE DEPICTED /IN THIS FIGURE: / / !----------! !----------! / ! ! ! ! / !'WAITING' ! <- WAIT-REQUEST <- !'RESERVED'! / ! ! ! ! / !----------! !----------! / ! ^ / ! / ! ! / ! / ! ! / ! / V WAIT- RESERV- >> V / INTERRUPT REQUEST >> REQUEST 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 OF 'TIMEOUT'. NOTE THAT /THE VALUE OF A COMPLETION STATUS MUST ALWAYS BE POSITIVE, OR ELSE /WILL BE INTERPRETED AS A COUNTER BY THE DIAGNOSTIC TIMER !
XLIST -LSKIPS-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 ///INITIALISATION, BECOMES CLA CLL SKPBAS=SKP0-3 /TEST THE KEYBOARD FLAGS. *KB1^4+SKPBAS KSF ///TEST KEYBOARD FLAG JMP .+3 /// JMS I ZBREAKR ///GO LOOK FOR BREAK 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 /// JMS I ZBREAKR ///CHECK FOR BREAK CHAR BRKLST+30 > ///PNTR TO MORE
/TEST THE TELETYPE FLAGS. *TTY1^4+SKPBAS TSF ///TEST TELETYPE FLAG JMP .+3 /// TCF ///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+SKPBAS 6011+KL8E3 ///TEST TELETYPE 3 FLAG JMP .+3 /// 6012+KL8E3 /// JMS I ZHRDINT > /// IFDEF KL8E4 < *TTY4^4+SKPBAS 6011+KL8E4 ///TEST TELETYPE 4 FLAG 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 IFNDEF LE8C < 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 < 6504 /// READ LINEPRINTER FLAG 6503 /// CLEAR LINEPRINTER FLAG SPA CLA /// SKIP IF FLAG NOT SET JMS I ZHRDINT /// DECLARE EVENT *LPTER^4+SKPBAS CLA CLL;CLA CLL;CLA CLL;CLA CLL >> IFDEF CENTRON < *LPT^4+SKPBAS 6151 ///CENTRONICS SERIALLY INTERFACED JMP .+3 ///MEDIUM SPEED LINEPRINTER 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 /// CDF CIF SYSFLD /// JMP I CONTAB+SYS-1 ///> IFDEF SYDF32 < *SYS^4+SKPBAS 6622 ///DISK INTERRUPT ? JMP .+3 /// CDF CIF SYSFLD /// JMP I CONTAB+SYS-1 ///> 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 ? JMP .+3 /// CIF CDF SYSFLD /// JMP I CONTAB+SYS-1 ///> IFDEF SY3010 < *SYS^4+SKPBAS DSDD ///DISK DONE ? JMP .+3 /// CIF CDF SYSFLD /// JMP I CONTAB+SYS-1 ///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 /// 6131 ///ENABLE INTERRUPTS FOR SURE JMP I CONTAB+TIMER-1 ///THIS IS A REAL CLOCK INTERRUPT > IFDEF DK8EC < *TIMER^4+SKPBAS 6133 ///SKIP ON CLOCK FLAG AND CLEAR 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 IMPLEMENTED NOP /// > IFDEF XY8E < *PLOT^4+SKPBAS 6501 ///SKIP ON PLOTTER FLAG JMP .+3 /// 6502 ///CLEAR PLOTTER FLAG JMS I ZHRDINT /// >
IFDEF AX08 < *AX08XT^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 LOCATIONS !) JMS I ZHRDINT ///USE IT CONNECTED. > IFDEF AD8EA < *ADC^4+SKPBAS 6534 ///SKIP ON A/D DONE FLAG JMP .+3 /// 6533 ///CLEAR FLAG, READ BUFFER JMS 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 6400 ///SKIP ON CHARACTER DETECT FLAG JMP .+3 /// 6401 ///CLEAR DP8E (USE CONNECTED !) JMS I ZHRDINT /// *DP8ERO^4+SKPBAS 6402 ///RECIEVE WC OVERFLOW JMP .+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 JMP I CONTAB+TIMER-1 ///A TRUE CLOCK INTERRUPT > IFDEF R1 < *R1INT^4+SKPBAS 6143 ///R1 INTERRUPT ? JMP .+3 ///NO 6142 ///YES, CLEAR FLAG JMS I ZHRDINT /// > /^^^^^^ 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 (DECIMAL) DCA TIME+1 / /// ISZ TIME+2 / ///INCREMENT MINUTES COUNTER JMP CLKIN1 / ///NO OVERFLOW, READY TAD (-60 / ///RESET MINUTES COUNTER TO -60 DCA TIME+2 / /// 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 (10 ///ADD ONE DAY (MONTH'S OF 32 DAY'S) DCA DATE /// CLKIN1, ///> ISZ I (TIMER^2+HRDLST /// JMP I ZFSTEXT /// TAD (TIMER /// INSOF, JMS I ZSOFINT ///START DIAGNOSTIC 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 ///BECOMES NAME OF KB-HANDLER TASK BREAK1, TAD I AUTO13 ///FETCH DEV # JMP INSOF ///MAKE INTERRUPT FOR THIS KB > IFNDEF KL8E2 < /BUT IF THERE'S ONLY ONE TELETYPE... BREAKR, 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 ZSOFINT ///INTERRUPT ON SLOT # 0 "K^100+"1&3777 ///GIVE NAME OF KB AS STATUS TO CD BREAK1, TAD (KB1 /// JMS I ZSOFINT ///MAKE INTERRUPT FOR THIS KB 0 ///STATUS 0. 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 ? JMP INT1 ///YES CLA IAC ///AC:=1 DCA I HRDINT ///MAKE SLOT "INTERRUPTED" JMP FSTEXT ///RESUME RUNNING PROGRAM INT1, TAD M3 /// DCA I ITAIL ///SCHEDULE WAITER 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 AUTO13 ///FALL INTO NEXT PAGE
EVENT, ISZ EVENTFL ///DON'T FORGET IF MORE INT'S NOP /// FSTEXT, CDF MONFLD /// IFZERO PDPTYP-PDP8E < ///PDP8E JUMPS INTO THE INTERRUPT- 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 /// DCA CURTSK ///SET IN NULLTSK MODE IFZERO PDPTYP-PDP8E < IFZERO IDLPAT < LAS /GET SWITCH REGISTER DCA X / TAD I X / MQL /DISPLAY LOCATION ADDRESSED BY 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 ///ADJUST ITAIL IFDEF ONLY4K <ION> /// DCA IHEAD /// JMP I (START / DISP2, TAD C3 / DCA CURTSK / TAD I MHEAD / SZA / JMP .+3 / TAD (MHEAD / DCA MTAIL / DCA MHEAD / JMP I (START / PAGE
XLIST -LMONIT-1&XLISTX /******************************************************** /************** M O N I T O R *********************** /******************************************************** /PAGE ZERO ASSIGNMENTS: MONPC=ZTEM2 /CALLERS PC MONAC=ZTEM3 /CALLERS ACCUMULATOR MONLDF=ZTEM4 /CALLERS LINK + CDF FUNCTION=ZTEM5 /FUNCTION 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 /PARAM=NAME OR PCBP RESTRT=0040 /PARAM=NAME OR PCBP WAIT=0044 /OPTIONS:'RELEASE','SWPOUT', PARAM=DEV # REQBLK=0050 /PARAM=#PAGES RELBLK=0054 /AC+DATAFLD POINT TO FIRST 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 CLEAR=1000 CONTINUE=0001 SWPOUT=4002 /STANDARD COMBINATIONS: EXIT=RETURN+CLEAR RUN=CALL+CONTINUE
/'RETURN' FUNCTION: OPTIONS: 'RELEASE', 'CLEAR', 'CONTINUE' /THERE 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 MONCIF, CIF JMP I MONPC /DIRECT RETURN TO USER
/FUCTION 'WAIT': OPTIONS: 'RELEASE', 'SWPOUT' /NO ERRORRETURN /AFTER RETURN THE AC CONTAINS THE STATUS /WAIT RETURNS WITH 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 SLOT # IS NOP JMP WAIT3 /CLEAR AC AND RETURN CLL RAL / * 2 TAD (HRDLST /INDEX IN HRDLST DCA X TAD X IAC DCA ZTEM1 IOF ///NO TRICKERY HERE TAD I ZTEM1 /// 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 BE NEGATIVE ! HLT /* DON'T ALLOW SYSTEM TO FORGET ERROR * DCA AUTO14 /SET UP POINTER TAD MONLDF DCA I AUTO14 /LOAD L + CDF TAD MONAC DCA I AUTO14 /LOAD AC 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 (-ASSLST-MAXNAM SPA /FOUND IN ASSLST ? TAD (MAXNAM /ADJUST INDEX CLL RAL RTL TAD (TCBTAB+4 /THIS IS THE CURTSK ! GETCDF, CDF DCA I MONPC /STORE IN USERS REQUEST 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 UNKNOWN OR TASK BUSY CALL0, JMS GETNEW SNA JMP CALL1 /NOT BUSY CIA TAD CURTSK SZA CLA /BUSY FOR ME ? JMP MONERR /NO CALL1, TAD FUNCTION /RUN OR CALL ? 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 (SWPIN /NO > RTL START2, AND C70 TAD (CIF DCA STACIF TAD CURTSK DCA AUTO14 TAD I AUTO14 /L+CDF STL RAL /LOAD LINK, MAKE CDF DCA STACDF TAD I AUTO14 /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 /WHO'S NEXT ? PAGE
/FUNCTION 'STOP' /ERRORRETURN: UNKNOWN NAME STOP0, JMS I (GETNEW CLA TAD I NEWTSK RTR STL RTL /SET 'STOP' DCA I NEWTSK JMP I (MONRTN 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 /DEFENCE ! TAD (HRDLST /INDEX IN HRDLST DCA ZTEM1 TAD MONAC /FETCH STATUS IOF /// DCA I ZTEM1 /// ISZ ZTEM1 /// TAD I ZTEM1 ///FETCH SLOT STATE SMA ///WAITING ? 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 /// SIGNL1, CLA IAC ///AC:=1 ION /// DCA I ZTEM1 ///MAKE SLOT INTERRUPTED/FREE TAD FUNCTION AND (HALT SNA CLA /CHECK FOR 'HALT' JMP I (MONRTN /NO 'HALT' /FUNCTION '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 BLOCK TAD ZTEM1 TAD (MONFLD^4-CORMAP CLL RTR AND C70 TAD C6201 CLL RAR DCA MONLDF JMP I (MONER1 /RETURN WITH IMPLICIT PRECEDE >
FUNTAB, PRECE SIGNL0 HALT0 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 SZL CLA /IS HE ONDISK ? JMP I (MONRTN /YES, DON'T TOUCH HIM ! TAD NEWTSK TAD C3 DCA ZTEM1 /POINTS TO PC TAD (XKILL DCA I ZTEM1 /FORCE HIM TO START AT XKILL. 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 JMP STALL1 /NO MORE SLOTS AVAILABLE DCA PARAM JMP I (WAIT0 STALL1, ACM2 /RESET CALLERS PROGRAM COUNTER SO TAD MONPC /HE MAKES A SECOND TRY AFTER A DCA MONPC /PRECEDE 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
/************************************************************ /****** R E E N T R A N T T A S K S U P O R T ******* /************************************************************ SETBASE,0 /ROUTINE TO FETCH BLOCK# 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 /GET A RELATIVE ADDRESSED VALUE CLA TAD I GET /FETCH OFFSET ISZ GET TAD BASE /ADD BASE VALUE DCA X /USES THE X-REGISTER ! TAD I X JMP I GET /RETURN WITH VALUE 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