home *** CD-ROM | disk | FTP | other *** search
- ─────────────────────────────────────────────────────────────────────────────
- Dokumentation zur Datei: MACROS.MAC
-
- ─────────────────────────────────────────────────────────────────────────────
-
- MACROS.MAC - allgemeine Macros und EQUs für die Demos
- (für den Assembler A86)
-
- (c) Bernd Schemmer 1992
- Letzter Update: 03.02.1992
-
-
- ■ EQUs für die Tastencodes
-
- LF EQU 0Ah ; Linefeed
- TAB EQU 09h ; Tabulator
- CR EQU 0Dh ; Return
- CTRL_Z EQU 01Ah ; CTRL-Z
- ESC EQU 01Bh ; ESC
- BLANK EQU 020h ; Leerzeichen
- NULL EQU 00h ; Nullbyte
-
- ■ Handles für die Standard Ein/Ausgabekanäle
-
- STDIN EQU 0
- STDOUT EQU 1
- STDERR EQU 2
- STDAUX EQU 3
- STDPRINT EQU 4
-
-
- ----------------------------
- DefString
-
- Funktion: Macro zum Definieren eines Strings (mit Längenbyte)
-
- Aufruf: DefString NameDesStrings, maxLänge {,Inhalt_1} {...} {,inhalt_n}
-
- Bes.: Falls maxLänge größer als die Länge von Inhalt ist, wird
- der Rest des Strings mit Leerzeichen aufgefüllt.
-
- Falls für maxLänge Null angegeben wird, wird der
- String nur mit der Länge von Inhalt angelegt, in
- allen anderen Fällen darf MaxLänge NICHT kleiner
- als der Inhalt sein!
- Zeichenketten für Inhalt müssen in Hochkommata oder
- Gänsefüßchen angegeben werden!
-
- DefString MACRO
-
- #1 db #1_LENGTH ; #1 = Name des Strings
-
- ##if #NL GE 3 ; String evtl. initialisieren
- #RX3L
- db #X
- #ER
- ##endif
- ; Länge des Stringinhaltes ermitteln
- #1_LENGTH EQU ($ - Offset #1) -1
-
- ##if #2 NE 0 ; und evtl. restlichen Bytes des Strings mit
- ; Leerzeichen initialisieren
- db (#2 - #1_LENGTH) dup (' ')
- ##endif
-
- #EM
-
- ----------------------------
- MakeMsg
-
- Funktion: Macro zur Deklaration einer Zeichenkette mit angehängten
- CR/LF und einer Konstanten mit der Länge der Zeichenkette
-
- Aufruf: MakeMsg name, inhalt_1 {,Inhalt_2} {...} {,Inhalt_n}
-
- Bes.: Das Macro definiert eine Variable name und eine Konstante
- name_length.
- Zeichenketten für Inhalt müssen in Hochkommata oder
- Gänsefüßchen angegeben werden!
-
-
- MakeMsg MACRO
- #1 db
- #RX2L
- db #X
- #ER
- db CR,LF
- #1_LENGTH EQU ($ - Offset #1)
- #EM
-
- ----------------------------
- MakeMsg1
-
- Funktion: Macro zur Deklaration einer Zeichenkette OHNE angehängtem
- CR/LF und einer Konstanten mit der Länge der Zeichenkette
-
- Aufruf: MakeMsg name, inhalt_1 {,Inhalt_1} {...} {,inhalt_n}
-
- Bes.: Das Macro definiert eine Variable name und eine Konstante
- name_length
- Zeichenketten für Inhalt müssen in Hochkommata oder
- Gänsefüßchen angegeben werden!
-
-
- MakeMsg1 MACRO
- #1 db
- #RX2L
- db #X
- #ER
- #1_LENGTH EQU ($ - Offset #1)
- #EM
-
- ----------------------------
- GetLength
-
- Funktion: Macro zur Deklaration der Länge einer Zeichenkette als
- Konstanten
-
- Aufruf: GetLength Name_Der_Zeichenkette
- (direkt nach der Deklaration!)
-
- GetLength MACRO
- #1_LENGTH EQU $ - Offset #1
- #EM
-
- ----------------------------
- Write_String
-
- Funktion: Macro zur Ausgabe einer Zeichenkette auf die Standard-
- Ausgabe
-
- Aufruf: Write_String Name_Der_Zeichenkette
-
- Bes.: Die Länge der Zeichenkette muß über die Konstante
- Name_Der_Zeichenkette_LENGTH ermittelbar sein.
-
- Verändert keine Register
-
- Write_String MACRO
- push dx,cx,bx,ax,ds
- push cs
- pop ds
- mov dx,offset #1
- mov cx,#1_LENGTH
- mov bx,01h
- mov ah,040h
- int 021h
- pop ds,ax,bx,cx,dx
- #EM
-
- ----------------------------
- TestDOSVersion
-
- Funktion: Ermittelt und testet die DOS-Version
-
- Aufruf: TestDOSVersion {major,minor}
-
- Parameter: major, minor = mindestens nötige DOS-Version
- major = Hauptversion
- minor = Unterversion
- (Voreinstellung: 3.30)
-
- Ausgabe: AX = DOS-Version (AH =Hauptversion, AL = Unterversion)
-
- Bes.: Falls die akt. DOS-Version zu alt ist, gibt das Macro
- eine Fehlermeldung über die Funktion 09h des Interrupt
- 21h aus und beendet das Programm über die Funktion 00h
- des Interrupt 21h.
-
- TestDOSVersion MACRO
- mov ah,030h
- int 021h
- xchg ah,al
- ##IF #NL EQ 2
- cmp ax, #1 BY #2
- ##ELSE
- cmp ax, 031Eh ; Voreinstellung: 3.30
- ##ENDIF
- jae >m1 ; DOS-Version okay
-
- ; Falsche DOS-Version
- mov dx,offset m0
- mov ds,cs
- mov ah,09h
- int 021h ; Fehlermeldung ausgeben
- mov ah,0
- int 021h ; Programm beenden
-
- ------------------
- ; Text der Fehlermeldung
- m0 db 'Falsche DOS-Version!',0Dh,0Ah,'$'
- ------------------
- m1:
- #EM
-
- ----------------------------
- EndProcess
-
- Funktion: Beendet einen Prozess
-
- Aufruf: EndProcess {returncode}
-
- EndProcess MACRO
- ##IF #NL EQ 1
- ##IF "#1" = "AL"
- ##ELSE
- mov al,#1
- ##ENDIF
- ##ENDIF
- mov ah,04ch
- int 021h
- #EM
-
- ----------------------------
- KeepProcess
-
- Funktion: Beendet ein Prozess, aber behält ihn im Speicher
-
- Aufruf: KeepProcess {returncode}
-
- Eingabe: DX = Anzahl resident zu haltender Paragraphen
-
- KeepProcess MACRO
- ##IF #NL EQ 1
- ##IF "#1" = "AL"
- ##ELSE
- mov al,#1
- ##ENDIF
- ##ENDIF
- mov ah,031h
- int 021h
- #EM
-
- ----------------------------
- GetProcessReturnCode
-
- Funktion: Ermittelt den Returncode eines Prozesses
-
- Ausgabe: AH = Exit Code des Prozesses:
- 00 - Prozess endete normal
- 01 - Prozess wurde über CTRL-C abgebrochen
- 02 - Prozess über einen kritischen Fehler beendet
- 03 - Prozess über Funktion 31h des Interrupt 21h beendet
- AL = Returncode des Prozesses
-
- GetProcessReturnCode MACRO
- mov ah,04Dh
- int 021h
- #EM
-
- ----------------------------
- GetAktPSP
-
- Funktion: Ermittelt die Adresse des akt. PSPs
-
- Aufruf: GetAktPSP
-
- Ausgabe: BX = akt. PSP-Segment
-
- GetAktPSP MACRO
- mov ah,051h
- int 021h
- #EM
-
- ----------------------------
- SetAktPSP
-
- Funktion: Setzt die Adresse des akt. PSPs
-
- Aufruf: SetAktPSP
-
- Eingabe: BX = neues PSP-Segment
-
- SetAktPSP MACRO
- mov ah,050h
- int 021h
- #EM
-
- ----------------------------
- GetSetAktPSP
-
- Funktion: Ermittelt und setzt die Adresse des akt. PSPs
-
- Aufruf: GetSetAktPSP
-
- Eingabe: BX = neues PSP-Segment
-
- Ausgabe: BX = altes PSP-Segment
-
- GetSetAktPSP MACRO
- push dx
-
- push bx ; neues PSP sichern
- GetAktPSP ; altes PSP ermitteln
- mov dx,bx ; altes PSP in DX sichern
- pop bx ; BX = neues PSP
- SetAktPSP ; neues PSP setzen
- mov bx,dx ; BX = altes PS
-
- pop dx
- #EM
-
- ----------------------------
- GetIntVector
-
- Funktion: Ermittelt die Adresse eines Interrupt-Vectors
-
- Aufruf: GetIntVector
-
- Eingabe: AL = Nummer des Vectors
-
- Ausgabe: ES:BX -> Adresse des Vectors
-
- GetIntVector MACRO
- mov ah,035h
- int 021h
- #EM
-
- ----------------------------
- SetIntVector
-
- Funktion: Setzt die Adresse eines Interrupt-Vectors
-
- Aufruf: SetIntVector
-
- Eingabe: AL = Nummer des Vectors
- ES:BX -> neue Adresse für den Interrupt-Vector
-
- SetIntVector MACRO
- mov ah,025h
- int 021h
- #EM
-
- ----------------------------
- GetSetIntVector
-
- Funktion: Ermittelt und setzt die Adresse eines Interrupt-Vectors
-
- Aufruf: GetSetIntVector
-
- Eingabe: AL = Nummer des Vectors
- ES:BX -> neue Adresse für den Interrupt-Vector
-
- Ausgabe: DS:DX -> alte Adresse des Interrupt-Vectors
-
- GetSetIntVector MACRO
- GetIntVector
- SetIntVector
- #EM
-
- ----------------------------
- SetVerifyFlag
-
- Funktion: Setzt das Verify-Flag
-
- Aufruf: SetVerifyFlag
-
- Eingabe: AL = neuer Wert
- AL = 0 ->> Verify off
- AL = 1 ->> Verify on
-
- SetVerifyFlag MACRO
- push dx
- mov dl,0 ; für DOS-Version vor 3.0
- mov ah,02Eh
- int 021h
- pop dx
- #EM
-
- ----------------------------
- GetVerifyFlag
-
- Funktion: Ermittelt den Wert des Verify-Flags
-
- Aufruf: GetVerifyFlag
-
- Ausgabe: AL = akt. Wert des Verify-Flags
- AL = 0 ->> Verify off
- AL = 1 ->> Verify on
-
- GetVerifyFlag MACRO
- mov ah,054h
- int 021h
- #EM
-
- ----------------------------
- GetSetVerifyFlag
-
- Funktion: Ermittelt und setzt den Wert des Verify-Flags
-
- Aufruf: GetSetVerifyFlag
-
- Eingabe: AL = neuer Wert des Verify-Flags
- AL = 0 ->> Verify off
- AL = 1 ->> Verify on
-
- Ausgabe: AH = alter Wert des Verify-Flags
- AL = neuer Wert des Verify-Flags
-
- GetSetVerifyFlag MACRO
- push bx
- mov bl,al ; neuer Wert nach BL
- GetVerifyFLag
- mov bh,al ; alter Wert nach BH
- mov al,bl ; neuen Wert nach AL
- SetVerifyFlag ; und neuen Wert setzen
- mov ax,bx
- pop bx
- #EM
-
- ----------------------------
- SetBreakFlag
-
- Funktion: Setzt das Break-Flag
-
- Aufruf: SetBreakFlag
-
- Eingabe: AL = neuer Wert des BreakFlags
- AL = 0 ->> Break off
- AL = 1 ->> Break on
-
- SetBreakFlag MACRO
- push dx
- mov dl,al
- mov ax,03301h
- int 021h
- pop dx
- #EM
-
- ----------------------------
- GetBreakFlag
-
- Funktion: Ermittelt den Wert des Break-Flags
-
- Aufruf: GetBreakFlag
-
- Ausgabe: AL = akt. Wert des Break-Flags
- AL = 0 ->> Break off
- AL = 1 ->> Break on
-
- GetBreakFlag MACRO
- push dx
- mov ax,03300h
- int 021h
- mov al,dl
- pop dx
- #EM
-
- ----------------------------
- GetSetBreakFlag
-
- Funktion: Ermittelt und setzt den Wert des Break-Flags
-
- Aufruf: GetSetBreakFlag
-
- Eingabe: AL = neuer Wert des Break-Flags
- AL = 0 ->> Break off
- AL = 1 ->> Break on
-
- Ausgabe: AH = alter Wert des Break-Flags
- AL = neuer Wert des Break-Flags
-
- GetSetBreakFlag MACRO
- push dx
- mov dh,al ; DH = neuer Wert des Break-Flags
- mov dl,al ; DL = neuer Wert des Break-Flags
- mov ax,03302h ; Flag ermitteln und setzen
- int 021h ; DL = alter Wert des Break-Flags
- xchg dh,dl ; DH = alter Wert
- ; DL = neuer Wert
- mov ax,dx
- pop dx
- #EM
-
- ----------------------------
- SetDTA
-
- Funktion: Setzt die DTA auf eine neue Adresse
-
- Aufruf: SetDTA
-
- Eingabe: DS:DX -> neue DTA
-
- SetDTA MACRO
- mov ah,01Ah
- int 021h
- #EM
-
- ----------------------------
- GetDTA
-
- Funktion: Ermittelt die Adresse der DTA
-
- Aufruf: GetDTA
-
- Eingabe: ES:BX -> DTA
-
- GetDTA MACRO
- mov ah,02Fh
- int 021h
- #EM
-
- ----------------------------
- GetSetDTA
-
- Funktion: Setzt und ermittelt die Adresse der DTA
-
- Aufruf: GetSetDTA
-
- Eingabe: DS:DX -> neue DTA
-
- Ausgabe: ES:BX -> alte DTA
-
- GetSetDTA MACRO
- GetDTA
- SetDTA
- #EM
-
-