ASMB,R,L,C,Q HED APOSN * NAME: APOSN * SOURCE: 92067-18134 * RELOC: 92067-16125 * PGMR: G.A.A.,N.J.S. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979. ALL RIGHTS * * * RESERVED. NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED, * * * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT* * * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY. * * *************************************************************** * NAM APOSN,7 92067-16125 REV.1903 790503 ENT APOSN, EAPOS EXT $KIP, NX$EC, RFLG$, .ENTR, ELOCF EXT .DNG, .DAD, .DDI SUP * * * THE APOSN ROUTINE DOES ABSOLUTE FILE POSITIONING * OF RTE FILES * * CALLING SEQUENCE: * * CALL APOSN(IDCB,IERR,IREC,IRS,IOFF) OR * CALL EAPOS(IDCB,IERR,IREC,IRS,IOFF) * * WHERE: * * IDCB IS THE FILES DATA CONTROL BLOCK * * IERR IS AN ERROR RETURN FLAG. POSSIBLE ERRORS, * 0 NO ERROR * -1 DISC DOWN * -5 SPACING BEYOND END OF DEFINED EXTENT * -9 ATTEMPT TO POSITION TYPE ZERO FILE * -10 NOT ENOUGH PARAMETERS * -11 DCB NOT OPEN * -12 SOF IE IREC <1 * * IREC THE RECORD NUMBER TO BE READ NEXT * * IRS (REQUIRED FOR 3 & ABOVE ONLY) THE * RELATIVE BLOCK OF THE NEXT RECORD * * * IOFF THE BLOCK OFFSET OF THE NEXT * RECORD (REQUIRED FOR TYPE 3 AND * ABOVE ONLY) * * IREC AND IRS ARE SINGLE WORD INTEGERS FOR THE APOSN CALL. * FOR EAPOS, IREC AND IRS ARE DOUBLE WORD INTEGERS. * * * * * EAPOS DEC -1 LDA EAPOS STA APOSN JMP APOSN+1 * * * DCB NOP ER NOP IRC NOP IRS NOP IOFF NOP * APOSN NOP ENTRY POINT JSB .ENTR FETCH PRAM DEF DCB ADDRESSES LDA EAPOS GET APOSN\EAPOS CODE SSA DOUBLE WORD CALL? JMP APOS0 NO - SKIP DLD IRC,I GET DOUBLE WORD RECORD # DST RECRD AND SAVE DLD IRS,I GET DOUBLE WORD BLOCK JMP APOS1 AND GO TO SAVE IT APOS0 CLA GET RECORD # LDB IRC,I AND MAKE INTO A DOUBLE WORD SSB AND SAVE CCA DST RECRD CLA LDB IRS,I GET BLOCK AND MAKE INTO A DOUBLE WORD SSB CCA APOS1 DST BLOCK AND SAVE. CLB,INB SET THE READ STB RFLG$ FLAG * LDB DCB COMPUTE ADB .2 TYPE STB TYPE AND ADB .5 STEP TO BLOCK LENGTH LDA B,I FETCH AND AND BLMSK CONVERT CLB TO NUMBER OF WORD BLOCKS LSL 9 (MADE INTO A DOUBLE WORD) DST BLKSZ AND SAVE AS A DOUBLE WORD LDB DCB ADB .9 STEP TO OPEN FLAG LDA N11 IS LDB B,I DCB CPB XEQT OPEN? INA,RSS YES; SKIP JMP EXIT NO; EXIT INA SET A= 9 LDB TYPE,I IS FILE TYPE SZB,RSS ZERO? JMP EXIT YES; EXIT ADB N3 IF TYPE 1 OR 2 LDA IRC TEST FOR RECORD PRAM SSB,RSS ELSE TEST LDA IOFF FOR FULL PRAM SZA,RSS LIST JMP ER10 NOT ENOUGH PRAMS - EXIT SSB IF 1 OR 2 JMP RCSET GO SET RECORD NO. * JSB ELOCF USE LOCF TO DEF LOCRT GET DEF DCB,I CURRENT DEF ER,I RELATIVE DEF RC SECTOR DEF CIRS ADDRESS LOCRT CLB CALL LDA DCB SKIP JSB $KIP TO JMP EXIT SET UP NX$EC * DLD CIRS CALCULATE RELATIVE BLOCK CHANGE JSB .DDI CURRENT BLOCK/DCB BLOCK SIZE - DEF BLKSZ NEW BLOCK/DCB BLOCK SIZE JSB .DNG DST CIRS DLD BLOCK JSB .DDI DEF BLKSZ JSB .DAD DEF CIRS SZA,RSS RELATIVE BLOCK = 0? ALREADY THERE? SZB RSS NO - JMP RCSET YES - SKIP POSITION CALL JSB NX$EC POSITION WITH NX$EC JMP EXIT ERROR - EXIT * RCSET DLD BLOCK CALCULATE BLOCK POSITION WITHIN DCB SWP DIV BLKSZ+1 (WANT REMAINDER) CLA CONVERT TO WORDS RRL 7 (MULTIPLY BY 128) LDA DCB GET DCB ADA .12 COMPUTE BUFFER POINTER ADDRESS STA CIRS ADA IOFF,I COMPUTE DESIRED ADA .4 CONTENTS ADA B ADD THE NO OF 128 WORD BLOCKS STA CIRS,I AND SET ISZ CIRS DLD RECRD GET RECORD NUMBER SZA,RSS IF ZERO OR NEGATIVE SEND SZB SOF\EOF ERROR SSA JMP ER12 DST CIRS,I ELSE PUT NEW RECORD NUMBER IN DCB LDB DCB GET DCB ADDRESS ADB .7 AND POSITION TO EOF FLAG WORD LDA B,I GET BLOCK SIZE/FLAG WORD RAR,CLE,RAR UNCONDITIONALLY CLEAR ELA,RAL CLEAR EOF READ FLAG STA B,I AND RETURN WORD TO DCB CLA,RSS OK - EXIT ER10 LDA N10 EXIT CLB CLEAR STB IRC PRAM STB IOFF ADDRESSES FOR NEXT TIME CCB RESET APOSN\EAPOS STB EAPOS FLAG STA ER,I SET ERROR CODE JMP APOSN,I RETURN. * * ER12 LDA N12 SEND EOF ERROR JMP EXIT * * * A EQU 0 B EQU 1 XEQT EQU 1717B * .2 DEC 2 .4 DEC 4 .5 DEC 5 .7 DEC 7 .9 DEC 9 .12 DEC 12 * N3 DEC -3 N10 DEC -10 N11 DEC -11 N12 DEC -12 * BLMSK OCT 077600 * RECRD BSS 2 BLOCK BSS 2 RC BSS 2 CIRS BSS 2 BLKSZ BSS 2 TYPE EQU RC * END EQU * * END