ještě jsem zapoměl dodat: DOSBox si přepněte do režimu Herculesu, aby ty příklady fungovaly. Potom není vůbec žádný problém (až na to vypínání videa).
DosBox jsem si přepnul do režimu Hercules, ale mám jeden problém: abych vymazal celou obrazovku, musím dát smyčku do 364 (zjištěno experimentálně). Pokud dám pouze 348 zůstane na konec obrazovky nevymazán (odhadl jsem to podle teček na střídavě 40h a 0fh). Přijde mi to jako by ta videoram pokračovala ještě 16 řádků než se vrátí opět nahoru do druhého mikrořádku....
Procedura putpixel mi funguje korektně, dokonce jsem si zkoušel v posledním příkladu přidávat ručně pixely a opravdu pravý dolní roh mám 719,347.
Ještě by se mi při hraní hodila procedura pro zpětné přepnutí do textu. Dělám věci po staru: překládám z příkazového řádku a program pak z příkazového řádku spustím. Když program skončí , zůstane dosbox v grafickém režimu, na obrazovce je změť čehosi, a musím to napravit poslepu napsáním CLS. Zkoušel jsem použít set_control text, dopadlo to špatně, vidím že tak jednoduchý to není (a na další jsem zatím neměl čas).
zdravim. To vymazani odpoledne zkusim, to je zajimavej problem (ale muze byt, treba je spatne nastavenej vert sync counter nebo tak). Prepnuti do textu, ok to dopisu, to neni tezke (je to totiz ta stejna procedura, jako pro prepnuti do grafiky, jen se tomu predhodi jinych 12 registru CRTC + prepnuti dvou bitu).
Asi to bude jak jsem to ráno odhadl. Zkusil jsem pár výpočtů: pro první čtvrtinu obrazovky (0.mikrořádek) potřebuji 90*348/4 = 7830 byte. Další (1.mikrořádek) začíná až na adrese 8192, což odpovídá i konstantám v proceduře putpixel. Je to zaokrouhlený na 8KB a celkem 32KB. Takhle to bude i jednodušší pro řadič při vykreslování).
Takže regulerní hodnota pro cyklus vymazání obrazovky je 32768
19. 7. 2024, 15:22 editováno autorem komentáře
A taky už asi vím proč se vám neprojevilo nedomazání obrazovky. Pokud se pouští Dosbox (a navíc máte variantu pro linux narozdíl ode mne kde ho provozuju v Win XP) pouze pro spustění jednoho COM programu, bude videoram "prázná". Já spustil Dosbox, v něm mi běží VC, pak spustím dávkou NASM a teprve pak spouštím COM, v tu dobu je už ve videpaměti spousta hodnot. Dokonce při přepnutí Dosboxu do grafického režimu Hercules se mi změní velikost okna Dosboxu.
Ještě přidám jednu perličku ke kartě Hercules. V roce 1996/97 když jsem psal diplomku kolegové vedle na pokoji měli počítač už s W95 a pouštěli nějaké porno. To mne inspirovalo k tomu abych naprogramoval pro svůj počítač "Hercules porno" Základem byla inspirace z obrázku od kreslíře Petra Urbana: dvě jednoduše obrysově nakreslená prasátka si to rozdávají. Programované je to v turbopascalu s knihovnou BGI.
jinak kombinace VC + NASM primo v DOSBoxu je pekna. Tady v clancich jsem to nenavrhoval, prislo mi to moc hardcore :) ale takto nejak jsem to kdysi provozoval - tedy spis VC + TASM + Sysman jako TSR
Já tak často narážel na to, že ani s VC nebylo dost RAM, že jsem si napsal vlastní nerezidentní menu pro baťáky. Na procházení souborů to nebylo, ale pokud člověk potřeboval jen spouštěč...
Jo, nerezidentní menu jsem měl taky. Akorát se chtělo, aby posbíral všechny \!*.bat a jméno vybraného vrátil v systémové proměnné, to bylo žertovné, měnit všem programům jejich environmenty. Mimochodem, Volkov po spuštění cizího programu kombinací шифт+ентер uvolnil víc paměti.
Volkov po spuštění cizího programu kombinací шифт+ентер uvolnil víc paměti.
Občas ani to nestačilo... (640 KB je dost pro každého...
;oD )
Já volil jiný postup:
- jednoduché menu, kdy stačilo v CLI zadat položky, a ErrorLevel vrátil číslo řádku,
- složitější menu, definované souborem (obdoba NC.MNU
), kdy odsazené řádky naházel do RUN.BAT
, který se následně spustil...
Daly se s tím dělat opravdu kouzla. Škoda, že to někdy s příchodem Windows NT přestalo fungovat...
ano, kazda 1/4 obrazovych radku vzdycky zacina na nasobku 8 kB (na CGA taky ale tam jsou to jen sude/liche radky). Ale porad mi moc neni jasne, jak se ta "neviditelna" (a nemezana) oblast zobrazi v DOSBoxu. Ja v prikladech nikde mazani nemam, zacina se s prazdnym obsahem (ne uplne, je tam ten radek C:\ co se zmeni na asi 30 pixelu)
Zkoušel jsem si ted dát wait_key hned za init graphic a mám v dosboxu obrazovku plnou svislých pruhů tenký (40h) a silnější (0fh) + je tam nahoře pár pixelů. Možná to bude jinou verzí Dosboxu. Mám 0.74 (2002-2010) pro Windows.
Třeba v posledním příkladu (kreslení úsečky) je pro vymazání smyčka dlouhá pouze 90*348=31320 takže ve 4/4 obrazovky zbyyde dole kus nedomazaný. úsečku mi to pak vykreslilo korektně i přes nesmazanou obrazovku.
bude toto v tve konfiguraci (kdy je video RAM necim zaplnena ) funkcni? https://github.com/tisnik/8bit-fame/blob/master/pc-dos/hercules_putpixel.asm
je tam opravena ta smycka (a jeste lepsi bude REP STOSW, ale to uz je trivka)
Hercules slo ohnout tak, ze emuloval kartu CGA. Byl tam stejny cip, takze to +- nejak slo. Samozrejme vysledky byly "divne", protoze se ty tri barvy nahrazovaly ditheringem, ale bezelo to. Bezely tak i Wokna 3.11 :)
A jinak - zkuste si v emulatoru pustit nejakou starsi hru pro Hercules, je to opravdu zajimavej zazitek. Nekde to funguje dobre, treba to SimCity, jinde (Xenon) vlastne clovek ani nevi co vidi :)
Asi to nejde nijak tridit, ale nejaky listy jsou tady https://www.classicdosgames.com/games_menu.html
Jj, TSR utilitku SIMCGA mám v živej pamäti zo začiatku 90. rokov. Pozerám teraz, že ich bolo dokonca viacero:
https://dosdays.co.uk/topics/cga_simulators_for_hercules.php
Predpokladám ale (do disassemblovania som sa zatiaľ nepúšťal), že to emulovalo len na úrovni kopírovania frame buffer obsahu z B8000 do B0000 (s adekvátnou transformáciou dát), s využitím toho, že Hercules má na B8000 tiež časť video RAM. Plus teda hooknutie BIOS int10h handleru na prepnutie videorežimu. Prípadné priame zápisy do CGA registrov to asi nepokrývalo, keďže sú dekódované do iných adr. rozsahov. Tam by bola asi jediná cesta patch binárky programu (alebo in-place modifikácia po zavedení do pamäte, to by vlastne TSR teoreticky asi aj mohol spáchať, keby sa veľmi chcelo).
opraveno, nakonec jsem musel pouzit CX. Slo by i PUSH konstanta + POP ES, ale zaprve to trva silene dlouho a zadruhe to neni platna kombinace pro Intel 8086 (NASM u toho sice nic nerika, ale na realnym 8086/8088 by to nejelo).
Jeste jednou dik za upozorneni
Jj, push imm je az od raritni 80186.
Ten zacatek by jeste mel jit zkratit
mov si, offset HGCRegen
add bx, bx
mov si, [bx + si]
a mozna otocit ten podmineny jump, aby se trochu srovnala delka vykonavani pro bily a cerny pixel.
Kazdopadne diky za tyto clanky, clovek se zase vraci do mladi.
Pamatuji si z devadesatek takovou soutez o nejkratsi program (.com), ktery vykresli vlajku vybraneho statu v rezimu VGA 320x200. Ceska vlajka byla neco pres 30 bajtu.
diky
hele tu soutez si taky pamatuju, to bylo ve Vyhni nebo Parenisti (tedy jestli pamet neklame, na to uz ma pravo ;)
Ona je tam ale inicializácia ES na video RAM segment už hneď v úvode (hercules_putpixel.asm#L60), tamto pred white_pixel bolo (v kontexte kódu celého príkladu) redundantné, ak dobre vidím.
je to tak, ale později se bude putpixel volat odkudkoli, tedy i z mista, kde ES muze byt jinak. Takze pro jistotu se to tam znovu nastavuje.
S kartami Hercules jsem se potkal v roce 1987, měli jsme v PC/AT; společně s kartami SPEA Graphiti. Později jsme do nich (HGC) doplnili i ty ROMky s češtinou Kamenických. Subjektivně byly lepší než EGA, pochopitelně až na barvy.
Také se nám stalo, že HGC ve spolupráci s T602 odpráskla monitor. Pokud se v T602 aktivoval screensaver, karta zblbla a posílala do monitoru nestandardní signály. Na dispeji se to projevovalo jako měnící se jasné kolečko uprostřed obrazovky. Tranzistor v řádkovém rozkladu zřejmě přešel ze spínacího režimu do lineárního, přehřál se a bylo po něm. Originální u nás k sehnání nebyl, pomohl ale SU-169 z produkce NDR, na kusu hliníkového plechu.
Mimochodem, ony PC/AT pracovaly na kmitočtu 6 MHz, případně 8 MHz, a měly 3 MB paměť (1 MB na základní desce, 2 MB na 16b ISA kartě - tu dodnes mám). Náš sálový počítač EC1045 měl paměť 4 MB ;-).
Používal jsem i jedno méně známé využití HGC. Tady alespoň v mém okolí moc známé nebylo. Kombinace Hercules + VGA byla pro vlastní potřeby programátora k nezaplacení i v pozdějších dobách Win 9x, pro debugování.
Protože win 95 (i win 98) měly dolních 1MB paměti namapovány přímo (stále běžely nad DOSem, i když hodně skrytě) a neměly tam ochranu zápisu/čtení paměti, bylo možné využít druhý monitor, Hercules, v textovém režimu, pro vlastní debugovací poznámky při výrobě programů. Vypisovalo se prostým zápisem do absolutní paměti od 0xb0000. Což bylo ve windows k nezaplacení, protože to nevyvolalo, ani nepřímo, naprosto žádnou systémovou akci typu SendMessage, žádná fronta, interrupt, prostě vůbec nic. A člověk mohl na druhém monitoru sledovat runtime poznámky, třeba i jako reakce na pohnutí myši, ohlášení přejetí do NC area, ..., aniž by výpis ovlivnil OS. Šlo takto rozběhat Hercules i v grafice, ale moc smyslu to pro debug účely nedávalo. Navíc se musel přidat driver pro odblokování rozsahu HGC portů (někde jsem našel obecný na uvolnění rozsahů portů, naštěstí nemusel psát svůj). Protože I/O (in/out) byly na win defaultně chráněné, na rozdíl od té dolní paměti.
A když už jsme zde na root ... tak kombinace Hercules + VGA se na Xech (na Slackware) dala rozběhnout najednou, jako spojitá plocha. Akorát musela být VGA v monochrom režimu. Fungovalo to bez problému, včetně TWM/Fvwm, vč. možnosti okna plynule přesouvat z jednoho monitoru na druhý (i jen částečně) a podobně. Pokud si dobře pamatuji. Jen kombinaci barevné VGA a mono Hercules jsem na X Window rozběhat nedokázal a předpokládám, že to z principu nešlo (tuším X Window nepodporoval možnost jiné hloubky barev v různých částech virtuální plochy).
Ja pouzival HCG spolu s VGA pro diplomku - vyvoj driveru pod WinNT.
Pres cracnuty SoftICE (holt, student nema moc penez nazbyt) ....
Akorat ty dva monitory zabiraly cenne misto na stole na kolejich a HCG karta co jsem sehnal, byla full-size a plna DIL soucastek, tak jsem ji musel zlehka 'ohnout', aby 'ladnym obloukem' obesla CPU Intel75 s chladicem - takze zacinala v jednom ISA slotu, ale v case koncila ve vedlejsim :-)
Nějaku dobu jsem to měl také tak. Nejdříve jsem měl jen Hercules a po nějaké době k tomu přikoupil VGA. Na HGC bylo IDE Borland C++, na VGA jsem ladil aplikaci.
Mimochodem, takový HGC monitor s luminoforem co svítil příjemnou jantarovou barvou, byla pohoda na oči a dalo se do toho dívat libovolně dlouho. VGA byla sice barevná, ale tahala očit.
Už je to fůra let, a tehdy jsem měl mladší oči, ale taky mám pocit, že s Herkulem v textovém režimu se mi dělalo nejlépe.
Kartu Hercules s oranžovým monitorem jsem měl na počítači co jsem si koupil za 4000Kč v roce 1995 na udělání diplomky. Říkal jsem mu "PanzerRechner" byl to desktop o velikosti miditoweru, ale z hodně silnýho plechu. Hmotnosti přidával i pevný disk MFM. Byl na dvě pozice 5.52, měl 9 hlav a kapacitu neuvěřitelných 80MB.Když zabraly hlavy, škubnul se stolem. Na základní desce byla 80286 a paměť 2MB realizovaná 16 (nebo 32) samostanými DIL obvody a polovina patic zůstala volná a pamět by šla rozšířit na 4MB. Co jsem ale u žádného jiného počítače neviděl, díky kartě Hercules měl tento počítač 724KB konvenční paměti (+ pak 1MB nahoře).
desktop o velikosti miditoweru, ale z hodně silnýho plechu
Já měl PP-06, a to jsem používal jako stoličku, když jsem potřeboval dosáhnout na horní polici - a ani jsem se nenamáhal to vypnout. ;oD
Ještě pamatuji, že chlazení obstarával stejný větrák na 220 V, jaký byl na kolejích v koupelně a na WC, takže když se přestal točit, prohodil jsem to s koupelnovým a nahlásil závadu...
Ten ventilätor byl asi poctivý průmyslový mezaxiál, kompletně z hliníkové slitiny včetně lopatek. Strčit do něj prst znamenalo o něj přijít. Pár jich mám schovaných, v lištách po čtyřech, (ventilátorů, ne prstů), co kdyby se někdy hodily, že ;-).