ASMB,R,Q,C HED * BASIC SCHED AND TRAP ROUTINES * 92076-1X014 REV. 2001 NAM SCHD,7 92076-1X014 REV.2001 800213 92076-12001 * * ************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * PRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * ************************************************************** ***************************************************************** * * * * NAME: TIME SCHEDULING ROUTINES * SOURCE: 92076-18014 * RELOC: PART OF 92076-12001 * PGRM: B.J.L. * * * * * RTE BASIC SCHEDULER ROUTINES * * * **************************************************** * * THIS MODULE CONTAINS THOSE ROUTINES USED BY THE * BASIC INTERPRETER TO PERFORM PRIORITY * SCHEDULING AND EXECUTION OF TASKS * **************************************************** * * ENTRY POINTS: * ENT TTYS,SSETP,ENABL,DSABL,TRNON,SSTRT * * EXTERNAL REFERENCES: * EXT ERROR,TIME,EXEC EXT $LIBR,$LIBX EXT .ENTR,TRAP#,TSNXT,TSEND,TSTBL,TSTIM,TSCNT,TSPTR EXT FINDS,TRMAK,TRDEL EXT TRTBL,TRPTR,TRNXT,TRFLG EXT TRMSK,TRPNO,SEKNO,PRINO * EXT .FAD,.FMP,.FSB,.FDV,FLOAT,IFIX SEQNO EQU SEKNO * * SUP PRESS MULTIPLE LISTING **************************************************** SKP ***** * ** CNVRT ** CONVERT TIME FROM FLOATING POINT HHMMSS FORM * TO FLOATING POINT SECONDS * * DLD TIME IN FLOATING POINT HHMMSS FORM * JSB CNVRT * RETURN .A.&.B.= FLOATING POINT SECONDS * * EXTERNALS REQUIRED: * EXT ..FCM * ***** * CNVRT NOP DST WHOLE SAVE INCOMING VALUE (HHMMSS) JSB .FDV DEF F.100 JSB IFIX JSB FLOAT DST HHMM HHMM= INT(HHMMSS/100) JSB .FDV DEF F.100 JSB IFIX JSB FLOAT DST HH HH= INT(HHMM/100) JSB .FMP DEF F.100 JSB ..FCM JSB .FAD DEF HHMM DST MM MM=HHMM-HH00 DLD HHMM JSB .FMP DEF F.100 JSB ..FCM JSB .FAD DEF WHOLE DST SS SS=HHMMSS-HHMM00 DLD HH JSB .FMP DEF F.60 JSB .FAD DEF MM JSB .FMP DEF F.60 JSB .FAD .A.&.B.= (HH*60+MM)*60+SS SECONDS DEF SS JMP CNVRT,I * SKP ***** * ** BSERR ** BASIC SCHEDULER ERROR ROUTINE * * LDA ADDRESS OF ERROR NUMBER * JSB BSERR * RETURN * * ***** * BSERR NOP STA BSER1 JSB $LIBX DEF *+1,I *791228* DEF *+1 JSB ERROR DEF *+3 BSER1 NOP (ADDRESS OF ERROR NUMBER) DEF SCHED (ADDRESS OF STRING "SCHED") JSB $LIBR OCT 177777 *791228* JMP BSERR,I RETURN * * SKP * * * * CHECK FOR OUT OF RANGE ON THE STATEMENT #'S (BETWEEN 1 AND 9999) * FOR ROUTINES START, SETP, TRNON. * * CALLING SEQUENCE: * * LDA * JSB CKST# * ERROR RETURN ISSUE ERROR #8 * CONTINUE EXECUTION * * * * THIS ROUTINE WAS ADDED 791228 BY B.J.L. * * * CKST# NOP STA HOLD SAVE # SZA,RSS 0? JMP CKSTE YES SSA NEGATIVE? JMP CKSTE YES ADA M10K >9999? SSA,RSS JMP CKSTE YES LDA HOLD RESTORE VALUE OK! ISZ CKST# RETURN P+2 JMP CKST#,I CKSTE LDA AD8 JMP CKST#,I * HOLD NOP AD8 DEF .8 .8 DEC 8 M10K DEC -10000 *800212** * * * SKP ***** * ** SSETP ** MAKE TRAP TABLE ENTRY WITH GIVEN SEQ NBR AND PRIORITY * * JSB SSETP * DEF *+3 * DEF SEQUENCE NUMBER * DEF PRIORITY * RETURN * ***** * SETPA NOP SETPB NOP SSETP NOP JSB .ENTR RETRIEVE DEF SETPA PARAMETERS JSB $LIBR OCT 177777 *791228* LDA SETPA,I JSB CKST# CHECK FOR IN RANGE *791228* JMP SETPE FOR STATEMENT #: NO,ERROR *791228* STA SEQNO YES,SEQUENCE NUMBER LDB SETPB,I ******************************ADDED 791228*********************** SZB,RSS ERROR IF 0 JMP SETP4 SSB ERROR IF NEG. JMP SETP4 ADB M100 ERROR IF >99 SSB,RSS JMP SETP4 LDB SETPB,I RESTORE B ***************************791228******************************** STB PRINO PRIORITY CLA ZERO IS DEFAULT VALUE FOR STA TRPNO TRAP NUMBER OF ENTRY LDA SEQNO GET SEQ NBR JSB FINDS LOOK FOR ENTRY WITH THAT SEQ NBR JMP SETP2 NONE FOUND, MAKE NEW ENTRY LDB TRPTR FOUND, LDA 1,I SAVE ENTIRE FIRST WORD STA SEQNO SINCE TRAP BIT MAN BE SET INB LDA 1,I GET SECOND WORD OF ENTRY, AND TRMSK EXTRACT TRAP NBR STA TRPNO AND SAVE FOR MAKING NEW ENTRY JSB TRDEL THEN REMOVE THIS ENTRY SETP2 JSB TRMAK MAKE NEW ENTRY ***********************CHANGED 791228****************************** JMP SETP3 NO ROOM JMP SETP5 RETURN SETP3 LDA AD2 TRAP TABLE FULL JMP SETPE SETP4 LDA AD7 PRIORITY OUT OF RANGE SETPE JSB BSERR SETP5 JSB $LIBX DEF SSETP,I *791228* * M100 DEC -100 * * SKP ****** * ** TTYS ALLOWS THE USER TO SCHEDULE A TASK (GOSUB) WITH A ** TRAP BY TYPING ANY KEY ON AN AUXILLIARY TELETYPE. * * * JSB TTYS * DEF *+3 * DEF * DEF * RETURN * * * NOTE: IF LOGICAL UNIT # IS LESS THAN 7 THEN AN ERROR * MESSAGE 'ERROR TTYS-1' IS PRINTED. * UNIT NOP TRAPN NOP TTYS NOP JSB .ENTR DEF UNIT LDA UNIT,I GET UNIT# AND GIVE ERROR IF LESS ADA M7 THAN 7 SSA JMP ERR ERROR LDA UNIT,I GET LU# IOR B2000 MASK IN CONTROL CODE STA SNPAR JSB EXEC ENABLE DEF *+3 AUXILLIARY DEF .3 TERMINAL DEF SNPAR LDA TRAPN,I GET TRAP # JSB $LIBR BREAK FENCE OCT 177777 *791228* STA TRAP# STORE TRAP NUMBER JSB $LIBX SEW UP THE FENCE DEF TTYS,I *791228* * ERR JSB ERROR ERROR RETURN DEF *+3 DEF .1 DEF ERRM JMP TTYS,I SKP * ***** * ** ENABLE ** ENABLE TRAP TABLE ENTRY ASSOC. WITH GIVEN SEQ NBR * * JSB ENABL * DEF *+2 * DEF SEQUENCE NBR * RETURN * * NOTE: ATTEMPT TO ENABLE NON-EXISTENT TRAP TABLE ENTRY * RESULTS IN TRANSFER TO ERROR ROUTINE. * IF SEQ NBR IS ZERO, ALL ENTRIES ARE ENABLED ***** * ENABA NOP ENABL NOP JSB .ENTR DEF ENABA JSB $LIBR OCT 177777 *791228* LDA ENABA,I RETRIEVE SEQUENCE NUMBER SZA,RSS ZERO MEANS ENABLE ALL ENTRIES JMP ENAB1 SSA IF VALUE IS NEG. ERROR *791228* JMP ENABE *791228* JSB FINDS LOOK FOR IT IN TRAP TABLE JMP ENABE NOT FOUND LDB TRPTR FOUND INB LDA 1,I GET SECOND WORD OF ENTRY IOR BIT15 SET ENABLE BIT STA 1,I JMP ENAB4 RETURN ENABE LDA AD4 JSB BSERR JMP ENAB3 RETURN ENAB1 LDB TRTBL ENAB2 CPB TRNXT END OF TABLE JMP ENAB4 YES, RETURN INB LDA 1,I GET SECOND WORD OF ENTRY IOR BIT15 SET ENABLE BIT STA 1,I INB GO TO NEXT ENTRY JMP ENAB2 LOOP ENAB4 STB TRFLG ENABLE TRAP TABLE SEARCH ENAB3 JSB $LIBX DEF ENABL,I *791228* SKP ***** * ** DSABL ** DISABLE TRAP TABLE ENTRY ASSOC WITH GIVEN SEQ NBR * * JSB DSABL * DEF *+2 * DEF SEQUENCE NUMBER * RETURN * * NOTE: SEQ NBR=0 MEANS DISABLE ALL ENTRIES * SEQ NBR POSITIVE MEANS DISABLE ASSOC ENTRY * SEQ NBR NEGATIVE MEANS DELETE ASSOC. ENTRY FROM TABLE * * NOTE: ENTRY NOT FOUND CAUSES TRANSFER TO ERROR ROUTINE * ***** DSABA NOP DSABL NOP JSB .ENTR DEF DSABA JSB $LIBR OCT 177777 *791228* LDA DSABA,I SZA,RSS ZERO MEANS ENABLE ALL ENTRIES JMP DSAB1 SSA NEG MEANS DELETE ENTRY JMP DSAB2 JSB FINDS LOOK FOR ENTRY IN TRAP TABLE JMP DSABE NOT FOUND LDB TRPTR FOUND INB LDA 1,I GET SECOND WORD OF ENTRY ELA,CLE,ERA CLEAR ENABLE BIT STA 1,I JMP DSAB4 RETURN DSABE LDA AD4 JSB BSERR DSAB4 JSB $LIBX DEF DSABL,I *791228* * ** HERE TO DISABLE WHOLE TABLE * DSAB1 CLA DONT NEED TO SEARCH TRAP TABLE STA TRFLG UNTIL SOMETHING HAPPENS LDB TRTBL DSAB3 CPB TRNXT END OF TABLE? JMP DSAB4 YES INB LDA 1,I GET SECOND WORD OF ENTRY ELA,CLE,ERA CLEAR ENABLE BIT STA 1,I INB ADVANCE TO NEXT ENTRY JMP DSAB3 LOOP * ** HERE TO DELETE ENTRY * DSAB2 CMA,INA MAKE SEQ NBR POSITIVE JSB FINDS LOOK FOR ASSOC ENTRY JMP DSABE NOT FOUND JSB TRDEL DELETE ENTRY JMP DSAB4 RETURN * * CONSTANTS * .1 DEC 1 .2 DEC 2 .3 DEC 3 .4 DEC 4 .6 DEC 6 M1 DEC -1 M3 DEC -3 M5 DEC -5 M7 DEC -7 M256 DEC -256 MNEG OCT 100000 MAXIMUM NEG FLOATING OCT 376 POINT NUMBER BIT15 EQU MNEG SKP ***** * ** TRNON ** ROUTINE TO START TASK AT GIVEN TIME * * JSB TRNON * DEF *+3 * DEF SEQUENCE NUMBER * DEF TIME TO START (FLOATING POINT VALUE HHMMSS) * RETURN * * NOTE: IF THE TIME SCHEDULING TABLE IS FULL, CONTROL * WILL BE TRANSFERRED TO ERROR * ***** * TRNOB NOP TRNOA NOP TRNON NOP JSB .ENTR DEF TRNOB DLD TRNOA,I JSB CNVRT GET TIME IN FLOAT PT SECONDS DST TMPAR THEN SET UP FOR PROCESSING LDA TRNOB,I GET SEQ NBR TO PASS TO BSCED JSB CKST# CHECK FOR STATEMENT # RANGE *791228* JMP TRNEE OUT OF RANGE ERROR *791228* JSB BSCED SET UP TRAP & TIME SCHED TABLES JMP TRNON,I THEN RETURN **********************CHANGED 800213*********************************** TRNEE JSB $LIBR OCT 177777 JSB BSERR *791228* JSB $LIBX DEF TRNON,I *791228* ***************************800213************************************** * SKP ***** * ** SSTRT ** ROUTINE TO START TASK AFTER GIVEN DELAY * * JSB SSTRT * JSB SSTRT * DEF *+3 * DEF SEQUENCE NUMBER * DEF DELAY (FLOAT POINT SECONDS) * RETURN * ***** * SSTRB NOP SSTRA NOP SSTRT NOP JSB .ENTR DEF SSTRB JSB TIME GET CURRENT TIME DEF *+2 DEF TMPAR JSB .FAD THEN ADD DELAY DEF SSTRA,I DST TMPAR TO SET UP AS TIME OF DAY CALL JSB .FSB IF GREATER THAN 2400 HOURS, DEF FLDAY SSA SUBTRACT ONE DAY JMP SSTR1 DST TMPAR SSTR1 LDA SSTRB,I JSB CKST# CHECK FOR STATEMENT # OUT OF RANGE *791228* JMP SSTRE OUT OF RANGE ISSUE ERROR JSB BSCED SET UP TRAP & TIME SCHED TABLES JMP SSTRT,I ***********************CHANGED 800212*************************** SSTRE JSB $LIBR OCT 177777 JSB BSERR *791228* JSB $LIBX *800213* DEF SSTRT,I *791228* **********************************800212************************ * SKP ***** * ** BSCED ** ROUTINE TO SET UP TRAP & TIME SCHED TABLES * FOR TRNON AND START ROUTINES * * DLD TIME IN FLOATING POINT SECONDS * DST TMPAR IS PASSED IN TMPAR * LDA SEQ NUMBER * JSB BSCED * RETURN * * NOTE: TABLE OVERFLOWS WILL CAUSE TRANSFER TO ERROR * ***** * BSCED NOP JSB $LIBR OCT 177777 *791228* STA SNPAR SAVE SEQ NUMBER LDB TSNXT IS TABLE CPB TSEND ALREADY FULL ? JMP TRNOE YES STB TSPTR NO, INITIALIZE POINTER JMP NEXT1 * ** HERE TO EXAMINE NEXT ENTRY * NEXT LDB TSPTR ADB M1 MOVE LDA 1,I LAST ADB B3 WORD STA 1,I OF ENTRY ADB M5 THEN MOVE DLD 1,I FIRST TWO WORDS DST TSPTR,I OF ENTRY LDB TSPTR MOVE POINTER ADB M3 TO NEXT ENTRY STB TSPTR NEXT1 CPB TSTBL ARE WE AT OTHER END OF TABLE? JMP INSRT YES, MAKE ENTRY HERE ADB M3 NO, SET UP POINTER STB ENPTR TO NEXT ENTRY TO BE CONSIDERED * ** HERE TO TEST FOR TIME ORDERING * DLD TMPAR COMPARE GIVEN TIME JSB .FSB TO CURRENT TIME DEF TSTIM SSA JMP ORDR1 GIVEN TIME < CURRENT TIME DLD ENPTR,I GIVEN TIME > OR = CURRENT TIME JSB .FSB DEF TSTIM SSA JMP INSRT ENTRY TIME < CURRENT TIME ORDR2 DLD TMPAR ENTRY TIME > CURRENT TIME JSB .FSB DEF ENPTR,I SSA JMP INSRT GIVEN TIME < ENTRY TIME JMP NEXT GIVEN TIME > OR = ENTRY TIME ORDR1 DLD ENPTR,I JSB .FSB DEF TSTIM SSA JMP ORDR2 ENTRY TIME < CURRENT TIME JMP NEXT GIVEN TIME > CURRENT TIME * ** HERE TO INSERT NEW ENTRY AT TSPTR * INSRT DLD TMPAR SET UP DST TSPTR,I TIME PART OF ENTRY LDB TSPTR ADB B2 SET UP LDA SNPAR SEQUENCE NUMBER STA 1,I PART OF ENTRY LDA TSNXT UPDATE STA 1 TSNXT POINTER ADA B3 STA TSNXT CPB TSPTR CHECK IF NEW ENTRY NEXT TO EXEC RSS YES JMP INSR1 NOS MAKE TRAP ENTRY NOW * ** HERE IF NEW ENTRY WILL EXECUTE NEXT * DLD TSTIM GET NEW JSB .FSB MINUS TIME TILL NEXT EXECUTION DEF TSPTR,I SZA,RSS IF TO GO NOW, JMP INSR3 ALLOW TSCNT TO BE ZERO SSA IF POSITIVE JMP INSR3 JSB .FSB SUBTRACT ONE DAY DEF FLDAY INSR3 DST TSCNT THEN SET UP COUNTER WITH NEW VAL * ** HERE TO MAKE TRAP TABLE ENTRY * INSR1 LDA SNPAR JSB FINDS DOES A TRAP ENTRY ALREADY EXIST JMP INSR2 NO, MAKE ONE LDB TRPTR YES, SET ENABLE BIT INB LDA 1,I IOR BIT15 STA 1,I JMP BSCE1 RETURN INSR2 LDA SNPAR SET UP STA SEQNO SEQUENCE NUMBER CLA STA TRPNO TRAP NUMBER (DEFAULT = 0) LDA D99 STA PRINO PRIORITY (DEFAULT = 99) JSB TRMAK MAKE TRAP TABLE ENTRY RSS NO ROOM JMP BSCE1 DONE, RETURN LDA AD2 JSB BSERR JMP BSCE1 TRNOE LDA AD5 TIME SCHED TABLE FULL JSB BSERR BSCE1 JSB $LIBX DEF BSCED,I *791228* SKP **************************************************** * **************** CONSTANTS ************************* SCHED DEC 5 ASC 3,SCHED ERRM DEC 3 ASC 2,TTY ENPTR NOP POINTER TO NEXT ENTRY (IN TIMCK) SNPAR NOP FLDAY DEC 86400. FLOATIN POINT # SEC IN DAY F.100 DEC 100. F.60 DEC 60. TMPAR BSS 2 WHOLE BSS 2 HHMM BSS 2 HH BSS 2 MM BSS 2 SS BSS 2 B2 EQU .2 B3 EQU .3 B2000 OCT 2000 .5 DEC 5 .7 DEC 7 *791228* D99 DEC 99 AD2 DEF .2 AD4 DEF .4 AD5 DEF .5 AD7 DEF .7 *791228* **************************************************** END