Bloecke zu REL-File hinzufuegen ($e31c) (Super-) Side-Sektoren aktualisieren Einsprung von $A06D: A2D6: 20 38 A4 JSR $A438 Ende der REL-Datei suchen A2D9: 20 89 8C JSR $8C89 Position des neuen Records berechnen Einsprung von $88C2: A2DC: 20 5B B6 JSR $B65B Anzahl 'Blocks free' merken Zeiger auf letztes Zeichen im neuen Record setzen A2DF: A4 50 LDY $50 A2E1: BE 5E 02 LDX $025E,Y aktuelle Recordlaenge holen A2E4: CA DEX -1: A2E5: 8A TXA (das letzte Zeichen im Record wird gesucht) A2E6: 18 CLC Position des Records im Datenblock addieren A2E7: 65 6B ADC $6B A2E9: 90 0C BCC $A2F7 c=0: Record passt in den aktuellen Block A2EB: E6 6A INC $6A Side-Sektor-Zeiger auf T&S des naechsten A2ED: E6 6A INC $6A Datenblocks setzen A2EF: D0 06 BNE $A2F7 Zeiger ist im selben SS, ==> A2F1: E6 69 INC $69 naechsten Side-Sektor nehmen A2F3: A9 10 LDA #$10 Zeiger auf T&S des 1. Datenblocks im neuen A2F5: 85 6A STA $6A Side-Sektor setzen Einsprung von $A2E9, $A2EF: A2F7: A5 56 LDA $56 Zeiger auf T&S des aktuellen Side-Sektors A2F9: 18 CLC +2 nehmen A2FA: 69 02 ADC #$02 (zeigt nun auf naechste T&S) A2FC: 20 23 9E JSR $9E23 Side-Sektor-Pufferzeiger setzen A2FF: A5 69 LDA $69 Nummer des Side-Sektors holen A301: C9 06 CMP #$06 <6, (Gruppe noch nicht voll) ? A303: 90 11 BCC $A316 ja, ==> A305: 20 6E A5 JSR $A56E Super-Side-Sektor verwenden ? A308: D0 07 BNE $A311 nein, ==> A30A: 85 69 STA $69 a=0: Side-Sektor-Nummer =0 A30C: EE 00 01 INC $0100 Gruppennummer erhoehen A30F: D0 05 BNE $A316 immer ==> Einsprung von $A308, $A371, $A378: A311: A9 52 LDA #$52 A313: 20 7C 80 JSR $807C 52, File too large Anzahl benoetigter Blocks berechnen Einsprung von $A303, $A30F: A316: A5 6A LDA $6A Zeiger auf T&S des neuen Datenblocks mit A318: 38 SEC dem alten Wert vergleichen A319: E5 56 SBC $56 A31B: B0 03 BCS $A320 groesser, ==> A31D: E9 0F SBC #$0F $10 (CLC) abziehen (das ist die Startposition der Tabelle im SS) A31F: 18 CLC Flag: 'Side-Sektor nicht voll' setzen Einsprung von $A31B: A320: 48 PHA a: Anzahl anzulegender Datenblocks * 2 modulo 120 (max. 119 Blocks) A321: 20 6E A5 JSR $A56E Super-Side-Sektor verwenden ? A324: F0 1E BEQ $A344 ja, ==> - REL-Dateien ohne Super-Side-Sektor A326: 68 PLA Anzahl der Datenblocks modulo 120 A327: 85 43 STA $43 merken A329: A5 69 LDA $69 neue Side-Sektor Nummer A32B: E5 55 SBC $55 - alte Side-Sektor Nummer (ggf. -1, wenn der SS nicht voll ist) A32D: 85 44 STA $44 = Anzahl gefuellter SS [In $44 soll aber die Anzahl benoetigter Side-Sektoren stehen !!!] A32F: A2 00 LDX #$00 Anzahl benoetigter Blocks = 0 A331: 86 41 STX $41 A333: 86 42 STX $42 A335: AA TAX x= Anzahl gefuellter Side-Sektoren A336: 20 82 9E JSR $9E82 Anzahl benoetigter Blocks berechnen A339: A5 42 LDA $42 benoetigte Blocks (Hi) A33B: D0 2F BNE $A36C >0, (mehrere Blocks anlegen) ==> A33D: A6 41 LDX $41 (Lo) A33F: CA DEX A340: D0 2A BNE $A36C >1, (mehrere Blocks anlegen) ==> A342: F0 26 BEQ $A36A (einen neuen Block anlegen), ==> - mit Super-Side-Sektor Einsprung von $A324: A344: 68 PLA (c=0: Die Blocks mod120 passen in alten SS) A345: 85 43 STA $43 Anzahl der Datenblocks modulo 120 merken A347: A5 69 LDA $69 neue Side-Sektor Nummer A349: E5 55 SBC $55 - alte Side-Sektor-Nummer (ggf. -1) A34B: B0 04 BCS $A351 >0, ==> A34D: E6 58 INC $58 Anzahl anzulegender Gruppen -1 (!) A34F: 69 06 ADC #$06 anzulegende Side-Sektoren +6 [Die Gesamtzahl anzulegender SS mod 6 passt noch in die alte Gruppe.] Einsprung von $A34B: A351: 85 44 STA $44 Anzahl SS mod 6 merken A353: AD 00 01 LDA $0100 Nummer der neuen letzten Gruppe A356: 38 SEC - Nummer der alten letzten Gruppe A357: E5 58 SBC $58 A359: 85 58 STA $58 = Anzahl der anzulegenden Gruppen A35B: 20 97 9E JSR $9E97 Anzahl benoetigter Blocks berechnen A35E: A5 5C LDA $5C Anzahl Blocks (Hi) A360: D0 0A BNE $A36C >0, mehrere Blocks anlegen ==> A362: A6 5B LDX $5B (Lo) A364: D0 01 BNE $A367 >0, ==> A366: 60 RTS kein neuer Block anzulegen ==> Einsprung von $A364: A367: CA DEX >1 A368: D0 02 BNE $A36C ja, mehrere Blocks anlegen Pruefen, ob der benoetigte Platz frei ist [Die Routine enthaelt einen schlimmen Fehler und kann sich deshalb um +/- 255 Blocks irren !!!] Einsprung von $A342: A36A: E6 57 INC $57 Flag 'Nur noch einen Datenblock anlegen' Einsprung von $A33B, $A340, $A360, $A368: A36C: CD 8E 02 CMP $028E sind genug 'Blocks free' ? A36F: 90 09 BCC $A37A ja, ==> A371: D0 9E BNE $A311 nein, 52, File too large ==> A373: AD 8D 02 LDA $028D (Lo) A376: C5 41 CMP $41 [Wenn Super-Side-Sektoren verwendet werden, steht das Lo-Byte doch in $5b !?!] A378: 90 97 BCC $A311 nein, 52, File too large ==> neue Datenbloecke und ggf. Side-Sektoren anhaengen Einsprung von $A36F: A37A: A9 01 LDA #$01 Position des letzten gebrauchten Bytes A37C: 20 50 94 JSR $9450 aus aktuellem Puffer holen A37F: 18 CLC A380: 69 01 ADC #$01 +1 A382: A6 50 LDX $50 A384: 9D 57 02 STA $0257,X = Position des neuen Records A387: 20 68 B6 JSR $B668 Folgeblock suchen A38A: 20 3A 9D JSR $9D3A und in der Blockverkettung eintragen A38D: A5 57 LDA $57 soll nur ein neuer Block angelegt werden ? A38F: D0 15 BNE $A3A6 ja, ==> A391: 20 9A 9D JSR $9D9A Block schreiben - Blocks anhaengen Einsprung von $A3F1, $A3F7, $A3FE: A394: 20 7D 8D JSR $8D7D Puffer wechseln A397: 20 85 95 JSR $9585 T&S des neuen Blocks an DC uebergeben A39A: 20 68 B6 JSR $B668 Folgeblock suchen A39D: 20 3A 9D JSR $9D3A und in der Blockverkettung eintragen A3A0: 20 98 A2 JSR $A298 Block mit Datensaetzen anlegen A3A3: 4C B2 A3 JMP $A3B2 ==> - letzten Block anhaengen Einsprung von $A38F, $A400: A3A6: 20 7D 8D JSR $8D7D Puffer wechseln A3A9: 20 85 95 JSR $9585 T&S des neuen Blocks an DC uebergeben A3AC: 20 98 A2 JSR $A298 Block mit Datensaetzen anlegen A3AF: 20 56 9D JSR $9D56 Blocklaenge setzen - ggf. neuen Side-Sektor anlegen Einsprung von $A3A3: A3B2: 20 9A 9D JSR $9D9A Block schreiben A3B5: 20 49 9D JSR $9D49 T&S des Folgeblocks holen A3B8: A5 4D LDA $4D und merken A3BA: 48 PHA A3BB: A5 4E LDA $4E A3BD: 48 PHA A3BE: 20 7C 9D JSR $9D7C T&S des aktuellen Blocks holen A3C1: A5 4E LDA $4E und merken A3C3: 48 PHA A3C4: A5 4D LDA $4D A3C6: 48 PHA A3C7: 20 75 9E JSR $9E75 Side-Sektor-Pufferzeiger holen A3CA: AA TAX Zeiger (Lo) > 0 ? A3CB: D0 0A BNE $A3D7 Ja, (T&S passen noch in den alten SS) ==> A3CD: 20 59 A4 JSR $A459 neuen Side-Sektor anlegen A3D0: A9 10 LDA #$10 Side-Sektor-Zeiger auf 1. Feld der A3D2: 20 23 9E JSR $9E23 Datenblock-Tabelle setzen A3D5: E6 55 INC $55 Side-Sektor Nummer +1 Einsprung von $A3CB: A3D7: 68 PLA T&S des aktuellen Datenblocks A3D8: 20 CA 9C JSR $9CCA in Side-Sektor schreiben A3DB: 68 PLA A3DC: 20 CA 9C JSR $9CCA A3DF: 68 PLA A3E0: 85 4E STA $4E T&S des Folgeblocks zurueckholen A3E2: 68 PLA A3E3: 85 4D STA $4D kein Folgeblock vorhanden ? A3E5: F0 1B BEQ $A402 ja, ==> - Pruefen, ob der letzte anzulegende Datenblock erreicht ist A3E7: 20 6E A5 JSR $A56E Super-Side-Sektor verwenden ? A3EA: D0 07 BNE $A3F3 nein, ==> A3EC: A5 5A LDA $5A Aktuelle Gruppennummer A3EE: CD 00 01 CMP $0100 < angewaehlte Gruppennummer ? A3F1: 90 A1 BCC $A394 ja, ==> Einsprung von $A3EA: A3F3: A5 55 LDA $55 Aktuelle Side-Sektor-Nummer A3F5: C5 69 CMP $69 = angewaehlte Side-Sektor-Nummer ? A3F7: D0 9B BNE $A394 nein, ==> A3F9: 20 75 9E JSR $9E75 Side-Sektor-Pufferzeiger holen A3FC: C5 6A CMP $6A Angewaehlter Datenblock erreicht ? A3FE: 90 94 BCC $A394 nein, ==> A400: F0 A4 BEQ $A3A6 ja, letzten Block anlegen ==> - Ende-Kennzeichen setzen und Side-Sektoren speichern Einsprung von $A3E5: A402: 20 75 9E JSR $9E75 Side-Sektor-Pufferzeiger (Lo) holen A405: 48 PHA und merken A406: A9 00 LDA #$00 Side-Sektor-Pufferzeiger $64-$65 auf A408: 20 15 9E JSR $9E15 Pufferanfang setzen A40B: A9 00 LDA #$00 A40D: A8 TAY Blockverkettung setzen: A40E: 91 64 STA ($64),Y Flag 'letzter Side-Sektor' setzen A410: C8 INY A411: 68 PLA letztes benutztes Byte im A412: 38 SEC Side-Sektor merken A413: E9 01 SBC #$01 (-1, da der Zeiger auf dem 1. unbenutzten A415: 91 64 STA ($64),Y Byte stand) A417: 20 A6 9D JSR $9DA6 Side-Sektor schreiben A41A: 20 ED 94 JSR $94ED Jobausfuehrung pruefen A41D: 20 15 B5 JSR $B515 BAM abspeichern auf erfolgreiche Arbeit testen; Record anwaehlen A420: 20 89 8C JSR $8C89 Position des Records berechnen A423: 20 7D 8D JSR $8D7D Puffer wechseln A426: 20 32 9E JSR $9E32 Gruppe anwaehlen und Side-Sektor laden A429: 70 03 BVS $A42E Record nicht vorhanden ?, ==> A42B: 4C 0D A2 JMP $A20D Record zur Ausgabe bereitstellen Einsprung von $A429: A42E: A9 80 LDA #$80 b7=1: Flag: 'Record existiert nicht' A430: 20 D5 9C JSR $9CD5 im Dateistatus setzen A433: A9 50 LDA #$50 A435: 20 7C 80 JSR $807C 50, Record not present Previous Page / Next Page |