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

Add new attachment

Only authorized users are allowed to upload new attachments.
« This page (revision-5) was last changed on 02-Jan-2011 13:22 by Carsten Strotmann