; SELSCN.M68 - SELECT SEQUENTIAL FILE RECORDS, OUTPUT TO SCREEN
; 03/05/87 Evan Oulashin, Portland Radio Supply
;
; Uploaded to AMUS 06/01/87
; This version adapted from original SEL.M68 which always writes
; to output file SELECT.OUT. Since it was required to do this
; from within a basic program, we created this version which outputs
; only to the screen.
;
; Usage: SELSCN Filename String - as in SEL ORDERS.TXT COMPLETE
; or use from Basic by using XCALL AMOS,"SELSCN filename string".
;
; Additional files required: (all on Network system)
; AAA.M68
; AMOS.M68
; MACLIB.M68
SEARCH AAA
SEARCH MACLIB
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
;
.OFINI ; define impure (variable) area
.OFDEF DCOUNT,2 ; count of lines displayed
.OFDEF EOFFLG,1 ; end of input file flag
.OFDEF MFLG,1 ; flags that a match (selection) was made
.OFDEF INBUF,200. ; buffers 'filename' input a line at a time
.OFDEF MCOUNT,4 ; number of matches (selections)
.OFDEF SPOINT,4 ; points at current 'search string' letter
.OFDEF INFIL,D.DDB ; input file ddb
.OFSIZ MEMSIZ
BUFPT = A1
SRCPT = A2
;
DEFINE SETINP
LEA BUFPT,INBUF(A5) ; reset input buffer pointer
DEC BUFPT ; subtract 1 since we pre-bump
ENDM ; prior to writing to @BUFPT.
;
DEFINE SETSRC ; reset search string pointer
MOV SPOINT(A5),SRCPT
ENDM
DEFINE SETSCN
MOVW #21.,DCOUNT(A5)
CRT #0
TYPECR Searching...
ENDM
;
START: PHDR -2,0,PH$REE!PH$REU ; program is reentrant/reusable
GETIMP MEMSIZ,A5 ; allocate impure area for variables
ONEKEY ; set to image mode
CALL OFIL ; open files
BYP ; bypass blanks in command buffer
MOV SRCPT,SPOINT(A5) ; save search string pointer
SETSCN
BEGIN: SETINP ; reset input buffer pointer
SETSRC: SETSRC ; reset search string pointer
RDLOOP: CALL RDBUF ; read next byte to buffer
TSTB EOFFLG(A5) ; eof?
JNE EOF ; yes...quit out
TSTB MFLG(A5) ; have we had a match yet?
BNE RDLOOP ; if so just get rest of line
UCS ; make uppercase if lc
CMPB D1,(SRCPT) ; does this char match?
BNE SETSRC ; nope - reset pointer & loop
BMPPT: INC SRCPT ; yup - bump to next char in srch
LIN
BNE RDLOOP ; nope...keep on going
SETB MFLG(A5) ; yup - set MFLG to show match
JMP RDLOOP ; and loop
RDBUF: FILINB INFIL(A5) ; next byte from file
TST INFIL+D.SIZ(A5) ; are we at eof?
BEQ SETEOF ; if so set the flag
INC BUFPT ; bump input buffer pointer
MOVB D1,@BUFPT ; put character there
CMPB D1,#15 ; CR?
BEQ WRTCHK ; if so, check and write or skip
RTN
SETEOF: SETB EOFFLG(A5) ; set eof flag
RTN
WRTCHK: FILINB INFIL(A5) ; get lf (clear it out of input file)
TSTB MFLG(A5) ; has there been a match yet?
BEQ SETEM ; nope, go reset pointers
SETINP ; yes - reset input buffer to write
INC BUFPT ; need one more since it was dec'ed
WRLOOP: MOVB (BUFPT)+,D1 ; get next char to write
TTY
CMPB D1,#15 ; end of line?
BNE WRLOOP ; keep writing if not
CRLF
INC MCOUNT(A5) ; keep track of number of matches
DECW DCOUNT(A5) ; screen full?
BEQ CALRET ; yup - get a cr from 'em
CMF: CLRB MFLG(A5) ; reset match flag
SETEM: SETINP ; reset input buffer
SETSRC ; reset search string buffer
CTRLC ABORT ; if ^C just bag it
RTN
CALRET: CALL PRSRET
; CMPB D1,#88.
; BEQ EOF
SETSCN
BR CMF
PRSRET: CRT #24.,#1.
TYPESP [Press RETURN to continue...]
KBD
CRT #24.,#1.
CRT #9.
RTN
EOF: CLOSE INFIL(A5) ; close the files
CLR D1 ; clear D1 to receive match count
MOV MCOUNT(A5),D1 ; move match count to D1
CRLF
TYPESP
TYPESP Displayed ; final message
DCVT 0,OT$TRM ; and convert it again
TYPESP ; a space
CMP D1,#1.
BNE PLURAL
TYPECR record.
BR ALLDON
PLURAL: TYPECR records.
ALLDON: CALL PRSRET
BYEBYE: MLTKEY ; set to normal mode
EXIT
OFIL: FSPEC INFIL(A5) ; open input file
INIT INFIL(A5) ; init the buffer
LOOKUP INFIL(A5) ; already exist?
JNE NOFILE ; no such file message
OPENI INFIL(A5) ; open file for input
RTN
COMAND: ASCII \TYPE SELECT.OUT/P\ ; the final command
BYTE 0 ; a terminator
EVEN
NOFILE: TYPECR No such file. ; bad news
BR BYEBYE
ABORT: CLOSE INFIL(A5) ; close the files
BR BYEBYE
END