home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; MQUEUE.DEM - Demoprogramm für die Routinen aus MQUEUE.LIB
- ; (für den A86)
- ;
- ; (c) Bernd Schemmer 1992
- ; Letzter Update: 15.02.1992
- ;
- ; Übersetzen:
- ; A86 MQUEUE.DEM DEMOS.INC TO MQUEUE.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
-
- ; ----------------------------
- ; Meldungen und Fehlermeldungen
- logo db CR,LF
- db 'MQUEUE.DEM - Demoprogramm für die Routinen aus MQUEUE.LIB' ,CR,LF
- db '----------------------------------------------------------',CR,LF
- db CR,LF
- GETLENGTH logo
- ; Meldungen
- MakeMsg InitMsg, '--- Richte die Queue ein ...'
- MakeMsg FuelleQueue, '--- Fülle die Queue ...'
- MakeMsg LeereQueue, '--- Leere die Queue ...'
-
- ; Fehlermeldungen
- MakeMsg MemoryError, '*** Zuwenig freier Speicher.'
-
- MsgString db 255 dup 0 ; Puffer für die Meldungen
-
- ; ----------------------------
- start:
- call ShowLogo ; Logo ausgeben und Speicherblock verkleinern
-
- Write_String InitMsg
-
- mov bx,0100h ; neuen Speicherblock für die Queue
- mov ah,048h ; anfordern
- int 021h
- jnc >l1
-
- mov ah,048h ; nehmen wir was wir kriegen können
- int 021h
- jnc >l1
- l2:
- ; Fehler, zuwenig Speicher
- Write_String MemoryError
- jmp ErrorEnde
- l1:
- mov MQueueSeg,ax ; Segment der Queue sichern
- mov es,ax ; ES = Segment der Queue
-
- shl bx,1 ; Größe in Byte umrechnen
- shl bx,1
- shl bx,1
- shl bx,1
- mov cx,bx ; CX = Größe der Queue
-
- call InitMQueue ; Queue initialisieren
- call CheckMQueueError
- IF c jmp ErrorEnde1
-
- ; Daten der Queue ausgeben
- call GetMQueueStatistik
- call CheckMQueueError
- IF c jmp ErrorEnde1
- call ShowHeader
-
- Write_String FuelleQueue
-
- ; Dummyblock belegen
- ; nur zu Demo-Zwecken
- mov si,offset MsgString
- mov cx,111xD
- call WriteMQueue
- call CheckMQueueError
- IF c jmp ErrorEnde1
- ; und wieder freigeben
- call ReadMQueue
- call CheckMQueueError
- IF c jmp ErrorEnde1
-
- ; Queue füllen
- l00:
- call MakeMessage
- call WriteMQueue
- jnc l00 ; CF = 0 ->> weitere Meldungen möglich
-
- ; Fehler
- cmp ax,MQueueIsFull
- je >l1 ; 'normaler' Fehler, Queue ist voll
- stc
- call CheckMQueueError
- IF c jmp ErrorEnde1
-
- l1:
- ; Daten der Queue ausgeben
- call GetMQueueStatistik
- call CheckMQueueError
- IF c jmp ErrorEnde1
- call ShowHeader
-
- Write_String LeereQueue
-
- ; und nun Queue wieder leeren
- mov es,MQueueSeg
- l00:
- mov si,offset MsgString
- mov cx,255
-
- push es,cx ; Puffer löschen
- mov di,si
- mov es,cs
- mov al,0
- rep stosb
- pop cx,es
-
- call ReadMQueue
- jnc >l1 ; Meldung gelesen
-
- cmp ax,MQueueIsEmpty ; Fehler
- je Ende ; 'normaler' Fehler, Queue ist leer
- stc
- call CheckMQueueError
- jc ErrorEnde1
- l1:
- call ShowMessage ; Meldung ausgeben
- jmp l00 ; und nächste Meldung lesen
-
- ; ------------------
-
- ErrorEnde1:
- ; Fehlerausgang
- ; DX = Offset der Meldung
- ; CX = Länge der Meldung
- call OutputMsg
-
- ErrorEnde:
- mov al,0FFh
- Ende:
- EndProcess
-
- ; ----------------------------
- ; ShowMessage
- ;
- ; Funktion: Ausgabe des Inhaltes einer Meldung
- ;
- ; Eingabe: DS:SI -> Meldung aus der Queue
- ; CX = Länge der Meldung
- ;
- ; Funktion: Ausgabe einer Meludng
- ;
- MessageString db
- M1 db '_____. Meldung, Int-1Ah-Zähler: '
- M2 db '________h, Länge: '
- M3 db '___, (interner Zähler: '
- M30 db '_____)',CR,LF
- GETLENGTH MessageString
-
- OMessageCounter dw 0 ; Zähler für die ausgegebenen Meldungen
-
- ShowMessage:
- push es
- mov es,cs
-
- inc OMessageCounter
- mov ax,OMessageCounter
- mov di,offset m1
- call Konvert_AX_To_Dezstring
-
- mov al,cl
- mov di,offset m3
- call Konvert_AL_To_Dezstring
-
- mov di,offset m2
- or cl,cl
- jnz >l1
- ; leere Meldung
- mov ax,'??'
- mov cx,4
- rep stosw
- mov di,offset M30
- stosw
- stosw
- stosb
- jmp >l2
- l1:
- lodsw
- call Konvert_AX_To_Hexstring
- lodsw
- call Konvert_AX_To_Hexstring
- lodsw
- mov di,offset M30
- call Konvert_AX_TO_Dezstring
- l2:
- Write_String MessageString
- pop es
- ret
-
- ; ----------------------------
- ; ShowHeader
- ;
- ; Funktion: Ausgabe der globalen Daten der Queue
- ;
- ; Eingabe: AX, DX und CX wie von der Routine GetMQueueStatistk geliefert
- ;
- HeaderMsg db 'Daten der Queue: '
- db 'Gesamtspeicher: '
- m4 db '_____, freier Speicher '
- m5 db '_____, '
- db CR,LF
- db ' '
- m6 db '_____ Meldungen in der Queue',CR,LF
- GETLENGTH HeaderMsg
-
- ShowHeader:
- push es
- mov es,cs
-
- mov di,offset m6
- call Konvert_AX_To_Dezstring
-
- mov di,offset m4
- mov ax,dx
- call Konvert_AX_To_Dezstring
-
- mov di,offset m5
- mov ax,cx
- call Konvert_AX_To_Dezstring
-
- Write_String HeaderMsg
-
- pop es
- ret
-
- ; ----------------------------
- ; MakeMessage
- ;
- ; Funktion: Erzeugt eine Meldung
- ; (zwischen 40 und 80 Byte lang, wobei immer nur die
- ; ersten 6 Byte mit Daten belegt sind)
- ;
- ; Ausgabe: DS:SI -> Meldung
- ; CX = Länge der Meldung
- ;
- MessageCounter dw 0 ; Zähler der Meldungen
-
- LastMessageL db 40 ; Hilfsvariable für die Länge der Meldungen
- LastLowWord dw 0 ; -"-
-
- MakeMessage:
-
- mov ah,0 ; Zeitzähler ermitteln
- int 01Ah
- cmp LastLowWord,dx
- je >l1
- mov lastLowWord,dx
- ; Meldung mit 0 Byte Länge erzeugen
- mov cx,0
- mov si,offset MsgString
- ret
- l1:
- mov si,offset MsgString
- mov [si],cx
- mov [si+2],dx
-
- mov ax,MessageCounter
- mov [si+4],ax
- inc MessageCounter
-
- mov cl,LastMessageL
- add cl,7
- cmp cl,80
- if ae mov cl,40
- mov LastMessageL,cl
-
- xor ch,ch
- ret
-
- ; ----------------------------
- ; CheckMQueueError
- ;
- ; Funktion: Ermitteln der zu einer Fehlernummer der Routinen für die
- ; Verwaltung der Queue gehörenden Fehlermeldung
- ;
- ; Eingabe: AX = Fehlercode der Routine
- ; CF = CF der Routine
- ;
- ; Ausgabe: CF = 0 ->> kein Fehler
- ; kein Register verändert
- ; CF = 1 ->> Fehler
- ; DX = Offset der Fehlermeldung
- ; CX = Länge der Fehlermeldung
- ; AX unverändert
- ;
-
- ; Fehlermeldungen
- ; ---------------
- MQueueErrorMsg1 db '*** Keine Meldung in der Queue!'
- MQueueErrorMsg2 db '*** Nicht mehr genügend freier Speicher in der Queue!'
- MQueueErrorMsg3 db '*** Falsche Größe für die Queue angegeben!'
- MQueueErrorMsg4 db '*** Puffer ist für die nächste Meldung zu klein!'
- MQueueErrorMsg5 db '*** Angegebene Meldung ist zu lang!'
- MQueueErrorMsg6 db '*** Gleichzeitiger Zugriff von mehreren Routinen nicht erlaubt!'
- MQueueErrorMsgU db '*** Unbekannter Fehlercode!'
- MQueueErrorMsgL db 0 ; Dummy-Eintrag
-
- ; Tabelle der Fehlernummern und Fehlermeldungen
- ;
- ; Fehlernummer Offset der Fehlermeldung
- ; -----------------------------------------------
- MQueueErrorTable dw MQueueIsEmpty , Offset MQueueErrorMsg1
- dw MQueueIsFull , Offset MQueueErrorMsg2
- dw MQueueLengthError , Offset MQueueErrorMsg3
- dw MQueueBufferError , Offset MQueueErrorMsg4
- dw MQueueMessageError , Offset MQueueErrorMsg5
- dw MQueueAktivError , Offset MQueueErrorMsg6
- ; Eintrag für unbekannte Fehlercodes
- MQueueUnknownErr dw 0 , Offset MQueueErrorMsgU
- ; Eintrag für die Ermittlung der Länge
- ; der letzten Fehlermeldung
- dw 0 , Offset MQueueErrorMsgL
-
- CheckMQueueError:
- jnc ret ; CF = 0 ->> kein Fehler aufgetreten
-
- push si,ds,ax ; CF = 1 ->> Fehler aufgetreten,
- ; Offset der Fehlermeldung ermitteln
- mov ds,cs ; DS = CS
- mov si,offset MQueueErrorTable
- ; DS:SI -> Fehlertabelle
-
- ; Eintrag für unbekannte Fehlercodes korrigieren
- mov MQueueUnknownErr,ax
-
- mov dx,ax ; Fehlernummer nach DX
- l0:
- lodsw
- cmp ax,dx
- lodsw
- jne l0
-
- mov dx,ax ; DX = Offset der Fehlermeldung
- mov cx,[si+2] ; CX = Offset der nächsten Fehlermeldung
- sub cx,dx ; CX = Länge der Fehlermeldung
- stc
- pop ax,ds,si
- ret
-
-