home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
ZCPR2
/
STARTUP.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
10KB
|
457 lines
;
; Program: STARTUP
; Author: Richard Conn
; Version: 1.4
; Date: 9 Jan 83
; Previous Versions: 1.3 (7 Jan 83)
; Previous Versions: 1.2 (6 Jan 83), 1.1 (7 Dec 82), 1.0 (8 Nov 82)
;
; STARTUP loads the ZCPR2 command line with an initial command string
; for execution on cold boot. The user may specify what this command string
; is to STARTUP in an interactive mode, and STARTUP may be configured at
; any time.
;
vers equ 14
;
; This program is Copyright (c) 1982, 1983 by Richard Conn
; All Rights Reserved
;
; ZCPR2 and its utilities, including this one, are released
; to the public domain. Anyone who wishes to USE them may do so with
; no strings attached. The author assumes no responsibility or
; liability for the use of ZCPR2 and its utilities.
;
; The author, Richard Conn, has sole rights to this program.
; ZCPR2 and its utilities may not be sold without the express,
; written permission of the author.
;
;
; Externals
;
ext print,bbline,initfcb
ext f$delete,f$make,f$write,f$close
ext cin,cout,caps,crlf
ext eval,padc,phl4hc
ext shftlh,pstr
ext fname,bdos
ext codend
;
; Constants
;
fcb equ 5ch
cr equ 0dh
lf equ 0ah
;
; Branch to Start of Program
;
jmp start
;
;******************************************************************
;
; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format
;
; This data block precisely defines the data format for
; initial features of a ZCPR2 system which are required for proper
; initialization of the ZCPR2-Specific Routines in SYSLIB.
;
;
; EXTERNAL PATH DATA
;
EPAVAIL:
DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES)
EPADR:
DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE
;
; INTERNAL PATH DATA
;
INTPATH:
DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT
; DISK = 1 FOR A, '$' FOR CURRENT
; USER = NUMBER, '$' FOR CURRENT
DB 0,0
DB 0,0
DB 0,0
DB 0,0
DB 0,0
DB 0,0
DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT
DB 0 ; END OF PATH
;
; MULTIPLE COMMAND LINE BUFFER DATA
;
MCAVAIL:
DB 000H ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE?
MCADR:
DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE
;
; DISK/USER LIMITS
;
MDISK:
DB 4 ; MAXIMUM NUMBER OF DISKS
MUSER:
DB 31 ; MAXIMUM USER NUMBER
;
; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK
;
DOK:
DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES)
UOK:
DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES)
;
; PRIVILEGED USER DATA
;
PUSER:
DB 10 ; BEGINNING OF PRIVILEGED USER AREAS
PPASS:
DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS
DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL
;
; CURRENT USER/DISK INDICATOR
;
CINDIC:
DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS)
;
; DMA ADDRESS FOR DISK TRANSFERS
;
DMADR:
DW 80H ; TBUFF AREA
;
; NAMED DIRECTORY INFORMATION
;
NDRADR:
DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY
NDNAMES:
DB 64 ; MAX NUMBER OF DIRECTORY NAMES
DNFILE:
DB 'NAMES ' ; NAME OF DISK NAME FILE
DB 'DIR' ; TYPE OF DISK NAME FILE
;
; REQUIREMENTS FLAGS
;
EPREQD:
DB 000H ; EXTERNAL PATH?
MCREQD:
DB 0FFH ; MULTIPLE COMMAND LINE?
MXREQD:
DB 000H ; MAX USER/DISK?
UDREQD:
DB 000H ; ALLOW USER/DISK CHANGE?
PUREQD:
DB 000H ; PRIVILEGED USER?
CDREQD:
DB 000H ; CURRENT INDIC AND DMA?
NDREQD:
DB 000H ; NAMED DIRECTORIES?
Z2CLASS:
DB 0 ; CLASS 0
DB 'ZCPR2'
DS 10 ; RESERVED
;
; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA
;
;******************************************************************
;
;
; Start of Program
;
start:
lda mcavail ;multiple commands available?
ora a ;0=no
jz mcerr
call codend ;allocate buffer space
shld oldcmd ;256 bytes for old command line
lda fcb+1 ;check for option char
cpi ' ' ;no option if <sp>
jz run ;run command
cpi 'S' ;setup?
jz setup
call banner ;print banner
call print ;print help message
db cr,lf,'STARTUP is used to execute an initial set of commands'
db cr,lf,' under ZCPR2 with Multiple Commands implemented.'
db cr,lf
db cr,lf,'STARTUP is invoked by one of the following command'
db cr,lf,' lines:'
db cr,lf
db cr,lf,' STARTUP <-- execute built-in commands'
db cr,lf,' STARTUP SETUP <-- define built-in commands'
db cr,lf,' (only the S in SETUP is needed)'
db cr,lf,0
ret
;
; Multiple Command Line Buffer not Supported -- Fatal Error
;
mcerr:
call banner
call print
db cr,lf,'Multiple Command Line is not supported.'
db cr,lf,'STARTUP is based on the use of this buffer,'
db cr,lf,'and STARTUP cannot function without it.'
db cr,lf,'STARTUP is aborting.'
db cr,lf,0
ret
;
; Print Startup Banner
;
banner:
call print
db 'STARTUP, Version '
db vers/10+'0','.',(vers mod 10)+'0'
db 0
ret
;
; Run STARTUP Command Line
;
run:
lhld oldcmd ;pt to save buffer
xchg ;... in DE
lhld mcadr ;get base of command line
mov a,m ;low-order address in A
inx h
mov h,m ;high-order address in H
mov l,a ;low-order address in L
run0:
mov a,m ;get char
stax d ;put it
inx h ;pt to next
inx d
ora a ;end of line?
jnz run0
lhld mcadr ;pt to base address of command line
push h ;save ptr
lxi d,4 ;pt to command line byte
dad d ;hl pts to command line byte
xchg ;... de pts to it
pop h ;get ptr to base
mov m,e ;store address
inx h
mov m,d
xchg ;hl pts to first byte of command line
shld byte1 ;save ptr in case of error
lxi d,cmnd ;pt to STARTUP Buffer
push h ;save HL for now
lhld mcadr ;address of multiple command line buffer
inx h ;skip ptr
inx h ;pt to buffer size
mov b,m ;... in B
pop h ;restore HL
call stline ;store line
jz err ;line too long?
dcx h ;pt to ending null
xchg
lhld oldcmd ;pt to old command line
xchg ;... in DE
call stline
jz err ;line too long?
ret
err:
call banner
call print
db cr,lf,7,'** Command Line too Long -- Abort **',0
lhld byte1 ;clear line
mvi m,0
ret
;
; Store commands pted to by DE in buffer pted to by HL; B=space left in buffer
;
stline:
ldax d ;get byte of command
mov m,a ;store it
inx h ;pt to next
inx d
dcr b ;count down
jz stlerr
ora a ;done?
jnz stline
mvi a,0ffh ;set no error
ora a
ret
stlerr:
xra a ;error
ret
;
; STARTUP Setup Mode
;
setup:
call banner
cloop:
call print
db cr,lf,'STARTUP Setup Command (?=Help)? ',0
call capin ;get response, capitalize, and echo
cpi 'C' ;define command line
jz setupc
cpi 'D' ;display values
jz setupd
cpi 'X' ;exit
jz setupx
call print ;print help message
db cr,lf,' Setup Mode Commands are --'
db cr,lf,' C -- Define STARTUP Multiple Command Line'
db cr,lf,' D -- Display STARTUP Values'
db cr,lf,' X -- Exit and Optionally Rewrite STARTUP'
db 0
jmp cloop
;
; Set STARTUP Multiple Command Line Buffer Contents
;
setupc:
call print
db cr,lf,' Current Multiple Command Buffer Contents is --',cr,lf,0
lxi h,cmnd ;pt to line
call pstr
call print
db cr,lf,' New Line? ',0
xra a ;no caps
call bbline ;get line from user
lxi d,cmnd ;pt to command line
copy:
mov a,m ;get byte
stax d ;put byte
inx h ;pt to next
inx d
ora a ;done?
jnz copy ;fall thru to setupd to display result
;
; Display Values
;
setupd:
call print
db cr,lf
db cr,lf,' Multiple Command Line --',cr,lf,' --->',0
lxi h,cmnd ;pt to buffer
call pstr ;print it
call crlf ;new line
jmp cloop ;get next command
;
; Exit to OS with optional rewrite of STARTUP.COM
;
setupx:
call print
db cr,lf,' Do you wish to update STARTUP (Y/N/<CR>=Y)? ',0
call capin ;get response, capitalize, and echo
cpi 'N' ;no?
rz ;done if so
call print
db cr,lf,' STARTUP will write file to current disk/user',0
file:
call print
db cr,lf,' STARTUP File is ',0
lxi h,sfcb+1 ;pt to FN field
call prfn ;print file name
call print
db cr,lf,' Enter New File Name or <CR> if OK: ',0
mvi a,0ffh ;capitalize
call bbline ;get line
ora a ;any input?
jz write
lxi d,sfcb ;pt to FCB
call fname ;convert into FCB
mov a,b ;anything other than default given?
ana c
cpi 0ffh ;must be FF if both defaults
jz file
call print
db cr,lf,' ** Disk or User Specification Ignored **',0
jmp file
prfn:
mvi b,8 ;8 chars
call prch
mvi a,'.'
call cout
mvi b,3 ;3 chars
prch:
mov a,m ;get char
call cout ;output it
inx h ;pt to next
dcr b ;count down
jnz prch
ret
capin:
call cin ;get response
call caps
jmp cout
;
; Begin procedure to write file to disk
;
write:
call print
db cr,lf,' Writing File ',0
lxi h,sfcb+1 ;print file name
call prfn
call print
db ' to Disk ... ',0
lxi d,sfcb ;pt to fcb
call initfcb ;init it
call f$delete ;delete it
call initfcb ;reinit it
call f$make ;create file
cpi 0ffh ;error?
jz derr
call codend ;get end of code
call shftlh ;shift HL left 1 bit so we have a block (128 byte)
;count
mov b,h ;count in b
lxi h,100h ;pt to start of program
writel:
xchg ;de is dma address
push h ;save HL
mvi c,26 ;set dma address
call bdos
lxi h,80h ;pt to next block
dad d
pop d ;get de (ptr to sfcb), hl pts to next block
call f$write ;write block to disk
ora a ;0=ok
jnz derr
dcr b ;count down
jnz writel
call f$close ;close file
call print
db 'Done',0
ret
derr:
call print
db cr,lf,' Disk Output Error -- Aborting',0
ret
;
; Buffers
;
oldcmd:
ds 2 ;original command line
byte1:
ds 2 ;ptr to first byte
cmnd:
db 0 ;empty line initially
ds 256 ;buffer for command line
; FCB to write STARTUP to
sfcb:
db 0 ;current disk
db 'STARTUP COM'
ds 4
ds 16
ds 4
end