home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-02-16 | 27.4 KB | 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
-
-