Fejlesztés C-ben Spectrumra

Híd a Spectrum/ZX81 és a mai világ között...
Avatar
Bali
Alapító tag
Hozzászólások: 2328
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: Bali » 2012.01.13. 10:37

Sziasztok!

A mostanában készült játékok jelentős része a z88dk-val készült, ami egy Z80 fejlesztői környezet. ANSI C fordító, ami Z80 kódot generál. Alapvetően Z88-hoz készült, de idővel kinőtte magát és egy csomó Z80 alapú rendszerhez használható, így ZX Spectrum-hoz és ZX81-hez is. Még a ResiDos-hoz is vannak lib-ek. Most jött ki nemrég egy frissítése.
Ez az amiről Edy szeretett volna elsőadást tartani, de valamiért mindig elmaradt, remélem most beszáll a témába. :)

Alapvetően két okból nyitottam ezt a témát, egyrészt kíváncsi vagyok, hogy használja-e valaki, illetve tervezi-e, hogy használja illetve esetleg nem akarunk kialalkítani egy speccyalista lib csomagot a könnyebb használhatóság érdekében.

De arra is kíváncsi vagyok, hogy mit gondoltok az ílymódon való Spectrum játék fejesztésről, magyarán eretnek dolog eleve vagy azért van némi létjogosultága?

üdv,
Bali
-= Bali =-
(c) 1983-2017 Evil-Soft

kpbendi
Hozzászólások: 66
Csatlakozott: 2012.01.09. 14:42

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: kpbendi » 2012.01.15. 15:50

Nekem az assembly-ben profikhoz lenne kérdésem:

Érdemes-e a C-t csak struktúráláshoz, program vezérléshez használni, a függvényeken belül pedig asm kódot használni?
Így elméletileg jól optimalizált kódot lehetne kapni, ami jobban átlátható, mint az assembly.
Vagy a C fordító jelentősen rontja a program hatékonyságát, ha minden byte és órajelciklus számít, ezért alapból kerülendő?

z0d
Hozzászólások: 38
Csatlakozott: 2012.01.09. 14:30

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: z0d » 2012.01.16. 12:43

Személy szerint nem tartom eretnek dolognak, de a Spectrumot fejlesztéseket még Assembly-ben is át lehet látni. Persze könnyebb a C, de sokszor kell byte-ra kihegyezni a kódot, hogy beleférjen 48k-ba vagy hogy elég gyors legyen. Ahol ez nem szempont, ott persze simán jó a C.

Avatar
FpgaJoco
Hozzászólások: 125
Csatlakozott: 2012.01.09. 15:20

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: FpgaJoco » 2012.01.16. 14:00

Hali,

Jómagam is többféle nyelven programozom, így - ismerve mind a C és mind az asm lehetőségeit - nincsenek ellenvetéseim
sem a C, sem as asm, sem esetleges kevert megoldásokkal szemben sem. A gond az, hogy a Z80-ra nem nagyon lehet
hatékonyan fordítani. Pár éve én is akartam egy FAT drivert írni, és mivel volt ilyen már C-ben, természetesen azt néztem meg először. Le is fordul, és persze bizonyosan még fut is, csak hát a C nyelv által megkövetelt dolgokat, mint stack frame, vagy 32 bites aritmetikai megoldások - nem lehet hatékonyan leprogramozni. Pl a stack frame-et és általában minden lokális változó elérést a fordított kód az IX és IY regiszterek segítségével érte el, ami alapvetően lassú és ráadásul helyigényes. Mutatok egy példát, megnéztem, tehát tudom....

Kód: Egész kijelölése

int i = 0x11223344;
Lefordítva ez lett:

Kód: Egész kijelölése

  ld (ix+_i_offset),0x44
  ld (ix+_i_offset+1),0x33
  ld (ix+_i_offset+2),0x22
  ld (ix+_i_offset+3),0x11
És akkor képzeljetek el összeadásokat, szorzást és osztást. Persze nem mondom, hogy minden egyes C fordító ilyen bugyuta kódot generálna, de ha az assembly nem támogatja magas szintű nyelvet megfelelően (stack frame, megfelelő számú és adathosszúságú regiszter), akkor abból nem lesz sem tömör, sem gyors kód.

Összehasonlítva, ugyanaz az SD/MMC FAT driver kód, amit Z80-ra fordítottam, ott 14K körül lett, míg ugyanez AVR-re 8K vagy annál kevesebb. De az a processzor ugye 30 évvel későbbi és az utasításkészlete miatt C kód könnyen fordítható.

Szóval személy szerint én a spectrum és általában a Z80 esetében ASM párti vagyok. Akkor tudnék elképzelni egy fordítót, ha az tipikusan a spectrum-ra lenne írva, annak hardver lehetőségeihez igazodna.

De hát ez csak egy vélemény ugye :)
Joco

simi
Hozzászólások: 6
Csatlakozott: 2012.01.10. 21:02

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: simi » 2012.01.17. 00:58

Van egy kevés tapasztalatom a z88dk-val. Néhány játékot írtam C-ben a CSS crap game competition-re. Ami nekem nagyon szembetűnő volt, hogy a fordító nem ansi C kompatibilis, néhány nyelvi elem hiányzik belőle, például a több dimenziós tömbök. Emellett úgy tűnik, hogy az assemblyhez képest elég lassúak a C-ben írt programok. Ezen a videón látszik egy programom futás közben: http://www.youtube.com/watch?v=-ekUpkBVr8g. Bár valószínűleg a kódom sem éppen optimális, de a sebesség nem valami lenyűgöző. Ami viszont pozitívum a z88dk-val kapcsolatban, az a hozzá tartozó Spectrum függvénykönyvtár joystick, billentyűzet, képernyő, tape, stb kezeléssel, amivel lényegében teljes értékű programot lehet írni assembly nélkül.

Avatar
Bali
Alapító tag
Hozzászólások: 2328
Csatlakozott: 2012.01.06. 13:34
Tartózkodási hely: Budapest III.
Kapcsolat:

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: Bali » 2012.01.17. 15:26

Simi, akkor te vagy a mi emberünk! :)

Véletlenül nincs valami nagyon egyszerű programod vagy nem tudnál majd valamikor egy ilyen programot példának csinálni?
Olyanra gondolok itt elsősorban, amin keresztül kicsit bele lehetne tanulni a z88dk használatába...
Emellett úgy tűnik, hogy az assemblyhez képest elég lassúak a C-ben írt programok.
De akkor hogyan lehet mégis egészen jó játékokat írni benne? Néhány mostanában fejlesztett játéknak már felteszik a forrását is és elég sok esetben C-ben írták.

Bali
-= Bali =-
(c) 1983-2017 Evil-Soft

simi
Hozzászólások: 6
Csatlakozott: 2012.01.10. 21:02

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: simi » 2012.01.18. 20:27

hát, a cgc-re készült programjaimat nem ajánlanám példának, mert nagyon össze vannak csapva, de majd csinálok valami rendezettebb példaprogit.

A sebességgel kapcsolatban: gondolom sokat lehet optimalizálni a C kódon, és akkor megközelíti az assemblyt. Én nem foglalkoztam ezzel, mert ez rontotta volna a játékaim "crap" faktorát :).

Avatar
Pgyuri
Alapító tag
Hozzászólások: 541
Csatlakozott: 2012.01.06. 13:34

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: Pgyuri » 2012.01.20. 15:50

Üdv,

Ha a játék méretében, sebességében "megengedi" a lassabb programkódot, akkor bármilyen eszköz alkalmas Spectrum játék megírására, bár ez esetben inkább a BASIC-ot javasolnám egy jó compiler-el átalakítva, mert mégis csak hűebb az alapgéphez és elég jó teljesítményt ki lehet hozni belőle, jó példák erre a

Frank 'n' Stein http://www.worldofspectrum.org/infoseek ... id=0001849
Gotcha http://www.worldofspectrum.org/infoseek ... id=0002106

A mászkálós, tárgypakolós, logikai játékokat, ahol pár tárgyat kell csak mozgatni a képernyőn (lehetőleg háttér nélkül), ott elegendő a C-vel fordított kód. Ha viszont valaki átlép az akció-, reflex-játék birodalmába vagy hatalmas memóriára van szüksége, akkor bizony nincs más, mint a Z80 assembler.

Én csak ajánlani tudom mindenkinek, hogy ha tényleg Spectrumra akar fejleszteni és nem kell sietnie, akkor maradjon az alapoknál :) Nem fogja megbánni, sok szépséget, érdekes megoldást lehet kitalálni a fejlesztés során.

Pgyuri

Avatar
edy.wss
Alapító tag
Hozzászólások: 11
Csatlakozott: 2012.01.24. 18:06

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: edy.wss » 2012.01.24. 19:10

A z88dk nem egy egyszerű C fordító, hanem egy olyan, Z80 alapú számítógépekre optimalizált C fordító, amely képes kihasználni az egyes platformok különböző előnyeit. Számos Z80 alapú számítógép típust támogat már most is, bár a támogatottság mértéke számítógépenként más és más. Mivel ez szoros összefüggésben van az adott számítógép típus elterjedtségével, így nem meglepő, ha az egyik legjobban támogatott platform a ZX Spectrum.

A fejlesztés során többféle koncepciót lehet követni:

#1 Ragaszkodni a teljes C kompatibilitásra annak érdekében, hogy a programunk bármilyen platformra lefordítható és futtatható legyen.

Ennek sajnos nincs túl sok létjogosultsága, mert bár a program valóban futtatható lesz több platformon is, kielégítő felhasználói élményt sehol sem fog nyújtani. Esetleg nagyon egyszerű játékok (logikai vagy szöveges kaland), vagy felhasználói programok esetében van értelme. Utóbbi esetben is csak akkor, ha az nem az éppen adott platformra vonatkozó speciális feladatot akar ellátni (pl. lemezkezelő program), hanem valami sokkal általánosabb szerepet szánnak neki. Mindazonáltal hatalmas élmény, amikor lefordul ugyanaz a program több különböző platformra, és mindegyiken futtatható anélkül, hogy változtatni kellene a forráskódon.

#2 A teljes programot C-ben megírni, tudatosan egy platformra optimalizálva

Ebben az esetben lehetőségünk nyílik olyan függvénykönyvtárak és fordítási opciók alkalmazására, amelyeket egy adott platformra optimalizáltak vagy fejlesztettek ki. Példának említeném az SP1 nevű sprite kezelő függvénykönyvtárat, amelyet kimondottan ZX Spectrum-ra fejlesztettek ki, és ennek megfelelően elég gyors ahhoz, hogy egy közepes szintű animációs igényékkel rendelkező játékprogramot gond nélkül el lehessen készíteni vele: http://www.z88dk.org/wiki/doku.php?id=l ... prites:sp1.

Ennek a fejlesztési modellnek a nagy előnye, hogy nem a hardverre, hanem csupán a feladatra kell összpontosítani, így sokkal gyorsabb és élvezetesebb lehet a fejlesztés (hacsak valaki nem kimondottan az assembly kódolással kötelezően együtt járó mérhetetlen szívást élvezi :oops:). Véleményem szerint ugyanannak a programnak az elkészítése 50-75%-al kevesebb időt igényel így, mint gépi kódban, feltételezve, hogy a fejlesztő egyaránt jártas a C és Assembly nyelvekben. A 25% különbség az eltérésben attól függ, hogy mennyi grafikai és zenei elemet kell elkészíteni a programhoz, mert az mindkét esetben ugyanannyi időt vesz igénybe.

#3 A program alapvetően C nyelven íródik, de a processzorigényes részek gépi kódban készülnek

Ez az a modell, amit a 90-es évek első felében a PC-s demo készítők alkalmaztak. A szakipari munkát megírták egy magas szintű nyelven (többnyire Pascalban); ilyenek voltak a betöltők, menük és opció kiválasztók, különböző előre kalkulált értékek kiszámítása és betöltése a memóriába: vagyis a keretrendszer működéséhez szükséges programrészek elkészítése. Majd amikor minden feltétel adott volt, bevágták a programot az Assembly ágba, a nézőknek meg leesett az álla.

Ezt a modellt remekül lehet alkalmazni a z88dk-val is, csak Pascal helyett a C nyelvet kell ismerni. Onnantól kezdve, hogy a program belépett az Assembly blokkba, ugyanazok a lehetőségek adottá válnak, mintha a teljes program gépi kódban készült volna. Véleményem szerint, még ezzel a módszerrel is 20-40%-al kevesebb időráfordítás szükséges ugyanazon program megíráshoz C + Assembly-ben, mint tiszta gépi kódban. Ráadásul a gép teljes kapacitását ki tudjuk használni.

Edy
Edy

QSOP+Space

Avatar
Pgyuri
Alapító tag
Hozzászólások: 541
Csatlakozott: 2012.01.06. 13:34

Re: Fejlesztés C-ben Spectrumra

Hozzászólás Szerző: Pgyuri » 2012.01.27. 21:22

Üdv,

Szerintem kár sietni manapság a programozással. Azon a kis időkülönbségen nem múlik és Z80-ban hatalmas felüdülés bármit is alkotni. Más lenne a helyzet, ha pénzért kellene dolgozni, de szerencsére ez a gép már csak hobbi.

A programnyelv meg nem segít amúgy se a programban rejlő megoldandó feladatok megértésében.

Pgyuri

Válasz küldése

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég