.TITLE GETCHR .MCALL QIO$,ALUN$C,ASTX$S,QIOW$C,DIR$,DSAR$S,ENAR$S .MCALL CLEF$S,SETF$S .ENABL LC ;+ ; ; Module for MTREK game for running on an RSX system. This module ; attaches lun 1 for unsolicited input AST's. ; ;- .PSECT DATA,RW,D RINGBF: .BLKB 25. ENDBUF =. .BYTE 0 .EVEN INPNT: .WORD RINGBF OUTPNT: .WORD RINGBF ACHAR: .WORD 0 BELL: .ASCIZ <7> BAD: QIO$ IO.WVB,1,,,,, .EVEN .PSECT GETCHR:: ALUN$C 1,TI,0 ;ASSIGN LUN 1 FOR INPUT QIOW$C IO.ATA,1,1,,,, ;ATTACH TERM UNSOLICITED INP BCC GOON ;NO ERROR IOT GOON: RETURN ;GO HOME ;+ ; ; GOTCHR is the AST service routine for unsolicited characters. ; Working with an input ring-buffer, the character will be inserted ; into the ring if space permits, or simply ignored if no space is ; available. A ^F (cntrl-F) will flush the buffer of any input. ; ;- .PSECT ROCODE,RO,I GOTCHR::MOV (SP)+,ACHAR ;GET CHARACTER FROM STACK MOV R0,-(SP) ;SAVE R0 CMPB ACHAR,#6 ;IS THIS A CNTRL-F? BNE 10$ ;NO, HANDLE NORMALLY MOV INPNT,OUTPNT ;FLUSH BUFFER BY EQUATING IN/OUT POINTERS JMP 40$ ;AND EXIT WITHOUT ANY FURTHER PROCESSING 10$: SETF$S #15 ;SET E.F. 15, SIGNIFYING WE GOT A CHARACTER CMPB ACHAR,#15 ;IS THIS A ? BNE 11$ ;NO SETF$S #16 ;SET E.F. 16, SIGNIFYING WE GOT A 11$: MOV INPNT,R0 ;GET ADDRESS OF WHERE CHARACTER GOES MOVB ACHAR,(R0) ;PUT CHARACTER INTO BUFFER INC INPNT ;INCREMENT INPUT POINTER CMP INPNT,#ENDBUF ;AT END OF BUFFER? BLOS 20$ ;NO MOV #RINGBF,INPNT ;RESET INPUT POINTER 20$: CMP INPNT,OUTPNT ;ARE INPUT/OUTPUT POINTERS SAME? BNE 40$ ;NO DIR$ #BAD ;OUTPUT A BELL (SIGNIFY OVERFLOW) 30$: DEC INPNT ;SET INPUT POINTER BACK AGAIN CMP INPNT,#RINGBF ;ARE WE BEFORE START OF BUFFER? BHIS 40$ ;NO, ALL IS OK MOV #ENDBUF,INPNT ;POINT US TO END OF BUFFER 40$: MOV (SP)+,R0 ;RESTORE R0 ASTX$S ;EXIT FROM AST ROUTINE ;+ ; ; CTRLC is the routine to handle a control-c. Right now it just ; causes the program to die a violent death. ; ;- CTRLC:: MOV (SP)+,ACHAR ;TRAP THE CONTROL-C BPT ;RIGHT NOW, JUST DIE VIOLENTLY (EASY-OUT) ;+ ; ; INCHR is a function to return a character from the input ; ring buffer to a FORTRAN program. If no character is ; available, a 0 is returned. The calling sequence is ; X = INCHR() ; X will contain the value of the character removed from the buffer. ; ; 11-MAR-83 D. O'REILLY ; ; Modified to convert upper to lowercase if 2 args and ; bit 0 of second arg is set ; ;- INCHR:: DSAR$S ;DISABLE AST RECOGNITION, SO WE DON'T GET ;INTERRUPTED WHILE DOING THIS CLEF$S #15 ;CLEAR E.F. 15, SAYING WE TOOK A CHARACTER OUT MOV R1,-(SP) ;SAVE R1 SINCE WE'LL BE USING IT CLRB @2(R5) ;CLEAR OUT ARG LIST CMP INPNT,OUTPNT ;ARE INPUT/OUTPUT POINTERS THE SAME? BEQ 20$ ;YES, SO THERE'S NOTHING TO GET MOV OUTPNT,R1 ;GET ADDRESS OF WHERE CHARACTER IS MOVB (R1),@2(R5) ;PUT CHARACTER INTO FORTRAN ARGUEMENT INC OUTPNT ;BUMP UP OUTPUT POINTER CMP OUTPNT,#ENDBUF ;PAST END OF BUFFER? BLE 10$ ;NO MOV #RINGBF,OUTPNT ;RESET TO BEGINNING OF BUFFER 10$: CMP #2,@R5 ;TWO ARGUEMENTS? BNE 20$ ;IF NE, NO BIT #1,@4(R5) ;IS BIT 1 SET (CONVERT TO UPPERCASE)? BEQ 20$ ;IF EQ, NO CMPB #'a,@2(R5) ;IS IT A LOWERCASE A? BHI 20$ ;IF GT, NOT LOWERCASE CMPB #'z,@2(R5) ;IS IT A LOWERCASE Z? BLO 20$ ;IF LT, NO BICB #40,@2(R5) ;ENSURE BYTE IS UPPERCASE 20$: MOV (SP)+,R1 ;RESTORE R1 ENAR$S ;RE-ENABLE AST RECOGNITION RETURN ;GO HOME .END