Source file: /~heha/vt/viewers/vt080.zip/src/s.asm

	ideal

macro SKEND	;;Suche Stringende von DS:SI
	local	sk1
sk1:	lodsb
	or	al,al
	jnz	sk1
	endm

macro _GETENV		;GetEnvVar(PChar):PChar, CY=1: Fehler
			;Voraussetzung: ENV existiert!
proc getenv
	mov	es,[2ch]
	xor	di,di
	xor	ax,ax
	cld
	jr	@@f
@@l:
	push	si
@@1:	 lodsb
;	 call	UpCase	;tja, richtig oder falsch?
	 or	al,al
	 jz	@@2
	 scasb
	 jz	@@1
	pop	si
	jr	@@3
@@2:
	 mov	al,'='
	 scasb
	pop	si
	je	@@e		;gleich
@@3:				;ungleich
	dec	di
	mov	al,ah		;AL=0
@@4:	scasb
	jnz	@@4
	jr	@@l
@@f:	;Fußgesteuerte While-Schleife
	cmp	[by es:di],1	;Ende Env?
	jnc	@@l
@@e:	ret
	endp
	endm

macro _SEEKNAME		;Sucht Dateinamen selbst im kompletten Pfad (DS:SI)
proc SeekName
	cld
	push	dx
	mov	dx,si	;merken
	SKEND		;Ende suchen
	jr	@@f
@@l:
	mov	al,[si-1]
	cmp	al,'/'
	jz	@@e
	cmp	al,'\'
	jz	@@e
	cmp	al,':'
	jz	@@e
@@f:	dec	si
	cmp	si,dx
	jnz	@@l
@@e:	pop	dx
	ret
	endp
	endm

macro _PATHCOPY		;Pfad-Copy kopiert nur den Pfad aus DS:SI nach ES:DI
			;DI zeigt am Ende hinter die Null, SI zeigt auf Name
			;(fast schon ein perfektes FSPLIT, oder?)
	_SEEKNAME
proc PathCopy
	push	cx dx
	mov	dx,si
	call	SeekName
	mov	cx,si
	sub	cx,dx
	xchg	si,dx
	rep	movsb		;schaufeln, notfalls 0 Bytes
	xor	al,al
	stosb			;Abschluß-Null
	xchg	dx,si
	pop	dx cx
	ret
	endp
	endm

macro _SEEKEXT		;Extension suchen, CY=1 wenn keine vorhanden
proc SeekExt
	cld
	call	SeekName
@@se1:	lodsb
	cmp	al,1
	jc	@@see
	cmp	al,'.'
	jnz	@@se1
@@see:	dec	si
	ret
	endp
	endm

macro _SEEKINPATH	;Sucht DS:DI im Pfad (endlich mal was richtiges!)
	;benötigt _STRCPX, _STRCPR, _SEEKNAME und _SEEKEXT
	;ES:DI: Pufferspeicher Rückgabestring
proc SeekInPath
@@dta	equ	bp-2ch
@@oldta	equ	dwo bp-30h
@@path	equ	dwo bp-34h
@@name	equ	dwo bp-38h
@@src	equ	dwo bp-3ch
@@dest	equ	dwo bp-40h
	cld
	entr	38h	;2ch für DTA, 4 für Adresse zum alten DTA
			;4 für PATH-Adresse, 4 für Quell-Adresse
	push	ds si es di bx dx
;	sds	<@@src>,si
;	ses	<@@dest>,di
	DOS	2fh	;GetDTA
	ses	<@@oldta>,bx
	LD	ds,ss
	lea	dx,[@@dta]
	DOS	1ah	;SetDTA
	lds	si,[@@src]
	les	di,[@@dest]
	call	StrCpy
	call	@@ff	;hidden, system, r/o seien erlaubt!
	jnc	@@e	;bereits alles OKAY!
	lds	si,[@@src]
	mov	dx,si
	call	SeekName
	sds	<@@name>,si
	sub	si,dx
	jz	@@1
	cmp	si,2
	stc
	jnz	@@e	;Fehler, da Pfad angegeben wurde
	mov	si,dx
	cmp	[by si+1],':'	;Laufwerksbezeichner?
	stc
	jnz	@@e
@@1:	LD	ds,cs
	mov	si,ofs @@path$
	call	GetEnv
	jc	@@e	;Armer Rechner! (Kein PATH definiert)
	ses	<@@path>,di

@@3:	lds	si,[@@path]
	cmp	[by si-1],1
	jc	@@e		;raus mit Fehler
	les	di,[@@dest]
	mov	ah,';'
	call	StrCpH
	sds	<@@path>,si	;Neue Position speichern
	mov	[by es:di-1],'\';auf die Null drauf
	lds	si,[@@name]
	call	StrCpy
	call	@@ff		;FindFirst
	jc	@@3
@@e:	pushf
	 lds	dx,[@@oldta]
	 DOS	1ah	;SetDTA
	popf
;	lds	si,[@@src]
;	les	di,[@@dest]
	pop	dx bx di es si ds
	leav
	ret

@@ff:	;Spezielles FindFirst via @@dest und evtl. Suffix anbammeln
	 lds	si,[@@dest]
	 mov	dx,si
	 call	SeekExt
	 jnc	@@ff1	;Yeah, da is shoa eine Extension!
	 LD	es,cs
	 mov	di,ofs @@com$
	 push	si
	  call	StrCpR	;Revers!
	  call	@@ffu
	 pop	si
	 jnc	@@ffe	;Schon gefunden!
	 call	StrCpR	;jetzt kommt die Echse!
@@ff1:	 call	@@ffu
@@ffe:	ret

@@ffu:	push	cx
	 mov	cx,7
	 DOS	4eh
	pop	cx
	ret

@@com$	db	'.COM',0
	db	'.EXE',0
@@path$	db	'PATH',0
	endp
	endm

macro _STRCPY		;StringCopy normal dx:si->es:di
strcpy:
	lodsb
	stosb
	or	al,al
	jnz	strcpy
	ret
	endm

macro _STRCPR		;StringCopy revers
	_STRCPY
strcpr:	xchg	si,di
	EX	ds,es
	call	strcpy
	EX	ds,es
	xchg	si,di
	ret
	endm

Detected encoding: OEM (CP437)1
Wrong umlauts? - Assume file is ANSI (CP1252) encoded