0100 ;MACHINE LANGUAGE SORTS, PART 1›0110 ;BY KEVIN PECK›0120 ;(c)1987, ANTIC PUBLISHING›0130 FLAST = $00 ;End, outer loop›0140 FLENKEY = $CB ;Key length›0150 RLEN = $CC ;Record Length›0160 OFFSETKEY = $CF ;Key offset›0170 FIRST = $CD ;1st element ptr›0180 SECOND = $D4 ;2nd element ptr›0190 LAST = $D6 ;End, inner loop›0200 FENDKEY = $D8 ;End, key field›0210 ORDER = $E1 ;Order, sort 0,1›0220 FLENSEC = $D0 ;2nd field lngth›0230 OFFSETSEC = $E0 ;2nd " " offset›0240 FENDSEC = $D1 ;End 2nd field›0250 ;›0260 *= $4000›0270 ;›0280 CLD ›0290 PLA ›0300 ; Retrieve arguments from BASIC›0310 PLA ›0320 STA FIRST+1›0330 PLA ›0340 STA FIRST›0350 PLA ›0360 STA LAST+1›0370 PLA ›0380 STA LAST›0390 PLA ›0400 PLA ›0410 STA FLENKEY›0420 PLA ›0430 PLA ›0440 STA OFFSETKEY›0450 CLC ;Find end of ›0460 ADC FLENKEY ;First key ›0470 STA FENDKEY›0480 PLA ›0490 PLA ›0500 STA FLENSEC›0510 PLA ›0520 PLA ›0530 STA OFFSETSEC›0540 CLC ›0550 ADC FLENSEC ;Find end of ›0560 STA FENDSEC ;second key›0570 PLA ›0580 PLA ›0590 STA RLEN›0600 PLA ›0610 PLA ›0620 STA ORDER›0630 ;›0640 ; All parms. now in zero page.›0650 ; Next, set pointer to the end›0660 ; of the outer loop›0670 LDA LAST+1›0680 STA FLAST+1›0690 SEC ›0700 LDA LAST›0710 SBC RLEN›0720 STA FLAST›0730 BCS SETSECOND›0740 ;›0750 DEC FLAST+1›0760 ; Start of outer loop.›0770 ; Adjust the second pointer to›0780 ; point to the first pointer›0790 ; plus the record length.›0800 ;›0810 SETSECOND›0820 CLC ›0830 LDA FIRST+1›0840 STA SECOND+1›0850 LDA FIRST›0860 ADC RLEN›0870 STA SECOND›0880 BCC SORTKEY›0890 INC SECOND+1›0900 ; Start of the inner loop.›0910 ; 1. Compare the Key field of›0920 ; the two sort elements.›0930 ; 2. If we find a mismatch,›0940 ; do we need to swap them?›0950 SORTKEY›0960 LDY OFFSETKEY›0970 ;›0980 KEYLOOP›0990 ;›1000 LDA (FIRST),Y ;get a byte›1010 CMP (SECOND),Y ;of each.›1020 BEQ CHKMORE ;If = Continue.›1030 ;›1040 BCC NOSWAP ;If FS swap.›1070 ;›1080 CHKMORE›1090 ;›1100 INY ;Adjust pointer›1110 CPY FENDKEY ;All done?›1120 BNE KEYLOOP ;No. Continue.›1130 ;›1140 ; At this point, all bytes in›1150 ; the key field of both sort›1160 ; elements are equal. Drop to›1170 ; SORTSECOND and check the›1180 ; secondary fields.›1190 ; If their lengths = 0, then›1200 ; we don't have 2ndry fields.›1210 ; We are only doing a one-field›1220 ; sort--goto the Noswap routine.›1230 ; If the key fields are equal,›1240 ; there is no need to swap them.›1250 ;›1260 SORTSEC›1270 LDA FLENSEC ;A second field?›1280 BEQ NOSWAPBD ;No.›1290 ;›1300 LDY OFFSETSEC›1310 SECLOOP›1320 LDA (FIRST),Y ;Compare byte›1330 CMP (SECOND),Y ;by byte...›1340 BEQ CHKMORE2 ;If = do more.›1350 ;›1360 BCC NOSWAP ;If Fs Swap.›1390 ;›1400 CHKMORE2›1410 INY ;Point to next.›1420 CPY FENDSEC ;End of 2nd?›1430 BNE SECLOOP ;No, do more.›1440 ;›1450 ; Now, both the key and the›1460 ; secondary fields of both sort›1470 ; elemtents are equal. Goto›1480 ; the noswap routine through the›1490 ; "back door." No need to check›1500 ; the order, no need to swap.›1510 BEQ NOSWAPBD›1520 ;›1530 ; This is where the swapping›1540 ; occurs. First, check the›1550 ; swapping order.›1560 ; (Assume swapping in ascending›1570 ; order.) If order<>0, then›1580 ; sort in descending order.›1590 ;›1600 SWAP›1610 ;›1620 LDA ORDER ;Get order›1630 BNE NOSWAPBD ;Not 0, No swap›1640 ;›1650 ; Swap routine's back door.›1660 ; If NOSWAP decides we need to›1670 ; swap by checking the order,›1680 ; we need to come here (instead›1690 ; of SWAP) or we would go into›1700 ; a continuous loop.›1710 ;›1720 SWAPBD›1730 LDY #0›1740 SWAPLOOP›1750 LDA (FIRST),Y ;Key byte›1760 PHA ; to stack.›1770 LDA (SECOND),Y ; 2ndry byte›1780 STA (FIRST),Y ; to key.›1790 PLA ;Key from stack›1800 STA (SECOND),Y ;to 2ndry.›1810 INY ;Next byte.›1820 CPY RLEN ; More?›1830 BNE SWAPLOOP ;Yes. Continue.›1840 ;›1850 ; All bytes have been swapped.›1860 ; Now adjust pointers to the›1870 ; next elements for the sort.›1880 ; Goto the noswap back door.›1890 ;›1900 BEQ NOSWAPBD›1910 ;›1920 NOSWAP›1930 ;›1940 LDA ORDER ;Is ORDER=1?›1950 BNE SWAPBD ;Yes. Swap them›1960 ;›1970 NOSWAPBD›1980 CLC ›1990 LDA SECOND›2000 ADC RLEN›2010 STA SECOND›2020 LDA SECOND+1›2030 ADC #0›2040 STA SECOND+1›2050 CMP LAST+1›2060 BNE SORTKEY›2070 ;›2080 LDA SECOND›2090 CMP LAST›2100 BNE SORTKEY›2110 ;›2120 ; We've made one pass through›2130 ; the sort's inner loop. Now,›2140 ; adjust the outer loop and›2150 ; check if we're done with it.›2160 ; If not, readjust the inner›2170 ; loop pointer to the outer loop›2180 ; pointer + the record length.›2190 ;›2200 CLC ›2210 LDA FIRST›2220 ADC RLEN›2230 STA FIRST›2240 LDA FIRST+1›2250 ADC #0›2260 STA FIRST+1›2270 CMP FLAST+1›2280 BNE SETSECOND›2290 ;›2300 LDA FIRST›2310 CMP FLAST›2320 BNE SETSECOND›2330 ;›2340 RTS ;Goto BASIC›2350 .END ›