; заливка, новая версия с использованием Texture.asm

FillPgn
             DISP PgnAdr

BFill
             call Texture
             ld a,(Texture.fselect)
             or a
            ret nz

             call LOADSCR
             call SV_UNDO
             ld de,FillCur
             call SV_ARW

.lp          ld hl,.Rf
             call ARW_SCN_
            jr nc,.fill
             call SAVESCR
            jp LD_ARW

.fill        call SAVESCR
             ld hl,(ARW_X)
             call .fillHL
             call NOKEY_
            jr .lp

.fillHL      ld (ffill.xy),hl
             call .SOLIDFF
             ld a,(Texture.fsolid)
             or a
             call z,.txtrFF
            ret

.SfillHL     ld (ffill.xy),hl      ; v 3.12
            jp .SOLIDFF


.Rf     DI

        call MiniLoupeScr  ; MiniLoupeHK
       jr z,1F
        ld hl,.Rf_e
       push hl

        cp "U"
       jp z,SWP_Undo
        cp "Y"
       jp z,SV_UNDO_
        cp "R"
       jp z,SWAP_SCR
        cp "C"
       jp z,PRGB2

       pop hl
       jr 1F

.Rf_e   call NOKEY_
1
      ;   ld a,GUIPage    ; |#10  ; LD A,(GUI_PAGE)
      ;  CALL RAM
         call GuiRam
        EI
        RET


;  Далее частями взято из Fill1.asm с изменениями /DA

; TXTRFF  CALL GETTEX
;         CALL SOLIDFF

.SOLIDFF
         ;  ld a,SuxPage|#10
         ;  call Ram
            call suxRAM
       ;    call ffill
       ;   ret
          jp ffill

.txtrFF

        call ScrRam
        ld hl,#4000
        LD B,12
a3      PUSH BC
        LD DE,TxBUFF  ;TBUFF   ;(TXRADR)
        LD B,16
a2      PUSH HL
        PUSH BC
        LD B,16
a1_     LD A,(DE)
        AND (HL)
        set 7,h
        or (hl)
        res 7,h
        LD (HL),A
        INC DE
        INC HL
        LD A,(DE)
        AND (HL)
        set 7,h
        or (hl)
        res 7,h
        LD (HL),A
        INC HL
        DEC DE
        DJNZ a1_
        POP BC
        POP HL
        CALL INC_Y
        INC DE
        INC DE
        DJNZ a2
        POP BC
        DJNZ a3
       ret


FillCur DB #1F,#40,#4F,#A0,#0F,#60,#87,#10
        DB #E3,#08,#F1,#04,#FB,#00,#FF,#00
        DB #FF,#00,#FF,#00  ;,#FF,#00,#FF,#00
     ;   DB #FF,#00,#FF,#00,#FF,#00,#FF,#00


; (C)  TomCaT  /zx-pk.ru/ 04.09.2006, 21:59
; https://zx-pk.ru/threads/1354-protsedura-zalivki-zamknutogo-kontura.html?p=57223&viewfull=1#post57223

; процедура заливки замкнутого контура
; 558 байт + 4 байта переменных, располагаются перед кодом +
; буфер любого размера перед ними
; (1k точно хватает, около полкило - возможно. Обычно сотня-две)
; ..........
; Атрибуты -- короткий кусок, можно вырезать за ненадобностью,
; а другие адреса и параметры отмечены в коде для использования
; из ассемблера,с другими переменными.
; Вниманмие: прерывания выключаются и
; портятся все регистры, кроме ix, iy, hl', sp!
;

  ; Поправил для использования в BGE      /DA
  ; Используем для стека/буфера область #E000-#FFFF из страницы свапа экрана
  MACRO FFSF
    exx
    ld  h,d
    ld  l,e
    add hl,sp
    jr  c,$+8
    ld  ix,ff_sp    ; вершина буфера
    ld  sp,ix
    ex  de,hl
    ld  d,iyh
    ld  e,iyl
    ld  b,a
    exx
    ld  a,b
    rrca
    rrca
    rrca
    and #fe
    res 6,h
    or  h
    ld  h,a
    push    hl
    dec ix
    dec ix
    and 31
    xor 64
    ld  h,a
    exx
    ld  a,b
    ld  b,ixh
    ld  c,ixl
    ex  de,hl
    sbc hl,bc
    jp  z,ffilmf
    exx
    rra
   ENDM

ff_sp  EQU #FFFF-4  ;defs   4

ffill   push    ix
    push    iy
    ld  hl,0
    ld  (ff_sp+2),hl
    ld  ix,ff_sp    ; вершина буфера
    di
    ld  iy,ff_sp    ; вершина буфера
    ld  bc,#E000         ;(23730)   ; RAMTOP, дно буфера
    dec hl
    dec hl
    and a
    sbc hl,bc
    ex  de,hl
    exx
    push    hl
    ld  (ff_sp),sp
    ;ld  bc,(23677)    ; COORDS, нач. координаты
    ld de,#0000
.xy EQU $-2
;   ld  a,(23659)   ; от сюда...
;   rlca            ; ...
;   rlca            ; ...
;   rlca            ; ...
;   ld  e,a     ; до сюда только для учета раб. окна редактирования
;   ld  a,191       ; сменить на ld a,b, если отсчет сверху
;   sub e       ; только, если на экране рабочее окно
;   sub b       ; не нужно, если отсчет коорд-т сверху
      ld a,d
 ;  call  8880
      call  PixHL
      ld a,e
      and 7
    inc a
    ld  b,a
    ld  c,a
    ld  a,(hl)
    rlca
    djnz    $-1
    jp  c,ffiler
    ld  d,8
    ld  b,c
ffilft  rrca
    jr  c,ffiln0
    djnz    ffilft
    ld  a,#1f
    and l
    jr  z,ffilwb
    dec l
    ld  a,(hl)
    ld  b,d
    jr  ffilft
ffilwb  ld  c,(hl)
    ld  b,d
    ld  a,b
    jr  ffilns+4
ffiln0  rlca
    bit 3,b
    jr  z,ffilns
    inc l
    ld  c,(hl)
    ld  a,b
    jr  ffilns+4
ffilns  ld  c,a
    rla
    jp  c,ffiltf
    ld  a,d
    sub b
    ld  b,a
    sub d
    ld  e,a
    dec a
    ex  af,af'
    ld  a,c
    ld  c,-1
ffilnb  and a
    jr  z,ffilnw-1
    scf
    rla
    jr  c,ffilne
    djnz    $-4
    jr  ffilnw
ffilne  bit 3,b
    jr  nz,ffilud-3
    ld  c,b
    rrca
    rlca
    dec e
    djnz    $-2
    jr  ffilnw
    dec a
ffilnw  ld  (hl),a
    ld  a,h     ; от сюда...
    srl a       ; ...
    rra         ; ...
    srl a       ; ...
    or  80      ; ...
    ld  b,h     ; ...
    ld  h,a     ; ...
      ;  ld  a,(hl)         ;(23695) ; ... (значение атрибутов)
      ; MIXCOL
          ld (ffil_sDE),de
          ld a,(MASKRGB)
          ld d,a
        ld a,(hl)
          and d
          ld e,a
          ld a,(REALRGB)
          or d
          xor d
          or e
          ld de,#0000
ffil_sDE EQU $-2

      ld  (hl),a      ; ...
    ld  h,b     ; до сюда установка атрибутов
    ld  a,e
    add a,d
    ld  e,a
    inc c
    jr  nz,ffilud
    dec c
    inc l
    ld  a,31
    and l
    ld  b,d
    ld  a,(hl)
    jr  nz,ffilnb
    dec l
    ld  c,1
ffilud  ld  a,h
    ld  b,c
    ld  c,d
    dec c
    and c
    jr  z,ffilst
    xor c
    jr  z,ffilsb
    ld  a,h
    dec h
    ld  sp,hl
    inc a
    jr  ffilf2
ffilst  inc h
    ld  sp,hl
    dec h
    ld  a,l
    sub 32
    ld  l,a
    ld  a,h
    jr  c,ffiltt
    or  c
    jr  ffilf2
ffiltt  cp  64
    jr  z,ffilse
    dec a
    jr  ffilf2
ffilse  ld  l,-1
    ld  a,l
    jr  ffilf2
ffilsb  dec h
    ld  sp,hl
    inc h
    ld  a,l
    add a,32
    ld  l,a
    ld  a,h
    jr  c,ffiltb
    xor c
    jr  ffilf2
ffiltb  cp  80
    jr  nc,ffilse
    inc a
ffilf2  ld  h,a
    cp  -1
    jr  z,$+4
    ld  a,(hl)
    rlca
    ld  c,b
    inc d
    rrca
    dec d
    djnz    $-2
    scf
    ex  af,af'
    ld  b,c
    dec sp
    pop af
    dec sp
    rlca
    rrca
    djnz    $-1
    ld  b,d
    ld  c,e
    ld  de,0
    ex  de,hl
    add hl,sp
    scf
    ld  sp,ix
ffilsf  rra
    jr  nc,ffilss
    rla
    jr  c,ffilss-1
    FFSF
ffilss  ex  de,hl
    ex  af,af'
    rra
    jr  nc,ffilsn
    rla
    jr  c,ffilsn-1
    FFSF
ffilsn  dec c
    jr  nz,ffilsc
    jr  nc,ffils1
    ld  a,-1
    cp  d
    jr  z,ffiltf
    ld  h,a
    ld  l,h
    scf
ffils1  ex  af,af'
    ex  de,hl
    jr  nc,ffils2
    ld  a,-1
    cp  d
    jr  z,ffiltf
    ld  h,a
    ld  l,h
    scf
ffils2  dec b
    jr  nz,ffilsc-2
    rla
    ld  b,a
    ld  a,l
    and #1f
    jr  z,ffille
    ld  a,e
    and #1f
    jr  nz,ffilsc-5
ffille  dec l
    dec e
    ld  a,b
    ld  b,c
    or  2
    rra
    ex  af,af'
    rra
    scf
    rla
    inc c
    ex  af,af'
    jp  ffilsf
    ld  a,b
    rra
    ld  b,c
    inc b
    inc c
ffilsc  djnz    ffilmf-3
    dec l
    dec e
    ld  a,h
    inc a
    jr  z,$+4
    ld  a,(hl)
    inc a
    dec a
    ex  af,af'
    ex  de,hl
    ld  a,h
    inc a
    jr  z,$+4
    ld  a,(hl)
    inc a
    dec a
    ld  b,8
    jp  ffilsf
ffilmf  ld  hl,(ff_sp+2)
    inc hl
    ld  (ff_sp+2),hl
    jr  ffiltf+15
ffiltf  and a
    ld  d,iyh
    ld  e,iyl
    ex  de,hl
    ld  d,ixh
    ld  e,ixl
    sbc hl,de
    jr  z,ffilar
    exx
    ld  sp,iy
    ld  l,e
    ld  h,d
    add hl,sp
    jr  c,$+6
    ld  iy,ff_sp    ; вершина буфера
    dec iy
    dec iy
    ld  sp,iy
    exx
    pop hl
    ld  a,h
    rlca
    rlca
    rlca
    ld  d,7
    and d
    jr  nz,$+3
    inc l
    ld  b,a
    ld  a,h
    and #1f
    or  #40
    ld  h,a
    ld  a,(hl)
    rrca
    ld  c,b
    inc b
    rlca
    djnz    $-1
    ld  b,c
    inc d
    jp  ffilns
ffiler  ld  hl,-1
    jr  ffilar+3
ffilar  ld  hl,(ff_sp+2)
    ld  sp,(ff_sp)
    ex  (sp),hl
    exx
    pop bc
    pop iy
    ei
    pop ix
    ret


LFill   EQU $-BFill
        ENT
       DISPLAY "Fill len   :",/a,LFill

