atarionline.pl DOS Binary Object (użycie np. w Forth) - 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: CommentAuthorbartgo
      • CommentTime5 Jul 2023 11:07 zmieniony
       
      Natknąłem się w Extended fig-Forth na polecenia do obsługi "DOS binary objects". Nie są to PLIKI bo ta implementacja Forth nie wie co to są pliki DOS-a 2.5 czy jakiegokolwiek innego. Dokumentacja radośnie pomija tą funkcjonalność więc nawet nie mam przykładu użycia (coś muszę na stos wrzucić zanim wywołam polecenie). Analiza niepokomentowanego kodu w Forth to dramat.

      Jak dotrę do opisu jak to słowo wywołać, chciałem zweryfikować że można nim ładować do pamięci dane z dysku analogicznie do Basicowego data - może to pozwala na ładowanie grafiki z dysku a może na wstawki kodzie maszynowym, nie wiem, myślę...

      Kod (na tyle na ile moja dotychczasowa wiedza sugeruje) wydaje się lecieć po dysku (pewno trzeba podać skąd i przez ile bajtów), pobierać bajty i robić Forth'owy POKE (C!). Będę to analizował ale wygląda mi na odpowiednik DATA i USR w Basicu.

      Potrzebowałbym przykładu prostego "samodzielnego" programu w asemblerze i jego przetłumaczenia do postaci maszynowej. Może to być np. odpowiednik POKE 710,0 - chodzi wyłącznie o weryfikację czy możemy ładować z dysku wstawki w asemblerze. Moja znajomość asemblera ogranicza się do ogólnej, trzeba jakieś LDA i STA zrobić, obstawiam a la:
      LDA #0 // maszynowy: A9 00
      STA $02C6 // maszynowy: 8D C6 02
      RTS // maszynowy: 60, może BRK (00)

      Czy to byłaby kompletna wstawka w asemblerze i poprawny kod maszynowy, tak jak wywoływany przez DATA i USR?

      Jak rozumiem, normalnie nie ma możliwości wykonywania kodu maszynowego "w locie" (pobieramy bajt z dysku, POKE) tylko trzeba władować do pamięci? Wyobrażam sobie że sam odczyt z dysku smaruje sobie po rejestrach więc odczyt każdego polecenia z dysku jest zupełnie nierealistyczny. Tak to wygląda w Basicu (DATA i potem USR od adresu, koniec wykonywania jakimś rozkazem powrotu)?

      Będę wdzięczny za popchnięcie w prawidłowym kierunku.

      Kod poniżej, osoby uczulone na Forth proszone są o zaprzestanie czytania teraz.

      ``
      ( DOS OBJECT READER )
      BASE @ HEX
      0 VARIABLE BLOCK# 0 VARIABLE BYTES 0 VARIABLE BYTPTR
      0 VARIABLE ADDRSS 0 VARIABLE #BYTES
      : GETCOUNT 7F + C@ 7F AND BYTES ! 0 BYTPTR ! ;
      : FNEXTBLK 7D + DUP C@ 100 * SWAP 1+ C@ + 3FF AND 1 - ;
      : LINKBLOCK FNEXTBLK
      DUP BLOCK# ! DUP 0 > IF BLOCK THEN ;
      : BLK-CK BYTES @ 0= IF BLOCK# @ BLOCK LINKBLOCK
      GETCOUNT THEN ;
      : NEXTBYTE BLK-CK -1 BYTES +! BYTPTR @ 1 BYTPTR +!
      BLOCK# @ BLOCK + C@ ;
      : NEXTWORD NEXTBYTE NEXTBYTE 100 * + ;
      : ADRCALC NEXTWORD DUP ADDRSS ! NEXTWORD SWAP - 1+ #BYTES ! ;
      : BLOCKSET DUP BLOCK# ! BLOCK GETCOUNT ;
      : LOADOBJ BLOCKSET NEXTWORD 1+ IF CR ." Not an Object file"
      CR QUIT THEN
      BEGIN
      ADRCALC
      #BYTES @ 0 DO NEXTBYTE ADDRSS @ C! 1 ADDRSS +! LOOP
      BLOCK# @ BLOCK FNEXTBLK
      1+ 0= BYTES @ 0= AND
      END ;
      BASE ! ;S
      ``
      • 2: CommentAuthorbartgo
      • CommentTime5 Jul 2023 12:07 zmieniony
       
      Pod Atari Assembler Editor (wiem, wiem, to nie dla ludzi) taka wstawka oczywiście działa:
      10  *=$3000
      20 LDA #0
      30 STA $02C6
      40 .END

      ASM
      BUG
      T3000

      (tło zmienione)

      1 - czy to wyczerpuje przykład wstawki w asemblerze?... to już, te kilka bajtów?

      2 - czy określenie "DOS object" komuś się z czymś kojarzy w takim kontekście?
      • 3: CommentAuthormarok
      • CommentTime5 Jul 2023 16:07
       
      hej,

      jeśli mogę coś napisać w odp. na drugi post, bo pytania wydają się akurat na tyle proste (że mogę coś chyba podpowiedzieć)

      1 - jak najbardziej, to jest 5 bajtów kodu 6502 (+ nagłówek, z 6 bajtów) (A9008DC602)
      2 - DOS object kojarzy mi się z linią 10 (*=$3000), który jest kodem z nagłówkiem (nagłówek to jest $FFFF00300430 w tym wypadku; FFFF jest "sygnaturą" pliku dosowego, 0030 to jest ta linia 10 odpowiednio zapisana, a 0430 wynika z długości kodu na 5 bajtów - do $3004, gdzie umieszczony ma zostać ostatni odczytany z pliku bajt; po nagłówku następuje kod z punktu 1. i razem nagłowek i ten kod stanowią prawdopodobnie ten "DOS object")
      • 4:
         
        CommentAuthorKaz
      • CommentTime5 Jul 2023 20:07
       
      bartgo - dopisałem Ci znaczniki [ code ] do postów, teraz znacznie czytelniejsze są te programy.
      • 5: CommentAuthorbartgo
      • CommentTime6 Jul 2023 11:07 zmieniony
       
      Podpowiedź marok'a pasuje...

      Warunek:
      1+ IF CR ." Not an Object file"


      Da "false" (0) jeśli wartość na stosie (początek kodu wgrywanego z dysku) to $FFFF, po prostu 1+ podbije ją do zera i warunek będzie fałszywy. Czyli $FFFF musi być na początku, wtedy słowo LOADOBJ leci dalej, NEXTWORD ściąga kolejne dane, ADRCALC wylicza gdzie ma być wrzucona wstawka, kod z dysku jest ładowany pod kolejne adresy od ADDRSS (zwiększanego w miarę ładowania następnych bajtów).

      Całość wymaga zapewne uruchomienia z numerem bloku dyskowego czyli
      n LOADOBJ


      Dzięki, spróbuję w najbliższych dniach wpakować wstawkę na dysk i przejrzeć jak to działa (bo nie widzę jeszcze jak kod załadowany uruchomić, potrzeba forthowego chyba odpowiednika USR).

      Dzięki (również dla Kaz-a)!