26

Hej,

Fajny się czyta i jeszcze więcej rozumie..  mam tylko takie pytanko:

Sikor napisał/a:

150 IF PEEK(53279)<>6 THEN 150

nie łatwiej i konsekwentniej  było by używać wartości HEX? Wiem że to nie assembler ale te szesnastkowe jakoś bardziej do mnie przemawiają... :-)

https://systemembedded.eu/ ... https://www.youtube.com/watch?v=GwS7Es1x6mw
""Ja bardzo przepraszam, ale podejrzenia panów są całkowicie bezpodstawne. Ja niczym nie handluję. Ta pani przyszła do mnie w tym Pancake-u i w nim wychodzi.""
ABBUC Member #319. Preferowana forma kontaktu: email

27

Dzięki za za kontynuację. Zapowiada się super tutorial.
Jak na razie nie mam pytań bo tylko przeczytałem, jutro usiądę do komputerka, to może coś przyjdzie :)

28

@pancio.net - no, tutj wychodzi wieloletnie przyzwyczajenie z Atari Basica, a mapy pamięci w głowie nie mam, ale celna uwaga. Z punktu widzenia Atari to i tak jest bez znaczenia.

Sikor umarł...

29

A czy interpreterowi robi różnicę czy podaje się liczby dziesiętne czy w heksie? Czy on to musi przeliczać i ma to jakiś wpływ na szybkość działania kodu? Oczywiście mówię tylko o interpreterze, bo wiadomo, że kompilator na pewno i tak to ujednolici.

30 Ostatnio edytowany przez Sikor (2019-03-09 21:27:37)

Z tego co wiem, to nie, ale zainteresowałeś mnie. Pomyślę nad adekwatnym testem w krótkim kodzie, bo szczerze mówiąc - zawsze staram się kompilować moje programy, a tam jest to już bez znaczenia. ale do tego założę oddzielny wątek.
Może jeszcze sprawdzę na włązonym i wyłączonym ekranie... Dla pewności.

Sikor umarł...

31 Ostatnio edytowany przez Sikor (2019-03-10 22:45:27)

Mq napisał/a:

A czy interpreterowi robi różnicę czy podaje się liczby dziesiętne czy w heksie? Czy on to musi przeliczać i ma to jakiś wpływ na szybkość działania kodu?

Nigdy tego nie testowałem, ale tu adekwatny wynik 10000 pustych powtórzeń...
http://www.atari.org.pl/forum/viewtopic.php?id=15894 - edycja, nie dodałem wcześniej linku...

Sikor umarł...

32

Bawię się twoim drugim odcinkiem i tak:

1) oczywiście należy przed uruchomieniem programu zawsze wykonać

BLOAD "D:DANE.DAT"

2) może dopisze co robi linia 150, bo nie każdy wszystko wie, ja musiałem poszukać ;)

150 IF PEEK(53279)<>6 THEN 150

PEEK odczytuje wartość spod adresu.

Pod adresem 53279 zapisany jest stan klawiszy funkcyjnych START, SELECT, OPTION.

zwracane wartości:

0 – OPTION SELECT, START
1 – OPTION, SELECT
2 – OPTION, START
3 – OPTION
4 – SELECT, START
5 – SELECT
6 – START
7 – żaden

czyli w lini 150 czekamy, aż wciśniemy START.

Wiem, że da większości z was to banał, wiec jak coś napiszecie to nie będę się więcej wtrącał z banałami :)

33 Ostatnio edytowany przez Sikor (2019-03-10 09:22:43)

Wcale nie banał, dobrze, że zwróciłeś uwagę na coś, czego nie opisałem - pewne rzeczy z czasem sają się tak oczywiste, że człowiekowi się wydaje, że każdy wie... Co do bload - wczytujesz tylko raz, dopóki nie wyłączysz komputera - działa, bo dane są. Ale fakt, trzeba wczytać. Tylko... Te dane potem łatwo dołączymy do wersji plikowej.
Linia 150 - instrukja "jeżeli" (if), czyli instrukcja warunkowa. Tutaj w wersji krótkiej (stąd słowo kluczowe THEN), która nam mówi: jeżeli jest spełniony warunek (u nas nierówność) to coś zrób - w naszym przypadku oczywiście są to klawisze konsoli, więc czekamy na jakieś działanie odpowiedniego klawisza.
Dzięki lopez za uwagi, bo chociaż wiem, że ktoś coś z tym robi ;) Jak dam radę - to do przyszłej niedzieli część trzecia.
==================
Jeszcze pytanie - w części trzeciej zrobić (ubogą jeszcze, niefunkcjonalną) wersję file (czyli działającą spod DOSa), aby pokazać jak to się robi - czy to zostawić na koniec? Bo może ktoś chce zrobić inną grę, a zasada jest ogólna. Proszę o uwagi w komentarzach.

Sikor umarł...

34

Hej,

Myślę, że warto zrobić obiema metodami - tu i teraz kadłubek działający z pod DOS-a pozwoli innym rozwinąć skrzydła z innymi pomysłami a znajomość tego "jak to się robi z DOS-em" powinna być podstawą. A na końcu projektu zrobisz to jeszcze raz celem utrwalenia :-)

Pozdrawiam i czekam na resztę materiałów.

https://systemembedded.eu/ ... https://www.youtube.com/watch?v=GwS7Es1x6mw
""Ja bardzo przepraszam, ale podejrzenia panów są całkowicie bezpodstawne. Ja niczym nie handluję. Ta pani przyszła do mnie w tym Pancake-u i w nim wychodzi.""
ABBUC Member #319. Preferowana forma kontaktu: email

35

Na koniec niewątpliwie. Dobra, trzecia część będzie głównie o robieniu wersji file - w międzyczasie przed czwartą częścią będę miał chwilkę na scenariusz i poszukanie grafik do konwersji.

Sikor umarł...

36

Czekam z niecierpiętliwością :)

37 Ostatnio edytowany przez larek (2019-03-10 13:17:53)

Ja też obserwuję ;)
I może od czasu do czasu coś się odezwę... jeśli Sikor pozwoli :p

Jak już piszemy program w Turbo Basicu XL, to uważam, że szkoda byłoby nie korzystać z jego dobrodziejstw.
Kod:

150 IF PEEK(53279)<>6 THEN 150

można zastąpić:

150 WHILE PEEK(53279)<>6:WEND

Efekt działania taki sam, ale ten wygląd! ;)

W celach edukacyjnych należy wyjaśnić: pętla WHILE - WEND będzie się wykonywać dopóki warunek będzie spełniony. Oczywiście instrukcje WHILE i WEND nie muszą być w jednej linii, mogą być rozdzielone blokiem innego kodu, wówczas cały ten blok będzie wykonywany dopóki warunek będzie spełniony. Warunek jest sprawdzany na początku, więc może dojść do sytuacji, że instrukcje w bloku nigdy nie zostaną wykonane.

I jeszcze taka uwaga - brak obniżenia RAMTOP i ochrony przez to danych w programie może się zemścić, gdy stworzymy naprawdę długi program. Do nauki programowania jest to faktycznie zbyteczne i może wprowadzić tylko zamieszanie w głowach młodych programistów, ale jak już zaczniecie bawić się w tworzenie bardzo obszernych programów, to przypomnijcie sobie o czymś takim, jak RAMTOP.

38

Dziękuję Panie Profesorze Larku. Tak, to dobra konstrukcja, jednak potem będę ją modyfikował, ale na potrzeby testów póki co jest jak jest. A dobre słowo i świadomość, że "ktoś to czyta" jest dla piszącego artykuł naprawdę budująca.

Sikor umarł...

39 Ostatnio edytowany przez Smaku (2019-03-11 19:40:40)

A czy można zapisać tą samą linię w postaci:

150 WHILE NOT (PEEK(53279)=6):WEND

?

Nie znam Turbo BASIC-a XL, więc może coś poznam. Lubię poznawać nowe rzeczy, oczywiste.

40

Oczywiście, negacja tu nic nie zmienia.

Sikor umarł...

41

Zmienia czas wykonania operacji

42

BartoszP, ale w którą stronę ten czas się nam zmieni? Jeśli myślisz, że dodanie negacji to dodatkowa operacja, to ja Ci powiem, że myślę, że może czasem być dokładnie odwrotnie, bo operacja porównania z kolei na pewno jest dużo szybsza jeśli porównujemy liczbę 6 za pomocą znaku = niż gdy robimy porównanie <> gdzie tak na prawdę sprawdzane są dwa warunki, przy czym chyba porównanie ze znakiem równości nawet od jednego warunku ze znakiem większości będzie szybsze.
Sikor drugie zagadnienie do tego Twojego osobnego wątku z testami poleceń TBXL:-)

43 Ostatnio edytowany przez Smaku (2019-03-11 21:10:13)

BartoszP napisał/a:

Zmienia czas wykonania operacji

Też o tym myślałem trochę. Nie znając TB XL, ciekawi mnie, czy taki zapis działa w tym języku programowania.

Jeśli działa, to teraz można się zastanowić, jak procesor wykona instrukcję z <> i tę drugą z NOT.

Jeśli <> procesor robi tylko jednym CMP, to wyjdzie szybciej chyba.

Jeśli procesor robi <> na dwóch CMP, to wyjdzie dużo wolniej, niż z NOT, oczywiste.

Instrukcja z NOT to tylko porównanie komórki pamięci z liczbą (=), a potem negacja - dwie proste instrukcje CPU.

Natomiast <> może być być może robione aż na dwóch CMP, bardzo długo wykonujących się. Hmm... ciekawe bardzo dość.

Trzeba by uczciwie zapisać obie instrukcje w asemblerze i będzie widać.

44

Mq napisał/a:

bo operacja porównania z kolei na pewno jest dużo szybsza jeśli porównujemy liczbę 6 za pomocą znaku = niż gdy robimy porównanie <> gdzie tak na prawdę sprawdzane są dwa warunki,

Otoz nie. <> jest rownowazne z !=

I jedno i drugie to jedna i ta sama operacja w assemblerze.


cmp #6
bne nierowne:
Dalsza czesc gdy rowne

lub

cmp #6
beq rowne
Dalsza czesc gdy nierowne

"tatusiu zobacz, narysowałam tobie takie same coś jak na twojej koszulce" 
https://github.com/willyvmm/mouSTer
jmp $e477

45

to do kolekcji:

150 REPEAT:UNTIL PEEK(53279)=6

Bez negacji, tylko znak równości

150 ON PEEK(53279)<>6 GOTO 150

Mamy goto, ale działanie dokładnie takie samo

150 #START:ON PEEK(53279)<>6 GO# START

Podobnie
Panowie, mówimy o grze paragrafowej. Ułamki sekund tu nic nie znaczą. Ciekawe za to, jak z zajętością kodu w wynikowym programie. To było jako przykłąd, abyśmy wykorzystali klawisze konsoli. Każdy przykład można przepisać z negacją lub bez, można zaoszczędzić na kilku cyklach, ale nie o to tu chodzi. Nie gmatwajmy kodu. Przykładów robiących to samo można by pewnie podać jeszcze z dziesięć, tylko po co? Nie mnóżmy niepotrzebnie bytów, jak poznamy zasadę działania - każdy sobie znajdzie najlepszą dla niego metodę, jak myślę. Póki co zatrzymała nas obsługa klawiszy konsoli.

Sikor umarł...

46 Ostatnio edytowany przez Smaku (2019-03-11 23:24:23)

Sikor napisał/a:

to do kolekcji:

150 REPEAT:UNTIL PEEK(53279)=6

Bez negacji, tylko znak równości

150 ON PEEK(53279)<>6 GOTO 150

Mamy goto, ale działanie dokładnie takie samo

150 #START:ON PEEK(53279)<>6 GO# START

Z tych przykładów wyżej w asemblerze wnioskuję, że negacja znika po kompilacji w kodzie maszynowym, więc czy z NOT, czy  bez, realizuje to porównanie logiczne odpowiedni rozkaz CPU. Czyli kod wynikowy dla <>, lub NOT = powinien być tożsamy (w sensie "obciążenia", dopisuję, bo ktoś by się czepiał może), tak mi się myśli. Czyli zależy pewnie od jakości kompilatora, który robi kod wynikowy dobrze, lub zależy, oczywiste.

Natomiast te przykłady z goto - znowu trzeba wiedzieć, jak to kompiluje kompilator, możliwe, że te same kody wynikowe by były (w sensie "obciążenia"), co dla WHILE i REPEAT z NOT lub bez, ale nie koniecznie - ciężka robota badać takie drobiazgi, a w grach, które nie wymagają takich oszczędności cykli, chyba nie miałoby to większego sensu, jak w wypowiedzi "Sikor", wyżej.

Ciekawi mnie od początku tego wątku o tej pętli POKE, w jaki sposób komórka pamięci 53279 może kiedykolwiek i jakkolwiek zmienić swoją wartość? To nie jest przypadkiem obszar ROM-u?

47 Ostatnio edytowany przez Mq (2019-03-11 21:45:16)

Jasne, że nie ma sensu porównywać takich ułamków sekund dla gry paragrafowej. Wspomniałem o tym i zapytałem dlatego, że wybiegam trochę w przyszłość i już myślę do czego by można użyć TBXL następnym razem. Dlatego zainteresował mnie temat takich drobiazgów w sensie jak robi to kompilator. Bardzo dziękuję Willy za rzeczowe wyjaśnienie - właśnie konkretnie chodziło mi o interpretację <> vs !=, którego w Basicu bardzo mi brakuje, bo jestem przyzwyczajony do używania != od lat w pracy zawodowej w językach znienawidzonych komputerów pece. Sikor, nie rozwijaj takich wątków - krótkie pytanie, krótka odpowiedź, w międzyczasie, w oczekiwaniu na kolejny odcinek tutoriala.

48

A ja się długo nie mogłem przyzwyczaić do !=, bo przecież wszyscy wiedzą, że tam powinno być <>.

49

No, jak się z Atari Basic przesiadałem na pecety dawno temu, to też mi jakoś brakowało tego <>, a != było dziwnym tworem:-) Teraz mam odwrotnie:-)

50

A jeszcze dziwniejszym tworem jest =\= :P

hex, code and ror'n'rol
niewiedza buduje, wiedza rujnuje