0100 ;›0110 ; SUPERSORT v3             Bob Fraser  7-23-81›0120 ;›0130 ;›0140 ; Rev. 2  -fits under basic...must use w/ autorun.sys file›0150 ;›0160 ;›0170 ; Rev. 3  -no longer requires M as input var›0180 ;›0190 ;         -now has capability for 256 byte record›0200 ;›0210 ;         -now requires›0220 ;›0230 ;            NKEYS...the number of key used in sorting›0240 ;                 ...range  1 to 89›0250 ;›0260 ;            KEYST...table of starting coords of keys›0270 ;                 ...range  0 to RLENG-1›0280 ;                 ...must be NKEYS #of entries here›0290 ;›0300 ;            KEYEND..table of ending coords of keys›0310 ;                 ...range  1 to RLENG›0320 ;                 ...must be NKEYS #of entries here›0330 ;›0340 ;            KEYEND must be strictly greater than KEYST›0350 ;›0360 ;›0370 ;            ex.    bytes of record›0380 ;                    |5|6|7|8|9|10›0390 ;                      |key #0 |›0400 ;           KEYST[0]=6--^       ^--KEYEND[0]=10›0410 ;›0420 ;›0430 ;›0440 ;›0450 ;›0460 ;›0470 M=9›0480  *=$CB›0490 AZ *=*+2›0500 BZ *=*+2›0510 TZ *=*+2›0520 ;›0530  *=$600›0540 RLENG *=*+1 record length›0550 N *=*+2 location of beginning of last record›0560 I *=*+2 next 4 are internal sort vars›0570 J *=*+2›0580 L *=*+2›0590 R *=*+2›0600 MSCALE *=*+2 m scaled for comparison›0610 ST *=*+2 table start address›0620 SP *=*+1 stack pointer›0630 STACK1 *=*+30›0640 STACK2 *=*+30›0650 NKEYS *=*+1 # of sort keys used›0660 KEYST *=*+89 table of key start coords›0670 KEYEND *=*+89 table of key end coords›0680  *=$1D0A leave room for memlo reset routine›0690  PLA pop off USR's n value›0700  PLA›0710  STA ST+1›0720  STA AZ+1›0730  PLA›0740  STA ST›0750  STA AZ store address of data table›0760  PLA›0770  STA N+1›0780  PLA›0790  STA N store parameter 'n'›0800 ;›0810  LDA RLENG›0820  STA MSCALE›0830  LDA #0›0840  STA MSCALE+1›0850  LDX #M›0860 L0 CLC›0870  LDA MSCALE›0880  ADC RLENG›0890  STA MSCALE›0900  LDA MSCALE+1›0910  ADC #0›0920  STA MSCALE+1›0930  DEX›0940  BNE L0 mscale <- rleng*(m+1)›0950 ;›0960  CLC›0970  LDA N›0980  ADC RLENG›0990  STA BZ›1000  LDA N+1›1010  ADC #0›1020  STA BZ+1 BZ <- N+1›1030 ;›1040  LDY #0›1050 Q0 LDA #0›1060  STA (AZ),Y›1070  LDA #$FF›1080  STA (BZ),Y›1090  INY›1100  CPY RLENG›1110  BNE Q0›1120 ;›1130 Q1 LDA #0›1140  STA SP stack <= empty›1150  CLC›1160  LDA AZ›1170  ADC RLENG›1180  STA L›1190  LDA AZ+1›1200  ADC #0›1210  STA L+1 l <- 1›1220  LDA N›1230  STA R r <- N›1240  LDA N+1›1250  STA R+1›1260 ;›1270 Q2 CLC›1280  LDA R›1290  ADC RLENG›1300  STA J›1310  LDA R+1›1320  ADC #0›1330  STA J+1 j <- r+1›1340 ;›1350  LDA L›1360  STA AZ›1370  STA I›1380  LDA L+1›1390  STA AZ+1›1400  STA I+1 i <- l›1410 ;›1420  LDY #0›1430 L1 LDA (AZ),Y›1440  STA TREC,Y›1450  INY›1460  CPY RLENG›1470  BNE L1›1480  JMP Q3 R <- R(l)›1490 ;›1500 Q6 LDY #0›1510  LDA I›1520  STA AZ›1530  LDA I+1›1540  STA AZ+1›1550  LDA J›1560  STA BZ›1570  LDA J+1›1580  STA BZ+1›1590 L2 LDA (AZ),Y›1600  TAX›1610  LDA (BZ),Y›1620  STA (AZ),Y›1630  TXA›1640  STA (BZ),Y›1650  INY›1660  CPY RLENG›1670  BNE L2 R(i) <-> R(j)›1680 ;›1690 Q3 CLC›1700  LDA I›1710  ADC RLENG›1720  STA I›1730  STA AZ›1740  LDA I+1›1750  ADC #0›1760  STA I+1 i <- i+1›1770  STA AZ+1›1780 ;›1790  LDX #0›1800 L2A LDY KEYST,X›1810 L3 LDA (AZ),Y K(i) < K ?›1820  CMP TREC,Y›1830  BCC Q3 yes›1840  BNE Q4 no›1850  INY›1860  TYA›1870  CMP KEYEND,X›1880  BNE L3 don't know›1890  INX next key›1900  CPX NKEYS›1910  BNE L2A›1920 ;›1930 Q4 SEC›1940  LDA J›1950  SBC RLENG›1960  STA J›1970  STA AZ›1980  LDA J+1›1990  SBC #0›2000  STA J+1›2010  STA AZ+1 j <- j-1›2020 ;›2030  LDX #0›2040 L3A LDY KEYST,X›2050 L4 LDA TREC,Y›2060  CMP (AZ),Y K < K(j) ?›2070  BCC Q4 yes›2080  BNE Q5 no›2090  INY›2100  TYA›2110  CMP KEYEND,X›2120  BNE L4 don't know›2130  INX next key›2140  CPX NKEYS›2150  BNE L3A›2160 ;›2170 Q5 LDA I+1›2180  CMP J+1 j <= i ?›2190  BCC L4A no›2200  BNE L5 yes›2210  LDA I›2220  CMP J›2230  BCS L5 yes›2240 L4A JMP Q6 no›2250 ;›2260 L5 LDA L›2270  STA AZ›2280  LDA L+1›2290  STA AZ+1›2300  LDA J›2310  STA BZ›2320  LDA J+1›2330  STA BZ+1›2340  LDY #0›2350 L6 LDA (AZ),Y›2360  TAX›2370  LDA (BZ),Y›2380  STA (AZ),Y›2390  TXA›2400  STA (BZ),Y›2410  INY›2420  CPY RLENG›2430  BNE L6 R(l) <-> R(j)›2440 ;›2450 Q7 SEC›2460  LDA J›2470  SBC L›2480  STA BZ›2490  LDA J+1›2500  SBC L+1›2510  STA BZ+1›2520  SEC›2530  LDA BZ›2540  SBC MSCALE›2550  STA BZ›2560  LDA BZ+1›2570  SBC MSCALE+1›2580  STA BZ+1 B <- j-l-(M+1)›2590 ;›2600  SEC›2610  LDA R›2620  SBC J›2630  STA AZ›2640  LDA R+1›2650  SBC J+1›2660  STA AZ+1›2670  SEC›2680  LDA AZ›2690  SBC MSCALE›2700  STA AZ›2710  LDA AZ+1›2720  SBC MSCALE+1›2730  STA AZ+1 A <- r-j-(M+1)›2740 ;›2750  SEC A>=B ?›2760  LDA AZ›2770  SBC BZ›2780  LDA AZ+1›2790  SBC BZ+1›2800  BMI L8 no›2810 ;›2820  LDA BZ+1 B>M ? (B>=M+1 ?)›2830  BPL L6B yes›2840 L6A JMP L11 no›2850 ;›2860 L6B LDX SP›2870  CLC›2880  LDA J›2890  ADC RLENG›2900  STA STACK1,X›2910  LDA J+1›2920  ADC #0›2930  INX›2940  STA STACK1,X›2950  DEX›2960  LDA R›2970  STA STACK2,X›2980  INX›2990  LDA R+1›3000  STA STACK2,X›3010  INX›3020  STX SP STACK <= j+1,r›3030 ;›3040 L7 SEC›3050  LDA J›3060  SBC RLENG›3070  STA R›3080  LDA J+1›3090  SBC #0›3100  STA R+1 r <- j-1›3110  JMP Q2›3120 ;›3130 L8 LDA AZ+1 A>M ? (A>=M+1 ?)›3140  BMI L10 no›3150 ;›3160  LDX SP yes›3170  LDA L›3180  STA STACK1,X›3190  INX›3200  LDA L+1›3210  STA STACK1,X›3220  DEX›3230  SEC›3240  LDA J›3250  SBC RLENG›3260  STA STACK2,X›3270  LDA J+1›3280  SBC #0›3290  INX›3300  STA STACK2,X›3310  INX›3320  STX SP STACK <= l,j-1›3330 ;›3340 L9 CLC›3350  LDA J›3360  ADC RLENG›3370  STA L›3380  LDA J+1›3390  ADC #0›3400  STA L+1›3410  JMP Q2 l <- j+1›3420 ;›3430 L10 LDA BZ+1 B>M ? (B>=M+1 ?)›3440  BPL L7 yes›3450  JMP Q8 no›3460 ;›3470 L11 LDA AZ+1 A>M ? (A>=M+1 ?)›3480  BPL L9 yes›3490 ;›3500 Q8 LDX SP›3510  BEQ Q9 STACK EMPTY ?›3520  DEX›3530  LDA STACK1,X›3540  STA L+1›3550  DEX›3560  LDA STACK1,X›3570  STA L›3580  INX›3590  LDA STACK2,X›3600  STA R+1›3610  DEX›3620  LDA STACK2,X›3630  STA R›3640  STX SP l,r <= STACK›3650  JMP Q2›3660 ;›3670 Q9 CLC›3680  LDA ST›3690  ADC RLENG›3700  STA AZ›3710  LDA ST+1›3720  ADC #0›3730  STA AZ+1 j <- 1›3740 ;›3750 L12 LDA AZ›3760  STA TZ›3770  ADC RLENG›3780  STA AZ›3790  LDA AZ+1›3800  STA TZ+1 t <- j›3810  ADC #0›3820  STA AZ+1 j <- j+1›3830 ;›3840  LDX #0›3850 L12A LDY KEYST,X›3860 L13 LDA (TZ),Y›3870  CMP (AZ),Y K(j-1)>K(j) ?›3880  BCC L21 no›3890  BNE L14 yes›3900  INY don't know›3910  TYA›3920  CMP KEYEND,X›3930  BNE L13›3940  INX next key›3950  CPX NKEYS›3960  BNE L12A›3970  JMP L21 no›3980 ;›3990 L14 LDY #0›4000 L15 LDA (AZ),Y›4010  STA TREC,Y›4020  INY›4030  CPY RLENG›4040  BNE L15 R <- R(j)›4050 ;›4060  LDA AZ›4070  STA BZ›4080  LDA AZ+1›4090  STA BZ+1 i <- j›4100 ;›4110 L16 SEC›4120  LDA BZ›4130  STA TZ›4140  SBC RLENG›4150  STA BZ›4160  LDA BZ+1›4170  STA TZ+1 t <- i›4180  SBC #0›4190  STA BZ+1 i <- i-1›4200 ;›4210  LDX #0›4220 L16A LDY KEYST,X›4230 L17 LDA TREC,Y›4240  CMP (BZ),Y K(i) <= K ?›4250  BCC L17A no›4260  BNE L19 yes›4270  INY›4280  TYA›4290  CMP KEYEND,X›4300  BNE L17 don't know›4310  INX next key›4320  CPX NKEYS›4330  BNE L16A›4340  JMP L19 yes›4350 ;›4360 L17A LDY #0›4370 L18 LDA (BZ),Y›4380  STA (TZ),Y›4390  INY›4400  CPY RLENG›4410  BNE L18 R(t) <- R(i)›4420  JMP L16›4430 ;›4440 L19 LDY #0›4450 L20 LDA TREC,Y›4460  STA (TZ),Y›4470  INY›4480  CPY RLENG›4490  BNE L20 K(t) <- K›4500 ;›4510 L21 LDA AZ+1 j < N ?›4520  CMP N+1›4530  BCC L21A yes›4540  BNE L22 no›4550  LDA AZ don't know›4560  CMP N›4570  BCS L22 no›4580 L21A JMP L12 yes›4590 ;›4600 L22 RTS›4610 TREC *=*+$100›4620  .END›