home *** CD-ROM | disk | FTP | other *** search
/ Antic Magazine 1988 May / Antic_Magazine_1988_05_Antic_Side_A.atr / numsort.m65 < prev    next >
Text File  |  2023-02-26  |  7KB  |  1 lines

  1. 0100 ;NUMSORT.M65¢0110 ;BY KEVIN PECK¢0120 ;(c)1988, ANTIC PUBLISHING¢0130     .OPT NO LIST¢0140 ;¢0150 ; Define zero page pointers¢0160 FLAST = $00     ;End, loop 1¢0170 FLEN =  $CB     ;Field length¢0180 RLEN =  $CC     ;Record length¢0190 FIRST = $CD     ;Pointer to 1st¢0200 ;                sort element.¢0210 OFFSET = $CF    ;Offset into¢0220 ;                DATA string.¢0230 LENF =  $D0     ;Length of first¢0240 ;                sort element.¢0250 LENS =  $D1     ;Length of 2nd¢0260 ;                sort element.¢0270 SECOND = $D4    ;Pointer to¢0280 ;                second element.¢0290 LAST =  $D6     ;End of DATA¢0300 ;                string pointer.¢0310 FEND =  $D8     ;End, Field ptr.¢0320 TEMP =  $E0     ;Temp storage¢0330 ;                for ORDER.¢0340 ORDER = $E1     ;Order of sort:¢0350 ;       0-ascending 1-descending¢0360 SIGN =  $E2     ;Sign of second¢0370 ;            element 0-POS 1-NEG¢0380     *=  $4000¢0390 ;¢0400     CLD ¢0410     PLA ¢0420     PLA ¢0430     STA FIRST+1 ;Start of sort.¢0440     PLA ¢0450     STA FIRST¢0460     PLA ¢0470     STA LAST+1  ;End of sort.¢0480     PLA ¢0490     STA LAST¢0500     PLA ¢0510     PLA ¢0520     STA FLEN    ;Field length¢0530     PLA ¢0540     PLA ¢0550     STA OFFSET  ;Field offset¢0560     CLC ¢0570     ADC FLEN¢0580     STA FEND¢0590     PLA ¢0600     PLA ¢0610     STA RLEN    ;Record length.¢0620     PLA ¢0630     PLA ¢0640     STA ORDER   ;Sort order:¢0650 ;                0-ASC 1-DEC¢0660 ; Find the last position of¢0670 ; sort string for outer loop.¢0680 ;¢0690     LDA LAST+1¢0700     STA FLAST+1¢0710     SEC ¢0720     LDA LAST¢0730     SBC RLEN¢0740     STA FLAST¢0750     BCS INITFIRST¢0760 ;¢0770     DEC FLAST+1¢0780 ;¢0790 ; INITFIRST begins outer loop.¢0800 ; INITSECOND is the inner loop.¢0810 ;¢0820 INITFIRST¢0830     LDY OFFSET¢0840     LDX #0¢0850     LDA (FIRST),Y¢0860     CMP #'-¢0870     BNE FINDFLEN¢0880 ;¢0890     INX ¢0900 FINDFLEN ;      Find length of¢0910 ;              1st sort element.¢0920     LDA (FIRST),Y¢0930     CMP #'.¢0940     BEQ SAVELENF¢0950 ;¢0960     CMP #32¢0970     BEQ SAVELENF¢0980 ;¢0990     INY ¢1000     CPY FEND¢1010     BNE FINDFLEN¢1020 ;¢1030 SAVELENF ;      Save the length.¢1040     STY LENF¢1050 ; Set SECOND element to FIRST¢1060 ; plus record length.¢1070 ;¢1080 SETSECOND¢1090     CLC ¢1100     LDA FIRST+1¢1110     STA SECOND+1¢1120     LDA FIRST¢1130     ADC RLEN¢1140     STA SECOND¢1150     BCC INITSECOND¢1160 ;¢1170     INC SECOND+1¢1180 ; Inner loop's 1st routine,¢1190 ; Finds sign of 2nd element.¢1200 ;¢1210 INITSECOND¢1220     LDY OFFSET¢1230     LDA #0¢1240     STA SIGN¢1250     LDA (SECOND),Y¢1260     CMP #'-¢1270     BNE SETSECLEN¢1280 ;¢1290     INC SIGN¢1300 SETSECLEN¢1310     LDA (SECOND),Y¢1320     CMP #'.¢1330     BEQ SAVELENS¢1340 ;¢1350     CMP #32¢1360     BEQ SAVELENS¢1370 ;¢1380     INY ¢1390     CPY FEND¢1400     BNE SETSECLEN¢1410 ;¢1420 SAVELENS¢1430 ;¢1440     STY LENS    ;Save length of¢1450 ;                second element.¢1460 ;¢1470 ; Examine & test sort elements.¢1480 ; Test signs, then lengths,¢1490 ; then test byte-by-byte.¢1500 ;¢1510 TESTSIGN¢1520 ;¢1530     LDA ORDER¢1540     STA TEMP¢1550     CPX SIGN¢1560     BEQ TESTLEN ;If = test sign¢1570 ;¢1580     BCC CHKORDER ;If < swap chk¢1590 ;¢1600     BCS CHKTEMP ;If > noswap chk¢1610 ;¢1620 X2INITFIRST¢1630 ;¢1640     BNE INITFIRST¢1650 ;¢1660 TESTLEN¢1670     LDA LENS    ;Compare lengths¢1680     CMP LENF¢1690     BEQ XBYTETEST¢1700 ;¢1710     BCC SWAP¢1720 ;¢1730     BCS ADJPOINT¢1740 ;¢1750 XINITSECOND¢1760     BNE INITSECOND¢1770 ; Routines are only set for¢1780 ; positive numbers in¢1790 ; ascending order. If both¢1800 ; numbers are negative then¢1810 ; reverse the order.¢1820 SWAP¢1830     LDA ORDER¢1840     STA TEMP¢1850     CLC ¢1860     TXA ¢1870     ADC SIGN¢1880     CMP #2¢1890     BNE CHKORDER¢1900 ;¢1910 ; Both numbers are negative.¢1920 ; temporarily reverse order.¢1930 ;  Subtract current order¢1940 ; from one to flip the order.¢1950     LDA #1¢1960     SBC ORDER¢1970     STA TEMP¢1980 ;¢1990 ; If order is 1 goto "Back Door"¢2000 ; of the adjust pointer routine.¢2010 CHKORDER¢2020     LDA TEMP¢2030     BNE ADJPOINTBD¢2040 ;¢2050 SWAPBD ;        Swap's backdoor¢2060     LDY #0¢2070 SWAPLOOP¢2080     LDA (FIRST),Y¢2090     PHA ¢2100     LDA (SECOND),Y¢2110     STA (FIRST),Y¢2120     PLA ¢2130     STA (SECOND),Y¢2140     INY ¢2150     CPY RLEN¢2160     BNE SWAPLOOP¢2170 ;¢2180     LDA LENS¢2190     STA LENF¢2200     LDX SIGN¢2210     CLC ¢2220     BCC ADJPOINTBD¢2230 ;¢2240 XINITFIRST¢2250     BNE X2INITFIRST¢2260 ;¢2270 XSWAP¢2280     BCS SWAP¢2290 ;¢2300 XBYTETEST¢2310 ;¢2320     BEQ BYTETEST¢2330 ;¢2340 ; Due to postive-ascending¢2350 ; nature of program we check¢2360 ; if both are negative or if¢2370 ; the order is descending.¢2380 ;¢2390 ADJPOINT¢2400     LDA ORDER¢2410     STA TEMP¢2420     CLC ¢2430     TXA ¢2440     ADC SIGN¢2450     CMP #2¢2460     BNE CHKTEMP¢2470 ;¢2480     LDA #1¢2490     SBC ORDER¢2500     STA TEMP¢2510 CHKTEMP¢2520     LDA TEMP¢2530     BNE SWAPBD¢2540 ;¢2550 ADJPOINTBD ;    The back door.¢2560     CLC ¢2570     LDA SECOND¢2580     ADC RLEN¢2590     STA SECOND¢2600     LDA SECOND+1¢2610     ADC #0¢2620     STA SECOND+1¢2630 ;¢2640 ; We have adjusted the 2nd¢2650 ; Decide if inner loop is done¢2660 ; by comparing 2nd to last to¢2670 ; see if it is pointing to end¢2680 ; of data string. If not then¢2690 ; branch to the inner loop.¢2700 ;¢2710     CMP LAST+1¢2720     BNE XINITSECOND¢2730 ;¢2740     LDA SECOND¢2750     CMP LAST¢2760     BNE XINITSECOND¢2770 ;¢2780 ; Adjust outer loop pointer,¢2790 ; check if done.  If not,¢2800 ; then go to SETSECOND¢2810 ; to reset the 2nd element to¢2820 ; point one record away from the¢2830 ; new 1st element.¢2840 ;¢2850     CLC ¢2860     LDA FIRST¢2870     ADC RLEN    ;Compare 1st &¢2880 ; 2nd on a byte-by-byte basis.¢2890 ; When we find non-equal bytes,¢2900 ; check for swap.¢2910 ;¢2920     STA FIRST¢2930     LDA FIRST+1¢2940     ADC #0¢2950     STA FIRST+1¢2960     CMP FLAST+1¢2970     BNE XINITFIRST¢2980 ;¢2990     LDA FIRST¢3000     CMP FLAST¢3010     BNE XINITFIRST¢3020 ;¢3030     RTS         ;Return to BASIC¢3040 ;¢3050 ; We make it to here if the¢3060 ; signs and the lengths are¢3070 ; both equal. Now compare 1st¢3080 ; to 2nd (byte-by-byte).¢3090 ;¢3100 BYTETEST¢3110 ;¢3120     LDY OFFSET¢3130 ;¢3140 TESTLOOP¢3150     LDA (FIRST),Y¢3160     CMP (SECOND),Y¢3170     BEQ TESTMORE¢3180 ;¢3190     BCS XSWAP¢3200 ;¢3210     BCC ADJPOINT¢3220 ;¢3230 TESTMORE¢3240     INY ¢3250     CPY FEND¢3260     BEQ ADJPOINTBD¢3270 ;¢3280     BNE TESTLOOP¢3290 ;¢3300     .END ¢əəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəəə