Login

Subversion Repositories NedoOS

Rev

Rev 413 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

;-----------Вывод спрайтов героев
        if EGA==0
t7tab   DEFB 23,#20 ;[**]
        DEFB 11,#21
        DEFB 12,#60
        DEFB 13,#40  ;           LD HL,#4060
        DEFB 24,#F8    ;           JR NZ,tst70
        DEFB 25,#21
        DEFB 18,#23      ;           INC HL
        DEFB 19,#0D      ;           DEC C
        DEFB 29,#C9     ;       RET
        DEFB 20,#20
        DEFB 21,#FB    ;           JR NZ,tst70
        DEFB 26,#FE
        DEFB 15,#00
        DEFB 16,#35  ;           LD BC,#3500
        DEFB 17,#AE      ;   tst70   XOR (HL)
        DEFB 28,#BE      ;           CP (HL)
        DEFB 22,#05      ;           DEC B
        DEFB 27,#FF  ;           LD HL,#FFFE
        DEFB 14,#01
        DEFB 0

;старшие байты адресов (к ним прибавляется (направление*2 + шаг)*64)
AT_HER  DEFB #C0,#C6,#CA,#CE,#D2
        DEFB #D8,#DE,#E4,#F1
        DEFB #C4,#CA,#D0,#D6,#DC,#DC

;старшие байты адресов фазы удара (к ним прибавляется (направление)*64)
AT_WAR  DEFB #C4,#C4,#C4,#00,#D6
        DEFB #DC,#E2,#ED,#FA
        DEFB #C8,#CE,#D4,#DA,#00,#00
        endif

        if EGA
theropg
;pg,shift in pg
        db 8,0 ;0=крестьянин
        db 8,24 ;1=крестьянин с дровами?
        db 8,24+16 ;2=крестьянин с мешком?
        db 9,0 ;3=лучник
        db 9,16 ;4=мечник
        db 10,0 ;5=священник
        db 10,24 ;6=волшебник
        db 11,0 ;7=катапульта
        db 12,0 ;8=всадник

        db 13,0 ;9=пеон
        db 13,24 ;10=пеон с дровами?
        db 13,24+16 ;11=пеон с мешком?
        db 14,0 ;12=лангольер
        db 14,16 ;13=кунг
        db 15,0 ;14=некромант
        db 15,24 ;15=варлок
        db 16,0 ;16=катапульта на гусеницах
        db 17,0 ;17=грюнвер

        db 18,0 ;18=паук
        db 18,24 ;19=скелет
        db 19,0 ;20=скорпион
        db 19,24 ;21=звезда
        db 20,0 ;22=князь
        db 20,16 ;23=гризольда
        db 21,0 ;24=костолом
        db 22,0 ;25=демон
        db 23,0 ;26=стеногрыз
       
;tbodypg ;все 16 рисунков в pg 24
;pg,shift in pg

;0..3=человек (меньше=дохлее)
;4..7=кунг (меньше=дохлее)
;8..10=шарик (меньше=дохлее)
;11=звезда
;12=мокрое место
;13=паук
;14=скорпион
;15=скелет
;(>=17 используется для трупа катапульты)
       
        endif

;для рамки
;в зависимости от полного ID
;0: 16x16, 1: 24x24, 2: 24x16
AT_TY_  DEFB 0,0,0,0,0, 0,0,1,1
;далее продолжение в AT_TYP
;для героя
;в зависимости от ID (для кунгов вычитается 9)
;0: 16x16, 1: 24x24, 2: 24x16
AT_TYP  DEFB 0,0,0,0,0, 0,0,1,1
        DEFB 0,0,0,0,0,0, 2,2,2
;0=крестьянин
;1=крестьянин с дровами?
;2=крестьянин с мешком?
;3=лучник
;4=мечник
;5=священник
;6=волшебник
;7=катапульта
;8=всадник

;9=пеон
;10=пеон с дровами?
;11=пеон с мешком?
;12=лангольер
;13=кунг
;14=некромант
;15=варлок
;16=катапульта на гусеницах
;17=грюнвер

;18=паук
;19=скелет
;20=скорпион
;21=звезда
;22=князь
;23=гризольда
;24=костолом
;25=демон
;26=стеногрыз

;виды трупов:
;0..3=человек (меньше=дохлее)
;4..7=кунг (меньше=дохлее)
;8..10=шарик (меньше=дохлее)
;11=звезда
;12=мокрое место
;13=паук
;14=скорпион
;15=скелет
;(>=17 используется для трупа катапульты)

XY0pos  LD A,(X0) ;выч смещ _X0pos в пикс
        CALL _xy0
        LD (_X0pos),HL
        LD A,(Y0)
        CALL _xy0
        LD (_Y0pos),HL
        RET
_xy0    LD L,A
        LD H,0
        LD D,H
        LD E,H
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        EX DE,HL
        XOR A
        SBC HL,DE
        RET

        if EGA==0
;*M+
        macro HENs lbl
        POP DE
        DJNZ $+5
        JP SET_SP
        INC H
        LD A,H
        AND 7
        JP NZ,lbl
        LD A,L
        ADD A,32
        LD L,A
        JR C,lbl
        LD A,H
        SUB 8
        LD H,A
        JR lbl
        ENDM

HE_N    DEFW HE0,HE1,HE2,HE3,HE4,HE5,HE6,HE7
HE_L    DEFW SET_SP,HE1L,HE2L,HE3L,HE4L,HE5L,HE6L,HE7L

;HE0L   EQU SET_SP

HE0     LD A,(HL)
        OR E
        XOR D
        LD (HL),A
        HENs HE0

HE1     LD A,E
        RRCA
        LD C,A
        AND #7F
        OR (HL)
        LD (HL),A
        LD A,C
        AND #80
        INC L
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        LD C,A
        AND #80
        XOR (HL)
        LD (HL),A
        LD A,C
        AND #7F
        DEC L
        XOR (HL)
        LD (HL),A
        HENs HE1


HE2     LD A,E
        RRCA
        RRCA
        LD C,A
        AND #3F
        OR (HL)
        LD (HL),A
        LD A,C
        AND #C0
        INC L
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        RRCA
        LD C,A
        AND #C0
        XOR (HL)
        LD (HL),A
        LD A,C
        AND #3F
        DEC L
        XOR (HL)
        LD (HL),A
        HENs HE2

HE3     LD A,E
        RRCA
        RRCA
        RRCA
        LD C,A
        AND #1F
        OR (HL)
        LD (HL),A
        LD A,C
        AND #E0
        INC L
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        RRCA
        RRCA
        LD C,A
        AND #E0
        XOR (HL)
        LD (HL),A
        LD A,C
        AND #1F
        DEC L
        XOR (HL)
        LD (HL),A
        HENs HE3

HE4     LD A,E
        RRCA
        RRCA
        RRCA
        RRCA
        LD C,A
        AND #F
        OR (HL)
        LD (HL),A
        LD A,C
        AND #F0
        INC L
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        RRCA
        RRCA
        RRCA
        LD C,A
        AND #F0
        XOR (HL)
        LD (HL),A
        LD A,C
        AND #F
        DEC L
        XOR (HL)
        LD (HL),A
        HENs HE4

HE5     LD A,E
        RLCA
        RLCA
        RLCA
        LD C,A
        AND #7
        OR (HL)
        LD (HL),A
        LD A,C
        AND #F8
        INC L
        OR (HL)
        LD (HL),A
        LD A,D
        RLCA
        RLCA
        RLCA
        LD C,A
        AND #F8
        XOR (HL)
        LD (HL),A
        LD A,C
        AND #7
        DEC L
        XOR (HL)
        LD (HL),A
        HENs HE5

HE6     LD A,E
        RLCA
        RLCA
        LD C,A
        AND #3
        OR (HL)
        LD (HL),A
        LD A,C
        AND #FC
        INC L
        OR (HL)
        LD (HL),A
        LD A,D
        RLCA
        RLCA
        LD C,A
        AND #FC
        XOR (HL)
        LD (HL),A
        LD A,C
        AND #3
        DEC L
        XOR (HL)
        LD (HL),A
        HENs HE6

HE7     LD A,E
        RLCA
        LD C,A
        AND #1
        OR (HL)
        LD (HL),A
        LD A,C
        AND #FE
        INC L
        OR (HL)
        LD (HL),A
        LD A,D
        RLCA
        LD C,A
        AND #FE
        XOR (HL)
        LD (HL),A
        LD A,C
        AND #1
        DEC L
        XOR (HL)
        LD (HL),A
        HENs HE7

HE1L    LD A,E
        RRCA
        AND #80
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        AND #80
        XOR (HL)
        LD (HL),A
        HENs HE1L

HE2L    LD A,E
        RRCA
        RRCA
        AND #C0
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        RRCA
        AND #C0
        XOR (HL)
        LD (HL),A
        HENs HE2L

HE3L    LD A,E
        RRCA
        RRCA
        RRCA
        AND #E0
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        RRCA
        RRCA
        AND #E0
        XOR (HL)
        LD (HL),A
        HENs HE3L

HE4L    LD A,E
        RRCA
        RRCA
        RRCA
        RRCA
        AND #F0
        OR (HL)
        LD (HL),A
        LD A,D
        RRCA
        RRCA
        RRCA
        RRCA
        AND #F0
        XOR (HL)
        LD (HL),A
        HENs HE4L

HE5L    LD A,E
        RLCA
        RLCA
        RLCA
        AND #F8
        OR (HL)
        LD (HL),A
        LD A,D
        RLCA
        RLCA
        RLCA
        AND #F8
        XOR (HL)
        LD (HL),A
        HENs HE5L

HE6L    LD A,E
        RLCA
        RLCA
        AND #FC
        OR (HL)
        LD (HL),A
        LD A,D
        RLCA
        RLCA
        AND #FC
        XOR (HL)
        LD (HL),A
        HENs HE6L

HE7L    LD A,E
        RLCA
        AND #FE
        OR (HL)
        LD (HL),A
        LD A,D
        RLCA
        AND #FE
        XOR (HL)
        LD (HL),A
        HENs HE7L
       
        endif ;~EGA

BCOORD  LD      A,D ;de(0-191,0-31) -- hl
        RRCA
        RRCA
        RRCA
        AND     %00011000
        LD      H,A
        LD      A,D
        AND     %00000111
        ADD     A,H
        ADD     A,DSCR/256
        LD      H,A
        LD      A,D
        RLA
        RLA
        AND     %11100000
        OR      E
        LD      L,A
        RET

XPUT    ;формированиe вывода для героя IX
;IY=блок координат героя
        XOR A
_XPUT   EX AF,AF ;Z-герой, NZ-(A=1:рамка/A>1:снаряд)
        LD L,(IY+2) ;получение Xh Yh SHIFTh
        LD H,(IY+3) ;Ypos
        LD DE,(_Y0pos)
        ADD HL,DE
        LD A,H
        OR A
        RET NZ
        LD A,L
        CP 192+32;24
        RET NC
        LD (Yh),A
        LD L,(IY+0)
        LD H,(IY+1) ;Xpos
        LD DE,(_X0pos)
        ADD HL,DE
        LD A,H
        OR A
        JR NZ,UT3
        LD A,L
        CP 192
        RET NC
        LD L,A
        SRL L
        JR UT2
UT3     INC A
        RET NZ
        LD A,L
        CP 192+32;40
        RET C
        LD L,A
        SRA L
UT2     AND 7
        LD (SHIFTh),A
        SRA L
        SRA L
        LD A,L
        JP M,UT21
        CP 24
        RET NC
        JR UT22
UT21    CP -8
        RET C
UT22    LD (Xh),A
        ;получть Wh,Hh,IMGh, выбрать страницу
       
        if EGA

        EX AF,AF
        JR Z,WY_0 ;героя, а не рамка/снаряд
        ;для рамки
        DEC A
        JP NZ,WYbull;->обр снарядов ;заполняет данные и переходит на HeF1
        CALL MEM1
        LD A,(IX+4) ;ID (0..26)
        LD HL,AT_TY_
        CALL BA ;hl+=a: A=(HL)
        DEC A
        JR Z,WYr33
        ;LD BC,#1002 ;HhWh
        ;LD DE,fr2x2h
        ld iy,fr2x2h;testspr+4
        ;ld bc,0x1002 ;HhWh
        JR WYr
WYr33   ;LD BC,#1803 ;HhWh
        ;LD DE,fr3x3h
        ld iy,fr3x3h;testspr+4
        ;ld bc,0x1803 ;HhWh
WYr     JP HeF1
WY_0   
        LD A,(IX+0) ;x героя (0=труп)
        OR A
        LD A,(IX+4) ;ID (0..26)
        JR NZ,WY2
        ;для трупа a=вид трупа
         add a,24
        add a,a
        ld (WYbody_where),a
         ld a,23;24
        call _128
WYbody_where=$+2 ;LSB
        ld iy,(0xc000)
        JP HeF1
        ;
WY2     ;для героя
        ;ld a,24;8

        ld hl,theropg ;pg, shift in pg
        add a,a
        add a,l
        ld l,a
        jr nc,$+3
        inc h
        ld a,(hl)
        call _128
        inc hl

        LD D,(IX+2) ;направление (0..7)
        LD A,(IX+3) ;фаза (=0 - целиком в квадрате) ;или (%1ibttttt, где i-удар b-назад ttttt-задержка) ;или (%10000xxx, где ххх-ожидание свободного прохода)
        CP #80
        JR C,H221 ;не бьёт
        CP #A0
        LD A,0
        JR C,H221 ;не фаза удара
        LD A,D ;направление (0..7)
        add a,16
        JR H222
H221   
        AND 1 ;шаг0 или шаг1
        ADD A,D
        ADD A,D ;a=направление*2 + шаг
H222
        add a,(hl) ;ahift in pg
        add a,a
        ld (H222_where),a

        ;ld iy,testspr+4
         ;jr $
H222_where=$+2 ;LSB
        ld iy,(0xc000)
        ;ld bc,0x1002 ;HhWh

        else
;       --------------------
        EX AF,AF
        JR Z,WY_0 ;героя, а не рамка/снаряд
        ;для рамки
        DEC A
      if EGA==0
        JP NZ,WYbull;->обр снарядов
      endif
        CALL MEM1
        LD A,(IX+4) ;ID (0..26)
        LD HL,AT_TY_
        CALL BA ;hl+=a: A=(HL)
        DEC A
        JR Z,WYr33
        LD BC,#1002 ;HhWh
        LD DE,fr2x2h
        JR WYr
WYr33   LD BC,#1803 ;HhWh
        LD DE,fr3x3h
WYr     JP HeF1
WY_0    LD A,(IX+0) ;x героя (0=труп)
        OR A
        LD A,(IX+4) ;ID (0..26)
        JR NZ,WY2
        ;для трупа a=вид трупа
        CP 17
        JR C,WYTr
        CALL MEM6 ;труп катап
        LD DE,WMISC3 ;gfxdata трупа катапульты
        LD BC,#1803 ;HhWh
        JP HeF1
WYTr    ADD A,A
        ADD A,A
        ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL ;вид трупа*64
        LD DE,WMISC2
        ADD HL,DE
        EX DE,HL ;gfxdata
        CALL MEM1
        LD BC,#1002 ;HhWh
        JP HeF1
        ;
WY2     ;для героя
        LD E,A ;ID (0..26)
        SUB 9
        JR NC,WY1
        if 1==0
        LD A,4 ;люди
        else
        call MEM_humans
        endif
        JR WY0
WY1     LD E,A ;ID - 9 (0..17)
        CP 9
        JR C,WY04
        CP 16
        if 1==0
        LD A,6 ;креат 18-24
        JR C,WY0
        XOR A   ;креат 25-26
        JR WY0
        else
        jr c,WY_MEM_char0
        call MEM_char1 ;креат 25-26
        JR WY0
WY_MEM_char0
        call MEM_char0 ;креат 18-24
        JR WY0
        endif
WY04   
        if 1==0
        LD A,3  ;кунги
        else
        call MEM_kungs
        endif
WY0    
        if 1==0
        CALL MEM ;page
        endif
        LD A,E ;ID (0..26)
        LD HL,AT_TYP
        CALL BA ;hl+=a: A=(HL)
        CP 1
        LD D,(IX+2) ;направление (0..7)
        LD A,(IX+3) ;фаза (=0 - целиком в квадрате) ;или (%1ibttttt, где i-удар b-назад ttttt-задержка) ;или (%10000xxx, где ххх-ожидание свободного прохода)
        JR Z,H3x3
        JP NC,H3x2
H2x2    CP #80
        JR C,H221 ;не бьёт
        CP #A0
        LD A,0
        JR C,H221 ;не фаза удара
        LD A,D ;направление (0..7)
        LD BC,AT_WAR
        JR H222
H221    LD BC,AT_HER
        AND 1 ;шаг0 или шаг1
        ADD A,D
        ADD A,D ;a=направление*2 + шаг
H222    ADD A,A
        ADD A,A
        ADD A,A
        ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL ;*64
        LD A,E ;ID
        EX DE,HL
        LD L,C
        LD H,B
        LD BC,#1002 ;HhWw
H225    CALL BA
        LD H,A
        LD L,0
        ADD HL,DE
        EX DE,HL
        JR HeF1
        ;
        ;H3x2 - в WLIB2x3
        ;
H3x3    CP #80
        JR C,H331 ;не бьёт
        CP #A0
        LD A,0
        JR C,H331 ;не фаза удара
        LD BC,#ED00 ;gfxdata
        LD A,D ;направление
        JR H332
H331    LD BC,#E400 ;gfxdata
        AND 1 ;шаг0 или шаг1
        ADD A,D
        ADD A,D
        LD D,A ;направление*2 + шаг
H332    ADD A,A
        ADD A,D
        LD D,A
        ADD A,A
        ADD A,D
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL ;*144
        ADD HL,BC ;+gfxdata
        LD BC,#1803 ;HhWh
        LD A,E ;ID
        CP 7
        JR Z,H333 ;катапульта на колёсах
        LD DE,#D80
        ADD HL,DE ;катапульта на гусеницах
H333    EX DE,HL
        endif ;~EGA
;       --------------------
HeF1    ;корректировка ширины,длины и др. по границам окна
        if EGA
        ld c,(iy-4) ;Wh
        srl c
        srl c
        ld b,(iy-3) ;Hh
        endif

;YhXh (Xh в знакоместах)
;SHIFTh = 0..7 (xlow)
;bc=HhWh (Wh в знакоместах)
;de=gfxdata
        LD (Wh),BC
        LD HL,(Xh)
        LD A,H
        SUB B
        LD (Yh),A
       
        if EGA==0
       
        LD A,L
        CP 24
        JR NC,eF3
        SUB 24
        NEG
        CP C
        JR NC,eF4
        LD C,A
        JR eF4
eF3     INC A
        LD L,A
        ADD A,C
         RET M
         RET Z
        LD C,A
        LD A,-1
        LD (Xh),A
        LD A,L
        NEG
        LD L,A
        JR Z,eF4
        XOR A
eF5     ADD A,B
        ADD A,B
        DEC L
        JR NZ,eF5
        ADD A,E
        LD E,A
        JR NC,eF4
        INC D
eF4    
        LD A,(Yh)
        CP 192
        JR NC,eF1
        SUB 192
        NEG
        CP B
        JR NC,eF2
        LD B,A
        JR eF2
eF1     LD L,A
        ADD A,B
         RET M
         RET Z
        LD B,A
        XOR A
        LD (Yh),A
        LD A,L
        NEG
        ADD A,A
        ADD A,E
        LD E,A
        JR NC,eF2
        INC D
eF2    
        endif

;собств вывод
;YhXh (Xh в знакоместах)
;HhWh (Wh в знакоместах)
;SHIFTh = 0..7 (xlow)
;de=gfxdata
        if EGA
      ;ld iy,testspr+4
        jp prsprega
        else

        PUSH DE
        LD HL,HE_N
        LD DE,(Xh)
        BIT 7,E
        JR Z,HRU8
        LD HL,HE_L
        LD E,0
HRU8    EX AF,AF
        LD A,(SHIFTh)
        CALL WT
        LD (JP_SUB+1),HL
        CALL BCOORD
        POP DE
HRU0    PUSH HL
        PUSH DE
        PUSH BC
        LD (IMGh),HL
        CALL HRUp
        POP BC
        POP DE
        POP HL
        DEC C
        JR Z,HRU5
        EX AF,AF
        JR NZ,HRUm
        INC L
        JR HRUm1
HRUm    LD A,(SHIFTh)
        PUSH HL
        LD HL,HE_N
        CALL WT
        LD (JP_SUB+1),HL
        POP HL
HRUm1   XOR A
        EX AF,AF
        LD A,(Hh)
        ADD A,A
        ADD A,E
        LD E,A
        JR NC,HRU0
        INC D
        JR HRU0

HRU5    RET

HRUp    EX DE,HL
        LD E,(HL)
        INC HL
        LD D,(HL)
        INC HL
        LD (SET_SP+1),SP
        LD SP,HL
        LD HL,(IMGh)
        JP JP_SUB
        endif ;~EGA

vBUF    EQU #7E00;BUF512
        ;256 - eсть в строке?(ptr+1/0); 256-1_2:IX,3_4:IY,5й:next+1/null
vSORT   ;видео сортировка
        LD HL,vBUF
        LD DE,vBUF+1
        LD BC,192+24
        LD (HL),0
        LDIR
        ;
        EXX
        LD HL,vBUF+1+256
        EXX
        LD IX,HUMAN
        LD B,102
        LD IY,XY ;зачем отдельный массив? в каждом проходе прибавляем 4
vS0     LD A,(IX+0) ;x героя (0=труп)
        OR A
        JR Z,vS6 ;???
        LD L,(IY+0)
        LD H,(IY+1) ;Xpos
        LD DE,(_X0pos)
        ADD HL,DE
        LD A,H
        OR A
        JR NZ,vS3
        LD A,L
        CP 192
        JR NC,vS1
        JR vS4
vS6     LD A,(IX+1) ;y героя (0=пусто)
        OR A
        JR Z,vS1 ;нет героя
        LD L,0
        JR vS4_
vS3     INC A
        JR NZ,vS1
        LD A,L
        CP 192+40
        JR C,vS1
vS4     LD L,(IY+2)
        LD H,(IY+3) ;Ypos
        LD DE,(_Y0pos)
        ADD HL,DE
        LD A,H
        OR A
        JR NZ,vS1
        LD A,L
        CP 192+24
        JR NC,vS1
vS4_    LD H,vBUF/256
        LD A,(HL)
        OR A
        JR Z,vS5
        LD H,vBUF/256+1
vSM6    LD L,A
        LD A,(HL)
        OR A
        JR NZ,vSM6
vS5     EXX
        PUSH IX
        POP DE
        LD (HL),E
        INC L
        LD (HL),D
        INC L
        PUSH IY
        POP DE
        LD (HL),E
        INC L
        LD (HL),D
        INC L
        LD A,L
        LD (HL),0
        INC L
        EXX
        LD (HL),A
        RET Z ;более 51 героя в экране
vS1     LD DE,16
        ADD IX,DE ;следующий герой
        LD E,4
        ADD IY,DE ;следующий блок координат
        DJNZ vS0
        RET

vXPUT   ;отсорт вывод
        CALL outSEL
        LD HL,vBUF
vX0     LD A,(HL)
        OR A
        JR Z,vX1
        PUSH HL
        LD H,vBUF/256+1
vX2     LD L,A
        PUSH HL
        DEC L
        LD D,(HL)
        DEC L
        LD E,(HL)
        PUSH DE
        POP IY ;адрес в блоке координат
        DEC L
        LD D,(HL)
        DEC L
        LD E,(HL)
        PUSH DE
        POP IX ;адрес героя
        CALL XPUT
        POP HL
        LD A,(HL)
        OR A
        JR NZ,vX2
        POP HL
vX1     INC L
        LD A,L
        CP 192+24
        JR C,vX0
        RET

vrYLF   LD A,#D8 ;ограничители
        LD HL,#1000
        JR vrYs
vrYRT   LD A,#FF
        LD HL,#C098
vrYs    LD DE,#D800
        JR vr_
vrXUP   LD DE,#2800
        JR vrXs
vrXDW   LD DE,#D8B0
vrXs    LD A,#D8
        LD HL,#C000
vr_     CALL vrSET
        CALL XY0pos
        ;сортировка по окну
        LD HL,vBUF
        LD DE,vBUF+1
        LD BC,256
        LD (HL),0
        LDIR
        ;
        EXX
        LD HL,vBUF+256
        EXX
        LD IX,HUMAN
        LD B,102
        LD IY,XY
vrS0    LD A,(IX)
        OR A
        JR Z,vrS6
        LD L,(IY+0)
        LD H,(IY+1)
        LD DE,(_X0pos)
        ADD HL,DE
        LD A,H
        OR A
        JR NZ,vrS3
        LD A,L
vrH     CP 0    ;<-H
        JR NC,vrS1
vrL     CP 0    ;<-L
        JR C,vrS1
        JR vrS4
vrS6    LD A,(IX+1)
        OR A
        JR Z,vrS1
        LD L,0
        JR vrS4_
vrS3    INC A
        JR NZ,vrS1
        LD A,L
vrA     CP 0    ;<-A
        JR C,vrS1
vrS4    LD L,(IY+2)
        LD H,(IY+3)
        LD DE,(_Y0pos)
        ADD HL,DE
        LD A,H
        OR A
        JR NZ,vrS1
        LD A,L
vrD     CP 0    ;<-D
        JR NC,vrS1
vrE     CP 0    ;<-E
        JR C,vrS1
vrS4_   LD H,vBUF/256
        LD A,(HL)
        OR A
        JR Z,vrS5
        LD H,vBUF/256+1
vrSM6   LD L,A
        LD A,(HL)
        OR A
        JR NZ,vrSM6
vrS5    EXX
        PUSH IX
        POP DE
        LD (HL),E
        INC L
        LD (HL),D
        INC L
        PUSH IY
        POP DE
        LD (HL),E
        INC L
        LD (HL),D
        INC L
        LD A,L
        LD (HL),0
        INC L
        EXX
        LD (HL),A
        RET Z ;более 51 героя в экране
vrS1    LD DE,16
        ADD IX,DE
        LD E,4
        ADD IY,DE
        DJNZ vrS0
vrS51   XOR A
        LD L,A
        LD H,A
        LD D,A
        LD E,A
vrSET   LD (vrA+1),A
        LD A,L
        LD (vrL+1),A
        LD A,H
        LD (vrH+1),A
        LD A,E
        LD (vrE+1),A
        LD A,D
        LD (vrD+1),A
        RET

outSEL  ;выв выбр об'ектов и рамки цели
        CALL STD
        LD HL,sel_ti
        LD A,(HL)
        OR A
        JR Z,uS3
        DEC (HL)
        LD A,(TIC)
        RRCA
        JR C,uS3
        DEC HL
        LD A,(HL)
        BIT 7,A
        JR NZ,uS5
        ;рамка героя-цели
        CALL N_IXIY
        LD A,(IX+0)
        OR A
        JR Z,uS3
        LD A,1 ;nz,A=1
        CALL _XPUT
        JR uS3
uS5     ;рамка здания-цели
        AND #7F
        CALL uS6
uS3     LD A,(SEL_T) ;объекты
        OR A
        RET Z
        LD HL,SEL_N
        CP 7
        JR C,uS4
        JR NZ,uS1
        LD A,1
uS4     LD B,A
uS0     PUSH BC
        PUSH HL
        LD A,(HL)
        CALL N_IXIY
        XOR A
        INC A ;nz,A=1
        CALL _XPUT
        POP HL
        INC HL
        POP BC
        DJNZ uS0
        RET
uS1     ;выд.здания
        LD A,(HL)
uS6     CALL B_IX
        LD A,(IX+0)
        OR A
        JP NZ,_BPUT
        RET

B_IX    ;получить IX здания по номеру А
        PUSH HL
        PUSH DE
        ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        LD DE,MINE
        ADD HL,DE
        PUSH HL
        POP IX
        POP DE
        POP HL
        RET

N_IXIY  ;получить IX,IY героя по номеру А
        PUSH AF
        ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        LD A,L
        ADD A,XY&255
        LD L,A
        LD A,XY/256
        ADC A,H
        LD H,A
        PUSH HL
        POP IY
        POP AF
N_IX    ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        LD A,HUMAN/256
        ADD A,H
        LD H,A
        PUSH HL
        POP IX
        RET


_BPUT   ;выв рамки выбора зд

        if EGA
        CALL HL_IX0
        LD A,(IX+2)
        CP 8
        ld c,4*8-1
        JR Z,_Bsmal
        CP 18
        JR Z,_Bsmal
        ld c,6*8-1
_Bsmal
;h,l=координаты центра здания на карте
        LD de,(X0)
        LD A,L
        SUB e
        ;CP 12
        ;RET NC
         inc a
         cp 12+2
         dec a
         ret nc
        dec a
        add a,a
        add a,a
        add a,a
        add a,a
        ld e,a
        add a,c
        ld l,a
       
        LD A,H
        SUB d
        ;CP 12
        ;RET NC
         inc a
         cp 12+2
         dec a
         ret nc
        dec a
        add a,a
        add a,a
        add a,a
        add a,a
        ld d,a
        add a,c
        ld h,a
       
        ld a,0xff
        ex af,af'
;de=top left
;hl=bottom right
;a'
=pattern
        jp outBOXsolid
       
        else

        CALL HL_IX0
        LD A,(IX+2)
        CP 8
        JR Z,_Bsmal
        CP 18
        JR Z,_Bsmal
        DEC L
        INC H;/8
        PUSH HL
        LD DE,#40C0
        CALL bJ0v
        LD DE,#8000
        CALL C,bJ1h_
        POP HL
        INC L;/7
        PUSH HL
        LD D,#00
        CALL bJ0h_
        POP HL
        INC L;/6
        PUSH HL
        LD DE,#0203
        CALL bJ1v
        LD DE,#0001
        DEC L
        CALL C,bJ1h_
        POP HL
        DEC H;/5
        PUSH HL
        LD DE,#0203
        CALL bJ1v
        POP HL
        DEC H;/4
        PUSH HL
        CALL bJ1v
        LD DE,#0001
        DEC L
        CALL C,bJ1h
        POP HL
        DEC L;/3
        PUSH HL
        LD DE,#0000
        CALL bJ0h
        POP HL
        DEC L;/2
        PUSH HL
        LD DE,#40C0
        CALL bJ0v
        LD DE,#8000
        CALL C,bJ1h
        POP HL
        INC H;/1
        LD DE,#40C0
        JP bJ0v
_Bsmal  DEC L;\4
        PUSH HL
        LD DE,#40C0
        CALL bJ0v
        LD DE,#8000
        CALL C,bJ1h_
        POP HL
        INC L;\3
        PUSH HL
        LD DE,#0203
        CALL bJ1v
        LD DE,#0001
        DEC L
        CALL C,bJ1h_
        POP HL
        DEC H;\2
        PUSH HL
        LD DE,#0203
        CALL bJ1v
        LD DE,#0001
        DEC L
        CALL C,bJ1h
        POP HL
        DEC L;\1
        LD DE,#40C0
        CALL bJ0v
        LD DE,#8000
        JP C,bJ1h
        RET

bJ0h_   ;снизу
        CALL bJadr
        RET NC
bJ1h_   LD A,L
        ADD A,32
        LD L,A
        LD A,H
        ADD A,6
        LD H,A
        CALL bJ100
        LD D,E
        DEC H
        INC L
bJ100   XOR A
        XOR D
        LD (HL),A
        INC H
        LD (HL),#FF
        SCF
        RET

bJ0h    CALL bJadr;выв гориз
        RET NC
bJ1h    CALL bJ200
        LD D,E
        DEC H
        INC L
bJ200   LD (HL),#FF
        INC H
        XOR A
        XOR D
        LD (HL),A
        SCF
        RET

bJ1v    CALL bJadr
        RET NC
        INC L
        JR bJ002
bJ0v    ;выв верт лин для здан (HL-adr в map;DE-изобр/маска)
        CALL bJadr
        RET NC
bJ002   PUSH HL
        CALL bJ000
        LD A,H
        SUB 8
        LD H,A
        LD A,L
        ADD A,32
        LD L,A
        CALL bJ000
        POP HL
        SCF
        RET
bJ000   LD B,2
bJ001   LD A,(HL)       ;
        OR E
        XOR D
        LD (HL),A
        INC H
        LD A,(HL)       ;
        OR E
        XOR D
        LD (HL),A
        INC H
        LD A,(HL)       ;
        OR E
        XOR D
        LD (HL),A
        INC H
        LD A,(HL)       ;
        OR E
        XOR D
        LD (HL),A
        INC H
        DJNZ bJ001
        RET

bJadr   LD BC,(X0) ;выч адр (NC/C-out/ok)
        LD A,L
        SUB C
        CP 12
        RET NC
        LD L,A
        LD A,H
        SUB B
        CP 12
        RET NC
        LD H,A
        ADD HL,HL
        PUSH DE
        EX DE,HL
        CALL SCOORD
        POP DE
        XOR A
        CCF
        RET

        endif ;~EGA

        if 1==0
_TST#7   LD HL,dummy+0 ;isTST7[**]
        LD A,(HL) ;mem7!
        OR A
        RET NZ
        PUSH HL
        LD HL,(t7pos)
        CALL GMAP
        LD A,(HL)
        POP HL
        CP #7F
        RET NC
        SET 7,(HL)
        CALL t7dt ;7
        RET Z
        LD HL,BULL+72
        LD B,72
t7er    SET 7,(HL)
        INC HL
        DJNZ t7er
        RET
        ;
t7dt    LD HL,BUF512
        PUSH HL
        LD DE,t7tab
t7d0    LD A,(DE)
        INC DE
        OR A
        JR Z,t7de
        POP HL
        SUB 11
        PUSH HL
        CALL BA
        LD A,(DE)
        INC DE
        LD (HL),A
        JR t7d0
t7de    XOR A
        RET
        endif