Login

Subversion Repositories NedoOS

Rev

Rev 1497 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

я╗┐            DEVICE ZXSPECTRUM1024
TCP=1
LOGGING=0
        ifdef CLIENT
VIRTUALKEYS=1
        else
VIRTUALKEYS=0
        endif
JOYMASK_SELECT=0b00100000
JOYMASK_START =0b00010000
JOYMASK_FIRE  =0b10000000
JOYMASK_FIRE2 =0b01000000
JOYMASK_UP    =0b00001000
JOYMASK_DOWN  =0b00000100
JOYMASK_LEFT  =0b00000010
JOYMASK_RIGHT =0b00000001
;7 - A (A)
;6 - B (S)
;5 - Select (Space)
;4 - Start (Enter)
;3 - Up (7)
;2 - Down (6)
;1 - Left (5)
;0 - Right (8)

MANYLIVES=0;1 ;╤Г╨▒╤А╨░╤В╤М ╨┐╤А╨╕ ╤А╨╡╨╗╨╕╨╖╨╡!!!
TILES87=0
TILEHGT=8-TILES87
DRAWFOREST=1
KEMPSTON=1
            DEFINE  ProjName        ZXBattleCity
            DEFINE  ProjVer         1_6

        include "../../_sdk/sys_h.asm"

;************************* ╨Т╨╛╨╖╨╝╨╛╨╢╨╜╤Л╨╡ ╨╜╨╛╨╝╨╡╤А╨░ ╨╛╤И╨╕╨▒╨╛╨║ (errno)*************************
SHUT_RDWR               EQU 2
ERR_EAGAIN              EQU 35          ;/* Try again */
ERR_EWOULDBLOCK EQU ERR_EAGAIN  ;/* Operation would block */
ERR_INTR                EQU 4
ERR_NFILE               EQU 23
ERR_ALREADY     EQU 37
ERR_NOTSOCK     EQU 38
ERR_EMSGSIZE    EQU 40    ;/* Message too long */
ERR_PROTOTYPE   EQU 41
ERR_AFNOSUPPORT EQU 47
ERR_HOSTUNREACH EQU 65
ERR_ECONNABORTED EQU    53      /* Software caused connection abort */
ERR_CONNRESET   EQU 54
ERR_NOTCONN     EQU 57

;************************* ╨Я╤А╨╛╤В╨╛╨║╨╛╨╗╤Л ╤Б╨╛╨╡╨┤╨╕╨╜╨╡╨╜╨╕╨╣ *************************
SOCK_STREAM EQU 0x01            ;tcp/ip
SOCK_ICMP       EQU 0x02                ;icmp
SOCK_DGRAM      EQU 0x03                ;udp/ip

AF_INET EQU 2

TOPYLOAD=32;0
TOPY=0;32
TOPYVISIBLE=TOPY+8
        if TILES87
MAXY=(30-2)*8;224
        else
MAXY=(26-2)*8
        endif

scrbase=0x4000
sprmaxwid=32
sprmaxhgt=32
scrwid=160 ;double pixels
scrhgt=200

pushbase=0x8000
        macro SETPGPUSHBASE
        SETPG8000
        endm

        macro RECODEBYTE
        ld a,(de)
        ld ($+4),a
        ld a,(trecodebyteright)
        ld c,a
        dec de
        ld a,(de)
        dec de
        ld ($+4),a
        ld a,(trecodebyteleft)
        or c
        endm        

STACK=0x3ff0
tempsp=0x3f06 ;6 bytes for prspr
INTSTACK=0x3f00

;TILEFLAGBIT=2
TILEFLAG0=0x18
TILEFLAG1=0x1c

WATERANIMTILE=102
NWATERANIMTILES=2

SPSIZ16=2
SPACT=32
SPSIZ8=0

SPRDROP=256+34
SPRBULLETUP=52
SPRBULLETRIGHT=54

SPRCLOUD0=256+44
SPRCLOUD1=256+46

;╤Б╨╡╨╣╤З╨░╤Б ╤Б╨┐╤А╨░╨╣╤В╤Л ╨╗╨╡╨╢╨░╤В ╤В╨░╨║ (╤А╨╡╨░╨╗╤М╨╜╨╛ ╨╡╤Б╤В╤М ╤В╨╛╨╗╤М╨║╨╛ ╤З╤С╤В╨╜╤Л╨╡ ╨╜╨╛╨╝╨╡╤А╨░):
;0..31,64..95,... (my tank level 0,1, enemy1) ╨▓ spr0 (+256 - mirror hrz, +512 - mirror vert)
;32..63,96..127,... ╨▓ spr1 (+256 - mirror hrz, +512 - mirror vert)
;TODO:
;256+ (my tank level 2 (+16),3 (+128+16), enemy2 (+0)) ╨▓ spr2
;512+ (enemy 3 (+0),4 (+64),5 (+128)) ╨▓ spr3

SPRMYTANKLEVEL0=0
SPRMYTANKLEVEL1=16
SPRMYTANKLEVEL2=256+16
SPRMYTANKLEVEL3=256+128+16

;my tank level 0,1,2,3 - sprite 0,16,256+16,256+128+16
;enemy tank sprites (add 8 for red version):
;SPRENEMY1=0+8;256+128
;SPRENEMY2=0+16;256+128+128
;SPRENEMY3=0+24;256+128+128+128
;SPRENEMY4=64+0;256+128+256+128
;SPRENEMY5=64+8;256+128+256+256
SPRENEMY1=0+64;256+128
SPRENEMY2=256;256+128+128
SPRENEMY3=512;256+128+128+128
SPRENEMY4=512+64;256+128+256+128
SPRENEMY5=512+128;256+128+256+256

SPRMEGASHIP=32;256+36

SPRBONUS0=96;80;256+128+16
SPRBONUS1=98;82;256+128+18
SPRBONUS2=100;84;256+128+20
SPRBONUS3=102;86;256+128+22
SPRBONUS4=104;88;256+128+24
SPRBONUS5=106;90;256+128+26
SPRBONUS6=108;92;256+128+28
SPRBONUS7=110;94;256+128+30
SPRBONUS8=112;192+32;256+128+32

SPRSTAR0=120;256+48
SPRSTAR1=122;256+50
SPRSTAR2=124;256+52
SPRSTAR3=126;256+54

SPRENE0=128+64+46;256+128+46
SPRENE1=128+64+48;256+128+48
SPRENE2=128+64+50;256+128+50
SPRENE3=128+64+52;256+128+52
SPRENE4=128+64+54;256+128+54

SPRBOOM0=56
SPRBOOM1=58
SPRBOOM2=60
SPRBOOM0_=48;256+56 ;big boom
SPRBOOM2_=50;256+60

SPRGAMEOVER0=256+40
SPRGAMEOVER1=256+42

BYTESPERTILE=1;2
BYTESPERTILELINE=(BYTESPERTILE*64);256

        macro PRCHAR_TILEMAP_HL
        ld (hl),a
         set 3,h
         ld (hl),TILEFLAG1 ;╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤В╨░╨╣╨╗╨░ ╤Б╤В╨░╨▓╨╕╨╝ ╨▒╨╕╤В╤Л ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П ╨╛╨▒╨╛╨╕╤Е ╤Н╨║╤А╨░╨╜╨╛╨▓ (╨░ ╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤Б╨┐╤А╨░╨╣╤В╨░ ╨╜╨░╨┤╨╛ ╤В╨╛╨╗╤М╨║╨╛ ╨╜╨░ ╤В╨╡╨║╤Г╤Й╨╡╨╝ ╤Н╨║╤А╨░╨╜╨╡)
         res 3,h
         set 4,h
         ld (hl),TILEFLAG1 ;╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤В╨░╨╣╨╗╨░ ╤Б╤В╨░╨▓╨╕╨╝ ╨▒╨╕╤В╤Л ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П ╨╛╨▒╨╛╨╕╤Е ╤Н╨║╤А╨░╨╜╨╛╨▓ (╨░ ╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤Б╨┐╤А╨░╨╣╤В╨░ ╨╜╨░╨┤╨╛ ╤В╨╛╨╗╤М╨║╨╛ ╨╜╨░ ╤В╨╡╨║╤Г╤Й╨╡╨╝ ╤Н╨║╤А╨░╨╜╨╡)
         res 4,h
        endm

        macro TILEMAPLINEUP
        ;LD     BC,-256
        LD      BC,-BYTESPERTILELINE;-256
        ADD     HL,BC
        endm

        macro TILEMAPLINEDOWN
        ;LD     BC,256
        LD      BC,BYTESPERTILELINE;256
        ADD     HL,BC
        endm

        macro TILEMAPLEFTLINEDOWN
        ;LD     BC,256-2
        LD      BC,BYTESPERTILELINE-BYTESPERTILE;256-2
        ADD     HL,BC
        endm

        macro TILEMAPLEFT
        dup BYTESPERTILE
        dec hl
        edup
        ;dec hl
        endm

        macro TILEMAPRIGHT
        dup BYTESPERTILE
        inc hl
        edup
        ;inc hl
        endm

        org PROGSTART
begin
        jp MAINGO ;patched by prspr
MAINGO
        ld sp,STACK
        ;OS_HIDEFROMPARENT
        ld e,0 + 0x80 ;EGA + keep
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode) +8=noturbo, +0x80=keep gfx pages
        ld de,path
        OS_CHDIR
         ld e,1
         OS_SETSCREEN
         ld e,0
         OS_CLS
         ld e,0
         OS_SETSCREEN
         ld e,0
         OS_CLS

        OS_GETMAINPAGES
;dehl=╨╜╨╛╨╝╨╡╤А╨░ ╤Б╤В╤А╨░╨╜╨╕╤Ж ╨▓ 0000,4000,8000,c000
        ld a,e
        LD (pgmain4000),A
        ld a,h
        LD (pgmain8000),A
        ld a,l
        LD (pgmainc000),A

        OS_NEWPAGE
        ld a,e
        ld (pgmuzmain),a
        OS_NEWPAGE
        ld a,e
        ld (pgmuzend),a
        OS_NEWPAGE
        ld a,e
        ld (pgspr0),a
        OS_NEWPAGE
        ld a,e
        ld (pgspr1),a
        OS_NEWPAGE
        ld a,e
        ld (pgspr2),a
        OS_NEWPAGE
        ld a,e
        ld (pgspr3),a
        OS_NEWPAGE
        ld a,e
        ld (pgtiles),a
        OS_NEWPAGE
        ld a,e
        ld (pglvl0),a
        OS_NEWPAGE
        ld a,e
        ld (pglvl1),a
        OS_NEWPAGE
        ld a,e
        ld (pglvl2),a
        OS_NEWPAGE
        ld a,e
        ld (pgarea),a

        OS_NEWPAGE
        ld a,e
        ld (pgfake),a ;╤Н╤В╤Г ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г ╨╝╨╛╨╢╨╜╨╛ ╨▒╤Г╨┤╨╡╤В ╨╖╨░╨┐╨░╤А╤Л╨▓╨░╤В╤М ╨┐╤А╨╕ ╨╛╤В╤А╨╕╤Б╨╛╨▓╨║╨╡ ╤Б╨┐╤А╨░╨╣╤В╨╛╨▓ ╤Б ╨║╨╗╨╕╨┐╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡╨╝
        ld (pgfake2),a      

        CALL    INSREADY                                ;Loading Hi-Score table, music, palette, sound FX and palette initialisation
        LD      HL,48000                                ;Sound FX initialisation
        CALL    AFXINIT
       
        ld hl,prsprqwid
        ld (0x0101),hl ;╤Б╨┐╤А╨░╨╣╤В╤Л ╨▓ ╤Д╨░╨╣╨╗╨╡ ╨┐╨╛╨┤╨│╨╛╤В╨╛╨▓╨╗╨╡╨╜╤Л ╤В╨░╨║, ╤З╤В╨╛ ╨▓╤Л╤Е╨╛╨┤╤П╤В ╨▓ 0x0100

       ifdef CLIENT
       
       if TCP
       if CLIENT
        call getipfromcmd
;create socket:
CONNECTIONERROR
        ld de,SOCK_STREAM+(AF_INET<<8)
        OS_NETSOCKET
        ld a,l
        or a
        jp m,CONNECTIONERROR;?C_EXIT
        ld (datasoc),a
        LD DE,web_ia
        OS_NETCONNECT
         ld a,l ;DimkaM 12.03.2019
        or a
        jp p,connect_ok
createsoc_err
        ld a,(datasoc)
        ld e,0
        OS_NETSHUTDOWN
        jp CONNECTIONERROR
;CONNECTIONERROR
connect_ok
       else ;SERVER
;SOCKET  OS_NETSOCKET(unsigned int);
;#define socket(domain, type, protocol) OS_NETSOCKET((domain<<8)+type)
        ;ld bc,1 ;domain???
        LD DE,513 ;type???
        OS_NETSOCKET ;╨Я╨╛╨┤╨║╨╗╤О╤З╨╕╤В╤М TCP/IP ╤Б╨╛╨║╨╡╤В ╨║ ╤Е╨╛╤Б╤В╤Г.???
        ld a,l
        or a
        jp m,CONNECTIONERROR;?C_EXIT
        LD (soc),A
        ;a=socket
        LD DE,web_ia
;signed char OS_BIND(const struct sockaddr_in * addr, SOCKET socket);
;#define bind(socket, addr, address_len) OS_BIND(addr,socket)
        OS_BIND ;╨Я╤А╨╕╤Б╨▓╨╛╨╡╨╜╨╕╨╡ ╤Б╨╛╨║╨╡╤В╤Г ╨║╨╛╨╜╨║╤А╨╡╤В╨╜╨╛╨│╨╛ ╨╜╨╛╨╝╨╡╤А╨░ ╨╕╤Б╤Е╨╛╨┤╤П╤Й╨╡╨│╨╛ ╨┐╨╛╤А╤В╨░.
        LD a,(soc) ;socket
        ;LD DE,0 ;backlog???
;signed char OS_LISTEN(int, SOCKET socket);
;#define listen(socket, backlog) OS_LISTEN(backlog,socket)
        OS_LISTEN ;╨Т╨║╨╗╤О╤З╨╕╤В╤М ╤А╨╡╨╢╨╕╨╝ ╨┐╤А╨╛╤Б╨╗╤Г╤И╨╕╨▓╨░╨╜╨╕╤П ╨╕╤Б╤Е╨╛╨┤╤П╤Й╨╡╨│╨╛ ╨┐╨╛╤А╤В╨░(╤А╨╡╨╢╨╕╨╝ ╤Б╨╡╤А╨▓╨╡╤А╨░) TCP/IP ╤Б╨╛╨║╨╡╤В╨░.
WAIT_CLIENTS0
        LD a,(soc) ;socket
        ;LD DE,0 ;addr???
;SOCKET OS_ACCEPT(const struct sockaddr_in * addr, SOCKET socket);
;#define accept(socket, addr, address_len) OS_ACCEPT(addr,socket)
        OS_ACCEPT ;╨╢╨┤╤С╨╝, ╨║╨╛╨│╨┤╨░ ╨┐╨╛╨┤╤Б╨╛╨╡╨┤╨╕╨╜╤П╤В╤Б╤П
        BIT 7,L
        JR Z,ESTABLISHED
        CP ERR_EAGAIN
        JP NZ,ERR_EXIT  ;╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨░ ╨╛╤И╨╕╨▒╨║╨╕
        OS_YIELD                ;╨╜╨╡ ╨╛╨▒╤П╨╖╨░╤В╨╡╨╗╤М╨╜╨╛. ╨Х╤Б╨╗╨╕ ╨▓╤А╨╡╨╝╤П ╤А╨╡╨░╨│╨╕╤А╨╛╨▓╨░╨╜╨╕╤П ╨╜╨░ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ ╨╜╨╡ ╨║╤А╨╕╤В╨╕╤З╨╜╨╛,
                                                ;╤В╨╛ ╨╛╤В╨┤╨░╨┤╨╕╨╝ ╨║╨▓╨░╨╜╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╕ ╤Б╨╕╤Б╤В╨╡╨╝╨╡.
        JR WAIT_CLIENTS0        ;╨╜╨╕╨║╤В╨╛ ╨╜╨╡ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╕╨╗╤Б╤П, ╨╢╨┤╤С╨╝
ESTABLISHED
        LD A,L                          ;╤Г╨┤╨░╤З╨╜╨╛
        LD (datasoc),A  ;╤Б╨╛╤Е╤А╨░╨╜╤П╨╡╨╝ ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А ╤Б╨╛╨║╨╡╤В╨░.
;       ╨Т╨╛╨╖╨▓╤А╨░╤Й╨░╨╡╨╝╤Л╨╡ ╨╖╨╜╨░╤З╨╡╨╜╨╕╤П ╨▓ ╤А╨╡╨│╨╕╤Б╤В╤А╨░╤Е:
;               L - SOCKET ╨┐╤А╨╕ ╨┐╨╛╨╗╨╛╨╢╨╕╤В╨╡╨╗╤М╨╜╨╛╨╝ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╕, ╨┐╤А╨╕ ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╨╛╨╝ ╨╖╨╜╨░╤З╨╡╨╜╨╕╨╕  - ╤Д╤Г╨╜╨║╤Ж╨╕╤П ╨╖╨░╨▓╨╡╤А╤И╨╕╨╗╨░╤Б╤М ╤Б ╨╛╤И╨╕╨▒╨║╨╛╨╣.
;               ╨Р - errno ╨┐╤А╨╕ ╨╛╤И╨╕╨▒╨║╨╡.
;       ╨Т╨╛╨╖╨╝╨╛╨╢╨╜╤Л╨╡ ╨╛╤И╨╕╨▒╨║╨╕:
;               ERR_NOTSOCK             - ╨╜╨╡ ╨┤╨╡╨╣╤Б╤В╨▓╨╕╤В╨╡╨╗╤М╨╜╤Л╨╣ ╨┤╨╡╤Б╨║╤А╨╕╨┐╤В╨╛╤А ╤Б╨╛╨║╨╡╤В╨░
;               ERR_ECONNABORTED        - ╨╛╨▒╤Й╨░╤П ╨╛╤И╨╕╨▒╨║╨░ ╤Б╨╛╨║╨╡╤В╨░
;               ERR_EAGAIN                      - ╨▓╤Е╨╛╨┤╤П╤Й╨╕╤Е ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╨╣ ╨┐╨╛╨║╨░ ╨╜╨╡╤В
CONNECTIONERROR
ERR_EXIT
       endif
       
       else ;UDP
       
        ld de,0x0203
        OS_NETSOCKET
        ld a,l
        ld (soc),a
        or a
        jp m,inet_exiterr_nosoc
inet_exiterr_nosoc ;TODO
       if CLIENT==0
        ld a,(soc)
        LD DE,port_ia
        OS_BIND
        ld a,l
        or a
        jp m,inet_exiterr
inet_exiterr ;TODO
       endif
       
       endif ;UDP
       endif

        JP      PRESTART;S

        ds 0x200-$
sprlist
        ds 85*6
sprlistsz=$-sprlist
;+0: y
;+1: 2(ysize:SPSIZ16) +0x20(SPACT) +0x40(deact) +0x80(mirrorvert) +1(SPSIZBS)
;+2: x
;+3: 2(xsize:SPSIZ16) +1(SPSIZBS) +0x80(mirrorhor)
;+4,5: pattern number

       macro DWBIGENDIAN data
        db data/256
        db data&0xff
       endm

       ifdef CLIENT
soc
        db 0
datasoc
        db 0

;TCP:
curport=$+1
web_ia:
        defb 0
        DWBIGENDIAN 20001 ;db 0,80
web_ia_ip
        db 192,168,1,177;127,0,0,1 ;ip (big endian) ;connect to 192.168.1.177
        ds 8 ;reserved

getipfromcmd
        ld hl,COMMANDLINE
        call skipword
        ld a,(hl)
        or a
        ret z
        call skipspaces
        ld de,web_ia_ip
ping_nextdig
        call strtobyte_hltode
       or a
       ret nz ;error
        ld a,(hl)
        cp '.'
        inc hl
        jr z,ping_nextdig
        ret

skipword
;hl=string
;out: hl=terminator/space addr
skipword0
        ld a,(hl)
        or a
        ret z ;jr z,skipwordq
        sub ' '
        ret z ;jr z,skipwordq
        inc hl ;ldi
        jr skipword0

skipspaces
;hl=string
;out: hl=after last space
        ld a,(hl)
        cp ' '
        ret nz
        inc hl
        jr skipspaces

strtodigit_a ;a=FF - err
        sub 0x30
        jr c,str_digit_a_err
        sub 10
        jr nc,str_digit_a_err
        add 10
        ret
str_digit_a_err
        ld a,0xFF
        ret

strtobyte_hltode ; a=0 ok a=FF error
        ld a,(hl)
        call strtodigit_a
        inc a
        or a
        jr z,strtobyte_err

        dec a
        ld c,a
        inc hl
        ld a,(hl)
        call strtodigit_a
        inc a
        or a
        jr nz,strtobyte_2digit
        ld a,c
        ld (de),a
        xor a
        inc de
        ret

strtobyte_2digit
        inc hl
        dec a;╨▓ ╨░ ╨▓╤В╨╛╤А╨░╤П ╤Ж╨╕╤Д╤А╨░
        ex af,af' ;'
        ld a,c
        ld b,9
strtobyte_2digit0
        add c
        djnz strtobyte_2digit0
        ld c,a
        ex af,af' ;'
        add c
        ld c,a

        ld a,(hl)
        call strtodigit_a
        inc a
        or a
        jr nz,strtobyte_3digit
        ld a,c
        ld (de),a
        xor a
        inc de
        ret
strtobyte_3digit
        inc hl
        dec a; ╨▓ a ╤В╤А╨╡╤В╤М╤П ╤Ж╨╕╤Д╤А╨░
        ex af,af' ;'
        ld a,c
        ld b,9
strtobyte_3digit0
        add c
        jr c,strtobyte_err
        djnz strtobyte_3digit0
        ld c,a
        ex af,af' ;'
        add c
        jr c,strtobyte_err
        ld (de),a
        xor a
        inc de
        ret
strtobyte_err
        ld a,0xFF
        ret

       endif ;ifdef CLIENT

PRESTART;S
        ;LD     A,(ENN) ;resources loaded?
        ;CP     1
        ;JP     Z,ZZZZ2 ;skip load
       call loadresources
                        ;LD      HL,(#5CF4)                             ;Save position of Levels on disk
                        ;LD             (DiskAddrLevels),HL

;vertical scroll
        call setpgsscr40008000
        ld de,bgfilename
        call bgpush_prepare
        call setpgsmain40008000

        call swapimer      

       ifdef CLIENT
       if LOGGING
        ld de,fn_log
        OS_CREATEHANDLE
        ld a,b
        ld (loghandle),a
       endif
       
        ;OS_HIDEFROMPARENT
       endif

STARTS
;╤Б╤О╨┤╨░ ╨╝╨╛╨╢╨╡╨╝ ╨┐╨╛╨┐╨░╤Б╤В╤М ╨╕╨╖ ╨╕╨│╤А╤Л
        ld sp,STACK

         LD A,1
         LD (NEWLEVEL),A ;╨╕╨╜╨░╤З╨╡ ╤А╤Л╤З╨╕╤В ╨▓ ╨╝╨╡╨╜╤О
         ld a,5
         ld (SOUNDGO),a ;╨╕╨╜╨░╤З╨╡ ╨╛╤Б╤В╨░╤В╨╛╨║ ╨╛╤В ╤А╤Л╤З╨░╨╜╨╕╤П ╨┐╨╛╤Б╨╗╨╡ ╨│╨░╨╝╨╛╨▓╨╡╤А╨░?
         call afxinit
        LD      HL,BONUS2
        LD      DE,BONUS
        LD      BC,96
        LDIR
        ;LD     BC,PAGE3
        ;LD     A,#C3
        ;OUT    (C),A
        call setpgc3
        CALL    #C000 ;init muzmain
        CALL    #CBB8 ;init muzboss
        LD      A,200+24
        LD      (SOUNDW),A ;time until music stops
        CALL    POINTHI ;╤Д╨╛╤А╨╝╨╕╤А╤Г╨╡╤В ╨▓ TEXT4 ╤Б╤В╤А╨╛╨║╤Г ╤Б╨╛ ╤Б╤З╤С╤В╨╛╨╝
        XOR     A
        LD      (NEWTAN1),A
        LD      (NEWTAN2),A
        LD      A,(MAP)
        CP      255
        JR      Z,FGF2
        XOR     A ;first level
         ;ld a,31 ;18"19" ╨╕ 23"24" ╤В╤А╤Г╨┤╨╜╤Л╨╡
        LD      (MAP),A
FGF2

ZZZZ2
        ;ld ix,UNITS
        ;ld (ix+UNIT_YESORNOT),0
         ;xor a
         ;ld (sprlist+1),a ;disable sprite #0
         call clearsprlist
         call clstiles

        ;LD     BC,VCONFIG; CHANGE VIDEO RESOLUCION 1
        ;LD     A,VID321X+1
        ;OUT    (C),A
        ;LD     BC,VPAGE; VRAM CHANGE
        ;LD     A,#10
        ;OUT    (C),A
        ;LD     BC,BORDER
        ;LD     A,1
        ;OUT    (C),A
        call border1
        CALL    CLSSTART ;???
        LD      A,2
        LD      (FIGH),A ;╨║╨░╨║╨╛╨╣-╤В╨╛ ╨┐╤А╨╕╨╖╨╜╨░╨║ deact ╤Б╨┐╤А╨░╨╣╤В╨╛╨▓??? (╨┐╨╛╤В╨╛╨╝ ╨╜╨╡ ╨╛╨▒╨╜╤Г╨╗╤П╨╡╤В╤Б╤П!)

        ld hl,108
        ld (callpush_curscroll),hl

;Main menu cycle!
;K inject here! TODO
         call doscreen
         call doscreen
         ;ld b,24
         ;halt
         ;djnz $-1
       ld a,(timer)
       ld (KERNSoldtimer),a
       ld (scrolloldtimer),a
;╤Ж╨╕╨║╨╗ ╨┐╨╛╨║╨░╨╖╨░ ╨╕ ╨╛╨▒╤А╨░╨▒╨╛╤В╨║╨╕ ╨╝╨╡╨╜╤О
KERNS
     ifdef CLIENT
      if CLIENT
       call sendjoyTMP
       ld hl,menucheckkeys
       call readfrominet_tojoy1joy2 ;╤З╨╕╤В╨░╤В╤М ╤А╨╛╨▓╨╜╨╛ ╨╛╨┤╨╜╨╛ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╡, ╨▓╤Л╨┐╨╛╨╗╨╜╨╕╤В╤М ╨╗╨╛╨│╨╕╨║╤Г. ╨╕ ╤В╨░╨║ ╨┐╨╛╨║╨░ ╨╡╤Б╤В╤М ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╤П
      else
       call readfrominet_tojoy2 ;╨╝╨╛╨╢╨╡╤В ╨▒╤Л╤В╤М ╨┐╤А╨╕╨╜╤П╤В╨╛ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╤Г╨│╨╛╨┤╨╜╨╛ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╣ - ╨▒╨╡╤А╤С╨╝ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╡
       call sendjoy1joy2 ;╨▓ ╨║╨░╨╢╨┤╨╛╨╝ ╤Ж╨╕╨║╨╗╨╡ ╨╗╨╛╨│╨╕╨║╨╕
       call menucheckkeys
      endif
     else
      call menucheckkeys
     endif

      call menuchangetimer ;╨┐╤А╨╕ ╨╛╨║╨╛╨╜╤З╨░╨╜╨╕╨╕ ╤В╨░╨╣╨╝╨╡╤А╨░ ╨▓╤Л╨╖╤Л╨▓╨░╨╡╤В autounpress start
      call menudraw
      jr KERNS

menudraw
        LD      A,(STR6) ;time in startmenu
        ;CP     218
        ;CALL   Z,STR77 ;autounpress start
        ;CP     219
        ;CALL   Z,menu_printcopyrights;STR7 ;print text TEXT3 (copyrights), TEXT4 (hiscores)
        CP      220
        JP      nc,noscroll;STR4
        ld hl,(callpush_curscroll)
        bit 7,h
        jr nz,noscroll;STR4 ;end of scroll
      call menuscroll
       ;call setpgc3
       ;call #C000 ;init muzmain
       ld a,(SOUNDW)
       or a
       call z,afxinit ;stop sound
        ret;jp KERNS
noscroll;STR4
       call menuscreen_tank
         call doscreen        
        ret;JP KERNS ;STR44

stopscroll_draw
        ld de,512-200-8
        ld (callpush_curscroll),de
        call bgpush_draw ;359975t
        CALL menu_printcopyrights;STR7 ;print text TEXT3 (copyrights), TEXT4 (hiscores)
       call menuscreen_tank
         call doscreen ;╤Б╨╛╨┤╨╡╤А╨╢╨╕╤В changescrpg ╨╕ waitchangescr
        ;call changescrpg ;╤Б ╤Н╤В╨╛╨│╨╛ ╨╝╨╛╨╝╨╡╨╜╤В╨░ (╤В╨╛╤З╨╜╨╡╨╡, ╤Б ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤П) ╨╝╨╛╨╢╨╡╨╝ ╨▓╨╕╨┤╨╡╤В╤М, ╤З╤В╨╛ ╨╜╨░╤А╨╕╤Б╨╛╨▓╨░╨╗╨╕
        ;halt
        call bgpush_draw ;359975t
        CALL menu_printcopyrights;STR7 ;print text TEXT3 (copyrights), TEXT4 (hiscores)
        call setpgsmain40008000
        ld h,-1
        ld (callpush_curscroll),hl
       call menuscreen_tank
         jp doscreen        
        ;ret
       
        if 1==1
STR3
        LD      A,(STR)
        DEC     A
        LD      (STR),A ;--scroll page?
        LD      HL,65535-228
        LD      (STR2),HL ;scroll position?
        JP      STR5
        endif

STR77
        PUSH    AF
        LD      A,1 ;start unpressed
        LD      (STAKEY),A
        POP     AF
        RET

menuchangetimer
        ld a,(timer)
KERNSoldtimer=$+1
        ld b,0
        ld (KERNSoldtimer),a
        sub b
        ld c,a
        ld b,0
        ret z ;jr z,STR44
       ld a,(STR6)
      cp 220
       ret nc
       add a,c
       ld (STR6),a ;time in start menu
      cp 220
        ret nc
        CALL STR77 ;autounpress start
        ret

menuscroll
       if 1==1
        ld a,(timer)
scrolloldtimer=$+1
        ld bc,0
        ld (scrolloldtimer),a
        sub c
        ld c,a
        ld hl,(callpush_curscroll)
        ;bit 7,h
        ;jr nz,STR4 ;end of scroll
        ld de,512-200-8
        or a
        sbc hl,de
        jr nc,stopscroll
        call bgpush_inccurscroll ;bc=scroll increment (signed)
scroll_wait0
       ld a,(timer)
lastscrtimer=$+1
       cp 0
       jr z,scroll_wait0 ;wait screen change
        call bgpush_draw ;359975t
        call setpgsmain40008000
       ld a,(timer)
       ld (lastscrtimer),a
        call changescrpg ;╤Б ╤Н╤В╨╛╨│╨╛ ╨╝╨╛╨╝╨╡╨╜╤В╨░ (╤В╨╛╤З╨╜╨╡╨╡, ╤Б ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤П) ╨╝╨╛╨╢╨╡╨╝ ╨▓╨╕╨┤╨╡╤В╤М, ╤З╤В╨╛ ╨╜╨░╤А╨╕╤Б╨╛╨▓╨░╨╗╨╕
        ret;jp STR44
stopscroll
        call stopscroll_draw
STR5
       else
        INC     A
        LD      (STR6),A ;++time in startmenu
        LD      A,(STR) ;scroll page?
        CP      15
        JP      Z,STR4 ;end of scroll?
        LD      HL,(STR2) ;scroll position?
        LD      A,H
        CP      #C0
        JP      Z,STR3 ;go to previous scroll page
        LD      DE,256
        SBC     HL,DE
STR5    LD      (STR2),HL ;scroll position?
       if 1==0
        PUSH    HL
        POP     DE
        LD      HL,#C000
        LD      B,51 ;wid/8-1?
        LD      C,154 ;hgt-1?
        LD      A,#C2
        LD      (PAGEFR),A
        LD      A,(STR)
        LD      (PAGETO),A
        LD      A,%00010001
        CALL    DMASTART
       endif
       endif
;STR44
        ret

menuscreen_tank
        LD      HL,(KORM);---X
        LD      BC,(KORM2);----Y
       if TILES87
       else
        ld a,c
        sub 16 ;╨║╨╛╤Б╤В╤Л╨╗╤М
        ld c,a
       endif
        LD      A,(TANK) ;sprite phase
        ADD     A,4;44 ;sprite pattern number
        LD      D,2 ;size
        CALL    PRINT
        LD      A,(TANKP) ;anim timer
        INC     A
        CP      4
        CALL    Z,TANKP2 ;next sprite phase
        CP      8
        CALL    Z,TANKP3 ;prev sprite phase
        LD      (TANKP),A ;anim timer
        ;LD     BC,TSCONFIG; SPRITE PRINT
        ;LD     A,%10000000
        ;OUT    (C),A
        ret

menucheckkeys
        CALL    EXIT ;if break, set (MAP)=31
       if VIRTUALKEYS
        ld a,(joy1state)
        and JOYMASK_START
       else
        LD      HL,(Keys1PlStart)
        LD      B,H
        LD      C,#FE
        IN      A,(C)
        AND     L
       endif
oldkeystart1=$+1
       ld c,0xff
       ld (oldkeystart1),a
        CALL    Z,STR8 ;press start
       if VIRTUALKEYS
        ld a,(joy1state)
        and JOYMASK_FIRE
       else
        LD      HL,(Keys1PlFr)
        LD      B,H
        LD      C,#FE
        IN      A,(C)
        AND     L
       endif
oldkeyfire1=$+1
       ld c,0xff
       ld (oldkeyfire1),a
        CALL    Z,STR8 ;press start
        ;ret
;menucheckkeys_up_down
       if VIRTUALKEYS
        ld a,(joy1state)
        and JOYMASK_DOWN
       else
        LD      HL,(Keys1PlDn)          ;LD             HL,Keys1PlDn+2
        LD      B,H                                     ;LD             BC,(Keys1PlDn)
        LD      C,#FE                           ;CALL   CHBIT
        IN      A,(C)
        AND     L
       endif
oldkeydd2=$+1
       ld c,0xff
       ld (oldkeydd2),a
        CALL    Z,KEYDD2
       if VIRTUALKEYS
        ld a,(joy1state)
        and JOYMASK_UP
       else
        LD      HL,(Keys1PlUp)          ;LD             HL,Keys1PlUp+2
        LD      B,H                                     ;LD             BC,(Keys1PlUp)
        LD      C,#FE                           ;CALL   CHBIT
        IN      A,(C)
        AND     L
       endif
oldkeyuu2=$+1
       ld c,0xff
       ld (oldkeyuu2),a
        CALL    Z,KEYUU2
        ret
       
STR8
;press start
      if 1
       cp c
       ret z
        call stopscroll_draw
        jp CHEKSTA ;use menu option depending on Y (KORM2)
      else
        LD      A,(STAKEY) ;start unpressed?
        CP      1
        jp      Z,CHEKSTA ;use menu option depending on Y (KORM2)
        LD      A,(STR6) ;time in startmenu
        CP      220
        JR      Z,STR10 ;wait start key unpress
        LD      A,219
        LD      (STR6),A ;??? time in startmenu
       if 1==1
        call stopscroll_draw
        ;RET
       else
        LD      HL,#C000+26+8192+1024
        LD      (STR2),HL ;scroll position in page?
        LD      A,#10
        LD      (STR),A ;scroll page?
        CALL    CLSSTART ;???
        RET
       endif
STR10
      if 1==0
       if VIRTUALKEYS
        ld a,(joy1state)
        and JOYMASK_START
       else
        LD      HL,(Keys1PlStart)
        LD      B,H
        LD      C,#FE
        IN      A,(C)
        AND     L
       endif
        JR      Z,STR10
       if VIRTUALKEYS
        ld a,(joy1state)
        and JOYMASK_FIRE
       else
        LD      HL,(Keys1PlFr)
        LD      B,H
        LD      C,#FE
        IN      A,(C)
        AND     L
       endif
        JR      Z,STR10
      endif
        LD      A,1
        LD      (STAKEY),A ;start unpressed
        RET
      endif

CHEKSTA
        LD      HL,(KORM2) ;Y
        LD      A,L
        CP      126
        JP      Z,FIGHT
        CP      136
        JP      Z,FIGHT
        CP      146
        JP      Z,EDITOR;START ;editor
        CP      156
        JP      Z,REDIFIN
        RET

CLSSTART
        if 1==1 ;???
        call clstiles
        else
        LD      HL,25998
        LD      A,%00010001
        LD      (HL),A
        INC     HL
        LD      (HL),A
        DEC     HL
        LD      DE,#C000
        LD      B,95 ;wid/8-1?
        LD      C,240 ;hgt-1?
        LD      A,#05
        LD      (PAGEFR),A
        LD      A,#10
        LD      (PAGETO),A
        LD      A,%00110100
        CALL    DMASTART
        HALT
        HALT
        endif
        RET

STAKEY  DEFB    0 ;1=start unpressed
STR     DEFB    #13 ;scroll page?
STR2    DEFW    65535-228 ;scroll position in page?
STR6    DEFB    0 ;time in startmenu

EXIT
        LD      BC,#7FFE
        IN      A,(C)
        AND     %0000001
        RET     NZ
        LD      BC,#FEFE
        IN      A,(C)
        AND     %0000001
        RET     NZ
       halt
       call setpgc3
       CALL     #C000 ;init muzmain
       call swapimer
       QUIT
        ;LD     A,31
        ;LD     (MAP),A
        ;RET

reter
        ret

KERNF
      ifdef CLIENT
      if CLIENT
       call sendjoyTMP
      else
       call readfrominet_tojoy2 ;╨╝╨╛╨╢╨╡╤В ╨▒╤Л╤В╤М ╨┐╤А╨╕╨╜╤П╤В╨╛ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╤Г╨│╨╛╨┤╨╜╨╛ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╣ - ╨▒╨╡╤А╤С╨╝ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╡
      endif
      endif

        call doscreen_and_logic

;TODO ╤Н╤В╨╕ ╤Б╨╛╨▒╤Л╤В╨╕╤П ╤В╨╛╨╢╨╡ ╨╛╨▒╤Б╨╗╤Г╨╢╨╕╨▓╨░╤В╤М ╨▓ logic:
        CALL    ENDGAME
        LD              A,(NEWLEVEL)
        CP              1
        CALL    Z,END5

        JR      KERNF

doscreen
        call showsprites
;╨╖╨░╨║╨╛╨╜╤З╨╕╨╗╨╕ ╤А╨╕╤Б╨╛╨▓╨░╤В╤М
       ld a,(timer)
       push af
        call changescrpg ;╤Б ╤Н╤В╨╛╨│╨╛ ╨╝╨╛╨╝╨╡╨╜╤В╨░ (╤В╨╛╤З╨╜╨╡╨╡, ╤Б ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤П) ╨╝╨╛╨╢╨╡╨╝ ╨▓╨╕╨┤╨╡╤В╤М, ╤З╤В╨╛ ╨╜╨░╤А╨╕╤Б╨╛╨▓╨░╨╗╨╕
       pop bc ;b=timer ╨╜╨░ ╨╝╨╛╨╝╨╡╨╜╤В changescrpg
       jp waitchangescr0

doscreen_and_logic
;logic=56000..103000
        call showsprites
;╨╖╨░╨║╨╛╨╜╤З╨╕╨╗╨╕ ╤А╨╕╤Б╨╛╨▓╨░╤В╤М
       ld a,(timer)
       push af
        call changescrpg ;╤Б ╤Н╤В╨╛╨│╨╛ ╨╝╨╛╨╝╨╡╨╜╤В╨░ (╤В╨╛╤З╨╜╨╡╨╡, ╤Б ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤П) ╨╝╨╛╨╢╨╡╨╝ ╨▓╨╕╨┤╨╡╤В╤М, ╤З╤В╨╛ ╨╜╨░╤А╨╕╤Б╨╛╨▓╨░╨╗╨╕

;╨╗╨╛╨│╨╕╨║╨░
;... ╨╡╤С ╨▓╤Л╨╖╤Л╨▓╨░╤В╤М ╤Б╤В╨╛╨╗╤М╨║╨╛ ╤А╨░╨╖, ╤Б╨║╨╛╨╗╤М╨║╨╛ ╨┐╤А╨╛╤И╨╗╨╛ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╣!
mainloop_uvwaittimer0
        ld a,(timer)
uvoldtimer=$+1
        ld b,0
        ld (uvoldtimer),a
        sub b
        ld b,a
        jr z,mainloop_uvwaittimer0 ;╨╡╤Б╨╗╨╕ ╨╜╨╕ ╨╛╨┤╨╜╨╛╨│╨╛ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤П ╨╜╨╡ ╨┐╤А╨╛╤И╨╗╨╛, ╨║╤А╤Г╤В╨╕╨╝╤Б╤П ╤В╤Г╤В
        cp 4
        jr c,$+4
        ld b,4
;b=╤Б╨║╨╛╨╗╤М╨║╨╛ ╨┐╤А╨╛╤И╨╗╨╛ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╣
      ifdef CLIENT
      if CLIENT
       ;call sendjoyTMP
       ld hl,logic
       call readfrominet_tojoy1joy2 ;╤З╨╕╤В╨░╤В╤М ╨╛╨┤╨╜╨╛ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╡, ╨▓╤Л╨┐╨╛╨╗╨╜╨╕╤В╤М ╨╗╨╛╨│╨╕╨║╤Г - ╨╕ ╤В╨░╨║ ╨┐╨╛╨║╨░ ╨╡╤Б╤В╤М ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╤П
      else
mainloop_uvlogic0
        push bc
       ;call readfrominet_tojoy2 ;╨╝╨╛╨╢╨╡╤В ╨▒╤Л╤В╤М ╨┐╤А╨╕╨╜╤П╤В╨╛ ╤Б╨║╨╛╨╗╤М╨║╨╛ ╤Г╨│╨╛╨┤╨╜╨╛ ╤Б╨╛╨╛╨▒╤Й╨╡╨╜╨╕╨╣ - ╨▒╨╡╤А╤С╨╝ ╨┐╨╛╤Б╨╗╨╡╨┤╨╜╨╡╨╡
       call sendjoy1joy2 ;╨▓ ╨║╨░╨╢╨┤╨╛╨╝ ╤Ж╨╕╨║╨╗╨╡ ╨╗╨╛╨│╨╕╨║╨╕
        call logic
        pop bc
        djnz mainloop_uvlogic0
      endif
      else
mainloop_uvlogic0
        push bc
        call logic
        pop bc
        djnz mainloop_uvlogic0
      endif


;╨╢╨┤╤С╨╝ ╤Д╨╕╨╖╨╕╤З╨╡╤Б╨║╨╛╨│╨╛ ╨┐╨╡╤А╨╡╨║╨╗╤О╤З╨╡╨╜╨╕╤П ╤Н╨║╤А╨░╨╜╨░!
;╨╝╨╛╨╢╨╡╨╝ ╨╜╨░╤З╨░╤В╤М ╨╜╨╛╨▓╤Г╤О ╨╛╤В╤А╨╕╤Б╨╛╨▓╨║╤Г, ╤В╨╛╨╗╤М╨║╨╛ ╨╡╤Б╨╗╨╕ ╤Б ╨╝╨╛╨╝╨╡╨╜╤В╨░ changescrpg ╨┐╤А╨╛╤И╨╗╨╛ ╤Е╨╛╤В╤П ╨▒╤Л ╨╛╨┤╨╜╨╛ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╡ (╨▓╨╛╨╖╨╝╨╛╨╢╨╜╨╛, ╨▓╨╜╤Г╤В╤А╨╕ logic)
       pop bc ;b=timer ╨╜╨░ ╨╝╨╛╨╝╨╡╨╜╤В changescrpg
waitchangescr0
        ld a,(timer)
        cp b
        jr z,waitchangescr0
        ret

;pal
       include "pal.ast"

clearsprlist
        ld hl,sprlist
        ld de,sprlist+1
        ld bc,sprlistsz-1
        ld (hl),0
        ldir
        ret

clstiles
        ld hl,tilemap
        ld de,tilemap+1
        ld bc,BYTESPERTILELINE*30-1
        ld (hl),0
        ldir
        ld bc,TILEFLAG1*0x0101
       if TILES87
        ld hl,tilemap+0x800+BYTESPERTILELINE
       else
        ld hl,tilemap+0x800+(BYTESPERTILELINE*TOPYVISIBLE/8)
       endif
        call resettileflags
       if TILES87
        ld hl,tilemap+0x1000+BYTESPERTILELINE
       else
        ld hl,tilemap+0x1000+(BYTESPERTILELINE*TOPYVISIBLE/8)
       endif
        ;call resettileflags
        jp resettileflags

clstiles_field
        call clstiles
        ld hl,tilemap+34
        ld de,BYTESPERTILELINE-6
        ld bc,0x600+30 ;b=wid, c=hgt (chrs)
clstileblock0
        push bc
        ld (hl),0xe0
        inc hl
        djnz $-3
        pop bc
        add hl,de
        dec c
        jr nz,clstileblock0
        ret

clstiles_white
        call clstiles
        ld hl,tilemap
        ld de,BYTESPERTILELINE-40
        ld bc,40*256+30 ;b=wid, c=hgt (chrs)
        jr clstileblock0

prchar_tilemap_hl
;a=char (kept)
;hl=tilemap
        ;ex de,hl
        ;call prchar_tilemap
        ;ex de,hl
        PRCHAR_TILEMAP_HL
        ret
prchar_tilemap
;a=char (kept)
;de=tilemap
        ld (de),a
         if BYTESPERTILE == 2
         inc de
         ex de,hl
         ld (hl),0xc0 ;╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤В╨░╨╣╨╗╨░ ╤Б╤В╨░╨▓╨╕╨╝ ╨▒╨╕╤В╤Л ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П ╨╛╨▒╨╛╨╕╤Е ╤Н╨║╤А╨░╨╜╨╛╨▓ (╨░ ╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤Б╨┐╤А╨░╨╣╤В╨░ ╨╜╨░╨┤╨╛ ╤В╨╛╨╗╤М╨║╨╛ ╨╜╨░ ╤В╨╡╨║╤Г╤Й╨╡╨╝ ╤Н╨║╤А╨░╨╜╨╡)
         ex de,hl
         dec de
         else
         ex de,hl
         set 3,h
         ld (hl),TILEFLAG1 ;╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤В╨░╨╣╨╗╨░ ╤Б╤В╨░╨▓╨╕╨╝ ╨▒╨╕╤В╤Л ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П ╨╛╨▒╨╛╨╕╤Е ╤Н╨║╤А╨░╨╜╨╛╨▓ (╨░ ╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤Б╨┐╤А╨░╨╣╤В╨░ ╨╜╨░╨┤╨╛ ╤В╨╛╨╗╤М╨║╨╛ ╨╜╨░ ╤В╨╡╨║╤Г╤Й╨╡╨╝ ╤Н╨║╤А╨░╨╜╨╡)
         res 3,h
         set 4,h
         ld (hl),TILEFLAG1 ;╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤В╨░╨╣╨╗╨░ ╤Б╤В╨░╨▓╨╕╨╝ ╨▒╨╕╤В╤Л ╨╕╨╖╨╝╨╡╨╜╨╡╨╜╨╕╤П ╨╛╨▒╨╛╨╕╤Е ╤Н╨║╤А╨░╨╜╨╛╨▓ (╨░ ╨┐╤А╨╕ ╨┐╨╡╤З╨░╤В╨╕ ╤Б╨┐╤А╨░╨╣╤В╨░ ╨╜╨░╨┤╨╛ ╤В╨╛╨╗╤М╨║╨╛ ╨╜╨░ ╤В╨╡╨║╤Г╤Й╨╡╨╝ ╤Н╨║╤А╨░╨╜╨╡)
         res 4,h
         ex de,hl
         endif
        ret


loadfile
;de=filename
;hl=addr
        push hl ;addr
        OS_OPENHANDLE
        pop de ;addr
        push bc ;b=handle
        ld hl,0x4000 ;max size
        OS_READHANDLE
        pop bc ;b=handle
        OS_CLOSEHANDLE
        ret

savefile
;de=filename
;hl=addr
;bc=size
        push hl ;addr
        push bc ;size
        OS_CREATEHANDLE
        pop hl ;size
        pop de ;addr
        push bc ;b=handle
        OS_WRITEHANDLE
        pop bc ;b=handle
        OS_CLOSEHANDLE
        ret

bgfilename ;needs 40008000?
        db "menu.bmp",0

        macro PRTILE
       dup TILEHGT-1
        ld a,(de)
        inc d
        ld (hl),a
         set 6,h
        ld a,(de)
        inc d
        ld (hl),a
         set 5,h
        ld a,(de)
        inc d
        ld (hl),a
         res 6,h
        ld a,(de)
        inc d
        ld (hl),a
        add hl,bc
       edup
        ld a,(de)
        inc d
        ld (hl),a
         set 6,h
        ld a,(de)
        inc d
        ld (hl),a
         set 5,h
        ld a,(de)
        inc d
        ld (hl),a
         res 6,h
        ld a,(de)
        ld (hl),a  
        endm

drawlefttile
        ;jp drawleftandrighttiles
        ld hl,-2-0x800
        add hl,sp
;de=screen line start
     push de
        res 3,h
         ld a,l
         and 0x3f
         add a,e
         ld e,a
         jr nc,$+3
          inc d
        ld l,(hl)
        ex de,hl
        ld d,0x60
        PRTILE
     pop de
        ret

drawrighttile
        ;jp drawleftandrighttiles
        ld hl,-2+1-0x800
        add hl,sp
;de=screen line start
     push de
        res 3,h
         ld a,l
         and 0x3f
         add a,e
         ld e,a
         jr nc,$+3
          inc d
        ld l,(hl)
        ex de,hl
        ld d,0x60
        PRTILE
     pop de
        ret

drawleftandrighttiles
        ld hl,-2+1-0x800
        add hl,sp
;de=screen line start
     push de
        res 3,h
        ld a,(hl) ;right tile
        ex af,af' ;'
        dec l
         ld a,l
         and 0x3f
         add a,e
         ld e,a
         jr nc,$+3
          inc d
        ld l,(hl) ;left tile
        ex de,hl
       push hl ;screen (even x)
        ld d,0x60
        PRTILE
       pop hl ;screen (even x)
       inc l ;screen (odd x)
        ex af,af' ;'
        ld e,a ;right tile
        ld d,0x60
        PRTILE
     pop de
        ret

nexttileliner
        ld hl,TILEHGT*40;-40
        add hl,de ;screen
        ex de,hl
        ld hl,BYTESPERTILELINE-40-2
        add hl,sp
        ld sp,hl
        ret

showtiles
        ld (showtilessp),sp
showtilesaddrpatch=$+1
       if TILES87
        ld sp,tilemap+0x800+BYTESPERTILELINE
       else
        ld sp,tilemap+0x800+(BYTESPERTILELINE*TOPYVISIBLE/8)
       endif
        ld de,0x8000
        ld bc,40-0x2000
       ret
;╨╡╤Б╨╗╨╕ ╤Д╨╗╨░╨│ ╨╛╤В╤А╨╕╤Б╨╛╨▓╨║╨╕ ╤Е╤А╨░╨╜╨╕╤В╤Б╤П ╨╛╤В╨┤╨╡╨╗╤М╨╜╨╛ (╤З╨╡╤А╨╡╨╖ set N,d), ╤В╨╛:
        ;ret -> ╨┐╤А╨╛╨┐╤Г╤Б╨║ ╨╕╨╗╨╕ ╤А╨╕╤Б╨╛╨▓╨░╨╜╨╕╨╡ ╨╗╨╡╨▓╨╛╨│╨╛ ╨╕╨╗╨╕ ╨┐╤А╨░╨▓╨╛╨│╨╛ ╨╕╨╗╨╕ ╨╛╨▒╨╛╨╕╤Е ╤В╨░╨╣╨╗╨╛╨▓
;╨╜╨╛ ╤В╨╛╨│╨┤╨░ ╨╜╨░╨┤╨╛ ╤Д╨╗╨░╨│╨╕ ╨┤╨╗╤П 0 ╨╕ 1 ╤Н╨║╤А╨░╨╜╨╛╨▓ ╤Е╤А╨░╨╜╨╕╤В╤М ╨▓ ╨╛╤В╨┤╨╡╨╗╤М╨╜╤Л╤Е ╤В╨░╨▒╨╗╨╕╤Ж╨░╤Е, ╤В.╨║. ╨╛╨╜╨╕ ╨╖╨░╨┐╨░╤А╤Л╨▓╨░╤О╤В╤Б╤П ╤Б╤В╨╡╨║╨╛╨╝. ╨╕ ╨┐╨╛╤Б╨╗╨╡ ╨╛╤В╤А╨╕╤Б╨╛╨▓╨║╨╕ ╨╖╨░╨╗╨╕╤В╤М ╤В╨╡╨║╤Г╤Й╤Г╤О ╤В╨░╨▒╨╗╨╕╤Ж╤Г push'╨░╨╝╨╕
endtileliner
showtilessp=$+1
        ld sp,0
;╤Б╨╡╨╣╤З╨░╤Б ╨┐╤А╨╕ ╨║╤Г╤З╨╡ ╤Б╨┐╤А╨░╨╣╤В╨╛╨▓
;53000 + 8419(resettileflags)
;TODO ╨┤╨╡╨╗╨░╤В╤М reset ╤В╨╛╨╗╤М╨║╨╛ ╤В╨░╨╝, ╨│╨┤╨╡ ╨╛╤В╤А╨╕╤Б╨╛╨▓╨║╨░, ╨╕ ╨┐╨╛ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╤О (╨┐╤А╨╕╤З╤С╨╝ ╨┐╤А╨╡╤А╤Л╨▓╨░╨╜╨╕╨╡ ╨┤╨╛╨╗╨╢╨╜╨╛ ╨▓╨╛╤Б╤Б╤В╨░╨╜╨░╨▓╨╗╨╕╨▓╨░╤В╤М ╨░╨┤╤А╨╡╤Б nexttileliner)
        ret

resettileflags
;hl=start of visible tiles
        ;ld bc,TILEFLAG0*0x0101
;bc=TILEFLAG0*0x0101 or TILEFLAG1*0x0101
        ld (filltileflagsp),sp
       if TILES87
        ld de,28*64+40+2
        ld hx,29
       else
        ld de,24*64+40+2
        ld hx,25
       endif
        add hl,de
        ld de,endtileliner
filltileflagline0
        ld sp,hl
        push de
        dup 40/2
        push bc
        edup
        ld de,-BYTESPERTILELINE
        add hl,de
        ld de,nexttileliner
        dec hx
        jp nz,filltileflagline0
filltileflagsp=$+1
        ld sp,0
        ret

showsprites
        ld hl,tileaddrpatch+1
        ld a,(hl)
        xor 0x18
        ld (hl),a
        ld hl,showtilesaddrpatch+1
        ld a,(hl)
        xor 0x18
        ld (hl),a
       
        call setpgsscr8000c000
        call setpgc2_4000;setpggfxc000
        call showtiles
       
        ld hl,(showtilesaddrpatch)
        ld bc,TILEFLAG0*0x0101
         ;ld bc,TILEFLAG1*0x0101
        call resettileflags
       
        call setpgsscr40008000
       ;jp showsprites0q
        ld ix,sprlist
        ld b,85
showsprites0
;+0: y
;+1: 2(ysize:SPSIZ16) +0x20(SPACT) +0x40(deact) +0x80(mirrorvert) +1(SPSIZBS)
;+2: x
;+3: 2(xsize:SPSIZ16) +1(SPSIZBS) +0x80(mirrorhor)
;+4,5: pattern number
        ld a,(ix+1)
        or a
        jp z,showsprites0skip
        bit 6,a
        jp nz,showsprites0skip
        ;jp nz,showsprites0q ;╨╜╨╡ ╨▓╨╕╨┤╨╜╨╛ ╨▒╨╛╨╜╤Г╤Б
        bit 5,a
        jp z,showsprites0skip
;ix+1 bit7 = mirror vert
;ix+3 bit7 = mirror hor
        rla
        ld a,(ix+3)
        rla
        rla
        and 3 ;%000000vh
        or 0xc0
        ld (prspr_type+1),a
       push bc
        ld a,(ix+4) ;sprite pattern ;00(up/down),04(left/right)
        ld (prspr_type),a
        bit 5,a
        jr nz,prspr_setpgright
       bit 0,(ix+5) ;+256
        call z,setpgc0 ;left sprites (tanks)
        call nz,setpgspr2
       bit 1,(ix+5) ;+512
        call nz,setpgspr3
        jp prspr_setpgq
prspr_setpgright
        call setpgc1 ;right sprites (bullets)
prspr_setpgq
       if TILES87
        ld c,(ix+0) ;y
        ld a,c
         add a,4+(2*8)
        rra
        rra
        rra
        and 0x1f ;*1/8
        cpl
        ;inc a
        add a,c ;*7/8 (╨╛╨║╤А╤Г╨│╨╗╨╡╨╜╨╕╨╡ ╤В╨░╨║╨╛╨╡: 0,1,2,3,3,4,5,6, 7,8,9,10,10,11,12,13...
         add a,sprmaxhgt-1 +2 -6;7
         cp 199+sprmaxhgt-1 ;╨╖╨░╤Й╨╕╤В╨░ ╨╛╤В ╨▓╤В╨╛╤А╨╛╨│╨╛ ╨▓╨╖╤А╤Л╨▓╨░ ╤Б╨▓╨╡╤А╤Е╤Г ╤Б ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╤Л╨╝ y
         jp nc,showsprites0popbcskip
         sub sprmaxhgt-1;6;7
         ;sub 6;7
       else
        ld a,(ix+0) ;y
        add a,sprmaxhgt-1 -TOPYVISIBLE
         cp 199+sprmaxhgt-1 ;╨╖╨░╤Й╨╕╤В╨░ ╨╛╤В ╨▓╤В╨╛╤А╨╛╨│╨╛ ╨▓╨╖╤А╤Л╨▓╨░ ╤Б╨▓╨╡╤А╤Е╤Г ╤Б ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╤Л╨╝ y
         jp nc,showsprites0popbcskip
         sub sprmaxhgt-1;6;7      
       endif
        ld c,a ;y
        ld a,(ix+3) ;xsize, xhsb
        rra
        ld a,(ix+2) ;x
        rra
        add a,sprmaxwid-1
        ld e,a
prspr_type=$+2
        ld iy,(0xc000)
;e=x = -(sprmaxwid-1)..159 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ x/2+(sprmaxwid-1))
;c=y = -(sprmaxhgt-1)..199 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ ╨╡╤Б╤В╤М)
       push ix
       push de
         ld a,(iy-3) ;sprhgt
         cp 16
         jr nz,prspr_bighgt
        call prspr
       pop de
       pop ix
       ;╤Б╤В╨░╨▓╨╕╨╝ ╤Д╨╗╨░╨│╨╕ ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╤П ╨╜╨░ ╤В╨░╨╣╨╗╨░╤Е ╨┐╨╛╨┤ ╤Б╨┐╤А╨░╨╣╤В╨╛╨╝
        ld c,(ix+0) ;y
       ld a,e ;x/2
       sub sprmaxwid-1
       jr nc,$+3
        xor a
       and 0xfc
       ld e,a ;x/2
       ld a,c ;y
       and 0xf8
        cp 8*29;30
        jr c,$+3
         xor a
       ld l,a
       ld h,0
       ld d,h;0
       add hl,hl
       add hl,hl
       add hl,hl ;Y*64
       if BYTESPERTILE == 2
        add hl,hl ;*128
       endif
       srl e
       if BYTESPERTILE == 1
       srl e
       endif
       add hl,de
tileaddrpatch=$+1
       ld de,tilemap+0x800
       add hl,de
        ld a,(ix+2) ;x
        and 7
       ld a,TILEFLAG1
       ld (hl),a
        jr z,prsprwid2
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       ld de,BYTESPERTILELINE-(2*BYTESPERTILE)
       add hl,de
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       add hl,de
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
      if TILES87
;╨╕╨╖-╨╖╨░ ╤В╨░╨╣╨╗╨╛╨▓ ╨▓╤Л╤Б╨╛╤В╨╛╨╣ 7 ╨┐╤А╨╕ y=6 ╨┐╤А╨╕╤Е╨╛╨┤╨╕╤В╤Б╤П ╨╛╨▒╨╜╨╛╨▓╨╕╤В╤М ╤З╨╡╤В╤Л╤А╨╡ ╤А╤П╨┤╨░:
        ld a,c ;y
        cpl
        and 7
        jr nz,prsprhgt3q
        ld a,TILEFLAG1
       add hl,de
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
      endif
       jp prsprhgt3q

prsprwid2
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       ld de,BYTESPERTILELINE-(1*BYTESPERTILE)
       add hl,de
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
       add hl,de
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
      if TILES87
;╨╕╨╖-╨╖╨░ ╤В╨░╨╣╨╗╨╛╨▓ ╨▓╤Л╤Б╨╛╤В╨╛╨╣ 7 ╨┐╤А╨╕ y=6 ╨┐╤А╨╕╤Е╨╛╨┤╨╕╤В╤Б╤П ╨╛╨▒╨╜╨╛╨▓╨╕╤В╤М ╤З╨╡╤В╤Л╤А╨╡ ╤А╤П╨┤╨░:
        ld a,c ;y
        cpl
        and 7
        jr nz,prsprhgt3q
        ld a,TILEFLAG1
       add hl,de
       ld (hl),a
       dup BYTESPERTILE
       inc l
       edup
       ld (hl),a
      endif
       jp prsprhgt3q
prspr_bighgt
        call prspr
       pop de
       pop ix
     if 1==1
       ;╤Б╤В╨░╨▓╨╕╨╝ ╤Д╨╗╨░╨│╨╕ ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╤П ╨╜╨░ ╤В╨░╨╣╨╗╨░╤Е ╨┐╨╛╨┤ ╤Б╨┐╤А╨░╨╣╤В╨╛╨╝
        ld c,(ix+0) ;y
       ld a,e ;x/2
       sub sprmaxwid-1
       jr nc,$+3
        xor a
       and 0xfc
       ld e,a ;x/2
       ld a,c ;y
       and 0xf8
       ld l,a
       ld h,0
       ld d,h;0
       add hl,hl
       add hl,hl
       add hl,hl ;Y*64
       if BYTESPERTILE == 2
        add hl,hl ;*128
       endif
       srl e
       if BYTESPERTILE == 1
       srl e
       endif
       add hl,de
       ld de,(tileaddrpatch)
       add hl,de
       ld de,BYTESPERTILELINE-(4*BYTESPERTILE)
      if TILES87
       ld b,6
      else
       ld b,5
      endif
prspr_bighgt1
       ld a,TILEFLAG1
       ld (hl),a
      dup 4
       dup BYTESPERTILE
       inc hl ;╨╜╨╡╨╗╤М╨╖╤П l, ╨╜╨╡ ╨║╨╛╨╝╨┐╨╡╨╜╤Б╨╕╤А╤Г╨╡╤В╤Б╤П add
       edup
       ld (hl),a
      edup
      ld a,h
       add hl,de
      xor h
      and 0xf8 ;╨╛╤Б╤В╨░╤С╨╝╤Б╤П ╨▓ ╤А╨░╨╝╨║╨░╤Е ╨╛╨┤╨╜╨╛╨╣ ╨║╨░╤А╤В╤Л ╤Д╨╗╨░╨│╨╛╨▓!
      xor h
      ld h,a
       djnz prspr_bighgt1
     endif
       jp prsprhgt3q
prsprhgt3q

;╨╡╤Б╨╗╨╕ ╤Б╨┐╤А╨░╨╣╤В - ╤В╨░╨╜╨║ (╨╜╨╡ ╨▒╨╛╨╜╤Г╤Б)
;draw tree (one or many) above sprite if needed
       if TILES87 || !DRAWFOREST
       else
        bit 5,(ix+4)
        jp nz,prspr_tree_q ;╨╜╨╡ ╤В╨░╨╜╨║
        call setpgc1 ;right sprites (bullets)
        ld a,(ix+0) ;y
         and 0xf0
        ld l,a ;y for tilemap
        sub TOPYVISIBLE
        ;add a,sprmaxhgt-1 -TOPYVISIBLE
         ;cp 199+sprmaxhgt-1 ;╨╖╨░╤Й╨╕╤В╨░ ╨╛╤В ╨▓╤В╨╛╤А╨╛╨│╨╛ ╨▓╨╖╤А╤Л╨▓╨░ ╤Б╨▓╨╡╤А╤Е╤Г ╤Б ╨╛╤В╤А╨╕╤Ж╨░╤В╨╡╨╗╤М╨╜╤Л╨╝ y
         ;jp nc,showsprites0popbcskip
         ;sub sprmaxhgt-1;6;7      
        ld c,a ;y for prspr
        ld a,(ix+3) ;xsize, xhsb
        rra
        ld a,(ix+2) ;x
        rra
         and 0xf8
       ld e,a ;x/2 for tilemap
        add a,sprmaxwid-1
        ld b,a ;x/2 for prspr
       ;ld l,c ;y = Y*8
       ld h,0
       ld d,h;0
       add hl,hl
       add hl,hl
       add hl,hl ;Y*64
       srl e
       srl e ;x/8
       add hl,de
       ld de,tilemap;+(TOPYVISIBLE/8*BYTESPERTILELINE)
       add hl,de
       push bc
       push hl
       ld e,b ;x/2
       ld a,(hl)
       cp 24 ;tree
        ld iy,(0xc000+62)
;e=x = -(sprmaxwid-1)..159 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ x/2+(sprmaxwid-1))
;c=y = -(sprmaxhgt-1)..199 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ ╨╡╤Б╤В╤М)
       push ix
        call z,prspr ;╨╛╨║╤А╤Г╨│╨╗╨╡╨╜╨╕╨╡ x ╨▓╨╗╨╡╨▓╨╛, y ╨▓╨▓╨╡╤А╤Е
       pop ix
       pop hl
       pop bc
       
        ld a,(ix+2) ;x
        and 0x0e
        jr z,prspr_tree_xrightq ;╨╛╨║╤А╤Г╨│╨╗╤П╤В╤М x ╨▓╨┐╤А╨░╨▓╨╛ ╨╜╨╡ ╤В╤А╨╡╨▒╤Г╨╡╤В╤Б╤П
       push bc
       push hl
       inc l
       inc l
       ld a,b ;x/2
       add a,8
       ld e,a
       ld a,(hl)
       cp 24 ;tree
        ld iy,(0xc000+62)
;e=x = -(sprmaxwid-1)..159 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ x/2+(sprmaxwid-1))
;c=y = -(sprmaxhgt-1)..199 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ ╨╡╤Б╤В╤М)
       push ix
        call z,prspr ;╨╛╨║╤А╤Г╨│╨╗╨╡╨╜╨╕╨╡ x ╨▓╨╗╨╡╨▓╨╛, y ╨▓╨▓╨╡╤А╤Е
       pop ix
       pop hl
       pop bc
prspr_tree_xrightq
       
        ld a,(ix+0) ;y
        and 0x0f
        jr z,prspr_tree_q ;╨╛╨║╤А╤Г╨│╨╗╤П╤В╤М y ╨▓╨╜╨╕╨╖ ╨╜╨╡ ╤В╤А╨╡╨▒╤Г╨╡╤В╤Б╤П
       ld de,BYTESPERTILELINE*2
       add hl,de
       ld a,c
       add a,16
       ld c,a ;y
       push bc
       push hl
       ld e,b ;x/2
       ld a,(hl)
       cp 24 ;tree
        ld iy,(0xc000+62)
;e=x = -(sprmaxwid-1)..159 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ x/2+(sprmaxwid-1))
;c=y = -(sprmaxhgt-1)..199 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ ╨╡╤Б╤В╤М)
       push ix
        call z,prspr ;╨╛╨║╤А╤Г╨│╨╗╨╡╨╜╨╕╨╡ x ╨▓╨╗╨╡╨▓╨╛, y ╨▓╨▓╨╡╤А╤Е
       pop ix
       pop hl
       pop bc

        ld a,(ix+2) ;x
        and 0x0e
        jr z,prspr_tree_q ;╨╛╨║╤А╤Г╨│╨╗╤П╤В╤М x ╨▓╨┐╤А╨░╨▓╨╛ ╨╜╨╡ ╤В╤А╨╡╨▒╤Г╨╡╤В╤Б╤П
       inc l
       inc l
       ld a,b ;x/2
       add a,8
       ld e,a
       ld a,(hl)
       cp 24 ;tree
        ld iy,(0xc000+62)
;e=x = -(sprmaxwid-1)..159 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ x/2+(sprmaxwid-1))
;c=y = -(sprmaxhgt-1)..199 (╨║╨╛╨┤╨╕╤А╤Г╨╡╤В╤Б╤П ╨║╨░╨║ ╨╡╤Б╤В╤М)
       push ix
        call z,prspr ;╨╛╨║╤А╤Г╨│╨╗╨╡╨╜╨╕╨╡ x ╨▓╨╗╨╡╨▓╨╛, y ╨▓╨▓╨╡╤А╤Е
       pop ix      
prspr_tree_q
       endif
       
       
showsprites0popbcskip
       pop bc
showsprites0skip
        ld de,6
        add ix,de
        dec b
        jp nz,showsprites0
showsprites0q
;╤Б╨╡╨╣╤З╨░╤Б ╨┐╤А╨╕╨╝╨╡╤А╨╜╨╛ 82000 ╨┐╤А╨╕ ╨║╤Г╤З╨╡ ╤Б╨┐╤А╨░╨╣╤В╨╛╨▓

        call setpgsmain40008000
        ;call setpg8
        ;ret
setpg8 ;area?
pgarea=$+1
        ld a,0
        SETPGC000
        ret

border1
        xor a
        ld (curborder),a
        ;ld e,0;1
        ;OS_SETBORDER
        ret
border8
        ld a,12
        ld (curborder),a
        ;ld e,12
        ;OS_SETBORDER
        ret

setpgc ;ending music
pgmuzend=$+1
        ld a,0
        SETPGC000
        ret
setpg16 ;levels 01-16
pglvl0=$+1
        ld a,0
        SETPGC000
        ret
setpg17 ;levels 17-32
pglvl1=$+1
        ld a,0
        SETPGC000
        ret
setpg18 ;level 00 user
pglvl2=$+1
        ld a,0
        SETPGC000
        ret
setpgc0 ;spr0 ;left sprites (tanks)
pgspr0=$+1
        ld a,0
        SETPGC000
        ret
setpgc1 ;spr1 ;right sprites (bullets)
pgspr1=$+1
        ld a,0
        SETPGC000
        ret
setpgc2_4000
        ld a,(pgtiles)
        SETPG4000
        ret
setpgc2 ;tiles
pgtiles=$+1
        ld a,0
        SETPGC000
        ret
setpgc3 ;main music, boss music
pgmuzmain=$+1
        ld a,0
        SETPGC000
        ret
setpgspr2
pgspr2=$+1
        ld a,0
        SETPGC000
        ret
setpgspr3
pgspr3=$+1
        ld a,0
        SETPGC000
        ret
setpg
;a=(SM1),(SM2) ;#10..#13???
       ret
        ;ld ($+4),a
        ;ld a,(tpgs)
         ld c,a
         ld b,tpgs/256
         ld a,(bc)
        SETPGC000
        ret


genpush_newpage
;╨╖╨░╨║╨░╨╖╤Л╨▓╨░╨╡╤В ╤Б╤В╤А╨░╨╜╨╕╤Ж╤Г, ╨╖╨░╨╜╨╛╤Б╨╕╤В ╨▓ tpushpgs, a=pg
        push bc
        push de
        push hl
        push ix
        OS_NEWPAGE
        pop ix
        ld a,e
        ld (ix),a
        ld de,4
        add ix,de
        pop hl
        pop de
        pop bc
        ret

        INCLUDE "bgpush.asm"
        INCLUDE "../../_sdk/bmp.asm"
        include "../../_sdk/file.asm"
bgpush_bmpbuf=0x4000 ;ds 1024;320 ;╨╖╨░╨│╨╛╨╗╨╛╨▓╨╛╨║ bmp ╨╕╨╗╨╕ ╨╛╨┤╨╜╨░ ╤Б╤В╤А╨╛╨║╨░
bgpush_loadbmplinestack=bgpush_bmpbuf+1024 ;ds pushhgt*2+32

        align 256
trecodebyteleft
        dup 256
;%00003210 => %.3...210
_3=$&8
_210=$&7
        db (_3*0x08) + (_210*0x01)
        edup
       
trecodebyteright
        dup 256
;%00003210 => %3.210...
_3=$&8
_210=$&7
        db (_3*0x10) + (_210*0x08)
        edup

        align 256
tpushpgs ;╨╜╨╛╨╝╨╡╤А╨░ 0..15
tpgs ;╨╜╨╛╨╝╨╡╤А╨░ 16..
        ds 256
        ;align 256
        ds TILEFLAG0*256+TILEFLAG0-$
        ret
        ds TILEFLAG0*256+TILEFLAG1-$
        jp drawlefttile
        ds TILEFLAG1*256+TILEFLAG0-$
        jp drawrighttile
        ds TILEFLAG1*256+TILEFLAG1-$
        jp drawleftandrighttiles

        INCLUDE "int.asm"

        ds 0x2000-$
tilemap
       if BYTESPERTILE == 1
        ds 64*32*BYTESPERTILE
        ds 64*32*BYTESPERTILE ;scr0 update flags
       endif
        ds 64*35*BYTESPERTILE ;scr1 update flags ;40*25 ;35 - ╨╖╨░╨┐╨░╤Б ╨╜╨░ ╨╗╤О╨▒╨╛╨╣ y ╨┐╤А╨╕ ╨╛╨▒╨╜╨╛╨▓╨╗╨╡╨╜╨╕╨╕ 4 ╤А╤П╨┤╨╛╨▓

        INCLUDE "mem.asm"
        INCLUDE "prspr.asm"

        ;display $,"<0x3ee0"
        ds 0x3ee0-$
        ds 0x4000-$

        INCLUDE "units.asm"
        INCLUDE "XASASM1.a80"
        INCLUDE "BC1.a80"
        INCLUDE "BC2.a80"
        INCLUDE "BC3.a80"
        INCLUDE "BC4.a80"

path
        db "zxbattle",0
fn_log
        db "zxbattle.log",0
fn_hiscore
        db "hi_score.dat",0
fn_soundfx
        db "sound_fx.bin",0
fn_muzmain
        db "muz_main.dat",0
fn_muzboss
        db "muz_boss.dat",0
fn_muzend
        db "muz_end.dat",0
        if TILES87
fn_lvl0116
        db "lvl_0116.dat",0
fn_lvl1732
        db "lvl_1732.dat",0
        else
fn_lvl0116
        db "lvln0116.dat",0
fn_lvl1732
        db "lvln1732.dat",0
        endif
fn_lvl00us
        db "lvl_00us.dat",0
fn_spr0
        db "spr0.dat",0
fn_spr1
        db "spr1.dat",0
fn_spr2
        db "spr2.dat",0
fn_spr3
        db "spr3.dat",0
fn_tiles
        db "font.bin",0

       ifdef CLIENT
inetbuf_sz=256
inetbuf
        ds inetbuf_sz
       endif

end

        display "End=",end
        ;display "Free after end=",/d,#c000-end
        ;display "Size ",/d,end-begin," bytes"
        display "UP1=",UP1
        display "MAP=",MAP

       ifdef CLIENT
        if CLIENT
                savebin "zxbatcli.com",begin,end-begin
        else
                savebin "zxbatsrv.com",begin,end-begin
        endif
       else
        savebin "zxbattle.com",begin,end-begin
       endif

        LABELSLIST "../../../us/user.l"