home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
library
/
lib4a86
/
doc
/
macros.doc
< prev
next >
Wrap
Text File
|
1992-02-15
|
14KB
|
519 lines
─────────────────────────────────────────────────────────────────────────────
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