atarionline.pl Atari Basic - 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: CommentAuthormono
      • CommentTime16 Aug 2010 12:00 zmieniony
       
      Polecenie ENTER w BASICu jest niedoceniane.

      Najczęściej służy programistom do usunięcia zbędnego bagażu zmiennych nagromadzonych podczas procesu twórczego. I właściwie na tym koniec, bo trzymanie tekstu programu w tej postaci na nośniku zewnętrznym jest niewydajne - program zapisywany jest w postaci linii ATASCII zakończonych EOL (kod 155), co zajmuje nieporównanie więcej miejsca niż treść programu zapisana przez SAVE/LOAD, która trzyma program w postaci stokenizowanej.

      Tymczasem para LIST/ENTER ma poważną zaletę - pozwala na dołączenie innego programu do tego, który jest już załadowany w pamięci komputera.

      Przeprowadźmy więc drobny eksperyment. Wpiszmy w edytorze mały program:
      30 LIST

      zapisując go za pomocą:
      LIST "D:PRG2.LST"

      po czym wykonajmy NEW i wpiszmy program:
      10 REM THIS IS PLACEHOLDER LINE FOR FUTURE USE
      20 ENTER "D:PRG2.LST"

      i zapiszmy go za pomocą:
      SAVE "D:PRG1.BAS"

      Po uruchomieniu za pomocą RUN dostaniemy znak zachęty READY. Dlaczego? Przecież kiedy listujemy pełny program wygląda on tak:
      10 REM THIS IS PLACEHOLDER LINE FOR FUTURE USE
      20 ENTER "D:PRG2.LST"
      30 LIST

      więc po wykonaniu instrukcji ENTER powinna się wykonać następna linia programu - a więc 30 LIST!

      Interpreter BASICa wykonując instrukcję ENTER wczytuje program z nośnika zewnętrznego traktując go tak, jakby to był zwykły edytor ekranowy, po czym przerywa program i oddaje sterowanie do interpretera BASICa. Dlatego instrukcja w linii 30 nie została wykonana. Mało tego - nawet gdyby linia 20 wyglądała tak:
      20 ENTER "D:PRG2.LST": GOTO 30

      sterowanie i tak wróciłoby do BASICa i reszta linii nie zostałaby wykonana.

      Wyglądałoby więc na to, że para LIST/ENTER przydaje się wyłącznie na etapie tworzenia programu a nie można jej użyć podczas działania programu np. do ładowania bibliotek procedur używanych w programie :/

      No cóż - spróbujmy poeksperymentować trochę.

      Ponieważ kod programu zapisany za pomocą LIST jest zachowany na dysku w postaci tekstowej spróbujmy go załadować do dowolnego edytora tekstu i nieco zmodyfikujmy.
      Dodajmy np. parę linii tak, żeby PRG2.LST wyglądał tak:
      10
      30 LIST

      i z powrotem zapiszmy na dysku.
      Po wykonaniu z BASICa
      RUN "D:PRG1.BAS"
      LIST

      zobaczymy w wyniku:
      20 ENTER "D:PRG2.LST"
      30 LIST

      Okazało się, że w programie usunięto linię 10!
      Czy to dziwi? Chyba jednak nie powinno, skoro ENTER wprowadza linie programu z nośnika zewnętrznego tak, jakby były one wprowadzane z edytora ekranowego. Możemy więc w pliku zapisywanym poleceniem LIST, a ładowanym za pomocą ENTER dokonywać wszystkich operacji dostępnych w trybie bezpośrednim - i BASIC je bez zmrużenia oka wykona!

      No to w takim razie przeedytujmy jeszcze raz plik PRG2.LST:
      10
      30 LIST
      GOTO 30

      Co teraz się stanie kiedy uruchomimy program D:PRG1.BAS ?
      Powinniśmy zobaczyć wylistowaną treść programu:
      20 ENTER "D:PRG2.LST"
      30 LIST

      co jest skutkiem realizacji GOTO 30 w trybie bezpośrednim.

      Nie trzeba chyba dodawać, że w takim pliku można zapisać również inne komendy BASICa np. przygotowujące i inicjalizujące dodatkowe zmienne, tablice, wykonujące kod maszynowy za pomocą USR(ADR(A$)) itp. Wszystko to się wykona a nie będzie zajmowało miejsca w pamięci, ponieważ wykona się jednorazowo podczas wykonywania polecenia ENTER. Jedynym efektem ubocznym, jaki da się zauważyć będzie wyświetlanie przez interpreter napisu READY po wykonaniu każdej linii (za wyjątkiem kasowania/wprowadzania linii i oddania sterowania z powrotem do programu) w trybie bezpośrednim.

      Do czego można tego użyć?
      1. Jednorazowa inicjalizacja zmiennych lub wykonanie kodu programu w trybie bezpośrednim bez przechowywania kolejnych linii w pamięci komputera.
      2. Usuwanie lub dodawanie części programu bez utraty wartości zmiennych.
      3. Wykonanie kodu, zmiana trybu graficznego, itp. W TRAKCIE ŁADOWANIA PROGRAMU :) Odpowiednik adresu INIAD ($2e2..$2e3) w pliku binarnym DOS.

      Bez problemu można w ten sposób zaimplementować namiastkę mechanizmu ładowania i inicjalizacji bibliotek używanych przez program.

      Mechanizm działa w Atari BASICu - powinien działać również w innych interpreterach z nim kompatybilnych (np. Turbo BASIC XL).

      Edit: Dodałem p.3
      • 2: CommentAuthormono
      • CommentTime16 Aug 2010 14:04 zmieniony
       
      Co się zaś tyczy uruchamiania bloków programu w trakcie ładowania aplikacji - rozpatrzmy taki programik:
      POKE 752,1:? "Loading..."
      10 FOR I=ASC("A") TO ASC("Z")
      20 ? CHR$(I);
      30 NEXT I
      40 ?
      50 RETURN
      GOSUB 10:? "Please wait, continue loading..."
      10 GRAPHICS 0
      20 ? "AUTO demo"
      30
      40
      50
      RUN

      Podczas ładowania programu można uruchamiać uprzednio załadowane bloki programu, lecz musi się to odbywać na zasadzie skoków do podprogramu (GOSUB).
      Wykonanie RUN odda sterowanie do programu uprzednio zamykając wszystkie kanały I/O (również kanał 7 używany przez ENTER), co zakończy ładowanie programu i dalsza część nie załaduje się do pamięci.
      GOTO co prawda nie pozamyka kanałów, ani nie wyczyści zmiennych, ale będzie wykonywało program aż do napotkania ostatniej linii, po czym wykona niejawnie instrukcję END, a ta pozamyka kanały (uniemożliwiając dalsze ładowanie programu) i odda sterowanie do BASICa.

      Edit: NEW również zamknie wszystkie kanały I/O, więc aby kontynuować proces należy usuwać pojedyncze linie.

      Edit 2: Należy również ostrożnie postępować z instrukcjami SOUND, ponieważ standardowa komunikacja SIO wykorzystuje generator 1 i 2 POKEYa do komunikacji z magnetofonem, a 3 i 4 do komunikacji z pozostałymi urządzeniami na szynie szeregowej.
      • 3: CommentAuthorQTZ
      • CommentTime16 Aug 2010 14:23 zmieniony
       
      Ja korzystam z L. (nie pomylić z LOAD!) i E. również z tego względu, że tak zapisany kod programu w razie błędu na nośniku dużo łatwiej odzyskać.

      Przy pomocy komendy L., edytora tekstu i E. można uzyskać linie dłuższe niż standardowo wpisywane z BASIC'a - co kiedyś przypadkowo zauważyłem, a jakiś czas temu znalazłem opis tu: ->link<- Jednak takie linie nie mogą być zmieniane bezpośrednio z BASIC'a więc osobiście unikam tworzenia długich linii.
      • 4: CommentAuthormono
      • CommentTime16 Aug 2010 15:26 zmieniony
       
      Co więcej - BASIC ma ograniczenie na długość stokenizowanej linii do 255 bajtów (co opisane jest tutaj), więc w zasadzie mając zewnętrzny tokenizer (np. na PC) dałoby się wprowadzać znacznie dłuższe linie (w przypadku przypisań stałych tekstowych i instrukcji DATA i REM niewiele dłuższe, bo są one przepisywane 1:1), ale program dałoby się ładować/zapisywać wtedy tylko za pomocą RUN/LOAD/SAVE/CLOAD/CSAVE.
      Uzupełnianie programu o linie wykonywane w trybie bezpośrednim możliwe jest tylko zewnętrznym edytorem ATASCII (np. Panther, Ed, XLF, PE, itp.), bo podczas wprowadzania za pomocą ENTER są one wykonywane i nie zostają w pamięci przez co nie da się ich odtworzyć za pomocą LIST.

      Edit: RUN/LOAD/SAVE...
      • 5: CommentAuthorurborg
      • CommentTime18 Aug 2010 09:58
       
      Faktycznie! To jest świetny pomysł aby wstępną inicjalizację zmiennych wywalić z pamięci na dysk. Ze też jak robiliśmy Kolony 2106 to na to nie wpadłem.
      • 6:
         
        CommentAuthorKaz
      • CommentTime27 Feb 2021 14:34
       
      Sporo ciekawostek, nie tylko o Atari Basic, jest na kanale Jacka. Tutaj pierwszy odcinek, dla początkujących, o Basicu:



      Powstało już 50 odcinków, dzisiaj premiera odcinka 51. Tu można obejrzeć kanał Jacka i zasubskrybować:

      ->link<-
      • 7:
         
        CommentAuthorKaz
      • CommentTime28 Feb 2021 03:19
       
      Mnie się przydało, to może i komuś też:

      ->link<-

      opis komend AtariBasic.
      • 8: CommentAuthorKrzys
      • CommentTime28 Feb 2021 13:36
       
      Ciekawe spostrzeżenie. Patrząc szerzej, wydaje mi się, że z tym ENTERem to chyba nie tak diabeł straszny. Jeśli mamy np. zmienną część w wierszach 30000+. I wtedy w TBXL, jeśli zapis jest selektywny, a nie cały LIST, czyli np.

      LIST "D:plik.lst",30000,

      a wczytanie:

      DEL 30000,32000
      ENTER "D:plik.lst

      wówczas chyba będzie dobrze. Tak mi się wydaje przynajmniej.
      • 9:
         
        CommentAuthorKaz
      • CommentTime10 Apr 2022 08:57 zmieniony
       
      I kolejny odcinek od Jacka (to już 95!):

      • 10:
         
        CommentAuthorKaz
      • CommentTime31 Dec 2025 18:44
       
      Anders Skelander napisał fajny, bo prosty programik w Atari Basic, rysujący choinkę:

      100 REM SAVE "D:XMAS.BAS"
      110 GRAPHICS 0:POKE 623,128
      120 POKE 704,144:POKE 705,48
      130 POKE 706,50:POKE 707,54
      140 POKE 708,90:POKE 709,176
      150 POKE 710,180:POKE 711,220
      160 POKE 752,255
      170 FOR I=0 TO 22
      180 FOR J=0 TO I/2
      190 POSITION 20-J,I
      195 PRINT CHR$(97+J+RND(0)*4)
      200 POSITION 20+J,I
      205 PRINT CHR$(33+J+RND(0)*4)
      210 NEXT J
      220 NEXT I
      230 IF PEEK(753)=0 THEN GOTO 230
      240 GRAPHICS 0
      • 11:
         
        CommentAuthorKaz
      • CommentTime5 Mar 2026 00:06
       
      Może być przydatne, listingi także w AB od Try2Emu:

      ->link<-
      • 12:
         
        CommentAuthorKaz
      • CommentTime31 Mar 2026 13:29 zmieniony
       
      Taka ciekawostka - w piśmie Microbyte ze stycznia 1985 roku pojawił się taki artykuł w języku hiszpańskim jak poniżej. Tłumaczenie AI z moimi poprawkami:

      "Gwiazda doskonała"

      Drogi Microbyte,

      Jestem wiernym czytelnikiem Waszego czasopisma, mam 15 lat i posiadam kompletny zestaw Atari 600XL. W mojej szkole działa akademia komputerowa, w której jestem zarówno instruktorem, jak i uczniem.

      Zauważyłem, że w dwóch numerach Waszego pisma opublikowano chilijskie flagi, których gwiazdy albo nie odpowiadają oryginałowi, albo jedynie zbliżają się do prawdziwej. Na lekcji geometrii omawialiśmy odległość, jaka musi istnieć między wierzchołkami gwiazdy na fladze; wynik ten to (tu wzór).​ Tę samą odległość uzyskuje się, wpisując w okrąg pięciokąt foremny, którego kąty muszą mierzyć 72 stopnie; następnie, przedłużając jego boki, otrzymuje się GWIAZDĘ DOSKONAŁĄ.

      Ten program, oprócz rysowania flagi, rysuje gwiazdę od pojedynczego punktu, a następnie powiększa promień o 1, aby uzyskać efekt "zamalowania" (wypełnienia) jej wnętrza. Bez dalszych uwag, żegnam się, gratulując Wam świetnego czasopisma.

      Gonzalo Concha-Laborde


      Program poniżej, generuje ładną chilijską flagę:

      0 REM ***************************
      1 REM * BANDERA CON *
      2 REM * ESTRELLA PERFECTA *
      3 REM * *
      4 REM * GONZALO CONCHA-LABORDE *
      5 REM * *
      6 REM ***************************
      8 GOTO 200
      10 XC=30:YC=24
      20 RD=1:YS=0.78
      25 REM AHORA LA ESTRELLA
      30 COLOR 2
      40 DEG : PLOT XC,YC-RD*YS
      50 DRAWTO XC-SIN(-144)*RD,YC-COS(-144)*RD*YS
      60 DRAWTO XC-SIN(-288)*RD,YC-COS(-288)*RD*YS
      70 DRAWTO XC-SIN(-72)*RD,YC-COS(-72)*RD*YS
      80 DRAWTO XC-SIN(-216)*RD,YC-COS(-216)*RD*YS
      90 DRAWTO XC-SIN(-360)*RD,YC-COS(-360)*RD*YS
      100 RD=RD+1: IF RD=18 THEN 300
      110 GOTO 30
      190 REM LA BANDERA
      200 GRAPHICS 7+16: SETCOLOR 1,0,14:C=2
      210 FOR I=0 TO 12: COLOR C
      220 FOR J=0 TO 6:PLOT 0,I*7+J
      230 DRAWTO 159,I*7+J
      240 NEXT J
      250 IF I>5 THEN C=1
      260 NEXT I
      270 COLOR 3
      280 FOR I=0 TO 48:PLOT 0,I:DRAWTO 60,I:NEXT I
      290 GOTO 10
      300 GOTO 300
      310 REM ************************************
      320 REM * TABLA DE VARIABLES *
      330 REM * XC : COORDENADA CENTRO ESTRELLA *
      340 REM * YC : " " " *
      350 REM * RD : RADIO DEL PENTAGONO *
      360 REM * YS : FACTOR DE ESCALA DEL DIBUJO *
      370 REM ************************************
      • 13:
         
        CommentAuthorKaz
      • CommentTime2 Apr 2026 19:59
       
      Jeszcze szybko zrobiłem pliczek ATR, samouruchamialny plik BAS.
      • 14: CommentAuthorLt_Bri
      • CommentTime3 Apr 2026 23:16
       
      Połknęło r ;)
      • 15: CommentAuthorAtaripuzzle
      • CommentTime23 Apr 2026 02:58 (1 godzinę temu) zmieniony
       
      Czytnik TXT (program w załączniku). Program wczytuje plik.txt na ekran Atari.

      Z pomocą AI, Bajtka i programu Sebana (linie 111-121) zrobiłem czytnik txt z polskimi fontami w basicu. Naciśnięcie dowolnego klawisza powoduje przewinięcie txt w dół o 5 wierszy. Teraz można bezproblemowo robić instrukcje do gier lub programów. Na dyskietkę (atr) trzeba wgrać swój plik txt (zobacz linia 111 – kropla.txt – ważne, żeby był w kodowaniu Atascii w formacie wordprocessora panther lub polskiego wordprocessora first XLenta, możliwie krótkimi zdaniami (maksymalnie 256 znaków do znaku entera-returna:"›". Do tego formatu konwertuje z kodowania polskiego Windows 1250 emulator Atari 800 Win Plus 4.0 (zakładka Misc > ASCII to ATASCII > wybierz plik txt (otwórz) i zapisz wybierając opcję Win-1250 (pl) to Panther (Word procesor). Dobrze więc mieć starszego Windows 7 (może wystarczy Word z Windows-1250) bo Windows 10 już ma wszędzie utf-8. Program nie zadziała jeżeli zdania będą zbyt długie oraz jeżeli txt będzie w innym kodowaniu niż Atascii (Panther, Xlent). Tych komentarzy REM nie kasujcie. Jeżeli chcecie inne tło i czarne litery zamieńcie wiersz 110
      110 REM ** TU RESZTA PROGRAMU ***
      na
      110 POKE 710,8:POKE 709,0

      Jeżeli chcecie przetestować wpisywanie polskich liter skasujcie wiersze 111-121 (komentarze REM muszą zostać) lub po załadowaniu programu wciśnijcie break

      Pamiętajcie tylko, że w kodowaniu Atascii cudzysłowia mają być proste i tylko górne, a myślniki muszą być te krótkie. Trzeba czasem po konwersji dopilnować aby takie były w txt. bo emulator Atari 800 win plus ich często nie konwertuje.



      10 PL=PEEK(106)-8:APL=PL*256:POKE 106,PL:GRAPHICS 0
      20 FOR N=0 TO 1023:POKE APL+N,PEEK(57344+N):NEXT N:RESTORE 50
      30 READ A:IF A=-1 THEN POKE 756,PL:GOTO 110
      40 FOR N=0 TO 7:READ D:POKE APL+8*A+N,D:NEXT N:GOTO 30
      50 DATA 65,0,0,60,6,62,102,62,12,81,12,24,60,102,102,126,102,12,67,12,24,0,60,96,96,60,0
      60 DATA 86,12,60,102,96,96,102,60,0,69,0,0,60,102,126,96,60,6,82,126,96,124,96,126,0,12,24
      70 DATA 76,0,56,24,28,56,24,60,0,123,0,96,120,112,224,96,126,0,78,12,24,0,124,102,102,102,0
      80 DATA 77,24,102,118,126,126,126,110,102,79,12,24,0,60,102,102,60,0,80,12,24,60,102,102,102,102,60
      90 DATA 83,12,24,0,60,96,60,6,60,68,12,24,60,96,60,6,6,60,90,24,0,126,12,24,48,126,0
      100 DATA 88,0,24,0,126,12,48,126,0,75,12,24,0,126,12,24,48,126,96,12,24,126,12,24,48,126,0,-1
      110 REM ** TU RESZTA PROGRAMU ***
      111 CLOSE #1:OPEN #1,4,0,"D1:KROPLA.TXT"
      112 CLOSE #2:OPEN #2,4,0,"K:"
      113 DIM T$(256):TRAP 119
      114 FOR I=1 TO 5
      115 INPUT #1,T$:? T$
      116 NEXT I
      117 GET #2,K
      118 GOTO 114
      119 CLOSE #1
      120 CLOSE #2
      121 END
      122 REM * PO KAZDEJ INSTRUKCJI GRAPHICS TRZEBA POWTORZYC *
      130 REM *** POKE 756, PL **



      Duże litery polskie uzyskujemy wciskając:
      Ą (control Q)
      Ć (control V)
      Ę (control R)
      Ł (control ;)
      Ń (control M)
      Ó (control P)
      Ś (control D)
      Ż (control Z)
      Ź (control .)
      Litery małe polskie
      ą (control A)
      ć (control C)
      ę (control E)
      ł (control L)
      ń (control N)
      ó (control O)
      ś (control S)
      ż (control X)
      ź (control K)