home *** CD-ROM | disk | FTP | other *** search
- ─────────────────────────────────────────────────────────────────────────────
- Dokumentation zur Datei: SQUEUE.INC
-
- ─────────────────────────────────────────────────────────────────────────────
-
- SQUEUE.INC - Routinen zur Verwaltung einer stream-orientierten Queue
- (für den Assembler A86)
-
- (c) Bernd Schemmer 1992
- Letzter Update: 02.02.1992
-
-
- ■ Beschreibung:
- ---------------
- SQUEUE.INC stellt Routinen zur Verwaltung einer stream-orientierten
- Queue zur Verfügung. Eine Queue (oder auf deutsch: Schlange) ist eine
- nach dem FIFO-Prinzip (First in, First out) organisierte Datenstruktur
- zur Speicherung von Daten.
-
- Die Größe einer Queue, die durch diese Routinen verwaltet werden soll,
- muß zwischen 256 und 65.535 Byte liegen.
-
- Jede Queue beginnt immer mit einem 16 Byte großem Header auf einer
- Segment-Grenze.
-
- Jede Queue ist durch einen Semaphor vor gleichzeitiger Bearbeitung
- durch mehrere Prozesse geschützt, wodurch die Queue auch durch
- mehrere verschiedene Prozesse gefüllt und geleert werden kann.
-
- Es ist auch möglich, eine Queue in eine Datei zu sichern und später
- wieder zu laden, da die Routinen nur mit relativen Offsets arbeiten.
- Es muß aber immer die gesamte Queue gesichert und geladen werden.
-
- Da alle Variablen zur Verwaltung der Queue im Segment der Queue
- angelegt werden, können die Routinen auch mit mehreren Queuen
- gleichzeitig arbeiten.
-
-
- ■ Variablen:
- ------------
- SQueueSeg - Word, Segment der aktuellen Queue
-
- Alle Routinen (außer InitSQueue) definieren einen zusätzlichen
- Einsprungpunkt 'name_A'. (z.B. für 'WriteSQueue' ist dies
- 'WriteSQueue_A'). Falls die Routinen über diesen Einsprung-
- punkt aufgerufen werden, arbeiten sie mit der Queue, deren
- Segment in dieser Variable gespeichert ist. (Der Wert des
- Registers ES beim Aufruf ist in diesen Fall ohne Bedeutung,
- das Register ES wird aber NICHT gesichert.) Die Variable muß
- in diesem Fall vorher auf einen korrekten Wert gesetzt worden
- sein! (z.B. durch den Aufruf von 'InitSQueue' oder durch
- direktes Setzen)
- Falls die Routinen über den normalen Einsprungpunkt aufgerufen
- werden, wird diese Variable weder genutzt noch verändert.
-
- SQueueSeg:[SQueueUserData1] - Word, für Benutzerzwecke reserviert
- SQueueSeg:[SQueueUserData2] - Word, für Benutzerzwecke reserviert
-
- An den Offsets SQueueUserData1 und SQueueUserData2 im Header
- der Queue sind jeweils 2 Byte (= 1 Wort) für Daten des Programms
- reserviert. Diese beiden Wörter werden von den Routinen zur
- Verwaltung der Queue weder gelesen noch verändert (also auch
- nicht mit einem bestimmten Wert initialisiert).
- (SQueueUserData1 und SQueueUserData2 sind über 'dw' definiert)
-
-
- Alle anderen Variablen zur Verwaltung der Queue werden im Speicher-
- bereich für die Queue angelegt und sollten von anderen Routinen
- weder gelesen noch verändert werden.
-
-
- ■ Routinen:
- -----------
- InitSQueue - Initialisert (d.h. löscht) die Queue
- LockSQueue - Sperrt eine Queue
- UnLockSQueue - Gibt eine Queue wieder frei
- DeleteSQueue - Löscht die gesamte Queue
- WriteSQueue - Schreibt n Byte in die Queue
- ReadSQueue - Liest die nächsten n Byte aus der Queue
- GetSQueueStatistik - Ermittelt die Daten der Queue
-
- Hinweis: Da nicht alle internen Bezeichner dieser Routinen dokumentiert
- sind, sollte in einem Programm, das diese Routinen nutzt, kein
- Bezeichner mit der Zeichenfolge 'SQueue' verwendet werden.
-
-
- ■ Fehlernummern der Routinen
- ----------------------------
-
- Alle Fehlernummern der Routinen haben das Format 83xx, wobei xx die
- Nummer des eigentlichen Fehlers ist.
-
- Name Nummer Bedeutung
- ---------------------------------------------------------------------
- SQueueIsEmpty EQU 08301h ; Die Queue ist leer
-
- SQueueIsFull EQU 08302h ; Es ist nicht mehr genügend freier
- ; Speicher zur Aufnahme der Bytes in
- ; der Queue frei
-
- SQueueLengthError EQU 08303h ; falsche Größe für die Queue angegeben
-
- SQueueAktivError EQU 083FFh ; gleichzeigtiger Zugriff von mehreren
- ; Prozessen auf eine Queue nicht möglich
-
-
- ----------------------------
- InitSQueue
-
- Funktion: Initialisiert die Queue
-
- Eingabe: ES = Segment für die Queue
- Die Queue beginnt immer am Offset 0
- CX = Größe des Speicherbereichs in Byte für die Queue
- Es muß gelten: 256 < CX < 65.535
-
- Ausgabe: CF = 0 ->> okay
- CX = freier Speicher in der Queue
- CF = 1 ->> Fehler
- AX = Fehlernummer
- Die Queue wurde NICHT eingerichtet.
-
- Bes.: Das Segment der Queue wird, falls kein Fehler auftritt, in
- der Variablen SQueueSeg gespeichert.
- Der Wert des Semaphors der Queue wird NICHT berücksichtigt!
-
- ----------------------------
- DeleteSQueue
-
- Funktion: Löscht die gesamte Queue
-
- Eingabe: ES = Segment der Queue
-
- Ausgabe: CF = 0 ->> okay
- CX = freier Speicher in der Queue
- CF = 1 ->> Fehler
- AX = Fehlernummer
-
- ----------------------------
- LockSQueue
-
- Funktion: Sperrt eine Queue
-
- Eingabe: ES = Segment der Queue
-
- Ausgabe: CF = 0 ->> okay
- CF = 1 ->> Fehler
- AX = Fehlernummer
-
- ----------------------------
- UnLockSQueue
-
- Funktion: Gibt eine Queue wieder frei
-
- Eingabe: ES = Segment der Queue
-
- Ausgabe: CF = 0 ->> okay
- CF = 1 ->> Fehler
- AX = Fehlernummer
-
- Bes.: Der Wert des Semaphors der Queue wird NICHT berücksichtigt!
-
- ----------------------------
- GetSQueueStatistik
-
- Funktion: Ermittelt die statistischen Daten der Queue
-
- Eingabe: ES = Segment der Queue
-
- Ausgabe: CF = 0 ->> okay
- AX = belegter Speicher in der Queue
- CX = freier Speicher in der Queue
- DX = Größe der Queue
- CF = 1 ->> Fehler
- AX = Fehlernummer
-
- ----------------------------
- WriteSQueue
-
- Funktion: Schreiben von n Bytes in die Queue
-
- Eingabe: ES = Segment der Queue
- CX = Anzahl der zu schreibenden Bytes
- DS:SI -> zu schreibende Bytes
-
- Ausgabe: CF = 0 ->> okay
- CF = 1 ->> Fehler
- AX = Fehlernummer
- und falls AX = SQueueIsFull ist:
- CX = Anzahl freier Bytes in der Queue
-
- Bes.: Das Directionflag wird gelöscht.
- Im Falle eines Fehlers werden KEINE Bytes geschrieben.
-
- ----------------------------
- ReadSQueue
-
- Funktion: Liest die nächsten n Bytes aus der Queue
-
- Eingabe: ES = Segment der Queue
- CX = Anzahl der zu lesenden Bytes
- DS:SI -> Puffer für die Bytes
-
- Ausgabe: CF = 0 ->> okay
- Bytes stehen im Puffer bei DS:SI
- CX = Anzahl der übertragenen Bytes
- (1 <= CX <= n, mit n = angeforderte Bytes)
- CF = 1 ->> Fehler
- AX = Fehlernummer
-
- Bes.: Das Directionflag wird gelöscht.
- Falls die Routine mit CX = 0 aufgerufen wird, wird sie
- sofort beendet.
-
-