home *** CD-ROM | disk | FTP | other *** search
/ 64'er / 64ER_CD.iso / 86xx / 8607.d64 / quicksort.ass (.txt) < prev    next >
Commodore BASIC  |  1995-03-30  |  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.