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