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 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 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
     
    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
     
    bartgo - dopisałem Ci znaczniki [ code ] do postów, teraz znacznie czytelniejsze są te programy.
    • 5: CommentAuthorbartgo
    • CommentTime6 Jul 2023 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)!