10 SYS9*4096 20 .OPT P,OO 30 *= $C700 100 ; **** GARBAGE COLLECTION **** 101 ; 102 ;DEFINITION DER HILFSZEIGER 103 LAZEI =$45;LAUFZEIGER D.DESKRIPTOREN 104 ROMZEI =$47;LAUFZEIGER UNTER ROM 105 STRIZEI =$49;HILFSZEIGER F. STRING 106 MEZEI =$4B;LETZTER PLATZ OBERES ROM 107 NEUZEI =$4D;STRINGBEREICHSLAUFZEIGER 108 FELDEND =$4F;HILFZEIGER ARRAYENDE 109 STRISPEI =$51;HILFSZEIGER 110 SUBTRAH =$53;STRINGLAENGEZWISCHENSP. 111 ; 112 ; 113 ;VORBELEGUNG DER SPEICHERPLAETZE 114 VROMZEI =$0000;START VON ROMZEI 116 VGRENZEI =$DF00;GRENZE+ FUER ROMZEI 117 VJUMPZEI =$C000 118 ; 119 ; 1. VORBEREITUNG ------------------ 120 ; 121 ANFANG SEI;INTERRUPTS VERHINDERN 122 PHA;PROZESSORREGISTER RETTEN 123 TYA 124 PHA 125 TXA 126 PHA 127 LDA 1;SPEICHERKONFIGURATION RETTEN 128 STA ZAHL 129 LDA #46;KONTROLLANZEIGE BILDSCHIRM 130 STA 2023 131 LDA #9 132 STA 56295 133 LDY #20;BENOETIGTE SPEICHER RETTEN 134 RET LDA $44,Y 135 STA SAVE,Y 136 DEY 137 BNE RET 138 LDA #55;AUF ROM UMSCHALTEN 139 STA 1 140 LDA 45;VARIABLENSTART NACH LAZEI 141 STA LAZEI 142 LDA 46 143 STA LAZEI+1 144 ; 145 LDA #VROMZEI 148 STA ROMZEI+1 149 ; 150 LDA #0;MEZEI VORBELEGEN 151 STA MEZEI 152 STA MEZEI+1 153 STA ZWEI 154 ; 155 LDA 55;DURCHL.ZEIGER F.STRINGBEREICH 156 STA NEUZEI 157 LDA 56 158 STA NEUZEI+1 159 ; 160 ; 161 ;2. VARIABLENBEREICH --------------- 162 ; 600 163 VOVORN LDA LAZEI;SCHON ENDE VARIABLE 164 CMP 47 165 BNE WEI1 166 LDA LAZEI+1 167 CMP 48 168 BEQ FELDER 169 ; 170 WEI1 LDY #0;STRINGVARIABLE J/N 171 LDA (LAZEI),Y 172 ASL 173 BCS LA7;KEINE STRINGVARIABLE 174 INY 175 LDA (LAZEI),Y 176 ASL 177 BCC LA7;KEINE STRINGVARIABLE 178 ; 179 CLC;LAZEI=LAZEI+2;STRINGVARIABLE 180 LDA #2 181 ADC LAZEI 182 STA LAZEI 183 BCC WEI2 184 INC LAZEI+1 185 ; 186 ; 187 WEI2 LDY #0 188 LDA (LAZEI),Y;LEERSTRING J/N 189 BEQ LA5 190 ; 191 LDY #2;DESCRIPTOR IN STR.BEREICH J/N 192 LDA (LAZEI),Y 193 CMP 52 194 BCC LA5;HB 52 > ALS DESCRIPTOR HB 195 BNE WEI3;HB 52 <> HB DESKRIPTOR=OK 196 DEY 197 LDA (LAZEI),Y 198 CMP 51 199 BCC LA5;LB 51 > LB DES,HB 52 =HB DES 200 ; 201 WEI3 JSR ABSPEI 202 ; 203 LA5 CLC;LAZEI UM 5 ERHOEHEN 204 LDA #5 205 ADC LAZEI 206 STA LAZEI 207 BCC L1 208 INC LAZEI+1 209 L1 JMP VOVORN 210 ; 211 LA7 CLC;LAZEI UM 7 ERHOEHEN 212 LDA #7 213 ADC LAZEI 214 STA LAZEI 215 BCC L2 216 INC LAZEI+1 217 L2 JMP VOVORN 218 ; 219 ; 220 ; 221 ;3. ARRAYBEREICH ------------------- 222 ; 223 FELDER LDA LAZEI;ARRAYBEREICHENDEJ/N 224 CMP 49 225 BNE WEI11 226 LDA LAZEI+1 227 CMP 50 228 BNE WEI11 229 JMP RAMUN 230 ; 231 WEI11 LDY #0;STRINGFELD J/N 232 LDA (LAZEI),Y 233 ASL 234 BCS LASTRL;KEIN STRINGFELD 235 INY 236 LDA (LAZEI),Y 237 ASL 238 BCC LASTRL;KEIN STRINGFELD 239 ; 240 ; 241 ; 242 ;STRINGFELD 243 LDY #3;ERRECHNEN FELDENDE 244 LDA (LAZEI),Y 245 PHA 246 DEY 247 CLC 248 LDA (LAZEI),Y 249 ADC LAZEI 250 STA FELDEND 251 PLA 252 ADC LAZEI+1 253 STA FELDEND+1 254 ; 255 LDY #4;ANZAHL DER DIMENSIONEN NACH Y 256 LDA (LAZEI),Y 257 TAY 258 ; 259 LDA #5;LAZEI AUF 1. DESCRIPTOR 260 CLC;LAZEI UM 5 ERHOEHEN 261 ADC LAZEI 262 STA LAZEI 263 BCC WEI14 264 INC LAZEI+1 265 ; 266 ; 267 WEI14 LDA #2;LAZEI + DIMENS.ANZAHL*2 268 CLC 269 ADC LAZEI 270 STA LAZEI 271 BCC WEI15 272 INC LAZEI+1 273 WEI15 DEY 274 BNE WEI14 275 ; 276 VUVURN LDA LAZEI;FELDENDE J/N 277 CMP FELDEND 278 BNE WEI16 279 LDA LAZEI+1 280 CMP FELDEND+1 281 BEQ FELDER 282 ; 283 WEI16 LDA (LAZEI),Y;STRING LEER J/N 284 BEQ LA3 285 ; 286 LDY #2;DESCRIPTOR IM STR.BEREICH J/N 287 LDA (LAZEI),Y 288 CMP 52 289 BCC LA3 290 BNE WEI17 291 DEY 292 LDA (LAZEI),Y 293 CMP 51 294 BCC LA3 295 WEI17 JSR ABSPEI 296 ; 297 LA3 CLC;LAZEI UM 3 ERHOEHEN 298 LDA #3 299 ADC LAZEI 300 STA LAZEI 301 BCC WEI18 302 INC LAZEI+1 303 WEI18 JMP VUVURN 304 ; 305 LASTRL LDY #3;LAZEI + ARRAYLAENGE 306 LDA (LAZEI),Y 307 PHA 308 DEY 309 LDA (LAZEI),Y 310 CLC 311 ADC LAZEI 312 STA LAZEI 313 PLA 314 ADC LAZEI+1 315 STA LAZEI+1 316 JMP FELDER 317 ; 318 ; 319 ; 320 ; 321 ;4. RAM UNTER ROM NACH VARIABLE ---- 322 ; 323 RAMUN LDA ROMZEI;WAREN STRINGS DA 324 CMP #VROMZEI 328 BNE RUMUN 329 JMP ENDE 330 ; 331 RUMUN LDA #53;AUF ROM SCHALTEN 332 STA 1 333 LDA NEUZEI;STRINGBEGINNSZEIGER NEU 334 STA 51 335 LDA NEUZEI+1 336 STA 52 337 ; 338 LDA ZWEI;WAR UNTERES RAM IN USE J/N 339 BNE DOPP 340 ; 341 LDA ROMZEI;NUR 1.BEREICH ROMZEI-FFFF 342 STA STRISPEI;SUBROUTINEVORBELEGUNG 343 LDA ROMZEI+1 344 STA STRISPEI+1 345 LDA #VROMZEI-1 348 STA LAZEI+1 349 ; 350 JSR SPEISTRI;UMSPEICHERUNGSROUTINE 351 ; 352 JMP ROMNEU 353 ; 354 ; 355 DOPP LDA ROMZEI;1.UND 2. BENUTZT 356 STA STRISPEI;SUBROUTINEVORBELEGUNG 357 LDA ROMZEI+1 358 STA STRISPEI+1 359 LDA #VJUMPZEI-1 362 STA LAZEI+1 363 ; 364 JSR SPEISTRI;UMSPEICHERROUTINE 365 ; 366 LDA MEZEI;SUBROUTINEVORBELEGUNG 367 STA STRISPEI 368 LDA MEZEI+1 369 STA STRISPEI+1 370 LDA #VROMZEI-1 373 STA LAZEI+1 374 ; 375 JSR SPEISTRI;UMSPEICHERROUTINE 376 JMP ROMNEU 377 ; 378 ; 379 ; 380 ; 381 SPEISTRI LDY #0;KOPIER V STRISPEI 382 ;- LAZEI NACH NEUZEI AUFWAERTS 383 WIDA LDA (STRISPEI),Y 384 STA (NEUZEI),Y 385 LDA LAZEI 386 CMP STRISPEI 387 BNE W21 388 LDA LAZEI+1 389 CMP STRISPEI+1 390 BNE W21 391 BEQ W24 392 W21 INC NEUZEI 393 BNE W22 394 INC NEUZEI+1 395 W22 INC STRISPEI 396 BNE WIDA 397 INC STRISPEI+1 398 W23 JMP WIDA 399 ; 400 W24 INC NEUZEI 401 BNE W25 402 INC NEUZEI+1 403 W25 RTS 404 ; 405 ; 406 ; 407 ;5. ROM NEU INS RAM KOPIEREN ------- 408 ; 409 ROMNEU LDA ZAHL;EINGEBUNDEN J/N 410 CMP #55 411 BEQ ENDE;LAEUFT IM ROM 412 JSR RUMNEU 413 JMP ENDE 414 ; 415 LDA #1;HIER EXTRAEINSPRUNG VON BASIC 416 STA ZWEI 417 JSR RUMNEU 418 LDA #53 419 STA 1 420 RTS 421 ; 422 RUMNEU LDA #55;AUF ROM UMSCHALTEN 423 STA 1 424 ; 425 LDA #$00 426 STA LAZEI 427 LDA #$E0 428 STA LAZEI+1 429 JSR COPI 430 ; 431 LDA ZWEI;UNT. ROM AUCH ZU KOPIEREN 432 BEQ END 433 LDA #$00 434 STA LAZEI 435 LDA #$A0 436 STA LAZEI+1 437 JSR COPI 438 END JSR EINBIND 439 RTS 440 ; 441 ; 442 COPI LDX #32;8K ROM IN RAM KOPIEREN 443 LDY #0 444 AGEIN LDA (LAZEI),Y 445 STA (LAZEI),Y 446 INY 447 BNE AGEIN 448 INC LAZEI+1 449 DEX 450 BNE AGEIN 451 RTS 452 ; 453 ;6. ENDE --------------------------- 454 ; 455 ENDE LDY #20;SPEICHER RUECKRETTEN 456 ROT LDA SAVE,Y 457 STA $44,Y 458 DEY 459 BNE ROT 460 LDA #32;KONTROLLANZEIGE LOESCHEN 461 STA 2023 462 LDA ZAHL;ALTE SPEICHERKONFIGURATION 463 STA 1 464 PLA;PROZESSORINHALTE WIEDERHOLEN 465 TAX 466 PLA 467 TAY 468 PLA 469 CLI;INTERRUPTS WIEDER ERLAUBT 470 RTS 471 ; 472 ; 473 ;SUBROUTINEN ----------------------- 474 ; 475 ;UNTERPROGRAMM, DAS DEN STRING, AUF 476 ;DESSEN DESKPRIPTOR LAZEI STEHT,UN- 477 ;TERHALB ROMZEI ABSPEICHERT UND DIE 478 ;POSITIONSANGABE DES DESKR. RELATIV 479 ;ZUM RICHT. STRINGBER. AKTUALISIERT 480 ; 481 ABSPEI LDY #2;STRINGADR. IN STRIZEI 482 LDA (LAZEI),Y;LAENGE IN Y UND STACK 483 STA STRIZEI+1 484 DEY 485 LDA (LAZEI),Y 486 STA STRIZEI 487 DEY 488 LDA (LAZEI),Y 489 STA SUBTRAH 490 TAY 491 ; 492 OGAIN LDA ROMZEI;ROMZEI-STRINGLAENGE 493 SEC 494 SBC SUBTRAH 495 STA ROMZEI 496 BCS ETZ 497 DEC ROMZEI+1 498 LDA ROMZEI+1 499 CMP #>VGRENZEI 500 BNE ETZ 501 ; 502 LDA #1;O.RAM VOLL,ROMZEI+YNACH MEZEI 503 STA ZWEI 504 TYA 505 CLC 506 ADC ROMZEI 507 STA MEZEI 508 BCC WTR 509 INC ROMZEI+1 510 WTR LDA ROMZEI+1 511 STA MEZEI+1 512 LDA #VJUMPZEI 515 STA ROMZEI+1 516 JMP OGAIN 517 ; 518 ETZ DEY;STRING UNTERS ROM SPEICHERN 519 NOML LDA (STRIZEI),Y 520 STA (ROMZEI),Y 521 DEY 522 CPY #255 523 BNE NOML 524 ; 525 ; 526 LDY #1;NEUZEI-STR.LAENGE=DESKRIPTOR 527 LDA NEUZEI 528 SEC 529 SBC SUBTRAH 530 STA NEUZEI 531 STA (LAZEI),Y 532 BCS WAIDR 533 DEC NEUZEI+1 534 WAIDR INY 535 LDA NEUZEI+1 536 STA (LAZEI),Y 537 RTS 538 ; 539 ZAHL NOP;MERKER FUER KONFIGURATION 540 ZWEI NOP;=1 WENN MEHR O.RAM USED 541 SAVE NOP 542 *= *+25 543 ; 544 ;VERAENDERUNG DES GARBAGEEINSPRUNGS 545 ;UND EVENTUELL DES BETRIEBSSYSTEMS 546 GAR =$B526 547 EINBIND LDA #$20;JSR ANFANG U. RTS 548 STA GAR 549 LDA #ANFANG 552 STA GAR+2 553 LDA #$60 554 STA GAR+3 555 RTS