24/8-Bit-Divisionsroutine ($ce71)
[Der Vergleich mit dem 1541-ROM lohnt sich ...]
Einsprung von $8C8C:
8D06: A9 FE LDA #$FE x/254 (Sektorlaenge)
8D08: 2C B $2C
Einsprung von $8C93:
8D09: A9 78 LDA #$78 x/120 (Blocks pro Side-Sektor)
8D0B: 2C B $2C
Einsprung von $8CB4:
8D0C: A9 06 LDA #$06 x/6 (Side-Sektoren pro Gruppe)
E: $5b-$5d: Divident
a : Divisor
A: $5b-$5d: Quotient
$60 : Rest
8D0E: 85 40 STA $40 <-- (x/a)
8D10: A9 00 LDA #$00 9-Bit Rest-Register loeschen
8D12: 85 60 STA $60
8D14: 85 61 STA $61
8D16: A2 18 LDX #$18 (24-Bit)
Einsprung von $8D35:
8D18: 06 5B ASL $5B Divident ins Restregister schieben
8D1A: 26 5C ROL $5C [Der Divident wird so lange in das
8D1C: 26 5D ROL $5D Rest-Register geschoben (Hi-Bit voran),
8D1E: 26 60 ROL $60 bis der Inhalt des Rest-Registers
8D20: 26 61 ROL $61 mindestens so gross ist wie der Divisor.
8D22: A5 60 LDA $60 In diesem Fall wird dann der Divisor vom
8D24: 38 SEC Rest-Register abgezogen und das ent-
8D25: E5 40 SBC $40 sprechende Bit im Ergebnisspeicher ge-
8D27: A8 TAY setzt. Um drei Shift-Befehle zu sparen,
8D28: A5 61 LDA $61 werden Divident und Quotient im selben
8D2A: E9 00 SBC #$00 Register gespeichert.]
8D2C: 90 06 BCC $8D34 Rest gross genug (>=Divisor) ?
8D2E: E6 5B INC $5B ja, Bit im Ergebnis setzen (B0 war ja 0)
8D30: 85 61 STA $61 Restregister setzen
8D32: 84 60 STY $60 [Bei einer Division durch 0 werden alle
Einsprung von $8D2C:
8D34: CA DEX Bits des Ergebnisses =1 und der Rest ist
8D35: D0 E1 BNE $8D18 gleich den zwei niederwertigen Bytes des
8D37: 60 RTS Dividenden.]
Previous Page / Next Page