File: KR.TK of Disk: Disks/MyPDP/m8-blue-rka1-rkb1
(Source file text)
/KR.TK 23-JUL-79 /THIS IS A CARDREADER BLOCKDRIVER FOR MULTI8 V7A /ITS STRUCTURE MIGHT REMIND YOU OF THE OS/8 CARDERADER HANDLER RCSF=6631 RCRA=6632 RCNO=6635 RCSP=6671 RCSE=6672 RCRD=6674 *200 /TASK HEADER: "K^100+"R&3777 /NAME IS 'KR'. NORMALLY CALLED BY 'KE' 401 /A TWO PAGE TASK CONNECTED TO ONE INTERRUPT CRD /CONNECT TO INTERRUPTS FROM THE CARDREADER CDRINT /INTERRUPT ENTRYPOINT /PAGE HEADER: CDRIN2, CDRJMP CDRIN4, CDRGCH CDRTMP, 0 /TASK CODE: KR, JMP CDRBUF //INITIALIZE, BECOMES: / SNA //CLOSE CALL ? JMP KRCLOSE //YES, QUIT JMS DEFER //GET FUNCTION WORD AND C70 //GET BUFFER FIELD BITS TAD C6201 //MAKE A "CDF N" DCA CDBCDF //SAVE IT IN THE GET CHAR LOOP TAD I X //GET FUNCTION WORD AGAIN ISZ X SPA //IS IT A WRITE FUNCTION? JMP CDRERR //YES - HARD ERROR AND C7700 //GET COUNT BITS CIA DCA CDRWC //SAVE WORD COUNT (DIVIDED BY 2) TAD I X //GET BUFFER ADDRESS DCA CDRCA //AND SAVE IT JMS MONITOR //NOW RESERVE AN EVENT RESERV RETURN CONTINUE DCA KREVNT //THAT'S WHERE W'LL SIGNAL COMPLETION DCA CTRLZ //CLEAR E-O-F FLAG CDRLP, CDTOIF / JMS I CDRIN4 /GET A CHARACTER DCA CDRTM1 /DATA FIELD STILL CURRENT ON RETURN! JMS I CDRIN4 /GET NEXT CHARACTER DCA CDRTMP /AND SAVE IT JMS I CDRIN4 /GET NEXT CHARACTER RTL RTL /GET THE FIRST FOUR BITS OF IT DCA CDRTM2 /SAVE THE REST FOR LATER TAD CDRTM2 AND C7400 /ONLY 4 BITS TAD CDRTM1 /ADD THOSE BITS TO THE 1ST CHAR CDBCDF, HLT //CDF TO BUFFER FIELD DCA I CDRCA //STORE 1ST CHARACTER ISZ CDRCA //BUMP POINTER TO BUFFER CTRLZ, NOP //PROTECT THE ISZ AGAINST BAD BUFFER LOC'S TAD CDRTM2 RTL RTL //NOW GET LOW ORDER 4 BITS AND C7400 //AND ONLY 4 BITS TAD CDRTMP //ADD IN THE 2ND CHARACTER DCA I CDRCA //AND STORE THE WORD ISZ CDRCA //BUMP POINTER AGAIN CDRTM1, NOP //PROTECT THE ISZ ISZ CDRWC //DONE? JMP CDRLP //NO - LOOP TAD CTRLZ //GETS ZERO OR EOMERR JMS MONITOR SIGNAL HALT KREVNT, 0 //COMPLETION EVENT # CDRERR, AC0004 //RETURN FATAL ERROR KRCLOSE,CMA //EVENT -1 GIVES IMMEDIATE OK JMS MONITOR EXIT SWPOUT CDRCA, 0 /BUFFER POINTER CDRWC, 0 /WORD COUNT DIVIDED BY 2 CDRTM2, 0 /SPLIT WORD TEMPORARY /THE TRANSLATION TABLE: CDRTBL, 0021;2223;2425;2627;3031;3203;4007;3502 2017;6364;6566;6770;7172;7514;0577;3637 1552;5354;5556;5760;6162;0104;1211;3374 0641;4243;4445;4647;5051;7316;3410;1376 /DO NOT INSERT ANYTHING BETWEEN "CDRTBL" AND "CDRBUF"!! CDRBUF, DCA AC //SAVE USER AC TEMPORARILY RCNO //DISABLE CARDREADER INTERRUPTS RCRA //CLEAR COLLUM FLAG ACM1 //CLEAR EVENT BY WAITING WITH SMALL JMS MONITOR //TIMEOUT WAIT // CRD // CLA // TAD CSNA // DCA KR //PUT 'SNA' IN TASK CODE TAD AC //RESTORE AC JMP KR //AND START TASK AC, 0 CSNA, SNA ZBLOCK 400-. /CARD BUFFER PAGE /PAGE HEADER: /THE CARDBUFFER RUNS INTO THIS PAGE BY INSERTING /SUFFICIENT NON-ZERO LOCATIONS HERE: . . . . . . . . IFZERO CDRBUF+50-.&4000 <ADD SOME MORE DOTS!> CDRABF, CDRBUF-1 CDRTAD, CDRTBL XCTRLZ, CTRLZ /0 /SECOND PAGE CODE SECTION: CDRGCH, 0 /GET A CHARACTER ROUTINE - ENTER WITH DF=CURRENT CDRJMP, 0 /THIS IS "JMP I CDRGCH" AFTER A ^Z ISZ CDRCNT /MORE CHARACTERS IN THE INTERNAL BUFFER? JMP CDRGET /YES - GET ONE CDRGE4, ISZ CDRCT2 /GIVE A 215, 212 FOR EVERY CARD JMP CDRCLF /215, 212 ROUTINE ACM3 DCA CDRCT2 /RESET COUNT TO -3 CDRGE7, RCSE /SELECT A CARD JMP CDRGE0 /NO GO - TRY AGAIN DCA CDRSW /SET PACKING SWITCH TAD CDRABF / DCA CDRPT /INITIALIZE BUFFER POINTER RCRA /CLEAR DATA FLAG AC0001 /SET INTERRUPT ENABLE RCNO / TAD (-DGNTICK /TIMEOUT 1 SECOND JMS MONITOR /WAIT FOR CARD COMPLETION WAIT CCRD, CRD SZA CLA /TIMEOUT ? JMP TMOUT /YES, TRY AGAIN CDRGE3, TAD I CDRPT /GET LAST TWO CHARACTERS SZA /BOTH SPACES? JMP CDRGE5 /NO ACM1 TAD CDRPT DCA CDRPT /BACK UP POINTER ONE ISZ CDRCNT ISZ CDRCNT /AND TAKE COUNT DOWN BY 2 JMP CDRGE3 /TEST AGAIN OR... JMP CDRGE4 /IF COUNT IS ZERO THEN A BLANK CARD CDRGE5, AND C77 /IS RIGHT HAND CHARACTER A SPACE? SNA CLA ISZ CDRCNT /YES A SPACE - REDUCE COUNT TAD I CDRPT /GET LAST NON-SPACE TAD C77 /THIS FORMS 7777 IFF WORD CONTAINS "_" AND CDRCNT /THIS MAINTAINS 7777 IFF CDRCNT IS -1 CMA SNA CLA /ARE BOTH CONDITIONS TRUE? JMP CDRGEZ /YES - MUST BE END OF FILE CDRGE6, TAD C77 DCA CDRSW /SET OFFSET FROM "CDRTBL" CDRGET, ISZ CDRSW /BUMP OFFSET TAD CDRSW /OFFSET INTO AC JMS CDRGE8 /GET A CHARACTER TAD C240 /MAKE IT ASCII CDRMOD, JMP I CDRGCH CDRCLF, ACM1 DCA CDRCNT /SET MAIN COUNT TO SKIP TAD CDRCT2 CLL CMA RTL /ALL THIS DOES IS... TAD CDRCT2 /MAKE A 2 OR -1 TAD (213 /SO THIS MAKES A 215 OR 212 JMP I CDRGCH /HERE IF E-O-F CARD CDRGEZ, ACM1 DCA CDRCNT /RESET COUNTS TO SKIP ACM1 DCA CDRCT2 TAD CDRMOD DCA CDRJMP /SET TO GIVE 0'S TAD (EOMERR DCA I XCTRLZ /AND A SOFT ERROR TAD (232 /^Z JMP I CDRGCH /EXIT /HERE IF RCSE DID NOT SKIP CDRGE0, JMS MONITOR /STALL A WHILE STALL 5 JMP CDRGE7 /TRY AGAIN (AC=2!) /THE NEXT ROUTINE IS USED TO FETCH BYTES, BOTH /FROM THE CARD BUFFER AND FROM THE TRANSLATION TABLE CDRGE8, 0 /GET FROM BUFFER ROUTINE CLL RAR /DIVIDE BY 2 - AND INTO LINK IS INDICATOR TAD CDRTAD /ADDRESS OF "CDRTBL" DCA CDRTM3 /SET POINTER TAD I CDRTM3 /GET WORD SNL /SHIFT? BSW /YES AND C77 /GET 6 BITS JMP I CDRGE8 /HERE IF TIMEOUT: TMOUT, DCA CDRCNT /CLEAR COUNT IN CASE PARTIAL CARD READ (E.G. JAM) JMP CDRGE7 /TIMED OUT - RESTART CARD /INTERRUPT ROUTINES: CDRINT, RCSP ///CARD DONE? JMP CDRGE2 ///NO - TRY FOR DATA READY RCRD ///CLEAR CARD DONE FLAG RCNO ///CLEAR INTERRUPT ENABLE TAD CCRD /// CIF 0 ///SIGNAL EVENT TO TASK LEVEL JMS I ZSOFINT /// 0 /// CDRGE2, RCSF ///DATA READY? JMP IGNORE ///NO - GHOST INTERRUPT RCRA ///READ ALPHA JMS CDRGE8 ///GET TABLE ENTRY ISZ CDRSW ///WHICH SIDE? JMP CDRGE9 ///LEFT SIDE TAD I CDRPT /// DCA I CDRPT ///FORM RIGHT SIDE JMP IGNORE ///CONTINUE CDRGE9, BSW ///SHIFT LEFT ISZ CDRPT ///BUMP POINTER DCA I CDRPT ///STORE LEFT SIDE ACM2 ///-2 V3 FROM SIS BULLETING JAN 73 TAD CDRCNT /// DCA CDRCNT ///COUNT THE CHARACTERS ACM1 ///RESET SWITCH DCA CDRSW /// IGNORE, CIF CDF 0 /// JMP I ZFSTEXT ///RETURN FROM INTERRUPT CDRTM3, 0 CDRM27, -27 /-27-3=-32 ^Z TEST CDRCNT, -1 /MAIN COUNT CDRCT2, -1 /215, 212 COUNT CDRPT, 0 /BUFFER POINTER CDRSW, 0 /SWITCH $