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)]