atarionline.pl Altirra - czy można jakoś pozyskać output z Basica? - 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.  
    Witam,
    Wracam powoli do tematu cross-compilera dla BASICa i mam taki pomysł, żeby dodać do projektu trochę unit-testów.

    Ma ktoś jakiś pomysł jak zaprząc do pracy Altirrę w taki sposób, że na wejściu podaję jej kod w BASIC, a na wyjściu dostaję wynik programu?

    Np. wywołuję:
    altirra.exe -parse "10 PRINT 2+2\n20 PRINT 2-2"


    I na wyjściu dostaję:
    4
    0


    Input ewentualnie można jakoś obejść tworząc samouruchamialną dyskietkę z programem.

    Output może da się jakoś pozyskać zapisując stan pamięci ekranu do pliku (o ile jest to możliwe automatycznie).

    Zanim jednak zacznę rzucać się z haczką na słońce chcę skonsultować sprawę z ekspertami z tego forum :)
    • 2: CommentAuthorgreblus
    • CommentTime10 Nov 2016
     
    Atari800 można skompilować bez ui. Tylko trzeba by w kodzie obczaić gdzie BASIC "kończy bieg", żeby wyjść do command line, bo aktualnie plik .bas się wykonuje i zostaje w BASIC-u i READY na ekranie:



    Można by też po prostu ubić atari800 po jakimś czasie, ale to brzydkie rozwiązanie.

    Pobawię się jeszcze wieczorową porą. exec pod Windows w załączniku :).
  2.  
    Oho, i to jest świetny sposób! Przez chwilę jeszcze kombinowałem z wklejaniem kodu do Altirry przez Ctrl+V, ale ta metoda z Atari800 nadaje się chyba idealnie.

    Mam dodatkowe pytania:
    1. Czy test.bas to kod programu w formie tekstu czy stokenizowany?
    2. Czy można jakoś wstrzyknąć tutaj TurboBasic?
    • 4: CommentAuthorgreblus
    • CommentTime10 Nov 2016
     
    Hej. Plik w formie tekstu. Z Turbo Basic też raczej da radę. Dodatkowym plusem jest opcja -turbo ;).
    • 5: CommentAuthorgreblus
    • CommentTime11 Nov 2016 zmieniony
     
    Da się bez grzebania w kodzie atari800:



    Jak na stdin wyślemy EOF to atari800 wykonuje co ma wykonać i się zamyka. Trzeba sobie tylko stdout obrobić np. sedem (załącznik).
  3.  
    Elegancko!

    Bardzo dziękuję za pomoc, w tygodniu będę to podpinał do builda :)
    • 7: CommentAuthorgreblus
    • CommentTime12 Nov 2016 zmieniony
     
    Hej.

    Cała przyjemność po mojej stronie ;)

    Trochę inaczej można to zrobić z Turbo Basic:



    W sumie zarąbista sprawa z tym kontrolowaniem emulatora ze stdin.
  4.  
    greblus, w tym ostatnim przypadku plik bas musi być już nagrany na .atr, nie?

    Jest chyba do tego jakieś narzędzie, ale zanim dodam je do toolchaina chciałbym zapytać, czy atari800 może czytać bezpośrednio z HDD?

    W configu jest ENABLE_H_PATCH na 1, ścieżka też ustawiona, ale plik się tak jakby u mnie nie wczytuje :/

    Nie ma też numeru błędu, wywala się dopiero przy EXEC. Mógłbyś sprawdzić, czy uda się Tobie automatycznie załadować BAS z dysku?

    U mnie output jest taki jak poniżej. Jak widać, LIST nic nie listuje.

    C:\test>type ctrl.txt   | atari800 -config conf.cfg DOS.atr TBXL.atr -turbo
    DISK OPERATING SYSTEM II VERSION COPYRIGHT 1984 ATARI CORP.

    A. DISK DIRECTORY I. FORMAT DISK
    B. RUN CARTRIDGE J. DUPLICATE DISK
    C. COPY FILE K. BINARY SAVE
    D. DELETE FILE(S) L. BINARY LOAD
    E. RENAME FILE M. RUN AT ADDRESS
    F. LOCK FILE N. CREATE MEM.SAV
    G. UNLOCK FILE O. DUPLICATE FILE
    H. WRITE DOS FILES P. FORMAT SINGLE
    SELECT ITEM OR FOR MENU
    LOAD FROM WHAT FILE?




    TURBO-BASIC XL 1.5
    (c) 1985 Frank Ostrowski


    READY

    READY


    READY

    ERROR- 29 ?PROC
    Using Atari800 config file: conf.cfg
    Created by Atari 800 Emulator, Version 3.1.0


    A tak wygląda ctrl.txt:
    L
    D2:AUTORUN.SYS
    ENTER "H:TEST.BAS"
    LIST
    EXEC TEST
    • 9: CommentAuthorgreblus
    • CommentTime30 Jan 2017 zmieniony
     
    Pewnie chodzi o to, że DOS2.5 H: nie obsługuje (wrrróc!, to nie to). Wymyślę coś wieczorem.
    • 10: CommentAuthorgreblus
    • CommentTime30 Jan 2017 zmieniony
     
    Ok, już wiem. Plik *.BAS na H: musi być w ATASCII. Jak jest w ASCII to wyświetla się error 29.

    Tutaj popełniłem kiedyś statyczne binarki iconv z ATASCII dla Linuksa i Windows:

    ->link<-

    Używa się tego tak:

    cat TEST.BAS | ./iconv -f UTF-8 -t ATASCII > TEST_ATASCII.TXT

    w drugą stronę:

    cat TEST_ATASCII.TXT | ./iconv -f ATASCII -t UTF-8 > TEST.BAS

    Pełna lista dodanych kiedyś przez Mono kodowań atarowych i nie tylko jest długa:

    ATARI ATARIST
    RISCOS-LATIN1
    ATARI8 ATARI8-ATASCII ATARI8-GRAPH ATASCII
    ATARI8-ATASCII2 ATARI8-INT ATASCII2
    ATARI8-KAREN ATARI8-PL
    ATARI8-AWP
    ATARI8-XLENT
    ATARI8-PANTHER
    ATARI8-PE
    ATARI8-CAPEK ATARI8-CZ
    ATARI8-TCHEKO
    ZX80 ZX81
    ZX82 ZXSPECTRUM
    ZX82-PL ZXSPECTRUM-PL
    PETSCII PETSCII-UC
    PETSCII-LC
    CP867 CP895 KAMENICKY KEYBCS2
    • 11: CommentAuthormono
    • CommentTime30 Jan 2017
     
    Atari ST i RICOS to nie ja :)
    Niektóre semigrafiki nie są jednoznaczne (konwersja w tę w z powrotem nie da pliku źródłowego) - za to tekst, końce linii i większość semigrafiki powinno iść bezproblemowo.
    • 12: CommentAuthorgreblus
    • CommentTime30 Jan 2017
     
    iconv z twoim patchem, to najlepsze narzędzie do konwersji jakie istnieje i tyle w temacie ;)
    • 13: CommentAuthormono
    • CommentTime30 Jan 2017
     
    Dziękuję, ale ja tu tylko dodałem parę tablic (szkoda, że nikt nie chce zbudować tablicy dla arabskich kodów, bo ja się w tym kompletnie nie rozeznaję :]). A gratulacje należą się twórcom iconva za świetne narzędzie! Potwierdzam!
    • 14: CommentAuthorseban
    • CommentTime31 Jan 2017 zmieniony
     
    Hej!

    Panowie, a to nie jest tak że jak się czyta zapisuje na H6: to emulator sam dokonuje konwersji ASCII/ATASCI (łączenie z konwersją EOL-i). Tak jest na 100% w przypadku Altirra, nie wiem jak Atari800... ale coś mi się kojarzy że tam też tak to działało.

    ps) przeczytałem wątek bardzo pobieżnie i może nie zrozumiałem czegoś, ale przypomniało mi się że jak zapisuję sobie LIST "H6:PROGRAM.LST", to potem plik po stronie PC jest w PURE ASCII z odpowiednimi EOL-ami.
    • 15: CommentAuthorgreblus
    • CommentTime31 Jan 2017 zmieniony
     
    Seban, racja. Zapis/odczyt na/z H6: w atari800 załatwia sprawę.

  5.  
    Tak jest! Śmiga przez H6 ;-)

    Kurde, sam tego H6: tyle razy przecież używałem... Skleroza nie wybiera :/
    • 17:
       
      CommentAuthormgr_inz_rafal
    • CommentTime15 Feb 2017 zmieniony
     
    OK, cóż... Prawie działa :)

    Niestety nihuhu nie mogę przechwycić tego, co atari800 rzuca na stdout. Ale to w sumie nie dziwne, gdyż wywołanie:
    atari800.exe source.xex

    wypluwa na ekran spodziewaną wartość, ale już kombinacja:
    atari800.exe source.xex >dupa.txt

    powoduje powstanie pustego pliku dupa.txt.

    Stąd też próby przechwycenia wyjścia w kodzie testującym również łapią tylko pustkę.

    Wie ktoś co może być przyczyną?

    Pytanie pomocnicze: Czy atari800 może zapisywać np. bezpośrednio do pliku?

    PS. Windows 10.
    • 18: CommentAuthorgreblus
    • CommentTime15 Feb 2017 zmieniony
     
    A używasz tej mojej wersji bez ui?

    ->link<-



    PS. Gdzieś czytałem, że cmd w Win10 miało w którejś aktualizacji zostać zastąpione przez powershell. Mam nadzieję, że nie popsuli strumieni wejścia/wyjścia ;).
    • 19:
       
      CommentAuthormgr_inz_rafal
    • CommentTime16 Feb 2017 zmieniony
     
    Tak, używam dokładnie tej wersji.

    Strumienie w Win10 działają, bo zanim zacznę odpalać atari800 robię dwa inne etapy: kompilacja moim kompilatorem do .asm, a potem MADSem do .xex. W obydwu przypadkach nie ma problemu z dostępem do strumieni.

    Utknąłem jednak właśnie na emulcu i wykończyły mi się pomysły.

    Możesz sprawdzić, czy na Linux zadziała przekierowanie stdout do pliku?
    • 20: CommentAuthorgreblus
    • CommentTime16 Feb 2017
     
    Przekierowania do pliku w Linuksie i Windows 7 działają, ale mam dziwne obserwacje.

    Jak odpalam binarkę z DOS-a w ten sposób:

    to działa.

    Bez DOS-a mam problem z zakończeniem emulatora ze stdin:

    (trzeba ubić).
    • 21:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Feb 2017 zmieniony
     
    No kurna, to u mnie niestety nie idzie... Spróbuję jeszcze wieczorem na Win8.1, ale coś mi mówi, że problem jest gdzieś indziej...



    Mógłbyś załączyć "hello.obx"?
    • 22:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Feb 2017 zmieniony
     
    OK, chyba wiem o co biega. Problemem wydaje się być buforowanie stdout przez runtime C. Gdy uruchomiłem xex-a, który zamiast jednej liczby wypluwa ich całą serię, wynik pojawił się w pliku.

    Gdyby atari800 zamykał się normalnie, Windows spłukałby stream do pliku. Ale - jak zauważyłeś - emulator trzeba zabić. To nie jest dziwne, gdyż na końcu skompilowanego programu zawsze daję kod poniższy, aby maszyna nie poszła w maliny:
    dupa jmp dupa


    Opcją byłoby wyłączenie buforowania wewnątrz atari800. Jeśli używa on biblioteki C (printf, itp) to jest to osiągalne przez
    setbuf(stdout, NULL)
    lub nowocześniej przez
    setvbuf(stdout, NULL, _IONBF, 0)


    Jeśli atari800 stosuje strumienie, to można wymusić spłuczkę za pomocą
    std::flush


    Nie znalazłem sposobu, aby wyłączyć takie buforowanie odgórnie.

    Greblus, czy mógłbyś spróbować przekompilować atari800 z tym setbufem?

    PS. Jeszcze przyszło mi do głowy coś takiego, że działającemu atari800 można jakoś kazać przerwać emulację i zamknąć się kulturalnie, jak papież przykazał. To też pomogłoby w kwestii buforowania pipy wyjściowej.
    • 23: CommentAuthorgreblus
    • CommentTime17 Feb 2017
     
    Hej, dziś przekompiluję.

    Podobny problem ugryzł mnie kiedyś w tyłek w AspeQT na Androida, mam nawet ku temu odpowiedni commit:

    2d790d6: Always remember to flush() after use ;)

    Wczoraj wieczorem próbowałem dodać obsługę magicznego POKE 666,6 ale na szczęście nie chciało działać.
    • 24: CommentAuthorgreblus
    • CommentTime17 Feb 2017 zmieniony
     
    Zobacz teraz (załączam też nowszą wersję readline, bo się w międzyczasie zmieniła w mingw).
    • 25:
       
      CommentAuthormgr_inz_rafal
    • CommentTime17 Feb 2017 zmieniony
     
    Workuje! Dziękuję bardzo.

    • 26: CommentAuthorgreblus
    • CommentTime17 Feb 2017
     
    Super! :)

    Dziwne, że nie mogłem tego powtórzyć w Win7. Musiało coś się zmienić po drodze do Win10...
  6.  
    Możliwe, że w międzyczasie coś "poprawili" :)
    • 28:
       
      CommentAuthormgr_inz_rafal
    • CommentTime5 dni temu zmieniony
     
    Cóż, nie może być zbyt pięknie... Aby mieć dostęp do dysków H muszę uruchomić atari800 jako administrator, a jak próbuję to zautomatyzować to mam "Windows ochronił Twój komputer".

    Dzięki Windows!

    Chyba zaprzyjaźnię się z Franny...
    • 29: CommentAuthorgreblus
    • CommentTime5 dni temu
     
    Niestety pewnej warstwy abstrakcji pod Windows nie ogarniam :)
    • 30:
       
      CommentAuthormgr_inz_rafal
    • CommentTime4 dni temu zmieniony
     
    OK, Frania szybko się zintegrowała i nie narzekała na brak uprawnień administracyjnych. Do tego ma fajną opcję "-c" do konwersji końców linii na atarowe.

    Musiałem tylko podmienić DOSa na takiego, do którego można podpiąć trzy dyski (DOS, TBXL i obraz z kodem testowym).
    • 31: CommentAuthorpirx
    • CommentTime3 dni temu
     
    a nie możesz mieć tbxl na dysku z dosem?
  7.  
    Pewnie, że mogę. Mogę nawet źródełko tam Franią dorzucać.

    Ale nie lubię kogla-mogla :)
    • 33:
       
      CommentAuthormgr_inz_rafal
    • CommentTime1 dzień temu zmieniony
     
    Pierwsze, zrodzone w bólach testy. Warto było bo nawet fajnie to działa.

    Wpisujemy sobie w kodzie:


    Powoduje to odpalenie dwóch wątków:
    - Pierwszy kompiluje TBXL do .asm, potem MADSem .asm do .xex i odpala emulca
    - Drugi rychtuje dyskietki z DOS, TBXL i źródełkiem i również odpala emulca

    Wyniki działania są porównywane i mamy wyniki.



    Jak widać, dzielenie niecałkowite jeszcze nie działa :)
    • 34: CommentAuthorgreblus
    • CommentTime1 dzień temu
     
    Pełna profeska. Powodzenia w dalszych zmaganiach :)
    • 35: CommentAuthor0xF
    • CommentTime6 godzin temu
     
    W temacie Atari800 skompilowanego w trybie tekstowym: "grzeczne" zamknięcie emulatora osiąga się przez odczytanie końca standardowego wejścia. Czyli:
    1. Program na Atari powinien czytać z E: (robi to np. BASIC po wyświetleniu READY).
    2. Koniec standardowego wejścia wpisujemy wciskając Ctrl+D na Linuxie a Ctrl+Z na Windowsie, lub jest to koniec przekierowanego pliku.

    Np.
    hi.lst:
    10 DIM A$(20):INPUT A$:PRINT "Hi ";$A$

    echo Kuba | atari800 hi.lst

    Plik lst może mieć znaki końca wiersza Atari lub (wygodniej) LF lub CRLF.

    Skąd to wszystko wiem? Sam programowałem powyższe funkcje.