ASMB,L,C NAM GEX.C,7 92067-16100 790405 REV. 1926 $CLIB SPC 3 * NAME: GEX.C * SOURCE: 92067-18101 * PGMR: EARL STUTES\SAM * * * CALLING SEQUENCE: LDA function * LDB cr * JSB GEX.C * DEF parameter *iff function<=3 * SPC 3 *************************************************************** * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1977. ALL RIGHTS * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, RE- * * REPRODUCED, OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITH- * * OUT THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * *************************************************************** SPC 3 * THIS PROCEDURE HANDLED SEVERAL OF THE DIFFERENCES BETWEEN * RTE II-III AND RTE-M FOR THE COMPILER LIBRARY - THIS IS RTE-IV VERSION * PROC CALLD.RTR(FUNCTION,PRAM,CR); * VALUE FUNCTION,CR; INTEGER FUNCTION,CR; * POINTER PRAM; * FUNCTION IS PASSED IN THE A REGISTER * CR IS PASSED IN THE B REGISTER * PRAM IS A POINTER TO THE SET OF DATA NEEDED BY THE FUNCTION REQUESTED * * THE FUNCTION VALUES ARE: * 0 => CLOSE * 1 => CREATE * 2 => OPEN NEW FILE * 3 => OPEN EXTENT * 4 => OPEN SCRATCH FILE * 5 => CLOSE SCRATCH FILE * * THE PARAMETERS ARE DEFINED BY THE FUNCTION: * * 0 => PRAM = POINTER TO THE NUMBER OF SECTORS TO BE DELETED * 1 => PRAM = A POINTER TO THE SKELETON DIRECTORY ENTRY IN CORE* * 2 => PRAM = POINTER TO THE NAME BUFFER * 3 => PRAM = POINTER TO THE READ/WRITE FLAG * * THE RETURNED PARAMETERS WILL BE RETRIEVED AND PLACED * VARIABLES VISIBLE TO THE CALLER * THE FIRST FIVE ARE THOSE COMING DIRECTLY FROM D.RTR * THE 6TH & 7TH ARE THOSE PARAMETERS NEEDED BY THE NEW OPEN FUNCTION ENT .R1 D.RTR RETURN PARAMETER #1 ENT .R2 D.RTR RETURN PARAMETER #2 ENT .R3 D.RTR RETURN PARAMETER #3 ENT .R4 D.RTR RETURN PARAMETER #4 ENT .R5 D.RTR RETURN PARAMETER #5 ENT .R6 D.RTR RETURN SECURITY CODE-STRING(6) ENT .R7 D.RTR RETURN TYPE CODE-STRING(1) * BEGIN * CASE FUNCTION OF * MAKECLOSECALL; * MAKECREATCALL; * MAKEOPENCALL; * MAKEOPENEXTCALL; * * *SHOULD BE OF THE FORMAT: * (1) NAME (1,2) * (2) NAME (3,4) * (3) NAME (5,6) * (4) TYPE * (5) * (6) 0 OR -1 * (7) #SECTORS REQUESTED OR -1 FOR REST OF CART * (8) RECORD SIZE * (9) SECURITY CODE * DOSCRATCHOPENTRICK; * DOSCRATCHCLOSETRICK; * ESAC; * FETCHRETURNPRAMETERS; * IF ERROR THEN * GO ERROR EXIT; * IF FUNCTION = NEWOPEN * END OF CALLD.RTR SKP ENT GEX.C ENT PROBT EXT EXEC GUESS WHO EXT RMPAR PARAMETER PASSING - DOS LIB EXT C.FAD FCB FILE DIRECTORY WORD EXT C.EXT FCB EXTENT COUNTER EXT C.HLU FCB HEAD LU EXT C.HTR FCB HEAD TRACK EXT C.STR FCB CURRENT START TRACK EXT C.FLU FCB LOGICAL UNIT EXT C.#SC FCB BLOCKS / EXTENT A EQU 0 B EQU 1 PROBT OCT 74000 DISC PROTECT BITS MYID EQU 1717B FUNCT BSS 1 THE PASSED IN FUNCTION PARAMETER CR BSS 1 THE PASSED IN CR PARAMETER SCTRS BSS 1 EITHER CURRENT SECTOR OR #OF SECTORS TRACK BSS 1 THE TRACK BEING WRITEN ON OR READ FROM DLU BSS 1 .M1 DEC -1 .0 DEC 0 .1 DEC 1 .2 DEC 2 .3 DEC 3 .4 DEC 4 .5 DEC 5 .6 DEC 6 .9 DEC 9 .14 DEC 14 QSKED DEC 23 EXEC SCHEDULE REQUEST CODE NEWOP EQU .2 NEW OPEN FUNCTION CODE D.RTR ASC 3,D.RTR LIMEM EQU 0 A FAKE FOR RTE II-III SPC 2 GEX.C DEF LIMEM THIS IS REALLY THE ENTRY POINT DST FUNCT SAVE PASSED PARAMETERS ADA JTAB FUNCTION CASE STATMENT JMP A,I SPC 2 JTAB DEF JTBL JTBL JMP CLOSE JMP CREAT JMP NOPEN JMP EOPEN JMP SOPEN JMP SCLOS SPC 3 CREAT JSB INDC. GET THE PARAMETER JSB EXEC CALL D.RTR DEF *+10 DEF QSKED DEF D.RTR DEF MYID DEF .1 DEF CR DEF .0 DEF .0 DEF .PRAM,I DEF .9 JMP FETCH EXIT CASE SPC 3 NOPEN JSB INDC. GET THE PARAMETER POINTER LDA .PRAM,I GET THE PARAMETER IOR =B100000 SET THE EXCLUSIVE OPEN BIT IN THE NAME STA .PRAM,I LDA MYID IOR =B100000 SET THE NEW OPEN BIT IN THE ID STA IMYID ADB .4 .PRAM IS IN B ALSO LDA B,I STA .R6 JSB EXEC CALL D.RTR DEF *+10 DEF QSKED DEF D.RTR DEF IMYID DEF .0 DEF CR DEF .R6 DEF .0 DEF .PRAM,I DEF .3 JMP FETCH EXIT CASE SPC 3 * THE FOLLOWING ALGORITHM IS THE EXTENT OPEN ALGORITM * THAT WILL HANDLE BOTH SYSTEM TRACKS AND FMGR EXTENTS * NOTE THAT SYSTEM TRACKS ARE REUSED WHEN POSSIBLE AND * IN FACT THE REWIND FUNCTION IS SIMPLY AN OPEN EXTENT 0 * OF AN ALREADY OPEN FILE * IF NOT FMGRFILE THEN * [ IF FCB.EXTENT = 0 THEN * [ NEWLU := FCB.HLU; * TRLU := FCB.HEADTRACK; ] * ELSE * [ READPRIVATEDIRECTORY; * IF NEWTRACK THEN * IF R/WFLAG THEN * [ A := -12 * GO ERROR EXIT;] * ELSE * [ INITIALIZEANEWTRACK; * WRITEPRIVATEDIRECTORY; ] * SETUPD.RTRETURN ] * ELSE SPC 2 * IF NOT FMGRFILE THEN EOPEN JSB INDC. GET THE PARAMETER POINTER LDB C.FAD,I SZB JMP L2 * IF FCB.EXTENT = 0 THEN LDA C.EXT,I SZA JMP LX * [ NEWLU := FCB.HLU; * TRLU := FCB.HEADTRACK; DLD C.HTR,I JMP LA * ELSE * [ READPRIVATEDIRECTORY; LX EQU * LDA C.FLU,I STA DLU LDA C.STR,I STA TRACK LDA C.#SC,I ALS STA SCTRS JSB REDPD * IF NEWTRACK THEN DLD TRLU FROM EXEC READ SSA,RSS JMP LA * IF R/WFLAG THEN LDA .PRAM,I SSA,RSS JMP LB * [ A := -12 LDA =D-12 * GO ERROR EXIT;] JMP EXIT * ELSE * [ INITIALIZEANEWTRACK; LB EQU * JSB INNEW * WRITEPRIVATEDIRECTORY; ] * (LINK DATA ONTO OLD TRACK) LDA C.#SC,I ALS STA SCTRS JSB EXEC DEF *+6+1 DEF .2 DEF C.FLU,I DEF TRACK DEF .2 DEF C.STR,I DEF SCTRS DLD TRACK FROM EXEC WRITE ABOVE LA EQU * * SETUPD.RTRETURN ] STB C.FLU,I JSB SD.RN ISZ GEX.C JMP EXIT * ELSE L2 EQU * LDA .PRAM,I MAKEOPENEXTCALL LDB .6 SZA,RSS ADB .2 STB FUNCT JSB EXEC DEF *+8 DEF QSKED DEF D.RTR DEF MYID DEF FUNCT DEF C.FAD,I DEF C.FAD+1,I DEF C.EXT,I JMP FETCH SPC 2 CLOSE JSB INDC. MAKECLOSECALL LDB B,I .PRAM STILL IN B ASR 16 MAKE .PRAM DBL WRD * *FOLLOWING CODE CHANGED ON 790403 *REV 1926-ALLOWS CORRECT TRUNCATION OF FILES (ALMOST). *NOTE THAT 1 BLOCK IS STILL LEFT AFTER TRUNCATION. * STA .PRAM+1 STB .PRAM * *THAT'S IT! * CEXEC JSB EXEC DEF *+10 DEF QSKED DEF D.RTR DEF MYID DEF .0 DEF C.FAD,I DEF C.FAD+1,I DEF .0 DEF .PRAM DEF .2 JMP FETCH SPC 3 SOPEN JSB INNEW INITIALIZEANEWTRACK; * SET UP PRAMS FOR D.RTR LIKE RETURN LDA TRACK JSB SD.RN LDA DLU STA .R2 CLA STA C.FAD,I STA C.FAD+1,I STA .R6 LDA =D3 STA .R7 JMP EXIT SCLOS LDA C.HTR,I STA TRACK STA TRLU * DLU := NLU := FCB.HLU; LDA C.HLU,I AND =B77 STA DLU STA NLU LDA C.#SC,I ALS STA SCTRS *DO [ READPRIVATEDIRECTORY; CLOOP JSB REDPD * GIVETRACKBACK; ] JSB GIVBK LDA NLU AND =B77 STA DLU LDA TRLU STA TRACK * UNTIL (TRLU < 0); SSA,RSS JMP CLOOP JMP GEX.C,I * ESAC; SPC 3 FETCH ISZ GEX.C JSB GETPR LDA .R1 CHECK FOR ERRORS SSA JMP GEX.C,I ERROR OUT JSB EXEC DEF *+5 DEF .14 DEF .1 DEF .R7 DEF .6 LDB .R7 BLR,RBR STB .R7 LDA .R7+3 MOVE FILE SIZE TO IMITATE OLD D.RTR SZB,RSS CLA STA .R1 * IF FUNCTION = NEWOPEN LDA FUNCT CPA NEWOP JMP FILID CPA .1 JMP *+2 JMP EXIT FILID DLD .R2 DST C.FAD,I EXIT ISZ GEX.C JMP GEX.C,I SPC 3 GETRK BSS 1 GET A SCRATCH TRACK FROM THE SYSTEM JSB EXEC DEF *+5+1 DEF .4 DEF .1 DEF TRACK DEF DLU DEF SCTRS JMP GETRK,I SPC 3 GIVBK BSS 1 GIVE A TRACK BACK TO THE SYSTEM JSB EXEC DEF *+4+1 DEF .5 DEF .1 DEF TRACK DEF DLU JMP GIVBK,I SPC 3 INNEW BSS 1 GET A NEW TRACK FROM THE SYSTEM JSB GETRK LDA SCTRS ADA =D-2 STA SCTRS JSB EXEC AND INITIALIZE THE LAST BLOCK TO DEF *+6+1 INDICATE THE END OF THE TRACK CHAIN DEF .2 DEF DLU DEF .M1 DEF .1 DEF TRACK DEF SCTRS JMP INNEW,I SPC 3 REDPD BSS 1 READ THE TRACK LINK DATA JSB EXEC DEF *+6+1 DEF .1 DEF DLU DEF TRLU DEF .2 DEF TRACK DEF SCTRS JMP REDPD,I SPC 3 SD.RN BSS 1 SETUPD.RTRETURN STA .R4 THE TRACK WORD LDA SCTRS STA .R1 NUMBER OF SECTORS IN THE FILE ADA =D2 ALF,ALF STA .R5 JMP SD.RN,I SPC 3 INDC. BSS 1 CLEAR INDIRECTS AND FETCH THE PARAMETER POINTER LDB GEX.C ILOOP LDB B,I RBL,CLE,SLB,ERB CLEAR THE I-BIT AND TEST JMP ILOOP STB .PRAM JMP INDC.,I GETPR BSS 1 FETCH THE D.RFP\D.RTR RETURN PARAMETERS JSB RMPAR DEF *+2 DEF .R1 JMP GETPR,I SPC 3 .R1 BSS 1 .R2 BSS 1 .R3 BSS 1 .R4 BSS 1 .R5 BSS 1 .R7 BSS 5 4 PLACEHOLDERS FOR RTE 2,3+4 .R6 BSS 1 .PRAM EQU .R1 TRLU EQU .R4 IMYID EQU .R5 NLU EQU .R5 END