ASMB,B,R,L,T,C DATE CODE: 1704 HED *****DVA15: A RTE DRIVER FOR THE HP2894***** NAM DVA15,0 ENT IA15,CA15 IA15 NOP LDB IA15 GET RETURN ADDRESS STB CA15 AND STORE IT AWAY LDB .3 SET CODE FOR BAD COMPLETION STB BADCO STORE IT AWAY INB SET CODE FOR GOOD COMPLETION STB OKCOM STORE IT AWAY JSB SETIO CONFIGURE IO INSTRUCTIONS JSB S2SPD CHECK FOR STACKER 2 & SPD REQUESTS. JSB STATS GET STATUS AND CHECK READY LDA EQT6,I CHECK REQUEST CODE AND .17B ISOLATE FUNCTION FIELD CPA .1 IS IT A READ? JMP IREAD YES GO START READ CPA .2 IS IT A WRITE? JMP IWRIT YES GO START WRITE * * CONTROL REQUEST PROCESSOR * ICTRL LDA EQT6,I ALF,ALF GET FUNCTION CODE RAL,RAL IN RIGHT MOST BITS AND .17B AND CLEAN OUT REST OF WORD SZA,RSS IS IT A CLEAR?o JMP CLEAR YES THEN GO CLEAR CPA .6 IS IT A DYNAMIC STATUS REQUEST? JMP DYNST YES GO GET STATUS CPA .7 IS IT A SET EOT? STA EQT12,I YES, THEN SET FIRST TIME OR ERROR BIT CPA .17B IS IT AN EXTENDED FUNCTION REQUEST? JMP EXFUN YES GO GET EXTENDED FUNCTION. IOKEX LDA OKCOM GOOD EXIT IEXIT JMP IA15,I * * CLEAR REQUEST PROCESSOR CLEAR CLA CLEAN OUT INTERNAL FLAGS WORD UPON CLEAR STA EQT13,I ZERO OUT TRANSMISSION LOG CLRWS IOR .BITF COME HERE TO CLEAR THE WAIT STATION STA EQT12,I AND STORE IT INTO INTERNAL FLAGS CLB SET UP FOR PLAIN FEED IFECO JSB FEED GO FEED JMP CFOMI AND GO CLEAR CONTROL TO STOP FEED * * DYNAMIC STATUS PROCESSOR * DYNST LDA EQT11,I GET DYNAMIC STATUS WORD. STA B SAVE IT IN B REG FOR USER REQUEST JMP IOKEX MAKE GOOD EXIT. IBADX LDA .2 NO, THEN IMPROPER REQUEST. JMP IEXIT AND GO EXIT. * * STACKER 2 AND SEPARATE PRINT DATA (SPD) * PROCESSOR * S2SPD NOP LDA EQT6,I CHECK REQUEST CODE. AND .17B ISOLATE FUNCTION FIELD. CPA .1 IS IT A READ. JMP IRES2 YES, CHECK FOR STACKER 2 REQUEST. CPA .2 IS IT A WRITE. JMP IWSSP YES, CHECK FOR S2 AND SPD REQUEST. CPA .3 IS IT A CONTROL REQ. JMP ICOS2 YES, CHECK FOR S2 REQUEST. JMP S2SPD,I NOT ANY OF THE ABOVE GO BACK. IRES2 LDA RQCNT LOAD NO. OF PARAMETERS. CPA .3 IS OPTIONAL PARAMETER INCLUDED? JMP S2SPD,I NO,RETURN TO CALLER. LDA EQT6,I YES,GET CONTROL WORD. LDB EQT9,I GET PARAMETER AND CK STACKER BIT. SLB IS STACKER 2 SELECTED ? ADA .BITB YES, SET BIT11 TO INDICATE S2. STA EQT6,I RESTORE CONTROL WORD. JMP S2SPD,I RETURN TO CALLER. IWSSP LDA RQCNT LOAD NO. OF PARAMETERS. CPA .3 IS OPTIONAL PARAMETER INCLUDED. JMP S2SPD,I NO,RETURN TO CALLER. LDA EQT6,I YES, GET CONTROL WORD. LDB EQT9,I GET PARAMETER AND CK STACKER BIT. SLB IS S2 SELECTED ? ADA .BITB YES, SET BIT11 TO INDICATE S2. RBR ROTATE B RIGHT 1. SLB IS SPD SELECTED ? ADA .BITC YES, SET BIT12 TO INDICATE SPD. STA EQT6,I RESTORE CONTROL WORD. JMP S2SPD,I RETURN TO CALLER. ICOS2 LDB EQT6,I GET CONTROL WORD. LDA EQT7,I GET PARAMETER. AND =B100 ISOLATE STACKER SELECT BIT. SZA IS STACKER 2 SELECTED ? ADB .BITB YES, SET BIT11 TO INDICATE S2. STB EQT6,I RESTORE CONTROL WORD. LDA EQT7,I GET PARAM AGAIN. AND =B77 ISOLATE EXT FCN. STA EQT7,I RESTORE EQT7 WITH EXTENDED FCN ONLY. JMP S2SPD,I RETURN TO CALLER. SKP * * EXTENDED FUNCTION PROCESSOR * EXFUN LDB EQT7,I GET EXT FCN CODE. LDA EQT12,I GET INTERNAL FLAGS WORD SZB,RSS IF IT IS A FEED REQUEST JMP IFEDO THEN GO FEED CPB .1 IS IT SET STACKER SELECT MODE? JMP SSMOD YES THEN GO SET THE MODE CPB .2 IS IT SET STACKER OVERFLOW MODE? SOMOD IOR .BITE YES, THEN SET STACKER OVERFLOW MODE CPB .3 IS IT AN INHIBIT INPUT REQEST? INHIN IOR .BITF YES, THEN SET BIT 15,THE INHIBIT INPUT BIT CPB .4 ENABLE PUNCHING ON PUNCHED CARDS? ENPOP IOR .BITD YES, THEN SET BIT 13, THE POP BIT. CPB .5 IS IT A REQUEST TO CLEAR THE WAIT STATION? JMP CLRWS YES THEN GO CLEAR WAIT STATION. EXFEX STA EQT12,I STORE AWAY FLAGS WORD JMP IOKEX GO DONE. * * CONTROL FUNCTION HANDLERES * * * SET STACKER SELECT MODE * SSMOD IOR .BITE CHECK BIT 14 XOR .BITE TURN IT OFF JMP EXFEX AND GO EXIT * * * * * * SKP * * FEED ROUTINE FEEDS A CARD IF REQUESTED * FEED NOP JSB EATBL GO CHECK IF CARD IS BLANK. EAT BLANKS. LDA .BITF LOAD CLEAR BUFFER FULL COMMAND .IO33 OTA LOS AND OUTPUT IT TO LOW SELECT CODE CHKII LDA EQT12,I GET INTERNAL FLAGS WORD SSA,RSS CHECK THE INHIBIT INPUT BIT JMP ENRED ITS NOT ON IOR .BITB DISABLE INPUT COMMAND TO DATA CHANNEL XOR .BITF AND CLEAR BUFFER FULL ON INPUT ENRED XOR EQT12,I CLEAN OUT REST OF WORD .IO32 OTA LOS ENABLE READ LDA TOBIT GET TIME OUT FLAG. SSA IS T.O. FLAG SET? JMP FEEDS YES, SKIP HOP & STACKER CHKS&FEED CARD. LDA OCHFL GET OUTPUT CK FLAG. SZA IS THIS A REFEED FOR A WRITE OUTPUT CK. JMP FEEDS YES,SKIP HOPPER AND STACKER CKS & FEED CARD. STB TEMP1 NO,SAVE B DURING STATUS CALL. JSB STATS GO UPDATE STATUS BITS LDB TEMP1 GET B BACK LDA EQT11,I GET FULL PSEUDO STATUS ALF,ALF GET STACKER FULL BIT RAL,RAL WHERE IT CAN BE TESTED SLA STACKER FULL? JMP NREDY YES THEN GO NOT READY RAL CHECK HOPPER 2 BIT TO SEE IF EMPTY SSA,RSS IS HOPPER TWO EMPTY? JMP CHKH1 NO THEN GO CHECK HOPPER ONE CHKH2 LDA EQT6,I HOPPER 2 IS EMPTY IS IT SELECTED? ALF,RAL GET HOPPER SELECT BIT SSA WAS HOPPER 2 SELECTED? JMP NREDY YES THEN GO REJECT REQUEST CHKH1 LDA EQT11,I GET FULL STATUS IN THE A REG. AND .8 ISOLATE HOPPER 1 EMPTY BIT SZA,RSS IS HOPPER ONE EMPTY? JMP FEEDS NO THEN GO FEED CHREQ LDA EQT6,I CHECK TO SEE IF HOPPER 1 IS REQUESTED ALF,RAL GET HOPPER SELECT BIT WHERE IT CAN BE TESTED SSA,RSS IS HOPPER ONE SELECTED? JMP NREDY YES THEN GO REJECT REQUEST FEEDS LDA EQT6,I LOAD REQUEST CONTROL WORD ALF CHECK STACKER SELECT BIT SSA IS STACKER 2 SELECTED? ADB .BITB YES THEN SET BIT 11 IN CONTROL SLA IS SPD SPECIFIED? ADB .BITA YES THEN SET BIT 10 IN CONTROL WORD RAL LOOK AT HOPPER SELECT SSA IS HOPPER TWO SELECTED ADB .BITF YES THEN SET BIT 15 IN CONTROL WORD LDA EQT12,I LOAD INTERNAL FLAGS WORD RAL GET TO STACKER MODE BIT SSA,RSS IS BIT ZERO? ADB .BITC YES THEN STACKER SELECT MODE IS SPECIFIED LDA OCHFL GET WRITE OUTPUT CHECK FLAG. SLA,RSS IS THIS AN OUTPUT CK RE-FEED(OCHFL=1). JMP .IOC1 NO,THIS IS A NORMAL FEED OR A RE-WRITE REQ. ISZ OCHFL RESET OUTPUT CK FLAG TO 2 FOR SECOND PASS. LDA B YES,STRIP OUT PUNCH,PRINT AND AND =B115777 SPD BITS FROM CONTROL WORD. STA B UPDATE CONTROL WORD IN B-REG. .IOC1 OTB HIS OUTPUT THE CONTROL WORD TO THE HISELECT JSB FILL GO FILL WITH BLANKS IF NECESSARY .IOD1 STC HIS,C SET CONTROL ON HI SELECT CHANNEL JMP FEED,I RETURN TO CALLER * SKP * REJEC LDA EQT12,I LOAD INTERNAL FLAGS WORD AND .1 ISOLATE FIRST TIME OR MULTIPLE ERROR BIT IOR OPREJ SET OP REJECTED. JSB STSTS GO INCLUDE THEM IN THE STATUS SLA IF DEVICE IS NOT READY JMP CRJEC THEN GO NOT READY ISZ EQT12,I SET MULTIPLE ERROR BIT JMP CEFEX AND RETURN TO RTE * * FILL ROUTINE TO FILL A WAITING OUTPUT BUFFER * FILL NOP LDA CNTNO GET LOOP COUNTER VALUE(-100). STA CNTR SET COUNTER TO LIMIT "LIA"LOOP. CCE INDICATE FIRST TIME THRU LOFIL EQU * NO THEN GO DO SOME IO JSB CKRDY IF DEVICE IS READY JMP FILL,I THEN RETURN TO CALLER JSB LIA GO READ DEVICE FLAG AND .BITE ISOLATE DEVICE FLAG SZA,RSS IF FLAG IS SET SEZ,CLE OR THIS IS THE FIRST TIME THRU .IO41 STC LOS,C THEN OUTPUT TO FILL BUFFER JMP LOFIL GO SEE IF WE'RE READY YET * * * CKRDY CHECKS THE READY FOR COMMAND BIT * CKRDY NOP .IOB3 LIA HIS READ THE HIGH SELECT CHANNEL AND .BIT5 GET "READY FOR COMMAND" BIT SZA,RSS IF DEVICE IS NOT READY THEN ISZ CKRDY SET BAD RETURN JMP CKRDY,I AND RETURN TO CALLER * * IREAD SETS UP FOR A READ REQUEST * * IREAD CLB CONFIGURE COMMAND TO HI SELECT CODE. STB EQT13,I FIRST ZERO OUT THE TRANSMISSION LOG LDA EQT6,I CHECK FOR BINARY READ AND .100B PICK OUT BINARY BIT 6 M SZA,RSS IF NOT BINARY JMP IRASC THEN SKIP CHECK FOR BYTE LENGTH IRBNY LDA EQT8,I GET THE LENGTH OF BUFFER SSA IF IT IS IN BYTES JMP IBADX THEN TAKE BAD EXIT TO RTE .IO21 EQU * IRASC LIA LOS CHECK READINESS OF LO SELECT CODE SSA IF INPUT BUFFER IS FULL JMP CFOMI THEN GO TO CONTINUATION IFEDO LDA EQT12,I CHECK INHIBIT INPUT BIT SSA IF IT IS ON JMP REJEC THEN REJECT REQUEST JSB FEED ELSE GO FEED A CARD ICONT CLA CONTINUATION RETURN TO RTE JMP IEXIT AND EXIT TO RTE * * * IWRIT SETS UP FOR A WRITE REQUEST * IWRIT CLB SET UP COMMAND TO HI SELECT CODE. STB EQT13,I ZERO OUT THE TRANSMISSION LOG LDA EQT6,I GET REQUEST CONTROL WORD ALF,ALF CHECK FOR PUNCH AND PRINT BITS RAR POSITION P BIT SLA,RSS IF P=0 THEN ADB .BITE ENABLE PUNCH RAL,RAL POSITION M BIT 6 SSA IF M=1 THEN JMP IBNRY GO BINARY CHECK IASCI RAR ELSE ASCII SLA,RSS IF K=0 THEN ADB .BITD ENABLE PRINTING JMP REFED AND GO FEED A CARD IBNRY RAR,SLA IF K=1 THEN ADB .BITD ENABLE PRINTING LDA EQT8,I CHECK BUFFER LENGTH SSA IF REQUEST IS FOR BYTES JMP IBADX THEN TAKE BAD EXIT TO RTE REFED LDA OCHFL GET OUTPUT CK FLAG. SZA,RSS IS THIS A REWRIT BECAUSE OF OUTPUT CK. JMP IWFED NO,CONTINUE NORMAL WRITE REQUEST. JSB FEED YES, SET PRINT/PUNCH BITS IN FEED CONTROL WD. CLA CLEAR OUTPUT CHECK FLAG. STA OCHFL CHECK FLAG. JMP CFOMI REPROCESS WRITE COMPLETION SECTION. IWFED LDA EQT11,I GET FULL PSEUDO STATUS AND .4 CHECK WAIT STATION SZA,RSS IF THERE IS A CARD IN THE WAIT STATION JMP IFECO THEN GO SET PRINT AND PUNCH AND GO TO C. S. JSB CKRDY IF DEVICE IS READY CLB THEN ISSUE PLAIN FEED JMP IFEDO ELSE GO FEED A CARD AND RETURN TO RTE * * * EATBL EATS A CARD THAT IS RESIDENT IN THE DEVICE * READ BUFFER UNTIL BUFFER FULL GOES LOW * * EATBL NOP IBLNK LDA EQT12,I GET INTERNAL FLAG WORD AND =B167777 TURN OFF NOT BLANK BIT. SETBL STA EQT12,I AND PUT INTERNAL FLAGS BACK LDA CNTNO GET LOOP COUNTER VALUE(-100). STA CNTR SET COUNTER TO LIMIT "LIA" LOOP. EATS JSB LIA GO READ A CHARACTER SSA,RSS IF BUFFER EMPTY JMP EATBL,I RETURN TO CALLER AND =B7777 GET COLUMNS OF CARD SZA,RSS IF CARD IS BLANK THEN JMP EATS THEN EAT SOME MORE CHARACTERS NOTBL LDA EQT12,I GET INTERNAL FLAG WORD IOR .BITC SET BIT 12 TO INDICATE NOT BLANK JMP SETBL AND STORE IT AWAY * * * * * SETIO CONFIGURES THE IO INSTRUCTIONS * SETIO NOP LDA EQT4,I LOAD THE CHANNEL NUMBER AND .77B ISOLATE IT LDB A PUT IT IN B ALSO IOR LIAI PUT TOGETHER A LIA INSTRUCTION CPA .IO21 IF THE A REGISTER = AN LIA INSTRUCTION JMP SETIO,I THEN WE'RE ALREADY CONFIGURED STA .IO21 ELSE WE'RE NOT CONFIGURED AND MUST DO IT STA .IO22 STA .IO23 * ADA .100B MAKE AN OTA INSTRUCTION STA .IO31 AND STORE IT AWAY STA .IO32 STA .IO33 * ADA .1100 MAKE AN STC,C INSTRUCTION STA .IO41 AND STORE IT AWAY STA .IO42 STA .IO43 * IOR .BITB MAKE A CLC INSTRUCTION STA .IO51 AND STORE IT AWAY STA .IO52 * * CONFIGURE THE HIGH SELECT CHANNEL * LDA B GET LOSEL BACK INA MAKE IT HIGH IOR LIAI MAKE A LIA HIS INSTRUCTION STA .IOB2 STA .IOB3 * ADA .4100 MAKE AN OTB HIS INSTRUCTION STA .IOC1 AND STORE IT AWAY * XOR .BITB TURN OFF B BIT ADA .1100 MAKE AN STC HIS,C INSTRUCTION STA .IOD1 AND STORE IT AWAY * IOR .BITB MAKE A CLC HIS INSTRUCTION STA .IOE1 AND STORE IT AWAY JMP SETIO,I AND GO BACK TO CALLER SKP * * * STATS PUTS TOGETHER A SOFTWARE PSUEDO STATUS * FROM INFORMATION OBTAINED FROM BOTH THE * HIGH AND LOW SELECT CHANNELS. IT IS POSSIBLE * THAT THE LOW SELECT CHANNEL WILL NOT HAVE STATUS * INFO AVAILABLE. IF SO THE INFORMATION FROM IT * IS NOT UPDATED. * STATS NOP .IO22 EQU * CKLOS LIA LOS READ THE LOW SELECT CHANNEL LDB A COPY IT TO THE A REGISTER CLA CLEAR THE A REGISTER STA EQT11,I AND CLEAN OUT THE STATUS SSB IF STATUS IS NOT AVAILABLE ON LOW SEL. CODE JMP CKHIS THEN GO CHECK THE HI SELECT CODE BLF POSITION INPUT CHECK BIT SSB IF INPUT CHECK IOR .BIT8 THEN SET IT IN THE STATUS SLB IF READ CHECK IOR .2 THEN SET IT IN THE STATUS RBL,RBL POSITION HOPPER 1 BITS SSB IF HOPPER 1 IS EMPTY IOR .8 THEN SET IT IN THE STATUS SLB IF THERE IS AN OUTPUT CHECK IOR .BIT9 THEN SET IT IN THE STATUS RBL POSITION STACKER FULL BIT SSB IF STACKER IS FULL IOR .100B THEN SET BIT IN THE STATUS STA EQT11,I CKHIS EQU * .IOB2 LIA HIS READ THE HIGH SELECT CHANNEL LDB A PUT A IN B AND =B177000 AND OUT HI BITS RBR,SLB,RBR POSITION HOPPER 2 BIT IF IT IS EMPTY IOR .BIT4 THEN SET THE BIT IN THE STATUS RBR,RBR POSITION WAIT STATION BIT SLB,RSS IF WAIT STATION IS NOT FULL IOR .4 THEN SET THE BIT IN THE STATUS RBR,RBR POSITION READY BIT SLB,RSS IF NOT READY SNRED IOR .1 THEN SET NOT READY BIT JSB STSTS GO COMBINE STATS SLA,RSS IF READY JMP WTCHK CHECK IF WRITE WAS REQUESTED. LDA BADCO NT RDY,GET BAD CODE TO SEE IF IA15 OR CA15 ENTRY. CPA .3 IS ENTRY FROM IA15 (BADCO=3)? JMP CNTCK YES,GO CHECK FOR CONTROL REQUEST. LDA EQT11,I CHK EQT11 WORD FOR INPT CHK,OUTPT CK COND. AND =B1400 STRIP ALL BITS EXCEPT BIT 8&9. SZA,RSS DID INPUT CK,OUTPUT CK EXIST ON CA15 ENTRY. JMP STKCH NO, CHECK IF STKER FULL OR(AND) DEVICE OFF. AND =B1000 ISOLATE OUPUT CHECK BIT. SZA,RSS DID OUTPUT CHECK OCCUR? JMP CNTCK NO,GO CHECK FOR CONTROL REQUEST. LDA EQT6,I GET REQUEST WORD. AND .17B ISOLATE REQUEST CODE. ADA .ND2 ADD NEG. 2 TO A REG. SZA IS REQUEST A WRITE? JMP CNTCK NO,GO CHECK FOR CONTROL REQUEST. LDA .1 YES,SET OUTPUT CHECK STA OCHFL FLAG TO ONE. CNTCK LDA EQT6,I YES, GET REQUEST WORD. AND .17B ISOLATE REQUEST CODE. CPA .3 IS IT AN I/O CONTROL REQUEST.? JMP DYRTN YES,CHECK FOR DYNAMIC STAT REQ. LDA ERRTO GET TIME OUT VALUE (-3 SEC). STA EQT15,I SET TIME OUT CLOCK. LDA =B10000 SET BIT12 OF EQT 4 IOR EQT4,I (DRIVER TO HANDLE TIME OUT) STA EQT4,I SET S BIT IN EQT4 WORD. .BDXX LDA BADCO NO,LOAD BAD COMPLETION CODE. JMP IA15,I AND RETURN TO RTE. DYRTN LDA EQT6,I GET REQUEST CODE AGAIN. ALF,ALF GET FUNCTION CODE. RAL,RAL IN RIGHT MOST BITS. AND .17B ISOLATE FUNCTION CODE. CPA .6 IS IT A DYNAMIC STAT ROUTINE. JMP DYNST YES, GO TO DYNAMIC STAT ROUTINE. JMP .BDXX NO, BAD CODE. NREDY LDA EQT11,I GET STATUS JMP SNRED AND GO SET NOT READY BIT * WTCHK LDA EQT6,I CHECK REQUEST CODE. AND .17B ISOLATE FUNCTION FIELD. CPA .2 IS IT A WRITE? JMP OPTCK YES,CHECK FOR OUTPUT CK ON LAST REQUEST. TOCHK LDA EQT4,I GET EQT4 WORD. ALF SET TIME OUT BIT (BIT11). SSA,RSS HAS TIME OUT OCCURRED. JMP STATS,I NO, RETURN TO CALLER STBIT STA TOBIT YES, SET TIME OUT FLAG. JSB FEED AND FEED A CARD. LDA EQT4,I GET EQT4 WORD AGAIN. AND =B173777 CLEAR OUT T.O. BIT (BIT11). STA EQT4,I UPDATE EQT4 WORD. CLA CLEAR OUT STA TOBIT TIME OUT FLAG.T GLAG. JMP IA15,I RETURN TO RTE WITH A=0 * & WAIT FOR INTERRUPT. * STKCH LDA EQT11,I CHK DYN STATUS FOR STACKER FULL. AND =B100 ISOLATE STACKER FULL BIT. SZA IS STACKER FULL ON CA15 ENTRY. JMP STATS,I YES,FINISH CA15 REQ.,NEXTIA15 WILL CATCH ERR. JMP CNTCK NO,DEVICE IS OFF LINE OR PWR IS OFF. * EXIT WITH IRROR CODE=1 TO P+2. * * OPTCK LDA OCHFL GET OUTPUT CHECK FLAG. SZA,RSS HAS OUTPUT CHECK OCCURRED ON LAST REQ. JMP TOCHK NO,GO CHECK FOR TIME OUT. CPA .2 YES.2ND PASS FOR OUTPUT CK REPROCESSING? JMP IWRIT YES,RE-ISSUE WRITE REQUEST. RAR NO, ITS PASS 1 (OCHFL=1); * * SETUP FEED REQUEST FOR RETRANSMISSION OF * DATA FROM THE LAST WRITE REQUEST (PASS2). * JMP STBIT 2 AND GO FEED CARD. * STSTS STORES THE STATUS * STSTS NOP IOR EQT11,I INCLUDE REST OF STATUS STA EQT11,I STORE AWAY COMPOSED STATUS AND RHALF GET LOWER HALF OF WORD STA B SAVE THE LOWER HALF STATUS LDA EQT5,I GET THE SHORT STATUS AND LHALF GET UPPER HALF OF EQT5 IOR B PUT IN THE LOWER HALF OF THE STATUS STA EQT5,I STORE AWAY THE STATUS JMP STSTS,I RETURN TO CALLER *