; White House Software, Inc, Extended Directory Program
;
; TITLE EDIR
;
; THIS PROGRAM MAY BE FREELY DISTRIBUTED TO AMUS MEMBERS
; COURTESY OF WHITE HOUSE SOFTWARE, INC.
;
;Edit History:
;
; 8/19/86 1.0(0) - David Greene
; Written
;
; To use you must link with WLDSCN.OBJ which you may also get off the network
;
; LNKLIT EDIR,WLDSCN
;
VEDIT=0.
SEARCH SYS
SEARCH SYSSYM
SEARCH TRM
; Define Version Information
VMAJOR=1.
VMINOR=0.
VSUB=0.
VWHO=0.
;dedicated registers
WILD=A4 ; wildscan DDB index
;impure area used by EDIR
OFINI
OFDEF PBUF,22. ; print buffer
OFDEF DDB,D.DDB ; ddb used for comment line display
OFDEF LINBUF,512. ; file input buffer
OFDEF LSTDEV,2 ; last device of last file accessed
OFDEF LSTDRV,2 ; last drive of last file accessed
OFDEF LSTPPN,2 ; last PPN of last file accessed
OFDEF COUNT,2 ; count of number of files on screen
OFDEF BEGRTN,2 ; return routine flag
OFSIZ IMPSIZ
;These macros are used to call WLDSCN, the wildcard directory scanner
;These are defined in WLDSCN.UNV as well
DEFINE WINIT
IF NDF,W.INIT,EXTERN W.INIT
CALL W.INIT
ENDM
DEFINE WSPEC EXT
IF NDF,W.SPEC,EXTERN W.SPEC
CALL W.SPEC
IF B,EXT,ASCII /???/
IF NB,EXT,ASCII /'EXT/
BYTE 0
ENDM
DEFINE WSCAN
IF NDF,W.SCAN,EXTERN W.SCAN
CALL W.SCAN
ENDM
; define various ascii codes
TAB =11
LF =12
CR =15
SPACE =40
; macro to perform a CRT function
DEFINE ACRT ROW,COL
IF NB,COL,MOVW #<ROW_8.>!COL,D1
IF B,COL,MOVW #177400!ROW,D1
TCRT
ENDM
;start of code
; Initial set up area
START:
PHDR -1,PV$RPD!PV$RSM,PH$REE!PH$REU ; program header
GETIMP IMPSIZ,A5 ; allocate local memory
CLRW DDB(A5) ; not inited yet
INIT DDB(A5) ; now it is
WINIT ; initialize WLDSCN (sets up A4)
JOBIDX A1 ; A1 -> my jcb
MOV JOBTRM(A1),A1 ; A1 -> my terminal status word
ORW #T$IMI!T$ECS,@A1 ; set echo suppress and image mode
ACRT 29. ; turn off cursor
; Set up things for the program and wildcard scanner
CMDLIN:
BYP ; bypass leading cmd line spaces
WSPEC ; process wildcard file specification
JNE EXIT ; branch on invalid spec
CLRW LSTDEV(A5) ; no last device yet
CLRW LSTDRV(A5) ; no last drive yet
CLRW LSTPPN(A5) ; no last ppn yet
CLRW COUNT(A5) ; no files on screen yet
CLRW BEGRTN(A5) ; flag no return first time through
; Main proceesing loop
LOOP:
CTRLC EXIT ; branch on ^C
WSCAN ; get next file that matches spec
JNE EXIT
; Copy all pertinant info from wildcard scanner table
MOVW D.DEV(WILD),D.DEV+DDB(A5); copy spec
MOVW D.DRV(WILD),D.DRV+DDB(A5); from wildscan
MOVW D.PPN(WILD),D.PPN+DDB(A5); DDB @A4 to
MOV D.FIL(WILD),D.FIL+DDB(A5); our internal
MOVW D.EXT(WILD),D.EXT+DDB(A5); table
; Check to see if screen is full
CMMW COUNT(A5),#20. ; is the screen full ?
BLOS 10$ ; no - continue
5$:
CALL RETURN ; yes - wait for user
CALL HEADER ; redisplay header and clear screen
CLRW COUNT(A5) ; no file now
; Check to see if we entered a new PPn
10$:
CMMW LSTDEV(A5),D.DEV+DDB(A5); are we still in the same account ?
BNE 20$ ; no - we need to reset
CMMW LSTDRV(A5),D.DRV+DDB(A5);
BNE 20$ ; no...
CMMW LSTPPN(A5),D.PPN+DDB(A5)
BEQ 30$ ; yes - show this file
20$:
MOVW D.DEV+DDB(A5),LSTDEV(A5); set new current account number
MOVW D.DRV+DDB(A5),LSTDRV(A5)
MOVW D.PPN+DDB(A5),LSTPPN(A5)
BR 5$
; Show file on screen
30$:
CTRLC EXIT ; allow ctrlc
CALL PFILE ; show file name
CALL SHWLIN ; show first comment line
CRLF ; goto next line
INCW COUNT(A5) ; bump count
JMP LOOP ; and continue
; Exit program
EXIT:
JOBIDX A1 ; A1->my jcb
ANDW #^C<J.CCC>,JOBSTS(A1) ; clear any pending CTRLC's
ACRT 24.,1 ; cursor at row 24 col 1
ACRT 9. ; delete to end of line
ACRT 28. ; cursor on
EXIT ; back to AMOS/L...
;****************
;* PFILE *
;****************
; This routine prints the current file name on the screen
; in lower intensity without a dot
PFILE:
SAVE D1,A1,A2 ; save work registers
LEA A2,PBUF(A5) ; index print work area
LEA A1,D.FIL+DDB(A5) ; get filename
UNPACK ; to ascii
UNPACK
MOVB #40,(A2)+ ; add a space
UNPACK ; then extension
CLRB @A2 ; terminate correctly
ACRT 11. ; low intensity
TTYL PBUF(A5) ; display file name
ACRT 12. ; back to high intensity
REST D1,A1,A2 ; restore work registers
RTN ; return
;****************
;* SHWLIN *
;****************
; This routine trys to locate a valid comment character. It ignores
; blank lines. If it hits any thing other than '!', ';', '.;', or 'REM'
; it stops processing for the current file. If it finds a valid comment
; string in the first part of the file it will load that line into a buffer
; so it can show it to the user. If a non-printable ascii character is
; fount it stops processing the current file.
SHWLIN:
SAVE D1,D2,A2 ; save work register
TYPE < > ; seperate from name
; Open file if possible
ORB #D$ERC!D$BYP,D.FLG+DDB(A5); no room for error messages
OPENI DDB(A5) ; open the file
JNE 99$ ; no - mabey random or disk error
; Copy line into print buffer
10$:
LEA A2,LINBUF(A5) ; index the line buffer
CLR D2 ; no characters in line yet
; Main input loop
20$:
FILINB DDB(A5) ; get a character
TST D.SIZ+DDB(A5) ; are we done ?
JEQ 98$ ; yes -
INC D2 ; no - bump file count
CMP D2,#69. ; are we full ?
BGE 30$ ; yes - we're done with this file
CMPB D1,#CR ; no - hit a CR ?
BEQ 20$ ; yes - don't load this
CMPB D1,#LF ; hit a line feed yet?
BEQ 30$ ; no - get another byte
CMPB D1,#TAB ; hit a TAB ?
BNE 25$ ; no - all is peaches
MOVB #SPACE,D1 ; yes - replace with a space
; Check for validity and load into buffer
25$:
ANDB #177,D1 ; limit to seven bits
CMPB D1,#40 ; ASCII ?
BLO 98$ ; no - forget displaying this one
MOVB D1,(A2)+ ; set it into the buffer
BR 20$ ; get another character
; Terminate line and look for comment string
30$:
CLRB @A2 ; terminate properly
LEA A2,LINBUF(A5) ; A2 -> command
BYP ; bypass spaces
TSTB @A2 ; no - blank line ?
BEQ 10$ ; yes - get another one
; Check for ';'
CMPB @A2,#'; ; commented out ?
BEQ 50$ ; yes - get another line
; Check for '!'
CMPB @A2,#'! ; commented out ?
BEQ 50$ ; yes - get another line
; Check for '.;' -- SuperVue file
CMPB (A2)+,#'. ; half a comment spec ?
BNE 40$ ; no - check next one
CMPB @A2,#'; ; yes - is other half there ?
BEQ 50$ ; yes - whoopee
; Check for 'REM' statement from BASIC
40$:
DEC A2 ; back up to correct place
MOVB (A2)+,D1 ; get a byte
UCS ; to upper case
CMPB D1,#'R ; first part ?
BNE 98$ ; no - we're done
MOVB (A2)+,D1 ; check second one
UCS
CMPB D1,#'E
BNE 98$
MOVB @A2,D1 ; and the thrird
UCS
CMPB D1,#'M
BNE 98$
; Valid comment string found display line
50$:
INC A2 ; bypass last comment character
BYP ; ingnore leading spaces
TTYL @A2 ; display line
; Close file
98$:
CLOSE DDB(A5) ; close file
; Return to main program
99$:
REST D1,D2,A2 ; and return
RTN
;****************
;* HEADER *
;****************
; This routine displays the header with the current account info
HEADER:
CTRLC EXIT ; allow exit
SAVE D1,A0 ; save work registers
ACRT 0 ; clear screen
ACRT 12. ; low intensity
TYPE <White House Software>
ACRT 11. ; high intensity
TYPE < Extended >
ACRT 12.
TYPE <Directory>
ACRT 11.
TYPE <..........................>
ACRT 12.
; Save info we might modify
PUSHW D.DEV+DDB(A5) ; save info so we can use PFILE
PUSHW D.DRV+DDB(A5) ; and PRPPN to display the current
PUSHW D.PPN+DDB(A5) ; login
PUSH D.FIL+DDB(A5)
CLR D.FIL+DDB(A5) ; no file name will show only the dev:
; Check to make sure we have a device to pring
JOBIDX A0 ; index my jcb
TSTW D.DEV+DDB(A5) ; is there a DDB specified ?
BNE 10$ ; yes - use it
MOVW JOBDEV(A0),D.DEV+DDB(A5); no - use default
MOVW JOBDRV(A0),D.DRV+DDB(A5)
; Print device
10$:
PFILE DDB(A5) ; display device
POP D.FIL+DDB(A5) ; restore file
TYPE <[> ; start of ppn area
; Check to se that we have a PPn to print
TSTW D.PPN+DDB(A5) ; is one loaded ?
BNE 20$ ; yes - use it
MOVW JOBUSR(A0),D.PPN+DDB(A5); no - use default
; Print our PPn
20$:
PRPPN D.PPN+DDB(A5) ; print the account number
TYPECR <]> ; end of PPn display
POPW D.PPN+DDB(A5) ; restore info
POPW D.DRV+DDB(A5)
POPW D.DEV+DDB(A5)
REST D1,A0
RTN
;****************
;* RETURN *
;****************
; This routine waits for user input
RETURN:
TSTW BEGRTN(A5) ; is this the first time through ?
BEQ 10$ ; yes - don't wait for user
SAVE D1 ; save work register
ACRT 24.,1. ; row 24 col 1
ACRT 11. ; low
TYPESP <Press> ;
ACRT 12.
TYPESP <any key>
ACRT 11.
TYPESP <to continue:>
ACRT 12.
ACRT 28. ; cursor on
KBD ; wait for a key stroke
ACRT 29. ; cursor off
REST D1 ; restore work register
10$:
MOVW #-1,BEGRTN(A5) ; no longer first time through
RTN