; Модуль экспорта спрайтов

                ORG PgnAdr

SprtExport       call ERASE_ALLW
                 ld (.sp),sp
                 call .SprOvSvPg
1                call .SPS_chk_
                jr z,3F
2                ld hl,.TnoSPS_
                 call AskQ
                jp c,.SprOvSvPg
                 ld a,(ExtMem)
                 or a
                 call z,AskAddP
                jp c,.SprOvSvPg
.ldSPS           call .loadSPS
                jr 1B
3                call .iniNUM_
                jr c,2B
.l0              ld a,%1111
.l1              ld sp,0
.sp  EQU $-2
                 ld ix,WSprtExport
                 ld (ix+6),a
                 ld a,(.usego)
                 or a
                jr z,.EXIT_

                 ld a,(.Num1spr)
                 ld de,WSprtExport.tSprEnd
                 call .getNUM_
                 ld c,a
                 ld a,(.Num0spr)
                 ld de,WSprtExport.tSprStart
                 call .getNUM_
                 inc a
                 sub c
                 ld (.LNumsSpr),a

                 call Win_
                 cp #FF
                jr z,.EXIT_
                 ld bc,.TBsprt
1                call TAB_JP

                 ld a,%1101
                jr .l1

.getNUM_        push hl,de,bc,af
                call PDEC   ; Get_NumC0_
                pop af,bc,de,hl
               ret


.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


.loadSPS         ld hl,.Srt_SPS_  ;  загрузка спрайтов
                 call FilerE
                ret c
                 ld a,(SEC_LEN)
                 ld b,a
                 cp 65
                 ccf
                ret c
                 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
                ret c    ; error
                 ld a,AddPage
                 call RAM
                 ld hl,(BYTES_LEN)
                 ld de,#C000
                 add hl,de
                 ld (hl),0
                 ld de,.SPS_name
                 call ToName
                 xor a
                ret

.openSPS     call .loadSPS
             xor a
             ld (.usego),a
             call .SPS_chk_
            jr z,2F
1            ld hl,.TnoSPS_
             call AskQ
            jr c,.openSPS
2            call .iniNUM_
            jr c,1B
            ret

.iniNUM_     call .fixSPS_  ; проверка спрайтов на целостность
             ld a,0
.usego EQU $-1          ; количество спрайтов
             or a
             scf
            ret z
             push af
             ld de,WSprtExport.tSprAlls
             call .getNUM_
             pop af
             dec a
             ld (.Num1spr),a
             xor a
             ld (.Num0spr),a
            ret

.SPS_chk_     ; проверка наличия набора в странице BGE ; выход флаг NZ - нет , Z - есть
             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

.fixSPS_                       ; проверка и корекция набора
            ld c,0             ; счетчик спрайтов
            ld hl,#C004        ; начало данных
.fl0         ld a,c
            ld (.usego),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
           jr .fl0


.TnoSPS_    MSG_ExpS_noSPS : DB 0    ;  'Нет спрайтов. Загрузить ?'

.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

.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,(.usego)
               or a
              jr z,1F            ; to >> scf : ret
               cp e
              jr c,1F
              jr z,1F

               call AddRam
               ld hl, #C004
.ssl0          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 .ssl0

.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

.TBsprt        DW .openSPS      ; 0  - Открыть_
               DW Ret           ; 1  - Format
               DW Ret           ; 2  - Vertical direct
               DW Ret           ; 3  - Horizontal direct
               DW Ret           ; 4  - Type
               DW .selectSPRs   ; 5  - select sprites
               DW Ret           ; 6  - edit start
               DW Ret           ; 7  - edit end
               DW .iniNUM_      ; 8  - all sprites
               DW .lookSPS      ; 9  - look sprites
               DW Ret           ; 10 - head
               DW Ret           ; 11 - pixels v
               DW Ret           ; 12 - mask   v
               DW Ret           ; 13 - mask write type
               DW Ret           ; 14 - mask order
               DW Ret           ; 15 - attrs  v
               DW Ret           ; 16 - attrs write type
               DW Ret           ; 17 - attrs order
               DW Ret           ; 18 - attrs transparent color
               DW Ret           ; 19 - attrs mask
               DW Ret           ; 20 - sprite addres (default #C000)
               DW Ret           ; 21 - assembler text type
               DW Ret           ; 22 - main label name
               DW Ret           ; 23 - local labels name
               DW Ret           ; 24 - ORG in ASM text   v
               DW Ret           ; 25 - Export BIN
               DW Ret           ; 26 - Tabl BIN
               DW Ret           ; 27 - Export ASM
               DW Ret           ; 28 - Tabl ASM Addresses
               DW Ret           ; 29 - Tabl ASM disps
               DW Ret           ; 30 -
               DW Ret           ; 31 -
               DW Ret           ; 32 -








.setAllSpr


           ;  WSPRTselE


.selectSPRs
               ld hl,.l0
               ex (sp),hl     ; меняем возврат
             jr  .selectSPR

.lookSPS       ld hl,.l0
               ex (sp),hl     ; меняем возврат
.selectSPR     call ERASE_ALLW

               ld ix,WSPRTselE
               ld (ix+6),%1110
               call Win_
               call CLOSE_
               cp #FF
              ret z
              ret



; profile : filename.ifs - сохраняет конфигурацию формата экспорта спрайтов
;   Bin format:
;   Start address: #C000
;
;    Сверху вниз/снизу вверх
;    Слева направо/справа налево
;    Построчно/побайтно
;    Маска :  Побайтно
;             Mask byte,Pixels byte
;                  или Раздельно
;                      Маска, Пиксели
;    Атрибуты : Отдельно / вместе
;               После данных/ перед данными
;
;    Шапка спрайта: 0 bytes
;
;
;
;---------------------------
;   Include ORG to ASM : No
;   Main label: Sprt
;   Local labels: .s
;   Assembler: Text
;------------------------
;   Экспорт BIN >>
;   Таблица адресов BIN >>
;
;   Экспорт ASM >>
;   Таблица адресов ASM >>
;   Экспорт адресов >>
;---------------------------------------------
.Num0spr      DB 0       ; номер первого спрайта в выборке
.Num1spr      DB 0       ; номер последнего спрайта в выборке
.LNumsSpr     DB 0       ; спрайтов в выборке
.Address_     DW #C000   ; адрес расположения
.ORGaddr_     DW #C000   ; адрес компиляции
.transCOL_    DB #00     ; прозрачный цвет

.SPS_name     DB "sprites sps",0
.Srt_SPS_     DB #01,"sps","SPS",#FF

WSprtExport  DB 0,0,30,23,5*8,5,%1111
            ; Bit 0 - окно с заголовком/без
            ; Bit 1 - "перерисовать" окно да/нет
            ; Bit 2 - тискать окно по экрану да/нет
            ; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
           DB 0
           DW .Txt        ; объект-текст
           DW .Sel        ; объект-подсветка
           DW Nil         ;   горячие клавиши (hotkeys)
           DW Nil         ;   объект-кнопки (выборка) (buttons object)
           DW .flgs       ;   объект-флажки (flags object)
           DW #FFFF

.Txt         MSG_ExpS_Title  : DB 13
             MSG_DISK_Load_  : DB 13
             MSG_ExpS_Format : DB 13,#17,1,#0A
.tFvertA_    DW  .tUpDn
             DB  #17,1,#0A
.tFhorA_     DW  .tLR
             DB  #17,1,#0A
.tFtypeA_    DW .tLnByLn
             DB 13
             MSG_ExpS_Header : DB #17,6,#0A
.tHadr_      DW .tNo
             DB 13
             MSG_ExpS_Pixels : DB 13,13
             MSG_ExpS_Mask   : DB 13,#17,1,#0A
.tMstyleA_   DW .tMixLn
             DB  #17,1,#0A
.tMsets      DW .tMst1
             DB 13
             MSG_ExpS_Attrs : DB 13,#17,1,#0A
.tAtStyleA_  DW .tApart
             DB  #17,1,#0A
.tAtPosA_    DW .tAfterDT
             DB  #17,1
             MSG_ExpS_Trn : DB #17,10,"#"
.tAtrnHEX_   DB "00",13,#17,1
             MSG_ExpS_Mask : DB " ",#0A
.tAmskA_     DW  .tAmskNot

             DB 22,15,3
             MSG_ExpS_Sprts : DB "("
.tSprAlls    DB "***) ",#17,8
.tSprStart   DB "***",#17,10," -",#17,12
.tSprEnd     DB "***",13,13

             MSG_ExpS_AllSpr : DB 13,13
             MSG_ExpS_Look : DB 13,13


      ;       DB 22,15,9
             MSG_ExpS_Addr : DB #17,8
.tAdrSprs    DB "#C000 ",13,13

             DB "Assembler:",#17,9,#0A
.tASMtypeA_  DW .tASMtext
             DB "Main label:",#17,9
.tMainLabel  DB "Sprt    ",13           ; 8 chars for label
             DB "Local labels:",#17,9
.tLocalLabs  DB ".s   ",13              ; 5 chars for label + 3 digits for sprite number
             DB "ORG in ASM:", 13,13
             MSG_ExpS_ExBIN : DB 13
             MSG_ExpS_TabBIN : DB 13,13
             MSG_ExpS_ExASM : DB 13
             MSG_ExpS_TabASMa : DB 13
             MSG_ExpS_TabASMd

             DB 0

.tYes     MSG_Yes       : DB 0
.tNo      MSG_No        : DB 0

.tUpDn    MSG_ExpS_UpDn      : DB 0   ; сверху вниз
.tDnUp    MSG_ExpS_DnUp      : DB 0   ; снизу вверх
.tLR      MSG_ExpS_LR        : DB 0   ; слева направо
.tRL      MSG_ExpS_RL        : DB 0   ; справа налево
.tLnByLn  MSG_ExpS_lnByln    : DB 0   ; построчно
.tColumn  MSG_ExpS_Column    : DB 0   ; по столбцам
.tCell    MSG_ExpS_Fcell     : DB 0   ; по знакоместам
.tBtByBt  MSG_ExpS_BtByBt    : DB 0   ; побайтно
.tApart   MSG_ExpS_Apart     : DB 0   ; отдельно
.tMixLn   MSG_ExpS_MixLn     : DB 0   ; совместно
.tMixLn8  MSG_ExpS_MixLn8    : DB 0   ; на 8 линий
.tAfterDT MSG_ExpS_AfterDT   : DB 0   ; после данных
.tBefoDT  MSG_ExpS_BefoDT    : DB 0   ; перед данными

.tMst1    DB "Mask, Pixel",0
.tMst2    DB "Pixel, Mask",0

.tAmskNot DB #17,10 : MSG_No : DB 0

.tASMtext  DB "Text", 0



.Sel       ; выборка

          DB 1,3,12,128+2,%11    ; 0 - Open , 1 - format
          DB 2,5,12,128+3,%11    ; 2 - вертикальное направление 3 - горизонтальное 4 - тип
          DB 15,3,8,1,%11        ; 5 - выбор спрайтов
          DB 23,3,2,1,%11        ; 6 - редактор начала
          DB 27,3,2,1,%11        ; 7 - редактор конца
          DB 15,5,14,1,%11       ; 8 - все спрайты
          DB 15,7,14,1,%11       ; 9 - просмотр спрайтов
          DB 1,9,12,1,%11        ; 10 - шапка
          DB 1,11,12,1,%11       ; 11 - Пиксели :
          DB 1,13,12,1,%11       ; 12 - маска :
          DB 2,14,12,128+2,%11   ; 13 - способ записи, 14 - последовательность
          DB 1,17,12,1,%11       ; 15 - Атрибуты:
          DB 2,18,12,128+4,%11   ; 16 - способ записи, 17 - последовательность, 18 - прозрачный цвет,19 - маска цвета

          DB 15,9,14,1,%11       ; 20 - Адрес : #C000
          DB 15,11,14,128+4,%11  ; 21 - ассемблер, 22 - Main label, 23 - Local labels, 24 - ORG in ASM
          DB 15,16,14,128+2,%11  ; 25 - Экспорт BIN , 26 - Таблица BIN
          DB 15,19,14,128+3,%11  ; 27 - Экспорт ASM, 28 - Таблица ASM ADDR, 29 - Таблица ASM DISP

         DB #FF

.flgs
          DB 12,11,11,#FF       ; +3 pixels
           DW Nil
          DB 12,13,12,#FF       ; +9 mask
           DW Nil
          DB 12,17,15,#FF       ; +15 attrs
           DW Nil
          DB 28,14,24,#FF       ; +21 ORG in ASM
           DW Nil
          DB #FF


WSPRTselE  DB 9,18,23,6,5*8,5,%1110
            ; Bit 0 - окно с заголовком/без
            ; Bit 1 - "перерисовать" окно да/нет
            ; Bit 2 - тискать окно по экрану да/нет
            ; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
           DB 0
           DW .Txt        ; объект-текст
           DW .Sel        ; объект-подсветка
           DW Nil         ; горячие клавиши (hotkeys)
           DW .but        ; объект-кнопки (выборка) (buttons object)
           DW .flgs       ; объект-флажки (flags object)
           DW #FFFF

.Txt
.TsprNUM   DB "000: "
.TsprSX    DB "000 x "
.TsprSY    DB "000 / "
.TsprLen   DB "00000",13
           MSG_ExpS_SPixels : DB 13
           MSG_ExpS_SMask  : DB 13
           MSG_ExpS_SAttrs : DB 13,22,9,3
           MSG_ExpS_STransp : DB #17,7,"#"
.TtransCol DB "00",13
           MSG_ExpS_SAMask  : DB #17,7,"#"
.TAtrMask  DB "--",#17,11,"Ok!"
           DB 0

.Sel       DB 19,4,3,1,%11        ; 0 - Ok!
          DB #FF

.but    DB 15,1,2,2,7,%11         ; 1 - look
         DW LOOKS
        DB 18,1,2,2,7,%11         ; 2 - <=
         DW LEFTS
        DB 20,1,2,2,7,%11         ; 3 - =>
         DW RIGHTS
        DB #FF

.flgs     DB 7,2,64,#FF       ; +3 pixels
           DW Nil
          DB 7,3,65,#FF       ; +9 mask
           DW Nil
          DB 7,4,66,#FF       ; +15 attrs
           DW Nil
          DB #FF

;---------------------------------------------------------
LSprtExport       EQU $-SprtExport
FreeSprtExport    EQU #C000-$
        ASSERT  $ < #C000
     ;   ENT

      DISPLAY "SprtExport len :",/a, LSprtExport
      DISPLAY "SprtExport free:",/a, FreeSprtExport