atarionline.pl Basic - potrzeba pomocy w napisaniu pewnie prostego kodu - 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: CommentAuthorMatthewNS
    • CommentTime29 Apr 2024 zmieniony
     
    Potrzebuję napisać prosty programik w Basicu. Wyswietla 200 lini po komendzie PRINT.
    Potrzebuję, żeby po 15 liniach wyswietlanie się zatrzymało a po naciśnieciu dowolnego klawisza albo konkretnie spacji na następnym ekranie wyswietlone zostanie następne 15 lini.

    Pojecia nie mam jak to zrobić.

    1 PRINT "?????
    .
    .
    .
    .
    15 PRINT "???? - i tu zatrzymanie z informacją "nacisnij spację żeby wyświetlić następne 15 linii itp".
    .
    .
    .
    .
    .
    .
    200 PRINT"?????
    • 2: CommentAuthormono
    • CommentTime29 Apr 2024 zmieniony
     
    10 DIM L$(120):OPEN #1,4,0,"K:":TRAP 30
    20 ? CHR$(125);:FOR I=1 TO 15:READ L$:? L$:NEXT I:GET #1,K:GOTO 20
    30 END
    100 REM ----- PIERWSZA STRONA
    101 DATA PIERWSZA STRONA PIERWSZA LINIA
    102 DATA DRUGA LINIA
    103 DATA
    104 DATA
    105 DATA
    106 DATA
    107 DATA
    108 DATA GDZIES TAM W SRODKU LINIA
    109 DATA
    110 DATA
    111 DATA
    112 DATA
    113 DATA
    114 DATA
    115 DATA OSTATNIA LINIA PIERWSZEJ STRONY
    200 REM ----- DRUGA STRONA
    201 DATA I DRUGA STRONA
    202 DATA DRUGA LINIA
    203 DATA
    204 DATA
    205 DATA
    206 DATA
    207 DATA
    208 DATA GDZIES TAM W SRODKU LINIA
    209 DATA
    210 DATA
    211 DATA
    212 DATA
    213 DATA
    214 DATA
    215 DATA OSTATNIA LINIA
    300 REM ----- TRZECIA STRONA
    301 DATA PIERWSZA LINIA
    302 DATA DRUGA LINIA

    W kolejnych liniach DATA wpisujesz linie tekstu. W liniach setnych dla pierwszej strony, w dwusetnych dla drugiej itd.

    Edit: Jak nie chcesz czyszczenia ekranu to w linii 20 skasuj
    ? CHR$(125);:
    • 3: CommentAuthorMatthewNS
    • CommentTime29 Apr 2024
     
    @mono dzięki wielkie :)
    • 4: CommentAuthorAtaripuzzle
    • CommentTime29 Apr 2024 zmieniony
     
    Z zapisem do txt na dyskietkę sobie poradziłem mniej więcej komendą
    0 OPEN #2,8,0,"D1:PLIK.TXT"
    1 PRINT #2;...
    A czy jest możliwość wrzucenia w Basicu na ekran Atari zawartości tego pliku (plik.txt); zdań, z tej dyskietki?
    TXT ma mniej więcej taką postać (› to są znaki końca lini - returny):
    TEKST 1›TEKST 2›TEKST 3›TEKST 4›TEKST 5›TEKST 6›TEKST 7›

    Próbowałem znaleźć jakąś przeglądarkę plików txt, ale na gołe Atari niestety chyba nie ma. Czy ktoś pomoże? Mam książkę Atari Basic ale tam niestety tego nie piszą - jak odczytywać pliki txt. Jak to można zrobić?
    • 5:
       
      CommentAuthorpirx
    • CommentTime29 Apr 2024
     
    czyli chcesz skopiować plik na urządzenie S:
    to można na wiele sposobów zrealizować. w czystym basicu to będzie powolne - czytasz poszczególne znaki z pliku za pomocą GET i wtedy możesz je printować ze średnikiem(albo PUTować na urządzenie #6).
    w turbobeju można szybciej - zrobić BGET do zmiennej tekstowej, którą potem w całości wyprintujesz
    • 6: CommentAuthorAtaripuzzle
    • CommentTime29 Apr 2024 zmieniony
     
    Pliku nie chcę skopiować, tylko jego zawartość na ekran komputera, ale chyba się zrozumieliśmy, dzięki za wskazówki - o to mi chodziło. Będę próbował "metodą prób i błędów:. Dzięki pirx.
    • 7: CommentAuthorseban
    • CommentTime29 Apr 2024
     
    Jeżeli to jest plik tekstowy to nie trzeba czytać tego bajt po bajcie za pomocą GET, można wykorzystać INPUT na kanale otwartym w trybie odczytu, np. tak:

    10 OPEN #1,4,0,"D:PLIK.TXT"
    11 DIM T$(256):TRAP 13
    12 INPUT #1,T$:? T$:GOTO 12
    13 CLOSE #1
  1.  
    Wow seban - nie wiedziałem jak to jest z tymi kanałami. To co napisałeś jest genialnie proste i działa. Wielkie dzięki. Oto mi chodziło. A ja już męczyłem się z AtariWriterem. żeby podglądać zawartość pliku
    • 9:
       
      CommentAuthorpirx
    • CommentTime30 Apr 2024
     
    no tak, INPUT, kurcze czyta po wierszu jak unixy :)
    • 10: CommentAuthorAtaripuzzle
    • CommentTime1 May 2024 zmieniony
     
    Chciałem zatrzymać po 3 nowych liniach Printa, działanie pętli w programie sebana za pomocą INPUT, żeby automatycznie się pauzowało przewijanie printowanego pliku, albo najlepiej automatyczna pauza za pomocą ctrl 1 (To chyba POKE 764,159) ale chyba się nie da.
    • 11: CommentAuthorseban
    • CommentTime2 May 2024 zmieniony
     
    To o czym wspominasz można zrealizować na dwa sposoby, jeden bardzo prosty, ale w tym wypadku musisz mieć odpowiednio sformatowany plik tekstowy który chcesz wypisywać na ekran. Zakładając że każda linia kończy się znakiem "End of Line" (#155, $9b), możesz to zrealizować w bardzo prosty sposób, np. taki:
    10 CLOSE #1:OPEN #1,4,0,"D:TEST.TXT"
    11 CLOSE #2:OPEN #2,4,0,"K:"
    12 DIM T$(256):TRAP 20
    13 FOR I=1 TO 3
    14 INPUT #1,T$:? T$
    15 NEXT I
    16 GET #2,K
    17 GOTO 13
    20 CLOSE #1
    21 CLOSE #2
    23 END

    Natomiast jeżeli linie będą dłuższe niż 40 znaków, to powyższy program nie wypisze po 3 linie, a po 3 "rekordy" danych, każdy "rekord" danych to ciąg znaków zakończony sekwencją "End of Line" [bajt o wartości 155 (dec), $9b (hex)]. Taki rekord danych nie może być dłuższy niż 256 znaków, jeżeli tak będzie wystąpi błąd #137 (truncated record) i w tym wypadku nastąpi zakończenie działanie programu (błąd zostanie przechwycony przez TRAP).

    Aby ominąć to ograniczenie trzeba by czytać plik w inny sposób, jeżeli zawsze chciałbyś czytać po 3 linie (3*40 znaków) to trzeba by do tego zaprząc już basicowy "GET #1,C" (ale to będzie dość wolne), albo użyć paru POKE i użyć bezpośredniego wywołania systemowego CIO. Tak jak wspominał Pirx, w Turbo Basic XL załatwia to "BGET" (binary get).

    Przykład z czytaniem znak po znaku i wypisywaniem po 3 linie (3*40 znaków):
    10 CLOSE #1:OPEN #1,4,0,"D:TEST.TXT"
    11 CLOSE #2:OPEN #2,4,0,"K:"
    12 POKE 82,0:GRAPHICS 0:TRAP 20
    13 FOR I=1 TO 40*3:GET #1,C:? CHR$(C);:NEXT I
    16 GET #2,K
    17 GOTO 13
    20 CLOSE #1
    21 CLOSE #2
    23 POKE 82,2:END
    • 12: CommentAuthorAtaripuzzle
    • CommentTime2 May 2024 zmieniony
     
    Jesteś Wielki - Seban. Ten pierwszy działa perfekcyjnie, na moim pliku. Nie wiedziałem że trzeba otworzyć dwa kanały. Męczyłem się z tym cały dzień i mi się nie udało napisać działającego programu, tak więc jestem ci bardzo wdzięczny za podesłanie rozwiązania, jeszcze raz dzięki wielkie.
    • 13: CommentAuthorseban
    • CommentTime2 May 2024 zmieniony
     
    Ten drugi kanał jest otwierany tylko po to aby sobie poczekać na wciśnięcie klawisza (otwierany jest kanał dla urządzenia "K:" - keyboard/klawiatura). W przypadku Atari-OS większość urządzeń w systemie ma swoje sterowniki i można ich używać za pomocą standardowych wywołań systemowych. Tak jest w przypadku klawiatury "K:", edytora ekranowego "E:", magnetofonu "C:", sterownika "S:" w przypadku trybów graficznych, "P:" w przypadku drukarki, a jeżeli załadujesz DOS pojawi się także urządzenie "D:".

    W tym moim przykładzie otwarcie drugiego kanału jest potrzebne tylko po to aby później wywołać sobie GET #2,K, co powoduje odczytanie znaku z urządzenia "K:", czyli po prostu klawiatury... a to skutkuje czekaniem na wciśnięcie klawisza. W zmiennej K ląduje kod wciśniętego klawisza w kodzie ATASCII.
    • 14: CommentAuthorAtaripuzzle
    • CommentTime2 May 2024 zmieniony
     
    Pięknie dziękuję za szczegółowe wyjaśnienia. Wysłałem ci Seban priwa w tym wątku.
    • 15: CommentAuthorgorgh
    • CommentTime2 May 2024
     
    tak przy okazji: wczoraj język Basic obchodził 60 urodziny
    • 16: CommentAuthorAtaripuzzle
    • CommentTime4 dni temu zmieniony
     
    "(...)Przykład z czytaniem znak po znaku i wypisywaniem po 3 linie (3*40 znaków):...." (post 11)

    Jacek w swoich filmikach też korzystał z podobnego programu czytającego znak po znaku - trochę inaczej napisanego - może się komuś przyda.
    10 ? CHR$(125):DIM A$(1)
    20 OPEN #1,4,0, "D:PLIK.TXT"
    25 FOR X=1 TO 1000000
    30 TRAP 100:GET #1,A
    40 ? CHR$(A);
    50 NEXT X
    100 ? :? "KONIEC PLIKU"
    • 17:
       
      CommentAuthorKaz
    • CommentTime4 dni temu zmieniony
     
    Seban - dodałem do Twojego posta znaczniki [ code basic ], wtedy ładniej formatuje listing i można go zapisać jako plik ATASCII. Przypomnę z FAQ punkt 6: ->link<-

    [ code basic ]i [ /code ] również przeznaczone do wstawiania listingów, ale tym razem dla programów w Atari Basic i Turbo Basic XL. Wszystkie słowa kluczowe obu tych języków oraz użyte cyfry są wyróżniane kolorem, co ogromnie zwiększa czytelność listingu.
    • 18: CommentAuthorseban
    • CommentTime3 dni temu zmieniony
     
    Dzięki Kaz za poprawki formatowania i za wskazanie linku do FAQ. Przyznam szczerze, że szukałem jakiegoś info o formatowaniu na forum ale nie znalazłem. Wygląda na to że za słabo szukałem.

    Być może warto dodać odnośnik do tego FAQ w górnej sekcji strony forum? (tam gdzie jest Lista Wątków/Kategorie/Szukaj/Profil).

    Widziałem w innych postach dodatkowe formatowanie ale nie wiedziałem jak je wykonać. Miałem nawet o to pytać ale zająłem się czymś innym i zapomniałem o tym. Koniec końców pozostało tak surowo jak to wkleiłem do czas aż nie dokonałeś poprawek.
    • 19:
       
      CommentAuthorKaz
    • CommentTime3 dni temu
     
    Nie szukałeś słabo, tylko naprawdę trudno to znaleźć. Mogłoby oczywiście być na górze albo gdziekolwiek, ale nie ma komu tego zrobić :)