1 ;ARRAY MATH FUNCTIONS 2 ;C RICHARD RICHMOND 3 ; 308 ROSEWOOD AVE. 4 ; SPRINGFIELD, OHIO 5 ; 45506 6 ; (513) 322-7650 10 ORG $CA58 20 :MEMFAC .EQ $BBA2 ;MEMORY TO FAC1 30 :FACMEM .EQ $BBD4 ;FAC1 TO MEMORY 40 :COMPAR .EQ $BC5B ;COMPARE MEMORY TO FAC1 80 :MEMPLU .EQ $B867 ;ADD MEMORY TO FAC1 90 :MEMMUL .EQ $BA28 ;MULT FAC1 BY MEMORY 100 :MEMSUB .EQ $B850 ;SUB FAC1 FROM MEMORY 110 :MEMDIV .EQ $BB0F ;DIVIDE FAC1 BY MEMORY 120 JMP :EQV ; A()=V 'STARTING ADDRESS 130 JMP :EQB ; A()=B() 'SA+3 140 JMP :PLV ; A()=A()+V 'SA+6 150 JMP :PLB ; A()=A()+B() 'SA+9 160 JMP :SBV ; A()=A()-V 'SA+12 170 JMP :SBB ; A()=A()-B() 'SA+15 180 JMP :MLV ; A()=A()*V 'SA+18 190 JMP :MLB ; A()=A()*B() 'SA+21 200 JMP :DVV ; A()=A()/V 'SA+24 210 JMP :DVB ; A()=A()/B() 'SA+27 220 JMP :BSV ; A()=V-A() 'SA+30 230 JMP :BSB ; A()=B()-B() 'SA+33 240 JMP :VDV ; A()=V/A() 'SA+36 250 JMP :VDB ; A()=B()/A() 'SA+39 260 JMP :MAX ; V=MAX(A()) 'SA+42 270 JMP :MIN ; V=MIN(A()) 'SA+45 275 JMP :SQUARE ; A()=A()^2 'SA+48 277 JMP :INSERT ; INSERT V AT A() 'SA+51 280 :DUMMY 290 .DS$0006 320 :ZPAGE 330 .DS $000D 340 :SZPAGE ; ROUTINE TO SAVE 350 LDY #$0C ; ZERO PAGE MEMORY 360 :SZ1 370 LDA $00BF,Y 380 STA :ZPAGE,Y 390 DEY 400 BPL :SZ1 410 RTS 420 :RESET ;ROUTINE TO RESET 430 LDY #$0C ;AERO PAGE MEMORY 440 :RESTOREZ 450 LDA :ZPAGE,Y 460 STA $00BF,Y 470 DEY 480 BPL :RESTOREZ 490 RTS ;EXIT 500 :STORE ;STORE FAC1 510 LDX $B5 ;TO MEMORY 520 LDY $B6 ; SPECIFIED AT 530 JSR :FACMEM ; $B5,$B6 540 RTS 550 :TEST1 ;THIS PORTION 560 LDA $B7 ;INCREMENTS THE 570 CLC ;SECOND ARRAY 580 ADC #$05 ;POINTERS BY 590 STA $B7 ;5 600 LDA $B8 610 ADC #$00 620 STA $B8 630 :TEST ;ROUTINE TO 640 LDA $B9 ;INCREMENT 650 CLC ;FIRST ARRAY 660 ADC #$05 ;POINTERS BY 670 STA $B9 ;5 680 LDA $BA 690 ADC #$00 700 STA $BA 710 :TEST2 ;AND CHECK 720 CMP $FC ;FOR THE END 730 BNE :CONT ;OF ARRAY 740 LDA $B9 750 CMP $FB 760 BNE :CONT 770 CLC 780 RTS 790 :CONT ;IF NOT TO END 800 SEC ;SET CARRY BIT 810 RTS 820 :EQV ;A()=V 830 JSR :SZPAGE ;STORE ZERO PAGE 840 JSR :MOD1 ;GET ADDRESSES 850 LDA $B7 ;ADDRESS O 860 LDY $B8 ;V 870 JSR :MEMFAC ;LOAD V TO FAC1 880 :EQV1 890 LDX $B9 ;ADDRESS OF 900 LDY $BA ;A() 910 JSR :FACMEM ;FAC1 TO A(X) 920 JSR :TEST ;CHECK IF DONE 930 BCS :EQV1 ;NO CONTINUE 940 JMP :RESET ;YES EXIT ROUTINE 950 :PLV ;A()=A()+V 960 JSR :SZPAGE 970 JSR :MOD1 980 :PLV2 990 LDA $B9 ;LOAD ADDRESS 1000 LDY $BA ;OF NEXT A() 1010 STA $B5 ;POINTER FOR 1020 STY $B6 ;STORE ROUTINE 1030 JSR :MEMFAC;1ST ELEMENT TO FAC1 1040 LDA $B7 ;ADDRESS OF 1050 LDY $B8 ;V 1060 JSR :MEMPLU ;ADD V TO FAC1 1070 JSR :STORE ;RESULTS TO A() 1080 JSR :TEST 1090 BCS :PLV2 1100 JMP :RESET 1110 :SBV ;A()=A()-V 1120 JSR :SZPAGE 1130 JSR :MOD1 1140 :SBV1 1150 LDA $B7 ;LOAD ADDRESS 1160 LDY $B8 ;OF V 1170 JSR :MEMFAC ;V TO FAC1 1180 LDA $B9 ;LOAD ADDRESS 1190 STA $B5 ;OF 1200 LDY $BA ;A() 1210 STY $B6 1220 JSR :MEMSUB ;A()ADDED TO FAC1 1230 JSR :STORE ;RESULT TO A() 1240 JSR :TEST 1250 BCS :SBV1 1260 JMP :RESET 1270 :BSV ;A()=V-A() 1280 JSR :SZPAGE 1290 JSR :MOD1 1300 :BSV1 1310 LDA $B9 1320 STA $B5 1330 LDY $BA 1340 STY $B6 1350 JSR :MEMFAC ;FAC1=A() 1360 LDA $B7 ;ADDRESS 1370 LDY $B8 ;OF V 1380 JSR :MEMSUB ;FAC1=V-A() 1390 JSR :STORE ;A()=FAC1 1400 JSR :TEST 1410 BCS :BSV1 1420 JMP :RESET 1430 :MLV ;A()=A()*V 1440 JSR :SZPAGE 1450 JSR :MOD1 1460 :MLV1 1470 LDA $B9 1480 STA $B5 ;ADDRESS 1490 LDY $BA ;OF A() 1500 STY $B6 1510 JSR :MEMFAC ;FAC1=A() 1520 LDA $B7 ;ADDRESS 1530 LDY $B8 ;OF V 1540 JSR :MEMMUL ;FAC1=A()*V 1550 JSR :STORE ;A()=FAC1 1560 JSR :TEST 1570 BCS :MLV1 1580 JMP :RESET 1590 :DVV ;A()=A()/V 1600 JSR :SZPAGE 1610 JSR :MOD1 1620 :DVV1 1630 LDA $B7 ;ADRESS 1640 LDY $B8 ;OF V 1650 JSR :MEMFAC ;FAC1=V 1660 LDA $B9 ;ADDRESS 1670 STA $B5 ;OF A() 1680 LDY $BA 1690 STY $B6 1700 JSR :MEMDIV ;FAC1=A()/V 1710 JSR :STORE ;A()=FAC1 1720 JSR :TEST 1730 BCS :DVV1 1740 JMP :RESET 1750 :VDV ;A()=V/A() 1760 JSR :SZPAGE 1770 JSR :MOD1 1780 :VDV1 1790 LDA $B9 ;ADDRESS 1800 STA $B5 ;OF A() 1810 LDY $BA 1820 STY $B6 1830 JSR :MEMFAC ;FAC1=A() 1840 LDA $B7 ;ADDRESS 1850 LDY $B8 ;OF V 1860 JSR :MEMDIV ;FAC1=V/FAC1 1870 JSR :STORE ;A()=FAC1 1880 JSR :TEST 1890 BCS :VDV1 1900 JMP :RESET 1910 :PLB ;A()=A()*B() 1920 JSR :SZPAGE 1930 JSR :MOD1 1940 :PLB1 1950 LDA $B7 ;ADDRESS 1960 LDY $B8 ;OF B() 1970 JSR :MEMFAC ;FAC1=B() 1980 LDA $B9 1990 STA $B5 ;ADDRESS 2000 LDY $BA ;OF A() 2010 STY $B6 2020 JSR :MEMPLU ;FAC1=FAC1*A() 2030 JSR :STORE ;A()=FAC1 2040 JSR :TEST1 ;INCREMENT B POINTER THEN A 2050 BCS :PLB1 2060 JMP :RESET 2070 :SBB ;A()=A()-B() 2080 JSR :SZPAGE 2090 JSR :MOD1 2100 :SBB1 2110 LDA $B7 ;ADDRESS 2120 LDY $B8 ;OF B() 2130 JSR :MEMFAC ;FAC1=B() 2140 LDA $B9 2150 STA $B5 ;ADDRESS 2160 LDY $BA ;OF A() 2170 STY $B6 2180 JSR :MEMSUB ;FAC1=A()-FAC1 2190 JSR :STORE ;A()=1 2200 JSR :TEST1 ;INCREMENT B THEN A 2210 BCS :SBB1 2220 JMP :RESET 2230 :MLB ;A()=A()*B() 2240 JSR :SZPAGE 2250 JSR :MOD1 2260 :MLB1 2270 LDA $B7 ;ADDRESS 2280 LDY $B8 ;OF B() 2290 JSR :MEMFAC ;FAC1=B() 2300 LDA $B9 2310 STA $B5 ;ADDRESS 2320 LDY $BA ;OF A() 2330 STY $B6 2340 JSR :MEMMUL ;FAC1=FAC1*A() 2350 JSR :STORE ;A()=FAC1 2360 JSR :TEST1 ;INCREMENT POINTERS 2370 BCS :MLB1 2380 JMP :RESET 2390 :DVB ;A()=A()/B() 2400 JSR :SZPAGE 2410 JSR :MOD1 2420 :DVB1 2430 LDA $B7 ;ADDRESS 2440 LDY $B8 ;OF B() 2450 JSR :MEMFAC ;FAC1=B() 2460 LDA $B9 2470 STA $B5 ;ADDRESS 2480 LDY $BA ;OF A() 2490 STY $B6 2500 JSR :MEMDIV ;FAC1=FAC1*A() 2510 JSR :STORE ;A()=FAC1 2520 JSR :TEST1 ;INCREMENT POINTERS 2530 BCS :DVB1 2540 JMP :RESET 2550 :BSB ;A()=B()-A() 2560 JSR :SZPAGE 2570 JSR :MOD1 2580 :BSB1 2590 LDA $B9 2600 LDY $BA ;ADDRESS 2610 STA $B5 ;OF A() 2620 STY $B6 2630 JSR :MEMFAC ;FAC1=A() 2640 LDA $B7 ;ADDRESS 2650 LDY $B8 ;OF B() 2660 JSR :MEMSUB ;FAC1=B()-FAC1 2670 JSR :STORE ;A()=FAC1 2680 JSR :TEST1 ;INCREMENT POINTERS 2690 BCS :BSB1 2700 JMP :RESET 2710 :VDB ;A()=B()/A() 2720 JSR :SZPAGE 2730 JSR :MOD1 2740 :VDB1 2750 LDA $B9 2760 STA $B5 ;ADDRESS 2770 LDY $BA ;OF A() 2780 STY $B6 2790 JSR :MEMFAC ;FAC1=A() 2800 LDA $B7 ;ADDRESS 2810 LDY $B8 ;OF B() 2820 JSR :MEMDIV ;FAC1=B()/FAC1 2830 JSR :STORE ;A()=FAC1 2840 JSR :TEST1 2850 BCS :VDB1 2860 JMP :RESET 2870 :EQB ;A()=B() 2880 JSR :SZPAGE 2890 JSR :MOD1 2900 :EQB1 2910 LDY #$00 2920 LDA ($B7),Y ;1ST BYTE OF B 2930 STA ($B9),Y ;INTO A 2940 INC $B7 ;INCREMENT 2950 BNE :EQB2 ;ADDRESS 2960 INC $B8 ;OF B 2970 :EQB2 2980 INC $B9 ;INCREMENT 2990 BNE :EQB3 ;ADDRESS 3000 INC $BA ;OF A 3010 :EQB3 3020 LDA $BA ;HI BYTE OF A 3030 JSR :TEST2 ;END OF ARRAY 3040 BCS :EQB1 ;NO CONTINUE 3050 JMP :RESET ;YES EXIT ROUTINE 3060 :MOD2 ;FIND ADDRESS OF A 3070 JSR $AEFD ;SKIP COMMA 3080 JSR $AD9E ; ROUTINE 3090 LDA $47 ;LO BYTE OF 3100 STA $B9 ;A ADDRESS 3110 LDA $48 ;HI BYTE OF 3120 STA $BA ;A ADDRESS 3130 LDA $2F ;START OF 3140 STA $FB 3150 LDA $30 ;ARRAY STORAGE 3160 STA $FC 3170 :AGAIN ;SEARCH ARRAY STORAGE 3180 LDY #$00 3190 LDA ($FB),Y 3200 CMP $45 ;FOR NAME 3210 BNE :STEP2 ;OF 3220 INY 3230 LDA ($FB),Y 3240 CMP $46 ;'A' ARRAY 3250 BNE :STEP ;ROUTINE RETURNS 3260 JSR :STEP1 ;WITH ENDING ADDRESS 3270 RTS ;OF A()IN $FB,$FC 3280 :STEP2 3290 INY 3300 :STEP 3310 JSR :STEP1 3320 JMP :AGAIN 3330 :STEP1 ;ROUTINE TO 3340 INY ;SKIP THROUGH 3350 LDA ($FB),Y ;ARRAY MEMORY 3360 STA $FD ;FROM ONE 3370 INY ;ARRAY TO NEXT 3380 LDA ($FB),Y 3390 CLC 3400 ADC $FC 3410 STA $FC 3420 LDA $FB 3430 CLC 3440 ADC $FD 3450 STA $FB 3460 BCC :ST2 3470 INC $FC 3480 :ST2 3490 RTS 3500 :MOD1 ;ROUTINE TO FIND B() 3510 JSR $AEFD ;SKIP COMMA 3520 JSR $B08B ; ROUTINE 3530 LDA $47 ;TO FIND V,B 3540 STA $B7 ;OR CREATE 3550 LDA $48 ;VARIABLE 3560 STA $B8 ;IF NOT FOUND 3570 JMP :MOD2 3580 :MAX ;V=MAXIMUM OF A() 3590 JSR :SZPAGE 3600 JSR :MOD1 3610 LDA $B9 3620 LDY $BA 3630 JSR :MEMFAC ;FAC1=A(0) 3640 .XY :DUMMY ;STORE IN 3650 JSR :FACMEM ;'DUMMY' 3660 JSR :TEST 3670 :MAX2 3680 LDA $B9 ;NEXT ADDRESS 3690 LDY $BA ;OF A() 3700 JSR :MEMFAC ;FAC1=A() 3710 .XY :DUMMY 3720 TXA 3730 JSR :COMPAR ;COMPARE 3740 BMI :MAX3 ;A() WITH 'DUMMY' 3750 .XY :DUMMY ;FAC1 LARGER 3760 JSR :FACMEM ;THEN 'DUMMY'=FAC1 3770 :MAX3 3780 JSR :TEST ;DONE 3790 BCS :MAX2 ;NO CONTINUE 3800 .XY :DUMMY ;YES 3810 TXA ;FAC1='DUMMY' 3820 JSR :MEMFAC 3830 LDX $B7 ;ADDRESS 3840 LDY $B8 ;OF V 3850 JSR :FACMEM ;V=FAC1 3860 JMP :RESET 3870 :MIN ;V=MINIMUM OF A() 3880 JSR :SZPAGE 3890 JSR :MOD1 3900 LDA $B9 ;ADDRESS 3910 LDY $BA ;OF A(0) 3920 JSR :MEMFAC ;STORE 3930 .XY :DUMMY ;A(0) INTO 3940 JSR :FACMEM ;'DUMMY' 3945 JSR :TEST 3950 :MIN2 3960 LDA $B9 ;ADDRESS OF 3970 LDY $BA ;NEXT A() 3980 JSR :MEMFAC ;LOAD INTO FAC1 3990 .XY :DUMMY ;AND 4000 TXA 4010 JSR :COMPAR ;COMPARE WITH 'DUMMY' 4020 BPL :MIN3 ;FAC1<'DUMMY 4030 .XY :DUMMY ;THEN 'DUMMY' 4040 JSR :FACMEM ;=FAC1 4050 :MIN3 4060 JSR :TEST 4070 BCS :MIN2 ;'DUMMY =MIN(A) 4080 .XY :DUMMY 4090 TXA 4100 JSR :MEMFAC ;TRANSFER 4110 LDX $B7 ;'DUMMY' 4120 LDY $B8 ;TO 4130 JSR :FACMEM ;V 4140 JMP :RESET 4150 :SQUARE ;A=A*A 4160 JSR :SZPAGE 4170 JSR :MOD2 4180 :SQU1 4190 LDA $B9 ;ADDRESS 4200 LDY $BA ;OF A() 4210 STA $B5 4220 STY $B6 4230 JSR :MEMFAC ;A() TO FAC1 4235 LDA $B9 4237 LDY $BA 4240 JSR :MEMMUL ;FAC1=A*A 4250 JSR :STORE 4260 JSR :TEST ;INCREMENT POINTER 4270 BCS :SQU1 4280 JMP :RESET 4290 :INSERT ;A(X)=V 4300 JSR :SZPAGE ;FOLLOWING 4310 JSR :MOD1 ;ELEMENTS 4320 LDA #$05 ;MOVED DOWN 4330 STA $BF ;A(MAX)=A(MAX-1) 4340 LDA $46 ;CONTINUE 4350 ASL A ;UNTIL 4360 BCC :INS1 ;A(X+1)=A(X) 4370 LDA #$02 ;THEN A(X)=V 4380 STA $BF ;ROUTINE WILL 4390 :INS1 ;AUTOMATICALLY 4400 LDA $FB ;USE PROPER OFFSET 4410 CLC ;FOR VARIABLE TYPE 4420 SBC $BF ;WORKS WITH 4430 STA $FB ;STRINGS (A$) 4440 LDA $FC ;INTEGERS (A%) 4450 SBC #$00 ;OR 4460 STA $FC ;FLOATING POINT 4470 LDA $FB 4480 CLC 4490 SBC $BF 4500 STA $FD 4510 LDA $FC 4520 SBC #$00 4530 STA $FE 4540 LDY $BF 4550 DEY 4560 :INS2 4570 LDA ($FD),Y 4580 STA ($FB),Y 4590 DEY 4600 BPL :INS2 4610 LDA $FE 4620 CMP $BA 4630 BNE :INS1 4640 LDA $FD 4650 CMP $B9 4660 BNE :INS1 4670 LDY $BF 4680 DEY 4690 :INS3 4700 LDA ($B7),Y 4710 STA ($FB),Y 4720 DEY 4730 BPL :INS3 4740 JMP :RESET 4750 :END 4760 .EN