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 >
Commodore BASIC  |  2022-10-26  |  7KB  |  307 lines

  1. 10 ;--------------- quicksort.ass ---------------
  2. 11 ;
  3. 900 ; ------------------------ variablen in der zero page
  4. 901 ;
  5. 902 .ba   50 000   ; start adresse
  6. 903 .eq xadr=10    ; adr.  a$(x) in (10,11)
  7. 904 .eq yadr=12    ; adr.  a$(y) in (12,13)
  8. 905 .eq vadr=14    ; adr.  a$(v) in (14,15)
  9. 906 .eq xdes=16    ; descr. a$(x) in (16,17,18)
  10. 907 .eq ydes=19    ; descr. a$(y) in (19,20,21)
  11. 908 .eq vdes=22    ; descr. a$(v) in (22,23,24)
  12. 909 .eq lg = 25    ; linke grenze in (25,26)
  13. 910 .eq rg = 27    ; rechte grenze in (27,28)
  14. 911 .eq verl=29    ; vergleichs laengeready.
  15. 912 .eq stin=252   ; stack eingangswert
  16. 913 .eq stmi=253   ; stack minimum
  17. 914 .eq stug=254   ; stack untergrenze
  18. 915 ;
  19. 1000 ; ------------------------ basic-daten retten
  20. 1100 ;stack-pointer ------
  21. 1110  tsx
  22. 1120  stxstin
  23. 1125  stxstmi
  24. 1130  txa; stack -
  25. 1140  sec; untergrenze
  26. 1150  sbc#82; berechnen
  27. 1160  bcsspr
  28. 1170  rts; abbruch
  29. 1180 spr adc#2; 3 byte
  30. 1190  stastug; ueber 0
  31. 1195 ;
  32. 1200 ;zero-page ---------
  33. 1210  ldx#19
  34. 1220 zpweg lda10,x
  35. 1230  pha
  36. 1240  dex
  37. 1250  bplzpweg
  38. 1260  tsx
  39. 1270  stxstin
  40. 2000 ; ------------------------ anfangs - bedingungen
  41. 2100 ; z = 0 ----------
  42. 2110 sort lda#0
  43. 2120  pha
  44. 2130  pha
  45. 2200 ; lg = 1 ----------
  46. 2210  clc
  47. 2220  lda47; feldanfang
  48. 2230  adc#10; in (47,48)
  49. 2240  stalg;  + 10 byte
  50. 2250  lda48;  vorspann
  51. 2260  adc#0;  ergibt
  52. 2270  stalg+1; adr a$(1)
  53. 2300 ; rg = a ----------
  54. 2310  clc; feldlaenge
  55. 2320  ldy#2; steht  im
  56. 2330  lda(47),y; vorspann
  57. 2340  adc47;   plus
  58. 2350  tax; feldanfang
  59. 2360  iny
  60. 2370  lda(47),y
  61. 2380  adc48
  62. 2390  tay
  63. 2400  sec
  64. 2410  txa;   minus
  65. 2420  sbc#3;   3 byte
  66. 2430  starg; fuer letzten
  67. 2440  pha; descriptor
  68. 2450  tya;  ergibt
  69. 2460  sbc#0; adr a$(a)
  70. 2470  starg+1
  71. 2480  pha
  72. 2490  bnevstring
  73. 2500 ; z = 1 ----------
  74. 2510 ;         bedeutet rg(1) auf stack legen
  75. 2520 ;         siehe zeile 2440 und 2480
  76. 2530 bruecke4 bnesort
  77. 2540 ;
  78. 3000 ;------------------------ vergleichsstring berechnen
  79. 3100 ;x=lg:y=rg ----------
  80. 3110 vstring ldx#3
  81. 3120 ladxy ldalg,x
  82. 3130  staxadr,x;   lade -
  83. 3140  dex;  schleife
  84. 3150  bplladxy
  85. 3200 ;v = x + y ----------
  86. 3210  clc
  87. 3220  ldaxadr
  88. 3230  adcyadr
  89. 3240  tax
  90. 3250  ldaxadr+1
  91. 3260  adcyadr+1
  92. 3300 ;v = int(v/2) ----------
  93. 3310  lsr; high byte
  94. 3320  stavadr+1; rechts shift
  95. 3330  txa; low byte
  96. 3340  ror; rotation
  97. 3350  bccspr1; rechts
  98. 3360  sbc#1; int -
  99. 3370  bcsspr1; modulo
  100. 3380  decvadr+1;   3
  101. 3390 spr1 stavadr
  102. 3400 ;v$ = a$(v) ----------
  103. 3410  ldy#0; descriptor
  104. 3420  lda(vadr),y;   a$(v)
  105. 3430  stavdes;  in der
  106. 3440  iny; zero page
  107. 3450  lda(vadr),y; speichern
  108. 3460  stavdes+1
  109. 3470  iny
  110. 3480  lda(vadr),y
  111. 3490  stavdes+2
  112. 3495 ;
  113. 4000 ; ------------------------ x - vergleichsschleife
  114. 4100 ;x$ = a$(x) ----------
  115. 4110 verglx ldy#0; descriptor
  116. 4120  lda(xadr),y;   a$(x)
  117. 4130  staxdes;  in der
  118. 4140  iny; zero page
  119. 4150  lda(xadr),y; speichern
  120. 4160  staxdes+1
  121. 4170  iny
  122. 4180  lda(xadr),y
  123. 4190  staxdes+2
  124. 4200 ;vergleichs-laenge ----------
  125. 4210  ldx#0; x$ kuerzer:
  126. 4220  ldaxdes;  xreg=0
  127. 4230  cmpvdes;  verl=len(x$)
  128. 4240  bccspr2; v$ kuerzer:
  129. 4250  inx;  xreg=1
  130. 4260  ldavdes;  verl=len(v$)
  131. 4270 spr2 staverl
  132. 4300 ;x$ <?> v$ ----------
  133. 4310  ldy#0; hauptschleife
  134. 4320 verglx1 lda(xdes+1),y; -------------
  135. 4330  cmp(vdes+1),y; byte um byte
  136. 4340  bneverglx2; vergleichen
  137. 4350  iny
  138. 4360  cpyverl; vergl.laenge
  139. 4370  bccverglx1;   pruefen
  140. 4380  cpx#1
  141. 4390 verglx2 bcsvergly
  142. 4400 ;x = x + 1 ----------
  143. 4410  clc
  144. 4420  ldaxadr; low-byte
  145. 4430  adc#3;   + 3
  146. 4440  staxadr; zeigt auf
  147. 4450  bccverglx; naechsten
  148. 4460  incxadr+1; descriptor
  149. 4470  bcsverglx
  150. 4480 ;sprung --------------
  151. 4490 bruecke1 bccvstring
  152. 4491 bruecke5 bnebruecke4
  153. 4495 ;
  154. 5000 ; ------------------------ y - vergleichsschleife
  155. 5100 ;y$ = a$(y) ----------
  156. 5110 vergly ldy#0; descriptor
  157. 5120  lda(yadr),y;   a$(y)
  158. 5130  staydes;  in der
  159. 5140  iny; zero page
  160. 5150  lda(yadr),y; speichern
  161. 5160  staydes+1
  162. 5170  iny
  163. 5180  lda(yadr),y
  164. 5190  staydes+2
  165. 5200 ;vergleichs-laenge ----------
  166. 5210  ldx#0; v$ kuerzer:
  167. 5220  ldavdes;  xreg=0
  168. 5230  cmpydes;  verl=len(v$)
  169. 5240  bccspr3; y$ kuerzer :
  170. 5250  inx;  xreg=1
  171. 5260  ldaydes;  verl=len(y$)
  172. 5270 spr3 staverl
  173. 5300 ;y$ <?> v$ ----------
  174. 5310  ldy#0; hauptschleife
  175. 5320 vergly1 lda(vdes+1),y; -------------
  176. 5330  cmp(ydes+1),y; byte um byte
  177. 5340  bnevergly2; vergleichen
  178. 5350  iny
  179. 5360  cpyverl; vergl.laenge
  180. 5370  bccvergly1;   pruefen
  181. 5380  cpx#1
  182. 5390 vergly2 bcstausch
  183. 5400 ;y = y - 1 ----------
  184. 5410  sec
  185. 5420  ldayadr; low-byte
  186. 5430  sbc#3;   - 3
  187. 5440  stayadr; zeigt auf
  188. 5450  bcsvergly; vorherigen
  189. 5460  decyadr+1; descriptor
  190. 5470  bccvergly
  191. 5480 ;sprung --------------
  192. 5490 bruecke2 bcsverglx
  193. 5491 bruecke3 bccbruecke1
  194. 5492 bruecke6 bnebruecke5
  195. 5495 ;
  196. 6000 ; ------------------------ strings vertauschen
  197. 6100 ;if x>=y  ----------
  198. 6110 tausch ldayadr+1; high
  199. 6120  cmpxadr+1; bytes
  200. 6130  bcczstufen; x>y
  201. 6140  bneswap; x<y
  202. 6150  ldaxadr; low
  203. 6160  cmpyadr; bytes
  204. 6170  bcszstufen; x>=y
  205. 6200 ;swap x$,y$ ----------
  206. 6210 swap ldx#2
  207. 6220  ldy#2
  208. 6230 swap1 ldaxdes,x; x-descriptor
  209. 6240  sta(yadr),y;  nach a$(y)
  210. 6250  ldaydes,x; y-descriptor
  211. 6260  sta(xadr),y;  nach a$(x)
  212. 6270  dex
  213. 6280  dey
  214. 6290  bplswap1
  215. 6300 ;x = x + 1 ----------
  216. 6310  clc
  217. 6320  ldaxadr; siehe
  218. 6330  adc#3; zeile
  219. 6340  staxadr; 4400
  220. 6350  bccspr4
  221. 6360  incxadr+1
  222. 6400 ;y = y - 1 ----------
  223. 6410 spr4 sec
  224. 6420  ldayadr; siehe
  225. 6430  sbc#3; zeile
  226. 6440  stayadr; 5400
  227. 6450  bcsspr5
  228. 6460  decyadr+1
  229. 6500 ;if x <= y ----------
  230. 6510 spr5 ldayadr+1
  231. 6520  cmpxadr+1
  232. 6530  bcczstufen; x>y
  233. 6540  bnebruecke2; x<y
  234. 6550  ldayadr
  235. 6560  cmpxadr
  236. 6570  bcsbruecke2; x<=y
  237. 6580  bcczstufen; x>y
  238. 6600 ; sprung --------------
  239. 6610 bruecke7 bnebruecke6
  240. 7000 ;------------------------ stufen-verzweigung
  241. 7100 ;z=z+1:rg=y ----------
  242. 7110 zplus ldarg; z = z + 1
  243. 7120  pha; bedeutet
  244. 7130  ldarg+1; rg auf stack
  245. 7140  pha; legen
  246. 7150  ldayadr
  247. 7160  starg;   rg
  248. 7170  ldayadr+1;    =
  249. 7180  starg+1;    y
  250. 7185  clc; neuen v$
  251. 7190  bccbruecke3;berechnen
  252. 7200 ;lg = lg + 1 ----------
  253. 7210 zgleich clc
  254. 7220  ldalg
  255. 7230  adc#3; siehe
  256. 7240  stalg; zeile
  257. 7250  bccspr6; 4400
  258. 7260  iny
  259. 7270 spr6 stylg+1
  260. 7300 ;if lg < rg ----------
  261. 7310  cpyrg+1
  262. 7320  bccbruecke3; lg<rg
  263. 7330  bnezminus; lg>rg
  264. 7340  cmprg
  265. 7350  bccbruecke3; lg<rg
  266. 7360  bcszminus; lg>=rg
  267. 7400 ;if lg < rg ----------
  268. 7410 zstufen ldalg
  269. 7420  ldylg+1
  270. 7430  cpyyadr+1
  271. 7440  bccstack; lg<rg
  272. 7450  bnezgleich; lg>rg
  273. 7460  cmpyadr
  274. 7470  bccstack; lg<rg
  275. 7480  bcszgleich; lg>=rg
  276. 7500 ;stack pruefen -------
  277. 7510 stack tsx
  278. 7520  cpxstmi; stackminimum
  279. 7530  bcszplus; pruefen
  280. 7540  stxstmi
  281. 7550  cpxstug; stack-ug
  282. 7560  bcszplus; pruefen
  283. 7570  ldxstin; ruecksprung
  284. 7580  txs; zum
  285. 7585  bnebruecke7; anfang
  286. 7600 ;z = z - 1 ----------
  287. 7610 zminus pla; z = z - 1
  288. 7620  starg+1; bedeutet
  289. 7630  pla; rg vom stack
  290. 7640  starg; holen
  291. 7650  ldxrg+1
  292. 7660  cpx#0; rg highbyte
  293. 7670  bnezgleich;    > 0
  294. 7680 ;                        ;    = 0
  295. 8000 ; ----------------------- basic-daten speichern
  296. 8100 ;stack-pointer -----
  297. 8110 aus ldxstin
  298. 8120  txs
  299. 8200 ;zero-page ---------
  300. 8210  ldx#0
  301. 8220 zprueck pla
  302. 8230  sta10,x
  303. 8240  inx
  304. 8250  cpx#20
  305. 8260  bcczprueck
  306. 8270  rts
  307.