[SharpMZ] MZ-1500 - mapovani pameti a zobrazovani grafiky

Michal Hucik - ORDOZ ordoz na ordoz.com
Pondělí Srpen 1 22:37:57 CEST 2016


Ahoj, dnes jsem cele odpoledne a vecer venoval pruzkumu MZ-1500 a 
protoze nejsem sketa, tak se o sve nove poznatky podelim :)

Zde jsou me poznatky, ktere castecne vychazeji z toho co jsem si 
prelozil z japonstiny a castecne z mych experimentu.

Informace jsem sbiral predevsim tady 
http://www.maroon.dti.ne.jp/youkan/mz700/mziomap.html a na japonske wiki.


Pocitac ma 64 kB RAM, 4 kB VRAM, 24 kB PCG VRAM

Rozliseni 320x200, coz odpovida 40 x 25 znaku obrazu.


Organizace pameti:
================


-- dolni blok --

0000 - 0FFF: ROM/RAM


-- horni blok --

D000 - DFFF: VRAM, ta sklada se ze 4 casti (mimochodem v kazde zustava 
nevyuzito 24 bajtu na konci)

     D000 - D3FFF: textova VRAM (stejna jako na MZ-700)

     D400 - D7FF: PCG1_VRAM

     D800 - DBFFF: atributova VRAM (temer jako na MZ-700: 0. - 2. bit BG 
color, 4. - 6. bit FG color, 7. bit sada)

     DC00 - DFFF: PCG2_VRAM


E000 - E008: mapovane porty 8255, 8253 a status registr

     Se status registrem jsem neexperimentoval, ale podle popisu pri 
cteni od 7. bitu dolu: /HBLK, -, -, JOY_B, JOY_B, JOY_A, JOY_A, TEMPO, 
pri zapisu je na 0. bitu hradlovani zvuku z 8253


E009 - E000F: nevyuzito


E010 - E7FF: vyhrazeno pro ROM z periferii na MZ-700, ale mam pocit, ze 
u MZ-1500 je nevyuzito a nastaveno trvale na 0xFF


E800 - FFFF: horni ROM


Mapovani pameti:
================


Provadi se pres OUT, nejprve standardni:


E0 - nastavi dole RAM

E1 - nastavi nahore RAM

E2 - nastavi dole ROM

E3 - nastavi nahore VRAM/ROM

E4 - nastavi dole ROM a nahore VRAM/ROM

E5 - !!!! v zavislosti na predane hodnote namapuje na D000 - EFFFF 
specialni pamet, F000 - FFFF je nevyuzita a je nastavena na 0xff !

     0x00: CGROM (ma delku jen 0x1000 a je tam 2x za sebou)

     0x01: PCG_PLANE1

     0x01: PCG_PLANE2

     0x01: PCG_PLANE3

E6 - odpoji CGROM, nebo PCG_PLANEx (pokud po OUT (0xE5),a provedete napr 
OUT na port E3, nebo E4, tak se zmena neprojevi! nejprve je potreba 
pamet odpojit!)



Zobrazovani:
============


Zobrazovani ala MZ-700 neni potreba nijak rozebirat:

0xD000 -> 0x6B (zobraz na pozici 0,0 znak *)
0xD800 -> 0x71 (nastav na pozici 0,0 modre pozadi, bile popredi a 1. 
znakovou sadu)


1. znakova sada obsahuje velka pismena a rozsypany caj katakana
2. znakova sada obsahuje mala pismena a rozsypany caj hiragana

Obe znakove sady jsou k videni na vyse uvedene adrese.


Zobrazovani ala MZ-1500:

Je vylepseno o PCG, coz je neco jako CGRAM v MZ-700 provozovanem na 
MZ-800 :) akorat ze v MZ800 ji mame jen jako jednobarevnou masku, 
zatimco v MZ-1500 je znak 8x8 pixelu ulozen do 3 barevnych rovin a je 
tak tedy mozne zobrazit ve znaku 8x8 vsechny barvy najednou (v rezimu 
MZ-700 zobrazujeme jen 2 barvy najednou). Navic je mozne na jednom znaku 
aplikovat jak TXT (MZ-700), tak i PCG. Tuto vlastnost lze nastavovat 
zvlast pro kazdou jednotlivou pozici na obrazovce. Globalne pak pres 
port 0xF0 muzeme uplne povolit, nebo zakazat zobrazovani vsech PCG. 
Portem 0xF0 muzeme nastavit barvy palet podle jednotlivych rovin.

V PCG je mozno nadefinovat celkem 1024 znaku, z nihz kazdy zabira 8 
bajtu v kazde ze 3 rovin.

Pozn: Vec, ktera dokaze zneprijemnit zivot a zkoumani pocitace - po 
resetu ta svine ROM vymaze obsah vsech PCG rovin!


Port 0xF0:
--------------

     0. bit - globalne povoluje/zakazuje zobrazovani PCG
     1. bit - urcuje prioritu zobrazovani:

         0 - nejprve se vykresli MZ-700  pozadi, pak PCG, pak MZ-700 TXT 
znak
         1 - nejprve se vykresli MZ-700  pozadi, pak MZ-700 TXT znak, 
pak PCG


Port 0xF1: (po resetu jsou uz palety nastaveny - zatim jsem nezkoumal, 
zda se o to stara ROM, nebo GDG)
---------------

     4. - 6. bit: kombinace rovin
     0. - 2. bit: barva


Kdyz mame v PCG vytvoreny nejake patterny, k paletam mame prideleny 
barvy, portem 0xF0 jsme povolili nejakou metodu zobrazovani PCG, tak:


V pameti PCG1_VRAM a PCG2_VRAM na pozici nejakeho znaku uvedeme cislo 
patternu 0 - 1023. V PCG1_VRAM se zapise dolnich 8 bitu a v pameti 
PCG2_VRAM se na pozici 6. - 7. bitu zapisou horni 2 bity z cisla 
patternu. Zaroven nastavenim 3. bitu v povolime, nebo zakazeme 
zobrazovani PCG na aktualni pozici. Upozornuji na to, ze v PCG2_VRAM 
mame tedy 1024 bajtu ze kterych se vyuzivaji jen 3 bity, coz je ponekud 
trapne...


Od teorie k praxi:
===============


Experimentoval jsem tak, ze jsem si kod nejprve zkompiloval na PC a pak 
jsem v monitoru MZ-1500 nabusil kod rucne. Monitor je starsi, nez na 
MZ-800, takze zrejme nezna prikaz Goto. Zna jen Jump. Pokud v programu 
pouzijete unstrukci RET, tak jde pocitac do resetu.

Kod berte s rezervou - prikazy jsou napsany v takovem poradi a takovym 
zpusobem, aby se dobre experimentovalo. Puvodni kod uz jsem smazal. Pisu 
to z hlavy, tak snad nenasekam moc chyb.



# Takhle by mel asi zacinat kazdy kod ... z monitoru to vsak neni nutne 
- stejne tak jako neni nutne nastavovat palety.
# out (0xe3),a    ; hore VRAM a ROM
# out (0xe6),a    ; pro jistotu deaktivujeme CGROM, ci PCG

ld a, 0x6B
ld (0xd000),a    ; na pozici 0,0 znak *

ld a, 0x70
ld (0xd800),a    ; na pozici 0,0 cerne pozadi, bile pismo

ld a, 0x00          ; k pozici 0,0 pridelime PCG pattern 0 a povolime 
jeho zobrazeni
ld (0xd400),a    ; dolnich 8 bitu PCG pozice
ld a, 0x08
ld (0xdc00),a    ; horni 2 bity PCG pozice do 6. a 7. bitu | 0x08 - 
povolit PCG na teto pozici


ld a,0x01
out (0xF0),a    ; urcime globalni prioritu zobrazovani PCG a TXT a 
globalne povolime zobrazeni PCG


ld a,0x02
out (0xe5),a    ; pripojime si 2. PCG rovinu


ld b,0xff            ; vyrobime si par velice jednoduchych patternu 
slozenych jen z 2. PCG roviny
ld hl,0xd000
$loop:
ld (hl),b
inc hl
djnz $loop

; nyni uz by jsme meli mit zobrazenu hvezdicku s cervenym patternem


; Konec pribehu - stop
di
halt

; a nebo:

; hokuspokus 1
ld a,0x24
out (0xf1),a    ; 2. paletu nastavime na zeleno


; hokuspokus 2
ld a,0x03
out (0xF0),a    ; zmenime globalni prioritu zobrazovani TXT a PCG


; pokud by jsme se chteli korektne vratit a opet namapovat VRAM
out (0xe3),a    ; hore VRAM a ROM
out (0xe6),a    ; deaktivujeme CGROM, ci PCG
di
halt


------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://mail.ordoz.com/pipermail/sharpmz/attachments/20160801/c096ea6a/attachment.html 


Další informace o konferenci SharpMZ