atarionline.pl ACTION! uczę się - 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:
         
        CommentAuthorinsert
      • CommentTime27 Dec 2010 20:12 zmieniony
       
      Czesc,

      Zakladam jeden watek, w ktorym bede meczyl Szanownych Kolegow, mam nadzieje ze przyda sie to takze potomnym ;)

      PYTANIE:

      Jak pokazac zawartosc katalogu podczas ladowania zrodla do edytora? (W Poradniku Programisty CZ.II jest to jakos enigmatycznie opisane). Mam podpiety w emulatorze hd na katalog i atari widzi to urzadzenie jako H1. Wszelkie proby wpisania H1:*.* oraz wariacji ze znakiem "?" nie daja rezultatu.

      PYTANIE:

      Czy da sie przerwac prace dowolnego programu w Action! i wrocic do edytora/monitora? Np. jesli program ma na koncu petle DO OD ?

      PYTANIE:

      Czy w Action istnieja komendy sinus i cosinus? Jesli nie to czy jest gotowa procedura, ktora mozna uzyc do tego typu obliczen?

      Pozdr

      P.
      • 2: CommentAuthors2325
      • CommentTime27 Dec 2010 21:12
       
      "Analogicznie odczytu zapisanego pliku dokonuje się poleceniem SHIFT-CONTROL-R, po którym komputer pyta "Read?" Trzeba teraz podać nazwę pliku w sposób wyżej opisany. Dodatkowo polecenie to umożliwia odczyt spisu zawartości dyskietki (directory). Następuje to po podaniu jako nazwy pliku tekstu ?1:*.*. Gdy chcemy odczytać directory z innej stacji dysków, to wystarczy cyfrę 1 zastąpić numerem tej stacji."
      • 3: CommentAuthors2325
      • CommentTime27 Dec 2010 21:12
       
      wydaje mi się że pomijamy cyfrę 1 żeby to działało
      • 4:
         
        CommentAuthorinsert
      • CommentTime27 Dec 2010 22:12
       
      Error 130, pudło
      • 5: CommentAuthors2325
      • CommentTime27 Dec 2010 22:12
       
      Action! w ogóle przewiduje coś takiego jak dysk twardy?
      • 6:
         
        CommentAuthorinsert
      • CommentTime27 Dec 2010 22:12
       
      tak, bo jak na sztywno wpiszesz H1:nazwapliku to odczytuje i zapisuje, wiec to nie problem czegos co udaje naped ale zapisu komendy, Pan Zientara to tak enigmatycznie napisal ze nie da sie zrozumiec :/
      • 7:
         
        CommentAuthorKaz
      • CommentTime27 Dec 2010 23:12
       
      TDC powinien tu wkrotce wkroczyc, bo on w Action! sporo ostatnio dzialal.
      • 8: CommentAuthornosty
      • CommentTime27 Dec 2010 23:12
       
      A myslalem ze sprawe Action! mamy juz zalatwioną: TDC po latach nauki i zmagan udowodnil ze da sie w tym jezyku napisac gre ;) a gwozdziem do trumny byl Atalan, na ktory (choc byl w wersji alpha i zabugowany do niemozliwosci) napisano w pol roku wiecej gier niz na Action w lat 10.

      A tu prosze, kolejny masochista sie trafil :)
      • 9:
         
        CommentAuthorinsert
      • CommentTime27 Dec 2010 23:12
       
      nie bez powodu reprezentuje grupe z BDSM w nazwie ;)
      • 10:
         
        CommentAuthortdc
      • CommentTime30 Dec 2010 14:12 zmieniony
       
      Witaj Insert, cieszy mnie to że nie tyle za Action! a w ogóle zabrałeś się za tworzenie kodu;)

      Ad 1
      O ile mi się wydaje to tego nie przewidziano. Konstrukcja z "?" używa dysków "Dx:" domyślnie, więc z "Hx:" nie wczyta nic, choć może np. Kuba tu coś wymyśli. Ja operuję na zwykłych Atrach, to się potem przydaje do backupów bo wystarczy zrobić kopię jednego ATRa a wszystko jest już zbackupowane.

      ad 2
      Action! należy traktować jak asm, jeśli zrobisz pętlę do od to nie ma z niej wyjścia poza reset. Jednak wiele programów/procedur da sie zatrzymać klawiszem Break, ale pod warunkiem, że pętla zawiera w sobie operacje systemowe np. print, plot itp.
      W przeciwnym wypadku trzeba dodać własnego IF K=28 THEN XXXX K=255 FI, gdzie K jest rejestrem klawiatury.

      ad 3
      W Action! nie ma operacji zmiennoprzecinkowych więc nie ma też sin,cos,tg itp. Musisz sobie np. w Atari Basic napisać kod który zapisze Tobie do pliku sin. To ma swoje zalety, bo skoro nie ma w tym języku wsparcia dla operacji przecinkowych to od razu masz to zoptymalizowane;)

      Powodzenia !


      Nosty, pokazałbyś że jesteś prawdziwym facetem i też nauczyłbyś się Action! :D
      • 11:
         
        CommentAuthorinsert
      • CommentTime30 Dec 2010 15:12 zmieniony
       
      Dzieki!

      kolejne pytania:

      1. Czy w Action da sie wykorzystac zmienne typu string, np ladujac do tablicy wartosci typu "KOTEK" "PIESEK" "ALA" etc i potem wypisac te wartosci z tablicy za pomoca Print(nazwatablicy(numer elementu)) ?

      2. Czy da sie polaczyc w instrukcji Print kilka roznych wynikow np:

      A = 32

      Print("Wynik to:" + A);

      zeby rezultat byl w postaci wyprintowania:

      Wynik to: 32

      ?
      • 12: CommentAuthornosty
      • CommentTime30 Dec 2010 15:12
       
      > Nosty, pokazałbyś że jesteś prawdziwym facetem i też nauczyłbyś się Action! :D

      Szczerze probowalem, ale ten kompilator ma akurat typowo kobiecą logikę :P i nie chodzi mi bynajmniej o to ze jest intuicyjny ;) Po prostu nie sporob przewidziec jego reakcji :D

      @insert - ja poleglem wlasnie na probie napisania w Action! tekstowki. Ten jezyk zdecydowanie nie jest przyjazny jesli chodzi o przetwarzanie tekstu.
      • 13:
         
        CommentAuthortdc
      • CommentTime31 Dec 2010 04:12 zmieniony
       
      1. w Action! nie ma stringów są tablice, stringi są dostępne w dodatkowej bibliotece (do znalezienia w Google). Jednak bez dodatków możesz bez problemu podstawić w różny sposób wartość "KOTEK" do tablicy, a potem wypisywać ją znak po znaku na ekran, np. w bibliotece Action! jest kilka PUT(), które tak działają jak w Basicu.

      Inna sprawa, że ja tego nie używam i odradzam wypisywanie znaków, znak po znaku i to z wykorzystaniem print, put itp. ale o tym byłoby więcej gdybyś pojawił się na sztabie;)

      2. Wykorzystując procedury dostępne w bibliotece, możesz to zrobić, ale musisz to rozbić na oddzielne wywołania procedur:

      BYTE A

      PRINT("Wynik: ")
      PRINTBE(A)


      Jeśli bardzo chcesz to zrobić na wzór C/java to ściągnij sobie z netu rozszerzoną procedurę print(), która o ile pamiętam potrafi to. Ja z resztą ze starych czasów mam na dyskietce coś takiego i nawet ostatnio zagadałem Kubę aby to upublicznić.

      > Print("Wynik to:" + A);

      he, he ten "+" pachnie mi javą ;):)


      nosty:

      ten kompilator ma akurat typowo kobiecą logikę :P

      No i dlatego masz tu szansę zabłysnąć swoją męskością ;):)

      nosty:

      Po prostu nie sporob przewidziec jego reakcji :D

      Eeee tam, przesadzasz, o ile pamiętam to tutaj na forum jeszcze nikt nie miał takiego problemu aby mu Action! co chwilę generował coś innego (o ile sam czegoś nie spaprał).

      nosty:

      Ten jezyk zdecydowanie nie jest przyjazny jesli chodzi o przetwarzanie tekstu.

      I to jest dowód na to że Action! jest podobny do C, bo jeśli ktoś chce zrobić coś z tekstem to robi to np. w javie a nie w C. A ja Wam powiem, że zdaję sobie sprawę z tego że w Action nie jest to zrobione dobrze, ale nic a nic mi to nie przeszkadza ;) Najczęściej jak mam długi tekst to wczytuję go z pliku do pamięci, a nawet mam stary program, w którym wszystko jest na dysku i jest doczytywane gdy potrzeba. To o czym piszecie, nigdy nie było mi potrzebne w Action!
      • 14:
         
        CommentAuthorinsert
      • CommentTime31 Dec 2010 05:12
       
      dzieki, wpadlem na moment do knajpy, niestety nie bylo Cie a ja musialem uciekac :/
      • 15:
         
        CommentAuthortdc
      • CommentTime3 Jan 2011 02:01
       
      Ja widocznie wpadłem niewiele później, no szkoda ja zawsze wolę spędzać czas na czymś konkretnym.
      • 16:
         
        CommentAuthorinsert
      • CommentTime3 Jan 2011 14:01
       
      no szkoda :( wieczorami postaram sie siedziec nad action wiec bede Cie zasypywal tonami glupich pytan :)
      • 17:
         
        CommentAuthortdc
      • CommentTime3 Jan 2011 15:01
       
      :)
      Wieczorami ? widzę że to brzmi poważnie ;)
      • 18:
         
        CommentAuthorinsert
      • CommentTime4 Jan 2011 00:01 zmieniony
       
      PYTANIE:

      Jak zrobic proste "czekanie na klawisz" zeby wstrzymac dzialanie programu np. przed jego zakonczeniem,

      proba typu:

      POKE(764,255)
      IF PEEK(764)<>255 THEN FI

      RETURN

      nie dziala :/ dlaczego?

      i dlaczego dziala takie rozwiazanie?

      BYTE CH = 764

      DO
      UNTIL CH <> 255
      OD

      RETURN
      • 19:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 00:01
       
      Bo nie ma pętli w której by program oczekiwał.

      byte key=764

      Proc Main()
      key=255
      while key=255 do od
      key=255
      Return
      • 20:
         
        CommentAuthorinsert
      • CommentTime4 Jan 2011 00:01
       
      nie rozumiem tylko gdzie tutaj odniesienie do klawiatury?

      byte key=764

      przypisuje zmiennej key wartosc 764, czy tak?

      a potem jest warunek, wiec nie kumam...
      • 21:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 00:01
       
      konstrukcja if (...) fi nie jest pętlą! "Fi" daje tylko kompilatorowi znak, że to koniec warunku (jakoś tak :D)

      Równie dobrze, powinno zadziałać z Peek/Poke, ale w Action! takie rozwiązanie jest mało efektywne (dla szybkości jaki i dla kodu) Dlatego odwołanie po przez zmienną odwołującą się do konkretnej komórki pamięci jest... lepsze :D
      Po za tym, druga konstrukcja którą podałeś, zawiera pętlę w której oczekuje na zmianę wartości zmiennej/komórki(764) i to jest rozwiązanie twojego problemu (pisałem o tym w wątku wcześniej)
      • 22:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 00:01 zmieniony
       
      oups... omyliłem wątek z postem :D sory...
      no nie ważne
      byte key=764

      to nic innego jak zmienna typu byte umieszczona/przydzielona w komórce 764. Czytając sprawdzasz, zapisując zmieniasz zawartość tej komórki/zmiennej (764 w tym przypadku)
      To równoznaczne z Peek(764) (czytasz) Poke(764,255) zapisujesz wartość.
      • 23:
         
        CommentAuthorinsert
      • CommentTime4 Jan 2011 00:01
       
      dzieki :)
      • 24:
         
        CommentAuthorinsert
      • CommentTime4 Jan 2011 00:01
       
      w takim razie pytanie, czy deklaracja zmiennej

      BYTE A

      A = 764

      to to samo co

      BYTE A=764

      ?
      • 25:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 00:01 zmieniony
       
      nie, to nie to samo

      byta a

      kompilator przydziela sam miejsce w pamięci dla tej zmiennej

      byte a=764

      ty przydzielasz sam, wyręczając kompilator ]:->
      • 26:
         
        CommentAuthorinsert
      • CommentTime4 Jan 2011 00:01
       
      dzieki :)

      czyli byte a=adres to to samo co Poke(adres,wartosc) ?
      • 27:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 00:01 zmieniony
       
      w ten sposób można też przydzielać też tablice, np.

      byte array Color=708

      da tablice poszczególnych rejestrów kolorów, począwszy od komórki 708 wzwyż.
      Color[1]=15 Color[3]=0

      ustawi (w trybie np. Gr.0) białe litery na czarnym tle.

      Należy bardzo uważać z takimi konstrukcjami, gdyż tablice w action nie mają sprawdzanego zakresu (dla szybkości) a w tym przypadku ten zakres nawet nie został określony (jest tylko komórka startowa) Skutkować to może zawieszeniem, skasowaniem danych i szeregiem innych, często kłopotliwych problemów.
      • 28:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 00:01
       
      byte a=adres

      (...)
      a=wartość ; Poke(adres,wartość)
      PrintCE(a) ; ? Peek(adres)


      w skrócie :D
      • 29:
         
        CommentAuthorinsert
      • CommentTime4 Jan 2011 00:01
       
      dzieki :)
      • 30:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 01:01
       
      Nie ma za co. Liczę, że pomogłem :)
      A tym czasem znikam w sen.
      Dobrej nocy.
      • 31:
         
        CommentAuthorinsert
      • CommentTime4 Jan 2011 22:01
       
      kolejny problem laika :)

      probuje wedlug ksiazki Atari Basic Miguta, przepisac procedure page flippingu na Action, moj kod wyglada tak:

      PROC MAIN()
      BYTE DLIST
      BYTE DLISTA
      BYTE DLISTB
      BYTE ADL
      BYTE AA
      BYTE BB
      BYTE CC

      GRAPHICS(9)

      DLISTA = PEEK(560)
      DLISTB = PEEK(561)
      DLIST= DLISTA + 256*DLISTB

      AA = DLIST+4
      BB = DLIST+5
      CC = 256*PEEK(BB)

      ADL = PEEK(AA)+CC

      POKE(89,128)
      POKE(88,0)

      COLOR = 15
      POSITION(40,40)
      DRAWTO(60,60)

      POKE(89,112)
      POKE(88,0)

      COLOR = 10
      POSITION(10,10)
      DRAWTO(100,100)

      KEYPRESS()

      GRAPHICS(0)

      RETURN

      ... oczywiscie mam bledy i nie dziala, prosze o pomoc
      • 32:
         
        CommentAuthorzilq
      • CommentTime4 Jan 2011 23:01
       
      Raz.
      Po co tyle wyliczania na początku, jak i tak z tego nie korzystasz (w późniejszym etapie)?!

      Dwa.
      Podstawowy błąd to źle uwzględnione typy zmiennych.
      Wszędzie założyłeś typ Byte! a to błąd. Dodam nawet LOGICZNY błąd.
      Jak wiadomo, mnożąc liczbę z zakresu 0-255 przez np. 256 nie zmieści się ona w typie Byte, bo jej zakres to 0-255, tak? A więc?
      Błąd logiczny tkwi w typie zmiennych DLIST, CC.

      Trzy.
      Co to jest?
      AA=DLIST+4
      BB=DLIST+5
      CC=256*Peek(BB)

      ADL=PEEK(AA)+CC

      czemu ma to służyć, bo nie bardzo to rozumiem.

      Podsumuje.
      Po pobieżnym przeanalizowaniu przykładu z książki, stwierdzam co następuje.
      Zupełnie źle zinterpretowałeś przykład.
      Spróbuj jeszcze raz, bo to co przedstawiłeś powyżej, nie nadaje się do skorygowania. Po prostu trzeba by było całość od nowa napisać, a to nie oto chyba chodzi, żeby przedstawiać gotowe rozwiązanie.
      • 33:
         
        CommentAuthortdc
      • CommentTime5 Jan 2011 01:01
       
      insert, nie przejmuj się, nie Ty pierwszy tu pokazujesz takie błędy i prosisz o pomoc;) jak to się mówi początki bywają trudne. Dlatego zrób jak radzi zilq.
      • 34:
         
        CommentAuthorinsert
      • CommentTime5 Jan 2011 20:01 zmieniony
       
      dobrze, wiec po kolei :)

      na ten moment mam takie cos:


      PROC MAIN()

      CARD A,B,DL,C,D,E

      GRAPHICS(7)

      ;COLOR = 1
      ;POSITION(40,40)
      ;DRAWTO(60,60)

      A = PEEK(560)
      B = PEEK(561)
      DL = A+256*B

      PRINTC(DL)

      KEYPRESS()

      GRAPHICS(0)

      PYTANIE:

      dlaczego zapis

      DL = PEEK(560) + 256*PEEK(561)

      jest bledny?

      PYTANIE:

      skoro zmienne A i B mam typu CARD to czy nie powinienem uzywac instrukcji PEEKC(...) ? jesli tak to dlaczego mam zupelnie inna wartosc zmiennej DL jesli uzyje tego w ten sposob:

      A = PEEKC(560)
      B = PEEKC(561)
      DL = A+256*B

      PRINTC(DL)

      ?
      • 35: CommentAuthorrudla
      • CommentTime5 Jan 2011 21:01
       
      Whether you use PEEK or PEEKC depends on whether you want t read 1 or two bytes from memory.

      PEEK reads one byte, even if you later store it into CARD variable. If necessary, it will extend the byte to two bytes.

      So

      A = PEEK(560)
      B = PEEK(561)
      DL = A+256*B

      should be correct, but you can write it in much succinct way:

      DL = PEEKC(560)

      or the best method:

      CARD DLADR = 560
      CARD DL
      DL = DLADR

      (I'm not an active Action! user, so there may be some syntax inaccuracies).


      The trick is, that programming languages usually asr not clever enough to undestand, that they should use CARD variable for the result of multiplication of two byte variables.
      Instead they typically use some tricks like using type of the first argument.

      I guess, Action! in this case will multiply 256*PEEK(561)
      • 36:
         
        CommentAuthorinsert
      • CommentTime5 Jan 2011 21:01
       
      rudla. thanks, but why DL = PEEK(560) + 256*PEEK(561) is fail?
      • 37:
         
        CommentAuthorinsert
      • CommentTime5 Jan 2011 21:01 zmieniony
       
      myslac dalej, mam cos takiego:

      PROC MAIN()

      CARD DLADR=560
      CARD DL,ADRES,ADRESB

      BYTE PIATYBAJT,SZOSTYBAJT


      GRAPHICS(7)

      ;COLOR = 1
      ;POSITION(40,40)
      ;DRAWTO(60,60)

      DL=DLADR

      PIATYBAJT=PEEK(DL+4)
      SZOSTYBAJT=PEEK(DL+5)
      ADRES=PIATYBAJT+256*SZOSTYBAJT

      PRINTC(DL)
      PRINT(" ")
      PRINTB(PIATYBAJT)
      PRINT(" ")
      PRINTB(SZOSTYBAJT)
      PRINT(" ")
      PRINTC(ADRES)

      ADRESB = PEEKC(DL+4)
      PRINT(" ")
      PRINTC(ADRESB)

      PYTANIE:

      czy dobrze obliczam poczatkowy adres pamieci ekranu obiema metodami?

      (metoda1:)

      PIATYBAJT=PEEK(DL+4)
      SZOSTYBAJT=PEEK(DL+5)
      ADRES=PIATYBAJT+256*SZOSTYBAJT

      (metoda2:)
      ADRESB = PEEKC(DL+4)

      PYTANIE:

      mam taki program, rysuje on w trybie 1 dowolny znak na ekranie o danych wspolrzednych, DLACZEGO nie rysuje serduszka?

      INCLUDE "H1:MYLIB.ACT"

      ;---------------------------

      PROC DRAWCHAR(BYTE X,Y,ZNAK)

      CARD EKR=88

      POKE(EKR+X+20*Y,ZNAK)

      RETURN
      ;---------------------------

      PROC MAIN()

      GRAPHICS(1+16)

      ;RYSUJEMY LITERE A
      DRAWCHAR(0,0,33)

      ;RYSUJEMY SERDUSZKO
      DRAWCHAR(1,0,64)

      KEYPRESS()

      GRAPHICS(0)

      RETURN

      PYTANIE:

      ponawiam, dlaczego taki zapis w Action wywala blad podczas kompilacji:

      DL = PEEK(560) + 256*PEEK(561)
      • 38:
         
        CommentAuthorzilq
      • CommentTime6 Jan 2011 00:01 zmieniony
       
      Hej. Widzę postępy :) i dobrze.

      Obie metody są z założenia dobre
      Jak już korzystać z funckji to PeekC jest najlepszym rozwiązaniem.
      ADRES=PeekC(DL+4)

      i już. Po ptokach. I problem z:
      DL=Peek(560)+256*Peek(561)

      z głowy :)

      Przypuszczam, że co do powyższego wyliczania adresu, błąd tkwi w dwóch "istotach". Pierwsza to, że wartości zwracane przez funkcję Peek są 8-bitowe (byte). Druga. Jakimś dziwnym trafem, kompilator nie może pogodzić typów zmiennych w wyrażeniu arytmetycznym. Czy to błąd kompilatora Action? Nie wiem - pewnie tak. Action ma dużo błędów, niestety :(
      Za to (co ciekawe) następująca kombinacja już takiego błędu nie wywala:
      DL=256*Peek(561)+Peek(560)


      Co do problemu z serduszkiem w trybie Gr1
      Ten tryb ma swoiste ograniczenie, co do zakresu wyświetlanych znaków. Jest to też jego zaleta, bo dzięki temu mamy do dyspozycji aż cztery różne kolory dla znaku.
      W standardowo otwartym trybie Gr1 znaki wyświetlane są następująco:
      Kod ekranowy    kolor   Poke   Znaki (ATASCI)
      0-63 1 708 32-95
      64-127 2 709 32-95
      128-191 3 710 32-95
      192-255 4 711 32-95

      To samo tyczy się trybu Gr2
      • 39:
         
        CommentAuthorinsert
      • CommentTime6 Jan 2011 00:01 zmieniony
       
      dzieki! czyli ze serduszka nie uswiadcze w tym trybie czy jak? :) nie rozumiem troche tego zestawienia (zwlaszcza kolumny Poke i jej uzycia/znaczenia
      • 40:
         
        CommentAuthorzilq
      • CommentTime6 Jan 2011 00:01
       
      Teoretycznie da się uzyskać, ale nie pamiętam jak to uczynić. Był chyba jakiś POKE do tego, ale gdzie i co do niego wpisać to ńhuhu...

      Można przepisać generator znaków (to taka alternatywna metoda) ]:->
      • 41:
         
        CommentAuthorinsert
      • CommentTime6 Jan 2011 00:01
       
      no to juz czarna magia zawialo :)
      • 42:
         
        CommentAuthorzilq
      • CommentTime6 Jan 2011 00:01
       
      czarna magia to spritey programowe w trybach znakowych :]
      A "programowanie" generatora znaków to Pikuś i to nawet nie Pan :D
      • 43:
         
        CommentAuthorinsert
      • CommentTime6 Jan 2011 00:01 zmieniony
       
      co znaczy "programowanie generatora znakow? po co to? co to?
      do spriteow dojdziemy... za sto lat ;)

      btw. czy da sie uzyskac taka procedure w trybie graficznym? tj. taki print w trybie graficznym
      • 44:
         
        CommentAuthorzilq
      • CommentTime6 Jan 2011 00:01 zmieniony
       
      Programowanie generatora znaków to nic innego ja stworzenie własnego zestawu znaków, umieszczenie go "gdzieś" w pamięci i ustawienie jednego Poke (dokładnie 756) Taki zestaw znaków standardowo zabiera 4 strony pamięci (tj 1KB=1024B - 1 strona pamięci to 256 bajtów) w trybie np. Gr1 i 2 zestaw znaków zabiera połowę z tego, czy 512B (2 strony).
      Efekt "zaprogramowania" własnego zestawu znaków zależy od tego, do czego będziesz chciał wykorzystać tak stworzony zestaw, np. gra, polskie znaki, ładne ramki, itp)

      Co do procedury wyświetlającej tekst w trybach graficznych to już troszkę wyższa szkoła jazdy. Przede wszystkim, aby taka procedura nadawała się do czegokolwiek, wypadałoby ją napisać w assemblerze. W Action! można się pokusić o napisanie takiej procedury, ale o tym to innym razem :) (przyda się znajomość "programowania generatora znaków")

      Opanuj podstawy, a sam dojdziesz do tego, co i jak :]
      • 45:
         
        CommentAuthorinsert
      • CommentTime6 Jan 2011 00:01
       
      dzieki :)
      • 46: CommentAuthorrudla
      • CommentTime6 Jan 2011 10:01
       
      It depends on the rules of the respective language, how it will evaluate this function. Most languages are not clever enough to realize, they need to use CARD for the result of the expression and will use some simple rule.

      If the 256*PEEK(561) does not work in Action!, then it will be because it uses BYTE arithmetics by default. In such case this expression will return always 0.
      • 47:
         
        CommentAuthorinsert
      • CommentTime6 Jan 2011 11:01
       
      thanx Rudla, ale zuo :)
      • 48: CommentAuthormono
      • CommentTime6 Jan 2011 11:01 zmieniony
       
      Na początek warto zrozumieć różnicę między kodami ATASCII a kodami ekranowymi zwanymi czasem wewnętrznymi (ang. internal). Następnie poczytać o generatorze znaków i trybach 6 i 7 ANTICa (odpowiedniki 1 i 2 OS).
      Kluczową informacją w zrozumieniu dlaczego serduszko się nie wyświetla może być ostatnie zdanie opisu generatora znaków - generator w trybach 1 i 2 OS ma rozmiar 512B a nie 1024B, jak w pozostałych trybach tekstowych, a to ze względu na to, że dwa ostatnie bity kodują kolor. Standardowy generator znaków w OS znajduje się pod $E000 - znajdziesz tam więc definicje znaków $00..$3f (wg kodów ekranowych - czyli $20..$5f ATASCII). Jeśli zmienisz adres generatora znaków na $E200 (druga połówka generatora OS) wtedy na ekranie pojawią się definicje $00..$1f oraz $60..$7f ATASCII.

      Edit: Dla ciekawości możesz przeprowadzić podobny eksperyment z międzynarodowym zestawem znaków, który znajduje się pod adresem $CC00.
      • 49:
         
        CommentAuthorinsert
      • CommentTime6 Jan 2011 12:01
       
      powoli, rozmawiacie z humanista ;P ps. dzieki Mono
      • 50:
         
        CommentAuthorinsert
      • CommentTime12 Jan 2011 22:01 zmieniony
       
      mam problem z obsluga joysticka, mam taki program:

      PROC MAIN()

      ;JOYTEST

      CARD PORTA=$D300
      BYTE KEY=764

      KEY=255

      WHILE KEY=255 DO

      IF PORTA=1 THEN PRINT("gora") FI
      IF PORTA=2 THEN PRINT("dol") FI
      IF PORTA=4 THEN PRINT("prawo") FI
      IF PORTA=8 THEN PRINT("lewo") FI

      OD

      KEY=255

      RETURN

      dlaczego nie dziala? :/