; part of the GUI for BGE  SORT_gui.es_

; NEWCAT   EQU #FFFE-#0800    ; сортированный список каталога (sorted file list)
; CAT      EQU NEWCAT-#0900   ; полный каталог (full directory)

SORT_gui    ld hl,NEWCAT
            ld de,NEWCAT+1
            ld bc,#0800
            ld (hl),c      ; #00
            ldir           ; обнуляем
            push ix
            ld hl,(TAB_SORT)

            call .sort

            ld hl,SortCAT-1      ; сортировка по увеличению номера файла
1           inc hl
            ld a,(hl)
            or a
           jr z, 3F

            ld d,h
            ld e,l

2           inc de
            ld a,(de)
            or a
           jr z,1B
            ld c,(hl)
            cp c
           jr nc, 2B
            ld (hl),a
            ld a,c
            ld (de),a
           jr 2B

3           ld de,NEWCAT
            ld bc,SortCAT

1           ld a,(bc)
            or a
           jr z,.es_
            dec a
            ld l,a
            ld h,0
            add hl,hl
            add hl,hl
            add hl,hl
            add hl,hl  ; *16
            push bc
            ld bc,CAT
            add hl,bc
            ld bc,16
            ldir
            pop bc
            inc bc
           jr 1B

.es_        ld hl,#FFFF    ; стираем остаток данных
            xor a
            ld (de),a
            sbc hl,de
            ld b,h
            ld c,l
            ld l,e
            ld h,d
            inc de
            ldir
            pop ix
           ret

.sort

.lsort  ld a,(hl)
        ld (.detF),a

        push hl
        ld hl,NEWCAT   ; используем NEWCAT для номеров сортируемых файлов
        ld de,NEWCAT+1
        ld bc,#80
        ld (hl),b          ; #00
        ldir               ; обнуляем

        ld e,a             ; управляющий байт
     ;   ld b,0
        ld hl,.secEQ
        ld c,1
        and %111     ; выборка  000
       jr z,2F

        ld hl,.ext
        ld c,3
        dec a          ;001
       jr z,2F

        ld hl,.name
        ld c,11
        dec a          ;010
       jr z,2F

        ld hl,.secLim
        ld c,2
        dec a          ;011
       jr z,2F

        ld hl,.secFF                   ; файлы с количеством секторов 255
        dec c                          ; ld c,1
        dec a          ;100
       jr z,1F

        ld hl,.bytesEQ                 ; файлы по заданному размеру в байтах
        ld c,3
        dec a          ;101
       jr z,1F


        ld hl,Ret        ; Нейзвестное
        ld c,0
       jr 2F

1       ex (sp),hl       ; для опций использующих особые параметры
        dec hl
        ex (sp),hl

2       ld (.SelADDR),hl
        ld a,c
        ld (.step),a
        pop hl
        inc hl
        ld de,NEWCAT
       jr .select

.enext     pop hl  ; hl - след таблица
.enx_      nop      ; nop / ret
          jr .lsort

.next      inc hl
           push hl
           ld a,0
.detF   EQU $-1
           ld de,NEWCAT
           and 8
          jr nz,.subf

.addf       ; добавляем выбранные номера
            ld a,(de)
            ld c,a
            or a
           jr z,.enext
            ld hl,SortCAT
1           ld a,(hl)
            or a
           jr z,.sf     ; запись номера файла
            cp c
           jr z,.nf     ; файл уже есть
            inc hl
           jr 1B
.sf         ld (hl),c
.nf         inc de
           jr .addf

.subf       ; исключаем выбранные номера
            ld a,(de)
            ld c,a
            or a
           jr z,.enext
            ld hl,SortCAT
1           ld a,(hl)
            or a
           jr z,.ndf    ; нет файла
            cp c
           jr z,.delf   ; файл есть - стираем
            inc hl
           jr 1B
.delf       inc hl
            ld a,(hl)
            dec hl
            ld (hl),a
            inc hl
            or a
           jr nz,.delf
.ndf        inc de
           jr .subf


1           ld bc,1
.step    EQU $-2
            add hl,bc
.select

            ld a,(hl)     ; из таблицы
            or a
           jr z,.nx_
            cp #FF
           jr nz,.sele_
            ld a,#C9    ; ret
.nx_        ld (.enx_),a              ; выход, если таблица кончилась
           jr .next

.sele_      ld ix,CAT
            ld b,1        ; номера файлов начинаются с 1
2           ld a,(ix+0)
            or a
           jr z,1B        ; следующий элемент таблицы
            dec a
           jr z,3F        ; удалённый файл

           call Ret
.SelADDR  EQU $-2

3           inc b            ; номер файла
            push bc
            ld bc,#10
            add ix,bc
            pop bc
           jr 2B


.bytesEQ     inc hl         ; проверка по равенству по количеству байт
             ld a,(hl)
             cp (ix+11)
            jr z,1F
             dec hl
            ret
1            inc hl
             ld a,(hl)
             dec hl
             cp (ix+12)
             ld a,(hl)
             dec hl
            ret nz
             or a            ; + проверка соответствия количества секторов
             ld a,(ix+12)
            jr z,.sec_
             inc a
            jr .sec_


.secFF      ld a,#FF
           jr .sec_

.secEQ      ld a,(hl)        ; проверка по равенству секторам
.sec_       cp (ix+13)
.IF        ret nz
.add        ld a,b
            ld (de),a
            inc de
1          ret


.secLim     ld a,(ix+13)   ; проверка на попадание количества секторов в промежуток.
            cp (hl)
           ret c
            inc hl
            ld a,(hl)
            dec hl
            cp (ix+13)
           ret c
           jr .add


.name
            push bc
            ld bc,0
            ld a,11
           jr 1F
.ext        push bc
            ld bc,8
            ld a,3
1           push hl
            push de
            ex de,hl
            push ix
            pop hl
            add hl,bc
            ld b,a
            call .s_eq
            pop de
            pop hl
            pop bc
           jr .IF



.s_eq       ; in hl , de ,b ; out nz - not , z - yes
1           ld a,(de)
            cp "."
           jr z, 3F
            cp #03
           jr nz, 2F
            ld a,"."
2           cp (hl)
           ret nz
3           inc hl
            inc de
           djnz 1B
            xor a  ; set Z-flag
           ret



