home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 03 / format / setblock.inc < prev   
Encoding:
Text File  |  1987-12-17  |  3.4 KB  |  50 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*                             SETBLOCK.INC                                *)
  3. (*   aus "Externe Kommandos in Turbo Pascal" (PASCAL 4/87, Seite 72 ff)    *)
  4. (* Aufgabe: Verkleinern eines von MS-DOS zugewiesenen Speicherbereichs um  *)
  5. (* n Paragraphen und Verschieben des Turbo Turbo Pascal Stack-Segments.    *)
  6. (* Vor Aufruf dieser Funktion sollten keine dynamischen Groessen auf den   *)
  7. (* Heap gelegt werden, da der Stack in diesen verschoben wird.             *)
  8. (* Funktionswert = 0, wenn Aenderung erfolgreich                           *)
  9. (*               = 7, Fehler: memory control blocks zerstoert              *)
  10. (*               = 8, Fehler: nicht genug Speicherplatz frei               *)
  11. (*               = 9, Fehler: ungueltige memory control block Adresse      *)
  12. (* System: Turbo Pascal 3.0  &  MS-DOS                                     *)
  13.  
  14. FUNCTION SetBlock (Para_freigeben : INTEGER) : INTEGER;
  15.  
  16. BEGIN
  17.   INLINE($1E             (*      Push  DS        ; DS-Register sichern     *)
  18.         /$8C/$C8         (*      Mov   AX,CS     ; Groesse in Paragraphen  *)
  19.         /$8C/$D3         (*      Mov   BX,SS     ; des aktuellen Blocks =  *)
  20.         /$81/$C3/$00/$10 (*      Add   BX,=$1000 ; SS + $1000 - CS         *)
  21.         /$2B/$D8         (*      Sub   BX,AX     ; - Para_freigeben =      *)
  22.         /$2B/$9E         (*      Sub   BX,[BP]Para_freigeben               *)
  23.             /Para_freigeben                   (* ; Neue Block-Groesse      *)
  24.         /$8E/$C0         (*      Mov   ES,AX     ; Segment aktueller Block *)
  25.         /$B4/$4A         (*      Mov   AH,4Ah    ; DOS-Funktion $4A        *)
  26.         /$CD/$21         (*      Int   21h       ; Block-Veraenderung      *)
  27.         /$B4/$00         (*      Mov   AH,0                                *)
  28.         /$72/$1B         (*      JB    Ende      ; Freigabe moeglich ?     *)
  29.         /$8C/$D0         (*      Mov   AX,SS     ; - Ja, Stack verschieben *)
  30.         /$8E/$D8         (*      Mov   DS,AX     ; DS:SI = Zeiger auf      *)
  31.         /$2B/$86         (*      Sub   AX,[BP]Para_freigeben ; alten Stack *)
  32.             /Para_freigeben
  33.         /$8E/$C0         (*      Mov   ES,AX     ; ES:DI = Zeiger auf      *)
  34.         /$8B/$DC         (*      Mov   BX,SP                   neuen Stack *)
  35.         /$8B/$FB         (*      Mov   DI,BX                               *)
  36.         /$8B/$F3         (*      Mov   SI,BX                               *)
  37.         /$8B/$CC         (*      Mov   CX,SP     ; Zweierkomplement von SP *)
  38.         /$F7/$D9         (*      Neg   CX        ; ist die Stack-Groesse   *)
  39.         /$FC             (*      ClD             ; CX Bytes verschieben    *)
  40.         /$F3/$A4         (*      Rep   MovS (B)  ; von DS:SI nach ES:DI    *)
  41.         /$8E/$D0         (*      Mov   SS,AX     ; Stack-Register umsetzen *)
  42.         /$33/$C0         (*      XOr   AX,AX     ; Fehlercode = 0          *)
  43.         /$1F             (* Ende: Pop   DS                                 *)
  44.         /$8B/$E5         (*      Mov   SP,BP     ; Ruecksprung             *)
  45.         /$5D             (*      Pop   BP                                  *)
  46.         /$C2/$04/$00  ); (*      Ret   4                                   *)
  47. END;
  48. (*-------------------------------------------------------------------------*)
  49. (*                             SETBLOCK.INC                                *)
  50.