;---------------
;HANDLING FNK F2  (ingevulde- OF gewijzigde kaart opslaan)   page 0
;---------------
FNK_F2  LD   A,(IY+2)   ;Statusbyte vensters
        OR   A          ;'n venster op scherm ?
        CALL NZ,ESCAPE  ;Ja, venster verwijderen en cursor plaatsen
        CALL FLD_BUF    ;Haal adres/lengte veldtxt-buffer (in `HL' & `A')
        OR   A          ;Veld nog leeg ?
        JR   Z,FNK_2_3  ;Ja
        LD   B,#00
        LD   C,A        ;`BC'= lengte veldtxt
        ADD  HL,BC      ;Pointer naar laatste karakter
FNK_2_1 LD   A,(HL)     ;Haal karakter
        CP   #20        ;Spatie ?
        JR   NZ,FNK_2_2 ;Nee
        DEC  C          ;Lengte -1
        DEC  HL         ;Pointer -1
        JR   FNK_2_1    ;Check next byte
FNK_2_2 INC  HL
        LD   (HL),#00   ;Zet eindmarkering (ascii-Z string)
        LD   HL,(LINE)  ;Herstel adres veldtxt-buffer
        LD   (HL),C     ;Update lengte zonder eindspaties
        BIT  0,(IY+1)   ;Statusbit `numeriek veld' set ?
        CALL NZ,CHK_NUM ;Ja, dan check numerieke txt
FNK_2_3 LD   A,(IY+6)   ;Y-pos laatste gebruikte lijn
        SUB  #03        ;Aantal lijnen binnen kader van kaart (zero based)
        LD   B,A        ; = DJNZ-teller
        LD   HL,FLD_TXT ;Opslagadres voor veldtxt op 1e regel
        LD   DE,#004E   ;Lengte opslaggebied voor elke regel veldtxt
FNK_2_4 LD   A,(HL)     ;Haal lengte van veldtxt (1 regel)
        OR   A          ;Lege regel ?
        JR   NZ,FNK_2_5 ;Nee
        ADD  HL,DE      ;Bereken pointer naar volgende veldtxt
        DJNZ FNK_2_4    ;Next

;--> Hier indien alle regels nog leeg

        LD   HL,TEXT_12 ;Txtpointer naar `kan niet opgeslagen worden' etc.
        JP   MESSAGE    ;Bericht ---> lijn 24 & wachten op toets
                        ; en RET naar KEY_INP

;--> Hier indien NIET alle regels leeg

FNK_2_5 LD   DE,(CARDNR);Huidige kaartnr.
        CALL ZOEK_IS    ;Checken of kaartdata voor deze kaart al bestaat
                        ;Resultaat: carry set indien 'Nee'
                        ;Else: NC, A = Txt-segment ID-info opgeslagen in
                        ;(IY+12) & (IY+14), `BC'= Lengte kaartdata in
                        ;txt-segment, `HL'= Adres in txt-segment
        JR   C,FNK_2_6  ;Jump indien kaart nog niet bestaat
        BIT  1,(IY+1)   ;Statusbit `kaart gewijzigd' set ?
        JP   Z,FNK_2_C  ;Nee   (alleen nieuwe kaart naar scherm)
        PUSH IX         ;Save
        CALL DEL_UP     ;Kaartdata wordt niet gewist, doch de index-entries
                        ;van de volgende kaarten worden 8 plaatsen omlaag
                        ;geschoven, waardoor de oude index van de kaart wordt
                        ;overschreven, dus niet meer bestaat. Het aantal
                        ;kaarten (NXT_FRE) wordt met 1 verlaagd.
        POP  IX         ;Herstel IX
FNK_2_6 LD   HL,BIGBUF  ;Base verzamelbuffer
        LD   (HL),#00
        LD   DE,BIGBUF+1
        LD   BC,#02FF
        LDIR            ;Clear verzamelbuffer

;--> Veldlengtes & veldteksten opslaan in verzamelbuffer

        EXX             ;Alt.
        LD   HL,BIGBUF+2;Verzamel-buffer in HL'
        PUSH HL
        EXX             ;Norm.
        POP  HL         ;Base verzamelbuffer
        LD   B,#00
        LD   C,(IY+17)  ;`BC'= Aantal velden
                        ;(= aantal lengte-bytes vr begin txt-opslag)
        ADD  HL,BC      ;Bereken pointer txt-opslag adres
        EX   DE,HL      ; naar `DE' (= doeladres)
        LD   IX,FIELDS  ;Table Y-pos. van aanwezige velden
FNK_2_7 LD   A,(IX+0)   ;Y-pos. veld
        OR   A          ;Laatste veld gehad ?
        JR   Z,FNK_2_8  ;Ja
        INC  IX
        PUSH DE         ;Save doeladres
        CALL FLDBUF1    ;Haal adres/lengte veldtxt-buffer (in `HL' & `A')
        INC  HL         ;Pointer naar begin veldtxt (= bronadres)
        POP  DE         ;Herstel doeladres
        EXX             ;Alt.
        LD   (HL),A     ;Lengtebyte txtveld ---> buffer
        INC  HL         ;Pointer +1
        EXX             ;Norm.
        OR   A          ;Veld leeg ?
        JR   Z,FNK_2_7  ;Ja   (er valt niets te kopieren, volgende veld)
        LD   C,A        ;`BC'= Lengte txt = aantal bytes
        LDIR            ;Txt ---> BUFFER
        JR   FNK_2_7

;--> 1e 3 bytes van voorkeurveld kopiren naar MINIBUF

FNK_2_8 PUSH DE         ;Save eindadres +1 van buffer
        LD   A,(IY-29)  ;Y-pos. voorkeurveld voor zoeken
        CALL FLDBUF1    ;Haal adres veldtxt-buffer en lengte (in `HL' & `A')
        INC  HL         ;Pointer begin txt
        LD   DE,MINIBUF ;Temp. opslagadres
        LD   BC,#0003
        LDIR            ;Kopier 1e 3 bytes (t.b.v. zoeken)
        SUB  #03        ;Was lengte veldtxt 3 bytes of meer ?
        JR   NC,FNK_2_A ;Ja
                        ;OPM.: Als voorkeurveld korter is dan 3 bytes
                        ;      werden bij LDIR, hierboven, mogelijk niet-nul
                        ;      bytes van een vorige opgeslagen kaart gekopi-
                        ;      erd. Dit wordt gekorrigeerd bij FNK_2_9
        NEG             ;Convert byte-tekort naar pos. getal
        LD   B,A        ; en gebruikt dat als teller
        XOR  A
FNK_2_9 DEC  DE         ;Wis de foutief
        LD   (DE),A     ; ingevulde bytes
        DJNZ FNK_2_9    ;  uit voorkeurveld

;--> Lengte kaartdata opslaan in begin van BIGBUF

FNK_2_A POP  HL         ;Eindadres +1 van geladen txt in buffer
        LD   DE,BIGBUF+2;Beginadres kaartdata in buffer
        OR   A          ;Clear carry
        SBC  HL,DE      ;Bereken aantal bytes in buffer (lengte)
        LD   (BIGBUF),HL;Lengte opslaan in begin buffer

;--> Kaartdata opslaan in index- en txt-segment

        SET  5,(IY+0)   ;Set statusbit `bestand gewijzigd'
        CALL SAVCARD    ;Kaartdata opslaan in index_ en txt-segment
                        ;Kaartnr. in "NXT_FRE" +1
        RES  1,(IY+1)   ;Reset statusbit `kaart gewijzigd'
        BIT  1,(IY+42)  ;Statusbit `auto-sort' set ?
        JR   Z,FNK_2_C  ;Nee
FNK_2_B LD   HL,#0730   ;Vram adres lijn 24
        LD   DE,PRES_10 ;Txtpointer naar `index wordt gesorteerd' etc.
        CALL FAST1      ;Txt ---> lijn 24
        CALL SORTEER    ;Nieuwe kaart insorteren
        CALL WIS_L24    ;Lijn 24 wissen
FNK_2_C BIT  7,(IY+0)   ;Statusbit `return' set ?
                        ;(Dit bit is set als FNK_2_5 werd aangeroepen
                        ; vanuit FNK_F3, FNK_F4, FNK_F7, FNK_F10 of SELECT
                        ;  en wordt daar weer resetted)
        JR   Z,FNK_2_D  ;Nee
        JP   UNPAGE     ;Systeemram weer aanschakelen & #FF ---> (IY-15) & RET
                        ;naar caller (DI & EI i.v.m. printerbuffer)

;--> Veldtxt-buffers wissen, nieuwe kaart ---> scherm

FNK_2_D CALL UNPAGE      ;Systeem-ram weer aanschakelen & #FF ---> (IY-15)
                         ;(DI & EI i.v.m. printerbuffer)
        LD   HL,FLD_TXT  ;Base opslag-area voor veldtxt (19x veldtxtbuffer)
        LD   (HL),#00    ;Wis 1e byte
        LD   DE,FLD_TXT+1;Base opslag-area +1
        LD   BC,#05C9    ;Aantal bytes (= 19 x 78 -1)
        LDIR             ;Wis opslag-area voor veldtxt
        LD   HL,(NXT_FRE);Aantal opgeslagen kaarten +1
        LD   (CARDNR),HL ;Wordt huidige kaartnr.
        CALL DSP_CNR     ;Display kaartnr.
        CALL FRESH_0     ;Blanco kaart naar scherm, highlight 1e veld &
                         ; set XY op begin 1e veld
        JP   DSPCSR1     ;Plaats cursor (en RET naar KEY_INP)

################

FNK_3_4 LD   HL,(NXT_FRE);Aantal opgeslagen kaarten +1
        LD   DE,(CARDNR) ;Huidige kaartnr.
        INC  DE         ;Volgende kaartnr.
        CALL COMP_DH    ;Is er een volgende kaart ?
        JR   C,FNK_3_5  ;     Jump als blanco kaart op scherm staat
        JR   NZ,FNK_3_6 ;Ja
        JP   FNK_2_C    ;Nee, Nieuwe kaart naar scherm en RET (naar KEY_INP)
;-------
FNK_3_5 LD   HL,TEXT_19 ;Txtpointer naar `geen volgende kaart' etc.
        CALL MESS_JN    ;Bericht naar lijn 24 en wachten op response J/N
        RET  NZ         ;Return indien response "N"
        JP   FNK_F4     ;(Toon vorige = laatste kaart)
;-------
FNK_3_6 LD   (CARDNR),DE;Nieuwe kaartnr. opslaan
        JP   SELECTD    ;Kaart naar scherm & RET (naar KEY_INP)

################

;----------------------
;AFHANDELING OPTIE F7/4 (instellen/sorteren voorkeurveld)   page 0
;----------------------
PRESET0 SET  1,(IY+2)   ;Set statusbit `preset-venster'
        LD   HL,(CSRNU) ;Huidige cursorpos.
        LD   (CURSOR),HL;Opslaan
        CALL SET_W_C    ;Set VDP voor write op cursorpos.
        LD   A,(IY+8)   ;Karakter onder huidige cursor
        LD   C,(IY-1)   ;Poortnr.
        OUT  (C),A      ;Wis cursor in huidige veld
        LD   HL,#0110   ;XY begin regel 16
        LD   BC,#0280   ;Aantal bytes voor 8 regels
        CALL CLEAR_V    ;Scherminhoud ter plaatse van venster opslaan

;--> Regelnr. voorkeurveld invullen in txt-$ voor 4e venster-regel

        LD   A,(IY-29)  ;Y-pos huidige voorkeurveld
        SUB  #03        ;Bereken regelnr.
        LD   H,#00      ; en naar
        LD   L,A        ;  `HL'
        CALL INT_ASC    ;Conversie naar ascii-$
        LD   HL,DECIM_$+3 ;Pointer naar voorlaatste byte ascii-$
        LD   DE,PRES_4+32 ;Adres invulplaats
        LD   BC,#0002   ;Aantal bytes
        LDIR

;--> Preset-venster op scherm zetten

        LD   HL,#04DB
        LD   DE,PRES_1  ;Pointer txt 1e regel
        CALL FAST1      ;Naar scherm
        LD   HL,#052B
        LD   DE,PRES_2  ;Pointer txt 2e regel
        CALL FAST1      ;Naar scherm
        LD   HL,#057B
        LD   DE,PRES_3  ;Pointer txt 3e regel
        CALL FAST1      ;Naar scherm
        LD   HL,#05CB
        LD   DE,PRES_4  ;Pointer txt 4e regel
        CALL FAST1      ;Naar scherm
        LD   HL,#061B
        LD   DE,PRES_5  ;Pointer txt 5e regel
        CALL FAST1       ;Naar scherm
        LD   HL,#066B
        LD   DE,PRES_6  ;Pointer txt 6e regel
        CALL FAST1      ;Naar scherm
        LD   HL,#06BB
        LD   DE,PRES_7  ;Pointer txt 7e regel
        CALL FAST1      ;Naar scherm
        LD   HL,#070B
        LD   DE,PRES_8  ;Pointer txt 8e regel (afsluitlijn)
        CALL FAST1      ;Naar scherm
        LD   HL,#4C15   ;XY-pos. waar cursor moet komen (invul pos. regelnr.)
        LD   (IY+4),H   ;X
        LD   (IY+5),L   ;Y
        CALL DSPCSR1    ;Plaats cursor
;-------
        LD   (IY+30),#03;1e te printen regelnr. bij screendump
        LD   (IY+31),#17;Laatste te printen regelnr. bij screendump
        LD   A,(IY+6)   ;Y-pos. laatste gebruikte regel voor kaart
        INC  A          ;+ 1 voor afsluitlijn van kaart is laatste regelnr.
        CP   (IY+31)    ;Regelnr. van eind venster hoger dan laatste
                        ;regelnr. voor kaart ?
        JR   C,PRESET1  ;Ja
        LD   (IY+31),A  ;Nee, dan laatste te printen regelnr. voor
                        ; screendump aanpassen
PRESET1 LD   HL,#0730   ;Vram adres lijn 24
        LD   DE,TEXT_9  ;Txtpointer naar `gebruik BS-toets' etc.
        CALL FAST1      ;Txt ---> Vram
PRESET2 CALL GET_KEY    ;Wacht op toets en check CTRL-D/P/S/Q
        JR   C,PRESET2  ;Jump indien CTRL-toets gedrukt (en afgehandeld)
        LD   C,A        ;Input kar.
        LD   A,(#FBEB)  ;Status row 6
        AND  #14        ;Isoleer bits voor CODE & GRAPH
        CP   #14        ;CODE- of GRAPH-key gedrukt ?
        JR   NZ,PRESET2 ;Ja   (toets weigeren)
        LD   A,C        ;Input kar.
        CP   #08        ;BS-key ?
        JR   NZ,PRESET3 ;Nee

;--> Afhandeling BS-key

        LD   A,(IY+4)   ;Cursor X-pos.
        CP   #4C        ;Cursor op beginpos. voor input (in venster) ?
        JR   Z,PRESET2  ;Ja   (BS-toets weigeren)
        DEC  A
        LD   H,A        ;X vr cursor
        LD   L,(IY+5)   ;Y
        CALL VRAM_AD    ;Bereken Vram adres
        CALL SETW_LO    ;Set VDP voor write
        LD   C,(IY-1)   ;Poortnr.
        LD   A,#20      ;Karakter vr cursor
        OUT  (C),A      ; wissen met spatie
        DEC  (IY+4)     ;X-pos. -1
        CALL DSP_CSR    ;Verplaats cursor
        JR   PRESET2    ;(Terug naar input)
;-------
PRESET3 CP   #0D        ;RET-key ?
        JP   Z,PRESETB  ;Ja   (niets veranderen)
        CP   #18        ;SEL-key ?
        JR   Z,PRESET4  ;Ja
        CP   #20        ;Ongewenste andere commando-toets ?
        JR   C,PRESET2  ;Ja   (toets weigeren)

;--> Afhandeling cijfertoets

        LD   A,#4E      ;Cursor X-pos na input 2 cijfers
        CP   (IY+4)     ;Staat de cursor daar ?
        JR   Z,PRESET2  ;Ja    (toets weigeren)
        LD   A,C        ;Input kar.
        CP   #30        ;Cijfertoets ?
        JR   C,PRESET2  ;Nee   (toets weigeren)
        CP   #3A        ;Cijfertoets ?
        JR   NC,PRESET2 ;Nee   (toets weigeren)
        PUSH AF         ;Save input karakter
        CALL SET_W_C    ;Set VDP voor write op cursorpos.
        LD   C,(IY-1)   ;Poortnr.
        POP  AF         ;Herstel input karakter
        OUT  (C),A      ;Karakter ---> Vram (overschrijft cursor op scherm)
        INC  (IY+4)     ;X-pos. +1
        CALL DSPCSR1    ;Plaats cursor
        JR   PRESET2    ;(Terug naar input)

;--> Afhandeling SELECT-toets

PRESET4 LD   H,#4C      ;X-pos begin input (in venster)
        LD   L,(IY+5)   ;Y-pos.
        CALL VRAM_AD    ;Bereken Vram adres
        CALL SETR_LO    ;Set VDP voor read
        LD   C,(IY-2)   ;Poortnr. voor VDP read
        IN   A,(C)      ;Lees 1e input karakter
        CP   #FF        ;Is er tenminste 1 karakter ingegeven ?
        JR   Z,PRESET2  ;Nee   (SEL-toets weigeren)
        LD   D,A        ;Karakter opslaan in `D'
        EX   (SP),HL
        EX   (SP),HL
        IN   A,(C)      ;Lees 2e input karakter
        LD   E,A        ; naar `E'
        CP   #FF        ;Is er een 2e cijfer ingegeven ?
        JR   Z,PRESET5  ;Nee
        LD   H,0
        LD   L,H
        LD   A,D        ;Ascii 1e cijfer
        SUB  #30        ;Conversie binair
        LD   H,A
        ADD  A,A        ;x2
        ADD  A,A        ;x4
        ADD  A,H        ;x5
        ADD  A,A        ;x10
        LD   H,A        ;Opslaan
        LD   A,E        ;Ascii 2e cijfer
        SUB  #30        ;Conversie binair
        ADD  A,H        ;Binaire waarde van 2 input-cijfers
        JR   PRESET6
PRESET5 LD   A,D        ;Ascii cijfer
        SUB  #30        ;Binaire waarde indien naar 1 cijfer ingegeven

;--> Check ingegeven regelnr.

PRESET6 ADD  A,#03      ;Conversie regelnummer naar Y-pos.
        LD   C,A        ;Y-pos. bewaren in `C'
        CP   (IY-29)    ;Zelfde waarde ingeven als bestaande voorkeurveld ?
        JP   Z,PRESETB  ;Ja   (dus niets veranderen)
        LD   B,(IY+17)  ;Aantal velden
        LD   HL,FIELDS  ;Base velden tabel
PRESET7 LD   A,(HL)     ;Haal Y-pos. veld
        CP   C          ;Gelijk aan Y-pos. van ingegeven regelnr. ?
        JR   Z,PRESET8  ;Ja
        INC  HL         ;Pointer +1
        DJNZ PRESET7    ;Zoek verder in tabel

;--> Hier bij onjuiste ingave

        CALL WIS_L24    ;Wis lijn 24
        LD   HL,TEXT_10 ;Txtpointer `ingave onjuist' etc.
        CALL MESSAGE    ;Bericht ---> lijn 24 & wachten op toets
        LD   HL,#066B
        LD   DE,PRES_6  ;Pointer txt 6e regel
        CALL FAST1      ;Naar scherm (overschrijft de daar aanwezige cursor)
        LD   HL,#4C15   ;XY-pos. waar cursor moet komen
        LD   (IY+5),L
        LD   (IY+4),H
        CALL DSPCSR1    ;Plaats cursor
        JP   PRESET2    ;(Terug naar vr input)

;--> Hier indien input ok

PRESET8 PUSH AF         ;Save Y-pos. nieuw voorkeursveld
        LD   HL,#4C13   ;XY invulpos.
        PUSH DE
        CALL VRAM_AD    ;Bereken Vram adres
        CALL SETW_LO    ;Set VDP voor write
        LD   C,(IY-1)   ;Poortnr.
        POP  DE
        OUT  (C),D      ;1e input karakter invullen achter 'instelling'
        LD   A,#FF      ;Is er een
        CP   E          ; 2e karakter ingegeven ?
        JR   Z,PRESET9  ;Nee
        OUT  (C),E      ;Ja, invullen
        JR   PRESETA
PRESET9 LD   A,#20      ;Spatie invullen als
        OUT  (C),A      ; geen 2e karakter werd ingegeven
PRESETA LD   HL,#061B
        LD   DE,PRES_0  ;Pointer naar blanco regel
        CALL FAST1      ;Wis 5e regel
        LD   HL,#066B
        LD   DE,PRES_9  ;Pointer naar `geheugen aanpassing, momentje...'
        CALL FAST1      ;6e regel in venster overschrijven
        LD   HL,#06BB
        LD   DE,PRES_0  ;Pointer naar blanco regel
        CALL FAST1      ;Wis 7e regel
        POP  AF         ;Herstel Y-pos. nieuw voorkeursveld
        CALL CHG_VK     ;Voor alle kaarten de 3 bytes uit het nieuwe voor-
                        ;keurveld lezen en in de index invullen. (Indien geen
                        ;bestand, alleen voorkeurveld-data wijzigen.)
        SET  5,(IY+0)   ;Set statusbit `bestand gewijzigd'
        LD   HL,#066B
        LD   DE,PRES_0  ;Pointer naar blanco regel
        CALL FAST1      ;6e regel in venster wissen
        LD   HL,#0730   ;Vram adres lijn 24
        LD   DE,PRES_10 ;Txtpointer naar `Index wordt gesorteerd' etc.
        CALL FAST1      ;Tekst ---> lijn 24  (overschrijft TEXT_9)
        RES  1,(IY+42)  ;Reset statusbit `auto sort'
        CALL SORTEER    ;Index alfabetisch (ascii) sorteren op voorkeurveld
        SET  1,(IY+42)  ;Set statusbit `auto-sort'
PRESETB CALL WIS_L24    ;Wis lijn 24
        CALL ESCAPE     ;Preset-venster verwijderen en cursor plaatsen
                        ;(Als RET-key werd gedrukt werd tevens de nog
                        ;aanwezige cursor in het venster overschreven)
        JP   UNPAGE     ;Systeemram weer aanschakelen & #FF ---> (IY-15) $ RET
                        ;(DI & EI i.v.m. printerbuffer)

;------------------------------------
;AFHANDELING VERANDERING VOORKEURVELD (Subroutine voor FNK7/4)   page 0
;------------------------------------
CHG_VK  LD   (IY-29),A  ;Y-pos. nieuw voorkeurveld opslaan

;--> Rangorde van voorkeurveld bepalen = offset voor pos.lengtebyte v.txtdata
;    (DJNZ-teller wordt nooit nul, omdat Y-pos. voorkeurveld al gecheckt is)

        LD   C,A        ;Y-pos. voorkeurveld
        LD   E,#00      ;Preset offset-teller
        LD   B,(IY+17)  ;Aantal velden
        LD   HL,FIELDS  ;Base velden tabel
CHG_VK1 LD   A,(HL)
        INC  HL
        CP   C          ;Voorkeurveld ?
        JR   Z,CHG_VK2  ;Ja
        INC  E          ;Offset +1
        DJNZ CHG_VK1
CHG_VK2 LD   D,#00      ;`DE'= nieuwe offset
        LD   (OFF_VK),DE;  opslaan
        LD   HL,(NXT_FRE)
        LD   BC,#0001
        OR   A
        SBC  HL,BC      ;Bestand nog leeg ?
        RET  Z          ;Ja

;--> Aantal entries in index-segment bepalen

        LD   HL,#0001   ;1e kaartnr.
        LD   (TEMP_2),HL; opslaan
        LD   A,(IY+10)  ;Hoogste segment ID (= index-segment)
CHG_VK3 LD   (IY+12),A  ;Opslaan als huidig index segment ID
        CALL GET_ADI    ;Haal vrij adres index-segment uit table in `HL'
                        ;(Preserves A & BC)
        PUSH  HL        ;Save vrij adres index-segment
        CALL GET_STA    ;Get startadres segment in `DE' (`HL' unchanged)
        PUSH DE         ;Startadres index-segment
        POP  IX         ; naar IX
        OR   A          ;Clear carry
        SBC  HL,DE      ;Bereken aantal gebruikte bytes in indexsegment
        SRL  H          ;Delen
        RR   L
        SRL  H          ; door
        RR   L
        SRL  H          ;  8
        RR   L          ;geeft aantal entries in index segment
        LD   (TEMP_1),HL;aantal entries opslaan

;--> Data uit index segment ophalen

CHG_VK4 LD   DE,MINIBUF ;Buffer voor indexdata
        LD   A,(IY+12)  ;Current index-segment ID
        CP   #08        ;Index = Vram segment ?
        JR   C,CHG_VK5  ;Ja

;--> Hier indien index-segment = RAM

        CP   (IY+15)    ;Segment al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan page-in segment in page 1
                        ;(DI & EI i.v.m. printerbuffer)
        LD   A,(IX+3)   ;Segment ID txt-segment
        LD   L,(IX+6)
        LD   H,(IX+7)   ;`HL'= adres in txt-segment
        JR   CHG_VK6

;--> Hier indien index-segment = VRAM

CHG_VK5 PUSH IX         ;Adres index
        POP  HL         ; naar `HL'
        CALL SETR_HI    ;Ja, dan set VDP voor read
        LD   B,#08      ;Aantal bytes v. index-entry
        LD   C,(IY-2)   ;Poortnr. voor VDP read
        EX   DE,HL      ;`HL'= MINIBUF
        INIR              ;Index kopiren naar MINIBUF
        LD   HL,MINIBUF+3 ;Pointer naar 4e byte uit index
        LD   A,(HL)       ;ID v. txt-segment
        LD   HL,MINIBUF+6 ;
        LD   L,(HL)       ;Lowbyte v. adres in txt-segment
        INC  HL
        LD   H,(HL)       ;Highbyte v. adres in txt-segment

;--> 3 Bytes voorkeurveld uit txt-segment halen en invullen in index-segment

CHG_VK6 CALL GET_VKB    ;3 Bytes voorkeurveld uit txt-segment naar MINIBUF
        LD   DE,MINIBUF ;Buffer adres
        LD   A,(IY+12)  ;Current index-segment ID
        CP   #08        ;Vram segment ?
        JR   C,CHG_VK7  ;Ja

;--> Hier voor updating RAM-index

        CP   (IY+15)    ;Segment al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan page-in segment in page 1
                        ;(DI & EI i.v.m. printerbuffer)
        LD   A,(DE)     ;1e byte uit voorkeurveld
        LD   (IX+0),A   ; invullen
        INC  DE
        LD   A,(DE)     ;2e byte idem
        LD   (IX+1),A   ; invullen
        INC  DE
        LD   A,(DE)     ;3e byte idem
        LD   (IX+2),A   ; invullen
        JR   CHG_VK8

;--> Hier voor updating VRAM-index

CHG_VK7 PUSH IX         ;Adres index
        POP  HL         ; naar `HL'
        CALL SETW_HI    ;Ja, dan set VDP voor write
        LD   C,(IY-1)   ;Poortnr.
        LD   B,#03      ;Aantal bytes
        LD   HL,MINIBUF
        OTIR            ;3 Bytes kopiren van MINIBUF naar Vram

;--> Display kaartnr. & check of alle entries gehad

CHG_VK8 LD   HL,(TEMP_2);Kaartnr.
        INC  HL         ;Kaartnr. +1
        LD   (TEMP_2),HL; weer opslaan
        CALL DSP_CNR    ;Display kaartnr. in voetregel
        LD   HL,(TEMP_1);Aantal index entries
        DEC  HL         ;Aantal entries -1
        LD   (TEMP_1),HL; en weer opslaan
        LD   A,H
        OR   L          ;Alle entries gehad ?
        JR   Z,CHG_VK9  ;Ja
        LD   DE,#0008
        ADD  IX,DE      ;Pointer naar volgende index-entry
        JP   CHG_VK4
CHG_VK9 POP  HL         ;Herstel vrij adres index
        LD   A,(IY+12)  ;Huidig index-segment ID
        CP   #08        ;Index in Vram ?
        JR   NC,CHG_VKA ;Nee
        BIT  6,H        ;Index-segment (Vram) vol ?
        JR   Z,CHG_VKC  ;Nee   (klaar)
        JR   CHG_VKB    ;Ja
CHG_VKA BIT  7,H        ;Index-segment (Ram) vol ?
        JR   Z,CHG_VKC  ;Nee   (klaar)
CHG_VKB DEC  A
        CP   (IY+11)    ;Is er een lager index-segment in gebruik ?
        JP   NC,CHG_VK3 ;Ja   (doorgaan met het lagere segment)
;-------
CHG_VKC
        LD   HL,(CARDNR);Huidige kaartnr.
        CALL DSP_CNR    ;Display kaartnr. in voetregel
        CALL UNPAGE     ;Systeemram weer aanschakelen & #FF ---> (IY-15)
                        ;(DI & EI i.v.m. printerbuffer)
        RET             ;(naar PRESETB)

#################

;----------------------------------
;KAARTFRAME + VOET OP SCHERM ZETTEN   page 1
;GEGEVENS VELDEN BEPALEN EN OPSLAAN
;----------------------------------
MAIN_W1 LD   HL,#FCAA   ;Cursorshape
        LD   (HL),#01   ;Set underscore cursor = insert mode
        SET  4,(IY+0)   ;Set statusbit `insert mode'
        LD   HL,#0204   ;Fictieve cursorpos.
        LD   (OLD_CSR),HL;opslaan als oude cursorpos.
        LD   (IY+8),#20 ;  (en daar staat een spatie)
        LD   HL,#0A00   ;Base adres colortable
        CALL SETW_LO
        LD   D,3        ;Aantal regels
MAIN_W2 LD   HL,#0009   ;Bytes voor 1 regel
        LD   A,#FF
        CALL FILL_V1    ;Write 9 "FF" bytes in colortable
        LD   HL,#0001
        LD   A,#FE      ;10e colorbyte
        CALL FILL_V1
        DEC  D
        JR   NZ,MAIN_W2
        LD   A,(INFO_R) ;Aantal gebruikte regels
        LD   L,A        ;`L'= loopcounter
        ADD  A,#03      ;Y-pos. laatste gebruikte regel
        LD   (IY+6),A   ;In datalist zetten
MAIN_W3 LD   DE,COL_$T  ;Pointer color-$ voor txt-regel
        LD   B,#0A      ;Lengte color-$
        CALL W$_VRM1    ;Write color-$ in colortable
        DEC  L          ;Color-$ voor alle txt-regels geschreven ?
        JR   NZ,MAIN_W3 ;Nee  (next regel)
        LD   HL,#0009   ;Aantal bytes
        LD   A,#FF
        CALL FILL_V1    ;Write 9 "FF" bytes in colortable (afsluitlijn)
        LD   HL,#0001
        LD   A,#FE
        CALL FILL_V1
        LD   B,#19      ;Regel 25
        CALL COL_ADR    ;Bereken pointer colortable in `HL'
        CALL SETW_LO
        LD   D,3        ;Aantal regels
MAIN_W4 LD   HL,#0009   ;Bytes voor 1 regel
        LD   A,#FF
        CALL FILL_V1    ;Write 9 "FF" bytes in colortable
        LD   HL,#0001
        LD   A,#FE      ;10e colorbyte
        CALL FILL_V1
        DEC  D
        JR   NZ,MAIN_W4
        LD   DE,CARD    ;Pointer naar card-txt
        LD   HL,#0000   ;Base pattern name table = Vram adres
        CALL FAST1      ;Kaart ---> scherm
        LD   HL,#0780   ;Vram adres regel 25
        LD   DE,VOET_W  ;Pointer 1e txtregel
        CALL FAST1
        CALL ENASCR

;--> Eerste- en laatste veld opzoeken, lengte velden bepalen

MAIN_W5 LD   B,#03      ;Y-pos. -1 bovenste regel
        LD   HL,TBL_FLD-2 ;Base txt-table -2
        LD   IX,FIELDS
        LD   DE,#0003

;--> Zoek 1e veld

MAIN_W6 ADD  HL,DE
        INC  B          ;Y-pos.
        LD   A,(HL)     ;Data voor begin veld
        OR   A          ;Veld op deze regel ?
        JR   NZ,MAIN_W7 ;Ja
        DEC  HL         ;Pointer naar lengtebyte
        LD   (HL),A     ;Veldlengte invullen in TBL_FLD
        INC  HL         ;Herstel pointer begindata veld
        JR   MAIN_W6    ;(Verder zoeken naar 1e veld)
MAIN_W7 LD   (IY-7),B   ;Y-pos. eerste veld opslaan
        LD   (IY+5),B   ;Idem als startpos. cursor Y
        LD   (IX+0),B   ;Y-pos. ook opslaan in tabel 'FIELDS'
        INC  IX
        LD   (PTR_FTB),HL ;Pointer naar begindata huidige veld in TBL_FLD
        LD   C,B        ;Y-pos. bewaren in `C'
        PUSH HL
        PUSH DE
        LD   D,A        ;X-pos. begin veld naar `D'
        RES  7,D        ;Verwijder evt. numeriek-bit
        INC  HL
        LD   A,(HL)     ;X-pos. einde veld
        INC  A
        SUB  D          ;Lengte veld
        DEC  HL
        DEC  HL
        LD   (HL),A     ;Veldlengte invullen in TBL_FLD
        POP  DE
        POP  HL
        LD   (IY+17),#01;Preset teller aantal velden (1e veld gehad)

;--> Zoek laatste veld

MAIN_W8 ADD  HL,DE      ;Pointer naar data begin veld
        INC  B          ;Y-pos +1
        LD   A,(IY+6)   ;Y-pos. laatste gebruikte regel
        CP   B          ;Laatste gebruikte regel al gehad ?
        JR   C,MAIN_WA  ;Ja
        LD   A,(HL)     ;Nee, dan haal data begin veld
        OR   A          ;Veld op deze regel ?
        JR   NZ,MAIN_W9 ;Ja
        DEC  HL         ;Pointer naar lengtebyte
        LD   (HL),A     ;Veldlengte invullen in TBL_FLD
        INC  HL         ;Herstel pointer begin veld
        JR   MAIN_W8    ;(Verder zoeken naar laatste veld)
MAIN_W9 LD   C,B        ;Y-pos. bewaren in `C'
        LD   (IX+0),B   ; en opslaan in tabel 'FIELDS'
        INC  IX
        INC  (IY+17)    ;Teller aantal velden +1
        PUSH HL
        PUSH DE
        LD   D,A        ;X-pos. begin veld naar `D'
        RES  7,D        ;Verwijder evt, numeriek-bit
        INC  HL
        LD   A,(HL)     ;X-pos. einde veld
        INC  A
        SUB  D          ;Lengte veld
        DEC  HL
        DEC  HL
        LD   (HL),A     ;Lengte veld invullen in TBL_FLD
        POP  DE
        POP  HL
        JR   MAIN_W8    ;(Volgende veld zoeken)
MAIN_WA LD   (IY-8),C   ;Y-pos. laatste veld opslaan.

;--> Tabel Y-pos. numerieke velden samenstellen

        LD   DE,TBL_FLD+1;Pointer naar begindata voor veld op regel 4
        LD   HL,NUM_FLD  ;Adres numerieke velden tabel
        LD   B,#03      ;Nr. 1e regel -1
MAIN_WB INC  B          ;Y-pos. te checken regel
        LD   A,(IY+6)   ;Y-pos. laatste gebruikte regel
        CP   B          ;Laatste gebruikte regel al gehad ?
        JR   C,MAIN_WC  ;Ja
        LD   A,(DE)     ;Haal X-pos. begin veld
        INC  DE
        INC  DE
        INC  DE
        BIT  7,A        ;Numeriek veld ?
        JR   Z,MAIN_WB  ;Nee
        LD   (HL),B     ;Ja, dan Y-pos numeriek veld opslaan
        INC  HL
        INC  (IY+23)    ;Tel aantal numerieke velden
        JR   MAIN_WB    ;Check next veld

;--> Veldpositie en -type bovenste veld verwerken

MAIN_WC LD   HL,(PTR_FTB) ;Pointer naar begindata huidige veld in TBL_FLD
        LD   A,(HL)     ;Haal data begin veld
        LD   DE,TEXT_4  ;Txtpointer naar `alfanumeriek'
        RES  0,(IY+1)   ;Reset statusbit `numeriek'
        BIT  7,A        ;Numeriek veld ?
        JR   Z,MAIN_WD  ;Nee
        SET  0,(IY+1)   ;Set statusbit `numeriek veld'
        LD   DE,TEXT_5  ;Pointer naar `numeriek' etc.
        AND  #7F        ;Verwijder bit 7
MAIN_WD LD   (IY-4),A   ;X-pos. begin veld opslaan
        LD   (IY+4),A   ;Current X-pos. opslaan
        INC  HL
        LD   A,(HL)     ;Haal eindpos. veld
        LD   (IY-5),A   ;X-pos. eind veld opslaan
        LD   HL,#078A   ;Vram adres invulwoord op regel 25
        CALL FAST1      ;Woord ---> regel 25
        CALL FLD_COL    ;Highlight field
        CALL DSP_CSR    ;Plaats cursor op begin eerste veld
        LD   (IY+30),#03 ;1e te printer regelnr. bij screendump
        LD   A,(IY+6)    ;Y-pos. laatste regel van kaart
        INC  A           ;+1 voor afsluitlijn = eindregelnr. van kaart
        LD   (IY+31),A   ;Opslaan als laatste te printen regel bij screendump

;--> Offset van voorkeurveld bepalen

        LD   A,(IY-29)  ;Y-pos. voorkeurveld
        OR   A          ;Al eerder een voorkeurveld gekozen ?
        JR   NZ,MAIN_WE ;Ja
        LD   A,(IY-7)   ;Nee, dan Y-pos. bovenste veld
        LD   (IY-29),A  ; opslaan als voorkeurveld
MAIN_WE SET  1,(IY+42)  ;Set statusbit `auto-sort'
        RES  7,A        ; verwijder signaalbit
        LD   (IY-29),A  ;  en Y-pos. voorkeurveld opslaan
        LD   C,A        ;Y-pos. voorkeurveld
        LD   E,#00      ;Preset offset-teller
        LD   B,(IY+17)  ;Aantal velden
        LD   HL,FIELDS  ;Base velden tabel
MAIN_WF LD   A,(HL)
        INC  HL
        CP   C          ;Voorkeurveld ?
        JR   Z,MAIN_WG  ;Ja
        INC  E          ;Offset +1
        DJNZ MAIN_WF
MAIN_WG LD   D,#00      ;`DE'= offset voorkeurveld
        LD   (OFF_VK),DE;  opslaan
        JP   PRELOAD

#################

LOAD_05 LD   HL,BIGBUF  ;Pointer naar buffer
LOAD_06 LD   C,(HL)
        INC  HL
        LD   B,(HL)     ;`BC'= Lengte kaartdata (of eindmarkering)
        INC  HL         ;Pointer naar veld-data
        LD   (BUFFER),HL; opslaan
        LD   A,#FF
        CP   C          ;Is dit 1e byte van eindmarkering ?
        JP   NZ,LOAD_07 ;Nee   (= kaartdata)
        CP   B          ;Is dit 2e byte van einde-disk-markering ?
        JP   Z,LOAD_27  ;Ja    (vervolg-disk)

;--> Check of einde file

        LD   A,#1A
        CP   B          ;Einde-file-markering ?
        JP   Z,LOAD_36  ;Ja   (laden klaar)

;--> Check of nog een komplete data-cluster in buffer

LOAD_07 LD   (TEMP_3),BC  ;Lengte kaartdata opslaan
        LD   HL,(BUFFER)  ;Pointer naar begin veld-data
        PUSH HL           ;Save pointer naar begin veld-data
        ADD  HL,BC        ;Bereken adres volgende data-cluster
        LD   DE,(TOP_MEM) ;Eindadres +1 van buffer
        CALL COMP_DH      ;Is er nog een komplete data-cluster in buffer ?
                          ; ( DE > HL ? )
        POP  HL           ;      Herstel pointer naar begin veld-data
        JP   NC,LOAD_25   ;Nee   (data opschuiven & buffer bijladen)

;--> Aantal velden vr voorkeurveld bepalen

        LD   HL,FIELDS  ;Base veldentabel
        LD   E,#FF      ;Preset teller = -1
        LD   C,(IY-29)  ;Y-pos. voorkeurveld
LOAD_08 LD   A,(HL)     ;Haal Y-pos. veld uit tabel
        INC  HL
        INC  E          ;Teller +1
        CP   C          ;Gelijk aan Y-pos. voorkeurveld ?
        JR   NZ,LOAD_08 ;Nee, check next
        LD   HL,(BUFFER);Pointer naar begin veldlengte-data
        XOR  A
        LD   D,A
        LD   B,A
        LD   C,A
        OR   E          ;Voorkeurveld was 1e veld ?
        JR   Z,LOAD_10  ;Ja
LOAD_09 LD   A,(HL)     ;Lengte veldtxt
        INC  HL
        ADD  A,C        ;Lengtes optellen
        LD   C,A        ; van de velden
        LD   A,#00      ;  vr voorkeursveld
        ADC  A,B        ;   in
        LD   B,A        ;    `BC'
        DEC  E          ;Teller -1
        JR   NZ,LOAD_09
LOAD_10 LD   A,(HL)     ;Haal lengte van voorkeurveld
        LD   E,(IY+17)  ;'DE' = Aantal velden (= aantal opgeslagen lengtebytes)
        LD   HL,(BUFFER);Pointer naar begin veldlengte-data
        ADD  HL,DE      ;Beginadres tekst 1e veld
        ADD  HL,BC      ;`HL'= Beginadres tekst voorkeurveld
        LD   DE,MINIBUF ;Opslagadres 3 bytes uit voorkeurveld
        LD   BC,#0003
        LDIR            ;Kopier 3 bytes
        SUB  #03        ;Was lengte voorkeurveld 3 bytes ?  of meer ?
                        ;OPM.: Als voorkeurveld korter is dan 3 bytes
                        ;      werden bij LDIR, hierboven, mogelijk niet-nul
                        ;      gekopierd. Dit wordt gekorrigeerd bij "LOAD_11"
        JR   NC,LOAD_12 ;Ja
        EX   DE,HL      ;`HL'= pointer naar laatst gekopierde byte +1
        NEG             ;Tekort aan bytes omzetten neer positieve waarde
        LD   B,A        ; wordt teller

#################

;---------------------------------
;DELETE KAART-INDEX & UPDATE INDEX    Page 2
;`HL'= adres in txt-segment,
;`A'= txt-segment ID, `DE'= Huidig kaartnr.
;`IX'= adres (paged-in) index-segment
;---------------------------------
DEL_UP  LD   A,(IY+12)  ;ID huidige index-segm
        LD   (TEMP_1),A ;Opslaan
        CALL GET_STA    ;Get startadres index-segm (in DE)
        PUSH DE         ;Save
        LD   HL,(CARDNR);Kaartnr.= indexnr.
        LD   DE,#0800   ;Aantal entries/segm
        OR   A          ;Clear carry
DEL_UP1 SBC  HL,DE      ;Bereken aantal entries
        JR   NC,DEL_UP1 ; vanaf begin segment
        ADD  HL,DE      ;  t/m kaart-index
        POP  BC         ;Startadres index-segm
        PUSH HL         ;Save entries t/m kaart-index
        ADD  HL,HL      ;Bereken
        ADD  HL,HL      ; adres van
        ADD  HL,HL      ;  volgende index
        ADD  HL,BC      ;   na kaart-index
        EX   (SP),HL    ;Bronadres --> stack, HL <-- entries incl.kaart-index
        EX   DE,HL      ;HL = entries/segm, DE = entries incl. kaart-index
        SBC  HL,DE      ;Aantal entries vanaf kaartnr. +1 t/m eind segm
        ADD  HL,HL      ;Bereken
        ADD  HL,HL      ; aantal te
        ADD  HL,HL      ;  verplaatsen bytes
        EX   (SP),HL    ;Aantal bytes ---> stack,  HL <--- bronadres
        PUSH HL         ;Save bronadres
        LD   BC,-8
        ADD  HL,BC      ;Bereken doeladres
        POP  DE         ;Herstel bronadres
        EX   DE,HL      ;Swap bron- en doeladres
        POP  BC         ;Herstel aantal bytes
        CP   #08        ;Index in Vram ?
        JR   C,DEL_UP5  ;Ja
        CP   (IY+15)    ;Index segm al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan aanschakelen
        LDIR            ;Schuif alle bytes na kaart-index 8 plaatsen omlaag
DEL_UP2 LD   A,(IY+12)  ;Huidige ID index-segm
        CP   (IY+11)    ;Is er een volgend index segment ?
        JP   Z,DEL_UPA  ;Nee

;--> Hier indien er een volgend index-segm is

        DEC  A          ;ID next index-segm
        LD   (IY+12),A  ; wordt ID index-segm
        CP   #08        ;Index in Vram ?
        JR   C,DEL_UP4  ;Ja
DEL_UP3 CALL PAGE_IN    ;Segm aanschakelen
        LD   HL,#4000   ;1e index
        LD   DE,MINIBUF ; kopieren
        LD   BC,8       ;  naar
        LDIR            ;   MINIBUF
        LD   HL,#4008   ;Alle
        LD   DE,#4000   ; entries
        LD   BC,#3FF8   ;  8 plaatsen
        LDIR            ;   opschuiven
        LD   A,(IY+12)  ;Huidige ID index-segm
        INC  A          ;ID vorige index-segm
        CALL PAGE_IN    ;Segm aanschakelen
        LD   HL,MINIBUF ;Ex 1e index
        LD   DE,#7FF8   ; van huidige segm
        LD   BC,8       ;  wordt laatste index
        LDIR            ;   van vorige segm
        JR   DEL_UP2    ;Next segment, if any

;--> Index in Vram-segm verplaatsen (in volgende index-segm)

DEL_UP4 LD   DE,#0000   ;Doeladres
        LD   HL,#0008   ;Bronadres

;--> Jumped hier voor verplaatsen index in 1e te updaten index-segm

DEL_UP5 LD   (TEMP_6),DE;Doeladres opslaan
        LD   (TEMP_5),HL;Bronadres opslaan
        CALL GET_ADI    ;Haal vrijadres in segm (in HL)
        OR   A
        SBC  HL,DE      ;Bereken aantal te verplaatsen bytes
                        ;8 Bytes meer dan bij verplaatsen van segm in RAM
                        ;Daardoor wordt tevens 1e index van een evt.
                        ;volgend segm ook verplaatst.
        LD   BC,#0800   ;Blokgrootte = 2k
        LD   D,C        ;Reset blokteller
DEL_UP6 INC  D          ;Tel
        SBC  HL,BC      ; aantal blokken
        JR   NC,DEL_UP6 ;  van 2k  *** MON 80: 1k ***
        ADD  HL,BC      ;Lengte van restblok
        LD   A,H
        OR   L          ;Is lengte restblok = NUL ?
        JR   NZ,DEL_UP7 ;Nee
        DEC  D          ;Ja, dan aantal blokken -1
        LD   HL,#0800   ; en lengte laatste blok = 2k
DEL_UP7 LD   (TEMP_4),HL;Lengte laatste blok opslaan
        LD   HL,TEMP_3
        LD   (HL),D     ;Aantal blokken opslaan

;--> Check of vorige index-segm in RAM stond

        LD   A,(TEMP_1) ;ID segm waarmee updating begon
        CP   (IY+12)    ;Nu bezig met dit segm ?
        JR   Z,DEL_UP8  ;Ja
        LD   A,(IY+12)  ;ID van huidige index-segm
        INC  A          ;ID van vorige updated segm
        CP   #08        ;Stond vorige segment in RAM ?
        JR   C,DEL_UP8  ;Nee

;--> Hier als vorige updated segment in RAM stond

        LD   HL,(TEMP_6);Adres waar nu nog de 1e index staat in Vram
                        ;= Adresbits A0-A13 Vram
        LD   A,(IY+12)  ;Adresbits A14-A15 Vram
        LD   DE,MINIBUF ;Opslag adres 1e index
        LD   BC,8       ;Aantal bytes
        CALL VRM_MEM    ;1e index kopieren naar MINIBUF
        LD   A,(IY+12)  ;Huidige ID index-segm  (in Vram)
        INC  A          ;ID vorige index-segm (in Ram)
        CALL PAGE_IN    ;Segm aanschakelen
        LD   HL,MINIBUF ;Ex 1e index
        LD   DE,#7FF8   ; van huidige segm
        LD   BC,8       ;  wordt laatste index
        LDIR            ;   van vorige segm
        JP   DEL_UP2    ;Next segment, if any
;---------------
DEL_UP8 LD   HL,TEMP_3
        LD   BC,#0400   ;Bloklengte
        DEC  (HL)       ;Laatste blok al verplaatst ?
        JP   C,DEL_UP2  ;Ja  (next segm)
        JR   NZ,DEL_UP9 ;Jump indien NIET laatste blok
        LD   BC,(TEMP_4);Lengte laatste blok
DEL_UP9 PUSH BC         ;Save bloklengte
        LD   HL,(TEMP_5);Bronadres (Adresbit A0-A13 Vram)
        LD   A,(IY+12)  ;Huidig ID Vram-segm (= adresbits A14-A15 Vram)
        LD   DE,BIGBUF  ;Doeladres
        CALL VRM_MEM    ;Blok kopieren naar BIGBUF
        LD   (TEMP_5),HL;Volgend bronadres opslaan
        LD   HL,BIGBUF  ;Bronadres (Adresbits A0-A13 Vram)
        LD   A,(IY+12)  ;Huidig ID Vram-segm (= adresbits A14-A15 Vram)
        LD   DE,(TEMP_6);Doeladres (Adresbit A0-A13 Vram)
        POP  BC         ;Herstel bloklengte
        CALL MEM_VRM    ;Blok terug naar Vram (8 plaatsen lager)
        JR   DEL_UP8    ;(Next blok)

;--> Hier als index aanpassen gereed is

DEL_UPA LD   BC,FRE_TBL ;Base vrije-segment-adres-table
        LD   H,#00
        LD   L,(IY+11)  ;Laatste index-segment ID = offset
        ADD  HL,HL      ;2x
        ADD  HL,BC      ;Bereken table adres voor segment ID
        PUSH HL         ;Save
        LD   E,(HL)     ;Haal vrij
        INC  HL         ; adres van segment
        LD   D,(HL)     ;  uit table
        LD   HL,-8
        ADD  HL,DE      ;Adres laatste index = nieuw vrij adres
        EX   DE,HL      ; naar 'DE'
        POP  HL         ;Herstel adres table vrije adressen
        LD   (HL),E     ;Zet nieuw
        INC  HL         ; vrij adres
        LD   (HL),D     ;  in table
        LD   A,(TEMP_1)   ;Herstel ID
        LD   (IY+12),A    ; van index-segment
        CP   (IY+15)      ;Al aangeschakeld ?
        CALL NZ,PAGE_IN   ;Nee,  dan aanschakelen
        LD   HL,(NXT_FRE) ;
        DEC  HL           ;Update vrije kaartnr.
        LD   (NXT_FRE),HL ; en opslaan
        RET

###################

;----------------
;HANDLING FNK F10   page 1
;----------------
FNK_F10 LD   A,(IY+2)   ;Statusbyte `vensters'
        OR   A          ;Staat er een venster op scherm ?
        CALL NZ,ESCAPE  ;Ja,  dan eerst venster verwijderen en cursor plaatsen
        BIT  1,(IY+1)   ;Statusbit `kaart gewijzigd' set ?
        JR   Z,FNK_10A  ;Nee
        LD   HL,TEXT_18 ;Txtpointer naar `kaart is gewijzigd' etc
        CALL MESS_JN    ;Bericht naar lijn 24 en wachten op response
        JR   NZ,FNK_10A ;Jump indien response was "N"
        SET  7,(IY+0)   ;Set statusbit `return'
        CALL FNK_2_5    ;Kaart opslaan in memory
        RES  7,(IY+0)   ;Reset Statusbit `return'
FNK_10A BIT  7,(IY-13)  ;Statusbit `printerbuffer' set
        CALL NZ,RES_BUF ;Ja, dan herstel omgebogen hook
        RES  7,(IY-13)  ;Reset statusbit `printerbuffer'
        SET  7,(IY-29)  ;Set signaalbit (bit wordt gebruikt bij volgende
                        ; programstart om "auto sort" te aktiveren)

;--> Voorbereiding saven printerdata & voorkeurveld

        XOR  A           ;Clear carry
        LD   HL,EIND_1   ;Eindadres te saven data +1
        LD   DE,TEMP_11  ;Beginadres te saven data
        SBC  HL,DE       ;Bereken aantal bytes
        LD   (TEMP_1),HL ;Opslaan
        EX   DE,HL       ;`HL'= beginadres
        LD   BC,#0100    ;Offset COM-file
        SBC  HL,BC       ;Bereken adres in file
        LD   (TEMP_2),HL ;File adres opslaan
        LD   HL,FLD_BAK  ;Eindadres te saven tables
        LD   DE,SET_MSX  ;Beginadres te saven tables
        SBC  HL,DE       ;Bereken aantal bytes
        LD   (TEMP_3),HL ;Opslaan
        EX   DE,HL       ;`HL'= beginadres
        SBC  HL,BC       ;Bereken adres in file
        LD   (TEMP_4),HL ;Opslaan
        BIT  2,(IY+0)    ;Statusbit `dos2' set ?
        JP   NZ,FNK_10H  ;Ja

;--> (DOS1) Saven printer-data en -tables

FNK_10B LD   DE,DIREC   ;Opslagadres voor directory entry
        LD   C,#1A      ;Fnk: set disk transfer adres
        CALL BDOS
        LD   DE,FCB4    ;FCB werkprogramma
        LD   C,#11      ;Fnk: search first
        CALL BDOS
        PUSH AF         ;Save flags (van BDOS call of van ja/nee response)
        BIT  1,(IY+0)   ;Statusbit `diskfout own_err' set ?
        JR   Z,FNK_10C  ;Nee
        RES  1,(IY+0)   ;Reset statusbit `diskfout own_err'
        POP  AF         ;Herstel flags (van ja/nee response)
        JR   Z,FNK_10B  ;Jump indien response "JA" opnieuw proberen

;--> Afhandeling response "NEE"

        LD   HL,ERROR_P ;Txtpointer `printerdata niet gesaved' etc.
        CALL MESS_JN    ;Txt ---> lijn 24 & wachten op toets
        JP   C,FNK_10M  ;(Response "ESC") Saven printerdata overslaan
        JR   FNK_10B    ;(Andere toets) Opnieuw proberen
;-------
FNK_10C POP  AF         ;Herstel flags (van BDOS call)
        OR   A          ;Werkprogramma gevonden ?
        JR   Z,FNK_10E  ;Ja

;--> Hier indien werkprogramma NIET gevonden (DOS 1)

FNK_10D LD   HL,TEXT_54 ;Txtpointer `werkprogr. niet gevonden' etc.
        CALL MESSAGE    ;Txt ---> lijn 24 & wachten op toets
        JR   FNK_10B    ;Opnieuw proberen

;--> Hier indien werkprogramma gevonden (DOS 1)

FNK_10E LD   DE,FCB4    ;FCB voor werkprogramma
        LD   C,#0F      ;Fnk: open file
        CALL BDOS       ;NOTE: Hier kan geen diskfout optreden omdat
                        ;      search first succesvol was
FNK_10F LD   HL,#0001    ;Record size
        LD   (FCB4+14),HL; invullen in FCB4
        DEC  HL
        LD   (FCB4+35),HL;Reset current record in FCB4 (high-bytes)
        LD   HL,(TEMP_2) ;Adres in file
        LD   (FCB4+33),HL; wordt random record
        LD   DE,TEMP_11 ;Transfer adres (beginadres data)
        LD   C,#1A      ;Fnk: set transferadres
        CALL BDOS
        LD   DE,FCB4     ;FCB werkprogramma
        LD   HL,(TEMP_1) ;Aantal bytes
        LD   C,#26       ;Fnk: random write
        CALL BDOS        ;Printer data ---> disk
                         ;NOTE: Dit zijn maar een paar bytes. Er wordt dus
                         ;      nog niets naar disk geschreven. Er kan dus
                         ;      geen diskfout optreden
        LD   DE,SET_MSX  ;Transferadres (begin printer tables)
        LD   C,#1A       ;Fnk: set transferadres
        CALL BDOS
        LD   HL,(TEMP_4) ;Adres in file
        LD   (FCB4+33),HL; wordt random record
        LD   DE,FCB4     ;FCB werkprogramma
        LD   HL,(TEMP_3) ;Aantal bytes
        LD   C,#26       ;Fnk:random write
        CALL BDOS        ;Printer tables ---> disk
        PUSH AF          ;Save flags (van BDOS call of van ja/nee response)
        BIT  1,(IY+0)    ;Statusbit `diskfout own_err' set ?
        JR   Z,FNK_10G   ;Nee
        RES  1,(IY+0)    ;Reset statusbit `diskfout own_err'
        POP  AF          ;Herstel flags (van ja/nee response)
        JR   Z,FNK_10F   ;Jump indien response "JA" opnieuw proberen

;--> Afhandeling response "NEE"

        LD   DE,FCB4     ;FCB werkprogramma
        LD   C,#10       ;Fnk: close file
        CALL BDOS
        LD   HL,ERROR_P ;Txtpointer `printerdata niet gesaved' etc.
        CALL MESS_JN    ;Txt ---> lijn 24 & wachten op toets
        JP   C,FNK_10M  ;(Response "ESC") Saven printerdata overslaan
        JP   FNK_10B    ;(Andere toets) Opnieuw proberen
;-------
FNK_10G POP  AF         ;Stack korrektie
        LD   DE,FCB4
        LD   C,#10       ;Fnk: close file
        CALL BDOS
        JP   FNK_10M

;--> Saven printer-data en -tables onder DOS 2

FNK_10H LD   DE,PATH_$W ;Path-$ voor werkprogramma
        LD   IX,FIB     ;Adres File Info Block
        LD   BC,#0040   ;Fnk: find first entry
        CALL BDOS
        PUSH AF         ;Save flags (van BDOS call of van ja/nee response)
        BIT  1,(IY+0)   ;Statusbit `diskfout own_err' set ?
        JR   Z,FNK_10I  ;Nee
        RES  1,(IY+0)   ;Reset statusbit `diskfout own_err'
        POP  AF         ;Herstel flags (van ja/nee response)
        JR   Z,FNK_10H  ;Jump indien response "JA" opnieuw proberen

;--> Afhandeling response "NEE"

        LD   HL,ERROR_P ;Txtpointer `printerdata niet gesaved' etc.
        CALL MESS_JN    ;Txt ---> lijn 24 & wachten op toets
        JP   C,FNK_10M  ;(Response "ESC") Saven printerdata overslaan
        JR   FNK_10H    ;(Andere toets) Opnieuw proberen
;-------
FNK_10I POP  AF         ;Herstel flags (van BDOS call)
        JR   Z,FNK_10J  ;Jump indien werkprogramma gevonden

;--> Hier indien werkprogramma NIET gevonden (DOS 2)

        LD   HL,TEXT_54 ;Txtpointer `werkprogr. niet gevonden' etc.
        CALL MESSAGE    ;Txt ---> lijn 24 & wachten op toets
        JR   FNK_10H    ;Opnieuw proberen

;--> Hier indien werkprogramma gevonden (DOS 2)

FNK_10J LD   DE,PATH_$W ;Path-$ voor werkprogramma
        LD   A,#02      ;Write-mode
        LD   C,#43      ;Fnk: open file handle
        CALL BDOS       ;NOTE: Hier kan geen diskfout optreden omdat
                        ;      find first succesvol was
        LD   (IY+18),B  ;Nr. filehandle opslaan
FNK_10K LD   DE,#0000
        LD   HL,(TEMP_2);Adres in file
        XOR  A
        LD   B,(IY+18)  ;Nr. filehandle
        LD   C,#4A      ;Fnk: move filehandle pointer
        CALL BDOS
        LD   DE,TEMP_11 ;Beginadres printerdata
        LD   HL,(TEMP_1);Aantal bytes
        LD   B,(IY+18)  ;Nr. filehandle
        LD   C,#49      ;Fnk: write to filehandle
        CALL BDOS       ;Printer data ---> disk
                        ;NOTE: Dit zijn maar een paar bytes. Er wordt dus
                        ;      nog niets naar disk geschreven. Er kan dus
                        ;      geen diskfout optreden
        LD   DE,#0000
        LD   HL,(TEMP_4);Adres in file
        XOR  A
        LD   B,(IY+18)  ;Nr. filehandle
        LD   C,#4A      ;Fnk: move filehandle pointer
        CALL BDOS
        LD   DE,SET_MSX ;Beginadres printer-tables
        LD   HL,(TEMP_3);Aantal bytes
        LD   B,(IY+18)  ;Nr. filehandle
        LD   C,#49      ;Fnk: write to filehandle
        CALL BDOS       ;Printer tables ---> disk
        PUSH AF         ;Save flags (van BDOS call of van ja/nee response)
        BIT  1,(IY+0)   ;Statusbit `diskfout own_err' set ?
        JR   Z,FNK_10L  ;Nee
        RES  1,(IY+0)   ;Reset statusbit `diskfout own_err'
        POP  AF         ;Herstel flags (van ja/nee response)
        JR   Z,FNK_10K  ;Jump indien response "JA" opnieuw proberen

;--> Afhandeling response "NEE"

        LD   B,(IY+18)
        LD   C,#45      ;Fnk: close file handle
        CALL BDOS
        LD   HL,ERROR_P ;Txtpointer `printerdata niet gesaved' etc.
        CALL MESS_JN    ;Txt ---> lijn 24 & wachten op toets
        JP   C,FNK_10M  ;(Response "ESC") Saven printerdata overslaan
        JP   FNK_10H    ;(Andere toets) Opnieuw proberen
;-------
FNK_10L POP  AF         ;Stack korrektie
        LD   B,(IY+18)
        LD   C,#45      ;Fnk: close file handle
        CALL BDOS

;--> Hier indien printer-data en -tables gesaved

FNK_10M BIT  5,(IY+0)   ;Statusbit `bestand gewijzigd' set ?
        JR   Z,FNK_10P  ;Nee
        SET  7,(IY+2)   ;Set statusbit `save-venster'
        LD   HL,(CSRNU) ;Huidige cursorpos.
        LD   (CURSOR),HL;Opslaan
        CALL SET_W_C    ;Set VDP voor write op cursorpos.
        LD   A,(IY+8)   ;Karakter onder huidige cursor
        LD   C,(IY-1)   ;Poortnr.
        OUT  (C),A      ;Wis cursor in huidige veld
        LD   HL,#010D   ;XY voor regel 10
        LD   BC,#0190   ;Aantal bytes voor 5 regels
        CALL CLEAR_V    ;Scherminhoud ter plaatse van venster opslaan
        LD   HL,(DATA_VE)
        LD   DE,SAVE_VE ;Pointer txt save-venster
        CALL FAST1      ;Venster naar scherm & RET
        CALL JA_NEE
        JR   Z,FNK_10N  ;Jump indien response "JA"
        CALL ESCAPE     ;Verwijder save-venster (indien aanwezig) plaats cursor
        LD   HL,TEXT_6  ;Txtpointer naar `ZEKER WETEN J/N'
        CALL MESS_JN    ;Bericht naar lijn 24 en wachten op response
        JR   Z,FNK_10P  ;Jump indien response "JA" (niet saven)
FNK_10N CALL PRE_SAV    ;Prepair saven (check disk ID, open/create data-file)
        CALL SAVING     ;Bestand saven naar disk(s)
FNK_10P DI
        LD   HL,(EXF323) ;Oude pointer naar errorhandler
        LD   (#F323),HL  ; herstellen
        LD   HL,(EXFCA9) ;Oude cursorinstellingen
        LD   (#FCA9),HL  ; herstellen
        LD   HL,(EXF24F) ;Oude inhoud van #F24F
        LD   (#F24F),HL  ; herstellen
        LD   A,#18
        LD   (#F3B1),A   ;Herstel 24 schermregels
        LD   HL,#0800    ;Herstel
        LD   (#F3B5),HL  ; base adres colortable
        LD   A,(#FFE8)  ;Herstel
        RES   7,A       ;
        LD   C,#09      ; VDP instelling
        LD   B,A        ;
        CALL WRTVDP     ;  voor
        LD   BC,#000D   ;
        CALL WRTVDP     ;   24 lijnen
        EI
        CALL SDFSCR     ;Restore screen related parameters stored in clockchip
        LD   DE,#F87F   ;FNKSTR pointer
        LD   HL,OLD_FNK ;Opslag-address voor oude FNK-strings
        LD   A,#0A      ;Afteller
FNK_10Q LDI             ;De 1e
        LDI             ; 3 bytes
        LDI             ;  van
        LD   BC,#000D   ;   de
        EX   DE,HL      ;    FNK-strings
        ADD  HL,BC      ;     herstellen
        EX   DE,HL      ;      zoals ze
        DEC  A          ;       waren bij
        JR   NZ,FNK_10Q  ;       opstarten
        LD   HL,(OLDSTCK);Oude stackpointer
        LD   SP,HL       ; herstellen
        LD   A,(IY+9)   ;Haal statusbyte Turbo-R
        BIT  6,A        ;Turbo-R computer ?
        JR   Z,FNK_10R  ;Nee
        AND  #03        ;Isoleer bits 0 & 1
                        ;(Processormode TURBO-R bij programma-start)
        CALL SETMODE    ;Switch TURBO-R terug in oude mode
FNK_10R RST  0

##################

PRES_1  DEFB #20,#18,#7F,#21,#17,#19,#00
PRES_2  DEFB #20,#16,#7F,#05,#20,"PRESET VOOR VOORKEURVELD"
        DEFB #7F,#04,#20,#16,#00
PRES_3  DEFB #20,#14,#7F,#21,#17,#13,#00
PRES_4  DEFB #20,#16,"  Ingesteld op veld van regel    ",#16,#00
PRES_5  DEFB #20,#16,"  Akkoord ?        Druk 'RET'    ",#16,#00
PRES_6  DEFB #20,#16,"  Wijzigen:  type regelnummer    ",#16,#00
PRES_7  DEFB #20,#16,"  en druk daarna   'SELECT'      ",#16,#00
PRES_8  DEFB #20,#1A,#7F,#21,#17,#1B,#00
PRES_0  DEFB #20,#16,#7F,#21,#20,#16,#00
PRES_9  DEFB #20,#16," Geheugen aanpassing, momentje...",#00
;---------------
PRES_10 DEFB #7F,#07,#20,"Index wordt gesorteerd op nieuw voorkeurveld,"
        DEFB " even geduld a.u.b.",#00
;(Tekst PRES_10 wordt gebruikt op info-regel, niet in venster)
;===============

##################

;-------------------------------
;SORTEREN INDEX VAN VOORKEURVELD   page 2
;-------------------------------
SORTEER LD   A,(IY+10)  ;Hoogste index-segment ID
        LD   (IY+12),A  ; wordt huidige index-segm
        CP   #08        ;Index in Vram ?
        JR   NC,SORT_00 ;Nee
        LD   HL,TEXT_55 ;Txtpointer `geen geheugen voor sorteren'
        CALL MESSAGE
        RET
;-------
SORT_00 SET  7,(IY+39)  ;Set statusbit `1 index-segm'
        SUB  (IY+11)    ;Bereken aantal index-segmenten -1
        JR   Z,SORT_01  ;Jump indien maar 1 index-segment
        RES  7,(IY+39)  ;Reset statusbit `1 index segm'
SORT_01 BIT  1,(IY+42)  ;Statusbit `auto-sort' set ?
        JP   Z,SORT_02  ;Nee  [segmenten intern voorsorteren]

;------------------------------------------
;ALLEEN LAATSTE KAART SORTEREN VOORBEREIDEN
;------------------------------------------
        LD   HL,(NXT_FRE) ;Laatste kaartnr. -1
        LD   A,H        ;
        OR   L          ;
        CP   #01        ;Maar 1 kaart in bestand ?
        RET  Z          ;Ja  (er valt niets te sorteren)
        LD   A,(IY+11)  ;ID laagste index-segm
        LD   (IY+12),A  ; wordt ID huidige index-segm
        CALL GET_ADI    ;Haal vrij adres index (in HL)
        LD   BC,-8      ;
        ADD  HL,BC      ;Bereken index-adres van laatste kaart
        LD   (TEMP_5),HL; opslaan
        BIT  7,(IY+39)  ;Statusbit `1 index-segm' set ?
        JP   Z,SORT_15  ;Nee (Samensorteren index laatste kaart)
        LD   A,(IY+10)  ;ID 1e index-segm
        LD   (IY+40),A  ; wordt comp-segm
        LD   (IY+41),A  ;  en sort-segm
        LD   HL,#0001   ;Preset afteller entries
        JP   SORT_03    ;(Sorteren binnen segment)

;-------------------------------
;SORTEREN BINNEN 1 INDEX-SEGMENT
;-------------------------------
;--> Aantal entries index segm bepalen

SORT_02 LD   A,(IY+12)  ;ID huidige index-segment
        LD   (IY+40),A  ;Wordt comp-segm
        LD   (IY+41),A  ; en sort-segment
        CALL GET_STA    ;Haal startadres segment (in DE)
        CALL GET_ADI    ;Haal vrij adres segment (in HL)
        OR   A
        SBC  HL,DE      ;Aantal bytes.
        SRL  H          ;Gedeeld
        RR   L          ; door
        SRL  H          ;  8
        RR   L          ;   is
        SRL  H          ;    aantal
        RR   L          ;     entries
        DEC  HL         ;Aantal entries -1
        LD   A,H
        OR   L          ;Is er maar 1 entry ?
        JR   NZ,SORT_03 ;Nee
        BIT  7,(IY+39)  ;Statusbit `maar 1 index-segm' set ?
        RET  NZ         ;(Er valt niets te sorteren)
SORT_03 PUSH HL
        EXX
        POP  BC         ; naar BC' als entry afteller
        EXX
        LD   A,(IY+40)  ;ID huidig comp-segm
        CP   (IY+15)    ;Al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan aanschakelen
        BIT  1,(IY+42)  ;Statusbit `auto-sort' set ?
        JR   Z,SORT_04  ;Nee
        LD   DE,(TEMP_5);Ja, index-adres van laatste kaart = sort adres
        JR   SORT_05

;--> Hier begint sorteren binnen segment

SORT_04 LD   DE,#4008   ;1e Sort adres
SORT_05 LD   HL,#4000   ;1e Comp adres
SORT_06 LD   B,#03      ;B = aantal te vergelijken bytes
        PUSH DE         ;Save sort adres
        PUSH HL         ;Save comp adres
SORT_07 LD   A,(DE)     ;Haal sort byte
        OR   A          ;Nulbyte ?
        JR   NZ,SORT_08 ;Nee
        LD   A,(HL)     ;Haal comp byte
        OR   A          ;Ook een nulbyte ?
        JP   Z,SORT_10  ;Ja  (velden zijn gelijk, check kaartdata niet nodig)
        SCF             ;Nee, Set carry = (HL) > (DE)
        JP   SORT_09
;-------
SORT_08 SET  5,A        ;Uppercase (ascii voor cijfer verandert niet)
        LD   C,(HL)
        SET  5,C        ;Uppercase (ascii voor cijfer verandert niet)
        CP   C          ;Gelijk ?
        JP   NZ,SORT_09 ;Nee
        INC  DE
        INC  HL
        DJNZ SORT_07    ;Next
        POP  HL           ;Herstel comp adres
        POP  DE           ;Herstel sort adres
        LD   (SORT_AD),DE ;Opslaan t.b.v. navolgende CALL
        CALL SORT_42      ;Inhoud velden vergelijken (HL & DE preserved)
        JP   C,SORT_13    ;Jump indien (HL) > (DE)
        JR   SORT_11
;-------
SORT_09 POP  HL         ;Herstel comp adres
        POP  DE         ;Herstel sort adres
        JR   C,SORT_13  ;Jump indien (HL) > (DE) bij 1e 3 bytes van index
                        ; (Index verplaatsen, check veldinhoud niet nodig)
        JR   SORT_11    ;(HL) < of = (DE)

;--> 3 bytes index (HL) < (DE) of: velden (HL) = of < (DE)  [NEXT COMP ADRES]
;    dus geen index verplaatsing   (bij sorteren binnen segment)

SORT_10 POP  HL         ;Herstel comp adres
        POP  DE         ;Herstel sort adres
SORT_11 LD   BC,8
        ADD  HL,BC      ;Volgende comp adres
        LD   A,H
        SUB  D          ;Comp adres = sort adres ?
        JP   NZ,SORT_06 ;Nee  (check next)
        LD   A,L
        SUB  E          ;Comp adres = sort adres ?
        JP   NZ,SORT_06 ;Nee  (check next)

;--> NEXT SORT.ADRES  (bij sorteren binnen segment)

        ADD  HL,BC      ;Bereken next sort adres
        EX   DE,HL      ; naar 'DE'
SORT_12 EXX
        DEC  BC         ;Entry afteller -1
        LD   A,B
        OR   C          ;Alle indexen gesorteerd ?
        EXX
        JP   NZ,SORT_05 ;Nee, (Begin checken next serie)
        BIT  7,(IY+39)  ;Statusbit `1 indexsegm.' set ?
        RET  NZ         ;Ja  (sorteren gereed)
        JR   SORT_14    ;(Volgende index-segmenten sorteren voorbereiden)

;--> Index verplaatsen bij: (HL) > (DE)  (bij sorteren binnen segment)

SORT_13 PUSH HL         ;Save comp adres
        PUSH DE         ;Save sort adres
        EX   DE,HL      ;HL = sort adres, DE = comp adres
        XOR  A          ;Clear carry
        SBC  HL,DE      ;Bereken aantal te verplaatsen bytes
        EX   (SP),HL    ;HL <---- sort adres,  aantal bytes ---> stack
        LD   DE,MINIBUF ;Opslagadres te verplaatsen sort-index
        LD   BC,8       ;Aantal bytes
        LDIR            ;Sort-index parkeren
        LD   D,H
        LD   E,L        ;HL = DE = sort adres +8
        LD   BC,-9
        ADD  HL,BC      ;HL = sort adres -1
        POP  BC         ;Herstel aantal te verplaatsen bytes
        PUSH DE         ;Save sort adres +8
        DEC  DE         ;DE = sort adres -7
        LDDR            ;Indexen 8 plaatsen opschuiven
        INC  HL         ;HL = comp adres
        EX   DE,HL      ;DE = comp adres
        LD   HL,MINIBUF ;Parkeeradres te verplaatsen index
        LD   BC,8
        LDIR            ;Ex sort-index verplaatsen naar plek ex comp-index
        POP  DE         ;Herstel sort adres +8 = next sort adres
        POP  HL         ;Herstel comp adres
        SET  5,(IY+0)   ;Set statusbit `bestand gewijzigd'
        BIT  7,(IY+0)   ;Statusbit `return' set ?
        RET  NZ         ;Ja   (terug naar samensorteren)
        JR   SORT_12    ;Nee

;----------------------------------------
;INTERN SORTEREN MEER DAN 1 INDEX-SEGMENT
;----------------------------------------
SORT_14 LD   A,(IY+12)   ;ID huidige index-segm
        CP   (IY+11)     ;Was dit het laatste index-segm ?
        JR   Z,SORT_15   ;Ja  (naar samensorteren)
        DEC  (IY+12)     ;ID volgende index-segm
        JP   SORT_02     ;(Volgende segment intern sorteren)

;-------------------------------------------
;INTERN GESORTEERDE SEGMENTEN SAMEN-SORTEREN
;-------------------------------------------
;--> Laatste index-adres van alle index-segmenten opslaan

SORT_15 RES  0,(IY+42)   ;Reset statusbit `zelfde segm'
        LD   A,(IY+10)   ;Hoogste segment ID
        LD   (IY+12),A   ; wordt ID 1e index-segm
        CALL GET_ADI     ;Haal vrij adres segm (in HL)
        LD   BC,-8
        ADD  HL,BC       ;Adres laatste index in 1e index-segm
        LD   (LAST_S1),HL; opslaan
        LD   A,(IY+12)   ;ID 1e index-segm
        DEC  A           ;ID 2e index-segm
        LD   (IY+12),A   ;ID 2e index-segm opslaan
        CALL GET_ADI     ;Haal vrij adres segm (in HL)
        BIT  7,H         ;(NZ indien segment vol, else Z)
        PUSH AF          ;Save flags
        LD   BC,-8
        ADD  HL,BC       ;Adres laatste index in 2e index-segment
        LD   (LAST_S2),HL; opslaan
        LD   (LAST_SO),HL;  en opslaan als laatste sort adres
        POP  AF          ;Herstel flags
        JP   Z,SORT_16   ;Jump indien segment NIET vol
        LD   A,(IY+12)   ;ID 2e index-segm
        DEC  A           ;ID 3e index-segm
        CP   (IY+11)     ;Is er een 3e index-segm in gebruik ?
        LD   HL,#7FF8
        JP   C,SORT_16   ;Nee
        LD   (IY+12),A   ;ID 3e index-segm opslaan
        CALL GET_ADI     ;Haal vrij adres index (in HL)
        BIT  7,H         ;(NZ indien segment vol, else Z)
        PUSH AF          ;Save flags
        LD   BC,-8
        ADD  HL,BC       ;Adres laatste index in 3e index-segment
        LD   (LAST_S3),HL; opslaan
        POP  AF          ;Herstel flags
        JR   Z,SORT_16   ;Jump indien segment NIET vol
        LD   A,(IY+12)   ;ID 3e index-segm
        DEC  A           ;ID 4e index-segm
        CP   (IY+11)     ;Is er een 4e index-segm in gebruik ?
        LD   HL,#7FF8
        JP   C,SORT_16   ;Nee
        LD   (IY+12),A   ;ID 4e index-segm opslaan
        CALL GET_ADI     ;Haal vrij adres segm (in HL)
        BIT  7,H         ;(NZ indien segment vol, else Z)
        PUSH AF          ;Save flags
        LD   BC,-8
        ADD  HL,BC       ;Adres laatste index in 4e index-segment
        LD   (LAST_S4),HL; opslaan
        POP  AF          ;Herstel flags
        JR   Z,SORT_16   ;Jump indien segment NIET vol
        LD   A,(IY+12)   ;ID 4e index-segm
        DEC  A           ;ID 5e index-segm
        CP   (IY+11)     ;Is er een 5e index-segm in gebruik ?
        LD   HL,#7FF8
        JP   C,SORT_16   ;Nee
        LD   (IY+12),A   ;ID 5e index-segm opslaan
        CALL GET_ADI     ;Haal vrij adres segm (in HL)
        BIT  7,H         ;(NZ indien segment vol, else Z)
        PUSH AF          ;Save flags
        LD   BC,-8
        ADD  HL,BC       ;Adres laatste index in 5e index-segment
        LD   (LAST_S5),HL; opslaan
        POP  AF          ;Herstel flags
        JR   Z,SORT_16   ;Jump indien segment NIET vol
        LD   A,(IY+12)   ;ID 5e index-segm
        DEC  A           ;ID 6e index-segm
        CP   (IY+11)     ;Is er een 6e index-segm in gebruik ?
        LD   HL,#7FF8
        JP   C,SORT_16   ;Nee
        LD   (IY+12),A   ;ID 6e index-segm opslaan
        CALL GET_ADI     ;Haal vrij adres index (in HL)
        LD   BC,-8
        ADD  HL,BC       ;Adres laatste index in 6e index-segment
        LD   (LAST_S6),HL; opslaan

;--> Hier begint samensorteren van intern gesorteerde segmenten

SORT_16 LD   A,(IY+10)   ;ID hoogste index-segm
        LD   (IY+40),A   ;wordt ID comp-segm
        BIT  1,(IY+42)   ;Statusbit `auto-sort' set ?
        JR   Z,SORT_17   ;Nee

;--> Hier indien alleen laatste kaart insorteren (AUTO SORT)

        LD   A,(IY+11)   ;ID laagste index-segm
        LD   (IY+41),A   ;wordt ID sort-segm
        LD   HL,(TEMP_5) ;Index-adres van laatste kaart
        LD   (LAST_SO),HL; wordt laatste sort adres
        JR   SORT_18     ;Samensortering afwerken voor laatste kaart
;---------------
SORT_17 DEC  A           ;ID 2e index-segm
        LD   (IY+41),A   ;wordt ID sort-segm
        LD   HL,#4000    ;Adres 1e index
SORT_18 LD   (SORT_AD),HL;opslaan als sort adres
        LD   A,(IY+41)   ;ID sort-segm
        CP   (IY+15)     ;Al aangeschakeld ?
        CALL NZ,PAGE_IN  ;Nee, dan aanschakelen
        LD   HL,(SORT_AD);Sort-index
        LD   DE,SORT_IN  ; kopieren
        LD   BC,8        ;  naar
        LDIR             ;   label "SORT_IN"
        LD   A,(IY+40)   ;ID comp segm
SORT_19 CP   (IY+15)    ;Al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan comp segm aanschakelen
        LD   DE,SORT_IN ;Sort adres
        LD   HL,#4000   ;1e Comp adres
SORT_20 LD   B,#03      ;B = Aantal te vergelijken bytes
        PUSH DE         ;Save sort adres
        PUSH HL         ;Save comp adres
SORT_21 LD   A,(DE)     ;Haal sort byte
        OR   A          ;Nulbyte ?
        JR   NZ,SORT_22 ;Nee
        LD   A,(HL)     ;Haal comp byte
        OR   A          ;Ook een nulbyte ?
        JP   Z,SORT_24  ;Ja  (velden zijn gelijk, check kaartdata niet nodig)
        SCF             ;Nee, Set carry = (HL) > (DE)
        JP   SORT_23
;-------
SORT_22 SET  5,A        ;Uppercase (ascii voor cijfer verandert niet)
        LD   C,(HL)
        SET  5,C        ;Uppercase (ascii voor cijfer verandert niet)
        CP   C          ;Gelijk ?
        JP   NZ,SORT_23 ;Nee
        INC  DE
        INC  HL
        DJNZ SORT_21     ;Next
        POP  HL          ;Herstel comp adres
        POP  DE          ;Herstel sort adres
        LD   DE,(SORT_AD);(t.b.v. navolgende CALL)
        CALL SORT_42     ;Inhoud velden vergelijken (HL & DE preserved)
        JP   C,SORT_34   ;Jump indien (HL) > (DE)
        BIT  0,(IY+42)   ;Statusbit `zelfde segm' set ?
        JR   NZ,SORT_25  ;Ja    [next comp.adres]
        LD   DE,SORT_IN  ;Nee, dan kopie sort-index gebruiken i.p.v. sort adr.
        JR   SORT_25     ;[next comp adres]
;-------
SORT_23 POP  HL         ;Herstel comp adres
        POP  DE         ;Herstel sort adres
        JP   C,SORT_34  ;Jump indien (HL) > (DE) bij 1e 3 bytes van index
                        ; (Index verplaatsen, check veldinhoud niet nodig)
        JR   SORT_25    ;(HL) < of = (DE)  [next comp adres]

;--> 3 Bytes index (HL) < (DE) of: Velden (HL) = of < (DE)
;    (geen index verplaatsing) dus: NEXT COMP.ADRES

SORT_24 POP  HL         ;Herstel comp adres
        POP  DE         ;Herstel sort adres
SORT_25 LD   BC,8
        ADD  HL,BC      ;Volgende comp adres
        BIT  0,(IY+42)  ;Statusbit `zelfde segm' set ?
        JR   Z,SORT_26  ;Nee
        LD   BC,(SORT_AD)
        LD   A,H
        SUB  B          ;Comp adres = sort adres ?
        JR   NZ,SORT_20 ;Nee  (samensorteren vervolgen)
        LD   A,L
        SUB  C          ;Comp.adres = sort.adres ?
        JR   NZ,SORT_20 ;Nee  (samensorteren vervolgen)
        JR   SORT_28    ;Ja  [next sort adres]
;-------
SORT_26 BIT  7,H         ;Laatste comp adres gehad ?
        JP   Z,SORT_20   ;Nee  (check next comp adres)

;--> NEXT COMP.SEGM

        LD   A,(IY+40)  ;ID huidige comp segm
        DEC  A          ;ID next comp segm
        LD   (IY+40),A  ; opslaan
        CP   (IY+41)    ;Next comp segm = sort segm ?
        JR   NZ,SORT_19 ;Nee (segm aanschakelen & samensorteren vervolgen)
        SET  0,(IY+42)  ;Ja, dan set statusbit `zelfde segm'
        CP   (IY+15)    ;Al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan comp segm aanschakelen
        LD   HL,#4000    ;1e comp adres
        LD   DE,(SORT_AD);Sort adres gebruiken i.p.v. kopie "SORT_IN"
        LD   A,#40
        CP   D           ;Sort adres = adres 1e index ?
        JR   NZ,SORT_20  ;Nee
        XOR  A
        CP   E           ;Sort adres = adres 1e index ?
        JP   NZ,SORT_20  ;Nee
        LD   BC,(LAST_SO);Adres laatste sort-index
        CP   C           ;Laatste sort adres = adres 1e index ?
        JR   NZ,SORT_27  ;Nee
        LD   A,#40
        CP   B           ;Laatste sort adres = adres 1e index ?
        RET  Z           ;Ja   (samen-sorteren gereed)
;-------
SORT_27 BIT  1,(IY+42)   ;Statusbit `auto sort' set ?
        JP   NZ,SORT_20  ;Ja  (samensorteren vervolgen)
        LD   DE,#4008    ;Nee, dan update sort adres
        LD   (SORT_AD),DE; en opslaan
        JP   SORT_20     ;(samensorteren vervolgen)
;-------

;--> NEXT SORT.ADRES

SORT_28 PUSH HL          ;Save comp adres
        LD   HL,(SORT_AD);Huidige sort adres
        LD   BC,8
        ADD  HL,BC       ;Next sort adres
        LD   BC,(LAST_SO);Laatste sort adres
        LD   A,B
        SUB  H           ;Laatste sort adres gehad ?
        JR   C,SORT_29   ;Ja
        JR   NZ,SORT_30  ;Nee
        LD   A,C
        SUB  L           ;Laatste sort adres gehad ?
        JR   NC,SORT_30  ;Nee
SORT_29 POP  HL          ;Herstel comp adres
        JR   SORT_32     ;[next sort-segm & 1e comp-segm]
SORT_30 LD   (SORT_AD),HL;Nieuw sort adres opslaan
        BIT  0,(IY+42)   ;Statusbit `zelfde segm' set ?
        JR   Z,SORT_31   ;Nee
        EX   DE,HL       ;'DE' = sort adres
        POP  HL          ;Herstel comp adres
        JP   SORT_20     ;(samensorteren vervolgen)
;-------
SORT_31 LD   A,(IY+41)   ;ID sort-segm
        CALL PAGE_IN     ;Sort segm aanschakelen
        LD   DE,SORT_IN  ;Sort-index
        LD   BC,8        ; kopieren
        LDIR             ;  naar label "SORT_IN"
        LD   A,(IY+40)   ;ID comp-segm
        CALL PAGE_IN     ;Comp-segm weer aanschakelen
        POP  HL          ;Herstel comp adres
        LD   DE,SORT_IN  ;Sort adres
        JP   SORT_20     ;(samensorteren vervolgen)

;--> NEXT SORT.SEGMENT & 1e COMP.SEGMENT (Bij: last sort.adres gehad)

SORT_32 LD   A,(IY+41)  ;ID huidige sort-segm
        CP   (IY+11)    ;Was dit het laatste index-segm ?
        RET  Z          ;Ja   (samensorteren gereed)
        DEC  A          ;ID next sort-segm
        LD   (IY+41),A  ;opslaan
        CP   (IY+15)    ;Al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan next sort-segm aanschakelen
        SUB  (IY+10)
        NEG             ;Rangorde t.o.v. hoogste index-segm
        LD   B,A        ; = DJNZ-teller
        LD   HL,LAST_S1 ;Base tabel laatste adressen
SORT_33 INC  HL         ;Bereken pointer naar
        INC  HL         ; adres van laatste index
        DJNZ SORT_33    ;  in dit sort-segm
        LD   A,(HL)
        INC  HL
        LD   H,(HL)
        LD   L,A         ;HL = Adres van laatste index in segment
        LD   (LAST_SO),HL; opslaan als laatste sort adres
        LD   HL,#4000    ;Kopier
        LD   DE,SORT_IN  ; 1e sort-index
        LD   BC,8        ;  naar
        LDIR             ;   label "SORT_IN"
        RES  0,(IY+42)   ;Reset statusbit `zelfde segm'
        LD   A,(IY+10)   ;ID hoogste index-segm
        LD   (IY+40),A   ;Wordt ID (1e) comp-segm
        JP   SORT_19     ;(Comp-segm aanschakelen & samensorteren vervolgen)

;----------------------------------
;INDEX VERPLAATSEN BIJ: (HL) > (DE)
;----------------------------------
SORT_34 BIT  0,(IY+42)  ;Statusbit `zelfde segm' set ?
        JR   Z,SORT_35  ;Nee
        SET 7,(IY+0)    ;Set statusbit `return'
        CALL SORT_13    ;Index verplaatsen binnen segment
                        ;Returns: HL = comp adres, DE = sort adres +8
        RES  7,(IY+0)   ;Reset statusbit `return'
        BIT  1,(IY+42)  ;Statusbit `auto sort' set ?
        JP   Z,SORT_25  ;Nee  [Next comp adres]
        EX   DE,HL      ;Ja,
        LD   BC,-8      ; dan
        ADD  HL,BC      ;  sort adres
        EX   DE,HL      ;   korrigeren
        JP   SORT_25    ;[Next comp adres]
;-------
SORT_35 PUSH HL         ;Save comp.adres
        LD   DE,#7FF8   ;Adres laatste index in comp segm
        EX   DE,HL      ;HL = adres laatste index, DE = comp adres
        XOR  A
        SBC  HL,DE      ;Bereken aantal te verplaatsen bytes
        PUSH HL         ;Save
        LD   HL,#7FF8   ;Laatste index
        LD   DE,KOPIE_1 ; van huidige
        LD   BC,8       ;  segment kopiren
        LDIR            ;   naar "KOPIE_1"
        LD   HL,#7FF7   ;Bronadres
        LD   DE,#7FFF   ;Doeladres
        POP  BC         ;Herstel aantal bytes
        LDDR            ;Index van comp adres t/m voorlaatste index opschuiven
        LD   HL,SORT_IN ;Adres kopie sort-index
        POP  DE         ;Herstel comp adres
        PUSH DE         ;Save
        LD   BC,8
        LDIR            ;Verplaats sort-index naar comp adres

;--> Hier als huidige comp-segm is bijgewerkt

SORT_36 LD   A,(IY+40)  ;Huidige ID comp-segm
SORT_37 DEC  A          ;ID next segm
        CP   (IY+41)    ;Nog een vol index-segm tussen comp & sort ?
        JP   Z,SORT_39  ;Nee  (Sort-segm bijwerken)
        CP   (IY+15)    ;Next segment al aangeschakeld ?
                        ;(bij vorige doorgang SORT_36/37/38)
        JR   NZ,SORT_38 ;Nee
        JR   SORT_37    ;Ja  (Evt. next vol segm vr sort-segm bijwerken)
SORT_38 CALL PAGE_IN    ;Next segm aanschakelen
        LD   HL,#7FF8   ;Laatste index
        LD   DE,KOPIE_2 ; van dit segment
        LD   BC,8       ;  kopieren
        LDIR            ;   naar "KOPIE_2"
        LD   HL,#7FF7
        LD   DE,#7FFF
        LD   BC,#3FF8
        LDDR            ;1e t/m voorlaatste index opschuiven
        LD   HL,KOPIE_1 ;Laatste index
        LD   DE,#4000   ; van vorige segm
        LD   BC,8       ;  kopieren naar
        LDIR            ;   1e index van dit segm
        LD   HL,KOPIE_2 ;Kopie 2
        LD   DE,KOPIE_1 ; verplaatsen
        LD   BC,8       ;  naar
        LDIR            ;   kopie 1
        JR   SORT_36

;--> Sort-index segment bijwerken

SORT_39 LD   A,(IY+41)   ;ID sort-segm
        CALL PAGE_IN     ;Sort-segm aanschakelen
        LD   HL,(SORT_AD)
        LD   DE,#4000
        XOR  A
        SBC  HL,DE       ;Bereken aantal te verplaatsen bytes
        JR   Z,SORT_40   ;Jump indien sort adres = 1e index van segm
                         ;(Er valt niets op te schuiven)
        PUSH HL          ;Save aantal bytes
        LD   HL,(SORT_AD);Haal sort adres
        DEC  HL          ;Bronadres = sort adres -1
        LD   D,H
        LD   E,L        ;Kopieren naar DE
        LD   BC,8
        ADD  HL,BC      ;Doeladres
        EX   DE,HL      ;Swap bron- en doeladres
        POP  BC         ;Herstel aantal te verplaatsen bytes
        LDDR            ;1e index t/m index vr sort.adres, opschuiven
SORT_40 LD   HL,KOPIE_1 ;Laatste index van
        LD   DE,#4000   ; vorige segm
        LD   BC,8       ;  wordt 1e index
        LDIR            ;   van sort-segm

;--> Comp.adres aanpassen (na verplaatsen index)

        LD   A,(IY+40)   ;ID comp-segm
        CALL PAGE_IN     ;Aanschakelen
        POP  HL          ;Herstel comp adres
        LD   BC,8
        ADD  HL,BC       ;Volgende comp adres
        BIT  7,H         ;Laatste comp adres gehad ?
        JP   Z,SORT_28   ;Nee  [next sort adres]
        LD   A,(IY+40)   ;ID huidige comp-segm
        DEC  A           ;ID next comp-segm
        CP   (IY+41)     ;Next comp-segm = sort-segm ?
        JR   Z,SORT_41   ;Nee
        SET  0,(IY+42)   ;Ja, dan set statusbit `zelfde segm'
        LD   HL,#4000    ;1e comp adres
        LD   DE,(SORT_AD);Sort adres gebruiken i.p.v. kopie "SORT_IN"
SORT_41 LD   (IY+40),A   ;ID next comp-segm opslaan
        CALL PAGE_IN     ;Next comp-segm aanschakelen
        SET  5,(IY+0)    ;Set statusbit `bestand gewijzigd'
        JP   SORT_28     ;[Next sort adres]

;-----------------------------
;INHOUD VAN VELDEN VERGELIJKEN
;-----------------------------
SORT_42 PUSH DE         ;Save sort adres
        PUSH HL         ;Save comp adres
        PUSH HL
        POP  IX         ;IX = comp adres

;--> Veldinhoud comp.index kopiren

        LD   A,(IX+3)   ;ID txt-segm
        LD   (IY+14),A  ; wordt ID huidig txt-segm
        LD   L,(IX+6)
        LD   H,(IX+7)   ;HL = pointer begin txt-cluster in segm
        CP   #08        ;Txt-segm in VRAM ?
        JR   C,SORT_44  ;Ja
        CALL PAGE_IN    ;Txt-segm aanschakelen
        LD   DE,(OFF_VK);Offset voorkeurveld (voor volgende call)
        CALL RAM_PTR    ;Pointer berekenen naar veldtxt v. voorkeurveld
                        ;`HL'= pointer, `A'= lengte veldtxt
        LD   C,A
        LD   A,#10      ;Sorteerdiepte = max. 16 bytes
        CP   C          ;Veldtekst langer ?
        JR   NC,SORT_43 ;Nee
        LD   C,#10      ;Ja, begrenzen op 16 bytes
SORT_43 LD   B,#00
        LD   DE,COMP_VK
        LDIR
        XOR  A
        LD   (DE),A     ;Maak er een ascii-Z $ van
        JR   SORT_46
;-------
SORT_44 PUSH AF         ;Save ID txt-segment
        LD   DE,(OFF_VK);Offset = rangorde (in `E')
        CALL VRM_PTR    ;Pointer bepalen naar veldtxt v. voorkeurveld
                        ;`HL'= pointer, `A'= lengte veldtxt
        LD   D,A        ;Lengte veldtxt bewaren in `D'
        LD   A,#10      ;Sorteerdiepte = 16 bytes maximum
        CP   D          ;Veldtekst langer ?
        JR   NC,SORT_45 ;Nee
        LD   D,#10      ;Ja, begrenzen op 16 bytes
SORT_45 POP  AF         ;Herstel ID txt-segment (= adresbits A14-A16)
        CALL SETR_HI    ;Set VDP voor read
        LD   C,(IY-2)   ;Poortnr. voor VDP read
        LD   HL,COMP_VK ;Bufferadres
        LD   B,D        ;Lengte veldtxt (aantal te lezen bytes)
        INIR            ;Veldtxt ---> buffer
        XOR  A
        LD   (HL),A     ;Maak er een ascii-Z $ van

;--> Veldinhoud sort-index kopiren

SORT_46 LD   A,(IY+41)   ;ID sort-segm
        CALL PAGE_IN     ;Sort-segm aanschakelen
        LD   IX,(SORT_AD)
        LD   A,(IX+3)   ;ID txt-segm
        LD   (IY+14),A  ; wordt ID huidig txt-segm
        LD   L,(IX+6)
        LD   H,(IX+7)   ;HL = pointer txt-segm
        CP   #08        ;Txt-segm in VRAM ?
        JR   C,SORT_48  ;Ja
        CALL PAGE_IN    ;Txt-segm aanschakelen
        LD   DE,(OFF_VK);Offset voorkeurveld (voor volgende call)
        CALL RAM_PTR    ;Pointer berekenen naar txt v. voorkeurveld
                        ;`HL'= pointer, `A'= lengte veldtxt
        LD   C,A
        LD   A,#10      ;Sorteerdiepte max. 16 bytes
        CP   C          ;Veldtekst langer ?
        JR   NC,SORT_47 ;Nee
        LD   C,#10      ;Ja, begrenzen op 16 bytes
SORT_47 LD   B,#00
        LD   DE,SORT_VK
        LDIR
        XOR  A
        LD   (DE),A     ;Maak er een ascii-Z $ van
        JR   SORT_50
;-------
SORT_48 PUSH AF         ;Save ID txt-segment
        LD   DE,(OFF_VK);Offset = rangorde (in `E')
        CALL VRM_PTR    ;Pointer bepalen naar veldtxt v. voorkeurveld
                        ;`HL'= pointer, `A'= lengte num. veldtxt
        LD   D,A        ;Lengte veldtxt bewaren in `D'
        LD   A,#10      ;Sorteerdiepte = 16 bytes maximum
        CP   D          ;Veldtekst langer ?
        JR   NC,SORT_49 ;Nee
        LD   D,#10      ;Ja, begrenzen op 26 byted
SORT_49 POP  AF         ;Herstel ID txt-segment (= adresbits A14-A16)
        CALL SETR_HI    ;Set VDP voor read
        LD   C,(IY-2)   ;Poortnr. voor VDP read
        LD   HL,SORT_VK ;Bufferadres
        LD   B,D        ;Lengte veldtxt (aantal te lezen bytes)
        INIR            ;Veldtxt ---> buffer
        XOR  A
        LD   (HL),A      ;Maak er een ascii-Z $ van
SORT_50 LD   A,(IY+40)   ;ID comp-segm
        CALL PAGE_IN     ;Comp-segm aanschakelen
        LD   B,#1E       ;'B'= Max. lengte -3
        LD   HL,COMP_VK+3;Beginadres comp-veld
        LD   DE,SORT_VK+3;Idem sort-veld
SORT_51 LD   A,(DE)      ;Haal sort-byte
        OR   A          ;Nulbyte ?
        JR   NZ,SORT_52 ;Nee
        LD   A,(HL)     ;Haal comp-byte
        OR   A          ;Ook een nulbyte ?
        JR   Z,SORT_53  ;Ja  (Velden zijn gelijk)
        SCF             ;Set carry-flag = (HL) > (DE)
        JR   SORT_53
;-------
SORT_52 SET  5,A        ;Uppercase (ascii voor cijfer verandert niet)
        LD   C,(HL)
        SET  5,C        ;Uppercase (ascii voor cijfer verandert niet)
        CP   C          ;Gelijk ?
        JP   NZ,SORT_53 ;Nee
        INC  DE
        INC  HL
        DJNZ SORT_51    ;Ja, next
SORT_53 PUSH AF         ;Save flags
        LD   A,(IY+40)  ;ID comp-segm
        CP   (IY+15)    ;Al aangeschakeld ?
        CALL NZ,PAGE_IN ;Nee, dan aanschakelen
        POP  AF         ;Herstel flags
        POP  HL         ;Herstel comp adres
        POP  DE         ;Herstel sort adres
        RET             ;C-flag if (HL) > (DE)
                        ;Z-Flag indien velden gelijk, NZ indien (HL) < (DE)

#####################

TEMP_11 DEFW #0001   ;Opslag 1e pagina nr. bij printen

        DEFB #00 ; (IY-29) Y-pos.gekozen voorkeurveld voor search & sorteren
                 ; Bit 7 wordt geset bij afbreken van programma, indien het
                 ;       "auto-sort" bit 1,(IY+42) geset was. Bij opstarten
                 ;       wordt dit bit gebruikt om bit 1,(IY+42) te setten
                 ;       en daarna verwijders
        DEFB #00 ; (IY-28) Printer-reset setup-code-teken voor 'CTRL-P'
        DEFB #00 ; (IY-27) Printer-reset setup-code-teken voor 'CTRL-S'
        DEFB #01 ; (IY-26) Aantal LF tussen 2 kaarten bij 'CTRL-P'
        DEFB #01 ; (IY-25) Aantal kaarten/pag. bij 'CTRL-P
        DEFB #00 ; (IY-24) Statusbyte printerdriver
                 ; Bit 0 set: Paginanummering aan
                 ; Bit 1 set: Pag.nr. links   Bit 1 & 2 reset pag.nr. midden
                 ; Bit 2 set: Pag.nr. rechts  Bit 1 & 2 reset pag.nr. midden
                 ; Bit 3 set: Alle kaarten (met 'CTRL-P')
                 ; Bit 4 set: Opgezochte kaarten (met 'CTRL-P')
                 ; Bit 5 set: Continue printen kaarten JA
                 ; Bit 6 set: Printer resetten AAN met 'CTRL-Q'
                 ; Bit 7 set: Autom. formfeed bij kaarten printen JA
        DEFB #00 ; (IY-23) Ongebruikt [ LD A,(IY-23) werkt niet !! bij MON80 ]
        DEFB #01 ; (IY-22) Aantal kaarten/pag. bij 'CTRL-S'
        DEFB #01 ; (IY-21) Aantal extra LF's tussen 2 kaarten bij 'CTRL-S'
        DEFB #01 ; (IY-20) Breedte linker marge bij Nprinten met 'CTRL-S'
        DEFB #00 ; (IY-19) 2e regelnr. van printkombinatie, set 2 met 'CTRL-S'
        DEFB #00 ; (IY-18) 1e regelnr. van printkombinatie, set 2 met 'CTRL-S'
        DEFB #00 ; (IY-17) 2e regelnr. van printkombinatie, set 1 met 'CTRL-S'
        DEFB #00 ; (IY-16) 1e regelnr. van printkombinatie, set 1 met 'CTRL-S'
        DEFB #00 ; (IY-15) Statusbyte printerselectie velden voor 'CTRL-S'
                 ; Bit 0 set: Velden van alle kaarten automatisch printen
                 ; Bit 1 set: Velden v. gevonden kaarten automatisch printen
                 ; Bit 2 set: Geselecteerde velden printen (= NIET alle velden)
                 ; Bit 3 set: Kombineren 2 velden, 1e set
                 ; Bit 4 set: Kombineren 2 velden, 2e set
                 ; Bit 5 set: Uitlijnen rechts      Res: Uitlijnen links
                 ; Bit 6 set: Marge links gewenst
                 ; Bit 7 set: Continue printen velden JA
        DEFB #00 ; (IY-14) Statusbyte printer preselectie
                 ; Bit 0,1: "0"= MSX-printer,"1"= IBM-printer,"2"= Andere pr.
                 ; Bit 2 set: Autom. formfeed bij velden printen JA
                 ; Bit 3 set: Bezig met setup-table invullen
                 ; Bit 4 set: Input code byte verlangd
                 ; Bit 5 set: Existing data in bewerking
                 ; Bit 6 set: Cijfer verlangd
                 ; Bit 7 set: SEL-toets verlangd
EIND_1  DEFB #00 ; (IY-13) Statusbyte print-mode
                 ; Bit 0 set: P-mode alle kaarten
                 ; Bit 1 set: S-mode alle kaarten
                 ; Bit 2 set: P-mode bij zoeken, volgens driver progr.
                 ; Bit 3 set: S-mode bij zoeken, volgens selectie progr.
                 ; Bit 4 set: PP gestart
                 ; Bit 5 set: SS gestart
                 ; Bit 6 set: Bezig met printer programming (P of S)
                 ; Bit 7 set: Printerbuffer aangeschakeld
        DEFB #00 ; (IY-12) Statusbyte tijdens invullen printerselectie
                 ; Bit 0 set: "DELETED" bij invullen van optie "V"
                 ; Bit 1 set: Bezig met invullen optie "V", veldselectie
                 ; Bit 2 set: Idem, optie "B", kombi-set1
                 ; Bit 3 set: Idem, optie "I", kombi-set2
                 ; Bit 4 set:
                 ; Bit 5 set: CTRL-Q gedrukt tijdens printen
                 ; Bit 6 set:
                 ; Bit 7 set: Bezig met optie E van printerdriver
                 ;            (incidenteel gebruikt en daarna altijd reset)
        DEFB #00 ; (IY-11) Cursor startposition reminder (bij progr. input)
        DEFB #00 ; (IY-10) Teller lengte SETUP-$ printerdriver
        DEFB #00 ; (IY-9) Y-pos. "ander" veld bij zoeken
        DEFB #00 ; (IY-8) Y-pos. onderste veld (met hoogste regelnr.)
        DEFB #00 ; (IY-7) Y-pos. bovenste veld (met laagste regelnr.)
        DEFB #00 ; (IY-6) Voor incidenteel gebruik, diversen
        DEFB #00 ; (IY-5) X pos. einde veld
        DEFB #00 ; (IY-4) X-pos. begin veld
        DEFB #00 ; (IY-3) Portnr. VDP command
        DEFB #00 ; (IY-2) Portnr. VDP read
        DEFB #00 ; (IY-1) Portnr. VDP write
DATA_L  DEFB #00 ; (IY+0) Statusbyte algemeen
                 ; Bit 0 set: Data van disk geladen (voor check disk bij saven)
                 ; Bit 1 set: Diskfout own_err opgetreden
                 ; Bit 2 set: Dos-2                        reset: Dos-1
                 ; Bit 3 set: Colormonitor,                reset: monochroom
                 ; Bit 4 set: Underscore cursor (insert)   reset: bloc cursor
                 ; Bit 5 set: Bestand gewijzigd (kaart gesaved of verwijderd)
                 ; Bit 6 set: DEL-toets met cursor achter eind tekst
                 ; Bit 7 set: Return from called part of a routine
        DEFB #00 ; (IY+1) Statusbyte algemeen
                 ; Bit 0 set: Numeriek veld          Reset: Alfanumeriek veld
                 ; Bit 1 set: Kaart gewijzigd
                 ; Bit 2 set: 1-3 Bytes zoek-$ voorkeurveld gevonden in index
                 ; Bit 3 set: WEL ONDERSCHEID grote/kleine letters bij zoeken
                 ; Bit 4 set: Harddisk aanwezig
                 ; Bit 5 set: Zoek-$ (alle velden) gevonden
                 ; Bit 6 set: Data-file created, (nog leeg)
                 ; Bit 7 set: Returnbit voor VALUE-routine
        DEFB #00 ; (IY+2) Statusbyte vensters
                 ; Bit 0 set: Help-venster op scherm
                 ; Bit 1 set: Preset-venster op scherm
                 ; Bit 2 set: Menu 1 op scherm
                 ; Bit 3 set: Menu 2 op scherm
                 ; Bit 4 set: Menu 3 op scherm
                 ; Bit 5 set: Numeriek-venster op scherm
                 ; Bit 6 set: Printer-venster op scherm
                 ; Bit 7 set: Save-venster op scherm
        DEFB #00 ; (IY+3) Statusbyte zoekakties
                 ; Bit 0 set: Meervoudig zoeken loopt
                 ; Bit 1 set: 3e zoekaktie gestart
                 ; Bit 2 set: Laatst gezocht in alle velden
                 ; Bit 3 set: Zoek$ gevonden in alle velden en kaart geprint
                 ; Bit 4 set: Compair-waarde num. zoekaktie ingeven
                 ; Bit 5 set: Zoek kleinere waarde, reset: Zoek grotere waarde
                 ; Bit 6 set: Geen num.txt
                 ; Bit 7 set: Index updating (gebruikt in routine DEL_UP)
        DEFB #00 ; (IY+4) Cursor X
        DEFB #00 ; (IY+5) Cursor Y
        DEFB #00 ; (IY+6) Y-pos. Laatste gebruikte lijn
        DEFB #00 ; (IY+7) Aantal nog niet gebruikte segmenten +1
        DEFB #00 ; (IY+8) Opslag karakter waar cursor op staat
        DEFB #00 ; (IY+9) TURBO-R byte
                 ; Bit 6 set indien Turbo-R
                 ; Bit 0,1 Processormode Turbo-R bij opstarten
        DEFB #00 ; (IY+10) Hoogste segment ID
        DEFB #00 ; (IY+11) Laagste in gebruik genomen index-segment ID
        DEFB #00 ; (IY+12) Huidige index-segment ID
        DEFB #00 ; (IY+13) Hoogste in gebruik genomen txt-segment ID
        DEFB #00 ; (IY+14) Huidige txt-segment ID
        DEFB #FF ; (IY+15) Segment-ID paged-in segment
        DEFB #00 ; (IY+16) Slot-ID van aangeschakeld segment
        DEFB #00 ; (IY+17) Aantal velden in de kaart
        DEFB #00 ; (IY+18) Nr. filehandle DOS2
        DEFB #00 ; (IY+19) zoek-program codering
                 ; Bit 0 set:     1e zoek-$ zoeken in voorkeurveld
                 ; Bit 1 set:     1e zoek-$ zoeken in ander veld
                 ; Bit 0 & 1 set: 1e zoek-$ zoeken in alle velden
                 ; Bits 2, 3 idem voor 2e zoek-$
                 ; Bits 4, 5 idem voor 3e zoek-$
                 ; Bit 6 set: 2e zoekaktie geprogrammeerd
                 ; Bit 7 set: 3e zoekaktie geprogrammeerd
        DEFB #00 ; (IY+20) Y-pos. opties 1e zoekaktie
        DEFB #00 ; (IY+21) Y-pos. opties 3e zoekaktie
        DEFB #00 ; (IY+22) Disk ID letter current disk
        DEFB #00 ; (IY+23) Aantal numerieke velden
        DEFB #00 ; (IY+24) X-pos. 1e num. keuze bij rekenfunkties
        DEFB #00 ; (IY+25) X-pos. laatste num. keuze bij rekenfunkties
        DEFB #00 ; (IY+26) Statusbyte voor num. funkties
                 ; Bit 0 set: geselecteerde kaarten      Reset: alle kaarten
                 ; Bit 1 set: 1e rekenfunktie binnen kaart geprogrammeerd
                 ; Bit 2 set: 2e rekenfunktie binnen kaart geprogrammeerd
                 ; Bit 3 set: 3e rekenfunktie binnen kaart geprogrammeerd
                 ; Bit 4 set: rekenen binnen kaarten, Reset: alleen totalen
                 ; Bit 5 set: totaliseerfunktie ingeven (RET niet toegestaan)
                 ; Bit 6 set: Programmeren totaal-rekenfunkties
                 ; Bit 7 set: Rekenwaarde "W" ingevuld
        DEFB #00 ; (IY+27) Statusbyte voor num. funkties
                 ; Bit 0 set: waarde "W" gebruikt als 1e factor
                 ; Bit 1 set: 1e totaal-rekenfunktie geprogrammeerd
                 ; Bit 2 set: 2e totaal-rekenfunktie geprogrammeerd
                 ; Bit 3 set: 3e totaal-rekenfunktie geprogrammeerd
                 ; Bit 4 set: 1e Totaliseer-funktie geprogrammeerd
                 ; Bit 5 set: 2e Totaliseer-funktie geprogrammeerd
                 ; Bit 6 set: 3e Totaliseer-funktie geprogrammeerd
                 ; Bit 7 set: 4e Totaliseer-funktie geprogrammeerd
        DEFB #00 ; (IY+28) Aantal voor num. funkties geselecteerde velden
        DEFB #00 ; (IY+29) Idem, doch al gebruikt voor programmering som
        DEFB #00 ; (IY+30) 1e te printen regel bij screendump (1 based)
        DEFB #00 ; (IY+31) Laatste te printen regel bij screendump (1 based)
        DEFB #00 ; (IY+32) Aantal vrije segmenten zonder printerbuffer
        DEFB #00 ; (IY+33) Laagste segment-ID voor printerbuffer
        DEFB #00 ; (IY+34) Hoogste segment-ID voor printerbuffer
        DEFB #00 ; (IY+35) Input-segment-ID printerbuffer
        DEFB #00 ; (IY+36) Output-segment-ID printerbuffer
        DEFB #00 ; (IY+37) Segmentnr. systeemram page 1
        DEFB #00 ; (IY+38) Statusbyte
                 ; Bit 0 set: Segment voor output printerbuffer paged-in
        DEFB #00 ; (IY+39) Statusbyte voor sorteren
                 ; Bit 0 t/m 6 Aantal index-segmenten
                 ; Bit 7 set: Maar 1 index-segment in gebruik
        DEFB #00 ; (IY+40) Index-segm ID comp.adres
        DEFB #00 ; (IY+41) Index-segm ID sort.adres
        DEFB #00 ; (IY+42) Statusbyte sorteren
                 ; Bit 0 set = sort- & comp.adres in zelfde segment
                 ; Bit 1 set = auto-sort voorkeurveld

;DATA VOOR SORTEREN VOORKEURVELD
;-------------------------------
SORT_IN DEFS 8          ;Kopie sort. index
SAVE_VI DEFS 8          ;Te verplaatsen index
KOPIE_1 DEFS 8          ;Opslag kopie laatste index (vr opschuiven indexen)
KOPIE_2 DEFS 8          ;Idem
LAST_S1 DEFS 2          ;Adres laatste entry in 1e segm.
LAST_S2 DEFS 2          ;Idem in 2e segm.
LAST_S3 DEFS 2          ;Idem in 3e segm.
LAST_S4 DEFS 2          ;Idem in 4e segm.
LAST_S5 DEFS 2          ;Idem in 5e segm.
LAST_S6 DEFS 2          ;Idem IN 6e segm.
LAST_CP DEFS 2          ;Laatste comp.adres in comp.segm.
SORT_AD DEFS 2          ;Sort.adres
LAST_SO DEFS 2          ;Laatste sort.adres in sort.segm.
SORT_VK DEFS 17         ;Kopie inh. VK-veld sort + eindnul, v.veldvergelijking
COMP_VK DEFS 17         ;Idem VK-veld comp
