; 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


NormilizeWPUT   xor a
                ld (WinMenu.outWmod_),a
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     xor a
                ld (.flPM_),a
                call svb_mask

.n0             ld a,128+%1011
.n1             ld ix,WWinClipping
                ld (ix+6),a
.flPM_ EQU $+1 : ld a,0
                 or a
                jr z,1F
                 ld a,4
1                inc a
                 ld (WWinClipping.colbox),a
                call Win_
                cp 2
               jr nc,1F
                ld (.flPM_),a
                ld de,#0103
                ld bc,#0901
                ld a,6*8
                call SetV
                ld a,128+%1001
               jr .n1
1               ld e,a
                call suxRAM
                ld a,e
                inc a   ; cp #FF
               jr z,NormilizeWPUT   ; EXIT
                dec e
                dec e
                sub 9   ; 2+6+1
               jr nc,1F
                call AutoMask   ; in e
               jr 2F
1               ld bc,.WCltab
                call TAB_JP

2               call .outWinBoof_
               jr .n0

;.exit_cut       call NormilizeWPUT
.outWinBoof_    call SuxRam
                ld a,6
                ld (WinMenu.outWmod_),a
                call wmbooframka        ; WinClipping.outWinBoof_
                call WinAmskSet
                call WinMenu.outWinBoof
                xor a
                ld (WinMenu.outWmod_),a
               ret
; режим вывода при обрезке
.sCUTPUT       call .ClippingPUT

.lCUTPUT   EQU $-.sCUTPUT

.ClippingPUT           ; вывод окна при обрезке
                push bc
                call wnCNK_curbyte  ;.CNK_curbyte      ; a - байт чанка
                ld c,(ix+0) ; маска
                and c
                ld b,a
                ld a,c
                cpl
                and (ix+34)  ; данные спрайта
                or b
                pop bc
               ret

.WCltab        DW CleanMask      ; 0  /8 - clear mask
               DW ldb_mask       ; 1  /9 - reset
               DW .mskLoupe_     ; 2  /10 - mask loupe        ; \ buttons
               DW .cutsbr1_      ; 3  /11 but 0 - brush
               DW .cutsbr1_      ; 4  /12 but 1 - brush
               DW .cutsbr1_      ; 5  /13 but 2 - brush
               DW .cutsbr1_      ; 6  /14 but 3 - brush
               DW .CutEXcnknum_  ; 7  /15 смена чанка бордюра вперёд
               DW .CutEXcnknum_  ; 8  /16 смена чанка бордюра назад


.CutEXcnknum_
                 sub 7
                jp EXcnknum_  ; смена чанка фона


.cutsbr1_     sub 3
              add a,a  ; *2
              ld c,a
              add a,a ; *4
              add a,a ; *8
              add a,c ; *10
              ld c,a
              ld b,0
              ld hl,SprBrCut_
              add hl,bc
              ld c,(hl)
              inc hl
              ld b,(hl)
              inc hl
              ld (ARW_XDISP),bc
              ld de,WCUTARWSPR
              ld (ARW_ADR),de
              ld b,8
1             inc de
              ld a,(hl)
              inc hl
              ld (de),a
              inc de
             djnz 1B

              call .outWinBoof_

              call .obrsmesh_

.cutdrawS_    call NOKEY_

.ldraw
              ld hl,.hotKeysCut_
              ld (.ldrsp),sp
              call ARW_SCN_
             jp c,ARW_DEFAULT_  ; .cbrexit

.ldrsp EQU $+1 : ld sp,#0000

              ld a,(.flPM_)  ; режим обработки маски
              or a
              ld a,#20    ; [ jr nz,** ]
             jr z,1F
              ld a,#28    ; [ jr z,** ]
1             ld (.j_nz_z_),a

              ld bc,#A8A9        ; b=[xor b] ; c=[xor c]
              ld a,(Fire2)
              or a
.j_nz_z_     jr nz,1F            ; [ jr nz,** ] / [ jr z,** ]
              ld bc,#0000        ; b=c=[nop]

1             ld a,b
              ld (.nopxorb_),a
              ld a,c
              ld (.nopxorc_),a

              ld hl,(ARW_X)


.lbc_ EQU $+1 :  ld bc,#0000   ; обратное смещение
              call .skghty_

              ld a,c
              cp 8
             jr nc,.ldraw
              ld (.lftRoll_),a

1

              ld a,b
              cp 8
             jr nc,.ldraw

              ld ix,WCUTARWSPR+1
              add a,a
              ld e,a
              ld d,0
              add ix,de
              ld a,8   ; вообще то 10, но больше 8-ми не используется
              sub b
              ld b,a


              push hl
              exx
              pop hl
.lnbc_  EQU $+1 : ld bc,#0000
              ld a,l
              add a,c
             jp c,.ldraw
              ld e,a
              ld a,h
              add a,b
             jp c,.ldraw
              ld d,a
              call PixHL
              exx              ; HL' - адрес вывода на экран

              ld a,l
              and 7
              ld (.rgtRoll_),a          ; смещение курсора вправо
              xor l
              ld e,a
              ld d,h
              rrca : rrca : rrca   ; cx

.acsx0_  EQU $+1 : ld c,0
              cp c
             jp nc,.ldraw
              dec c
              cp c
              ld c,a
              ld a,0    ; [nop]
             jr z,1F
              ld a,#77  ; [ld (hl),a]
1             ld (.ldhlanop2_),a
              ld (.ldhlanop3_),a

              push hl,bc
              ld b,0
              ld hl,BmBUFF
              add hl,bc
              ld a,(hl)
              ld (.bufmsk1_),a
              inc hl
              ld a,(hl)
              ld (.bufmsk2_),a
              pop bc,hl

.loo01_
.amaxY_ EQU $+1 : ld a,0
              cp d
            jp c,.ldraw
              inc d
              ld a,(WinXU.dy)
              cp d
            jr nc,9F
              dec d
              push bc,de
              ld h,d
.acsx_ EQU $+1 : ld a,0  ; ld a,(WinXU.csx)
              call MULS         ; hl = a*h

              ld b,high WinMskBoof
              add hl,bc             ; адрес в маске

.rgtRoll_ EQU $+2 : ld bc,#0000
                ld a,(ix+0)
                inc b
                or a
                rla
1               rra : rr c
               djnz 1B

.lftRoll_ EQU $+1 : ld b,0
                inc b
                dec b
               jr z,2F

1               sla c
                rla
               djnz 1B
2

                ld b,a
                ld a,(hl)
                or b
.nopxorb_       nop           ; [nop]/[xor b]    WinClipping.nopxorb_
.bufmsk1_  EQU $+1 : or 0
.ldhlanop0_      ld (hl),a
                 ex af,af'
                 push hl
                 ld a,h
                 sub 27
                 ld h,a
                 ld a,(hl)     ; данные спрайта
                 pop hl
                 inc hl
                  exx
                  ld e,a
                  call wnCNK_curbyte  ; .CNK_curbyte
                  ld d,a     ; байт чанка
                  ex af,af'  ; a - mask
                  ld b,a
                  and d
                  ld c,a
                  ld a,e   ; накладываем маску
                  or b
                  xor b
                  or c
.ldhlanop1_       ld (hl),a
                  inc l
                  exx

                ld a,(hl)
                or c
.nopxorc_       nop           ; [nop]/[xor c]
.bufmsk2_  EQU $+1 : or 0
.ldhlanop2_      ld (hl),a     ; [ld (hl),a]/[nop]
                 ex af,af'
                 push hl
                 ld a,h
                 sub 27
                 ld h,a
                 ld a,(hl)     ; данные спрайта
                 pop hl

                  exx
                  ld e,a
                  ex af,af'   ; a - mask
                  ld b,a
                  and d   ; байт чанка
                  ld c,a
                  ld a,e   ; накладываем маску
                  or b
                  xor b
                  or c
.ldhlanop3_       ld (hl),a
                  dec l
                  exx

               pop de
               pop bc
               inc d
9              inc ix
               inc ix
                exx
                call INC_Y
                exx
             djnz .loo01_

             jp .ldraw

.obrsmesh_    ld de,(WinXU.csx)   ;   e=csx , d=csy
              ld a,e
              ld (.acsx_),a
              ld (.acsx0_),a
              ld a,(WinXU.dy)
              ld h,a
              ld a,(WinXU.dsy)
              add a,h
              ld (.amaxY_),a            ; конечный Y

              ld bc,#0000
              ld a,e            ; смещение, если отображение на знакоместо смещено
              cp 32
             jr nc,1F
              ld c,8
1             ld a,d
              cp 24
             jr nc,1F
              ld b,8
1             ld (.lnbc_),bc
              ld hl,(ARW_XDISP)
              ld a,c
              add a,l
              ld l,a
              ld a,b
              add a,h
              ld h,a            ; hl - обратное смещение
              ld (.lbc_),hl


.skghty_      ld a,l     ; in: hl - координаты привязки курсора ; bc - обратное смещение спрайта курсора
              sub c
              ld c,0
             jr nc,1F
              neg
              ld c,a
              xor a
1             ld l,a
              ld a,h
              sub b
              ld b,0
             jr nc,1F
              neg
              ld b,a
              xor a
1             ld h,a         ; out: hl - координаты начала курсора; bc - смещение спрайта курсора вверх/влево
             ret


.keyBpress      xor a
               jr 1F
.keyNpress      ld a,1
1               call EXcnknum_  ; WinMenu.EXcnknum_0
.keyReturn      ld sp,(.ldrsp)
                call .outWinBoof_
               jp .cutdrawS_

.key12press      sub "1";-32
                jr 1F
.switch          ld a,(.flPM_)
                 xor 1
1                ld (.flPM_),a
                 call NOKEY_gui   ; т.к. уже в  GUI
                ret

.HKcut_         DB "B"
                DW .keyBpress
                DB "N"
                DW .keyNpress
                DB "X"
                DW .switch
                DB "1";-32
                DW .key12press
                DB "2";-32
                DW .key12press
               DB 0

.hotKeysCut_    ld a,#FE
                in a,(#FE)
                rra : rra
               jr c,1F
                ld a,1                  ; при Z - клавиши Fire2    WinClipping.hotKEYS_
                ld (Arw_Lp.faddF2_),a
               ret
1               ld hl,.HKcut_
.hotKEYS_
                push hl
                call REDEF_gui
                pop hl
1               ld a,(hl)
                or a
               ret z
                ld a,(KEYS)
                cp (hl)
                inc hl
               jr z,2F
                inc hl
                inc hl
               jr 1B
2               ld c,a
                ld a,(hl)
                inc hl
                ld h,(hl)
                ld l,a
                ld a,c
               jp (hl)

.mskLoupe_       ; минилинза для маски
                 call .outWinBoof_
                 ld de,WinCutLoupe
                jp WinMenu.MColSelB_



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


.Txt         MSG_WIN_MakeMSK : DB 13             ; Маска /заголовок

             DB #0A : DW .wTXTbrs_


             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_DeleteMSK : DB 13,15,13

             DB #0A : DW WinTxtReset                   ; Сброс
            DB 0



.Sel
             DB 1,3,3,1,%11        ; 0 - '-'
             DB 5,3,3,1,%11        ; 1 - '+'
             DB 1,8,2,128+2,%11    ; 2 - l1 ,1 - w1
             DB 4,8,2,128+2,%11    ; 4 - l2 ,3 - w2
             DB 7,8,2,128+2,%11    ; 6 - l3 ,5 - w3
             DB 1,11,9,1,%11       ; 8 - clear mask
             DB 1,13,9,1,%11       ; 9 - reset
            DB #FF

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

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

.buts      DB 96+5,64+1,128+32+5,1,1,8*5,%11     ; 10-13 in option
.Adrs
            DUP 5 ;8
             DW ($-.Adrs)*5+SprLinzCut_   ;SprBrCut_+2
            EDUP
           DB #FF

.wTXTbrs_    DB "1 -",#17,4,"2 +",13,13,13,15,0

WCUTARWSPR    DB #FF,00,#FF,00,#FF,00,#FF,00,#FF,00
              DB #FF,00,#FF,00,#FF,00,#FF,00,#FF,00

SprLinzCut_   DB 112,136,200,248,116,14,6,0

SprBrCut_
              DB 2,2,0,112,112,112,0,0,0,0
              DB 3,3,255,255,255,255,255,255,255,255
              DB 3,3,0,56,124,124,124,56,0,0
              DB 3,3,60,126,255,255,255,255,126,60





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  теперь в 'Utils1.asm' /DA


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

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 / отражения


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

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



