?login_element?

Subversion Repositories NedoOS

Rev

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

  1.         DEVICE ZXSPECTRUM128
  2.         include "../../_sdk/sys_h.asm"
  3.  
  4. EGA=1
  5.      
  6.         if EGA
  7. attrs=0x3800 ;0x600
  8. attrs_sz=0x600
  9. fieldwid=38
  10. fieldhgt=23
  11.         else
  12. attrs=0x5800
  13. attrs_sz=0x300
  14. fieldwid=30
  15. fieldhgt=22
  16.         endif
  17.  
  18. STACK=0x4000
  19.        
  20.  
  21. dangerattr1=0x38+2 ;red
  22. dangerattr2=0x38+4 ;green
  23. dangerattr3=0x38+1 ;blue
  24. scoreattr=dangerattr3
  25. wallattr=dangerattr1
  26. snakeattr=dangerattr2
  27. rabbitattr=0x40+0x30 ;bright yellow
  28. emptyattr=0x38
  29.  
  30. snakecoordssize=fieldwid*fieldhgt*2;768*2
  31.  
  32. dir_r=key_right;cs8;0x09
  33. dir_l=key_left;cs5;0x08
  34. dir_u=key_up;cs7;0x0b
  35. dir_d=key_down;cs6;0x0a
  36.  
  37.  
  38. IPPROTO_TCP EQU 6
  39. IPPROTO_UDP EQU 17
  40.  
  41. AF_UNSPEC EQU 0
  42. AF_INET EQU 2
  43. AF_INET6 EQU 23
  44.  
  45. SOCK_STREAM EQU 0x01    ;tcp/ip
  46. SOCK_DGRAM      EQU 0x03                ;udp/ip
  47.  
  48. SHUT_RDWR               EQU 2
  49. ERR_INTR                EQU 4
  50. ERR_NFILE               EQU 23
  51. ERR_ALREADY     EQU 37
  52. ERR_NOTSOCK     EQU 38
  53. ERR_EMSGSIZE    EQU 40    ;/* Message too long */
  54. ERR_PROTOTYPE   EQU 41
  55. ERR_AFNOSUPPORT EQU 47
  56. ERR_HOSTUNREACH EQU 65
  57. ERR_CONNRESET   EQU 54
  58. ERR_NOTCONN     EQU 57
  59.        
  60.         org PROGSTART
  61. begin
  62.         ld sp,STACK
  63.         OS_HIDEFROMPARENT
  64.  
  65.         if EGA
  66.         ld e,0
  67.         else
  68.         ld e,3
  69.         endif
  70.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  71.  
  72.         ;OS_GETSCREENPAGES
  73. ;de=страницы 0-го экрана (d=старшая), hl=страницы 1-го экрана (h=старшая)
  74.         ;if EGA
  75.         ;ld a,e
  76.         ;SETPG32KLOW
  77.         ;ld a,d
  78.         ;SETPG32KHIGH
  79.         ;else
  80.         ;ld a,d
  81.         ;SETPG16K
  82.         ;endif
  83.  
  84.         ld hl,attrs
  85.         ld de,attrs+1
  86.         ld bc,attrs_sz-1
  87.         ld (hl),emptyattr
  88.         ldir
  89.  
  90.         call redraw
  91.  
  92.         ld hl,0x0101
  93.         ld (snakecoords),hl
  94.         ld hl,0x1001
  95.         ld (snakecoords2),hl
  96.         ;ld bc,0x0a1e
  97.         ;call prrabbit
  98.         call genrabbit
  99.  
  100.          xor a
  101.          ld (snakestopped),a
  102.          ld (snake2stopped),a
  103.  
  104.         ld de,0x0203
  105.         OS_NETSOCKET
  106.         ld a,l
  107.         ld (soc),a
  108.         or a
  109.         jp m,inet_exiterr_nosoc
  110. ;       ld de,0x0203
  111. ;       OS_NETSOCKET
  112. ;       ld a,l
  113. ;       ld (socrecv),a
  114. ;       or a
  115. ;       jp m,inet_exiterr_nosocrecv
  116.        
  117.         ;if CLIENT
  118.  
  119. ;       ld a,(socsend)
  120. ;       LD DE,port_iasend
  121. ;       OS_NETCONNECT
  122. ;       ld a,l
  123. ;       or a
  124. ;       jp m,inet_exiterr
  125.        
  126.         ;else ;slave
  127.         if CLIENT==0
  128.         ld a,(soc)
  129.         LD DE,port_ia
  130.         OS_BIND
  131.     ld a,l
  132.         or a
  133.         jp m,inet_exiterr
  134.         endif
  135.        
  136.         if 1==0
  137.         ld a,(soc)
  138.         LD DE,port_ia
  139.         OS_NETCONNECT
  140.         ld a,l
  141.         or a
  142.         jp m,inet_exiterr
  143.         endif
  144.         ;endif
  145.  
  146. ;начальная синхронизация        
  147. ;если master - при этом посылаем свои клавиши, если slave - принимаем клавиши
  148. ;TODO для двух игроков:
  149. ;???
  150.         if CLIENT ;посылаем событие старта
  151.  
  152.         ld a,1
  153.         call sendbyte
  154.        
  155.         else ;slave - принимаем событие старта
  156.        
  157. waitbegin0
  158.         call receivebyte
  159.         jr z,waitbegin0
  160.         endif
  161.        
  162.        
  163. gameloop
  164.         if EGA
  165.         ld bc,0*256+18
  166.         call calcscraddr
  167.         else
  168.         ld de,0x4000+14
  169.         endif
  170.         ld hl,(curlength)
  171.         call prnum
  172.         if EGA
  173.         ld bc,24*256+18
  174.         call calcscraddr
  175.         else
  176.         ld de,0x50e0+14
  177.         endif
  178.         ld hl,(curlength2)
  179.         call prnum
  180.        
  181.         if CLIENT
  182.         call delay
  183.         endif
  184.          
  185.         call getkey ;если master - при этом посылаем свои клавиши, если slave - принимаем клавиши
  186.        
  187.         call shrink
  188.         call shrink2
  189.         call proldheadastail
  190.         call proldheadastail2
  191.         call move_grow ;bc=новые координаты головы
  192.         push bc
  193.         call move_grow2 ;bc=новые координаты головы
  194.         push bc
  195.         call collide_rabbit_startgrow
  196.         call collide_rabbit_startgrow2
  197.        
  198.         call collide_walls_self2 ;Z=collision
  199.         ;jr z,gameover
  200.         call z,stopsnake2
  201.         pop bc
  202.         call nz,prhead2
  203.         call collide_walls_self ;Z=collision
  204.         ;jr z,gameover
  205.         call z,stopsnake
  206.         pop bc
  207.         call nz,prhead
  208.        
  209. snakestopped=$+1
  210.         ld a,0
  211. snake2stopped=$+1
  212.         and 0
  213.         dec a
  214.         jp z,gameover
  215.        
  216.         jp gameloop
  217.  
  218. redrawall
  219.         call redraw
  220.         call prsnake
  221.         call getheadcoords
  222.         call prhead
  223.         call prsnake2
  224.         call getheadcoords2
  225.         call prhead2
  226. rabbitxy=$+1
  227.         ld bc,0
  228.         jp prrabbit
  229. redraw
  230.         call setpgs_scr
  231.         call cls        
  232.         jp prfield
  233.  
  234. setpgs_scr
  235.         ld a,(user_scr0_low) ;ok
  236.         SETPG32KLOW
  237.         ld a,(user_scr0_high) ;ok
  238.         SETPG32KHIGH
  239.         ret
  240.  
  241. redrawgameover
  242.         call redrawall
  243. gameover
  244.         ld hl,endtext
  245.         if EGA
  246.         ld bc,0x0b0f
  247.         else
  248.         ld bc,0x0b0b
  249.         endif
  250.         call prtext
  251. gameoverloop
  252.         YIELD
  253.         GET_KEY
  254.         cp key_redraw
  255.         jr z,redrawgameover
  256.         cp key_esc
  257.         jr nz,gameoverloop
  258. inet_exiterr
  259. inet_exitcode
  260. quit
  261.         LD      a,(soc)
  262.         LD      E,0
  263.         OS_NETSHUTDOWN
  264. inet_exiterr_nosoc
  265. ;       LD      a,(socsend)
  266. ;       LD      E,0
  267. ;       OS_NETSHUTDOWN
  268. ;inet_exiterr_nosockets
  269.         QUIT
  270.        
  271. rnd
  272. ;0..c-1
  273.         ;ld a,r
  274. ;Patrik Rak
  275. rndseed1=$+1
  276.         ld  hl,0xA280   ; xz -> yw
  277. rndseed2=$+1
  278.         ld  de,0xC0DE   ; yw -> zt
  279.         ld  (rndseed1),de  ; x = y, z = w
  280.         ld  a,e         ; w = w ^ ( w << 3 )
  281.         add a,a
  282.         add a,a
  283.         add a,a
  284.         xor e
  285.         ld  e,a
  286.         ld  a,h         ; t = x ^ (x << 1)
  287.         add a,a
  288.         xor h
  289.         ld  d,a
  290.         rra             ; t = t ^ (t >> 1) ^ w
  291.         xor d
  292.         xor e
  293.         ld  h,l         ; y = z
  294.         ld  l,a         ; w = t
  295.         ld  (rndseed2),hl
  296.         ;ex de,hl
  297.         ;ld hl,0
  298.         ;res 7,c ;int
  299. rnd0
  300.         sub c
  301.         jr nc,rnd0
  302.         add a,c
  303.         ret
  304.  
  305. collide_rabbit_startgrow
  306.         call getheadcoords
  307.         call calcattraddr
  308.         ;de=attraddr (head)
  309.         ld a,(de)
  310.         cp rabbitattr
  311.         ret nz
  312.         ld a,5
  313.         ld (curgrow),a
  314.         jp genrabbit
  315.  
  316. collide_rabbit_startgrow2
  317.         call getheadcoords2
  318.         call calcattraddr
  319.         ;de=attraddr (head)
  320.         ld a,(de)
  321.         cp rabbitattr
  322.         ret nz
  323.         ld a,5
  324.         ld (curgrow2),a
  325.         jp genrabbit
  326.  
  327. genrabbit
  328.         ld c,fieldhgt
  329.         call rnd
  330.         inc a
  331.         ld b,a
  332.         ld c,fieldwid
  333.         call rnd
  334.         inc a
  335.         ld c,a
  336.        
  337. ;genrabbit, если попало на хвост:
  338.         ;call calcscraddr
  339.         call calcattraddr;_fromscr
  340.         ;de=attraddr (rabbit)
  341.         ld a,(de)
  342.         cp emptyattr
  343.         jr nz,genrabbit
  344.         ld (rabbitxy),bc
  345.        
  346. prrabbit
  347. ;bc=yx
  348.         ld a,rabbitattr
  349.         ld (curattr),a
  350.         ;ld a,'Y'
  351.         ;jp prcharxy
  352.         ld hl,tilerabbit
  353.         jp prtilexy
  354.        
  355. collide_walls_self
  356. ;out: Z=collision
  357.         call getheadcoords
  358.         ;call calcscraddr
  359.         call calcattraddr;_fromscr
  360.         ;de=attraddr (head)
  361.         ld a,(de)
  362.         cp dangerattr1
  363.         ret z
  364.         cp dangerattr2
  365.         ret
  366.  
  367. collide_walls_self2
  368. ;out: Z=collision
  369.         call getheadcoords2
  370.         call calcattraddr
  371.         ;de=attraddr (head)
  372.         ld a,(de)
  373.         cp dangerattr1
  374.         ret z
  375.         cp dangerattr2
  376.         ret
  377.  
  378. delay
  379.         ld b,5
  380. delay0
  381.         push bc
  382.         YIELD
  383.         pop bc
  384.         djnz delay0
  385.         ret
  386.  
  387. getkey
  388. ;если master - при этом посылаем свои клавиши, если slave - принимаем клавиши
  389. ;TODO для двух игроков:
  390. ;master посылает клавиши и получает состояние (или список событий)
  391. ;slave генерирует список событий и периодически их рассылает на master
  392. ;потом оба обрабатывают события
  393.  
  394.         GET_KEY
  395.          cp key_esc
  396.          jp z,quit
  397.         push af
  398.  
  399.         if 1==0
  400.         call sendbyte
  401. waitkey0
  402.         call receivebyte
  403.         jr z,waitkey0
  404.         or a
  405.         jr z,$+5
  406.         if CLIENT
  407.                         ld (curdirection2),a
  408.         else
  409.                         ld (curdirection),a
  410.         endif
  411.         endif
  412.         if CLIENT
  413.        
  414.         push af
  415.         call sendbyte
  416.         pop af
  417.        
  418.         ld c,dir_l
  419.         cp 'a';dir_l
  420.         jr z,getkey_ok2
  421.         ld c,dir_r
  422.         cp 'd';dir_r
  423.         jr z,getkey_ok2
  424.         ld c,dir_u
  425.         cp 'w';dir_u
  426.         jr z,getkey_ok2
  427.         ld c,dir_d
  428.         cp 's';dir_d
  429.         jr nz,waitkey0
  430. getkey_ok2
  431. ;player2 key pressed - disable net
  432.         ld hl,receivebyte_fake
  433.         ld (waitkey_receivebytepatch),hl
  434.         ld a,c
  435.         jr mastergetkeyskipreceive
  436. waitkey0
  437.          ld a,0xfd
  438.          in a,(0xfe) ;костыль D=start second player
  439.          bit 2,a ;D
  440.          jr z,mastergetkeyskipreceiveq
  441. waitkey_receivebytepatch=$+1
  442.         call receivebyte
  443.         jr z,waitkey0
  444.         or a
  445.         jr z,mastergetkeyskipreceiveq
  446. mastergetkeyskipreceive
  447.         ld (curdirection2),a
  448. mastergetkeyskipreceiveq
  449.         else ;slave
  450.  
  451.         push af
  452. waitkey0
  453.         call receivebyte
  454.         jr z,waitkey0
  455.         or a
  456.         jr z,$+5
  457.         ld (curdirection),a
  458.         pop af
  459.         call sendbyte
  460.        
  461.         endif
  462.  
  463.         pop af
  464.          
  465.         cp dir_l
  466.         jr z,getkey_ok
  467.         cp dir_r
  468.         jr z,getkey_ok
  469.         cp dir_u
  470.         jr z,getkey_ok
  471.         cp dir_d
  472.         ret nz;jr z,getkey_ok
  473. getkey_ok
  474.         if CLIENT
  475.         ld (curdirection),a
  476.         else
  477.         ld (curdirection2),a
  478.         endif
  479.         ret
  480.  
  481. shrink
  482.         ld a,(curgrow)
  483.         or a
  484.         jr z,shrink_nogrow
  485.         dec a
  486.         ld (curgrow),a
  487.         ret
  488. shrink_nogrow
  489.         ld bc,(snakecoords)
  490.         call cltail
  491.         ld hl,snakecoords+2-2
  492.         ld de,snakecoords-2
  493.         ld bc,snakecoordssize-2+2
  494.         ldir
  495.         ld hl,(curlength)
  496.         dec hl
  497.         ld (curlength),hl
  498.         ret
  499.  
  500. shrink2
  501.         ld a,(curgrow2)
  502.         or a
  503.         jr z,shrink2_nogrow
  504.         dec a
  505.         ld (curgrow2),a
  506.         ret
  507. shrink2_nogrow
  508.         ld bc,(snakecoords2)
  509.         call cltail2
  510.         ld hl,snakecoords2+2-2
  511.         ld de,snakecoords2-2
  512.         ld bc,snakecoordssize-2+2
  513.         ldir
  514.         ld hl,(curlength2)
  515.         dec hl
  516.         ld (curlength2),hl
  517.         ret
  518.  
  519. stopsnake
  520. ;keep f
  521.         ld hl,snakecoords+snakecoordssize-1-2
  522.         ld de,snakecoords+snakecoordssize-1
  523.         ld bc,snakecoordssize-2+2
  524.         lddr
  525.          ld a,1
  526.          ld (snakestopped),a
  527.         ret
  528.  
  529. stopsnake2
  530. ;keep f
  531.         ld hl,snakecoords2+snakecoordssize-1-2
  532.         ld de,snakecoords2+snakecoordssize-1
  533.         ld bc,snakecoordssize-2+2
  534.         lddr
  535.          ld a,1
  536.          ld (snake2stopped),a
  537.         ret
  538.  
  539. prsnake
  540.         ld hl,snakecoords
  541.         ld bc,(curlength)
  542. prsnake0
  543.         push bc
  544.         push hl
  545.         ld c,(hl)
  546.         inc hl
  547.         ld b,(hl)
  548.         call prtailelement
  549.         pop hl
  550.         pop bc
  551.         inc hl
  552.         cpi
  553.         jp pe,prsnake0
  554.         ret
  555.  
  556. prsnake2
  557.         ld hl,snakecoords2
  558.         ld bc,(curlength2)
  559. prsnake20
  560.         push bc
  561.         push hl
  562.         ld c,(hl)
  563.         inc hl
  564.         ld b,(hl)
  565.         call prtailelement2
  566.         pop hl
  567.         pop bc
  568.         inc hl
  569.         cpi
  570.         jp pe,prsnake20
  571.         ret
  572.  
  573. getheadcoords
  574.         ld hl,(curlength) ;не считая головы
  575.         add hl,hl
  576.         ld bc,snakecoords
  577.         add hl,bc
  578.         ld c,(hl)
  579.         inc hl
  580.         ld b,(hl)
  581.         inc hl
  582.         ret
  583.  
  584. getheadcoords2
  585.         ld hl,(curlength2) ;не считая головы
  586.         add hl,hl
  587.         ld bc,snakecoords2
  588.         add hl,bc
  589.         ld c,(hl)
  590.         inc hl
  591.         ld b,(hl)
  592.         inc hl
  593.         ret
  594.  
  595. move_grow
  596. ;out: bc=новые координаты головы        
  597.         call getheadcoords
  598. ;bc=старые координаты головы        
  599.         ld a,(curdirection)
  600.         dec c
  601.         cp dir_l
  602.         jr z,moveq
  603.         inc c
  604.         inc c
  605.         cp dir_r
  606.         jr z,moveq
  607.         dec c
  608.         inc b
  609.         cp dir_d
  610.         jr z,moveq
  611.         dec b
  612.         dec b
  613. moveq
  614. ;bc=новые координаты головы        
  615.         ld (hl),c
  616.         inc hl
  617.         ld (hl),b
  618.         ld hl,(curlength)
  619.         inc hl
  620.         ld (curlength),hl
  621.         ret
  622.        
  623. move_grow2
  624. ;out: bc=новые координаты головы        
  625.         call getheadcoords2
  626. ;bc=старые координаты головы        
  627.         ld a,(curdirection2)
  628.         dec c
  629.         cp dir_l
  630.         jr z,move2q
  631.         inc c
  632.         inc c
  633.         cp dir_r
  634.         jr z,move2q
  635.         dec c
  636.         inc b
  637.         cp dir_d
  638.         jr z,move2q
  639.         dec b
  640.         dec b
  641. move2q
  642. ;bc=новые координаты головы        
  643.         ld (hl),c
  644.         inc hl
  645.         ld (hl),b
  646.         ld hl,(curlength2)
  647.         inc hl
  648.         ld (curlength2),hl
  649.         ret
  650.        
  651. cls
  652.         if EGA
  653.         ld e,0
  654.         OS_CLS
  655.         else
  656.         ld hl,0x4000
  657.         ld de,0x4001
  658.         ld bc,0x17ff
  659.         ld (hl),0;0xff
  660.         ldir
  661.         ld hl,0x5800
  662.         ld de,0x5801
  663.         ld (hl),emptyattr
  664.         ld bc,767
  665.         ldir
  666.         endif
  667.         ret
  668.        
  669. prfield
  670.         ld a,wallattr
  671.         ld (curattr),a
  672.         ld bc,0x0000
  673.         ld e,fieldwid+2
  674.         call prfieldhor ;top
  675.         ld bc,256*(fieldhgt+1);0x1700
  676.         ld e,fieldwid+2
  677.         call prfieldhor ;bottom
  678.         ld bc,0x0100
  679.         ld e,fieldhgt
  680.         call prfieldver ;left
  681.         ld bc,0x0100+(fieldwid+1);0x011f
  682.         ld e,fieldhgt
  683.         ;call prfieldver ;right
  684.         ;ret
  685. prfieldver
  686. ;bc=yx
  687. ;e=len
  688. prfieldver0
  689.         ;ld a,fieldmarginsymbol
  690.         ;call prcharxy
  691.         ld hl,tilebrick
  692.         call prtilexy
  693.         inc b
  694.         dec e
  695.         jr nz,prfieldver0
  696.         ret
  697.        
  698. prfieldhor
  699. ;bc=yx
  700. ;e=len
  701. prfieldhor0
  702.         ;ld a,fieldmarginsymbol
  703.         ;call prcharxy
  704.         ld hl,tilebrick
  705.         call prtilexy
  706.         inc c
  707.         dec e
  708.         jr nz,prfieldhor0
  709.         ret
  710.      
  711. proldheadastail
  712.         call getheadcoords
  713. prtailelement
  714. ;bc=yx
  715.         ld a,snakeattr
  716.         ld (curattr),a
  717.         ;ld a,'O'
  718.         ;jp prcharxy
  719.         ld hl,tilesnake
  720.         jp prtilexy
  721.  
  722. proldheadastail2
  723.         call getheadcoords2
  724. prtailelement2
  725. ;bc=yx
  726.         ld a,snakeattr
  727.         ld (curattr),a
  728.         ;ld a,'O'
  729.         ;jp prcharxy
  730.         ld hl,tilesnake2
  731.         jp prtilexy
  732.  
  733. prhead
  734. ;bc=yx
  735.         ld a,snakeattr
  736.         ld (curattr),a
  737.         ;ld a,'O'
  738.         ;jp prcharxy
  739.         ld hl,tilesnakehead
  740.         jp prtilexy
  741.  
  742. prhead2
  743. ;bc=yx
  744.         ld a,snakeattr
  745.         ld (curattr),a
  746.         ;ld a,'O'
  747.         ;jp prcharxy
  748.         ld hl,tilesnakehead2
  749.         jp prtilexy
  750.  
  751. cltail
  752. cltail2
  753. ;bc=yx
  754.         ld a,emptyattr
  755.         ld (curattr),a
  756.         ;ld a,' '
  757.         ;jp prcharxy
  758.         ld hl,tileempty
  759.         jp prtilexy
  760.        
  761. prtext
  762. ;bc=координаты
  763. ;hl=text
  764.         ld a,emptyattr
  765.         ld (curattr),a
  766.         ld a,(hl)
  767.         or a
  768.         ret z
  769.         call prcharxy
  770.         inc hl
  771.         inc c
  772.         jr prtext
  773.  
  774. prnum
  775.         ld bc,1000
  776.         call prdig
  777.         ld bc,100
  778.         call prdig
  779.         ld bc,10
  780.         call prdig
  781.         ld bc,1
  782. prdig
  783.         ld a,'0'-1
  784. prdig0
  785.         inc a
  786.         or a
  787.         sbc hl,bc
  788.         jr nc,prdig0
  789.         add hl,bc
  790.         ;push hl
  791.         ;call prchar
  792.         ;pop hl
  793.         ;ret
  794. prchar
  795. ;a=code
  796. ;de=screen
  797.         push de
  798.         push hl
  799.         call prcharin
  800.         pop hl
  801.         pop de
  802.         inc e
  803.         ret
  804.        
  805. calcscraddr
  806. ;bc=yx
  807. ;можно портить bc
  808.         if EGA
  809.         ex de,hl
  810.         ld a,c ;x
  811.         ld l,b ;y
  812.         ld h,0
  813.         ld b,h
  814.         ld c,l
  815.         add hl,hl
  816.         add hl,hl
  817.         add hl,bc ;*5
  818.          add hl,hl
  819.          add hl,hl
  820.          add hl,hl ;*40
  821.          add hl,hl
  822.          add hl,hl
  823.          add hl,hl
  824.         add a,l
  825.         ld l,a
  826.         ld a,h
  827.         adc a,0x80
  828.         ld h,a
  829.         ex de,hl
  830.         else
  831. ;de=0x4000 + (y&0x18)+((y*32)&0xff+x)
  832.         ld a,b ;y
  833.         and 0x18
  834.         add a,0x40
  835.         ld d,a
  836.         ld a,b ;y
  837.         add a,a ;*2
  838.         add a,a ;*4
  839.         add a,a ;*8
  840.         add a,a ;*16
  841.         add a,a ;*32
  842.         add a,c ;x
  843.         ld e,a
  844.         endif
  845.         ret
  846.  
  847. calcattraddr
  848. ;bc=yx
  849. ;нельзя портить bc
  850.         if EGA
  851. ;de=attrs + (y&0x18)/4+((y*64)&0xff+x)
  852.         ld a,b
  853.         rrca
  854.         rrca
  855.         ld d,a
  856.         and 0xc0
  857.         add a,c
  858.         ld e,a
  859.         sub c
  860.         xor d
  861.         add a,attrs/256
  862.         ld d,a ;de=attraddr
  863.         else
  864. ;de=0x5800 + (y&0x18)/8+((y*32)&0xff+x)
  865.         ld a,b
  866.         rrca
  867.         rrca
  868.         rrca
  869.         ld d,a
  870.         and 0xe0
  871.         add a,c
  872.         ld e,a
  873.         sub c
  874.         xor d
  875.         add a,attrs/256;0x58
  876.         ld d,a ;de=attraddr
  877.         endif
  878.         ret
  879.        
  880. prtilexy
  881. ;hl=tile
  882. ;bc=yx
  883.         push de
  884.         push bc
  885.         call calcscraddr
  886.         ;push de
  887.         call prcharin_go
  888.         ;pop de
  889.         pop bc
  890.         call calcattraddr;_fromscr
  891.         ld a,(curattr)
  892.         ld (de),a
  893.         pop de
  894.         ret
  895.        
  896. prcharxy
  897. ;a=code
  898. ;bc=yx
  899.         push de
  900.         push hl
  901.         push bc
  902.         push af
  903.         ;jr $
  904.         call calcscraddr
  905.         pop af
  906.         ;push de
  907.         call prcharin
  908.         ;pop de
  909.         pop bc
  910.         call calcattraddr;_fromscr
  911. curattr=$+1
  912.         ld a,0
  913.         ld (de),a
  914.         pop hl
  915.         pop de
  916.         ret
  917.        
  918. prcharin
  919.         if EGA
  920.         sub 32
  921.         ld l,a
  922.         ld h,0
  923.          add hl,hl
  924.          add hl,hl
  925.          add hl,hl
  926.          add hl,hl
  927.          add hl,hl
  928.         ;ld bc,font-(32*32)
  929.         ;add hl,bc
  930.         ld a,h
  931.         add a,font/256
  932.         ld h,a
  933. prcharin_go1
  934.         ex de,hl
  935.        
  936.         if 1==1
  937.         ld bc,40
  938.         push hl
  939.         push hl
  940.         dup 8
  941.         ld a,(de) ;font
  942.         ld (hl),a ;scr
  943.         inc de
  944.         add hl,bc
  945.         edup
  946.         pop hl
  947.         set 6,h
  948.         ;ld d,font/256
  949.         dup 8
  950.         ld a,(de) ;font
  951.         ld (hl),a ;scr
  952.         inc de
  953.         add hl,bc
  954.         edup
  955.         pop hl
  956.         set 5,h
  957.         push hl
  958.         ;ld d,font/256
  959.         dup 8
  960.         ld a,(de) ;font
  961.         ld (hl),a ;scr
  962.         inc de
  963.         add hl,bc
  964.         edup
  965.         pop hl
  966.         set 6,h
  967.         ;ld d,font/256
  968.         dup 8
  969.         ld a,(de) ;font
  970.         ld (hl),a ;scr
  971.         inc de
  972.         add hl,bc
  973.         edup
  974.        
  975.         else
  976.         ld bc,40-0x6000
  977.         dup 8
  978.         ld a,(de) ;font
  979.         inc de
  980.         ld (hl),a ;scr
  981.         set 6,h
  982.         ld a,(de) ;font
  983.         inc de
  984.         ld (hl),a ;scr
  985.         res 6,h
  986.         set 5,h
  987.         ld a,(de) ;font
  988.         inc de
  989.         ld (hl),a
  990.         set 6,h
  991.         ld a,(de) ;font
  992.         inc de
  993.         ld (hl),a ;scr
  994.         ;res 6,h
  995.         ;res 5,h
  996.         add hl,bc
  997.         edup
  998.         endif
  999.        
  1000.         ret
  1001.         else
  1002.         ld l,a
  1003.         ld h,0
  1004.         add hl,hl
  1005.         add hl,hl
  1006.         add hl,hl
  1007.         ld bc,font-256;0x3c00
  1008.         add hl,bc
  1009.         endif
  1010.  
  1011.         if EGA
  1012.         if 1==1
  1013. prcharin_go=prcharin_go1
  1014.         else
  1015. prcharin_go
  1016.         ex de,hl
  1017.         ld bc,40
  1018.         dup 8
  1019.         ld a,(de) ;font
  1020.         ld (hl),a ;scr
  1021.         set 5,h
  1022.         ld (hl),a
  1023.         res 5,h
  1024.         inc de
  1025.         add hl,bc
  1026.         edup
  1027.         endif
  1028.         else
  1029. prcharin_go
  1030.         ld b,8
  1031. prchar0
  1032.         ld a,(hl) ;font
  1033.         ld (de),a ;scr
  1034.         inc hl
  1035.         inc d ;+256
  1036.         djnz prchar0
  1037.         endif
  1038.         ret
  1039.  
  1040. getbreak
  1041.         ld a,0x7f
  1042.         in a,(0xfe)
  1043.         rra
  1044.         ret c
  1045.         ld a,0xfe
  1046.         in a,(0xfe)
  1047.         rra
  1048.         ret
  1049.  
  1050. sendbuf
  1051.         db "isnk"
  1052. sendbufdata
  1053. sendbufdatashift=$-sendbuf
  1054. sendbufsz=sendbufdatashift+1 ;1 byte
  1055.         ds sendbuf+256-$
  1056. recvbuf
  1057.         ds 256
  1058.  
  1059. sendbyte
  1060.         ld (sendbufdata),a
  1061.        
  1062.         ld hl,sendbufsz
  1063.         LD      a,(soc)
  1064.         ld ix,sendbuf
  1065.         ld de,port_ia
  1066.         OS_WIZNETWRITE
  1067.         bit 7,h
  1068.         jp nz,inet_exitcode
  1069.  
  1070.         ret
  1071.  
  1072. receivebyte_fake
  1073.         xor a
  1074.         dec a ;nz
  1075.         ld a,0
  1076.         ret
  1077.  
  1078. receivebyte
  1079. ;from UDP
  1080. ;z=no data
  1081.  
  1082. receivebyte0
  1083.         call getbreak
  1084.         jp nc,quit
  1085.  
  1086.         ld hl,sendbufsz
  1087.         LD      a,(soc)
  1088.         ld ix,recvbuf
  1089.         ld de,port_ia
  1090.         OS_WIZNETREAD
  1091.         bit 7,h
  1092.         ;ld a,h
  1093.         ;or l
  1094.         jr nz,receivebyte_fail ;jr z,receivebyte0
  1095.  
  1096.         ld hl,recvbuf
  1097.         ld de,sendbuf
  1098.         ld b,sendbufdatashift
  1099. receivebytecp0
  1100.         ld a,(de)
  1101.         cp (hl)
  1102.         jr nz,receivebyte_fail
  1103.         inc hl
  1104.         inc de
  1105.         djnz receivebytecp0
  1106.         xor a
  1107.         dec a ;nz
  1108.  
  1109.         ld a,(recvbuf+sendbufdatashift)
  1110.         ret
  1111. receivebyte_fail
  1112.         xor a ;z=no data
  1113.         ret
  1114.  
  1115.  
  1116. soc
  1117.         db 0
  1118. ;socrecv
  1119. ;        db 0
  1120.  
  1121. ;struct sockaddr_in {unsigned char sin_family;unsigned short sin_port;
  1122. ;       struct in_addr sin_addr;char sin_zero[8];};
  1123.         if CLIENT
  1124. ;master(net1): from 192.168.1.2 to 192.168.1.177
  1125. port_ia:
  1126.         defb 0
  1127.         db 100,53 ;port (big endian)
  1128.         db 127,0,0,1 ;ip (big endian)
  1129. ;port_iarecv:
  1130. ;       defb 0
  1131. ;        db 100,53 ;port (big endian)
  1132. ;        db 192,168,1,177 ;ip (big endian)
  1133.  
  1134.         else
  1135.  
  1136. ;slave(net2): from 192.168.1.177 to 192.168.1.2
  1137. port_ia:
  1138.         defb 0
  1139.         db 100,53 ;port (big endian)
  1140.         db 255,255,255,255 ;ip (big endian)
  1141. ;port_iasend:
  1142. ;       defb 0
  1143. ;        db 100,53 ;port (big endian)
  1144. ;        db 192,168,1,2 ;ip (big endian)
  1145.         endif
  1146.  
  1147.         macro cols data
  1148. _l=data/16
  1149. _r=data&15
  1150.         db ((_r&8)<<4) + ((_r&7)<<3) + ((_l&8)<<3) + (_l&7)
  1151.         endm
  1152.        
  1153.         macro cols8 d0,d1,d2,d3,d4,d5,d6,d7
  1154.         cols d0
  1155.         cols d1
  1156.         cols d2
  1157.         cols d3
  1158.         cols d4
  1159.         cols d5
  1160.         cols d6
  1161.         cols d7
  1162.         endm
  1163.        
  1164. tileempty
  1165.         if EGA
  1166.         ds 32
  1167.         else
  1168.         ds 8
  1169.         endif
  1170.  
  1171. tilebrick
  1172.         if EGA
  1173.         cols8 0x00,0x22,0xaa,0x22,0x00,0x22,0x2a,0x22
  1174.         cols8 0x00,0x20,0x20,0x20,0x00,0x22,0xaa,0x22
  1175.         cols8 0x00,0x22,0x2a,0x22,0x00,0x22,0xaa,0x22
  1176.         cols8 0x00,0x22,0xaa,0x22,0x00,0x20,0x20,0x20
  1177.         else
  1178.         db %00000000
  1179.         db %11101111
  1180.         db %00101000
  1181.         db %11101111
  1182.         db %00000000
  1183.         db %11111110
  1184.         db %10000010
  1185.         db %11111110
  1186.         endif
  1187.        
  1188. tilesnake
  1189.         if EGA
  1190.         cols8 0x00,0x00,0x04,0x4c,0x4c,0x4c,0x04,0x00
  1191.         cols8 0x00,0x44,0xcc,0xcc,0xcc,0xcc,0xcc,0x44
  1192.         cols8 0x00,0x40,0xc4,0xcc,0xcc,0xcc,0xc4,0x40
  1193.         cols8 0x00,0x00,0x00,0x40,0x40,0x40,0x00,0x00
  1194.         else
  1195.         db %00000000
  1196.         db %00111000
  1197.         db %01000100
  1198.         db %10000010
  1199.         db %10000010
  1200.         db %10000010
  1201.         db %01000100
  1202.         db %00111000
  1203.         endif
  1204.        
  1205. tilesnake2
  1206.         if EGA
  1207.         cols8 0x00,0x00,0x05,0x5d,0x5d,0x5d,0x05,0x00
  1208.         cols8 0x00,0x55,0xdd,0xdd,0xdd,0xdd,0xdd,0x55
  1209.         cols8 0x00,0x50,0xd5,0xdd,0xdd,0xdd,0xd5,0x50
  1210.         cols8 0x00,0x00,0x00,0x50,0x50,0x50,0x00,0x00
  1211.         else
  1212.         db %00000000
  1213.         db %00111000
  1214.         db %01000100
  1215.         db %10000010
  1216.         db %10000010
  1217.         db %10000010
  1218.         db %01000100
  1219.         db %00111000
  1220.         endif
  1221.        
  1222. tilesnakehead
  1223.         if EGA
  1224.         cols8 0x00,0x00,0x04,0x4c,0x4c,0x4c,0x04,0x00
  1225.         cols8 0x00,0x44,0xcc,0xfc,0xcc,0x22,0xcc,0x44
  1226.         cols8 0x00,0x40,0xc4,0xfc,0xcc,0x2c,0xc4,0x40
  1227.         cols8 0x00,0x00,0x00,0x40,0x40,0x40,0x00,0x00
  1228.         else
  1229.         db %00000000
  1230.         db %00111000
  1231.         db %01000100
  1232.         db %10101010
  1233.         db %10000010
  1234.         db %10111010
  1235.         db %01000100
  1236.         db %00111000
  1237.         endif
  1238.        
  1239. tilesnakehead2
  1240.         if EGA
  1241.         cols8 0x00,0x00,0x05,0x5d,0x5d,0x5d,0x05,0x00
  1242.         cols8 0x00,0x55,0xdd,0xfd,0xdd,0x22,0xdd,0x55
  1243.         cols8 0x00,0x50,0xd5,0xfd,0xdd,0x2d,0xd5,0x50
  1244.         cols8 0x00,0x00,0x00,0x50,0x50,0x50,0x00,0x00
  1245.         else
  1246.         db %00000000
  1247.         db %00111000
  1248.         db %01000100
  1249.         db %10101010
  1250.         db %10000010
  1251.         db %10111010
  1252.         db %01000100
  1253.         db %00111000
  1254.         endif
  1255.        
  1256. tilerabbit
  1257.         if EGA
  1258.         cols8 0x00,0x77,0x7f,0x7f,0x07,0x07,0x07,0x00
  1259.         cols8 0x00,0x00,0x70,0x70,0xf7,0x0f,0xf2,0x77
  1260.         cols8 0x00,0x07,0x7f,0x7f,0xf7,0x07,0xf7,0x70
  1261.         cols8 0x00,0x70,0x70,0x70,0x00,0x00,0x00,0x00
  1262.         else
  1263.         db %00000000
  1264.         db %11000110
  1265.         db %10101010
  1266.         db %10101010
  1267.         db %01101100
  1268.         db %01010100
  1269.         db %01101100
  1270.         db %00111000
  1271.         endif
  1272.        
  1273. endtext
  1274.         db "GAME OVER!",0
  1275.  
  1276. ;oldtimer
  1277. ;        dw 0
  1278.  
  1279.         if EGA
  1280.         align 256
  1281. font
  1282.         incbin "fontgfx"
  1283.         else
  1284. font
  1285.         incbin "zx.fnt"
  1286.         endif
  1287.  
  1288. curgrow
  1289.         db 7
  1290. curgrow2
  1291.         db 7
  1292. curdirection
  1293.         db dir_r
  1294. curdirection2
  1295.         db dir_r
  1296. curlength
  1297.         dw 0 ;не считая головы
  1298. curlength2
  1299.         dw 0 ;не считая головы
  1300.  
  1301.         dw 2 ;на случай возврата змеи
  1302. snakecoords
  1303. ;y,x (голова в конце)
  1304.         ds snakecoordssize
  1305.        
  1306.         dw 2 ;на случай возврата змеи
  1307. snakecoords2
  1308. ;y,x (голова в конце)
  1309.         ;ds snakecoordssize
  1310.        
  1311. end
  1312.  
  1313.         display "End=",end
  1314.         ;display "Free after end=",/d,0xc000-end
  1315.         display "Size ",/d,end-begin," bytes"
  1316.        
  1317.         if CLIENT
  1318.                 savebin "net1.com",begin,end-begin
  1319.         else
  1320.                 savebin "net2.com",begin,end-begin
  1321.         endif
  1322.         ;LABELSLIST "..\us\user.l"
  1323.