home *** CD-ROM | disk | FTP | other *** search
- (*-------------------------------------------------------------------------*)
- (* SETBLOCK.INC *)
- (* aus "Externe Kommandos in Turbo Pascal" (PASCAL 4/87, Seite 72 ff) *)
- (* Aufgabe: Verkleinern eines von MS-DOS zugewiesenen Speicherbereichs um *)
- (* n Paragraphen und Verschieben des Turbo Turbo Pascal Stack-Segments. *)
- (* Vor Aufruf dieser Funktion sollten keine dynamischen Groessen auf den *)
- (* Heap gelegt werden, da der Stack in diesen verschoben wird. *)
- (* Funktionswert = 0, wenn Aenderung erfolgreich *)
- (* = 7, Fehler: memory control blocks zerstoert *)
- (* = 8, Fehler: nicht genug Speicherplatz frei *)
- (* = 9, Fehler: ungueltige memory control block Adresse *)
- (* System: Turbo Pascal 3.0 & MS-DOS *)
-
- FUNCTION SetBlock (Para_freigeben : INTEGER) : INTEGER;
-
- BEGIN
- INLINE($1E (* Push DS ; DS-Register sichern *)
- /$8C/$C8 (* Mov AX,CS ; Groesse in Paragraphen *)
- /$8C/$D3 (* Mov BX,SS ; des aktuellen Blocks = *)
- /$81/$C3/$00/$10 (* Add BX,=$1000 ; SS + $1000 - CS *)
- /$2B/$D8 (* Sub BX,AX ; - Para_freigeben = *)
- /$2B/$9E (* Sub BX,[BP]Para_freigeben *)
- /Para_freigeben (* ; Neue Block-Groesse *)
- /$8E/$C0 (* Mov ES,AX ; Segment aktueller Block *)
- /$B4/$4A (* Mov AH,4Ah ; DOS-Funktion $4A *)
- /$CD/$21 (* Int 21h ; Block-Veraenderung *)
- /$B4/$00 (* Mov AH,0 *)
- /$72/$1B (* JB Ende ; Freigabe moeglich ? *)
- /$8C/$D0 (* Mov AX,SS ; - Ja, Stack verschieben *)
- /$8E/$D8 (* Mov DS,AX ; DS:SI = Zeiger auf *)
- /$2B/$86 (* Sub AX,[BP]Para_freigeben ; alten Stack *)
- /Para_freigeben
- /$8E/$C0 (* Mov ES,AX ; ES:DI = Zeiger auf *)
- /$8B/$DC (* Mov BX,SP neuen Stack *)
- /$8B/$FB (* Mov DI,BX *)
- /$8B/$F3 (* Mov SI,BX *)
- /$8B/$CC (* Mov CX,SP ; Zweierkomplement von SP *)
- /$F7/$D9 (* Neg CX ; ist die Stack-Groesse *)
- /$FC (* ClD ; CX Bytes verschieben *)
- /$F3/$A4 (* Rep MovS (B) ; von DS:SI nach ES:DI *)
- /$8E/$D0 (* Mov SS,AX ; Stack-Register umsetzen *)
- /$33/$C0 (* XOr AX,AX ; Fehlercode = 0 *)
- /$1F (* Ende: Pop DS *)
- /$8B/$E5 (* Mov SP,BP ; Ruecksprung *)
- /$5D (* Pop BP *)
- /$C2/$04/$00 ); (* Ret 4 *)
- END;
- (*-------------------------------------------------------------------------*)
- (* SETBLOCK.INC *)
-