LDA .C9Z STA F3D PUT ADDR IN CALL * ISZ C9R * LDA C9R,I STA C9Y STORE IT IN C9Y. LDA C9Z GET TRACK # SZA LDA .C9Y STA F3E * * MUST PUT SYSTEM TO CORRECT USER DISC * LDA C9Y LDB C9Z GET TRACK # SZB,RSS DONT SKIP UNLES ITS THERE JMP FP NO SO IGNORE * LDB A AND M377$ (377 OCTAL) STA C9Y SET SECTOR * LDA B ALF,ALF AND M377$ (377 OCTAL) STA F4H STORE USER SUBCHAN * CPA CUDSC IS SAME AS CURRENT? RSS YES SO SKIP JSB F5 CHANGE USER DISC * * * * * ALL PARAMS NOW STORED SO SET RETURN ADDR * FP LDA .F3B FN LDB A,I GET PARAM SZB,RSS IS PRESENT JMP FM NO INA YES SO INCR JMP FN GO VACK * * PUT RETURN ADDR IN EXEC CALL * FM STA F3G * * CALL NOW COMPLETE SO SET LU TABLE ISZ C9R LDA C9R,I IOR FH SET PARAM LOCK BIT IOR F1B & SEG # IN LU TABLE. LDB .CLU INB STA B,I * * * LU TABLE NOW UP TO DATE SO INITIATE CALL JSB F3 * * NOW UPDATE PQ * * THE POINTER FCPQ MUST BE UPDATED * LDA =LPQL LENGTH OF PQ ENTRY CMA,INA MAKE -VE LDB FCPQ GET ADDR STB FL SAVE IT ADA B GET NEW CURRENT ADDR STA FCPQ SAVE * * MOVE NEXT ENTRY LDA FL ADA =LPQL ADD PQ ENTRY LENGTH LDB CPQE GET LAST FULL ENTRY POINTER. ADB =LPQL STB FS SAVE * * NOW MOVE THE QUEUE * FT CPA FS ALL DONE JMP FU YES LDB A,I GET WORD STB FL,I INA ISZ FL ALL MOVED JMP FT NO * * UPDATE PQ POINTER * FU LDA PQC,I DECREMENT PQ ENTRY COUNT ADA N01$ BY 1. STA PQC,I LDA CPQE DECREMENT ADDRESS BY 9. ADA =D-9 STA CPQE * * JMP FDT * C9A NOP C9H NOP C9R NOP C9Y NOP .C9Y DEF C9Y C9Z NOP .C9Z DEF C9Z HED ***ROUTINE F1 - CHECK FOR FREE LU - 10/74*** ************************************************ C * * C * CHECK LU TABLE ENTRY FOR NON-BUSY * C * IF DEVICE IS FREE, CHECK FOR A LOCK * C * IF DEVICE IS LOCKED, CHECK FOR TASK * C * ID MATCH (USER PARAM) * C * * C * EXIT: (B) = 0 IF REQUEST IN PENDING * C * QUEUE CAN BE PERFORMED - * C * DEVICE IS FREE & UNLOCKED OR * C * DEVICE IS FREE & LOCKED FOR * C * THIS TASK * C * (B) # 0 IF REQUEST CANNOT BE PERFORMED* C * DEVICE IS BUSY OR * C * DEVICE IS FREE BUT LOCKED FOR * C * ANOTHER TASK * C * * C ************************************************ C * C F1 NOP C CLA C STA F1B CLEAR LOCK BIT C LDA FCPQ GET ADDR CURRENT PQ ENTRY C ADA P02$ GET ADDR OF CONTROL WORD C C LDA A,I C C AND M77$ GET LOGICAL UNIT C C CPA P03$ C LDA P02$ C LDB A C JSB LAD GET LU TABLE ENTRY FOR THIS LU C C * C LDB .CLU,I GET LUT ENTRY WORD 1 C C SZB,RSS FREE & UNLOCKED? C C F1A JMP F1,I YES, RETURN - CALL IS OK C C * C INB,SZB THIS LU BUSY? C JMP F1A YES, RETURN - SKIP THIS LU C C * C * THIS DEVICE FREE BUT LOCKED - C * CHECK THE USER PARAM (TASK ID) C * C LDA LULM C C STA F1B SET LOCK BIT C C LDA FCPQ C C ADA P08$ GET ADDRESS OF PQ ENTRY WORD 9 C C LDA A,I USER ID/SEG# C ALF,ALF C AND M377$ GET USER(TASK) ID (0-255) C STA F1C SAVE THE PARAM C * C LDA .CLU C ADA =LLUSN GET ADDR OF LUT WORD 2 C LDA A,I USER ID/LOCK/SEG# C ALF,ALF C AND M377$ GET TASK ID (0-255) C CCB C CPA F1C THIS TASK? C CLB YES, CALL IS OK C JMP F1A RETURN C HED *** ROUTINE F3, INITIATE TRANSFER AND UPDATE CQ *** * * * * THE PARAMETERS USED MUST BE SET UP BEFORE THIS * * ROUTINE IS CALLED * F3 NOP ENTRY POINT * DO IT UNLESS ITS FOR PHANTOM LU LU=3 LDA F3A GET CONWD AND M77$ MASK LU CPA M77$ IS IT 77B JMP F3F YES SO SKIP EXEC CALL JSB EXEC F3G NOP .CEC DEF CEC ADDRESS OF CURRENT EXEC CALL. .F3A DEF F3A F3B NOP BUFF ADDR F3C NOP BUFF LENGTH F3D NOP F3E NOP F3F NOP FOR DUMMY * * UPDATE DEBUG TABLE * ISZ TB7 # OF I/O STARTED NOP LDA F3A AND M77$ CPA P02$ IS FOR DISK (LU=2) ISZ TB2 INCR.COUNT NOP CPA P03$ IS FOR DISK (LU=3) ISZ TB2 INCR. COUNT NOP * * NOW UPDATE CURRENT QUEUE (CQ) LDB C9A GET PRIORITY BLF,BLF ROTATE LDA F3A GET CONWD AND M377$ MASK LU IOR B OR IN PRIORITY STA F3A SAVE CQ ENTRY * * NOW PUT IN CORRECT PLACE IN CQ * LDA .CQ STA C9R SAVE START OF CQ F3WA LDA C9R,I GET ENTRY LDB C9R IS IT LAST ENTRY CPB CCQE IF SO ENTER IT JMP F3W GO DO IT ALF,ALF AND M377$ MASK PRIORITY CMA NEGATE AND ADD ONE ADA C9A SSA,RSS IS A LOWER PRIORITY JMP F3Y YES * ISZ C9R MOVE POINTER JMP F3WA GO CHECK NEXT ENTRY * * NOW MOVE THE LOW PRIORITY ENTRIES DOWN ONE * F3Y LDA CCQE ADDR OF LAST ENTRY STA F3B ADA N01$ SUB TRACT ONE F3CR LDB A,I GET ENTRY STB F3B,I MOVE IT LDB C9R CPB A ALL DONE? JMP F3W YES LDB F3B ADB N01$ MOVE POINTER STB F3B ADA N01$ MOVE POINTER JMP F3CR MOVE NEXT ENTRY * * F3W LDA F3A GET ENTRY STA B,I ISZ CCQE MOVE Q POINTER JMP F3,I RETURN * * CONSTANTS FOR F (EXCEPT F4) * .F3B DEF F3B F3A NOP FOR CONWD FCPQ NOP FOR CURRENT PQ ENTRY F1B NOP FOR LOCKED FLAG FROM F1 F1C NOP FOR SEG # FROM F1 FH NOP FOR LOCK FLAG FL NOP FOR COUNT FOR LOOP FS NOP TEMP HED ***ROUTINE F4*** * THIS SECTION CONVERTS REQ CODES 14 AND 15 TO -1 AND -2 * F4 NOP ENTRY POINT * * UPDATE DEBUG TABLE * ISZ TB3 NOP LDA CREQ CHANGE REQ CODE- ADA =D-13 TO -1 CMA,INA OR- STA CREQ -2 STB F4Y SAVE POINTER STA CTT SAY ITS A FILE REQ. * * * FIND USER PARAMS (FILE # + REL SECTOR) * F4B LDB ARG5,I GET FILE # LDA ARG6,I GET SECTOR # STA F4D STORE SECTOR # * * SEE IF SECTOR IS -VE * SSA IS -VE JMP F4L YES SO ERROR * * NOW GET FILE INFORMATION * LDA B ADA N01$ SUB 1 MPY =LUFDS USER FILE DIREC LENGTH SSA FILE # ZERO OR NEG? JMP F4L YES, REJECT. ADA .FD ADD ADDRESS OF FILE DIREC STA F4E * * CHECK FOR OPENED FILE * LDB A,I GET TRACK/SECTOR SZB,RSS IS OPENED? JMP F4L NO SO ERROR * * CHECK REQUEST IS WITHIN FILE * LDA ARG4,I GET BUFFER LENGTH CLB DIV =D128 CONVERT TO SECTORS SZB,RSS TAKE CARE OF PARTIAL- ADA N01$ SECTORS STA B SAVE # OF SECTORS * LDA F4E ADA P02$ ADD 2 TO ADDR LDA A,I GET FILE LENGTH CMA,INA ADA ARG6,I ADD REQUESTED SECTOR ADA B # OF SECTORS TO ACCESS SSA IS WITHIN FILE? JMP F4R YES * F4L LDA ERR5 STA RST SET ERROR STATUS LDA TCS NOW SET RETURN- STA FRET POINT F4ZZ JMP F4,I EXIT * * NOW GET STARTING SECTOR OF FILE * F4R LDA F4E,I AND M377$ * * ADD REQ SECTOR * ADA F4D * * CHANGE TO TRACK AND SECTOR * CLB DIV SECTR #OF SECTORS PER TRACK. * * A CONTAINS TRACK OFFSET, B CONTAIN SEC # * STA F4F TRACK OFFSET LDA F4E,I GET TRACK SECTOR ALF,ALF AND M377$ MASK TRACK ADA F4F ADD OFFSET STA ARG5 STORE * ISZ F4E LDA F4E,I GET SUBCHAN ALF,ALF ROTATE IOR B OR IN SECTOR STA ARG6 STORE * LDB F4Y JMP F4ZZ GO TO EXIT HED *** ROUTINE F5, CHANGE USER DISC*** * * NOW MAKE EXEC CALL TO CHANGE USER DISC * F5 NOP ENTRY POINT * * SAVE INFO SO NEXT TIME WE CAN DO IT QUICKLY * LDB .FBUF GET BUFFER ADDR. ADB CUDSC ADD CURRENT UD LDA UDNTS GET NEXT UD TRK/SECT STA B,I SAVE IT ADB P32$ GET TO 2ND HALF OF TABLE(7905) LDA DISCL GET TRK/SECT OF DISC LABEL STA B,I SAVE IT * LDA F4H GET REQ'D UD ADA .FBUF ADD BUFFER ADDR. STA FBUD SAVE ADDR LDA A,I IF WE CAN DO THIS IN CORE- INA,SZA THEN DO SO. CAN ONLY DO IT- JMP FHA IF WE'VE DONE THIS DISC BEFORE * * MUST CHANGE USER DISC VIA EXEC CALL * JSB EXEC DEF *+5 DEF .23 DEF F4D DEF F4H DEF .1 F5E JMP F5,I EXIT * * * COME HERE IF WE CAN CHANGE USER DISC WITHOUT GOING TO THE DISC * FHA LDB FBUD LDA B,I GET USER DISC TRK/SECT ADB P32$ RESET TABLE POINTER (7905) STB FBUD LDB F5A1 JSB FMOV PUT ON BASE PAGE * LDA FBUD,I PUT NEW TRK/SECT- LDB F5A2 FOR LABEL ON BASE PAGE JSB FMOV * LDA M377$ SET "CUDLA" LDB F5A4 TO 377B JSB FMOV * LDA F4H GET UD # LDB F5A5 JSB FMOV * JMP F5E GO TO EXIT * * FBUD NOP .FBUF DEF FBUF FBUF REP 64 32 SUBCHANNELS MAX (7905) DEC -1 * F5A1 OCT 157 F5A2 OCT 200 F5A4 OCT 163 F5A5 OCT 161 * * PUT A WORD ON BASE PAGE * FMOV NOP ENTRY POINT JSB EXEC DEF *+2 DEF BEJ JMP FMOV,I * * F4D NOP FOR REL SECT # F4E NOP FOR USER FILE DIREC ADDR * F4Y NOP F4F NOP F4H DEC -1 FOR UD .23 DEC 23 P32$ DEC 32 (7905) .1 EQU 54B C9V NOP .C9V DEF C9V HED ***ROUTINE LAD*** * * ENTER - BREG = LU #. * * EXIT - BREG = LU#. * AREG = LU ENTRY ADDRESS. * .CLU = LU ENTRY ADDRESS. * LAD BSS 1 ENTRY POINT. STB LAD1 LDA B CPA M77$ IS IT PHANTOM LU? LDA P03$ YES SO USE LU 3 TABLE ADA N01$ (-1). MPY =LLUL ADA .LU STA .CLU LDB LAD1 JMP LAD,I * LAD1 BSS 1 SPC 5 * * ENTER - BREG = LU #. * * EXIT - BREG = LU #. * AREG = STATUS. * SC3 = STATUS. * SC4 = TLOG. * SCHK BSS 1 ENTRY POINT. STB SC2 JSB EXEC EXEC CALL FOR STATUS. DEF *+5 DEF SC1 DEF SC2 DEF SC3 DEF SC4 LDB SC2 JMP SCHK,I EXIT. * SC1 DEC 13 REQUEST CODE FOR STATUS. SC2 BSS 1 BUFFER FOR LU #. SC3 BSS 1 BUFFER FOR STATUS. SC4 BSS 1 BUFFER FOR TLOG. HED ***ROUTINE A*** ACOD BSS 1 ENTRY POINT * CHECK FOR UNLOCK REQUEST. LDA ARG1,I UNLOCK (CODE = 52)? CPA =D52 RSS JMP A15 NO. GO TO A15. LDA TCS YES SET UP- STA FRET RETURN ADDRESS LDB ARG2,I GET LU #. CPB P03$ IS LU# 3? LDB P02$ YES SO CHANGE TO 2 * JSB LAD GET LU TABLE ENTRY ADDRESS. ADA =LLUSN LDA A,I ALF,ALF GET LUT TASK ID C AND M377$ C CPA RPAR CORRECT TASK? C JMP A10 YES. LDA ERR7 GET ERROR 7 CODE JMP A12 A10 LDB .CLU CLEAR LOCKED CONDITION. INB LDA B,I AND LULC CLEAR BIT 7 OF 2ND STA B,I WORD OF LU ENTRY. LDA .CLU,I IF 1ST WORD = -1, INA,SZA,RSS THEN SET IT TO 0. STA .CLU,I CLA A12 STA RST STORE USER STATUS JMP A24 * * CHECK FOR IN-LINE RETURN TO MAIN REQUEST. A15 CPA =D54 RETURN TO MAIN (CODE = 54)? JMP A20 YES. JMP A25 NO. SET ERROR STATUS, EXIT. A20 LDA CMR SET UP RETURN ADDRESS LDB MORS AND FLAG. SZB LDA TCS STA FRET CCA SET CURRENT SEGMENT ADDRESS STA MORS TO -1 TO INDICATE THE MAIN. CLA STA RST CLEAR STATUS STA CMR STA PRIOR * * ALL EXITS COME THRU A24 (REQUEST DONE) AND A25 (REQ. NOT DONE). * AREG = 0 (DONE, GOOD OR BAD), AREG = -1 (NOT DONE). A24 CLA,RSS A25 CCA JMP ACOD,I HED ***ROUTINE E*** SPC 4 * * * ECOD SEARCHES THE CQ BUFFER FROM THE TOP FOR * A FINISHED TRANSFER. THIS WILL BE THE OLDEST * FINISHED TRANSFER. THE ENTRY IS DELETED & THE * REMAINING ENTRIES IN CQ ARE MOVED UP BY ONE. * SPC 2 ECOD BSS 1 ENTRY POINT. LDA .CQ .CCQ := CQ POINTER. STA .CCQ RSS SPC 1 EC1 ISZ .CCQ ADVANCE THE CQ POINTER. LDB .CCQ,I IS TESTING CQ SZB,RSS DONE (ENTRY = 0) ? JMP EC25 YES. EXIT. SPC 1 * GET LU# * LDA B AND M77$ MASK LU# LDB A CLA CLEAR STATUS CPB M77$ IS IT PHANTOM LU? RSS YES SO OMIT STATUS CHECK JSB SCHK NOT DONE. DO STATUS CHECK. STA RST AND =B100000 SZA IS DEVICE BUSY JMP EC1 YES. CHECK NEXT ENTRY. LDA SC4 SET UP RETURN LOG IN CASE STA RLOG A RETURN IS POSSIBLE. * * SPC 1 * FOUND A FINISHED TRANSFER. BREG = LU #. * MUST CHECK TO SEE IF RETURN TO ORIGINAL CALLING * SEGMENT IS POSSIBLE. SET UP SOME OF THE RETURN * PARAMETERS IN CASE A RETURN IS POSSIBLE. * STB RLU CPB P03$ IS IT LU 3? LDB P02$ YES SO CHANGE TO 2 * JSB LAD GET LU ENTRY ADDRESS. STA RSDA ADA =LLUSN ISOLATE THE LDA A,I SEGMENT #. STA RPAR AND M177$ (177B). STA RS# SZA SKIP IF MAIN CPA SEG SEGMENT IN CORE? JMP EC10 YES. SET UP RETURN. LDB P02$ (+2). JSB SCHK CHECK DISC STATUS. SSA DISC FREE ? JMP EC1 NO. CHECK NEXT ENTRY. SPC 2 * TRANSFER FINISHED AND RETURN POSSIBLE. * SET UP RETURN PARAMETERS. * EC10 CCA SET RETURN FLAG TO -1 STA RFLG TO INDICATE RETURN NECESSARY. * * UPDATE DEBUG TABLE * ISZ TB8 NOP LDA RSDA,I SET UP FINAL STA FRET RETURN ADDRESS. * * FREE THE LU DEVICE. * LDA RPAR CHECK LOCKED CONDITION, ALF,ALF AND SET APPROPRIATE STA B (KEEP PARAM IN AREG) SSB,RSS "FREE" CONDITION CODE CLB,RSS IN LU TABLE. CCB STB RSDA,I * CONTINUE SETTING UP RETURN PARAMETERS. * AND M377$ ISOLATE PASSED PARAMETER AND STA RPAR STORE IT IN RPAR. LDB RSDA SET UP RETURN ADB =LLUMR TO MAIN ADDRESS. LDA B,I STA CMR LDA RS# GENERATE SEGMENT SZA,RSS IS REQ FOR MAIN? JMP ER2 YES SO DONT LOAD SEGMENT ADA N01$ DIRECTORY ADDRESS MPY =LSDL AND STORE IT IN RSDA ADA .SD STA RSDA * CPA CSEG SEG ALREADY IN? JMP ER2 IF SO JUMP JSB B3 NO SO LOAD IT * * DELETE ENTRY FROM CQ. * * ER2 CCB SET MAIN FLAG LDA RS# GET SEG # SZA IS RETURN TO MAIN? CLB NO SET SEG FLAG STB MORS SET FLAG * * RESTORE PRIORITY TO WHAT IT WAS WHEN THIS I/O CALL WAS MADE * LDA .CCQ,I GET CQ ENTRY ALF,ALF ROTATE AND M377$ MASK PRIORITY STA PRIOR RESTORE IT LDA CCQE SUB 1 FROM CQ- ADA N01$ POINTER BY 1. STA CCQE LDB .CCQ EC12 LDA B MOVE THE CQ TABLE INA UP, ONE BY ONE. LDA A,I STA B,I CPB CCQE JMP EC18 INB JMP EC12 EC18 CLA ZERO LAST USED ENTRY. STA B,I * * ALL EXITS COME THROUGH EC25. * EC25 JMP ECOD,I EXIT. * RLU NOP END TCS :: :CO MOUNT TAPE #5, TYPE :GO :PA