/ OS/8 FILE UNPACK ROUTINE. /019 CJL / THIS ROUTINE UNPACKS BYTES FROM THE INPUT FILE ACCORDING TO THE CURRENT VALUE / OF FILMODE: / FILMODE CONTAINS 0177 (ASCII MODE). ALL BYTES ARE TREATED AS SEVEN-BIT ASCII / CHARACTERS BY STRIPPING THE HIGH-ORDER BIT. END OF FILE IS THE <^Z> CHARACTER / WHICH WILL BE SENT OR NOT ACCORDING TO THE CONTENTS OF OCTLZFLAG. IF / OCTLZFLAG CONTAINS NON-ZERO, THEN <^Z> WILL BE SENT AT ; THE NEXT CALL / WILL YIELD THE RETURN. IF OCTLZFLAG CONTAINS ZERO, THEN DETECTION OF / <^Z> YIELDS THE RETURN IMMEDIATELY. / FILMODE CONTAINS 4377 (BINARY MODE). ALL BYTES ARE TREATED AS EIGHT-BIT / CHARACTERS AND WILL BE SENT WITHOUT <^Z> CHECK. THE NEXT CALL AFTER THE LAST / BYTE OF THE LAST RECORD HAS BEEN SENT YIELDS THE RETURN. / CALLING CONSIDERATIONS: / OCTLZFLAG MUST BE SETUP ACCORDINGLY IF IN ASCII MODE. / FILMODE MUST BE SETUP ACCORDINGLY. / FLEN MUST CONTAIN -(FILE LENGTH IN RECORDS) WHEN INITIALIZING THE INPUT FILE. / IT WILL BE MODIFIED BY CALLING THIS ROUTINE. / FSBLK MUST CONTAIN THE THE STARTING RECORD WHEN INITIALIZING THE INPUT FILE. / HNDADR MUST ALREADY BE SETUP TO CALL THE INPUT HANDLER. / CALLING SEQUENCE: / CLA /OR NL7777 IF INITIALIZING THE INPUT FILE / JMS I (GETBYTE) /CALL ROUTINE / I/O ERROR RETURN /FATAL INPUT ERROR OCCURRED; AC CONTAINS JUNK / END OF FILE / OCCURRED / GOOD RETURN /AC CONTAINS LATEST SEVEN/EIGHT-BIT CHARACTER GETBYTE,.-. /GET A BYTE ROUTINE SNA CLA /INITIALIZING? JMP I PUTC /NO, GO GET NEXT BYTE TAD FSBLK /GET STARTING RECORD OF INPUT FILE DCA GETRECORD /STORE IN-LINE GETNEWR,JMS I HNDADR /CALL I/O HANDLER PAGCNT^100+BUFFLD /READ SOME PAGES INTO BUFFER FIELD GETCORE,FILBUFFER /BUFFER ADDRESS GETRECO,.-. /WILL BE LATEST RECORD NUMBER JMP I GETBYTE /INPUT ERROR! TAD GETCORE/(FILBUFFER) /SETUP THE DCA BUFPTR /BUFFER POINTER GETLOOP,DCA THIRD /CLEAR THIRD BYTE NOW JMS PUTONE /OBTAIN AND SEND BACK FIRST BYTE JMS PUTONE /OBTAIN AND SEND BACK SECOND BYTE TAD THIRD /GET THIRD BYTE JMS PUTC /SEND IT BACK TAD BUFPTR /GET THE POINTER TAD (-PAGCNT^200-FILBUFFER) /COMPARE TO LIMIT SZA CLA /SKIP IF AT END JMP GETLOOP /KEEP GOING ISZ GETRECORD /BUMP TO NEXT RECORD ISZ FLEN /DONE ALL RECORDS? (BINARY MODE ONLY) JMP GETNEWRECORD /NO, GO DO ANOTHER ONE / BINARY REACHED HERE. JMP GETEOF /TAKE SKIP RETURN TO MAIN CALLER PUTONE, .-. /SEND BACK A BYTE ROUTINE CDF BUFFLD /GOTO BUFFER FIELD TAD I BUFPTR /GET LATEST WORD AND [7400] /JUST THIRD-BYTE NYBBLE CLL RAL /MOVE UP TAD THIRD /GET OLD NYBBLE (IF ANY) RTL;RTL /MOVE UP NYBBLE BITS DCA THIRD /SAVE FOR NEXT TIME TAD I BUFPTR /GET LATEST WORD AGAIN JMS PUTC /SEND BACK CURRENT BYTE ISZ BUFPTR /BUMP TO NEXT WORD JMP I PUTONE /RETURN PUTC, .-. /SEND BACK LATEST BYTE ROUTINE CDF PRGFLD /BACK TO OUR FIELD RAL /MOVE UP STL RAR /MOVE DOWN WITH BIT[0] SET AND FILMODE /KEEP ONLY GOOD BITS TAD [-CNTRLZ] /COMPARE TO <^Z> SNA /SKIP IF NOT ASCII MODE JMP GETEND /JUMP IF ASCII MODE GETUPZ, TAD [CNTRLZ] /RESTORE THE CHARACTER AND [377] /ENSURE EIGHT-BIT (MIGHT ALREADY BE SEVEN-BIT) ISZ GETBYTE /BUMP PAST RETURN GETEOF, ISZ GETBYTE /BUMP PAST I/O ERROR RETURN JMP I GETBYTE /RETURN TO MAIN CALLER / GOT IN ASCII MODE. GETEND, TAD OCTLZFLAG /GET <^Z> DISPOSITION FLAG SNA CLA /SKIP IF SET JMP GETEOF /JUST RETURN CONDITION TAD (GETEOF) /POINT TO DCA PUTC /FOR NEXT TIME JMP GETUPZ /GIVE THEM BACK <^Z> THIS TIME PAGE /DUMP LITERALS NOW / EQUATED SYMBOLS. BUFFLD= 1^10 /BUFFER FIELD CNTRLZ= "Z&37 /CONTROL-Z CODE FILBUFF=2000 /FILE CONTENTS BUFFER ADDRESS NL7777= CLA CMA /LOAD ACCUMULATOR WITH 7777 PAGCNT= 4 /NUMBER OF 128 WORD PAGES IN THE INPUT BUFFER PRGFLD= 0^10 /PROGRAM EXECUTION FIELD PAGE 0 /SHARED TEMPORARIES BUFPTR, .-. /BUFFER POINTER FILMODE,177 /WHERE FILE TRANSFER MODE CONTROL WORD IS FLEN, .-. /NEGATED FILE LENGTH IN RECORDS STORED HERE FSBLK, .-. /FILE STARTING BLOCK HNDADR, .-. /READ/WRITE HANDLER LOADING ADDRESS POINTER OCTLZFL,0 /CONTROL-Z DISPOSITION FLAG THIRD, .-. /THIRD BYTE TEMPORARY $ /THAT'S ALL, FOLK!