home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
64'er 1986 July
/
64er_Magazin_86-07_1986_Markt__Technik_de.d64
/
quicksort.ass
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2022-10-26
|
7KB
|
307 lines
10 ;--------------- quicksort.ass ---------------
11 ;
900 ; ------------------------ variablen in der zero page
901 ;
902 .ba 50 000 ; start adresse
903 .eq xadr=10 ; adr. a$(x) in (10,11)
904 .eq yadr=12 ; adr. a$(y) in (12,13)
905 .eq vadr=14 ; adr. a$(v) in (14,15)
906 .eq xdes=16 ; descr. a$(x) in (16,17,18)
907 .eq ydes=19 ; descr. a$(y) in (19,20,21)
908 .eq vdes=22 ; descr. a$(v) in (22,23,24)
909 .eq lg = 25 ; linke grenze in (25,26)
910 .eq rg = 27 ; rechte grenze in (27,28)
911 .eq verl=29 ; vergleichs laengeready.
912 .eq stin=252 ; stack eingangswert
913 .eq stmi=253 ; stack minimum
914 .eq stug=254 ; stack untergrenze
915 ;
1000 ; ------------------------ basic-daten retten
1100 ;stack-pointer ------
1110 tsx
1120 stxstin
1125 stxstmi
1130 txa; stack -
1140 sec; untergrenze
1150 sbc#82; berechnen
1160 bcsspr
1170 rts; abbruch
1180 spr adc#2; 3 byte
1190 stastug; ueber 0
1195 ;
1200 ;zero-page ---------
1210 ldx#19
1220 zpweg lda10,x
1230 pha
1240 dex
1250 bplzpweg
1260 tsx
1270 stxstin
2000 ; ------------------------ anfangs - bedingungen
2100 ; z = 0 ----------
2110 sort lda#0
2120 pha
2130 pha
2200 ; lg = 1 ----------
2210 clc
2220 lda47; feldanfang
2230 adc#10; in (47,48)
2240 stalg; + 10 byte
2250 lda48; vorspann
2260 adc#0; ergibt
2270 stalg+1; adr a$(1)
2300 ; rg = a ----------
2310 clc; feldlaenge
2320 ldy#2; steht im
2330 lda(47),y; vorspann
2340 adc47; plus
2350 tax; feldanfang
2360 iny
2370 lda(47),y
2380 adc48
2390 tay
2400 sec
2410 txa; minus
2420 sbc#3; 3 byte
2430 starg; fuer letzten
2440 pha; descriptor
2450 tya; ergibt
2460 sbc#0; adr a$(a)
2470 starg+1
2480 pha
2490 bnevstring
2500 ; z = 1 ----------
2510 ; bedeutet rg(1) auf stack legen
2520 ; siehe zeile 2440 und 2480
2530 bruecke4 bnesort
2540 ;
3000 ;------------------------ vergleichsstring berechnen
3100 ;x=lg:y=rg ----------
3110 vstring ldx#3
3120 ladxy ldalg,x
3130 staxadr,x; lade -
3140 dex; schleife
3150 bplladxy
3200 ;v = x + y ----------
3210 clc
3220 ldaxadr
3230 adcyadr
3240 tax
3250 ldaxadr+1
3260 adcyadr+1
3300 ;v = int(v/2) ----------
3310 lsr; high byte
3320 stavadr+1; rechts shift
3330 txa; low byte
3340 ror; rotation
3350 bccspr1; rechts
3360 sbc#1; int -
3370 bcsspr1; modulo
3380 decvadr+1; 3
3390 spr1 stavadr
3400 ;v$ = a$(v) ----------
3410 ldy#0; descriptor
3420 lda(vadr),y; a$(v)
3430 stavdes; in der
3440 iny; zero page
3450 lda(vadr),y; speichern
3460 stavdes+1
3470 iny
3480 lda(vadr),y
3490 stavdes+2
3495 ;
4000 ; ------------------------ x - vergleichsschleife
4100 ;x$ = a$(x) ----------
4110 verglx ldy#0; descriptor
4120 lda(xadr),y; a$(x)
4130 staxdes; in der
4140 iny; zero page
4150 lda(xadr),y; speichern
4160 staxdes+1
4170 iny
4180 lda(xadr),y
4190 staxdes+2
4200 ;vergleichs-laenge ----------
4210 ldx#0; x$ kuerzer:
4220 ldaxdes; xreg=0
4230 cmpvdes; verl=len(x$)
4240 bccspr2; v$ kuerzer:
4250 inx; xreg=1
4260 ldavdes; verl=len(v$)
4270 spr2 staverl
4300 ;x$ <?> v$ ----------
4310 ldy#0; hauptschleife
4320 verglx1 lda(xdes+1),y; -------------
4330 cmp(vdes+1),y; byte um byte
4340 bneverglx2; vergleichen
4350 iny
4360 cpyverl; vergl.laenge
4370 bccverglx1; pruefen
4380 cpx#1
4390 verglx2 bcsvergly
4400 ;x = x + 1 ----------
4410 clc
4420 ldaxadr; low-byte
4430 adc#3; + 3
4440 staxadr; zeigt auf
4450 bccverglx; naechsten
4460 incxadr+1; descriptor
4470 bcsverglx
4480 ;sprung --------------
4490 bruecke1 bccvstring
4491 bruecke5 bnebruecke4
4495 ;
5000 ; ------------------------ y - vergleichsschleife
5100 ;y$ = a$(y) ----------
5110 vergly ldy#0; descriptor
5120 lda(yadr),y; a$(y)
5130 staydes; in der
5140 iny; zero page
5150 lda(yadr),y; speichern
5160 staydes+1
5170 iny
5180 lda(yadr),y
5190 staydes+2
5200 ;vergleichs-laenge ----------
5210 ldx#0; v$ kuerzer:
5220 ldavdes; xreg=0
5230 cmpydes; verl=len(v$)
5240 bccspr3; y$ kuerzer :
5250 inx; xreg=1
5260 ldaydes; verl=len(y$)
5270 spr3 staverl
5300 ;y$ <?> v$ ----------
5310 ldy#0; hauptschleife
5320 vergly1 lda(vdes+1),y; -------------
5330 cmp(ydes+1),y; byte um byte
5340 bnevergly2; vergleichen
5350 iny
5360 cpyverl; vergl.laenge
5370 bccvergly1; pruefen
5380 cpx#1
5390 vergly2 bcstausch
5400 ;y = y - 1 ----------
5410 sec
5420 ldayadr; low-byte
5430 sbc#3; - 3
5440 stayadr; zeigt auf
5450 bcsvergly; vorherigen
5460 decyadr+1; descriptor
5470 bccvergly
5480 ;sprung --------------
5490 bruecke2 bcsverglx
5491 bruecke3 bccbruecke1
5492 bruecke6 bnebruecke5
5495 ;
6000 ; ------------------------ strings vertauschen
6100 ;if x>=y ----------
6110 tausch ldayadr+1; high
6120 cmpxadr+1; bytes
6130 bcczstufen; x>y
6140 bneswap; x<y
6150 ldaxadr; low
6160 cmpyadr; bytes
6170 bcszstufen; x>=y
6200 ;swap x$,y$ ----------
6210 swap ldx#2
6220 ldy#2
6230 swap1 ldaxdes,x; x-descriptor
6240 sta(yadr),y; nach a$(y)
6250 ldaydes,x; y-descriptor
6260 sta(xadr),y; nach a$(x)
6270 dex
6280 dey
6290 bplswap1
6300 ;x = x + 1 ----------
6310 clc
6320 ldaxadr; siehe
6330 adc#3; zeile
6340 staxadr; 4400
6350 bccspr4
6360 incxadr+1
6400 ;y = y - 1 ----------
6410 spr4 sec
6420 ldayadr; siehe
6430 sbc#3; zeile
6440 stayadr; 5400
6450 bcsspr5
6460 decyadr+1
6500 ;if x <= y ----------
6510 spr5 ldayadr+1
6520 cmpxadr+1
6530 bcczstufen; x>y
6540 bnebruecke2; x<y
6550 ldayadr
6560 cmpxadr
6570 bcsbruecke2; x<=y
6580 bcczstufen; x>y
6600 ; sprung --------------
6610 bruecke7 bnebruecke6
7000 ;------------------------ stufen-verzweigung
7100 ;z=z+1:rg=y ----------
7110 zplus ldarg; z = z + 1
7120 pha; bedeutet
7130 ldarg+1; rg auf stack
7140 pha; legen
7150 ldayadr
7160 starg; rg
7170 ldayadr+1; =
7180 starg+1; y
7185 clc; neuen v$
7190 bccbruecke3;berechnen
7200 ;lg = lg + 1 ----------
7210 zgleich clc
7220 ldalg
7230 adc#3; siehe
7240 stalg; zeile
7250 bccspr6; 4400
7260 iny
7270 spr6 stylg+1
7300 ;if lg < rg ----------
7310 cpyrg+1
7320 bccbruecke3; lg<rg
7330 bnezminus; lg>rg
7340 cmprg
7350 bccbruecke3; lg<rg
7360 bcszminus; lg>=rg
7400 ;if lg < rg ----------
7410 zstufen ldalg
7420 ldylg+1
7430 cpyyadr+1
7440 bccstack; lg<rg
7450 bnezgleich; lg>rg
7460 cmpyadr
7470 bccstack; lg<rg
7480 bcszgleich; lg>=rg
7500 ;stack pruefen -------
7510 stack tsx
7520 cpxstmi; stackminimum
7530 bcszplus; pruefen
7540 stxstmi
7550 cpxstug; stack-ug
7560 bcszplus; pruefen
7570 ldxstin; ruecksprung
7580 txs; zum
7585 bnebruecke7; anfang
7600 ;z = z - 1 ----------
7610 zminus pla; z = z - 1
7620 starg+1; bedeutet
7630 pla; rg vom stack
7640 starg; holen
7650 ldxrg+1
7660 cpx#0; rg highbyte
7670 bnezgleich; > 0
7680 ; ; = 0
8000 ; ----------------------- basic-daten speichern
8100 ;stack-pointer -----
8110 aus ldxstin
8120 txs
8200 ;zero-page ---------
8210 ldx#0
8220 zprueck pla
8230 sta10,x
8240 inx
8250 cpx#20
8260 bcczprueck
8270 rts