;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
Vorgefundene Kodierung: OEM (CP437) | 1
|
|