Muss ich wirklich das ganze Rundungsbyte zusammennudeln, obwohl mich nur das höchste Bit interessiert?
Nein, das ist nicht nötig. Im Akku steht nach Ausführung der Routine der Rest und Du mußt nur nachprüfen, ob der Rest >= Divisor/2 ist. Die dazu nötige Nachbehandlung sieht wie folgt aus:
[...]
ASL A
BCS round
CMP #$07
BCC skip
.round
;SBC #$07
INC zp
BNE skip
INC zp+1
BNE skip
INC zp+2
.skip
Alles anzeigen
Statt #$07 geht auch wieder ein variabler Wert, der muß dann natürlich der gleiche sein wie in der vorgelagerten Integer-Division. Statt Richtung Null bzw. nach unten abzuschneiden, rundet die erweiterte Routine jetzt zum nächstgelegenen Wert. Der SBC-Befehl kann entfallen, wenn der Rest im Programm weiter nicht verwendet wird.
Ob das Runden jetzt notwendig oder sinnvoll ist, hängt vom Anwendungsfall ab. Bei vielen Geometrie-Algorithmen wird z.B. konstant nach unten gerundet und ggfs. vorher die Eingangsdaten so vorbehandelt, daß das Ergebnis stimmig aussieht. Richtig konkret fällt einem das auf, wenn man z.B. perspektivisch korrektes Texture-Mapping macht: da willst Du die berechneten Textur-Koordinaten immer nur nach unten runden, da Du sonst an zwei Rändern des projizierten Vierecks aus der Textur grob 'herausfällst'.
Du solltest dir auch noch überlegen, was Du mit vorzeichenbehafteten Zahlen machst.
Gerade da wird die gerundete Version tendenziell eher lästig. Mit der Version, die Richtung 0 rundet, kannst Du im 2-Komplement die Berechung und die Vorzeichen immer so festlegen:
|Quotient| = |Dividend| / |Divisor|
sgn(Quotient) = sgn(Dividend) x sgn(Divisor)
sgn(Rest) = sgn(Dividend)
und es gilt immer(!): Dividend = Quotient x Divisor + Rest
mit |...| := Betrag und sgn(...) := Vorzeichen.
P.S. Du hast in Bitte melde dich an, um diesen Link zu sehen. am Anfang der Routine LDA #0 vergessen. Den Befehl kannst Du nicht einfach weglassen, sonst rechnet die Routine falsch!