Aktualności: C64 Power - online od stycznia 2000 !

Autor Wątek: Koduj w Atalanie - Lekcja 1 - sajmosia edition  (Przeczytany 1619 razy)

0 użytkowników i 4 Gości przegląda ten wątek.

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Koduj w Atalanie - Lekcja 1 - sajmosia edition
« dnia: 07 Lutego 2018, 09:35 »
Dizklajmer: niniejszy post powstał pod wpływem dyskusji z sajmosią, który z uporem godnym maniaka wykłócał się ze mną w tym wątku http://c64power.com/forumng/index.php?topic=8041.msg106445;topicseen#msg106445. Ponieważ nie ma racji, kilkukrotnie dałem mu możliwość przyznania, że jednak się myli, lub bodaj stwierdzenia „no wiem, wiem, ale tak tylko się chciałem z tobą poprzekomarzać”. Nie skorzystał. Tak więc czuję się upoważniony do jechania po sajmosi jak po łysej kobyle i jeśli moderacji przyjdzie do głowy dać mi za „szkalowanie” (sic) samojsi bana, będzie to pierwszy i ostatni odcinek kursu programowania w Atalanie. Wiecie, misie – mam już od Was wszystkie bebechy do mojej emkadwójki, więc będzie mi to wisieć i powiewać. A więc – do dzieła!

Disklajmer dwa: wszystkich zainteresowanych programowaniem zapewniam, że osobiście wolałbym zacząć ten kurs o pokazania jak zrobić coś FAJNEGO. Jeśli nie Tetrisa albo nowego klona Breakouta, to przynajmniej lecącego balonika z literką C=. Wiecie, coś UŻYTECZNEGO. No ale że się stało, jak się stało, pierwsza lekcja programowania w Atalanie pokaże coś totalnie z dupy – otwieranie ramek.

„Otwieranie ramek? A na chuj mi otwieranie ramek?” – może zapytać czytelnik, któremu marzy się stworzenie własnej bazy danych, „Pirates! 2” albo „Zac McKracken And Slavic Monkeyspankers”? No, cóż – szczerze powiedziawszy, odpowiedzieć mogę tylko „Kurwa, nie mam zielonego pojęcia, ale pytajcie sajmosi”. A wcześniej możecie zapytać, jak do tego doszło. No cóż, pozwólcie, że posłużę się analogią.

Załóżmy, że jesteś sobie na forum o odchudzaniu i pewnego dnia wysmarowujesz posta:

„Hej grubasy! A może by tak zamiast biegać po chodnikach i wkurwiać ludzi, powspinalibyśmy śię po schodach na 30 piętro Pałacu Kultury i Nauki? Nie dość, że spalimy kalorie, to będziemy mieli jeszcze ładne nóżki!”

No i na tego posta otrzymujesz taką odpowiedź:

„Bez sensu, tak się nie da”.

Dziwne. Chwilę się zastanawiasz. Mam nogi? Mam. Pałac Kultury ma klatkę schodową? Ma. Jest trzydzieste piętro? Jest. No to o co kamą?

„Twoje niezrozumienie wynika z nieznajomości architektury” – wyjaśnia interlokutor w odpowiedzi na pytanie czemu się nie da.

I nagle cię oświeca! Rozmawiasz z idiotą! I to nie zwyczajnym, bo takiego po prostu skwitowałbyś wzruszeniem ramion, ale z tym rodzajem idioty, co to „w dupie był i gówno widział”. Rodzaj ten ma to do siebie, że swoją głupotą się wręcz szczyci i nie traci żadnej okazji, aby pokazywać z dumą innym, jaki to jest głupi. A z takimi można się już czasem pobawić. Indagowany dalej wyjaśnia więc, że na Pałac Kultury da się wejść, ale tylko na rękach i trzymając jednocześnie tabliczkę „Kancelaria adwokacka (w bramie)”. Oooooj, czyli mamy tu przypadek ciężki!

„A co jeśli wejdę na Pałac Kultury NA NOGACH, tym samym zadając kłam twojej tezie?” – pytasz, ale idiota ma na to gotową odpowiedź:

„Ale na pewno nie wejdziesz na Pałac Kultury na nogach i trzymając jednocześnie tabliczkę „Kancelaria adwokacka (w bramie)”

„Ooooo, a to dlaczego?” – pytasz, bo w zasadzie lubisz śmiesznych idiotów.

„Aaaaaa, bo timingi nie będą się zgadzać” – odpowiada idiota.

Mmmm… Aha… Noooo, taaaaak… Wobec tego zadajesz pytanie:

„Ale czy ta tabliczka jest na pewno potrzebna?”

„Jest niezbędna!” – odpowiada idiota.

„No dobrze” – mówisz – „wejdę z tą tabliczką, pod warunkiem, że ma to jakikolwiek sens. Ktoś już to robił?”

„Ooooo, tak” – odpowiada itiota – „Adam Kubica na skoczni mamuciej w Jeleniej Górze”.

„Czyli jeśli wejdę na nogach i z tabliczką, przyznasz, że odchudzanie w ten sposób ma sens?”

„Nie ma obawy. Nie wejdziesz!”

No i co robicie w takiej sytuacji? Możecie oczywiście powiedzieć, że tylko idiota da się podpuścić idiocie.

Wobec czego muszę z przykrością przyznać – tak, jestem idiotą!

A teraz do rzeczy:
« Ostatnia zmiana: 07 Lutego 2018, 09:42 wysłana przez qus »



Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #1 dnia: 07 Lutego 2018, 09:36 »
Sajmosia zaproponował, abym w Atalanie otworzył ramkę, jako przykład podając ten kod:
sei

; First make sure the normal screen is shown.

bit $d011
bpl *-3
bit $d011
bmi *-3
lda #$1b
sta $d011

; For each frame, set screen-mode to 24 lines at y-position $f9 - $fa..
loop:
lda #$f9
cmp $d012
bne *-3
lda $d011
and #$f7
sta $d011

; .. and below y-position $fc, set it back to 25 lines.
bit $d011
bpl *-3
ora #8
sta $d011
jmp loop

Dodajmy od razu, że kod to idiotyczny – otwiera ramkę i zawiesza komputer. No ale nic to! Ponieważ powiedziałem, że napiszę ten kod w Atalanie, jeśli tylko wskaże mi JAKĄKOLWIEK grę z top listy lemon64, która używa do czegoś otwierania ramek, a on podał Bomb Jack – nie było wyjścia. Piszę!

Oczywiście tu należałoby dodać, że cała awantura jest o to, że w językach wysokiego poziomu lepiej jest pisać niż w assemblerze. Po prostu kod ładniej i zrozumialej wygląda. W tym wypadku niestety nie da się tego powiedzieć, ale cóż się dziwić, skoro to nie żaden kod, tylko hack na biednym VICu! Nawet jakbym zrobił piękne wcięcia, pokolorował składnię i oprawił w barokową ramkę, nadal byłby to durny hack robiący niepotrzebną pierdołę.

(aha – to jest ta pora, w której ściągacie sobie z mojego GITa źródła Atalana, kompilujecie je za pomocą make, wklepujecie poniższy program, aby powiedzieć mi „sprawdzam!!!”, po czym go kompilujecie i sprawdzacie wynikowy plik *.asm)

Zanim zaczniecie wklepywać, spójrzcie na kod assemblerowy powyżej i spróbujcie (jeśli nie znacie assemblera) domyślić się, co robi. A potem spójrzcie na poniższy kod Atalana i spróbujcie tego samego (jedyna podpowiedź: notacja zmienna$n oznacza „n-ty bit zmiennej”)

Atalanowy program do wklepania:

use c64

disableIrq

while vicScrCtrlReg1$7 = 0

while vicScrCtrlReg1$7 = 1

vicScrCtrlReg1 = $1b

loop@
while vicRasterLine<>$f9

vicScrCtrlReg1 = vicScrCtrlReg1 bitand $f7

while vicScrCtrlReg1$7 = 0

vicScrCtrlReg1 = vicScrCtrlReg1 bitor 8

goto loop
« Ostatnia zmiana: 07 Lutego 2018, 09:39 wysłana przez qus »

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #2 dnia: 07 Lutego 2018, 09:36 »
Wklepane? Skompilowane? No to obczajamy wynikowy ASM, od razu porównując z tym sajmosi:

; disableIrq (test.atl @17)
   jsr _disableIrq

   __lbl12:
; while vicScrCtrlReg1$7 = 0 (test.atl @21)
   bit _vicScrCtrlReg1; dupa 1 bit 7 = 0
   bpl __lbl12
__lbl15:
; while vicScrCtrlReg1$7 = 1 (test.atl @25)
   bit _vicScrCtrlReg1; dupa 3 bit 7 = 1
   bmi __lbl15
__lbl14:
; vicScrCtrlReg1 = $1b (test.atl @29)
   lda #27
   sta _vicScrCtrlReg1

   __lbl18:
; while vicRasterLine<>$f9 (test.atl @36)
   lda _vicRasterLine
   cmp #249
   bne __lbl18
__lbl17:


; vicScrCtrlReg1 = vicScrCtrlReg1 bitand $f7 (test.atl @41)
   lda _vicScrCtrlReg1
   and #247
   sta _vicScrCtrlReg1
__lbl21:
; while vicScrCtrlReg1$7 = 0 (test.atl @46)
   bit _vicScrCtrlReg1; dupa 1 bit 7 = 0
   bpl __lbl21
__lbl20:
; vicScrCtrlReg1 = vicScrCtrlReg1 bitor 8 (test.atl @50)

   lda _vicScrCtrlReg1
   ora #8
   sta _vicScrCtrlReg1
; goto loop (test.atl @53)
   jmp __lbl18

Różnice są dwie – jedna nieistotna – wyłączenie przerwań przez skok do podprogramu, zamiast prostego SEI. Możemy nazwać to kiepską optymalizacją, ale bierzcie pod uwagę, że Atalan jest projektem rozgrzebanym i nawet segfaulty w czasie kompilacji nie są niczym nadzwyczajnym. Ta mała różnica nie wpływa na działanie programu!

Drugą różnicę mamy tu:

Sajmosia:
lda #$f9
cmp $d012

Atalan:
   lda _vicRasterLine
   cmp #249

Jak widzimy – Atalan zrobił to odwrotnie – załadował do A zawartość $d012, po czym porównał z 249 (sajmosia – załadował 249 do A, po czym porównał z $d012). Też nie wydaje mi się, żeby miało to jakikolwiek wpływ na jego działanie.

No i prawdziwy błąd, który przemilczałem, a który de facto psuje ten program, bo do $d012 idzie nie to, co trzeba, to nadmiarowa instrukcja:

lda _vicScrCtrlReg1

Znajdująca się przed ORA #8. W pierwotnym programie jej nie ma, no bo hakier, który go pisał po prostu korzysta z istnijącej już w A wartości, której robi ORA #8. Jestem jednak przekonany że i ten problem dałoby się wyeliminować, szkoda mi jednak tracić więcej czasu na idiotę. Może ktoś z czytelników tak przerobi program w Atalanie, aby ta jedna instrukcja wypadła?

No dobrze. Jaki z tego wniosek? Nie wiem, pytajcie sajmosi, który z uporem maniaka twierdził, że „nie da się”, po czym okazało się, że po kompilacji Atalan dał nam IDENTYCZNY KOD. Co było wiadomo od początku, ponieważ przeciw sajmosi, niestety, stała matematyka i informatyka. Twierdzenie sajmosi, jakoby tylko w assemblerze dało się zrobić X, ma taką samą wagę, jak twierdzenie „jest tylko jeden sposób aby otrzymać wynik 4 sumując dwie liczby”. Jeśli ciekawi cię więc matematyka i informatyka – czytaj dalej!
« Ostatnia zmiana: 07 Lutego 2018, 09:40 wysłana przez qus »

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #3 dnia: 07 Lutego 2018, 09:37 »
Coda: otwórz se, kurwa, ramki w BASICu albo Chujwicu

CZYLI

Czemu matematyka jest przeciw sajmosi?

Czym jest kompilator? Kompilator, to funkcja matematyczna (dodajmy jeszcze – działająca w domenie dyskretnej), która zamienia strumień bitów na wejściu w strumień bitów na wyjściu w sposób odwracalny.

Działanie kompilatora ograniczone jest przez architekturę procesora znajdującego się na wyjściu, to on jest wąskim gardłem. Aby prowadzić dalsze rozwiązania przypomnijmy sobie (albo wprowadźmy) pojęcie przestrzeni stanów. Przestrzeń stanów jest to zbiór wszystkich możliwych wartości, jakie może przyjmować dany układ. Obliczmy więc miarę przestrzeni stanów naszego C64. Zacznijmy od czegoś prostego.

Jaka jest przestrzeń stanów pudełka z dwiema przegródkami, mogącymi być albo w stanie „pustym” albo „pełnym”? Oczywiście – to 4! Możemy mieć stany:

Pusty-pusty
Pusty-pełny
Pełny-pusty
Pełny-pełny

„Ok, znamy to!” – krzykniecie – „To system dwójkowy”. Zgadza się! No to jaka jest przestrzeń stanów C64? To oczywiście 256^65536. Gigantyczna liczba, ale… skończona!

Tak więc kompilator dowolnego języka wysokiego poziomu może na C64 w najlepszym razie wyprodukować maksymalnie 256^65536 różnych programów. Dodajmy, że w rzeczywistości jest ich mniej, ponieważ nie każdy układ bajtów da działający kod MOS65xx. Gigantyczna liczba trochę się zmniejszy, ale to bez znaczenia.

A co z przestrzenią stanów na wejściu? Jaka jest jej maksymalna miara? Pomyślmy…

Zakładamy, że posiadamy kompilator języka Z#+ i napisany w nim program (rozmiar źródła, dajmy na to – jeden megabajt, wiecie – programy są zawsze bardziej rozwlekłe niż assembler), który kompiluje się do dokładnie 65536 bajtów. Mniam!
Jak obliczymy rozmiar jego przestrzeni stanów? Ano, załóżmy, że kod programu jest w ASCII, do tego dozwolone są cyfry i parę znaków takich jak [ { , . ; : itd. W zaokrągleniu to będzie 50, no niech stracę – 60 różnych dozwolonych w każdym bajcie kodu źródłowego. No to liczymy:

Przestrzeń stanów kodu źródłowego o rozmiarze 1MB = 60^1048576

Potraficie oszacować czy to więcej, czy mniej niż 256^65536? Nie wyciągajcie kalkulatorów, to bez znaczenia! Słuchajcie dalej!
Załóżmy, że w kodzie tegoż programu posługujemy się zmienną CHUJ w stu miejscach. Ponieważ zmieniliśmy koncepcję robimy refektoring tej zmiennej i nazywa się ona teraz SAJMOSIA. Kod ŹRÓDŁOWY programu wydłuża się o 8*100 bajtów (przestrzeń stanów rośnie!), a wynikowy kod assemblera nadal ma ten sam rozmiar, 65536!

No dobrze, ale co z tego?

Ano właśnie, za pomocą indukcji, udowodniliśmy, że wejściowa przestrzeń stanów może być NIESKOŃCZONA, a wyjściowa jest zawsze ograniczona do 256^65536.

No dobrze, ale co z tego?

Ano to, że dla każdego z 256^65536 możliwych programów na C64, które może wyprodukować dowolny kompilator istnieje NIESKOŃCZONA ILOSĆ możliwych kodów źródłowych, które taki program produkują.

Innymi słowy – istnieje nieskończona ilość (potencjalnych) języków wysokiego poziomu i nieskończona ilość możliwych kodów źródłowych w tych językach, które utworzą kod assemblerowy dokładnie taki, jak podał sajmosia!

„Jak to?!” – zapytacie – „Więc chcesz mi powiedzieć, że mgólbym otworzorzyć ramkę pisząc program w BASICu?!”

10 if peek(53265) and 127 = 0 goto 10

I tak dalej? I to będzie działać?

Odpowiadam: tak! Przy dobrze napisanym, i świetnie optymalizującym kod kompilatorze BASICa, nie istnieje w tej rzeczywistości jakikolwiek powód, dla którego to nie miałoby zadziałać!

Dziękuję za uwagę!

P.S. A, zapomniałem dodać – Bomb Jack nie wyświetla nic na ramce. Więc jednak dałem się zrobić w chuja idiocie.

P.P.S. Więc de facto udowodniliśmy jednak, że otwieranie ramek na chuj ci się zda...
« Ostatnia zmiana: 07 Lutego 2018, 09:48 wysłana przez qus »

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #4 dnia: 07 Lutego 2018, 09:53 »
Lekcja 2 - zapowiedź

Jeśli nie otrzymam bana w lekcji drugiejn Atalana wykorzystamy ramki do czegoś, zamiast je tylko otwierać. Tematem będzie dowcipna animacja dotycząca sajmosi!

Offline KB777

  • Level 6
  • ******
  • Wiadomości: 2430
  • -profil nieaktywny-
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #5 dnia: 07 Lutego 2018, 10:06 »
Czy tylko ja odnoszę wrażenie, że wrócił Kisiel ("czytanie nie boli" i takie charakterystyczne podejście passive-agressive) ?
-profil nieaktywny-

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #6 dnia: 07 Lutego 2018, 10:21 »
Wiesz, przeczytaj pierwotny wątek i te kocopoły, które sajmosia tam pisał. Anioł by dostał wkurwu. A ja jestem spokojniejszy od anioła.

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #7 dnia: 07 Lutego 2018, 10:28 »
Brawo !!! :)

Sposob w jaki to napisales przypomina mi ta bajke :

http://www.paz.most.org.pl/len/bajka1.html

Konopnicka nie czula potrzeby rzucania bluzgami ale brzmi to bardzo podobnie. Bardzo lanie, 3+ :)

Pozdrawiam.

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #8 dnia: 07 Lutego 2018, 10:31 »
A wnioski jakieś? Np. "Nie będę z kategoryczną pewnością wypowiadał się na tematy o których nie mam zielonego pojęcia" lub coś w tym stylu?

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #9 dnia: 07 Lutego 2018, 10:34 »
A wnioski jakieś? Np. "Nie będę z kategoryczną pewnością wypowiadał się na tematy o których nie mam zielonego pojęcia" lub coś w tym stylu?

Niestety, chyba na zawsze pozostane idiota :)

Pozdrawiam.

Offline sajmosia

  • Level 3
  • ***
  • Wiadomości: 194
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #10 dnia: 07 Lutego 2018, 10:59 »
Lekcja 2 - zapowiedź

Jeśli nie otrzymam bana w lekcji drugiejn Atalana wykorzystamy ramki do czegoś, zamiast je tylko otwierać. Tematem będzie dowcipna animacja dotycząca sajmosi!

Super !!! Nie moge sie doczekac. :)

Poprosze tylko, zebys nie wyskoczyl z czyms na prawde madrym, bo ta strone odwiedzaja tez dzieci i moga nie zrozumiec co sie dzieje.

Pozdrawiam.


Offline Kagaster

  • Level 3
  • ***
  • Wiadomości: 138
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #11 dnia: 07 Lutego 2018, 23:43 »
A wnioski jakieś? Np. "Nie będę z kategoryczną pewnością wypowiadał się na tematy o których nie mam zielonego pojęcia" lub coś w tym stylu?

No w końcu ktos prowadzi tego typu coś!
Qus ma super styl pisania, ale wyjdę na ignoranta, bo nawet nie wiedziałem o istnieniu takiego języka :-|

Offline StaryMarabut

  • Level 6
  • ******
  • Wiadomości: 1794
  • Robię wszystkim dobrze *za pół ceny.
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #12 dnia: 08 Lutego 2018, 04:42 »
Czy tylko ja odnoszę wrażenie, że wrócił Kisiel ("czytanie nie boli" i takie charakterystyczne podejście passive-agressive) ?
Tak to wygląda. Anioł też dziwnie zorientowany.

Offline qus

  • Level 3
  • ***
  • Wiadomości: 201
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #13 dnia: 08 Lutego 2018, 07:46 »
bo nawet nie wiedziałem o istnieniu takiego języka :-|

A to pewnie też nie wiedziałeś, że na c64 jest Java. I że nawet można w niej pisać dema! Nie wiem co prawda, czy to demo otwiera ramkę, ale i tak warto je zobaczyć:

https://www.youtube.com/watch?v=f85XkyO0EdA

Czy tylko ja odnoszę wrażenie, że wrócił Kisiel ("czytanie nie boli" i takie charakterystyczne podejście passive-agressive) ?
Tak to wygląda. Anioł też dziwnie zorientowany.

Nie znam twórczości Kisiela na tyle dobrze, aby zorientować się, czy to obelga czy pochwała, wiem jednak jedno - jeśli ktoś tak zorientowany w elektronice jak Kisiel jest przekonywany przez kogoś, kto kopiuje schematy układów z sieci "bo jest ich tam pełno" że "dioda przewodzi w obie strony" i niech no mu tylko Kisiel udowodni, że nie, to myślę, że Kisiel ma prawo w takiej sytuacji zachować się brzydko.

Offline StaryMarabut

  • Level 6
  • ******
  • Wiadomości: 1794
  • Robię wszystkim dobrze *za pół ceny.
Re: Koduj w Atalanie - Lekcja 1 - sajmosia edition
« Odpowiedź #14 dnia: 08 Lutego 2018, 09:14 »
Czy ma prawo, o tym nie nam decydować☺