;-----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