OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 29.03.2024, 01:14

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 23 ]  Přejít na stránku 1, 2  Další
Autor Zpráva
 Předmět příspěvku: programování v C na Amize
PříspěvekNapsal: 01.08.2021, 18:59 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Můžu u Amigy použít C i pro nesystémové programování a dostanu se pak ke grafické knihovně?

EDIT: když se použije pouze základní HW.

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 01.08.2021, 19:08 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 12.05.2013, 21:39
Příspěvky: 1970
Bydliště: Praha
Has thanked: 85 times
Been thanked: 255 times
Ano, ne.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 10.08.2021, 12:25 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Ano, samozřejmě to jde. Jak jinak by mohl fungovat OS, který byl napsán právě v C (a v BCPL v případě AmigaDOS)?
Jen je třeba si dát pozor na to, aby C překladač nezoptimalizoval zápisy a čtení z adres custom registrů. Je tedy třeba mít pointer na custom registr deklarovaný jako "volatile". Takže asi něco takového (ten typ pro word jsem si vymyslel - je třeba použít takový, jaký budeš mít nadeklarovaný ve svém překladači):
Kód:
volatile uint16 * dmacon= 0xdff096;
// Enable copper+bitplane DMA
*dmacon = 0x8380;

Podobně se dá přistupovat k čemukoliv úplně stejně jako v Assembleru.
Problémem určitě bude kód, který se má provést v přerušení. V assembleru se z přerušení (supervisor modu) odchází pomocí RTE instrukce. Překladač C/C++ samozřejmě pro odchod z funkce vygeneruje obvyklé RTS. Ale určite pro to existuje nějaké řešení. Pink/Abyss v C/C++ udělal už několik her a myslím, že i demo/intro. https://www.pouet.net/groups.php?which=372&order=release
Jen nechápu tu tvou zmínku o "grafické knihovně". Myslíš přímo graphics.library? Samozřejmě přístup mít budeš, ale není vhodné míchat nesystémové programování s voláním systému. To je pak hezký protimluv.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 10.08.2021, 14:14 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
To bylo jen o tom, jestli by tam byla nějaká úspora práce, při použití jakékoliv grafické knihovny vůči tomu věci dělat sám. Asi jsem hlavně myslel práci s polygony. Možná bych to chtěl zkusit stejně jako u Another Worldu, ale to jsou jen takové myšlenky, které třeba nebudou nikdy realizovány, ale jo zajímá mně to. Možná použiju C na převod z MODu do mého formátu, uvidím.

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 10.08.2021, 23:23 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Citace:
Asi jsem hlavně myslel práci s polygony.

Nevím o tom, že by v AmigaOS byla nějaká knihovna pro práci s 3D grafikou. Za mých mladých let tam nebyla určitě, co přibylo ve všelijakých těch 3.2, 3.5 a 3.9 verzích netuším... Možná jsi myslel něco na Aminetu, ať už ve formě C/C++ knihovny nebo možná něčeho v .library formě pro AmigaOS. Nevím. Určitě se tam něco najde.
Céčko je nativním programovacím jazykem systému Amigy (s výjimkou AmigaDOSu), takže pochopitelně v tomto ohledu je vše mnohem jednodušší dělat v C. Jak ukazují hry od Abyss, tak když se to dělá chytře a použije se dobrý překladač, který generuje optimalizovaný kód, výsledek může být k nerozeznání od psaní v čistém assembleru. Nemluvě o tom, že kombinovat program psaný v assembleru a v C je triviální věc.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 11.08.2021, 09:31 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 12.05.2013, 21:39
Příspěvky: 1970
Bydliště: Praha
Has thanked: 85 times
Been thanked: 255 times
Mozna ze by slo pouzit Warp3D nebo MiniGL, ale vim jen ze to je, nic vic,


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 11.08.2021, 10:45 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
defor píše:
...Je tedy třeba mít pointer na custom registr deklarovaný jako "volatile"...
Tohle se sice asi Amigy netýká, ale k volatile bych doplnil - moderní překladače (jako gcc) jsou "chytřejší než uživatel" (to asi odkoukaly z Windows) a sice zachovají volatile přístup k adrese, ale nezaručují pořadí přístupu k různým adresám, mohou pořadí změnit. Na to pak může být nutné použít bariéru, která funkčně nic nedělá, jen řekne překladači "přeze mě nejede vlak!" Typický příklad je přehození zapnutí hodin periferie STM32 procesoru za inicializaci, kdy se pak člověk diví proč periferie v Release nefunguje když v Debug funguje.

Kód:
// compiler barrier
__attribute__((always_inline)) inline void cb()
{
   __asm volatile ("" ::: "memory");
}

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 15.08.2021, 12:13 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Panda38 píše:
defor píše:
Tohle se sice asi Amigy netýká, ale k volatile bych doplnil...

Moc dobrý postřeh!
Osobně jsem na Amize nesystémově v C/C++ nikdy neprogramoval, takže tohle jsem si neuvědomil.
Řekl bych, že se to Amigy týká, protože velmi populárním způsobem programování v C/C++ pro Amigu je využití addonu do VSCode od Bartmana/Abyss. Ten používá GCC 10.1.0.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 15.08.2021, 13:26 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
defor píše:
Osobně jsem na Amize nesystémově v C/C++ nikdy neprogramoval

Má tedy nesystémové programování v C na Amize své opodstatnění? Hlavním požadavkem je u mně přenositelnost kódu mezi PC a Amigou. Další věci je, že systém ti to přeci jen trochu brzdí. Další, celé to používání systému, přijde mi to jako moc komplexní řešení, jednoduše moc parametrů aby si mu vlastně řekl, že vlastně chceš dosáhnout nějaké rozlišení.

Vnímáš použití systémového programování v C jako rozumnější alternativu pro mé potřeby zkusit udělat hru na Amigu a použít část kódu i pro PC?

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 17.08.2021, 12:38 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Tohle je určitě na nějakou delší rozvahu a diskuzi. Ale v předcházejících příspěvcích jsem uvedl práci Bartmana z Abyss, která je nejlepším příkladem toho, na co se ptáš: Udělal už několik her, které nevyužívají systém, v C/C++.

Použití jakéhokoliv vyššího jazyku než assembleru má vždy své opodstatnění, pokud je pomalejší běh části kódu vykompenzován faktem, že programátor může program napsat rychleji, pohodlněj a s menším počtem chyb. Navíc se při profilování může ukázat, že ta část programu, která je napsaná ve vyšším programovacím jazyce, běží po výrazně kratší dobu než ta, která je kvůli optimalizaci časově náročnějších operací psána v assembleru. Obvykle vyšší programovací jazyky dávají uživateli možnost nějakými prostředky vkládat i úseky psané v assembleru (nebo obecně v jiném programovacím jazyce). To samozřejmě platí i pro C/C++. Konkrétně u her tak může být herní logika (např. rozhodování, kam hráč může, co může dělat, jak má hra reagovat na akce hráče, apod.) napsána v C/C++, a ty časově náročnější části (např. zobrazování grafiky hráče, přehrávání zvuků a hudby, testování kolizí, apod.) je napsána v assembleru. Při profilování programu se ukáže, že herní logika zabere třeba jen 10% času běhu programu, a proto je mnohem efektivnější optimalizovat (v tomto případě tedy psát v assembleru, ale nejenom to) ty části, které jsou náročnější. Při tom je ale program pro herní logiku z pohledu jeho struktury (množství podmínek, smyček, zanořených volání funkcí, výpočtu parametrů funkcí, apod.) mnohem složitější, a jeho napsání ve vyšším jazyce tak může zaručit menší počet chyb díky větší přehlednosti a jednoduchosti zápisu.
Žádná věda.

Je taky dobré si ujasnit, co tady považuješ za "nesystémové programování". Na Amize se "systém" dá odstavit různými způsoby. Ten řekněme nejradikálnější (a asi nejfatálnější) je prosté zakázání přerušení, případně zabránění tomu, aby systém mohl na přerušení zareagovat svým kódem. AmigaOS přímo v dokumentaci uvádí, že nemůže garantovat správnou funkci všech svých částí, pokud je přerušení zakázáno po delší čas než XYms (číslo se mi teď nechce hledat...). V praxi to znamená, že v tomto případě programátor nemá zajištěno, že může volat funkce systému, že systému vrátí smysluplné výsledky, nebo že se z funkce vůbec vrátí... Odstavení systému tak například znamená stopku v možnosti použít AmigaDOS, tedy devices, filesystem, files, .... Asi to to nejzásadnější, s čím se "nesystémový programátor" setkává.
Naštěstí ne všechno "nesystémové" musí být až tak destruktivní. Například přístup ke grafickým možnostem Amigy (přímá tvorba copper-listu, přímé používání Blitteru, apod.) ještě neznamená, že musí být odstaven celý systém - zejména AmigaDOS. Je možné jen zakázat multitasking (Forbid()/Permit()). Není to sice korektní chování, ale dá se s tím žít a hlavně to nemusí být až tak fatální pro chod systému a spuštěných programů, když se vše na konci dá zpět do pořádku a programátor je opatrný.

Programovat multiplatformně je samozřejmě při použití vyššího programovacího jazyka mnohem jednodušší, protože syntax jazyka a jeho standardní funkce tě odstíní od specifikací procesoru a systému. Problém je v tom, že nabídka těch společných funkcí může být velmi chudá a nebo adekvátní funkce na dvou (a více) systémech nemusí být podobně rychlá a efektivní. Je obrovský rozdíl dostat nějaký 2D grafický objekt na screen ve Windows a na Amize. Sice se to dá udělat tak, že se o to stará stejná funkce (třeba nějaké to DrawObject()), ale její implementace může být tak zásadně odlišná, že i její použití se bude velmi lišit (např. bitplánová versus chunky grafika na Amize versus PC). Pokud je odlišností už příliš, může se snadno stát, že udržování "společného" se naopak stává překážkou.
Ale to určitě závisí projekt od projektu.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 17.08.2021, 13:58 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Jasně, s tím počítám, že by se použila jen kostra základní logika pro hru v C, ostatní by muselo být řešeno pro PC a Amigu zvlášť. Předevčírem mne jeden kamarád poprosil, jestli bych mu nepomohl s něčím v C#, jen píšu důvod, proč teď odložim C, protože by se mi nové poznatky asi snadno mezi C a C# pletli. Zůstávám prozatím tedy pořád u assembleru na Amize.

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 17.08.2021, 16:55 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Lisiak4 píše:
...protože by se mi nové poznatky asi snadno mezi C a C# pletli.

Základní syntaxe je u C++ a C# stejná. Na oba jazyky se asi dá nahlížet jako na objektové (ve smyslu OOP - Object Oriented Programming) rozšíření jazyka C, podobně jako třeba ObjectiveC. Ale samozřejmě jsou zde menší a větší rozdíly, které se pak mohou stát zdrojem problémů, když člověk přechází z jednoho jazyka do druhého a neuvědomí si je. V praxi jsem se setkal s programovacími návyky člověka, který zřejmě dlouhé roky programoval v C# (nejspíš kvůli Unity), a pak je začal aplikovat v C++ (v Unreal4). A vznikaly problémy jako jsou třeba "memory leaks", protože si neuvědomil, že C++ není prostředí, které má automatický garbage-collector a že se v něm nemusí každá třída nebo struktura vytvářet operátorem "new". Ale to by bylo na dlouhou diskuzi a hlavně by to tady bylo OT.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 17.08.2021, 17:00 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Mám tomu rozumět tak, že C# v některých aspektech zpřehledňuje kódování vůči C++?

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 17.08.2021, 18:26 
Offline
Kecka

Registrován: 11.01.2021, 11:47
Příspěvky: 48
Has thanked: 0 time
Been thanked: 39 times
Lisiak4 píše:
Mám tomu rozumět tak, že C# v některých aspektech zpřehledňuje kódování vůči C++?

To bych si neodvážil tvrdit. Co pro jednoho může být přehledné, může být pro jiného zmatečné.
Nejsem odborník na programovací jazyky. Jen uživatel několika z nich. C# jsem používal jen pár let. C++ mnohem déle a je to v současnosti můj jediný profesně užívaný jazyk (s občasnými malými výjimkami). C++ dokáže být velmi velmi komplikované. Zejména jeho práce s generickými typy (šablonami) je něco, co se stále učím a stále narážím na nové věci. To je něco, co C# zjednodušil. Ale je to na úkor obecnosti a "mocnosti", mohu-li to tak napsat. S novými verzemi C++ (C++11, C++17 a hlavně v C++20) do jazyka přibylo velké množství konstrukcí z jiných "modernějších" jazyků (anonymní funkce, iterátory, automaticky dedukované typy, korutiny a mnoho mnoho dalšího). Přes dodávané standardní šablony už dávno přibyly různé kontejnery, smart pointery a kdo ví co všechno... To vše umožňuje programátorovi šetřit jeho čas a zpřehledňuje kód. Ale na druhou stranu to do jazyka přineslo další a další prvky, které staví na základech, které byly vytvořeny někdy v 70tých letech (Kernighan-Ritchie C). V důsledku se tak jedna věc může napsat několika způsoby, a kdo se jazyk učí, tak může narazit na příklady, jak se něco psalo v C++ před C++11, pak před C++17, a aktuálně jak by se to napsalo v C++20. A to může být hodně matoucí. Ale předpokládám, že něco podobného se děje i u C#, protože se taky stále vyvíjí.
Asi největší rozdíly mezi C# a C++ z vnějšího "globálního" pohledu jsou:
* Práce s pamětí, kdy C# počítá s aktivním garbage-collectorem a jazyk vůbec nemá konstrukci pro implicitní zrušení objektu.
* C# není jazyk, který je překládán do nativního (strojového) kódu.
* Reflexe (tedy automatická runtime informace o typu objektu), která je součástí jazyka.
Ale rozdílů je samozřejmě mnohem víc.

Myslím, že vůbec není na škodu se nejdřív naučit C#, a pak se podívat na to, jak se věci dělají v C++. C++ umožňuje psát program mnohem víc "low-level". Je možno velmi přesně spravovat paměť, přistupovat k ní přes adresy (pointery), více rozhodovat o různých optimalizacích (nad rámec už těch, které dělá samotný překladač). To je důvod, proč C/C++ je tady už přes 40 let, je velmi aktivně používané a asi jen tak nezmizí. A který jiný tak starý jazyk tohle o sobě může tvrdit? ;-)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: programování v C na Amize
PříspěvekNapsal: 20.08.2021, 19:47 
Offline
Profík
Uživatelský avatar

Registrován: 12.06.2013, 00:11
Příspěvky: 641
Has thanked: 1 time
Been thanked: 76 times
Panda38 píše:
Tohle se sice asi Amigy netýká, ale k volatile bych doplnil - moderní překladače (jako gcc) jsou "chytřejší než uživatel" (to asi odkoukaly z Windows) a sice zachovají volatile přístup k adrese, ale nezaručují pořadí přístupu k různým adresám, mohou pořadí změnit. Na to pak může být nutné použít bariéru, která funkčně nic nedělá, jen řekne překladači "přeze mě nejede vlak!" Typický příklad je přehození zapnutí hodin periferie STM32 procesoru za inicializaci, kdy se pak člověk diví proč periferie v Release nefunguje když v Debug funguje.


Nemas konkretni priklad kodu (odkaz) pro to STM32, kde se vyskytuje tenhle problem? Ja sem kdysi narazil na nake podivne chovani, kde stacilo zduplikovat zapis hodnoty do jednoho registru a pak to chodilo a myslim, ze ten problem se objevil prave po nake aktualizaci gcc, ktere je (nekdy bohuzel) cimdal chytrejsi. A nejde to resit jinak nez tim hnusnym inline assemblerem ale jen nakym atributem ci pragmou?

_________________
http://rayer.g6.cz, core i7-2600K, SB Audigy+YMF724+DreamBlaster, GTX970, DOS/WIN98SE/NT4/XP/Debian | retroPC: PPro 200, 192MB, SB AWE64+Live, Matrox Millenium II/8MB+Voodo1, USB 2.0


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 23 ]  Přejít na stránku 1, 2  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 7 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
cron
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz