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

  1.   ─────────────────────────────────────────────────────────────────────────────
  2.   Dokumentation zur Datei: MACROS.MAC
  3.  
  4.   ─────────────────────────────────────────────────────────────────────────────
  5.    
  6.     MACROS.MAC   - allgemeine Macros und EQUs für die Demos
  7.                    (für den Assembler A86)
  8.    
  9.                    (c) Bernd Schemmer 1992
  10.                    Letzter Update: 03.02.1992
  11.    
  12.    
  13.     ■ EQUs für die Tastencodes
  14.    
  15.     LF            EQU  0Ah        ; Linefeed
  16.     TAB           EQU  09h        ; Tabulator
  17.     CR            EQU  0Dh        ; Return
  18.     CTRL_Z        EQU 01Ah        ; CTRL-Z
  19.     ESC           EQU 01Bh        ; ESC
  20.     BLANK         EQU 020h        ; Leerzeichen
  21.     NULL          EQU  00h        ; Nullbyte
  22.    
  23.     ■ Handles für die Standard Ein/Ausgabekanäle
  24.    
  25.     STDIN         EQU 0
  26.     STDOUT        EQU 1
  27.     STDERR        EQU 2
  28.     STDAUX        EQU 3
  29.     STDPRINT      EQU 4
  30.    
  31.    
  32.     ----------------------------
  33.     DefString
  34.    
  35.     Funktion: Macro zum Definieren eines Strings (mit Längenbyte)
  36.    
  37.     Aufruf:   DefString NameDesStrings, maxLänge {,Inhalt_1} {...} {,inhalt_n}
  38.    
  39.     Bes.:     Falls maxLänge größer als die Länge von Inhalt ist, wird
  40.               der Rest des Strings mit Leerzeichen aufgefüllt.
  41.    
  42.               Falls für maxLänge Null angegeben wird, wird der
  43.               String nur mit der Länge von Inhalt angelegt, in
  44.               allen anderen Fällen darf MaxLänge NICHT kleiner
  45.               als der Inhalt sein!
  46.               Zeichenketten für Inhalt müssen in Hochkommata oder
  47.               Gänsefüßchen angegeben werden!
  48.    
  49.      DefString MACRO
  50.  
  51.      #1       db #1_LENGTH         ; #1 = Name des Strings
  52.  
  53.      ##if #NL GE 3                 ; String evtl. initialisieren
  54.       #RX3L
  55.               db #X
  56.       #ER
  57.      ##endif
  58.                                    ; Länge des Stringinhaltes ermitteln
  59.               #1_LENGTH EQU ($ - Offset #1) -1
  60.  
  61.      ##if  #2 NE 0                 ; und evtl. restlichen Bytes des Strings mit
  62.                                    ; Leerzeichen initialisieren
  63.               db (#2 - #1_LENGTH) dup (' ')
  64.      ##endif
  65.  
  66.      #EM
  67.    
  68.     ----------------------------
  69.     MakeMsg
  70.    
  71.     Funktion: Macro zur Deklaration einer Zeichenkette mit angehängten
  72.               CR/LF und einer Konstanten mit der Länge der Zeichenkette
  73.    
  74.     Aufruf:   MakeMsg name, inhalt_1 {,Inhalt_2} {...} {,Inhalt_n}
  75.    
  76.     Bes.:     Das Macro definiert eine Variable name und eine Konstante
  77.               name_length.
  78.               Zeichenketten für Inhalt müssen in Hochkommata oder
  79.               Gänsefüßchen angegeben werden!
  80.    
  81.    
  82.      MakeMsg MACRO
  83.      #1       db
  84.               #RX2L
  85.                 db #X
  86.               #ER
  87.               db CR,LF
  88.               #1_LENGTH EQU ($ - Offset #1)
  89.      #EM
  90.    
  91.     ----------------------------
  92.     MakeMsg1
  93.    
  94.     Funktion: Macro zur Deklaration einer Zeichenkette OHNE angehängtem
  95.               CR/LF und einer Konstanten mit der Länge der Zeichenkette
  96.    
  97.     Aufruf:   MakeMsg name, inhalt_1 {,Inhalt_1} {...} {,inhalt_n}
  98.    
  99.     Bes.:     Das Macro definiert eine Variable name und eine Konstante
  100.               name_length
  101.               Zeichenketten für Inhalt müssen in Hochkommata oder
  102.               Gänsefüßchen angegeben werden!
  103.    
  104.    
  105.      MakeMsg1 MACRO
  106.      #1       db
  107.               #RX2L
  108.                 db #X
  109.               #ER
  110.               #1_LENGTH EQU ($ - Offset #1)
  111.      #EM
  112.    
  113.     ----------------------------
  114.     GetLength
  115.    
  116.     Funktion:  Macro zur Deklaration der Länge einer Zeichenkette als
  117.             Konstanten
  118.    
  119.     Aufruf:    GetLength Name_Der_Zeichenkette
  120.                (direkt nach der Deklaration!)        
  121.    
  122.      GetLength MACRO
  123.               #1_LENGTH EQU $ - Offset #1
  124.      #EM
  125.    
  126.     ----------------------------
  127.     Write_String
  128.    
  129.     Funktion:  Macro zur Ausgabe einer Zeichenkette auf die Standard-
  130.                Ausgabe
  131.    
  132.     Aufruf:    Write_String Name_Der_Zeichenkette
  133.    
  134.     Bes.:      Die Länge der Zeichenkette muß über die Konstante
  135.                Name_Der_Zeichenkette_LENGTH ermittelbar sein.
  136.    
  137.                Verändert keine Register
  138.    
  139.      Write_String MACRO
  140.               push dx,cx,bx,ax,ds
  141.               push cs
  142.               pop ds
  143.               mov dx,offset #1
  144.               mov cx,#1_LENGTH
  145.               mov bx,01h
  146.               mov ah,040h
  147.               int 021h
  148.               pop ds,ax,bx,cx,dx
  149.      #EM
  150.    
  151.     ----------------------------
  152.     TestDOSVersion
  153.    
  154.     Funktion:  Ermittelt und testet die DOS-Version
  155.    
  156.     Aufruf:    TestDOSVersion {major,minor}
  157.    
  158.     Parameter: major, minor  = mindestens nötige DOS-Version
  159.                                major = Hauptversion
  160.                                minor = Unterversion
  161.                                (Voreinstellung: 3.30)
  162.    
  163.     Ausgabe:   AX = DOS-Version (AH =Hauptversion, AL = Unterversion)
  164.    
  165.     Bes.:      Falls die akt. DOS-Version zu alt ist, gibt das Macro
  166.                eine Fehlermeldung über die Funktion 09h des Interrupt
  167.                21h aus und beendet das Programm über die Funktion 00h
  168.                des Interrupt 21h.
  169.    
  170.      TestDOSVersion MACRO
  171.               mov ah,030h
  172.               int 021h
  173.               xchg ah,al
  174.      ##IF #NL EQ 2
  175.               cmp ax, #1 BY #2
  176.      ##ELSE
  177.               cmp ax, 031Eh        ; Voreinstellung: 3.30
  178.      ##ENDIF
  179.               jae >m1              ; DOS-Version okay
  180.  
  181.                                    ; Falsche DOS-Version
  182.               mov dx,offset m0
  183.               mov ds,cs
  184.               mov ah,09h
  185.               int 021h             ; Fehlermeldung ausgeben
  186.               mov ah,0
  187.               int 021h             ; Programm beenden
  188.  
  189.        ------------------
  190.                                    ; Text der Fehlermeldung
  191.      m0 db 'Falsche DOS-Version!',0Dh,0Ah,'$'
  192.        ------------------
  193.      m1:
  194.      #EM
  195.    
  196.     ----------------------------
  197.     EndProcess
  198.    
  199.     Funktion: Beendet einen Prozess
  200.    
  201.     Aufruf:   EndProcess {returncode}
  202.    
  203.      EndProcess MACRO
  204.      ##IF #NL EQ 1
  205.        ##IF "#1" = "AL"
  206.        ##ELSE
  207.           mov al,#1
  208.        ##ENDIF
  209.      ##ENDIF
  210.           mov ah,04ch
  211.           int 021h
  212.      #EM
  213.    
  214.     ----------------------------
  215.     KeepProcess
  216.    
  217.     Funktion: Beendet ein Prozess, aber behält ihn im Speicher
  218.    
  219.     Aufruf:   KeepProcess {returncode}
  220.    
  221.     Eingabe:  DX = Anzahl resident zu haltender Paragraphen
  222.    
  223.      KeepProcess MACRO
  224.      ##IF #NL EQ 1
  225.        ##IF "#1" = "AL"
  226.        ##ELSE
  227.           mov al,#1
  228.        ##ENDIF
  229.      ##ENDIF
  230.           mov ah,031h
  231.           int 021h
  232.      #EM
  233.    
  234.     ----------------------------
  235.     GetProcessReturnCode
  236.    
  237.     Funktion: Ermittelt den Returncode eines Prozesses
  238.    
  239.     Ausgabe:  AH = Exit Code des Prozesses:
  240.                    00 - Prozess endete normal
  241.                    01 - Prozess wurde über CTRL-C abgebrochen
  242.                    02 - Prozess über einen kritischen Fehler beendet
  243.                    03 - Prozess über Funktion 31h des Interrupt 21h beendet
  244.               AL = Returncode des Prozesses
  245.    
  246.      GetProcessReturnCode MACRO
  247.               mov ah,04Dh
  248.               int 021h
  249.      #EM
  250.    
  251.     ----------------------------
  252.     GetAktPSP
  253.    
  254.     Funktion: Ermittelt die Adresse des akt. PSPs
  255.    
  256.     Aufruf:   GetAktPSP
  257.    
  258.     Ausgabe:  BX = akt. PSP-Segment
  259.    
  260.      GetAktPSP MACRO
  261.               mov ah,051h
  262.               int 021h
  263.      #EM
  264.    
  265.     ----------------------------
  266.     SetAktPSP
  267.    
  268.     Funktion: Setzt die Adresse des akt. PSPs
  269.    
  270.     Aufruf:   SetAktPSP
  271.    
  272.     Eingabe:  BX = neues PSP-Segment
  273.    
  274.      SetAktPSP MACRO
  275.               mov ah,050h
  276.               int 021h
  277.      #EM
  278.    
  279.     ----------------------------
  280.     GetSetAktPSP
  281.    
  282.     Funktion: Ermittelt und setzt die Adresse des akt. PSPs
  283.    
  284.     Aufruf:   GetSetAktPSP
  285.    
  286.     Eingabe:  BX = neues PSP-Segment
  287.    
  288.     Ausgabe:  BX = altes PSP-Segment
  289.    
  290.      GetSetAktPSP MACRO
  291.               push dx
  292.  
  293.               push bx              ; neues PSP sichern
  294.               GetAktPSP            ; altes PSP ermitteln
  295.               mov dx,bx            ; altes PSP in DX sichern
  296.               pop bx               ; BX = neues PSP
  297.               SetAktPSP            ; neues PSP setzen
  298.               mov bx,dx            ; BX = altes PS
  299.  
  300.               pop dx
  301.      #EM
  302.    
  303.     ----------------------------
  304.     GetIntVector
  305.    
  306.     Funktion: Ermittelt die Adresse eines Interrupt-Vectors
  307.    
  308.     Aufruf:   GetIntVector
  309.    
  310.     Eingabe:  AL = Nummer des Vectors
  311.    
  312.     Ausgabe:  ES:BX -> Adresse des Vectors
  313.    
  314.      GetIntVector MACRO
  315.               mov ah,035h
  316.               int 021h
  317.      #EM
  318.    
  319.     ----------------------------
  320.     SetIntVector
  321.    
  322.     Funktion: Setzt die Adresse eines Interrupt-Vectors
  323.    
  324.     Aufruf:   SetIntVector
  325.    
  326.     Eingabe:  AL = Nummer des Vectors
  327.               ES:BX -> neue Adresse für den Interrupt-Vector
  328.    
  329.      SetIntVector MACRO
  330.               mov ah,025h
  331.               int 021h
  332.      #EM
  333.    
  334.     ----------------------------
  335.     GetSetIntVector
  336.    
  337.     Funktion: Ermittelt und setzt die Adresse eines Interrupt-Vectors
  338.    
  339.     Aufruf:   GetSetIntVector
  340.    
  341.     Eingabe:  AL = Nummer des Vectors
  342.               ES:BX -> neue Adresse für den Interrupt-Vector
  343.    
  344.     Ausgabe:  DS:DX -> alte Adresse des Interrupt-Vectors
  345.    
  346.      GetSetIntVector MACRO
  347.               GetIntVector
  348.               SetIntVector
  349.      #EM
  350.    
  351.     ----------------------------
  352.     SetVerifyFlag
  353.    
  354.     Funktion: Setzt das Verify-Flag
  355.    
  356.     Aufruf:   SetVerifyFlag
  357.    
  358.     Eingabe:  AL = neuer Wert
  359.                    AL = 0 ->> Verify off
  360.                    AL = 1 ->> Verify on
  361.    
  362.      SetVerifyFlag MACRO
  363.               push dx
  364.               mov dl,0             ; für DOS-Version vor 3.0
  365.               mov ah,02Eh
  366.               int 021h
  367.               pop dx
  368.      #EM
  369.    
  370.     ----------------------------
  371.     GetVerifyFlag
  372.    
  373.     Funktion: Ermittelt den Wert des Verify-Flags
  374.    
  375.     Aufruf:   GetVerifyFlag
  376.    
  377.     Ausgabe:  AL = akt. Wert des Verify-Flags
  378.                    AL = 0 ->> Verify off
  379.                    AL = 1 ->> Verify on
  380.    
  381.      GetVerifyFlag MACRO
  382.               mov ah,054h
  383.               int 021h
  384.      #EM
  385.    
  386.     ----------------------------
  387.     GetSetVerifyFlag
  388.    
  389.     Funktion: Ermittelt und setzt den Wert des Verify-Flags
  390.    
  391.     Aufruf:   GetSetVerifyFlag
  392.    
  393.     Eingabe:  AL = neuer Wert des Verify-Flags
  394.                    AL = 0 ->> Verify off
  395.                    AL = 1 ->> Verify on
  396.    
  397.     Ausgabe:  AH = alter Wert des Verify-Flags
  398.               AL = neuer Wert des Verify-Flags
  399.    
  400.      GetSetVerifyFlag MACRO
  401.               push bx
  402.               mov bl,al            ; neuer Wert nach BL
  403.               GetVerifyFLag
  404.               mov bh,al            ; alter Wert nach BH
  405.               mov al,bl            ; neuen Wert nach AL
  406.               SetVerifyFlag        ; und neuen Wert setzen
  407.               mov ax,bx
  408.               pop bx
  409.      #EM
  410.    
  411.     ----------------------------
  412.     SetBreakFlag
  413.    
  414.     Funktion: Setzt das Break-Flag
  415.    
  416.     Aufruf:   SetBreakFlag
  417.    
  418.     Eingabe:  AL = neuer Wert des BreakFlags
  419.                    AL = 0 ->> Break off
  420.                    AL = 1 ->> Break on
  421.    
  422.      SetBreakFlag MACRO
  423.               push dx
  424.               mov dl,al
  425.               mov ax,03301h
  426.               int 021h
  427.               pop dx
  428.      #EM
  429.    
  430.     ----------------------------
  431.     GetBreakFlag
  432.    
  433.     Funktion: Ermittelt den Wert des Break-Flags
  434.    
  435.     Aufruf:   GetBreakFlag
  436.    
  437.     Ausgabe:  AL = akt. Wert des Break-Flags
  438.                    AL = 0 ->> Break off
  439.                    AL = 1 ->> Break on
  440.    
  441.      GetBreakFlag MACRO
  442.               push dx
  443.               mov ax,03300h
  444.               int 021h
  445.               mov al,dl
  446.               pop dx
  447.      #EM
  448.    
  449.     ----------------------------
  450.     GetSetBreakFlag
  451.    
  452.     Funktion: Ermittelt und setzt den Wert des Break-Flags
  453.    
  454.     Aufruf:   GetSetBreakFlag
  455.    
  456.     Eingabe:  AL = neuer Wert des Break-Flags
  457.                    AL = 0 ->> Break off
  458.                    AL = 1 ->> Break on
  459.    
  460.     Ausgabe:  AH = alter Wert des Break-Flags
  461.               AL = neuer Wert des Break-Flags
  462.    
  463.      GetSetBreakFlag MACRO
  464.               push dx
  465.               mov dh,al            ; DH = neuer Wert des Break-Flags
  466.               mov dl,al            ; DL = neuer Wert des Break-Flags
  467.               mov ax,03302h        ; Flag ermitteln und setzen
  468.               int 021h             ; DL = alter Wert des Break-Flags
  469.               xchg dh,dl           ; DH = alter Wert
  470.                                    ; DL = neuer Wert
  471.               mov ax,dx
  472.               pop dx
  473.      #EM
  474.    
  475.     ----------------------------
  476.     SetDTA
  477.    
  478.     Funktion: Setzt die DTA auf eine neue Adresse
  479.    
  480.     Aufruf:   SetDTA
  481.    
  482.     Eingabe:  DS:DX -> neue DTA
  483.    
  484.      SetDTA MACRO
  485.               mov ah,01Ah
  486.               int 021h
  487.      #EM
  488.    
  489.     ----------------------------
  490.     GetDTA
  491.    
  492.     Funktion: Ermittelt die Adresse der DTA
  493.    
  494.     Aufruf:   GetDTA
  495.    
  496.     Eingabe:  ES:BX -> DTA
  497.    
  498.      GetDTA MACRO
  499.               mov ah,02Fh
  500.               int 021h
  501.      #EM
  502.    
  503.     ----------------------------
  504.     GetSetDTA
  505.    
  506.     Funktion: Setzt und ermittelt die Adresse der DTA
  507.    
  508.     Aufruf:   GetSetDTA
  509.    
  510.     Eingabe:  DS:DX -> neue DTA
  511.    
  512.     Ausgabe:  ES:BX -> alte DTA
  513.    
  514.      GetSetDTA MACRO
  515.               GetDTA
  516.               SetDTA
  517.      #EM
  518.    
  519.