Login

Subversion Repositories NedoOS

Rev

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

;-----cобытие------

EVENTr  ;смена героя - новое меню
        XOR A
_EXT    LD (ext_M),A
        LD A,1
        LD (F_FUNC),A
EVENT   ;произошло событие, возможна смена меню
        LD A,1
        LD (_event),A
        RET


;------обновление окна cоcтояний

TX_ADR  ;выч адр назв (A->HL)
       if EGA
;[8*4*6 = 192]
;7*4*6
        ;ld l,a
        ;add a,a
        ;add a,l
        ;ld l,a ;x3
        ;ld h,0
        ;add hl,hl
        LD L,A ;x3
        ADD A,A
        ADD A,L
        LD L,A
        LD E,A
        XOR A
        LD H,A
        LD D,A
        ADD HL,HL;x7
        ADD HL,DE
        ADD HL,HL
        ADD HL,DE
        ADD HL,HL;x7
        add hl,hl
        add hl,hl
        LD DE,0xc000+(8*4*192) ;WNAMES
        ADD HL,DE
       else
        LD L,A ;x3
        ADD A,A
        ADD A,L
        LD L,A
        LD E,A
        XOR A
        LD H,A
        LD D,A
        ADD HL,HL;x7
        ADD HL,DE
        ADD HL,HL
        ADD HL,DE
        ADD HL,HL;x7
        LD DE,WNAMES
        ADD HL,DE
       endif
        RET


putTX   ;напр на выв cообщ A
        LD HL,_msg
        CP (HL)
        RET Z ;еcли дублируетcя
        LD (HL),A
        CALL TX_ADR
        LD (pTX_AD),HL
        LD A,1
        LD (pTXdel),A
        RET

dirTX
;keep ix!!! иначе виснет, если нет ресурсов на ремонт или когда кончается мана при огненном дожде (там и iy тоже)
;но просто обернуть push-ами не помогает, только напрямую в wlih.asm/ZZ8n
        CALL TX_ADR ;экcтр cообщ A
        LD A,(pTXdel)
        OR A
        JR NZ,dtx1
        LD DE,(TX_AD)
        LD (pTX_AD),DE
dtx1    LD (TX_AD),HL
        LD A,6 ;t задер экcтр c
dtx2    LD (pTXdel),A
        CALL MEM7
         if EGA
         push ix
         push iy
         endif
        CALL otx1
         if EGA
         pop iy
         pop ix
         endif
        JP MEM0

outTX   LD HL,pTXdel
        LD A,(HL)
        OR A
        RET Z
        DEC (HL)
        RET NZ
        LD HL,(pTX_AD)
        LD (TX_AD),HL
otx1
        if EGA
        jp TX48x7
        else
        LD BC,#207
        LD HL,#819 ;для isOVER
        LD A,2
        LD (V_FLAG),A
        CALL isOVER
        JR NC,otx2
        CALL V_PUT1
        CALL TX48x7
        CALL V_GET1
        CALL V_MRK1
        JR otx0
otx2    CALL TX48x7
otx0    XOR A
        LD (V_FLAG),A
        RET
        endif


indSYM
        if EGA
;%rlrrrlll
_10=0x47
_01=0xb8
_00=0x00
_11=0xff
indsym_nomana
        db _00,_00,_00,_00
        db _00,_00,_00,_00
        db _00,_00,_00,_00
        db _00,_00,_00,_00
        db _00,_00,_00,_00
indsym_mana
        db _00,_10,_00,_10
        db _00,_11,_01,_10
        db _00,_10,_10,_10
        db _00,_10,_00,_10
        db _00,_10,_00,_10
indsym_percent
        db _00,_11,_00,_10
        db _00,_11,_01,_00
        db _00,_00,_10,_00
        db _00,_01,_01,_10
        db _00,_10,_01,_10
        else
        DEFB #FF,#FF,#FF,#FF,#FF ;no mana indication
        ;DEFB #DD,#C9,#D5,#DD,#DD
        db 0b11011101 ;M
        db 0b11001001
        db 0b11010101
        db 0b11011101
        db 0b11011101
        ;DEFB #CD,#CB,#F7,#E9,#D9
        db 0b11001101 ;%
        db 0b11001011
        db 0b11110111
        db 0b11101001
        db 0b11011001
        endif

oINDY   ;выв инд
        if 1==0
        CALL _TST#7
        endif
       
        if 1==0

        if EGA
        call setpgsscr40008000_current
        call oINDYpp
        call changescrpg_current
        call setpgsscr40008000_current
        call oINDYpp
        call changescrpg_current
        jp setpgsmain40008000
oINDYpp
        endif
       
        else
       
        if EGA
        LD A,2
        LD (V_FLAG),A ;cursor off
        CALL V_PUT1 ;visible screen
        call setpgsscr40008000_current
        call oINDYpp
        CALL V_GET1
        call V_MRK1 ;на видимом экране (в это время G_MX не обновляется, т.к. стрелочка выключена)
        xor a
        LD (V_FLAG),A ;cursor on
        CALL V_PUT2
        call setpgsscr40008000
        call oINDYpp
        call setpgsmain40008000
        jp V_GET_MRK2
oINDYpp
        endif

        endif
       
        if EGA
        LD HL,scrbase+0x2000+(40*40)+0x1d
        else
        LD HL,SCR+189 ;0xbd
        endif
        LD BC,IND1
        CALL oIND_
        LD A,(IND2TP)
        OR A
       
        if EGA
;mana indication symbol
        PUSH AF
        LD DE,indsym_nomana
        CP 1
        JR C,oiL1
        LD DE,indsym_mana
        JR Z,oiL1
        LD DE,indsym_percent
oiL1
        LD HL,scrbase+(59*40)+0x1e
        LD B,5
oinL
        push hl
        LD A,(DE)
        LD (HL),A
        INC DE
        ld a,h
        add a,0x40
        ld h,a
        LD A,(DE)
        LD (HL),A
        INC DE
        ld a,h
        add a,0x20-0x40
        ld h,a
        LD A,(DE)
        LD (HL),A
        INC DE
        ld a,h
        add a,0x40
        ld h,a
        LD A,(DE)
        LD (HL),A
        INC DE
        pop hl
        ld a,l
        add a,40
        ld l,a
        jr nc,$+3
        inc h
        DJNZ oinL
        POP AF
       
        else ;~EGA
       
        PUSH AF
        LD DE,indSYM
        CP 1
        JR C,oiL1
        LD DE,indSYM+5
        JR Z,oiL1
        LD DE,indSYM+10
oiL1
        LD HL,SCR+#3FE
        LD B,5
oinL    LD A,(DE)
        LD (HL),A
        INC DE
        INC H
        DJNZ oinL
        POP AF
       
        endif ;~EGA
       
        if EGA
        LD HL,scrbase+0x2000+(40*40)+0x1e
        else
        LD HL,SCR+190 ;0xbe
        endif
        JR NZ,oin0
        LD B,16
        if EGA
        ld e,0;%00111111
        else
        LD E,%10111110
        endif
        JR oin3
oin0    LD BC,IND2
oIND_   PUSH HL
        LD A,(BC)
        INC BC
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL;x16
        EX DE,HL
        LD A,(BC)
        LD L,A
        CALL DIVB2;->E
        LD A,E
        OR A
        JR NZ,oin1
        DEC BC
        LD A,(BC)
        OR A
        JR Z,oin1
        LD A,1
oin1    LD C,A
        LD A,16
        SUB C
        POP HL
        JR Z,oin2
        LD B,A
        if EGA
        ld e,0;%00111111
        else
        LD E,%10111110
        endif
        CALL oin3
oin2    LD A,C
        OR A
        RET Z
        LD B,C
        if EGA
        ld e,%00011011
        else
        LD E,%10100010
        endif
oin3    LD (HL),E
        if EGA
        ld a,l
        add a,40
        ld l,a
        jr nc,$+3
        inc h
        else
        INC H
        LD A,H
        AND 7
        JR NZ,oin31
        LD A,H
        SUB 8
        LD H,A
        LD A,L
        ADD A,32
        LD L,A
oin31
        endif
        DJNZ oin3
        RET

;---------кнопки----------
oBUT    LD HL,_BUT_H ;выв кнопок
        EXX
        LD DE,BUT_H ;выв гер
        LD HL,#519
        CALL BUT_1
        LD HL,#A19  ;выв 6 кноп
        LD B,3
obu1    PUSH BC
        PUSH HL
        PUSH HL
        CALL BUT_1
        POP HL
        INC L
        INC L
        INC L
        CALL BUT_1
        POP HL
        INC H
        INC H
        INC H
        POP BC
        DJNZ obu1
        RET

BUT_1   LD A,(DE)
        INC DE
        EXX
        CP (HL)
        LD (HL),A
        INC HL
        EXX
        RET Z
        PUSH DE
        PUSH HL
        LD L,A
        LD H,0
       
        if EGA
       
;*288 = 12 * 24 = 9 * 32
        ld d,h
        ld e,l
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,de ;*9
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl
        add hl,hl ;*9*32
        ld de,0xa000
        add hl,de
        bit 6,h
        ld a,30
        jr nz,BUT_1_nopg0
        ld d,0x20
        ;ld de,0x2000
        add hl,de
        dec a
BUT_1_nopg0
        call _128
        ex de,hl
       
        else
       
        PUSH HL
        ADD HL,HL
        ADD HL,HL
        PUSH HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        POP DE
        ADD HL,DE
        POP DE
        ADD HL,DE;x69
        LD DE,WBUTT+23
        ADD HL,DE
        EX DE,HL
       
        endif
       
        if 1==0
       
        POP HL
        PUSH HL
        PUSH DE
        LD BC,#404
        LD A,2
        LD (V_FLAG),A
        CALL isOVER ;курсор над кнопками?
        JR NC,btt1
       
        if EGA
        LD A,2
        LD (V_FLAG),A ;выключить стрелочку
        CALL V_PUT1 ;на видимом экране
        pop de
        pop hl
        push de
        push hl
        call setpgsscr40008000_current
        CALL PUTbut ;в конце делает setpgsmain40008000
        CALL V_GET1
        call V_MRK1 ;на видимом экране (в это время G_MX не обновляется, т.к. стрелочка выключена)
        xor a
        LD (V_FLAG),A ;включить стрелочку
        pop hl
        pop de
        call setpgsscr40008000 ;на рисуемом экране
        CALL PUTbut ;в конце делает setpgsmain40008000
       
        else ;~EGA

        CALL V_PUT1
        POP DE
        POP HL
        CALL PUTbut
        CALL V_GET1
        CALL V_MRK1 ;перерисовываем курсор
       
        endif ;~EGA
       
        JR btt0
btt1
;стрелочка не на панели (а вдруг она была на панели и нельзя будет восстановить?)
        if EGA
        LD A,2
        LD (V_FLAG),A ;выключить стрелочку
        CALL V_PUT1 ;на видимом экране
        pop de
        pop hl
        push de
        push hl
        call setpgsscr40008000_current
        CALL PUTbut
        CALL V_GET1
        call V_MRK1 ;на видимом экране (в это время G_MX не обновляется, т.к. стрелочка выключена)
        xor a
        LD (V_FLAG),A ;включить стрелочку
        pop hl
        pop de
        call setpgsscr40008000 ;на рисуемом экране
        CALL PUTbut
        else ;~EGA
        POP DE
        POP HL
        CALL PUTbut
        endif ;~EGA
       
btt0    XOR A
        LD (V_FLAG),A
        POP DE
        RET

        else
       
        POP HL

        if EGA
        PUSH HL
        PUSH DE

         ;LD BC,#404
         ;LD A,2
         ;LD (V_FLAG),A
         ;CALL isOVER ;курсор над кнопками?
         ;JR C,$ ;над кнопками

        LD A,2
        LD (V_FLAG),A ;выключить стрелочку
        CALL V_PUT1 ;на видимом экране
        POP DE
        POP HL
        push de
        push hl
        call setpgsscr40008000_current
        CALL PUTbut ;в конце делает setpgsmain40008000
        CALL V_GET1
        call V_MRK1 ;на видимом экране (в это время G_MX не обновляется, т.к. стрелочка выключена)
        xor a
        LD (V_FLAG),A ;включить стрелочку
        CALL V_PUT2 ;на рисуемом экране
        pop hl
        pop de
        call setpgsscr40008000 ;на рисуемом экране
        CALL PUTbut ;в конце делает setpgsmain40008000
        CALL V_GET_MRK2 ;на рисуемом экране
       
        else ;~EGA

        PUSH HL
        PUSH DE
        LD BC,#404
        LD A,2
        LD (V_FLAG),A
        CALL isOVER ;курсор над кнопками?
        JR NC,btt1        
        CALL V_PUT1
        POP DE
        POP HL
        CALL PUTbut
        CALL V_GET1
        CALL V_MRK1 ;перерисовываем курсор        
        JR btt0
btt1
;стрелочка не на панели (а вдруг она была на панели на другом экране и нельзя будет восстановить?)
        POP DE
        POP HL
        CALL PUTbut
btt0    XOR A
        LD (V_FLAG),A
       
        endif ;~EGA

        POP DE
        RET
       
        endif

PUTbut
        if EGA
;hl=yx (chrs)
        ld a,l
        ld l,h
        ld h,0
        sla l
        sla l
        sla l ;y*8
        ld b,0x40/8
        ld c,l
        add hl,hl
        add hl,hl
        add hl,bc
        add hl,hl
        add hl,hl
        add hl,hl ;y*8*40
         add a,scrbase&0xff        
        add a,l
        ld l,a
        jr nc,$+3
        inc h
;hl=scr
        ld bc,0x180c
        jp primgega_pixsz ;в конце делает setpgsmain40008000

        else ;~EGA
       
        LD B,3
ptg0    PUSH BC
        PUSH HL
        PUSH DE
         EX DE,HL
         LD A,(HL)
         PUSH AF
         LD (HL),0
         LD BC,-23
         ADD HL,BC
        EX DE,HL
        LD BC,#301
        CALL PUTSYM
        POP AF
        POP HL
        LD (HL),A
        LD BC,23
        ADD HL,BC
        EX DE,HL
        POP HL
        POP BC
        INC L
        DJNZ ptg0
        RET
       
        endif



isOVER  ;?перкр курcор и обл вывода? NC-не перекр
        ;HL-угол,BC-размер окна+1
        LD A,(G_MX)
        RRA
        RRA
        RRA
        AND %11111
        INC A
        SUB L
        CP C
        RET NC
        LD A,(G_MY)
        RRA
        RRA
        RRA
        AND %11111
        INC A
        SUB H
        CP B
        RET


outNUM  ;выв чисел для шахты/избы
        ;display "outNUM=",$
        LD A,(BUT_N+2) ;текущие номера изображений кнопок (6 шт)
        CP 80
        JR Z,oNmine
        CP 77
        RET NZ
        ;изба
        CALL oNUMh
        LD E,C
        LD HL,#E1D
        CALL oNbcd
        CALL oHOMh
        LD E,A
        LD HL,#B1D
oNbcd   PUSH HL
        CALL BCD
        POP DE
        LD A,(DCstr+3)
        CALL iPRINT
        LD A,(DCstr+4)
        JP iPRINT
        ;
oNUMh   ;число юнитов, которым нужна пища ->C
        LD HL,HUMAN
        LD D,0
        LD BC,#3000
oNh1    LD A,(HL)
        OR A
        JR NZ,oNh2
        LD E,16
        JR oNh3
oNh2    LD E,4
        ADD HL,DE
        LD A,(HL)
        CP 18
        JR NC,oNh4
        INC C
oNh4    LD E,12
oNh3    ADD HL,DE
        DJNZ oNh1
        RET
        ;
oHOMh   LD A,8 ;число предост пищи (4*N_ферм+1)->A
        CALL searcB
        ADD A,A
        ADD A,A
        INC A
        RET
        ;
oNmine  ;шахта
        LD A,(SEL_T)
        CP 8
        RET NZ
        LD A,(SEL_N)
        CALL B_IX
        LD E,(IX+4)
        LD D,(IX+5)
        CALL BCD
        LD DE,#E19
        LD HL,DCstr+1
        LD B,4
oNm1    LD A,(HL)
        INC HL
        CALL iPRINT
        DJNZ oNm1
        XOR A
        CALL iPRINT
        XOR A
        JP iPRINT

searcB  ;поиск здания A; кол-во построеных->A
        LD C,A
        XOR A
        EX AF,AF
        LD HL,HBUILD
        LD D,0
        LD B,32
oNi1    LD A,(HL)
        OR A
        JR NZ,oNi2
        LD E,8
        JR oNi3
oNi2    INC L
        INC L
        LD A,(HL)
        CP 10
        JR C,oNi6
        SUB 10
oNi6    CP C    ;то?
        LD E,6
        JR NZ,oNi3
        INC HL
        INC HL
        LD E,4
        LD A,(HL) ;построено?
        INC A
        CP 253
        JR NC,oNi3
        EX AF,AF
        INC A
        EX AF,AF
oNi3    ADD HL,DE
        DJNZ oNi1
        EX AF,AF
        RET

DCMM    DEFW 10000,1000,100,10,1
;DCstr  DEFM "roXet"
;       DEFB #7F

BCD     ;BCD-конв DE->DCstr
        EXX
        LD HL,DCstr
        EXX
        LD HL,DCMM
        LD B,5
bcd0    LD A,(HL)
        INC HL
        PUSH HL
        LD H,(HL)
        LD L,A
        EX DE,HL
        XOR A
bcd1    AND A
        SBC HL,DE
        JR C,bcd2
        INC A
        JR bcd1
bcd2    ADD HL,DE
        EX DE,HL
        EXX
        LD (HL),A
        INC HL
        EXX
        POP HL
        INC HL
        DJNZ bcd0
        RET

iPRINT  ;inv печать символа А в поз DE(yx)
        PUSHs
        if EGA
        call prcharinv
        else
        LD C,A
        CALL SCOORD
        EX DE,HL
        LD A,C
        ADD A,A
        LD BC,(FONT)
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,BC
        LD B,4
iPR1    LD A,(HL)
        CPL
        LD (DE),A
        INC HL
        INC D
        LD A,(HL)
        CPL
        LD (DE),A
        INC HL
        INC D
        DJNZ iPR1
        endif
        POPs
        INC E
        RET

spc_DO  ;1-команда иcп по space ;2-исполняется только для героев
        DEFB 0,1,0,0,0,0,0,2,2,2
        DEFB 2,2,2,0,0,0,1,1,1,1
        DEFB 0,0,0,0,0,1,1,1,1,1
        DEFB 1,1,1,1,1,1,1,1,1,1
        DEFB 1,1,1,1,1,2,2,2,0,2
        ;оcтальные -0

        if EGA
;sq1=scrbase+25+(10*8*40)
sqrADR
        ;dw sq1,sq1+3
        ;dw sq1+(3*8*40),sq1+3+(3*8*40)
        ;dw sq1+(6*8*40),sq1+3+(6*8*40)
        dw 0x4fc8,0x4fe0
        dw 0x67c8,0x67e0
        dw 0x7fc8,0x7fe0
        ;dw 0x50c9,0x50e1
        ;dw 0x68c9,0x68e1
        ;dw 0x80c9,0x80e1
        else
sq1     EQU ATR+345
sqrADR  DEFW sq1,sq1+3,sq1+96,sq1+99,sq1+192,sq1+195
        endif


sqrCOL  ;закрасить квадр. c HL цветом A
        if EGA
;TODO
        ret
        else
        PUSH DE
        LD DE,30
        LD (HL),A
        INC L
        LD (HL),A
        INC L
        LD (HL),A
        ADD HL,DE
        LD (HL),A
        INC L
        LD (HL),A
        INC L
        LD (HL),A
        ADD HL,DE
        LD (HL),A
        INC L
        LD (HL),A
        INC L
        LD (HL),A
        POP DE
        RET
        endif

clearbuttonframes
        if EGA
;убираем все обводки кнопок (для избы/шахты только внешнюю рамочку, которую не могли затереть кнопки при перерисовке)
        ld de,0x4fc8
        ld hl,0x4fc8+0x4830
        LD A,(BUT_N+2) ;текущие номера изображений кнопок (6 шт)
        CP 80
        JR Z,outSQRizba ;шахта
        CP 77
        jr z,outSQRizba ;изба
        ;ld de,0x4fc8
        ld hl,0x4fc8+0x4818
        ;xor a
        ;ex af,af'
;de=top left
;hl=bottom right
;a'=pattern
        call clearbuttonframes_frame;outBOXsolid_nomargins
        ld de,0x4fe0
        ld hl,0x4fe0+0x4818
        ;xor a
        ;ex af,af'
;de=top left
;hl=bottom right
;a'=pattern
        call clearbuttonframes_frame;outBOXsolid_nomargins
        ld de,0x4fc8+0x1800
        ld hl,0x4fc8+0x3030
outSQRizba
clearbuttonframes_frame
        xor a
        ex af,af'
;de=top left
;hl=bottom right
;a'
=pattern
        jp outBOXsolid_nomargins
        endif

;выв 6и квдр
outSQR
        LD A,(F_FUNC) ;функция по нажатию Space - идти или атаковать/нести, или фармить (#ff = ничего?)
        LD B,A
        LD A,(N_FUN1) ;нажатый квдр ;FIRBUT пишет туда (_n_FUN)
        cp 0xff
        jr z,$+3
        ld b,a
        LD DE,sqrADR
        XOR A
       
oQ0     PUSH AF
        CP B
       if EGA
        LD A,(DE)
        INC DE
        LD L,A
        LD A,(DE)
        INC DE
        LD H,A ;hl=YX кнопки
        JR NZ,oQ1 ;не та кнопка
        ld a,0x99;ff
        ;jr z,$+3
        ;xor a ;не та кнопка - стираем обводку
        ex af,af'
        push de
        ex de,hl
        ld a,d
        add a,24
        ld h,a
        ld a,e
        add a,24
        ld l,a      
;de=top left
;hl=bottom right
;a'
=pattern
        push bc
        call outBOXsolid_nomargins
        pop bc
        pop de
oQ1
       else
        LD A,(MCOLOR) ;цвет панели (#28/#30) [текущ действие?]
        LD C,A
        JR NZ,oQ1 ;не та кнопка
        ;та кнопка - красим красным
        INC C
        INC C ;+2=красный
        LD A,(isCOLR) ;игра цветная?
        OR A
        JR NZ,oQ1
        RES 3,C
oQ1     LD A,(DE)
        INC DE
        LD L,A
        LD A,(DE)
        INC DE
        LD H,A ;hl=адрес атрибута кнопки
        LD A,(HL)
        CP C
        LD A,C
        CALL NZ,sqrCOL ;не тот атрибут - красим
       endif
        POP AF
        INC A
        CP 6
        JR C,oQ0
       
        LD A,(N_FUN1) ;нажатый квдр ;FIRBUT пишет туда (_n_FUN)
        CP #FF
        JR Z,oQ5
        LD C,A
        LD HL,BUT_N ;текущие номера изображений кнопок (6 шт)
        CALL BA
        CP 77
        JR NC,oQ5
        LD A,C
        LD HL,sqrADR
        CALL WT
       
        LD A,(HL)
        OR %01111001
        CALL sqrCOL
       
oQ5    
        if EGA
        ret
        else
        LD A,(SEL_T) ;квдр героя
        CP 7
        LD A,#38
        JR C,oQ2
        LD A,#39
        JR NZ,oQ2
        LD A,#3A
oQ2     LD HL,ATR+185
        CP (HL)
        RET Z
        JR sqrCOL
        endif

;----------------
mayBLT  ;можно ли разместить здание? Z/NZ-да/нет;
        LD HL,(PX)
        CALL GMAP2
        LD A,(szPLAT)
        CP 1
        JP Z,aB001
        LD C,A
        LD B,A
        LD DE,64
aB0     PUSH HL
        PUSH BC
aB1     LD A,(HL)
        OR A
        JR NZ,aBN
        RES 4,H
        LD A,(HL)
        SET 4,H
        DEC A
        CP 7-1
        JR C,aB1a
        CP 17-1
        JR C,aBN
        CP 26-1
        JR NC,aBN
aB1a    INC L
        DJNZ aB1
        POP BC
        POP HL
        ADD HL,DE
        DEC C
        JR NZ,aB0
        LD HL,(PX)
        CALL GMAP
        LD A,(szPLAT)
        CP 2
        JR NZ,aBh3

      ;дом 2X2
        LD A,(MASTER)
        ADD A,7
        LD DE,-65
        ADD HL,DE
        CP (HL)
        RET Z
        INC L
        CP (HL)
        RET Z
        INC L
        CP (HL)
        RET Z
        INC L
        CP (HL)
        RET Z
        LD DE,61
        ADD HL,DE
        CP (HL)
        RET Z
        INC L
        INC L
        INC L
        CP (HL)
        RET Z
        ADD HL,DE
        CP (HL)
        RET Z
        INC L
        INC L
        INC L
        CP (HL)
        RET Z
        ADD HL,DE
        CP (HL)
        RET Z
        INC L
        CP (HL)
        RET Z
        INC L
        CP (HL)
        RET Z
        INC L
        CP (HL)
        RET
aBN     POP HL
        POP HL
        OR A ;nz
        RET

aBh3  ;дом 3Х3
        LD A,(MASTER)
        ADD A,7
        LD DE,-65
        ADD HL,DE
        LD B,5
aBhL0   CP (HL)
        RET Z
        INC L
        DJNZ aBhL0
        DEC L
        LD DE,60
        LD B,3
aBhL1   ADD HL,DE
        CP (HL)
        RET Z
        INC L
        INC L
        INC L
        INC L
        CP (HL)
        RET Z
        DJNZ aBhL1
        ADD HL,DE
        LD B,5
aBhL2   CP (HL)
        RET Z
        INC L
        DJNZ aBhL2
        DEC B
        RET NZ
aB001 ;1x1
        SET 4,H
        LD A,(HL)
        OR A
        RET NZ
        RES 4,H
        LD A,(HL)
        OR A
        JR Z,aBN1
        CP 26
        JR C,aBB1
        CP 51
        RET NZ
        LD A,(waPLAT)
        DEC A
        RET NZ
aBB1    LD A,(waPLAT)
        OR A
        JR NZ,aBwa
        ;дорожка
        LD A,(MASTER)
        ADD A,7
        CP (HL)
        JR Z,aBN1
        DEC L
        CP (HL)
        RET Z
        INC L
        INC L
        CP (HL)
        RET Z
        LD DE,-65
        ADD HL,DE
        CP (HL)
        RET Z
        LD DE,128
        ADD HL,DE
        CP (HL)
        RET
aBwa    ;стенка
maxWAL  EQU 4+1 ;макс расст до стенки+1
         LD A,(HL)
         CP 7
         JR C,aBW0
         CP 17
         JR C,aBN1
aBW0    LD DE,(PX)
        LD HL,HBUILD
aBW1    LD A,(HL)
        OR A
        JR Z,aBW2
        SUB E
        JR NC,aBW3
        NEG
aBW3    CP maxWAL
        JR NC,aBW2
        INC L
        LD A,(HL)
        DEC L
        SUB D
        JR NC,aBW4
        NEG
aBW4    CP maxWAL
        JR NC,aBW2
        XOR A
        RET
aBW2    LD A,L
        ADD A,8
        LD L,A
        JR NZ,aBW1
aBN1    XOR A
        INC A
        RET


M_PLAT ;показать площадку под стр-во
        if EGA==0
        CALL ofPLAT
        endif
        LD A,(F_FUNC)
        CP #FF
        RET NC
        LD HL,BUT_N ;текущие номера изображений кнопок (6 шт)
        CALL BA
        CP 16
        RET C
        CP 18
        JR C,M_P1x1
        CP 26
        RET C
        CP 44
        RET NC
        LD C,2
        CP 34
        JR Z,M_Pxx
        CP 43
        JR Z,M_Pxx
        LD C,3
M_Pxx   LD A,C
        LD (szPLAT),A
        JR M_Pxz
M_P1x1  SUB 16
        LD (waPLAT),A
        LD A,1
        LD (szPLAT),A
M_Pxz   CALL mayBLT ;можно ли разместить здание? Z/NZ-да/нет
        if EGA
        ld a,0x99
        jr nz,$+4
        ld a,0xff
        else
        LD A,#10 ;саn't
        JR NZ,plt2
        LD A,(isCOLR)
        OR A
        LD A,#39
        JR Z,plt2
        LD A,(COLOR)
        XOR #8
plt2   
        endif
        EX AF,AF
        LD HL,(BX)
        LD A,L
        CP 24
        RET NC
        AND #FE
        LD L,A
        LD A,H
        AND #FE
        LD H,A
        LD A,(szPLAT)
        ADD A,A
        LD C,A
        LD B,A
        LD A,24
        SUB B
        SUB L
        JR NC,plt0
        ADD A,B
        LD B,A
plt0   
        LD A,24
        SUB C
        SUB H
        JR NC,plt1
        ADD A,C
        LD C,A
plt1    LD (bcPLAT),BC
        CALL STS ;выб.осн.экр (только адрес)
;h=Y/8
;l=X/8
;c=hgt/8
;b=wid/8
        if EGA
         ;ld hl,0
        ;jr $
        add hl,hl
        add hl,hl
        add hl,hl
        ld a,c
        add a,a
        add a,a
        add a,a
        ld d,h
        add a,h
        dec a
        ld h,a
        ld a,b
        add a,a
        add a,a
        add a,a
        ld e,l
        add a,l
        dec a
        ld l,a
;de=top left
;hl=bottom right
        jp outBOXsolid
       
        else
 
        CALL ACOORD ;hl=attr addr
        LD (adPLAT),HL
        LD (isPLAT),A
        EX AF,AF ;a=color
        JR PA0
        endif

        if EGA==0
ofPLAT  LD HL,isPLAT;cтереть площадку
        LD A,(HL)
        OR A
        RET Z
        XOR A
        LD (HL),A
        INC HL
        INC HL
        LD C,(HL)
        INC HL
        LD B,(HL)
        INC HL
        LD A,(HL)
        INC HL
        LD H,(HL)
        LD L,A
        LD A,(isCOLR)
        OR A
        LD A,#30
        JR Z,PA0a
        LD A,(COLOR)
PA0a    HALT ;??
PA0     LD E,A
PA1     PUSH BC
        PUSH HL
PA2     LD A,(HL)
        AND #40
        OR E
        LD (HL),A
        INC L
        DJNZ PA2
        POP HL
        LD BC,32
        ADD HL,BC
        POP BC
        DEC C
        JR NZ,PA1
        RET
        endif

;------------новый герой------

MANA    EQU #F0 ;-макс.знач. магич. маны
HEALTH  ;нач.здоровье (+ [#100 * нач.магия])
        DEFW 50,50,50,60,70,#4000+60,#4000+50,200,120
        DEFW 50,50,50,60,70,#4000+60,#4000+50,200,120
        DEFW #E000+50,#D000+38,#E000+50,88,50,50,150,#E400+200,#E400+180


NEWHER  ;A-0,1,2:чел/кунг/пл HL-поз;A'-тип
        ;вых Z/NZ - O.K./нет места
        PUSH HL
        CALL sFREE
        POP HL
        RET NZ ;nz ->>
        CALL IX0_HL
         LD (IX+14),L ;исходная позиц для охранников врага
         LD (IX+15),H
        PUSH HL
        CALL GMAP2
        LD (HL),C
        EX AF,AF
        LD (IX+4),A
        LD C,A
        CALL RND
        AND 7
        LD (IX+2),A
        CALL IX_98
        LD (IX+3),A
        LD (IX+7),A
        LD HL,HEALTH
        LD A,C
        CALL WT
        LD (IX+5),L
        LD (IX+6),H
        LD A,C
        LD HL,AT_TY_
        CALL BA
        POP HL
NEWiy_  PUSH HL ;вх A=0/1 -2x2/3x3
        CP 1
        JR Z,nH1
        LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        LD (IY+0),L
        LD (IY+1),H
        POP AF
        INC A
        ADD A,A
        ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        DEC HL
        DEC HL
        DEC HL
        LD (IY+2),L
        LD (IY+3),H
        XOR A
        RET ;z ->>
nH1     LD H,0
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        ADD HL,HL
        DEC HL
        DEC HL
        DEC HL
        DEC HL
        LD (IY+0),L
        LD (IY+1),H
        POP AF
        INC A
        ADD A,A
        ADD A,A
        LD L,A
        LD H,0
        ADD HL,HL
        ADD HL,HL
        INC HL
        INC HL
        INC HL
        LD (IY+2),L
        LD (IY+3),H
        XOR A
        RET ;z ->>

CLRALL  LD HL,HUMAN
        LD DE,HUMAN+1
        LD BC,2047
        LD (HL),0
        LDIR
        RET

sFREE   ;поиск св.места и уст IX/IY (Вх:A-чей)
        ; (вых z/nz - ok/нет места, C - номер+#80)
        CP 1
        LD HL,HUMAN
        LD BC,#3000
        LD DE,16
        JR C,sF1
        LD HL,KUNGE
        LD C,#30
        JR Z,sF1
        LD HL,SLAVE
        LD BC,#660
sF1     INC L;  (ix+1)==0
        PUSH BC
        PUSH HL
        CALL sF10
        LD A,C
        POP HL
        POP BC
        JR Z,sF2
        DEC L ; (ix)==0
        CALL sF10
        LD A,C
        RET NZ ;nz->нет места
sF2     LD C,A
        SET 7,C
        CALL N_IXIY
        XOR A
        RET ;z->выделено место (ix,iy)
        ;
sF10    LD A,(HL) ;z-ok
        OR A
        RET Z
        INC C
        ADD HL,DE
        DJNZ sF10
        RET ;nz

stayON  ;поиск места, чтобы поставить героя (hl)
        LD C,3
sY00    CALL stay1
        DEC H
        DEC L
        LD B,C
sYupL   CALL stay1
        INC L
        DJNZ sYupL
        DEC L
        INC H
        LD B,C
        DEC B
        DEC B
sYrtL   CALL stay1
        INC H
        DJNZ sYrtL
        LD B,C
sYdwL   CALL stay1
        DEC L
        DJNZ sYdwL
        INC L
        DEC H
        LD B,C
        DEC B
        DEC B
sYlfL   CALL stay1
        DEC H
        DJNZ sYlfL
        INC C
        INC C
        JR sY00

stay1   ;пров позиции; вых POP AF!!
        LD A,L
        CP 63
        RET NC
        LD A,H
        CP 63
        RET NC
        PUSH HL
        CALL GMAP2
        LD A,(HL)
        POP HL
        OR A
        RET NZ
        POP AF ;!
        RET

CORiy_  ;коррекция коорд (E+iy(0,1); D+iy(2,3))
        PUSH IY
        POP HL
cii_    CALL cii0
        INC HL
        LD E,D
cii0    LD A,(HL)
        ADD A,E
        LD (HL),A
        INC HL
        EX AF,AF
        LD A,E
        RLCA
        JR C,cii1
        EX AF,AF
        RET NC
        INC (HL)
        RET
cii1    EX AF,AF
        LD A,(HL)
        ADC A,#FF
        LD (HL),A
        RET

;--------------------

colorL  ;цвета индикаторов
        if EGA
        db 0b00011011
        db 0b00100100
        db 0b00110110
        db 0b00101101
        db 0b00100100
        db 0b00010010
        else
        DEFB #58,#60,#70,#28,#60,#50
        endif

outLED  ;подсветка 6-и индикаторов
        ;+0-атакует враг
        ;+1-здание построено
        ;+2-здание/шахта разрушены
        ;+3-атакуем мы
        ;+4-появился новый человек
        ;+5-наше здание горит
       if EGA
;TODO обновлять только при изменении
        LD HL,colorL
        EXX
        LD HL,LED ;внутри level!
        ld de,scrbase+(40*160)+24
        call outled3
        ld de,scrbase+(40*176)+24
outled3
        call outled1
        call outled1
outled1
        push de
        push hl
        LD A,(HL)
        OR A
        JR Z,oLL2
        DEC (HL)
        AND 1
        JR Z,oLL2
        EXX
        LD A,(HL) ;цвет индикатора
        EXX
        JR oLL1
oLL2    LD A,0b00001001 ;#8
oLL1    ld (outledcolor),a
        ex de,hl
        call setpgsscr40008000
        ld c,8
outledcols0
        ld de,40
        ld b,16
outledcol0
        ld a,(hl)
        or a
        jr z,outledcol0_skip
        ;выделим нужные пиксели белым
        cp 8
        jr c,$+4
        or 0x38
        ld (hl),a
        and 7
        ld a,(hl)
        jr z,$+4
        or 7
outledcolor=$+1
        and 0 ;наложим нужный цвет
        ld (hl),a
outledcol0_skip
        add hl,de
        djnz outledcol0
        ld de,0x4000-(16*40)
        ld a,0x9f;0xa0
        cp h
        adc hl,de
        jp pe,outledcol0_columnq ;в половине случаев
;8000->с000 (надо 6000) или a000->e001 (надо 4001)
         inc a
        xor h
        ld h,a
outledcol0_columnq
        dec c
        jr nz,outledcols0
        pop hl
        pop de
        inc hl
        inc de
        inc de
        exx
        inc hl
        exx
        jp setpgsmain40008000

       else
        LD HL,colorL
        EXX
        LD HL,LED
        LD DE,ATR+664
        PUSH DE
        CALL oLL_
        LD DE,ATR+728
        PUSH DE
        CALL oLL_
        POP HL
        LD DE,ATR+760
        LD C,6
        LDIR
        POP HL
        LD DE,ATR+696
        LD C,6
        LDIR
        RET
        ;
oLL_    LD B,3
oLL0    LD A,(HL)
        OR A
        JR Z,oLL2
        DEC (HL)
        AND 1
        JR Z,oLL2
        EXX
        LD A,(HL)
        EXX
        JR oLL1
oLL2    LD A,#8
oLL1    INC HL
        LD (DE),A
        INC E
        LD (DE),A
        INC E
        EXX
        INC HL
        EXX
        DJNZ oLL0
        RET
       endif

;--[**]----супер энергия ;отключить на время - войти в режим карты
HiENER  LD C,32
        LD A,(MORTE)
        CP 86
        RET NZ
        CALL Z,loop_H
hie0    LD (IX+5),C
        ADD IX,DE
        DJNZ hie0
        RET