home *** CD-ROM | disk | FTP | other *** search
- 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¢