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 20 27 4E |F 'CURRENT' > 'N|
000004A0: 45 58 54 27 20 54 48 45 4E 20 53 57 41 50 20 4B |EXT' THEN SWAP K|
000004B0: 45 59 0D 3B 20 45 4C 45 4D 45 4E 54 53 2C 20 45 |EY.; ELEMENTS, E|
000004C0: 4C 53 45 20 43 4F 4E 54 49 4E 55 45 0D 3B 0D 4F |LSE CONTINUE.;.O|
000004D0: 52 44 45 52 20 20 43 4D 50 20 43 52 52 4E 54 0D |RDER CMP CRRNT.|
000004E0: 20 20 20 20 20 20 20 50 4C 41 0D 20 20 20 20 20 | PLA. |
000004F0: 20 20 53 42 43 20 43 52 52 4E 54 2B 31 0D 20 20 | SBC CRRNT+1. |
00000500: 20 20 20 20 20 42 56 43 20 54 45 53 54 0D 20 20 | BVC TEST. |
00000510: 20 20 20 20 20 45 4F 52 20 23 24 38 30 0D 54 45 | EOR #$80.TE|
00000520: 53 54 20 20 20 42 50 4C 20 4E 4F 53 57 41 50 0D |ST BPL NOSWAP.|
00000530: 53 57 41 50 20 20 20 54 58 41 0D 20 20 20 20 20 |SWAP TXA. |
00000540: 20 20 54 41 59 0D 20 20 20 20 20 20 20 53 54 58 | TAY. STX|
00000550: 20 54 4F 50 44 49 53 0D 20 20 20 20 20 20 20 4C | TOPDIS. L|
00000560: 44 41 20 28 4B 42 29 2C 59 0D 20 20 20 20 20 20 |DA (KB),Y. |
00000570: 20 50 48 41 0D 20 20 20 20 20 20 20 44 45 59 0D | PHA. DEY.|
00000580: 20 20 20 20 20 20 20 4C 44 41 20 28 4B 42 29 2C | LDA (KB),|
00000590: 59 0D 20 20 20 20 20 20 20 49 4E 59 0D 20 20 20 |Y. INY. |
000005A0: 20 20 20 20 53 54 41 20 28 4B 42 29 2C 59 0D 20 | STA (KB),Y. |
000005B0: 20 20 20 20 20 20 50 4C 41 0D 20 20 20 20 20 20 | PLA. |
000005C0: 20 44 45 59 0D 20 20 20 20 20 20 20 53 54 41 20 | DEY. STA |
000005D0: 28 4B 42 29 2C 59 0D 20 20 20 20 20 20 20 49 4E |(KB),Y. IN|
000005E0: 43 20 46 4C 41 47 0D 4E 4F 53 57 41 50 20 43 50 |C FLAG.NOSWAP CP|
000005F0: 58 20 54 4F 50 0D 20 20 20 20 20 20 20 42 4E 45 |X TOP. BNE|
00000600: 20 4C 4F 4F 50 32 0D 20 20 20 20 20 20 20 4C 44 | LOOP2. LD|
00000610: 41 20 46 4C 41 47 0D 20 20 20 20 20 20 20 42 4E |A FLAG. BN|
00000620: 45 20 4C 4F 4F 50 31 0D 3B 0D 3B 20 55 4E 50 41 |E LOOP1.;.; UNPA|
00000630: 43 4B 20 54 48 45 20 42 59 54 45 20 45 4C 45 4D |CK THE BYTE ELEM|
00000640: 45 4E 54 53 20 4F 46 20 54 48 45 20 27 4B 45 59 |ENTS OF THE 'KEY|
00000650: 27 20 41 52 52 41 59 0D 3B 20 49 4E 54 4F 20 42 |' ARRAY.; INTO B|
00000660: 41 53 49 43 27 53 20 4E 4F 52 4D 41 4C 20 32 2D |ASIC'S NORMAL 2-|
00000670: 42 59 54 45 20 49 4E 54 45 47 45 52 20 46 4F 52 |BYTE INTEGER FOR|
00000680: 4D 41 54 0D 3B 0D 55 4E 50 41 43 4B 20 4C 44 58 |MAT.;.UNPACK LDX|
00000690: 20 4D 41 58 0D 20 20 20 20 20 20 20 49 4E 58 0D | MAX. INX.|
000006A0: 50 4B 4C 4F 4F 50 20 44 45 58 0D 20 20 20 20 20 |PKLOOP DEX. |
000006B0: 20 20 54 58 41 0D 20 20 20 20 20 20 20 54 41 59 | TXA. TAY|
000006C0: 0D 20 20 20 20 20 20 20 4C 44 41 20 28 4B 42 29 |. LDA (KB)|
000006D0: 2C 59 0D 20 20 20 20 20 20 20 50 48 41 0D 20 20 |,Y. PHA. |
000006E0: 20 20 20 20 20 54 58 41 0D 20 20 20 20 20 20 20 | TXA. |
000006F0: 41 53 4C 20 41 20 20 20 20 20 3B 20 4D 4F 56 45 |ASL A ; MOVE|
00000700: 20 54 4F 20 32 2A 49 2B 31 0D 20 20 20 20 20 20 | TO 2*I+1. |
00000710: 20 4F 52 41 20 23 31 0D 20 20 20 20 20 20 20 42 | ORA #1. B|
00000720: 43 43 20 53 54 4F 52 45 0D 20 20 20 20 20 20 20 |CC STORE. |
00000730: 49 4E 43 20 4E 58 54 46 4C 47 0D 20 20 20 20 20 |INC NXTFLG. |
00000740: 20 20 49 4E 43 20 4B 42 2B 31 0D 53 54 4F 52 45 | INC KB+1.STORE|
00000750: 20 20 54 41 59 0D 20 20 20 20 20 20 20 50 4C 41 | TAY. PLA|
00000760: 0D 20 20 20 20 20 20 20 53 54 41 20 28 4B 42 29 |. STA (KB)|
00000770: 2C 59 0D 20 20 20 20 20 20 20 4C 44 41 20 23 30 |,Y. LDA #0|
00000780: 0D 20 20 20 20 20 20 20 44 45 59 0D 20 20 20 20 |. DEY. |
00000790: 20 20 20 53 54 41 20 28 4B 42 29 2C 59 0D 20 20 | STA (KB),Y. |
000007A0: 20 20 20 20 20 4C 44 41 20 4E 58 54 46 4C 47 0D | LDA NXTFLG.|
000007B0: 20 20 20 20 20 20 20 42 45 51 20 4F 4B 0D 20 20 | BEQ OK. |
000007C0: 20 20 20 20 20 44 45 43 20 4E 58 54 46 4C 47 0D | DEC NXTFLG.|
000007D0: 20 20 20 20 20 20 20 44 45 43 20 4B 42 2B 31 0D | DEC KB+1.|
000007E0: 4F 4B 20 20 20 20 20 54 58 41 0D 20 20 20 20 20 |OK TXA. |
000007F0: 20 20 42 4E 45 20 50 4B 4C 4F 4F 50 0D 44 4F 4E | BNE PKLOOP.DON|
00000800: 45 20 20 20 52 54 53 0D 2E 45 4E 44 0D |E 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 K
EY.; ELEMENTS, ELSE CONTINUE.;.ORDER CM
P CRRNT. PLA. SBC CRRNT+1.
BVC TEST. EOR #$80.TEST BPL
NOSWAP.SWAP TXA. TAY. STX
TOPDIS. LDA (KB),Y. PHA.
DEY. LDA (KB),Y. INY.
STA (KB),Y. PLA. DEY.
STA (KB),Y. INC FLAG.NOSWAP CP
X TOP. BNE LOOP2. LDA FLAG.
BNE LOOP1.;.; UNPACK THE BYTE ELEM
ENTS OF THE 'KEY' ARRAY.; INTO BASIC'S N
ORMAL 2-BYTE INTEGER FORMAT.;.UNPACK LDX
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. LDA
NXTFLG. BEQ OK. DEC NXTFLG.
DEC KB+1.OK TXA. BNE PK
LOOP.DONE RTS..END.
×
C64 Image
> CLICK IMAGE PREVIEW FOR FULL MODAL