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 15:11
       
      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 19:11
       
      Hej. Plik w formie tekstu. Z Turbo Basic też raczej da radę. Dodatkowym plusem jest opcja -turbo ;).
      • 5: CommentAuthorgreblus
      • CommentTime11 Nov 2016 17:11 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 16:11 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 16:01 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 19:01 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 21:01
       
      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 21:01
       
      iconv z twoim patchem, to najlepsze narzędzie do konwersji jakie istnieje i tyle w temacie ;)
      • 13: CommentAuthormono
      • CommentTime30 Jan 2017 22:01
       
      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 12:01 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 12:01 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 :/
    6.  
      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 16:02 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 ;).
    7.  
      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 23:02
       
      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ć).
    8.  
      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"?
    9.  
      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 16:02
       
      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 18:02 zmieniony
       
      Zobacz teraz (załączam też nowszą wersję readline, bo się w międzyczasie zmieniła w mingw).
    10.  
      Workuje! Dziękuję bardzo.

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

      Dziwne, że nie mogłem tego powtórzyć w Win7. Musiało coś się zmienić po drodze do Win10...
    11.  
      Możliwe, że w międzyczasie coś "poprawili" :)
    12.  
      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
      • CommentTime21 Feb 2017 21:02
       
      Niestety pewnej warstwy abstrakcji pod Windows nie ogarniam :)
    13.  
      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
      • CommentTime23 Feb 2017 09:02
       
      a nie możesz mieć tbxl na dysku z dosem?
    14.  
      Pewnie, że mogę. Mogę nawet źródełko tam Franią dorzucać.

      Ale nie lubię kogla-mogla :)
    15.  
      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
      • CommentTime25 Feb 2017 20:02
       
      Pełna profeska. Powodzenia w dalszych zmaganiach :)
      • 35: CommentAuthor0xF
      • CommentTime26 Feb 2017 22:02
       
      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.
    16.  
      Dzięki za hint.
      • 37:
         
        CommentAuthorpirx
      • CommentTime27 Feb 2017 16:02
       
      weź komplikuj ten język:
      ->link<-

      super, że nie ma zmiennego przecinaka. leave it this way :)