Und kurz ontopic:
Die schnellste mir bekannte Methode zur genauen 16/8-Division sieht ungefähr so aus (nicht geprüft, aber sollte funktionieren):
Code
- ; d1 / d0 ==> Y = High, A = Low
- lda d1 + 1
- ldy #0 ; Ergebnis High mit 0 vorbeladen
- cmp d0 ; Ist Highbyte < Divisor?
- bcc ?29 ; überspringe den ersten Divisionsteil
- tya ; A := 0
- asl d1 + 1 ; Schiebe erstes Bit in den Akku
- rol ; C wird hier nie gesetzt, da 1) A mit 0 geladen und 2) Highbyte >= Divisor ist
- cmp d0 ; daher kann hier auf ein Test auf gesetztes Carry verzichtet werden.
- bcc ?21
- sbc d0
- ?21: rol d1 + 1
- rol
- cmp d0
- bcc ?22
- sbc d0
- ?22: rol d1 + 1
- [..]
- ?27: rol d1 + 1
- rol
- cmp d0
- bcc ?28
- sbc d0
- ?28: rol d1 + 1
- ldy d1 + 1 ; lade Ergebnis High nach Y
- ?29:
- asl d1 ; nun dividiere Lowbyte zusammen mit MOD-Rest
- rol
- bcs ?31 ; Hier ist ein Test auf Carry notwendig
- cmp d0
- bcc ?32
- ?31: sbc d0
- sec
- ?32: rol d1
- [..]
- ?44: rol d1
- rol
- bcs ?45
- cmp d0
- ; bcc ?46 ; die letzten 3 Befehle sind nicht mehr notwendig
- ?45:; sbc d0
- ; sec
- ?46: rol d1
- lda d1 ; Low-Ergebnis nach A
- rts