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