lfnopen - ein Makroentwurf für die Funktion 716ch
Der Aufruf der Funktion 716ch ist etwas unübersichtlich. Für meine Belange habe ich ein Macro geschrieben, um den Aufruf übersichtlicher zu gestalten. Das Macro mag als Anregung dienen. Es wurde von mir nicht vollständig getestet.
Makroname | Dateiname | Aktion | Zugriffsart | Zugriffssperre (Sharing Mode) | Attribut (Zahl)
|
---|
lfnopen
| dateiname
si
| a (von „append”)
n (von „new”)
o (von „old”)
| r (von „read”)
rw(von „read and write”)
w(von „write”)
wr(von „write and read”)
| w- (von „write -”)
r- (von „read -”)
rw- (von „read and write -”)
rw+ (verweigert nichts)
none (ohne Angabe)
| Zahl mit Bitbelegung
|
Dateiname: Der Dateiname ist eine Null-terminierte ASCII-Zeichenkette im DS-Segment. Angegeben wird deren Label. Wahlweise kann deren Offsetadresse im DS-Segment auch im SI-Register übergeben werden.Aktion: Hieraus bildet das Makro
den Aktionscode im Register DX. Die drei möglichen Parameter bedeuten:
- a = Die vorhanden Datei soll erweitert werden. Ist sie nicht vorhanden, soll sie angelegt werden.
- n = Die Datei soll neu angelegt werden. War vorher eine Datei gleichen Namens vorhanden, soll sie gelöscht und danach neu angelegt werden..
- o = Die Datei ist bereits vorhanden und soll nicht erlöscht werden.
Die Aktion steht im Zusammenhang mit der Zugriffsart. Passen beide nicht zusammen, wird der Aktionscode 0000h in DX erzeugt. Er veranlasst eine Fehlermeldung während des Programmablaufs.
Zugriffsart: Hier wird unterschieden zwischen r, rw, w und wr.
- r = Lesen. Die bereits vorhanden Datei soll ausschließlich gelesen werden.
- rw = Lesen und Schreiben. Auf die bereits bestehende Datei soll lesend und schreibend zugegriffen werden.
- w = Schreiben. Die Datei soll neu angelegt werden. Anschließend kann auf sie geschrieben werden. Der Inhalt einer vorher bestehenden Datei gleichen Namens wird hierbei gelöscht.
- wr = Schreiben und Lesen. Auf die Datei soll schreibend und lesend zugegriffen werden. Falls es sie noch nicht gibt, wird sie neu angelegt.
Zugriffsperre (Sharing Mode): Die Zugriffsperre betrifft andere Prozesse, die parallel auf die Datei zugreifen möchten. Unterstützte Angaben sind
- r- (verweigert Lesen)
- w- (verweigert Schreiben)
- rw- (verweigert Lesen und Schreiben)
- rw+ (verweigert nichts)
- none (keine Angabe, auch „Kompatibler Modus” genannt)
Attribut: Es wird ein Zahlenwert erwartet, der eine Bitbelegung für die Dateiattribute festlegt. Defaultwert ist 0 für kein Attribut. Die in Frage kommenden Attributbits sind:
- Bit 5=archive
- Bit 3=volume
- Bit 2=system
- Bit 1=hidden
- Bit 0=read only
comment #
Funktion 716ch
Kreeiren / Öffnen einer Datei mit Unterstützung langer
Dateinamen.
dateiname: Register si oder Label im Datenbereich
aktion: n (neu) oder a (append)
zugriff: r (read), w (write), rw (read and write), wr (write and read)
share: r- (verweigert lesen), w- (verweigert schreiben),
rw- (verweigert lesen und schreiben),
rw+ (verweigert nichts)
c (kompatibel)
attrib: es wird ein zahlenwert erwartet. default ist read only
#
if1 ;;macros nur im 1.durchlauf
lfnopen macro dateiname,aktion,zugriff,share,attrib
ifdif <si>,<dateiname>
mov si, offset dateiname ;Dateiname
endif
mov bx,2000h ;voreinstellung (zugriff=read)
mov dx,0000h ;voreinstellung auf fehlermeldung
ifidn <n>,<aktion>
ifidn <w>,<zugriff>
mov bx,2001h ;zugriff=write
mov dx,0012h ;new file
endif
ifidn <wr>,<zugriff>
mov bx,2020h ;zugriff=write and read
mov dx,0012h ;new file
endif
ifidn <r>,<zugriff>
mov bx,2000h ;zugriff=read (error)
endif
ifidn <rw>,<zugriff>
mov bx,2000h ;zugriff=read and write (error)
endif
endif
ifidn <a>,<aktion>
ifidn <w>,<zugriff>
mov bx,2001h ;zugriff=write
mov dx,0011h ;append file
endif
ifidn <wr>,<zugriff>
mov bx,2002h ;zugriff=write and read
mov dx,0011h ;append file
endif
ifidn <r>,<zugriff>
mov bx,2000h ;zugriff=read (error)
endif
ifidn <rw>,<zugriff>
mov bx,2002h ;zugriff=read and write
mov dx,0011h ;append file
endif
endif
ifidn <o>,<aktion> ;old file
ifidn <w>,<zugriff>
mov bx,2001h ;zugriff=write (error)
endif
ifidn <rw>,<zugriff>
mov bx,2002h ;zugriff=write and read
mov dx,0001h ;append
endif
ifidn <r>,<zugriff>
mov bx,2000h ;zugriff=read
mov dx,0001h ;append
endif
ifidn <wr>,<zugriff>
mov bx,2002h ;zugriff=read and write
mov dx,0001h ;append
endif
endif
ifidn <r->,<share>
or bx,0030h ;share verweigert read
endif
ifidn <w->,<share>
or bx,0020h ;share verweigert write
endif
ifidn <rw->,<share>
or bx,0010h ;share verweigert read and write
endif
ifidn <rw+>,<share>
or bx,0040h ;share verweigert nichts
endif
ifnb <attrib>
mov cx,attrib ;attrib bit 5=archive, 3=volume, 2=system,
else ;1=hidden, 0=read only
mov cx,0000h ;attrib readonly (default)
endif
mov ax,716ch ;funktion 71
int dos ;falls fehler wird carry gesetzt
endm
endif ;;if1
Im folgenden Beispiel sind vom Makroaufruf generierten Quellprogrammzeilen durch eine 1 am Zeilenanfang gekennzeichnet:
lfnopen q_Datei,o,wr,none,0
1 mov si, offset q_Datei ;Dateiname
1 mov bx,2000h ;voreinstellung (zugriff=read)
1 mov dx,0000h ;voreinstellung auf fehlermeldung
1 mov bx,2002h ;zugriff=read and write
1 mov dx,0001h ;append
1 mov cx,0 ;attrib bit 5=archive, 3=volume, 2=system,
;1=hidden, 0=read only
1 mov ax,716ch ;funktion 71
1 int dos ;falls fehler wird carry gesetzt
|