abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 12:33 | Zajímavý projekt

    Kevin Lin zkouší využívat chytré brýle Mentra při hraní na piano. Vytváří aplikaci AugmentedChords, pomocí které si do brýlí posílá notový zápis (YouTube). Uvnitř brýlí běží AugmentOS (GitHub), tj. open source operační systém pro chytré brýle.

    Ladislav Hagara | Komentářů: 0
    dnes 12:11 | Pozvánky

    Jarní konference EurOpen.cz 2025 proběhne 26. až 28. května v Brandýse nad Labem. Věnována je programovacím jazykům, vývoji softwaru a programovacím technikám.

    Ladislav Hagara | Komentářů: 0
    včera 21:44 | Komunita

    Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.

    Ladislav Hagara | Komentářů: 0
    včera 14:22 | IT novinky

    Před 25 lety zaplavil celý svět virus ILOVEYOU. Virus se šířil e-mailem, jenž nesl přílohu s názvem I Love You. Příjemci, zvědavému, kdo se do něj zamiloval, pak program spuštěný otevřením přílohy načetl z adresáře e-mailové adresy a na ně pak „milostný vzkaz“ poslal dál. Škody vznikaly jak zahlcením e-mailových serverů, tak i druhou činností viru, kterou bylo přemazání souborů uložených v napadeném počítači.

    Ladislav Hagara | Komentářů: 22
    3.5. 22:33 | Nová verze

    Byla vydána nová major verze 5.0.0 svobodného multiplatformního nástroje BleachBit (GitHub, Wikipedie) určeného především k efektivnímu čištění disku od nepotřebných souborů.

    Ladislav Hagara | Komentářů: 2
    2.5. 22:22 | Komunita

    Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za duben (YouTube).

    Ladislav Hagara | Komentářů: 0
    2.5. 19:11 | IT novinky

    Provozovatel čínské sociální sítě TikTok dostal v Evropské unii pokutu 530 milionů eur (13,2 miliardy Kč) za nedostatky při ochraně osobních údajů. Ve svém oznámení to dnes uvedla irská Komise pro ochranu údajů (DPC), která jedná jménem EU. Zároveň TikToku nařídila, že pokud správu dat neuvede do šesti měsíců do souladu s požadavky, musí přestat posílat data o unijních uživatelích do Číny. TikTok uvedl, že se proti rozhodnutí odvolá.

    Ladislav Hagara | Komentářů: 5
    2.5. 11:22 | Zajímavý projekt

    Společnost JetBrains uvolnila Mellum, tj. svůj velký jazykový model (LLM) pro vývojáře, jako open source. Mellum podporuje programovací jazyky Java, Kotlin, Python, Go, PHP, C, C++, C#, JavaScript, TypeScript, CSS, HTML, Rust a Ruby.

    Ladislav Hagara | Komentářů: 2
    2.5. 09:11 | Bezpečnostní upozornění

    Vývojáři Kali Linuxu upozorňují na nový klíč pro podepisování balíčků. K původnímu klíči ztratili přístup.

    Ladislav Hagara | Komentářů: 2
    1.5. 20:00 | Komunita

    V březnu loňského roku přestal být Redis svobodný. Společnost Redis Labs jej přelicencovala z licence BSD na nesvobodné licence Redis Source Available License (RSALv2) a Server Side Public License (SSPLv1). Hned o pár dní později vznikly svobodné forky Redisu s názvy Valkey a Redict. Dnes bylo oznámeno, že Redis je opět svobodný. S nejnovější verzí 8 je k dispozici také pod licencí AGPLv3.

    Ladislav Hagara | Komentářů: 3
    Jaký filesystém primárně používáte?
     (58%)
     (1%)
     (8%)
     (21%)
     (4%)
     (2%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 523 hlasů
     Komentářů: 22, poslední dnes 10:06
    Rozcestník

    Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC

    24.12.2012 17:45 | Přečteno: 1833× | Hardware | Výběrový blog | poslední úprava: 25.12.2012 09:16

    V dnešnom blogu sa pozrieme na to ako funguje Sega Genesis. Ďalej sa pozrieme na jeden starší emulátor - generator a jeho portovanie na TV. Zároveň som vytvoril Qt 4 verziu rozhrania. Port pre TV nie je ktovie ako použiteľný, výkon vstavaného MIPS-u je dosť slabý - video emulátora bežiaceho priamo na TV.

    Ako funguje Sega Genesis

    V tejto časti si predstavíme jednotlivé časti Segy Genesis a spôsob ich spolupráce. Vopred upozorňujem, že ide o veľmi zjednodušený opis, podrobnosti by boli možno aj na samostatný článok / sériu článkov (mám momentálne v pláne linuxové články, toto je tak trochu mimo, takže možno až bude záujem …).

    Bloková schéma segy

    Bloková schéma Segy Genesis

    Procesor

    Hlavným procesorom je v prípade Segy Genesis 16/32-bitový procesor Motorola 68000. Jeho taktovacia frekvencia je 7.67MHz. Po zapnutí hracej konzoly má na starosti inicializáciu hardvéru vrátane druhého procesora. Adresná zbernica má šírku 32 bitov, ale externá adresná zbernica má šírku len 24 bitov (zvyšných 8 pinov nie je vyvedených). ALU má 16 bitov. Operácie pracujúce s 32-bitovými operandmi preto trvajú viacej taktov.

    Sekundárnym procesorom je Zilog Z80 taktovaný na 3.58MHz. Tento procesor má 8-bitovú ALU. Sekundárny procesor teoreticky slúži len na generovanie zvukových dát pre čip YM2612.

    Grafika - Video display processor (VDP)

    Tento čip sa stará o generovanie obrazu. Má pridelenú vlastnú videopamäť o veľkosti 64kB. Vo videopamäti sú uložené dlaždice o veľkosti 8x8 px, z ktorých sa skladá samotný obraz. Rozlíšenie je 40x28 dlaždíc, alebo 32x28 dlaždíc (320x224 pixelov, alebo 256x224 pixelov). Maximálne je možné zobrazovať 64 farieb z palety 256 farieb. Pamäť je možné napĺňať buď pomocou príkazov, alebo pomocou DMA. Tento čip je veľmi komplexný a jeho podrobnejší opis by bol minimálne na samostatný blog, takže si vystačíme len s takýmto jednoduchým popisom ;-).

    Zvuk

    Táto hracia konzola obsahuje 2 zvukové čipy. Hlavným zvukovým čipom je Yamaha 2612. Ovláda ho sekundárny procesor Z80. Obsahuje 6-kanálový FM modulátor, ktorý dokáže generovať 8-bitové vzorky.

    Druhý zvukový čip je PSG (priamo integrovaný vo VDP). Jeho výstup je mixovaný spolu s Yamahou. Používa sa kvôli kompatibilite so staršími hracími konzolami. Obsahuje 3 generátory tónov a jeden generátor šumu.

    Riadenie zbernice

    Blok nazvaný bus arbiter má na starosti riadenie prístupu k zbernici. Počas DMA operácií a niekotrých I/O operácií odpája procesor od zbernice. Zároveň sa stará o mapovanie I/O do adresného priestoru. Vďaka tomu majú oba procesory navzájom prístupné svoje pamäte (sekundárny procesor musí používať prepínanie pamäťových bánk).

    Pamäť

    Pamäťový priestor procesora 68000 vyzerá nasledovne:

    Oblasť Účel Popis
    000000-3FFFFF ROM Mapovaná pamäť cartridgu.
    400000-7FFFFF Rezervovaná Čítanie vráti najvyšší bit nasledujúcej inštrukcie.
    800000-9FFFFF Rezervovaná Používa sa pre 32x adaptér
    A00000-A0FFFF Z80 Adresný priestor Z80. Nie je možné pristupovať k adresám 68k, ktoré má Z80 mapované.
    A10000-A1001F I/O Riadenie I/O čipu.
    A10020-BFFFFF Rozširujúce sloty Funkcia závisí od aktuálne pripojeného hardvéru.
    C00000-DFFFFF VDP Mapovaný adresný priestor VDP.
    E00000-FFFFFF RAM Operačná pamäť mirrorovaná po 64k blokoch. Hry väčšinou používajú FF0000-FFFFFF.

    Pamäťový priestor procesora Z80 vyzerá nasledovne:

    Oblasť Účel Popis
    0000-3FFF RAM Mirrorovaná 8kB RAM.
    4000-5FFF YM2612 Adresy 4000-4003 pre riadenie YM2612 mirrorované cez celý adresný priestor.
    6000-60FF Adresa banky Zápisom sa vyberie príslušná banka z adresného priestoru 68k.
    6100-7EFF Rezervované Pri čítaní vráti FF.
    7F00-7FFF VDP Riadenie VDP.
    8000-FFFF Banka Banka mapovaná z adresného priestoru 68k.

    Emulátor Segy Genesis - generator

    Pre úpravu som si vybral veľmi jednoduchý emulátor Segy Genesis - generator a mierne modifikovanú verziu.

    Pre implementáciu používateľského rozhrania stačí implementovať nasledujúce funcie:

    void ui_err(const char *text, ...)
    Logovanie chýb
    void ui_line(int line)
    Vykreslenie obrazového riadku.
    void ui_endfield()
    Ukončenie rámca a vykreslenie na obrazovku.
    int ui_init(int argc, char *argv[])
    Inicializácia užívateľského rozhrania a spracovanie argumentov.
    int ui_loop(void)
    Beh emulátora v nekonečnej slučke, ktorú môže ukončiť užívateľ.
    void ui_final(void)
    Ukončenie užívateľského rozhrania.
    void ui_musiclog(uint8 *data, unsigned int length)
    Záznam zvuku do súboru.

    Implementácia emulátora pre televízory LG

    Na začiatku pridáme povinné includy:

    #include "generator.h"
    
    #include ≶fcntl.h>
    #include ≶stdint.h>
    #include ≶sys/mman.h>
    
    #include "ui.h"
    #include "uiplot.h"
    #include "vdp.h"
    #include "gensound.h"
    #include "cpu68k.h"
    #include "mem68k.h"
    #include "cpuz80.h"
    #include "event.h"
    #include "state.h"
    #include "initcart.h"
    #include "patch.h"
    #include "dib.h"
    #include "avi.h"
    

    Čip VDP vykresľuje dlaždice o veľkosti 8x8px na ľubovoľnej pozícii. Emulátor je implementovaný tak, že ráta s framebufferom zväčšeným o 8px na každej strane, čím sa zbavíme prebytočných podmienok na kontrolu presahu dlaždíc mimo vykresľovanú oblasť. To je dôvod prečo má framebuffer o 16 pixelov väčšiu výšku aj šírku.

    #define HBORDER 8
    #define VBORDER 8
    
    #define HSIZE (320 + 2 * HBORDER)
    #define VSIZE ((vdp_vislines ? vdp_vislines : 224) + 2 * VBORDER)
    

    Ďalej implementujeme logovanie chýb:

    void ui_err(const char *text, ...)
    {
        va_list ap;
        vfprintf(stderr, text, ap);
        putc(10, stderr);
        exit(0);
    }
    

    Záznam zvuku (nebudeme potrebovať zaznamenávať zvuk vôbec).

    void ui_musiclog(uint8 *data, unsigned int length)
    {
    }
    

    Pri inicializácii namapujeme framebuffer televízora a nastavíme cestu k cartridgu.

    #define FB_ADDR 0x0AC0A000UL
    #define FB_SIZE 0x201000UL
    
    int fd; // /dev/mem
    static uint16_t *vfb; // Framebuffer
    const char *initload = 0; // Cartridge, ktorá sa má pri štarte načítať
    
    
    int ui_init(int argc, const char *argv[])
    {
        fd = open("/dev/mem", O_RDWR | O_SYNC);
        vfb = mmap(0, FB_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, FB_ADDR);
        initload = argv[1];
        return 0;
    }
    

    Pri ukončení stačí dealokovať framebuffer.

    void ui_final(void)
    {
        munmap(vfb, FB_SIZE);
        close(fd);
    }
    

    Hlavná slučka načíta cartridge, nastaví formát pre vykresľovanie obrazu a bude v nekonečnej slučke renderovať frame. Posun farebných zložiek pre RGB je 10, 5 a 0 pretože formát framebufferu u LG je ARRRRRGGGGGBBBBB.

    int ui_loop(void)
    {
        uiplot_setshifts(10, 5, 0);
        char *error = gen_loadimage(initload);
        if (error) {
            return 1;
        }
        while (1) {
            event_doframe();
        }
        return 0;
    }
    

    Zostalo už len vykresľovanie riadkov. To je pomerne pomalá operácia, ktorá sa dá urýchliť vykreslením celého rámca v čase keď sa má vykresliť posledný riadok. Takéto zjednodušenie môže robiť problém v niektorých hrách. Väčšinou to však bude fungovať v poriadku.

    void ui_line(int line)
    {
        static uint8 gfx[(320 + 16) * (240 + 16)];
    
        // Vynechanie všetkých riadkov okrem posledného
        if (line != (int)(vdp_vislines >> 1)) {
            return;
        }
    
        unsigned int width = (vdp_reg[12] & 1) ? 320 : 256;
        unsigned int offset = HBORDER + ((vdp_reg[12] & 1) ? 0 : 32);
    
        // Aktualizácia palety
        uiplot_checkpalcache(0);
    
        // Vyrenderovanie rámca do bufferu
        vdp_renderframe(gfx + (8 * (320 + 16)) + 8, 320 + 16);
        // Začiatok dát vo framebufferi
        uint16_t *location = vfb + (1368 * 264) + 524;
        // Konverzia 8-bitových hodnôt v gfx do 16-bitových hodnôt vo framebufferi
        uint8 *indata;
        uint16_t *outdata;
        unsigned int ui;
        int l;
        for (l = 0; l ≶ vdp_vislines; ++l) {
            indata = gfx + 8 + (l + 8) * (320 + 16);
            outdata = location + offset;
    
            for (ui = 0; ui ≶ width; ++ui) {
                outdata[ui] = uiplot_palcache[indata[ui]] | 0x0001;
            }
    
            location += 1368;
        }
    }
    

    Vypnutie podpory zvuku

    Generovanie zvuku je pomerne náročnou a na platforme bez zvukového zariadenia aj zbytočnou záťažou. Podporu zvuku je možné úplne odstrániť zakomentovaním nasledujúcich riadkov v main/event.c.

    cpuz80_sync();
    sound_line();
    ...
    if (vdp_line == vdp_visendline)
        cpuz80_interrupt();
    ...
    cpuz80_endfield();
    

    Problém môže nastať ak sa procesor Z80 nepoužíva len na generovanie zvuku.

    Vstupy (gamepad)

    Gamepad sa ovláda priamym zápisom do pamäte procesora 68k. Nastaviť sa dajú nasledujúcim kódom:

    int aPressed = 1;
    int p = 0; // ID gamepadu
    ...
    
    mem68k_cont[p].a = aPressed;
    mem68k_cont[p].b = bPressed;
    mem68k_cont[p].c = cPressed;
    mem68k_cont[p].left = leftPressed;
    mem68k_cont[p].right = rightPressed;
    mem68k_cont[p].up = upPressed;
    mem68k_cont[p].down = downPressed;
    mem68k_cont[p].start = startPressed;
    

    Odkazy

    Qt verzia sa dá skompilovať príkazmi:

    git clone git://github.com/mireq/sega-generator.git
    cd sega-generator/
    cmake -DUSE_QT_GUI=On -DUSE_SDL_AUDIO=On -DCMAKE_C_FLAGS="-O3" DCMAKE_CXX_FLAGS="-O3" .
    make
    

    PS: Šťastné a veselé Vianoce a neseďte len pri PC ako ja ;-)

           

    Hodnocení: 100 %

            špatnédobré        

    Obrázky

    Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC, obrázek 1 Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC, obrázek 2 Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC, obrázek 3 Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC, obrázek 4

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    Bedňa avatar 24.12.2012 18:00 Bedňa | skóre: 34 | blog: Žumpa | Horňany
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Pekné, funguje to celkom OK, na nejaké nenáročnejšie hry by to aj stačilo. Super Sonic patril práve medzi tie náročnejšie. Pekná práca, kua chlape si fakt dobrý. Nespite a šup sem tučňáka :)

    TO:Doli, už by si fakt mohol upraviť výstup aby to tučňákové blogy hádzalo pod články.
    KERNEL ULTRAS video channel >>>
    Bedňa avatar 24.12.2012 18:04 Bedňa | skóre: 34 | blog: Žumpa | Horňany
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Ešte jedna vec mi uderila na záver do očí, ako vlastne ovládač hru? To nebude diaľkové ovládanie.
    KERNEL ULTRAS video channel >>>
    mirec avatar 24.12.2012 18:11 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    U TV som ovládanie neriešil, takže je to len demo. V prípade, že by sa mi podarilo dosiahnúť plnú rýchlosť emulácie bol plán zneužiť implementáciu NEC IR protokolu, ktorú som písal pre AVR a urobiť si vlastný IR gamepad.
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    kotyz avatar 24.12.2012 21:40 kotyz | skóre: 25 | blog: kotyzblog | Plzeň
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Já mam taky emulátor segy genesis (u nás se jmenovala megadrive) na MIPSU, používam PGen na PS2 a výkon výbornej, jen ty hry nemaj tak boží grafiku a zvuk jak si pamatuju z roku 93 kdy sme to hráli s kámošem na jeho originálnim megadrivu (ale to je tim že sem si to pamatoval lepší než to ve skutečnosti bylo, vzpomínkovej optimismus se tomu řiká)...
    Hrdý člen KERNEL ULTRAS. | Furry/Brony/Otaku | Nemám čas ztrácet čas. | In 'pacman -Syu' we trust!
    mirec avatar 24.12.2012 22:01 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Aká frekvencia MIPS-u je potrebná na to, aby to bežalo natívnou rýchlosťou? Tu mi to na Core 2 Duo žerie okolo 8% pri ondemand powersaving režime, alebo 5% pri performance (1.5GHz), ale na MIPS-e v TV ten istý kód beží .. no zhruba 10x pomalšie aj keď úplne vypnem zobrazovanie. Optimalizácie pre x86_64 nie sú takmer žiadne okrem uloženia program countera a status registra do skutočných registrov reálneho CPU (ale to isté som robil aj pre MIPS). Akosi nemám chuť kompilovať valgrind pre TV, takže len zisťujem, či by to vôbec bolo možné zrýchliť tak, aby som vytiahol 60fps ;)
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    kotyz avatar 24.12.2012 22:10 kotyz | skóre: 25 | blog: kotyzblog | Plzeň
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    PS2 má asi 290MHz (upravenej MIPS R5900 nebo nějakej podobnej, to sou ještě ty desktopový procesory používaný v pracovních stanicích od SGI), ale má k tomu taky dvě vektorový jednotky, grafickej a zvukovej čip a druhej MIPS pro zpětnou kompatibilitu s PSX a řízení periferií. Je to docela složitý. A je na něj plno emulátorů, ten PGen je asi v nejlepšim stavu, co sem zkoušel ty na NES a SNES tak ty tak hezky nešlapaly. Na Amigu už to ale nemá dostatečnej výkon, sice emulátor existuje (port UAE nebo E-UAE), ale to byl jen takovej pokus jestli to tam vůbec poběží a pak se už dál nevyvíjel protože to bylo pomalý.
    Hrdý člen KERNEL ULTRAS. | Furry/Brony/Otaku | Nemám čas ztrácet čas. | In 'pacman -Syu' we trust!
    kotyz avatar 24.12.2012 22:13 kotyz | skóre: 25 | blog: kotyzblog | Plzeň
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Jestli tě zajímá HW a vývoj na PS2, tak pro začátek něco malýho ke čtení ;-)
    Hrdý člen KERNEL ULTRAS. | Furry/Brony/Otaku | Nemám čas ztrácet čas. | In 'pacman -Syu' we trust!
    mirec avatar 24.12.2012 22:32 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Diky, hardware hracích konzol bol vždy taký ... podivno zaujímavý ;-)
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    kotyz avatar 24.12.2012 22:56 kotyz | skóre: 25 | blog: kotyzblog | Plzeň
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Mě by se strasně líbilo kdyby někdo na PS2 napsal přehrávač tracker (stačilo by jen těch základních MOD/XM/IT/S3M) modulů (existujou knihovny a přehrávací rutiny, ale nic jako přehrávač ne) + něco na internetový rádia (argon/xmb je umí, ale ta podpora je hódně omezená a přehrávání neni extra kvalitní).
    Hrdý člen KERNEL ULTRAS. | Furry/Brony/Otaku | Nemám čas ztrácet čas. | In 'pacman -Syu' we trust!
    25.12.2012 00:06 Ovocníček
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Malá chybka: "Zilong Z80"
    mirec avatar 25.12.2012 09:35 mirec | skóre: 32 | blog: mirecove_dristy | Poprad
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    Opravené, dík.
    LinuxOS.sk | USE="-fotak -zbytocnosti -farebne_lcd +vydrz +odolnost +java" emerge telefon
    12.9.2018 12:03 Heleon
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    The functioning mechanism is awesome. But these days, Its very easy to watch live TV on PC using free apps like FreeFlix TV. Download FreeFlix TV for Windows and enjoy all HD live TV channels right from PC.
    17.4.2019 13:48 Peter
    Rozbalit Rozbalit vše Re: Sega Genesis, fungovanie, emulácia na Linxovom TV LG a na PC
    There are alot of apps for watching. Cyberflix TV for firestick could be the best of them. It is intutive and user friendly.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.