; Модуль для создания и использования набора спрайтов
            ORG PgnAdr


SpriteS    call SV_UNDO
           ld (.sp),sp
           call .SprOvSvPg
           call SPSini
          jp c,.SprOvSvPg
.n0        call LoadScr_CLW
           ld a,128+%1111
.n1        ld ix,WSprites
           ld (ix+6),a
           ld sp,0
.sp  EQU $-2
           call BarIni
           ld hl,TSpr.SprLST
           ld a,0
.flBar   EQU $-1     ; флаг выхода от ползунка
           or a
          jp nz,.conta__   ; пропускаем перерисовки и иниты

          ; иниты
           ld de,TSpr.free
           ld hl,(freeB)

           call GetNumHL
           ld a,(vsego)
           push af

           ld de,TSpr.all
           call GetNumA
           ld a,#FF
           ex af,af'
           pop af
           ld bc,0
           or a
          jr z,1F
           ld de,TSpr.SprNum
           ld a,(SprNum)
           call GetNumA
           call SeachTek
1          ld (Sz_X),bc
           ld c,a
           ld e,45   ; "-"
           ld d,43   ; "+"
           ld a,e
           bit 0,c
          jr z,1F
           ld a,d
1          ld (TSpr.Px),a
           ld a,e
           bit 2,c
          jr z,1F
           ld a,d
1          ld (TSpr.Atr),a
           ld a,e
           bit 1,c
          jr z,1F
           ld a,d
1          ld (TSpr.Msk),a
           ld a,e
           bit 3,c
          jr z,1F
           ld a,d
1          ld (TSpr.ATrn),a
           ex af,af'         ; a=Atr mask
           push af
           ld hl,TSpr.ATmskH
           call GET_HEXa_
           pop af
           inc a
           ld a,d
          jr nz,1F
           ld a,e
           dec hl
           ld (hl),a
           dec hl
           ld (hl),a
1          ld (TSpr.ATmsk),a
           ld hl,(Sz_X)
           ld a,7
           cp h
          jr nc,1F
           ld h,a
1          cp l
          jr nc,1F
           ld l,a
1          ld a,h
           or l
          jr nz,1F
           inc h
           inc l
1          ld (SSpr.view+2),hl
           ld (SSpr.view+7),hl
           ld hl,TSpr.sx
           call SXprint
           ld hl,TSpr.sy
           call SYprint

           ld hl,TSpr.pause_
           call prnPause
           ld hl,TSpr.Xframe_
           call prnFrmX
           ld hl,TSpr.Yframe_
           call prnFrmY
           call prnFrmAll


         ; первые иниты закончены
           call NOKEY_
           ld hl,TSpr
.conta__   ld (WSprites.T),hl

          ; иниты без пропуска
           call FtoScr.s

           ld a,Winn
           call GUI
           ld e,a
           cp #FF
         ; jp z,ReWin ;ERASE_ALLW
          jp z,.EXIT_
           call NOKEY_
           ld a,(But)
           inc a
          jr nz,.selBut_
           ld a,e
           ex af,af'
           ld a,e
           ld bc,.TBsprt100
           sub 100              ; доп. опции
          jr nc,1F
           ld a,e
          cp StSprNum
          jr nc,.selNUMspr
           ld bc,.TBsprt
1          call TAB_JP
.return    ld a,128+%1101      ; окно не перерисвывать
          jp .n1
.return_   call CLOSE      ; закрыли последнее окно
          jr .return
.barS      ld a,1          ; убираем лишнюю перерисовку
           ld (.flBar),a
.Ret      ret


.selNUMspr  sub StSprNum
            ld d,a
            ld a,(posBar)
            add a,d
.selNumA    call .selNumA_
           jr .return

.selNumA_   push af
            ld c,a
            call ToScrMenu.s_mode_   ; ставим галки на флажки
            ld a,c
            call SeachSPR       ; поиск спрайта в наборе
            pop de           ; d - number of spr
           ret c
            ld a,d
            ld (SprNum),a    ; номер
            ld a,(posBar)
            cp d
           jr c,2F
            ld a,d
1           ld (posBar),a
           ret
2           add a,12      ; количество позиций спрайтов в прокрутке
            cp d
           ret nc
            ld a,d
            sub 12
           jr 1B

.selBut_    ld c,a
            ld a,(SprNum)
            inc a
            dec c          ; <-
           jr nz,1F
            dec a
           jr z,.selNumA
            dec a
           jr .selNumA
1           dec c          ; ->
           jr z,.selNumA
            dec c
           jr z,.selScr
            ; if other buttons
           jr .return

.AttrMview     ld a,(CreatWspr.Fl_AMV_)
               cpl
               ld (CreatWspr.Fl_AMV_),a
              jp NOKEY_

.selScr_nret   pop af
.selScr          ; выбор экрана
            call SwapSCRS
           jp  .n0

.EXIT_       call ReWin
.SprOvSvPg   ld a,(ExtMem)
             or a
            ret z
             ld hl,#C000
             ld d,h
             ld e,l
             ld bc,#4000
             ld a,ovSPRTpg
             call ExOnP_AddP
            jp RAM_N


.TBsprt
            DW  LoadSPS           ;  0 open
            DW  SaveSPS           ;  1 save
            DW  New               ;  2 new
            DW  Driver            ;  3 disk
            DW  Cut_menu          ;  4 cut
            DW  ToEnd             ;  5 move ;5 to end >>
        ;    DW  AtEnd             ;  6 last <<
            DW  CopyEnd           ;  6 copy ;7 copy to end >>
            DW  Delete            ;  7 delate ; 8 delete
            DW .Ret               ;  8
            DW .Ret               ;  9 cls animation flag
            DW .Ret               ;  10  pix flg for out
            DW .Ret               ;  11  msk flg for out
            DW .Ret               ;  12  atr flg for out
            DW  ToScrMenu.Smode   ;  13  output mode
            DW  ToScrMenu         ;  14 to screen
            DW  BG_color          ;  15 background color
            DW  BG_chg            ;  16 bg0
            DW  BG_chg            ;  17 bg1
            DW  BG_chg            ;  18 bg2
            DW  BG_chg            ;  19 bg3
            DW  BG_chg            ;  20 bg4
            DW  viewS             ;  21 view sprite
            DW  viewS             ;  22 view mask
            DW  viewS             ;  23 view combination
            DW  .AttrMview        ;  24 Attr mode view
            DW  Animation.clearYN ;  25 frame options
            DW  Animation.selFrmN ;  26 frame select
            DW  Animation.selXY   ;  27 select frame pos.
            DW  Animation.edPause ;  28 edite pause of frame
            DW  Animation.addFRM  ;  39 add frame to end
            DW  Animation.ani     ;  30 animation
            DW  Animation.updFRM  ;  31 update frame
            DW  Animation.insFRM  ;  32 insert frame
            DW  Animation.delFRM  ;  33 delete frame
            DW  aEdposX           ;  34 edit frame pos. X
            DW  aEdposY           ;  34 edit frame pos. Y
            DW  aSetPauses        ;  35 set pause for all frames

.TBsprt100  DW .Ret               ; 100 выход для подпрограмм
            DW .selScr_nret       ; 101 смена экранов


        INCLUDE "SprsCut.asm"     ; Функции вырезалки  call Animation.clear


BG_color     ; выбор цвета фона
              call PRGB2
              call GetATR
              ld (BgAtr),a
             ret
BG_chg       ; смена спрайта фона
              ex af,af'
              sub OpBg0num_  ; bg0
              add a,a
              add a,a
              add a,a
              ld c,a
              ld b,0
              ld hl,BgSprts
              add hl,bc
              ld (CreatWspr.BackFill),hl
             ret

viewS        ld a,(vsego)
             or a
            ret z
             ex af,af'
             ld hl,(CreatWspr.pixOUT)
             ld (.apx),hl
             ex de,hl
             ld hl,(CreatWspr.mskOUT)
             ld (.apm),hl
             sub OpViewN_
             ld (.a),a
            jr z,1F      ; spr
             dec a
            jr nz,1F     ; comb
             ex de,hl    ; msk
1            ld a,d
             or e
            ret z

             call Sw_aretS
             ld a,(BgAtr)
             call cls_a
             ld a,0
.a       EQU $-1
             cp 2
             push af
            jr nz,1F
             ld de,#4000  ; заполнение экрана фоном
             call fil_
             ld de,#4800
             call fil_
             ld de,#5000
             call fil_
1            ld bc,(Sz_X)     ;  size
             ld a,c
             ld (SPRT.dXbyte),a
             ld (SPRT.dXbyte_),a

              call ramAdd

              pop af
              push af
              cp 1
             jr z,2F
              ld hl,SPRT.Aput
.pAt_     EQU $-2
              or a
             jr nz,1F
              ld (SPRT.modeA),hl
              ld a,(CreatWspr.Fl_AMV_)
              or a
             jr nz,2F
1             ld de,#5821
              ld a,23
              call .adrmv
              ld hl,(CreatWspr.atrOUT)
              ld a,h
              or l
             jr z,2F
              ld a,b
              push bc
              call SPRT.putA_
              pop bc

2             ld a,(Sz_Y)
              add a,a
              add a,a
              add a,a
              ld b,a
              pop af
              ld de,SPRT.Mand
              ld hl,0
.apm   EQU $-2
              cp 1
             jr z,2F
              call .otS
              ld de,SPRT.Mor
              ld a,h
              or l
1             ld hl,0
.apx   EQU $-2
             jr nz,3F
2             ld de,SPRT.Mput
3             call .otS
              call pausa_
              ld a,WAITKEY
              call GUI
              call pausa_
              ld a,NOKEY
             jp GUI

.otS          push af
              ld a,h
              or l
             jr nz,1F
              pop af
             ret
1             ld (SPRT.mode),de
              push hl
              push bc
              ld de,#4021
              ld a,23*8
              call .adrmv
              ld a,b
              call SPRT.put_
              pop bc
              pop hl
              pop af
             ret

.adrmv         cp b
             jr nc,1F
              res 5,e
1             ld a,c
              cp 32
             ret c
              res 0,e
             ret


fil_         ld c,0
1            ld b,8
             ld hl,(CreatWspr.BackFill)
             push de
2            ld a,(hl)
             inc hl
             ld (de),a
             inc d
            djnz 2B
             pop de
             inc e
             dec c
            jr nz,1B
           ret

Ch_lst_        ld a,(vsego)   ; проверка является ли последний текущим
               or a
              ret z
               dec a
               ld c,a
               ld a,(SprNum)
               cp c           ; out : c - last num , a - [SprNum]
              ret

Sw_aretS       pop de  ; адрес возврата
               ld hl,SpriteS.n0
               ex (sp),hl
               push de
              jp ERASE_ALLW

to_swp_        push de     ; кидаем выбранный спрайт-модуль в свапку
               push hl
               push bc
               ex de,hl
               ld de,#6000
               ldir
               pop bc
               pop hl
               pop de
              ret


AtEnd         ; перемещение последнего в текущ.
               call Ch_lst_
              ret z
               ld (.num),a
               push bc
               call SeachThl     ; de - начало текущего модуля, остальное не важно
               pop bc
              ret c
               ld a,c           ; номер последнего
               ld (SprNum),a
               ld (.de_s),de
               call Sw_aretS
               call SeachThl
              ret c
               exx
               call swapR_
               exx
               call to_swp_      ; в свапе последний  de - начало последнего, hl - lastbyte,  bc - длина модуля
               ld a,0
.num     EQU $-1
               ld (SprNum),a
               ex de,hl      ; hl - начало последнего
               ld de,0
.de_s    EQU $-2            ; de - начало текущего
               push de
               push bc
                push hl
                push hl
               or a
               sbc hl,de     ; длина перемещения
               ex (sp),hl    ; hl - lastbyte (sp) - длина перемещения
               add hl,bc
               ex de,hl      ; de - new lastbyte
                pop bc       ; длина перемещения
                pop hl       ; начало последнего
               push de
               dec de
               dec hl
               lddr
               pop hl
               ld (hl),0
               pop bc
               pop de
               ld hl,#6000
               ldir
              jr ToEnd.e

ToEnd         ; перемещение текущего в конец набора
               call Ch_lst_
              ret z
               call Sw_aretS
               call SeachThl
              ret c
               exx
               call swapR_
               exx
               call to_swp_
               push bc
               call D_last
               pop bc
               ld hl,#6000
               ldir
               xor a
               ld (de),a
.e             exx
               call swapR_
               exx
              jr End_norm

CopyEnd        ; копирование текущего в конец набора
               call SeachThl
              ret c
               ld hl,(freeB)
               sbc hl,bc
              jp c,Errmem     ; мало памяти
               ld hl,(lastByte)
               call D_last.z
              jr End_nul

D_last         ex de,hl
               push hl
               ld hl,(lastByte)
               or a
               sbc hl,de
               ld b,h
               ld c,l
               pop hl
.z             ex de,hl
               ld a,b
               or c
              ret z
               ldir
              ret

Delete         ; удаление текущего спрайта
               call SeachThl
              ret c
               call D_last
End_nul        xor a
               ld (de),a
End_norm       ld a,(SprNum)
               push af
               call SPSini_
               pop af
               inc a
               ld c,a
               ld a,(vsego)
               or a
              ret z
1              dec c
               push bc
               ld a,c
               call SeachSPR
               pop bc
              jr c,1B
               ld a,c
               ld (SprNum),a
          ;     call Animation.clear
              ret

SeachThl       call SeachTek   ;  out: de - начало всего модуля, hl - адрес след. модуля, bc - длина модуля
              ret c            ; scf - error
               dec hl
               dec hl
               dec hl
               dec hl      ; на начало всего модуля спрайта
               ex de,hl        ; de адрес начала модуля
               exx
               push de        ; адрес след.
               exx
               pop hl         ; hl - адр. след.
               push hl
               or a
               sbc hl,de
               ld b,h
               ld c,l
               pop hl
              ret

SeachTek       ; поиск параметров текущего спрайта
               ld a,(SprNum)
SeachSPR       ; поиск спрайта в наборе  (выставляет страницу AddPage )
               ; in a - number of sprite
               ; out  hl - addres spr +4 (without flags & attr mask & size), a - flags , a' - attr mask ,
               ;      bc - size spr (b=sY c=sX) ,  bc' - bytes size attr,
               ;      de - bytes size pixel/mask, de' - addres for next number sprite
               ;
               ;     scf - for error

               ld e,a
               ld d,#FF   ; counter
               ld a,(vsego)
               or a
              jr z,1F            ; to >> scf : ret
               cp e
              jr c,1F
              jr z,1F

               call ramAdd
               ld hl, #C004
.l0            inc d
               ld a,h
               or l
              jr z,1F
               ld a,(hl)
               or a
              jr nz,2F
1              scf
              ret
2              inc hl
               ex af,af'
               ld a,(hl) ; amask
               ex af,af'
               inc hl
               ld c,(hl)  ; sX
               inc hl
               ld b,(hl)  ; sY
               inc hl
               push bc
               push af
               push hl
               push de
               push bc
               pop hl
               call CSprSize
               ld (.a01_),de
               ld (.a02_),bc
               push bc
               exx
               pop bc
               exx
               pop hl
               ld a,h
               cp l
              jr nz,1F
               pop hl
               pop af
               push af
               push hl
               call .na_
               push hl
               exx
               pop de
               exx
               pop hl
               pop af
               pop bc
               or a    ; res scf
              ret
1              ex de,hl
               pop hl
               pop af
               call .na_
               pop bc
              jr .l0

.na_           ld bc,0
.a01_    EQU $-2
               bit 0,a
              jr z,1F
               add hl,bc
1              bit 1,a
              jr z,1F
               add hl,bc
1              ld bc,0
.a02_    EQU $-2
               bit 2,a
              ret z
               add hl,bc
              ret

LoadSPS       ld a,(vsego)
              or a
             jr z,1F
              call ASK
             ret nz
1             ld hl,SrtSPS_
              call FilerE
             ret c
          ;    call Animation.clear
              ld a,(SEC_LEN)
              ld b,a
              cp 65
             ret nc
              ld hl,#8000    ; буфер
              ld de,#C000    ; куда грузить
              ld c,#05       ; загрузка
              ld ix,(START_SEC)
              ld a,AddPage
              ex af,af'
              ld a,SL_BANK   ; загрузка в страницу через свап
              call GUI
             jr c,1F     ; error
              ld hl,(BYTES_LEN)
              ld de,#C000
              add hl,de
              ld (hl),0
              ld de,SPSname
              call ToName
1             call SPSini_
             ret

SaveSPS       ld a,(vsego)
              or a
             ret z
              ld de,SPSname
              ld hl,SrtSPS_
              call FNSelect
             ret c

              ld de,#C000     ; start
              ld hl,(lastByte)
              or a
              sbc hl,de       ; sps lenght
              ld b,h
              ld a,l
              or a
             jr z,1F
              inc b           ; b - lenght in sec.
1             push hl
              pop ix          ; ix - lenght in bytes
              ld hl,#8000     ; bufer
              ld c,#0B        ; save
              ld a,AddPage
              ex af,af'
              ld a,SL_BANK   ; загрузка в страницу через свап
              call GUI
             ret


SPSname     DB "sprites sps",0
SrtSPS_     DB #01,"sps","SPS",#FF



;------- main window ----------

WSprites  DB 0,2,31,22,5*8,5,128+%1111
; Bit 0 - окно с заголовком/без (window with title)
; Bit 1 - "перерисовать" окно да/нет (redraw window)
; Bit 2 - тискать окно по экрану да/нет (movable window)
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL by clicking outside the window)
; Bit 4 - запрет выхода по клику за пределами окна (добавлено для BGE 4.xx работает при Bit 3 = 1 ) / Dart Alver
    DB 0          ; запасной байт-флаг (reserved for flags)
.T  DW TSpr       ; объект-текст (text object)
    DW SSpr       ; объект-подсветка (выборка) (highlighting object)
    DW HSpr       ; горячие клавиши (hotkeys)
    DW BtSpr      ; объект-кнопки (выборка) (buttons object)
    DW FtoScr     ; объект-флажки (flags object)
    DW Nil        ; объект-радио кнопки (radio buttons object)
    DW ScrBr      ; ползунок (scrollbar)
    DW CreatWspr  ; вызов при создании (call on create)
    DW 2  ; Nil        ; вызов на "прерываниях" (call "on interrupt")
  ;  DW Nil      ;   Вызов на прерываниях после прорисовки стрелки
    DW .wSprts    ;   объект спрайты (sprites object)
    DW .wColors   ;   объект область заполненная цветом (color box)
    DW #FFFF

.wSprts    DB 64+32+6,64+19,128+12,1,1,5*8,%01
            DW ColView,BgSprts,BgSprts+8,BgSprts+16,BgSprts+24,BgSprts+32
           DB #FF

; Объект раскраска - область заполненная цветом (color box)


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

; флаги (flag):
; Bit 0 - состояние: 1 - использовать , 0 - оставить текущий цвет
.wColors
            DB 1,12,1,1,5*8+1,%1
            DB 6,12,2,1,5*8+1,%1
            DB 9,12,3,1,5*8+1,%1
            DB 28,3,2,1,5*8+1,%1
            DB 23,20,3,1,8+5,%1
            DB 26,20,4,1,8+6,%1

           DB #FF


TSpr       MSG_SPRtitle : DB 13
           DB "Px:"
.Px        DB "+  Atr:"
.Atr       DB "+",#17,8,"Msk:"
.Msk       DB "+",13,22,17,12
           DB "C:",13
           DB 22,1,12,"s:"
.sx        DB "..*"
.sy        DB ".. TrA:"
.ATrn      DB "+"," MsA:"
.ATmsk     DB "- #"
.ATmskH    DB "FF",13
           DB 22,1,14
          OpLoad_
          OpSave_
           MSG_NewSPR  : DB 13
          OpDrive :DB 13,22,10,14
           MSG_CutSPR : DB 13
           MSG_MoveSPR : DB 13
      ;     MSG_InsSPR : DB 13
           MSG_CopySPR : DB 13
           MSG_DelSPR : DB 13,22,19,14
           DB "Px:",13
           DB "Ms:",13
           DB "At:",13
           MSG_toScrMode : DB #0A
.md       DW mPut
           MSG_toScrSPR : DB 13
           DB 22,1,19,"Frm: "

.frameN    DB "00/00  ADD  UPD  INS  DEL",#17,21,"/ClS",13
           DB 22,1,20,"XY:",#17,2
.Xframe_   DB "00.",#17,4
.Yframe_   DB "00 Pause:",#17,10
.pause_    DB "00 >>>", #17,15
           MSG_Anime : DB 13

           DB 22,23,20," Free:"
.free      DB "16378",13
           DB 22,25,3," "
.SprNum    DB "---/"
.all       DB "000"
.SprLST    DB 13,22,26,7
.SprList   DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13
           DB "    ",13

           DB 0

; Объект подсветка (highlighting object):
; x, y, длина (width), высота (height) или 128+(количество опций 1-ой высоты) (для BGE 4.xx) , флаг (flag):
; bit 0 - подсвечивать (да/нет) (highlight yes/no)
; bit 1 - клавиша "заморожена" ("frozen" key)
SSpr
       ; 0 open ; 1 save ; 2 new ; 3 disk
          DB 1,14,8,128+4,%11
       ; 4 cut ; 5 to end >> ; 6 last << ; 7 copy to end >> ; 8 delete
       ; 4 cut ; 5 move ; 6 copy ; 7 delete
          DB 10,14,8,128+4,%11
          DB 9,3,4,1,%11        ; 8 Msk
          DB 22,19,4,1,%11      ; 9 cls animation flag
       ; 10 pix flag ; 11 msk flag ; 12 atr flag
          DB 19,14,3,128+3,%11
       ; 13 output mode ; 14 to screen
          DB 19,17,7,128+2,%11

          DB 17,12,2,1,%11   ; 15 background color

     ; 16 bg0 ; 17 bg1 ; 18 bg2 ; 19 bg3 ; 20 bg4
          DB 20,12,128+5,1,%11,1,1,1,1,5


.view     DB 1,4,7,7,%10     ; 21 view spr
          DB 9,4,7,7,%10     ; 22 view msk
          DB 17,3,8,8,%10    ; 23 view combo

OpBg0num_ EQU 16
OpViewN_  EQU 21    ; number of view option

          DB 4,3,4,1,%11     ; 24 atr view

          DB 1,19,2,1,%11    ; 25 frame options
          DB 4,19,4,1,%11    ; 26 frame select
          DB 1,20,2,1,%11    ; 27 select frame position
          DB 7,20,6,1,%11    ; 28 edit pause frame
          DB 8,19,3,1,%11    ; 29 add frame to end
Ani_Opa_  DB 15,20,8,1,%11   ; 30 animation

          DB 11,19,3,1,%11   ; 31 update frame
          DB 14,19,3,1,%11   ; 32 insert frame
          DB 17,19,3,1,%11   ; 33 delete frame
          DB 3,20,2,1,%11    ; 34 edit frame X position
          DB 5,20,2,1,%11    ; 35 edit frame Y position
          DB 13,20,2,1,%11   ; 36 set pause to all frames

StSprNum EQU 37       ; номер опции списка спрайтов

ASprNum    DB 26,7,3,128+13,%11 ;  меняем длину списка кодом 128+n
          DB #FF



; x, y, длина, высота, цвет, флаг
; адрес спрайта кнопки
; флаги:
; Bit 0 - клавиша нажимается (yes/no)
; Bit 1 - клавиша "заморожена"
BtSpr   DB 26,4,2,2,7,%11
         DW LEFTS
        DB 28,4,2,2,7,%11
         DW RIGHTS
        DB 23,14,2,2,7,%11
         DW EK2S
        DB #FF

HSpr       DB "C",0
            DW 15    ; bg color
           DB "L",0
            DW 101    ; screens swap

           DB "Z",0
            DW aDecPX   ; уменьшение позиции X для анимации
           DB "X",0
            DW aIncPX   ; увеличение позиции X для анимации
           DB "T",0
            DW aDecPY   ; уменьшение позиции Y для анимации
           DB "Y",0
            DW aIncPY   ; увеличение позиции Y для анимации
           DB "V",0
            DW 21       ;  View spr
           DB 13,0
            DW 23       ;  Enter - View combo
           DB "S",0
            DW 30       ;  Start animation
           DB "N",0
            DW 29       ;  add new frame

           DB #FF

; объект-флажок (switch)
; x, y, номер опции, состояние (#00/#FF)
; вызов при щелчке на кнопку после того, как уже
; перенастроился объект на новое положение
FtoScr    DB  21,14,10,#FF
          DW .p
          DB  21,15,11,#FF
          DW .m
          DB  21,16,12,#FF
          DW .i
          DB  25,19,9,#FF
          DW Nil
         DB #FF

.s        call .i_
         jr 1F
.p        call .i
         jr 1F
.m        call .i
          ex de,hl
1         or a
         ret z
          ld a,(de)
          and (hl)
         ret z
          xor a
          ld (de),a
         ret

.i        call SpriteS.barS
.i_       ld c,"-"
          ld a,(TSpr.Px)
          sub c
         jr nz,1F
          ld (FtoScr+3),a
1         ld a,(TSpr.Msk)
          sub c
         jr nz,1F
          ld (FtoScr+9),a
1         ld a,(TSpr.Atr)
          sub c
         jr nz,1F
          ld (FtoScr+15),a
1         ld hl,FtoScr+3
          ld de,FtoScr+9
          ld a,(ToScrMenu.modeOut_)
         ret


CreatWspr    ld a,(.Fl_AMV_)
             and 3     ; color 0 or 3
             or 5*8    ; color 5*8+(0 or 3)
             ld de,4*256+3
             ld bc,4*256+1
             call SetV
             ld hl,SpriteS.flBar
             ld a,(hl)
             ld (hl),0
             or a
            ret nz

             ld de,19*256+12     ; x,y
             ld bc,#0101
             ld a,(BgAtr)         ; color
             call SetV


;             ld de,1*256+12  ; d=x , e=y
;             ld bc,#0101     ; c=sx , b=sy
;             ld a,5*8+1
;             call SetV
;             ld d,6    ;   ld d,#02
;             inc b     ;   ld b,2
;             call SetV
;             ld d,9
;             inc b     ;   ld b,3
;             call SetV
;             ld de,28*256+3
;             dec b     ;   ld b,2
;             call SetV
;             ld de,1*256+19
;             call SetV
;             inc e
;             call SetV
;             ld b,4
;             ld d,7
;             call SetV
;             dec e
;             ld d,11
;             ld a,(FrmAll)
;             or a
;             ld a,5*8+1
;            jr z,1F
;             dec a    ; a=5*8
;1            ld b,10
;             call SetV

;            ; free out
;             ld de,23*256+20
;             ld b,3
;             ld a,8+5
;             call SetV
;             ld d,26
;             inc b    ;  ld b,4
;             inc a    ;  ld a,8+6
;             call SetV


             ld de,1*256+4
             ld bc,#1007
             call CLSVV_
             ld a,5*8
             call SetV
             ld de,17*256+3
             ld bc,#0808
             call CLSVV_
             ld a,(BgAtr)
             call SetV

             ld de,17*256+3
             ld c,#08
1            push de
             ld b,#08
2            push bc
             ld bc,#0101
             ld hl, BgSprts   ;  адрес спрайта фона
.BackFill   EQU $-2
             call StWSpr
             inc e
             pop bc
            djnz 2B
             pop de
             inc d
            dec c
           jr nz,1B

             ld a,#CD   ; call
             ld (SPRT.BgOUT),a
             ld hl,SPRT.Mput
             ld (SPRT.mode),hl
             ld hl,0
             ld (.pixOUT),hl
             ld (.mskOUT),hl
             ld (.atrOUT),hl
             xor a
             ld a,(SprNum)
             call SeachSPR
            jr nc,1F
.exgui
            jp guiRAM

1           push af
             ex af,af'
            push af
             ex af,af'

             bit 0,a
            jr z,1F
             push de
             ld (.pixOUT),hl
             ld de,1*256+4
             call SPRT.put_win7
             pop de
             add hl,de
1            bit 1,a
            jr z,1F
             push de
             ld (.mskOUT),hl
             ld de,9*256+4
             call SPRT.put_win7
             pop de
             add hl,de
1            ex af,af'
             ld a,#01   ; ld bc,nn
             ld (SPRT.BgOUT),a
             ex af,af'
             bit 2,a
            jr z,2F
             ld (.atrOUT),hl
             ld de,SPRT.Aput
             bit 3,a
            jr z,1F
             ld de,SPRT.Atran
1            ld (SPRT.modeA),de
             ld (viewS.pAt_),de
             ld de,1*256+4
             ld a,0
.Fl_AMV_    EQU $-1     ; флаг монохромного вывода спрайта
             or a
             call z,SPRT.putA_win7
2
             ld hl,SPRT.Mand
             ld (SPRT.mode),hl
             ld de,18*256+4
             ld hl,0
.mskOUT  EQU $-2
             ld a,h
             or l
             call nz,SPRT.put_win7
             ld hl,SPRT.Mput
             or a
            jr z,1F
             ld hl,SPRT.Mor
1            ld (SPRT.mode),hl
             ld hl,0
.pixOUT   EQU $-2
             ld a,h
             or l
             call nz,SPRT.put_win7

            pop af  ; af'
             ex af,af'
            pop af
             bit 2,a
            jp z,.exgui
             and 8             ; bit 3,a
             call  SPRT.q_Amode      ; in A' = Amsk, a = trans flg
             ld hl,0
.atrOUT     EQU $-2
             ld a,h
             or l
             call nz,SPRT.putA_win7
          jp .exgui



; DB x, y, за раз эл-ов, всего эл-ов, высота, позиция после "за-раз
; DW adr1, adr2
ScrBr   DB  29,8,13
vsego   DB  20,11
posBar  DB  0
        DW  Nil,BarObr

lastByte   DW #C004     ; адрес байта за последним спрайтом (байт должен быть 0)
freeB      DW 0         ; количество свободной памяти для спрайтов.

BarObr    ld c,0
lposBar  EQU $-1
          push bc
          call BarIni
          pop bc
          ld a,(posBar)
          cp c
         ret z
          ld a,STOP_ARW
          ld (SpriteS.flBar),a  ; главное не 0
          call GUI_
         jp SpriteS.return


BarIni  ld a,(posBar)
        ld (lposBar),a
        ld hl,TSpr.SprList
        ld b,13
        ld a,#20
1       ld (hl),a
        inc hl
        ld (hl),a
        inc hl
        ld (hl),a
        inc hl
        ld (hl),a
        inc hl
        inc hl
       djnz 1B
        ld h,a
        ld l,a
        ld a,(vsego)
        or a
       jr nz,1F
        ld (TSpr.SprNum),hl
        ld a,l
        ld (TSpr.SprNum+2),a
        xor a
        ld (SprNum),a
        ld (posBar),a
        cpl
        ld (ASprNum),a
       ret
1       ld a,(posBar)
        ld c,a
        ld a,(vsego)
        sub c
       ret c
       ret z
        cp 13
       jr c,1F
        ld a,13
1       ld b,a
     ;   ld de,#0005
        ld hl,ASprNum
2       ld (hl),26
      ;  add hl,de
      ; djnz 2B
      ;  ld (hl),#FF
         or 128
         ld (ASprNum+3),a
      ;  ld b,a
        ld hl,TSpr.SprList

1       ld a,3
SprNum EQU $-1   ; номер текущего спрайта
        cp c
       jr nz,2F
        ld a,"+"
        ld (hl),a
2       inc hl
        ld a,c
        call pDec
        inc hl
        inc c
       djnz 1B

        ret


SPScheck     ; проверка наличия набора в странице BGE ; выход флаг NZ - нет , Z - есть
             call Animation.clear
             xor a
             ld (SprNum),a
             call ToScrMenu.s_mode_   ; ставим галки на флажки
             ld hl,#0101
             ld (Sz_X),hl
             ld a,AddPage
             call RAM
             ld hl,(#C000)
             ld bc,#5053  ; PS
             xor a
             sbc hl,bc
            ret nz
             ld b,1
             ld hl,(#C002)
             xor a
             sbc hl,bc
            ret

SPSini       call SPScheck
            jr z,2F
             ld a,(ExtMem)
             or a
             call z,AskAddP
            ret c
           jr 1F
New          ld a,(vsego)
             or a
            jr z,1F
             call ASK
.c_         ret nz
1            call Animation.clear
             ld a,AddPage
             call RAM
             ld hl,#5053  ; PS
             ld (#C000),hl
             ld h,#01
             ld (#C002),hl
             xor a
             ld hl,#C004
             ld (hl),a
             ld (vsego),a
setLB_       ld (lastByte),hl
FreeIni      ld hl,#FFFF            ; установка количества свободной памяти
             ld de,(lastByte)
             xor a
             sbc hl,de
             ld (freeB),hl
             xor a
            ret
SPSini_      call SPScheck
            jr nz,1B
2      ; пересчёт набора в памяти и коррекция ошибок (на всякий пожарный)
            call .l0_
           jr setLB_
.l0_        ld c,0             ; счетчик спрайтов
            ld hl,#C004        ; начало данных
.l0         ld a,c
            ld (vsego),a
            ld a,(hl)
            or a
           ret z             ; рассчёт окончен по нулевому байту

            push hl          ; на случай ошибки
            inc c
           jr z,.er

            inc hl
            ld b,a            ; (Flags)
            inc hl            ; пропуск Amask
            ld a,(hl)         ; sX
            inc hl
            or a
           jr z,.er
            ld e,a
            cp 33
           jr nc,.er
            ld a,(hl)         ;sY
            inc hl
            or a
           jr z,.er
            ld d,a
            cp 25
           jr c,1F

.er         pop hl     ; ошибка (error) обрываем последовательность
            xor a
            ld (hl),a
           ret

1             ; E= sX, D= sY
            push hl
            pop ix
            push bc

            push de
            ld a,d
            add a,a
            add a,a
            add a,a    ; sY*8
            ld h,e
            call MULS  ; HL = A*H  / sY*8*sX
            ld b,h
            ld c,l     ; bc - size of pixel sprite
            pop de

            pop hl    ; h = Flags , l - счётчик спрайтов
            bit 0,h    ; проверка наличия пикселей
           jr z,1F
            add ix,bc
           jr c,.er
1           bit 1,h
           jr z,1F      ; нет маски
            add ix,bc
           jr c,.er
1           bit 2,h
           jr z,1F       ; нет атрибутов
            push hl
            ld a,e
            ld h,d
            call MULS
            ld b,h
            ld c,l
            pop hl
            add ix,bc
           jr c,.er
1           ld b,h
            ld c,l
            ex (sp),ix
            pop hl
           jp .l0

Sz_X         DB 7    ; sprite size for X
Sz_Y         DB 7    ; sprite size for Y

swapR_      ; свапинг адресов #6000 и #C000 в странице SuxPage, на выходе устанавливает страницу AddPage
            ; используется когда свапы окон обнулены
            ld a,SuxPage|#10
.R_         call ramAdd.ram
            ld hl,#6000
            ld de,#C000
            ld bc,#0040   ; cb=#4000
1           ld a,(hl)
            ex af,af'
            ld a,(de)
            ld (hl),a
            ex af,af'
            ld (de),a
            inc hl
            inc de
           djnz 1B
            dec c
           jr nz,1B
ramAdd      ld a,AddPage|#10
.ram        push bc
            ld bc,#7FFD
            out (c),a
            pop bc
           ret

; Выводы разных параметров

   ; in hl - addres output string

prnFrmAll    ld hl,TSpr.frameN
             ld a,(FrmAll)
             or a
             push af
             call 1F
             inc hl
             pop af
            jr z,SAprint
             dec a
            jr pDec.xx
1             ld a,(FrmNum)
            jr nz,pDec.xx
             ld (FrmNum),a
            jr SAprint


SXCprint     ld a,2
SzXcut   EQU $-1
            jr SAprint
SYCprint     ld a,2
SzYcut   EQU $-1
            jr SAprint
SXprint      ld a,(Sz_X)
            jr SAprint
SYprint      ld a,(Sz_Y)
SAprint      or a
            jr nz,pDec.xx
             ld a,"."
             ld (hl),a
             inc hl
             ld (hl),a
             inc hl
            ret

pDec     ; in a num ,hl - adr
             ld e,100
             call 1F
.xx          ld e,10
             call 1F
             add a,"0"
             ld (hl),a
             inc hl
            ret
1            ld d,"0"-1
1            inc d
             sub e
            jr nc,1B
             add a,e
             ld (hl),d
             inc hl
            ret

prnPause     ld a,(FrmPause)
            jr pDec.xx
prnFrmX      ld a,(FrmXY)
            jr pDec.xx
prnFrmY      ld a,(FrmXY+1)
            jr pDec.xx



TAtrPrn     ld a,(TranAttr)   ; in hl - addr
         jr 1F
TMskPrn     ld a,#FF ; in hl - addr
TranMsk  EQU $-1
1        jp GET_HEXa_



CSprSize     ; расчёт размера спрайта in: hl= h - sy, l - sx ; out: de - size spr and msk, bc - attr size
            push hl
            ld a,h
            ld h,l
            add a,a
            add a,a
            add a,a
            call MULS  ; HL = A*H
            pop bc
            push hl
            ld h,b
            ld a,c
            call MULS  ; HL = A*H
            ld c,l
            ld b,h     ; bc - размер для атрибутов
            pop de     ; de - размер для пикселей и маски
           ret



EdtNum    ld b,2         ;in hl - addr, d=X, e=Y  ; out a=num ; flC - error
       ;   xor a
          ex af,af'
          ld a,EDIT
          push hl
          call GUI
          pop hl
         ret c
.num      ld e,0
          ld c,10
          call .adC
          ld c,1
.adC      ld a,(hl)
          inc hl
          sub 48      ;"0"
         ret c
          cp 10
          ccf
         ret c
          or a
          ld b,a
          ld a,e
         ret z
1         add a,c
          ret c
         djnz 1B
          ld e,a
          or a
         ret

EdtSNum   ld b,3         ;знаковый редактор: in hl - addr, d=X, e=Y  ; out a=num ; flC - error
       ;   xor a
          ex af,af'
          ld a,EDIT
          push hl
          call GUI
          pop hl
         ret c
          ld a,(hl)
          ld b,1
          cp "-"
         jr z,1F
          dec b
          cp "+"
         jr z,1F
          cp " "
         jr nz,2F
1         inc hl
2         push bc
          call EdtNum.num
          pop bc
         ret c
          dec b
         jr nz,1F
          neg
1         or a
         ret


        INCLUDE "SprtOut.asm"
        INCLUDE "SprtToScr.asm"

BgAtr       EQU SPRT.BgAtr

SprMinus    DB 0,0,0,124,124,0,0,0         ; -
SprPlus     DB 0,24,24,126,126,24,24,0     ; +
SpriX       DB 0,0,10,17,10,0,0,0          ; <>
SpriY       DB 0,8,20,0,20,8,0,0           ; ^v
ColView     DB 0,0,#3C,#3C,#3C,#3C,0,0     ; вид цвета
InkView     DB #FF,#FF,#FF,#FF,#FF,#FF,#FF,#00


BgSprts     DB 0,68,0,0,0,68,0,0      ; спрайты для фона
            DB 0,68,0,17,0,68,0,17
            DB 0,85,0,85,0,85,0,85
            DB 170,85,170,85,170,85,170,85
            DB 255,255,255,255,255,255,255,255

            DB 0


AniBuff     DUP 20 : DB 0,0,0,0 : EDUP    ; буфер на 20 кадров по 4 байта:
                      ;   0-pause, 1-sprite number, 2-x,3-y
            DB 0



;-----------------------------------------------------------------------------------------
;    Формат блока спрайтов (Sprites block):

; по адресу (to addr)  #C000 =>: DB "SPS", номер версии (version number) = 1
; далее данные спрайтов по очереди (next, the data of the sprites one by one)

;    Формат данных спрайта (Sprite data):

; DB флаги (flags), маска атрибутов (Amask) , размер по X (size for X) ,  размер по Y (size for Y)
;    Флаги (flags) :   %TAMP
;      если flags=0, то данные спрайтов закончились (if flags=0 then Sprites data is end)
;                    иначе (else):
                          ;  P - пиксели (pixels)
                          ;  M - маска (mask)
                          ;  A - атрибуты (attributes)
                          ;  T - прозрачный цвет 0 (transparent colour 0) 0 - not / 1 - yes

;    Маска атрибутов (Amask) : default=%11111111 (#FF) - если #FF, то маска не используется

; Далее данные спрайта соответственно флагам в порядке : Спрайт пикселей, спрайт маски, спрайт атрибутов






;---------------------------------------------------------
LSprites       EQU $-SpriteS
FreeSprites    EQU #C000-$
        ASSERT  $ < #C000
     ;   ENT

      DISPLAY "Sprites len :",/a, LSprites
      DISPLAY "Sprites free:",/a, FreeSprites
