Jag börjar denna något flummiga tråd med en ide' jag fått som härstammar från en annan tråd där jag hävdat att vi behöver sansa oss vad gäller den pågående datainvecklingen och inse att under gynnsamma förutsättningar räcker en 32-bitars CPU mer än väl.
Jag har kallat denna CPU för Folk-CPU.
Det är en CPU som är och förblir en 32-bitars för "all" framtid.
Jag har preliminärt tänkt bygga en sådan CPU i FPGA-teknologi.
I bagaget har jag en åtminstone delvis fungerande CPU som jag byggt i den något mindre lämpade CPLD-teknologin.
Jag har tänkt utveckla denna mycket enkla CPU, som liknar en Motorola 6809 (om än asmycket dyrare och sämre
![Very Happy :D](./images/smilies/biggrin.gif)
Jag har dock ett litet problem.
Den kan inte MUL/DIV.
Den kan bara aritmetiskt R/L-skift och då utan sparande av utskiftad bit (dvs Booth-algoritmen för MUL fungerar inte).
Men idag blev jag att tänka på nåt kul.
Vi människor räknar i praktiken aldrig exakt.
Vi gör mest överslagsberäkningar, eller hur?
Så när nu vänsterskift betyder multiplikation med multiplar om två och högerskift betyder division med multiplar om två så kan man låta datorn vara "lika" skicklig på överslagsberäkningar som oss människor.
Dvs MUL/DIV behöver aldrig hårdvarumässigt implementeras!
Låt oss titta på hur fel det kan bli:
Säg att vi vill multiplicera med tre. Vi kan då ta 2 eller 4. Två ger -33% fel, fyra ger +33% fel.
Säg sen att vi vill multiplicera med 750. Vi kan då ta 512 eller 1024. 512 ger -32% fel, 1024 ger +37%
I det andra fallet väljer man naturligtvis 512 och då är det relativa felet dom båda extrema fallen emellan mer eller mindre konstant!
I det absoluta fallet blir naturligtvis felen "värre" ju större talen är men detta är ju mest intressant när det gäller ens egna pengar
![Very Happy :D](./images/smilies/biggrin.gif)
Den mycket intressanta frågan är nu hur långt man kan komma med detta?
För hur ofta i den folkliga datavärlden måste man ta till exakta olinjära operationer som MUL/DIV?
Please educate me!
MVH/Roger
PS
Så här skulle kanske ett Assemblerprogram kunna se ut:
m X r, r->Acc A
m=multiplicand, r=multiplier
LDA r
Start: CMP #0 (Acc-Memory)
BMI $"r<0"
LDA r
CMP #2
BPL $"r>2"
LDA m
ASL
JMP $Break
$"r>2" LDA r
CMP #4
BPL $"r>4"
-
-
-
$"r<0" LDA r
NEGA
STA $r
JMP Start
$Break ...