
; EPgns   LD A,%1111
EPgns
      ;  call epgns_.calc
        ; ld ix,WPgns
        ; call POPUP
      ;  ld a,%1111
epgns   LD IX,WPgns
      ;   ld c,a
      ;   ld a,(WSPgns+3)
      ;   cp 4
;.a1  EQU $-1
    ;    jr z,1F
    ;     call CLOSE
         call epgns_.calc
       ;  ld c,%1111
1        ld (ix+6),%1111 ;c
;        LD (IX+6),A
;        CALL otstoj
        CALL Win_
         call CLOSE_
        CP #FF
      ;  JP Z,main_
       ret z
      ;  LD BC,TBpgns
      ;  JP TAB_JP

 ;TBpgns  DW        0
;        DW          2
;        DW ExePgns256
;        DW          1
;        DW DrvPgn
          or a         ; вначале проверяем опции /DA
         jp z, DLdPgns
          dec a
         jp z,SetPgn
          dec a
         jp z,TekPgn
          dec a
         jp exe256.run   ; иначе запускаем выбранный плагин /DA


epgns__ CALL CLOSE
epgns_  LD A,%1101
        JR epgns
.calc   ld a,(WSPgns+3)
     ;   ld (epgns.a1),a
        ld (SPgns.ym_),a
        dec a
        dec a
        ld (TPgns.ym_),a
        add a,6
        ld (WPgns+3),a
       ret

;otstoj  XOR A
;        LD (WSPgns),A
;        INC A
;        INC A
;        LD (WSPgns+1),A
;        RET

WPgns   DEFB 2,2,9,20,6*8,7,%00001111
        DEFB 0
        DEFW TPgns        ; объект-текст
        DEFW SPgns        ; объект-подсветка (выборка)
        DEFW #FFFF
TPgns
;    if rus          ; v.3.12 изменил меню /DA
;        DB #8c,#ae,#a4,#e3,#ab,#a8,13;"Модули",13
;        DB #8e,#e2,#aa,#e0,#eb,#e2,#ec,#5f,13;"Открыть_",13
;        DB #92,#a5,#aa,#e3,#e9,#a8,#a9,13;"Текущий",13
;        DB #82,#eb,#af,#ae,#ab,#ad,#a8,#e2,#ec,#20,#a8,#a7,#5f,13;"Выполнить из_",13
;        DB #91,#af,#a8,#e1,#ae,#aa,#5f,13;"Список_",13
;        DB #84,#a8,#e1,#aa,#ae,#a2,#ae,#a4,0;"Дисковод",0
;    else
;        DB "Plug-in",13
;        DB "Load_",13
;        DB "Current",13
;        DB "Run from_",13
;        DB "List_",13
;        DB "Drive",0
;    endif

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




;SPgns   ; DEFB 1,3,9,1,%11
        ; DEFB 1,4,9,1,%11
        ; DEFB 1,5,9,1,%11
        ; DEFB 1,6,9,1,%11
        ; DEFB 1,7,9,1,%11
;        DB 1,3,9,128+5,%11
;        DEFB #FF

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

SSPgns DB #FF,3,7,128+1,%11   ; DB #FF,3,7,1,%11  ; Используем новые возможности /DA
       ;  DB 1,4,7,1,%11
       ;  DB 1,5,7,1,%11
       ;  DB 1,6,7,1,%11
       ;  DB 1,7,7,1,%11
       ;  DB 1,8,7,1,%11
       ;  DB 1,9,7,1,%11
       ;  DB 1,10,7,1,%11
       ;  DB 1,11,7,1,%11
       ;  DB 1,12,7,1,%11
       ;  DB 1,13,7,1,%11
       ;  DB 1,14,7,1,%11
       DB #FF


;TBpgns  DW DLdPgns
;        DW TekPgn
;        DW ExePgns256
;        DW SetPgn
;        DW DrvPgn

;DrvPgn  CALL Driver
;        JP epgns_

TekPgn  CALL tekpgn
        JP epgns_

tekpgn  LD A,(FLAGOBJ)
        AND A
        RET Z
exepgn2 CALL CLOSE_ALLW
        LD HL,sv_pgn2
        LD SP,(SPP)
        JP PgnAdr

; открыть модуль и запустить
DLdPgns CALL LPgn
        JP epgns_

LPgn    LD HL,SORTpgn
        CALL FilerE
        RET C
     ;   LD A,(SelSp)
.ld     CALL ldpgn2
        RET C
       jr exepgn2  ; JP exepgn2

; выполнить 256к модуль
;ExePgns256
;        CALL exe256
;        JP epgns_

exe256 ; CALL CallSPgns
       ; CALL CLOSE_
;        CP #FF
;        RET Z
.run    EX AF,AF'
        LD A,(ExtPgns)        ; (ExtMem)
        AND A
        JR Z,P15_2
        EX AF,AF'
       ; CALL GdePgn        ; выделил в подпрограмму /DA
       ; LD A,(PagePgn)
       ; CALL ONPAGE
       ; LD HL,(AdrPgn)
       ; LD DE,PgnAdr
       ; LD BC,LEN_PGN
       ; LDIR
         call l256_pgn
        XOR A
        PUSH AF
        CALL ONPAGE
        POP AF
exepgn  CALL CLOSE_ALLW
        LD HL,sv_pgn
        LD SP,(SPP)
        JP PgnAdr

l256_pgn  call GdePgn     ; выделил в подпрограмму /DA
          ld a,(PagePgn)
          call ONPAGE
          ld hl,(AdrPgn)
          ld de,PgnAdr
          ld bc,LEN_PGN
          ldir
         ret


P15_2   EX AF,AF'  ; загрузка модуля с диска из списка
         call SetSYSTEMDISK
        CALL PUT_FN2
        LD HL,PgnAdr
        LD DE,(BYTES_LEN)
        LD A,(SEC_LEN)
        LD B,A
        LD C,#0E
        CALL DOS_FUNC_
         call RetCURRENTDISK
        RET C
        XOR A
        CALL RAM
        JR exepgn

SORTpgn DB #01,"ovb","add",#FF

; вызвать список загруженных модулей
CallSPgns  ld a,(AllPgns)
           or a
           ld a,#FF
          ret z
        LD IX,WSPgns
       ; CALL Win_
       ; RET
        call POPUP
        call Win_
       jp CLOSE_

; составление списка модулей
SetPgn  LD A,%1111
setpgn  LD IX,WSet
        LD (IX+6),A
        bit 1,a
        call nz,POPUP
        CALL Win_
        CP #FF
        JP Z,epgns__
        LD BC,TBSet
        call TAB_JP   ; JP TAB_JP ; так удобнее /DA
setpgn_ LD A,%1101
        JR setpgn

TBSet   DW AddPgns
        DW InsPgns
        DW Del_Pgn
        DW DelPgns
        DW SvLst
        DW LdLst

WSet    DEFB 5,3,8,10,7*8,7,%00001111,%0
        DEFW TSet               ; объект-текст
        DEFW SSet               ; объект-подсветка (выборка)
        DEFW #FFFF
TSet
;    if rus
;        DB #91,#af,#a8,#e1,#ae,#aa,13;"Список",13
;        DB #84,#ae,#a1,#a0,#a2,#a8,#e2,#ec,13;"Добавить",13
;        DB #87,#a0,#ac,#a5,#ad,#a8,#e2,#ec,13;"Заменить",13
;        DB #93,#a4,#a0,#ab,#a8,#e2,#ec,13;"Удалить",13
;        DB #91,#ae,#e5,#e0,#a0,#ad,#a8,#e2,#ec,13;"Сохранить",13
;        DB #8e,#e2,#aa,#e0,#eb,#e2,#ec,0;"Открыть",0
;    else
;        DB "List",13
;        DB "Add",13
;        DB "Change",13
;        DB "Delete",13
;        DB "Save",13
;        DB "Load",0
;    endif
            MSG_Plug_list : DB 13
            MSG_Plug_add  : DB 13
            DB #0A : DW WSPgns.ex
            DB 13, #0A : DW WSPgns.del
            DB 13
            MSG_Plug_empty : DB 13
            MSG_DISK_Save  : DB 13
            MSG_DISK_Load  : DB 0


SSet    ; DEFB 1,3,6,1,%11
        ; DEFB 1,4,6,1,%11
        ; DEFB 1,5,6,1,%11
        ; DEFB 1,6,6,1,%11
        ; DEFB 1,7,6,1,%11
        DB 1,3,6,128+6,%11
        DEFB #FF
;-----------------------
; добавить в список плагин
AddPgns  ld a,(AllPgns)   ;LD HL,SORTpgn
         cp 10   ; 12
        ret nc
        ld hl, SORTpgn
        CALL FilerE
       ret c           ; JP C,setpgn_
        CALL addpgn_
       ret             ; JP setpgn_

addpgn_ LD HL,Ret
        JR addpgnm
addpgn  LD HL,PUT_FN
addpgnm LD (p15_1+1),HL
        XOR A
        LD (FLAGOBJ),A
        LD A,(AllPgns)
        CP 10 ; 12
        ;JP Z,scf
        ccf
       ret c
        LD (NumPgn),A
        CALL LoadPgn
        RET C
        LD A,(NumPgn)
        INC A
        LD (AllPgns),A
        LD HL,FILE_NAME
        LD DE,(EndPgnT)
        LD BC,8
        LDIR
        ld a,13
        ld (de),a
        INC DE
        LD (EndPgnT),DE
        XOR A
        LD (DE),A
         call pszzz
      ;   xor a
      ;  LD HL,(EndPgnS)
      ;  INC A
      ;  LD (HL),A
      ;  LD DE,5
      ;  ADD HL,DE
      ;  LD (HL),#FF
      ;  LD (EndPgnS),HL
           ld a,(SSPgns+3)  ; количество опций+128        /DA
           inc a            ; т.к. число опций не больше 14 то можно и так
           ld (SSPgns+3),a
           ld a,1
           ld (SSPgns),a    ; разблокируем вывод опций
     ;   LD A,(AllPgns)
     ;   CP 1
     ;   JR Z,pspa
        LD HL,WSPgns+3
        INC (HL)
pspa    XOR A
        RET

pszzz    ld hl,TSPgns
         ld a,(NumPgn)
         call pss109
         ex de,hl
         ld hl,FILE_NAME+8
         ld c,3
         ldir
         ret

; A   - номер плагина для загрузки
; SCF - загружен с ошибкой
LoadPgn EX AF,AF'
        LD A,(ExtPgns)      ; (ExtMem)
        AND A
        JR Z,P15_1
        EX AF,AF'
        CALL GdePgn
        CALL ldpgn
        RET C
       ; LD A,(PagePgn)     ; выделил в подпрограмму /DA
       ; CALL ONPAGE
       ; LD HL,PgnAdr
       ; LD DE,(AdrPgn)
       ; LD BC,LEN_PGN
       ; LDIR
         call s256_pgn.s
        XOR A
        PUSH AF
        CALL ONPAGE
        POP AF
        RET

s256_pgn  call GdePgn     ; выделил в подпрограмму /DA
.s        ld a,(PagePgn)
          call ONPAGE
          ld hl,PgnAdr
          ld de,(AdrPgn)
          ld bc,LEN_PGN
          ldir
         ret

P15_1   EX AF,AF'
p15_1   CALL PUT_FN
        LD C,#0A
        JP DOS_FUNC_

ldpgn2 ; LD HL,PgnAdr
       ; LD DE,(BYTES_LEN)
       ; LD A,(SEC_LEN)
       ; LD B,A
       ; LD C,#0E
       ; JP DOS_FUNC_
        ld c,#0E
       jr 1F

ldpgn  ; LD HL,PgnAdr
       ; LD DE,(BYTES_LEN)
       ; LD A,(SEC_LEN)
       ; LD B,A
       ; LD C,#AE
       ; JP DOS_FUNC_
        ld c,#AE
1       ld de,(BYTES_LEN)
        ld a,(SEC_LEN)
        ld b,a
.hl     ld hl,PgnAdr
       jp DOS_FUNC_


setpgN_ POP AF
       ret            ; JP setpgn_

InsPgns      ld hl,WSPgns.ex
             ld (tTSPgns.title),hl
         CALL CallSPgns
       ; CALL CLOSE_
        CP #FF
       ret z              ; JP Z,setpgn_
        PUSH AF
        LD HL,SORTpgn
        CALL FilerE
       jr c,setpgN_       ; JP C,setpgN_
        XOR A
        LD (FLAGOBJ),A
        POP AF
        LD (NumPgn),A
        CALL LoadPgn
       ret c              ; JP C,setpgn_
        LD A,(NumPgn)
        LD HL,TSPgns
        LD B,A
        AND A
        JR Z,psz1
        LD DE,9
        ADD HL,DE
        DJNZ $-1
psz1    EX DE,HL
        LD HL,FILE_NAME
        LD BC,8
        LDIR
        call pszzz
       ret               ; JP setpgn_



Del_Pgn    ld hl,WSPgns.del      ; удаление плагина из списка /DA
           ld (tTSPgns.title),hl
        call CallSPgns
        cp #FF
       ret z
        ld c,a
        ld (.mPnum),a
        ld a,(AllPgns)
        ld b,a
        or a
       ret z
        dec a
        ld (AllPgns),a
       jr z,delpgn      ; если не осталось списка
         or 128
         ld (SSPgns+3),a ; т.к. 0-я обработана в (AllPgns) то останется как минимум 1
        xor a
        ld (FLAGOBJ),a
        ld a,(ExtPgns)      ; (ExtMem)
        or a
       jr z, .mlist     ; удаление имени из списка
.l0      ld a,c                       ; удаление плагина из доп. памяти
         inc a
         cp b
        jr nc,.mlist
         push bc          ; чтение следующего плагина
         call l256_pgn
         pop bc
         ld a,c
         push bc          ; запись в текущую позицию
         call s256_pgn
         xor a
         call ONPAGE
         pop bc
         inc c
        jr .l0

.mlist    ld a,0
.mPnum  EQU $-1
          ld c,a
          add a,a
          ld b,a
         push bc
          add a,a
          add a,a
          add a,c ; *9
          ld c,a
          ld a,9
          add a,c
          ld b,a
          ld a,9*10+1     ;9*12+1
          sub b
          ld b,0
          ld hl,TSPgns
          add hl,bc
          ld c,9
          ld d,h
          ld e,l
          add hl,bc
          ld c,a
          ldir
         pop bc
          ld a,b
          add a,c
          ld l,a
          ld h,0
          ld bc,TSPgns.exts
          add hl,bc
          ld d,h
          ld e,l
          inc de
          inc de
          inc de
          push hl
          ld hl,ETSPgns
          xor a
          sbc hl,de
          ld b,h
          ld c,l
          pop hl
          ex de,hl
          ldir
          ld hl,WSPgns+3
          dec (hl)
          ld hl,(EndPgnT)
          ld bc,9
          or a
          sbc hl,bc
          ld (EndPgnT),hl
         ret



DelPgns CALL ASK         ; очистка списка
       ret c             ; JP C,setpgn_
        CALL delpgn
       ret               ; JP setpgn_

delpgn  XOR A
        LD (FLAGOBJ),A
        LD (AllPgns),A
        LD HL,TSPgns
        LD (HL),A
        LD (EndPgnT),HL
        DEC A
     ;   LD HL,SSPgns
     ;   LD (HL),A
     ;   LD (EndPgnS),HL
          ld (SSPgns),a    ; /DA
          ld a,128
          ld (SSPgns+3),a  ; 0-е количество опций+128
        LD A,4  ;3
        LD (WSPgns+3),A
        RET

; A  <- номер плагина в таблице   ; 0-9 - plugins
;GdePgn  LD B,A
;        SRL A
;        ADD A,PgnPgNUM     ; 6
;        LD (PagePgn),A
;        LD A,B
;        AND 1
;        LD HL,A_PGN1
;        JR Z,chetpg
;        LD HL,A_PGN2
;chetpg  LD (AdrPgn),HL
;        RET

GdePgn       ld hl,#C000
             or a
             rra
            jr nc,1F
             ld h,#DB
1           ; add a,PgnPgNUM
             ld b,a
             ld a,(OVRLpages)
             add a,6
             add a,b
             ld (PagePgn),a
chetpg       ld (AdrPgn),hl
            ret


; Сюда идем при выходе из плагина
sv_pgn2 PUSH AF
        LD A,0
      ;  LD (FLAGOBJ),A
        JR C,noal
        INC A
noal    LD (FLAGOBJ),A
        JP nosvpgn

sv_pgn  PUSH AF
        LD A,0
        LD (FLAGOBJ),A
        JR C,nosvpgn
        INC A
        LD (FLAGOBJ),A
        LD A,(ExtPgns)      ; (ExtMem)
        AND A
        JR Z,nosvpgn
        LD A,(PagePgn)
        CALL ONPAGE
        LD HL,PgnAdr
        LD DE,(AdrPgn)
        LD BC,LEN_PGN
        LDIR
        XOR A
        CALL ONPAGE
nosvpgn POP AF
        AND A
        JP Z,Main
        JP main_

PagePgn DB 0
AdrPgn  DW 0
EndPgnT DW TSPgns  ; для добавления
; EndPgnS DW SSPgns  ; для добавления   ; в v3.12 более не требуется /DA
AllPgns DB 0       ; всего плагинов в памяти
NumPgn  DB 0       ; номер выполняемого плагина

;Fldadd  LD HL,FnAdd
;.nm     CALL FromName
;        LD HL,#A500
;        LD C,#AE
;        CALL DOS_FUNC_
;        RET C
;        JP exepgn2

FnAdd   DB "add0    add"     ; "add     add"


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



;- начальная загрузка модуль-листа
Fldlst  CALL delpgn
        LD HL,FnLst
        CALL FromName
;        LD HL,ECODE    ; /DA
        ld hl, FBUFF
       ; LD DE,109
        ld de,ETSPgns-TSPgns
        LD BC,#01AE
        CALL DOS_FUNC_
        RET C
        LD IX,Woutpgn
        JP ldlst_

LdLst   CALL ldlst
       ret c            ; JP C,setpgn_
       ; CALL CLOSE
       ; JP setpgn_
       jp CLOSE

ldlst   CALL delpgn
        LD HL,FnLst
        CALL FromName
;        LD HL,ECODE    ; /DA
        ld hl, FBUFF
       ; LD DE,109
        ld de,ETSPgns-TSPgns
        LD BC,#010E
        CALL DOS_FUNC_
        RET C
        LD IX,Woutpgn
        CALL GETBLK
ldlst_  CALL outpgn
        XOR A
makar1  PUSH AF
        CALL PUT_FN
        CALL addpgn
        JR C,kal2
        CALL outpgn
        POP AF
        INC A
        JR makar1

kal2    POP AF
        XOR A
        RET

PUT_FN2 LD B,A
        LD HL,TSPgns
        JR put_fn
PUT_FN  LD B,A
;        LD HL,ECODE    ; /DA
        ld hl, FBUFF
        call guiRAM
;put_fn  AND A
put_fn  ld (pss1.hl),hl
         and a
        JR Z,pss1
        LD DE,9
        ADD HL,DE
        DJNZ $-1
pss1    LD DE,23773
        LD BC,8
        LDIR
    ;    LD A,"a"
    ;    LD (DE),A
    ;    INC DE
    ;    LD A,"d"
    ;    LD (DE),A
    ;    INC DE
    ;    LD (DE),A
        ld hl,0
.hl    EQU $-2
.c1     call pss109
        ld c,3
        ldir
;        call GUI_E     ; /DA
        RET

pss109   ld c,a
         add a,a
         add a,c
         ld c,a
         add hl,bc
         ld c,109
         add hl,bc  ; hl -ext
         ret

SeachPgn               ;de адрес имени 11 байт - a найденный номер в списке /DA
         ld hl,TSPgns
         ld c,0
1        ld a, (hl)
         or a
        jr z,.not
         push de
         push hl
         ld b,8
2        ld a,(de)
         cp (hl)
        jr z,4F
3        inc c
         ld de,9
         pop hl
         add hl,de
         pop de
        jr 1B
4        inc hl
         inc de
        djnz 2B
         pop hl
         ld hl,TSPgns
         ld a,c
         push bc
         call pss109
         pop bc
         ld b,3
5        ld a,(de)
         cp (hl)
        jr nz,3B
         inc hl
         inc de
        djnz 5B
         pop de
         xor a
         ld a,c
         ret
.not     scf
         ret


SvLst   XOR A
        LD (FLAGOBJ),A
        LD HL,FnLst
        CALL FromName
        LD HL,TSPgns
        LD DE,ETSPgns-TSPgns
        LD BC,#010B
        CALL DOS_FUNC_
       ret                   ; JP setpgn_

FnLst   DB "bgepgns lst"

outpgn  LD HL,23773   ; FILE_NAME #5CDD
        LD DE,toutpgn
        LD BC,8
        LDIR
outpgn_ LD IX,Woutpgn
        SET 1,(IX+6)
        CALL Window_
        RET

Woutpgn  DB 25,21,7,3,7,7,%0000,0           ; DEFB 0,2,7,3,6*8,7,%0,%0
         DEFW toutpgn
         DEFW #FFFF
toutpgn  DB "        ",0         ; "sunrise_",0

WSPgns  DEFB 2,4,9,3,6*8,7,%00001111,0
        DEFW tTSPgns  ;TSPgns       ; объект-текст
        DEFW SSPgns       ; объект-подсветка (выборка)
        DEFW #FFFF
.ex       MSG_Plug_ex  : DB #FF
.del      MSG_Plug_del : DB #FF

tTSPgns DB  #0A :
.title    DW   WSPgns.ex : DB 13
TSPgns  DB 0,"       ",13
        DB "        ",13
        DB "        ",13
        DB "        ",13
        DB "        ",13
        DB "        ",13
        DB "        ",13
        DB "        ",13
        DB "        ",13
        DB "        ",13
        DB 0               ; уменьшил список до 10 элементов /DA
       ; DB "        ",13
       ; DB "        ",13
       ; DB 0
.exts   DS 3*10   ;*12  ; буфер расширений
        DB 0

list_pages  EQU 5   ; количество страниц занимаемых плагинами

ETSPgns

;SSPgns   DEFB #FF,1,5,1,%11
;         DEFB 1,2,5,1,%11
;         DEFB 1,3,5,1,%11
;         DEFB 1,4,5,1,%11
;         DEFB 1,5,5,1,%11
;         DEFB 1,6,5,1,%11
;         DEFB 1,7,5,1,%11
;         DEFB 1,8,5,1,%11
;         DEFB 1,9,5,1,%11
;         DEFB 1,10,5,1,%11
;         DEFB 1,11,5,1,%11
;         DEFB 1,12,5,1,%11
;        DEFB #FF

cutix   DB 0,0,2,2
cutix2  DB 0,6,2,2
; FnGfx   DB "bgegfx  scr"

FLAGOBJ    DB 1  ; флаг наличия открытого рабочего модуля ; 0 - WAS LOADED
