Organizátor pamäte

PP 01 má oproti vtedajším "domácim" 8 bitovým počítačom veľmi neobvyklú architektúru a zatiaľčo napríklad mali počítače bežne vyvedenú priamo samotnú zbernicu CPU, tak PP 01, ako počítač rodiny SMEP, má vyvedenú (redukovanú a prispôsobenú) systémovú zbernicu I41, čo je RVHP klon zbernice Intel Multibus. Ďalšou zaujímavosťou PP 01 je organizácia pamäťového priestoru, ktorý je riadený tzv. Organizátorom pamäte (OP).

OP transformuje 16 bitovú logickú adresu CPU na 20 bitovú fyzickú adresu. To znamená, že PP 01 môže adresovať celkom 1 MB pamäte. Z tohto 1 MB je však určitá časť vyhradená pre internú pamäť ROM a RAM a zbytok môže byť obsadený prostredníctvom systémovej zbernice I41.

64 kB adresný priestor CPU je rozdelený na 16 segmentov po 4 kB. Do každého z týchto segmentov možno priradiť ľubovoľný z 256 blokov fyzickej pamäte. Jeden blok má samozrejme veľkosť 4 kB (256 x 4 kB = 1 MB). Priradenie bloku do segmentu sa robí zápisom na príslušný port OP - 0E0h-0EFh (adresy sa zrkadlia aj na 0F0h-0FFh, používajú sa však iba základné adresy). Zapísanú hodnotu registra možno prečítať, prečítaná hodnota je však inverzná.

Port Adresný rozsah CPU
0E0h (0F0h) 00000h až 00FFFh
0E1h (0F1h) 01000h až 01FFFh
0E2h (0F2h) 02000h až 02FFFh
0E3h (0F3h) 03000h až 03FFFh
0E4h (0F4h) 04000h až 04FFFh
0E5h (0F5h) 05000h až 05FFFh
0E6h (0F6h) 06000h až 06FFFh
0E7h (0F7h) 07000h až 07FFFh
Port Adresný rozsah CPU
0E8h (0F8h) 08000h až 08FFFh
0E9h (0F9h) 09000h až 09FFFh
0EAh (0FAh) 0A000h až 0AFFFh
0EBh (0FBh) 0B000h až 0BFFFh
0ECh (0FCh) 0C000h až 0CFFFh
0EDh (0FDh) 0D000h až 0DFFFh
0EEh (0FEh) 0E000h až 0EFFFh
0EFh (0FFh) 0F000h až 0FFFFh

Keď CPU vystaví adresu na adresovú zbernicu A15-A0, tak bity A15-A12 určujú číslo registra OP, z ktorého sa vezme číslo bloku a to bude predstavovať horné bity A19-A12 fyzickej adresy. Adresné bity A11-A0 CPU určujú adresu v danom 4 kB bloku a sú teda zhodné aj vo fyzickej adrese.
Symbolicky: RXXX → BBXXX - kde R je 4-bitové číslo registra OP, BB je 8-bitové číslo bloku zapísané v danom registri a XXX je 12-bitová adresa v rámci 4 kB bloku.

Čísla blokov sú pevne priradené konkrétnej oblasti a typu pamäte a sú uvedené v nasledujúcej tabuľke. 24 kB z vnútornej RAM (6 blokov) okupuje VideoRAM. Stále 2 bloky tvoria jeden Bitplan VideoRAM.

Číslo bloku Fyzická adresa Priradenie
00h
...
0DFh
00XXXh
...
0DFXXXh
Priestor prístupný cez zbernicu I41 - 896 kB
0E0h
...
0EFh
0E0XXXh
...
0EFXXXh
Vnútorná RAM 64 kB (zahŕňa aj VideoRAM)
0F0h
...
0F7h
0F0XXXh
...
0F7XXXh
Priestor prístupný cez zbernicu I41 - 32 kB
0F8h
0F9h
0FAh
0FBh
0F8XXXh
0F9XXXh
0FAXXXh
0FBXXXh
Externý ROM Modul 16 kB
0FCh
0FDh
0FEh
0FFh
0FCXXXh
0FDXXXh
0FEXXXh
0FFXXXh
Vnútorná ROM 16 kB (GBASIC)
Bloky VideoRAM
Číslo bloku Bitplan VideoRAM
0E6h
0E7h
bitplan "R"
0EAh
0EBh
bitplan "G"
0EEh
0EFh
bitplan "B"

Po pripojení napájania (resete) je obsah registrov OP nedefinovaný a preto je OP odpojený. Vďaka zdvíhacím (pull-up) odporom je na výstupe OP hodnota 0FFh, teda posledný blok vnútornej ROM. Prakticky je tak po resete tento blok zrkadlený v celom adresnom priestore, a čo je dôležité, začína od adresy 0000h, ktorej hodnota je aj v registri PC CPU po resete. To znamená, že v tejto časti ROM musí byť inicializačný kód, ktorý jednak predpripraví vhodné bloky do registrov OP a zároveň OP aktivuje.

Aktivácia OP sa robí inštrukciou IN alebo OUT na niektorú z IO adries 0D8h-0DBh (systém používa OUT 0D8h). K aktiváci dôjde ihneď po vykonaní inštrukcie, takže v tomto okamihu už musia byť zadefinované aspoň tie registre, kde bude bežať nasledujúci kód. Zmena v registroch OP sa môže samozrejme vykonávať aj po aktivácii OP, len je treba dávať pozor napr. na to, aby zmena nenastala v mieste, kde práve beží samotný kód alebo tam, kde je práve zásobník.

Po resete si GBASIC inicializuje OP a rozloženie pamäte takto:

Adresa Port OP Číslo bloku Význam
0000h 0E0h 0E0h Vnútorná RAM
1000h 0E1h 0E1h Vnútorná RAM
2000h 0E2h 0E2h Vnútorná RAM
3000h 0E3h 0E3h Vnútorná RAM
4000h 0E4h 0E4h Vnútorná RAM
5000h 0E5h 0E5h Vnútorná RAM
6000h 0E6h 0ECh Vnútorná RAM
7000h 0E7h 0EDh Vnútorná RAM
8000h 0E8h 0E8h Vnútorná RAM
9000h 0E9h 0E9h Vnútorná RAM
0A000h 0EAh 0EAh VideoRAM Bitplan "G"
0B000h 0EBh 0EBh VideoRAM Bitplan "G"
0C000h 0ECh 0FCh Vnútorná ROM
0D000h 0EDh 0FDh Vnútorná ROM
0E000h 0EEh 0FEh Vnútorná ROM
0F000h 0EFh 0FFh Vnútorná ROM

Pre zaujímavosť, inicializácia v GBASICu vyzerá takto:

;------------------------------------------------------------------------------ ; Studený štart. ; Ak nie je organizátor pamäte aktivovaný, do všetkých segmentov je "vnútená" ; pomocou pull-up odporov hodnota 0FFh, čo znamená, že sú od adresy 0000h ; namapované posledné 4 kB ROM a teda aj nasledujúci kód, ktorý uvádza túto ; čast ROM. ColdStart: mvi a,0FCh ; od 0C000h prvé 4 kB ROM out MemOrgC mvi a,0FFh ; od 0000h posledné 4 kB ROM out MemOrg0 out MemOrgOn ; aktivuj organizátor pamäte jmp ColdStartCont ; skoč na pokračovanie studeného štartu ... ColdStartCont: mvi a,82h ; Sys8255 - SK A: MOD 0, A-OUT, CH-OUT out SysPIO ; SK B: MOD 0, B-IN, CL-OUT in KbdState ; získaj stav 0. stĺpca klávesnice mov b,a ; a odpamätaj do B na neskôr lxi sp,Stack ; nastav zásobník mvi a,92h ; PIO8255 - SK A: MOD 0, A-IN, CH-OUT out PioCWR ; SK B: MOD 0, B-IN, CL-OUT mvi a,10h ; nastav budič na porte A na vstup out PioC mvi a,0F0h ; inicializácia radiča prerušenia out IcuCtrl mvi a,0FFh ; od 0F000h posledné 4 kB ROM out MemOrgF dcr a ; od 0E000h 3. 4 kB ROM out MemOrgE dcr a ; od 0D000h 2. 4 kB ROM out MemOrgD mvi a,0EBh ; VRAM-G od 0A000h do 0BFFFh out MemOrgB dcr a out MemOrgA dcr a ; RAM-9 od 9000h out MemOrg9 dcr a ; RAM-8 od 8000h out MemOrg8 mvi a,0EDh ; RAM-13 od 7000h out MemOrg7 dcr a ; RAM-12 od 6000h out MemOrg6 mvi a,0E5h ; RAM-5 od 5000h out MemOrg5 dcr a ; RAM-4 od 4000h out MemOrg4 dcr a ; RAM-3 od 3000h out MemOrg3 dcr a ; RAM-2 od 2000h out MemOrg2 dcr a ; RAM-1 od 1000h out MemOrg1 dcr a ; RAM-0 od 0000h out MemOrg0 call InitCT2 ; init časovača CT2 - hodiny pre USART ...