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

    {
    MC> I once saw an advo for TMP BBS.
    MC> It had an ANSi screen that "bounced" up and down.
    MC>
    MC> It was coded in ASM, but I wondered if Pascal could do the same. (without
    MC> having to do all ASM calls.)

         Of course, but there are some calls to ports that have to be  done.

    MC> The screen would bounce once, and then again, but with less height, ...
    MC> It looked like a ball bouncing.

         Well, Here's some of my code.. It does a pretty good job of  imitating a
    ball bouncing, but one of the bounces goes higher than  the other.. Haven't
    really had time to look into it. Hopefully you  have TheDraw because I made
    the program such that you have to save  your ANSI as a normal Pascal file in
    The Draw and then cut and  paste it into the program. Hope this helps!

    {/////////////////////////////Program/////////////////////////////////////}
    Program AnsiBounce;
    {Right here you place all the ANSI data from TheDraw.. When I tried, I just
     saved my picture in The Draw as a Normal pascal file and used the
     default identifier. THen I cut and pasted!                        }

    Var
      start,Speed : integer;   {Where to position the screen and how fast to inc}
      cnt,Winc : byte;         {two dummy counters}

    procedure SetScreenStart(ScanLine:word);            { MAIN PROCEDURE !!!!   }
    {This procedure just adjusts the text viewport.. Jon Merkel gave it to me   }
    var    StartAddress: word; begin    StartAddress := (ScanLine div 16)*80;
        portw[$3D4] := hi(StartAddress) shl 8 + $0C;    { Set start address     }
        portw[$3D4] := lo(StartAddress) shl 8 + $0D;
        repeat until port[$3DA] and 8<>0;               { wait for retrace      }
        portw[$3D4] := (ScanLine mod 16) shl 8 + 8;     { Set start scanline    }
        repeat until port[$3DA] and 8=0;                { wait out retrace      }
    end;
    begin
      asm mov ax,3; int 10h; end;     {set to 80x25 text mode just in case}
      asm in al,21h; or al,2; out 21h,al; end;        { Disable the keyboard  }
      asm mov ax,0100h; mov cx,2000h; int 10h; end;   { Hide the cursor       }
      fillchar(mem[$B800:0], 32768, 0);        {Clear the screen }
      Start := 25*16;
      SetScreenStart(start);
      Move(ImageData,mem[$B800:20*16],ImageData_length); {put our image on screen}
      Speed := -3;  cnt := 0; Winc:=0;
      Repeat      {Repeat Repeat Repeat Repeat Repeat... sorry ;) }
        inc(cnt);                          {Dummy counter for the gravity}
        Inc(start,SPeed);                  {Where to position screenStart}
        If Cnt mod 2 = 0 then              {Gives the gravity effect}
          Dec(Speed);
        If Start <=0  Then Begin           {We have reached the top!}
          Speed := abs(- (Speed) - 2);
          Inc(Winc)                  {When this gets to 15, we stop the loop}
        End;                {A term used to close the argument =) }
        SetScreenStart(start);             {Position the Screen!}
      Until (Winc>=15) or (port[$60] = $1);   {or escape is hit}
      repeat until port[$60] = $1;            {wait till you hit escape }
      asm in al,21h; and al,253; out 21h,al; end;         { enable keyboard   }
      asm mov ax,3; int 10h; end;      { reset the text mode   } end.

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