page ,132
.model small,Pascal
    .286
    .stack 4096
    includeLib OS2

    extrn DosExecPgm:Far
    extrn DosExit:Far
    extrn DosWrite:Far

cbFail = 50

    .data

returnCode dw 0,0

slmName db "slm.exe", 0

errExe	db "Couldn't find SLM.EXE", 10, 13
cbErrExe = $ - errExe

    .code

main:
    push    Ax
    push    Bx
    call    exeSLM

exeSLM	proc pArgs:far ptr byte

	local pgmName[1024]:byte, failBuff[cbFail]:byte
	local offArgs

	mov	offArgs,bx
	lea	si,[bx-2]

	push	ds
	pop	es
	mov	ds,ax		;get parmater segment
assume ds:nothing
	lea	cx,pgmName
	mov	di,cx
	std			;look backwards for program name path
@@:
	lodsb
	or	al,al
	jne	@B
	inc	si
	inc	si
	mov	dx,si
	mov	bx,di		;Bx points past D:
	cmp	byte ptr [si].2,':'
	jne	@F
	add	bx,2
	add	dx,2
@@:
	cld

moveLoop:
	lodsb
	stosb
	cmp	al,'\'
	jne	@F
	mov	bx,di		;Save address of last \ ;
	mov	dx,si
@@:
	or	al,al
	jne	moveLoop
@@:
	; Now insert SLM.EXE at Bx

	push	ds

	push	es
	pop	ds
	mov	si,offset slmName
	mov	di,Bx
	mov	cx,8
	repnz	movsb

	mov	si,dx		; pointer to self name
	pop	ds

	; insert copy self name in front of the first argument

@@:
	lodsb
	stosb
	cmp	al,'.'
	je	@F
	or	al,al
	jne	@B
@@:
	dec	di
	mov	al,' '		 ; space terminate program name
	stosb

	mov	si,offArgs

	; copy the rest of the command line arguments
	; but first, burn argument 1, which is program name

@@:
	lodsb
	or	al,al
	jne	@B
@@:
	lodsb
	stosb
	or	al,al
	jne	@B

	push	es
	pop	ds
	assume	ds:@Data

	; we now have assembled a new program name and arguments,
	; so do the exe

	push	ss
	lea	ax,failBuff
	push	ax
	push	cbFail

	push	0			;save return value

	push	ss			;arguments, as augmented
	lea	ax,pgmName
	push	ax

	push	word ptr (pArgs+2)	;environment, as given
	push	0

	push	ss			;place for return code
	push	offset returnCode

	push	ss
	push	ax			;file name

	call	DosExecPgm
	or	ax,ax
	je	@F

	;failed to exec, so printout error message

	push	1
	push	ds
	push	offset errExe
	push	cbErrExe

	push	ds
	push	offset slmName
	call	DosWrite

	mov	word ptr (returnCode+2),-1
@@:
	push	1
	push	word ptr (returnCode+2)
	call	DosExit
exeSLM endp

    end 	main