ASMB,L,C NAM WRT.C,7 92060-16102 770523 REV. 1901 $CLIB * * * NAME: WRT.C * SOURCE: 92060-18057 * PGMR: EARL STUTES * *************************************************************** * (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 2 * THIS IS THE TOP LEVEL DRIVE ROUTINE FOR THE COMPILER * LIBRARY WRITE FUNCTION SPC 3 * PROC WRITEFCB(,FCB,BUFFER,LENGTH); * VALUE LENGTH;INTEGER LENGTH;INTEGER ARRAY BUFFER;RECORD FCB; * EXIT AT PARAMETER LIST + 1 WITH ERROR NUMBER IN A * EXIT AT PARAMETER LIST + 2 REGISTERS MEANINGLESS * BEGIN * ADDRESSSETUP; * WRITEARECORD(LENGTH); * IF ERROR THEN GO ERROR EXIT; * END OF WRITEFCB; ENT WRT.C EXT ADS.C POINTER SETUP ROUTINE EXT C.PR2 LENT. EQU C.PR2 * * PROC WRITEFCB(FCB,BUFFER,LENGTH); * VALUE LENGTH;INTEGER LENGTH;INTEGER ARRAY BUFFER;RECORD FCB; * BEGIN WRT.C BSS 1 ENTRY POINT * ADDRESSSETUP; JSB ADS.C DEC -2 * WRITEARECORD(LENGTH); LDB LENT.,I JSB WRTC. * IF ERROR THEN GO ERROR EXIT; JMP WRT.C,I * END OF WRITEFCB; ISZ WRT.C JMP WRT.C,I SKP * THIS ROUTINE ASSUMES THAT THE REQUIRED ENVIRONMENT HAS BEEN SET UP * BY THE CALLER, NAMELY THAT ALL PARAMETERS NECESSARY FOR THE PROPER * EXECUTION HAVE BEEN SET BEFORE THE CALL. * * IT IS ALSO ASSUMED THAT THE ROUTINE WILL RETURN TO P+1 ON * ON ERROR CONDITIONS WITH THE ERROR CODE IN THE A REGISTER. * * THE NORMAL RETURN WILL BE TO P+2 WITH BOTH REGISTERS MEANINGLESS SPC 3 * PROC BUMBP; * BEGIN * FCB.BP := FCB.BP+1; * IF FCB.BP >= 128 THEN * [ WRITEBUFFER ;= TRUE; * GETNEXTSECTOR(FALSE); * IF ERROR THEN GO ERROR EXIT;] * END OF BUMBP & NORMAL RETURN TO P+1 ERROR EXITS WRITEARECORD SPC 3 BUMBP BSS 1 ISZ BP,I LDA BP,I ADA =D-129 SSA JMP BUMBP,I CLA,CCE ERA WRITEBUFFER FLAG = SIGN BIT STA C.BFF,I OF THE FIRST WORD IN THE BUFFER CLA JSB GES.C JMP WRTC.,I ALL THE WAY OUT JMP BUMBP,I SKP *PROC WRITEARECORD(LENGTH); *VALUE LENGTH; INTEGER LENGTH; * THE LENGTH WILL BE PASSED IN THE B REGISTER * BEGIN * INTEGER UP, * WORKCOUNT, * .2; * IF LENGTH < 0 THEN GO EXIT; * IF UNITRECORD THEN * EXEC(2,FCB.LU,USERBUFFER,LENGTH) * ELSE * [ UP := 0; * DISCBUFFER[FCB.BP] := WORKCOUNT := LENGTH; * WHILE WORKCOUNT > 0 DO * [ BUMBP; * DISCBUFFER[FCB.BP] := USERBUFFER[UP]; * UP := UP+1; * WORKCOUNT ;= WORKCOUNT-1; ]; * BUMBP; * DISCBUFFER[FCB.BP] := LENGTH; * BUMBP; * DISCBUFFER[FCB.BP] ;= -1; * WRITEBUFFER := TRUE;]; * END OF WRITEARECORD; SKP ENT WRTC. EXT C.FID FCB.ID THE FCB ID WORD EXT C.WRD EXT C.FLU FCB LU BP EQU C.WRD DISC BUFFER POINTER EXT C.BFF DISC BUFFERHEAD POINTER EXT C.PR1 THE USERS FIRST PARAMETER .UBUF EQU C.PR1 USER BUFFERHEAD POINTER EXT GES.C THE SECTOR READWRITE WORK HORSE B EQU 1 EXT EXEC GUESS WHO *PROC WRITEARECORD(LENGTH); * VALUE LENGTH; INTEGER LENGTH; * THE LENGTH WILL BE PASSED IN THE B REGISTER LENT# BSS 1 THE LENGTH VALUE HOLDER * BEGIN * INTEGER UP, UP BSS 1 * WORKCOUNT, WORKC BSS 1 * .2 := 2; .2 DEC 2 WRTC. BSS 1 ENTRY POINT STB LENT# * IF LENGTH < 0 THEN GO EXIT; SSB JMP EXIT * IF UNITRECORD THEN LDB C.FID,I UNITRECORD FLAG IS THE SIGN BIT OF THE ID SSB,RSS JMP L1 * EXEC(2,LU,.UBUF,LENGTH) JSB EXEC DEF *+4+1 DEF .2 DEF C.FLU,I DEF .UBUF,I DEF LENT# JMP EXIT * ELSE * UP := 0; L1 CLA STA UP * DISCBUFFER[FCB.BP] := WORKCOUNT := LENGTH; LDB C.BFF ADB BP,I LDA LENT# STA B,I * WHILE WORKCOUNT > 0 DO WHILE STA WORKC SZA,RSS JMP EWHIL * [ BUMBP; JSB BUMBP * DISCBUFFER[FCB.BP] := USERBUFFER[UP]; LDB .UBUF ADB UP LDA B,I LDB C.BFF ADB BP,I STA B,I * UP := UP+1; ISZ UP * WORKCOUNT := WORKCOUNT-1;]; CCA ADA WORKC JMP WHILE EWHIL EQU * * BUMBP; JSB BUMBP * DISCBUFFER[FCB.BP] := LENGTH; LDB C.BFF ADB BP,I LDA LENT# STA B,I * BUMBP; JSB BUMBP * DISCBUFFER[FCB.BP] ;= -1;]; CCA LDB C.BFF ADB BP,I STA B,I * WRITEBUFFER := TRUE; CLA,INA RAR STA C.BFF,I * END OF WRITEARECORD; EXIT ISZ WRTC. JMP WRTC.,I END