Osadená násobička MH102
Foto: RomBor

MH102 - hardvérová násobička

Jednou zo zaujímavostí PP 01 je hardvérová násobička MH102. Paradoxne, aj keď je pre ňu na DPS miesto, tak sa vôbec neosadzovala. Dokonca v zachovaných schémach je tento obvod zakreslený veľmi nejasne a je preškrtnutý.

Po osadení MH102 bolo dosť neočakávaným prekvapením, že násobička násobila správne iba čísla bez znamienka. V režime násobenia so znamienkom to vracalo nepochopiteľné hodnoty.

Automatickým predpokladom bolo, že sa hodnoty zadávajú v doplnkovom kóde, ale výsledky tomu nezodpovedali. Katalógový list popisuje znamienkové čísla ako 7. bitové so znamienkom v najvyššom 8. bite, čo znie podozrivo. Nakoniec sa ukázalo, že v dolných 7. bitoch je číslo v intervale <0, 127> a v najvyššom bite je znamienko, čo zodpovedá tzv. priamemu kódu. Výsledok násobenia je kódovaný rovnako. Je pochopiteľne v dvoch bytoch, ale nie je uložený ako "súvislý" WORD, ale oba byty majú najvyšší bit znamienkový a 7 bitov, ako platnú hodnotu. Ak sú obe vstupné čísla kladné alebo obe záporné, tak obe výsledné hodnoty majú najvyššie bity vynulované. Ak je iba jedno z čísel záporné, tak obe výsledné hodnoty majú najvyššie bity nastavené. Z toho plynie, že rozsah znamienkových hodnôt je v intervale <-127, 127> a existuje kladná aj záporná 0, obe sú pochopiteľne "zameniteľné".


Pri násobení so znamienkom je teda treba najprv vstupné hodnoty transformovať z doplnkového kódu na priamy a výsledok naopak z priameho kódu na doplnkový. Žiaľ, -128 v doplnkovom kóde bude v priamom kóde reprezentované, ako (záporná) nula.

V PP 01 je násobička zavesená na štyroch portoch:

Port Zápis Čítanie
0D8h prvý činiteľ nižší byte výsledku
0D9h druhý činiteľ vyšší byte výsledku
0DAh prvý činiteľ so znamienkom nižší byte výsledku so znamienkom
0DBh druhý činiteľ so znamienkom vyšší byte výsledku so znamienkom

; Vynásobenie dvoch 8. bitových čísel bez znamienka. ; I: B=1. činiteľ, C=2. činiteľ ; - obe čísla sú bez-znamienkové: <0, 255> ; HL=výsledok: <0, 65025> ; O: HL, PSW UnsignedMul: mov a,c ; 1. činiteľ out 0D8h mov a,b ; 2. činiteľ out 0D9h in 0D8h ; nižší byte výsledku mov l,a ; do L in 0D9h ; vyšší byte výsledku mov h,a ; do H ret ; Vynásobenie dvoch 7 bitových čísel so znamienkom. ; I: B=1. činiteľ, C=2. činiteľ - obe čísla sa transformujú do priameho kódu ; so znamienkom v 7. bite: <-127, 127> ; HL=výsledok - v doplnkovom kóde: <-16129, 16129> ; O: HL, PSW SignedMul: mov a,c ; 1. činiteľ ora a jp SignedMul1 ; kladné číslo bez zmeny cma ; neguj číslo v doplnkovom kóde inr a ori 80h ; a pridaj znamienko v priamom kóde SignedMul1: out 0DAh mov a,b ; 2. činiteľ jp SignedMul2 cma ; neguj číslo v doplnkovom kóde inr a ori 80h ; a pridaj znamienko v priamom kóde SignedMul2: out 0DBh ; výsledok je opäť v priamom kóde a transformuje sa do doplnkového in 0DAh ; nižší byte vysledku rlc ; znamienko do 0. bitu mov l,a ; ulož zatiaľ do L in 0DBh ; vyšší byte výsledku ani 7Fh ; zruš znamienko rar ; najnižší bit H do CY mov h,a ; hotový vyšši byte mov a,l ; nižší byte rar ; pridaj najvyšší bit, CY = znamienko mov l,a ; hotový nižší byte rnc ; ihneď sa vráť pre kladné číslo cma ; zneguj číslo mov l,a mov a,h cma mov h,a inx h ret

Pre čísla bez znamienka môže byť použitie hardvérovej násobičky zaujímavé, keďže sa môžu ušetriť desiatky (podľa brata stovky) taktov. Avšak použitie priameho kódu v MH102 pre čísla so znamienkom zabíja dobrý nápad a komplikuje a predlžuje výpočet. Možno aj to bol dôvod, prečo sa MH102 prakticky neujala. Aspoň nie je známe, že by sa niekde reálne využívala.