Source file: /~heha/hs/dos/dosmisc.zip/SRC/APP.ASM

;Programm FileModeBugFix gegen das FileMode-Syndrom
;und nun auch gegen das Fernstart-Syndrom
;als Vorläufer zum nie fertigwerdenden EXE.COM
;Aufruf: fmfix <programmname> <parameter>
;P.S.: Hiermit kann man auch Nicht-EXE-Programme mit MZ-Header
;ohne Umbenennung zum Abarbeiten bringen!

	ideal
	include	"prolog.asm"
	include	"strings.asm"
	mov	[parseg],ds
	;Kommandozeile abscannen
	cld
	mov	si,81h
	mov	di,80h
	mov	cl,[di]
sk1:	lodsb
	dec	cl
	cmp	al,0dh		;Ende?
	jz	help
	cmp	al,21h
	jc	sk1		;Trennzeichen
	cmp	al,'?'
	jnz	sk41
help:	PRINT	msgH
	xor	ax,ax
	jmp	hlp

sk41:	dec	si
	inc	cl
sk4:	movsb			;um 1 Zeichen vorkopieren
	dec	cl		;immer restliche Zeichen mitzählen
	cmp	[byte si],21h
	jnc	sk4
	;80h steht Dateiname
	;SI= ^Parameter
	;DI= ^Ende Dateiname+1
	dec	si
	mov	[si],cl		;Abschlußzeichen
	;SI= ^Parameter MIT Anzahl Bytes

	mov	[byte di],0	;Endekennung
	mov	[parofs],si
	mov	sp,100h		;erst DEC, dann Schreiben! (wie Z80)

	mov	bx,(ResEnd-PSPOrg+0fh)/16 ;Paragrafengleichung
	mov	ah,4ah
	int	21h		;Speicherblockgröße verändern

	push	es
	mov	ax,3521h
	int	21h		;alten Vektor retten
	mov	[word OldInt21+2],es
	mov	[word OldInt21],bx
	pop	es

	mov	dx,offset NewInt21
	mov	ax,2521h
	int	21h		;neuen Vektor setzen

	mov	dx,80h		;Name wurde vorkopiert
	call	skbksl		;schiebt SI auf Namen
	mov	[fname],si
	mov	bx,offset params
	mov	ax,4b00h
	int	21h		;starten
	mov	bx,cs
	mov	ss,bx
	mov	sp,100h
	mov	ds,bx
	mov	bl,al		;Exit- oder Errorcode
	jnc	bye

	PRINT	msgE
	mov	al,bl
	call	ahex
bye:
	lds	dx,[OldInt21]
	mov	ax,2521h
	int	21h		;alte Vektoren rücksetzen
	mov	al,bl
hlp:	mov	ah,4ch		;Programmende
	int	21h

proc skbksl	;Suche Backslash, Dateinamensanfang=DS:DX
	mov	si,dx
	cld
@@1:
	lodsb
	or	al,al
	jnz	@@1
@@2:
	dec	si
	cmp	si,dx
	jz	@@3
	mov	al,[si-1]
	cmp	al,':'
	jz	@@3
	cmp	al,'/'
	jz	@@3
	cmp	al,'\'
	jnz	@@2
@@3:
	ret
	endp

	_STRCPY			;uses StringCopy

toi:	popf
	jmp	ToOldInt21
NewInt21: ;DOS-Interrupt
	pushf
	cmp	ah,38h
	jc	toi
	cmp	ah,5ch
	jnc	toi
	mov	[cs:membx],bx
	mov	[cs:memes],es
	popf
	mov	[cs:fkt],ax
	sti
	pushf
	CALLF			;ein Call Far!!!
OldInt21 dd	?
	jnc	intrt		;Ohne Fehler: Kein Zweifel
	pushf
	cmp	[by cs:fkt+1],3dh ;Öffnen?
	je	ifo
	cmp	[by cs:fkt+1],43h ;Attrib?
	je	ifo
	cmp	[by cs:fkt+1],5bh ;Neue Datei?
	je	ifo
	cmp	[by cs:fkt+1],4bh ;ausführen?
	je	ifa
	cmp	[by cs:fkt+1],4eh ;ff?
	jne	ma2
	cmp	al,12h		;No more files?
	jz	ifa
ma2:
	push	ax
Intret:	pop	ax
	popf
intrt:	sti			;sicherheitshalber
	retf	2
ifo:
	cmp	al,5		;Access denied?
	jz	if5
ifa:
	push	si di es cs
	pop	es		;ES=CS
	mov	di,[cs:fname]
;	call	skbksl		;Backslash-Suche
 mov	si,dx		;ersatzweise
	call	StrCpy		;hinter den Pfad!
	pop	es di si
	mov	ax,[cs:fkt]
	cmp	ah,4bh		;ausführen?
	jz	ifad		;Ausführungs-Debakel! Gnadenlos anspringen!
	popf
	push	dx ds cs
	pop	ds
	mov	dx,80h
	call	outstr
	cmp	ah,3eh	;Öffnen?
	jnz	ta1
	mov	al,0	;NUR ZUM LESEN
ta1:	sti
	pushf
	call	[OldInt21]	;DS=CS-Einsparung von Override CS:
	pop	ds dx
	jr	Intrt
ifad:
	popf
	push	cs
	pop	ds
	mov	dx,80h
	mov	es,[memes]
	mov	bx,[membx]
	sti
ToOldInt21:
	jmp	[cs:OldInt21]	;Kehrt sowieso nie mit korrekten Regs zurück!
if5:
	push	ax
	mov	ax,[cs:fkt]
	and	al,0fh		;Nur unteres Nibble
	cmp	al,2
	jc	IntRet
	mov	ax,[cs:fkt]
	and	al,0f0h		;FileMode:=0!
	add	sp,4
	jmp	NewInt21

outstr:	push	si ax
	mov	si,dx
	cld
outs2:	lodsb
	or	al,al
	jz	outse
	VID	0eh
	jr	outs2
outse:	pop	ax si
	ret
;-------------- Allgemeine UP-Sammlung ----------
ahex:	push	ax		;Werte erhalten
	mov	cl,4		;oberes Nibble auf Bit 3...0
	shr	al,cl		; schieben
	call	ahex1
	pop	ax
ahex1:	and	al,0fh
	add	al,90h		;Hex -> ASCII
	daa
	adc	al,40h
	daa
	mov	dl,al
	mov	ah,2
	int	21h
	ret

fname	dw	?
params	dw	0
parofs	dw	80h
parseg	dw	?

fkt	dw	0
membx	dw	?
memdx	dw	?
memds	dw	?
memes	dw	?
msgE	db	'DOS-Fehler #$'

ResEnd:	;Ab hier von Tochter überschreibbar

msgH	db	'APPend + FileModeBugFix gegen Fernstart- und FileMode-Syndrom!!',nl
	db	'Version 1.0 von haftmann#software       +++ Public Domain +++',nl,10
	db	'Gebrauch: app programmname [parameter]',nl
	db	'z.B. app bsp.exe, also ganz einfach!',nl
	db	'(Vollständiger Name mit Erweiterung notwendig!)',nl
	db	'In dieser Version bitte nur *ausführbare* Programme angeben, also z.B.',nl
	db	'KEINE Batch-Dateien!!!',nl
	db	'(Das FileMode-Syndrom hat seine Ursache in Turbo Pascal, wo der Programmierer',nl
	db	' häufig vergißt, beim Lesen einer untyp. Datei die Zeile "FileMode:=0;"',nl
	db	' vor dem Öffnen {"Reset(f,1);"} einzufügen!)',nl
	db	' Außerdem kann man jetzt auf DOS APPEND gut verzichten.',nl,'$'
;
	END	COMentry
Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded