cseg segment
	org 02ch
	envseg dw ?
        assume cs:cseg, ds:cseg         ; Dies ist ein .COM Programm
        org 100h

start:  
        mov     bx,     offset ende     ; allen nicht benoetigten Speicher
        add     bx,     0fh             ; freigeben (ein COM-Programm bekommt
        shr     bx,     1               ; standardmaessig allen verfuegbaren
        shr     bx,     1               ; DOS-Speicher...)
        shr     bx,     1
        shr     bx,     1
        mov     ah,     4ah
        int     21h

	cld
	mov	ax,	[envseg]
	mov	ds,	ax
	xor	di,	di
next:	mov	dl,	[di]
	inc	di
	and	dl,	dl
	jnz	next
	mov	dl,	[di]
	inc	di
	and	dl,	dl
	jnz	next
	add	di,	2

	mov	bx,	di
	push	ds
	push	di			; merken: Anfang Pfad
cont:	mov	dl,	[di]
	inc	di
	cmp	dl,	0
	je	nzero
	cmp	dl,	'\'
	jne	cont
	mov	bx,	di
	jmp	cont
nzero:	mov	di,	bx
	mov	si,	offset secude
	push	ds
	pop	es
	push	cs
	pop	ds
	mov	cx,	SECUDEl
	rep	movsb
	xor	al,	al
	stosb

	push    cs                      ; ES angleichen
        pop     es

	mov     ah,     3ch             ; Datei erzeugen/leeren & oeffnen
        xor     cx,     cx
        mov     dx,     offset ename    ; Name steht in ename
        int     21h
        jc      exit                    ; bei Fehler: EXIT
        mov     [hdl],  ax              ; Handle speichern


        mov     ah,     46h             ; Hauptzweck:
        mov     bx,     [hdl]           ; Handle 2 (stderr) an
        mov     cx,     2               ; Handle 1 (stdout)
        int     21h                     ; angleichen...

        mov     bx,     offset param    ; Vorbereitungen fuer EXEC
        mov     ax,     ds              ; Parameterblock initialisieren
        mov     [bx+4], ax
        mov     [bx+8], ax
        mov     [bx+12],ax
        mov     ax,     4b00h           ; und EXEC...
	pop	dx
	pop	ds
	;        mov     dx,     offset fname
        int     21h

        mov     ah,     4dh             ; Exit-Code holen (in al)
        int     21h

exit:   mov     ah,     4ch             ; und selbst damit beenden
        int     21h


SECUDEl	= 10
secude:	db "secude.exe"
ename:  db "secude.log",0
hdl	dw 1

        ; Anfang eines Parameterblocks fuer EXEC, muss noch
        ; initialisiert werden
        ; uebernimmt Environment/Parameter/FCBs von Stub
param:  dw 0, 80h, 0, 5ch, 0, 6ch, 0
ende:

cseg ends
end start
