/25 CLOCK HANDLER FOR RTS8 V3 / / #10 CONVERT V2B TO MACREL / #11 V2B BUG FIXES:DATE; DBL ISZ RACE / #12 DEFAULT TO PDP8A CLOCK / #13 .TASK MACRO; CDF,CIF; DEFAULT TYPE / #14 INIT CODE: NEEDS CDF ON TAD I (7777 / #15 FIXED BUG WITH 'RTFLD' S.R. / #16 NEATENED UP FOR MACREL S.R. / REMOVED SOME CONDITIONALS / MOVED SOME CONDITIONALS TO PARAMETER FILE / ADDED ALARM SUPPORT (CALLS TO USER CODE ON CLOCK TICK) / #17 MADE ALARM SUPPORT OPTIONAL (CLKLRM PARAMETER) / MADE ALARMS RING IMMEDIATELY UPON CLOCK INTERRUPT (NO DELAYS) / ADDED CLOCK COMMAND 4 TO MEAN POST SPECIFIED EVENT FLAG / ADDED CLOCK REQUEST TYPES 1,2,3 (CLASSES EFFECTED BY CANCEL) / CHANGED CANCEL SO THAT REQUESTS ARE PHYSICALLY REMOVED FROM QUEUE) / CLEANED UP DISPATCHER (FROM CLOCK QUEUE) / #18 BUM A WORD FOR PDP8A CASE / #19 LEVEL=0 TO SECT STATMENTS / #20 CHANGE TASK MACRO / #21 FIXED BUG IN POST EF CODE STAN / #22 PAGE OVERFLOW FIX FOR 8A / #23 FIX TIMING WINDOW FOR 1 TICK REQ. / #24 RTFLD CHANGE / #25 MAKE AN .FSECT TO SAVE SPACE / VERS=25. / / / / / / / / / / /COPYRIGHT (C) 1974,1975,1976,1977,1978,1979 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 /THE RTS-8 CLOCK HANDLER ACCEPTS MESSAGES FROM THE USER AND INSERTS /ENTRIES INTO A CLOCK QUEUE. AS ENTRIES IN THE CLOCK QUEUE BECOME /DUE, THEY ARE REMOVED FROM THE QUEUE AND THE REQUEST IS DECODED /AND EXECUTED. /THE CLOCK HANDLER MUST RUN IN FIELD 0 AS IT IS TREATED SPECIALLY /BY THE INTERRUPT CODE IN RTS-8 /THE FORMAT OF CLOCK MESSAGES ARE: /WORD 1 USED AS EVENT FLAG FOR MESSAGE /WORDS 2-3 USED BY RTS-8 /WORD 4 COMMAND WORD - BITS ARE: / BITS 0-2 FUNCTION: / 0 - SET EVENT FLAG AFTER TIMED INTERVAL / 1 - RUN SPECIFIED TASK AFTER INTERVAL / 2 - DERAIL SPECIIFIED TASK AFTER INTERVAL / 3 - RUN SPEC. TASK PERIODICALLY AFTER INTERVAL / 4 - SET SPECIFIED EVENT FLAG AFTER SPECIFIED INTERVAL / 5 - RESERVED / 6 - RESERVED / 7 - CANCEL ALL TIMED REQUESTS FOR SPECIFIED TASK / / BITS 3-4 SPECIFY REQUEST TYPE (1,2, OR 3) - 0 MEANS NO SPECIFIC TYPE / ON CANCEL, TYPE 0 MEANS CANCEL ALL REQUEST TYPES FOR THIS TASK / BITS 5-11 SPECIFY TASK - 0 MEANS TASK IS SENDING TASK /WORD 5 HIGH ORDER OF TIME (IN TICKS) /WORD 6 LOW ORDER OF TIME /WORDS 7-8(OPT) DERAIL ADDRESS OR RESCHEDULE PERIOD / OR (IN CASE OF COMMAND 5) EVENT FLAG ADDRESS (CDF;ADDR PAIR) /FORMAT OF CLOCK QUEUE ENTRY: /WORD 1 POINTER TO NEXT ENTRY (0 IF LAST) /WORD 2 AND 3 NUMBER OF TICKS FROM PREV ENTRY UNTIL THIS ONE - / NUMBER IS NEGATIVE, LOW ORDER IN WORD 2 /WORD 4 COMMAND WORD (FROM MESSAGE) / 0 SET EVENT FLAG IN WORDS 5,6 (CDF;ADDR PAIR) / 1 RUN TASK / 2 DERAIL TASK (ADDRESS IN WORD 5) / 3 RUN TASK PERIODICALLY (PERIOD IN WORDS 5,6) / 4 SAME AS 0 /WORD 5 AND 6 WORDS 7 AND 8 OF MESSAGE (ADDR OF EVENT FLAG IF FN=0 OR 4) /THIS CLOCK HANDLER WILL RUN ON MANY HARDWARE CONFIGURATIONS /THE PARAMETER "CLKTYP" CONTROLS THE CONFIGURATION /LEGAL VALUES OF CLKTYP ARE: / 0 DK8EA LINE CLOCK, DK8EC CRYSTAL CLOCK / 1 KW12A PROGRAMMABLE CLOCK / 2 PDP 8/A CLOCK (INCLUDED ON OPTION BOARD 1 OF PDP8A) / 3 DK8EP PROGRAMMABLE CLOCK / 4,6,10,ETC USER-DEFINED CLOCK TYPES /VARIOUS CLOCK IOT DEFINITIONS: / PARTS OF THIS CHANGED IN FORM /*******************************************************/ / / / IOT'S FOR CLOCK TYPE 0 DK8EA, DK8EC / / / /*******************************************************/ CLSK0= 6133 CLEI= 6131 CLDI= 6132 /*******************************************************/ / / / IOT'S FOR CLOCK TYPES 1 AND 3 KW12A, DK8EP / / / /*******************************************************/ CLZE= 6130 /DK8EP ONLY! CLSK1= 6131 CLLR= 6132 /CALLED CLDE ON DK8EP CLAB= 6133 CLEN1= 6134 CLSA= 6135 /*******************************************************/ / / / IOT'S FOR CLOCK TYPE 2 8/A CLOCK / / / /*******************************************************/ CLEN2= 6135 /PDP 8/A CLOCK INTERRUPT ENABLE CLCL= 6136 /PDP 8/A CLOCK FLAG CLEAR CLSK2= 6137 /PDP 8/A CLOCK SKIP TICKS= HERTZ%SHERTZ /CLOCK TASK PARAMETERS: .XSECT CLOCKX, LEVEL=0 FIELD RTS8 CLKXR, 0 IFDEF QTST < .GLOBAL CLQ,CLF,ZROENT > /THIS IS THE CLOCK QUEUE CREATOR - IT IS INVOKED WHEN THE CODE /AT "CLKLP" NOTICES THAT THE INPUT MESSAGE QUEUE IS NON-EMPTY. .RSECT CLOCKT, LEVEL=0 FIELD CLOCKX .EXTERNAL MSGTBL .EXTERNAL CLKMIS,CLKSKP .GLOBAL ALARML,ALARMH .ZTERNAL TODL,TODH,DATE,YEAR .TASK CLOCK .SBTTL GET A MESSAGE GETMSG, CAL RECEIV /GET MESSAGE ADDRESS MADDR, 0 DCA MSGCDF /CDF IS IN AC ON RETURN XTRA1, /INITIALIZED IN CASE FUNCT IS "SET E.F." MSGCDF, HLT /SET TO DF OF MESSAGE AC7775 /SAVE ADDRESS OF MESSAGE EVENT FLAG TAD MADDR /IN XTRA2 - XTRA1&2 ARE NOW SET UP DCA XTRA2 /IN CASE COMMAND WAS "SET EVENT FLAG" TAD I MADDR /GET COMMAND AND (177 SNA CLA /CHECK FOR EXPLICIT TASK ARGUMENT TAD I XTRA2 /NONE - USE SENDING TASK AND (177 /(MESSAGE E.F. MAY HAVE 4000 BIT ON) TAD I MADDR DCA CLKCMD /SAVE CLOCK COMMAND TAD MSGCDF DCA CT /SET UP CDF OF EVENT FLAG IN "POST" CALL TAD MADDR DCA CLKXR /SET UP AUTO-XR FOR FETCHING ARGS TAD I CLKXR /GET HIGH ORDER INTERVAL DCA TH /SAVE IT TAD I CLKXR /GET LOW ORDER INTERVAL SNA /IF ZERO, MAKE IT 1 - THIS INTRODUCES A SMALL IAC /(LT .025%) ERROR IN SOME INTERVALS, BUT DCA TL /ELIMINATES THE KILLER 0 INTERVAL TAD CLKCMD /GET COMMAND AND (7000 SNA CLA /CHECK FOR "SET OUR EVENT FLAG" COMMAND JMP NOIMEF /YES - SO DON'T SET EVENT FLAG NOW TAD I CLKXR /GET TWO MORE ARGUMENTS EVEN THOUGH WE DCA XTRA1 /ONLY NEED THEM FOR COMMANDS 2 AND 3. TAD I CLKXR DCA XTRA2 AC7775 /WE MUST FIGURE OUT WHERE THE TAD MADDR /MESSAGE STARTED SINCE WE DESTROYED XTRA2 CAL POST CT, 0 /FALLS THROUGH NOIMEF, CDF .FLD TAD CLKCMD AND (7000 TAD (1000 /CHECK FOR 7000 SNA CLA /IS THIS A CANCEL? JMP I (CLQDEL /YES, DELETE ENTRIES FROM QUEUE JMS CLQINS /NO, NOW INSERT THE MESSAGE INTO THE CLOCK QUEUE JMP I (CLKLP .SBTTL INSERT INTO CLOCK QUEUE /SEARCH THE CLOCK QUEUE TO FIND WHERE TO PUT THIS REQUEST /THE REQUEST TO BE QUEUED SHOULD BE IN THE WORDS: /CLKCMD, TH, TL, XTRA1, XTRA2 CLQINS, 0 TAD (CLQ L$: DCA CQ TAD I CQ /GET NEXT QUEUE ENTRY DCA CT TAD CT DCA CLKXR /ACCESS BODY OF QUEUE ENTRY WITH AUTO-XR TAD I CT CLL /INHIBIT INTS WHILE LOOKING AT Q ENTRY IOF /TO KEEP IT FROM CHANGING ON US. SNA CLA /IS IT THE TERMINAL ONE? JMP INHERE /YES - INSERT HERE TAD I CLKXR TAD TL DCA TTL /SUBTRACT INTERVAL TO THIS QUEUED EVENT TAD I CLKXR /FROM INTERVAL TO THE CURRENT REQUEST SNA /WATCH FOR 0 INTERVAL - SCREWS UP LINK JMP 1$ /NULL INTERVALS DON'T AFFECT SEARCH SZL CLL IAC /ADD IN CARRY AFTER ZERO TEST! TAD TH SNL /IF THE REQUEST OCCURS BEFORE THE CURRENT JMP INHERE /QUEUE ENTRY, BREAK THE QUEUE HERE DCA TH TAD TTL /SINCE QUEUED INTERVALS ARE CUMULATIVE, DCA TL /USE THE UPDATED INTERVAL FROM NOW ON 1$: ION /ALLOW INTERRUPTS BETWEEN ENTRIES TAD CT JMP L$ /GO TO NEXT QUEUE ENTRY .SBTTL INSERT COMMAND IN QUEUE /FOUND WHERE IT GOES - NOW PUT IT THERE INHERE, DCA MADDR /SAVE HIGH ORDER OF DIFFERENCE TAD CLF DCA I CQ /LINK THE FIRST ENTRY ON THE FREE LIST STA /INTO THE QUEUE AT THIS POINT TAD CLF /USE XR TO SET UP NEW ENTRY DCA CLKXR TAD I CLF /REMOVE FREE LIST ENTRY DCA CLF /FROM FREE LIST TAD CT /COMPLETE THE INSERTION BY SETTING UP DCA I CLKXR /THE POINTER TO THE NEXT QUEUE ENTRY TAD TL /PUT THE NEGATIVE OF THE INTERVAL CIA CLL /UNTIL THIS ENTRY IS EXECUTABLE INTO DCA I CLKXR /THE NEW QUEUE ENTRY, LOW ORDER CML RAL /WORD FIRST (FOR EASY INCREMENTING) / /MOVE ION FROM HERE TAD TH CIA DCA I CLKXR ION /FINISHED DBL-PREC ARITHMETIC - ALLOW INTS TAD CLKCMD DCA I CLKXR /PUT COMMAND WORD IN QUEUE ENTRY TAD XTRA1 DCA I CLKXR /AND EXTRA WORDS FOR COMMAND TAD XTRA2 DCA I CLKXR ISZ CT /NOW UPDATE THE FOLLOWING ENTRY TAD TTL /TO REFLECT THE REDUCED NUMBER DCA I CT /OF TICKS BETWEEN ENTRIES ISZ CT TAD MADDR /** WE MAY BE "UPDATING" ZROENT ** DCA I CT /** WE NEED TWO SCRATCH LOCS AFTER ZROENT ** JMP I CLQINS /RETURN ZROENT, 0 /PERMANENT FINAL ENTRY IN CLOCK QUEUE TH, 0 /TH AND TL ALSO SERVE AS THE FIRST TWO TL, 0 /WORDS OF "ZROENT" CQ, 0 XTRA2, 0 CLKCMD, 0 CLF, BEGFRE /INITIALIZED TO BEGINNING OF FREE LIST TTL, 0 CMDLST, CMD.0 /MARKTIME OR POST EF CMD.1 /SCHEDULE CMD.2 /TIMEOUT CMD.3 /SCHEDULE PERIODICALLY PAGE .SBTTL MAIN LOOP /MAIN CLOCK HANDLER LOOP - SEE IF ANYTHING TO DO CLKEF, 4000+TASK /SIGNIFICANT TICK EVENT FLAG CLKWT, WAITM /SPECIAL MONITOR ENTRY TO WAIT EORMWT /FOR EVENT FLAG OR MESSAGE. CLKLP, IOF /INTERRUPTS OFF FOR DELICATE CODE! TAD CLKEF SNA CLA /SIGNIFICANT TICK? JMP GETICK /YES - PROCESS IT TAD I (CLF SZA CLA /ANY ROOM IN CLOCK QUEUE? TAD I (TASK^2+MSGTBL /YES - CONSIDER MESSAGES SNA CLA /CAN WE TAKE A MESSAGE? JMP CLKWT /NO - GO INTO EORMWT ION /YES - RESTORE INTERRUPTS JMP I (GETMSG /AND GO RECEIVE MESSAGE GETICK, TAD (4000+TASK /RESET EVENT FLAG DCA CLKEF /TO "WAITING" STATE ION /TURN INTERRUPTS BACK ON /RE-ENABLE VERY OLD, BUT CORRECT CODE /FIXQ INIT'S POINTERS FOR US FIXQ, CLA IAC TAD CLQ DCA CLKXR /IT IS POSSIBLE FOR THE INTERVAL TAD I CLKXR /BETWEEN EVENTS ON THE QUEUE TO BE 0 - SNA CLA /THIS MEANS THE EVENTS COME UP SIMULTANEOUSLY. TAD I CLQ /WE MUST CHECK FOR SIMULTANEITY HERE SNA CLA /(WATCHING OUT FOR THE END OF THE QUEUE!) JMP CLKLP /IF NONE, GO WAIT FOR THE NEXT TICK /SIMULTANEOUS REQUEST - GO PROCESS IT /FALL INTO CLCKOV / ! / ! / ! / ! / ! / \ ! / / \ ! / / \!/ / . .SBTTL BONG! / BBBB OOO N N GGGGG / B B O O NN N G / BBBB O O N N N G GG - THE CLOCK HAS STRUCK! / B B O O N NN G G / BBBB OOO N N GGGGG CLKOV, TAD I CLQ /REMOVE THE FIRST ENTRY FROM THE CLOCK QUEUE DCA TEMP /AND PLACE IT ON THE FREE LIST. TAD I (CLF /THIS ALLOWS US TO PLAY WITH IT TO OUR DCA I CLQ /HEARTS CONTENT WITHOUT MISSING ANY TICKS TAD CLQ DCA I (CLF TAD TEMP DCA CLQ TAD I CLKXR DCA I (CLKCMD TAD I (CLKCMD RTL RTL AND L3 /ISOLATE COMMAND (4=0) TAD (CMDLST DCA TEMP TAD I TEMP DCA TEMP TAD I CLKXR /3 OUT OF 4 WANT THIS! JMP I TEMP /DISPATCH THROUGH TABLE /***********************/ / / / (3) SCHED. PER. / / / /***********************/ CMD.3, DCA I (TH /GET RESCHEDULE INTERVAL TAD I CLKXR DCA I (TL TAD I (TH DCA I (XTRA1 /USE RESCHED INTERVAL AS NEW SCHEDULE TAD I (TL /AND RESCHEDULE INTERVAL DCA I (XTRA2 JMS I (CLQINS /INSERT THE NEW REQUEST IN THE CLOCK QUEUE /***********************/ / / / (1) SCHEDULE / / / /***********************/ CMD.1, CLA TAD I (CLKCMD /GET TASK NUMBER AND (177 /OUT OF COMMAND WORD CAL L3, RUN /AND RUN THE JOB NOW. JMP FIXQ /CLEAN UP THE QUEUE ENTRY /TEST FOR DERAIL REQUEST /***********************/ / / / (2) TIMEOUT / / / /***********************/ CMD.2, DCA ADR$ /SAVE DERAIL SUBROUTINE ADDRESS TAD I (CLKCMD AND (177 /GET TASK NUMBER FROM COMMAND WORD CAL DERAIL /DERAIL THE TASK ADR$: 0 JMP FIXQ /***********************/ / / / (0) MARK TIME / / OR POST EF / / / /***********************/ CMD.0, DCA TEMP /SAVE DATA FIELD OF EVENT FLAG TAD I CLKXR /GET ADDRESS OF EVENT FLAG CAL POST /POST THE EVENT FLAG ASSOCIATED TEMP, 0 /WITH THIS TIMER REQUEST JMP FIXQ /RESUME PROCESSING .SBTTL CLOCK INTERRUPT ROUTINE /INSERT CONDITIONALIZED FLAG CLEARS FOR USER-DEFINED CLOCK HERE. /THIS LOCATION COULD BE SET BY INITIALIZATION CODE, /IF WE WANT TO GET RID OF THESE CONDITIONALS. /ALSO, BUMPING 'CLKCNT' ALWAYS WILL WORK (BUT IS INEFFICIENT) LRMINT, TAD ALARMH SNA CLA /SEE IF WE WANT TO GO TO USER JMP CLKINT /NO ALARMH, 0 /YES, USER SETS THIS TO CIF CDF HISFLD JMS I ALARML /CALL USER SUBROUTINE /BE CALLED CLKINT, IFNZRO CLKTYP&1 /CLEAR KW12/DK8EP FLAG IFZERO CLKTYP&1 < IFZERO CLKTYP-2 < CLCL /CLEAR PDP 8/A CLOCK FLAG CLA /JUST IN CASE?? > IFNZRO TICKS-1 < ISZ CLKCNT /COUNT CLOCK TICKS PER SOFTWARE TICK POSTDS /UNLESS COUNT=1 - THEN WHY BOTHER? TAD (-TICKS /RESTORE FULL COUNT DCA CLKCNT > > CLA IAC /** AC MAY NOT BE 0 HERE IF KW12 OR DK8EP ** TAD CLQ /SAVE POINTER TO LOW-ORDER TICK COUNT DCA CLIPTR /OF FIRST QUEUE ENTRY ISZ TODL JMP 1$ /BUMP TIME-OF-DAY ISZ TODH JMP 1$ TAD MIDNTH /T.O.D. CLOCK OVERFLOWS AT MIDNIGHT - DCA TODH /WE MUST RESET TO A SPECIAL FUDGE TO TAD MIDNTL /ASSURE THAT IT WILL HAPPEN AGAIN DCA TODL /NEXT MIDNIGHT. TAD DATE TAD (10 DCA DATE /BUMP DATE 1 DAY, THE CRUDE WAY 1$: TAD I CLQ SZA CLA /IF QUEUE IS NOT EMPTY, ISZ I CLIPTR /BUMP LOW-ORDER COUNT POSTDS /NOTHING DOING ISZ CLIPTR /INCREMENT BOTH HALVES AT INTERRUPT LEVEL ISZ I CLIPTR /TO AVOID RACE CONDITIONS! POSTDS /BUT SEE ALSO END OF 'GETICK' TAD (CLKEF /SET EVENT FLAG TO START DEQUEUER RUNNING POSTDS /AS WE MAY HAVE REACHED A SIGNIFICANT TIME CLIPTR, 0 /INTERRUPT-LEVEL POINTER CLQ, ZROENT /QUEUE INITIALLY EMPTY ALARML, 0 /USER SETS THIS TO SUBROUTINE ADDRESS TO IFNZRO TICKS-1 < CLKCNT, -TICKS > /HERE WE COMPUTE THE NUMBER OF TICKS IN A DAY /AS A DOUBLE WORD QUANTITY = 250600*SHERTZ /NOTE: REFERRING BACK TO EDIT 15 OR EARLIER, THE CONDITIONAL ON DAYL / IS NOT NECESSARY BECAUSE DAYL CAN NEVER BE 0. MIDNTH, -<25^SHERTZ+<6^SHERTZ%100>>-1 MIDNTL, -<600^SHERTZ> PAGE .SBTTL DELETE ENTRY FROM QUEUE .FSECT CLOCKF FIELD CLOCKX / WHOLE ROUTINE IS NEW CLQDEL, TAD (CLQ /START AT BEGINNING OF QUEUE (A VERY GOOD PLACE TO START) L$: DCA CQ$ /STORE POINTER TO PREVIOUS CHUNK TAD I CQ$ /GET NEXT QUEUE ENTRY ADDRESS DCA CT$ /SAVE IT TOO TAD CT$ DCA CLKXR /LIKE TO USE AUTO-INDEX REGISTER TAD I CT$ /GET POINTER TO NEXT QUEUE ENTRY IOF /DELICATE CODE REQUIRES EXTRAORDINARY PRECAUTIONS SNA CLA /IS THIS THE TERMINAL ENTRY? JMP I (CLKLP /YES, DONE TAD I (CLKCMD /NO, LOOK AT COMMAND AND (600 /CHECK REQUEST TYPE FIELD SZA CLA /GENERAL REQUEST? TAD (600 /NO, SPECIFIC REQUEST REQUIRES MASK OF 777 TAD (177 /YES, MASK OF 177 USED TO ALLOW MATCH ON ANY REQUEST TYPE DCA MASK$ /SET MASK APPROPRIATELY TAD I CLKXR /SAVE WORDS 2 & 3 DCA TL$ TAD I CLKXR DCA TH$ TAD I CLKXR /GET COMMAND WORD FROM QUEUE ENTRY CIA TAD I (CLKCMD /COMPARE TASK NUMBERS AND MASK$ /TO EITHER 7 OR 9 BITS OF ACCURACY (INCLUDING REQUEST TYPES) SZA CLA /MATCH? JMP 1$ /NO TAD I CT$ /YES, GET NEXT QUEUE ENTRY DCA I CQ$ /POINT PREVIOUS ENTRY TO NEXT ENTRY TAD I (CLF DCA I CT$ /POINT US TO FREE LIST TAD CT$ DCA I (CLF /WE ARE NOW NEW START OF FREE LIST TAD CQ$ DCA CT$ /MOVE TO NEXT QUEUE ENTRY TAD I CT$ IAC DCA TMP$ /POINT TO LOW OF NEXT GUY TAD I TMP$ CLL /DO A DOUBLE-PRECISION ADD OF TIMES TAD TL$ DCA I TMP$ ISZ TMP$ /POINT TO HIGH OF GUY RAL /LINK BECOMES CARRY TAD I TMP$ TAD TH$ DCA I TMP$ 1$: ION /ALLOW INTERRUPTS BETWEEN ENTRIES TAD CT$ JMP L$ /GO TO NEXT QUEUE ENTRY CQ$: 0 CT$: 0 TL$: 0 TH$: 0 MASK$: 0 TMP$: 0 .SBTTL INITIALIZATION CODE (GENERAL) .RSECT CLOCKT /CLOCK QUEUE FREE LIST - ALSO INITIALIZATION CODE BEGFRE, START, IOF /IOF WHEN MESSING WITH SKIP CHAIN!! TAD (CLKLRM SZA CLA /DOES USER WANT ALRAMS? TAD (LRMINT-CLKINT /YES, USE LONGER INTERRUPT ROUTINE TAD (CLKINT DCA I (CLKMIS CDF 10 /ZXCVZXCV TAD I (7666 /GET OS/8 DATE WORD DCA DATE /SET RTS DATE FROM IT TAD DATE /GET THREE LOW ORDER BITS OF YEAR AND (7 DCA YEAR /HOLD THESE WHILE GET THE REST OF IT CDF 0 /PHYSICAL 0 FOR OS8 DATA! TAD I (7777 /GET TWO HIGH BITS OF OS8 YEAR CDF .FLD RTR RTR AND (30 TAD YEAR /GIVING YEAR-1970 DCA YEAR /WHICH IS EXACTLY CORRECT TAD I (MIDNTH DCA TODH /SET TIME TO MIDNIGHT (AS GOOD AS ANY TIME) TAD I (MIDNTL DCA TODL .SBTTL SPECIFIC CLOCK INITIALIZATION /INSERT INITIALIZATION CODE FOR USER-DEFINED /CLOCK HERE - MUST ENABLE INTERRUPTS AND SET RATE. / WHOLE PAGE IS NEW TAD I (CLKLST+CLKTYP 1$: DCA 1$ /GET ADDRESS OF THIS SPECIFIC CLOCK'S INITIALIZATION CODE JMS I 1$ /CALL THAT CODE JMP FREELP CLKLST, TYPE0 TYPE1 TYPE2 TYPE3 /*******************************************************/ / / / CLOCK TYPE 0 INITIALIZATION DK8EA, DK8EC / / / /*******************************************************/ TYPE0, 0 TAD (CLSK0 DCA I (CLKSKP CLEI JMP I TYPE0 /*******************************************************/ / / / CLOCK TYPE 1 INITIALIZATION KW12 / / / /*******************************************************/ TYPE1, 0 JMS CMN TAD (300 /FORCE CLOCK BUFFER INTO COUNTER AND CLEN1 /ENABLE KW12 INTERRUPTS CLA /THIS DOESN'T CLEAR AC EITHER JMP I TYPE1 /*******************************************************/ / / / CLOCK TYPE 2 INITILAIZATION PDP-8/A CLOCK / / / /*******************************************************/ TYPE2, 0 CLA IAC CLEN2 /ENABLE CLOCK INTERRUPTS CLA /(JUST IN CASE) TAD (CLSK2 DCA I (CLKSKP JMP I TYPE2 /*******************************************************/ / / / CLOCK TYPE 3 INITIALIZATION DK8EP / / / /*******************************************************/ TYPE3, 0 STA CLZE /ZERO COMMAND REGISTER ON DK8EP TAD (5311-4100 /5310 = ENABLE INTS, 1 KHZ, MODE 1 JMS CMN JMP I TYPE3 CMN, 0 TAD (4100 /4100 = 1 KHZ, MODE 1 CLLR /LOAD COMMAND REGISTER CLA /CLLR DOESN'T CLEAR AC TAD (-TICKS CLAB /SCALE DOWN CLOCK TO SOFTWARE RATE CLA /DOES NOT CLEAR AC TAD (CLSK1 DCA I (CLKSKP JMP I CMN .SBTTL INITIALIZATION OF QUEUE /CLOCK QUEUE INITIALIZATION - /THIS CODE IS WRITTEN TO SKIP EVERY SIXTH WORD SINCE IT IS /SETTING THESE WORDS TO QUEUE POINTERS. /** NO LITERALS IN THIS CODE! ** ZBLOCK .-BEGFRE%6^6+BEGFRE+7-. /MOVE US TO THE 2ND WORD OF A 6 WD BLOCK FREELP, TAD FREPTR TAD F6 DCA I FREPTR /CHAIN EACH QUEUE ENTRY TO THE NEXT ONE TAD FREPTR SKP 0 /THIS LOC GETS DESTROYED BY OUR LOOP! TAD FRELIM SMA CLA JMP INIXIT /DONE - END INITIALIZATION CODE TAD I FREPTR /GET NEW QUEUE ENTRY ADDRESS SKP 0 DCA FREPTR JMP FREELP INIXIT, DCA I FREPTR /ZERO LAST POINTER ION JMP I PCLKLP /START WAITING FOR CLOCK TICKS 0 FREPTR, BEGFRE F6, 6 FRELIM, 13-ENDFRE /SO WE NEVER GO PAST "ENDFRE" PCLKLP, CLKLP PAGE IFZERO CLKQLN^6+BEGFRE-.&4000 < ZBLOCK CLKQLN^6+BEGFRE-.+5 /+5 FOR SAFETY > /MAKE SPACE FOR ENTRIES IF MORE THAN 21 DESIRED ENDFRE= . $$$