.SBTTL COMMAND DIALOG .GLOBL ENDST2,PTR.8,PTR.9,STG2M ST2CMD: MOV @#RMPTR,R1 ;R1=RMON START MOV USRLOC(R1),R1 ;R1=USR ADDRESS .SETTOP R1 ;ASK FOR MEMORY UP TO USR MOV R0,-(SP) ;PUSH TOP ADDRESS MOV SP,SPSAV ;SAVE STACK POINTER MOV #SRTMSG,R1 ;OUTPUT STAGE2 TITLE SLOOP: MOVB (R1)+,R0 BEQ RSTART .TTYOUT BR SLOOP RSTART: .RCTRLO ;UNLOCK POSSIBLE CNTL O MOV #CRLF,R1 ;OUTPUT CR-LF RSLOOP: MOVB (R1)+,R0 BEQ 1$ .TTYOUT BR RSLOOP 1$: JSR PC,INIT ;TAKE A SHOWER .CSIGEN #ENDST2,#DEXT ;SET UP CHANNELS MOV SPSAV,SP ;IGNORE SWITCHES MOV R0,BASE ;BASE OF FLUB MEMORY SUB (SP),R0 ;GET FLUB MEMORY SIZE NEG R0 ;IN BYTES SUB #256.,R0 ;1/4 K DMZ BPL 2$ ;IF LT 16K, ACCEPT MOV #77776,R0 ;ELSE MAKE 16K BECAUSE ;OF ADDRESS CALC IN PART 2 2$: ASR R0 ;4 BYTES/FLUB WORD ASR R0 DEC R0 ;R0=FLUB'S HIGHEST MEMORY ADDR ASL R0 ASL R0 ;IN BYTES CLR PTR.8 ;FLUB MEMORY STARTS AT 0 MOV R0,PTR.9 ;PTR.9=HIGH FLUB ADDRESS MOV #EAE.MQ,EAE ;EAE POINTER MOV #INLB,LBR ;SET UP LINE BUFFER POINTERS MOV #OUTLB,LBW JSR PC,PRMCHN ;PRIME INPUT CHANNEL JSR PC,STG2M ;CALL STAGE2 BODY JSR PC,DRNCHN ;DRAIN OUTPUT CHANNELS BR RSTART ;GET NEXT COMMAND INIT: CLR FLBFLG ;CLEAR FLUB FLAGS MOV OCRBUF,OBLKPT ;SET UP INITIAL VALUES FOR MOV OCRBUF+2,OBLKPT+2 ;POINTERS AND INDICES MOV OCRBUF+4,OBLKPT+4 MOV OCRBUF,OCBKEN ADD #512.,OCBKEN MOV OCRBUF+2,OCBKEN+2 ADD #512.,OCBKEN+2 MOV OCRBUF+4,OCBKEN+4 ADD #512.,OCBKEN+4 CLR WTBLKN CLR WTBLKN+2 CLR WTBLKN+4 CLR R1 ;SET UP CHANNEL NUMBER 1$: .WAIT R1 ;WAIT FOR ANY I/O TO FINISH .CLOSE R1 ;CLOSE CHANNEL INC R1 ;BUMP CHANNEL NUMBER CMP #10,R1 ;LAST CHANNEL? BGE 1$ ;IF NOT, BRANCH .SRESET ;RELEASE OLD DEVICE HANDLERS RTS PC .SBTTL SUBROUTINE PRIME INPUT CHANNEL .GLOBL FSTFIL,RDBLK PRMCHN: MOV #2,INPCHN ;CHANNEL 3= FIRST POSSIBLE INPUT ;CHANNEL (INPCHN INCREMENTED IN ;FSTFIL) JSR PC,FSTFIL ;GET FIRST INPUT CHANNEL BCS NINPUT ;IF NO INPUT CHANNEL, ERRMSG JSR PC,RDBLK ;GET 1ST BLK BCS HRDERR ;BRANCH ON HARWARE ERROR JSR PC,RDBLK ;GET 2ND BLK BCS PRMEOM ;IT IS POSSIBLE THAT INPUT CONSISTS ;OF ONLY ONE FILE. GO CHECK. RTS PC ;OTHERWISE, RETURN NINPUT: MOV #NINPMS,R1 ;GET 'NO INPUT FILE' ERROR MSG NIMSLP: MOVB (R1)+,R0 ;PRINT MSG BEQ RSTART .TTYOUT BR NIMSLP HRDERR: MOV #HDERMS,R1 ;GET 'HARDWARE ERROR' ERROR MSG HEMSLP: MOVB (R1)+,R0 ;PRINT MSG BEQ RSTART .TTYOUT BR HEMSLP PRMEOM: BMI 1$ ;IF N=1, EOD BR HRDERR ;OTHERWISE, HARDWARE ERROR 1$: RTS PC .SBTTL SUBROUTINE DRAIN OUTPUT CHANNELS .GLOBL WRTBLK DRNCHN: CLR R2 ;SET UP INDEX CLR OUTCHN ;AND CHANNEL NUMBER LOOP: .WAIT OUTCHN ;IS CHANNEL DEFINED? BCS CHNDFN MOV OBLKPT(R2),R3 ;GET POINTER INTO CURRENT BLOCK MOV OCBKEN(R2),EBLKAD ;REMEMBER BLOCK END ADDRESS 2$: CLRB (R3)+ ;ZERO OUT REST OF BLOCK CMP R3,EBLKAD ;END OF BLOCK? BLT 2$ ;IF NOT, LOOP JSR PC,WRTBLK ;OTHERWISE, OUTPUT BLOCK BCS DRNERR ;IF ERROR, TELL USER INCTST: INC OUTCHN ;BUMP CHANNEL NUMBER TST (R2)+ ;R2=R2+2 CMP #6,R2 ;LAST CHANNEL? BGT LOOP ;IF NOT, LOOP DRNRTN: RTS PC ;RETURN DRNERR: MOV #DRNEMS,R3 ;ERROR MSG ADDRESS TO R3 DRNMLP: MOVB (R3)+,R2 ;OUTPUT MESSAGE BEQ DRNRTN .TTYOUT BR DRNMLP CHNDFN: TSTB @#ERRWD ;FIND OUT WHY .WAIT FAILED BNE DRNERR ;IF ERRWD .NE. 0, HARDWARE ERROR BR INCTST ;OTHERWISE, CHANNEL UNDEFINED .END ST2CMD