Násobička MH 102 v PP 01

Vlákno pre PMD85, PP01, Ondra, Maťo a ďalšie, ZX Spectrum nekompatibilné
Správa
Autor
Užívateľov profilový obrázok
rombor
Príspevky: 30
Dátum registrácie: Ut Okt 08, 2013 1:28 pm

Násobička MH 102 v PP 01

#1 Príspevok od užívateľa rombor » Ne Jan 28, 2018 10:50 am

PP 01 je pozoruhodný 8-bitový mikropočítač a jednou z jeho zaujímavostí je práve hardvérová násobička MH 102. 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ý.

Zvedavosť mi nedala, zaobstaral som si MH 102 a osadil ho do svojho PP 01. Mojím prekvapením bolo, že násobička násobila správne iba čísla bez znamienka. V režime násobenia so znamienkom to vracalo nepochopiteľné hodnoty.
Automaticky som predpokladal, ž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 mikezt prišiel s domnienkou, či to nie je ozaj tak, ž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. To sa ukázalo ako pravda a možno to už teraz neprekvapí, aj výsledok 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, ktoré 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:
  • 0D8h - I/O - dolný byte výsledku / prvý činiteľ
  • 0D9h - I/O - horný byte výsledku / druhý činiteľ
  • 0DAh - I/O - dolný byte výsledku so znamienkom / prvý činiteľ so znamienkom
  • 0DBh - I/O - horný byte výsledku so znamienkom / druhý činiteľ so znamienkom

Kód: Vybrať všetko

;------------------------------------------------------------------------------
; 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, 65535>
; 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 MH 102 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 MH 102 prakticky neujala. Aspoň neviem o tom, že by sa niekde reálne využívala.

Pre zaujímavosť, MH 102 má "svoje miesto" aj na DPS IQ 151 vo verzii G, ale ani tam nebola, pokiaľ viem, nikdy reálne osadená.

Napísať odpoveď