.SBTTL SUBROUTINE READ ;-READS ONE LINE INTO THE LINE BUFFER ;-CHANNEL NUMBER MUST BE IN R0 ;-COMPLETION CODE TO R1 .GLOBL READ READ: TST R0 ;READ ON CHANNEL 0? BNE 1$ ;IF NOT, BRANCH MOV #1,R1 ;OTHERWISE, RETURN EOF RTS PC 1$: CMP #1,R0 ;READ ON CHANNEL 1? BNE BADCHN ;IF NOT, ERROR RLOOP: JSR PC,NXTLNE ;GET NEXT LINE FROM BLOCK BCC RDRTN ;IF NEXT LINE AVAILABLE, BRANCH BEQ RDOVF ;IF Z=1, OVERFLOW BMI RDEOF ;IF N=1, EOD BVS RDERR ;IF V=1, HARDWARE ERROR HALT ;OTHERWISE, READ SOFTWARE ERROR .EXIT ;LET A CONTINUE GO BACK TO MONITOR RDRTN: CLR R1 ;INDICATE GOOD READ RTS PC ;RETURN RDEOF: MOV #1,R1 ;INDICATE INPUT EOD RTS PC BADCHN: MOV #2,R1 ;ILLEGAL CHANNEL NUMBER RTS PC RDERR: MOV #3,R1 ;INDICATE HARDWARE ERROR RTS PC RDOVF: MOV #4,R1 ;READ OVERFLOW RTS PC .SBTTL SUBROUTINE NEXT LINE ;-READS NEXT LINE FROM CURRENT BLOCK INTO LB. IF ;-BLOCK FINISHES BEFORE IS FOUND, CALLS SUBROUTINE ;-TO GET NEXT BLOCK (NXTBLK) NXTLNE: TSTB FLBFLG ;DO WE HAVE A PARTIAL LINE? BMI 1$ ;IF SO, DON'T RESET LINE PTR BIS #200,FLBFLG ;SET PARTIAL LINE FLAG MOV #INLB,ILNEPT ;RESET LINE POINTER 1$: MOV ILNEPT,R0 ;GET LINE BUFFER POINTER MOV IBLKPT,R1 ;GET POINTER INTO CURRENT BLK BR ENDTST ;MAKE SURE WE HAVEN'T COME TO ;END OF BLOCK LOOP: MOVB (R1)+,(R0)+ ;MOVE NEXT CHAR TO LINE BUFFER BEQ BMPBLK ;IF CHAR=0, SOFTWARE EOF CMPB #LF,-1(R0) ;CHAR=LF? BEQ LFIGNR ;IF SO, IGNORE IT CMPB #CR,-1(R0) ;CHAR=CR? BEQ ENDLNE ;IF SO, WE'VE GO THE LINE ENDTST: CMP ICBKEN,R1 ;END OF CURRENT BLK BLE BMPBK1 ;IF SO, GET NEXT BLK CMP #IENDBF,R0 ;BUFFER OVERFLOW BLE BUFOVF ;IF SO, INFORM STAGE2 BR LOOP ;OTHERWISE, MOVE NEXT CHAR LFIGNR: DEC R0 ;BACKSPACE LINE POINTER BR ENDTST ;GET NEXT CHARACTER ENDLNE: BIC #200,FLBFLG ;INDICATE WE GOT A WHOLE LINE MOVB #-1,-(R0) ;FLUB END OF LINE MOV #INLB,LBR ;SET STAG2M'S POINTER MOV R1,IBLKPT ;UPDATE BLKPTR CLC ;INDICATE SUCESSFUL LINE GRAB RTS PC BMPBLK: DEC R0 ;BACKSPACE OVER SOFTWARE EOF BMPBK1: MOV R0,ILNEPT ;REMEMBER WHERE WE ARE IN INLB JSR PC,NXTBLK ;GET NEXT BLK BCC NXTLNE ;IF WE GOT ANOTHER BLOCK, ;FINISH OFF LINE RTS PC ;OTHERWISE, RETURN WITH CC SET ;TO ERROR BUFOVF: CCC ;PASS BACK THRU READ TO STAGE2 SEC SEZ ;INDICATE READ BUFFER OVERFLOW RTS PC .SBTTL SUBROUTINE NEXT BLOCK ;-STARTS READING ANOTHER INPUT BLOCK. SINCE INPUT ;-IS DOUBLE BUFFERED, IT CAN RETURN THE NEXT BLOCK ;-IMMEDIATELY. IF EOF IS DETECTED ON CURRENT INPUT ;-CHANNEL, CALLS NXTFIL TO SEARCH FOR NEXT INPUT FILE. .GLOBL RDBLK RDBLK: NXTBLK: BIT #1,FLBFLG ;HAS AN EOD ALREADY OCCURED? BNE BRDEOM ;IF SO, INDICATE EOM MOV INPCHN,R1 ;GET INPUT CHANNEL NUMBER .WAIT R1 BCS BRDEOF ;IF WAIT FAILS, ERROR MOV FILBUF,R0 ;ROTATE BUFFER POINTERS MOV ICRBUF,FILBUF MOV R0,ICRBUF MOV R0,IBLKPT ;RESET BLKPTR MOV R0,ICBKEN ;AND CURBUF END ADD #512.,ICBKEN ;POINTER GETBLK: .READ #INPBLK,R1,FILBUF,#256.,RDBLKN BCS BRDEOF ;IF UNSUCEESFUL READ, CHECK FOR EOF INC RDBLKN ;BUMP BLK NUMBER CCC ;INDICATE SUCESS RTS PC BRDEOF: TSTB @#ERRWD ;HARDWARE ERROR? BNE BRDERR ;BRANCH ON HARDWARE ERROR JSR PC,NXTFIL ;OTHERWISE, LOOK FOR NEXT INPUT FILE BIT #1,FLBFLG ;EOD? BNE RETURN ;IF SO, NO MORE BLOCKS BR GETBLK ;OTHERWISE, GET NEXT BLOCK BRDERR: CCC SEC ;INDICATE ERROR SEV ;INDICATE HARDWARE RETURN: RTS PC BRDEOM: CCC SEC SEN ;INDICATE EOD RTS PC .SBTTL SUBROUTINE NEXT INPUT FILE ;-SEARCHES FOR NEXT DEFINED INPUT CHANNEL. IF NONE, SETS ;-ERROR CONDITION CODE. IF ANOTHER EXISTS, UPDATES INPUT ;-CHANNEL NUMBER (INPCHN) AND READ BLOCK NUMBER (RDBLKN). .GLOBL FSTFIL FSTFIL: NXTFIL: MOV INPCHN,R1 ;GET CURRENT INPUT CHANNEL NUMBER NXTFL1: INC R1 ;NEXT POSSIBLE CHANNEL NUMBER CMP #10,R1 ;IS IT > 10 (OCTAL) BLT RDONE ;IF SO, THERE IS NO MORE INPUT .WAIT R1 ;IS CHANNEL DEFINED? BCC 1$ ;IF SO, BRANCH TSTB @#ERRWD ;OTHERWISE, THERE IS A PROBLEM BNE BRDERR ;THIS BRANCH SHOULD NEVER BE TAKEN BR NXTFL1 ;TRY NEXT INPUT CHANNEL 1$: MOV R1,INPCHN ;UPDATE INPUT CHANNEL NUMBER CLR RDBLKN ;RESET BLK NUMBER RTS PC RDONE: BIS #1,FLBFLG ;INDICATE TO ERRMSG - EOD CCC RTS PC .END