; Оверлей Обработка списка плагинов для BGE

         ORG PgnAdr      ; адрес старта модуля

PList         call CallSYSTEMDISK
              ld (.sp),sp
              call ERASE_ALLW
              call .resetmods_

              xor a
              ld hl,WPlist.cb1F_
              ld (hl),a
              ld (WPlist.cb2F_),a
              ld a,(ExtPgns)
              ld c,a
              or a
             jr z,.n0
              ld (hl),1
              ld hl,WPlist.cb2F_
              ld de,WPlist.cb1H_
              cp 8   ; 14/2+1
             jr c,1F
              sub 7
              ld (hl),1
              ld a,14
              ld (de),a
              ld de,WPlist.cb2H_
1             cp 7
             jr c,1F
              ld a,7
1             add a,a
              ld (de),a

.n0           ld a,128+%1111
.n1           ld ix,WPlist
              ld (ix+6),a
.sp EQU $+1 : ld sp,#0000
              call .makeList
              ld c,%111
              ld b,c
.Num_Plugs EQU $+1 : ld a,0
              cp 14
             jr c,1F
              ld c,%100
1
.Num_Wplugs  EQU $+1 : ld a,0
              cp 14
             jr c,1F
              ld b,%100
1             ld a,c
              ld (WPlist.Sel+4),a
              ld a,b
              ld (WPlist.Sel+9),a
              call Win_
              cp #FF
             jr z,.exit
              cp 4
             jr c,1F
              sub 4
              ld (.Name_Num),a
              ld a,4
1             ld bc,.TabList
              call TAB_JP
              ld a,128+%1101
             jr .n1

.setSDisk     ld a,(#5D19)
              ld b,a
              ld a,(Sys_Disk)
              cp b
             ret z
             jp Driver.set     ; on 'Add.asm'


.TabList     DW .addplg     ; 0 add
             DW .addplgw    ; 1 add win
             DW .List_op    ; 2 list_
             DW .SvLst      ; 3 save list
             DW .Name_OP    ; 4 pop up plugin menu

.exit         call CLOSE
              ld de,PgnsList_
              ld hl,Pgns_List_
              push hl,de
1             ld a,(de)
              cp (hl)
             jr nz,2F
              inc de
              inc hl
              or a
             jr nz,1B
              pop de,hl
             ret
2             ld hl,.t_needreload
              call AskQ
              pop de,hl
             ret c
              ; перезагрузка модулей
              call .resldir_
              ld de,Reldlst
              ld hl,(#A500-2)  ; hl - адрес sp
              ld (hl),e
              inc hl
              ld (hl),d
             ret


.resetmods_   ld hl,PgnsList_
              ld de,Pgns_List_
.resldir_     ld bc,#00FF
              ldir
             ret

.t_needreload  MSG_PlList_USErl : DB 0

.makeList   ; создаём список из основного списка
            ld hl,WPlist.tl1
            call .cltxtlst
            ld hl,WPlist.tl2
            call .cltxtlst
            push ix
            xor a
            ld (Num_Plugs),a
            ld (Num_Wplugs),a
            ld a,#FF
            ld (WPlist.l2st),a
            ld de,Pgns_List_
            ld hl,WPlist.tl1
            ld ix,WPlist.l1st
            ld (ix+0),1
            call .mklst_
           jr z,1F
            ld hl,WPlist.tl2
            ld ix,WPlist.l2st
            ld (ix+0),10
            call .mklst_
1           pop ix
           ret

.cltxtlst   ld c,14         ; очистка текстового буфера
1           ld b,10
2           ld (hl),32 ; " "
            inc hl
           djnz 2B
            ld (hl),13
            inc hl
            dec c
           jr nz,1B
            ld (hl),#FF
           ret



.mklst_     ld c,14
1           ld a,(de)
            or a
           jr z,4F
            ld b,8
2           ld a,(de)
            ld (hl),a
            inc hl
            inc de
           djnz 2B
            ld b,32 ; " "
            ld (hl),b
            inc hl
            ld a,(de)
            inc de
            push hl
            ld hl,Num_Plugs
            cp "w"
           jr nz,3F
            ld hl,Num_Wplugs
            ld b,"$"
3           inc (hl)
            pop hl
            ld a,b
            ld (hl),a
            inc hl
            ld (hl),13
            inc hl
            dec c
           jr nz,1B
4           ld a,14
            sub c   ; A - количество опций
            or a
           jr z,5F
            or 128
            ld (ix+3),a
            dec c      ; set nz
           ret
5           ld (ix+0),#FF
           ret

.addplgw     ld a,"w"
             ld hl,Num_Wplugs
            jr 1F
.addplg      ld a,"d"
             ld hl,Num_Plugs
1            ld (.Laddplg_+1),hl
             ld (Sort_Plug+3),a
2            call .Laddplg_
            ret c
             ld ix,WPlist
             ld (ix+6),%1101
             call .makeList
             call Window_
            jr 2B


.Laddplg_    ld a,(#FFFF)
             cp 14
             ccf
            ret c
             ld hl,Sort_Plug
             call FilerE
            ret c
             call .checkDupl
            ret c
             inc a
            ret z
             call .DE_free_
             ld hl,FILE_NAME
             ld bc,8
             ldir
             inc hl
             inc hl
             ld a,(hl)
             ld (de),a
             xor a
            ret

.checkDupl  ; проверка дубликата
              ld hl,Pgns_List_
              ld c,9
1             ld de,FILE_NAME
              ld a,(hl)
              or a
             ret z
              push hl
              ld b,8
2             ld a,(de)
              cp (hl)
             jr nz,3F
              inc hl
              inc de
             djnz 2B
              inc de
              inc de
              ld a,(de)
              cp (hl)
             jr nz,3F
              pop hl
              ld hl,.DupplFound
              call AskQ
              ld a,#FF
             ret
3             pop hl
              ld b,0
              add hl,bc
             jr 1B

.DupplFound  MSG_PlList_EDupp
             DB 0

.Name_OP     ld a,0
.Name_Num  EQU $-1   ; номер выбранного плагина
             ld c,a
             add a,a
             add a,a
             add a,a
             add a,c
             ld c,a
             ld b,0
             ld hl,Pgns_List_
             add hl,bc
             ld (.ADRselected_),hl
             ld de,WPlistOP.Txt2
             push de
             ld c,8
             ldir
             inc de
             ld a,(hl)
             cp "w"
             ld a,32
            jr nz,1F
             ld a,"$"
1            ld (de),a
             ld de,WPlistMove.txt
             ld bc,10
             pop hl
             push hl
             ldir
             pop hl
             ld de,.TabNameOp     ; опции плагина переместить, удалить
            jr 1F
.List_op     ld de,.TabListOP     ; опции списка очистить,перезагрузить
             ld hl,WPlistOP.Txt1

1            ld (WPlistOP.atxt),hl
             ld (.aTab_),de
             ld ix,WPlistOP
             call POPUP
             ld (ix+6),%1111
             call Win_
             call CLOSE_
             cp 2
            ret nc

.aTab_ EQU $+1 : ld bc,.TabListOP
            jp TAB_JP


.TabNameOp   DW .pgnUpDn  ; переместить
             DW .delete   ; удалить

.TabListOP   DW .LdLst   ; 0 - reload
             DW .empt    ; 1 - empty



.LdLst         call .setSDisk
              jr c,1F
               ld hl,FnLst_
               call FromName
               ld a,SEARCHFILE11
               call GUI
              jr c,2F        ; нет файла
               ld de,(START_SEC)
               ld hl,Pgns_List_
               ld bc,#0105
               call DOS_FUNC_
              ret nc
1              ld a,6   ; error
              jr 3F
2              ld a,1   ; file not present
3              ex af,af'
               ld a,GET_MSG
               call GUI
.empt          ld hl,Pgns_List_  ; empty
               ld b,253
1              ld (hl),0
               inc hl
              djnz 1B
              ret

.delete      ld de,#0000
.ADRselected_   EQU $-2    ; адрес имени выбранного плагина
             ld hl,9
             add hl,de
1            ld b,9
             ld a,(hl)
             or a
            jr nz,3F
2            ld (de),a
             inc de
            djnz 2B
            ret
3            ld a,(hl)
             ld (de),a
             inc de
             inc hl
            djnz 3B
            jr 1B



.pgnUpDn
             ld hl,(WPlist)
             ld a,6
             add a,l
             ld l,a
             ld (WPlistMove),hl
1            ld ix,WPlistMove
             ld (ix+6),%1111
             call Win_
             call CLOSE_
             cp 2
            ret nc
             call .pgn_updn
             ld ix,WPlist
             ld (ix+6),%1101
             call .makeList
             call Window_
            jr 1B

.pgn_updn    ld hl,(.ADRselected_)
             ld d,h
             ld e,l
             ld bc,9
             or a
            jr z,1F
             add hl,bc   ; dn
             ld a,(hl)
             or a
            ret z
            jr 2F
1            dec hl       ; up
             ld a,(hl)
             or a
            ret z
             inc hl
             sbc hl,bc
2            ld (.ADRselected_),hl
             ld b,c
3            ld a,(de)
             ex af,af'
             ld a,(hl)
             ld (de),a
             ex af,af'
             ld (hl),a
             inc hl
             inc de
            djnz 3B
            ret







.DE_free_     push hl
              ld hl,Pgns_List_
              ld de,9
1             ld a,(hl)
              or a
             jr z,2F
              add hl,de
             jr 1B
2             ex de,hl
              pop hl
             ret



.SvLst        call .setSDisk
             jr nc,1F
              ld a,6   ; error
              ex af,af'
              ld a,GET_MSG
             jp GUI
1             ld a,(OVERF)
              push af
              xor a
              ld (FLAGOBJ),a
              inc a
              ld (OVERF),a
              ld hl,FnLst_
              call FromName
              ld hl,Pgns_List_
              ld de,253
              ld bc,#010B
              call DOS_FUNC_
              ex af,af'
              pop af
              ld (OVERF),a
              ex af,af'
             ret





;  DW TExamp   ;   объект-текст (text object)
;  DW SExamp   ;   объект-подсветка (выборка) (highlighting object)
;  DW HExamp   ;   горячие клавиши (hotkeys)
;  DW BExamp   ;   объект-кнопки (выборка) (buttons object)
;  DW Nil      ;   объект-флажки (flags object)
;  DW Nil      ;   объект-радио кнопки (radio buttons object)
;  DW Nil      ;   ползунок (scrollbar)
;  DW Nil      ;   вызов при создании (call on create)
;  DW Nil      ;   вызов на "прерываниях" (call "on interrupt")
     ; Дальнейшие адреса используются только при установленном 7-м бите флага (flag)
     ; Для совместимости со старыми плагинами.
;  DW Nil      ;   Вызов на прерываниях после прорисовки стрелки
;  DW Nil      ;   объект спрайты (sprites object)
;  DW Nil      ;   объект область заполненная цветом (color box)
;  DW Nil      ;   вызов перед прорисовкой окна

;  DW #FFFF




WPlist     DB 2,2,20,21,7*8,7,128+%1111
            ; Bit 0 - окно с заголовком/без
            ; Bit 1 - "перерисовать" окно да/нет
            ; Bit 2 - тискать окно по экрану да/нет
            ; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
           DB 7*8+3

           DW .Txt        ; объект-текст
           DW .Sel        ; объект-подсветка
           DW 9           ; пропуск
           DW .colbox     ; color box
           DW #FFFF

.Txt       MSG_PlList_Title : DB 13,#17,1
           DB #0A : DW .tAdd : DB 13,#17,1
           DB #0A : DW .tAdd : DB " $",13,15,13,22,11,3
           MSG_PlList_List_ : DB 13
           MSG_PlList_Save : DB 13,22,2,6
           DB #0A : DW .tl1 : DB 22,11,6
           DB #0A : DW .tl2

          DB 0

.tAdd      MSG_PlList_Add : DB #FF

.Sel       DB 1,3,8,1,%111
           DB 1,4,8,1,%111

           DB 10,3,8,128+2,%11

.l1st      DB 1,6,8,128+14,%11
.l2st      DB 10,6,8,128+14,%11

           DB #FF

.tl1       DUP 14
           DB "12345678  ",13
           EDUP

           DB #FF



.tl2       DUP 14
           DB "12345678 $",13
           EDUP

           DB #FF

.colbox     DB 1,6,8
.cb1H_      DB 14,7*8+1
.cb1F_      DB %1

            DB 10,6,8
.cb2H_      DB 14,7*8+1
.cb2F_      DB %0
           DB #FF



WPlistOP     DB 0,0,9,6,2*8+7,7*8+2,%1111
            ; Bit 0 - окно с заголовком/без
            ; Bit 1 - "перерисовать" окно да/нет
            ; Bit 2 - тискать окно по экрану да/нет
            ; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
           DB 0
.atxt      DW .Txt1       ; объект-текст
           DW .Sel        ; объект-подсветка
           DW #FFFF

.Txt1       MSG_PlList_List : DB 13
            MSG_PlList_Reload : DB 13
            MSG_PlList_Empty
           DB 0
.Txt2       DB "12345678 $",13
            MSG_PlList_Move  : DB 13
            MSG_PlList_Delete
           DB 0

.Sel        DB 1,3,7,128+2,%11
           DB #FF


; wide_of_UpDownCursor

WPlistMove   DB 0,0,9,6,7,7*8,%1111,0
             DW .txt
             DW .sel
             DW .hk   ;   горячие клавиши (hotkeys)
             DW #FFFF

.txt         DB "12345678 $",13
             MSG_PlList_Up  : DB 13
             MSG_PlList_Down
            DB 0

.sel         DB 1,3,7,128+2,%11
            DB #FF


.hk          DB CS,"7"
             DW 0
             DB CS,"5"
             DW 0
             DB CS,"6"
             DW 1
             DB CS,"8"
             DW 1
             DB 13,0
             DW 2
            DB #FF



Sort_Plug   DB #01,"add",#FF

FnLst_        DB "bgepgns lst"

Num_Plugs    EQU PList.Num_Plugs
Num_Wplugs   EQU PList.Num_Wplugs

; PLsprWin     DB 0,0,#7E,#7E,#42,#42,#7E,0    ; спрайт обозначения окошка
; PLsprMn      DB 0,0,0,0,0,0,0,%00101010      ; спрайт нормального плагина

;--------------------------------------------------------



            DB 0   ; ограничивающий 0
Pgns_List_    DS 256      ; 252 used (9 bytes for 1 plugin)  Общий список плагинов BGE 28 maximum
            DB 0














LPList   EQU $-PList

        DISPLAY "PList len :",/a, LPList

; -------------------------------------------------------


            ASSERT  $ < #C000