Integer Math for 6502#



00010          .LI OFF
00030 * RECHENROUTINEN FUER GANZZAHLEN
00040 *
00050 *
00060 *
00070 *
00080 *
00090 *
00100 MLPCND   .EQ $D0
00110 MLPLER   .EQ $D1
00120 PROD     .EQ $D2
00130 *
00140 DVDND    .EQ $D4
00150 DVSOR    .EQ $D6
00160 RMNDR    .EQ $D8
00170 *
00180 RADCND   .EQ $DA
00190 ROOT     .EQ $DC
00200 TEMP     .EQ $DE
00210 SIGN     .EQ $DF
00220 *
00230 *
00240 *
00250 *
00260 *
00270 *
00280 SQUARE   LDA MLPCND    Multiplikant
00290          BPL POSITIV   =|MLPCND|
00300          SEC           Multiplikator
00310          LDA #$0
00320          SBC MLPCND
00330          STA MLPCND
00340 POSITIV  STA MLPLER
00350 *
00360 MULT     LDA #0
00370          LDX #8        8 Bits
00380 MLOOP    LSR MLPLER    Multiplikator/2
00390          BCC NOADD     Bit=0
00400          CLC           addiere
00410          ADC MLPCND    Multiplikanten
00420 NOADD    ROR           schiebe Bits
00430          ROR PROD      ins Produktregister
00440          DEX           Naechstes
00450          BNE MLOOP     Bit
00460          STA PROD+1    MSB Produkt
00470          RTS
00480 ------------------------------
00490 MULTV    LDA MLPCND    Vorzeichen
00500          EOR MLPLER    des Produktes
00510          AND #$80      bestimmen
00520          STA SIGN
00530          LDX #MLPCND   Berechnung
00540          JSR ABS8      von
00550          LDX #MLPLER   |MLPLER|*|MLPCND|
00560          JSR ABS8
00570          JSR MULT
00580          LDA SIGN      Ergebnis
00590          BPL .1        positiv?
00600          LDX #PROD     Vorzeichen des
00610          JSR CHS16     Produktes aendern
00620 .1       RTS
00630 ------------------------------
00640 ABS8     LDA $0,X      Absolutwert einer 8 Bit Zahl
00650          BPL AO        Zahl Positiv
00660 CHS8     LDA #0        Vorzeichen aendern
00670          SEC
00680          SBC $0,X
00690          STA $0,X
00700 AO       RTS
00710 *
00720 ABS16    LDA $1,X      Wie ABS8 Jedoch fuer 16 Bit Zahl
00730          BPL AO
00740 CHS16    JSR CHS8      Wie CHS8
00750          LDA #0
00760          SBC $1,X
00770          STA $1,X
00780          RTS
00790 ------------------------------
00800 DIVIDEV  LDA DVDND+1   Vorzeichen des
00810          EOR DVSOR+1   Quotienten
00820          AND #$80      bestimmen
00830          STA SIGN
00840          LDX #DVDND    Berechnung
00850          JSR ABS16     des Quotienten
00860          LDX #DVSOR    aus |DVDND|/|DVSOR|
00870          JSR ABS16
00880          JSR DIVIDE
00890          BCS .1        Division durch Null?
00900          LDA SIGN      Vorzeichen
00910          BPL .1        aendern wenn
00920          LDX #DVDND    Ergebnis
00930          JSR CHS16     negativ sein muss
00940          CLC
00950 .1       RTS
00960 ------------------------------
00970 DIVIDE   LDA DVSOR     Divisor=0
00980          ORA DVSOR+1   dann Error
00990          BNE DIVOK
01000          SEC
01010          RTS
01020 *
01030 DIVOK    LDA #$00      Werte vorbesetzen
01040          STA RMNDR
01050          STA RMNDR+1
01060 *
01070          LDX #$10      16 Bit
01080 DLOOP    ROL DVDND     Bit von DVDND nach
01090          ROL DVDND+1
01100          ROL RMNDR     RMNDR
01110          ROL RMNDR+1   schieben
01120          SEC
01130          LDA RMNDR     Wenn RMNDR-DVSOR>=0
01140          SBC DVSOR     dann
01150          TAY           RMNDR=
01160          LDA RMNDR+1   RMNDR-DVSOR
01170          SBC DVSOR+1
01180          BCC DECCNT
01190          STY RMNDR
01200          STA RMNDR+1
01210 DECCNT   DEX           Naechstes Bit
01220          BNE DLOOP
01221 *
01230          ROL DVDND     Anschaetzung
01240          ROL DVDND+1   fuer
01250          ASL RMNDR     Rundung
01260          ROL RMNDR+1
01270          BCS ROUND
01280          SEC
01290          LDA DVSOR
01300          SBC RMNDR
01310          LDA DVSOR+1
01320          SBC RMNDR+1
01330          BCS NOCHNG
01340 ROUND    INC DVDND     Ergebnis
01350          BNE NOCHNG    steht in
01360          INC DVDND+1   DVDND
01370 NOCHNG   CLC           No Error
01380          RTS
01390 *
01400 ------------------------------
01410 *
01420 SQRT     LDX #$8       Berechnung
01430          LDA #0        der Qudrat-
01440          STA ROOT      wurzel einer
01450          STA ROOT+1    16 Bit Zahl
01460          STA TEMP      Nach dem
01470          STA TEMP+1    Newton-
01480 SQRT1    ASL ROOT      Verfahren
01490          ROL ROOT+1
01500          INC ROOT
01510          BNE NEXT1
01520          INC ROOT+1
01530 NEXT1    ASL RADCND
01540          ROL RADCND+1
01550          ROL TEMP
01560          ROL TEMP+1
01570          ASL RADCND
01580          ROL RADCND+1
01590          ROL TEMP
01600          ROL TEMP+1
01610          SEC
01620          LDA TEMP
01630          SBC ROOT
01640          TAY
01650          LDA TEMP+1
01660          SBC ROOT+1
01670          BCC RESTOR
01680          STA TEMP+1
01690          STY TEMP
01700          INC ROOT
01710          BNE NEXT2
01720          INC ROOT+1
01730 NEXT2    DEX
01740          BNE SQRT1
01750          JMP FINIS
01760 RESTOR   SEC
01770          LDA ROOT
01780          SBC #1
01790          STA ROOT
01800          BCS NEXT3
01810          DEC ROOT+1
01820 NEXT3    DEX
01830          BNE SQRT1
01840 FINIS    ROR ROOT+1
01850          ROR ROOT
01860          RTS
01870 *
01880 WURZEL   LDA RADCND+1  Einsprung
01890          BMI WERR      in Wurzel-
01891          JSR SQRT      Routine
01900          JSR SQRT
01910          CLC           wenn
01920          RTS           Radikant positiv
01930 WERR     SEC           sonst Error
01940          RTS