sobota 2. listopadu 2019

Hry, které se vejdou do boot sektoru

David Murray (The 8-Bit Guy) na svém Youtube kanále zveřejnil krátké a pěkně zpracované video o hrách, které se vejdou do boot sektoru. To znamená, výsledná velikost po zkompilování nepřesáhne jak 512 byte.

Je samozřejmostí, že takové hry se píší v nízkoúrovňovém Assembleru nebo strojovém kódu, což byla běžná praxe programování her na 8bitech. Já si spíše z dob 286 pamatuji temnější stránky - boot viry (u nás mezi nejznámější patří asi slovenský OneHalf).

Ale zpět ke hrám. Pokud se chcete inspirovat nebo si vyzkoušet nějakou takovou hru naprogramovat, tak se podívejte na stránky mexického vývojáře jména Óscar Toledo Gutiérrez, který se právě takovýmto programováním zabývá. Mezi jeho díla mimo jiné patří:
Až na Tinyasm se vše vejde do 512 byte. Všechny zdrojové kódy jsou k dispozici na jeho Githubu.

Oskar o programování her napsal i pěknou knihu Programming Boot Sector Games.
Kniha Programming Boot Sector Games
Knihu lze koupit v tištěné verzi jako paperback nebo hardcover nebo a jako e-book (úplně dole na stránce, která vypadá sice podezřele, ale nákup přes PayPal proběhl bez problémů a dostanete PDF). V knize jsou vysvětleny i základy assembleru.

Doporučit mohu také výukové materiály Nicka Blundella, zejména Writing a Simple Operating System.

Vyzkoušení

Připravil jsem krátký postup, jak si vyzkoušet takovou hru zprovoznit:
  • stáhněte si a nainstalujte emulátor DosBox
  • stáhněte si The Netwide Assembler (verze 2.14 pro Windows x64), archiv si rozbalte např. do složky "C:\NASM"
  • stáhněte si zdrojový kód (pillman.asm) hry Pillman a uložte ho např. do složky "C:\Pillman"
  • spusťte příkazový řádek Windows a zkompilujte hru pomocí příkazu
    "C:\NSAM\nasm.exe -f bin C:\Pillman\pillman.asm -o C:\Pillman\pillman.bin"
  • spusťte DosBox a zadejte v něm příkaz "boot C:\Pillman\pillman.bin"
Pokud chcete něco jednoduššího, tak můžete zkusit obyčejné "Hello" z výše uvedeného materiálu Writing a Simple Operating System (PDF):

; A simple boot sector that prints a message to the screen using a BIOS routine.
;
mov ah, 0x0e ; int 10/ ah = 0eh -> scrolling teletype BIOS routine
mov al, 'H'
int 0x10
mov al , 'e'
int 0x10
mov al , 'l'
int 0x10
mov al , 'l'
int 0x10
mov al , 'o'
int 0x10
jmp $ ; Jump to the current address ( i.e. forever )
;
times 510 -($-$$) db 0 ; Pad the boot sector out with zeros
;
dw 0xaa55 ; Last two bytes form the magic number so BIOS knows we are a boot sector.



Jestli vás tato oblast zaujala, přidávám pár užitečných odkazů:
Ještě jsi pamatuji, že existovala česká verze TechHelpu, která se jmenovala SYSMAN. Bohužel ji už ale nemohu nikde najít. Pokud o ní víte, dejte prosím odkaz do diskuze.

sobota 14. září 2019

Odstranění dynamicky přidaného rozložení klávesnice ve Windows bez rebootu

Poznámky na úvod:
1) Nenaleznete zde postup, jak nechtěnému přidávání zabránit. Je zde jen návod, jak ho jednoduše a bez rebootu odstranit.
2) Pro popis řešení bez úvodní omáčky skočte přímo na řešení.

Popis problému

Ve Windows 10 se občas stane, že se do nastavení rozložení klávesnice bez přičinění uživatele přidá nové rozložení. V mém případě se mi přidává do jazyka "Čeština" rozložení QWERTZ. Myslel jsem, že se mi tento problém podařilo vyřešit tak, že jsem pomocí CTRL+SHIFT nepřepínal klávesnice, ale jazyky:

Bohužel se ukázalo, že to byla mylná teorie, protože se mi to dnes opět po delší době stalo. Zajímavé je, při jaké příležitosti - spuštění hry pomocí Steam klienta s nastavením na Češtinu. Je to pěkně vidět na videu: 



Před spuštěním hry mám pouze dvě rozložení - anglické a české QWERTY. Následně spustím hru nastavenou na angličtinu, rozložení se nezmění. Pak přepnu hru do češtiny, spustím ji a hned se automaticky přidá QWERTZ rozložení, viz čas 00:30, kdy se změní indikátor rozložení na hlavním panelu. 

Není to jediná situace, kdy to nastane. S tímto problém se potýká hodně uživatelů Windows. Tomášovi Vítovi se to např. stává s Outlookem. 

Protože se mi to konečně podařilo v jednom případu odchytit a bez problémů opakovaně reprodukovat, tak jsem zkoušel jsem googlovat a aplikovat několik postupů ( např. https://twitter.com/RadekHulan/status/1076125557128155137 nebo https://superuser.com/questions/1092246/how-to-prevent-windows-10-from-automatically-adding-keyboard-layouts-i-e-us-ke ), které tomu měly zabránit. Bohužel žádný mi nefungoval.

Začal jsem tedy řešit, jak se tohoto rozložení jednoduše zbavit. Problém je v tom, že to rozložení se do Windows přidá a zároveň nepřidá. Zní to zvláštně. Představte si to tak, že se sice ukazuje na hlavním panelu (taskbaru), ale v nastavení Windows není:

Vlevo je vidět, že v nastavení Windows je pro češtinu pouze jedno rozložení ("Česká QWERTY"), přesto jsou ale v panelu jazyků pro češtinu rozložení dvě - "Česká QWERTY" a "Česká" (to je ona dynamicky přidaná QWERTZ). 

Pozn: Pokud byste měli rozložení QWERTZ záměrně přidané, vypadlo by to v nastavení Windows takto:

Důsledky toho, že rozložení je přidané pouze "za běhu" a není v nastavení jsou dva:
  • po rebootu rozložení zase zmizí,
  • bez rebootu nelze odstranit (není "co" odstranit).

Řešení

Jak už ale titulek článku říká, nějak to lze. Jednoduchý trik spočívá v tom, že rozložení do Windows nejprve přidáte a následně ho odstraníte:



Pokud se vám nechce klikat, tak jsem připravil jednoduchý script v Powershellu, který udělá totéž: https://github.com/KamilZm/RemoveUnwantedKBLayout