* * GET INITIAL ADDR(DEST) IN B REG * LDB ENTR INB 2003 * * NOW MOVE PARAMS * E5 LDA TEMP3,I GET PARAM 6002,I IND1 RAL,CLE,SLA,ERA CHECK FOR INDIRECT JMP INDIR GO DO IT STA 1,I STORE PARAM 2003,I ISZ TEMP3 MOVE ADDR CPB TEMP2 ALL DONE JMP E4 YES GOTO EXIT INB MOVE ADDR JMP E5 GO DO NEXT * * SORT OUT INDIRECT PARAMS * INDIR LDA 0,I JMP IND1 * * NOW ALL IS DONE SO EXIT * E4 LDA ENTR,I GET RETURN ADDR LDB ENUM JMP 0,I GO AWAY * TEMP NOP EPAR NOP ENUM NOP TEMP2 NOP TEMP3 NOP HED **** ROUTINE B , THE SEG. LOADER **** ***** ***** * * * ROUTINE B IS USED TO PROCESS USER REQUESTS FOR SEGMENT * * * * LOADS. IT CONTAINS A ROUTINE (B3) WHICH IS USED BY * * * * OTHER ROUTINES WITHIN TCS. * * * ***** ***** SPC 3 BCOD NOP ENTRY POINT. LDA CREQ GET REQUEST CODE CPA P08$ IS SEGMENT LOAD (=8) ? JMP BA YES * * REQ. IS NOT VALID SO MAKE REJECT RETURN * BT CLA,INA,RSS NOT-DONE EXIT. BB CLA DONE EXIT. JMP BCOD,I EXIT. * * REQUEST IS VALID CHECK WHETHER SEG IS ALREADY IN CORE * BA LDA SEG GET SEG# * * UPDATE DEBUG TABLE * ISZ TB4 NOP CPA ARG2,I IS THIS SEG ALREADY IN JMP BD YES * * TEST FOR VALID SEG. NUMBER. * LDA ARG2,I GET SEG # SSA,RSS <0? CPA P00$ =0? JMP BF YES, REJECT. CMA,INA MAKE REQ.SEG. -VE ADA NSEG ADD # OF SEGS SSA,RSS IS OK? JMP BE YES * * INVALID SEG # SO SET ERROR RETURN * BF LDB ERR4 GET ERROR CODE. STB RST PUT IN RETURN STATUS * * * NOW SET UP EXIT * LDA TCS GET RETURN ADDR. STA FRET JMP BB * * CHECK WHETHER DISC IS BUSY * BE LDB P02$ JSB SCHK WAIT TILL LU2 IS FREE SSA JMP BE LDA ARG3,I *PREP FOR PRIORITY PARAM STA ARG3 *SAVE POSS. NEW PRIORITY * * * GET REQUIRED SEGMENT DIRECTORY ADDR LDA ARG2,I ADA N01$ SUBTRACT 1 MPY =LSDL LENGTH OF SEG DIR ENTRYS. ADA .SD ADDR OF SEG TABLE SPC 2 * * NOW HAVE SEG DIREC ADDR IN A REG SO LOAD SEG * JSB B3 * * * SET UP FINAL RETURN ADDR. * BD LDA B3F,I SEG. ENTRY ADDR. STA FRET STORE AS FINAL RETURN LDA MORS SET THE LDB CMR SEGMENT-TO-MAIN SZA RETURN ADDRESS. LDB TCS STB CMR CLA SET EXECUTING FLAG STA MORS TO SEGMENT. * * NOW SET PRIORITY IF PRESENT * LDB ENUM GET # OF PARAMS CLA CPB P03$ WRER THERE THREE? LDA ARG3 *YES, SO GET PRIORITY AND M17$ ENSURE CORRECT RANGE STA PRIOR SET PRIORITY * * JMP BB GO TO RETURN HED ***ROUTINE B3*** * * * ROUTINE B3 IS USED TO LOAD SEGMENTS * * FIRST GET USER DISC SUBCHAN SO WE * CAN RESTORE IT LATER B3 NOP * * UPDATE DEBUG TABLE * ISZ TB5 NOP LDB CUDSC STB B3A * * SAVE DIRECTORY ADDRESS STA B3C STA B3B ADA P02$ ADD 2 STA B3D SAVE SUBCHAN ADDR LDB A SAVE IN B LDA A,I AND M37$ MASK SUBCHANNEL (7905) STA F4H ADB P02$ ADD TWO STB B3X SAVE ADDR OF LENGTH ADB P05$ ADD 5 STB B3F SAVE ADDR OF SEG START * * NOW CHANGE USER DISC * * IF REQUIRED * CPA CUDSC IS SAME AS CURRENT? RSS YES SO SKIP JSB F5 GO DO IT * *NOW MOVE PARAMS ONTO BASE PAGE * LDA =D-11 STA B3G COUNT * LDB B3L STB B3M * B3K LDB B3C LDA B,I CPB B3D IS SUBCHAN PARAM JMP B3KK YES. JMP B3HH NO. B3KK AND =B177740 CLEAR TYPE CODE (7905) IOR P05$ (5) B3HH CPB B3F IS STARTING ADDRESS ? LDA .B3H SET TO RETURN TO THIS ROUTINE CPB B3X IS FILE LENGTH AND =B7777 YES, MASK OUT PRIORITY * * NOW MOVE TO BASE PAGE LDB B3M JSB FMOV PUT ON BASE PAGE ISZ B3C ISZ B3M ISZ B3G ALL DONE JMP B3K NO * * * JSB EXEC DEF *+2 DEF B3N * * SHOULD RETURN HERE WHEN SEG IS LOADED * *CHANGE USER DISC BACK * B3H LDA B3A STA F4H PUT UD IN EXEC CALL CPA CUDSC IS SAME AS CURRENT? RSS YES SO SKIP JSB F5 * * NOW SET UP PARAMS * LDA B3B STA CSEG SAVE DIREC ADDR * * NOW GET SEG # +SAVE * LDB .SD CMB,INB ADA B CLB DIV =LSDL INA STA SEG LDA B3F,I RESTORE SEGMENT LDB =B137 ENTRY POINT TO JSB EXEC BASE PAGE DIRECTORY. DEF *+2 DEF BEJ JMP B3,I * * B3A DEC -1 FOR CURRENT USER DISC B3B NOP FOR DIREC ADDR B3C NOP FOR SEG DIRECTORY ADDRESS. B3D NOP FOR SUBCHANNEL ADDRESS. B3F NOP B3G NOP .B3H DEF B3H BEJ DEC -19 B3L OCT 141 B3M NOP B3N DEC -20 B3X NOP HED *** ROUTINE C ,THIS CONTAINS E + F *** ***** ***** * * * THIS ROUTINE CHECKS FOR I/O CALLS AND PROCESSES * * * * VALID ONES. ON EXIT A IS NON-ZERO IF CALL WAS * * * * NOT VALID. IF VALID A=0 AND FRET HOLDS RETURN ADDR * ***** ***** SPC 3 CCOD NOP CLA INITIALIZE RETURN PARAMETERS. STA RFLG * * CHECK IF WE HAVE BEEN INITIALISED * LDA .PQ GET PENDING Q ADDR. LDB ERR6 SZA CLB STB RST SET STATUS SZA,RSS JMP CGA GO TO RETURN * LDA CREQ GET USER REQ CODE CPA =D53 IS SUSPEND CALL JMP CN YES. SPC 1 * SEE IF IT IS AN I/O REQUEST * LDB .CB GET TABLE ADDR STB CC STORE IT * CF LDB CC,I GET A REQ CODE SZB,RSS ALL VALID REQ CODES CHECKED? JMP CD YES SO SET FOR AN INVALID CALL * CPA B IS IT THIS CODE JMP CY YES ITS VALID ISZ CC INCR ADDR JMP CF TRY NEXT ONE * * HAVEN'T BEEN INITIALISED SO SET RETURN ADDR. * CGA LDB TCS STB FRET JMP CM SPC 1 * INVALID RETURN POINT * CD CCA,RSS SET A=-1 SPC 1 * VALID RETURN POINT * CM CLA JMP CCOD,I EXIT. * * FIRST SEE IF ITS A FILE REQUEST * CY CLA STA CTT CLEAR FILE FLAG * * UPDATE DEBUG TABLE * ISZ TB1 NOP LDA CREQ GET REQUEST CODE ADA =D-13 SUBTRACT 13 AND =B177774 MASK LAST 2 BITS SZA,RSS WAS IT A FILE REQUEST? * * IF IT WAS THEN CALL F4 TO CONVERT TO TRACK AND SECTOR * JSB F4 * * WAS A VALID FILE REQUEST? * LDA RST GET STATUS SZA IS IT STILL CLAER JMP CM NO IT ISNT * PUT REQUEST IN PENDING QUEUE * CE LDA PQC,I CHECK FOR PQ OVERFLOW. CPA MAXPQ OVERFLOW ? JMP CERR INA STA PQC,I NO. UPDATE PQ ENTRY COUNT. LDB CPQE ADB =LPQL STB CPQE * * NOW CHECK PRIORITY * LDA PRIOR SZA IS IT 0? JSB MU NO SO SHUFFLE PEND Q. * LDA CREQ GET REQ. CODE AND =B7777 MAKE ROOM FOR PRIORITY ALF IOR PRIOR PUT IN PRIORITY ALF ALF,ALF MOVE PRIORITY TO TOP 4 BITS STA B,I HAVE SET REQ CODE LDA CTT WAS IT A FILE REQ. SZA JMP CTY YES SO GO ON LDA CREQ GET REQ CODE AGAIN * * CPA N01$ IF ITS A -1 JMP CXX OR -2 CALL THEN- CPA N02$ SAVE A FLAG, IT- JMP CXX MAY BE WORK AREA. * CTY CLA IT WASN^T SO CXR STA CWY UPDATE FLAG * CTS INB LDA CMR HAVE NOW SET MAIN RETURN ADDR STA B,I * INB LDA ARG2,I STA ARG2 SAVE STA B,I HAVE NOW STORED CONTROL WORD * INB STB C9A SAVE PQ POINTER. * * NOW STORE RETURN ADDRESS. * LDB TCS GET RTRN ADDR. LDA ARG2 GET CONWD AND =B20000 STA C9H SZA,RSS W/O WAIT ? JMP C9D YES. RETURN IN-LINE. C9B LDB ENUM ADB .ARG1 ADB N01$ GET RETURN LDB B,I ADDRESS FROM IRET. LDB B,I C9D STB C9A,I STORE RETURN ADDRESS. * C9C ISZ C9A LDB ENUM CLA CPB P03$ ONLY 3 PARAMS? JMP C9W YES * CPB P04$ WERE THERE 4? RSS YES SO SKIP JMP C9X MUST BE 5 OR MORE * LDB C9H WAS IRET ONE OF - SZB,RSS THEM? * C9X LDA ARG3 GET BUFFER ADDR LDB CREQ IS AN I/O CONTROL REQ? CPB P03$ IF SO GET THE LDA A,I ACTUAL PARAM C9W STA C9A,I PUT A REG IN PQ. * * ISZ C9A CLA LDB CREQ CPB P03$ IS I/O CONTROL ? JMP C9E YES SO GO ON LDA ARG4,I GET BUFFER LENGTH. C9J STA C9A,I * ISZ C9A MOVE POINTER * LDA ENUM CMA,INA ADA P06$ TEST FOR GREATER THAN 6 PARAMETERS SSA,RSS JMP C9T * LDB CTT GET FILE FLAG LDA ARG5 SZB,RSS IS THAT THE TRACK ? LDA ARG5,I STORE TRACK AND SECTOR STA C9A,I * ISZ C9A * LDA ARG6 SZB,RSS LDA ARG6,I LDB CWY IF IT WAS- SZB,RSS A -1 OR -2 - JMP C9G CALL THEN PUT SYSTEM DISC- LDB SYSSC IN BLF,BLF REQUEST AND M377$ *STRIP SUBCHAN IOR B *MERGE SYS. SUBCHAN * C9G STA C9A,I JMP C9F * C9T CLA STA C9A,I ISZ C9A JMP C9G * C9E LDA ENUM GET # OF PARAMS LDB C9H SZB IS W/O WAIT ADA N01$ SUB 1 IF IRET PRESENT ADA N03$ SUB 3 FOR RC,CW,IPAR CLB CPA P02$ WERE THERE 2 PARAMS LDB ARG4 YES SO GET ADDR LDA B PUT IN A REG JMP C9J GO BACK C9F LDA ENUM ADA .ARG1 GET ADDRESS OF ADA N01$ THE PARAMETER LDB C9H IN THE A REG. SZB ADA N01$ LDA A,I GET PARAMETER LDA A,I AND M377$ (377 OCTAL) ALF,ALF LDB MORS GET EXECUTING FLAG SZB,RSS SKIP IF ITS MAIN IOR SEG ADD SEGMENT #. ISZ C9A STA C9A,I * * NOW SEE IF REQUEST WAS W/O WAIT * LDA C9H IS REQ WITH- SZA WAIT? JMP CJ NO * * * THIS THE MAJOR I/O CHECKING AND INITIATION LOOP. * IT IS ALSO THE SUSPEND LOOP. * CN JSB ECOD CHECK CQ FOR A COMPLETE I/O. CP JSB FCOD INITIATE ALL POSSIBLE I/O. CZ LDA RFLG IS THERE ANY SZA RETURN YET ? JMP CM YES. EXIT THRU CM. JMP CN NO. STAY IN THE LOOP. * * FIND CORRECT PLACE IN PENDING QUEUE * MU NOP ENTRY POINT LDA .PQ GET PENDING Q ADDR. LDB A STA C9A SAVE * MV2 CPB CPQE ALL DONE? MV JMP MU,I YES SO EXIT LDA C9A,I GET RCODE & PRIORITY ALF MOVE PRIORITY TO LSD BITS AND M17$ MASK PRIORITY CMA NEGATE AND ADD ONE ADA PRIOR ADD THIS PRIORITY * SSA,RSS IS A LOWER PRIORITY? JMP MV1 YES * LDB C9A NOW CHECK NEXT ONE ADB =LPQL STB C9A JMP MV2 GO CHECK IT * * NOW MOVE LOW PRIORITY ENTRIES IN PENDING * QUEUE DOWN ONE, TO MAKE ROOM FOR THIS ONE * MV1 STB C9A SAVE ADDR OF CURRENT ENTRY LDA CPQE GET ADDR OF FREE ENTRY STA CMF SAVE STA C9R AND AGAIN * CMT ADA PQLM -VE LENGTH OF PENDING Q CMG LDB A,I STB C9R,I MOVE- INA ONE - ISZ C9R ENTRY- CPA CMF IS DONE? RSS YES JMP CMG NOT YET MOVE NEXT WORD * ADA PQLM MOVE POINTER BACK STA CMF STA C9R LDB C9A GET REQ'D ENTRY CPA C9A ALL MOVED? JMP MV YES SO EXIT JMP CMT NOW MOVE NEXT ENTRY * SKP * * SET UP I/O-WITHOUT-WAIT RETURN PARAMETERS. * CJ LDA TCS GET ADDR OF USER DEF *+N STA FRET STORE AS FINAL RETURN. CLA,INA STA RFLG SET RETURN FLAG. JMP CP GO INITIATE ALL POSSIBLE I/O. * * * .CB DEF CB CB DEC 3 DEC 1 DEC 2 DEC -1 DEC -2 DEC 14 DEC 15 DEC 0 CC NOP TEMP * * COME HERE IF PENDING QUEUE IS FULL * CERR LDA ERR2 STA RST LDA TCS SET UP RETURN- STA FRET ADDRESS. JMP CM * * CWY NOP CTT NOP * CXX CCA JMP CXR * * CMF NOP HED *** ROUTINE F (INITIATE ALL POSSIBLE I/O ) *** * * * FCOD NOP ENTRY POINT. SPC 1 * SET UP ADDRESSES FOR PQ EXAMINATION SPC 1 LDA .PQ GET ADDR OF PQ FB STA FCPQ PUT IN TEMPORARY STORAGE ADA =D-9 CPA CPQE JMP FW * * CHECK WHETHER LU IS FREE FOR THIS ENTRY * JSB F1 SZB,RSS IS LU FREE ? JMP FA YES SPC 1 * THAT LU WASNT FREE SO CHECK NEXT PQ ENTRY * * FIRST SEE IF ALL ARE DONE * FDT LDA FCPQ CPA CPQE LAST ENTRY ? FW JMP FCOD,I YES. EXIT. ADA =LPQL NO. ADD PQ ENTRY LENGTH. JMP FB SPC 2 * COME HERE IF LU IS FREE FOR CURRENT PQ ENTRY * * HAVE PARAMS IN PEND. QUEUE * MUST NOW PUT THEM IN DUMMY CALL * AND UPDATE LU TABLE * * FIRST USE THE USER REQUEST CODE * FA LDA FCPQ STA C9R LDB A,I GET RECODE + PRIORITY CLA RRL 4 MOVE PRIORITY TO A REG STA C9A SAVE IT ASR 4 MAKE RCODE 16 BITS STB CEC SAVE RCODE * ISZ C9R LDA C9R,I LDB .CLU ADB P02$ SET MAIN RET. ADDR. IN LU. STA B,I * ISZ C9R LDA C9R,I LDB LULM GET LOCKED FLAG. SSA,RSS IS ALSO A LOCK REQUEST CLB NO SO CLEAR STB FH STORE FLAG IOR =B20000 MAKE WITHOUT WAIT ELA,CLE,ERA CLEAR BIT 15 STA F3A * * * NOW TRANSFER BUFFR ADDRESS OR PARAM FOR I/O CONTROL IS USED * ISZ C9R LDA C9R,I SET RETURN ADDRESS IN LU. STA .CLU,I * ISZ C9R POINT TO PQ WORD 5 LDA C9R,I GET WORD 5 LDB CEC GET RCODE CPB P03$ CONTROL OR I/O REQ? LDA C9R CNTL - SET ADDR OF PARM1 STA F3B SET IN EXEC CALL * ISZ C9R LDA C9R,I GET BUFF LENGTH- STA C9V IF PRESENT SZA WAS IT THERE? LDA .C9V YES SO GET ADDR LDB CEC GET REQ CODE CPB P03$ IS IT I/O CONTROL? LDA C9V YES SO GET ACTUAL ADDR STA F3C ISZ C9R LDA C9R,I GET TRACK STA C9Z SAVE IT SZA