ASMB,R,L,C HED "%WRIS" RTE SOURCE FILE WRITE IN "LS" FORMAT * * NAME: %WRIS * SOURCE: 92068-18003 * RELOC: PART OF 92067-16268 AND 92067-16035 * PGMR: R.A.G. * * *************************************************************** * * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1980. 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 %WRIS,7 92068-1X003 REV.2013 750701 ENT %WRIS,%WRIN,%WEOF EXT EXEC SPC 1 SPC 1 * PURPOSE: * THIS ROUTINE WILL WRITE SOURCE DATA ON AN RTE DISC IN "LS" * FORMAT. SPC 1 * USES: * THIS ROUTINE IS USED BY COMPILERS, EDITORS, ASSEMBLERS TO * WRITE SOURCE ONTO A DISC SUCH THAT THEY CAN READ IT OVER * AGAIN FOR ANOTHER PASS OF THE SOURCE. THE DATA IS WRITTEN * IN " LS " FORMAT AND THE TRACKS ARE OWNED BY THE CALLING * PROGRAM. THE CALLING PROGRAM SHOULD RELEASE THE TRACKS * WHEN IT IS DONE WITH THEM. SPC 1 * CALLED: * ASSEMBLY ONLY * JSB %WRIN INITIALIZES * NO DISC SPACE A=-1 * A-REG = !15 DISCLU 8!7 TRACK# 0! * * ASSEMBLY ONLY * IF BUFFER LENGTH IS = 0, THEN IMBEDDED FILE MARK IS WRITTEN * IF BUFFER LENGTH IS > 0, THEN TRUE END OF FILE MARK IS WRITTEN * IF BUFFER LENGTH IS < 0, THEN -(BUFLN-1)/2 WORDS ARE WRITTEN * JSB %WRIS WRITES RECORD ON DISC * DEF *+4 GOOD RETURN * DEF BUFFR POINTER TO 1ST WORD OF BUFFER * DEF BUFLN NEG. NUMBER OF CHARS IN BUFFER * SORRY OUT OF DISC SPACE * A-REG. = LAST WRITTEN LU/TRACK * ASSEMBLY ONLY * JSB %WEOF WRITES OUT AN END OF FILE MARK * A-REG = SAME AS %WRIS SPC 1 * RETURN: * A-REG = DISC LOGICAL UNIT IN BITS 7-8 (LU= 2 OR 3) * TRACK NUMBER IN BITS 0-7 (TRACK = 0 TO 255) * -1 IF NO TRACK AVAILABLE SPC 1 * NOTES: * THE " %WRIN " ENTRY POINT IS IN THIS ROUTINE PRIMARLY TO * RE-INITIALIZE A NEW FILE WRITE TO THE DISK. THE " %WEOF " * ENTRY POINT IS TO WRITE A FILE MARK AND POST THE IN MEMORY * BUFFER. A FILE MARK WRITE WITH " %WRIS " WILL WRITE A FILE * MARK, BUT WILL NOT POST THE POSSIBLE IN MEMORY BUFFER. * CAUTION!, ALWAYS SPECIFY AN EVEN CHARACTER COUNT (OR PAD ODD * CHARACTER COUNT WITH TRAILING SPACE) WHEN WRITTING A RECORD. * THIS ROUTINE WILL WRITE ASCII RECORDS ON PROGRAM OWNED * TRACKS OF AN RTE SYSTEM IN "LS" FORMAT. THE BASE PAGE * LS POINTER IS NOT SET HOWEVER. SPC 1 * ERRORS: * THE ERROR RETURN FROM " %WRIS " IS NOT RECOVERABLE, THEREFORE * ANY TRACKS WRITTEN ON BEFORE SHOULD BE GIVEN BACK TO SYSTEM SPC 1 %WRIS NOP ENTRY FOR UNIT RECORD WRITE LDA %WRIS,I GET NORMAL RETURN ADDRESS STA GEXIT SAVE IN GOOD EXIT ISZ %WRIS LDB %WRIS LDB B,I GET WRITE BUFFER ADDRESS RBL,CLE,SLB,ERB TRACK DOWN INDIRECTS JMP *-2 ISZ %WRIS GET THE LENGTH OF BUFFER IN NEG. LDA %WRIS,I CHARACTERS, OR 0 IF IMBEDDED FILE MARK LDA A,I OR >1 IF TRUE END OF FILE. ARS CONVERT TO -WORDS. JSB WRITE WRITE THE RECORD ON DISC JMP %WRIS,I ERROR RETURN (OUT OF DISC SPACE) JMP GEXIT,I GOOD RETURN A=LS WORD. (LU*256+TRACK) SPC 1 GEXIT NOP SPC 1 %WRIN NOP INITIALIZATION ENTRY POINT FOR NEW FILE JSB GETRK GET A TRACK FROM SYSTEM JMP %WRIN,I NO DISC SPACE EXIT ISZ %WRIN BUMP TO GOOD EXIT JSB MFTAS MOVE FORWARD TRACK AND SECTOR NUMBERS JSB POST SET-UP BUFFERS & COUNTERS JMP %WRIN,I GOOD EXIT A=LS WORD (DISKLU*265+TRACK#) SPC 1 %WEOF NOP WRITE TRUE END OF FILE MARK CLA,INA SET BUFFER LEN POSITIVE JSB WRITE GO WRITE FILE MARK JMP *-2 IF OUT OF DISC TRY AGAIN JSB POST FORCE WRITE OF IN CORE BUFFER JMP %WEOF,I A=LAST TRACK+DISC LU SPC 1 WRITE NOP ENTRY A=-WORD COUNT,B=BUFFER ADDRESS IFST JMP FIRST CHECK IF 1ST CALL TO %WRIN STB SBUFR SAVE SOURCE BUFFER ADDRESS CCB SET B=-1 ADA B DECREMENT A-REG CLB SET UP B, JUST IN CASE SSA,RSS CHECK IF WAS > 0? CCA,RSS YES, FORCE FILE MARK STA B SAVE IN B CMB B= WORD COUNT BLF,BLF POSITION FOR HEDDER WORD ON DISC STA SRCNT SAVE A FOR # WORDS PUT ON DISC JMP BEGRC BEGIN RECORD WRITE SPC 1 MORE LDB SBUFR,I GET NEXT WORD FROM CALLER ISZ SBUFR BUMP ADDRESS TO NEXT WORD BEGRC STB DSBFR,I PUT IN DISC BUFFER ISZ DSBFR BUMP ITS POINTER ISZ DSCNT DISC BUFFER FULL? JMP BUFNF NO, BUFFER NOT FULL LDA SECTR YES, CHECK IF LAST SECTR ON TRACK ADA D2 BUMP BY TWO CPA SE/TK EQUAL TO NUMB SECTRS PER TRACK? JMP EOTRK YES, PROCESS END OF TRACK JSB POST NO, POST THE SECTOR STA SECTR UPDATE THE SECTOR WORD JMP BUFNF CONTINUE ON SPC 1 EOTRK STB WRIT1 SAVE LAST WORD ON TRACK JSB GETRK GET ANOTHER TRACK JMP WRITE,I NO TRACKS, ERROR RETURN STA BUFFR+127 SAVE NEW TRACK ADDR IN LAST STA LUNTR WORD OF OLD TRACK+LET CALL KNOW JSB POST WRITE OUT LAST SECTOR OF OLD JSB MFTAS MOVE FORWARD NEW TRACK ADDRESS LDB WRIT1 GET THE WORD THAT MISSED JMP BEGRC STORE IT IN 1ST WORD OF NEW TRACK SPC 1 BUFNF ISZ SRCNT MORE WORDS IN CALLERS BUF? JMP MORE YES LDA LUNTR NO, RETURN A= DISCLU*256+TRACK ISZ WRITE GOOD RETURN P+2 JMP WRITE,I SPC 1 SBUFR NOP SRCNT NOP DSBFR NOP DSCNT NOP D2 DEC 2 WRIT1 NOP LUNTR NOP SPC 1 POST NOP WRITE OUT THE 128 WORD SECTOR STA POST1 SAVE THE A-REG JSB EXEC EXEC>>DO IT DEF *+7 DEF D2 WRITE DEF OLDLU DISC LOGICAL UNIT DEFBF DEF BUFFR DEF D128 128 WORDS DEF OLDTK TRACK ADDRESS DEF SECTR SECTOR ADDRESS LDA DEFBF RESET THE DISC BUFFER STA DSBFR LDA DM128 AND THE COUNT STA DSCNT LDA POST1 RESTORE A-REG JMP POST,I RETURN SPC 1 POST1 NOP TEMP FOR POST ROUTINE D128 DEC 128 DM128 DEC -128 SPC 1 MFTAS NOP ROUTINE TO BRING FORWARD GETRK'S LDB NEWTK DISC ADDRESSES STB OLDTK TRACK ADDRESS LDB NEWLU DISC LU STB OLDLU CLB SECTOR ADDRESS STB SECTR JMP MFTAS,I RETURN SPC 1 OLDTK NOP NEWTK NOP OLDLU NOP NEWLU NOP SECTR NOP SE/TK NOP SPC 1 GETRK NOP ROUTINE TO GET A TRACK FROM SYSTEM JSB EXEC REQUEST TRACK WITHOUT WAIT DEF *+6 DEF D4 PROGRAM OWNED TRACK DEF NUMTK ONE TRACK, NO WAIT DEF NEWTK RETURNED TRACK NUMBER DEF NEWLU DISC LU NUMBER 2 OR 3 DEF SE/TK NUMBER SECTORS PER TRACK LDA NEWTK GET THE TRACK # OR -1 IF NONE LDB NEWLU GET DISC LU BLF,BLF POSITION IOR B MIRGE IN WITH TRACK NUMBER SSA,RSS CHECK IF GOT ONE? ISZ GETRK YES, P+2 EXIT JMP GETRK,I NO, P+1 EXIT SPC 1 NUMTK OCT 100001 D4 DEC 4 BUFFR BSS 128 ORG BUFFR OCT -1 FIRST STA SAVA STB SAVB LDA %WRIN CHECK IF EVER CALLED SZA JMP SKIP JSB %WRIN INITIALIZE 1ST TIME JMP WRITE,I ERROR EXIT SKIP CLA STA IFST NO MORE CALLS LDA SAVA RESTORE REGISTERS LDB SAVB JMP IFST+1 SPC 1 SAVA NOP SAVB NOP ORR A EQU 0 B EQU 1 END * *