ASMB,R,F,L,C HED * BASIC SCHED AND TRAP ROUTINES * 92101-19013 REV. A NAM SCHD,7 92101-16013 750724 * * ************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1975. 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. * ************************************************************** ***************************************************************** * * RTE BASIC SCHEDULER ROUTINES * * REV A * * LISTING 92101-19013 * SOURCE TAPE 92101-18013 * RELOC BINARY TAPE 92101-16013 * **************************************************** * * 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 * 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) FDV F.100 FIX FLT DST HHMM HHMM= INT(HHMMSS/100) FDV F.100 FIX FLT DST HH HH= INT(HHMM/100) FMP F.100 JSB ..FCM FAD HHMM DST MM MM=HHMM-HH00 DLD HHMM FMP F.100 JSB ..FCM FAD WHOLE DST SS SS=HHMMSS-HHMM00 DLD HH FMP F.60 FAD MM FMP F.60 FAD SS .A.&.B.= (HH*60+MM)*60+SS SECONDS 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 DEF *+1 JSB ERROR DEF *+3 BSER1 NOP (ADDRESS OF ERROR NUMBER) DEF SCHED (ADDRESS OF STRING "SCHED") JSB $LIBR NOP JMP BSERR,I RETURN * 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 NOP LDA SETPA,I STA SEQNO SEQUENCE NUMBER LDB SETPB,I 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 JMP SETPE NO ROOM JMP SETP3 RETURN SETPE LDA AD2 TRAP TABLE FULL JSB BSERR SETP3 JSB $LIBX DEF SSETP * * 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 NOP STA TRAP# STORE TRAP NUMBER JSB $LIBX SEW UP THE FENCE DEF TTYS * 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 NOP LDA ENABA,I RETRIEVE SEQUENCE NUMBER SZA,RSS ZERO MEANS ENABLE ALL ENTRIES JMP ENAB1 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 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 NOP 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 * ** 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 BSCED SET UP TRAP & TIME SCHED TABLES JMP TRNON,I THEN RETURN * 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 FAD SSTRA,I THEN ADD DELAY DST TMPAR TO SET UP AS TIME OF DAY CALL FSB FLDAY IF GREATER THAN 2400 HOURS, SSA SUBTRACT ONE DAY JMP SSTR1 DST TMPAR SSTR1 LDA SSTRB,I JSB BSCED SET UP TRAP & TIME SCHED TABLES JMP SSTRT,I * 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 NOP 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 FSB TSTIM TO CURRENT TIME SSA JMP ORDR1 GIVEN TIME < CURRENT TIME DLD ENPTR,I GIVEN TIME > OR = CURRENT TIME FSB TSTIM SSA JMP INSRT ENTRY TIME < CURRENT TIME ORDR2 DLD TMPAR ENTRY TIME > CURRENT TIME FSB ENPTR,I SSA JMP INSRT GIVEN TIME < ENTRY TIME JMP NEXT GIVEN TIME > OR = ENTRY TIME ORDR1 DLD ENPTR,I FSB 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 FSB TSPTR,I MINUS TIME TILL NEXT EXECUTION SZA,RSS IF TO GO NOW, JMP INSR3 ALLOW TSCNT TO BE ZERO SSA IF POSITIVE JMP INSR3 FSB FLDAY SUBTRACT ONE DAY 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 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 D99 DEC 99 AD2 DEF .2 AD4 DEF .4 AD5 DEF .5 **************************************************** END