1

Siemanko.

Czytałem ostatnio artykuły Konrada Kokoszkiewicza o programowaniu grafiki w assemblerze, z których niestety nic nie zrozumiałem. Zaciekawiły mnie jednak przykłady zastosowania pewnych procedur w ramach testu wydajności i porównania ich z innym przeprowadzonym przez Wojciecha Zientarę pomiarami prędkości działania różnych języków programowania Atari.

Pan Wojciech porównał prędkość działania uruchamiając w różnych językach ten sam program, którego zadaniem jest wypełnienie ekranu GRAPHICS 24 instrukcjami graficznymi (PLOT) a następnie wyczyszczenie go operując bezpośrednio na pamięci (POKE).

Uzyskał takie oto wyniki:

WojciechZientara    24840    Atari Basic
WojciechZientara    16709      C (Deep Blue)
WojciechZientara    10807    Basic XE
WojciechZientara    9197    Turbo Basic XL
WojciechZientara    5689    Basic skompilowany
WojciechZientara    4565    Action!

Konrad dzięki swoim procedurom graficznym nieco w tej tabeli zamieszał:

KMK            2233    Assembler 1
KMK            341      Assembler 2
KMK            177          Assembler 3


Osobiście wydaje mi się, że zaproponowana przez Pana Wojciecha metoda porównania jest bez sensu, ponieważ języki programowania posiadają własne instrukcje, do wykonania określonych zadań i dzięki temu dany język jest atrakcyjniejszy (szybszy). Po grzyba porównywać w różnych językach jak szybko wykona się np.: SOUND 0,0,0,0:SOUND 1,0,0,0: SOUND 2,0,0,0:SOUND 3,0,0,0 jeśli w takim Turbo Basic XL wykonać można: SOUND.

Podobnego zdania był Tomasz Cieślewicz, który napisał w Action! programik zjeżdżając z wynikiem do:

Tomasz Cieślewicz    7    Action!

Spodobała mi się ta gierka. W związku z tym chciałbym zaproponować zabawę polegającą na napisaniu programu w Turbo Basic XL, wykonującego podobnie do pierwotnego założenia programu następujące operacje:

1. zerowanie zegara TIME$, włączenie trybu graficznego 8 bez okna tekstowego
2. zamazanie ekranu na biało
3. wyczyszczenie ekranu
4 odczyt i wyświetlenie wskazania zegara TIME

Na chwilę obecną nie trzeba przedstawiać listingów, piszemy w czystym TBXL, bez wstawek maszynowych czy wywołań OS. Uzyskane wyniki wpisujemy na listę wyników odpowiednio sortując.  Dopuszczalne są wielokrotne wpisy. Zwycięzca z najkrótszym czasem ujawnia listingi i jeśli nie będą budziły zastrzeżeń otrzyma nagrodę rzeczową. Tematy sporne oprzemy o bufet.

Pozwolę zacząć od siebie budując wzorzec tabeli:

Kto                    TIME    opis
=====================================
Wojciech Zientara   9197        TBXL oryginalny
Cobol                    692          TBXL program nr 1
Cobol                    362          TBXL program nr 2

2

TO ja mam jeszcze jedną propozycję - dodajmy do wyniku opcję przed kompilacją i po kompilacji, skoro tylko Turbo Basic. Rozumiem, że zamazanie ekranu ma być dowolną metodą? Czy piksel po pixselu, czy od razu całość dozwolona? W sumie zamieniasz dwa poke-i i masz wypełnione innym kolorem, to też trzeba od razu odrzucić?
I ostatnie pytanie: do kiedy trwa challenge?

Sikor umarł...

3

Możemy zrobić dwie wersje z kompilacją i bez, żaden problem, tylko że nagrodę mam jedną :-)
W tabeli w opisie instruujemy, że kompilowany.

Ekran wypełniamy kolorem, nie chodzi o samą zmianę koloru.

Możemy się bawić do momentu w którym szybciej nie będzie się dało albo np do końca lutego, wszelkie propozycje do przegadania.

Kto                     TIME    opis
=====================================
Wojciech Zientara   9197        TBXL oryginalny
Cobol                    692          TBXL program nr 1
Cobol                    362          TBXL program nr 2
Cobol                    290          TBXL program1 kompilowany
Cobol                    151          TBXL program2 kompilowany

4

czy TIME$ zerujemy tuż przed rysowaniem na ekranie, czy ma to być pierwsza linia programu?

Kontakt: pin@usdk.pl

5

.. no i włączenie Rapidusa może zakończyć ten konkurs, nie jest napisane że zabraniasz ;)

Kontakt: pin@usdk.pl

6

Hehehe, no tak to możemy bez końca - z Warpem w Altirze pójdzie jeszcze bardziej ochoczo :-)
Nie no Rapidusa może zostawmy do wyższych celów. Standardowa Atarka - bardziej chodzi o umiejętność wykorzystania możliwości TBXL.

Pierwsze polecenie w programie: TIME$="000000" ostatnie ?TIME.

7

ok, czyli liczymy działanie programu jako całość. Tak trzeba było od razu. Ok, ja już swój pomysł mam.

Kontakt: pin@usdk.pl

8 Ostatnio edytowany przez seban (2019-02-17 13:06:41)

Hej!

10 TIME$= "000000"
11 GRAPHICS 24:SCR=DPEEK(88)
12 POKE SCR+7679,255
13 -MOVE SCR+1,SCR,7679
15 POKE SCR+7679,0
16 -MOVE SCR+1,SCR,7679
17 ? TIME$

http://seban.pigwa.net/drop/tbxl_fill_01.png

coś wygrałem? ;)

ps1) TIME$ jest zbyt mało precyzyjne, trzeba raczej użyć TIME, a jeżeli tak to:

10 DPOKE 18,0:POKE 20,0
11 GRAPHICS 24:SCR=DPEEK(88)
12 POKE SCR+7679,255
13 -MOVE SCR+1,SCR,7679
14 ? #6;CHR$(125)
15 ? TIME

http://seban.pigwa.net/drop/tbxl_fill_02.png

ps3) TIME$ pokazuje czas w sekundach, TIME którego użyłem (ponieważ time$ był zbyt mało precyzyjny) liczy z rozdzielczością (1/50) sek. (dla PAL), więc wynik który uzyskałem 12 jest równy = 12*(1/50)= 0.24 sek.

ps2) tak na serio, nie chcę żadnych nagród rzeczowych :) możecie mnie nie uwzględniać w konkursie ;)

9

Kto                     TIME    opis
=====================================
Wojciech Zientara   9197        TBXL oryginalny
Cobol                    692          TBXL program nr 1
Cobol                    362          TBXL program nr 2
Cobol                    290          TBXL program1 kompilowany
Cobol                    151          TBXL program2 kompilowany
Pin                        14            TBXL program1 nie kompilowany, nie optymalizowany

Kontakt: pin@usdk.pl

10

podejrzewam, że Sikor wpadnie na ten sam pomysł :)

Kontakt: pin@usdk.pl

11

Kto                     TIME    opis
=====================================
Wojciech Zientara   9197        TBXL oryginalny
Cobol                    692          TBXL program nr 1
Cobol                    362          TBXL program nr 2
Cobol                    290          TBXL program1 kompilowany
Cobol                    151          TBXL program2 kompilowany
Pin                        14            TBXL program1 nie kompilowany, nie optymalizowany
Pin                        13            TBXL program2 nie kompilowany, optymalizowany

Kontakt: pin@usdk.pl

12

zapomniałem, że -move może być szybszy od move ;)

Kontakt: pin@usdk.pl

13

Kto                     TIME    opis
=====================================
Wojciech Zientara   9197        TBXL oryginalny
Cobol                    692          TBXL program nr 1
Cobol                    362          TBXL program nr 2
Cobol                    290          TBXL program1 kompilowany
Cobol                    151          TBXL program2 kompilowany
Pin                        14            TBXL program1 nie kompilowany, nie optymalizowany
Pin                        13            TBXL program2 nie kompilowany, optymalizowany
Seban                   12           
Pin                        10            TBXL program3 nie kompilowany, optymalizowany

Kontakt: pin@usdk.pl

14

Ale czad! PIN chyba wygrałeś, ubiegłeś mnie z listingiem, ale i tak nie zszedłem poniżej 20.

Kto                     TIME    opis
=====================================
Wojciech Zientara   9197        TBXL oryginalny
Cobol                    692          TBXL program1
Cobol                    362          TBXL program2
Cobol                    290          TBXL program1 kompilowany
Cobol                    151          TBXL program2 kompilowany
Cobol                    22            TBXL program 3
Pin                        14            TBXL program1 nie kompilowany, nie optymalizowany
Pin                        13            TBXL program2 nie kompilowany, optymalizowany

15 Ostatnio edytowany przez Cobol (2019-02-17 13:20:13)

Zauważyłem, że para instrukcji DPOKE 18,0: POKE 20,0 daje niższe wyniki niż TIME$="000000" ale to już nie ma znaczenia :-)
Przy takich sztuczkach okazuje się, że TBXL jest niewiele gorszy od Action!, z tym, że polegnie przy innych zadaniach.

@PIN - Nie sprawdzałem, ale jak sądzę kompilowanie Twojego programu już chyba nic nie wniesie :-) ?

16

0 dpoke 19,%0:gr.56:poke 41296,255:move 41296,41297,7680:poke 41296,%0:move 41296,41297,7680:? time

wynik przeważnie 10, czasem wyskoczy 11 - coś jest na pograniczu. Można zrobić to kulturalniej, czyli obliczamy adres ekranu z dpeek(88) - i generalnie to daje ten sam wynik. Można teoretycznie spróbować z -move ;)

Kontakt: pin@usdk.pl

17 Ostatnio edytowany przez mono (2019-02-17 13:39:14)

A można umieścić swoją dlistę w stałej tekstowej zamiast włączać GR.8+16? Bo ja bym wtedy zrobił dlistę ze 192 linijkami wskazującą na ten sam adres dzięki czemu pamięć ekranu ograniczyłaby mi się do 40 bajtów :) To by chyba zamiotło.

Edit: Albo dwie dlisty i dwie pamięci ekranu - jedna z zerami, druga z $FF-ami i przełączać...

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

18

oraz wynik: 1

0 dpoke 19,%0:gr.56:poke 710,15:poke 709,0:poke 710,0:poke 709,15:?time

.. ale to jest efekt dziurawego regulaminu ;)

Można to przyspieszyć poprzez SETCOLOR :D

Kontakt: pin@usdk.pl

19 Ostatnio edytowany przez Pin (2019-02-17 13:43:07)

mono napisał/a:

Albo dwie dlisty i dwie pamięci ekranu - jedna z zerami, druga z $FF-ami i przełączać...

Myślałem o tym, ale odpuściłem z racji na to, że początek programu zeruje licznik i jego długość też ma znaczenie

czyli tabela:

Kto                     TIME    opis
=====================================
Wojciech Zientara   9197        TBXL oryginalny
Cobol                    692          TBXL program nr 1
Cobol                    362          TBXL program nr 2
Cobol                    290          TBXL program1 kompilowany
Cobol                    151          TBXL program2 kompilowany
Pin                        14            TBXL program1 nie kompilowany, nie optymalizowany
Pin                        13            TBXL program2 nie kompilowany, optymalizowany
Seban                   12           
Pin                        10            TBXL program3 nie kompilowany, optymalizowany

Kontakt: pin@usdk.pl

20

Pin napisał/a:

oraz wynik: 1

0 dpoke 19,%0:gr.56:poke 710,15:poke 709,0:poke 710,0:poke 709,15:?time

.. ale to jest efekt dziurawego regulaminu ;)

Można to przyspieszyć poprzez SETCOLOR :D

Wtedy nie 56, ale 24 bo musisz wyczyścić pamięć ekranu :)

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

21 Ostatnio edytowany przez mono (2019-02-17 13:53:50)

Pin napisał/a:
mono napisał/a:

Albo dwie dlisty i dwie pamięci ekranu - jedna z zerami, druga z $FF-ami i przełączać...

Myślałem o tym, ale odpuściłem z racji na to, że początek programu zeruje licznik i jego długość też ma znaczenie

Oj. ale program wyglądałby wtedy mniej więcej tak:

0 DPOKE 19,%0:DPOKE 560,ADR("displaylista 1 z pamiecia ekranu $FF"):DPOKE 560,ADR("displaylista 2 z pamięcią ekranu $00"):?TIME

Edit: W zmiennych tekstowych oczywiście kod DLki i ekranu. Ale to zdaje się nie spełnia regulaminu :)

Edit 2: Eeeee to się nie da - stała tekstowa może mieć tylko ze 250 bajtów. DLka się nie zmieści. Dałoby się w zmiennej tekstowej.

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

22

chyba nie ;)

teraz sprawdziłem dla zjebu w jakim czasie ostatni program (ten co kręcił 10 ramek) wykona się po przypaleniu Rapidusem. Wynik 1 :)

Kontakt: pin@usdk.pl

23 Ostatnio edytowany przez seban (2019-02-17 15:06:12)

@pin... ale użwyając gr. 56 ... nie czyścisz pamięci ekranu również przez całą operacją (są tam losowe śmieci) ... :D pominąłeś również zerowanie komórki 18, przez co po chwili pracy OS-a miałem wynik 65540 :P jeżeli takie chwyty są akceptowalne to ja proponuję:

0 DPOKE 19,%0:GRAPHICS 56:POKE 559,%0
1 POKE $BF4F,$FF:-MOVE $A151,$A150,$1DFF
2 POKE $BF4F,%0:-MOVE $A151,$A150,$1DFF:? TIME

wynik: 9

:P

24

Na przekształceniach do hexów tracisz cenny czas :)

Kontakt: pin@usdk.pl

25 Ostatnio edytowany przez seban (2019-02-17 14:59:05)

Pin napisał/a:

Na przekształceniach do hexów tracisz cenny czas :)

ale chociaż widzę co się dzieje w kodzie... nawet z hex-ami...

0 DPOKE 19,%0:GRAPHICS 56:POKE 559,%0
1 POKE $BF4F,$FF:-MOVE $A151,$A150,$1DFF
2 PUT #6;125:? TIME

wynik: 8 (sporadycznie trafia się 7)