	NAME	 LOAD
	PAGE	 55,128
	TITLE	'LOAD -- LOAD .COM FILE FOR MS-DOS 2.0'
;
;
; LOAD -- LOAD .COM FILE BIGGER THAN 64K
; REQUIRES MS-DOS 2.0
; VERSION 1.1	DEC 83 RGD
; VERSION 1	MARCH 1983 RJW

; COPYRIGHT (C) 1983
; LABORATORY MICROSYSTEMS
; 4147 BEETHOVEN STREET
; LOS ANGELES, CA  90066
;
CR	EQU	0DH	;ASCII CARRIAGE RETURN
LF	EQU	0AH	;ASCII LINE FEED

CSEG	SEGMENT BYTE

	ORG	100H

	ASSUME	CS:CSEG,DS:CSEG

LOAD	PROC	FAR		; SETS UP FAR RETURN ...

	PUSH	ES		; SAVE SEGMENT OF PSP
	MOV	DX,OFFSET MES2	; STARTUP MESSAGE
	MOV	AH,9
	INT	21H
	XOR	DX,DX		; ZERO DX
	MOV	AH,25H		; SET TERMINATE ADDRESS ...
	MOV	AL,22H		; ... FOR NEW PROGRAM SEGMENT
	INT	21H

	MOV	DX,OFFSET ENDOFS ; OFFSET TO END OF THIS LOADER
	MOV	CL,4		; NO OF BITS TO SHIFT
	SHR	DX,CL		; CONVERT BYTE ADDR TO PARAGRAPH
	INC	DX		; OFFSET OF 1ST AVAILABLE SEGMENT
	MOV	AX,CS		; CURRENT SEGMENT TO AX
	ADD	DX,AX		; ACTUAL VALUE OF 1ST AVAILABLE SEGMENT
	MOV	USEG,DX 	; SAVE IT FOR LATER ...
	MOV	ES,DX		; ... AND FOR SUBSEQUENT MOVE
	MOV	AH,26H		; CALL TO DOS
	INT	21H		; CREATE NEW PROGRAM SEGMENT

	MOV	SI,6CH		; 2ND PARAM FCB IN CURRENT SEGMENT
	MOV	DI,5CH		; 1ST PARAM FCB IN NEW SEGMENT
	MOV	CX,0CH		; BYTE COUNT FOR MOVE
	REPZ MOVSB		; COPY THE FILENAME

	MOV	AX,CS		; COPY CURRENT CODE SEG ...
	MOV	DS,AX		; ... TO DS
	MOV	DX,5CH		; DS:DX POINTS TO FCB OF .COM FILE
	MOV	BX,DX		; MAKE FCB ADDRESSIBLE
	MOV	BYTE PTR  9 [BX],'C' ; FORCE COM EXTENSION
	MOV	BYTE PTR 10 [BX],'O'
	MOV	BYTE PTR 11 [BX],'M'
	MOV	AH,0FH		; OPEN THE .COM FILE
	INT	21H
	OR	AL,AL		; TEST RETURN CODE
	JNZ	LOAD8		; EXIT IF NON-ZERO
	MOV	WORD PTR 33 [BX],0000 ; ZERO THE RANDOM
	MOV	WORD PTR 35 [BX],0000 ; RECORD FIELD IN THE FCB
	POP	ES		; GET LOADER'S PSP SEGMENT
	MOV	BX,USEG 	; LET SS:SP = DEFAULT BUFFER OF
	MOV	SS,BX		; NEW PSP
	MOV	SP,100H
	PUSH	ES		; SAVE LOADER'S PSP AGAIN
	ADD	BX,10H		; BX = SEGMENT OF CURRENT DTA
	MOV	DS,BX		; SET UP DS:DX TO POINT TO THE DTA
	XOR	DX,DX
	MOV	AH,1AH		; SET UP DOS CALL AND DO IT
	INT	21H

LOAD5:	MOV	CX,100H 	; NUMBER OF RECORDS OF LENGTH 80H
	MOV	AX,CS		; COPY CURRENT CS TO DS
	MOV	DS,AX
	MOV	DX,5CH		; DS:DH POINTS TO FCB OF .COM FILE
	MOV	AH,27H		; DO RANDOM BLOCK READ
	INT	21H
	TEST	AL,1		; END OF FILE?
	JNZ	LOAD9		; YES, SO EXIT
	ADD	BX,800H 	; INCREMENT LOCATION OF DTA
	MOV	DS,BX		; COPY TO DS
	XOR	DX,DX		; DS:DX NOW POINTS TO NEXT DTA
	MOV	AH,1AH		; SET UP DOS CALL TO SET DTA
	INT	21H
	JMP	LOAD5		; DO IT AGAIN

LOAD8:	MOV	DX,OFFSET MES1	; "FILE NOT FOUND"
	MOV	AH,9		; WRITE TO TERMINAL
	INT	21H
	INT	20H		; EXIT TO DOS

LOAD9:	MOV	AX,USEG 	; SET UP REGISTERS FOR NEW SEGMENT
	MOV	DS,AX
	POP	ES		; PASS LOADER'S PSP SEGMENT TO OVERLAY
	PUSH	AX		; PUSH NEW CS ONTO STACK
	MOV	AX,100H
	PUSH	AX		; PUSH OFFSET ONTO STACK
	RET			; FAR RETURN CAUSES CS:IP TO BE SET
LOAD	ENDP

MES1	DB	CR,LF,
	DB	'.COM FILE NOT FOUND'
	DB	CR,LF,'$'
MES2	DB	CR,LF
	DB	'MULTI-SEGMENT LOADER VERSION 1.1 FOR MS-DOS 2.0'
	DB	CR,LF
	DB	'COPYRIGHT (C) 1983 LABORATORY MICROSYSTEMS INC.'
	DB	CR,LF,'$'

USEG	DW	0

ENDOFS	EQU	$

CSEG	ENDS			; END OF CODE SEGMENT

	END	LOAD
