;
; NAME: SVLIN.M68
;
OBJNAM .SBR
;
; FUNCTION: This subroutine is used to read data from a SuperVue file
; one line at a time. Since SuperVue does not terminate its data line
; with a CR+LF pair, SVLIN reads the data until it finds a CR then
; returns the data in the BUFFER string
; If LENGTH returned = 0 then and end of file is reached
; If your Supervue file contains the header information used in SuperVUE
; it can be found by checking for CHR$(1) which is the begining
; of the header information and CHR$(1) which is the terminating
; character for the header information on the first line input
;
; CALLING SEQUENCE: XCALL SVLIN,OPTION,AREA{,BUFFER|NAME{,LENGTH}}
; where
; Name Type Use
; OPTION Float 1=open
; 2=read
; 3=close
; AREA X,616 DDB and buffer
; BUFFER Any Returned data (READ call) make sure it is large
; enough to accept a whole line of data
; NAME String Filename (OPEN call)
; LENGTH Float Length of returned data (READ call)
;
; AUTHOR: James A. Jarboe of this version GR/AM
; VERY VERY LARGELY taken from FILEIN.M68 by Tom Dahlquist
; donated to AMUS
;
; EDIT HISTORY:
; When Who What
; Tom dahlquist wrote it as FILEIN.M68
; 11/15/85 JAJ modified for Supervue file input
;
;MAP1 OPTION,F,6 ! 1=open 2=read 3=close
;MAP1 AREA,X,616 ! DDB area do not change
;MAP1 BUFFER,S,200 ! make sure size is compatable with line length of
; ! file read
;MAP1 FILE$,S,24,"TEST.T" ! filename
;MAP1 LENGTH,F ! length of line returned here
;
;! open file
; OPTION=1
; ? "Opening ";FILE$
; XCALL SVLIN,OPTION,AREA,FILE$
; OPTION=2
;ONE:
;
; ? "Reading ";FILE$
; CALL IN ! get sv line
; IF BUFFER[1,1]#CHR$(1) &
; THEN GOTO FIRST'LINE ! check for sv header info
;
;HEADTST:
; HEAD=INSTR(2,BUFFER,CHR$(1)) ! check for end of header info
; BUFFER=BUFFER[HEAD+1,LENGTH] ! take out header info
; LENGTH=LENGTH-HEAD ! make LENGTH = -header data
;FIRST'LINE:
; GOTO PRINTIT ! print it out to screen or file
;
;PROCESS:
; CALL IN ! get next line
; IF LENGTH=0 THEN GOTO LOSE ! if end of file then close it
;PRINTIT:
; ? BUFFER; !print buffer
; ? CHR$(10); !print a line feed
; GOTO PROCESS
;
;!!!!!!!!!!!!
;! SUBROUTINES
;!!!!!!!!!!!!
;
;IN:
; BUFFER="" ! clear buffer
; OPTION=2 ! read option
; XCALL SVLIN,OPTION,AREA,BUFFER,LENGTH
; RETURN
;LOSE:
; FILE$="TEST.T"
; OPTION=3 ! close option
; ? "CLOSING ";FILE$
; XCALL SVLIN,OPTION,AREA,FILE$
; END
SVLIN: PHDR -1,0,PH$REU!PH$REE
CMPW @A3,#3 ; must be at least 3 args...
BLO RETURN ; back if not...
MOVW TYPE1(A3),D6 ; get type of first...
ANDW #7,D6 ; must be float...
CMPW D6,#4 ; back if not...
BNE RETURN
CMP SIZE2(A3),#616. ; right size?
BNE RETURN ; back if not.
MOV ADDR1(A3),A0 ; get option...
FFTOL @A0,D0 ; D1=option...
MOV ADDR2(A3),A0 ; A0->DDB...
CMPW D0,#1 ; OPEN...
BEQ OPEN
CMPW D0,#2 ; READ...
BEQ READ
CMPW D0,#3 ; CLOSE
JEQ CLOSE
RETURN: RTN
;
; OPEN--clear the DDB, initialize it, open file.
;
OPEN: CLEAR @A0,D.DDB ; clear it...
LEA A6,D.DDB(A0) ; A6->I/O buffer...
MOV A6,D.BUF(A0) ; put into DDB...
MOVB #D$INI,D.FLG(A0) ; set INITed...
MOV ADDR3(A3),A2 ; A2->filename...
FSPEC @A0,T ; put filename into DDB, and
OPENI @A0 ; open it.
RTN
;
; READ--move bytes to buffer until a CR, or file is empty.
;
READ: CMPW @A3,#4 ; must have fourth arg...
BLO RETURN
MOVW TYPE4(A3),D6 ; check type of it...
ANDW #7,D6
CMPW D6,#4
BNE RETURN
MOV ADDR3(A3),A1 ; A1->buffer...
MOV SIZE3(A3),D0 ; D0=length of buffer...
DEC D0 ; minus 1 for DBF...
CLR D2 ; D2 used as counter...
LOOP: FILINB @A0 ; ask for next byte...
TST D.SIZ(A0) ; anything left?
BEQ EOF ; br if not...
MOVB D1,(A1)+ ; move it in...
ADDW #1,D2 ; increment counter...
CMPB D1,#13. ; is it end of a SuperVUE line?
BEQ EOF ; well then lets get ready to go
DBF D0,LOOP ; and loop.
BR SETLTH
EOF: CLRB (A1)+ ; clear rest of buffer...
DBF D0,EOF ; was out
SETLTH: MOV ADDR4(A3),A1 ; A1->length variable...
FLTOF D2,@A1 ; convert length...
RTN
;
; CLOSE--close the file.
;
CLOSE: CLOSE @A0
RTN