atarionline.pl Blitowanie VBXE i MAD Pascal - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1: CommentAuthorVagant
      • CommentTime31 May 2026 16:19 zmieniony
       
      Chciałbym pobawić się trochę w VBXE Mad Pascalem i próbuję zrobić prosty przykład, który skopiuje kawałek ekranu z jednego miejsca do innego i nie bardzo mi to działa. Podglądam różne przykłady ale one zwykle nie są takei proste.

      Co źle tu robię?

      program Blit;

      uses
      crt, vbxe;

      const
      ScreenWidth = 320;
      ScreenHeight = 192;

      var
      BCB : TBCB;
      src, dst: cardinal;

      procedure DrawTestPattern;
      var x, y: integer;
      begin
      vbxe.setcolor(Red);
      for y := 0 to 63 do
      for x := 0 to 63 do
      vbxe.PutPixel(x, y);
      end;


      procedure BlitBlock;
      begin
      FillByte(BCB, SizeOf(BCB), 0);

      src := VBXE_OVRADR;

      BCB.src_adr.byte0 := src;
      BCB.src_adr.byte1 := src shr 8;
      BCB.src_adr.byte2 := src shr 16;

      dst := VBXE_OVRADR + (120 * ScreenWidth) + 120;

      BCB.dst_adr.byte0 := dst;
      BCB.dst_adr.byte1 := dst shr 8;
      BCB.dst_adr.byte2 := dst shr 16;

      BCB.src_step_x := 1;
      BCB.dst_step_x := 1;

      BCB.src_step_y := ScreenWidth;
      BCB.dst_step_y := ScreenWidth;

      BCB.blt_width := 63;
      BCB.blt_height := 63;


      BCB.blt_and_mask := $FF;
      BCB.blt_xor_mask := 0;
      BCB.blt_collision_mask := 0;
      BCB.blt_zoom := 0;
      BCB.pattern_feature := 0;

      BCB.blt_control := 0;

      RunBCB(BCB);

      while BlitterBusy do;
      end;



      begin

      VBXEMode(VBXE.VGAmed, 0);

      DrawTestPattern;

      BlitBlock;

      ReadKey;
      end.
      • 2: CommentAuthortebe
      • CommentTime31 May 2026 16:53 zmieniony
       
      musisz włączyć okno umożliwiające dostęp do pamięci VBXE (przed modyfikacją BCB)

      włącz
      asm
      fxs FX_MEMS #$80
      end;


      wyłącz
      asm
      fxs FX_MEMS #$00
      end;
      • 3: CommentAuthortebe
      • CommentTime31 May 2026 17:02 zmieniony
       
      w tym przykładzie

      ->link<-

      ten fragment włącza okno z dostępem do pamięci VBXE
      vram.position:=VBXE_BCBADR;
      vram.SetBank;

      i tak już zostawia

      ogólnie musisz zadbać aby obszar $B000..$BFFF nie został naruszony przez Twój program (okno VBXE można ustawić w innym obszarze, ale to wersja dla doświadczonych użytkowników), w Mad Pascal została przyjęta poniższa organizacja pamięci

      informacja o oknie VBXE w Mad Pascal jest w pliki 'systemh_atari.inc'
      VBXE_XDLADR = $0000;		// XDLIST
      VBXE_BCBTMP = $00E0; // BLITTER TEMP
      VBXE_BCBADR = $0100; // BLITTER LIST ADDRESS
      VBXE_MAPADR = $1000; // COLOR MAP ADDRESS (row = 256b default)
      VBXE_CHBASE = $1000; // CHARSET BASE ADDRESS
      VBXE_OVRADR = $5000; // OVERLAY ADDRESS
      VBXE_WINDOW = $B000; // 4K WINDOW $B000..$BFFF
      • 4: CommentAuthortebe
      • CommentTime31 May 2026 17:05
       
      Arkanoid-VBXE jest lepszym przykładem, bo włącza/wyłącza okno VBXE zależnie od potrzeb

      ->link<-

      procedure blitZERO(src: cardinal; w : word; h: byte); register;
      {
      dst = vram
      }
      begin

      asm
      fxs FX_MEMS #$80
      end;

      blt_zero.src_adr.byte2:=src shr 16;
      blt_zero.src_adr.byte1:=src shr 8;
      blt_zero.src_adr.byte0:=src;

      blt_zero.dst_adr.byte1:=hlp shr 8;
      blt_zero.dst_adr.byte0:=hlp;

      blt_zero.src_step_y:=w;

      blt_zero.blt_height:=h-1;

      blt_zero.blt_width:=w-1;

      asm
      fxs FX_MEMS #$00
      end;

      RunBCB(blt_zero);
      while BlitterBusy do;

      end;
      • 5: CommentAuthorVagant
      • CommentTime31 May 2026 17:47
       
      Hmmm chyba mnie to pokona...
      • 6: CommentAuthortebe
      • CommentTime31 May 2026 18:51 zmieniony
       
      bloku blita BCB nie możesz umieścić w pamięci Atari, tylko w pamięci VBXE
      BCB : TBCB absolute VBXE_BCBADR+VBXE_WINDOW; 

      tak ustawiony adres pojawia się w oknie VBXE od adresu $B100, w pamięci VBXE od adresu $0100

      RunBCB, obcina adres ($b100 and $0f00), mapa pamięci dla VBXE ustanowiona w Mad Pascalu nie jest przypadkowa

      poniżej działający przykład

      program Blit;

      uses
      crt, vbxe;

      const
      ScreenWidth = 320;
      ScreenHeight = 192;

      var
      BCB : TBCB absolute VBXE_BCBADR+VBXE_WINDOW;
      src, dst: cardinal;

      procedure DrawTestPattern;
      var x, y: integer;
      begin
      vbxe.setcolor(Red);
      for y := 0 to 63 do
      for x := 0 to 63 do
      vbxe.PutPixel(x, y);
      end;


      procedure BlitBlock;
      begin

      asm
      fxs FX_MEMS #$80
      end;

      src := VBXE_OVRADR;

      BCB.src_adr.byte0 := src;
      BCB.src_adr.byte1 := src shr 8;
      BCB.src_adr.byte2 := src shr 16;

      dst := VBXE_OVRADR + (120 * ScreenWidth) + 120;

      BCB.dst_adr.byte0 := dst;
      BCB.dst_adr.byte1 := dst shr 8;
      BCB.dst_adr.byte2 := dst shr 16;

      BCB.src_step_x := 1;
      BCB.dst_step_x := 1;

      BCB.src_step_y := ScreenWidth;
      BCB.dst_step_y := ScreenWidth;

      BCB.blt_width := 63;
      BCB.blt_height := 63;


      BCB.blt_and_mask := $FF;
      BCB.blt_xor_mask := 0;
      BCB.blt_collision_mask := 0;
      BCB.blt_zoom := 0;
      BCB.pattern_feature := 0;

      BCB.blt_control := 0;

      asm
      fxs FX_MEMS #$00
      end;

      RunBCB(BCB);
      while BlitterBusy do;

      end;


      procedure InitBlit;
      begin

      asm
      fxs FX_MEMS #$80
      end;

      FillByte(BCB, SizeOf(BCB), 0);

      asm
      fxs FX_MEMS #$00
      end;

      end;


      begin

      VBXEMode(VBXE.VGAmed, 0);


      InitBlit;


      DrawTestPattern;

      BlitBlock;

      ReadKey;
      end.
      • 7: CommentAuthortebe
      • CommentTime31 May 2026 19:07
       
      w przypadku większej liczby blitów, kolejne blity powinno umieszczać się kolejno jeden za drugim

      blt0 : TBCB absolute VBXE_BCBADR+VBXE_WINDOW;
      blt1 : TBCB absolute VBXE_BCBADR+VBXE_WINDOW+sizeof(TBCB);
      blt2 : TBCB absolute VBXE_BCBADR+VBXE_WINDOW+sizeof(TBCB)*2;
      blt3 : TBCB absolute VBXE_BCBADR+VBXE_WINDOW+sizeof(TBCB)*3;


      wtedy można wykonać wiele blitów jednocześnie kiedy blt_control = %1000

      p.s.
      dobrze jest zapoznać się z dokumentacją do VBXE