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
|
|