home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
demo
/
mqueue.dem
< prev
next >
Wrap
Text File
|
1992-02-16
|
11KB
|
355 lines
; ----------------------------
; 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