;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;$ Program name: FASTGO vers. 1.1 $
;$ Program author: James Whorton  $
;$ Originally written: 04/25/84   $
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;
;FASTGO 1.1 : A PROGRAM DESIGNED TO MAKE IT EASIER
;TO MOVE TO A SPECIFIC, LABELED DRIVE/USER AREA.
;INTENDED MAINLY FOR HARD DISK SYSTEMS, BUT SHOULD
;WORK EQUALLY WELL ON ANY 2.2 SYSTEM. ALLOWS PASSWORD
;PROTECTING AND CHAINING TO ANOTHER PROGRAM AFTER
;ENTERING NEW USER-AREA. FOR USAGE, TYPE GOTO.
;
;***************************************************
;REVISIONS:
;
;05/06/84 VERS. 1.1:
;          ADDED RELOCATION OF CODE TO HIGHMEM SO
;          THAT A .COM FILE MAY BE LOADED AND RAN FROM
;          100H. ADDED DRIVE AND USER # DISPLAY TO
;          USAGE ROUTINE. (JHW)
;***************************************************
;
;WHEN EXECUTED, THIS PROGRAM DOES THE FOLLOWING:
;
;1. RELOCATES ITSELF TO HIGH MEM (SET BY USER).
;2. CHECKS FOR INPUT, PRINTS OPTIONS AND QUITS IF NONE.
;3. EVALUATES INPUT, SEEKING A MATCH FROM THE TABLE.
;4. IF NO MATCH FOUND, TELL USER, DISPLAY OPTIONS AND QUIT.
;5. ON MATCH, CHECK FOR PASSWORD STATUS AND GET IT IF NEEDED.
;6. IF PASSWORD DOESN'T MATCH, ABORT.
;7. SELECT SPECIFIED USER-AREA.
;8. IF RUNCOM = TRUE, LOAD AND RUN A .COM FILE.
;9. EXIT TO SYSTEM.
;
;NOTE: I'VE SEEN A UTILITY OF THIS TYPE ON OTHER
;SYSTEMS, BUT HAVE NEVER BEEN ABLE TO LOCATE THE
;SOURCE CODE. SO I WROTE THIS ONE. THIS CODE IS CRUDE,
;BUT IT DOES THE JOB. I'M PLANNING ON MOVING UP TO A
;HARD DISK SYSTEM IN THE FAIRLY NEAR FUTURE SO I'M
;GATHERING UTILITIES FOR IT. 
;
;RENAME THIS FILE TO GOTO.COM.
;  GOTO           DISPLAYS USAGE AND VALID USER-AREAS
;  GOTO USER-AREA MOVES TO USER-AREA. IF PASSWORDED,
;                 GETS SAME FROM USER BEFORE MOVING.
;
;JAMES H. WHORTON
;402-346-4206  DATA
;402-341-0770  VOICE
;
;---------------------------------------------------
;THIS IS THE RUNNING LOCATION OF THE MAIN CODE. PUT IT
;HIGH ENOUGH SO THAT THE .COM FILE YOU LOAD, IF ANY,
;WILL NOT OVERLAY IT.
;
DEST	EQU	0A000H	;RUNNING LOCATION
;.....
;EQUATES SECTION
;
WARM	EQU	0	;WARM START
BDOS	EQU	5	;BDOS CALL VECTOR
CIN	EQU	1	;CONSOLE IN
COUT	EQU	2	;CONSOLE CHAR. OUT
DIO	EQU	6	;DIRECT I/O CALL
CSTAT	EQU	12	;CONSOLE STATUS
RSTDSK	EQU	13	;RESET DISK SUBSYSTEM
STDSK	EQU	14	;SET DEFAULT DISK
OPEN	EQU	15	;OPEN FILE
READ	EQU	20	;READ SEQUENTIAL RECORD
STDMA	EQU	26	;SET DMA ADDRESS
STUSR	EQU	32	;GET/SET USER #
FCB	EQU	05CH	;FIRST FCB
CR	EQU	13	;CARRAIGE RETURN
LF	EQU	10	;LINE FEED
BELL	EQU	7	;CONSOLE BELL
TRUE	EQU	0FFH
FALSE	EQU	0
DEFBYT	EQU	4	;CURRENT DRIVE/USER BYTE
;
;...................................................
; USER SETTABLE OPTIONS
;
WIDTH	EQU	3	;# OF COLUMNS TO PRINT ACROSS
RUNCOM	EQU	TRUE	;SET TO TRUE IF CHAIN DESIRED
COMDRV	EQU	'A'-40H	;DRIVE COM FILE IS ON
COMUSR	EQU	0	;USER # COM FILE IS IN
DIVID	EQU	'|'	;DIVIDER CHARACTER FOR DISPLAY
;
;...................................................
;PROGRAM STARTS HERE
;
	ORG	0100H
;
;THE FOLLOWING ROUTINE MOVES THE BODY OF THE
;PROGRAM UP TO SAFE MEMORY. THE TECHNIQUE OF THE
;$+OFFSET LABELS AND THE LOAD .COM FILE CODE ARE
;ASLO FROM BYE.
;
MOVEUP:	LXI	B,PEND-START+1	;NUMBER OF BYTES TO MOVE
	LXI	H,DEST+PEND-START+1 ;END OF MOVED CODE
	LXI	D,SOURCE+PEND-START ;END OF SOURCE CODE
;
MOVLOP:	LDAX	D	;GET BYTE
	DCX	H	;BUMP POINTERS
	MOV	M,A	;NEW HOME
	DCX	D
	DCX	B	;BUMP BYTE COUNT
	MOV	A,B	;CHECK IF ZERO
	ORA	C
	JNZ	MOVLOP	;IF NOT, DO SOME MORE
;
	PUSH	H	;SAVE RETURN ADDRESS
	RET		;RETURN TO NEW ADDRESS
;
SOURCE	EQU	$	;BOUNDARY MEMORY MARKER
;
OFFSET	EQU	DEST-SOURCE ;RELOCATION AMOUNT
;
;THE FOLLOWING CODE IS THE MAIN BODY OF THE PROGRAM.
;IT IS FIRST MOVED TO DEST, THEN EXECUTED. FROM THIS
;POINT ON, ALL LABELS MUST BE IN THIS FORMAT:
;     LABEL	EQU	$+OFFSET
;SO THAT THE RELOCATION WILL WORK PROPERLY.
;
START	EQU	$+OFFSET
;
;===================================================
;
;CHECK IF USER-AREA SPECIFIED.
;
	LDA	FCB+1	;GET FIRST BYTE OF FCB
	CPI	32	;BLANK?
	JZ	USAGE	;YES, PRINT USAGE AND QUIT
;
;OK, A USER-AREA WAS SPECIFIED. LET'S SEE HOW LONG
;IT IS
	MVI	B,0	;SET UP COUNTER
	LXI	H,FCB+1	;SET UP POINTER
LENCHK	EQU	$+OFFSET
	MOV	A,M	;GET A BYTE
	INX	H	;INCREMENT POINTER
	INR	B	;INCREMENT COUNTER
	CPI	32	;IS IT A BLANK?
	JNZ	LENCHK	;NO, GO AGAIN
	MOV	A,B
	STA	USRLEN	;STORE COUNT FOR LATER USE
;
;NOW LET'S START CHECKING THE NAME SPECIFIED AGAINST
;THE TABLE
	LXI	H,TABLE+2;SET UP POINTER
	SHLD	CHARP	;SAVE POINTER
NAMCHK	EQU	$+OFFSET
	LHLD	CHARP	;GET TABLE POINTER
	MOV	A,M	;CHECK FOR END OF TABLE
	CPI	0	;ARE WE THERE?
	JZ	NOMATCH	;YES, ERROR MESSAGE AND USAGE
	LXI	D,FCB+1	;POINT TO INPUT
	LDA	USRLEN	;GET LENGTH OF INPUT
	MOV	B,A	;MOVE IT TO B
	CALL	COMPAR	;DO THE COMPARISON
	JZ	MATCH	;IT'S A MATCH, SO DO IT
	LXI	D,25	;INCREMENT THE POINTER
	LHLD	CHARP	;GET THE POINTER BACK
	DAD	D	;ADD IT
	SHLD	CHARP	;SAVE IT
	JMP	NAMCHK	;TRY NEXT ENTRY
;
;A MATCH WAS FOUND, SEE IF PWD PROTECTED
;
MATCH	EQU	$+OFFSET
	LHLD	CHARP	;GET ENTRY POINTER
	DCX	H	;BACK UP 1 BYTES
	MOV	A,M	;GET ACCESS CODE
	CPI	'*'	;NEED A PASSWORD?
	JNZ	SELECT	;NOPE, GO AHEAD AND DO IT
;GET A PASSWORD FROM USER
	CALL	ILPRT	;PROMPT USER
	DB	'Password ? ',0
	LXI	H,USRPWD;POINT TO STORAGE AREA
	MVI	B,0	;MAX CHARS ALLOWED = 080H
PWD1	EQU	$+OFFSET
	PUSH	H
	PUSH	B
	MVI	E,0FFH	;SEE IF CHAR THERE
	MVI	C,DIO
	CALL	BDOS
	POP	B
	POP	H
	CPI	0	;CHAR READY?
	JZ	PWD1	;NOT YET
	CPI	CR	;END OF INPUT?
	JZ	PWD2	;YES
	MOV	M,A
	INX	H	;INCREMENT POINTER
	INR	B	;INCREMENT CHAR COUNTER
	MOV	A,B	;GET COUNTER IN A TO CHECK
	CPI	080H	;BUFFER FULL?
	JZ	PWD2	;NOPE, GET ANOTHER CHAR
	MOV	B,A
	JMP	PWD1
;PAD INPUT BUFFER WITH SPACES
PWD2	EQU	$+OFFSET
	MOV	B,A	;GET COUNTER BACK
	MVI	A,32	;FILL INPUT WITH NULLS
	MOV	M,A	;PUT IT IN STORAGE
	INX	H
	INR	B
	MOV	A,B	;CHECK COUNTER
	CPI	080H	;FULL YET?
	JNZ	PWD2	;NOPE, TRY IT AGAIN
;
;NOW DO THE CHECK
PWD3	EQU	$+OFFSET
	LHLD	CHARP;POINT TO TABLE ENTRY
	LXI	D,13
	DAD	D
	LXI	D,USRPWD
	MVI	B,10	;CHECK 10 CHARS (PWD LENGTH)
	CALL	COMPAR	;DO A COMPARISON
	JZ	SELECT	;CORRECT PASSWORD SUPPLIED
	CALL	ILPRT	;NOPE, SAY FORGET IT
	DB	BELL,'++ Invalid password.',CR,LF,0
	JMP	DONE	;DISPLAY CORRECT AREAS
;
;WE GOT THIS FAR, LET'S CHANGE THE USER # AND DRIVE
SELECT	EQU	$+OFFSET
	LHLD	CHARP	;POINT TO TABLE
	DCX	H	;BACK UP 2 BYTES
	DCX	H
	MOV	A,M	;GET VALUE FROM TABLE
	PUSH	H
	STA	DEFBYT	;PUT IT IN MEMORY BYTE
	STA	DRVUSR
	ANI	0FH	;MASK OUT USER #
	STA	NEWDRV	;SAVE FOR LATER
	MOV	E,A
	MVI	C,STDSK	;SELECT THE DRIVE
	CALL	BDOS
	POP	H	;NOW SET THE USER #
	MOV	A,M	;GET THE BYTE
	ANI	0F0H	;MASK OUT DRIVE
	RAR		;ROTATE 4 TIMES TO GET USER #
	RAR		;IN PROPER POSITION
	RAR
	RAR
	STA	NEWUSR	;SAVE IT FOR LATER
	MOV	E,A	;DO IT
	MVI	C,STUSR
	CALL	BDOS
	MVI	C,RSTDSK
	CALL	BDOS
;
;ROUTINE TO LOAD THE COM FILE
;
	IF	RUNCOM
LODCOM	EQU	$+OFFSET
;SELECT USER # TO LOAD FROM
	MVI	E,COMUSR
	MVI	C,STUSR
	CALL	BDOS
;
	MVI	A,COMDRV;INITIALIZE FCB
	STA	COMFIL
	LXI	H,COMFIL+12
	MVI	B,21
;
ZLOOP	EQU	$+OFFSET
	MVI	M,0
	INX	H
	DCR	B
	JNZ	ZLOOP
;
	MVI	C,OPEN	;NOW OPEN THE FILE
	LXI	D,COMFIL
	CALL	BDOS
	INR	A	;SHOULD BE NON-ZERO
	JZ	NOFILE	;NO FILE, ABORT
;
;NOW LOAD THE FILE
	LHLD	6	;GET TOP OF MEMORY
	LXI	D,-80H	;RECORD LOADS CAN'T START..
	DAD	D	;..ABOVE (BDOS) - 80H
	PUSH	H	;SAVE ON STACK
;
	LXI	D,80H	;TPA-80H
	LXI	B,0	;KEEP A RECORD COUNTER
	PUSH	B	;SAVE COUNTER
	PUSH	D	;AND LOAD ADDRESS
;
GLOOP	EQU	$+OFFSET
	POP	D	;GET TPA ADRS
	LXI	H,80H	;POINT TO NXT ADRS TO READ TO
	DAD	D	;HL HAS THE ADDRESS
	POP	B	;INCREMENT THE COUNTER
;CHECK FOR LOAD PAST TOP-OF-MEMORY
	POP	D	;GET (TOP-OF-MEMORY)
	PUSH	D	;RE-SAVE FOR NEXT TIME
	MOV	A,E	;SUBTRACT: (TOP) - (ADRS)
	SUB	L
	MOV	A,D	;ONLY THE CARRY NEEDED
	SBB	H
	JNC	SIZEOK	;CY= BETTER MOVCPM
	CALL	ILPRT	;SO TELL THE STORY
	DB	BELL,'++ Program area too small ++  Aborting...',0
	JMP	DONE	;EXIT
;
SIZEOK	EQU	$+OFFSET
	INX	B
	PUSH	B
	PUSH	H	;SAVE TPA ADRS
	XCHG		;ALIGN REGISTERS
	MVI	C,STDMA ;TELL BDOS WHERE TO PUT RECORD
	CALL	BDOS
	LXI	D,COMFIL ;NOW READ THE RECORD
	MVI	C,READ
	CALL	BDOS
	ORA	A
	JZ	GLOOP	;A=0 IF MORE TO READ
	POP	B	;UNJUNK STACK
	POP	B	;THIS IS OUR COUNTER
	POP	H	;MORE JUNK ON STACK
	MOV	A,B	;CHECK FOR ZERO
	ORA	C
	JZ	NOFILE	;WE SHOULD HAVE READ SOMETHING
	LXI	D,80H	;WE DID, RESET DMA TO 80H
	MVI	C,STDMA
	CALL	BDOS
;
LOADOK	EQU	$+OFFSET
	MVI	A,' '	;MAKE THE LOADED PROGRAM THINK
	STA	FCB+1	;THAT NOTHING WAS PASSED IN THE
			;COMMAND LINE
	LDA	NEWDRV
	ADI	1	;MAKE IT RIGHT FOR FCB
	STA	FCB	;PUT THE PROPER DRIVE INTO THE FCB
;BEFORE JUMPING TO THE .COM FILE, RESET USER # AND DRIVE
	LDA	NEWUSR	;USER #
	MOV	E,A
	MVI	C,STUSR
	CALL	BDOS
	LDA	NEWDRV	;DRIVE
	MOV	E,A
	MVI	C,STDSK
	CALL	BDOS
	MVI	C,RSTDSK;RESET DISK SYSTEM
	CALL	BDOS
;
;BLANK THE FCB
	MVI	B,11
	LXI	H,FCB+1
QLOOP	EQU	$+OFFSET
	MVI	M,' '
	INX	H
	DCR	B
	JNZ	QLOOP
	LXI	H,FCB+1
;
;NOW JUMP TO THE CHAIN FILE
 	JMP	0100H	;NOW RUN IT.
;
NOFILE	EQU	$+OFFSET
	CALL	ILPRT
	DB	CR,LF
	DB	BELL,'++ Cannot find COM file ++',0
;
	ENDIF
	JMP	DONE	;QUIT
;
NOMATCH	EQU	$+OFFSET
	CALL	ILPRT
	DB	CR,LF,BELL,'++ Invalid user-area specified ++',0
;
;
;NO OPTION SPECIFIED, OR BAD ONE, SO LIST USAGE AND
;TABLE OF DEFINITIONS.
;
USAGE	EQU	$+OFFSET
	CALL	ILPRT
	DB	CR,LF,'FASTGO 1.1  05/06/84  James Whorton'
	DB	CR,LF,LF,'GOTO            Displays user-area info.'
	DB	CR,LF,'GOTO USER-AREA  Moves to the specified user-area.'
	DB	CR,LF,LF,'Defined user-areas are --'
	DB	CR,LF,0
;
;THIS ROUTINE PRINTS THE DEFINITION TABLE. IT PRINTS
;<WIDTH> COLUMNS ACROSS AND DOES NOT DISPLAY ANY PASSWORDS.
	LXI	H,TABLE+2;POINT TO NAMES
	MVI	D,13	;# OF BYTES PER ENTRY TO PRINT
	MVI	B,WIDTH	;# OF COLUMNS TO PRINT
	CALL	HEADER	;PRINT FIRST ENTRY HEADER
;NOW SEND CHAR AND CHECK FOR END OF ENTRY
INFO1	EQU	$+OFFSET
	CALL	ENDCHK
	MOV	A,M	;BE SURE IT'S THERE
	CALL	CTYPE	;SEND IT
	INX	H	;INCREMENT POINTER
	DCR	D	;DECREMENT CHAR COUNTER
	MOV	A,D	;GET CHAR COUNT TO CHECK
	CPI	0	;END OF ENTRY?
	JNZ	INFO1	;NO, DO ANOTHER BYTE
;
;DONE WITH ONE ENTRY, SO EVALUATE
;FIRST, SKIP PAST PASSWORD SECTION, PRINT DIVIDER
;AND NEW LINE
	MVI	D,13	;RESET CHAR COUNTER
	MVI	A,12	;# OF CHARS TO SKIP
SKIP	EQU	$+OFFSET
	INX	H	;INCREMENT POINTER
	DCR	A	;DECREMENT CHAR COUNTER
	CPI	0	;PAST IT YET?
	JNZ	SKIP	;NOPE, NOT YET
;
	CALL	ENDCHK	;SEE OF END OF TABLE REACHED
	DCR	B	;DECREMENT COLUMN COUNT
	MOV	A,B	;GET COUNT
	CPI	0	;NEED A NEW LINE?
	JZ	SKIP1	;YES
;PRINT A DIVIDER SECTION
	PUSH	H
	PUSH	D
	PUSH	B
	MVI	E,DIVID
	MVI	C,COUT
	CALL	BDOS
	POP	B
	POP	D
	POP	H
	CALL	HEADER	;PRINT HEADER
	JMP	INFO1	;NOW BACK TO THE GRIND
SKIP1	EQU	$+OFFSET
	MVI	A,CR	;START A NEW LINE
	CALL	CTYPE
	MVI	A,LF
	CALL	CTYPE
	MVI	B,3	;RESET COLUMN COUNTER
	CALL	ENDCHK
	CALL	HEADER
	JMP	INFO1
;
;CHECK FOR END OF ENTRY TABLE
;
ENDCHK	EQU	$+OFFSET
	PUSH	D
	PUSH	B
	MOV	A,M	;GET BYTE
	CPI	0	;END OF TABLE?
	JZ	DONE	;YES, QUIT
	POP	B
	POP	D
	RET
;
DONE	EQU	$+OFFSET
	JMP	WARM	;QUIT
;
;SUBROUTINES
;
;DISPLAY THE DRIVE AND USER # FROM THE TABLE ENTRY
HEADER	EQU	$+OFFSET
	PUSH	D	;SAVE REGISTERS
	PUSH	B
	DCX	H	;BUMP DOWN 2
	DCX	H
	SHLD	CHARP	;SAVE POINTER FOR LATER
	MOV	A,M	;GET BYTE
	ANI	0FH	;GET DRIVE
	ADI	65	;MAKE ASCII
	MOV	E,A
	MVI	C,COUT
	CALL	BDOS
	LHLD	CHARP	;GET POINTER BACK
	MOV	A,M	;GET BYTE AGAIN
	ANI	0F0H	;GET USER #
	RAR		;ROTATE 4
	RAR
	RAR
	RAR
	CPI	9	;IS IT > 9?
	JNC	DECOUT	;YES, BRANCH TO SUBROUTINE
	ADI	48	;NO, SO MAKE ASCII AND PRINT
	MOV	E,A
	MVI	C,COUT
	CALL	BDOS
	CALL	ILPRT
	DB	'> ',0
HEADFIN	EQU	$+OFFSET
	POP	B	;RESTORE REGISTERS
	POP	D
	LHLD	CHARP	;GET POINTER BACK ONE MORE TIME
	INX	H	;BUMP BACK TO WHERE IT CAME FROM
	INX	H
	RET		;FINISHED, RETURN
;
DECOUT	EQU	$+OFFSET
	MOV	B,A	;SAVE IT FOR A SEC
	PUSH	B
	MVI	E,'1'	;PRINT FIRST HALF OF VALUE
	MVI	C,COUT
	CALL	BDOS
	POP	B	;GET VALUE BACK
	MOV	A,B
	SUI	10	;VALUE-10=SECOND DIGIT VALUE
	ADI	48	;MAKE IT ASCII
	MOV	E,A
	MVI	C,COUT
	CALL	BDOS
	MVI	E,'>'
	MVI	C,COUT
	CALL	BDOS
	JMP	HEADFIN	;FINISHED
;
;CONVERT THE ASCII VALUE IN A TO A 2 DIGIT DECIMAL VALUE
;AND PRINT IT
;
OUTDEC	EQU	$+OFFSET
	
;
;DO A COMPARISON, ABORT IF MATCH FOUND
;
;COMPARE ROUTINE, # OF CHARS IN B, TEXT TO CHECK IN
;DE (INPUT) AND HL (TABLE)
;IF A MATCH, ZERO FLAG WILL BE SET ON EXIT
COMPAR	EQU	$+OFFSET
	LDAX	D	;GET A CHAR.
	CALL	UCASE	;MAKE SURE IT'S UPPER CASE
	CMP	M	;CHECK IT AGAINST TEXT
	RNZ
	INX	H
	INX	D
	DCR	B
	JNZ	COMPAR
	RET
;
ILPRT	EQU	$+OFFSET
	XTHL
ILPLP	EQU	$+OFFSET
	MOV	A,M
	ORA	A
	JZ	ILPRET
	CALL	CTYPE
	INX	H
	JMP	ILPLP
ILPRET	EQU	$+OFFSET
	XTHL
	RET
;
CTYPE	EQU	$+OFFSET
	PUSH	B
	PUSH	D
	PUSH	H
	MOV	E,A
	MVI	C,COUT
	CALL	BDOS
	POP	H
	POP	D
	POP	B
	RET
;
UCASE	EQU	$+OFFSET
	CPI	061H	;CONVERTS LOWER CASE...
	RC		;IN A TO UPPER CASE
	CPI	07BH
	RNC
	ANI	05FH
	RET
;==================================================
;END OF PROGRAM AREA
;
;STORAGE AREA
;
USRPWD	EQU	$+OFFSET
	DS	080H	;STORAGE FOR INPUT
NEWDRV	EQU	$+OFFSET
	DS	1	;STORE NEW DRIVE
DRVUSR	EQU	$+OFFSET
	DS	1
;
;*****
;THIS IS THE DEFINITION TABLE SECTION.
;
;FORMAT:
;       DB	1,'233333333333334444444444'
;
;BYTE      PURPOSE
;--------- -----------------------------------------
;  1       USER # AND DRIVE  (EXAMPLES FOLLOW):
;	   00H=A0,01H=B0,010H=A1,011H=B1, ETC.
;  2       ACCESS CODE(* FOR PASSWORDED)
;  3-15    USER-AREA NAME
; 16-25    PASSWORD (IF INDICATED IN ACCESS CODE)
;THE EXAMPLES MAY BE CHANGED, ADDED TO OR DELETED
;AS LONG AS THE PROPER FORMAT IS KEPT. ALL ENTRIES
;IN TABLE SHOULD BE IN UPPER CASE.
;
;FORMAT GUIDE...  1, '233333333333334444444444'
TABLE	EQU	$+OFFSET
	DB	00H, ' REMOTE                 '
	DB	01H, ' IWOJIMA                '
	DB	021H,' FILES                  '
	DB	010H,'*RESERVED     SORTX     '           	
	DB	011H,'*SECRET       HOWDY     '
	DB	012H,' KEEP                   '
	DB	0A1H,' HIGHMEM                '
;NOTE: THE FOLLOWING 4 BYTES MUST BE KEPT AT THE
;END OF THIS TABLE!
	DB	0,0,0,0
;
;
;IF YOU WISH TO AUTOBOOT A .COM FILE UPON ENTERING THE
;NEW USER-AREA, SET RUNCOM TO TRUE AND INSERT THE PROPER
;FILE NAME IN COMFIL.
;NOTE: THE .COM FILE YOU CHAIN TO MUST EXIT TO CP/M
;WITH A WARM BOOT OR THE USER-AREA WILL NOT BE CORRECTLY
;SELECTED.
;
COMFIL	EQU	$+OFFSET
	DB	0,'SD      COM'
;                  ^^^^^^^^^^^ <--MUST BE 11 CHARS.
;
CHARP	EQU	$+OFFSET
	DS	2	;NEXT CHAR. ADDRESS POINTER
USRLEN	EQU	$+OFFSET
	DS	1	;LENGTH OF USER-AREA SPECIFIED
NEWUSR	EQU	$+OFFSET
	DS	1	;NEW USER # TO MOVE TO
;
;** THIS MARKS THE END OF THE CODE TO BE RELOCATED.
;
PEND	EQU	$+OFFSET
;
	END
