.NLIST TTM .TITLE AC2 .IDENT /ANAL03/ ; ***** J. CLEMENT ***** ; ***** DEC 1974 ; ; DECLARE MACROS ; .MCALL QIO$C,QIOW$S,QIO$S,STOP$S,QIOW$C .PSECT STATSC,OVR,GBL,D ISTOP: .BLKW 1 .PSECT SW.SYS,GBL,OVR,D RUNHLD: .BLKW 1 REWIND: .BLKW 1 .PSECT ; PROGRAM SECTION ; ; DATA AREA OF PROGRAM AC2 ; C2.BEG:: .WORD 0 ; BEGIN/END(0) STATUS C2.BOQ:: ; OUTPUT QUE HEADER (NONE) C2.BHQ:: .WORD 0 ; INPUT QUE HEADER (NONE) C2.RUN:: .WORD 0 ; RUN # C2.ANQ:: .WORD 0 ; ANAL BUFF HEADER,ANAL COUNT C2.ACT:: .WORD 0 ; ANAL BUFFER COUNT BADCNT: .WORD 0 ; BAD BUFFER COUNT BEGIN: .WORD 0 ; 0=SEARCHING FOR NEW BEGIN RUN CNT: .WORD -4 ; # OF BUFFERS TO BACKSPACE IOSTAT: .BLKW 1 ; ERROR PARAM FOR I/O MT: IODONE: .BLKW 2 ; COUNTS # BL READ UNIT = 2 ; INPUT UNIT ; ; SECTION TO RUN,STOP ; C2RUN:: TST ISTOP BEQ RETF ; ALREADY IN RUN MODE CLR ISTOP BR RETT C2STP:: TST ISTOP BNE RETF ; ALREADY IN STOP MODE DEC ISTOP BR RETT ; SECTION TO END A RUN ; C2END:: TST C2.BEG ; TEST IF ALREADY ENDED BEQ RETF ; YES, BAD STATUS BR END RETT: CLC ; GOOD STATUS RETURN RETF: SEC ; BAD STATUS RETURN ; ; BEGIN THE RUN ; C2BEG:: TST C2.BEG ; IS RUN IN PROGRESS BNE RETF ; YES, CAN'T RE BEGIN JSR PC,BEGMES DEC C2.BEG ; RUN IN PROGRESS CLR ISTOP ; NOT IN STOP MODE CLR BEGIN ; SET UP FOR BEGIN RUN TST C2.ANQ ; IS BUFFER SET UP? BEQ RETT ; NO, EXIT WITH OK JSR PC,SERMES ; SEARCHING MESSAGE RBTS:: MOV R5,-(SP) JSR PC,KBYES ; IF REQUESTED DO I/O MOV (SP)+,R5 TSTB C2.BEG ; TEST IF END RUN REQUESTED BEQ RETF ; NO RUN ; ; READ A DATA BUFFER + WAIT FOR IT TO COME IN ; MOV C2.ANQ,R4 ; DATA BUFFER ADDRESS BEQ RETT ; IF NO BUFFER RETURN FALSE SUB #10.,R4 ; START OF BUFFER QIOW$S #IO.RVB,#UNIT,#1,,#IOSTAT,, DEC CNT ; COUNTS # OF RECORDS CMPB #IS.SUC,IOSTAT ; CHECK IF SUCCESSFUL READ BEQ 4$ ; YES! CMPB IOSTAT,#IE.EOV ; IS IT IND OF VOLUME? BEQ ENDERR ; YES END THE RUN CMPB IOSTAT,#IE.EOF ; IS IT END OF FILE BEQ END ; END THE RUN CMPB IOSTAT,#IE.EOT ; IS IT END OF TAPE BEQ 4$ ; YES,IGNORE IT CMPB IOSTAT,#IE.FHE ; IS IT BAD ERROR BEQ ENDERR CMPB IOSTAT,#IE.DNR ; BAD ERROR? BEQ END ; YES TERMINATE INC BADCNT ; INCRMENT BAD BUFFER COUNT JSR PC,MTERR ; OUTPUT ERROR MESSAGE BR RBTS ; TRY AGAIN ; READ + WAIT FOR 1 LOGICAL BLOCK FROM TAPE 4$: TST BEGIN ; ARE WE LOOKING FOR BEGIN BNE DONE ; NO, GETTING DATA CMP (R4),#"C2 ; CHECK FOR BEGIN BUFF BNE RBTS ; IF NOT BEGIN, CONTINUE READING TST C2.RUN ; IS ANY RUN # ACCEPTABLE? BLT 1$ ; YES! MOV 2(R4),C2.ACT ; SAVE RUN# FOUND CMP 2(R4),C2.RUN ; IS IT RUN# REQUESTED BNE RBTS ; IF NOT CORRECT RUN NO CONTINUE 1$: DEC BEGIN ; WE HAVE BEGUN A RUN MOV 2(R4),C2.RUN ; RUN NUMBER ACTUAL FOUND CLR C2.ACT ; RESET BUFFER COUNT CLR BADCNT ; RESET BAD BUFFER COUNT MOV #-4,CNT ; SET UP LOW COUNT BR RBTS DONE: CMP #-1,(R4) ; IS THIS END BUFFER? BEQ END ; END THE RUN CMP (R4),#"C2 ; IS IT PREMATURE START BEQ ENDC2 ; YES GIVE END INC C2.ACT ; NUMBER OF BUFF CLC ; OK STATUS RETURN ; ; ENDC2: QIO$C IO.SPB,UNIT,,,,,<-1> ; BACKSPACE 1 END: CLR -(SP) MOV #ENDMES,-(SP) ; MESSAGE END1: CLR C2.BEG ; END THE RUN MOUT: CLR R1 ; NOT ERROR MOV SP,R0 ; POINTS TO ENDMES BUFF JSR PC,$ERRLG ; OUTPUT MESSAGE CMP (SP)+,(SP)+ ; POP STACK SEC RETURN BEGMES: CLR -(SP) MOV #BEGMS,-(SP) BR MOUT SERMES: CLR -(SP) MOV #SEARCH,-(SP) BR MOUT ENDERR: CLR -(SP) MOV #ERRMES,-(SP) BR END1 MTERR: CLR -(SP) MOV #MTERMS,-(SP) BR MOUT BEGMS: .ASCIZ /BEGIN RUN/ ENDMES: .ASCIZ /END RUN/ ERRMES: .ASCIZ /END RUN EOT OR FATAL MT: ERROR/ EOFMES: .ASCIZ /END RUN EOF ON MT:/ MTERMS: .ASCIZ /MT: ERROR BUFFER IGNORED/ SEARCH: .ASCIZ /SEARCHING/ BUFMES: .ASCIZ /NO DATA BUFFER/ .EVEN ; ; ; ASTAT:: MOV #1,R0 ; 1 PARAM CALL R5CHEK ; CHECK PARAMETER LIST CLR @(R5) ; INDICATE OK! TST C2.BEG ; IS IT END RUN? BNE 2$ ; NO END RUN, OK BIS #5,@(R5) ; TELL CALLER END RUN DEC STCNT ; Do we stop? BGT 3$ ; Not yet STOP$S ; NO,WAIT FOR SIG EVENT 2$: MOV #3,STCNT ; Tries before stop TST C2.ANQ ; BUFFER AVAILABLE? BNE 3$ ; YES BIS #1,@(R5) ; NO, INDICATE NO BUFFER 3$: CALL KBYES ; ALLOW KEYBOARD I/O RETURN ; RETURN STCNT: .WORD 3 ; Counts number of tries before stop ; ; THIS ROUTINE CLEANS UP BY BACKSPACING A FEW TIMES,IF DESIRED ; FLUSH:: TST C2.BEG ; IS RUN ENDED BNE FL1 ; NO TST REWIND ; IS REWIND REQUESTED? BEQ FL1 ; NO QIO$S #IO.SPB,#UNIT,,,#IOSTAT,, MOV #-4,CNT ; ONLY SPACE ONCE FL1: RETURN ; ; ; IBR:: MOV #1,R0 ; 1 PARAM TST C2.ANQ ; BUFFER AVAILABLE? BEQ NOBUFF ; NO JSR PC,R5CHEK ; CHECK PARAM LIST MOV @(R5)+,R0 ; GET THE CHAN NUMBER ASL R0 ; CHANGE FROM WORD TO BYTE ADDR. ADD C2.ANQ,R0 ; NOW ADDRESS IN BUFFER MOV -2(R0),R0 ; GET DATA FOR USER RTS PC NOBUFF: MOV #BUFMES,-(SP) ; NO BUFFER MESSAGE JMP MOUT ; GIVE MESSAGE ; ; CALL BTRAN(IB,ICHAN,LENGTH) ; THIS TRANSFERS LENGTH # OF WORDS STARTING WITH ICHAN TO ; TO ARRAY IA ; ; BTRAN:: MOV #3,R0 TST ASTAT ; BUFFER AVAILABLE? BEQ NOBUFF ; NO, GIVE MESSAGE JSR PC,R5CHEK MOV (R5)+,R0 ; ARRAY TO TRANSFER TO MOV @(R5)+,R1 ; FIRST CHANNEL TO TRANSFER DEC R1 ; NOW POINTS TO WORD ASL R1 ; NOW POINTS TO BYTE ADD C2.ANQ,R1 ; NOW HAS ABSOLUTE ADDRESS OF BUFFER MOV @(R5)+,R2 ; NO OF WORDS TO TRAN BLE 5$ ; BAD COUNT 1$: MOV (R1)+,(R0)+ ; MOVE THE DATA SOB R2,1$ ; CONTINUE TILL THROUGH 5$: RTS PC .END