00000000: 3B 20 4B 45 59 53 4F 52 54 20 2D 20 52 45 4C 4F |; KEYSORT - RELO|
00000010: 43 41 54 41 42 4C 45 20 42 55 42 42 4C 45 20 53 |CATABLE BUBBLE S|
00000020: 4F 52 54 20 55 53 49 4E 47 20 4B 45 59 20 41 52 |ORT USING KEY AR|
00000030: 52 41 59 0D 3B 20 50 4F 49 4E 54 49 4E 47 20 54 |RAY.; POINTING T|
00000040: 4F 20 49 4E 54 45 47 45 52 20 41 52 52 41 59 0D |O INTEGER ARRAY.|
00000050: 3B 0D 3B 20 20 52 49 43 48 41 52 44 20 4C 2E 20 |;.; RICHARD L. |
00000060: 52 59 4C 41 4E 44 45 52 20 20 20 20 31 2F 31 32 |RYLANDER 1/12|
00000070: 2F 38 35 0D 3B 0D 4F 52 49 47 49 4E 3D 24 43 46 |/85.;.ORIGIN=$CF|
00000080: 35 39 20 20 3B 20 35 33 30 38 31 2E 20 28 46 4F |59 ; 53081. (FO|
00000090: 4C 4C 4F 57 49 4E 47 20 44 4F 53 20 35 2E 31 29 |LLOWING DOS 5.1)|
000000A0: 0D 3B 0D 4B 42 20 20 20 20 20 3D 20 24 46 42 20 |.;.KB = $FB |
000000B0: 20 3B 20 32 35 31 2E 20 50 4F 49 4E 54 45 52 20 | ; 251. POINTER |
000000C0: 54 4F 20 4B 45 59 20 41 52 52 41 59 0D 5A 42 20 |TO KEY ARRAY.ZB |
000000D0: 20 20 20 20 3D 20 24 46 44 20 20 3B 20 32 35 33 | = $FD ; 253|
000000E0: 2E 20 50 4F 49 4E 54 45 52 20 54 4F 20 44 41 54 |. POINTER TO DAT|
000000F0: 41 20 41 52 52 41 59 0D 4D 41 58 20 20 20 20 3D |A ARRAY.MAX =|
00000100: 20 24 38 43 20 20 3B 20 31 34 30 2E 20 50 4F 4B | $8C ; 140. POK|
00000110: 45 20 57 49 54 48 20 4D 41 58 20 41 52 52 41 59 |E WITH MAX ARRAY|
00000120: 20 49 4E 44 45 58 0D 54 4F 50 20 20 20 20 3D 20 | INDEX.TOP = |
00000130: 24 41 43 0D 54 4F 50 44 49 53 20 3D 20 24 41 44 |$AC.TOPDIS = $AD|
00000140: 0D 46 4C 41 47 20 20 20 3D 20 24 41 45 0D 4E 58 |.FLAG = $AE.NX|
00000150: 54 46 4C 47 20 3D 20 24 36 31 0D 43 52 52 4E 54 |TFLG = $61.CRRNT|
00000160: 20 20 3D 20 24 36 32 0D 52 45 50 45 41 54 20 3D | = $62.REPEAT =|
00000170: 20 24 36 34 0D 3B 0D 20 20 20 20 20 20 2A 3D 4F | $64.;. *=O|
00000180: 52 49 47 49 4E 0D 3B 0D 49 4E 49 54 20 20 20 4C |RIGIN.;.INIT L|
00000190: 44 59 20 23 24 46 46 20 20 20 20 20 3B 20 49 4E |DY #$FF ; IN|
000001A0: 49 54 49 41 4C 49 5A 45 20 4B 45 59 20 41 52 52 |ITIALIZE KEY ARR|
000001B0: 41 59 0D 49 4E 4C 4F 4F 50 20 49 4E 59 0D 20 20 |AY.INLOOP INY. |
000001C0: 20 20 20 20 20 54 59 41 0D 20 20 20 20 20 20 20 | TYA. |
000001D0: 53 54 41 20 28 4B 42 29 2C 59 0D 20 20 20 20 20 |STA (KB),Y. |
000001E0: 20 20 43 4D 50 20 4D 41 58 0D 20 20 20 20 20 20 | CMP MAX. |
000001F0: 20 42 4E 45 20 49 4E 4C 4F 4F 50 0D 3B 0D 53 4F | BNE INLOOP.;.SO|
00000200: 52 54 20 20 20 53 54 41 20 54 4F 50 44 49 53 20 |RT STA TOPDIS |
00000210: 20 20 3B 20 27 41 27 20 48 4F 4C 44 53 20 27 4D | ; 'A' HOLDS 'M|
00000220: 41 58 27 0D 4C 4F 4F 50 31 20 20 4C 44 41 20 54 |AX'.LOOP1 LDA T|
00000230: 4F 50 44 49 53 0D 20 20 20 20 20 20 20 53 54 41 |OPDIS. STA|
00000240: 20 54 4F 50 0D 20 20 20 20 20 20 20 4C 44 58 20 | TOP. LDX |
00000250: 23 30 0D 20 20 20 20 20 20 20 53 54 58 20 4E 58 |#0. STX NX|
00000260: 54 46 4C 47 0D 20 20 20 20 20 20 20 53 54 58 20 |TFLG. STX |
00000270: 46 4C 41 47 0D 4C 4F 4F 50 32 20 20 53 54 58 20 |FLAG.LOOP2 STX |
00000280: 52 45 50 45 41 54 0D 3B 0D 3B 20 47 45 54 20 42 |REPEAT.;.; GET B|
00000290: 4F 54 48 20 42 59 54 45 53 20 4F 46 20 49 4E 54 |OTH BYTES OF INT|
000002A0: 45 47 45 52 20 50 4F 49 4E 54 45 44 20 54 4F 20 |EGER POINTED TO |
000002B0: 42 59 0D 3B 20 27 4B 45 59 27 20 45 4C 45 4D 45 |BY.; 'KEY' ELEME|
000002C0: 4E 54 2E 20 20 52 45 54 55 52 4E 20 57 49 54 48 |NT. RETURN WITH|
000002D0: 20 4D 53 42 20 4F 4E 20 53 54 41 43 4B 0D 3B 20 | MSB ON STACK.; |
000002E0: 41 4E 44 20 4C 53 42 20 49 4E 20 54 48 45 20 41 |AND LSB IN THE A|
000002F0: 43 43 55 4D 55 4C 41 54 4F 52 0D 3B 0D 47 45 54 |CCUMULATOR.;.GET|
00000300: 49 4E 54 20 54 58 41 0D 20 20 20 20 20 20 20 54 |INT TXA. T|
00000310: 41 59 0D 20 20 20 20 20 20 20 4C 44 41 20 28 4B |AY. LDA (K|
00000320: 42 29 2C 59 0D 20 20 20 20 20 20 20 41 53 4C 20 |B),Y. ASL |
00000330: 41 0D 20 20 20 20 20 20 20 42 43 43 20 4C 4F 41 |A. BCC LOA|
00000340: 44 0D 20 20 20 20 20 20 20 44 45 43 20 4E 58 54 |D. DEC NXT|
00000350: 46 4C 47 0D 20 20 20 20 20 20 20 49 4E 43 20 5A |FLG. INC Z|
00000360: 42 2B 31 0D 4C 4F 41 44 20 20 20 54 41 59 0D 20 |B+1.LOAD TAY. |
00000370: 20 20 20 20 20 20 4C 44 41 20 28 5A 42 29 2C 59 | LDA (ZB),Y|
00000380: 0D 20 20 20 20 20 20 20 50 48 41 0D 20 20 20 20 |. PHA. |
00000390: 20 20 20 49 4E 59 0D 20 20 20 20 20 20 20 4C 44 | INY. LD|
000003A0: 41 20 28 5A 42 29 2C 59 0D 20 20 20 20 20 20 20 |A (ZB),Y. |
000003B0: 42 49 54 20 4E 58 54 46 4C 47 0D 20 20 20 20 20 |BIT NXTFLG. |
000003C0: 20 20 42 50 4C 20 4E 4F 44 45 43 0D 20 20 20 20 | BPL NODEC. |
000003D0: 20 20 20 49 4E 43 20 4E 58 54 46 4C 47 0D 20 20 | INC NXTFLG. |
000003E0: 20 20 20 20 20 44 45 43 20 5A 42 2B 31 0D 4E 4F | DEC ZB+1.NO|
000003F0: 44 45 43 20 20 43 50 58 20 52 45 50 45 41 54 0D |DEC CPX REPEAT.|
00000400: 20 20 20 20 20 20 20 42 4E 45 20 4F 52 44 45 52 | BNE ORDER|
00000410: 0D 20 20 20 20 20 20 20 53 54 41 20 43 52 52 4E |. STA CRRN|
00000420: 54 0D 20 20 20 20 20 20 20 50 4C 41 0D 20 20 20 |T. PLA. |
00000430: 20 20 20 20 53 54 41 20 43 52 52 4E 54 2B 31 0D | STA CRRNT+1.|
00000440: 20 20 20 20 20 20 20 49 4E 58 0D 20 20 20 20 20 | INX. |
00000450: 20 20 42 4E 45 20 47 45 54 49 4E 54 0D 3B 0D 3B | BNE GETINT.;.;|
00000460: 20 43 4F 4D 50 41 52 45 20 49 4E 54 45 47 45 52 | COMPARE INTEGER|
00000470: 53 20 4F 42 54 41 49 4E 45 44 20 54 48 52 4F 55 |S OBTAINED THROU|
00000480: 47 48 20 4B 45 59 20 41 52 52 41 59 0D 3B 20 49 |GH KEY ARRAY.; I|
00000490: 46 20 27 43 55 52 52 45 4E 54 27 20 3E 3D 20 27 |F 'CURRENT' >= '|
000004A0: 4E 45 58 54 27 20 54 48 45 4E 20 53 57 41 50 20 |NEXT' THEN SWAP |
000004B0: 4B 45 59 0D 3B 20 45 4C 45 4D 45 4E 54 53 2C 20 |KEY.; ELEMENTS, |
000004C0: 45 4C 53 45 20 43 4F 4E 54 49 4E 55 45 0D 3B 0D |ELSE CONTINUE.;.|
000004D0: 4F 52 44 45 52 20 20 43 4D 50 20 43 52 52 4E 54 |ORDER CMP CRRNT|
000004E0: 0D 20 20 20 20 20 20 20 50 4C 41 0D 20 20 20 20 |. PLA. |
000004F0: 20 20 20 53 42 43 20 43 52 52 4E 54 2B 31 0D 20 | SBC CRRNT+1. |
00000500: 20 20 20 20 20 20 42 56 43 20 54 45 53 54 0D 20 | BVC TEST. |
00000510: 20 20 20 20 20 20 45 4F 52 20 23 24 38 30 0D 54 | EOR #$80.T|
00000520: 45 53 54 20 20 20 42 50 4C 20 4E 4F 53 57 41 50 |EST BPL NOSWAP|
00000530: 0D 53 57 41 50 20 20 20 54 58 41 0D 20 20 20 20 |.SWAP TXA. |
00000540: 20 20 20 54 41 59 0D 20 20 20 20 20 20 20 53 54 | TAY. ST|
00000550: 58 20 54 4F 50 44 49 53 0D 20 20 20 20 20 20 20 |X TOPDIS. |
00000560: 4C 44 41 20 28 4B 42 29 2C 59 0D 20 20 20 20 20 |LDA (KB),Y. |
00000570: 20 20 50 48 41 0D 20 20 20 20 20 20 20 44 45 59 | PHA. DEY|
00000580: 0D 20 20 20 20 20 20 20 4C 44 41 20 28 4B 42 29 |. LDA (KB)|
00000590: 2C 59 0D 20 20 20 20 20 20 20 49 4E 59 0D 20 20 |,Y. INY. |
000005A0: 20 20 20 20 20 53 54 41 20 28 4B 42 29 2C 59 0D | STA (KB),Y.|
000005B0: 20 20 20 20 20 20 20 50 4C 41 0D 20 20 20 20 20 | PLA. |
000005C0: 20 20 44 45 59 0D 20 20 20 20 20 20 20 53 54 41 | DEY. STA|
000005D0: 20 28 4B 42 29 2C 59 0D 20 20 20 20 20 20 20 49 | (KB),Y. I|
000005E0: 4E 43 20 46 4C 41 47 0D 4E 4F 53 57 41 50 20 43 |NC FLAG.NOSWAP C|
000005F0: 50 58 20 54 4F 50 0D 20 20 20 20 20 20 20 42 4E |PX TOP. BN|
00000600: 45 20 4C 4F 4F 50 32 0D 20 20 20 20 20 20 20 4C |E LOOP2. L|
00000610: 44 41 20 46 4C 41 47 0D 20 20 20 20 20 20 20 42 |DA FLAG. B|
00000620: 4E 45 20 4C 4F 4F 50 31 0D 3B 0D 3B 20 55 4E 50 |NE LOOP1.;.; UNP|
00000630: 41 43 4B 20 54 48 45 20 42 59 54 45 20 45 4C 45 |ACK THE BYTE ELE|
00000640: 4D 45 4E 54 53 20 4F 46 20 54 48 45 20 27 4B 45 |MENTS OF THE 'KE|
00000650: 59 27 20 41 52 52 41 59 0D 3B 20 49 4E 54 4F 20 |Y' ARRAY.; INTO |
00000660: 42 41 53 49 43 27 53 20 4E 4F 52 4D 41 4C 20 32 |BASIC'S NORMAL 2|
00000670: 2D 42 59 54 45 20 49 4E 54 45 47 45 52 20 46 4F |-BYTE INTEGER FO|
00000680: 52 4D 41 54 0D 3B 0D 55 4E 50 41 43 4B 20 4C 44 |RMAT.;.UNPACK LD|
00000690: 58 20 4D 41 58 0D 20 20 20 20 20 20 20 49 4E 58 |X MAX. INX|
000006A0: 0D 50 4B 4C 4F 4F 50 20 44 45 58 0D 20 20 20 20 |.PKLOOP DEX. |
000006B0: 20 20 20 54 58 41 0D 20 20 20 20 20 20 20 54 41 | TXA. TA|
000006C0: 59 0D 20 20 20 20 20 20 20 4C 44 41 20 28 4B 42 |Y. LDA (KB|
000006D0: 29 2C 59 0D 20 20 20 20 20 20 20 50 48 41 0D 20 |),Y. PHA. |
000006E0: 20 20 20 20 20 20 54 58 41 0D 20 20 20 20 20 20 | TXA. |
000006F0: 20 41 53 4C 20 41 20 20 20 20 20 3B 20 4D 4F 56 | ASL A ; MOV|
00000700: 45 20 54 4F 20 32 2A 49 2B 31 0D 20 20 20 20 20 |E TO 2*I+1. |
00000710: 20 20 4F 52 41 20 23 31 0D 20 20 20 20 20 20 20 | ORA #1. |
00000720: 42 43 43 20 53 54 4F 52 45 0D 20 20 20 20 20 20 |BCC STORE. |
00000730: 20 49 4E 43 20 4E 58 54 46 4C 47 0D 20 20 20 20 | INC NXTFLG. |
00000740: 20 20 20 49 4E 43 20 4B 42 2B 31 0D 53 54 4F 52 | INC KB+1.STOR|
00000750: 45 20 20 54 41 59 0D 20 20 20 20 20 20 20 50 4C |E TAY. PL|
00000760: 41 0D 20 20 20 20 20 20 20 53 54 41 20 28 4B 42 |A. STA (KB|
00000770: 29 2C 59 0D 20 20 20 20 20 20 20 4C 44 41 20 23 |),Y. LDA #|
00000780: 30 0D 20 20 20 20 20 20 20 44 45 59 0D 20 20 20 |0. DEY. |
00000790: 20 20 20 20 53 54 41 20 28 4B 42 29 2C 59 0D 20 | STA (KB),Y. |
000007A0: 20 20 20 20 20 20 4C 44 41 20 4E 58 54 46 4C 47 | LDA NXTFLG|
000007B0: 0D 20 20 20 20 20 20 20 42 45 51 20 4F 4B 0D 20 |. BEQ OK. |
000007C0: 20 20 20 20 20 20 44 45 43 20 4E 58 54 46 4C 47 | DEC NXTFLG|
000007D0: 0D 20 20 20 20 20 20 20 44 45 43 20 4B 42 2B 31 |. DEC KB+1|
000007E0: 0D 4F 4B 20 20 20 20 20 54 58 41 0D 20 20 20 20 |.OK TXA. |
000007F0: 20 20 20 42 4E 45 20 50 4B 4C 4F 4F 50 0D 44 4F | BNE PKLOOP.DO|
00000800: 4E 45 20 20 20 52 54 53 0D 2E 45 4E 44 0D |NE RTS..END. |
; KEYSORT - RELOCATABLE BUBBLE SORT USIN
G KEY ARRAY.; POINTING TO INTEGER ARRAY.
;.; RICHARD L. RYLANDER 1/12/85.;.OR
IGIN=$CF59 ; 53081. (FOLLOWING DOS 5.1)
.;.KB = $FB ; 251. POINTER TO KEY A
RRAY.ZB = $FD ; 253. POINTER TO DAT
A ARRAY.MAX = $8C ; 140. POKE WITH M
AX ARRAY INDEX.TOP = $AC.TOPDIS = $AD
.FLAG = $AE.NXTFLG = $61.CRRNT = $62.
REPEAT = $64.;. *=ORIGIN.;.INIT L
DY #$FF ; INITIALIZE KEY ARRAY.INLOO
P INY. TYA. STA (KB),Y.
CMP MAX. BNE INLOOP.;.SORT STA
TOPDIS ; 'A' HOLDS 'MAX'.LOOP1 LDA T
OPDIS. STA TOP. LDX #0.
STX NXTFLG. STX FLAG.LOOP2 STX
REPEAT.;.; GET BOTH BYTES OF INTEGER POI
NTED TO BY.; 'KEY' ELEMENT. RETURN WITH
MSB ON STACK.; AND LSB IN THE ACCUMULAT
OR.;.GETINT TXA. TAY. LDA (K
B),Y. ASL A. BCC LOAD.
DEC NXTFLG. INC ZB+1.LOAD TAY.
LDA (ZB),Y. PHA. INY.
LDA (ZB),Y. BIT NXTFLG.
BPL NODEC. INC NXTFLG. DEC
ZB+1.NODEC CPX REPEAT. BNE ORDER
. STA CRRNT. PLA. STA
CRRNT+1. INX. BNE GETINT.;.;
COMPARE INTEGERS OBTAINED THROUGH KEY A
RRAY.; IF 'CURRENT' >= 'NEXT' THEN SWAP
KEY.; ELEMENTS, ELSE CONTINUE.;.ORDER C
MP CRRNT. PLA. SBC CRRNT+1.
BVC TEST. EOR #$80.TEST BP
L NOSWAP.SWAP TXA. TAY. ST
X TOPDIS. LDA (KB),Y. PHA.
DEY. LDA (KB),Y. INY.
STA (KB),Y. PLA. DEY.
STA (KB),Y. INC FLAG.NOSWAP C
PX TOP. BNE LOOP2. LDA FLAG.
BNE LOOP1.;.; UNPACK THE BYTE ELE
MENTS OF THE 'KEY' ARRAY.; INTO BASIC'S
NORMAL 2-BYTE INTEGER FORMAT.;.UNPACK LD
X MAX. INX.PKLOOP DEX. TXA.
TAY. LDA (KB),Y. PHA.
TXA. ASL A ; MOVE TO 2*I
+1. ORA #1. BCC STORE.
INC NXTFLG. INC KB+1.STORE TAY.
PLA. STA (KB),Y. LDA #
0. DEY. STA (KB),Y. LD
A NXTFLG. BEQ OK. DEC NXTFLG
. DEC KB+1.OK TXA. BNE P
KLOOP.DONE RTS..END.
×
C64 Image
> CLICK IMAGE PREVIEW FOR FULL MODAL