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)
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
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.
Sowas meinte ich halt.
Lesezeichen