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 >
Wrap
Text File
|
1990-04-02
|
2KB
|
81 lines
.ENABL LC
.TITLE FILL
.IDENT /MTREK/
;
; FORTRAN callable routine to do buffered i/o.
;
; Strings are sized and copied to the buffer. If a new string
; will not fit in the space left in the buffer, then the
; subroutine flush is called to output the buffer and make
; room for the new string.
;
; The entry flush is used to output all of the characters
; in the buffer.
;
; Calling sequence:
;
; CALL FILL(STRING[,ICNT])
;
; STRING String of text to output (an array or quoted string)
; ICNT Optional character count
;
; Calling sequence:
;
; CALL FLUSH
;
.MCALL DIR$,QIOW$
.GLOBL FILL,FLUSH,FINIT
LUN = 1 ; LUN FOR QIOS
MAXSIZ=200 ; SIZE OF BUFFER FOR OUTPUT
COUNT=QIOW+Q.IOPL+2 ; ADDRESS OF CHARACTER COUNT
FILL: TSTB @2(R5) ; SEE IF STRING IS ZERO LENGTH
BEQ 60$ ; BRANCH IF ZERO LENGTH
MOV 2(R5),R0 ; ADDRESS OF STRING IN R0
CMPB #2,(R5) ; CHARACTER COUNT INPUT?
BNE 20$ ; BRANCH IF NOT
MOV @4(R5),R1 ; COUNT IN R1
BLE 60$ ; EXIT IF COUNT IS LE ZERO
BR 30$ ; NOW GO SEE IF ENOUGH SPACE LEFT
20$: MOV R0,R1 ; COPY ADDRESS TO R1
10$: TSTB (R1)+ ; LOOKING FOR ZERO BYTE
BNE 10$ ; LOOP UNTIL DONE
DEC R1 ; THEN BACK UP ONE
SUB R0,R1 ; AND SUBTRACT FOR THE COUNT
30$: MOV #MAXSIZ,R2 ; PUT MAXIMUN NUMBER IN R2
SUB COUNT,R2 ; SUBTRACT FOR FREE SPACE
CMP R2,R1 ; IS THERE ENOUGH ROOM LEFT?
BGE 40$ ; BRANCH IF ROOM LEFT
CALL FLUSH ; OUTPUT THE BUFFER
40$: MOV #BASE,R2 ; ADDRESS OF THE BUFFER
ADD COUNT,R2 ; CALCULATE TOP OF BUFFER
ADD R1,COUNT ; UPDATE COUNT
50$: MOVB (R0)+,(R2)+ ; COPY CHARS
SOB R1,50$ ; LOOP UNTIL DONE
60$: RETURN ; AND RETURN TO MAIN
;
; Entry for flush buffer
;
FLUSH: TST COUNT ; DO WE HAVE ANY CHARS TO OUTPUT?
BLE 70$ ; BRANCH IF NOT
DIR$ #QIOW ; OUTPUT THE ENTIRE BUFFER
CLR COUNT ; CLEAR THE COUNT
70$: RETURN ; AND RETURN TO CALLER
;
; Here is the entry for initilization
;
FINIT: CLR COUNT ; ZERO THE COUNT
RETURN ; AND RETURN
;
; Here is the qio
;
QIOW: QIOW$ IO.WLB!TF.WAL,LUN,1,,,,<BASE,0>
;
; Here is the buffer
;
.NLIST BIN
BASE: .BLKB MAXSIZ
.EVEN
.END