atarionline.pl MP, BlockRead czytanie z pliku pod adres - 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: CommentAuthortonual
      • CommentTime23 Oct 2025 18:29 zmieniony
       
      Bazując na przykładzie grania muzyczek MusicProTracker'a
      ->link<-

      Piszę przykład, gdzie .md1 i plik sampli ładowane są z dysku, następnie grane:
      ->link<-

      Dlaczego dla pliku .D15 zostało przeczytanych 9040 bajtów (zamiast 8224)
      Z kolei Plik .MD1 został przeczytany prawidłowo - 816 bajtów.

      (funkcja LoadFileToAddr nie korzysta z "FileSize" ponieważ to nie działa na DOSsie z obrazu .atr)

      Próbowałem też "na raz" (11264), ale Atari crashuje (podobnie jak w poprzednim przypadku) przy próbie zagrania muzyczki.

      p := pointer(addr);
      BlockRead(f, p^, 11264);

      Będę wdzięczny jeśli ktoś podzieli się działającą funkcją; LoadFileToAddr(Const filename: String; addr: word)

      Zastosowanie:
      Próbuje przeczytać dane z pliku i umieścić pod adresesm w pamięci, aby player .md1 to znalazł i zagrał muzyczkę. Np,
      module_addr = $5000;
      sample_addr = $6000;
      LoadFileToAddr('abcsong.md1'; module_addr)
      • 2: CommentAuthortebe
      • CommentTime23 Oct 2025 23:07 zmieniony
       
      nie widzę pliku 'tnl.d15'

      plik MD1 nie można ładować pod dowolny adres, plik MD1 ma nagłówek DOS-a $FFFF

      jeśli zmieniamy adres MD1 musimy go relokować (MPT_RELOCATOR), tak robi 'Mad Pascal', zasób MD1 w 'Mad Pascal' realizuje relokocje pliku pod zadany adres

      'totalRead' wymaga wyzerowania, inaczej informacja o liczbie załadowanych bajtów będzie błędna

      wywołanie funkcji nie zeruje zmiennych takiej funkcji/procedury, tylko zmienne globalne są zerowane przy pierwszym wywołaniu głównego programu

      //{$I-}
      fullname := Concat('D:', filename);
      Assign(f, fullname);
      Reset(f, 1);

      totalRead:=0;

      Repeat
      p := pointer(addr);
      BlockRead(f, buf, SizeOf(buf), bytesRead);
      Move(buf, p^, bytesRead);
      addr := addr + bytesRead;
      totalRead := totalRead + bytesRead;
      Until bytesRead = 0;// SizeOf(buf);
      Close(f);
      //{$I+}
      • 3: CommentAuthortonual
      • CommentTime24 Oct 2025 11:32
       
      @tebe dzięki ponownie za wyjaśnienie podstaw.

      "plik MD1 ma nagłówek DOS-a $FFFF"
      Czy ładowanie "przez warstwę" DOSa zawsze daje narzut w postaci takiego samego nagłówka $FFFF ?
      • 4: CommentAuthortebe
      • CommentTime24 Oct 2025 12:04 zmieniony
       
      plik MD1, MD2 to plik MPT tylko ze zmienionym rozszerzeniem

      format pliku MPT:
      ->link<-

      relokator MPT, z którego m.in. korzysta zasób MD1 w 'Mad Pascal'
      ->link<-
      • 5: CommentAuthortonual
      • CommentTime25 Oct 2025 20:42 zmieniony
       
      No tak..naiwnie pominąłem fakt, że relokator działa w czasie kompilacji..a nie w runtime.