/ QUEUED DRIVER FOR OS/8 BATCH /PROVIDES RTS/8 TASKS WITH THE ABILITY TO /RUN OS/8 BACKROUND JOBS VIA MESSAGE SENDS TASK3= QTASK CUR3= 30 INIWT3=0 QDEV1= RK8 /DEVICE FOR QUEUE, QUNIT1= 4 /AND UNIT /**THE DEVICE NAME MUST ALSO BE SPECIFIED /**IN THE START MESSAGE "GOMSG" /QDEV3= LTA /SPOOL DEV FOR BATCH TTY OUTPUT /QUNIT3=1 /AND UNIT. /QLEN3= 500 /SPOOL LENGTH IN OCTAL BLOCKS /**NOTE THE SPOOL FILE IS USED AS /**A LONG RING BUFFER...IF LARGE ENOUGH,IT COULD /**PROVIDE A FEW DAYS WORTH OF REPORT BACKUP POSTQ= 0600 DELQ= POSTQ+44 /THE FORMAT OF A MESSAGE TO THIS TASK IS: / /WORD 1 MESSAGE EF /WORDS 2&3 RTS-8 OVERHEAD /WORD 4 FUNCTION CONTROL WORD: / BIT 0 RUN JOB BIT 0=DEFER,1=IMMEDIATE / BIT 1 POST MSG BIT 0=IMMEDIATE,1=DEFER / BITS 3-8 TASK NUMBER OF HANDLER FOR POST RUN DELETE / BITS 9-11 AND UNIT NUMBER. /WORD 5 POINTER TO FILENAME TO BE DELETED AFTER RUN / /...MSG... MESSAGE TEXT IN 6-BIT ASCII, CHAR=00 INTERPRETED AS CR/LF / /LAST WORD = 7777 INDICATED END OF MESSAGE FIELD CUR3%10 *15 XQOUT, 0 XQIN, 0 QPOINT, QB+5 *174 QDEVPT, 0 QTEMP, 0 SPLIN, 0 SPLOUT, 0 *200 QB, "$;"J;"O;"B;15;12 /INITIALIZATION CODE OVERWRITTEN BY BUFFER ERRWT, CAL SENDW TTY ERMSG ISZ RETRY CAL WAITE RETRY START3, CAL /SET UP QUEUE FILE SENDW OS8F QMSG1 TAD QMSG1+5 SZA JMP ERRWT IFDEF QDEV3 < CAL /SET UP SPOOL OUTPUT FILE SENDW OS8F QMSG3 TAD QMSG3+5 SZA JMP ERRWT > TAD QMSG1+6 DCA I (QSTART TAD QMSG1+6 DCA I (BLKCNT IFDEF QDEV3 < TAD QMSG3+6 DCA SPLIN TAD QMSG+6 DCA SPLOUT > CAL SKPINS /GET THE OS8 KB CENSOR QKBINT TAD (OS8 CAL RUN JMP I (NXTRUN /INITIALIZATION MESSAGES RETRY, 0 QMSG1, ZBLOCK 3 QDEV1^10+QUNIT1+2000 NAME1 0 0 11 IFDEF QDEV3 < QMSG3, ZBLOCK 3 QDEV3^10+QUNIT3+2000 NAME3 0 0 QLEN3 > NAME1, FILENAME Q NAME3, FILENAME BATOUT.SP ERMSG, ZBLOCK 5 TEXT /QTASK FAILED TO INITIALIZE.../ *400 "$;"J;"O;"B;15;12 ZBLOCK 372 /ROUTINE TO READ MASSAGES AND ARBITRATE THE RUNNING OF QTASK *1000 NXTRUN, CAL RECEIVE QIN, 0 DCA INCDF+1 /PUT CDF TO MSG FEILD IN SUB TAD (-3 TAD QIN DCA I (POSTAD /SAVE EF ADDR JMS INCDF /CHANGE TO MSG DATA FIELD TAD I QIN /GET FUNCTION CONTROL WORD RAL ISZ MSGCNT /IF QUEUE JUST FILLED, SKP /SET IMMEDIATE RUN BIT CLL CML /OF CONTROL WORD RAR DCA CNTROL ISZ QIN TAD QIN /QIN POINTS TO FILENAME FOR DELETE DCA XQIN /SET UP AUTO-INDEX REG JMS I (GETMSG /PUT THE MSG IN THE QUEUE BUFFER TAD QPOINT DCA XBFREE /MAY NEED THE POINTER LATER JMS I (DELCHK /SET UP ANY POST FILE DELETE JMS I (POSTCHK/POST MSG OR SET UP DEFER RUNCHK, TAD CNTROL SPA CLA /IMMEDIATE RUN BIT MAKES JMP RUNIT /CNTROL WORD NEGATIVE IOF TAD I (QINHIB /CHECK TO SEE IF WE ARE INHIBITTED FROM BACKROUND SZA SMA CLA JMP QWRITE CDF 0 TAD I (QTASK^2+MSGTBL SZA CLA /ANY MESSAGES WAITING... JMP QWRITE /YES,WRITE OUT BUFFER IF NEEDED AND GO GET IT / **FALL THROUGH TO RUNIT** /SET UP FOR RUN OF OS/8 BATCH RUNIT, CDF CUR3 DCA QREADY /SET QREADY ION TAD (-7 /PUT "$END"-CR-LF-^Z IN BUFFER DCA QTEMP TAD (ENDMSG-1 DCA XQOUT TAD I XQOUT DCA I QPOINT ISZ QTEMP JMP .-3 CLA CMA DCA HALFSW QWRITE, ION CDF CUR3 ISZ HALFSW JMP NOTWRT CLA CLL CMA RAL /AC = -2 DCA HALFSW /RESET BUFFER HALF SWITCH CAL SENDW QDEV1 /WRITE IT! QWRMSG ISZ BLKCNT /BUMP BLOCK COUNTER SKP NOTWRT, TAD (200 TAD (QB+5 DCA QPOINT /RESET BUFFER POINTER TAD QREADY SZA CLA /SHOULD WE RUN? JMP NXTRUN /NOT YET! BFREE2, CAL WAITE /WAIT FOR OS/8 TO COMPLETE CURRENT JOB QRUN /IF ANY TAD QSTART DCA BLKCNT /RESET WRITE BLOCK COUNTER TAD MSGCNT TAD (22 SNA /DON'T RUN AN EMPTY QUEUE ISZ QREADY SNA CLA JMP NXTRUN TAD (-22 DCA MSGCNT /RESET MESSAGE COUNTER, TAD (POSTQ DCA I (POSTQP /AND DEFER POST QUEUE POINTER TAD (DELQ DCA I (DELQPT /AND DELETE QUEUE POINTER. JMP I (RUNNOW /AND WE'RE OFF... INCDF, 0 HLT JMP I INCDF /BACKROUND FREE DERAIL SORTA... BFREE, CLA TAD XBFREE DCA QPOINT IAC TAD HALFSW SNA JMP RUNIT TAD BLKCNT DCA BLKCNT /WE HAVE TO RE-WRITE THE BLOCK JMP RUNIT /WITH THE "$END" MSG /VARIABLES LIST QREADY, 1 QSTART, 0 MSGCNT, -22 CNTROL, 0 HALFSW, -2 XBFREE, 0 /QDEV1 WRITE BUFFER MSG QWRMSG, ZBLOCK 3 /RTS/8 OVERHEAD QUNIT1 /UNIT NUMBER 4200+CUR3 /FUNCT = WRITE TWO PAGES FROM CURRENT FIELD QB /STARTING ADDR BLKCNT, 0 /BLOCK POINTER 0 /ERROR INDICATOR PAGE /ROUTINE TO GET PACKED 6-BIT MESSAGE AND UNPACK INTO QUEUE BUFFER GETMSG, 0 NXTCHR, TAD I XQIN /GET NEXT WORD DCA QTEMP TAD QTEMP CMA SNA CLA /END OF MSG IF WORD=7777 JMP NULLIT CLL CLA CMA /AC = -1 DCA HAF TAD QTEMP /GET LEFT HALF OF CHAR WORD RTR;RTR;RTR JMP .+2 RIGHT, TAD QTEMP AND (77 SNA /CHECK FOR NULL JMP NULL TAD (240 AND (77 TAD (240 CDF CUR3 DCA I QPOINT /PUT IN BUFFER JMS I (INCDF ISZ HAF JMP NXTCHR JMP RIGHT /CONVERT NULL TO CR/LF NULL, CDF CUR3 TAD (215 DCA I QPOINT TAD (212 DCA I QPOINT JMS I (INCDF JMP NXTCHR /ZERO FILL REMAING BUFFER NULLIT, CDF CUR3 TAD QPOINT DCA XQIN /SET BUFFER POINTER TAD QPOINT AND (177 TAD (-177 DCA QTEMP /SET COUNTER DCA I XQIN /AND FILL IT ISZ QTEMP JMP .-2 JMP I GETMSG /RETURN HAF, 0 /ROUTINE TO CHECK FOR POST RUN DELETE DELCHK, 0 CDF CUR3 TAD I (CNTROL AND (777 SNA CLA /IF DEV-UNIT IS ZERO,NO FILE SPECIFIED JMP I DELCHK TAD I (QIN DCA FNPNT JMS I (INCDF TAD I FNPNT DCA FNPNT TAD (-4 DCA QTEMP DFILE, JMS I (INCDF TAD I FNPNT /PUT FILENAME IN BUFFER CDF CUR3 DCA I DELQPT ISZ FNPNT ISZ DELQPT ISZ QTEMP JMP DFILE TAD I (CNTROL /FOLLOWED BY DEV-UNIT WORD AND (777 DCA I DELQPT ISZ DELQPT ISZ DELCT JMP I DELCHK FNPNT, 0 DELQPT, DELQ DELCT, 0 /ROUTINE TO POST MSG NOW OR SET UP FOR LATER POSTCHK,0 TAD I (CNTROL RAL SMA CLA /IMMEDIATE POST? JMP POSTNOW /YES TAD I (INCDF+1 DCA I POSTQP ISZ POSTQP TAD POSTAD /NO.SAVE IT FOR LATER DCA I POSTQP ISZ POSTQP ISZ POSTCT JMP I POSTCHK POSTNOW,TAD I (INCDF+1 /POST IT! DCA .+4 TAD POSTAD CAL POST HLT JMP I POSTCHK POSTQP,POSTQ POSTAD, 0 POSTCT, 0 /QUEUE BUFFER END MESSAGE ENDMSG, "$;"E;"N;"D;15;12;32 PAGE /RUN THE QUEUE FILE WITH BACKROUND BATCH RUNNOW, IOF TAD I (QINHIB SMA CMA DCA I (QINHIB /INHIBIT OS8 KB AND SAVE INHIBIT STATUS CDF CUR DCA I (OWCNT /LIKEWISE FOR THE PRINTER ION TAD (OWBASE / **RESET TTY BUFFER DCA I (OWGET TAD (OWBASE DCA I (OWPUT / **TO BE IMPLEMENTED / IFDEF QDEV3 .. ALTER IOT TABLE IN OS8SUP TO USE A STILL / UNWRITTEN TTY SPOOL HANDLER IN FEILD 0 THAT USES QUEUE MESSAGE / BUFFER IN FIELD 1 FOR WRITING DATA TO QDEV3... TAD I (QADDR1 / **ALTER KB HANDLER DCA SAVEIT TAD (NOP DCA I (QADDR1 /IGNORE RING BUFF MOD TAD (IRBASE-6/ **FAKE KB ENTRY DCA I (IRGET /SET UP OS/8 POINTERS TAD (IRBASE+7 DCA I (IRPUT TAD (-15 DCA I (IRCNT TAD (-15 /AND TRANSFER POINTERS DCA QTEMP TAD (IRBASE-7 DCA XQOUT TAD (GOMSG-1 DCA XQIN MOVEIT, CDF CUR3 /NOW MOVE THE MESSAGE IN TAD I XQIN CDF CUR DCA I XQOUT ISZ QTEMP JMP MOVEIT IFDEF QDEV2 TAD (KSFEF CAL POST CDF CUR /IN CASE ITS REALLY IDLE CDF CUR3 / **LET 'ER RIP ISZ QRUN CAL /THIS WAIT WILL AWAKEN OS8 (W.R.T. QTASK), WAITE /AND THE KBM SHOULD READ OUR FAKE ENTRY, QRUN /...AND MAY GOD BE WITH US! /DO THE HOUSEKEEPING AND RESTORE OS/8 JMS I (DELIT /DELETE ANY FILES SPECIFIED JMS I (POSTIT /POST ANY DEFERRED MESSAGES IAC DCA I (QREADY /SET QREADY PENDING / IFDEF QDEV3 .. **TO BE IMPLEMENTED / UNDO THE SPOOLING CHANGES AND POST EF FOR SPOOL FILE WRITE... CDF CUR TAD SAVEIT DCA I (QADDR1 / **UN-MODIFY OS8 KB IFDEF QDEV2 < DCA I QDEVPT / **UNDEFINE QDEV2 > IOF CDF 0 TAD I (QTASK^2+MSGTBL ION CDF CUR3 SZA CLA /IF THERE ARE MORE JOBS TO RUN JMP I (NXTRUN /GO GET THEM! IOF TAD I (QINHIB CMA /RESET USER MODE INHIBIT STATUS DCA I (QINHIB TAD I (QINHIB SZA CLA ISZ QRUN /RESET QRUN IF BACKROUND IS ACTIVE ION JMP I (NXTRUN /TRY AGAIN. QRUN, 0 SAVEIT, 0 /FAKE KB ENTRY MSG GOMSG, "S;"U;"B;" ;"R;"K;"B;"0;":;"Q;"2;".;15 PAGE /ROUTINE TO DELETE FILES AFTER RUN DELIT, 0 TAD I (DELCT SNA CLA /ANY FILES TO DELETE? JMP I DELIT /NO. RETURN TAD I (DELCT CIA DCA I (DELCT /USE DELCT AS A COUNTER TAD (DELQ-5 DCA FLNAME /SET UP POINTER TO DELETE QUEUE NEWDF, TAD FLNAME TAD (5 DCA FLNAME /SET MSG FILENAME POINTER TAD (4 TAD FLNAME DCA DANDU CLA CLL CML RAR /SET DELETE FUNCTION BIT TAD I DANDU /ADD DEV AND UNIT DCA DANDU /AND PUT IN OS8F MSG CAL SENDW OS8F /DELETE IT! DELMSG ISZ I (DELCT /ANYMORE DELETES? JMP NEWDF /YES,GO GET IT JMP I DELIT /NO,RETURN.(DELCT IS RESET) DELMSG, ZBLOCK 3 DANDU, 0 FLNAME, 0 ZBLOCK 3 /ROUTINE TO POST MESSAGES AFTER RUN POSTIT, 0 TAD I (POSTCT SNA CLA /ANY DEFERRED POSTINGS? JMP I POSTIT /NO,RETURN TAD I (POSTCT CIA DCA I (POSTCT /USE POSTCT AS COUNTER TAD (POSTQ-1 DCA XQOUT POST2, TAD I XQOUT DCA .+4 /GET CDF AND PUT IN LINE TAD I XQOUT /GET EF ADDR CAL POST /POST IT! HLT ISZ I (POSTCT /ANYMORE FLAGS? JMP POST2 /YES,GO GET IT JMP I POSTIT /NO,RETURN (POSTCT IS RESET) /OS8 KB CENSOR QKBINT, ZBLOCK 2 KSFX JMP I QKBINT CDF CIF CUR3 KRSX /READ IT STATIC AND (177 DCA QINT TAD QINHIB SMA SZA JMP CNTRLD /IF QINHIB IS POS,THEN BACKROUND IS ACTIVE SZA CLA JMP CLFLAG /IF QINHIB IS NEG,THN IGNORE INTERRUPT CLA CLL CMA RTL /AC = -3 TAD QINT SZA CLA /IF NOT ^C,IGNORE IT JMP CLFLAG TAD I (QREADY SNA CLA JMP CLFLAG /CAN'T START BACKROUND WHEN QUEUE IS READY ISZ QINHIB /SET SWITCH TO ACCEPT INPUT ISZ I (QRUN /SET QRUN PENDING QIEXIT, TAD QKBINT+1 DCA .+1 HLT JMP I QKBINT /WE NEVER SAW IT FAKE CNTRLD, CLA TAD (-4 TAD QINT SZA CLA /IF CHAR .NE. ^D, JMP QIEXIT /THEN PASS IT ALONG TO OS8 CDF 0 TAD I (QTASK+TFTABL AND (MSGWT SNA CLA / IF QTASK IS IN MSG WAIT, JMP FJOS8 CDF CUR3 DCA I (QREADY /FAKE A 'QUEUE' READY, TAD I (MSGCNT TAD (22 /CHECK FOR ANY MESSAGES READ, SNA CLA TAD (BFREE2-BFREE TAD (BFREE CDF 0 /AND WAKE-UP QTASK,APPROPRIATELY! DCA I (QTASK^4+TSTABL+1 DCA I (QTASK+TFTABL FJOS8, DCA QINHIB /RESET BACKROUND USER MODE JMP QIEXIT CLFLAG, KCCX CIF 0 POSTDS QINHIB, 0 QINT, 0 PAGE