; выбор, загрузка, запись и редактирование текстур   ; /DA
TexturePgn
        DISP PgnAdr

BTexture   ld hl,0
           ld de, .TnotOP
           ld bc,.TT_fillhd
           xor a
          jr 1F
.Pmask     ld a,(Sieve)
           ld (.sieve),a
           ld hl,.FSieve
           ld de,.TopSieve
           ld bc,.TT_mskhd
           ld a,%11
1          ld (.STxtrFlag),a
           ld (.WTxtrFlag),hl
           ld (.T_opADR),de
           ld (.T_HEADADR),bc

           ld ix,.WTexture
           call POPUP
           ld (.spp),sp
.rn        ld a,%1111
.n0        ld ix,.WTexture
.btix    EQU $-2
           ld (ix+6),a
           xor a
           ld (Texture.fsolid),a
           ld hl,#0101
           ld (.EdTSize),hl
           call Win_
           or a
          jr z, .solid
           dec a
          jr z, .sT8
           dec a
          jr z, .sT16
           dec a
          jp z, .edit8
           dec a
          jp z, .edit16
           dec a
          jr z,.cancel  ; пока заглушка / в PMask - режим сита

           ld a,1                 ; a = 1 - texture not select
.exit      ld (Texture.fselect),a  ; 0 - выбрана, 1 - не выбрана
           ld sp,0
.spp     EQU $-2
          jp CLOSE

.cancel     ld a,%1101
           jr .n0
.solid      ld hl,TxBUFF   ; TBUFF
            ld b,32
            ld a,#FF
1           ld (hl),a
            inc hl
           djnz 1B
.exit_       ld (Texture.fsolid),a  ; #FF - solid, #00 - texture
             ld hl,(.WTxtrFlag)
             ld a,h
             or l
            jr z,.exit
             xor a
             ld (.sieve),a
             ld (Sieve),a
            jr .exit

.sT8        call .TXTR8
           jr 1F
.sT16       call .TXTR16
1          jr c,.cancel
            xor a
           jr .exit


.tSelOn     ld c,a
            ld a,(.f8or16)
            or a
            ld a,c
           jr nz,2F            ; go to 16x16
            ld de,BUFF         ; 8x8
            cp 16
           jr c,1F
            ld de,.Texture8
            sub 16
1           add a,a
            add a,a
            add a,a           ;*8
            add a,e
            ld e,a
           jr nc,1F
            inc d
1           ld (.tSeladr),de  ; для редактора
            ld hl,TxBUFF ; TBUFF     ; сюда кладётся текстура 16x16
            call .t8_16
.nCLOSE     call CLOSE
            xor a
            ret

.t8_16      push de      ; делаем из 8x8 16x16
            call .tSel2
            pop de
.tSel2      ld b,8
1           ld a,(de)
            ld (hl),a
            inc l
            ld (hl),a
            inc l
            inc de
           djnz 1B
            ret

2           cp 32                 ; 16x16
           jp nc,.next
            ld de,.Texture16
            add a,a
            add a,a
            add a,a              ; *8
            ld l,a
            ld h,0
            add hl,hl            ; *16
            add hl,hl            ; *32
            add hl,de
            ld (.tSeladr),hl   ; для редактора
            ld de,TxBUFF ; TBUFF     ; сюда кладётся текстура 16x16
            ld bc,32
            ldir
           jr .nCLOSE

.tCLOSE     call CLOSE
            scf
            ret

.TXTR8       ld a,%11
.TXTR8_      ld (.Stxtr8_f),a   ; управление 0-м рядом
             xor a
             ld ix,.WTxtr8
            jr .txtr_
.TXTR16      ld a,1
             ld ix,.WTxtr16
.txtr_       ld (.f8or16),a
             ld (.aix),ix
             call POPUP
.rnx         ld a,%1110
.nx0         ld ix,#0000
.aix     EQU $-2
             ld (ix+6),a
             call Win_
             cp #FF
            jr z,.tCLOSE
             or a
            jr z,.load
             dec a
            jr z,.save
             dec a
             cp 48
            jp c,.tSelOn        ; выбрана ?
            jr z,1F
              ld a,7            ; стандарт
              call .tcolsv
             jr .next
1             call CLOSE
              ld a,(REALRGB)
              ld c,a
              ld a,(MASKRGB)
              ld b,a
              push bc
              ld a,(.t8pos+6)            ; текущие цвета
              ld (REALRGB),a
              call ReMixRgb
              call PRGB2
              ld a,(MASKRGB)
              ld b,a
              ld a,(REALRGB)
              or b
              xor b
              ld c,a
              ld a,(.t8pos+6)            ; текущие цвета
              and b
              or c
              call .tcolsv
              pop bc
              ld a,b
              ld (MASKRGB),a
              ld a,c
              ld (REALRGB),a

             ld a,%1110
            jr .nx0

.tcolsv       ld (.t16pos+6),a
              ld (.t8pos+6),a
              ret

.load       call .adrset
            push de,bc
            call FilerE
            pop bc,hl
           jr c,.next
            ld c,#05
            ld de,(START_SEC)
            call DOS_FUNC_
           jr c,.next
            ld de,.ToName
            call ToName

.next        ld a,%1100
            jp .nx0

.save       call .adrset
            push de,bc
            ld hl,.ToName
            call FNEdit
            pop bc,de
           jr c,.next
            push de,bc
            ld hl,.ToName
            call FromName
            pop de,hl
            ld b,d
            ld c,#0B
            call DOS_FUNC_
           jr .next

.adrset     ld a,0
.f8or16  EQU $-1
            ld de,.Texture8     ; выход de - адрес набора, bc - длина, hl - таблица сортировки
            ld bc,#0100
            ld hl,.sort8
            or a
            ret z
            ld de,.Texture16
            ld b,4
            ld hl,.sort16
            ret


.sort8    DB #00,#01,#FF
.sort16   DB #00,#04,#FF



.T16Cr       ld de,#0101
             call RealWin
             push ix
             ld ix,.t16pos
             ld (ix+0),d
             ld (ix+1),e
             ld de,.Texture16
            jr 2F

.T8Cr       call .bfspr8
            ld de,#0101
            call RealWin
            push ix
            ld ix,.t8pos
            ld (ix+0),d
            ld (ix+1),e
            ld de,BUFF
            ld c,16
            call .T8Cr_
            ld a,(ix+1)
            add a,4
            ld (ix+1),a
            ld de,.Texture8
2           call .T8cr_
            pop ix
           ret

.T8cr_      ld c,32
.T8Cr_      ld hl,0
            ld a,8
           jp WSseries



.bfspr8       ld de,BUFF         ; используем буфер для формирования чанковых спрайтов
              ld hl,.tch1_+4
              ld b,16
1             ld a,14
              cp b
             jr nz,2F
              ld hl,CTB+(14*4)    ; берём чанки с самого яркого
2             push hl
              call .bfs8l_
              pop hl
              push hl
              call .bfs8l_
              pop hl
              dec hl
              dec hl
              dec hl
              dec hl
             djnz 1B
            ret

.bfs8l_       ld c,4
1             ld a,(hl)
              ld (de),a
              inc hl
              inc de
              dec c
             jr nz,1B
            ret

.tch1_       DB #FF,#FF,#FF,#DD      ; пропущенный в чанках блок с 1-й пустой точкой
             DB #FF,#FF,#FF,#FF


.edit16      call .TXTR16
            jp c, .cancel
.edit16_     ld bc,32
             ld a,#02
            jr .edit_

.edit8       call .TXTR8
            jp c, .cancel
.edit8_      ld a,#01
             ld bc,8
.edit_       ld de,.edBuf
             ld h,a
             ld l,a
             ld (.EdTSize),hl
             ld hl,0
.tSeladr EQU $-2         ; адрес выбранной текстуры
             ldir

             push ix
.edt0        ld hl,.WTxtrED
             call SPEdit
             cp 4
            jr c,.edt1
            jr z,.ed8_16
             cp 5
            jr z,.ed_slot

             call CLOSE
             pop ix
            jp .cancel

.ed8_16       call CLOSE
              pop ix
              ld de,.edBuf
              ld hl,BUFF
              ld (.tSeladr),hl
              ld a,(.EdTSize)
              dec a
             jr nz,.ed16_8
              call .t8_16     ; 8x8 -> 16x16
             jr .edit16_
.ed16_8        ld b,8         ; 16x16 -> 8x8
1              ld a,(de)
               inc e
               inc e
               ld (hl),a
               inc l
              djnz 1B
             jr .edit8_

.ed_slot       push ix
               ld a,(.EdTSize)
               dec a
              jr z,1F
               call .TXTR16
               ld bc,32
              jr 2F
1              ld a,%00       ; блокируем 0-й ряд
               call  .TXTR8_
               ld bc,8
2              pop ix
              jr c,.Enext
               ld de,(.tSeladr)
               ld hl,.edBuf
               ldir
              jp  .Enext

.edt1          ld hl,.edBuf
               ld c,a
               ld a,(.EdTSize)
               ld b,8
               dec a
              jr z,1F
               ld b,32
1              inc c
               dec c
              jr z,.clean
               dec c
              jr z,.invert

               push ix
               push bc
               call SWAP_SCR
               ld hl,(ARW_XC)
               ld (.EdPut),hl
               ld hl,(.EdTSize)
               ld (.EdPut+2),hl
               ld ix,.EdPut
               xor a
               call Ramka8
              jr nc,1F
               pop bc
              jr .Enext_
1              ld de,(.EdPut)
               call RASCH_
               ld a,h
               or #C0
               ld h,a
               ld de,.edBuf
               pop bc
               dec c
              jr z,.take
               dec c
              jr z,.put

.Enext_        call SWAP_SCR
                pop ix
.Enext         ld a,%1101
               ld (ix+6),a
              jp .edt0

.clean         xor a
1              ld (hl),a
               inc hl
              djnz 1B
              jr .Enext
.invert
1              ld a,(hl)
               cpl
               ld (hl),a
               inc hl
              djnz 1B
              jr .Enext
.take          call SaveWS
              jr .Enext_
.put           call LoadWS
              jr .Enext_




.t16pos      DB 1,1,2,2,3,3,7
.t8pos       DB 1,1,1,1,2,2,7 ; параметры для печати спрайтов.

.tcolb       DB 0,0     ; буфер сохранения цветов

.ToName      DB "noname  txr"
.edBuf     DS 32

.WTexture    DB 0,0,9,11,5*8,5,%1111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
             DB 0
             DW .TTexture
             DW .STexture
          ;   DW Nil         ; (hotkeys)
             DW 2   ; пропуск  ; DW Nil         ; (buttons object)
.WTxtrFlag   DW Nil         ; .FSieve ; (Flag )
             DW #FFFF

.TTexture    DB #0A
.T_HEADADR   DW .TT_fillhd : DB 13
             MSG_TXTR_solid : DB 13
             DB #0A : DW .TT_8or16
             DB 15,13,#0A
.T_opADR     DW .TnotOP
             DB 15,13," "
             MSG_TXTR_edit : DB 13
             DB #0A : DW .TT_8or16
             DB 0

.TT_fillhd   MSG_Txtr_Fill : DB #FF
.TT_mskhd    MSG_Txtr_Pmsk : DB #FF
.TT_8or16    DB "8*8   16*16",0
.TnotOP      DB " ",0
.TopSieve    MSG_Txtr_Sieve : DB 0

.STexture    DB 1,3,7,1,%11   ; 0 solid
             DB 1,4,3,1,%11   ; 1 8x8
             DB 4,4,4,1,%11   ; 2 16x16
             DB 1,9,3,1,%11   ; 3 edit 8x8
             DB 4,9,4,1,%11   ; 4 edit 16x16
             DB 1,6,7,1,%00   ; 5 - Sieve or ?
.STxtrFlag  EQU $-1           ; выключатель для опции 'сито' или ???
             DB #FF

 ; объект-флажок (switch)
.FSieve      DB 7,6,5,#00
.sieve   EQU $-1
             DW  .sieveEX
             DB #FF

.sieveEX     ld a,(.sieve)
             ld (Sieve),a
            ret


.WTxtr8      DB 0,0,17,16,5*8,5,%1110
             DB 0
             DW .TTxtr8
             DW .STxtr8
             DW .HTxtr             ; горячие клавиши
             DW #0004
             DW .T8Cr              ; вызов при создании
             DW #FFFF


.WTxtr16     DB 0,0,25,16,5*8,5,%1110
             DB 0
             DW .TTxtr16
             DW .STxtr16
             DW .HTxtr             ; горячие клавиши
             DW #0004
             DW .T16Cr             ; вызов при создании
             DW #FFFF


.TTxtr16     DB #16,1,11,13,15,13
             MSG_DISK_Load
             DB #17,9, "RGB+ [C]",13
             MSG_DISK_Save
             DB #17,9, "RGB- [X]"
             DB 0

.STxtr16     DB 1,13,7,128+2,%11   ; load, save
             DB 1,1,128+24,12,%11,3,3,2,2,32
             DB 0,0,1,128+16,%00   ; просто пропуск 16 номеров, для синхронизации горячих клавиш
             DB 10,13,6,128+2,%11   ; 50,51 - RGB , res.RGB
             DB #FF

.HTxtr       DB "C",0
             DW  50                ; rgb
             DB "X",0
             DW  51                ; стандартные rgb
             DB #FF

.TTxtr8      DB 13,13,13,15
             DB #0A : DW .TTxtr16
             DB 0

.STxtr8      DB 1,13,7,128+2,%11   ; load, save
             DB 1,1,128+16,4,%11,2,2,1,1,16
.Stxtr8_f EQU $-6               ; флаг выбора 0-го ряда
             DB 1,5,128+16,8,%11,2,2,1,1,32
             DB 10,13,6,128+2,%11   ; 50,51 - RGB , res.RGB
             DB #FF


.WTxtrED  DB 0,0  ; X,Y окна (X,Y of window)
          DB 16       ; ширина (width)
          DB 14       ; высота (height)
          DW .edBuf   ; адрес редактирования спрайта текстуры
          DW #0703    ; X,Y окна редактора (X,Y of editor window)
.EdTSize  DW #0101    ; размеры спрайта (sprite size)
          DW #0103    ; X,Y preview
          DW .EdText  ; текст (text)
          DW .EdSel   ; подсветка (highlighting)
          DW Nil      ; горячие клавиши (hotkeys)

.EdText   MSG_Txtr_Edit : DB 13
          DB 22,1,6
          MSG_EDITS_Clean : DB 13
          MSG_EDITS_Invert : DB 13
          MSG_EDITS_Take : DB 13
          MSG_EDITS_Put : DB 13,13
          DB "8 <-> 16",13
          MSG_EDITS_Slot
          DB 0

.EdSel    DB 1,6,5,128+4,%11
          DB 1,11,5,128+2,%11
          DB #FF

.EdPut    DB 10,10,1,1
 ;************************************************************************************
.Texture8    INCBIN "bgetxr.t8"   ; текстура 8x8  256 bytes

.Texture16   INCBIN "bgetxr.t16"  ; текстура 16x16  1024 bytes



LTexture   EQU $-BTexture
           ENT
           DISPLAY "Texture len   :",/a,LTexture
