Nový open source router Turris Omnia NG je v prodeji. Aktuálně na Allegro, Alternetivo, Discomp, i4wifi a WiFiShop.
Na YouTube a nově také na VHSky byly zveřejněny sestříhané videozáznamy přednášek z letošního OpenAltu.
Jednou za rok otevírá společnost SUSE dveře svých kanceláří široké veřejnosti. Letos je pro vás otevře 26. listopadu v 16 hodin v pražském Karlíně. Vítáni jsou všichni, kdo se chtějí dozvědět více o práci vývojářů, prostředí ve kterém pracují a o místní firemní kultuře. Můžete se těšit na krátké prezentace, které vám přiblíží, na čem inženýři v Praze pracují, jak spolupracují se zákazníky, partnery i studenty, proč mají rádi open source a co
… více »Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za říjen (YouTube).
Jeff Quast otestoval současné emulátory terminálu. Zaměřil se na podporu Unicode a výkon. Vítězným emulátorem terminálu je Ghostty.
Amazon bude poskytovat cloudové služby OpenAI. Cloudová divize Amazon Web Services (AWS) uzavřela s OpenAI víceletou smlouvu za 38 miliard USD (803,1 miliardy Kč), která poskytne majiteli chatovacího robota s umělou inteligencí (AI) ChatGPT přístup ke stovkám tisíc grafických procesů Nvidia. Ty bude moci využívat k trénování a provozování svých modelů AI. Firmy to oznámily v dnešní tiskové zprávě. Společnost OpenAI také nedávno
… více »Konference Prague PostgreSQL Developer Day 2026 (P2D2) se koná 27. a 28. ledna 2026. Konference je zaměřena na témata zajímavá pro uživatele a vývojáře. Příjem přednášek a workshopů je otevřen do 14. listopadu. Vítáme témata související s PostgreSQL či s databázemi obecně, a mohou být v češtině či angličtině.
Byl vydán Devuan 6 Excalibur. Přehled novinek v poznámkách k vydání. Kódové jméno Excalibur bylo vybráno podle planetky 9499 Excalibur. Devuan (Wikipedie) je fork Debianu bez systemd. Devuan 6 Excalibur vychází z Debianu 13 Trixie. Devuan 7 ponese kódové jméno Freia.
Společnost Valve aktualizovala přehled o hardwarovém a softwarovém vybavení uživatelů služby Steam. Podíl uživatelů Linuxu poprvé překročil 3 %, aktuálně 3,05 %. Nejčastěji používané linuxové distribuce jsou Arch Linux, Linux Mint a Ubuntu. Při výběru jenom Linuxu vede SteamOS Holo s 27,18 %. Procesor AMD používá 67,10 % hráčů na Linuxu.
Joel Severin v diskusním listu LKML představil svůj projekt linuxového jádra ve WebAssembly (Wasm). Linux tak "nativně" běží ve webovém prohlížeči. Potřebné skripty pro převod jsou k dispozici na GitHubu.
Odkazy
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.
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 Genesis
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.
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
.
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.
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äť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. |
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:
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;
}
}
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.
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;
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 
Tiskni
Sdílej: