Obsah této stránky: |
RAMDISK MZ-1R18
Ramdisk MZ=1R18 je hardwarový přídavek, který připojuje
64k bytový disk. Tento ale není přímo přístupný, ale je
adresovatelný pouze přes porty. Z-80 CPU tuto oblast také může
adresovat. Na to se musí napsat podprogram, aby se na adresu
na ramdisku dala napsat ev. přečíst nějaká hodnota. Adresa
by měla být v HL, příslušná hodnota musí být v akumulátoru.
K tomu malý příklad:
Program pro psaní na ramdisk
1200 F5 PUSH AF
1201 C5 PUSH BC
1202 6F LD A,L
1203 44 LD B,H
1204 0E EB LD C,EBH
1206 ED 79 OUT (C),A
1208 C1 POP BC
1209 F1 POP AF
120A D3 EA OUT (EAH),A
120C C9 RET
Program pro čtení z ramdisku
1210 F5 PUSH AF
1211 C5 PUSH BC
1212 6F LD A,L
1213 44 LD B,H
1214 0E EB LD C,EBH
1216 ED 79 OUT (C),A
1218 C1 POP BC
1219 F1 POP AF
121A DB EA IN A,(EAH)
121C C9 RET
Důležitý je program, kterým se dá přenést oblast z paměti
do libovolné oblasti ramdisku.
K tomu jsou zapotřebí tři hodnoty:
a) počáteční adresa bloku v paměti (HL registr)
b) " " " v ramdisku (DE registr)
c) délka bloku.
Používáme přitom již napsaný program, který píše 1 byte na adresu
v ramdisku. Chceme například oblast od 2000H do 3000H napsat
na ramdisk od adresy 0000H
Zde program k tomu:
2000 21 00 20 LD HL,2000H ;počáteční adresa v paměti
2003 11 00 00 LD DE,0000H ; " " v ramdisku
2006 01 00 10 LD BC,1000H ;délka bloku
2009 1A LD A,(HL)
200A E5 PUSH HL ;zachraň HL
200B D5 PUSH DE ;HL = DE
200C E1 POP HL
200D CD 00 12 CALL 1200H ;napiš obsah akumulátoru
na ramdisk
2010 E1 POP HL
2011 23 INC HL
2012 0B DEC BC
2013 13 INC DE
2014 78 LD A,C ;BC = 0 ?
2015 B1 OR C
2016 C2 09 20 JP NZ,2009H
2019 C3 AD 00 JP 00ADH ;skok do monitoru
Nyní chceme tento blok z ramdisku opět načíst do paměti.Potřebujeme znovu ty samé tři parametry, ale tentokrát má být blok
přenesen na adresu 7000H v paměti. Také tentokrát použijeme znovu
podprogram, který čte 1 byte z ramdisku.
2020 11 00 70 LD DE,7000H ;poč.adresa v paměti
2023 21 00 00 LD HL,0000H ; " " v ramdisku
2026 01 00 10 LD BC,1000H ;délka bloku
2029 CD 10 12 CALL 1210H ;čti byte z ramdisku
202C 12 LD (DE),A
202D 23 INC HL
202E 13 INC DE
202F 0B DEC BC
2030 78 LD A,B ;BC = 0 ?
2031 B1 OR C
2032 C2 29 20 JP NZ,2029H ;když ne, čti dál
2035 C3 AD 00 JP 00ADH ;skok do monitoru
Tyto podprogramy lze bez úprav vložit do vašich
programů. Musíte jen v každém programu změnit adresu bloku.
Přepínání paměti (stránkování paměti)
MZ-800 má různé paměti, které leží vzájemně paralelně. Tyto
mohou být přes přepínání paměti (stránkování paměti) vypínány
ev. zapínány. Protože CPU je adresovatelný pouze na 64k bytů
je toto přepínání nezbytností. Normálně se toto provádí pomocí
určitých povelů IN a OUT. Důležité je, že program pro přepínání
paměti nesmí být v té oblasti kde se přepínání provádí. Výsledek
by zpravidla bylo zhroucení programu. Nyní se podívejme
co jednotlivé povely IN a OUT způsobují:
a) OUT (CEH),A
Jestliže byla předtím do akumulátoru vložena hodnota 8H,
přepne se MZ-800 do módu MZ-700. Při uložení jiných hodnot
v akumulátoru (možno pouze 0 až 7) přepne se MZ-800 do specifického grafického módu. K tomu blíže v kapitole o grafice.
b) OUT (E0H),A
Při tomto povelu OUT se oblast paměti 0000H-8000H přepne jako
RAM. Zbytek paměti se nezmění.
c) OUT (E1H),A
Zde jsou opět dva módy:
1) MZ-700 mód (přes LD A,8H OUT (CEH),A)
Oblast od D000H do FFFFH se zapojí jako RAM.
2) MZ-800 mód
Oblast od E000H do FFFFH se zapojí jako RAM.
d) OUT (E2H),A
Oblast od 0000H do FFFFH se zapojí jako RAM.
e) OUT (E3H),A
1) MZ-700 mód
Oblast od D000H do DFFFH se zapojí jako VRAM.
Aktivuje se horní monitor od E000H do FFFFH.
2) MZ-800 mód
Aktivuje se pouze horní monitor ROM.
f) OUT (E4H),A
1) MZ-700 mód
Oblasti 0000H-1000H a E000H-FFFFH se zapojí jako ROM.
Aktivuje se VRAM od D000H do DFFFH. Tento mód odpovídá módu
MZ-80 K.
2) MZ-800 mód
Oblasti 0000H-1000H a E000H-FFFFH se zapojí jako ROM.
Oblast od 1000H do 1FFFH se aktivuje jako CGROM.
Aktivuje se vysoká rozlišitelnost VRAM od 8000H nahoru
(podle rozšíření grafické paměti). Zbytek paměti je RAM.
g) OUT (E5H),A
Jako OUT (E1H),A ale příslušná oblast se zcela odpojí.
h) OUT (E6H),A
Jako OUT (E5H),A , ale návrat ke stavu před zabráněním přístupu.
i) IN A,(E0H)
Aktivuje uvnitř OUT (E4H) módu grafiku.
j) IN A,(E1H)
Vypíná grafiku uvnitř OUT (E4H) módu.
Nyní bychom k tomuto chtěli uvést příklad.ROM Monitor
MZ-800 má být přemístěn z ROM do paralelní RAM. Potom budeme mít
software monitor, který můžeme libovolně měnit.
Nejprve program:
1200 21 00 00 LD HL,0000H ;počáteční adresa ROM
monitoru
1203 11 00 20 LD DE,2000H ;volná oblast v paměti
1026 01 00 10 LD BC,1000H ;délka ROM monitoru
1209 E5 PUSH HL ;zachraň HL
120A C5 PUSH BC ; " BC
120B D5 PUSH DE ; " DE
120C ED B0 LDIR ;přenos do volné paměti
120E E1 POP HL ;HL=2000H
120F C1 POP BC ;BC=1000H
1210 D1 POP DE ;DE=0000H
1211 D3 E0 OUT (E0H),A ;zapoj oblast
0000H-1000H jako RAM
1213 ED B0 LDIR ;přenes do RAM monitor
1215 C3 AD 00 JP 00ADH ;horký start RAM monitoru
Pro vysvětlení. Nejprve přeneseme ROM monitor, který leží v oblasti
od 0000H-1000H do volné oblasti paměti od adresy 2000H. Potom
zapojíme oblast od 0000H do 1000H jako RAM a přeneseme sem program
ROM monitoru a odstartujeme ho. Je těžké uvnitř oblasti 0000H-1000H a E000H-FFFFh, když
jsou tyto zapojeny jako RAM vyvolat podprogramy jako 0015H,
protože tyto podprogramy potřebují mód provozního systému MZ-80 K.
Musí se buď upravit software nebo vytvořit specielní podprogramy. Mimochodem
můžete, chcete-li, manipulovat pouze s RAM monitorem.
Každou buňku paměti v oblasti 0000H-1000H můžete změnit M-povelem.