.NLIST TTM .TITLE SSET .IDENT /RICE01/ .LIST MEB ;$PLOT=1 ; Enable this to spawn PLOT (cntrl P) ;$CNTRZ=1 ; Enable this to detach on control Z ;$SPN=1 ; Enable this to spawn unknown commands to MCR ;$MMGT=1 ; Enable this to use memory management ;$DUMMY=1 ; Enable this for dummy entry points .MCALL QIO$S,ASTX$S,QIO$C,SRDA$S,RCVD$S,SPWN$C,MAP$S,USTP$S .MCALL SPWN$S .PSECT SW.SYS,RW,D,OVR,GBL .PSECT STATSC,RW,D,OVR,GBL ISTOP: .WORD 0 ; None zero, stops analysis ISTAT: .WORD -2 ; Positive # is # of bytes of data ready BUFF: .BLKB 82. ; Input data array RBUF: .BLKW 15. .PSECT $VARS,RW,D,CON,LCL PROMPT: .BYTE 12,7,'#,0 ; Prompt string MCR: .RAD50 /MCR.../ ISTAT2: .BLKW 2 .BLKW 2 ; Before HI$FRH HI$FRH:: .BLKW 4 .ifdf $MMGT HMAPB: .WORD 0 HMAPT: .WORD 0 HI$WDW:: .BYTE 0,7 ; WINDOW ID + BASE APR .WORD 0 ; VIRTUAL BASE OF WINDOW .WORD 128. ; WINDOW SIZE (32 WORD BLOCKS) .WORD 0 ; REGION ID NOFF: .WORD 0 NLEN: .WORD 0 ; LENGTH OF MAPPING NSTS: .WORD WS.WRT!WS.MAP!WS.64B ; STATUS BLOCK NSRB: .WORD 0 ; SEND/REC BUFFER ADDRESS .endc ISTAT3: .WORD 0 ; ; HIST TABLE: ; BYTE 0 = YSIZE ; BYTE 1 = STATUS (NON ZERO HIST EXISTS) ; WORD 2 OFFSET TO DATA ; WORD 4 X SIZE ; WORD 6-11 SCALES ; WORD 12-16 LABEL ; WORD 17... DATA ; CRAP1: .WORD 0,0,0,0,0,0,0 .ASCII / / ; HIST #0 TITLE CRAP: .WORD CRAP1 HI$BUF:: .WORD CRAP ; INITIALLY POINTS TO EMPTY PARAM LIST SVT2:: .WORD 0,0 ; Address of color scope tables MK$BUF:: .WORD 0,0,0 .ifdf $DUMMY .ENTRY C2BEG,^M<> RET .ENTRY C2END,^M<> RET .ENTRY C2RUN,^M<> RET .ENTRY C2STP,^M<> RET .endc .PSECT ; ; Fortran entry to set up I/O ; SSET:: TST ISTAT ; Is status positive ? BLE 10$ ; No ? CLR ISTAT ; Set no words in buffer RETURN ; Set up for next input 10$: CLR ISTAT ; Set no words in buffer .ifdf $CNTRZ SRDA$S #RECIEV ; Set up recieve AST if detach allowed BR SSET0 ; NOW ATTACH THE TERMINAL ; ; Handle recieve data AST here ; RECIEV: RCVD$S ,#RBUF .endc SSET0: CLR -(SP) ;; FAKE WORD ON STACK SSET1: QIO$C IO.ATA,5,,,,, ;; ATTACH WITH AST RETURN BR ASTXIT ; ; Ast entry for unsolicited input ; ISS: USTP$S ;; Unstop program .ifdf $PLOT CMPB (SP),#20 ;; Cntrol P ( for plot)? BNE ISS20 ;; No TST ISTAT ;; May I use the BUFFER? BNE ASTXIT ;; No MOV #"PL,BUFF ;; Routine name to call MOV #"OT,BUFF+2 ;; Total name= PLOT MOV #4,ISTAT2+2 ;; Number of bytes in the name BR SPNMCR ;; Now spawn the command to MCR ISS20: .endc .ifdf $CNTRZ CMPB (SP),#26. ;; CONTROL Z? BNE ISS26 ;; No JSR PC,TIDET ;; Yes, detach the terminal ISS26: .ENDC TST ISTAT ;; READY FOR CHAR? BNE ASTXIT ;; No MOVB (SP),BUFF ;; CHARACTER CLRB BUFF+1 MOV #1,ISTAT ;; NUMBER OF CHAR READ CMPB (SP),#' ;; Is char 'space'? BNE ASTXIT ;; NO, PASS IT ON DIRECTLY CLR ISTAT ;; Set no char for now QIO$C IO.RPR,5,,,ISTAT2,SSET2, BR ASTXIT ; ; Return from QIO here ; SSET2: MOV R4,(SP) ;; Save R4 MOV ISTAT2+2,R4 ;; Byte count read MOV R4,ISTAT ;; BYTE COUNT TO USER 1$: CMP R4,#80. BHIS 2$ MOVB #',,BUFF(R4) INC R4 BR 1$ 2$: CMP ISTAT,#2 ;; More than 2 char input? BLE VALID ;; No it is OK CMPB BUFF+2,#'9 ;; Check the third byte. BLE VALID ;; Valid command .ifdf $SPN ; Conditional to spawn MCR ; ; Here we spawn invalid commands to MCR ; SPNMCR: CALL TIDET ;; Detach SPWN$S #MCR,,,,,,#SSET1,,#BUFF,ISTAT2+2 CLR ISTAT .endc VALID: MOV (SP),R4 ;; Restore R4 ASTXIT: TST (SP)+ ;; POP AST EXTRA WORD ASTX$S ;; RETURN FROM AST RETURN TIDET:: QIO$C IO.DET,5 RETURN SWIT:: MOV @(R5)+,R0 ; GET HIST # SWC:: CMP R0,#0 ; HIST # TOO BIG? ; LIMIT # OR HISTS BHI 1$ ; YES ASL R0 ; NOW IS BYTE ADDRESS ASL R0 ; NOW IS TABLE ENTRY (DOUBLE WORD) ADD HI$BUF,R0 .ifdf $MMGT TST 2(R0) ; TEST FOR EXTENDED HIST BLT 2$ .endc MOV (R0),R0 ; NOW HAVE PARAM TABLE CLC ; NO ERRORS RETURN 1$: MOV #CRAP1,R0 ; HISTOGRAM # 0 SEC RETURN .ifdf $MMGT 2$: MOV R1,-(SP) MOV R2,-(SP) ; SAVE WORKING REGISTERS MOV 2(R0),R1 ; HIST BLOCK SIZE MOV (R0),R0 ; HIST OFFSET ADDRESS SWCE: BIC #160000,R1 ; CLEAR EXTRA STATUS BITS ADD R0,R1 ; R1 = TOP ADDRESS + 1 BCS 15$ ; Size is too big CMP R0,HMAPB ; IS IT BELOW WINDOW? BLO 10$ ; YES CMP R1,HMAPT ; IS IT ABOVE WINDOW BHI 10$ ; YES, MUST REMAP 3$: SUB HMAPB,R0 ; R0 = OFFSET IN 4K BLOCK BIS #160000,R0 ; 4K BLOCK ADDRESS ADDED MOV (SP)+,R2 MOV (SP)+,R1 ; RESTORE CLC RETURN ; NOW NORMAL RETURN 10$: MOV R0,R2 ; OFFSET IN BYTES BIC #77,R2 ; NOW OFFSET IN 32 WORD INCREMENTS ASH #-6,R2 ; NOW IN OFFSET IN 32 WORD BLOCKS BIC #176000,R2 ; STRIP OFF EXTRA BITS MOV R2,NOFF CLR NLEN ; DEFAULT SIZE MAP$S #HI$WDW BCS 15$ ASH #6,R2 MOV R2,HMAPB MOV R2,HMAPT MOV NLEN,R2 ASH #6,R2 ; WINDOW SIZE IN BYTES ADD R2,HMAPT ; ADD ON BOTTON ADDRESS CMP R1,HMAPT ; IS WINDOW TOO SMALL BLOS 3$ ; No, it is OK 15$: MOVB $DSW,ISTAT3 MOV (SP)+,R2 MOV (SP)+,R1 SEC RETURN SWC1:: MOV R1,-(SP) MOV R2,-(SP) BR SWCE .endc .END