0100 ;UTILITY SORT - CALLED FROM BASIC›0105 ;›0110 ;ENTRY PARAMETERS:›0115 ;›0120 ;  1. FILE ADDRESS›0125 ;  2. RECORD LENGTH <=256 BYTES›0130 ;  3. NUMBER OF RECORDS TO SORT›0135 ;  4. ANY NUMBER OF FIELDS TO SORT IN›0140 ;     MAJOR TO MINOR ORDER›0145 ;       4.1 FIELD POSITION›0150 ;       4.2 FIELD LENGTH›0155 ;       4.3 0=ASCENDING 1=DESCENDING›0160 ;›0165        ORG $0600›0170 FILE   =   203      ;FILE START ADDRESS›0175 PNTR1  =   205      ;POINTERS TO TWO›0180 PNTR2  =   207      ;ADJACENT RECORDS.›0185 RECNBR =   209      ;NUMBER OF RECORDS›0190 SCOUNT =   211      ;RECORD COUNTER›0195 BUBLE  =   213      ;OUT OF SEQUENCE›0200 RECSIZ =   214      ;SIZE OF RECORD›0205 FLDNDX =   216      ;SORT FIELD COUNTER›0210 FLDCNT =   217      ;NUMBER OF SORT FIELDS›0215 SORTAD =   218      ;ASCENDING/DESCENDING›0220 STACK  =   256      ;SAVE SORT FIELDS HERE›0225 ;›0230 ;DETERMINE HOW MANY FIELDS TO SORT›0235        CLD›0240        PLA            ;ALL BUT THE FIRST›0245        SEC            ;THREE PARAMETERS›0250        SBC #3         ;ARE FIELDS TO›0255        STA FLDCNT     ;SORT›0260 ;›0265 ;PICK UP SORT PARAMETERS›0270        PLA            ;FILE START›0275        STA FILE+1     ;ADDRESS›0280        PLA            ;›0285        STA FILE       ;›0290        PLA            ;RECORD LENGTH›0295        STA RECSIZ+1   ;›0300        PLA            ;›0305        STA RECSIZ     ;›0310        PLA            ;NUMBER OF RECORDS›0315        STA RECNBR+1   ;›0320        PLA            ;›0325        STA RECNBR     ;›0330 ;›0335 ;PICK UP FIELDS TO SORT›0340        LDX #0›0345 PICKFIELDS›0350        PLA            ;GET ALL THE SORT›0355        PLA            ;FIELD PARAMETERS FOR›0360        STA STACK,X    ;POSITION, LENGTH›0365        INX            ;AND DIRECTION.›0370        CPX FLDCNT     ;ANY MORE›0375        BNE PICKFIELDS ;GO GET THEM›0380 ;›0385 ;SET UP NUMBER OF RECORDS TO SORT›0390        SEC›0395        LDA RECNBR     ;MUST BE AT LEAST›0400        SBC #2         ;TWO RECORDS TO›0405        STA RECNBR     ;SORT›0410        LDA RECNBR+1   ;›0415        SBC #0         ;›0420        STA RECNBR+1   ;›0425        BMI ENDSORT    ;ELSE GET OUT›0430 ;›0435 ;MAIN LINE SORT LOOP›0440 ;›0445 SORT   LDA RECNBR     ;RESET NUMBER OF›0450        STA SCOUNT     ;RECORDS TO SORT›0455        LDA RECNBR+1   ;›0460        STA SCOUNT+1   ;›0465        LDA FILE+1     ;SET UP POINTERS›0470        STA PNTR1+1    ;FOR THE FIRST›0475        STA PNTR2+1    ;AND›0480        LDA FILE       ;SECOND RECORDS.›0485 BUMPRECORD›0490        STA PNTR1      ;PUT PNTR2›0495        CLC            ;AHEAD›0500        ADC RECSIZ     ;OF›0505        STA PNTR2      ;PNTR1›0510        LDA PNTR2+1    ;BY›0515        ADC RECSIZ+1  ;ONE›0520        STA PNTR2+1    ;RECORD.›0525 ;›0530 ;SEQUENCE CHECK RECORDS›0535 ;›0540        LDY #0         ;RESET STACK INDEX›0545 NEXTFIELD›0550        LDA STACK,Y    ;FIELD POSITION.›0555        LDX STACK+2,Y  ;SORT DIRECTION›0560        STX SORTAD     ;SAVE IT.›0565        LDX STACK+1,Y  ;FIELD LENGTH.›0570        INY            ;BUMP›0575        INY            ;STACK›0580        INY            ;INDEX›0585        STY FLDNDX     ;AND SAVE IT.›0590        TAY            ;FIELD POSITION TO Y›0595        DEY            ;MAKE RELATIVE TO ZERO›0600 SEQCHECK›0605        LDA (PNTR1),Y  ;COMPARE ADJACENT›0610        CMP (PNTR2),Y  ;RECORDS›0615        BEQ SEQNDX     ;= KEEP ON LOOKING›0620        LDA SORTAD     ;GET SORT DIRECTION›0625        BNE DSNDG      ;GO TO DESCENDING›0630 ;›0635 ;  SORT IN ASCENDING SEQUENCE›0640 ;›0645        BCC BUMPINDEX  ;< BUMP NEXT RECORD›0650        BCS SWAP       ;> SWAP POSITIONS›0655 ;›0660 ;  SORT IN DESCENDING SEQUENCE›0665 ;›0670 DSNDG  BCC SWAP       ;< SWAP POSITIONS›0675        BCS BUMPINDEX  ;> BUMP NEXT RECORD›0680 ;›0685 SEQNDX INY            ;CHECK THE LENGTH OF›0690        DEX            ;THE SORT FIELD AND›0695        BNE SEQCHECK   ;KEEP SEQUENCE CHECKING.›0700        LDY FLDNDX     ;ANY MORE FIELDS›0705        CPY FLDCNT     ;TO SORT›0710        BNE NEXTFIELD  ;YES, GO TO IT›0715 ;›0720 ;INDEX THROUGH THE SORT FILE›0725 ;›0730 BUMPINDEX›0735        DEC SCOUNT     ;COUNT DOWN RECORDS›0740        LDA #255       ;AND CHECK FOR›0745        CMP SCOUNT     ;END OF FILE.›0750        BNE NOTEOF     ;›0755        LDX SCOUNT+1   ;›0760        BEQ CKSWAP     ;›0765        DEC SCOUNT+1   ;›0770 NOTEOF LDA PNTR2+1    ;BUMP PNTR2 AND›0775        STA PNTR1+1    ;PNTR1 TO THE›0780        LDA PNTR2      ;NEXT RECORDS.›0785        CLC›0790        BCC BUMPRECORD›0795 ;›0800 ;AT END OF FILE SEE IF A SWAP WAS MADE›0805 ;›0810 CKSWAP LDA BUBLE      ;IF NO RECORDS SWAPPED›0815        BEQ ENDSORT    ;THEN IS END OF SORT,›0820        STX BUBLE      ;ELSE SEQUENCE CHECK›0825        BNE SORT       ;THE FILE AGAIN.›0830 ENDSORT›0835        RTS            ;BACK TO BASIC›0840 ;›0845 ;SWAP RECORDS IF OUT OF SEQUENCE›0850 ;›0855 SWAP   STX BUBLE      ;STILL OUT OF SEQUENCE›0860        LDY #0›0865 SWAPLOP›0870        LDA (PNTR1),Y  ;THIS ROUTINE›0875        TAX            ;EXCHANGES THE›0880        LDA (PNTR2),Y  ;POSITIONS OF TWO›0885        STA (PNTR1),Y  ;OUT OF SEQUENCE›0890        TXA            ;ADJACENT RECORDS›0895        STA (PNTR2),Y  ;›0900        INY›0905        CPY RECSIZ     ;KEEP LOOPING FOR›0910        BNE SWAPLOP    ;THE LENGTH OF RECORD.›0915        BEQ BUMPINDEX  ;GO GET NEXT RECORD›0920        .END›