home *** CD-ROM | disk | FTP | other *** search
-
- ; FFOR.ASM - Displays the FFOR text file, describing old files - 12/10/85
- ;
- ; This program has been copyrighted (c) by Irvin M. Hoff
- ;
- ; FOR.ASM
- ; by
- ; Irvin M. Hoff
- ; (17 July 1985)
- ;
- ASEG ; For M80 and RMAC, ignore if using MAC
- ;
- ;
- ; This program displays the FFOR text file, showing the description of
- ; recently uploaded files. It should go on A0: area, giving full secur-
- ; ity, and allowing it to be called from any drive/user area. ^S pauses
- ; and the following characters will terminate at the end of the current
- ; line:
- ;
- ; ^C C c ^K K k ^X X x
- ;
- ; It can also show the entire description of any file area that contains
- ; a string of characters typed after the FFOR name, in a similar (but
- ; more simple) manner to FIND52, etc. Example:
- ;
- ; A>FFOR ? (displays a help guide)
- ; A>FFOR IBM (types all files with IBM somewhere)
- ; A>FFOR .A?M (accepts ? for a wildcard)
- ;
- ;-----------------------------------------------------------------------
- ;
- ; 12/10/85 Rewritten (slightly) for FFOR - Irv Hoff
- ; 08/20/85 Redated for KMD04 - Irv Hoff
- ; 07/17/85 Initial version - Irv Hoff
- ;
- ;-----------------------------------------------------------------------
- ;
- ; User choices
- ;
- DRIVE EQU 'A' ; FFOR text file location in your system
- USER EQU 5 ; FFOR text file location in your system
- ;
- ;
- ; Equates
- ;
- CR EQU 0DH ; Carriage return
- LF EQU 0AH ; Line feed
- EOF EQU 1AH ; End of file character
- EOT EQU 04H ; End of transmission
- ETX EQU 03H ; End of text
- ;
- ;
- ORG 0100H
- ;
- ;
- JMP START
- ;
- ;
- STDRIV: DB DRIVE ; Location of FFOR text file
- STUSER: DB USER ; Location of FFOR text file
- ;
- ;
- ;=======================================================================
- ;
- ; PROGRAM STARTS HERE
- ;
- ;=======================================================================
- ;
- ; Save stack, print sign-on, look for file specification
- ;
- START: LXI H,0
- DAD SP ; Get 'CCP' stack
- SHLD STACK ; Save it for exit
- LXI SP,STACK ; Set stack pointer
- ;
- LDA 0004H ; Get current drive/user
- STA DRUSER ; Store
- ;
- ;
- ; Set drive/user to the FFOR text file area listed above
- ;
- LDA STUSER ; Set user to FFOR text file area
- MOV E,A
- MVI C,SETUSR
- CALL BDOS
- LDA STDRIV ; Set drive to FFOR text file area
- SUI 41H
- MOV E,A
- MVI C,SELDSK
- CALL BDOS
- ;
- ;
- ; Open source file
- ;
- LXI D,FILE
- MVI C,OPEN
- CALL BDOS
- INR A ; Check for no open
- JZ NONE ; No file, exit
- ;
- CALL ILPRT
- DB CR,LF
- DB 'FFOR - copyright 1985 by Irvin M. Hoff - 12/10/85'
- DB CR,LF,'[type ^S to pause, ^C, ^X or ^K to abort, ? for '
- DB 'help]',CR,LF
- DB 'wait a moment...'
- DB 0
- ;
- LDA TBUF ; Any search string requested?
- ORA A
- STA SHOWAL ; If no strings to find, show everything
- JNZ CHECK
- CALL ILPRT ; Will overwrite "wait" message
- DB CR,' ',CR,LF,0
- JMP READLP ; If no strings, exit
- ;
- ;
- ; Want the help guide?
- ;
- CHECK: LDA TBUF+2
- CPI '?' ; First chararter typed a '?' for help?
- JNZ LOOP ; If not, continue
- LDA TBUF+3 ; Check next character after '?'
- ORA A ; If a zero, they want some help
- JZ HELP
- ;
- ;
- ; Store the search string in STRING
- ;
- LOOP: LXI H,TBUF
- MOV B,M ; Get number of characters in string
- LXI D,STRING ; Get and store the requested string(s)
- INX H
- ;
- LOOP1: INX H
- MOV A,M
- STAX D
- INX D
- DCR B
- JNZ LOOP1
- ;
- ;
- ; Address the main buffer, now
- ;
- LXI D,BUFFER ; Put in buffer
- ;
- ;
- ; Read record from source file
- ;
- READLP: PUSH D ; Save the line address
- MVI C,SETDMA
- LXI D,TBUF
- CALL BDOS
- ;
- MVI C,READ
- LXI D,FILE
- CALL BDOS
- ;
- POP D
- ORA A ; Read ok?
- JNZ RERROR ; If not, display an error
- ;
- LXI H,TBUF ; Read buffer address
- ;
- WRDLOP: LDA LFEED ; Last character a line feed?
- ORA A
- JZ WRDL1 ; If not, keep going
- ;
- XRA A
- STA LFEED ; Clear the flag
- MOV A,M
- ANI 7FH ; Remove any parity
- CPI '-' ; Is this a separator line?
- JNZ WRDL1 ; If not, keep going
- MVI A,03H ; If yes, store an "end of text" char.
- STAX D
- JMP COMPAR ; Handle the string
- ;
- WRDL1: MOV A,M ; Get byte from read buffer
- ANI 7FH ; Strip parity bit
- CPI 7FH ; DEL (rubout) ?
- JZ NEXT ; Yes, ignore it
- CPI EOF ; End of file marker ?
- JZ TDONE ; Transfer done, close, exit
- ;
- MOV B,A ; Store the character temporarily
- LDA SHOWAL ; Going to show everything?
- ORA A
- MOV A,B ; Get the character back
- JNZ WRDL2
- CALL TYPE
- JMP WRDL3
- ;
- ;
- ; Store the character in the buffer
- ;
- WRDL2: STAX D ; Store the character in the buffer
- INX D ; Next buffer position
- ;
- WRDL3: CPI LF ; See if finished with this line
- JNZ NEXT ; If not get next character
- LDA SHOWAL
- STA LFEED ; Show we just had a line feed character
- CALL ABORT ; Ready to quit?
- ;
- NEXT: INR L ; Done with sector?
- JZ READLP ; If yes get another sector
- JMP WRDLOP ; No, get another byte
- ;.....
- ;
- ;
- ;=======================================================================
- ;
- ; SUBROUTINES
- ;
- ;=======================================================================
- ;
- ;
- ; Aborts the display when requested, but only at end of line
- ;
- ABORT: PUSH H ; Save the TBUF address
- PUSH D
- MVI C,CONST ; Check to see if key pressed
- CALL BDOS
- ORA A
- JZ ABORT3 ; If no key pressed, then continue
- MVI C,RDCON ; If key pressed, then check for abort
- ANI 5FH ; Remove parity, insure upper-case
- CALL BDOS
- CPI 'S'-40H
- JNZ ABORT1
- MVI C,RDCON
- CALL BDOS
- ANI 5FH
- ;
- ABORT1: CPI 'C'-40H ; Is it CTL-C?
- JZ ABORT2
- CPI 'K'-40H ; Is it CTL-K?
- JZ ABORT2 ; If no, then continue
- CPI 'X'-40H ; Is it CTL-X?
- JZ ABORT2
- ANI 5FH ; Cnvert to upper-case
- CPI 'C'
- JZ ABORT2
- CPI 'K'
- JZ ABORT2
- CPI 'X'
- JNZ ABORT3
- ;
- ABORT2: CALL EXIT ; If yes, then print abort message
- DB CR,LF,'++ ABORTED ++','$'
- ;
- ABORT3: POP D
- POP H
- RET
- ;.....
- ;
- ;
- ; Print message then exit to CP/M
- ;
- EXIT: POP D ; Get message address
- MVI C,PRINT ; Print message
- CALL BDOS
- ;
- EXIT1: CALL ILPRT ; Print CRLF before quitting
- DB CR,LF,0
- LDA DRUSER ; Get original drive/user area back
- RAR
- RAR
- RAR
- RAR
- ANI 0FH ; Just look at the user area
- MOV E,A
- MVI C,SETUSR ; Restore original user area
- CALL BDOS
- LDA DRUSER ; Get the original drive/user back
- ANI 0FH ; Just look at the drive for now
- MOV E,A
- MVI C,SELDSK ; Restore original drive
- CALL BDOS
- ;
- LHLD STACK
- XRA A
- SPHL
- RET
- ;.....
- ;
- ;
- ; Help guide if no search string is included
- ;
- HELP: CALL EXIT
- DB CR,' Examples of how to use:',CR,LF
- DB CR,LF,' B>FFOR MOD'
- DB CR,LF,' B>FFOR MOD|BYE'
- DB CR,LF,' B>FFOR M7'
- DB CR,LF,' B>FFOR \M7'
- DB CR,LF,' B>FFOR SPHL'
- DB CR,LF,' B>FFOR .A?M'
- DB CR,LF,CR,LF,' If no string is included, all the file '
- DB 'is shown. A ''|'' allows',CR,LF,' numerous '
- DB 'strings to be used at the same time. ''?'' is used '
- DB 'for',CR,LF,' "any character at this position". A '
- DB '''\'' fakes a line feed and',CR,LF,' looks only at '
- DB 'the start of the filename line.',CR,LF,'$'
- ;.....
- ;
- ;
- ; Inline print routine - prints string pointed to by stack until a zero
- ; is found. Returns to caller at the next address after the zero ter-
- ; minator.
- ;
- ILPRT: XTHL ; Save HL, get message address
- ;
- ILPLP: MOV A,M ; Get chararacter
- CALL TYPE ; Show on CRT
- INX H ; Next character location
- MOV A,M ; Get the character
- ORA A ; If zero, all done
- JNZ ILPLP ; Else keep going
- XTHL ; Restore HL, ret address
- RET ; Return past the end of the message
- ;.....
- ;
- ;
- NONE: CALL EXIT
- DB CR,LF,'++ No current FFOR text file available ++','$'
- ;.....
- ;
- ;
- ; Scan for the string
- ;
- COMPAR: PUSH H ; Save the TBUF address
- LXI H,STRING
- ;
- ORLINE: SHLD STRPTR
- LXI H,BUFFER
- ;
- NXTSTR: XCHG ; Buffer location into DE for now
- LHLD STRPTR
- XCHG ; DE=string ponter, HL=buffer address
- PUSH H ; Save current buffer position
- ;
- ;
- ; Replace '\' with a line feed character
- ;
- CLOOP: LDAX D ; Get character from the string
- CPI '\'
- JNZ $+5
- MVI A,LF ; Call it a line feed
- ;
- ;
- ; Compare the string with characters in the buffer
- ;
- INX D
- ORA A ; End of string?
- JZ MATCHED
- ;
- CPI '|'
- JZ MATCHED ; First part
- ;
- MOV B,A ; Store the string character for now
- MOV A,M ; Get the buffer character
- CPI 'a' ; Test for lower case
- JC NOTLWR
- CPI 'z'+1
- JNC NOTLWR
- ANI 5FH
- ;
- NOTLWR: MOV C,A ; Store temporarily
- INX H
- MOV A,B ; Get the string character back again
- CPI '?' ; If wild card, accept any character
- JZ CLOOP ; Match so far, keep going
- CMP C ; String char. match buffer char?
- JZ CLOOP ; Matched, so keep going
- ;
- ;
- ; Not equal
- ;
- POP H ; Restore the buffer address
- INX H ; Next buffer position
- MVI B,0 ; Zero out temporary "end of file" flag
- MOV A,M ; Get the character
- CPI ETX ; At end of buffer?
- JZ NOTEQL ; If yes, exit
- ;
- CPI EOT
- JNZ NXTSTR ; If not, keep going
- INR B
- ;
- NOTEQL: LHLD STRPTR ; Reload the string pointer
- ;
- ;
- ; If an 'OR' (|) is in the line, scan for it
- ;
- FINDOR: MOV A,M ; Get the character from the string
- INX H ; Next position in string
- CPI '|' ; Divisor between strings
- JZ ORLINE ; Was a divisor, so check next string
- ORA A ; End of string?
- JNZ FINDOR ; If neither, keep checking
- ;
- ;
- ; Start the buffer over again
- ;
- MOV A,B ; Get our temporary "all done" flag
- ORA A
- JNZ TDONE1 ; If not zero, all finished
- LXI D,BUFFER+1 ; Keep the one '-' from very first line
- POP H ; Restore the TBUF address
- JMP NEXT ; Get the next character and continue
- ;
- ;
- ; Now print the line itself
- ;
- MATCHED:POP H ; Restore the stack from inner loop
- LDA FIRSTM
- ORA A
- JNZ MATCH0
- INR A
- STA FIRSTM
- CALL ILPRT
- DB CR,' ',CR,LF,0
- ;
- MATCH0: LXI H,BUFFER ; Start at beginning of buffer
- ;
- MATCH1: MOV A,M ; Get the character
- CPI ETX ; End of Text?
- JZ MATCH2 ; If yes, start next group
- CPI EOT ; End of transmission?
- JZ TDONE1 ; If yes, all finished now
- CALL TYPE ; Show on CRT
- INX H ; Next character in buffer
- JMP MATCH1
- ;
- MATCH2: POP H ; Restore the TBUF address
- LXI D,BUFFER+1 ; Keep the original '-' to balance line
- JMP NEXT ; Get the next group
- ;.....
- ;
- ;
- RERROR: CPI 1 ; File finished?
- JZ TDONE ; Exit, then
- CALL EXIT
- DB '++ SOURCE FILE READ ERROR ++$'
- ;.....
- ;
- ;
- ; Transfer is done - close destination file
- ;
- TDONE: LDA SHOWAL ; Showing all text?
- ORA A
- JZ TDONE1 ; If yes, exit
- MVI A,EOT ; Store ad "end of transmission" char.
- STAX D
- JMP COMPAR ; Make a final comparison
- ;
- TDONE1: MVI C,CLOSE
- LXI D,FILE
- CALL BDOS
- CALL EXIT
- DB CR,'----'
- DB CR,LF,'[End of listing]','$'
- JMP EXIT1
- ;.....
- ;
- ;
- ; Send character in A register to console
- ;
- TYPE: PUSH B
- PUSH D
- PUSH H
- PUSH PSW
- MOV E,A ; Character to 'E' for CP/M
- MVI C,WRCON ; Write to console
- CALL BDOS
- POP PSW
- POP H
- POP D
- POP B
- RET
- ;.....
- ;
- ;
- ;***********************************************************************
- ;
- ; Data area
- ;
- ;***********************************************************************
- ;
- ;
- FILE: DB 0,'FFOR '
- DB 0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0
- DB 0,0,0,0,0,0,0
- ;
- DRUSER: DB 0 ; Store original drive/user area
- FIRSTM: DB 0 ; To clear "wait a momemnt....."
- LFEED: DB 0 ; Checks the character after a line feed
- SHOWAL: DB 0 ; Flag to show all text if no strings
- STRPTR: DW 0 ; Pointer for "|" scan
- ;
- STRING: DS 128 ; What to search for
- DS 40 ; Room for 20-level stack
- ;
- ;
- ; Set write buffer to even page boundry
- ;
- ORG ($+255)/256*256
- ;
- BUFFER EQU $ ; Write buffer starts here
- STACK EQU BUFFER-2
- ;
- ;
- ; BDOS equates
- ;
- RDCON EQU 1 ; Read console
- WRCON EQU 2 ; Write to console
- PRINT EQU 9 ; Print string
- CONST EQU 11 ; Get console status
- SELDSK EQU 14 ; Select requested disk drive
- OPEN EQU 15 ; Open a file
- CLOSE EQU 16 ; Close a file
- READ EQU 20 ; Read sequential file
- SETDMA EQU 26 ; Set dma address
- SETUSR EQU 32 ; Set requested user area
- ;
- BDOS EQU 0005H
- TBUF EQU 0080H
- ;.....
- ;
- ;
- END