home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
demo
/
files.dem
< prev
next >
Wrap
Text File
|
1992-02-16
|
28KB
|
1,018 lines
; ----------------------------
; FILES.DEM - Demoprogramm für die Routinen aus FILES.LIB
; (für den A86)
;
; (c) Bernd Schemmer 1990 - 1992
; Letzter Update: 15.02.1992
;
; Übersetzen:
; A86 FILES.DEM DEMOS.INC TO FILES.COM
;
; Hinweis: Die Environment-Variable 'A86' muß den Dateinamen 'MACROS.MAC'
; enthalten und die .LIB-Dateien müssen über die Datei A86.LIB
; erreichbar sein.
;
; ---------------------------
jmp start ; Daten überspringen
logo db CR,LF
db 'FILES.DEM - Demoprogramm für die Routinen aus FILES.LIB'
db CR,LF
db '--------------------------------------------------------'
db CR,LF
GETLENGTH logo
DefString FileName1,65 ; Puffer für einen Dateinamen
DefString FileName2,129 ; Puffer für einen Dateinamen
; (Länge wg. GetFilePathh)
Ask db 0 ; Hilfsvariable
; ----------------------------
start:
call ShowLogo ; Logo ausgeben und Speicherblock verkleinern
l00:
call ShowMenue ; Menue ausgeben
; AL = eingegebene Taste
cld
mov si,offset MenuePunkte
mov bl,al ; BL = eingegebene Taste
l0:
lodsb
or al,al
jz l00 ; Ende der Tabelle erreicht
cmp al,bl
lodsw ; AX = Offset der Routine
jne l0
call ax ; Routine aufrufen
jmp start
Ende:
EndProcess 0
; ----------------------------
; ShowMenue
;
; Funktion: Ausgabe des Menues und Lesen der Eingabe
;
; Ausgabe: AL = eingegebene Taste
;
MenuePunkte db ; Tabelle mit den einzelnen Menuepunkten
db 'X' ; Aufbau: 3 Byte pro Eintrag
dw Offset Ende ; Byte 0 : Ziffer oder Buchstabe des
db ESC ; Menuepunktes
dw Offset Ende ; Byte 1 - 2 : Offset der Routine für den
db 'A' ; Menuepunkt
dw Offset _CopyFile ; Als Endekennung funktioniert ein Eintrag
db 'B' ; mit dem Wert 0 für den Buchstaben.
dw Offset _RenameFile
db 'C'
dw Offset _DeleteFile
db 'D'
dw Offset _ExistFile
db 'E'
dw Offset _SetFileAttributes
db 'F'
dw Offset _GetFileAttributes
db 'G'
dw Offset _GetFileTimeDate
db 'H'
dw Offset _ShowDirectory
db 'I'
dw Offset _TouchFile
db 'J'
dw Offset _GetFileSize
db 'K'
dw Offset _GetFilepath
db 'L'
dw Offset _ShowDirectory1
db 0 ; Endekennung
MaxMenuePunkt EQU 'L' ; letzter Menuepunkt
Menue db CR,LF
db 'Zur Verfügung stehende Routinen:'
db CR,LF
db '--------------------------------'
db CR,LF
db 'A CopyFile B RenameFile C DeleteFile'
db CR,LF
db 'D ExistFile E SetFileAttributes F GetFileAttributes'
db CR,LF
db 'G GetFileDate/GetFileTime H FindFirst/FindNext für Dateien'
db CR,LF
db 'I SetFileDate/SetFileTime J GetFileSize '
db CR,LF
db 'K GetFilePath L FindFirst/FindNext für Directorys'
db CR,LF
db CR,LF
db 'X Ende'
db CR,LF
db CR,LF
db 'Bitte wählen Sie: '
GETLENGTH Menue
SHowMenue:
WRITE_STRING Menue
l0:
mov ah,08h
int 021h ; Taste lesen
cmp al,ESC
je >l1
and al,0DFh ; Eingabe in Großbuchstaben konvertieren
cmp al,'X'
je >l1
cmp al,MaxMenuePunkt
ja l0
cmp al,'A'
jb l0
l1:
push ax ; Eingabe sichern
call ShowCR_LF ; Neue Zeile ausgeben
pop ax ; AX = Eingabe
ret
; ----------------------------
; _TouchFile
;
; Funktion: Setzt das Datum und die Zeit einer Datei auf die akt. Werte
;
MakeMsg TouchFileMsg, 'SETFILEDATE/SETFILETIME - Setzen der Zeit/des Datums einer Datei',CR,LF
MakeMsg TouchFileMsg1, 'Datum und Zeit der Datei aktualisiert.'
MakeMsg TouchFileTError, 'Fehler beim Ändern der Zeit.'
MakeMsg TouchFileDError, 'Fehler beim Ändern des Datums.'
_TouchFile:
mov ask,0FFh
WRITE_STRING TouchFileMsg
call GetFileName1 ; Lesen der Eingabe
mov ah,02Ch
int 021h ; DOS-Zeit ermitteln
; Zeit der Datei setzen
mov si,offset FileName1
call SetFileTime
jnc >l1
; Fehler!
WRITE_STRING TouchFileTError
jmp >l9
l1:
mov ah,02Ah
int 021h ; DOS-Datum ermitteln
; Datum der Datei setzen
mov si,offset FileName1
call SetFileDate
jnc >l1
; Fehler!
WRITE_STRING TouchFileDError
jmp >l9
l1:
WRITE_STRING TouchFileMsg1
call _GetFileTimeDate1
l9:
call ShowCR_LF
call AskUser
if nc jmp _TouchFile
ret
; ----------------------------
; _GetFileSize
;
; Funktion: Ermittelt die Größe einer Datei
;
MakeMsg GetFileSizeMsg, 'GETFILESIZE - Ermitteln der Größe einer Datei ',CR,LF
MakeMsg GetFileSizeError, 'Fehler beim Ermitteln der Dateigröße.'
MakeMsg GetFileSizeMsg1, 'Die Datei ist _____ Byte groß.'
MakeMsg GetFileSizeMsg2, 'Die Datei ist größer als 65.535 Byte.'
_GetFileSize:
WRITE_STRING GetFileSizeMsg
call GetFileName1 ; Lesen der Eingabe
mov si,offset FileName1
call GetFileSize
jc >l8 ; Fehler!
or dx,dx
jz >l1
; Datei ist größer als 65.535 Byte
WRITE_STRING GetFileSizeMsg2
jmp >l9
l1:
; Dateigröße ausgeben
mov di,offset GetFileSizeMsg1+14
call Konvert_AX_To_DezString
WRITE_STRING GetFileSizeMsg1
jmp >l9
l8:
; Fehler beim Ermitteln der Dateigröße
WRITE_STRING GetFileSizeError
l9:
call ShowCR_LF
call AskUser
if nc jmp _GetFileSize
ret
; ----------------------------
; _GetFilePath
;
; Funktion: Fügt einen Dateinamen den Pfad an und splittet diesen
; Eintrag dann in Pfad und Namen auf.
;
MakeMsg Getfilemsg,'GETFILEPATH/PARSEFILENAME - Erweitern und Splitten eines Dateinamens',CR,LF
MakeMsg GetFileMsg2, 'Der vollständige Dateiname lautet: '
MakeMsg GetFileMSG3, CR,LF, 'und das ganze aufgesplittet in Pfad und Namen:'
MakeMsg GetFileerror, CR,LF, 'Fehler beim Ermitteln des Pfades!'
_GetFilePath:
WRITE_STRING GetFilemsg
call GetFileName1 ; Lesen der Eingabe
mov si,offset FileName1 ; Dateinamen um den Pfad erweitern
mov di,offset FileName2
call GetFilePath
jnc >l1
; Fehler
WRITE_STRING GetFileError
jmp GetFilePathNewTry
l1: ; Ergebnis ausgeben
WRITE_STRING GetFileMSg2
mov dx,offset FileName2+1
mov cl,FileName2
xor ch,ch
mov bx,01h
mov ah,040h
int 021h
WRITE_STRING GetFileMSg3
; Dateinamen splitten
mov si,offset FileName2
mov di,offset Filename1
call ParseFileName
mov dx,si ; Ergebnis ausgeben
inc dx
mov cl,[si]
mov bx,01h
mov ah,040h
int 021h
call ShowCR_LF
mov dx,di
inc dx
mov cl,[di]
mov bx,01h
mov ah,040h
int 021h
GetFilePathNewTry:
call ShowCR_LF
call AskUser
if nc jmp _GetFilePath
ret
; ----------------------------
; _ShowDirectory
;
; Funktion: Ausgabe des Directorys
;
;
MakeMsg dirmsg0, 'FINDFIRST/FINDNEXT - Suchen von Dateien nach einer Maske',CR,LF
MakeMsg direrror, 'Fehler beim Suchen!'
MakeMsg dirokay, 'Gefundene Dateien: '
DirDTA db 43 dup 0 ; DTA zum Suchen der Einträge
DirEntry db 0,65 dup 0 ; Puffer für die gefundenen Einträge
Count db 0 ; Zähler für die seitenweise Ausgabe
_ShowDirectory:
WRITE_STRING dirmsg0
mov Count,0 ; Zähler zurücksetzen
call GetFileName1
WRITE_STRING dirokay
; Suchattribute setzen
mov w FindAttribute,DefaultAttr
; Erste Datei suchen
mov si,offset FileName1
mov dx,offset DirDTA
mov di,offset DirEntry
call FindFirst
l0:
jnc >l1
; Fehler aufgetreten
cmp ax,018xD ; Fehler; Keine weiteren Dateien?
je >l9 ; ja
; nein, anderer Fehler
WRITE_STRING direrror
jmp >l9
l1:
; gefundenen Eintrag ausgeben
mov dx,offset direntry+1
mov cl,direntry
xor ch,ch ; CX = Länge des gefundenen Eintrages
mov bx,01h
mov ah,040h
int 021h
call ShowDirEntryData
inc Count
cmp Count,10xD
jb >l1
call ShowPause
mov Count,0
jc >l9
l1:
; nächsten Eintrag ermitteln
mov si,offset FileName1
mov dx,offset DirDTA
mov di,offset DirEntry
call FindNext
jmp l0
l9:
call ShowCR_LF
call AskUser
if nc jmp _ShowDirectory
ret
; ----------------------------
; _ShowDirectory1
;
; Funktion: Ausgabe des Directorys
;
;
MakeMsg dir1msg0, 'FINDFIRST/FINDNEXT - Suchen von Directorys nach einer Maske',CR,LF
MakeMsg dir1error, 'Fehler beim Suchen!'
MakeMsg dir1okay, 'Gefundene Directorys: '
_ShowDirectory1:
WRITE_STRING dir1msg0
mov Count,0 ; Zähler zurücksetzen
call GetFileName1
WRITE_STRING dir1okay
; Suchattribute setzen
mov w FindAttribute,SubDir
; Erstes Directory suchen
mov si,offset FileName1
mov dx,offset DirDTA
mov di,offset DirEntry
call FindFirst
l0:
jnc >l1
; Fehler aufgetreten
cmp ax,018xD ; Fehler; Keine weiteren Einträge?
je >l9 ; ja
; nein, anderer Fehler
WRITE_STRING dir1error
jmp >l9
l1:
; Attribute des Eintrages überprüfen
mov bx,offset DirDTA
mov cl,_DTAAttr[bx] ; CL = Attribute des Eintrages
test cl,SubDir
jz >l1 ; kein Directory
; gefundenen Eintrag ausgeben
mov dx,offset direntry+1
mov cl,direntry
xor ch,ch ; CX = Länge des gefundenen Eintrages
mov bx,01h
mov ah,040h
int 021h
call ShowDirEntryData
inc Count
cmp Count,10xD
jb >l1
call ShowPause
mov Count,0
jc >l9
l1:
; nächsten Eintrag ermitteln
mov si,offset FileName1
mov dx,offset DirDTA
mov di,offset DirEntry
call FindNext
jmp l0
l9:
call ShowCR_LF
call AskUser
if nc jmp _ShowDirectory1
ret
; ----------------------------
; ShowDirEntryData
;
; Funktion: Ausgabe der Daten eines Diretory-Eintrages
;
DirEntryData db CR,LF
db ' ==> Attribute: '
DirEntryAttr db '_____, Datum: '
DirEntryDate db '__.__.__ Zeit: '
DirEntryTime db '__:__:__, Größe: '
DirEntryLen db '_____'
db CR,LF
GetLength DirEntryData
ShowDirEntryData:
push ax,bx,cx,dx
mov bx,offset DirDTA ; DS:BX -> DTA
mov dx,_DTADate[bx] ; DX = Datum im Datei-Format
; Datum ins DOS-Format konvertieren
call FileDateToDOSDate
; Datum in die Meldung eintragen
mov al,dl
mov di,offset DirEntryDate
call StoreAL
mov al,dh
inc di
call StoreAL
sub cx,1900xD
mov al,cl
inc di
call StoreAL
mov cx,_DTATime[bx] ; CX = Zeit im Datei-Format
; Zeit ins DOS-Format konvertieren
call FileTimeToDOSTime
; Zeit in die Meldung eintragen
mov al,ch
mov di,offset DirEntryTime
call StoreAL
mov al,cl
inc di
call StoreAL
mov al,dh
inc di
call StoreAL
mov ax,_DTALength[bx]
cmp w _DTALength[bx+2],0
jz >l1
; Directory zu groß für dieses Demo
mov w DirEntryLen,'__'
mov w DirEntryLen+2,'__'
mov b DirEntryLen+4,'_'
jmp >l2
l1:
mov di,offset DirEntryLen
call Konvert_AX_TO_Dezstring
l2:
mov cl,_DTAAttr[bx] ; CL = Attribute des Eintrages
mov di,offset DirEntryAttr
call KonvertAttributesToString
Write_String DirEntryData
pop dx,cx,bx,ax
ret
; ----------------------------
; _GetFileTimeDate
;
; Funktion: Ermittelt das Datum und die Zeit einer Datei
;
MakeMsg TimeDatePrompt, 'GETFILEDATE/GETFILETIME - Ermitteln des Datums und der Zeit einer Datei',CR,LF
MakeMsg TimeDateError, 'Fehler beim Ermitteln der Werte!'
TimeDateOkay db 'Die Datei wurde zuletzt am '
_Date db '__.__.__ um '
_Time db '__.__.__ Uhr verändert.'
db CR,LF
GETLENGTH TimeDateOkay
_GetFileTimeDate:
mov ask,0
WRITE_STRING timedatePrompt
call GetFileName1 ; Dateinamen lesen
_GetFileTimeDate1: ; Einsprungpunkt von TouchFile
mov si,offset FileName1
call GetFileDate ; Datum ermitteln
jc >l1
; Datum in die Meldung eintragen
mov al,dl
mov di,offset _date
call StoreAL
mov al,dh
inc di
call StoreAL
sub cx,1900xD
mov al,cl
inc di
call StoreAL
mov si,offset FileName1
call GetFileTime ; Zeit ermitteln
jc >l1
; Zeit in die Meldung eintragen
mov al,ch
mov di,offset _time
call StoreAL
mov al,cl
inc di
call StoreAL
mov al,dh
inc di
call StoreAL
WRITE_STRING TimeDateOkay
jmp >l2
l1:
WRITE_STRING TimeDateError
l2:
cmp ask,0
jne ret
call AskUser ; Nochmal?
IF nc jmp _GetFileTimeDate
ret
; ----------------------------
; _CopyFile
;
; Funktion: Kopiert eine Datei
;
MakeMsg CopyFilePrompt,'COPYFILE - Kopieren einer Datei',CR,LF
MakeMsg CopyError0, 'Fehler: Zuwenig Speicher zum Kopieren!'
MakeMsg CopyFileError, 'Fehler beim Kopieren!'
MakeMsg CopyFileOkay, 'Datei kopiert.'
CopyPufferTable dw 0,0,0 ; Tabelle für CopyFile
_CopyFile:
WRITE_STRING CopyFilePrompt
; Testen, ob der Puffer schon ermittelt ist
cmp CopyPufferTable,0
jne >l1 ; Puffer schon initialisiert
; Puffer muß noch ermittelt werden
call InitCopyPuffer ; Speicher für den Puffer ermitteln
jnc >l1
; Fehler: Puffer konnte nicht bereitgestellt
; werden!
WRITE_STRING CopyError0
jmp >l9 ; und raus
l1:
call GetFileName1 ; Namen der Quelldatei ermitteln
call GetFileName2 ; Namen der Zieldatei ermitteln
; Datei kopieren
mov si,offset filename1
mov di,offset filename2
mov bx,offset copyPufferTable
call CopyFile
jc >l1
; okay
WRITE_STRING CopyFileOkay
jmp >l2
l1: ; Fehler
WRITE_STRING CopyFileError
l2:
call AskUser ; Nochmal ?
if nc jmp _CopyFile ; ja
l9:
ret
; ----------------------------
; InitCopyPuffer
;
; Funktion: Bereitstellen eines Puffers für die Copy-Funktion
;
; Ausgabe: CF = 1 -> Fehler, Puffer konnte nicht bereitgestellt werden
; CF = 0 -> okay, Puffer-Tabelle gefüllt
;
InitCopyPuffer:
; Speicher anfordern
mov bx,01000h ; 1 Segment (= Maximum)
mov ah,048h
int 021h
jnc >l1 ; kein Fehler
or bx,bx ; Zur Vorsicht!
stc
jz >l9
; Fehler, kein Segment mehr frei
mov ah,048h ; nehmen wir was wir kriegen können (steht in BX)
int 021h
jc >l9 ; Fehler raus
l1: ; Puffertabelle füllen
mov w CopyPufferTable,ax ; Segment des Puffers eintragen
mov w CopyPufferTable+2,0 ; Offset des Puffers eintragen
shl bx,1
shl bx,1
shl bx,1
shl bx,1 ; BX = Größe des Puffers in Byte
or bx,bx
if z mov bx,0FFFFh
mov CopyPufferTable+4,BX ; Größe eintragen
l9:
ret
; ----------------------------
; _RenameFile
;
; Funktion: Benennt eine Datei um
;
MakeMsg RenameFilePrompt, 'RENAMEFILE - Umbenennen einer Datei',CR,LF
MakeMsg RenameFileError, 'Fehler beim Umbenennen!'
MakeMsg RenameFileOkay, 'Datei umbenannt.'
_RenameFile:
WRITE_STRING RenameFilePrompt
call GetFileName1 ; Namen der Quelldatei ermitteln
call GetFileName2 ; Namen der Zieldatei ermitteln
; Datei kopieren
mov si,offset filename1
mov di,offset filename2
call RenameFile
jc >l1
; okay
WRITE_STRING RenameFileOkay
jmp >l2
l1: ; Fehler
WRITE_STRING RenameFileError
l2:
call AskUser ; Nochmal?
jnc _RenameFile
l9:
ret
; ----------------------------
; _ExistFile
;
; Funktion: Feststellen, ob eine Datei exisitiert
; Findet keine Geräte
;
MakeMsg ExistFilePrompt, 'EXISTFILE - Feststellen, ob eine Datei existiert',CR,LF
MakeMsg ExistFileError, 'Angegebene Datei existiert nicht!'
MakeMsg ExistFileOkay, 'Angegebene Datei existiert.'
_ExistFile:
WRITE_STRING existfilePrompt
call GetFileName1 ; Dateinamen lesen
mov si,offset FileName1
call ExistFile
jc >l1
; Datei existiert
WRITE_STRING ExistFileOkay
jmp >l2
l1:
WRITE_STRING ExistFileError
l2:
call AskUser ; Nochmal?
jnc _ExistFile
ret
; ----------------------------
; _DeleteFile
;
; Funktion: Löschen einer Datei
;
MakeMsg DeleteFilePrompt, 'DELETEFILE - Löschen einer Datei',CR,LF
MakeMsg DeleteFileError, 'Fehler beim Löschen der Datei!'
MakeMsg DeleteFileOkay, 'Angegebene Datei gelöscht.'
_DeleteFile:
WRITE_STRING DeletefilePrompt
call GetFileName1
mov si,offset FileName1
call DeleteFile
jc >l1
; Datei gelöscht
WRITE_STRING DeleteFileOkay
jmp >l2
l1: ; Fehler
WRITE_STRING DeleteFileError
l2:
call AskUser ; Nochmal?
jnc _DeleteFile
ret
; ----------------------------
; _GetFileAttributes
;
; Funktion: Ermittelt die Attribute einer Datei
;
MakeMsg GetFileAttributesPrompt, 'GETATTRIBUTES - Ermittelt die Attribute einer Datei',CR,LF
MakeMsg GetFileAttributesError, 'Fehler beim Ermitteln der Attribute!'
MakeMsg GetFileAttributesOkay, 'Attribute der Datei sind: ______'
GetError db 0 ; Hilfsvariable für _SetFileAttributes
SaveAttr dw 0 ; Sichern der Attribute für _SetFileAttributes
; ------------------
_GetFileAttributes:
mov ask,0 ; Aufrufschalter auf 0
mov GetError,0 ; Fehler-Variable auf 0
WRITE_STRING GetFileAttributesPrompt
call GetFileName1 ; Dateinamen lesen
_GetFileAttributes1: ; Einsprungpunkt für SetFileAttributes
mov si,offset FileName1
xor al,al
call GetSetAttributes
jc >l1
; Attribute ermittelt
; Attribute in eine lesbare Form bringen
; AX = Attribute
mov SaveAttr,ax ; Attribute für _SetFileAttributes sichern
mov cx,ax ; Attribute nach CX
mov di,offset GetFileAttributesOkay+26
mov ah,'_'
call KonvertAttributesToString
WRITE_STRING GetFileAttributesOkay
jmp >l2
l1: ; Fehler
mov GetError,0FFh ; Fehlermarker setzen (für _SetFileAttributes)
WRITE_STRING GetFileAttributesError
l2:
cmp ask,0
jne >l9 ; wurden von _SetFileAttributes aufgerufen
call AskUser ; Nochmal?
if nc jmp _GetFileAttributes
l9:
clc
ret
; ----------------------------
; _SetFileAttributes
;
; Funktion: Setzen der Attribute einer Datei
;
MakeMsg SetFileAttributesPrompt, 'SetAttributes - Setzen der Attribute einer Datei',CR,LF
MakeMsg SetFileAttributesPrompt1, 'Zuerst die alten Attribute ermitteln ...'
MakeMsg SetFileAttributesError, 'Fehler beim Setzen der Attribute!'
MakeMsg SetFileAttributesError1, 'Fehler beim Lesen der Attribute!'
MakeMsg SetFileAttributesOkay, 'Attribute geändert'
MakeMsg1 AttributesPrompt, 'Bitte die neuen Attribute eingeben (ÜBERSCHREIBEN die alten!): '
Attributes db 07,07 dup 0 ; Puffer für die neuen Attribute
_SetFileAttributes:
mov ask,1 ; Schalter von _GetFileAttributes setzen
mov GetError,0 ; Fehlermarker auf 0
WRITE_STRING SetFileAttributesPrompt
call GetFileName1
WRITE_STRING SetFileAttributesPrompt1
call _GetFileAttributes1
cmp GetError,0
if ne jmp SetEnd ; Attribute konnten nicht ermittelt werden
; Neuen Attribute einlesen
WRITE_STRING AttributesPrompt
mov dx,offset Attributes
mov ah,0Ah
int 021h
call ShowCR_LF
; Neue Attribute konvertieren
mov si,offset Attributes
inc si
lodsb ; AL = Anzahl der eingegebenen Attribute
mov cl,al
xor ch,ch
xor bx,bx
jcxz >l2
l0:
lodsb
and al,0DFh ; Zeichen in Großbuchstaben wandeln
cmp al,'A'
if e or bx,20h ; Archiv
cmp al,'S'
if e or bx,04h ; System
cmp al,'H'
if e or bx,02h ; Hidden
cmp al,'R'
if e or bx,01h ; ReadOnly
loop l0
l2:
mov cx,bx ; CX = neue Attribute
mov si,offset FileName1
mov al,01
call GetSetAttributes
jc >l1
; Attribute gesetzt
WRITE_STRING SetFileAttributesOkay
; neue Attribute nochmal ausgeben
call _GetFileAttributes1
jmp >l2
l1: ; Fehler
WRITE_STRING SetFileAttributesError
l2:
SetEnd:
call AskUser
if nc jmp _SetFileAttributes
ret
; ----------------------------
; AskUser
;
; Funktion: Einlesen von JA oder NEIN
;
; Ausgabe: CF = 1 ->> Nein eingegeben
; CF = 0 ->> Ja eingegeben
;
AskUserPrompt db CR,LF
db 'Noch einmal? '
GETLENGTH AskUserPrompt
AskUser:
WRITE_STRING AskUserPrompt
l0:
mov ah,08h
int 021h
call ShowCR_LF
cmp al,CR
je >l1
cmp al,ESC
je >l2
and al,0DFh ; AL in Großbuchstaben konvertieren
cmp al,'J'
je >l1
cmp al,'N'
jne l0
l2: ; nein
stc
ret
l1: ; ja
clc
ret
; ----------------------------
; GetFileName1
;
; Funktion: Liest den ersten Dateinamen ein
;
MakeMsg Prompt1, 'Bitte den Namen der 1. Datei (Quelldatei) eingeben: '
GetFileName1:
WRITE_STRING prompt1
mov si,offset filename1
jmp >l1
; ----------------------------
; GetFileName2
;
; Funktion: Liest den zweiten Dateinamen ein
;
MakeMsg Prompt2, 'Bitte den Namen der 2. Datei (Zieldatei) eingeben: '
GetFileName2:
WRITE_STRING prompt2
mov si,offset filename2
l1:
call GetFileName
ret
; ----------------------------
; GetFileName
;
; Funktion: Liest einen Dateinamen ein
;
; Eingabe: DS:SI -> Puffer für den Dateinamen
;
GetFileName:
dec si
mov al,[si] ; Zeichen sichern
push ax
mov b[si],64
mov dx,si ; Dateiname lesen
mov ah,0Ah
int 021h
pop ax
mov [si],al ; Zeichen vor dem Namen wieder restaurieren
call ShowCR_LF
ret
; ----------------------------
; KonvertAttributesToString
;
; Funktion: Konvertiert die Attribute einer Datei zu einem String
;
; Eingabe: CL = Attribute
; ES:DI -> Puffer für den String (6 Zeichen)
;
AttrStr db 'ADVSHR' ; Zeichen für die Attribute
MaxAttribut EQU 020h
KonvertAttributesToString:
push bx,dx,si
mov dl,MaxAttribut
mov ah,'_'
mov si,offset AttrStr
l00:
lodsb
test cl,dl ; Attribut gesetzt?
if z mov al,ah
stosb
shr dl,1 ; nächstes Attribut
jnc l00
pop si,dx,bx
ret
; ----------------------------
; StoreAL
;
; Funktion: Konvertiert AL in einen zweistellige Dezimalstring
;
; Eingabe: AL = zu konvertierender Wert
; ES:DI -> Puffer für den Dezimalstring
;
StoreAL:
push bx
xor ah,ah
mov bl,0Ah
div bl
add ax,'00'
stosw
pop bx
ret