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 |