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"