; Редактор спрайта (sprite editor)
; Параметры следующие
; HL <- адрес таблицы параметров (address of parameter table)
; IX -> окно редактора спрайта (sprite editor window)
; A  -> так же, как и после вызова Win или Winn (as after Win or Winn call)
;TBFnt - таблица параметров:
;   DB #07,#04   ; X,Y окна (X,Y of window)
;   DB #11,#08   ; ширина (width), высота (height)
;   DW FBuff     ; адрес спрайта (sprite address)
;   DW #0103     ; X,Y окна редактора (X,Y of editor window)
;   DW #0101     ; размеры спрайта (sprite size)
;   DW #0603     ; X,Y preview
;   DW BEText    ; текст (text)
;   DW BESel     ; подсветка (highlighting)
;   DW BEHot     ; горячие клавиши (hotkeys)

SPEdit_ LD IX,WSEdit
        RES 2,(IX+6)
        JR spedit

SPEdit  LD IX,WSEdit
        SET 2,(IX+6)
spedit  LD (tbdat),HL
        DEFHL1
        LD (WSEdit),DE     ; X,Y окна (X,Y of window)
        DEFHL1
        LD (WSEdit+2),DE   ; ширина (width), высота (height)
        DEFHL1
        LD (SprAdr),DE     ; адрес спрайта (sprite address)
        LD (BSprint+6),DE
        DEFHL1
        LD (SprXY),DE      ; X,Y окна редактора (X,Y of editor window)
        DEFHL1
        LD (SprLH),DE      ; размеры спрайта (sprite size)
        LD A,D
        LD (BSprint+2),A
        LD A,E
        LD (BSprint+3),A
        DEFHL1
        LD (SprXY_),DE     ; X,Y preview
        LD A,D
        LD (BSprint),A
        LD A,E
        LD (BSprint+1),A
        DEFHL1
        LD (bstext),DE     ; текст (text)
        DEFHL1
        LD (bssel),DE      ; подсветка (highlighting)
        DEFHL1
        LD (bshot),DE      ; горячие клавиши (hotkeys)
        CALL Win_
        LD HL,0
tbdat   EQU $-2
        LD DE,(WSEdit)
        LD (HL),E
        INC HL
        LD (HL),D
        RET

;BDat1  DB #09,#03
 ;      DB #0F,#0C
  ;     DW DISKS
     ;  DW #0103
    ;   DW #0202
     ;  DW #0A03
      ; DW BSText
       ;DW BSSel
;       DW BSHKey

WSEdit  DEFB 9,3,15,12,5*8,5,%00001111
; Bit 0 - окно с заголовком/без
; Bit 1 - "перерисовать" окно да/нет
; Bit 2 - тискать окно по экрану да/нет
; Bit 3 - выход из окна-ткнуть только лишь за пределами (CANCEL)
        DEFB 0
bstext  DEFW Nil          ; объект-текст
bssel   DEFW Nil          ; объект-подсветка (выборка)
bshot   DEFW Nil          ; горячие клавиши
        DEFW BSprint      ; объект-кнопки (выборка)
       ; DEFW Nil          ; объект-флажки
       ; DEFW Nil          ; объект-радио кнопки
       ; DEFW Nil          ; ползунок
        DW 3     ; пропуск
        DEFW CrSprint     ; вызов при создании
        DEFW IntSprint    ; вызов на "прерываниях"
        DW #FFFF          ; заглушка /DA

BSprint DB #0A,#03,2,2,7,%11
        DW DISKS
        DB #FF

; SprAdr  DW 0      ; раскидал внутрь кода для экономии /DA v4.0d
; SprXY   DW 0
; SprXY_  DW 0
; RSprXY  DW 0
; SprLH   DW 0

IntSprint
        LD DE,(ARW_X)
        CALL Put_Box
        LD (Txy),DE

        LD A,(DIRECT)
        AND #10
        JR Z,was3_
NEW_XY  EQU $+1 : ld hl,#FFFF  ; LD HL,(NEW_XY)

        LD DE,(TXY)
        AND A
        SBC HL,DE
        JR Z,was2_
was3_   LD HL,#FFFF
        LD (NEW_XY),HL
        JR ZAP
was2_  ; LD HL,(OLD_XY)
OLD_XY  EQU $+1 : ld hl,#FFFF  ; LD HL,(OLD_XY)
        LD DE,(TXY)
        AND A
        SBC HL,DE
        RET Z

ZAP     LD A,(DIRECT)
        AND #10
        RET Z

;        LD HL,(RSprXY)
RSprXY  EQU $+1 : ld hl,#0000
        LD DE,(ARW_XC)
;        LD BC,(SprLH)
SprLH   EQU $+1 : ld bc,#0000
        CALL SLABC2
        CALL InBox
        RET C

        LD HL,(TXY)
        LD (OLD_XY),HL
        LD (NEW_XY),HL

        LD DE,(Txy)
        PUSH DE
        LD HL,(TXY)
        RCOD   ; CALL RCOD
        LD DE,(RSprXY)
        SLA D
        SLA E
        LD A,H
        SUB D
        LD H,A
        LD A,L
        SUB E
        LD L,A
        EX DE,HL

        PUSH DE
        PUSH DE
;        LD DE,(SprXY_)
SprXY_ EQU $+1 : ld de,#0000
       ; RCOD    ; CALL RCOD
        CALL RealWin
       ; RCOD    ; CALL RCOD
       ; EX DE,HL
       ; DUP 3
       ; SLA H
       ; SLA L
       ; EDUP
        ld a,d
        add a,a
        add a,a
        add a,a
        ld h,a
        ld a,e
        add a,a
        add a,a
        add a,a
        ld l,a
        POP DE
        LD A,H
        ADD A,D
        LD D,A
        LD A,L
        ADD A,E
        LD E,A
        CALL XOR_PL
        CALL PLOT
        POP DE

;        LD HL,(SprAdr)
SprAdr  EQU $+1 : ld hl,#0000
        CALL FToSpr
        PUSH AF
        LD A,(HL)
        XOR B
        LD (HL),A
        POP AF
        POP DE
        JR NZ,pres
        CALL PSET
        RET

Txy     DW 0

pres    LD DE,(ARW_X)
        CALL Put_Box
        CALL PRES
        RET

CrSprint
        LD HL,#FFFF
        LD (NEW_XY),HL
        LD (OLD_XY),HL
        PUSH IX
        CALL INSTALL_PLOT
        POP IX
        LD HL,(SprAdr)
;        LD DE,(SprXY)
SprXY   EQU $+1 : ld de,#0000
        CALL RealWin
        LD (RSprXY),DE
        LD BC,(SprLH)
        CALL FieldB
        LD DE,(RSprXY)
        LD A,D
        LD D,E
        LD E,A
        LD BC,(SprLH)
        CALL SLABC2
        LD A,7*8
        CALL SetAtr
        RET

SLABC2  SLA B
        SLA C
        SLA B
        SLA C
        RET

; Расчет чанки
;
; DE - координаты точки (попиксельно)


Put_Box LD A,D
        AND #FC
        LD D,A
       ; SRL A
       ; SRL A
        rrca : rrca
        LD H,A
        LD A,E
        LD C,E
        SRL A
        SRL A
        LD L,A
        SRL A
        LD E,A
put_box LD (TXY),HL
        LD A,L
        AND 1
;        LD A,0
;        JR NZ,NOS_
;        INC A
        XOR 1

NOS_    LD (PIXODD),A
        LD B,C
        LD C,D
        LD L,C
        LD H,high PLOTT
        LD A,(HL)
        INC H
        LD D,(HL)
        INC H
        LD L,B
        ADD A,(HL)
        LD E,A
ZAZX    LD BC,0
TXY     EQU $-2
        LD HL,#0000
PXY     EQU $-2
        ADD HL,BC
        LD C,H
        LD B,L
        RET

PRES    LD A,(PIXODD)
        AND A
        LD C,#0F
        LD HL,CHL1
        JR NZ,PIXOFF2
        LD C,#F0
        DUP 4
        INC HL
        EDUP
PIXOFF2 DUP 3
        LD A,(DE)
        AND C
        OR (HL)
        LD (DE),A
        INC D
        INC HL
        EDUP
        LD A,(DE)
        AND C
        OR (HL)
        LD (DE),A
        RET

PSET    LD A,0
PIXODD  EQU $-1
        AND A
        LD C,#0F
        LD HL,CHL0
        JR NZ,PIXOFF1
        LD C,#F0
        DUP 4
        INC HL
        EDUP
PIXOFF1 DUP 3
        LD A,(DE)
        AND C
        OR (HL)
        LD (DE),A
        INC D
        INC HL
        EDUP
        LD A,(DE)
        AND C
        OR (HL)
        LD (DE),A
        RET

; HL - спрайт
; DE - координаты окна сетки
; BC - длина, высота

FieldB  PUSH HL
        LD A,B
        LD (fldln),A
        LD A,C
        Amul8
        LD B,A
        CALL RASCH
        EX DE,HL
        POP HL
A3      PUSH BC
        PUSH HL
        PUSH DE
        LD A,0
fldln   EQU $-1         ; длина
A2      EX AF,AF'
        LD A,(HL)
        LD C,A

        LD A,4
a1      PUSH AF
        PUSH HL
        XOR A
        LD H,A
        RL C
        RLA
        RL C
        RLA
        LD L,A
        ADD HL,HL
        ADD HL,HL
        PUSH DE
        LD DE,PDATA0
        ADD HL,DE
        POP DE
        LD B,D
        DUP 4
        LD A,(HL)
        LD (DE),A
        INC HL
        INC D
        EDUP
        LD D,B
        POP HL
        INC E
        POP AF
        DEC A
        JP NZ,a1

        EX AF,AF'
        INC L
        DEC A
        JP NZ,A2
        POP DE

        DUP 3
        INC D
        EDUP
        INC D
        LD A,D
        AND #07
        JR NZ,$+12
        LD A,E
        SUB #E0
        LD E,A
        JR NC,$+6
        LD A,D
        SUB #08
        LD D,A

        POP HL
        LD A,(fldln)
        LD B,0
        LD C,A
        ADD HL,BC
        POP BC
        DEC B
        JP NZ,A3
        RET

;PDATA0  DB %11111111,%10111011
;        DB %11111111,%11111111
;        DB %11110000,%10110000
;        DB %11110000,%11110000
;        DB %00001111,%00001011
;        DB %00001111,%00001111
;        DB %00000000,%00000000
;        DB %00000000,%00000000

PDATA0  DB %11111111,%10111011
        DB %11111111,%11111111
        DB %11110001,%10110001
        DB %11110001,%11111111
        DB %00011111,%00011011
        DB %00011111,%11111111
        DB %00010001,%00010001
        DB %00010001,%11111111

;CHL0    DB %00000000
;        DB %00000000
;        DB %00000000
;        DB %00000000
;        DB %00000000
;        DB %00000000
;        DB %00000000
;        DB %00000000

CHL0    DB %00010000
        DB %00010000
        DB %00010000
        DB %11110000
        DB %00000001
        DB %00000001
        DB %00000001
        DB %00001111

CHL1    DB %11110000
        DB %10110000
        DB %11110000
        DB %11110000
        DB %00001111
        DB %00001011
        DB %00001111
        DB %00001111

FToSpr  LD A,E
        AND A
        JR Z,jr9
        LD A,(SprLH+1)
        LD B,0
        LD C,A
jr10    ADD HL,BC
        DEC E
        JR NZ,jr10
jr9     LD A,D
        CP 8
        CALL NC,I8
        PUSH HL
        LD H,0
        LD L,A
        LD BC,TBWs
        ADD HL,BC
        LD A,(HL)
        POP HL
        LD B,A
        LD A,(HL)
        AND B
        AND A
        RET

TBWs    DB %10000000
        DB %01000000
        DB %00100000
        DB %00010000
        DB %00001000
        DB %00000100
        DB %00000010
        DB %00000001

I8      INC HL
        SUB 8
        CP 8
        RET C
        JR I8



