Konference: Počítač SHARP MZ-800 a emulátory
Od: | Michal Hučík |
Datum: | 3.11.2010 09:06 |
Předmět: | Re: overscan - jednoduchy popis kresleni po obrazovce |
Dne 2.11.2010 9:26, Ctirad Feřtr (sharpemu tu byla ta zakroucena vec pandora.cz) napsal(a):
> BTW, nemá někdo zdroják v asm něčeho, co kreslí na obrazovku? Pokoušel
jsem
> se o něco na základě dokumentace ze scavu, ale nějak mi to neseje :(
Ted tu mam chvilku klidu, toz zkusim nastinit alespon zaklad. Budu se
zabyvat jen rezimem MZ800, ve kterem se pracuje s video pameti bitove,
tzn. ze to co zapisu do VRAM je to co uvidim na obrazovce. V rezimu
MZ700 funguje zobrazeni z VRAM atributove, tedy bajt zapsano do VRAM
rika adresu bitove masky v CGRAM a barvy pozadi a popredi se nastavuji v
tabulce atributu, ktera je umistena nad VRAM ... ale to je jina pisnicka.
Kazdy program v MZ800 rezimu by si mel davat bacha, aby se on sam, nebo
jeho zasobnik nenachazel v oblastech 0x1000 - 0x1FFF (CGROM), a 0x8000 -
0x9FFF (VRAM 320x200), pripadne 0x8000 - 0xBFFF (VRAM 640x200) ... teda
program se tam samozrejme nachazet muze, ale ne ve chvili, kdy si
primapuje CGROM + VRAM, ktere v MZ800 rezimu jdou mapovat pouze obe
dohromady.
Nastaveni pozadovaneho rezimu, zpusobu zobrazeni, rozliseni obrazovky a
poctu barev provadime pres DMD registr (0xCE).
Mapovani pameti zatim nijak rozvadet nebudu, pouze to, ze v MZ800 rezimu
IN A, (0xE0) primapuje CGROM a VRAM. Instrukce IN A, (0xE1) to odmapuje
a navrati tam RAMku.
V kazdem barevnem rezimu si clovek musi uvedomit s kolika _obrazy_ a
_bloky_ v danem rezimu pracuje, podle toho pak vypada prace s WFR -
Write Format Registr - (0xCC), RFR - Read format Registr (0xCD) a
registrem barevnych palet (0xF0).
org 0x3000
ld sp, 0x2FFF ; zasobnik dame pod nas program
xor a
out (0xCE), a ; do DMD posleme 0x00 - tedy rezim MZ800, 320x200 tu byla ta zakroucena vec 4
obraz A
; (pouzijeme tedy 2 obrazove bloky I. a II.)
in a, (0xE0) ; primapujeme CGROM a VRAM
ld bc, 0x00F0 ; do reg. C si dame adresu registru barevnych palet
ld a, 0x40
out (c), a ; zvolime nultou paletovou skupinu
; Volba skupiny: 6. bit musi byt '1', dolni 2 bity
rikaji cislo skupiny
; nyni u teto skupiny pridelime barvy k obsahu obrazovych bloku
; Volba barvy:
; 6. bit musi byt '0'
; bity 5. - 4. rikaji cislo obrazoveho bloku
; bity 3. - 0. rikaji barvu (IGRB)
xor a
out (c), a ; zadny bit v obr. blocich znamena - cerna barva
ld a, 0x11
out (c), a ; bit v prvnim bloku bude modra barva
ld a, 0x22
out (c), a ; bit v druhem bloku bude cervena
ld a, 0x3F
out (c), a ; bit v obou blocich bude bila
;
; A ted zacneme kreslit, nejprve si smazeme screen
;
ld a, 0x03
out (0xCC), a ; nastavime si WFR a RFR tak, aby jsme
out (0xCD), a ; cetli metodou READ z bloku I. a II. a psali
metodou SINGLE WRITE do bloku I. a II
ld hl, 0x8000 ; adresa VRAM
ld de, 0x8001
ld bc, 0x1F3F ; velikost viditelne oblasti VRAM ( 40 bajt x 200
radku ) - 1
xor a
ld (hl), a
ldir ; mazeme
; namalujeme bilou prerusovanou caru pres prvnich 8 radku
ld hl, 0x8000
ld de, 0x8001
ld bc, 0x013F ; (40 x 8) - 1
ld a, 0x55
ld (hl), a
ldir
; pokracujeme pod tim cervenou carou
ld a, 0x02
out (0xCC), a
out (0xCD), a ; prenastavime WFR a RFR jen na II. obrazovy blok
ld bc, 0x013F ; (40 x 8) - 1
ld a, 0x55
ld (hl), a
ldir
; odmapujeme VRAM
in a, (0xE1)
; a budeme cekat az do soudneho dne...
di
halt
Snad jsem se nikde neseknul a bude vam to takhle fungovat. K pochopeni
je dobre dohledat si vyznamy jednotlivych bitu k uvedenym registrum.
Michal
Ostatní příspěvky vlákna:
[2010/1 (51)] [2010/2 (48)] [2010/3 (23)] [2010/4 (40)] [2010/5 (50)] [2010/6 (23)] [2010/7 (13)] [2010/8 (54)] [2010/9 (47)] [2010/10 (243)] [2010/11 (92)] [2010/12 (98)]
[1999 (1)]
[2000 (168)]
[2001 (733)]
[2002 (459)]
[2003 (654)]
[2004 (224)]
[2005 (105)]
[2006 (182)]
[2007 (201)]
[2008 (294)]
[2009 (363)]
[2010 (782)]
[2011 (522)]
[2012 (642)]
[2013 (442)]