home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.ee.lbl.gov
/
2014.05.ftp.ee.lbl.gov.tar
/
ftp.ee.lbl.gov
/
mtrek.shar.Z
/
mtrek.shar
/
rdast.mac
< prev
next >
Wrap
Text File
|
1990-04-02
|
3KB
|
122 lines
.ENABL LC
.TITLE RDAST
.IDENT /MTREK/
;
; This is a Fortran callable subroutine the uses
; the IO.ATA feature of the QIO$ directive to
; handle unsolicited input and store characters
; in a common to allow a Fortran task access
; the characters.
;
; The AST routine buffers the characters until it
; is time to issue them.
;
; Some characters are "immediate mode" type and
; must be issued right after receiving them.
;
; Lower case characters are changed to upper case.
;
; Event flag 25 is set when a line is complete.
;
; Calling sequence:
;
; CALL RDAST
;
.MCALL DIR$,QIO$,ASTX$S,CMKT$,CLEF$,SETF$,DECL$
.GLOBL RDAST
LUN = 1 ; LUN FOR QIOS
FLAG = 25. ; EVENT FLAG
;
; Here is where we set up to do the character AST
;
RDAST: MOV #TMP,POINT ; ADDRESS OF TMP BUFFER
CLR CNT ; CLEAR THE COUNT
CLRB CMD ; RESET THE LOCATION
DIR$ #SCLR ; MAKE SURE THE FLAG IS CLEAR
DIR$ #SAST ; SET UP FOR UNSOLICITED READ
RETURN ; GO BACK TO MAIN
;
; Here is the entry point when we get a character
;
AST: MOVB (SP)+,CHAR ; GET THE CHAR
BEQ END ; SKIP IT IF IT'S NULL
CMPB #177,CHAR ; IS IT A DELETE?
BNE 20$ ; EQUAL IF DELETE
CMP POINT,#TMP ; ARE THERE ANY CHARS TO DELETE?
BLOS END ; BRANCH IF NO CHARS TO DELETE
DEC POINT ; DELETE THE CHAR
BR END ; EXIT UNTIL NEXT TIME
20$: CMPB #25,CHAR ; IS IT A KILL LINE? (^U)
BNE 30$ ; EQUAL IF YES
MOV #TMP,POINT ; RESET POINTER
BR END ; EXIT UNTIL NEXT TIME
;
; Here is where we convert lower case to upper
;
30$: CMPB CHAR,#141 ; SEE IF LOWER CASE
BLO 40$ ; LOWER IF NOT LOWER CASE
CMPB CHAR,#172 ; SEE IF LOWER CASE
BHI 40$ ; HIGHER IF NOT LOWER CASE
BICB #40,CHAR ; MAKE IT A UPPER CASE
40$: MOVB CHAR,@POINT ; STORE IT
INC POINT ; INC POINTER
CMPB #15,CHAR ; END OF LINE?
BEQ ISSUE ; ZERO IF YES
CMP POINT,#TMP+10 ; RUN OUT OF BUFFER YET?
BHI ISSUE ; ISSUE IF SO
CMPB #32,CHAR ; CONTROL Z?
BEQ NOW ; ISSUE THE NOW MODE COMMAND
CMPB #'R,CHAR ; RESET?
BEQ NOW ; ISSUE THE NOW MODE COMMAND
CMPB #'X,CHAR ; DETONATE?
BEQ NOW ; ISSUE THE NOW MODE COMMAND
CMPB #'F,CHAR ; FADE?
BEQ NOW ; ISSUE THE NOW MODE COMMAND
CMPB #'A,CHAR ; APPEAR?
BNE END ; ALL FOR NOW
NOW: MOVB #15,@POINT ; PUT A CR IN THE LINE
INC POINT ; AND INCREASE THE POINTER
ISSUE: MOV R0,-(SP) ; SAVE R0
MOV R1,-(SP) ; SAVE R1
MOV R2,-(SP) ; SAVE R2
MOV POINT,R0 ; LOCATION OF LAST CHAR
SUB #TMP,R0 ; SUB FOR COUNT
MOV R0,CNT ; STORE COUNT
MOV #TMP,R1 ; ADDRESS OF TMP BUFFER
MOV #CMD,R2 ; ADDRESS OF OUT BUFFER
50$: MOVB (R1)+,(R2)+ ; COPY A CHAR
SOB R0,50$ ; LOOP UNTIL DONE
MOV #TMP,POINT ; RESET POINTER
DIR$ #SMAR ; CANCEL THE MARK TIME
DIR$ #SSET ; SET THE EVENT FLAG
DIR$ #SDEC ; DECLARE AN EVENT
MOV (SP)+,R2 ; RESTORE R2
MOV (SP)+,R1 ; RESTORE R1
MOV (SP)+,R0 ; RESTORE R0
END: ASTX$S ; EXIT THE AST ROUTINE
;
; Local variables
;
POINT: .WORD 0 ; STORAGE FOR POINTER ADDRESS
TMP: .BLKB 10 ; TMP BUFFER
CHAR: .BYTE 0 ; CHAR TMP STORAGE
.EVEN
;
; Directives
;
SAST: QIO$ IO.ATA,LUN,1,,,,<AST>
SMAR: CMKT$ ; CANCEL MARK TIME
SCLR: CLEF$ FLAG ; CLEAR FLAG 25
SSET: SETF$ FLAG ; SET FLAG 25
SDEC: DECL$ ; DECLARE A SIG EVENT
;
; Here is the psect for the common
;
.PSECT COMMND,D,GBL,REL,OVR
CNT: .WORD 0 ; COUNT
CMD: .BLKB 10 ; COMMAND LINE STORAGE
.EVEN
.END