Login

Subversion Repositories NedoOS

Rev

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

        DEVICE ZXSPECTRUM128
        include "../../_sdk/sys_h.asm"

EGA=1
     
        if EGA
attrs=0x3800 ;0x600
attrs_sz=0x600
fieldwid=38
fieldhgt=23
        else
attrs=0x5800
attrs_sz=0x300
fieldwid=30
fieldhgt=22
        endif

STACK=0x4000
       

dangerattr1=0x38+2 ;red
dangerattr2=0x38+4 ;green
dangerattr3=0x38+1 ;blue
scoreattr=dangerattr3
wallattr=dangerattr1
snakeattr=dangerattr2
rabbitattr=0x40+0x30 ;bright yellow
emptyattr=0x38

snakecoordssize=fieldwid*fieldhgt*2;768*2

dir_r=key_right;cs8;0x09
dir_l=key_left;cs5;0x08
dir_u=key_up;cs7;0x0b
dir_d=key_down;cs6;0x0a


IPPROTO_TCP EQU 6
IPPROTO_UDP EQU 17

AF_UNSPEC EQU 0
AF_INET EQU 2
AF_INET6 EQU 23

SOCK_STREAM EQU 0x01    ;tcp/ip
SOCK_DGRAM      EQU 0x03                ;udp/ip

SHUT_RDWR               EQU 2
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_CONNRESET   EQU 54
ERR_NOTCONN     EQU 57
       
        org PROGSTART
begin
        ld sp,STACK
        OS_HIDEFROMPARENT

        if EGA
        ld e,0
        else
        ld e,3
        endif
        OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)

        ;OS_GETSCREENPAGES
;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
        ;if EGA
        ;ld a,e
        ;SETPG32KLOW
        ;ld a,d
        ;SETPG32KHIGH
        ;else
        ;ld a,d
        ;SETPG16K
        ;endif

        ld hl,attrs
        ld de,attrs+1
        ld bc,attrs_sz-1
        ld (hl),emptyattr
        ldir

        call redraw

        ld hl,0x0101
        ld (snakecoords),hl
        ld hl,0x1001
        ld (snakecoords2),hl
        ;ld bc,0x0a1e
        ;call prrabbit
        call genrabbit

         xor a
         ld (snakestopped),a
         ld (snake2stopped),a

        ld de,0x0203
        OS_NETSOCKET
        ld a,l
        ld (soc),a
        or a
        jp m,inet_exiterr_nosoc
;       ld de,0x0203
;       OS_NETSOCKET
;       ld a,l
;       ld (socrecv),a
;       or a
;       jp m,inet_exiterr_nosocrecv
       
        ;if CLIENT

;       ld a,(socsend)
;       LD DE,port_iasend
;       OS_NETCONNECT
;       ld a,l
;       or a
;       jp m,inet_exiterr
       
        ;else ;slave
        if CLIENT==0
        ld a,(soc)
        LD DE,port_ia
        OS_BIND
    ld a,l
        or a
        jp m,inet_exiterr
        endif
       
        if 1==0
        ld a,(soc)
        LD DE,port_ia
        OS_NETCONNECT
        ld a,l
        or a
        jp m,inet_exiterr
        endif
        ;endif

;начальная синхронизация        
;если master - при этом посылаем свои клавиши, если slave - принимаем клавиши
;TODO для двух игроков:
;???
        if CLIENT ;посылаем событие старта

        ld a,1
        call sendbyte
       
        else ;slave - принимаем событие старта
       
waitbegin0
        call receivebyte
        jr z,waitbegin0
        endif
       
       
gameloop
        if EGA
        ld bc,0*256+18
        call calcscraddr
        else
        ld de,0x4000+14
        endif
        ld hl,(curlength)
        call prnum
        if EGA
        ld bc,24*256+18
        call calcscraddr
        else
        ld de,0x50e0+14
        endif
        ld hl,(curlength2)
        call prnum
       
        if CLIENT
        call delay
        endif
         
        call getkey ;если master - при этом посылаем свои клавиши, если slave - принимаем клавиши
       
        call shrink
        call shrink2
        call proldheadastail
        call proldheadastail2
        call move_grow ;bc=новые координаты головы
        push bc
        call move_grow2 ;bc=новые координаты головы
        push bc
        call collide_rabbit_startgrow
        call collide_rabbit_startgrow2
       
        call collide_walls_self2 ;Z=collision
        ;jr z,gameover
        call z,stopsnake2
        pop bc
        call nz,prhead2
        call collide_walls_self ;Z=collision
        ;jr z,gameover
        call z,stopsnake
        pop bc
        call nz,prhead
       
snakestopped=$+1
        ld a,0
snake2stopped=$+1
        and 0
        dec a
        jp z,gameover
       
        jp gameloop

redrawall
        call redraw
        call prsnake
        call getheadcoords
        call prhead
        call prsnake2
        call getheadcoords2
        call prhead2
rabbitxy=$+1
        ld bc,0
        jp prrabbit
redraw
        call setpgs_scr
        call cls        
        jp prfield

setpgs_scr
        ld a,(user_scr0_low) ;ok
        SETPG32KLOW
        ld a,(user_scr0_high) ;ok
        SETPG32KHIGH
        ret

redrawgameover
        call redrawall
gameover
        ld hl,endtext
        if EGA
        ld bc,0x0b0f
        else
        ld bc,0x0b0b
        endif
        call prtext
gameoverloop
        YIELD
        GET_KEY
        cp key_redraw
        jr z,redrawgameover
        cp key_esc
        jr nz,gameoverloop
inet_exiterr
inet_exitcode
quit
        LD      a,(soc)
        LD      E,0
        OS_NETSHUTDOWN
inet_exiterr_nosoc
;       LD      a,(socsend)
;       LD      E,0
;       OS_NETSHUTDOWN
;inet_exiterr_nosockets
        QUIT
       
rnd
;0..c-1
        ;ld a,r
;Patrik Rak
rndseed1=$+1
        ld  hl,0xA280   ; xz -> yw
rndseed2=$+1
        ld  de,0xC0DE   ; yw -> zt
        ld  (rndseed1),de  ; x = y, z = w
        ld  a,e         ; w = w ^ ( w << 3 )
        add a,a
        add a,a
        add a,a
        xor e
        ld  e,a
        ld  a,h         ; t = x ^ (x << 1)
        add a,a
        xor h
        ld  d,a
        rra             ; t = t ^ (t >> 1) ^ w
        xor d
        xor e
        ld  h,l         ; y = z
        ld  l,a         ; w = t
        ld  (rndseed2),hl
        ;ex de,hl
        ;ld hl,0
        ;res 7,c ;int
rnd0
        sub c
        jr nc,rnd0
        add a,c
        ret

collide_rabbit_startgrow
        call getheadcoords
        call calcattraddr
        ;de=attraddr (head)
        ld a,(de)
        cp rabbitattr
        ret nz
        ld a,5
        ld (curgrow),a
        jp genrabbit

collide_rabbit_startgrow2
        call getheadcoords2
        call calcattraddr
        ;de=attraddr (head)
        ld a,(de)
        cp rabbitattr
        ret nz
        ld a,5
        ld (curgrow2),a
        jp genrabbit

genrabbit
        ld c,fieldhgt
        call rnd
        inc a
        ld b,a
        ld c,fieldwid
        call rnd
        inc a
        ld c,a
       
;genrabbit, если попало на хвост:
        ;call calcscraddr
        call calcattraddr;_fromscr
        ;de=attraddr (rabbit)
        ld a,(de)
        cp emptyattr
        jr nz,genrabbit
        ld (rabbitxy),bc
       
prrabbit
;bc=yx
        ld a,rabbitattr
        ld (curattr),a
        ;ld a,'Y'
        ;jp prcharxy
        ld hl,tilerabbit
        jp prtilexy
       
collide_walls_self
;out: Z=collision
        call getheadcoords
        ;call calcscraddr
        call calcattraddr;_fromscr
        ;de=attraddr (head)
        ld a,(de)
        cp dangerattr1
        ret z
        cp dangerattr2
        ret

collide_walls_self2
;out: Z=collision
        call getheadcoords2
        call calcattraddr
        ;de=attraddr (head)
        ld a,(de)
        cp dangerattr1
        ret z
        cp dangerattr2
        ret

delay
        ld b,5
delay0
        push bc
        YIELD
        pop bc
        djnz delay0
        ret

getkey
;если master - при этом посылаем свои клавиши, если slave - принимаем клавиши
;TODO для двух игроков:
;master посылает клавиши и получает состояние (или список событий)
;slave генерирует список событий и периодически их рассылает на master
;потом оба обрабатывают события

        GET_KEY
         cp key_esc
         jp z,quit
        push af

        if 1==0
        call sendbyte
waitkey0
        call receivebyte
        jr z,waitkey0
        or a
        jr z,$+5
        if CLIENT
                        ld (curdirection2),a
        else
                        ld (curdirection),a
        endif
        endif
        if CLIENT
       
        push af
        call sendbyte
        pop af
       
        ld c,dir_l
        cp 'a';dir_l
        jr z,getkey_ok2
        ld c,dir_r
        cp 'd';dir_r
        jr z,getkey_ok2
        ld c,dir_u
        cp 'w';dir_u
        jr z,getkey_ok2
        ld c,dir_d
        cp 's';dir_d
        jr nz,waitkey0
getkey_ok2
;player2 key pressed - disable net
        ld hl,receivebyte_fake
        ld (waitkey_receivebytepatch),hl
        ld a,c
        jr mastergetkeyskipreceive
waitkey0
         ld a,0xfd
         in a,(0xfe) ;костыль D=start second player
         bit 2,a ;D
         jr z,mastergetkeyskipreceiveq
waitkey_receivebytepatch=$+1
        call receivebyte
        jr z,waitkey0
        or a
        jr z,mastergetkeyskipreceiveq
mastergetkeyskipreceive
        ld (curdirection2),a
mastergetkeyskipreceiveq
        else ;slave

        push af
waitkey0
        call receivebyte
        jr z,waitkey0
        or a
        jr z,$+5
        ld (curdirection),a
        pop af
        call sendbyte
       
        endif

        pop af
         
        cp dir_l
        jr z,getkey_ok
        cp dir_r
        jr z,getkey_ok
        cp dir_u
        jr z,getkey_ok
        cp dir_d
        ret nz;jr z,getkey_ok
getkey_ok
        if CLIENT
        ld (curdirection),a
        else
        ld (curdirection2),a
        endif
        ret

shrink
        ld a,(curgrow)
        or a
        jr z,shrink_nogrow
        dec a
        ld (curgrow),a
        ret
shrink_nogrow
        ld bc,(snakecoords)
        call cltail
        ld hl,snakecoords+2-2
        ld de,snakecoords-2
        ld bc,snakecoordssize-2+2
        ldir
        ld hl,(curlength)
        dec hl
        ld (curlength),hl
        ret

shrink2
        ld a,(curgrow2)
        or a
        jr z,shrink2_nogrow
        dec a
        ld (curgrow2),a
        ret
shrink2_nogrow
        ld bc,(snakecoords2)
        call cltail2
        ld hl,snakecoords2+2-2
        ld de,snakecoords2-2
        ld bc,snakecoordssize-2+2
        ldir
        ld hl,(curlength2)
        dec hl
        ld (curlength2),hl
        ret

stopsnake
;keep f
        ld hl,snakecoords+snakecoordssize-1-2
        ld de,snakecoords+snakecoordssize-1
        ld bc,snakecoordssize-2+2
        lddr
         ld a,1
         ld (snakestopped),a
        ret

stopsnake2
;keep f
        ld hl,snakecoords2+snakecoordssize-1-2
        ld de,snakecoords2+snakecoordssize-1
        ld bc,snakecoordssize-2+2
        lddr
         ld a,1
         ld (snake2stopped),a
        ret

prsnake
        ld hl,snakecoords
        ld bc,(curlength)
prsnake0
        push bc
        push hl
        ld c,(hl)
        inc hl
        ld b,(hl)
        call prtailelement
        pop hl
        pop bc
        inc hl
        cpi
        jp pe,prsnake0
        ret

prsnake2
        ld hl,snakecoords2
        ld bc,(curlength2)
prsnake20
        push bc
        push hl
        ld c,(hl)
        inc hl
        ld b,(hl)
        call prtailelement2
        pop hl
        pop bc
        inc hl
        cpi
        jp pe,prsnake20
        ret

getheadcoords
        ld hl,(curlength) ;не считая головы
        add hl,hl
        ld bc,snakecoords
        add hl,bc
        ld c,(hl)
        inc hl
        ld b,(hl)
        inc hl
        ret

getheadcoords2
        ld hl,(curlength2) ;не считая головы
        add hl,hl
        ld bc,snakecoords2
        add hl,bc
        ld c,(hl)
        inc hl
        ld b,(hl)
        inc hl
        ret

move_grow
;out: bc=новые координаты головы        
        call getheadcoords
;bc=старые координаты головы        
        ld a,(curdirection)
        dec c
        cp dir_l
        jr z,moveq
        inc c
        inc c
        cp dir_r
        jr z,moveq
        dec c
        inc b
        cp dir_d
        jr z,moveq
        dec b
        dec b
moveq
;bc=новые координаты головы        
        ld (hl),c
        inc hl
        ld (hl),b
        ld hl,(curlength)
        inc hl
        ld (curlength),hl
        ret
       
move_grow2
;out: bc=новые координаты головы        
        call getheadcoords2
;bc=старые координаты головы        
        ld a,(curdirection2)
        dec c
        cp dir_l
        jr z,move2q
        inc c
        inc c
        cp dir_r
        jr z,move2q
        dec c
        inc b
        cp dir_d
        jr z,move2q
        dec b
        dec b
move2q
;bc=новые координаты головы        
        ld (hl),c
        inc hl
        ld (hl),b
        ld hl,(curlength2)
        inc hl
        ld (curlength2),hl
        ret
       
cls
        if EGA
        ld e,0
        OS_CLS
        else
        ld hl,0x4000
        ld de,0x4001
        ld bc,0x17ff
        ld (hl),0;0xff
        ldir
        ld hl,0x5800
        ld de,0x5801
        ld (hl),emptyattr
        ld bc,767
        ldir
        endif
        ret
       
prfield
        ld a,wallattr
        ld (curattr),a
        ld bc,0x0000
        ld e,fieldwid+2
        call prfieldhor ;top
        ld bc,256*(fieldhgt+1);0x1700
        ld e,fieldwid+2
        call prfieldhor ;bottom
        ld bc,0x0100
        ld e,fieldhgt
        call prfieldver ;left
        ld bc,0x0100+(fieldwid+1);0x011f
        ld e,fieldhgt
        ;call prfieldver ;right
        ;ret
prfieldver
;bc=yx
;e=len
prfieldver0
        ;ld a,fieldmarginsymbol
        ;call prcharxy
        ld hl,tilebrick
        call prtilexy
        inc b
        dec e
        jr nz,prfieldver0
        ret
       
prfieldhor
;bc=yx
;e=len
prfieldhor0
        ;ld a,fieldmarginsymbol
        ;call prcharxy
        ld hl,tilebrick
        call prtilexy
        inc c
        dec e
        jr nz,prfieldhor0
        ret
     
proldheadastail
        call getheadcoords
prtailelement
;bc=yx
        ld a,snakeattr
        ld (curattr),a
        ;ld a,'O'
        ;jp prcharxy
        ld hl,tilesnake
        jp prtilexy

proldheadastail2
        call getheadcoords2
prtailelement2
;bc=yx
        ld a,snakeattr
        ld (curattr),a
        ;ld a,'O'
        ;jp prcharxy
        ld hl,tilesnake2
        jp prtilexy

prhead
;bc=yx
        ld a,snakeattr
        ld (curattr),a
        ;ld a,'O'
        ;jp prcharxy
        ld hl,tilesnakehead
        jp prtilexy

prhead2
;bc=yx
        ld a,snakeattr
        ld (curattr),a
        ;ld a,'O'
        ;jp prcharxy
        ld hl,tilesnakehead2
        jp prtilexy

cltail
cltail2
;bc=yx
        ld a,emptyattr
        ld (curattr),a
        ;ld a,' '
        ;jp prcharxy
        ld hl,tileempty
        jp prtilexy
       
prtext
;bc=координаты
;hl=text
        ld a,emptyattr
        ld (curattr),a
        ld a,(hl)
        or a
        ret z
        call prcharxy
        inc hl
        inc c
        jr prtext

prnum
        ld bc,1000
        call prdig
        ld bc,100
        call prdig
        ld bc,10
        call prdig
        ld bc,1
prdig
        ld a,'0'-1
prdig0
        inc a
        or a
        sbc hl,bc
        jr nc,prdig0
        add hl,bc
        ;push hl
        ;call prchar
        ;pop hl
        ;ret
prchar
;a=code
;de=screen
        push de
        push hl
        call prcharin
        pop hl
        pop de
        inc e
        ret
       
calcscraddr
;bc=yx
;можно портить bc
        if EGA
        ex de,hl
        ld a,c ;x
        ld l,b ;y
        ld h,0
        ld b,h
        ld c,l
        add hl,hl
        add hl,hl
        add hl,bc ;*5
         add hl,hl
         add hl,hl
         add hl,hl ;*40
         add hl,hl
         add hl,hl
         add hl,hl
        add a,l
        ld l,a
        ld a,h
        adc a,0x80
        ld h,a
        ex de,hl
        else
;de=0x4000 + (y&0x18)+((y*32)&0xff+x)
        ld a,b ;y
        and 0x18
        add a,0x40
        ld d,a
        ld a,b ;y
        add a,a ;*2
        add a,a ;*4
        add a,a ;*8
        add a,a ;*16
        add a,a ;*32
        add a,c ;x
        ld e,a
        endif
        ret

calcattraddr
;bc=yx
;нельзя портить bc
        if EGA
;de=attrs + (y&0x18)/4+((y*64)&0xff+x)
        ld a,b
        rrca
        rrca
        ld d,a
        and 0xc0
        add a,c
        ld e,a
        sub c
        xor d
        add a,attrs/256
        ld d,a ;de=attraddr
        else
;de=0x5800 + (y&0x18)/8+((y*32)&0xff+x)
        ld a,b
        rrca
        rrca
        rrca
        ld d,a
        and 0xe0
        add a,c
        ld e,a
        sub c
        xor d
        add a,attrs/256;0x58
        ld d,a ;de=attraddr
        endif
        ret
       
prtilexy
;hl=tile
;bc=yx
        push de
        push bc
        call calcscraddr
        ;push de
        call prcharin_go
        ;pop de
        pop bc
        call calcattraddr;_fromscr
        ld a,(curattr)
        ld (de),a
        pop de
        ret
       
prcharxy
;a=code
;bc=yx
        push de
        push hl
        push bc
        push af
        ;jr $
        call calcscraddr
        pop af
        ;push de
        call prcharin
        ;pop de
        pop bc
        call calcattraddr;_fromscr
curattr=$+1
        ld a,0
        ld (de),a
        pop hl
        pop de
        ret
       
prcharin
        if EGA
        sub 32
        ld l,a
        ld h,0
         add hl,hl
         add hl,hl
         add hl,hl
         add hl,hl
         add hl,hl
        ;ld bc,font-(32*32)
        ;add hl,bc
        ld a,h
        add a,font/256
        ld h,a
prcharin_go1
        ex de,hl
       
        if 1==1
        ld bc,40
        push hl
        push hl
        dup 8
        ld a,(de) ;font
        ld (hl),a ;scr
        inc de
        add hl,bc
        edup
        pop hl
        set 6,h
        ;ld d,font/256
        dup 8
        ld a,(de) ;font
        ld (hl),a ;scr
        inc de
        add hl,bc
        edup
        pop hl
        set 5,h
        push hl
        ;ld d,font/256
        dup 8
        ld a,(de) ;font
        ld (hl),a ;scr
        inc de
        add hl,bc
        edup
        pop hl
        set 6,h
        ;ld d,font/256
        dup 8
        ld a,(de) ;font
        ld (hl),a ;scr
        inc de
        add hl,bc
        edup
       
        else
        ld bc,40-0x6000
        dup 8
        ld a,(de) ;font
        inc de
        ld (hl),a ;scr
        set 6,h
        ld a,(de) ;font
        inc de
        ld (hl),a ;scr
        res 6,h
        set 5,h
        ld a,(de) ;font
        inc de
        ld (hl),a
        set 6,h
        ld a,(de) ;font
        inc de
        ld (hl),a ;scr
        ;res 6,h
        ;res 5,h
        add hl,bc
        edup
        endif
       
        ret
        else
        ld l,a
        ld h,0
        add hl,hl
        add hl,hl
        add hl,hl
        ld bc,font-256;0x3c00
        add hl,bc
        endif

        if EGA
        if 1==1
prcharin_go=prcharin_go1
        else
prcharin_go
        ex de,hl
        ld bc,40
        dup 8
        ld a,(de) ;font
        ld (hl),a ;scr
        set 5,h
        ld (hl),a
        res 5,h
        inc de
        add hl,bc
        edup
        endif
        else
prcharin_go
        ld b,8
prchar0
        ld a,(hl) ;font
        ld (de),a ;scr
        inc hl
        inc d ;+256
        djnz prchar0
        endif
        ret

getbreak
        ld a,0x7f
        in a,(0xfe)
        rra
        ret c
        ld a,0xfe
        in a,(0xfe)
        rra
        ret

sendbuf
        db "isnk"
sendbufdata
sendbufdatashift=$-sendbuf
sendbufsz=sendbufdatashift+1 ;1 byte
        ds sendbuf+256-$
recvbuf
        ds 256

sendbyte
        ld (sendbufdata),a
       
        ld hl,sendbufsz
        LD      a,(soc)
        ld ix,sendbuf
        ld de,port_ia
        OS_WIZNETWRITE
        bit 7,h
        jp nz,inet_exitcode

        ret
 
receivebyte_fake
        xor a
        dec a ;nz
        ld a,0
        ret
 
receivebyte
;from UDP
;z=no data

receivebyte0
        call getbreak
        jp nc,quit

        ld hl,sendbufsz
        LD      a,(soc)
        ld ix,recvbuf
        ld de,port_ia
        OS_WIZNETREAD
        bit 7,h
        ;ld a,h
        ;or l
        jr nz,receivebyte_fail ;jr z,receivebyte0

        ld hl,recvbuf
        ld de,sendbuf
        ld b,sendbufdatashift
receivebytecp0
        ld a,(de)
        cp (hl)
        jr nz,receivebyte_fail
        inc hl
        inc de
        djnz receivebytecp0
        xor a
        dec a ;nz

        ld a,(recvbuf+sendbufdatashift)
        ret
receivebyte_fail
        xor a ;z=no data
        ret


soc
        db 0
;socrecv
;        db 0

;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port;
;       struct in_addr sin_addr;char sin_zero[8];};
        if CLIENT
;master(net1): from 192.168.1.2 to 192.168.1.177
port_ia:
        defb 0
        db 100,53 ;port (big endian)
        db 192,168,0,7;127,0,0,1 ;ip (big endian)
;port_iarecv:
;       defb 0
;        db 100,53 ;port (big endian)
;        db 192,168,1,177 ;ip (big endian)

        else
;server?
;slave(net2): from 192.168.1.177 to 192.168.1.2
port_ia:
        defb 0
        db 100,53 ;port (big endian)
        db 255,255,255,255 ;ip (big endian)
;port_iasend:
;       defb 0
;        db 100,53 ;port (big endian)
;        db 192,168,1,2 ;ip (big endian)
        endif

        macro cols data
_l=data/16
_r=data&15
        db ((_r&8)<<4) + ((_r&7)<<3) + ((_l&8)<<3) + (_l&7)
        endm
       
        macro cols8 d0,d1,d2,d3,d4,d5,d6,d7
        cols d0
        cols d1
        cols d2
        cols d3
        cols d4
        cols d5
        cols d6
        cols d7
        endm
       
tileempty
        if EGA
        ds 32
        else
        ds 8
        endif

tilebrick
        if EGA
        cols8 0x00,0x22,0xaa,0x22,0x00,0x22,0x2a,0x22
        cols8 0x00,0x20,0x20,0x20,0x00,0x22,0xaa,0x22
        cols8 0x00,0x22,0x2a,0x22,0x00,0x22,0xaa,0x22
        cols8 0x00,0x22,0xaa,0x22,0x00,0x20,0x20,0x20
        else
        db %00000000
        db %11101111
        db %00101000
        db %11101111
        db %00000000
        db %11111110
        db %10000010
        db %11111110
        endif
       
tilesnake
        if EGA
        cols8 0x00,0x00,0x04,0x4c,0x4c,0x4c,0x04,0x00
        cols8 0x00,0x44,0xcc,0xcc,0xcc,0xcc,0xcc,0x44
        cols8 0x00,0x40,0xc4,0xcc,0xcc,0xcc,0xc4,0x40
        cols8 0x00,0x00,0x00,0x40,0x40,0x40,0x00,0x00
        else
        db %00000000
        db %00111000
        db %01000100
        db %10000010
        db %10000010
        db %10000010
        db %01000100
        db %00111000
        endif
       
tilesnake2
        if EGA
        cols8 0x00,0x00,0x05,0x5d,0x5d,0x5d,0x05,0x00
        cols8 0x00,0x55,0xdd,0xdd,0xdd,0xdd,0xdd,0x55
        cols8 0x00,0x50,0xd5,0xdd,0xdd,0xdd,0xd5,0x50
        cols8 0x00,0x00,0x00,0x50,0x50,0x50,0x00,0x00
        else
        db %00000000
        db %00111000
        db %01000100
        db %10000010
        db %10000010
        db %10000010
        db %01000100
        db %00111000
        endif
       
tilesnakehead
        if EGA
        cols8 0x00,0x00,0x04,0x4c,0x4c,0x4c,0x04,0x00
        cols8 0x00,0x44,0xcc,0xfc,0xcc,0x22,0xcc,0x44
        cols8 0x00,0x40,0xc4,0xfc,0xcc,0x2c,0xc4,0x40
        cols8 0x00,0x00,0x00,0x40,0x40,0x40,0x00,0x00
        else
        db %00000000
        db %00111000
        db %01000100
        db %10101010
        db %10000010
        db %10111010
        db %01000100
        db %00111000
        endif
       
tilesnakehead2
        if EGA
        cols8 0x00,0x00,0x05,0x5d,0x5d,0x5d,0x05,0x00
        cols8 0x00,0x55,0xdd,0xfd,0xdd,0x22,0xdd,0x55
        cols8 0x00,0x50,0xd5,0xfd,0xdd,0x2d,0xd5,0x50
        cols8 0x00,0x00,0x00,0x50,0x50,0x50,0x00,0x00
        else
        db %00000000
        db %00111000
        db %01000100
        db %10101010
        db %10000010
        db %10111010
        db %01000100
        db %00111000
        endif
       
tilerabbit
        if EGA
        cols8 0x00,0x77,0x7f,0x7f,0x07,0x07,0x07,0x00
        cols8 0x00,0x00,0x70,0x70,0xf7,0x0f,0xf2,0x77
        cols8 0x00,0x07,0x7f,0x7f,0xf7,0x07,0xf7,0x70
        cols8 0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00
        else
        db %00000000
        db %11000110
        db %10101010
        db %10101010
        db %01101100
        db %01010100
        db %01101100
        db %00111000
        endif
       
endtext
        db "GAME OVER!",0

;oldtimer
;        dw 0

        if EGA
        align 256
font
        incbin "fontgfx"
        else
font
        incbin "zx.fnt"
        endif

curgrow
        db 7
curgrow2
        db 7
curdirection
        db dir_r
curdirection2
        db dir_r
curlength
        dw 0 ;не считая головы
curlength2
        dw 0 ;не считая головы

        dw 2 ;на случай возврата змеи
snakecoords
;y,x (голова в конце)
        ds snakecoordssize
       
        dw 2 ;на случай возврата змеи
snakecoords2
;y,x (голова в конце)
        ;ds snakecoordssize
       
end

        display "End=",end
        ;display "Free after end=",/d,0xc000-end
        display "Size ",/d,end-begin," bytes"
       
        if CLIENT
                savebin "net1.com",begin,end-begin
        else
                savebin "net2.com",begin,end-begin
        endif
        ;LABELSLIST "..\us\user.l"