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 >
Text File  |  1990-04-02  |  3KB  |  122 lines

  1.     .ENABL    LC
  2.     .TITLE    RDAST
  3.     .IDENT    /MTREK/
  4. ;    This is a Fortran callable subroutine the uses
  5. ;    the IO.ATA feature of the QIO$ directive to
  6. ;    handle unsolicited input and store characters
  7. ;    in a common to allow a Fortran task access
  8. ;    the characters.
  9. ;
  10. ;    The AST routine buffers the characters until it
  11. ;    is time to issue them.
  12. ;
  13. ;    Some characters are "immediate mode" type and
  14. ;    must be issued right after receiving them.
  15. ;
  16. ;    Lower case characters are changed to upper case.
  17. ;
  18. ;    Event flag 25 is set when a line is complete.
  19. ;     Calling sequence:
  20. ;        CALL RDAST
  21.     .MCALL    DIR$,QIO$,ASTX$S,CMKT$,CLEF$,SETF$,DECL$
  22.     .GLOBL    RDAST
  23.  
  24.     LUN = 1            ; LUN FOR QIOS
  25.     FLAG = 25.        ; EVENT FLAG
  26. ;
  27. ;    Here is where we set up to do the character AST
  28. ;
  29. RDAST:    MOV    #TMP,POINT    ; ADDRESS OF TMP BUFFER
  30.     CLR    CNT        ; CLEAR THE COUNT
  31.     CLRB    CMD        ; RESET THE LOCATION
  32.     DIR$    #SCLR        ; MAKE SURE THE FLAG IS CLEAR
  33.     DIR$    #SAST        ; SET UP FOR UNSOLICITED READ
  34.     RETURN            ; GO BACK TO MAIN
  35. ;
  36. ;    Here is the entry point when we get a character
  37. ;
  38. AST:    MOVB    (SP)+,CHAR    ; GET THE CHAR
  39.     BEQ    END        ; SKIP IT IF IT'S NULL
  40.     CMPB    #177,CHAR    ; IS IT A DELETE?
  41.     BNE    20$        ; EQUAL IF DELETE
  42.     CMP    POINT,#TMP    ; ARE THERE ANY CHARS TO DELETE?
  43.     BLOS    END        ; BRANCH IF NO CHARS TO DELETE
  44.     DEC    POINT        ; DELETE THE CHAR
  45.     BR    END        ; EXIT UNTIL NEXT TIME
  46. 20$:    CMPB    #25,CHAR    ; IS IT A KILL LINE? (^U)
  47.     BNE    30$        ; EQUAL IF YES
  48.     MOV    #TMP,POINT    ; RESET POINTER
  49.     BR    END        ; EXIT UNTIL NEXT TIME
  50. ;
  51. ;    Here is where we convert lower case to upper
  52. ;
  53. 30$:    CMPB    CHAR,#141    ; SEE IF LOWER CASE
  54.     BLO    40$        ; LOWER IF NOT LOWER CASE
  55.     CMPB    CHAR,#172    ; SEE IF LOWER CASE
  56.     BHI    40$        ; HIGHER IF NOT LOWER CASE
  57.     BICB    #40,CHAR    ; MAKE IT A UPPER CASE
  58.  
  59. 40$:    MOVB    CHAR,@POINT    ; STORE IT
  60.     INC    POINT        ; INC POINTER
  61.     CMPB    #15,CHAR    ; END OF LINE?
  62.     BEQ    ISSUE        ; ZERO IF YES
  63.     CMP    POINT,#TMP+10    ; RUN OUT OF BUFFER YET?
  64.     BHI    ISSUE        ; ISSUE IF SO
  65.     CMPB    #32,CHAR    ; CONTROL Z?
  66.     BEQ    NOW        ; ISSUE THE NOW MODE COMMAND
  67.     CMPB    #'R,CHAR    ; RESET?
  68.     BEQ    NOW        ; ISSUE THE NOW MODE COMMAND
  69.     CMPB    #'X,CHAR    ; DETONATE?
  70.     BEQ    NOW        ; ISSUE THE NOW MODE COMMAND
  71.     CMPB    #'F,CHAR    ; FADE?
  72.     BEQ    NOW        ; ISSUE THE NOW MODE COMMAND
  73.     CMPB    #'A,CHAR    ; APPEAR?
  74.     BNE    END        ; ALL FOR NOW
  75. NOW:    MOVB    #15,@POINT    ; PUT A CR IN THE LINE
  76.     INC    POINT        ; AND INCREASE THE POINTER
  77. ISSUE:    MOV    R0,-(SP)    ; SAVE R0
  78.     MOV    R1,-(SP)    ; SAVE R1
  79.     MOV    R2,-(SP)    ; SAVE R2
  80.     MOV    POINT,R0    ; LOCATION OF LAST CHAR
  81.     SUB    #TMP,R0        ; SUB FOR COUNT
  82.     MOV    R0,CNT        ; STORE COUNT
  83.     MOV    #TMP,R1        ; ADDRESS OF TMP BUFFER
  84.     MOV    #CMD,R2        ; ADDRESS OF OUT BUFFER
  85. 50$:    MOVB    (R1)+,(R2)+    ; COPY A CHAR
  86.     SOB    R0,50$        ; LOOP UNTIL DONE
  87.     MOV    #TMP,POINT    ; RESET POINTER
  88.     DIR$    #SMAR        ; CANCEL THE MARK TIME
  89.     DIR$    #SSET        ; SET THE EVENT FLAG
  90.     DIR$    #SDEC        ; DECLARE AN EVENT
  91.     MOV    (SP)+,R2    ; RESTORE R2
  92.     MOV    (SP)+,R1    ; RESTORE R1
  93.     MOV    (SP)+,R0    ; RESTORE R0
  94. END:    ASTX$S            ; EXIT THE AST ROUTINE
  95. ;
  96. ;    Local variables
  97. ;
  98. POINT:    .WORD    0        ; STORAGE FOR POINTER ADDRESS
  99. TMP:    .BLKB    10        ; TMP BUFFER
  100. CHAR:    .BYTE    0        ; CHAR TMP STORAGE
  101.     .EVEN
  102. ;
  103. ;    Directives
  104. ;
  105. SAST:    QIO$    IO.ATA,LUN,1,,,,<AST>
  106. SMAR:    CMKT$            ; CANCEL MARK TIME
  107. SCLR:    CLEF$    FLAG        ; CLEAR FLAG 25
  108. SSET:    SETF$    FLAG        ; SET FLAG 25
  109. SDEC:    DECL$            ; DECLARE A SIG EVENT
  110. ;
  111. ;    Here is the psect for the common
  112. ;
  113.     .PSECT    COMMND,D,GBL,REL,OVR
  114. CNT:    .WORD    0        ; COUNT
  115. CMD:    .BLKB    10        ; COMMAND LINE STORAGE
  116.     .EVEN
  117.     .END
  118.