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