; Windows module for BGE
; Модуль работы с окнами x8 и x1 в BGE

WinMenuPgn
                 DISP PgnAdr

; Внимание !!! / Attention !!!

; В модуле используется 13824 байта памяти из сегмента окон,
; поэтому аккуратно с размерами и количеством открытых окон
; (остаётся 2560 байт на свап окна)

;    /

; The module uses 13824 bytes of memory from the window segment,
; therefore, be careful with the size and number of open windows
; (there are 2560 bytes left on the window swap)
; ---------------------------------------------------------------

WinBoof      EQU #C000
WinABoof     EQU WinBoof+6144
WinMskBoof   EQU WinBoof+6912
WinAMskBoof  EQU WinMskBoof+6144
WinTMPboof   EQU #C000+6912+6912   ; буфер используется только при отсутствии окон WinMenu.copy_0




WinMenu          ld (.sp),sp
                 call SV_UNDO
    ;             call MiniLoupeS5
                 xor a
                 ld (.FtakeIN),a
                 ld (.FtakeIN2),a
                 ld ix,WWinmod
                 call POPUP
                 call .tomapL_

.n0              call .EraseAllw   ; ERASE_ALLW
                 call LOADSCR
                 call ResRmDirect
                 ld hl,WWinmod.HeadX8
                 ld de,WWinmod.X8toX1
                 ld bc,WWinmod.Nbrs
                 ld a,(OVR_proc)     ; определяет 0=x8 1=x1
                 or a         ; при a=0 , запрещение опции кисть
                jr z,1F
                 ld a,%11     ; разрешение опции кисть
                 ld hl,WWinmod.HeadX1
                 ld de,WWinmod.X1toX8
                 ld bc,WWinmod.Ybrs
1
                 ld (WWinmod.Sl_Brs),a
                 or a
                 ld a,#FF     ; запрещение флажка кисть
                jr z,1F
                 ld a,6       ; разрешение флажка кисть
1                ld (WWinmod.Fw_Brs),a
                 ld (WWinmod.THeadAdr),hl
                 ld (WWinmod.chX8X1adr),de
                 ld (WWinmod.TbrsAdr),bc


                 ld hl,WWinmod.Fw_x8
                 ld bc,TEKNALOZ.x8
                 ld a,(OVR_proc)
                 or a
                jr z,1F
                 ld hl,WWinmod.Fw_x1
                 inc bc               ; ld bc,TEKNALOZ.x1
1                ld a,(hl)
                 ld (WWinmod.Fw+3),a  ; повтор
                 inc hl
                 ld a,(hl)
                 ld (WWinmod.Fw+9),a  ; пиксели
                 inc hl
                 ld a,(hl)
                 ld (WWinmod.Fw+15),a ; атрибуты
                 inc hl
                 ld a,(hl)
                 ld (WWinmod.Fw+21),a ; превью
                 ld a,(bc)
                 ld (TEKNALOZ),a
                 push bc
                 call .ModSelect1_
                 pop bc
                 call FtakeINchek
                 ld a,%100
                jr nz,1F
                 call .wRamka
                 ld a,%111
1                ld (WWinmod.selMvDelF_),a

                 ld a,%1111
.n1              ld ix,WWinmod
                 ld (ix+6),a
                 ld sp,#0000
.sp     EQU $-2
                 ld a,(WinXU.csy)
                 cp 25
                 ld a,%111
                jr c,1F
                 ld a,%100
1                ld (WWinmod.selPlaceF_),a
                 ld a,(REALRGB)
                 ld (WWinmod.CurCol),a
                 call Win_
                 cp 11    ;  11 - mode / режим
                jr z,1F
                 call CLOSENK_
                 cp #FF
                jp z,ERASE_ALLW

1                push af           ; выставляем режим вывода окна
                 ld a,(TEKNALOZ)
                 call SetSPRITE.setOutput
                 pop af

                 ld bc,.Mtab
                 call TAB_JP

                jp .n0

.EraseAllw      ld hl,WinTMPboof   ; #C000+6912+6912
               jp ERASE_ALLW.hl


.EXColor        ld ix,WWinColEX      ; замена цвета 'menu', ссылается на  .EXColor_
                call POPUP
                call CLOSE_ALLW
.EXCol0_        ld a,%1110
.EXCol1_        ld ix,WWinColEX
                ld (ix+6),a
                call .EXCol_M
                call Win_
                cp #FF
               jp z,CLOSE_
                cp 8
               jp z,.EXColor_
                ld hl,WWinColEX.Col1
                ld de,WWinColEX.ColM1
                cp 9
               jr z,2F
                ld hl,WWinColEX.Col2
                ld de,WWinColEX.ColM2
                cp 11
               jr z,2F
1               ld a,%1100
               jr .EXCol1_

2               ld a,(REALRGB)
                push af
                ld a,(MASKRGB)
                push af

                ld a,(hl)
                ld (REALRGB),a
                ld a,(de)
                ld (MASKRGB),a
                push hl
                push de
                call PRGB2
                pop de
                pop hl
                ld a,(REALRGB)
                ld (hl),a
                ld a,(MASKRGB)
                ld (de),a

                pop af
                ld (MASKRGB),a
                pop af
                ld (REALRGB),a
              jr 1B

.EXCol_M       ld hl,WWinColEX.Fw+3
               ld a,(WWinColEX.ColM1)
               call .EXCol_M_
               ld a,(WWinColEX.ColM2)
.EXCol_M_      ld e,a
               ld bc,6
               ld d,#FF
               and 7
               ld a,d
              jr z,1F
               xor a
1              ld (hl),a
               add hl,bc
               ld a,e
               and #38
               ld a,d
              jr z,1F
               xor a
1              ld (hl),a
               add hl,bc
               ld a,e
               and #40
               ld a,d
              jr z,1F
               xor a
1              ld (hl),a
               add hl,bc
               ld a,e
               and #80
               ld a,d
              jr z,1F
               xor a
1              ld (hl),a
               add hl,bc
              ret



.MColorRGB      pop af     ; удаляем возврат - clean return addres
                call PRGB2

.MColor         ld ix,WWinColorM
                ld a,(REALRGB)
                ld (WWinColorM.CurCol),a
                call Win_
                call CLOSE_
                cp #FF
               ret z
                ld bc,.MColorTab
                call TAB_JP
                call suxRAM
               jp NormilizeWin ; WinClipping.eclose




.ModSelect      call .ModSel_000
1               ld a,%1001111  ; не сохранять окно в сваппинге
               jp WinMenu.n1



.ModSel_000     ld hl,WWinSelMod
                ld bc,TEKNALOZ
                push bc
                push hl
                ld a,3
                add a,(ix+0)
                ld (hl),a
                inc hl
                ld a,12
                add a,(ix+1)
                ld (hl),a
                pop ix
                ld (ix+6),%10001010
                call Win_
                pop hl      ; hl = TEKNALOZ
                cp #FF
               ret z
                ld (hl),a    ; hl = TEKNALOZ.***+0 for current
                inc hl       ; hl = TEKNALOZ.***+1 for x8
                ld c,a
                ld a,(OVR_proc)
                or a
               jr z,1F
                inc hl       ; hl = TEKNALOZ.***+2 for x1
1               ld a,c
                ld (hl),a
.ModSelect1_    push af
                ld bc,WWinSelMod.Txt+1
                call mGetModAdr_
                ld (WWinmod.TmodAdr),hl
                pop af
               ret

.Transf                        ; Изменить
              ;  call .outWinBoof

1               ld a,128+64+%1111
                ld ix,WWinModify
                ld (ix+6),a

                call FtakeINchek
                ld c,%100
               jr nz,2F
                ld c,%111
2               call FtakeINchek2
               jr z,3F
                ld c,%100
3               ld a,c
                ld (WWinModify.toScrFlg),a
                call Win_
                call CLOSENK_
                cp #FF
               jp z,WinMenu.n0
                push af
                cp 4        ; 4 - 8 - эффекты
                ccf
               jr nc,4F
                cp 5
               jr z,5F      ; 5 - обводка сама сохранит
                cp 9        ; 9 - сбросить
               jr z,5F
4               ld a,%100
                ld (WWinModify.flg_winpx),a   ; сбрасываем флаг сохранения, не сбрасывая флаг fc
                call c,svb_winpx       ; сохраняем пиксели окошка
5               call SuxRam
                pop af
                ld bc,.TransfTab
                call TAB_JP
               jr 1B

.outWinBoof     call .EraseAllw
                call CLS_ATR
                ; in: B - sx , C - sy , D - x , E - y , A - cnk
                ld bc,#2018
                ld de,#0000
                ld a,4
.cnknum_  EQU $-1
                call FA_cnk
.outWinBoofNS_  xor a
                call SetSPRITE.setOutput  ; set PUT mode
                call suxRAM
                ld hl,(WinXU.dx)
                ld d,h
                ld e,l
                ld a,(WinXU.csy)
                cp 24
               jr nc,1F
                ld a,8
                add a,d
                ld d,a
1               ld a,(WinXU.dsy)
                ld b,a
                ld a,(WinXU.csx)
                ld c,a
                cp 32
               jr nc,1F
                ld a,8
                add a,e
                ld e,a
1
.outputWn       xor a
                ex af,af'
                xor a
                ld ix,WinBoof
                exx
                ld hl,WinMskBoof
                exx
                push hl,de,bc
                call SetSPRITE
                pop bc,de,hl
                xor a
                ex af,af'
                xor a
                ld ix,WinABoof
               jp SetASPRITE_


.Scroll_        ld (.scrl_sp),sp
.scrl0          ld hl,.outWinBoofNS_
                ld de,.outWinBoof
                call FtakeINchekS
               jr z,1F
                ld a,1
1               ld ( WWinScroll.Colbox+5),a
                or a
               jr nz,1F
                ld a,(WWinScroll.Fw+27)   ; fl в экране
                or a
               jr z,1F
                ld hl,.to_screenNL_
                ld de,.to_screen_
1               ld a,(WWinScroll.Fw+21)   ; fl обновлять
                or a
               jr z,2F
                ld l,e
                ld h,d
2               ld (.scrl_hl_),hl
                ex de,hl
                call JP_HL
.scrl1          ld a,128+%1111
.scrl2          ld ix,WWinScroll
.scrl_sp EQU $+1 : ld sp,#0000
                ld (ix+6),a
                call Win_
                cp #FF
             ;  jp z,.outWinBoof
               ret z
                ld a,(But)
                cp 8
               jr nc,.scrl3
                call CLOSE_
                push af
                call suxRAM
                pop af
                ld hl,.scrl1
                push hl
.scrl_hl_ EQU $+1 : ld hl,.outWinBoofNS_
                push hl
               jp ScrollW
.scrl3
                ld a,128+%1101
               jr .scrl2



.EXcnknum_      ld hl,.Transf    ; замена возврата
                ex (sp),hl
                sub 13    ; number option for 'B'
.EXcnknum_0     ld hl,.dbEXcnknum1_
                or a
               jr z,1F
                ld hl,.dbEXcnknum_
1               ld a,(.cnknum_)
                call .EXcnknum1_
2               ld a,d
                ld (.cnknum_),a
               ret

.EXcnknum1_     ld b,6
1               ld d,(hl)
                inc hl
                cp d
               jr z,2F
               djnz 1B
2               ld d,(hl)
               ret

.dbEXcnknum_   DB 0,2,4,12,14,15
.dbEXcnknum1_  DB 0,15,14,12,4,2,0

.tomapL_      call LOADSCR
.tomap_       ; загрузка окна из экрана в буфер

              ld hl,#0000
              ld (WinXU.dx),hl

              ld hl,WinX8
              ld de,WinXU
              ld bc,WinXU.dx
              ld a,(OVR_proc)
              or a
             jr z,1F
              ld hl,(WinX1)      ; x1
              ld (WinXU.px),hl
              ld hl,WinX1
              call .tomap_pxy1  ; px ->
              call .tomap_pxy1  ; py ->
              inc bc
              inc bc
              call .tomap_spxy1 ; psx ->
              call .tomap_spxy1 ; psy ->
             jr  2F
1       ; x8
              ld bc,4
              ldir
              ld hl,(WinXU.csx)
              dec h
              dec l
              add hl,hl
              add hl,hl
              add hl,hl
              ld a,l
              or 7
              ld l,a
              ld a,h
              or 7
              ld h,a
              ld (WinXU.dsx),hl
              ld hl,(WinXU)   ; x,y
              add hl,hl
              add hl,hl
              add hl,hl
              ld (WinXU.px),hl
2        ; собственно теперь вытаскиваем окно в буфер

            call SuxRam
            push ix

            ld ix,WinXU
            ld de,WinBoof
            call SaveWS

            ld de,WinABoof
            call SaveWA
            pop ix

            call .toFullWinSize  ; очистка маски
            ld b,h
            ld c,l
            dec bc
            ld hl,WinMskBoof
            ld de,WinMskBoof+1
            ld (hl),0
            ldir

            push ix
            call wmbooframka
            call NormilizeWin
            call WinAmskSet
            pop ix
            or a    ; res flag c
.toLwin_    ld hl,BmBUFF
            ld de,LBmBUFF
            ld bc,34
            ldir
            ld hl,WinXU
            ld de,LWinXU
            ld c,10
            ldir

           jp guiRAM



.toFullWinSize   ld hl,(WinXU.csx)
                 ld a,l
               ;  ld l,0
                 call MULS      ; hl=a*h
                 ld (WinAttrSize_),hl
                 add hl,hl
                 add hl,hl
                 add hl,hl
                 ld (FullWinSize_),hl  ;  полный размер окна x8 (без атрибутов)
                ret

.tomap_pxy1   ld a,(hl)      ; px / py
              and 7
              ld (bc),a
              ld a,(hl)
              rrca : rrca : rrca
              and #1F
              ld (de),a
              inc de
              inc bc
              inc hl
             ret

.tomap_spxy1  ld a,(hl)     ; sx / sy
              ld (bc),a
              dec bc
              dec bc
              dec bc
              dec bc
              ld a,(bc)
              inc bc
              inc bc
              inc bc
              inc bc
              add a,(hl)
              rrca : rrca : rrca
              and #1F
              inc a
              ld (de),a
              inc de
              inc bc
              inc hl
             ret

.Mtab
              DW .define     ; 0 - Выбрать окно
              DW .allscreen  ; 1 - Весь экран
              DW .takeIN_    ; 2 - Взять из_
              DW .LcurrColor ; 3 - Текущий цвет
              DW .Ldelete    ; 4 - Удалить
              DW .Copy       ; 5 - Копировать
              DW .CopyTo     ; 6 - Копировать в_
              DW .Copy ;.Lplace     ; 7 - Поместить
              DW .Transf     ; 8 - Изменить_
              DW .x81swp     ; 9 - - x8 -> x1
              DW Ret         ; 10  - Превью
              DW .ModSelect  ; 11 - Режим
              DW Ret         ; 12 - Кисть
              DW Ret         ; 13 - Повтор
              DW Ret         ; 14 - Пиксели
              DW Ret         ; 15 - Атрибуты
              DW .view_      ; 16 - Просмотр
              DW PRGB2       ; 17 - RGB
              DW PRGB2       ; 18 - DT
              DW .viewE_     ; 19 - Просмотр по Enter и перечитывание окна
              DW .swpSCRs    ; 20 - Обмен экранами 'L'

.TransfTab
              DW WinClipping ; 0 - Обрезка
              DW .Scroll_    ; 1 - Прокрутка
              DW .MColor     ; 2 - Цвет
              DW Ret         ; 3 - Дополнения_
              DW WinInvers   ; 4 - Инверсия
              DW Obvodka     ; 5 - Обводка
              DW BOLDln      ; 6 - Толще
              DW Tonshe      ; 7 - Тоньше
              DW Cutta       ; 8 - Выемка
              DW LDb_winpx   ; 9 - Сбросить
              DW wROT90      ; 10 - Поворот 90 по часовой стрелке
              DW MirrorVert  ; 11 - Зеркало по вертикали
              DW MirrorHor   ; 12 - Зеркало по горизонтали
              DW .to_Screen  ; 13 - На экран >>
              DW .EXcnknum_  ; 14 - Смена чанка бордюра вперёд
              DW .EXcnknum_  ; 15 - Смена чанка бордюра назад

.MColorTab    DW .currColor  ; 0 - текущий цвет
              DW .invColor   ; 1 - инверсия цвета
              DW .EXColor    ; 2 - замена цвета
              DW .MColorRGB  ; 3 - RGB
              DW .MColorRGB  ; 4 - DT

.FtakeIN     DB 0     ; флаг выборки из вне экрана
.FtakeIN2    DB 0     ; флаг смены размеров загруженного окна

;------------ обработка -------------------

.pixmod_      ld ix,WinX8      ; out ix ; a=0 - x8 ; l - max x+1 , h - max y+1 for COl
                               ;   or l - max x, h -max y for pixels
              ld hl,24*256+32
              ld a,(OVR_proc)
              or a
             ret z
              ld hl,191*256+255
              ld ix,WinX1
             ret

.swpSCRs      call CLOSE_ALLW      ; обмен экранами
              call SwpSCRSl
             jr .FsetIN

.takeIN_      call SL_extract4    ; взять из_
             ret c   ; jr c,.toMenu_
              call .define_0
             ret c
.FsetIN       ld a,1
              ld (.FtakeIN),a
             ret

.define       call LOADSCR
.define_0     call .pixmod_
             jr z,.define_x8
              call R1Sel
             jr 1F
.define_x8    call R8Sel

1            ret c
.toMenu_tm_    xor a
               ld (.FtakeIN),a
.toMenu_tm
              jp .tomap_

.allscreen    call CLOSE_ALLW
              call LOADSCR     ; удаляем прорисовку рамки
              call .pixmod_
1             xor a
              ld (ix+0),a
              ld (ix+1),a
              ld (ix+2),l
              ld (ix+3),h
             jr .toMenu_tm_

.view_        call .view__
             jp  WAITKEY_

.viewE_       call .view__     ; просмотр окна и перечитываем окно после
              call FtakeINchek
             ret nz
              call LOADSCR
             jr .toMenu_tm_

.view__       call CLOSE_ALLW
             jp NOKEY_


.CopyTo         ld hl,WSltSelect.Tcopy
                call SL_extract4000
               ret c
                call .sFRamka
                call svb_screen   ; сохраняем текущий экран (только после загрузки т.к. в каталоге)
                call SAVESCR
                call 1F
               jp ldb_screen      ; восстанавливаем экран  WinMenu.CopyTo
.Copy           ld a,255
                ld (Nslot_option),a
1               xor a
                ld (.flsetwincopy),a
                call .sFRamka
                call .copy_
                ld a,0
.flsetwincopy EQU $-1      ; флаг что были изменения
                or a
                call nz,.saveCOPY
               jp NOKEY_

.saveCOPY       ld a,(Nslot_option)
                cp 255
               jp z,SAVESCR
                cp 5
               jp z,SAVESCR2
               jp c,SVSCR_SLOT
                ld a,(SlFile_SEC_LEN)     ; save to file
                ld b,a
                ld hl,#4000
                ld de,(SlFile_START_SEC)
                ld c,#06
               jp DOS_FUNC_

.copy_          call 1F
               jp ResRmDirect
1               call .copy_0
               ret c
                ld a,(WWinmod.Fw_Brs)
                inc a
               jr z,2F    ; (#FF)
                ld a,(WWinmod.Fw_Brs+3)
                or a
               jr nz,1B
2               call NOKEY_
                ld a,(WWinmod.Fw+3)   ; флаг повторения
                or a
               ret z
               jr 1B


.copy_0
               call .sel_new_pos_
              jr c,1F
.copy_1         push ix
                push af
                call suxRAM
                ld a,1
                ld (.flsetwincopy),a
                pop af
                call SetWinSPR
                pop ix
                or a     ; reset flag c
1              jp guiRAM


.sFRamka        call FtakeINchek ; стирает рамку если окно на экране
                call z,.wRamka
               ret

.newPos_        push hl,de
                ld hl,(WinXU.x)
                ld de,(WinXU.csx)
                ld a,(OVR_proc)
                or a
               jr z,1F
                ld hl,(WinXU.px)
                ld de,(WinXU.dsx)
1               ld (Ix8),hl
                ld (Ix8+2),de
                pop de,hl
.s              ld ix,Ix8    ; выбор новой позиции окна x l=255 for x1
                inc l
               jr z,.Ramka1move

.Ramka8move     call OnRmDirect     ; перемещение рамки 8 с изменением направления
                xor a
                push af
               jp Ramka8.nk
.Ramka1move     call OnRmDirect     ; перемещение рамки 1 с изменением направления
                xor a
                push af
               jp Ramka1.br_nk


.x81swp         ld a,(OVR_proc)
                cpl
                and 1
                ld (OVR_proc),a
               jr z,.x1tox8
.x8tox1         ld hl,(WinX8)
                add hl,hl
                add hl,hl
                add hl,hl
                ld (WinX1),hl
                ld hl,(WinX8.csx)
                dec l
                dec h
                add hl,hl
                add hl,hl
                add hl,hl
                ld a,l
                or 7
                ld l,a
                ld a,h
                or 7
                ld h,a
                ld (WinX1.sx),hl
               jr 1F
.x1tox8         ld hl,(WinX1)
                call .x1tx8rr_
                ld (WinX8),hl
                ld (WinXU.px),de
                ld hl,0
                ld (WinXU.dx),hl
                ld hl,(WinX1.sx)
                call .x1tx8rr_
                ld (WinXU.dsx),de
                inc l
                inc h
                ld (WinX8.csx),hl
1              jp WinMenu.n0

.x1tx8rr_       ld a,l
                and #F8
                ld e,a
                rrca : rrca : rrca
                ld l,a
                ld a,h
                and #F8
                ld d,a
                rrca : rrca : rrca
                ld h,a
               ret

.swpreview_
                pop af    ; снимаем возврат для ARW_SCN_gui
                call BUTTON_
               ret



.sel_new_pos    call .scrRamka     ; удаляем прорисовку рамки
.sel_new_pos_
                ld hl,Ret
                ld a,10
                ld (MaxCount),a
                ld a,(WWinmod.Fw+21)             ; превью WinMenu.sel_new_pos_
                ld (Ramka1.iflWin_),a
                or a
               jr z,1F
                ld hl,.rsn_Ramka
1               ld (Ramka1.Box2CallADR),hl
                call .wRamka    ; Ставим прорисовку заново
                call .pixmod_
                call debc_IX_
                inc l
                call nz,debc_x8_
                ld (.rsn_Rde),de
                ld (.rsn_Rbc),bc
                dec l
                push ix
                call .newPos_
                pop ix
                push af
                call .rsn_OldRamka  ; z,.wRamka       ; удаляем прорисовку рамки
                ld hl,Ret
                ld (Ramka1.Box2CallADR),hl
                pop af
               ret c
                push ix
                ld ix,Ix8
                call debc_IX_
                ld a,(OVR_proc)
                or a
               jr nz,1F
                call debc_x8_
                ld hl,(Ramka8.imv_hl)  ; коррекция для x8
                add hl,de
                ex de,hl
                call IX_debc_
1               pop ix
                call suxRAM
.sel_np_calc_   ld a,(WinXU.csx)
                ld c,a           ; c size x in bytes

                ld hl,(WinXU.dx)    ; смещения начала
                xor a
                ex af,af'
                ld a,(RmDirect)
                or a
               ret z                ; \ левый-верх


.s_n_p_RU       dec a
               jr nz,.s_n_p_RD
                                        ; \ правый-верх  WinMenu.s_n_p_RU
1                ld a,(WinXU.dsx)   ; нормализуем x
                 neg
                 add a,e      ; [e-(WinXU.dsx)]
                 ld e,a
                jr c,2F
                 ld a,#FF
                ret


.s_n_p_RD       dec a
               jr nz,.s_n_p_LD
                                        ; \ правый-низ
                call  .s_n_p_Dn
               jr 1B

.s_n_p_LD                               ; \ левый-низ
                call .s_n_p_Dn
2               xor a
               ret

.s_n_p_Dn       ld a,(WinXU.dsy)    ; нормализуем y
                neg
                add a,d
                ld d,a
               ret c
                ld a,#FF
                ex af,af'
               ret


.rsn_OldRamka
.rsn_Rde  EQU $+1 : ld de,#0000
.rsn_Rbc  EQU $+1 : ld bc,#0000
                   jp BoxPixLU

.rsn_Ramka       ; используется для вывода текущей и выбираемой рамок и превью
                    or a
                   jr z,.rsn_RmkRes             ; стирание рамки

                ;   установка рамки и превью
                    ld a,(flg_WinP)
                    or a
                   ret z
                    push de,bc
                    ld (.rsn_flg),a             ; флаг что превью стоит
                    call .rsn_OldRamka          ; удаляем эталонную рамку
                    pop bc,de
                    push de,bc
                    call .sel_np_calc_
                    ex af,af'
                    push af
                    ex af,af'
                    push af
                    push hl,de,bc
                    call .rsn_Rdcp_
                    call SvPrtSCRpXY    ; сохранение участка экрана
                    call suxRAM
                    pop bc,de,hl
                    pop af
                    ex af,af'
                    pop af
                    ex af,af'
                    push ix
                    call SetWinSPR
                    call .rsn_OldRamka
                    pop ix
                    pop bc,de
1                  jp guiRAM


.rsn_RmkRes                  ; стирание рамки и превью
.rsn_flg EQU $+1 :  ld a,0
                    or a
                   jr z,1B
                    xor a
                    ld (.rsn_flg),a

                    push de,bc
                    call Ramka1.BoxJPramka   ; удаляем текущую рамку
                    call .rsn_OldRamka       ; удаляем эталонную рамку
                    pop bc,de
                    pop af                   ; удаляем возврат
                    call ScrRam              ; удаление превью и рамки
                    call LdPrtSCRpXY_        ; возврат участка экрана
                    call .rsn_OldRamka       ; восстанавливаем эталонную рамку
                   jp guiRAM

.rsn_Rdcp_          push af
                    ld hl,(WinXU.dx)    ; смещения
                    ld a,e
                    sub l
                    ld e,a
                   jr nc,1F
                    pop af
                    ld a,#FF
                    push af
1                   ld a,d
                    sub h
                    ld d,a
                   jr nc,1F
                    ex af,af'
                    ld a,#FF
                    ex af,af'
1                   pop af
                    inc a
                   jr nz,1F
                    ld e,a   ; 0
1                   ex af,af'
                    inc a
                   jr nz,1F
                    ld d,a  ; 0
1                   call ScrRam
                    ld bc,(WinXU.csx)
                    inc b
                    inc c
                    ld a,32
                    cp c
                   jr nc,1F
                    ld c,a
1                   ld a,24
                    cp b
                   ret nc
                    ld b,a
                   ret


.scrRamka          call CLOSE_ALLW
.wRamka            call .reRamka
                   ld a,l
                   inc a
                  jp nz,RAMKA_    ; view x8
                  jp BoxPix       ; view x1

.reRamka           call .pixmod_   ; out normal win & l=255 for x1
                   ld a,(ix+0)     ; x
                   cp l
                  jr c,1F
                   xor a
                   ld (ix+0),a
1                  ld b,a             ; x
                   ld a,(ix+2)   ; dx
                   ld c,a
                   or a          ; проверка на 0
                  jr nz,1F
                   ld a,l
                   cp 255
                   ld a,c
                  jr z,1F
                   ld a,1       ;  for x8
                   ld (ix+2),a
                   dec l        ; 32 -> 31
1                  add a,b    ; x+dx
                  jr c,2F
                   cp l
                  jr c,4F
                  jr z,4F
2                  ld a,l
                   sub b
                   inc l
                  jr z,3F
                   inc a
3                  ld (ix+2),a
                   dec l
4                  ld a,(ix+1)    ; y
                   cp h
                  jr c,1F
                   xor a
                   ld (ix+1),a
1                  ld b,a         ; y
                   ld a,(ix+3)    ; dy
                   ld c,a
                   or a
                  jr nz,1F
                   ld a,h
                   cp 191
                   ld a,c
                  jr z,1F
                   ld a,1
                   ld (ix+3),a
                   dec h        ; 24 -> 23
1                  add a,b   ; y+dy
                  jr c,1F
                   cp h
                  ret c
                  ret z
1                  ld a,h
                   sub b
                   inc l
                  jr z,1F
                   inc a
1                  ld (ix+3),a
                   dec l
                  ret


.i_col000        exx        ; инверсия цвета в окне
                 ld e,a
                 and #C0
                 ld d,a
                 xor a
                 rr e : rra
                 rr e : rra
                 rr e : rra
                 rrca : rrca
                 or d
                 ld d,a
                 ld a,e
                 and 7
                 or d
                 exx
                ret

.ex_col000       exx
                 ld e,a       ;     WWinColEX.Col1 .ColM1
                 ld a,(WWinColEX.ColM1)
                 ld c,a      ; mask
                 or e
                 ld d,a
                 ld a,(WWinColEX.Col1)
                 or c
                 cp d
                 ld a,e
                jr nz,3F
                 ld a,(WWinColEX.ColM2)
                 ld c,a      ; mask2
                 and e
                 ld e,a
                 ld a,(WWinColEX.Col2)
                 or c
                 xor c
                 or e
3                exx
                ret

.EXColor_        ld hl,.ex_col000  ; замена цвета в окне
                jr .setColor_
.invColor        ld hl,.i_col000   ; инверсия цвета в окне
                jr .setColor_
.currColor       ld hl,MIXCOL      ; текущий цвет в окне
.setColor_       ld (.adrScol_),hl
                 call suxRAM
                 ld hl,(WinAttrSize_)    ;(FullWinSize_)
                 ld de,WinAMskBoof
                 ld bc,WinABoof
1                ld a,(de)
                 or a
                jr nz,2F
                 ld a,(bc)
                 call MIXCOL
.adrScol_  EQU  $-2
                 ld (bc),a
2                inc de
                 inc bc
                 dec hl
                 ld a,h
                 or l
                jr nz,1B
                ret



.Ldelete        ld c,2  ; удаление окна в экране
               jr 1F
.LcurrColor     ld c,1
1               call FtakeINchek
               jp nz,.eWinMenu_
                push bc
                call LOADSCR
                ld ix,LWinXU
                pop bc
                dec c
               jr z,.LcurrColor_

                ld a,(WWinmod.Fw+15)    ; атрибуты
                or a
                call nz,SETV
               ; пиксели
                ld a,(WWinmod.Fw+9)
                or a
               jr z,.Lwexit
                ld de,(LWinXU.px)
                call PixHLaM
                ld d,a
                ld c,(ix+9)
                inc c
1               push hl
                ld e,d
                ld b,(ix+8) ; .spx
                inc b
2               ld a,(hl)
                or e
                xor e
                ld (hl),a
                rrc e
               jr nc,3F
                inc l
3              djnz 2B
                pop hl
                call INC_Y
                dec c
               jr nz,1B
.Lwexit        jr .eSvWinMenu_

.LcurrColor_    call SETV
               jr .eSvWinMenu_

;.Lplace         ld a,(WinXU.csy)
;                cp 33
;               jr nc,.eWinMenu_
;                call LOADSCR
;1               ld ix,WinXU
;                call .sel_new_pos_
;               jr c,.eWinMenu_
;                or a
;               jr nz,1B     ; не работает за пределами экрана X
;                ex af,af'
;                or a
;               jr nz,1B     ; не работает за пределами экрана Y
;                ex af,af'
;                ld a,(WinXU.dsx)      ; scx
;                add a,e     ; x+sx
;               jr c,1B
;                ld a,(WinXU.dsy)
;                add a,d
;               jr c,1B
;                cp 192
;               jr nc,1B
;                ld (WinXU.px),de
;                ld a,e
;                rra : rra : rra
;                and #1F
;                ld l,a
;                ld a,d
;                rra : rra : rra
;                and #1F
;                ld h,a
;                ld (WinXU.x),hl
;                call .toLwin_
;                xor a
;                ld (.FtakeIN),a
;                ld (.FtakeIN2),a
;                ld a,(OVR_proc)
;                or a
;               jr z,1F
;                ld hl,(WinXU.px)
;                ld (WinX1.x),hl
;                ld hl,(WinXU.dsx)
;                ld (WinX1.sx),hl
;              jr .to_Screen
;1               ld hl,(WinXU.x)
;                ld (WinX8.cx),hl
;                ld hl,(WinXU.csx)
;                ld (WinX8.csx),hl

.to_Screen      call FtakeINchekS
               ret nz
                call .to_screen_
.eSvWinMenu_    call SAVESCR
.eWinMenu_     jp WinMenu.n0

.to_screen_     call LOADSCR
.to_screenNL_   call suxRAM
                xor a
                call SetSPRITE.setOutput
                ld de,(WinXU.px)
                ld hl,(WinXU.dx)
                ld a,(WinXU.dsy)
                ld b,a
                ld a,(WinXU.csx)
                ld c,a
               jp .outputWn


FtakeINchek     ld a,(WinMenu.FtakeIN)   ; out z - yes , nz - no
                or a
               ret
FtakeINchekS    call FtakeINchek
               ret nz
FtakeINchek2    ld a,(WinMenu.FtakeIN2)  ; out z - yes , nz - no
                or a
               ret

; ----------- непосредственно окно -------------WWinmod.Fw+21

WWinmod     DB 3,0,11,24,6*8,7,%00001111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DB 6*8+3
        DW .Txt      ; объект-текст
        DW .Sel      ; объект-подсветка (выборка)
        DW .Hk       ; горячие клавиши
        DW .Btn      ; объект-кнопки (выборка)
        DW .Fw       ; объект-флажки

        DW #FFFF



.Txt        DB #0A
.THeadAdr   DW .HeadX8 : DB 13

            MSG_WIN_Def : DB 13         ; Выбрать окно
            MSG_WIN_WhSCR : DB 13       ; Весь экран
            MSG_WIN_Take  : DB 13,13    ; Взять из

            MSG_WIN_CurrCol : DB 13     ; Текущий цвет
            MSG_WIN_Clear : DB 13,13    ; Удалить

            MSG_WIN_Copy : DB 13        ; Копировать
            MSG_WIN_CopyTo : DB 13      ; Копировать в_
            MSG_WIN_Place : DB 13,13    ; Поместить


            MSG_WIN_Modify_ : DB 13     ; Изменить_
            DB #0A
.chX8X1adr  DW .X8toX1  : DB 15,13      ; [ x8 -> x1 ] or [ x1 -> x8 ]
            MSG_WIN_Preview : DB 13

            MSG_WIN_Mode : DB #17,5,#0A   ; Режим : Put  (or other)
.TmodAdr    DW mPut

            DB #0A
.TbrsAdr    DW .Nbrs

            MSG_WIN_Mult : DB 13        ; повтор v
            MSG_WIN_Pixels : DB 13      ; Пиксели  v
            MSG_WIN_Attrs : DB 13       ; Атрибуты v
            DB 0


.HeadX8      MSG_WIN_HeadX8 : DB #FF
.HeadX1      MSG_WIN_HeadX1 : DB #FF
.X8toX1      DB "x8 -> x1",0
.X1toX8      DB "x1 -> x8",0
.Nbrs        DB " ",0      ; пустая строка для окон x8
.Ybrs        MSG_WIN_Brush :  DB 0    ; Кисть v (для окон x1)


.Sel      ; Выборка
           DB 1,3,9,128+3,%11         ; 0,1,2 - Выбрать окно, Весь экран, Взять из_
           DB 1,7,9,128+2,%11         ; 3,4   - Текущий цвет,Удалить
.selMvDelF_  EQU $-1
           DB 1,10,9,128+2,%111       ; 5,6   - Копировать, Копировать в_
           DB 1,12,9,1,%111           ; 7    - Поместить
.selPlaceF_  EQU $-1      ; флаг
           DB 1,14,7,128+2,%11        ; 8,9  - Изменить_ , x8 -> x1 or x1 -> x8
           DB 1,17,9,1,%11            ; 10   - preview v
           DB 1,18,7,1,%11            ; 11  -  режим         ;
           DB 1,19,6,1,%00            ; 12   - brush mode   v
.Sl_Brs   EQU $-1
           DB 1,20,6,128+3,%11        ; 13,14,15 - Повтор, Пиксели, Атрибуты v
          DB #FF


.Btn      ; Кнопки
           DB 8,14,2,2,7,%11    ; 0 view
.previewCol EQU $-2
            DW LOOKS
           DB 8,19,2,2,7,%11    ; 1 rgb
            DW RGBS
           DB 8,21,2,2,7,%00    ; 2 dtrs
.CurCol  EQU $-2
            DW DTRS
           DB #FF

.Fw       ; Флажки
; объект-флажок (switch)
; x, y, номер опции, состояние (#00/#FF)
; вызов при щелчке на кнопку после того, как уже
; перенастроился объект на новое положение
          DB 6,20,13,#FF    ; Повтор +3
           DW .fw_save_
          DB 6,21,14,#FF    ; Пиксели +9
           DW .fwPix_
          DB 6,22,15,#FF    ; Атрибуты +15
           DW .fwAtr_
          DB 9,17,10,#00     ; Превью +21
           DW .fw_save_
.Fw_Brs   DB #FF,19,12,#00  ; Кисть для x1 /  first byte #FF for x8 or 6 for x1
           DW Nil
          DB #FF

.Fw_x8       DB #FF,#FF,#FF,#00     ; состояние для x8
.Fw_x1       DB #FF,#FF,#FF,#00     ; состояние для x1

.fwPix__     ld a,(.Fw+9)
             or a
            ret nz
             ld a,#FF
             ld (.Fw+15),a
            ret
.fwAtr__     ld a,(.Fw+15)
             or a
            ret nz
             ld a,#FF
             ld (.Fw+9),a
            ret

.fwAtr_      call .fwAtr__
            jr .fw_save_
.fwPix_      call .fwPix__
.fw_save_    ld hl,.Fw_x8
             ld a,(OVR_proc)
             or a
            jr z,1F
             ld hl,.Fw_x1
1            ld a,(.Fw+3) ; Повтор
             ld (hl),a
             inc hl
             ld a,(.Fw+9) ; пиксели
             ld (hl),a
             inc hl
             ld a,(.Fw+15) ; атрибуты
             ld (hl),a
             inc hl
             ld a,(.Fw+21) ; превью
             ld (hl),a
            ret


.Hk
           DB "C",0
            DW 17
           DB #0D,0
            DW 19
           DB "L",0
            DW 20

          DB #FF


WWinModify  DB 21,1,11,23,7*8,7,128+64+%00001111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DB 7*8+3
        DW .Txt      ; объект-текст
        DW .Sel      ; объект-подсветка (выборка)
        DW .Hk       ; горячие клавиши
        DW 8         ; пропуск позиций
        DW .colbox   ; расцветка
        DW WinMenu.outWinBoof  ; перед прорисовкой
        DW #FFFF

.Txt       MSG_WIN_TModify   : DB 13          ; Изменить /титул
           MSG_WIN_AutoMSK_  : DB 13          ; Автообрезка_
           MSG_WIN_Scroll_   : DB 13          ; Прокрутка_
           MSG_WIN_Color_    : DB 13          ; Цвет_
           MSG_WIN_Addition_ : DB 13,15,13       ; Дополнения_
           MSG_WIN_Invert    : DB 13          ; Инверсия
           MSG_WIN_OutLine   : DB 13          ; Обводка
           MSG_WIN_GrowOut   : DB 13          ; Толще
           MSG_WIN_GrowIn    : DB 13          ; Тоньше
           MSG_WIN_TakeOut   : DB 13,13       ; Выемка
           MSG_WIN_Reset     : DB 13,15,13       ; Сбросить
           MSG_WIN_Rot90     : DB 13          ; Поворот 90
           MSG_WIN_Mirror    : DB 13          ; Отражение
           MSG_WIN_FlipV     : DB 13          ; По вертикали
           MSG_WIN_FlipH     : DB 13,15,13    ; По горизонтали
           MSG_WIN_ToScreen                   ; На экран >>
          DB 0

.Sel       DB 1,3,9,128+4,%11     ; 0 - Автообрезка, 1 - Прокрутка, 2 - Цвет, 3 - Дополнения_
           DB 1,8,9,128+5,%11     ; 4 - Инверсия, 5 - Обводка, 6 - Толще, 7 - Тоньше, 8 - Выемка
           DB 1,14,9,1,%100       ; 9 - сбросить
.flg_winpx  EQU $-1
           DB 1,16,9,1,%11        ; 10 - Поворот 90
           DB 1,18,9,128+2,%11    ; 11,12 - Отражение: по вертикали, по горизонтали
           DB 1,21,9,1,%111       ; 13 - На экран >>
.toScrFlg EQU $-1
           DB #FF

.Hk        DB "B",0     ; смена чанка бордюра вперёд
          DW 14
           DB "N",0     ; смена чанка бордюра назад
          DW 15
           DB #FF

.colbox    DB 1,17,9,1,7*8+1,%1
          DB #FF

WWinColorM   DB 17,1,14,6,6*8,6,%00001110
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DB 0
        DW .Txt      ; объект-текст
        DW .Sel      ; объект-подсветка (выборка)
        DW .Hk       ;   горячие клавиши (hotkeys)
        DW .But      ;   объект-кнопки (выборка) (buttons object)
        DW #FFFF

.Txt
           MSG_WIN_CurrCol   : DB 13         ; 0 Текущий цвет
           MSG_WIN_InvCol    : DB 13         ; 1 Инверсия цвета
           MSG_WIN_ChangeCol                 ; 2 Замена цвета_
         DB 0

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

.But       DB 11,1,2,2,7,%11    ; 3 rgb
            DW RGBS
           DB 11,3,2,2,7,%00    ; 4 dtrs
.CurCol  EQU $-2
            DW DTRS
           DB #FF

.Hk         DB "C",0
            DW 3
           DB #FF

WWinColEX   DB 3,0,17,8,7*8,7,%00001110
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DB 0
        DW .Txt      ; объект-текст
        DW .Sel      ; объект-подсветка (выборка)
        DW Nil       ; горячие клавиши
        DW .Btn      ; объект-кнопки (выборка)
        DW .Fw       ; объект-флажки
        DW #FFFF

.Txt      DB 22,6,1
          MSG_RGB_Ink    : DB 13
          MSG_RGB_Paper  : DB 13
          MSG_RGB_Bright : DB 13
          MSG_RGB_Flash  : DB 13,22,5,6
          MSG_WIN_Change : DB #17,6,">>>"
         DB 0

.Sel      DB 3,1,3,128+4,%11    ; 0-3 - rgb1 flags
          DB 11,1,3,128+4,%11   ; 4-7 - rgb2 flags
          DB 4,6,9,1,%11        ; 8 - start
         DB #FF

.Btn        DB 1,1,2,2,7,%11    ; 9 - rgb 1
            DW RGBS
            DB 1,4,2,2,7,%00    ; 10 - dtrs 1
.Col1     EQU $-2
            DW DTRCSS
            DB 14,1,2,2,7,%11   ; 11 -rgb 2
            DW RGBS
            DB 14,4,2,2,5,%00   ; 12 - dtrs 2
.Col2     EQU $-2
            DW DTRCSS
           DB #FF

.ColM1     DB #F8        ; маски к заменяемым цветам
.ColM2     DB #F8

.Fw   ; Флажки
           DB 4,1,0,#FF
            DW .Fwmsk
           DB 4,2,1,#FF
            DW .Fwmsk
           DB 4,3,2,#FF
            DW .Fwmsk
           DB 4,4,3,#FF
            DW .Fwmsk
           DB 12,1,4,#FF
            DW .Fwmsk
           DB 12,2,5,#FF
            DW .Fwmsk
           DB 12,3,6,#FF
            DW .Fwmsk
           DB 12,4,7,#FF
            DW .Fwmsk
         DB #FF

.Fwmsk     ld hl,.Fw+3
           call .Fwmsk_1
           ld (.ColM1),a
           call .Fwmsk_1
           ld (.ColM2),a
          ret

.Fwmsk_1   ld bc,6
           ld e,0
           ld a,(hl)
           add hl,bc
           or a
          jr nz,1F
           ld e,7
1          ld a,(hl)
           add hl,bc
           or a
           ld a,#38
          jr nz,1F
           or e
           ld e,a
1          ld a,(hl)
           add hl,bc
           or a
           ld a,#40
          jr nz,1F
           or e
           ld e,a
1          ld a,(hl)
           add hl,bc
           or a
           ld a,#80
          jr nz,1F
           or e
           ld e,a
1          ld a,e
          ret

WWinSelMod   DB 0,0,4,8,7*8+1,7,%10001010
             DB 0
        DW .Txt      ; объект-текст
        DW .Sel      ; объект-подсветка (выборка) WWinSelMod.ColBox
        DW 9
        DW .ColBox
        DW #FFFF

.Txt     DB #0A : DW mPut
         DB #0A : DW mOR
         DB #0A : DW mXOR
         DB #0A : DW mAND
         DB #0A : DW mNMS
         DB #0A : DW mOMS
         DB 0

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

.ColBox  DB 1,2,2,3,7*8+2,%1
         DB #FF

WWinScroll    DB 19,9,13,16,6*8,7,128+%1111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DB 6*8+3
        DW .Txt      ; объект-текст
        DW .Sel      ; объект-подсветка (выборка)
        DW Nil  ;.Hk       ; горячие клавиши
        DW .Btn      ; объект-кнопки (выборка)
        DW .Fw       ; объект-флажки
        DW 6         ; пропуск
        DW .Colbox   ; раскраска
        DW #FFFF

.Txt      MSG_WIN_ScrollH : DB 13
          MSG_WIN_Pixels : DB 13
          MSG_WIN_Attrs : DB 13,15,13
          MSG_WIN_ScrlMSK  : DB 13,15,13
          DB "x8:",#17,6,"x1:",13
          DB "A",13,13,13,15,13
          MSG_WIN_Refresh :DB 13
          MSG_WIN_ScrlInSCR
         DB 0

.Sel      DB 1,3,11,128+2,%11   ; 0 - пиксели v , 1 - атрибуты v
          DB 1,6,11,1,%11       ; 2 - маска v
          DB 1,13,11,1,%11      ; 3 - Обновлять v
          DB 1,14,11,1,%11      ; 4 - В экране v

         DB #FF
   ; x,y, длина (width), высота (heyght),     ;// длина и высота указываются в знакоместах//
; цвет (color), флаг (flag)

; флаги (flag):
; Bit 0 - состояние: 1 - использовать , 0 - оставить текущий цвет

.Colbox    DB  1,14,11,1,6*8+3,%00  ; WWinScroll.Colbox+5
          DB #FF

.Btn      ; Кнопки
           DB 2,10,2,1,7*8,%11    ; 0 <-  x8
            DW DIRECT_LS
           DB 4,10,2,1,7*8,%11    ; 1 ->  x8
            DW DIRECT_RS
           DB 3,9,2,1,7*8,%11    ; 2 ^   x8
            DW DIRECT_US
           DB 3,11,2,1,7*8,%11    ; 3 V   x8
            DW DIRECT_DS
           DB 8,10,2,1,7*8,%11    ; 4 <-  x1
            DW DIRECT_LS
           DB 10,10,2,1,7*8,%11    ; 5 ->  x1
            DW DIRECT_RS
           DB 9,9,2,1,7*8,%11    ; 6 ^   x1
            DW DIRECT_US
           DB 9,11,2,1,7*8,%11    ; 7  V  x1
            DW DIRECT_DS
           DB #FF

.Fw       DB 11,3,0,#FF   ; пиксели v
           DW .fwPix_
          DB 11,4,1,#FF   ; атрибуты v
           DW .fwAtr_
          DB 11,6,2,#FF   ; маска v
           DW Nil
          DB 11,13,3,#00  ; Обновлять v
           DW .fwINREFscr_
          DB 11,14,4,#00  ; В экране  v
           DW .fwINREFscr_
          DB #FF

.fwPix_      ld a,(.Fw+3)
             or a
            ret nz
             ld a,#FF
             ld (.Fw+9),a
            ret
.fwAtr_      ld a,(.Fw+9)
             or a
            ret nz
             ld a,#FF
             ld (.Fw+3),a
            ret
.fwINREFscr_  ld a,STOP_ARW
              call GUI_
              call WinMenu.EraseAllw
            jp WinMenu.scrl0

; ---------- procedures -----------


SetWinSPR        push ix
                 push hl,de,bc
                 ld ix,WinBoof
                 exx
                 ld hl,WinMskBoof
                 exx
                 ex af,af'
                 push af
                 ex af,af'
                 push af
                 ld a,(WWinmod.Fw+9)  ; flag pixels
                 or a
                jr z,1F
                 pop af
                 push af
                 call SetSPRITE
1                pop af
                 ex af,af'
                 pop af
                 ex af,af'
                 pop bc,de,hl
                 push af
                 ld a,(WWinmod.Fw+15)  ; flag attrs
                 or a
                jr z,1F
                 pop af
                 push af
                 ld ix,WinABoof
                 call SetASPRITE_
1                pop af
                 pop ix
                ret

WinAmskSet                   ; ix=WinXU
          ld hl,WinMskBoof
          ld de,WinAMskBoof
          ld a,(ix+3)   ; csy
1         ex af,af'
          ld b,(ix+2)   ; csx
          push de
2         ld a,(hl)
          ld (de),a
          inc hl
          inc de
         djnz 2B
          pop de
          ld c,7
2         push de
          ld b,(ix+2)
3         ld a,(de)
          and (hl)
          ld (de),a
          inc hl
          inc de
         djnz 3B
          pop de
          dec c
         jr nz,2B
          ld b,(ix+2)
2         ld a,(de)
          inc a
         jr z,3F
          xor a
          ld (de),a
3         inc de
         djnz 2B
          ex af,af'
          dec a
         jr nz,1B
        ret

; ----------- includes ------------

        INCLUDE "WinUtils.asm"

; ---------- variables ------------

WinAttrSize_    DW 0 ;

; main window x8/x1 variables set in 'Bge.asm'

            ; WWinScroll.Fw+3+9+15
ScrollW     ; прокрутка окна in a= 0 - 7
              ld ix,WinXU
              ld bc,.tab_
              push af
              and 3
              ld l,a
              ld h,0
              add hl,hl
              add hl,bc
              ld e,(hl)
              inc hl
              ld d,(hl)
              ld (.pr2),de
              ld bc,#0007
              add hl,bc
              ld a,(hl)
              inc hl
              ld h,(hl)
              ld l,a
              ld (.pr1),hl
              pop af
              ld b,1
              sub 4
             jr nc,1F
              ld b,8

1             ld a,b  ; запуск
              ld (.mcount1),a
              ld (.mcount2),a

            ;  ld (.mcount02),a
              ld a,(WWinScroll.Fw+3)  ; пиксели
              ld de,WinBoof
              or a
              call nz,1F
              ld a,(WWinScroll.Fw+15) ; маску
              ld de,WinMskBoof
              or a
              call nz,1F
              ld a,(WWinScroll.Fw+9)  ; атрибуты
              or a
             ret z
              ld a,(.mcount1)
              dec a
             ret z
.pr1 EQU $+1 : jp #FFFF
1
.pr2 EQU $+1 : jp #FFFF
.tab_       DW  .lf_ , .rt_ , .up_ , .dn_
            DW  .Alf_ , .Art_ , .Aup_ , .Adn_

.up_           ; вверх
               ld a,#B0   ; at [#ED,#B0 = LDIR ]
               ld hl,.firstbt
              jr 1F
.dn_            ; вниз
               ld a,#B8   ; at [#ED,#B8 = LDDR ]
               ld hl,.endbt
1              ld (.FirstEnd_),hl
               ld (.ldid0_),a
               ld (.ldid1_),a
               ld (.ldid2_),a
.up_dn_          ; вверх/вниз
.mcount1 EQU $+1 : ld a,8
               cp (ix+9)  ; .dsy
              jr z,1F
              ret nc
1              push af
.FirstEnd_ EQU $+1 : call .firstbt  ; hl -адрес первого/последнего байта окна, bc - длина строки в байтах
               pop af

1              push hl
               ld de,WinTMPboof
               push af
               ld hl,0
2              add hl,bc
               dec a
              jr nz,2B
               ld b,h
               ld c,l
               pop af
               pop hl
               push bc
               push hl
.ldid0_ EQU $+1 : ldir   ; ldir / lddr
               pop de
               call .szUD
               ld a,b
               or c
              jr z,3F
.ldid1_ EQU $+1 : ldir   ; ldir / lddr
               ld hl,WinTMPboof
               pop bc
.ldid2_ EQU $+1 : ldir   ; ldir / lddr
             ret
3             pop bc
             ret



.szUD         push hl   ; in a-count
              ld c,a
              ld a,(WinXU.dsy)
              sub c
              inc a
              ld h,a
              ld a,(WinXU.csx)
              call MULS      ; hl=a*h
              ld b,h
              ld c,l
              pop hl
             ret

.endbt
              ld a,(WinXU.dsy)
              inc a
              ld b,a
              ld a,(WinXU.dy)
              add a,b
              call 1F
              dec hl
             ret
.firstbt
              ld a,(WinXU.dy)
1             ld h,a
              ld a,(WinXU.csx)
              ld c,a
              call MULS      ; hl=a*h
              add hl,de      ; hl -адрес первого байта окна
              ld b,0         ; bc - длина строки в байтах
             ret

.mskbitB             ; out: b- byte mask, c-mask
               ld a,(WinXU.dx)
               cpl
               and 7
               ld e,a
               xor 7
               ld bc,#8000
              ret z
1              srl b
               scf
               rr c
               dec a
              jr nz,1B
              ret
.mskbitE             ; out: b- byte mask, c-mask
               ld a,(WinXU.dx)
               ld c,a
               ld a,(WinXU.dsx)
               add a,c
               and 7
               ld e,a
               ld bc,#807F
               or a
              ret z
1              srl b
               srl c
               dec a
              jr nz,1B
              ret

.mskbits       ld hl,.mskbitB
               ld de,.mskbitE
               or a
              jr z,1F
               ex de,hl
1              ld (.mkbtshl_),hl
               ld (.mkbtsde_),de
.mkbtshl_ EQU $+1 : call .mskbitB
               ld a,b
               ld (.msBb1),a
               ld a,c
               ld (.msB1),a
               ld (.ms8B1),a
               cpl
               ld (.msB1i),a
               ld (.ms8B1i),a
               ld a,e
               xor 7
               ld (.dxbe_),a
.mkbtsde_ EQU $+1 : call .mskbitE
               ld a,b
               ld (.msEb1),a
               ld a,c
               ld (.msE1),a
               ld (.ms8E1),a
               cpl
               ld (.msE1i),a
               ld (.ms8E1i),a
               ld (.ms8E1i_),a
               ld a,e
               ld (.mlrst8Bit),a
              ret

.lf_              ; влево
               ld bc,#172B     ; C= [ dec hl ]  xor 8 = [ inc hl ] ; B =  [ rla ] xor 8 = [ rra ]
               xor a
              jr 1F
.rt_              ; вправо
               ld bc,#1F23     ; C= [ inc hl ]  xor 8 = [ dec hl ] ; B =  [ rra ] xor 8 = [ rla ]
               ld a,b         ; a != 0

1              push de,bc
               ld hl,.endbt
               ld de,.firstbt
               or a
              jr z,1F
               ex de,hl
1              ld (.FirstEnd2_),hl
               ld (.FirstEnd3_),de
               call .mskbits
               pop bc,de


               ld a,c  ; [ inc/dec hl ]
               ld (.decinch_),a
               ld (.decinch1_),a
               ld (.decincl_),a
               ld (.decincl1_),a
               ld (.decincl2_),a

               xor 8
               ld (.incdech_),a
               ld (.incdecl_),a
               ld (.incdecl1_),a
               ld (.incdecl2_),a
               ld (.incdecl3_),a
               ld (.incdecl4_),a
               ld (.incdecl5_),a
               ld (.incdecl6_),a

               ld a,b
               ld (.rlrah_),a
               ld (.rlrah2_),a
               ld (.rlraa_),a
               sub 4             ; #CB +=[ rl/rr e ]
               ld (.rlre_),a
               xor 8
               ld (.rrle_),a
               dec a
               ld (.rrld_),a




.lf_rt_       ; влево-вправо           ScrollW.lf_rt_  ScrollW.lf_

               ld a,(.mcount2)
               dec a
               ld a,(WinXU.csx)
              jr z,1F
               cp 4
              jp nc,.lf_rt8_
1              ld (.mcsx),a


.FirstEnd2_ EQU $+1 : call .endbt  ; hl -адрес первого/последнего байта окна, bc - длина строки в байтах
               ld a,(WinXU.dsy)
               ld d,a
               inc d

1              ld e,8
.mcount2  EQU $-1

2              ld a,(hl)
               push hl
               push af
               ld b,0
.mcsx  EQU $-1
3              ld a,(hl)
               ld c,a
.rlrah_        rla
               ld (hl),a
.decinch_      dec hl
              djnz 3B
.incdech_      inc hl
               ld a,c
               and 0
.msBb1   EQU $-1
               ld a,#FF
              jr nz,4F
               xor a
4              and 0
.msEb1   EQU $-1
               push af      ; бит левый
               ld a,c
               and 0
.msB1    EQU $-1
               ld c,a
               ld a,(hl)
               and 0
.msB1i   EQU $-1
               or c
               ld (hl),a
               ld (.hl_l_),hl
               pop af
               ld c,a
               pop af
               and 0
.msE1    EQU $-1
               or c
               ld c,a
               pop hl
               ld a,0
.msE1i   EQU $-1
               or a
.rlrah2_       rla
               and (hl)
               or c
               ld (hl),a
               dec e
              jr nz,2B

.hl_l_ EQU $+1 : ld hl,#0000
.decinch1_     dec hl

               dec d
              jr nz,1B

           ret


.lf_rt8_         ; влево-вправо 8
               ld a,(ix+2)  ; .csx
               sub 3
               ld (.mlpb1),a
               ld a,7          ; номер последнего бита в байте
.mlrst8Bit EQU $-1
               inc a
               ld (.mlsbti),a


.FirstEnd3_ EQU $+1 : call .firstbt   ; hl -адрес первого/последнего байта окна, bc - длина строки в байтах
               ld a,(WinXU.dsy)
               inc a
1             ex af,af'
              ld b,0
.dxbe_ EQU $-1
              ld a,(hl)
              ld e,a
               and 0
.ms8B1    EQU $-1
              ld (.mfOR),a
.incdecl_     inc hl
              ld a,(hl)
              inc b
              dec b
             jr z,3F
2             or a
.rlraa_          rla
.rlre_ EQU $+1 : rl e
             djnz 2B
3             ld d,a
              ld a,(hl)
.decincl_     dec hl
              and 0
.ms8B1i   EQU $-1
              or 0
.mfOR  EQU $-1
              ld (hl),a
.incdecl1_    inc hl
.incdecl2_    inc hl

              ld b,0
.mlpb1 EQU $-1
4             ld a,(hl)
.decincl1_    dec hl
              ld (hl),a
.incdecl3_    inc hl
.incdecl4_    inc hl
             djnz 4B
              ld a,(hl)
              and 0
.ms8E1    EQU $-1
              push af
              ld a,(hl)
              and 0
.ms8E1i   EQU $-1

              ld b,0
.mlsbti  EQU $-1
5             or a
.rrle_ EQU $+1 : rr e
.rrld_ EQU $+1 : rr d
             djnz 5B

              or e
.decincl2_    dec hl
              ld (hl),a
.incdecl5_    inc hl
              pop af
              ld e,a
              ld a,0
.ms8E1i_   EQU $-1
              and d
              or e
              ld (hl),a
.incdecl6_    inc hl
              ex af,af'
              dec a
             jr nz,1B

           ret
;-------------------------------

.Alast_        ld a,(WinXU.csx)
               ld h,a
               ld a,(WinXU.csy)
               call MULS
               ld de,WinABoof
               add hl,de
               dec hl
              ret
.Aup_           ; вверх атрибуты
               ld a,#B0   ; at [#ED,#B0 = LDIR ]
               ld hl,WinABoof
              jr 1F
.Adn_            ; вниз атрибуты
               call .Alast_
               ld a,#B8   ; at [#ED,#B8 = LDDR ]

1              ld (.Aslbf_),hl
               ld (.Aldidr_),a
               ld (.Aldidr1_),a
               ld (.Aldidr2_),a
.Aup_dn_       ld a,(WinXU.csy)
               cp 2
              ret c
.Aslbf_ EQU $+1 : ld hl,WinABoof
              ld c,(ix+2)  ; .csx
              ld b,0
              push bc
              push hl
              ld de,WinTMPboof
.Aldidr_ EQU $+1 : ldir
              push hl
              ld h,(ix+2) ; .csx
              ld a,(WinXU.csy)
              dec a
              call MULS      ; hl=a*h
              ld c,l
              ld b,h
              pop hl
              pop de
.Aldidr1_ EQU $+1 : ldir
              ld hl,WinTMPboof
              pop bc
.Aldidr2_ EQU $+1 : ldir
.Aend_       jp WinAmskSet


.Alf_        ; влево атрибуты
             ld hl,WinABoof
             ld a,#23   ; [ inc hl ]
            jr 1F
.Art_        ; вправо атрибуты
             call .Alast_
             ld a,#2B   ; [ dec hl ]
1            ld (.Aslbf2_),hl
             ld (.Aidhl_),a
             ld (.Aidhl1_),a
             ld (.Aidhl2_),a
             xor 8
             ld (.Adihl_),a

.Alf_rt_      ld a,(WinXU.csx)
              ld c,a
              cp 2
             ret c
              dec c
.Aslbf2_ EQU $+1 : ld hl,WinABoof
              ld a,(WinXU.csy)
1             ex af,af'
              ld e,(hl)
              ld b,c
2
.Aidhl_       inc hl
              ld a,(hl)
.Adihl_       dec hl
              ld (hl),a
.Aidhl1_      inc hl
             djnz 2B
              ld (hl),e
.Aidhl2_      inc hl
              ex af,af'
              dec a
             jr nz,1B
             jr .Aend_





;WinXU               ; позиции текущего сохранённого окна
;                    ; используется при копировании, переводе x8<->x1 и в Изменить.
;.x        DB 0  ;+0   - позиция в знакоместах по x
;.y        DB 0  ;+1   - позиция в знакоместах по y
;.csx      DB 0  ;+2   - размер в знакоместах по x
;.csy      DB 0  ;+3   - размер в знакоместах по y
;.dx       DB 0  ;+4   - смещение начала пикселей по х
;.dy       DB 0  ;+5   - смещение начала пикселей по y
;.px       DB 0  ;+6   - позиция в пикселях по x
;.py       DB 0  ;+7   - позиция в пикселях по y
;.dsx      DB 0  ;+8   - размер в пикселях по x
;.dsy      DB 0  ;+9   - размер в пикселях по y






BmBUFF    DS 34
LBmBUFF   DS 34

LWinMenu      EQU $-WinMenu
              ENT

              DISPLAY "WinMenu len   :",/a,LWinMenu

