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