; WinUtils - различные опции для работы с окнами
;-------------------------------------------------

CleanMask       ; очищает текущую маску
                ld bc,WinMskBoof
.l              ld hl,(FullWinSize_)
1               xor a
                ld (bc),a
                inc bc
                dec hl
                ld a,h
                or l
               jr nz,1B
               ret

NormilizeWin    ; отрезает остатки окна маской
                call wboofpars
                ex de,hl
1               ld a,(de)
                or (hl)
                xor (hl)
                ld (de),a
                inc de
                inc hl
                dec bc
                ld a,b
                or c
               jr nz,1B
               ret

;---------------- обрезка ------------------------

WinClipping
.n0             ld a,%1111
                ld ix,WWinClipping
                ld (ix+6),a
                call Win_
                ld e,a
                call suxRAM
                ld a,e
                inc a   ; cp #FF
               jr z,NormilizeWin
                sub 7   ; 6
               jr z,2F
               jr nc,1F
                call AutoMask   ; in e
               jr 3F
1               sub 1
                call WinMenu.EXcnknum_0   ; смена чанка фона
               jr 3F
2               call CleanMask      ;6
3               call wmbooframka
                call WinAmskSet
                call WinMenu.outWinBoof
               jr .n0


WWinClipping  DB 21,1,11,8,6*8,7,%1111
              DB 6*8+3
               DW .Txt      ; объект-текст
               DW .Sel      ; объект-подсветка (выборка)
               DW .Hk
              DW #FFFF


.Txt         MSG_WIN_AutoMSK : DB 13             ; Обрезка /заголовок

             DB " l1",#17,3," l2",#17,6," l3",13       ; выбор толщины маски
             DB " w1",#17,3," w2",#17,6," w3",13,15,13
             MSG_WIN_Reset                             ; Сбросить
            DB 0

.Sel

             DB 1,3,2,128+2,%11    ; 0 - l1 ,1 - w1
             DB 4,3,2,128+2,%11    ; 2 - l2 ,3 - w2
             DB 7,3,2,128+2,%11    ; 4 - l3 ,5 - w3
             DB 1,6,9,1,%11        ; 6 - сбросить

            DB #FF

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



wboofpars       ld de,WinMskBoof
.nDE            ld bc,0
FullWinSize_   EQU $-2            ; полный размер окна x8 (без атрибутов)
                ld hl,WinBoof
               ret

dark_and_bf4   ld a,(RGBdefault)    ; очистка экрана
               ld c,a
               and %00111000
               rrca : rrca : rrca
               ld b,a
               ld a,c
               and %11111000
               or b
               call CLS_ATR.a
wboofpr4000
               push bc
               ld hl,WinBoof
               call wboofmsk4000.ldr     ; первичное заполнение маски
               pop bc
              ret

wboofmsk4000   ld hl,WinMskBoof          ; копируем маску в #4000
.ldr           ld de,#4000
               ld bc,(FullWinSize_)
               ldir
              ret

wmbooframka     ; ставит рамку маски
               ld hl,BmBUFF   ; очистка буфера крайней маски
               push hl
               ld b,33
1              ld (hl),0
               inc hl
              djnz 1B
               pop hl

               ld ix,WinXU     ; создание крайней маски в BmBUFF
               ld e,(ix+2) ; .csx
               ld d,0
               ld a,(ix+3) ; .csy
               add a,a
               add a,a
               add a,a
               ld (wmbooframka.lsnY),a
               ld b,a
               ld a,(ix+4) ; .dx
               or a
               ld c,a
              jr z,2F

               ld a,#FF   ; начало крайней маски
1              or a
               rra
               dec c
              jr nz,1B
               cpl
               ld (hl),a

2             ; установка крайней маски последнего байта
               add hl,de
               ld (hl),#FF
               dec hl
               ld a,(ix+4)  ; .dx
               add a,(ix+8) ; .dsx
               inc a
               and 7
               ld b,a
               ld a,#FF
              jr z,2F
               xor a
1              scf
               rra
              djnz 1B
2              cpl
               or (hl)
               ld (hl),a         ; маска в BmBUFF создана

                ld hl,WinMskBoof
                ld c,0
.lsnY   EQU $-1
                ld a,(ix+5)  ; смещение до начала по y
                or a
               jr z,3F
1               ld b,(ix+2)  ; верх
2               ld (hl),#FF
                inc hl
               djnz 2B
                dec c
               ret z
                dec a
               jr nz,1B
3               ld a,(ix+9)  ; размер в пикс. по y
                inc a
                ld de,BmBUFF
1               ex af,af'
                ld b,(ix+2)
                push de
2               ld a,(de)
                or (hl)
                ld (hl),a
                inc de
                inc hl
               djnz 2B
                pop de
                ex af,af'
                dec c
               ret z
                dec a
               jr nz,1B
1               ld b,(ix+2)  ; низ
2               ld (hl),#FF
                inc hl
               djnz 2B
                dec c
               jr nz,1B
               ret



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

AutoMask    xor a
            srl e
            inc e
            push af
           jr nc,1F
            inc e
            inc e
1           ld c,e
            push bc
            call wboofpars   ;начальное заполнение маски
            ldir
            pop bc
            ld b,c
1           call .ordx          ; утолщение
           djnz 1B
            ld b,c
            push bc
            ld bc,WinMskBoof
            call WinInvers.i    ; инверсия
            pop bc
            pop af
           ret nc

1           ld a,#37   ;  [ scf ]
            ld (BOLDln.rla),a
            ld (BOLDln.rra),a
            ld a,#12   ;  [ ld (de),a ]
            ld (BOLDln.nop1),a
            ld (BOLDln.nop2),a

1           call .ordx      ; обратное утолщение
           djnz 1B
            call .ordx
            dec c
            dec c
            ld b,c

            push bc
            ld a,#B7        ;  [ or a ]
            ld (BOLDln.rla),a
            ld (BOLDln.rra),a
            ld a,#00        ;  [ nop ]
            ld (BOLDln.nop1),a
            ld (BOLDln.nop2),a

            call dark_and_bf4    ; очистка экрана и загрузка как маски
            pop bc

1           call .ordx4000       ; вторичное утолщение
           djnz 1B
            ld de,WinMskBoof
.mmix       ld bc,(FullWinSize_)
            ld hl,#4000
1           ld a,(de)            ; совмещение масок
            or (hl)
            xor (hl)
            ld (de),a
            inc hl
            inc de
            dec bc
            ld a,b
            or c
           jr nz,1B
           ret

.ordx4000   ld hl,#4000
           jr .ordx_
.ordx       ld hl,WinMskBoof
.ordx_      push bc
         ; растягивание маски вверх/вниз
            push hl
            call BOLDln.UPdn
            pop hl
         ; растягивание маски влево/вправо
            call BOLDln.LfRt
            pop bc
          ret



BOLDln
              call .bld

             jp NormilizeWin  ; WinClipping.eclose

.bld          ld hl,WinBoof
             jp AutoMask.ordx_

.UPdn         ; утолщение на линию вверх/вниз , in hl - WinBoof or WinMskBoof
              push hl
              ld a,(WinXU.csx)          ; .csx
              ld e,a
              ex af,af'
              ld hl,(FullWinSize_)
              xor a
              ld d,a
              sbc hl,de            ;  количество байт
              ld c,h
              ld b,l
              pop hl
             ret c
             ret z
              inc b
              dec b
             jr z,1F
              inc c
1
              ex de,hl        ; de - тек. строка
              add hl,de       ; hl - след. строка
              push bc

1             ld a,(de)
              or (hl)
              ld (de),a
              inc de
              inc hl
             djnz 1B
              dec c
             jr nz,1B

              push de       ; обработка нижней строки (для маски)
              ex af,af'
              ld b,a
              ex af,af'
              ld a,#FF
.nop1         nop           ; [ nop ] or [ ld (de),a ]
              inc de
             djnz .nop1
              pop de

              pop bc
          ; утолщение на линию вниз
              dec hl
              dec de           ; de - след. строка, hl - тек. строка
1             ld a,(de)
              or (hl)
              ld (hl),a
              dec de
              dec hl
             djnz 1B
              dec c
             jr nz,1B

              ex de,hl       ; обработка верхней строки (для маски)
              ex af,af'
              ld b,a
              ex af,af'
              ld a,#FF
.nop2         nop           ; [ nop ] or [ ld (de),a ]
              dec de
             djnz .nop2
             ret


.LfRt        ; утолщение на линию влево/вправо , in hl - WinBoof or WinMskBoof

              ld a,(wmbooframka.lsnY)
              ld e,a               ; количество линий
              ld a,(WinXU.csx)          ; .csx
              ld d,a

              ld c,e               ; вправо
1             ld b,d
.rla          or a            ; [ or a ] or [ scf ]     ; инициация флага переноса
              ex af,af'
2             ld a,(hl)
              ex af,af'
              rr (hl)
              ex af,af'
              or (hl)
              ld (hl),a
              inc hl
             djnz 2B
              dec c
             jr nz,1B

              dec hl               ; влево
              ld c,e
1             ld b,d
.rra          or a            ; [ or a ] or [ scf ]      ; инициация флага переноса
              ex af,af'
2             ld a,(hl)
              ex af,af'
              rl (hl)
              ex af,af'
              or (hl)
              ld (hl),a
              dec hl
             djnz 2B
              dec c
             jr nz,1B
             ret

Cutta       call dark_and_bf4         ; выемка
            ld bc,#4000
            call WinInvers.i
            call AutoMask.ordx4000
            ld hl,WinBoof
            ld bc,(FullWinSize_)
            ld de,#4000
1           ld a,(de)            ; совмещение масок
            cpl
            xor (hl)
            ld (hl),a
            inc hl
            inc de
            dec bc
            ld a,b
            or c
           jr nz,1B
           jr WinInvers.e


Tonshe      call WinInvers.ib         ; тоньше
            call BOLDln.bld
WinInvers              ; инверсия окна
            call .ib
.e
           jp NormilizeWin    ; WinClipping.eclose

.ib         ld bc,WinBoof
.i          ld hl,(FullWinSize_)  ; инверсия
1           ld a,(bc)
            cpl
            ld (bc),a
            inc bc
            dec hl
            ld a,h
            or l
           jr nz,1B
           ret

Obvodka           ; обводка
              call obvodka_
             jr WinInvers.e

obvodka_          ; обводка
              call svb_mask
              call suxRAM
              call dark_and_bf4
              call AutoMask.ordx4000
              ld hl,#4000
              ld de,WinMskBoof
              ld bc,(FullWinSize_)
              push bc
              ldir
              call AutoMask.ordx4000
              pop bc
              ld hl,#4000
              push hl,bc
              ld de,WinMskBoof
1             ld a,(de)
              cpl
              and (hl)
              ld (hl),a
              inc hl
              inc de
              dec bc
              ld a,b
              or c
             jr nz,1B
              call ldb_mask
              call svb_winpx
              pop bc,de
              ld hl,WinBoof
1             ld a,(de)
              or (hl)
              ld (hl),a
              inc hl
              inc de
              dec bc
              ld a,b
              or c
             jr nz,1B   ; далее восстанавливаем маску

             jp SuxRam

LDb_winpx     call ldb_winpx
              call SuxRam
             jr WinInvers.e

ldb_winpx   ; восстанавливаем пиксели из буферов 1,0 и 3 из NEWCAT
              ld a,(WWinModify.flg_winpx)
              and %11
             ret z
              ld a,%100
              ld (WWinModify.flg_winpx),a
             jr 1F

svb_winpx   ; сохраняем пиксели в буферах страниц 1,0 и 3 на место NEWCAT
              ld a,%111
              ld (WWinModify.flg_winpx),a
              xor a
             jr 2F

ldb_mask    ; восстанавливаем маску из буферов 1,0 и 3 из NEWCAT
               ld a,1
1              ld hl,#EB08   ; [ ex de,hl : ex af,af' ]
              jr 3F
svb_mask    ; сохраняем маску в буферах страниц 1,0 и 3 на место NEWCAT
               ld a,1
2              ld hl,#0000     ; [ nop ]
3              ld de,WinBoof
               rra
              jr nc,4F
               ld de,WinMskBoof
4              ld (.winBoofAdr_),de
               ld a,h
               ld (.ldir),a
               ld (.lex),a
               call svb_screen.setcom

               call suxRAM
               ld hl,WinMskBoof
.winBoofAdr_  EQU $-2
               ld de,#F600
               ld bc,(FullWinSize_)
               ld a,b
               cp #0A
              jr c,.ldir
              jr nz,1F
               inc c
               dec c
              jr nz,1F
.ldir          nop
               ldir
.lex           nop
              ret
1              push bc
               ld bc,#0A00
               call .ldir
               pop bc

               ld de,#F600
               xor a        ; scrpage
               ex af,af'
               ld a,b
               sub #0A
               ld b,a
               cp #0A
              jr c,.svpg
              jr nz,1F
               inc c
               dec c
              jr z,.svpg
1              push hl,bc
               ld bc,#0A00
               call .svpg
               pop bc,hl

               ld de,NEWCAT
               ld a,GUIPage
               ex af,af'
               ld a,h
               add a,#0A
               ld h,a
               ld a,b
               sub #0A
               ld b,a
.svpg          ld a,SuxPage
              jp svb_screen.svpa

;-------------------------------------------------
; reflectors / отражения

bytemirror_     exx          ; переворот байта
                ld c,a       ; Alone Coder procedure
                rlca
                rlca
                xor c
                and %10101010
                xor c
                ld c,a
                rlca
                rlca
                rlca
                rrc c
                xor c
                and %01100110
                xor c
                exx
               ret

mirrbtsa_              ; in de - addr
               ld c,0
.ca_    EQU $-1
               ld hl,(mirrbts_.hL_)   ; l - csx, h - 0

1              push hl
               ld b,0
.b_    EQU $-1
               add hl,de
               push hl   ; next
               dec hl
2              ld a,(hl)
               ex af,af'
               ld a,(de)
               ld (hl),a
               ex af,af'
               ld (de),a
               inc de
               dec hl
              djnz 2B
               pop de
               pop hl
               dec c
              jr nz,1B
              ret

mirrbts_               ; in de - addr
               ld c,0
.c_    EQU $-1
               ld hl,#00FF  ; l - csx, h - 0
.hL_   EQU $-2
1              push hl
               add hl,de
               push hl     ; next
               dec hl

3              ld b,0
.b_    EQU $-1
4              ld a,(hl)
               call bytemirror_
               ex af,af'
               ld a,(de)
               call bytemirror_
               ld (hl),a
               ex af,af'
               ld (de),a
               inc de
               dec hl
              djnz 4B
               pop de
               pop hl
               dec c
              jr nz,1B
              ret


MirrorVert      ; зеркало по вертикали
               ld a,(WinXU.csx)
               ld (mirrbts_.hL_),a
               or a
               rra
              jr nc,1F
               inc a
1              ld (mirrbts_.b_),a
               ld (mirrbtsa_.b_),a
               ld a,(wmbooframka.lsnY)
               ld (mirrbts_.c_),a

               ld a,(WinXU.csy)
               ld (mirrbtsa_.ca_),a

               ld de,WinBoof
               call mirrbts_
               ld de,WinMskBoof
               call mirrbts_
               ld de,WinABoof
               call mirrbtsa_

               ld a,(WinXU.dx)
               ld c,a             ; смещение слева до пикселей
               ld a,(WinXU.dsx)   ; размер в пикселях по x
               add a,c            ; номер последнего пикселя
               cpl
               and 7
               ld (WinXU.dx),a

              jr MirrorHor.e

MirrorHor      ; зеркало по горизонтали
               ld hl,WinBoof
               call reflecHor
               ld hl,(WinXU.csx)
               dec h
               call mulsHL      ; hl= h*l
               ld de,WinABoof
               add hl,de        ; hl - last line , de- first line
               ld a,(WinXU.csy)
               call reflecHor.exx_
               ld hl,WinMskBoof
               call reflecHor
               ld a,(WinXU.dy)
               ld c,a
               ld a,(WinXU.dsy)
               add a,c
               cpl
               and 7              ; смещение до пикселей
               ld (WinXU.dy),a
.e             call wmbooframka
               call WinAmskSet
              jp NormilizeWin   ; WinClipping.eclose

reflecHor      ld a,(WinXU.csx)  ; in hl - boof
               ld (.stpX_),a
               ld (.cnx_),a
               ld e,a
               ld d,0     ; de шаг по x ,
2              ld a,(wmbooframka.lsnY)  ; (WinXU.dsy)
               dec a
              ret z

               ld b,a
               inc a
               push hl
1              add hl,de
              djnz 1B
2              pop de    ; de - adr 1 line, hl - adr last line
.exx_          or a
               rra
               ld c,a      ; счётчик
1              ld b,0
.cnx_    EQU $-1
               push hl
2              ld a,(hl)
               ex af,af'
               ld a,(de)
               ld (hl),a
               ex af,af'
               ld (de),a
               inc hl
               inc de
              djnz 2B
               pop hl
               push bc
               ld bc,#0011
.stpX_  EQU $-2
               or a
               sbc hl,bc
               pop bc
               dec c
              jr nz,1B
              ret

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

wROT90                               ; поворот окна на 90 градусов по часовой стрелке
             ld hl,(WinXU.csx)
             ld a,l
             ld (.rotstXa_),a
             ld (.rotstX_),a
             ld (.rotstX1_),a
             ld (.rotstX2_),a
             ld a,h
             ld (.rotstYa1_),a
             ld (.rotstY1_),a
             ld hl,(WinXU.dsx)
             ld a,h
             cp l
            jr z,1F
             ld a,1
             ld (WinMenu.FtakeIN2),a  ; флаг изменения размеров

1            call dark_and_bf4

             ld de,WinBoof
             call .rot
             call wboofmsk4000
             ld de,WinMskBoof
             call .rot

             ld hl,(WinXU.csx)     ; поворот атрибутов
             call mulsHL      ; hl= h*l
             ld b,h
             ld c,l
             ld de,#4000
             ld hl,WinABoof
             push de,hl
             ldir
             pop de,hl
             ld a,(.rotstXa_)
             ld c,a   ; b=0 after ldir
             ld a,(WinXU.csy)
             dec a
            jr z,3F
1            add hl,bc
             dec a
            jr nz,1B     ; hl - низ
             ld a,(.rotstXa_)
             ld c,a
1            ld b,0
.rotstYa1_ EQU $-1     ; шаг по y -> x
             push hl
2            ld a,(hl)
             ld (de),a
             push de
             ld de,#00FF
.rotstXa_  EQU $-2     ; шаг по х -> y
             or a
             sbc hl,de
             pop de
             inc de
            djnz 2B
             pop hl
             inc hl
             dec c
            jr nz,1B

3            ld hl,(WinXU.csx)
             ld a,l
             ld l,h
             ld h,a
             add a,a
             add a,a
             add a,a
             ld (wmbooframka.lsnY),a
             ld (WinXU.csx),hl

             ld hl,(WinXU.dsx)
             ld b,h
             ld h,l
             ld l,b
             ld (WinXU.dsx),hl

             ld hl,(WinXU.dx)
             ld a,h
             ld h,l
             add a,b
             cpl
             and 7              ; смещение до пикселей
             ld l,a
             ld (WinXU.dx),hl

            jp MirrorHor.e

.rot       ; in de - boof_out
             ld hl,#4000
             ld bc,#00FF
.rotstX_   EQU $-2     ; шаг по х
             ld a,(wmbooframka.lsnY)   ; полный Y по пикселям
             dec a
1            add hl,bc
             dec a
            jr nz,1B     ; hl - низ

             ld c,0
.rotstX1_  EQU $-1     ; шаг по х -> y
1            ld b,8
2            push bc
             push hl
3            ld c,0
.rotstY1_  EQU $-1     ; шаг по y -> x

4            ld b,8

5            ld a,(hl)
             ex de,hl
             and %10000000
.rotmask   EQU $-1
            jr z,6F
             scf
6            rl (hl)
             ex de,hl
             push de
             ld de,#00FF
.rotstX2_  EQU $-2     ; шаг по х -> y
             or a
             sbc hl,de
             pop de
            djnz 5B

             inc de
             dec c
            jr nz,4B

             ld hl,.rotmask
             rrc (hl)
             pop hl
             pop bc
            djnz 2B
             inc hl
             dec c
            jr nz,1B
            ret

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


; Объект спрайты (sprites object) - ластик это был

; x, y, длина (width), высота (heyght),     ;// длина и высота указываются в знакоместах//
; цвет (color) или Nil (здесь любое число), флаг (flag)
; адрес спрайта (sprite addres)
;.Sprts    DB 1,8,1,1,5*8,%11
;           DW .Sprt0
;          DB 3,8,1,1,5*8,%11
;           DW .Sprt1
;          DB 5,8,1,1,5*8,%11
;           DW .Sprt2
;          DB 7,8,1,1,5*8,%11
;           DW .Sprt3
;          DB 9,8,1,1,5*8,%11
;           DW .Sprt4
;         DB #FF

;.Sprt0   DB 128,0,0,0,0,0,0,0
;.Sprt1   DB 248,248,248,248,248,0,0,0
;.Sprt2   DB 255,255,255,255,255,255,255,255
;.Sprt3   DB 112,248,248,248,112,0,0,0
;.Sprt4   DB 60,126,255,255,255,255,126,60
;


