Wenn man var1 weiter verwenden will, kann man auch ohne Zwischenspeichern von var1 rechnen. Der eigentliche "Divisions-Loop" läuft ohne Zwischenspeichern schneller. (Samt Initialisierung der Division komme ich mit Variablen außerhalb der Zero Page auf 367 statt 942 cycles; z.B. braucht INX nur 2 cycles, INC 5-6; wenn man nicht damit rechnet, dass die Division meist ein Ergebnis von 1 oder 2 hat, dann rechnet es sich auch dann, wenn man X sichern muss).
Wenn man den Rest der Division haben will (var1 modulo var2) dann kann man bei beiden Verfahren am Ende var1 wieder addieren und hat den Rest dann im Akkumulator.
Beim Beispiel oben müsste man noch darauf achten, dass var3 initialisiert wird, weil die Subroutine sonst bei jedem Aufruf weiterzählt.
Code: Alles auswählen
lp1
ldx #$ff
sec
lda var1
loop
inx
sbc var2
bcs loop
stx var3
weiter
adc var2 ; optional
; macht die letzte Subtraktion, mit der man unter 0 gekommen ist, wieder rückgängig
; und hinterlässt den Divisionsrest im Akkumulator
rts
.endp
(X wird auf #$FF initialisiert, damit es beim ersten Durchlaufen des Loops auf 0 gesetzt wird. Würde man das INX nach dem SBC setzen, dann würde es auch hochzählen, wenn man mit dem SBC unter 0 kommt und das Ergebnis wäre eins zu hoch.)
Fürs Cycle-Zählen habe ich übrigens den Online-Assembler auf
masswerk.at verwendet.
Das 1:1-Übertragen aus BASIC birgt mE das Risiko, dass man in Assembler mögliche Vereinfachungen (wie das Zählen mit X oder Y) leichter übersieht.