    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