{
The following code shows how to create a temporary stack
for use during ISRs and in other situations where the
default stack might not be big enough.

The following program intentionally creates a very small
default stack by using the $M compiler directive. It then
calls a function which pushes $2000 bytes onto the stack,
thereby setting up a situation which should cause a 202 error.

To avoid the error, the program creates a temporary stack
by allocating $4000 bytes on the heap and moving this value
into SS. It then sets SP to point at the end of this new
stack and proceeds to call the function, which does not
fail because of the new temporary stack.

This code has been tested in both real and protected mode.
}


{$M $800, 0, $12000}

procedure BreakDefaultStack;
var
  a:array[0..$2000] of char;
begin
  Writeln('Hello');
end;

var
  aSS, aSP: Word;
  Stck: pointer;

begin
  getmem(Stck, $4000);
  Word (Stck^) := 1;

  asm
    mov aSP, sp
    mov ax, ss
    mov aSS, ax
    mov ax, word ptr [Stck]
    mov bx, word ptr [stck+2]
    add ax, $4000-2
    cli
    mov ss, bx
    mov sp, ax
    sti
  end;

  BreakDefaultStack;

  asm
    mov ax, aSS
    mov ss, ax
    mov sp, aSP
  end;

  freemem(Stck, $4000);
end.
