Autor Wątek: Konkurs dla programistów ;)  (Przeczytany 21544 razy)

trojacek

  • *****
  • Wiadomości: 6846
  • Miejsce pobytu:
    Warszawa
Odp: Konkurs dla programistów ;)
« Odpowiedź #15 dnia: 2013.09.16, 12:31:27 »
A ja bym to zrobił tablicą, dla osiągnięcia maksymalnej wydajności. Kosztem 191 bajtów, ale za to raptem jeden warunek, jeden shift i jedno dodawanie.

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Konkurs dla programistów ;)
« Odpowiedź #16 dnia: 2013.09.16, 19:04:42 »
Klasówka ? ;)

unsigned short linianizej(unsigned short hl)
{
  unsigned char h = hl/256;
  unsigned char l = hl%256;
  h++;
  if ((h & 7) == 0) {
    if (l < 224) h-=8;
    l+=32;
  }
  unsignesd short newhl = h*256 + l;
  return newhl;
}
ZX/Enterprise/CPC/Robotron/C128D

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Konkurs dla programistów ;)
« Odpowiedź #17 dnia: 2013.09.16, 19:44:25 »
pear: kompilacja wygląda całkiem przyjemnie:

_linianizej_start::
_linianizej:
push ix
ld ix,#0
add ix,sp
;__pear.c:3: unsigned char h = hl/256;
ld h,5 (ix)
;__pear.c:4: unsigned char l = hl%256;
ld e,4 (ix)
;__pear.c:6: h++;
inc h
;__pear.c:7: if ((h & 7) == 0) {
ld a,h
and a, #0x07
jr NZ,00104$
;__pear.c:8: if (l < 224) h-=8;
ld a,e
sub a, #0xE0
jr NC,00102$
ld a,h
add a,#0xF8
ld h,a
00102$:
;__pear.c:9: l+=32;
ld a,e
add a, #0x20
ld e,a
00104$:
;__pear.c:11: newhl = h*256 + l;
ld l,#0x00
ld d,#0x00
add hl,de
;__pear.c:12: return newhl;
pop ix
ret

pear

  • *****
  • Wiadomości: 5511
  • Miejsce pobytu:
    Będzin
  • Z80 only
Odp: Konkurs dla programistów ;)
« Odpowiedź #18 dnia: 2013.09.17, 12:44:44 »
Bo optymalizację zrobiłem ja, a nie kompilator :)
Przy okazji ciekawostka - zamiast odejmowania jest w kodzie wynikowym dodawanie liczby z odwróconym znakiem. Ma to jakieś znaczenie, czy to takie "widzimisię" kompilatora ?
ZX/Enterprise/CPC/Robotron/C128D

MarekS

  • ***
  • Wiadomości: 111
  • Miejsce pobytu:
    Zielona Góra
Odp: Konkurs dla programistów ;)
« Odpowiedź #19 dnia: 2013.09.18, 18:09:09 »
może warto by sprawdzić jak wygląda np. "Gruszkowa" procedura potraktowana kompilatorem Hisoft C z ZX'a (Hisoft C -- h**p://www.worldofspectrum.org/infoseekid.cgi?id=0008252)

Gryzor

  • *****
  • Wiadomości: 2010
  • Miejsce pobytu:
    Warszawa
Odp: Konkurs dla programistów ;)
« Odpowiedź #20 dnia: 2013.09.18, 21:20:41 »
SDCC jest najlepszym kompilatorem dla Z80. W czasach CP/M byl jeszcze Hitech C, ale mozliwosci optymalizacji kodu w pamieci komputera z Z80 sa niewielkie.

MarekS

  • ***
  • Wiadomości: 111
  • Miejsce pobytu:
    Zielona Góra
Odp: Konkurs dla programistów ;)
« Odpowiedź #21 dnia: 2013.09.18, 22:06:30 »
sdcc jest raczej tylko dobre, ale przyznaje się nie analizowałem kodu optymalizatora SDCC, bo w dziedzinie optymalizacji kompilatorów wiele ostatnio zrobiono, to pewnie można by osiągnąć lepsze wyniki również dla Z80, może za pomocą LLVM

ale chodziło mi to oto, aby porównać linia w linia kod wygenerowany przez starego dobrego Hisoft'a no i współczesne SDCC, tak po prostu z ciekawości ;-)

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Konkurs dla programistów ;)
« Odpowiedź #22 dnia: 2013.09.19, 07:37:44 »
Marek, zrob testy i zaprezentuj wyniki ;-)

Gryzor

  • *****
  • Wiadomości: 2010
  • Miejsce pobytu:
    Warszawa
Odp: Konkurs dla programistów ;)
« Odpowiedź #23 dnia: 2013.09.19, 13:43:31 »
Porownywalem sdcc i ogladalem rozne testy - nie ma lepszego kompilatora C dla Z80.
ZX Boriel potrafi generowac niezly kod, ale ma znacznie wiecej bledow.

MarekS

  • ***
  • Wiadomości: 111
  • Miejsce pobytu:
    Zielona Góra
Odp: Konkurs dla programistów ;)
« Odpowiedź #24 dnia: 2013.09.19, 17:42:25 »
przez tą Tygrysową uwagę straciłem dwie godziny na nauce obsługi kompilatora Hisoft C na ZX ;-), postaram się podesłać deassemblacje kodu  (jak pisałem sam jestem ciekawy jak to będzie wyglądać), dziś albo jutro, bo  dopadły mnie domowo/służbowe obowiązki,

jednakowoż aby wątek był ciągle aktywny ;-) to jeszcze napiszę że SDCC, to pewnie na ta chwilę najlepszy kompilator C dla Z80 to wiemy i nie ma sensu się oto spierać,  (choć trzeba pamiętać o ZILOGU, może mieć jakieś tajne laboratorium od kompilatorów  ;D ),

jednak  kod po translacji który mamy kilka postów wyżej, niestety nie jest poprawnie zoptymalizowany, i to mówię ze swojej służbowej praktyki, choć uproszczę sobie zadanie i pominę celowo kontekst użycia tej funkcji czy użyte opcje, który naturalnie jest bardzo istotny, ale przekazywanie parametru do funkcji jest przez pamięć, a mówiąc współcześnie dla takiej funkcji często stosowanej i krótkiej, każdy współczesny kompilator powinien zaproponować wywołanie fastcall, czyli przekazanie wartosci przez rejestr, i raczej ld   l,#0x00 powinno być zastąpione przez xor l, ale, ale, ważne mogą być flagi ;-)





matofesi

  • *****
  • Wiadomości: 2049
  • Miejsce pobytu:
    Toruń/Poland
Odp: Konkurs dla programistów ;)
« Odpowiedź #25 dnia: 2013.09.20, 09:56:38 »
off-topic...
i raczej ld   l,#0x00 powinno być zastąpione przez xor l, ale, ale, ważne mogą być flagi ;-)

Ale pamiętasz, co dokładnie robi "XOR L"?... Bo na pewno nie to samo, co "LD L,0" ;)

Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Konkurs dla programistów ;)
« Odpowiedź #26 dnia: 2013.09.20, 11:29:31 »
W poniedziałek przestawię kolejne wyzwanie.

Chciałbym z Wami ustalić zasady.

Może być w C, może w BASICu, Javie a nawet w bashu ;) Idea jest jedna -- odtworzyć działanie procedury napisanej w asemblerze w języku programowania wyższego poziomu. Na przygotowanie rozwiązania będzie jakiś czas, a koniec nadsyłania prac podaje ogłaszający konkurs. Powiedzmy że to będzie 3 dni, do tygodnia. Dłuższy i wiadomy czas na nadsyłanie prac da czas osobom, które nie mogą od ręki przygotować rozwiązania. Zadanie nie może być specjalnie złożone i powinno być jednorazową ciekawostką, niż dużym kawałkiem softu (co też może się zmienić z upływem czasu)

Proponuje, aby prace były podsyłane do mnie na maila lub PW, a postując będzie dać info że oddał swoją pracę. Wysyłanie poprawek będzie jak najbardziej możliwe, do momentu publikacji rozwiązań. Po upływie ustalonego czasu będę publikować wszystkie rozwiązania, i będziemy wybierać najciekawsze działające.

Po rozstrzygnięciu ogłoszonego wyzwania, każdy będzie mógł ogłosić swój pomysł na kolejny zadanie. Będzie mógł przyjmować prace od uczestników i publikować wyniki. Na życzenie, ja mogę przejąć tą rolę.

Co o tym sądzicie?

RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Konkurs dla programistów ;)
« Odpowiedź #27 dnia: 2013.09.20, 14:59:06 »
Cytuj
Idea jest jedna -- odtworzyć działanie procedury napisanej w asemblerze w języku programowania wyższego poziomu.

A dlaczego tak?

Zwykle sztuką było zrobienie czegoś dokładnie na odwrót - mamy jakiś algorytm sortowania czy inny zapisany w pseudokodzie o składni podobnej do C i trzeba przenieść do asemblera.

Przy przenoszeniu do asemblera są różne wyzwania - nie mamy zmiennych tylko ograniczoną ilość rejestrów, nie mamy tablic, nie mamy ułamków, mnożenia, dzielenia itp. A do jakiegoś C zawsze można po prostu przepisać z asemblera "na chama" robiąc sobie zmienne  h, l itp. będące odpowiednikem rejestrów i powtarzając operacje.

Dla mnie ciekawsze od przepisywania algorytmów byłoby ich tworzenie - np. możliwie szybko oczyść ekran, scrolluj linię o 1 pixel w lewo/prawo, idź do celu omijając przeszkody, wypełnij kontur itp.

MarekS

  • ***
  • Wiadomości: 111
  • Miejsce pobytu:
    Zielona Góra
Odp: Konkurs dla programistów ;)
« Odpowiedź #28 dnia: 2013.09.20, 19:03:11 »
Marek, zrob testy i zaprezentuj wyniki ;-)


po walce z Hisoftem wersja kolegi Pear (plus/minus niezbędne zmiany aby Hisoft C to przyjął to wiadomości), wygląda tak jak zrzuty ekranu o nazwie pic0a.png i pic0b.png, po kompilacji i utworzeniu obiektu możemy "odpalić" przez usr25200 wcześniej lądują kod przez load "nl2.bin" code 25200 (ja używałem zx spina oraz fusa a emulowana maszyna to ZX +3, pierwotny obraz dyskietki z WOSa, gdzie nl2.c to źródło oraz nl2.bin obiekt o wielkości 4k, wiec nie zapowiada sie dobrze ;-) )

plik pic1.png to wstępny kod startujący

pic2.png to procedura main, gdzie
+ podprogram od adresu 28433 stawia pierwszy bajt
+ podprogram od adresu 28265 oblicza linię niżej
+ drugie wywołanie podprogramu od adresu 28433 stawia drugi bajt

pic3b.png oraz pic3b.png to obliczanie linii niżej i jak widać stosuje podprocedury do obliczenia, czyli szybko to raczej się nie liczy ;-), zakonczenie to jp 25789

i tak to było w latach 80'tych, mogę  pomęczyć Hisofta Pascala, zobaczymy co on utworzy



Tygrys

  • Administrator
  • *****
  • Wiadomości: 4540
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Konkurs dla programistów ;)
« Odpowiedź #29 dnia: 2013.09.23, 08:06:36 »
A dlaczego tak?


Dla wyzwania. Nie zawsze przepisanie z asm na jezyk wyższego poziomu jest trywialne, to działa również w drugą stronę.
Nie widzę przeciwskazań, aby kierunek 'konwersji' był również z języków wysokiego poziomu do asm.

@MarekS: dzięki za wykonane testy. Teraz już wiemy jak daleko posunęła się optymalizacja generowanego kodu w C ;)