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 / fill.mac < prev    next >
Text File  |  1990-04-02  |  2KB  |  81 lines

  1.     .ENABL    LC
  2.     .TITLE    FILL
  3.     .IDENT    /MTREK/
  4. ;    FORTRAN callable routine to do buffered i/o.
  5. ;
  6. ;    Strings are sized and copied to the buffer. If a new string
  7. ;    will not fit in the space left in the buffer, then the
  8. ;    subroutine flush is called to output the buffer and make
  9. ;    room for the new string.
  10. ;
  11. ;    The entry flush is used to output all of the characters
  12. ;    in the buffer.
  13. ;
  14. ;    Calling sequence:
  15. ;        CALL FILL(STRING[,ICNT])
  16. ;    STRING    String of text to output (an array or quoted string)
  17. ;    ICNT    Optional character count
  18. ;
  19. ;    Calling sequence:
  20. ;        CALL FLUSH
  21.     .MCALL    DIR$,QIOW$
  22.     .GLOBL    FILL,FLUSH,FINIT
  23.  
  24.     LUN = 1            ; LUN FOR QIOS
  25.     MAXSIZ=200        ; SIZE OF BUFFER FOR OUTPUT
  26.     COUNT=QIOW+Q.IOPL+2    ; ADDRESS OF CHARACTER COUNT
  27.  
  28. FILL:    TSTB    @2(R5)        ; SEE IF STRING IS ZERO LENGTH
  29.     BEQ    60$        ; BRANCH IF ZERO LENGTH
  30.     MOV    2(R5),R0    ; ADDRESS OF STRING IN R0
  31.     CMPB    #2,(R5)        ; CHARACTER COUNT INPUT?
  32.     BNE    20$        ; BRANCH IF NOT
  33.     MOV    @4(R5),R1    ; COUNT IN R1
  34.     BLE    60$        ; EXIT IF COUNT IS LE ZERO
  35.     BR    30$        ; NOW GO SEE IF ENOUGH SPACE LEFT
  36. 20$:    MOV    R0,R1        ; COPY ADDRESS TO R1
  37. 10$:    TSTB    (R1)+        ; LOOKING FOR ZERO BYTE
  38.     BNE    10$        ; LOOP UNTIL DONE
  39.     DEC    R1        ; THEN BACK UP ONE
  40.     SUB    R0,R1        ; AND SUBTRACT FOR THE COUNT
  41. 30$:    MOV    #MAXSIZ,R2    ; PUT MAXIMUN NUMBER IN R2
  42.     SUB    COUNT,R2    ; SUBTRACT FOR FREE SPACE
  43.     CMP    R2,R1        ; IS THERE ENOUGH ROOM LEFT?
  44.     BGE    40$        ; BRANCH IF ROOM LEFT
  45.     CALL    FLUSH        ; OUTPUT THE BUFFER
  46. 40$:    MOV    #BASE,R2    ; ADDRESS OF THE BUFFER
  47.     ADD    COUNT,R2    ; CALCULATE TOP OF BUFFER
  48.     ADD    R1,COUNT    ; UPDATE COUNT
  49. 50$:    MOVB    (R0)+,(R2)+    ; COPY CHARS
  50.     SOB    R1,50$        ; LOOP UNTIL DONE
  51. 60$:    RETURN            ; AND RETURN TO MAIN
  52. ;
  53. ;    Entry for flush buffer
  54. ;
  55. FLUSH:    TST    COUNT        ; DO WE HAVE ANY CHARS TO OUTPUT?
  56.     BLE    70$        ; BRANCH IF NOT
  57.     DIR$    #QIOW        ; OUTPUT THE ENTIRE BUFFER
  58.     CLR    COUNT        ; CLEAR THE COUNT
  59. 70$:    RETURN            ; AND RETURN TO CALLER
  60. ;
  61. ;    Here is the entry for initilization
  62. ;
  63. FINIT:    CLR    COUNT        ; ZERO THE COUNT
  64.     RETURN            ; AND RETURN
  65. ;
  66. ;    Here is the qio
  67. ;
  68. QIOW:    QIOW$    IO.WLB!TF.WAL,LUN,1,,,,<BASE,0>
  69. ;
  70. ;    Here is the buffer
  71. ;
  72.     .NLIST    BIN
  73. BASE:    .BLKB    MAXSIZ
  74.     .EVEN
  75.     .END
  76.