home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; MENGEN.DEM - Demoprogramm für die Routinen aus MENGEN.LIB
- ; (für den A86)
- ;
- ; (c) Bernd Schemmer 1990 - 1992
- ; Letzter Update: 15.02.1992
- ;
- ; Übersetzen:
- ; A86 MENGEN.DEM DEMOS.INC TO MENGEN.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 'MENGEN.DEM - Demoprogramm für die Routinen aus MENGEN.LIB'
- db CR,LF
- db '----------------------------------------------------------'
- db CR,LF
- db CR,LF
- GETLENGTH logo
-
- ; ----------------------------
- ; DefiniereMenge (aus MENGEN.INC übernenommes Macro)
- ;
- ; Funktion: Definiert die Menge mit dem namen #1 als leere Menge
- ;
- ; Aufruf: _DefiniereMenge NameDerMenge
- ;
- _DefiniereMenge MACRO
- #1 dw 16xD dup (0)
- #EM
-
- ; Definition der Mengen
- ;
- _DefiniereMenge Menge1
- _DefiniereMenge Menge2
-
- ; Elemente, die in Menge1 ein übernommen werden sollen
- ; (hier die Tasten der 3. Tastaturreihe)
- ;
- MakeMsg1 Elemente_fuer_Menge1,'qwertzuiopü+QWERTZUIOPÜ*'
-
- ; Elemente, die in Menge2 ein übernommen werden sollen
- ; (hier alle Ziffern)
- ;
- MakeMsg1 Elemente_fuer_Menge2,'1','2','3','4','5','6','7','8','9','0'
-
- MakeMsg prompt1,'Bitte drücken Sie eine Taste (ESC = Ende des Tests): '
- MakeMsg msg0, '---- Testen, ob ein Element in der Menge1 vorhanden ist'
- MakeMsg msg1, '---- Gedrückte Taste ***ist*** in der Menge1 vorhanden',CR,LF
- MakeMsg msg2, '---- Gedrückte Taste ***ist nicht*** in der Menge1 vorhanden',CR,LF
- MakeMsg msg4, '---- Füge der Menge1 die Elemente "y" und "-" zu'
- MakeMsg msg5, '---- Entferne die Elemente "q" und "+" aus der Menge1'
- MakeMsg msg6, '---- Lösche die Menge1 ...'
- MakeMsg msg7, '---- Kopiere die Menge der Kleinbuchstaben in die Menge1'
- MakeMsg msg8, '---- Bilde die Vereinigungsmenge von Menge1 und der Menge der Zahlen'
-
- ; ------------------
-
- start:
- call ShowLogo ; Logo ausgeben und Speicherblock verkleinern
- ; Inhalte der vordefinierten Mengen ausgeben
- call ShowPreDefMengen
-
- ; Menge1 bilden
- mov bx,offset Menge1
- mov di,offset Elemente_Fuer_Menge1
- mov cx,Elemente_fuer_Menge1_LENGTH
- call Bilde_Menge
- call ShowMenge1
-
- ; Menge2 bilden
- mov bx,offset Menge2
- mov di,offset Elemente_Fuer_Menge2
- mov cx,Elemente_fuer_Menge2_LENGTH
- call Bilde_Menge
- call ShowMenge2
-
- ; Beispiel für die Nutzung von Mengen
- l0:
- call ShowMenge1
- WRITE_STRING msg0
- WRITE_STRING prompt1
- mov ah,08
- int 021h ; Zeichen lesen
-
- cmp al,ESC
- je >l3 ; Ende
-
- ; Testen, ob das Zeichen in der Menge vorhanden ist
- mov bx,offset Menge1
- call Element_Vorhanden?
- jz >l1 ; Zeichen nicht vorhanden
- ; Zeichen vorhanden
- WRITE_STRING msg1
- jmp >l2
- l1:
- WRITE_STRING msg2
- l2:
- jmp l0
-
- l3:
- call ShowMenge1
-
- WRITE_STRING msg4
-
- mov bx,offset menge1
- mov al,'y' ; Hinzufügen eines Elementes
- call add_Element
- mov al,'-'
- call add_Element
-
- call ShowMenge1
-
- WRITE_STRING msg5
- mov bx,offset menge1
- mov al,'q' ; Entfernen eines Elementes
- call Sub_Element
- mov al,'+'
- call Sub_element
-
- call ShowMenge1
-
- WRITE_STRING msg6
- mov bx,offset menge1 ; Löschen einer Menge
- call Loesche_Menge
-
- call ShowMenge1
-
- WRITE_STRING msg7 ; Kopieren einer Menge
- mov di,offset menge1
- mov bx,offset Menge_Der_Kleinbuchstaben
- call Kopiere_menge
-
- call ShowMenge1
- ; Bilden der Vereinigungsmenge
- WRITE_STRING msg8
- mov di,offset menge1
- mov bx,offset Menge2
- call Vereinige_Mengen
-
- call ShowMenge1
- ; Beispiel zur Deklaration von Mengen
- ; als initialisierte Variablen
- call GetDefaultForAMenge
-
- ; Beispiele für die Mengenoperationen
- call ShowMengenOperationen
-
- EndProcess 0
-
- ; ----------------------------
- ; ShowMenge1
- ;
- ; Funktion: Gibt alle belegten Mengenelemente der Menge1 als ASCII-Zeichen
- ; auf die Standard-Ausgabe aus
- ;
- MakeMsg1 msg3, 'Inhalt der Menge1: '
-
- ShowMenge1:
- WRITE_STRING msg3
- mov bx,offset menge1
- call ShowMenge
- ret
-
- ; ----------------------------
- ; ShowMenge2
- ;
- ; Funktion: Gibt alle belegten Mengenelemente der Menge2 als ASCII-Zeichen
- ; auf die Standard-Ausgabe aus
- ;
- MakeMsg1 msg30,'Inhalt der Menge2: '
-
- ShowMenge2:
- WRITE_STRING msg30
- mov bx,offset menge2
- call ShowMenge
- ret
-
- ; ----------------------------
- ; ShowPreDefMengen
- ;
- ; Funktion: Gibt die Inhalt der vordefinierten Mengen als ASCII-Zeichen
- ; auf die Standard-Ausgabe aus
- ;
- MakeMsg1 msg01, 'Inhalt der Menge der Großbuchstaben: '
- MakeMsg1 msg02, 'Inhalt der Menge der Kleinbuchstaben: '
- MakeMsg1 msg03, 'Inhalt der Menge der aller Buchstaben: '
-
- ShowPreDefMengen:
- WRITE_STRING msg01
- mov bx,offset menge_Der_Grossbuchstaben
- call ShowMenge
-
- WRITE_STRING msg02
- mov bx,offset menge_Der_Kleinbuchstaben
- call ShowMenge
-
- WRITE_STRING msg03
- mov bx,offset menge_Der_buchstaben
- call ShowMenge
- ret
-
- ; ----------------------------
- ; GetDefaultForAMenge
- ;
- ; Funktion: Demonstriert wie die Voreinstellung für eine Menge
- ; ermittelt werden kann
- ;
- msg04 db 'Beispiel für die Ermittlung der Belegung einer Menge'
- db CR,LF
- db CR,LF
- db 'Bitte geben Sie die Elemente für die Menge ein: '
- db CR,LF
- GETLENGTH msg04
-
- MakeMsg msg05, 'Die eingegebene Menge hat folgende Elemente: '
-
- msg06 db 'Soll die Menge mit diesen Elementen schon so im Programm'
- db CR,LF
- db 'deklariert werden, so muß dies folgendermaßen geschehen: '
- db CR,LF
- db CR,LF
- db ' menge DW '
- s0 db '00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h'
- db CR,LF
- db ' DW '
- s1 db '00000h,00000h,00000h,00000h,00000h,00000h,00000h,00000h'
- db CR,LF
- db CR,LF
- db 'Nochmal?'
- GETLENGTH msg06
-
- _DefiniereMenge bspmenge
-
- elementpuffer db 255,256 dup 0 ; Puffer zum Lesen der Elemente
-
- GetDefaultForAMenge:
- WRITE_STRING msg04
- ; Elemente lesen
- mov dx,offset elementpuffer
- mov ah,0Ah
- int 021h
- call ShowCR_LF
- ; Menge erstellen
- mov bx,offset bspmenge
- mov di,offset elementpuffer+2
- mov cl,[di-1] ; CL = Anzahl Elemente für die Menge
- call Bilde_Menge
-
- WRITE_STRING msg05
- mov bx,offset bspmenge
- call ShowMenge
-
- mov cx,8 ; Ausgabe des Aufbaus der Menge
- mov di,offset s0+1
- mov si,offset bspmenge
- l0:
- lodsw
- call Konvert_AX_To_Hexstring
- add di,3
- loop l0
-
- mov cx,8
- mov di,offset s1+1
- l0:
- lodsw
- call Konvert_AX_To_Hexstring
- add di,3
- loop l0
-
- WRITE_STRING msg06
-
- mov ah,08h
- int 021h
- cmp al,'j'
- je >l1
- cmp al,'J'
- je >l1
- ret
-
- l1:
- call ShowCR_LF
- mov bx,offset bspmenge
- call Loesche_Menge
- jmp GetDefaultForAMenge
-
- ; ----------------------------
- ; ShowMengenOperationen
- ;
- ; Funktion: Beispiele für die Mengen-Operationen
- ;
-
- BspMenge1 dw 16 dup 0 ; Beispielmenge1
- BspMenge2 dw 16 dup 0 ; Beispielmenge2
- BspMenge3 dw 16 dup 0 ; Hilfsmenge
-
- MakeMsg1 ElementefuerMenge1, '1234567890abcdefg'
- MakeMsg1 ElementefuerMenge2, 'ABCDEFGabcdef'
-
- MakeMsg1 BspMenge1Msg, '___ Elemente in der BspMenge1: '
- MakeMsg1 BspMenge2Msg, '___ Elemente in der BspMenge2: '
-
- MakeMsg CreateMsg, CR,LF,'---- Erstelle die Mengen BspMenge1 und BspMenge2 ...'
- MakeMsg NegMsg, '---- Negiere die Menge BspMenge1 ...'
- MakeMsg ORMsg, '---- Bilde die Vereinigungsmenge von BspMenge1 und BspMenge2 ...'
- MakeMsg ANDMsg, '---- Bilde die Schnittmenge von BspMenge1 und BspMenge2 ...'
- MakeMsg XORMsg, '---- Bilde die XOR-Menge von BspMenge1 und BspMenge2 ...'
-
- ShowMengenOperationen:
- Write_String CreateMsg
-
- ; Mengen erstellen
- mov di,offset ElementeFuerMenge1
- mov cl,ElementeFuerMenge1_LENGTH
- mov bx,offset BspMenge1
- call Bilde_Menge
-
- mov di,offset ElementeFuerMenge2
- mov cl,ElementeFuerMenge2_LENGTH
- mov bx,offset BspMenge2
- call Bilde_Menge
-
- mov bx,offset BspMenge2
- mov di,offset BspMenge3
- call Kopiere_Menge
-
- call ShowBSPMengen
-
- Write_String NegMsg
- mov bx,offset BspMenge1
- mov di,offset BspMenge2
- call Negiere_Menge
- call ShowBSPMengen
-
- Write_String ORMsg
- mov bx,offset BspMenge1
- mov di,offset BspMenge2
- call Vereinige_Mengen
- call ShowBSPMengen
-
- Write_String ANDMsg
- mov bx,offset BspMenge1
- mov di,offset BspMenge2
- call Schneide_Mengen
- call ShowBSPMengen
-
- Write_String XORMsg
- mov bx,offset BspMenge1
- mov di,offset BspMenge2
- call XOR_Mengen
- call ShowBSPMengen1
- ret
-
- ; ----------------------------
- ; ShowBSPMengen
- ;
- ; Funktion: Ausgabe der Beispielmengen und Restaurierung
- ; der Menge BspMenge2
- ;
- ShowBSPMengen:
- mov di,offset BspMenge1Msg
- mov bx,offset BspMenge1
- call Card_Menge
- call Konvert_AL_TO_Dezstring
- Write_String BspMenge1Msg
- call ShowMenge
-
- mov di,offset BspMenge2Msg
- mov bx,offset BspMenge2
- call Card_Menge
- call Konvert_AL_TO_Dezstring
- Write_String BspMenge2Msg
- call ShowMenge
-
- mov bx,offset BspMenge3
- mov di,offset BspMenge2
- call Kopiere_Menge
-
- call ShowPause
- jnc >l1
- add sp,2 ; Ret-Adresse vom Stack
- ret ; und raus
- l1:
-
- ShowBSPMengen1:
- mov di,offset BspMenge1Msg
- mov bx,offset BspMenge1
- call Card_Menge
- call Konvert_AL_TO_Dezstring
- Write_String BspMenge1Msg
- call ShowMenge
-
- mov di,offset BspMenge2Msg
- mov bx,offset BspMenge2
- call Card_Menge
- call Konvert_AL_TO_Dezstring
- Write_String BspMenge2Msg
- call ShowMenge
-
- ret
-
- ; ----------------------------
- ; ShowMenge
- ;
- ; Funktion: Gibt alle belegten Mengenelemente der bei Menge DS:BX
- ; als ASCII-Zeichen auf die Standard-Ausgabe aus
- ;
- ShowMenge:
- xor al,al
- mov cx,256
- l0:
- push cx
- push ax
- call Element_Vorhanden?
- jz >l1
- pop dx
- push dx
- ; Element ist vorhanden
- mov ah,02h
- int 021h ; Zeichen ausgeben
-
- l1:
- pop ax
- pop cx
- inc al
- loop l0
-
- call ShowCR_LF
- ret
-
-