File RTS8.PA (PAL assembler source file)

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

/ RTS/8  SMALL REAL TIME SYSTEM (V2B-B)		30-APR-78
	XLIST	1	/COPYRIGHT ALSO IS IN PARAM.PA
/
/
/
/
/
/
/
/
/	COPYRIGHT  (C)  1974,1975,1976 BY
/
/	DIGITAL EQUIPMENT CORPORATION
/
/
/
/
/
/
/
/
/
/THE INFORMATION IN THIS DOCUMENT IS SUBJECT  TO  CHANGE
/WITHOUT  NOTICE  AND  SHOULD  NOT  BE  CONSTRUED  AS  A
/COMMITMENT BY DIGITAL  EQUIPMENT  CORPORATION.  DIGITAL
/EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR ANY
/ERRORS THAT MAY APPEAR IN THIS DOCUMENT.
/
/THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO
/THE  PURCHASER  UNDER  A  LICENSE  FOR  USE ON A SINGLE
/COMPUTER SYSTEM AND CAN BE COPIED  (WITH  INCLUSION  OF
/DIGITAL'S  COPYRIGHT  NOTICE)  ONLY  FOR  USE  IN  SUCH
/SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN  WRITING
/BY DIGITAL.
/
/DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY
/FOR THE USE OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT
/THAT IS NOT SUPPLIED BY DIGITAL.
/
/
/
/
/
/
/
/
/
/
	XLIST	0	/LIST TASK CODE

/	VERS=	3

/
/EDIT HISTORY:
/
/RICHARD LARY		LAST EDITED AUG 18, 1974
/SHAWN SPILLMAN EDITED THIS ON 14-SEP-74.
/STANLEY RABINOWITZ EDITED THIS ON 5-APR-75
/	ADDED PDP-12 SUPPORT
/	FIXED ANGLE BRACKET BUG OF SHWANS
/RICHARD LARY EDITED THIS ON 20-NOV-75
/	ADDED KL8A SUPPORT AND RESCHED FUNCTION
/RICHARD LARY EDITED THIS ON 28-DEC-75
/	ADDED FREE-PARTITION OPTION TO WAITM, FIXING BUG
/	FIXED NON-RESIDENT TASK BUG IN FREEJ AND STOPJ
/STANLEY RABINOWITZ EDITED THIS DURING SEP, OCT 1976 (V2B)
/	REMOVED KL8A SUPPORT (NOW IN KL8ASR.PA)
/	ADDED HELPER STUFF FOR KL8A INTERRUPT SKIP CHAIN
/	ADDED WAITX ER
/	ALLOWED RECEIVE TO FALL THROUGH IF NO MSG
/	  AND AC NEGATIVE
/	ZERO CERTAIN DECNET TABLES
/	FIXED RACE CONDITION IN SCHEDULER
/
/
/	RTS800	V2B RELEASE VERSION
/	RTS801  SCR  11/77  PWRFAIL FIXES		[01]
/	RTS802	SCR  4/78   ISZ BUG, SWAPPER BUG	[02]
/	RTS803	SCR  4/78   POWER FAIL FIXES (LN)	[03]
/
/
/01-AUG-77: (LHN)	[N1]
/	1)  80 COLUMN LPT: CREF LISTING.
/	2)  ADDED A SYSTEM-WIDE COMMON FLAG AREA ON PAGE 0.
/	3)  ADDED CODE FOR "DEBUG" CALL.
/	4)  ADDED CORE PAGE TO RTS/8 TO INCLUDE:
/		A)  "XDEBUG" CODE - NEW.
/	5)  MOVED "XFREE" INTO RTS/8, FROM "SWAPPER".
/	6)  REPLACED "EAE" ASSEMBLY PARAMETER WITH "MQ".
/	7)  CHANGED "PDP8E" CONDITIONALS TO "PDP8E+PDP8A".
/
/03-AUG-77: (LHN)	[N2]
/	1)  MODIFIED RTS/8: IF "EAE" = 1, SAVE THE STEP
/	    COUNTER AND THE EAE MODE WHEN TASK SWITCHING.
/
/30-APR-78: (LHN)	[N3]
/	1)  ADDED POWERFAIL CODE A LA SCR [01] & [03].
/	2)  UPDATED TO SCR'S RTS803 LEVEL.




/BASED ON      T-O-Y    JUNE 5, 1973

/IOT'S FOR OPTIONAL HARDWARE: *200 IFNDEF PDP12 <PDP12=0> /IF NOT SURE, YOU'RE NOT A PDP-12 IFZERO PDP8E+PDP8A < /[N1] IFZERO PDP12 <CAFHLT=HLT> /HALT TO LET USER CLEAR FLAGS IFNZRO PDP12 <CAFHLT=JMS IOPRST> /ISSUE I/O PRESET ON PDP12 > IFNZRO PDP8E+PDP8A <CAFHLT=CAF> /MACHINE WILL CLEAR FLAGS SINT= 6254 /SKIP ON USER INTERRUPT SUF= 6274 /SET USER MODE FLAG SPL= 6102 /SKIP ON POWER LOW LINC= 6141 /ENTER LINC MODE PDP= 2 /ENTER PDP-8/I MODE ESF= 4 /ENABLE SPECIAL FUNCTIONS /PAGE 0 OF FIELD 0 *0 /INTERRUPT "VECTOR" 0 /SET TO JMP I 3 ON POWER FAILURE JMP I .+1 INTRPT IFNZRO PWRFAL < PFLADR, PFLRTN /CHANGED BY POWER FAIL TASK > *17 XR, 0 /INDEX REGISTER USED BY EXEC LOC20, 0 /MONITOR CALL LOCATION ** MUST / BE AT 20 ** DCDF, CDF 0 CALIOF, IOF JMP I CALEXC DSPOST /** MUST BE AT LOC 24 ** XWAITM /** MUST BE AT LOC 25 ** /ODT LINKAGE TO "XDEBUG" RDF /[N1] GET THE REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC 0 /[N1] ODT ENTRY, WILL BE TASK PC DCA .-2 /[N1] SAVE TASK AC JMP 26 /[N1]
/ CALEXC, EXEC /** MUST BE 400 ** ACARG, ION /HOLDS AC ARG ON EXEC CALLS MPTR, JMP I .+1 /[N1] POINTS TO FIRST WORD OF / MESSAGE Q POINTER. MPT2, NEWTSK+1 /[N1] " " SECOND " " TASKX, 0 /CURRENT TASK NUMBER SVSFLG, -1 /SAVE STATE FLAG - /-1 MEANS CPU STATE COUNTS & SHOULD / BE SAVED, / 0 MEANS CPU STATE IS UNIMPORTANT. TSWFLG, 1 /TASK SWITCHING INHIBITED FLAG - / 1 = TASK SWITCHING ALLOWED / 0 = TASK SWITCHING INHIBITED /-1 = TASK SWITCHING INHIBITED, / RESCAN ASAP TODL, 0 /TIME-OF-DAY LOW ORDER TODH, 0 /TIME-OF-DAY HIGH ORDER DATE, TSTCLK /DATE WORD - USED TO INITIALIZE / CLOCK HANDLER YEAR, 0 /[01] YEAR-1970 IN BINARY. IFDEF SWAPPER < COMMAND, JMP ACARG /[N1] SWAPPER OVERWRITES THIS WITH / INITIALIZATION ENTRY. AFTER / STARTUP, 'COMMAND' HOLDS THE FREE- / PARTITION FLAG IN THE SIGN BIT. /[N1] **NOTE** SWAPPER WILL OVERLAY / 3 LOCATIONS FOR THE INITIALIZE / LINKAGE. > INTT, 0 /INTERRUPT-LEVEL TEMPORARY T, 0 /NON-INTERRUPT LEVEL TEMPORARY DEBFLG, 0 /[N1] DEBUGGER FLAG *55 /[N1] IFNZRO KL8A < KL8LOC, MSABAD /POINTS TO FIRST FREE LOC FOR KL8A / IN SKIP CHAIN > ZBLOCK 70-. /[N1] RESERVED FOR FUTURE EXPANSION, / AND DECNET GLOBALS
/ / /[N1] FLAGS USED TO CONNECT SYSTEM TASKS. THESE /[N1] FLAGS ARE NOT USED BY THE EXEC ITSELF. / / *70 MCREF, 0 /MCR STARTUP EVENT FLAG. OS8HPR, 0 /[N1] POINTER TO THE TABLE OF / DEVICES FOR OS/8 SUPPLIED BY RTS/8 ODTBKF, 1 /[N1] ODT BREAKPOINT FLAG. OWNTTY, 1 /[N1] CONSOLE DEVICE OWNER, 1=TTY / TASK, 0=OS/8 BACKGROUND. FIMQDY, CDF 0 /[N1] FIELD OF INTEREST FOR MQ / DISPLAY, LEFT HERE BY THE MCR / "FI" COMMAND. ZBLOCK 100-. /[N1] RESERVED FOR FUTURE EXPANSION /SET UP EXEC LINKAGE IN FIELDS 1-7 IFZERO HGHFLD-10&4000 < FIELD 1 *20 /[N1] 0 /[N1] CDF 10 CIF 0 JMP CALIOF DSPOST XWAITM RDF /[N1] GET THE REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC. 0 /[N1] ODT ENTRY, WILL BE TASK PC. DCA .-2 /[N1] SAVE TASK AC. JMP 26 /[N1] >
/ IFZERO HGHFLD-20&4000 < FIELD 2 *20 /[N1] 0 /[N1] CDF 20 CIF 0 JMP CALIOF DSPOST XWAITM RDF /[N1] GET THE REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC. 0 /[N1] ODT ENTRY, WILL BE TASK PC. DCA .-2 /[N1] SAVE TASK AC. JMP 26 /[N1] > IFZERO HGHFLD-30&4000 < FIELD 3 *20 /[N1] 0 /[N1] CDF 30 CIF 0 JMP CALIOF DSPOST XWAITM RDF /[N1] GET THE REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC. 0 /[N1] ODT ENTRY, WILL BE TASK PC. DCA .-2 /[N1] SAVE TASK AC. JMP 26 /[N1] >
/ IFZERO HGHFLD-40&4000 < FIELD 4 *20 /[N1] 0 /[N1] CDF 40 CIF 0 JMP CALIOF DSPOST XWAITM RDF /[N1] GET REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC. 0 /[N1] ODT ENTRY, WILL GET TASK PC. DCA .-2 /[N1] SAVE TASK AC. JMP 26 /[N1] > IFZERO HGHFLD-50&4000 < FIELD 5 *20 /[N1] 0 /[N1] CDF 50 CIF 0 JMP CALIOF DSPOST XWAITM RDF /[N1] GET THE REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC. 0 /[N1] ODT ENTRY, WILL BE TASK PC. DCA .-2 /[N1] SAVE TASK AC. JMP 26 /[N1] >
/ IFZERO HGHFLD-60&4000 < FIELD 6 *20 /[N1] 0 /[N1] CDF 60 CIF 0 JMP CALIOF DSPOST XWAITM RDF /[N1] GET THE REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC. 0 /[N1] ODT ENTRY, WILL BE TASK PC. DCA .-2 /[N1] SAVE TASK AC. JMP 26 /[N1] > IFZERO HGHFLD-70&4000 < FIELD 7 *20 /[N1] 0 /[N1] CDF 70 CIF 0 JMP CALIOF DSPOST XWAITM RDF /[N1] GET THE REAL DATA FIELD AND RAR /[N1] LINK. CAL /[N1] DEBUG /[N1] 0 /[N1] WILL BE TASK AC. 0 /[N1] ODT ENTRY, WILL BE TASK PC. DCA .-2 /[N1] SAVE TASK AC. JMP 26 /[N1] > FIELD 0
/INTERRUPT ROUTINE *200 TS8LOC, CAFHLT /SO WE CAN START AT 200 IFNZRO TS8LOC-200 <SYSERR,_ERROR_> /OS8SUP NEEDS / THIS HERE IFDEF SWAPPER < NEWTSK, JMP COMMAND /DO SWAPPER INITIALIZATION > /(SEE SWAP TASK FOR DETAILS) IFNDEF SWAPPER < NEWTSK, ION > INTFGS, JMP I .+1 /GO AND FIND THE FIRST TASK TO RUN INTAC, FINDJ INTRPT, IFDEF OS8 < SINT /MUST BE FIRST SKIP IN INTERRUPT SKP / CHAIN! JMP I TS8LOC > DCA INTAC /SAVE AC IFNZRO PDP8E+PDP8A <GTF> /[N1] IFZERO PDP8E+PDP8A < /[N1] RAR /COMBINE LINK, IF AND DF INTO ONE RIB / WORD > DCA INTFGS USERSK, /VERY HIGH PRIORITY USER FLAG TESTS / GO HERE IFNZRO KL8A <MSABAD, NOP > /KL8A INTERRUPT / DISPATCHER IFZERO KL8A-2 <NOP> /NOP IS FASTER THAN '0' IFZERO KL8A-3 <NOP; NOP> IFNZRO PWRFAL <SPL> /SKIP ON POWER LOW JMP TSTCLK /NO MORE H.P. SKIPS - GO TO SKIP / CHAIN IFNZRO PWRFAL < JMP I (PWRFCD /[N3] GO SERVICE POWER FAIL >
/ / BEGINNING OF THE SKIP CHAIN LIST BSKCHN, DISMIS TSTCLK, CDF CIF 0 /ADDRESS FOLLOWED BY CDF CIF FIELD NOP /SET TO CLSK BY CLOCK ROUTINE JMP I BSKCHN DCDIF0, CDF CIF 0 /CLOCK HANDLER ALWAYS IN FLD 0 JMP I .+1 DISMIS /CHANGED BY CLOCK HANDLER (IF ANY) /SUBROUTINE TO POST AN EVENT FLAG AND DISMISS FROM /INTERRUPTS. ENTER WITH IOF, DF=D.F. OF EVENT FLAG, /AC=ADDRESS OF EVENT FLAG DSPOST, SNA JMP DISMIS /NO EVENT FLAG - JUST DISMISS DCA INTT AC4000 TAD I INTT /LINK=1 IF EVENT FLAG.LT.0, / LINK=0 IF.GT.0 DCA NEWTSK /SAVE OLD VALUE OF EVENT FLAG DCA I INTT /ZERO EVENT FLAG TO INDICATE EVENT / COMPLETION TAD NEWTSK SPA /** LINK MUST BE 0 HERE IF AC IS / NEGATIVE ** JMP .+3 /IF E.F. .LT. 0, TASK WAS WAITING / FOR EVENT JMS I (FREEJ /SO CLEAR "EVENT WAIT" BIT IN FLAG / WORD. EFWT!EORMWT /IF THE TASK WHICH WAS WAITING ON SNL CLA /THIS EVENT FLAG IS HIGHER PRIORITY JMP DISMIS /THAN THE TASK CURRENTLY RUNNING, TAD 0 /SUSPEND THE CURRENT TASK UNLESS WE / ARE IN A NON-INTERRUPTABLE ZONE IFDEF OS8 <RIB> /(NAMELY LOCS 0-77 OF A FIELD AND (7700 /NOT USED BY OS/8 BACKGROUND) SZA CLA /OR TASK SWITCHING HAS BEEN TAD TSWFLG /SPECIFICALLY INHIBITED BY THE SMA SZA CLA /SOFTWARE (BY MAKING TSWFLG LE 0) JMP STOPJ STA /IF TASK SWITCHING IS INHIBITED, DCA TSWFLG /SET FLAG TO INSURE A RESCAN OF THE JMP DISMIS /TASK LIST WHEN WE UNINHIBIT IT, / THEN DISMISS NORMALLY.
/ STOPJ, ISZ SVSFLG /IS THE STATE OF THE CURRENT TASK / WORTH SAVING? JMP NOSVST /NO - FORGET IT. TAD TASKX CLL RTL IFNZRO EAE < TAD TASKX /[N2] NEED TASK*5 FOR EAE. > TAD (TSTABL-1 DCA XR /SAVE THE CURRENT TASK'S STATE TAD INTFGS DCA I XR TAD 0 DCA I XR TAD INTAC DCA I XR IFNZRO MQ < IFZERO PDP8E <MQA> /[N2] IFNZRO PDP8E <SWP> /[N2] LEAVES THE MQ CLEAR /[N2] FOR EAE MODE TEST. DCA I XR /SAVE THE MQ > IFNZRO EAE < CLA SCA /[N2] FIRST GET THE STEP COUNTER. IFNZRO PDP8E < /[N2] ** NEXT 4 FOR PDP8/E ONLY ! DCA TASKX /[N2] ** AND SAVE IT FOR A MOMENT. DPSZ /[N2] ** DETERMINE MODE WE'ER IN. AC4000 /[N2] ** WILL SET AC=4000 IF MODE A. TAD TASKX /[N2] ** COMBINE WITH STEP COUNTER. > DCA I XR /[N2] NOW SAVE IT IN THE STATE TABLE > NOSVST, TAD NEWTSK /SET THE CURRENT PRIORITY TO THAT DCA TASKX / OF THE HIGHER PRIORITY TASK AND / ATTEMPT TO START IT. ION /ENABLE INTERRUPTS WITH THE "DON'T / SAVE STATE" FLAG ON TO ALLOW / FURTHER RESCHEDULING /THIS MEANS THAT IF ANYBODY WITH HIGHER PRIORITY THAN /"NEWTSK" GETS AN EVENT-FLAG-SETTING INTERRUPT NOW, WE'LL /JUST DASH OFF AND START HIM INSTEAD. IFDEF SWAPPER < TAD I INTT /GET TASK FLAGS WORD /(INTERRUPTS COME ON N O W !) SZA CLA /IF ITS 0 (RUNNABLE) THEN RUN IT, IF JMP I (FINDJ /ITS 4000 THEN GO SCHEDULE SWAPPER >
/CODE TO START UP A TASK /ENTER WITH TASK# IN "TASK", DF=0, ION, NO STATE (SVSFLG=0) STARTJ, IFZERO HGHFLD <ION> /INTERRUPTS ALREADY ON IF / CIF WORKS TAD TASKX CLL RTL IFNZRO EAE < TAD TASKX /[N2] NEED TASK*5 FOR EAE. > TAD (TSTABL-1 /FORM POINTER INTO TASK DCA XR /STATE TABLE STA IOF /OK, THINGS ARE GETTING SENSITIVE - DCA SVSFLG /TURN INTERRUPTS OFF AND RESET / SAVE-STATE FLAG TO "YES" TAD I XR DCA INTFGS TAD I XR DCA 0 /SIMULATE AN INTERRUPT FROM THE TASK TAD I XR DCA INTAC /AND DISMISS IT IFZERO EAE < /[N2] IFNZRO MQ < TAD I XR MQL /RESTORE MQ *** CAUSES ERRORS IF > > / MACHINE HAS NO MQ *** IFNZRO EAE < IFNZRO PDP8E < /[N2] FOR PDP8/E ONLY ! TAD I XR /[N2] PUT MQ IN AC, SWAB DOES MQL ! SWAB /[N2] AND FORCE EAE INTO MODE "B", TAD I XR /[N2] GET THE TASK'S STEP COUNTER ACS /[N2] DATA AND RESTORE THE SC. SPA CLA /[N2] (BIT 0 IS SET IF THE TASK WAS SWBA /[N2] USING MODE "A".) > IFZERO PDP8E < TAD I XR /[N2] FIRST MOVE THE MQ DATA TO A DCA MQARG /[N2] SAFE PLACE. TAD I XR /[N2] GET THE TASK'S STEP COUNTER, DCA .+3 /[N2] USE THE DATA TO DO A RIGHT AC4000 /[N2] SHIFT TO SET UP FOR THE LSR /[N2] NORMALIZE WHICH WILL LOAD 0 /[N2] THE STEP COUNTER FOR US. NMI /[N2] (THE PDP8 EAE CAN'T DO SCL). CLL CLA /[N2] CLEAN UP AFTER NORMALIZE. TAD MQARG /[N2] NOW WE CAN RESTORE THE MQ. MQL /[N2] > > /** NOW FALL INTO "DISMIS" ON NEXT PAGE **
/INTERRUPT DISMISS ROUTINE - ALSO USED TO START TASKS DISMIS, IFNZRO PDP8E+PDP8A < /[N1] SRQ /ANY OTHER INTERRUPTS PENDING? SKP /NO JMP USERSK /YES - SKIP PREAMBLE STUFF FOR / EXTRA SPEED > TAD INTFGS IFNZRO PDP8E+PDP8A < /[N1] IFNZRO HGHFLD <RTF> IFZERO HGHFLD <RAL> /RTF DOESN'T WORK RIGHT ON / 4K 8E'S CLA > IFZERO PDP8E+PDP8A < /[N1] IFDEF OS8 < TAD (700 /PROPAGATE USER-MODE BIT FROM BIT 5 / TO BIT 2 > CLL RTL RAL /USER-MODE BIT NOW IN LINK AND (70 /FAKE AN RTF IF NOT A PDP8E OR 8A TAD DCDF DCA DISCDF IFDEF OS8 < SZL /IF USER MODE WAS ON WHEN WE SUF /INTERRUPTED, TURN IT ON WHEN WE / DISMISS > AC4000 TAD INTFGS AND (70 /NOTE THAT THE LINK IS NOW RESTORED TAD DCDIF0 DCA DISCIF DISCIF, 0 DISCDF, 0 > TAD INTAC IFZERO -PDP8E-PDP8A&HGHFLD <ION> /[N1] FOR PRE 8E / OR 4K 8E / MACHINES JMP I 0 IFNZRO EAE < IFZERO PDP8E < MQARG, 0 /NEEDED FOR NON-PDP8E EAE. > >
/ /FOR PDP-12 DO I/O PRESET AT INITIAL START UP IFNZRO PDP12 < IOPRST, 0 TAD (20 /I/O PRESET BIT IN SPECIAL / FUNCTIONS REGISTER LINC /ENTER LINC MODE ESF /ENABLE SPECIAL FUNCTION PDP /BACK TO 8-MODE CLA JMP I IOPRST /RETURN TO EXEC START UP > PAGE
/RTS-8 EXECUTIVE - PROCESSES USER REQUESTS /CALLED BY: JMS 20 /IN ANY FIELD / ARGS / /CODE AT LOC 20 TURNS IOF, DOES CDF CUR AND / CIF 0 AND JUMPS HERE EXEC, DCA ACARG /SAVE POSSIBLE AC ARGUMENT TAD TSWFLG /TSWFLG=1 HERE UNLESS WE WERE SMA CLA /INTERRUPTED WHEN WE WERE IN THE / PAGE 0 CODE, IN WHICH CASE ITS -1 DCA TSWFLG / - ZERO IT IF IT WAS 1 ION /IT IS NOW OK TO TURN INTERRUPTS / BACK ON IFNZRO HGHFLD < RDF /[N1] > TAD ECDIF0 DCA EXRET /SAVE RETURN FIELD TAD I (LOC20 /GET LOC 20 OF THE CALLING FIELD DCA LOC20 /SAVE IT IN FIELD 0 IFDEF SWAPPER < TAD I LOC20 /SAVE A COPY OF THE COMMAND FOR DCA COMMAND /LATER IN CASE HE WANTS TO "FREE" > AC3777 AND I LOC20 /GET COMMAND MINUS WAIT BIT ISZ LOC20 TAD CMDJMP DCA .+1 /TURN COMMAND INTO DISPATCH JUMP HLT CMDJMP, JMP I .+1 XSEND /SEND MESSAGE TO A TASK XRECEIV /GET A MESSAGE FROM THE MESSAGE / QUEUE XWAITE /WAIT FOR AN EVENT FLAG TO BE POSTED XRUN /RUN A TASK (IF NOT BEING RUN) XSUSPND /SUSPEND EXECUTION OF A TASK XPOST /POST AN EVENT FLAG XSKPINS /INSERT SKIP INTO INTERRUPT CHAIN XDERAL /DERAIL A TASK XBLKARG /BLOCK TASK FOR REASON SPECIFIED / BY ARG XSENDW /SEND MESSAGE AND WAIT FOR / COMPLETION XUNBARG /UNBLOCK TASK FOR REASON SPECIFIED / BY ARG XTSTOP /FORCE A RESCHEDULE XWAITX /WAIT FOR EXACTLY THIS EVENT FLAG XDEBUG /[N1] PUT TASK IN DEBUG WAIT
/ROUTINE TO DERAIL A TASK'S EXECUTION INTO A SUBROUTINE XDERAL, TAD I LOC20 ISZ LOC20 DCA T /SAVE ADDR OF DERAIL SUBR TAD ACARG CLL RTL IFNZRO EAE < TAD ACARG /[N2] NEED TASK*5 FOR EAE. > TAD (TSTABL /GET POINTER INTO TASK STATE TABLE DCA MPTR CDF 0 TAD I MPTR AND (70 /GET INSTRUCTION FIELD TAD DCDF DCA DRLCDF ISZ MPTR TAD I MPTR /GET CURRENT TASK PC DRLCDF, HLT /CDF TO TASK FIELD DCA I T /STORE PC IN SUBR HEADER CDF 0 TAD T IAC DCA I MPTR /SET PC TO SUBR HEADER + 1 JMP EXRET /RETURN TO CALLING TASK /SUBROUTINE TO WAIT FOR MULTIPLE EVENTS /CALLED VIA JMS I 25 WITH INTERRUPTS OFF. /THIS ROUTINE SHOULD BE CALLED AFTER SCANNING THE MULTIPLE /EVENT FLAGS (WITH INTERRUPTS OFF) TO AVOID TURNING /INTERRUPTS ON BEFORE THE WAIT MASK IS PLACED IN TFTABL. /THE "BLKARG" CALL TO THE RTS EXEC WOULD TURN INTERRUPTS /ON (IN THE EXEC), THUS INVITING RACE CONDITIONS. XWAITM, 0 IFDEF SWAPPER < /THE "FREE PARTITION" FLAG DCA COMMAND /IS IN THE SIGN BIT OF THE AC > CLA CLL /CLEAR AC (IN CASE SWAPPER IS NOT /PRESENT) AND LINK (SO TSWAIT WILL / ZERO THE TASK AC) TAD XWAITM DCA LOC20 /FAKE A CALL TO EXEC (IN CASE WE / MUST WAIT) IFNZRO HGHFLD < RDF /[N1] > TAD ECDIF0 DCA EXRET DCA TSWFLG /THIS IS STILL PART OF THE FAKE CALL TAD I LOC20 /GET THE WAIT MASK ISZ LOC20 JMP I (TSWAIT /GO WAIT ON MASK
/INSERT A DEVICE SKIP INTO THE INTERRUPT CHAIN XSKPINS,TAD I LOC20 /GET THE ADDRESS OF THE SKIP - 2 ISZ LOC20 DCA T TAD I T SZA CLA /IF ARGUMENT LOC IS NON-ZERO, JMP EXRET /IT IS ALREADY IN THE SKIP CHAIN - / IGNORE TAD (DISMIS /CHAIN IT TO THE END OF THE CHAIN DCA I T ISZ T TAD ECDIF0 DCA I T IFNZRO HGHFLD < TAD EXRET /GET CDF TO NEW "LAST SKIP" INTCDF, CDF CIF 0 /CDF TO FLD OF OLD "LAST SKIP" AND / INHIBIT INTERRUPTS /**NOTE: THE IF IS NOW GARBAGE /DO NOT JUMP ANYWHERE! DCA INTCDF /UPDATE "LAST SKIP" FIELD TO NEW ONE > TAD T DCA I INTEND /CHAIN OLD SKIP TO NEW ONE ISZ INTEND IFNZRO HGHFLD < TAD INTCDF > DCA I INTEND STA TAD T DCA INTEND /UPDATE POINTER TO END OF SKIP CHAIN /FALLING INTO EXRET FIXES / INSTRUCTION FIELD EXRET, HLT /CDF CIF RETURN FIELD (ALSO INHIBIT / INTERRUPTS) IFZERO HGHFLD <IOF> /INTERRUPTS OFF FOR ISZ! ISZ TSWFLG /ALLOW TASK SWITCHING (SKIPS IF / RESCAN NECESSARY) IFZERO HGHFLD < JMP .+3 /NO RESCAN NECESSARY ION /TASK SWITCHING STILL INHIBITED, JMP ECDIF0 /TURN ION AND STOP CURRENT JOB AND / GO TO RESCAN ION /NOW ITS SAFE TO TURN INTERRUPTS / BACK ON > JMP I LOC20 /RETURN TO CALLING TASK ECDIF0, CDF CIF 0 /OOPS - WE MUST TASK SWITCH JMP I (TSTOP /IMMEDIATELY! GO STOP THIS TASK AND / RUN SOMEONE ELSE INTEND, BSKCHN
/ IFNDEF SWAPPER < /RTS-8 SCHEDULER - SCANS TASK FLAGS TABLE TO DETERMINE THE /HIGHEST PRIORITY RUNNABLE TASK - RUNS WITH INTERRUPTS ON /(SOMETIMES) AND IS STATELESS. FINDJ, CLA CLL IAC /CODE TO FIND FIRST RUNNABLE TASK DCA TASKX /INITIALIZE TASK NUMBER DCA SVSFLG /THE MACHINE STATE IS UNIMPORTANT CLA IAC /AND WE SHOULD RE-ENABLE TASK DCA TSWFLG /SWITCHING SO THAT IF A TASK BECOMES TAD (TFTABL /RUNNABLE AFTER WE SCAN IT, IT WILL DCA XR /INTERRUPT THE SCAN LOOP AND RUN. FINDJL, IFNZRO HGHFLD <CIF 0> /AS WE SEARCH A TASK'S ENTRY IFZERO HGHFLD <IOF> / IN THE LIST TAD I XR /WE ASSUME THAT TASK'S PRIORITY. SNA CLA /LOOK FOR FIRST TABLE ENTRY OF 0 JMP I (STARTJ /(THERE HAS TO BE ONE - NAMELY THE / NULL TASK) IFZERO HGHFLD <ION> ISZ TASKX /BUMP THE TASK NUMBER (AND PRIORITY) /ALLOW INTERRUPTS FOR ONE CYCLE JMP FINDJL /SINCE "TASKX" IS BIGGER THAN THE / CURRENT REJECTED TASK > IFDEF SWAPPER < /RTS-8 SCHEDULER - SCANS TASK FLAGS TABLE TO DETERMINE THE /HIGHEST PRIORITY RUNNABLE TASK - RUNS WITH INTERRUPTS ON /(SOMETIMES) AND IS STATELESS. /THIS SCHEDULER, USED WITH THE SWAPPER, IS SLIGHTLY SLOWER /THAT THE PREVIOUS SCHEDULER, USED WITHOUT THE SWAPPER. /NOTE: THIS ROUTINE IS VERY PRONE TO RACE CONDITIONS. /DO NOT MODIFY IT UNLESS YOU VERY CAREFULLY CHECK OUT WHAT /MIGHT HAPPEN IF AN INTERRUPT OCCURS AFTER EACH STATEMENT
/ ACTION, SNL /IS HE NONRESIDENT? JMP I (STARTJ /NO: START HIM UP IFNZRO EXEC-SWPWT <SYSERR,_ERROR_> /CALEXC.NE.SWPWT TAD CALEXC /AC='SWPWT' CIF 0 /[02] ONCE HE IS IN SWAP WAIT, /[02] ENSURE SWAPPER WILL BE TAKEN /[02] OUT OF RUN WAIT !! DCA I T /PUT HIM IN SWAP WAIT TAD (-RUNWT-1 AND I (SWAPPER+TFTABL DCA I (SWAPPER+TFTABL /TAKE SWAPPER OUT OF RUN /WAIT AND GO FIND SOMEONE ELSE; / HOPEFULLY SWAPPER. **NOTE: AC MAY / BE NON-ZERO ON ENTRY ** FINDJ, CLA IAC /CODE TO FIND FIRST RUNNABLE TASK DCA TASKX /INITIALIZE TASK NUMBER DCA SVSFLG /THE MACHINE STATE IS UNIMPORTANT /IN CASE WE ARE TASK-SWITCHED OUT OF /THE SCAN LOOP WE WILL NOT SAVE / STATE CLA IAC /NOW (NOT EARLIER) WE CAN RE-ENABLE DCA TSWFLG /TASK SWITCHING SO THAT IF A TASK TAD (TFTABL /BECOMES RUNNABLE AFTER WE SCAN IT, DCA T /IT WILL INTERRUPT THIS SCAN LOOP / AND RUN FINDJL, IFNZRO HGHFLD <CIF 0> /AS WE SEARCH A TASK'S ENTRY IFZERO HGHFLD <IOF> /IN THE LIST ISZ T /(BUMPING TO NEXT ENTRY) TAD I T /WE ASSUME THAT TASK'S PRIORITY CLL RAL /PUT NON-RESIDENT BIT INTO LINK SNA CLA /LOOK FOR THE FIRST TABLE ENTRY OF 0 JMP ACTION /FOUND ONE, START HIM UP IFZERO HGHFLD <ION> ISZ TASKX /BUMP THE TASK NUMBER (AND OUR / PRIORITY) JMP FINDJL /ALLOW INTERRUPTS FOR 1 CYCLE SINCE /'TASK' IS BIGGER THAN CURRENT /REJECTED TASK WE MAY RESCHEDULE OUT / OF HERE /NXR, 0 /[N3] REPLACED "NXR" WITH "T". > PAGE
/SEND A MESSAGE TO A TASK /***** N O L I T E R A L S O N T H I S P A G E ! XSENDW, STA /SET OR XSEND, DCA SWTFLG /CLEAR WAIT FLAG TAD I LOC20 ISZ LOC20 /GET THE DCA ACARG /TASK NUMBER FROM THE ARGUMENT LIST TAD I LOC20 /GET THE ADDRESS OF THE MESSAGE DCA MSGADR TAD I MSGADR SNA CLA /IS THE MESSAGE ALREADY IN A QUEUE? JMP MSGFRE /NO AC7775 TAD LOC20 DCA LOC20 /BUMP PC BACK TO DO CALL AGAIN MSEFWT, TAD MSGADR JMP I PWAITS /WAIT FOR MESSAGE TO BE FREE MSGFRE, ISZ LOC20 TAD ACARG /GET THE ADDRESS OF THE TARGET JMS SRCOMN /TASK'S MESSAGE QUEUE POINTER DCA MSGCDF /SAVE CDF TO NEW MESSAGE'S FIELD TAD DCDF ADDTOQ, DCA MPTCDF /SAVE CDF TO FIELD OF CURRENT QUEUE / POINTER CLA IAC TAD MPTR DCA MPT2 /GET POINTER TO SECOND WORD OF TAD I MPT2 / POINTER DCA T /SAVE ADDRESS OF NEXT QUEUE ENTRY TAD I MPTR /FIRST WORD IS A CDF SNA /ZERO TERMINATES THE QUEUE JMP ENDOFQ DCA NXTCDF /SAVE CDF RCVPTR, NXTCDF, HLT AC3777 AND I T /FIRST WORD OF MESSAGE HEADER IS / TASK# CIA CLL /COMPARE TO NUMBER OF SENDING TASK TAD TASKX /IF NUMBER IS LOWER WE INSERT SNL CLA /THE MESSAGE BEFORE THIS ONE JMP ENDOFQ CLA IAC TAD T DCA MPTR /OTHERWISE GO ON TO THE NEXT TAD NXTCDF /QUEUE ENTRY JMP ADDTOQ
/COME HERE WHEN WE HAVE FOUND THE PLACE TO INSERT / THE MESSAGE ENDOFQ, MPTCDF, HLT /SET DF TO FIELD OF PREVIOUS POINTER TAD I MPTR DCA MPTCDF /SAVE PREVIOUS CDF TAD MSGCDF /LINK THE NEW MESSAGE BETWEEN TWO DCA I MPTR /EXISTING MESSAGES ON THE QUEUE TAD MSGADR DCA I MPT2 /OK - HALF THE LINKAGE IS DONE IOF /MUST TURN INTERRUPTS OFF TO CALL / FREEJ! TAD ACARG JMS I PFREEJ /CLEAR MESSAGE WAIT BIT FOR RECEIVER MSGWT!EORMWT /(DO IT NOW SO DF WILL BE CORRECT / LATER) TAD TASKX /*** CODE IN THIS RANGE MUST NOT / TOUCH LINK *** MSGCDF, HLT /* NOW TO THE MESSAGE'S DATA FIELD ION /* WE'RE SAFE - TURN INTERRUPTS ON DCA I MSGADR /* STORE THE SENDING TASK NUMBER ISZ MSGADR /* TAD MPTCDF /* DCA I MSGADR /* STORE CDF TO NEXT MESSAGE IN Q ISZ MSGADR /* TAD T /* DCA I MSGADR /* STORE ADDR OF NEXT MESSAGE IN Q ISZ SWTFLG /* SHOULD WE WAIT ON THIS MESSAGE? JMP I PPOSTEX /* NO - RUN RECEIVER IF ITS /* HIGHER PRIORITY, ELSE EXIT AC7776 /DON'T WORRY ABOUT RECEIVER - /WAITING WILL FORCE RESCAN OF TASK / LIST - JMP MSEFWT /GO WAIT ON MESSAGE EVENT FLAG /** DF MUST BE SET TO CALLER'S / FIELD HERE ** SRCOMN, 0 /SUBROUTINE USED BY SEND AND RECEIVE CLL RAL /GET POINTER TO A TASK'S TAD PMSGTBL /MESSAGE QUEUE POINTER DCA MPTR CDF 0 AC7776 TAD I PEXRET JMP I SRCOMN
/RECEIVE A MESSAGE FROM THE TASK'S MESSAGE QUEUE XRECEIV,TAD TASKX JMS SRCOMN /GET THE MESSAGE QUEUE PTR FOR THIS / TASK DCA STOCDF /SAVE CDF TO CALLING FIELD TAD DCDF RCVLP, DCA PRVCDF /SAVE PREVIOUS Q ENTRIES' FIELD TAD I MPTR /GET MESSAGE QUEUE POINTER SNA /IF ZERO, THERE ARE NO MESSAGES IN JMP NOMSG /THE Q SO HANG THE TASK DCA CHNCDF CLA IAC TAD MPTR DCA MPT2 /GET POINTER TO SECOND WORD OF Q TAD I MPT2 / POINTER DCA RCVPTR SWTFLG, CHNCDF, HLT /CDF TO FIELD OF Q ENTRY AC3777 /IGNORE SIGN BIT AND ACARG /ACARG CONTAINS TASK DEDICATION / (IF ANY) CIA SZA /IS RECEIVER DEDICATED TO ANYONE? TAD I RCVPTR /YES - CHECK ORIGIN OF THIS MESSAGE ISZ RCVPTR CLL RAL /HIGH-ORDER (WAIT BIT) IRRELEVANT SNA CLA /CAN THIS MESSAGE BE RECEIVED? JMP RCVOK /YES - PASS IT ON TAD RCVPTR /NO - CHAIN TO NEXT MESSAGE IN Q DCA MPTR TAD CHNCDF JMP RCVLP RCVOK, TAD I RCVPTR /GET FIRST WORD OF ENTRY DCA T ISZ RCVPTR TAD I RCVPTR PRVCDF, HLT /SET FIELD OF PREVIOUS Q ENTRY DCA I MPT2 /SET PREV Q ENTRIES' POINTER (BOTH TAD T /WORDS) TO THE CONTENTS OF THIS Q DCA I MPTR /ENTRIES' POINTER, REMOVING THIS / ENTRY FROM THE Q CLA IAC /FORM A POINTER TO THE FIRST WORD OF TAD RCVPTR /INFORMATION IN THE REMOVED MESSAGE MSGADR, STOCDF, HLT DCA I LOC20 /AND STORE IT IN THE FIRST ARGUMENT TAD CHNCDF /RETURN WITH CDF TO MESSAGE IN AC STOCD2, ISZ LOC20 /SKIP ARG JMP I PEXRET
/LITERALS: PWAITS, WAITS PFREEJ, FREEJ PPOSTEX,POSTEX PMSGTBL,MSGTBL PEXRET, EXRET NOMSG, TAD ACARG /LOOK AT AC AGAIN SPA CLA /DID USER WANT TO WAIT IF NO / MESSAGE? JMP STOCD2 /NO IFNZRO .&1000 <SYSERR,_ERROR_> /PAGE TOO BIG /WAIT FOR MESSAGE WAITM3, AC7776 TAD LOC20 DCA LOC20 /MOVE PC BACK TO "JMS 20" STL /SET LINK TO PRESERVE AC ACROSS / "TSTOP" TAD (MSGWT /BLOCK TASK ON MESSAGE WAIT
/COME HERE WITH BLOCKING BITS IN AC. TASK AC WILL /BE CLEARED IF LINK IS 0, PRESERVED IF LINK IS 1 TSWAIT, DCA BLKMSK /ENTER HERE WITH BLOCKING BITS IN AC TSWATX, TAD TASKX /ENTER HERE WITH BLOCKING BITS IN / "BLKMSK" TAD (TFTABL /GET INDEX INTO JOB FLAGS TABLE. DCA T TAD BLKMSK /GET BLOCKING BITS CDF 0 DCA I T /NO NEED TO OR THEM IN - WORD WAS / ZERO BEFORE. ION /(IN CASE WE CAME FROM "WAITE" OR / "WAITM") SNL /SHOULD WE CLEAR TASK AC? TSTOP, DCA ACARG /ENTER HERE WITH TASK AC IN AC XTSTOP, TAD TASKX /TO STOP THE CURRENT TASK BUT NOT / BLOCK IT. CLL RTL /GET A POINTER INTO THE TASK'S STATE / TABLE ENTRY IFNZRO EAE < TAD TASKX /[N2] NEED TASK*5 FOR EAE. > TAD (TSTABL-1 DCA XR CDF 0 TAD DEBFLG /[N1] PUT THE TASK IN DEBUG WAIT ? SZA /[N1] JMP TSTO1 /[N1] YES, ("FLAGS" WORD IN AC). IFNZRO HGHFLD < TAD I (EXRET CLL RAR RTR TAD I (EXRET TAD (-5023 /5023=6203+(6203 SHIFTED RIGHT 3) > TSTO1, DCA I XR /STORE RETURN IF AND DF=IF DCA DEBFLG /[N1] CLEAR THE DEBUGGER FLAG. TAD LOC20 DCA I XR /STORE RETURN PC TAD ACARG DCA I XR /STORE RETURN AC IFNZRO MQ < IFZERO PDP8E <MQA> /[N2] IFNZRO PDP8E <SWP> /[N2] LEAVES THE MQ CLEAR /[N2] FOR EAE MODE TEST. /EVEN PRESERVE THE MQ OVER MONITOR DCA I XR /CALLS (WHAT THE HECK, ITS ONLY 2 > / INSTRUCTIONS)
/ IFNZRO EAE < CLA SCA /[N2] FIRST GET THE STEP COUNTER. IFNZRO PDP8E < /[N2] ** NEXT 4 FOR PDP8/E ONLY ! DCA T /[N2] ** AND SAVE IT FOR A MONEMT. DPSZ /[N2] ** DETERMINE MODE WE'RE IN. AC4000 /[N2] ** WILL SET AC=4000 IF MODE A. TAD T /[N2] ** COMBINE WITH STEP COUNTER. > DCA I XR /[N2] NOW SAVE IT IN THE STATE TABLE > IFDEF SWAPPER < TAD COMMAND SPA CLA /FREE THE PARTITION? WIPCAL, JMP I (XFREE /YES: GO DO IT > JMP I (FINDJ /NO: FIND NEXT TASK TO RUN /SCHEDULE A TASK TO BE RUN XRUN, TAD (RUNWT JMP UNBLOK XUNBARG,TAD I LOC20 /UNBLOCKING CODE IN ARGUMENT ISZ LOC20 UNBLOK, DCA UNBMSK /AC CONTAINS REASON FOR UNBLOCKING / TASK "ACARG" TAD ACARG IOF /FREEJ IS AN INTERRUPT-LEVEL ROUTINE JMS I (FREEJ /[N1] REMOVE THE GIVEN BLOCKING BIT UNBMSK, 0 ION POSTEX, SNL CLA /SHOULD THE NEW TASK BE RUN NOW? JMP I (EXRET /NO JMP TSTOP /YES-PUT TASK TO SLEEP WITHOUT / BLOCKING IT /SUSPEND EXECUTION OF A TASK XSUSPND,TAD (RUNWT JMP BLOK
/ XBLKARG,TAD I LOC20 /BLOCKING CODE IN ARGUMENT ISZ LOC20 BLOK, DCA BLKMSK /SAVE BLOCKING CODE TAD ACARG /GET TASK TO BE BLOCKED SNA JMP TSWATX /0 MEANS CURRENT TASK! / NOTE THE LINK IS RANDOM HERE BUT SINCE ACARG=0 / IT DOESN'T MATTER IF WE CLEAR IT OR NOT CDF 0 TAD (TFTABL DCA T TAD BLKMSK /GET THE BLOCKING FLAG(S) CMA AND I T TAD BLKMSK /OR THEM INTO THE TASK FLAG WORD DCA I T JMP I (EXRET /THIS DOESN'T AFFECT US, JUST RETURN /WAIT FOR EVENT FLAG XWAITX, STA /USE 'ACARG' AS FLAG (-1 INDICATES / W A I T X ) XWAITE, DCA ACARG TAD I LOC20 /GET ADDRESS OF EVENT FLAG ISZ LOC20 /SEND HAS ACARG RANDOM BUT NOT -1 WAITS, DCA T /ENTER HERE FROM SEND IFZERO HGHFLD <IOF> /INHIBIT INTERRUPTS IFNZRO HGHFLD <CIF 0> /WHILE TESTING FLAG! TAD I T /EVENT FLAG IS IN SAME FIELD AS CALL SNA CLA /ZERO MEANS EVENT COMPLETED JMP I (EXRET /SO EXIT IMMEDIATELY IFNZRO HGHFLD <IOF> /INTERRUPTS MUST BE OFF BETWEEN / SETTING EF AND SETTING EF WAIT! AC4000 /SET EVENT FLAG TO TASK NUMBER TAD TASKX /WITH HIGH-ORDER BIT ON TO INDICATE DCA I T /THAT TASK IS WAITING FOR EVENT / COMPLETION TAD (EFWT ISZ ACARG /WAS THIS A WAITE OR WAITX? JMP TSWAIT /WAITE; AND BLOCK CURRENT TASK ON / EVENT WAIT / ** NOTE LINK=0 SO ACARG WILL BE CLEARED ** AC7775 /WAITX TAD LOC20 /BUMP PC BACK TO CAL DCA LOC20 /ALSO CLEAR LINK TAD (EORMWT JMP TSWAIT
/ /POST AN EVENT FLAG XPOST, TAD I LOC20 /GET DATA FIELD OF EVENT FLAG ISZ LOC20 DCA .+1 BLKMSK, HLT /CDF TO IT AC4000 TAD I ACARG /ADDRESS WAS IN AC AT CALL DCA T DCA I ACARG /ZERO EVENT FLAG SNL /WAS A TASK WAITING ON EVENT FLAG? JMP I (EXRET /NO - WE'RE DONE TAD T /YES - LOW ORDER BITS ARE TASK DCA ACARG / NUMBER TAD (EFWT!EORMWT JMP UNBLOK /UNBLOCK THIS TASK FROM EVENT FLAG / WAIT PAGE
/ROUTINE TO UNBLOCK A TASK'S EXECUTION /ENTER WITH TASK# IN AC, INTERRUPTS OFF, /UNBLOCKING BIT IN CALL+1 /[N1] ROUTINE MOVED TO HERE. FREEJ, 0 CDF 0 TAD (TFTABL DCA INTT TAD I FREEJ /GET UNBLOCKING BIT ISZ FREEJ /BUMP RETURN POINTER CMA AND I INTT DCA I INTT /REMOVE THE FLAG FROM THE TASK FLAG / WORD TAD I INTT IFDEF SWAPPER < CLL RAL /IGNORING NON-RESIDENT WAIT, > SNA CLA /IF THE TASK IS NOW RUNNABLE TAD TASKX /AND HAS A HIGHER PRIORITY THAN THE TAD (TFTABL /CURRENTLY RUNNING TASK, RETURN / WITH THE LINK ON. CIA STL TAD INTT CLA /OTHERWISE RETURN WITH THE LINK OFF. JMP I FREEJ
/ / COME HERE TO FREE A PARTITION / / ENTER WITH ION, AC=0, LINK=DON'T CARE / / /[N1] ROUTINE MOVED HERE FROM THE SWAPPER TASK. IFDEF SWAPPER < XFREE, TAD TASKX TAD (-SWAPPER-1) /IS THIS TASK LOWER PRIORITY SPA / THAN SWAPPER ? JMP I (FINDJ /NO: BAD FREE COMMAND CLL RAL TAD (RESTBL DCA T /POINTS TO RESTBL WORD 1 TAD I T SNA /IS TASK REALLY NONRES? JMP I (FINDJ /NO: RETURN AND (7774 /YES: ERASE FLAG BITS DCA T /POINTS TO PARTBL WORD 1 AC7776 AND I T DCA I T /FLAG PARTITION "FREE" TAD TASKX TAD (TFTABL DCA T /POINTS TO TASK'S FLAG WORD IFNZRO HGHFLD <CIF 0> IFZERO HGHFLD <IOF> STL RAR TAD I T DCA I T /FLAG TASK NONRESIDENT TAD (-RUNWT-1 AND I (SWAPPER+TFTABL DCA I (SWAPPER+TFTABL /CANCEL SWAPPER RUN WAIT IFZERO HGHFLD <ION> /BE NICE SINCE SPACE IS NO / PROBLEM - YET.... JMP I (FINDJ /FIND NEXT TASK TO RUN >
/ / / PUT THE CALLING TASK IN DEBUG WAIT / / SAVE THE TASK'S STATUS AND CALL THE DEBUGGER / / / /[N1] NEW CODE FOR PUTTING A TASK IN "DEBUG" /[N1] WAIT, FOR USE WITH ODT/8. XDEBUG, AC4000 /GET THE CALLING TASK'S LINK AND AND ACARG / SAVE IT A MO. DCA DEBFLG AC3777 AND ACARG /GET THE CALLING TASK'S REAL DATA CLL RTR / RIGHT JUSTIFY IT, AND RDF / "OR" IN THE TASK'S IF, TAD DEBFLG / ADD IN THE LINK, AND DCA DEBFLG / SAVE AS THE "FLAGS" WORD. TAD I LOC20 /GET TASK'S AC AND PUT IT WHERE DCA ACARG /"TSWAIT" EXPECTS IT. ISZ LOC20 TAD I LOC20 /DO THE SAME FOR THE TASK'S PC. DCA LOC20 /(PC IS 1 PAST THE DEBUG CALL.) CDF 0 IFDEF ODT < TAD (-EORMWT-RUNWT-1) /FIRE UP THE DEBUGGER, IF AND I (ODT+TFTABL) /HE'S AROUND. DCA I (ODT+TFTABL) TAD TASKX /SAVE THE TASK NUMBER FOR ODT TO SAY DCA ODTBKF / A BREAKPOINT HAS OCCURRED. > STL /SET THE LINK TO PRESERVE THE AC. TAD (DEBWT) /GO HANG THE TASK IN DEBUG WAIT. JMP I (TSWAIT) /NOW WASN'T THAT EASY.
/ /[N3] POWERFAIL CODE ADDED HERE A LA STEVE ROOT'S /[N3] VERSION [01]. THE CODE WON'T FIT WHERE STEVE /[N3] PUT IT IF MY CODE IS USED TO SAVE AND RESTORE /[N3] THE STEP COUNTER WHEN TASK SWITCHING. / IFNZRO PWRFAL < PWRFCD, TAD 0 DCA INTT /SAVE LOCATION ZERO TAD (JMP I PFLADR DCA 0 /SET UP 0 FOR RESTART IFNZRO MQ < /[N3] IFZERO PDP8E <MQA> /[N3] SAVE MQ IFNZRO PDP8E <SWP> /[N3] LEAVES THE MQ CLEAR /[N3] FOR EAE MODE TEST. DCA MQSAV /[01] > IFNZRO FULEAE < CLA SCA /[N3] FIRST GET THE STEP COUNTER. IFNZRO PDP8E < /[N3] ** NEXT 4 FOR PDP8E ONLY ! DCA EAESAV /[N3] ** AND SAVE IT A MONENT. DPSZ /[N3] ** DETERMINE WHAT MODE WE'RE IN. AC4000 /[N3] ** WILL SET AC=4000 IF MODE A. TAD EAESAV /[N3] ** COMBINE WITH STEP COUNTER. > DCA EAESAV /[N3] SAVE THE STEP COUNTER. > PWRAGN, HLT /DON'T TRY ANYTHING FANCY IFNZRO MQ < /[N3] MQSAV, 0 /[01] SAVE MQ HERE > IFNZRO FULEAE < /[N3] IFNZRO PDP8E < /[N3] EAESAV, 0 /[01] SAVE EXTRA EAE STATUS HERE > > IFNZRO PDP8A < /[N3] PWT1, 0 /[01] TEMPORARIES FOR PDP8A DELAY LOOP PWT2, 0 /[01] >
/ / COME HERE WHEN POWER COMES BACK ON / PWFLEF, 0 /POWER FAILURE EVENT FLAG PFLRTN, CLL CLA /** MUST BE AT PWFLEF+1 ** IFNZRO PDP8E+PDP8A < /[N3] CAF /[01] IN CASE ONLY A POWER DIP > IFNZRO PDP12 < /[N3] JMS I (IOPRST) /[N3] IN CASE ONLY A POWER DIP > IFNZRO PDP8A < /[N3] 6103 /[01] CLEAR THE POWER LOW FLAG, > /[01] FOR PDP8A ONLY / / / /[01] PUT ANY OTHER SPECIFIC FLAG CLEARING HERE THAT /[01] IS NOT HANDLED BY THE POWER FAIL TASK (PWRF). /[01] I.E. PDP8A OPTION BOARD, ETC. / / / IFNZRO PDP8A < /[N3] TAD (7700 /[01] SET UP DELAY LOOP FOR PDP8A DCA PWT1 /[01] DELAY1, ISZ PWT2 /[01] JMP DELAY1 /[01] ISZ PWT1 /[01] JMP DELAY1 /[01] SPL /[01] DID POWER GO DOWN AGAIN!?!? SKP /[01] SKIP IF OK JMP PWRAGN /[N3] POWER DOWN AGAIN, TRY AGAIN > /[01] IFDEF RX8A < /[01] IFNDEF RXDVCD <RXDVCD=75> /[N3] RXDVCD^10+6005 /[N3] FLOPPY READS FIRST BLOCK ON /[01] POWER UP, SO JMP .-1 /[01] WAIT FOR IT TO FINISH UP /[01] SAME FOR ANY OTHER FLOPPY > /[01] CONTROLLERS! CLL CLA TAD INTT /RESTORE LOCATION OF POWER LOW DCA 0 / INTERRUPT
/ IFZERO FULEAE < /[01] IFNZRO MQ < /[01] TAD MQSAV /[01] MQL /[01] PUT BACK MQ, EASY CASE > /[01] > /[01] IFNZRO FULEAE < /[01] IFZERO PDP8E < /[01] AC4000 /[01] SHIFT PATTERN LSR /[01] SHIFT SO COMING NORMALIZE SETS /[01] STEP COUNTER EAESAV, 0 /[01] STEP COUNT SAVED HERE NMI /[01] CLA /[01] NORMALIZE MAY HAVE GARBAGED AC TAD MQSAV /[01] NOW GET MQ MQL /[01] > /[01] IFNZRO PDP8E < /[N3] FOR PDP8E ONLY ! TAD MQSAV /[01] GET MQ IN AC, SWAB DOES MQL ! SWAB /[N3] AND FORCE EAE INTO MODE "B", TAD EAESAV /[01] GET THE SAVED STEP COUNTER ACS /[N3] DATA AND RESTORE THE SC. SPA CLA /[N3] (BIT 0 IS SET IF THE TASK WAS SWBA /[N3] USING MODE "A".) > /[01] > /[01] TAD (PWFLEF /POST THE POWER-FAIL INTERRUPT TO POSTDS / EXECUTE THE POWER-FAIL TASK / (IF ANY) > /[N3] END OF POWER FAIL CONDITIONAL PAGE
/DUMMY TABLE ENTRIES: / /EACH TASK OVERLAYS ITS ENTRY WHEN IT LOADS MSGTBX, ZBLOCK NTASKS^2 0;0 /MESSAGES FOR NULL TASK TSTABX, IFZERO EAE <ZBLOCK NTASKS^4> IFNZRO EAE <ZBLOCK NTASKS^5> 0 .+1 /FIELDS, PC, AC FOR NULL TASK DCA SVSFLG /NULL TASK RUNS STATELESS JMP . IFNZRO EAE <0> /STEP COUNTER, IF "EAE" = 1 TFTABX, IFNZRO NTASKS&100 < 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1; 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1; 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1> IFNZRO NTASKS&40 < 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1; 1;1;1;1;1;1;1;1> IFNZRO NTASKS&20 < 1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1> IFNZRO NTASKS&10 < 1;1;1;1;1;1;1;1> IFNZRO NTASKS&4 <1;1;1;1> IFNZRO NTASKS&2 <1;1> IFNZRO NTASKS&1 <1> 0 /NULL TASK ALWAYS RUNNABLE IFNZRO TFTABX-TFTABL-1 <TBLERR,_ERROR_> IFDEF SWAPPER < *RESTBL ZBLOCK NTASKS-SWAPPER^2 *PARTBL ZBLOCK PARTNS^4 > IFNZRO KL8A < *KL8ACT KL8ACT, 0 HLT /SAFETY HALT IN CASE USER JMP . /FORGETS TO ASSEMBLE KL8ASR.PA HLT /[01] AND ANOTHER SET FOR POWERFAIL! JMP . /[01] > IFDEF DDCMP < FIELD DDCFLD%10 *LCBTAB ZBLOCK MAXLIN^LCBSIZ > IFDEF NSP < FIELD NSPFLD%10 *CCBTAB ZBLOCK MAXCCB^2 > FIELD 0 $=$=LHN=$=$



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