Program Wurlli;

{* Dieses Programm stellt OPAA-Bobs, die im Assembler-Format (ASS)
   gesichert wurden auf dem Bildschirm dar.}

{* Version 0.41 - vom 08.03.1994 * }


{$path "pascal:include/";
incl"intuition.lib";
incl "graphics.lib";
incl "libraries/dos.h"}

Var
  Scn:      ^Screen;
  a:        Word;       { Zähler }
  i:        Integer;
  x:        Integer;
  BMap:     BitMap;
  ObjAddr:  Ptr;        { Basisadresse der Objekte }

  InFile, OutFile: Long
  Buffer:   String[20]
  Len:      Long;

  PtrB:     ^Byte;
  PtrW:     ^Word;
  PtrL:     ^Long;
  ErgB:     Byte;
  ErgW:     Word;
  ErgL:     Long;

  Width:    Word;       { Objektbreite in Worten }
  Height:   Word;       { Objekthöhe }
  Depth:    Word;       { Objekt-Bitplane-Anzahl}



  {*** }
  {*** BitMap eines Objekts erstellen ***}
  {*** }
  Procedure MakeObjBMap (ObjNr: Word);

    Var
      Offset:   Word;
      BpSize:   Word;
      Cnt:      Word;

    Begin
      PtrW   := Ptr( Long(ObjAddr) + 16 + 2*ObjNr);
      Offset := PtrW^;

      PtrW  := Ptr( Long(ObjAddr) + Offset + 0);
      Width := PtrW^;
      Width := Width
      PtrW   := Ptr( Long(ObjAddr) + Offset + 2);
      Height := PtrW^;
      PtrW  := Ptr( Long(ObjAddr) + Offset + 4);
      Depth := PtrW^;
      PtrW   := Ptr( Long(ObjAddr) + Offset + 6);
      BpSize := PtrW^;
      PtrW  := Ptr( Long(ObjAddr) + Offset + 14);

      {*** Make Obj-BitMap ***}
      BMap.BytesPerRow:=Width*2;
      BMap.Rows:=Height;
      BMap.Depth:=Depth;
      For Cnt:=1 To Depth Do
        Begin
          BMap.Planes[Cnt-1]:=Ptr(PtrW);
          PtrW := Ptr( Long(PtrW) + BpSize);
        End;
    End;


  {*** }
  {*** Objekt auf Bildschirm bringen ***}
  {*** }
  Procedure MoveObj (ObjNr: Word; XCord,YCord: Word);
    Begin
      MakeObjBMap (ObjNr)
      BltBitMapRastPort(^BMap,0,0,
                        ^Scn^.RastPort,XCord,YCord,
                        Width*16,Height,%11001100);
    End;


  {*** Objekt vom Bildschirm löschen ***}
  {*** }
  {*** }
  Procedure ClrObj (ObjNr: Word; XCord,YCord: Word);
    Begin

      MakeObjBMap (ObjNr)
      BltBitMapRastPort(^BMap,0,0,
                        ^Scn^.RastPort,XCord,YCord,
                        Width*16,Height,%00000000);
    End;



{*** }
{*** Hauptprogramm ***}
{*** }
Begin

  {*** Libraries öffnen ***}
  OpenLib(IntBase,'intuition.library',0);
  OpenLib(GfxBase,'graphics.library',0);
  OpenLib(DosBase,'dos.library',0);

  {*** Screen öffnen ***}
  Scn:=Open_Screen(0,0,320,256,5,0,1,$4000,"Wurrli V0.41")


  {*** ASS-Datei öffnen ***}
  InFile := Open("OPAA:Objects/Wurrli.ass", MODE_OLDFILE);

  If InFile=0 Then
    Error ("Datei 'Wurrli.ass' nicht gefunden!")

  {*** erste 12 Bytes einlesen ***}
  Len:= DosRead(InFile, ^Buffer, 12);

  PtrL := Ptr( Long(^Buffer) + 8);
  ErgL := PtrL^

  {*** Speicher für restliche Datei (Objekte) reservieren ***}
  ObjAddr:=Ptr( Alloc_Mem(ErgL, 2) );   { 2 = "MEMF_CHIP" }

  {*** Objekte einlesen ***}
  Len:= DosRead(InFile, ObjAddr, ErgL);

  {*** Datei wieder schließen ***}
  DosClose (InFile);


  Delay(2*50)

  {*** Objekte auf Bildschirm ausgeben ***}

  x:=50;

  For a:= 1 to 10 do
  Begin;

    For i:= 0 to 3 do
      Begin;
        x:=x+1;
        MoveObj (i,x,50);
        Delay(5);
        ClrObj  (i,x,50);
      End;

    For i:= 2 downto 0 do
      Begin;
        x:=x+1;
        MoveObj (i,x,50);
        Delay(5);
        ClrObj  (i,x,50);
      End;
  End;

  Close_Screen(Scn)
End.









