home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / lib4a86 / doc / memory.doc < prev    next >
Text File  |  1992-02-11  |  13KB  |  336 lines

  1.   ─────────────────────────────────────────────────────────────────────────────
  2.   Dokumentation zur Datei: MEMORY.INC
  3.  
  4.   ─────────────────────────────────────────────────────────────────────────────
  5.    
  6.     MEMORY.INC   - Routinen zur Benutzung der Speicherverwaltung von DOS
  7.                    (für den Assembler A86)
  8.    
  9.                    (c) Bernd Schemmer 1992
  10.                    Letzter Update: 11.02.1992
  11.    
  12.    
  13.     ■ Routinen:
  14.     -----------
  15.     CalcBytes             - Rechnet Paragraphen in Bytes um
  16.     CalcParagraphs        - Rechnet Bytes in Paragraphen um
  17.     GetBlockSize          - Ermittelt die Größe und den Besitzer eines
  18.                             Speicherblocks
  19.     SetBlockSize          - Verändert die Größe eines Speicherblocks
  20.     GetMemoryBlock        - Allociert einen Speicherblock
  21.     FreeMemoryBlock       - Gibt einen Speicherblock wieder frei
  22.     GetMemoryStrategy     - Ermittelt die akt. Speicherbelegungsstrategie
  23.     SetMemoryStrategy     - Ändert die akt. Speicherbelegungsstrategie
  24.     SetBlockName          - Markiert einen Speicherblock mit einen Namen
  25.     GetOwnerName          - Ermittelt den Namen eines Speicherblockes
  26.     SearchMemoryBlock     - Sucht einen bestimmten Speicherblock
  27.     TestMemoryBlock       - Überprüft einen Speicherblock
  28.    
  29.     ab DOS 5.0:
  30.     -----------
  31.     GetUMBLinkStatus      - Ermittelt, ob die UMBs eingebunden sind
  32.     SetUMBLinkStatus      - Einbinden oder rausnehmen der UMBs
  33.    
  34.     Die Routinen benutzen das Register AX als Arbeitssregister.
  35.    
  36.     Fast alle Routinen benutzen die undokumentierten MCBs.
  37.    
  38.    
  39.     ■ Fehlernummern der Routinen
  40.     ----------------------------
  41.    
  42.     Alle Fehlernummern der Routinen haben das Format 81xx, wobei xx die
  43.     Nummer des eigentlichen Fehlers ist. Neben diesen werden auch die
  44.     DOS-Fehlernummern im Format 00xx zurückgeliefert (normalerweise nur
  45.     die Fehlernummern 01h, 07h, 08h und 09h).
  46.    
  47.     Name                   Nummer   Bedeutung
  48.     ----------------------------------------------------------------------
  49.                             00xxh ; DOS-Fehlernummern
  50.                                   ; zusätzliche Fehlernummern der Routinen
  51.                                   ; --------------------------------------
  52.     MemoryBlockError   EQU 08101h ; falsche Blockadressse angegeben
  53.    
  54.     InvalidBlockLength EQU 08102h ; falsche Blockgrösse angegeben
  55.    
  56.     BlockIsFree        EQU 08103h ; Block ist frei
  57.    
  58.     BlockBelongstoDOS  EQU 08104h ; Block gehört DOS
  59.    
  60.     BlockIsNoMainBlock EQU 08105h ; Block ist kein Hauptblock
  61.    
  62.     InvalidBlockName   EQU 08106h ; falscher Name für den Block angegeben
  63.    
  64.     BlockNotFound      EQU 08107h ; Block nicht gefunden
  65.    
  66.    
  67.     ----------------------------
  68.     CalcParagraphs
  69.    
  70.     Funktion: Umrechnen von Bytes in Paragraphen
  71.    
  72.     Eingabe:  DX:AX = Wert in Byte
  73.    
  74.     Ausgabe:  BX = Wert in Paragraphen
  75.    
  76.     Bes.:     Der Wert wird auf die nächste Paragraphengrenze aufgerundet.
  77.               (Benutzt nicht den DIV-Befehl)
  78.    
  79.               Da für das Ergebnis nur ein Register benutzt wird, ist der
  80.               maximal mögliche Wert in DX:AX gleich 0FFFF0h.
  81.    
  82.     ----------------------------
  83.     CalcBytes
  84.    
  85.     Funktion: Umrechnen von Paragraphen in Bytes
  86.    
  87.     Eingabe:  BX = Wert in Paragraphen
  88.    
  89.     Ausgabe:  DX:AX = Wert in Byte
  90.    
  91.     Bes.:     Da für den Wert in Paragraphen nur ein Register benutzt
  92.               wird, kann das Ergebnis maximal 0FFFF0h betragen.
  93.    
  94.     ----------------------------
  95.     SearchMemoryBlock
  96.    
  97.     Funktion: Sucht einen Speicherblock mit einem bestimmten Namen
  98.    
  99.     Eingabe:  DS:SI -> String mit dem Namen (max. 8 Zeichen)
  100.    
  101.     Ausgabe:  CF = 0 ->> Okay
  102.                          ES = Segment des Blocks
  103.                          CX = Nummer des Speicherblocks
  104.               CF = 1 ->> Fehler
  105.                          AX = Fehlernummer
  106.                          speziell:
  107.                          AX = BlockNotFound
  108.                               ->> Block nicht vorhanden
  109.                                   CX = Anzahl Speicherblöcke
  110.                                   ES = Segment des letzten Blocks
  111.    
  112.     Bes.:     DOS 4+ wird vorrausgesetzt (falls ein Programm nicht selber
  113.               seinen Speicherblock mit einen Namen markiert, wie es z.B.
  114.               meine speicherresidenten Programme tun).
  115.               Das Directionflag wird gelöscht
  116.               Die Groß- und Kleinschreibung des Namens ist signifikant.
  117.               Benutzt die undokumentierte Funktion 52h des Interrupt 21h
  118.               und den undokumentierten DOS-Info-Block.
  119.    
  120.     ----------------------------
  121.     TestMemoryBlock
  122.    
  123.     Funktion: Testet, ob das Register ES das Segment eines
  124.               Speicherblocks enthält
  125.    
  126.     Eingabe:  ES = Segment des Blocks
  127.    
  128.     Ausgabe:  CF = 0 ->> okay
  129.               CF = 1 ->> Fehler
  130.                          AX = Fehlernummer
  131.    
  132.     ----------------------------
  133.     SetBlockName
  134.    
  135.     Funktion: Markiert einen Speicherblock mit einem Namen
  136.    
  137.     Eingabe:  ES = Segment des Speicherblocks (Hauptblock)
  138.               DS:SI = String, es werden nur die ersten 8 Zeichen des
  139.                       Strings berücksichtigt
  140.                       (Pascal-Format also mit Längenbyte)
  141.    
  142.     Ausgabe:  CF = 0 ->> okay, Block markiert
  143.                          BX = Länge des eingetragenen Namens
  144.               CF = 1 ->> Fehler
  145.                          BX = undefiniert
  146.                          AX = Fehlernummer
  147.    
  148.     Bes.:     Unter DOS 4+ ist diese Routine nicht mehr nötig, da
  149.               DOS selber die Speicherblöcke mit dem Namen markiert.
  150.    
  151.     ----------------------------
  152.     GetOwnerName
  153.    
  154.     Funktion: Ermittelt den Namen des Besitzers eines Speicherblocks
  155.    
  156.     Eingabe:  ES = Segment des Speicherblocks
  157.                    ES kann auf einen beliebigen Speicherblock zeigen,
  158.                    es wird immer der Name aus dem zugehörigem Hauptblock
  159.                    ermittelt.
  160.               DS:SI = Puffer für einen String mit bis zu 8 Zeichen
  161.                       (Pascal-Format also mit Längenbyte)
  162.    
  163.     Ausgabe:  CF = 0 ->> okay, Puffer gefüllt
  164.                          BX = Länge des Namens des Besitzers
  165.                          AL = 0 ->> Block ist ein Hauptblock
  166.                          AL = 1 ->> Block ist KEIN Hauptblock
  167.               CF = 1 ->> Fehler
  168.                          AX = Fehlernummer
  169.                          BX = undefiniert
  170.                          Der String für den Namen ist gelöscht.
  171.    
  172.     Bes.:     DOS 4+ wird vorrausgesetzt (falls ein Programm nicht selber
  173.               seinen Speicherblock mit einem Namen markiert, wie es z.B.
  174.               meine speicherresidenten Programme tun).
  175.    
  176.     ----------------------------
  177.     GetUMBLinkStatus
  178.    
  179.     Funktion: Ermittelt die akt. Behandlung der UMBs
  180.    
  181.     Eingabe:  -
  182.    
  183.     Ausgabe:  CF = 0 ->> okay
  184.                          AL = 0 ->> UMBs nicht eingebunden
  185.                          AX = 1 ->> UMBs eingebunden
  186.               CF = 1 ->> Fehler
  187.                          AX = Fehlernummer
  188.    
  189.     Bes.:     Benutzt die undokumentierte (?) Funktion 58h des Interrupt 21h.
  190.               DOS 5+ wird vorrausgesetzt!
  191.    
  192.     ----------------------------
  193.     SetUMBLinkStatus
  194.    
  195.     Funktion: Ändert die Behandlung des UMBs
  196.    
  197.     Eingabe:  AX = neue Strategie:
  198.                    Bit 0 von AX = 0 ->> UMBs einbinden
  199.                    Bit 0 von AX = 1 ->> UMBs nicht einbinden
  200.    
  201.     Ausgabe:  CF = 0 ->> okay
  202.               CF = 1 ->> Fehler
  203.                          AX = Fehlernummer
  204.    
  205.     Bes.:     Benutzt die undokumentierte (?) Funktion 58h des Interrupt 21h.
  206.               DOS 5+ wird vorrausgesetzt!
  207.    
  208.               Die Speicherbelegungsstrategie wird vom DOS beim Programmende
  209.               NICHT automatisch restauriert! Jedes Programm, daß diese
  210.               Strategie ändert sollte daher die alte Strategie vor dem
  211.               Programmende wieder einsetzen!
  212.    
  213.     ----------------------------
  214.     GetMemoryStrategy
  215.    
  216.     Funktion: Ermittelt die akt. Speicherbelegungsstrategie
  217.    
  218.     Eingabe:  -
  219.    
  220.     Ausgabe:  CF = 0 ->> okay, AX = Speicherbelegungsstrategie
  221.                          AL = 0 ->> First Fit
  222.                          AL = 1 ->> Last Fit
  223.                          AL = 2 ->> Best Fit
  224.                        ab DOS 5+ zusätzlich falls die UMBs eingebunden sind:
  225.                          Bit 6 gesetzt: UMB only
  226.                          Bit 7 gesetzt: UMB first
  227.                        vor DOS 5:
  228.                          AL > 2 ->> Best Fit
  229.               CF = 1 ->> Fehler
  230.                          AX = Fehlernummer
  231.    
  232.     Bes.:     Benutzt die undokumentierte (?) Funktion 58h des Interrupt 21h.
  233.               DOS 3+ wird vorrausgesetzt!
  234.    
  235.     ----------------------------
  236.     SetMemoryStrategy
  237.    
  238.     Funktion: Ändert die Speicherbelegungsstrategie
  239.    
  240.     Eingabe:  AX = neue Strategie:
  241.                    AX = 0 ->> First Fit (von unten nach oben, Default)
  242.                    AX = 1 ->> Last Fit  (von oben nach unten)
  243.                    AX = 2 ->> Best Fit  (optimalsten Block suchen)
  244.                  ab DOS 5+ zusätzlich falls die UMBs eingebunden sind:
  245.                    Bit 6 gesetzt: UMB only
  246.                    Bit 7 gesetzt: UMB first
  247.                  vor DOS 5:
  248.                    AL > 2 ->> Best Fit
  249.    
  250.     Ausgabe:  CF = 0 ->> okay
  251.               CF = 1 ->> Fehler
  252.                          AX = Fehlernummer
  253.    
  254.     Bes.:     Benutzt die undokumentierte (?) Funktion 58h des Interrupt 21h.
  255.               DOS 3+ wird vorrausgesetzt!
  256.    
  257.               Die Speicherbelegungsstrategie wird vom DOS beim Programmende
  258.               NICHT automatisch restauriert! Jedes Programm, daß diese
  259.               Strategie ändert sollte daher die alte Strategie vor dem
  260.               Programmende wieder einsetzen!
  261.    
  262.     ----------------------------
  263.     GetMemoryBlock
  264.    
  265.     Funktion: Belegt einen Speicherblock
  266.    
  267.     Eingabe:  BX = Größe des Blocks in Paragraphen (BX > 0)
  268.    
  269.     Ausgabe:  CF = 0 ->> okay
  270.                          AX = Segment des Blocks
  271.               CF = 1 ->> Fehler
  272.                          AX = Fehlernummer
  273.                          speziell:
  274.                          AX = 08h : Speicherblock der angegebenen Größe
  275.                                     nicht verfügbar
  276.                                     BX = max. Größe für einen neuen Block
  277.    
  278.     Bes.:     .COM-Programme belegen nach dem Start den größten freien
  279.               Speicherblock komplett. Sie müssen daher normalerweise vor
  280.               der Anforderung eines neuen Speicherblocks ihren eigenen
  281.               Speicherblock verkleinern!
  282.    
  283.               Zur Ermittlung des größten freien Speicherblocks kann die
  284.               Routine mit BX = 0FFFFh aufgerufen werden. Sie sollte in
  285.               diesem Fall immer mit dem Fehler 8 enden (d.h. in BX
  286.               steht nach der Rückkehr die max. Größe eines neuen Blocks)
  287.    
  288.     ----------------------------
  289.     FreeMemoryBlock
  290.    
  291.     Funktion: Freigabe eines Speicherblocks
  292.    
  293.     Eingabe:  ES = Segment des Speicherblocks
  294.    
  295.     Ausgabe:  CF = 0 ->> okay
  296.               CF = 1 ->> Fehler
  297.                          AX = Fehlernummer
  298.    
  299.     ----------------------------
  300.     SetBlockSize
  301.    
  302.     Funktion: Verändert die Größe eines Speicherblocks
  303.    
  304.     Eingabe:  ES = Segment des Speicherblocks
  305.               BX = neue Blockgrösse in Paragraphen (BX > 0)
  306.    
  307.     Ausgabe:  CF = 0 ->> okay
  308.                          AX = neue Größe des Speicherblocks in
  309.                               Paragraphen
  310.               CF = 1 ->> Fehler, Speicherblock wurde NICHT verändert!
  311.                          AX = Fehlernummer
  312.                          speziell:
  313.                          AX =    08h : Speicherblock kann nicht auf die
  314.                                        angegebene Größe gesetzt werden
  315.                                        BX = max. Größe für den Block
  316.    
  317.     ----------------------------
  318.     GetBlockSize
  319.    
  320.     Funktion: Ermittelt die Größe eines Speicherblocks
  321.    
  322.     Eingabe:  ES = Segment des Speicherblocks
  323.    
  324.     Ausgabe:  CF = 0 ->> okay
  325.                          BX = Größe des Speicherblocks in Paragraphen
  326.                          AX = Besitzer des Speicherblocks
  327.                               AX = 0 ->> Block ist frei
  328.                               AX = 8 ->> Block gehört DOS
  329.                               sonst  ->> AX = PSP des Besitzers
  330.                          ZF = 1 ->> Speicherblock IST der letzte Block
  331.                          ZF = 0 ->> Speicherblock ist NICHT der letzte Block
  332.               CF = 1 ->> Fehler, ES enthält NICHT das Segment eines
  333.                          Speicherblocks
  334.                          AX = Fehlernummer
  335.    
  336.