; ************************** AMUS Program Label ******************************
; Filename: SYSLOD.M68 Date: 01/22/90
; Category: UTIL Hash Code: 236-224-245-646 Version: 1.1(101)
; Initials: ULTR/AM Name: DAVID PALLMANN
; Company: ULTRASOFT CORPORATION Telephone #: 5163484848
; Related Files: SEARCH.HLP; WLDSCN.LIB (required for assembly/linkage)
; Min. Op. Sys.: AMOSL 1.3B Expertise Level: BEG
; Special: Requires the 2.0 Assembler
; Description: Just like the SYSTEM command, but supports wildcarding.
; In system initialization file, useful for loading groups of files at a time
; for example .SYSLOD BAS:*.RUN or .SYSLOD WRT:*.OVR
; ****************************************************************************
;****************************************************************************
;* *
;* SYSLOD *
;* Wildcard version of the SYSTEM command *
;* *
;****************************************************************************
;Copyright (C) 1989 UltraSoft Corporation. All Rights Reserved.
;
;Written by: David Pallmann
;
;Donated to AMUS 22-Dec-89
;
;Edit History:
;1.0(100) 22-Dec-89 created. /DFP
;1.1(101) 22-Jan-90 optimized; now about 50% faster. /DFP
VMAJOR =1
VMINOR =1
VSUB =0
VEDIT =101.
VWHO =0
SEARCH SYS
SEARCH SYSSYM
;wildcard scanner macros
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 WFULL
IF NDF,W.FULL,EXTERN W.FULL
CALL W.FULL
ENDM
DEFINE WLIST ADDR
IF NDF,W.LIST,EXTERN W.LIST
IF NB,ADDR
PUSH A0
LEA A0,ADDR
ENDC
CALL W.LIST
IF NB,ADDR
POP A0
ENDC
ENDM
SPEC: BYP ; bypass spaces/tabs
LIN ; empty command line?
JEQ USAGE ; yes - explain usage
WSPEC LIT ; process specification
JNE EXIT ; rejected by WLDSCN
;***********
;* FLOOP *
;***********
;main processing loop - get next file from scanner and load it into system
;memory
FLOOP: CTRLC EXIT ; ^C check
WSCAN ; get next file
JNE MORE ; no more files
LEA A6,FILE(A5) ; index file DDB
MOVW D.DEV(A4),D.DEV(A6) ; set device code
MOVW D.DRV(A4),D.DRV(A6) ; set drive number
MOV D.FIL(A4),D.FIL(A6) ; set filename
MOVW D.EXT(A4),D.EXT(A6) ; set extension
MOVW D.PPN(A4),D.PPN(A6) ; set PPN
CLR D.DVR(A6) ; clear driver address
;**********
;* OPEN *
;**********
;open file and load it into system memory
OPEN: LOOKUP FILE(A5) ; look-up the file
BNE FLOOP ; not found (not supposed to happen)
TYPESP Loading ; say we are loading
PFILE FILE(A5) ; the file
CRLF ; newline
OPENI FILE(A5) ; open for input
MOV SYSBAS,A1 ; get base of system memory chain
;************
;* LOCATE *
;************
;Locate end of system memory module chain
LOCATE: TST @A1 ; end of memory chain?
BEQ ADD ; yes
ADD @A1,A1 ; point to next module in chain
BR LOCATE ; loop
;*********
;* ADD *
;*********
;Add new module to system memory chain
ADD: MOV A1,A3 ; copy module base
ADD #12.,A3 ; account for size
MOV #12.,D5 ; of housekeeping header
;*********
;* GET *
;*********
;Get next byte from file and store in module
GET: CTRLC CLOSE ; ^C check
CALL GET.BYTE ; get next byte [101]
BNE CLOSE ; end of file - branch [101]
MOVB D1,(A3)+ ; store byte in memory
INC D5 ; increment byte count
BR GET ; loop
;***********
;* CLOSE *
;***********
;Close file, finish up module
CLOSE: CLOSE FILE(A5) ; close file
MOV D5,D7 ; copy module size
AND #1,D7 ; is size odd?
BEQ 10$ ; no
INC D5 ; yes - add one
CLRB (A3)+ ; to make it even
10$: MOV D5,(A1)+ ; store size
MOVW #PRM!LOK!FGD,(A1)+ ; store flags
MOV FILE+D.FIL(A5),(A1)+ ; store filename
MOVW FILE+D.EXT(A5),(A1)+ ; store extension
CLR (A3)+ ; mark end of next module
MOV A3,MEMBAS ; set new MEMBAS
JMP FLOOP ; go handle next file
;**********
;* MORE *
;**********
;Done loading file - see if there is more on the command line
;If a comma is present we bypass it and go process another file specification
MORE: BYP ; bypass spaces/tabs
CMPB (A2)+,#<',> ; comma here?
JNE EXIT ; no - we are all done
INC A2 ; yes - skip it
BYP ; bypass spaces/tabs
JMP SPEC ; go process filespec
;***********
;* USAGE *
;***********
;Explain how to use SYSLOD
;***********
;* SYSUP *
;***********
;Tell user we can only be run at boot time
SYSUP: TYPECR The SYSLOD command may only be used during system initialization
CRLF ; newline
BR USAGE ; also explain command syntax
;**************
;* GET.BYTE *
;**************
;Function: Read next byte from FILE(A5)
;
;Inputs: A3 - address of a file DDB, opened for sequential input
;
;Outputs: D1 - low order byte contains data; all other bytes cleared
; Z - set if character received; 0 on error or end-of-file
; N - set if an error occurred
GET.BYTE:
SAVE A3,A6 ; save registers
LEA A3,FILE(A5) ; index DDB
CLR D1 ; pre-clear D1
MOV D.IDX(A3),A6 ; pick up buffer index
CMP A6,D.SIZ(A3) ; check for buffer empty
BLO 20$ ; not yet
INPUT @A3 ; input next record
MOVB D.ERR(A3),D7 ; error?
BNE 30$ ; yes
MOV D.IDX(A3),A6 ; did we get anything?
CMP A6,D.SIZ(A3) ; end of file?
BNE 20$ ; no
REST A3,A6 ; restore registers
LCC #0 ; clear Z, clear N (end of file)
RTN ; return
20$: ADD D.BUF(A3),A6 ; add buffer base
MOVB @A6,D1 ; return the character in D1
INC D.IDX(A3) ; increment the index
REST A3,A6 ; restore registers
LCC #PS.Z ; set Z, clear N (normal return)
RTN ; return
30$: REST A3,A6 ; restore registers
LCC #PS.N ; clear Z, set N (error)
RTN ; return