home *** CD-ROM | disk | FTP | other *** search
/ Antic Magazine 1988 April / Antic_Magazine_1988_04_Antic.atr / multisor.m65 < prev    next >
Text File  |  2023-02-26  |  5KB  |  1 lines

  1. 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 F<S no swap.¢1050 ;¢1060     BCS SWAP    ;If F>S 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 F<S Noswap.¢1370 ;¢1380     BCS SWAP    ;If F>s 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 ¢