    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