; 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