[Back to MISC SWAG index] [Back to Main SWAG index] [Original]

    {
    >I read in the BP7 bug list that BP7 doesn't save the extended registers
    >EAX through to EDX during an interrupt. Has anyone got the Inline code to
    >do this for me? I don't know assembler, so your help would be
    >appreciated.

    You only need to do this if your program might change them, i.e. your ISR
    uses longint calculations.  If that's the case, there are two approaches to
    saving them.

    From: dmurdoch@mast.queensu.ca (Duncan Murdoch)

    1.  Faster and smaller, but uses 16 bytes of stack space:
    }
     procedure PushEAXtoEDX;
     Inline(
      $66/                   {  db $66}
      $50/                   {  push ax}
      $66/                   {  db $66}
      $53/                   {  push bx}
      $66/                   {  db $66}
      $51/                   {  push cx}
      $66/                   {  db $66}
      $52);                  {  push dx}

     procedure PopEDXtoEAX;
     Inline(
      $66/                   {  db $66}
      $5A/                   {  pop dx}
      $66/                   {  db $66}
      $59/                   {  pop cx}
      $66/                   {  db $66}
      $5B/                   {  pop bx}
      $66/                   {  db $66}
      $58);                  {  pop ax}

    { 2.  Slightly slower and bigger, but only uses 8 bytes of stack space: }

      procedure PushHighWordEAXtoEDX;
      Inline(
      $66/                   {  db $66}
      $50/                   {  push ax}
      $58/                   {  pop ax}
      $66/                   {  db $66}
      $53/                   {  push bx}
      $5B/                   {  pop bx}
      $66/                   {  db $66}
      $51/                   {  push cx}
      $59/                   {  pop cx}
      $66/                   {  db $66}
      $52/                   {  push dx}
      $5A);                  {  pop dx}

      procedure PopHighWordEDXtoEAX;
      Inline(
      $52/                   {  push dx}
      $66/                   {  db $66}
      $5A/                   {  pop dx}
      $51/                   {  push cx}
      $66/                   {  db $66}
      $59/                   {  pop cx}
      $53/                   {  push bx}
      $66/                   {  db $66}
      $5B/                   {  pop bx}
      $50/                   {  push ax}
      $66/                   {  db $66}
      $58);                  {  pop ax}
    {
    (I used David Baldwin's INLINE assembler to get the opcodes.)

    These are untested.  For tested ones, look at the source to TRASHDET,
    included with the bug list.
    }

[Back to MISC SWAG index] [Back to Main SWAG index] [Original]