Autor Wątek: Programowanie w SDCC  (Przeczytany 23957 razy)

tsulej

  • *
  • Wiadomości: 25
  • Miejsce pobytu:
    Warszawa
Programowanie w SDCC
« dnia: 2012.12.28, 12:06:27 »
Cześć,

Zapraszam do przeczytania artykułu na temat SDCC. Tekst powstał na bazie moich zmagań (od zera) z tym kompilatorem, a ponieważ udało mi się zrealizować założenia, czyli stworzyć działający kod, postanowiłem się tym z Wami podzielić.

Artykuł dostępny tu: http://www.speccy.pl/articles.php?article_id=22
Kod źródłowy i plik TAP tu: http://www.speccy.pl/archive/prod.php?id=223

Od razu zastrzegam, że w tekście mogą być błędy i uproszczenia - z chęcią ze wszystkiego się wytłumaczę :)
Miłego czytania, a potem kodowania.


Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Programowanie w SDCC
« Odpowiedź #1 dnia: 2012.12.31, 08:33:17 »
Dzięki za artykuł!

Pisanie w C na pewno przyspieszy proces tworzenia programów, zwłaszcza tam, gdzie trzeba zaprogramować dużo logiki.

Próbowałeś napisać ten scroll w czystym C?


matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Programowanie w SDCC
« Odpowiedź #2 dnia: 2012.12.31, 08:39:44 »
No właśnie... Czy na platformie z takimi ograniczeniami jak Spectrum pisanie w C czegoś poza logiką ma sens? Czy narzuty kompilatora/run-time'ów nie zjedzą wszystkich zalet pisania w języku wysokiego poziomu?

Kiedyś próbowałem rozszerzać projekt pisany na małego Atmela - platforma była równie ograniczona (jeśli nie bardziej) niż Spectrum - pisany właśnie w C. Po jakichś dwóch czy trzech tygodniach walki dałem sobie spokój i przepisałem cały projekt na assembler zyskując masę miejsca na dalsze rozszerzanie... Czy tu nie będzie podobnie?

Gryzor

  • *****
  • Wiadomości: 2009
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #3 dnia: 2012.12.31, 10:29:47 »
Sluszna uwaga, mnie zawsze zastanawialo jeszcze, jaki jest sens pisania w C, na maszynie, w ktorej kod uwzglednia takty procesora ? Nie to, zebym negowal caly sens pisania w C, bo przeciez byly nawet gry w basicu z wstawkami w assemblerze, ale jest tu jakas sprzecznosc z kodem wysokiego poziomu.

matofesi

  • *****
  • Wiadomości: 2048
  • Miejsce pobytu:
    Toruń/Poland
Odp: Programowanie w SDCC
« Odpowiedź #4 dnia: 2012.12.31, 11:14:39 »
A to jest druga kwestia. Tak na prawdę pisanie w C na Spectrum ma moim zdaniem sens tylko w projektach w których mamy dużo logiki/skomplikowanych algorytmów i nie mamy konieczności wpasowania się w ramkę itp. Oczywiście jestem w stanie wyobrazić sobie pisanie dem w C, ale raczej cudów bez użycia assemblera w krytycznych punktach uzyskać się  nie da. Za to na przykład tekstówki albo jakieś przygodówki ze stosunkowo nieskomplikowaną (technicznie) grafiką ale rozbudowanym AI - wtedy jak najbardziej.

No i oczywiście w C pisać będą ludzie, którym się nie chce (albo z innych powodów podjęli taką a nie inną decyzję ;)) uczyć assemblera ;)

Pyza^Illusion

  • *****
  • Wiadomości: 586
  • Miejsce pobytu:
    Lubań, dolnośląskie
Odp: Programowanie w SDCC
« Odpowiedź #5 dnia: 2012.12.31, 20:21:27 »
Sam kompilator (chodzi o ZX) to raczej zbiór procedur w asemblerze, którym są przypisane niektóre rozkazy lub pseudorozkazy języka C. Generalnie jak ktoś lubi lub się przyzwyczai do tego typu programowania, to czemu nie. Mniej śledzenia programu w razie jakiegoś błędu - łatwiej sprawdzić składnię jednej linijki C, niż szereg rozkazów asemblera. Z drugiej strony nieco mniejsza kontrola, bo nie widzimy tekstu kodu wynikowego.
Ja osobiście nie potrafiłbym tak programować, ale może dlatego, że mam nikłe pojęcie o innych językach. Dla mnie nawet source prostego efektu na atrybutach czy scrolla do PASMO, które wygenerował kiedyś Tygrys było mało czytelne :)
Wolałbym podręczny zbiór napisanych podstawowych procedur i kopiuj/wklej, gdzie uzupełniać trzeba by tylko o wartości rejestrów/komórek. No ale kto co woli...
ZX Spectrum+ (128kB by STAVI), FDD3000, TI-OF-TTL/ZXVGS, Masterface2b, MacFace II, DivIDE plus, Just Speccy 128...

Gryzor

  • *****
  • Wiadomości: 2009
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #6 dnia: 2013.01.02, 09:34:42 »
I wlasnie dlatego nie wiem, czy nie lepsze sa systemy typu AGD, lub jakies inne systemy skryptowe, gdzie istnieje caly framework
napisany optymalnie w assemblerze a opisuje sie jedynie logike i podrzuca dane. Na pewno mniej uniwersalne niz pelne C, ale
efekt bardziej przewidywalny.


RafalM

  • *****
  • Wiadomości: 1133
  • Miejsce pobytu:
    Sulejówek
Odp: Programowanie w SDCC
« Odpowiedź #7 dnia: 2013.01.02, 12:50:05 »
Dawno, dawno temu w latach 80-tych istotnie język C na Spectrum był tylko ciekawostką. Można było pisać jakieś "Hello Worldy" ale zrobienie choćby najprostszej płynnie chodzącej gry było niemożliwe, chociażby przez brak procedur do grafiki.

Od tego czasu całkiem sporo się zmieniło. Powstało sporo gier napisanych w C, na przykład przez hiszpańską grupę Mojon Twins:

http://www.worldofspectrum.org/infoseekadv.cgi?what=2&regexp=Mojon+Twins&yrorder=1&year=0&type=0&players=0&turns=0&memory=0&language=0&country=0&licence=0&feature=0&publi=0&release=0&format=0&scheme=0&scorder=1&score=0&have=1&hassource=on&also=1&sort=1&display=3&loadpics=0

Sporo ich gier jest zrobione "na jedno kopyto", z wykorzystaniem tego samego silnika, ale widać też postęp i dodawanie coraz to nowych "ficzerów".

To co jest tam użyte to C ze wstawkami w assemblerze. C odpowiada za logikę a wyświetlanie grafiki realizujemy za pomocą wstawek. Tak naprawdę można te wstawki pisać samemu a można skorzystać z gotowych bibliotek i funkcji typu RysujSprajt, czyli całą grę można napisać w C nie znając i nie używając wprost ani jednej instrukcji assemblera.

Z pisaniem dem na gotowych funkcjach byłby pewnie większy problem, gdyż są one przeznaczone raczej do typowych growych sytuacji typu 5 sprajtów na ekranie, a nie 50 (co potrafią niekiedy zrobić na demoscenie różni magicy) :)

tsulej

  • *
  • Wiadomości: 25
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #8 dnia: 2013.01.02, 12:58:58 »
Ha! No to po kolei:

@Tygrys: nie, nie próbowałem, pewnie się do końca nie da, w czystym C nie ma: rotacji przez carry, odczytu rejestru R czy możliwości użycia "halt","ei","di" itp. Ale jak będzie chwila to sprawdzę.
@matofesi: narzutów kompilatora/runtime nie ma, SDCC generuje dość przejrzysty i czytelny kod. Do tego bardzo zwarty (szczególnie w porównaniu z z88dk). Poza tym zgadzam się, że pisanie w czystym C na takie maszyny jak spectrum czy jakieś mikrokontrolery mija się z celem. Po to twórcy kompilatora opracowali szereg elementów związanych z integracją z assemblerem czy nawet z samym procesorem, żeby tego używać.
@Gryzor: nie wszystkie programy wymagają precyzyjnego liczenia taktów. Poza tym, dla mnie C zawsze było językiem niskiego poziomu (szczególnie w kontekście obecnych języków typu Groovy, Ruby :) ) i odpowiednio układając kod da się osiągnąć dość dobre efekty. Do tego krytyczne elementy wrzuca się do assemblera i jest jeszcze lepiej.  Druga rzecz to framework. Taki powstał dla z88dk - splib2/sp1 - czy jest optymalny, nie wiem, ale sporo gier z jego użyciem zostało napisanych. Niestety zajmuje około 12k.
@Pyza^Illusion: Tak prosto nie jest, jest cała dziedzina nauki dotycząca budowy kompilatorów i optymalizacji kodu wynikowego. Więc nie jest to tylko zbiór procedur. Kontrola rzeczywiście nie jest jakaś wybitnie duża, natomiast efekt w postaci skompilowanego do asma kodu jest dostępny i bardzo czytelny, dzięki czemu można eksperymentować.

Ja się generalnie zgadzam, że w assemblerze jest najlepiej. Mi się już nie chce :)

Phonex

  • *****
  • Wiadomości: 1260
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #9 dnia: 2013.01.02, 19:18:43 »
...
Ja się generalnie zgadzam, że w assemblerze jest najlepiej. Mi się już nie chce :)

Aaaaa, chyba że taaak!
Bo ten przykładowy scroll w asemblerze zajmie co najmniej 5 razy mniej miejsca.
Szybkość działania (i szybkość pisania) kosztem rozmiaru programu.  ;)

Gryzor

  • *****
  • Wiadomości: 2009
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #10 dnia: 2013.01.02, 21:46:35 »
Z80 nie byl robiony pod kompilatory - C lubi duzo uniwersalnych rejestrow. A wiekszosc gier ma timingi kodu liczone w taktach. Niemniej jednak kazda inicjatywa typu SDCC jest ciekawa.
Ciekawe jak wyglada porownanie kodu wynikowego miedzy np. Boriel, SDCC, z88dk, Hisoft C (wersja CP/M) i Hisoft Basic.
A ciekawe czy pamietacie cos takiego jak ToBoS:
http://www.worldofspectrum.org/infoseekid.cgi?id=0008893

z80dk splib, to mniej wiecej, to o czym mowilem - framework, ktory steruje sie w C.
I to dziala, choc np. przesuwania ekranu juz nie wspiera.

Phonex

  • *****
  • Wiadomości: 1260
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #11 dnia: 2013.01.03, 10:49:15 »
A ciekawe czy pamietacie cos takiego jak ToBoS:
http://www.worldofspectrum.org/infoseekid.cgi?id=0008893

Oczywiście! Ja na pewno http://www.speccy.pl/archive/prod.php?id=219  :)
W 1987 spędziłem całe ferie wielkanocne skracając analizator obwodów elektrycznych Network Analyser, żeby go skompilować Tobosem!

Gryzor

  • *****
  • Wiadomości: 2009
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #12 dnia: 2013.06.19, 17:01:24 »
Pobawilem sie troche z88dk i zx-boriel, sdcc - wymaga troche wiecej cierpliwosci, wiec jeszcze przede mna.
Nie wiem, moze jak sie dobrze pozna te narzedzia z wszystkimi ograniczeniami, to rzeczywiscie do czegos sie nadaja,
ale mnie raczej irytuja na maksa. Po pierwsze maja jakies dzwine problemy z typami stalych np. 65535, 255, w efekcie
program sie kompiluje ale nie dziala jak trzeba, choc wyglada na poprawny.
Druga rzecz to, ze zbyt duzo dzieje sie za moimi plecami, np. moge ustawic ORG na 28000, ale gdzie jest koniec, stos itp. ?
Kod generowany przez z88dk to jakas masakra - przedziwne skoki i wywolania podprogramow dla prostych petli.
Boriel wyglada tu znacznie lepiej, ale przypuszczam, ze to kwestia zapisu kodu w C. I to jest kolejna rzecz - normalnie
w C skupiam sie nad algorytmem i zakladam, ze reszte optymalizacji zrobi kompilator, na Z80 trzeba myslec o jednym i o drugim.
To juz chyba wole od razu jechac w assemblerze.
 

Gryzor

  • *****
  • Wiadomości: 2009
  • Miejsce pobytu:
    Warszawa
Odp: Programowanie w SDCC
« Odpowiedź #13 dnia: 2013.08.05, 16:21:40 »
No niestety SDCC wcale nie mniej irytuje, choc z tego co widze generowany kod jest calkiem niezly.
Nie ma to jednak jak assembler + zestaw gotowych procedurek.
To co mnie boli, to pelno zworek, przelacznikow, dziwnych konwersji i ograniczen skladni.
Jak juz szukac "wyzszego poziomu", to do gier najlepiej uzyc systemu typu AGD.





Tygrys

  • Administrator
  • *****
  • Wiadomości: 4537
  • Miejsce pobytu:
    Warszawa
  • mistrz ceremonii
Odp: Programowanie w SDCC
« Odpowiedź #14 dnia: 2013.09.05, 09:26:27 »
Niedawno ukazało się SDCC w wersji 3.3.0

A przy okazji, ktoś ma w swoich zbiorach sdcc2pasmo_v17.zip ? To jest konwerter plików .asm generowanych przez sdcc do składni zrozumiałej przez pasmo.