File: MR.TK of Disk: Disks/MyPDP/m8-blue-rka1-rkb1
(Source file text)
/MR.TK 1-OCT-79 WVDM /THIS IS A MARKSENSE READER BLOCKDRIVER FOR MULTI8 V7A /ITS STRUCTURE MIGHT REMIND YOU OF THE OS/8 CARDERADER HANDLER /THE 12-BIT IN-OUT INTERFACE (DR8-EA) IS USED /THE INPUT REGISTER LOOKS AS FOLLOWS: / / \ E / C / S \ H / D / D \ D / D / D \ D / D / D \ / / WHERE: E = END OF CARD H HIGH TRANS TO FF AND SKIP LINE / C = CARD UNDER PHOTOCELL H / S = MARK STROBE L HIGH TRANS TO FF AND SKIP LINE / H = HOPPER EMPTY H / D = 8 BITS OF DATA / /THE OUTPUT REGISTER LOOKS AS FOLLOWS: / / \ C / S / 0 \ 0 / 0 / 0 \ 0 / 0 / 0 \ 0 / D / M \ / / WHERE: C = CARD FEED / S = STROBE RESET / D = DATA RESET / M = MOTOR ENABLE MRDI=6540 /DISABLE INTERRUPT MREI=6541 /ENABLE INTERRUPT MRSS=6542 /SKIP ON COMPOSITE FLAG MRCI=6543 /AC CLEARS INPUT BITS MRRI=6544 /JAM INPUT IN AC MRCO=6545 /AC CLEARS OUTPUT BITS MRSO=6546 /AC SETS OUTPUT BITS MRRO=6547 /JAM OUTPUT IN AC *200 /TASK HEADER: "M^100+"R&3777 /NAME IS 'MR'. NORMALLY CALLED BY 'KE' 401 /A TWO PAGE TASK CONNECTED TO ONE INTERRUPT CRD /CONNECT TO INTERRUPTS FROM THE CARDREADER MDRINT /INTERRUPT ENTRYPOINT /PAGE HEADER: MDRIN4, MDRGCH /GET CHARACTER ROUTINE MDRCA, 0 /BUFFER POINTER /TASK CODE: MR, SNA //CLOSE CALL ? JMP MRCLOSE //YES, QUIT JMS DEFER //GET FUNCTION WORD AND C70 //GET BUFFER FIELD BITS TAD C6201 //MAKE A "CDF N" DCA MDBCDF //SAVE IT IN THE GET CHAR LOOP TAD I X //GET FUNCTION WORD AGAIN ISZ X SPA //IS IT A WRITE FUNCTION? JMP MDRERR //YES - HARD ERROR AND C7700 //GET COUNT BITS CMA DCA MDRWC //SAVE WORD COUNT (DIVIDED BY 2) - 1 TAD I X //GET BUFFER ADDRESS DCA MDRCA //AND SAVE IT CALMON, JMP MDRBUF /JMS MONITOR /NOW RESERVE AN EVENT RESERV RETURN CONTINUE DCA MREVNT /THAT'S WHERE W'LL SIGNAL COMPLETION DCA CTRLZ /CLEAR E-O-F FLAG JMP MDRISZ /TEST IF NO TRANSFER MDRLP, JMS I MDRIN4 /GET A CHARACTER DCA MDRTM1 /DATA FIELD STILL CURRENT ON RETURN! JMS I MDRIN4 /GET NEXT CHARACTER DCA MDRTM2 /AND SAVE IT JMS I MDRIN4 /GET NEXT CHARACTER RTL RTL /GET THE FIRST FOUR BITS OF IT DCA MDRTM3 /SAVE THE REST FOR LATER TAD MDRTM3 AND C7400 /ONLY 4 BITS TAD MDRTM1 /ADD THOSE BITS TO THE 1ST CHAR MDBCDF, HLT //CDF TO BUFFER FIELD DCA I MDRCA //STORE 1ST CHARACTER ISZ MDRCA //BUMP POINTER TO BUFFER CTRLZ, NOP //PROTECT THE ISZ AGAINST BAD BUFFER LOC'S TAD MDRTM3 RTL RTL //NOW GET LOW ORDER 4 BITS AND C7400 //AND ONLY 4 BITS TAD MDRTM2 //ADD IN THE 2ND CHARACTER DCA I MDRCA //AND STORE THE WORD ISZ MDRCA //BUMP POINTER AGAIN NOP //PROTECT THE ISZ MDRISZ, CDTOIF /RESET TO CURRENT FIELD ISZ MDRWC /DONE? JMP MDRLP /NO - LOOP TAD CTRLZ /GETS ZERO OR EOMERR MONCON, JMS MONITOR SIGNAL HALT MREVNT, 0 /COMPLETION EVENT # MDRWC, 0 /WORDCOUNT DIVIDED BY 2 MDRERR, AC0004 //RETURN FATAL ERROR MRCLOSE,CMA //EVENT -1 GIVES IMMEDIATE OK JMS MONITOR EXIT SWPOUT MDRTM1, 0 MDRTM2, 0 MDRTM3, 0 MDRBUF, MRDI //DISABLE MARKREADER INTERRUPTS STA // MRCI //CLEAR INPUT FLAGS MRCO //AND CLEAR OUTPUT (YOU NEVER KNOW) IOF //TURN OFF INTERRUPTS AC0001 // MRSO //AND WARM UP MOTOR ISZ ZERO //WAIT FOR NOISE JMP .-1 STA MRCI //CLEAR AGAIN MRDI //? CLA ION //DON'T FORGET TAD MTCK //WAIT FOR 2 SECONDS TO CLEAR EVENT JMS MONITOR //AND GET MOTOR UTS WAIT // CRD // CLA // STA MRCI //NOW CLEAR INPUTS AGAIN (NOISY MACHINE) CLA TAD MONCON //GET 'JMS MONITOR" DCA CALMON //AND PUT IT IN TASK CODE JMP CALMON //AND CALL MONITOR MTCK, -DGNTICK^2 ZERO, 0 ZBLOCK 400-. /CARD BUFFER PAGE /PAGE HEADER: /THE CARDBUFFER RUNS INTO THIS PAGE BY INSERTING /SUFFICIENT NON-ZERO LOCATIONS HERE: . . . . . . . . . . . . . . . . IFNZRO .-MDRBUF-120&4000 <ADD SOME MORE DOTS!> MDRABF, MDRBUF-1 XCTRLZ, CTRLZ /SECOND PAGE CODE SECTION: MDRGCH, 0 /GET A CHARACTER ROUTINE - ENTER WITH DF=CURRENT MDRJMP, 0 /THIS IS "JMP MDRDAT" AFTER A ^Z ISZ MDRCNT /MORE CHARACTERS IN THE INTERNAL BUFFER? JMP MDRGET /YES - GET ONE MDRGE4, ISZ MDRCT2 /GIVE A 215, 212 FOR EVERY CARD JMP MDRCLF /215, 212 ROUTINE ACM3 DCA MDRCT2 /RESET COUNT TO -3 IFNZRO .&177-32 < LOCERR, _ > MDR400, 400 /MAKES CONSTANT 232 TAD MDRM40 DCA MDROFF /RESET FINAL TIMOUT MDRGE7, MRRI /SEE IF HOPPER FULL MDR232, AND MDR400 /TEST HOPPER BIT MDRMBA, SZA CLA /ALSO '_' TEST (7640 = -137-1) JMP MDRGE0 /NO GO - TRY AGAIN AFTER WAIT TAD MDRABF / DCA MDRPT /INITIALIZE BUFFER POINTER STA MRCI /CLEAR ODD FLAGS MRSO /RESET STROBE AND DATA, FEED CARD MREI /SET INTERRUPT ENABLE - AC=-1 SO WHAT? TAD (-DGNTICK /TIMEOUT 1 SECOND JMS MONITOR /WAIT FOR CARD COMPLETION WAIT CCRD, CRD MDRM40, SMA SZA CLA /TIMEOUT ? JMP TMOUT /YES, TRY AGAIN MDRGE3, TAD I MDRPT /GET LAST CHARACTER TAD MDRM40 /TEST FOR SPACE SZA CLA /WAS IT? JMP MDRGE5 /NO ACM1 TAD MDRPT /YES, DCA MDRPT /BACK UP POINTER ONE ISZ MDRCNT /AND TAKE COUNT DOWN BY 1 JMP MDRGE3 /TEST AGAIN OR... JMP MDRGE4 /IF COUNT IS ZERO THEN A BLANK CARD MDRGE5, TAD I MDRPT /GET LAST NON-SPACE TAD MDRMBA /THIS FORMS 7777 IF WORD CONTAINS "_" AND MDRCNT /THIS MAINTAINS 7777 IF MDRCNT IS -1 CMA SNA CLA /ARE BOTH CONDITIONS TRUE? JMP MDRGEZ /YES - MUST BE END OF FILE MDRGE6, TAD MDRABF /SET POINTER TO BUFFER DCA MDRPT MDRGET, ISZ MDRPT /BUMP POINTER TAD I MDRPT /GET A CHARACTER MDRDAT, TAD C200 /MAKE IT ASCII JMP I MDRGCH MDRCLF, ACM1 DCA MDRCNT /SET MAIN COUNT TO SKIP TAD MDRCT2 CLL CMA RTL /ALL THIS DOES IS... TAD MDRCT2 /MAKE A 2 OR -1 TAD MDR13 /SO THIS MAKES A 15 OR 12 MDRMOD, JMP MDRDAT /HERE IF TIMEOUT: MDRGE0, JMS MONITOR /HERE IF HOPPER NOT FULL STALL /STALL A WHILE MDR13, 13 SKP CLA /ABANDON IF UNATTENDED TMOUT, DCA MDRCNT /CLEAR COUNT IN CASE PARTIAL CARD READ (E.G. JAM) ISZ MDROFF /TEST IF NOTHING COMING JMP MDRGE7 /TIMED OUT - RESTART CARD MDRGEZ, ACM1 /HERE IF E-O-F CARD OR INACTIVE DCA MDRCNT /RESET COUNTS TO SKIP ACM1 DCA MDRCT2 TAD MDRMOD DCA MDRJMP /SET TO GIVE 0'S TAD (EOMERR DCA I XCTRLZ /AND A SOFT ERROR TAD MDR232 /^Z JMP I MDRGCH /EXIT /INTERRUPT ROUTINES: INTERRUPT ENABLE CLEARED IN SKIP CHAIN / MDRINT, MRRI ///CARD DONE? SMA JMP MDRGE2 ///NO - TRY FOR DATA READY AC4000 ///SET BIT FOR CARD FEED MRCO ///DISABLE CARD FEED NOW STA /// MRCI ///CLEAR CARD DONE FLAG MRDI ///EOC, END OF INTERRUPT CLA ///LEIDER TAD CCRD /// CIF 0 ///SIGNAL EVENT TO TASK LEVEL JMS I ZSOFINT /// 0 /// MDRGE2, CLL RTL ///DATA READY? SMA CLA JMP IGNORE ///NO - GHOST INTERRUPT ACM1 ///YES, STORE IN BUFFER TAD MDRCNT /// DCA MDRCNT ///COUNT THE CHARACTERS ISZ MDRPT ///BUMP POINTER MRRI ///GET 8-BIT AND C177 DCA I MDRPT ///STORE CHARACTER IGNORE, STA MRCI ///CLEAR OLD FLAGS MREI ///MORE DATA, MORE INTERRUPTS CLA ///LEIDER CIF CDF 0 /// JMP I ZFSTEXT ///RETURN FROM INTERRUPT MDRCNT, -1 /MAIN COUNT MDRCT2, -1 /215, 212 COUNT MDRPT, 0 /BUFFER POINTER MDROFF, -40 /FOR FINAL TIMOUT $