home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
lib
/
macros.mac
< prev
next >
Wrap
Text File
|
1992-02-15
|
12KB
|
530 lines
;
; MACROS.MAC - allgemeine Macros und EQUs
; (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!
;
#if !DefString ; nur definieren, falls noch nicht vorhanden
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
#endif
;
; ----------------------------
; 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,ds
mov ds,cs
mov dx,offset #1
mov cx,#1_LENGTH
call OutputMsg
pop ds,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
;
; ***** END OF PUBLIC *****
; interne Routinen
; ----------------------------
;