home *** CD-ROM | disk | FTP | other *** search
- ; ----------------------------
- ; DEMOS.INC - allgemeine Routinen für die Demos
- ;
-
- ; ----------------------------
- ; ShowLogo
- ;
- ; Funktion: Ausgabe des Logos und verkleinern des akt. Speicherblocks auf
- ; 1 Segment
- ;
- ; Eingabe: ES = DS = CS
- ;
- ShowLogo:
- mov ax,0
- jmp >l1
-
- ; ----------------------------
- ; ShowLogoAndAsk
- ;
- ; Funktion: Ausgabe des Logos, verkleinern des akt. Speicherblocks auf
- ; 1 Segment und Lesen einer Taste
- ;
- ; Eingabe: ES = DS = CS
- ;
- ; Bes.: Falls die Taste <ESC> eingegeben wird, wird das Programm
- ; abgebrochen. (Errorlevel = 1)
- ;
- MakeMsg AbbortMsg, '*** Programm abgebrochen.'
-
- ShowLogoAndAsk:
- mov ax,01
-
- l1:
- push ax
-
- Write_String Logo ; Logo ausgeben
-
- ; akt. Speicherblock verkleinern
- mov bx,01000h
- mov ah,04Ah
- int 021h ; (keine Fehlerbehandlung)
-
- pop ax ; AX = 0 ->> keine Taste lesen
- ; AX = 1 ->> Taste lesen
- or ax,ax
- jz ret ; keine Taste lesen
-
- cmp b[019h],01
- jne ret ; Umleitung der Standard-Ausgabe in Kraft
-
- ; ----------------------------
- mov ah,01h ; Taste lesen
- int 021h
- cmp al,ESC
- jne >l1
- ; ESC gedrückt, Programm abbrechen
- Write_String AbbortMsg
-
- EndProcess 01 ; *** Programm abbrechen!
-
- ; ------------------
- l1:
- cmp al,00h ; Funktionstaste eingegeben?
- jne >l2
-
- mov ah,01h ; ja, zweiten Code lesen
- int 021h
- ; ----------------------------
- l2:
- call ShowCR_LF
- ret
-
- ; ----------------------------
- ; CloseFiles
- ;
- ; Funktion: Schließt alle offenen Dateien
- ;
- CloseFiles:
- pushf
- push ax,bx,cx,si,ds
- cld
- mov cx,cs:[032h] ; CX = Anzahl möglicher Handles
- lds si,cs:[034h] ; DS:SI -> Handle-Tabelle
- xor bx,bx
-
- l00:
- lodsb ; AL = akt. internes Handle
- cmp al,0FFh
- je >l01 ; Handle ist geschlossen
-
- ; Handle schließen
- mov ah,03Eh
- int 021h
- l01:
- inc bx
- loop l00
-
- pop ds,si,cx,bx,ax
- popf
- ret
-
- ; ----------------------------
- ; LaufzeitAnzeige
- ;
- ; Funktion: Ausgabe einer Laufzeit-Anzeige
- ;
- PunktZaehler db 0
- Punkt db CR,'.-'
-
- LaufzeitAnzeige:
- cmp b cs:[019],01
- jne ret ; Laufzeitausgabe nicht ausgeben, falls die
- ; Standard-Ausgabe umgeleitet wird
-
- push ds,bx,cx,dx ; Laufzeitangabe ausgeben
- push cs
- pop ds
-
- mov cx,1
- mov dx,offset Punkt+1
-
- inc PunktZaehler
- cmp PunktZaehler,40xD
- jb >l1
- ; Cursor zurücksetzen
- mov cx,2
- dec dx
- mov ax,W Punkt+1
- xchg ah,al
- mov W Punkt+1,ax
- mov PunktZaehler,0
- l1:
- call OutputMsg
- pop dx,cx,bx,ds
- ret
-
- ; ----------------------------
- ; OutputMsg
- ;
- ; Funktion: Ausgabe einer Zeichenkette auf das Handle Standard-Error
- ;
- ; Eingabe: DX = Offset der Zeichenkette
- ; CX = Länge der Zeichenkette
- ;
- OutputMsg:
- push ax,bx,ds
- mov ds,cs
- mov ah,040h
- mov bx,STDOut
- int 021h
- pop ds,bx,ax
- ret
-
- ; ----------------------------
- ; ShowCR_LF
- ;
- ; Funktion: Ausgabe von CR und LF
- ;
- MakeMsg1 CR_LF ,CR,LF
-
- ShowCR_LF:
- push cx,dx
- mov dx,offset CR_LF
- mov cx,CR_LF_Length
- call OutputMsg
- pop dx,cx
- ret
-
- ; ----------------------------
- ; ShowPause
- ;
- ; Funktion: Gibt eine Meldung auf die Standard-Ausgabe aus und wartet auf
- ; eine Taste (nur falls die Ausgabe auf den Bildschirm geht)
- ;
- ; Ausgabe: CF = 0 -> Taste <> ESC gedrückt
- ; CF = 1 -> ESC gedrückt
- ; AL = Taste
- ;
- MakeMsg1 PauseMSG, CR,LF, 'Bitte eine Taste drücken (ESC = Ende) ...'
-
- ShowPause:
- push ds
- push bx,cx,dx
-
- cmp b cs:[019h],01h ; [019h] -> Handle für die Standard-Ausgabe
- clc
- jne >l9 ; Ausgabe geht in eine Datei
-
- mov ds,cs
- ; Meldung ausgeben
- WRITE_STRING PauseMSG
-
- l0:
- mov ah,08h ; Zeichen lesen
- int 021h
- cmp al,0 ; Funktionstaste gedrückt ?
- je l0 ; ja, zweiten Code lesen
-
- cmp al,ESC
- clc
- if e stc
- pushf
- call ShowCR_LF
- popf
-
- l9:
- pop dx,cx,bx
- pop ds
- ret
-
- ; ----------------------------
- ; Konvert_AX_To_HexString
- ;
- ; Funktion: Konvertiert AX zu eine 4-stellige Zeichenkette in Hexadezimal-
- ; Form nach ES:DI
- ;
- ; Eingabe: AX = Zu konvertierender Wert
- ; ES:DI -> Puffer für 4 Zeichen
- ;
- ; Ausgabe: Puffer gefüllt
- ; DI zeigt hinter den Puffer
- ;
- Konvert_AX_To_HexString:
- push ax
- mov al,ah
- call Konvert_AL_To_Hexstring
- pop ax
- ; ...
-
- ; ----------------------------
- ; Konvert_AL_To_Hexstring
- ;
- ; Funktion: Konvertiert AL in eine 2-stellige Zeichenkette in Hexadezimal-
- ; Form nach ES:DI
- ;
- ; Eingabe: AL = zu konvertierenden Wert
- ; ES:DI -> Puffer für 2 Zeichen
- ;
- ; Ausgabe: Puffer gefüllt
- ; DI zeigt hinter den Puffer
- ;
- Konvert_AL_To_HexString:
- cld
- mov ah,al
- and ah,0F0h
- shr ah,1
- shr ah,1
- shr ah,1
- shr ah,1
- cmp ah,9
- jg >l1
- add ah,'0'
- jmp >l2
- l1:
- add ah,'7'
- l2:
- and al,00Fh
- cmp al,9
- jg >l1
- add al,'0'
- jmp >l2
- l1:
- add al,'7'
- l2:
- xchg ah,al
- stosw
- ret
-
- ; ----------------------------
- ; Konvert_AL_To_Dezstring
- ;
- ; Funktion: Konvertiert (vorzeichenlos) AL zu einem Dezimal-String bei ES:DI
- ;
- ; Eingabe: AL = zu konvertierender Wert
- ;
- ; Ausgabe: Dezstring bei ES:DI
- ;
- Konvert_AL_To_Dezstring:
- push cx,dx
- xor ah,ah
- mov dx,ax
- mov cs:k1,ah
- jmp >l1
-
- ; ----------------------------
- ; Konvert_AX_To_Dezstring
- ;
- ; Funktion: Konvertiert (vorzeichenlos) AX zu einem Dezimal-String bei ES:DI
- ;
- ; Eingabe: AX = zu konvertierender Wert
- ;
- ; Ausgabe: Dezstring bei ES:DI
- ;
-
- k1 db 0 ; Hilfsvariable
-
-
- StoreDigit0:
- mov ax,dx
-
- StoreDigit1:
- xor dx,dx
- div cx
- cmp al,0
- jne >l01
- cmp cs:k1,al
- jne >l01
- mov al,' '
- jmp >l02
- l01:
- add al,'0'
- mov cs:k1,al
- l02:
- stosb
- ret
-
- Konvert_AX_To_Dezstring:
- push cx,dx
-
- mov cs:k1,0
-
- mov cx,10000xD
- call StoreDigit1
- mov cx,1000xD
- call StoreDigit0
- l1:
- mov cx,100xD
- call StoreDigit0
- mov cx,10xD
- call StoreDigit0
- mov al,dl
- add al,'0'
- stosb
-
- pop dx,cx
- ret
-
-
-