Das würde ich zu den grundlegenden Sachen zählen...
Bei dem angesprochenen "16bit Unsigned + 16 Bit Signed => 16bit Unsigned Saturating" muss man schon mit zwei Status-Bits jonglieren. (Es sei denn ich hab beim Proggen mal wieder zu kompliziert gedacht...)
Edit: Hab mich vertan. Es muss heißen "16bit Unsigned - 16 Bit Unsigned => 16bit Signed Saturating"
(Edit2: Gibt natürlich keien Garantie auf Funktionsfähigkeit, hab's noch nicht ausführlich getestet)
Erklärung: Am Anfang wird erstmal einfach eine 16bit-Subtraktion ausgeführt. Der zweite Teil prüft erstmal über das Carry-Bit, ob ein positiver oder ein negativer Wert rauskommen müsste (Carry gesetzt => Wert 2 größer als Wert 1 => negativer Wert müsste rauskommen, andersrum das gleiche). Je nachdem ob das Carry-Bit gesetzt ist oder nicht, wird entweder im oberen Teil weitergemacht oder es wird zum unteren Teil gesprungen. Da wird jeweils getestet, welches Vorzeichen das Ergebnis hat. Wenn das Carry nicht gesetzt ist und das Negative-Flag gesetzt ist, dann fand ein Überlauf in positiver Richtung statt und das Ergebnis wird auf 0x7FFF gesetzt. Wenn das Carry gesetzt ist, aber das Negative-Flag nicht gesetzt ist, fand ein Überlauf in negativer Richtung statt, und das Ergebnis wird auf 0x8000 gesetzt.Code:sub low1, low2 sbc high1, high2 brcs carrySet brpl end ldi low1, 0xFF ldi high1, 0x7F rjmp end carrySet: brmi end ldi low1, 0x00 ldi high1, 0x80 end
Sowas meinte ich halt.![]()







Zitieren

Lesezeichen