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.