
TekPgn      xor a
            ld (flag_type_pgn),a
TekPgn_
            ld a,0
FLAGOBJ   EQU $-1     ; флаг наличия открытого рабочего модуля
            or a
           ret z
            dec a
            cp 0
flag_type_pgn EQU $-1      ; тип плагина
           ret nz
            call forexitPGN
ExecPgn_    push af
            call CLOSE_ALLW
            pop af
            pop hl
            push hl
           jp PgnAdr
ExitPgn_    ld c,a   ; Сюда идем при выходе из плагина
            ld a,0
            ccf
            adc a,a
            ld (FLAGOBJ),a
            or a
           jr z,1F
            ld a,c
            or a
           jp nz,main_
1          jp Main


ExitWinPgn_      ld a,2
                jr nc,1F
                 xor a
1                ld (FLAGOBJ),a
                 ld a,4     ; win
                 call SWPGN1
                 ld sp,#0000
.sp EQU $-2
                jp SuxRam

forexitPGN  push af
            ld a,(flag_type_pgn)
            ld c,a
            or a
           jr z,1F
            call retSWpgn
            pop af
            ld hl,ExitWinPgn_
            ex (sp),hl
           jp (hl)
1           pop af
            pop hl
            ld de,ExitPgn_
            ld sp,(SPP)
            push de
           jp (hl)

WinPgns
            ld hl,(WPgns)
            ld (epgns.mpgnxy_),hl
            ld hl,23
.winpgxy_  equ $-2
            ld (WPgns),hl
            ld c,5*8
            ld a,1
           jr 1F
EPgns
epgns       ld c,6*8
            xor a  ; for standart plugins
1           ld (flag_type_pgn),a
            ex af,af'
            ld a,c
            ld (WPgns+4),a
            ex af,af'
            call FormListPgns


            ld ix,WPgns
            ld (ix+6),%1111
            call Win_

            push af
            call CLOSE
            ld a,(flag_type_pgn)
            or a
           jr z,1F
            ld hl,(WPgns)
            ld (WinPgns.winpgxy_),hl
            ld hl,#0000
.mpgnxy_ equ $-2
            ld (WPgns),hl
1           pop af

            inc a
           ret z

            call forexitPGN

            dec a         ; вначале проверяем опции
           jr z,.LoadPgn
            dec a
           jp z,TekPgn_
            dec a
            call ldpgn.ld_sysPGN  ; иначе запускаем выбранный плагин
           jr nc,.jpExecPgn_
            xor a
            ld (FLAGOBJ),a
           ret

.LoadPgn

.LPgn         ld hl,SORTpgn
              call FilerE
             ret c
.ld           call ldpgn2
             ret c
.jpExecPgn_  jp ExecPgn_


ldpgn2
        ld c,#BE
       jr 1F
ldpgn
        ld c,#CE
1       ld de,(BYTES_LEN)
        ld a,(SEC_LEN)
        ld b,a
.hl     ld hl,PgnAdr
       jp DOS_FUNC_


.ld_sysPGN
             call CallSYSTEMDISK
             call PgnIDfind
            ret c
             ld b,a
             dec c
             ld c,#DE
            jr nz,ldpgn.hl
             call GdePgn
             ld a,c
             call ONPAGE
             ld de,PgnAdr
             ld bc,LEN_PGN
             ldir
             xor a
             call EX_RAM
             xor a
            ret


SORTpgn    DB #01,"add",#FF
SORTpgnTP_  EQU $-2    ; тип плагина 'd' или 'w' в расширении

WPgns      DB 2,2,9,20,6*8,7,%00001111
           DB 0
           DW .TPgns        ; объект-текст
           DW .SPgns        ; объект-подсветка (выборка)
           DW #FFFF
.TPgns

          MSG_Plug_title : DB 13,22,1,2,13,15,13
.ym_    EQU $-4    ; позиция для меню управления
          MSG_DISK_Load_ : DB 13
          MSG_Plug_curr : DB 13,22,1,3
          DB #0A
.TxPgnsAdr  DW TxPgns  ; вывод списка модулей
          DB 0




.SPgns    DB 1,16,7,128+2,%11
.ym1_    EQU .SPgns+1   ; позиция для меню управления

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

       DB #FF






FormListPgns      ; формирование видимого списка из общего
                  ; IN (вход): A=0 - standarts plugins ; A/=0 - window plugins

                  or a
                  ld a,"d"
                 jr z,1F
                  ld a,"w"
1                 ld (SORTpgnTP_),a
                  call 2F
                  exx
                  ld a,b
                  ld (WPgns.ym_),a
                  inc a : inc a
                  ld (WPgns.ym1_),a
                  add a,3
                  ld (WPgns+3),a
                  ld b,a
                  cp 8
                  ld a,#FF
                 jr c,1F
                  ld a,1
1                 ld (WPgns.SSPgns),a
                  ld a,b
                  sub 7
                  or 128
                  ld (WPgns.SSPgns+3),a
                  exx
                 ret

2                 ld hl,PgnsList_
                  ld de,TxPgns
                  exx
                  ld bc,#0200      ; B - позиция черты , C - счетчик файла в основном списке (с 1)
                  exx
1                 xor a
                  ld (de),a
                  ld a,(hl)
                  or a
                 ret z
                  exx
                  inc c
                  exx
                  ld bc,8
                  push de
                  ldir
                  ld a,(SORTpgnTP_)
                  cp (hl)
                  inc hl
                 jr z,2F
                  pop de
                 jr 1B
2                 pop af   ; сбрасываем возврат DE
                  exx
                  inc b
                  exx
                  ld a," "
                  ld c,a
                  ld (de),a : inc de
                  ld (de),a : inc de
PgnsInRAM   EQU $+1 : ld a,0       ; количество плагинов загруженных в память
                  or a
                 jr z,3F
                  exx
                  cp c
                  exx
                 jr c,3F
                  ld c,"+"        ; модуль загружен в память
3                 ld a,c
                  ld (de),a : inc de
                  ld a,13
                  ld (de),a : inc de
                 jr 1B



PgnIDfind      ;  Определяет по номеру в видимом списке - номер в полном списке, выводит имя с расширением в #5CDD
               ; IN : A - number in select list

               ; OUT : flag c - error
               ;       A - number in all plugins list
               ;       C = 0 - not in RAM , C = 1 - plugin present in RAM


                 ld hl,PgnsList_
                 ld b,a
                 ld de,#0008
                 ld c,d
                 inc b

1                ld a,(hl)
                 or a
                 scf
                ret z     ; set scf for error and return
                 inc c
                 add hl,de
                 ld a,(SORTpgnTP_)
                 cp (hl)
                 inc hl
                jr nz,1B
                djnz 1B
                 xor a
                 inc e     ; de=9
                 sbc hl,de

                 ld a,(PgnsInRAM)
                 or a
                jr z,2F
                 cp c
                jr c,2F
                 inc b      ; 1 for present in RAM
2                dec c
                 push bc
                 ld de,FILE_NAME
                 ld bc,8
                 ldir
                 ld hl,SORTpgn+1    ; расширение
                 ld c,3
                 ldir
                 pop bc
                 ld a,c
                 ld c,b
                 or a       ; reset flag c
                ret


; A  <- номер плагина в таблице   ; out scf - если плагин не загружен в память, но параметры всё равно выдаёт hl -addr, c-page

GdePgn       ld hl,#C000
             ld c,a
             or a
             rra
            jr nc,1F
             ld h,#DB
1            ld b,a
             ld a,(OVRLpages)
             add a,6
             add a,b
             ld c,a        ; ld (PagePgn),a
                           ; ld (AdrPgn),hl
             ld a,(ExtPgns)
             or a
             ccf
            ret c
             dec a
             cp c
            ret



FnAdd   DB "add0    add"     ; "add     add"


Fldadd       ld hl,FnAdd
             call FromName
             ld c,#DE
             call ldpgn.hl
            jr c,.next
             call CLOSE_ALLW
             ld sp,(SPP)
             ld hl,.next
             call PgnAdr
.next        ld hl,FnAdd+3   ; "0" - "9"
             inc (hl)
             ld a,(hl)
             cp "9"+1
            jr nz,Fldadd
            jp RUN.b



PgnsLstLoad   ; загрузка списка /не учитывается системный диск
              call delpgns
              ld hl,FnLst
              call FromName
              ld a,SEARCHFILE11
              call GUI
             ret c
              ld a,(SEC_LEN)
              dec a
              scf
             ret nz
              ld hl,PgnsList_
              ld de,(START_SEC)
              ld bc,#0105
              call DOS_FUNC_
             ret

Reldlst        call CallSYSTEMDISK
               ld hl,Fldlst.ldtoram_
              jr 1F
Fldlst         ld hl,.ldlist__
1              ld (.call__),hl
               ld ix,Woutpgn
               call GETBLK
               xor a
               ld (PgnsInRAM),a
               ld (ExtPgns),a
.call__ EQU $+1 : call .ldlist__
              jp CLOSE

.ldlist__      call PgnsLstLoad
              jr nc,.ldtoram_
.empty         ld hl,PgnsList_  ; empty
               ld b,253
1              ld (hl),0
               inc hl
              djnz 1B
              ret
.ldtoram_     ; загрузка списка в память
              ld a,(ExtMem)
              or a
             ret z
              ld hl,PgnsList_
              ld a,(OVRLpages)
              add a,6
              ld (.pgPGN_),a
              ld c,255   ; номер плагина

1
              push bc
              call CheckPgnFile
              pop bc
             ret c
              inc c
              bit 0,c
              push hl,de
              ld de,#DB00
             jr nz,3F
              push bc
              call .selRAM
              pop bc
             jr nc,2F
              pop de,hl
             ret
2             ld d,#C0
3             push de,bc
              call outpgn
              call ldpgn2
              pop bc,de
             jr nc,4F
              pop de,hl
              call CheckPgnFile.del
             jr 1B

4             ld a,c
              inc a
              ld (PgnsInRAM),a
              ld a,(.pgPGN_)
              ld b,a
              ld a,c
              or a
              rra
              add a,b
              call ONPAGE
              push bc
              ld hl,PgnAdr
              ld bc,6912
              ldir
              pop bc
              ld a,GUIPage
              call EX_RAM
              pop hl,de
             jr 1B

.selRAM
              ld a,(ExtPgns)
              ld b,a
              inc a
              ld (ExtPgns),a
              ld a,(RPAGE)
              ld c,a
              or a
             jr z,2F
              push bc
              call TESTRD_
              pop bc
             ret nc
              ld a,c
              ld (RPAGE),a
1             ld a,b
              ld (ExtPgns),a
              scf
             ret
2             ld a,(ExtPage)
              sub 0
.pgPGN_ EQU $-1
             jr c,1B
             jr z,1B
             ret




CheckPgnFile         ; in: hl ; переносим имя текущего плагина из hl в систему и проверяем наличие и размер файла
                     ; out: hl сохраняется , de=hl+9 , удаляем из списка если ошибка и проверяем следующий
                     ; если закончились, то cf
              ld a,(hl)
              or a
              ccf
             ret z
              push hl
              ld de,#5CDD
              ld bc,8
              ldir
              ld a,"a"
              ld (de),a
              inc e
              ld a,"d"
              ld (de),a
              inc e
              ld a,(hl)
              inc hl
              ld (de),a
              push hl
              ld a,SEARCHFILE11
              call GUI
             jr c,1F
              ld a,(SEC_LEN)
              cp 28
              ccf
1             pop de
              pop hl
             ret nc
.del          push hl
1             ld b,9
              ld a,(de)
              or a
             jr nz,3F
2             ld (hl),a
              inc hl
             djnz 2B
              pop hl
             jr CheckPgnFile

3             ld a,(de)
              ld (hl),a
              inc de
              inc hl
             djnz 3B
             jr 1B


outpgn        push hl,de,bc
              call 1F
              pop bc,de,hl
             ret
1             ld hl,#5CDD
              ld de,Woutpgn.txt
              ld bc,8
              ldir
              ld a,(#5CDD+10)
              cp "d"
              ld a,7
             jr z,1F
              ld a,8+7
1             ld ix,Woutpgn
              set 1,(ix+6)
              ld (ix+4),a  ; цвет
             jp Window_

Woutpgn      DB 25,21,7,3,7,7,%0000,0
             DW .txt
             DW #FFFF
.txt         DB "        ",0

DelPgns   call ASK         ; очистка списка
         ret c
delpgns   xor a               ; очистка общего списка
          ld (FLAGOBJ),a
      ;    ld (AllPgns),a
          ld (PgnsInRAM),a
          ld (ExtPgns),a
          ld hl,PgnsList_
          ld (hl),a
          ld (EndPgnT),hl
          ld d,h
          ld e,l
          inc de
          ld bc,#0100
          ldir          ; очистка списка
         ret

;--------------------------------------------------------------------------------------------
cutix   DB 0,0,2,2
cutix2  DB 0,6,2,2
; AllPgns - сколько всего плагинов в списке
;PagePgn DB 0
;AdrPgn  DW 0
; NumPgn     ; номер выполняемого плагина
EndPgnT DW PgnsList_  ; для добавления

FnLst         DB "bgepgns lst"

TxPgns      DB 0,"          ",13     ; текущий список плагинов BGE - 14 строчек
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
             DB "           ",13
            DB 0



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

