Subversion Repositories NedoOS

Rev

Rev 73 | Rev 289 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  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=#38+2 ;red
  22. dangerattr2=#38+4 ;green
  23. dangerattr3=#38+1 ;blue
  24. scoreattr=dangerattr3
  25. wallattr=dangerattr1
  26. snakeattr=dangerattr2
  27. rabbitattr=#40+#30 ;bright yellow
  28. emptyattr=#38
  29.  
  30. snakecoordssize=fieldwid*fieldhgt*2;768*2
  31.  
  32. dir_r=key_right;cs8;#09
  33. dir_l=key_left;cs5;#08
  34. dir_u=key_up;cs7;#0b
  35. dir_d=key_down;cs6;#0a
  36.        
  37.         org PROGSTART
  38. begin
  39.         ld sp,STACK
  40.  
  41.         if EGA
  42.         ld e,0
  43.         else
  44.         ld e,3
  45.         endif
  46.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  47.  
  48.         OS_GETSCREENPAGES
  49. ;de=ёЄЁрэшЎ√ 0-ую ¤ъЁрэр (d=ёЄрЁ°р ), hl=ёЄЁрэшЎ√ 1-ую ¤ъЁрэр (h=ёЄрЁ°р )
  50.         if EGA
  51.         ld a,e
  52.         SETPG32KLOW
  53.         ld a,d
  54.         SETPG32KHIGH
  55.         else
  56.         ld a,d
  57.         SETPG16K
  58.         endif
  59.  
  60.         call cls
  61.        
  62.         ld hl,attrs
  63.         ld de,attrs+1
  64.         ld bc,attrs_sz-1
  65.         ld (hl),emptyattr
  66.         ldir
  67.  
  68.         call prfield
  69.  
  70.         ld hl,#0101
  71.         ld (snakecoords),hl
  72.         ;ld bc,#0a1e
  73.         ;call prrabbit
  74.         call genrabbit
  75. gameloop
  76.         if EGA
  77.         ld bc,0*256+18
  78.         call calcscraddr
  79.         else
  80.         ld de,#4000+14
  81.         endif
  82.         ld hl,(curlength)
  83.         call prnum
  84.         call delay
  85.         GET_KEY
  86.          cp key_esc
  87.          jr z,quit
  88.         call getkey
  89.         call shrink
  90.         call proldheadastail
  91.         call move_grow ;bc=эют√х ъююЁфшэрЄ√ уюыют√
  92.         push bc
  93.         call collide_rabbit_startgrow
  94.         call collide_walls_self ;Z=collision
  95.         pop bc
  96.         jr z,gameover
  97.         call prhead
  98.         jp gameloop
  99.  
  100. gameover
  101.         ld hl,endtext
  102.         if EGA
  103.         ld bc,0x0b0f
  104.         else
  105.         ld bc,0x0b0b
  106.         endif
  107.         call prtext
  108. gameoverloop
  109.         YIELD
  110.         GET_KEY
  111.         cp key_esc
  112.         jr nz,gameoverloop
  113. quit
  114.         QUIT
  115.        
  116. rnd
  117. ;0..c-1
  118.         ld a,r
  119. rnd0
  120.         sub c
  121.         jr nc,rnd0
  122.         add a,c
  123.         ret
  124.  
  125. collide_rabbit_startgrow
  126.         call getheadcoords
  127.         ;call calcscraddr
  128.         call calcattraddr;_fromscr
  129.         ;de=attraddr (head)
  130.         ld a,(de)
  131.         cp rabbitattr
  132.         ret nz
  133.         ld a,5
  134.         ld (curgrow),a
  135.         ;call genrabbit
  136.         ;ret
  137.  
  138. genrabbit
  139.         ld c,fieldhgt
  140.         call rnd
  141.         inc a
  142.         ld b,a
  143.         ld c,fieldwid
  144.         call rnd
  145.         inc a
  146.         ld c,a
  147.        
  148. ;genrabbit, хёыш яюярыю эр їтюёЄ:
  149.         ;call calcscraddr
  150.         call calcattraddr;_fromscr
  151.         ;de=attraddr (rabbit)
  152.         ld a,(de)
  153.         cp emptyattr
  154.         jr nz,genrabbit
  155.        
  156. prrabbit
  157. ;bc=yx
  158.         ld a,rabbitattr
  159.         ld (curattr),a
  160.         ;ld a,'Y'
  161.         ;jp prcharxy
  162.         ld hl,tilerabbit
  163.         jp prtilexy
  164.        
  165. collide_walls_self
  166. ;out: Z=collision
  167.         call getheadcoords
  168.         ;call calcscraddr
  169.         call calcattraddr;_fromscr
  170.         ;de=attraddr (head)
  171.         ld a,(de)
  172.         cp dangerattr1
  173.         ret z
  174.         cp dangerattr2
  175.         ret
  176.  
  177. delay
  178.         ld b,5
  179. delay0
  180.         push bc
  181.         YIELD
  182.         pop bc
  183.         djnz delay0
  184.         ret
  185.  
  186. getkey
  187.         cp dir_l
  188.         jr z,getkey_ok
  189.         cp dir_r
  190.         jr z,getkey_ok
  191.         cp dir_u
  192.         jr z,getkey_ok
  193.         cp dir_d
  194.         ret nz;jr z,getkey_ok
  195. getkey_ok
  196.         ld (curdirection),a
  197.         ret
  198.  
  199. shrink
  200.         ld a,(curgrow)
  201.         or a
  202.         jr z,nogrow
  203.         dec a
  204.         ld (curgrow),a
  205.         ret;jr growq
  206. nogrow
  207.         ld bc,(snakecoords)
  208.         call cltail
  209.         ld hl,snakecoords+2
  210.         ld de,snakecoords
  211.         ld bc,snakecoordssize-2
  212.         ldir
  213.         ld hl,(curlength)
  214.         dec hl
  215.         ld (curlength),hl
  216. ;growq
  217.         ret
  218.  
  219. getheadcoords
  220.         ld hl,(curlength) ;эх ёўшЄр  уюыют√
  221.         add hl,hl
  222.         ld bc,snakecoords
  223.         add hl,bc
  224.         ld c,(hl)
  225.         inc hl
  226.         ld b,(hl)
  227.         inc hl
  228.         ret
  229.  
  230. move_grow
  231. ;out: bc=эют√х ъююЁфшэрЄ√ уюыют√        
  232.         call getheadcoords
  233. ;bc=ёЄрЁ√х ъююЁфшэрЄ√ уюыют√        
  234.         ld a,(curdirection)
  235.         dec c
  236.         cp dir_l
  237.         jr z,moveq
  238.         inc c
  239.         inc c
  240.         cp dir_r
  241.         jr z,moveq
  242.         dec c
  243.         inc b
  244.         cp dir_d
  245.         jr z,moveq
  246.         dec b
  247.         dec b
  248. moveq
  249. ;bc=эют√х ъююЁфшэрЄ√ уюыют√        
  250.         ld (hl),c
  251.         inc hl
  252.         ld (hl),b
  253.         ld hl,(curlength)
  254.         inc hl
  255.         ld (curlength),hl
  256.         ret
  257.  
  258. curgrow
  259.         db 7
  260. curdirection
  261.         db dir_r
  262. curlength
  263.         dw 0 ;эх ёўшЄр  уюыют√
  264.        
  265. cls
  266.         if EGA
  267.         ld e,0
  268.         OS_CLS
  269.         else
  270.         ld hl,#4000
  271.         ld de,#4001
  272.         ld bc,#17ff
  273.         ld (hl),0;#ff
  274.         ldir
  275.         ld hl,#5800
  276.         ld de,#5801
  277.         ld (hl),emptyattr
  278.         ld bc,767
  279.         ldir
  280.         endif
  281.         ret
  282.        
  283. prfield
  284.         ld a,wallattr
  285.         ld (curattr),a
  286.         ld bc,#0000
  287.         ld e,fieldwid+2
  288.         call prfieldhor ;top
  289.         ld bc,256*(fieldhgt+1);#1700
  290.         ld e,fieldwid+2
  291.         call prfieldhor ;bottom
  292.         ld bc,#0100
  293.         ld e,fieldhgt
  294.         call prfieldver ;left
  295.         ld bc,#0100+(fieldwid+1);#011f
  296.         ld e,fieldhgt
  297.         ;call prfieldver ;right
  298.         ;ret
  299. prfieldver
  300. ;bc=yx
  301. ;e=len
  302. prfieldver0
  303.         ;ld a,fieldmarginsymbol
  304.         ;call prcharxy
  305.         ld hl,tilebrick
  306.         call prtilexy
  307.         inc b
  308.         dec e
  309.         jr nz,prfieldver0
  310.         ret
  311.        
  312. prfieldhor
  313. ;bc=yx
  314. ;e=len
  315. prfieldhor0
  316.         ;ld a,fieldmarginsymbol
  317.         ;call prcharxy
  318.         ld hl,tilebrick
  319.         call prtilexy
  320.         inc c
  321.         dec e
  322.         jr nz,prfieldhor0
  323.         ret
  324.      
  325. proldheadastail
  326.         call getheadcoords
  327. ;bc=yx
  328.         ld a,snakeattr
  329.         ld (curattr),a
  330.         ;ld a,'O'
  331.         ;jp prcharxy
  332.         ld hl,tilesnake
  333.         jp prtilexy
  334.  
  335. prhead
  336. ;bc=yx
  337.         ld a,snakeattr
  338.         ld (curattr),a
  339.         ;ld a,'O'
  340.         ;jp prcharxy
  341.         ld hl,tilesnakehead
  342.         jp prtilexy
  343.  
  344. cltail
  345. ;bc=yx
  346.         ld a,emptyattr
  347.         ld (curattr),a
  348.         ;ld a,' '
  349.         ;jp prcharxy
  350.         ld hl,tileempty
  351.         jp prtilexy
  352.        
  353. prtext
  354. ;bc=ъююЁфшэрЄ√
  355. ;hl=text
  356.         ld a,emptyattr
  357.         ld (curattr),a
  358.         ld a,(hl)
  359.         or a
  360.         ret z
  361.         call prcharxy
  362.         inc hl
  363.         inc c
  364.         jr prtext
  365.  
  366. prnum
  367.         ld bc,1000
  368.         call prdig
  369.         ld bc,100
  370.         call prdig
  371.         ld bc,10
  372.         call prdig
  373.         ld bc,1
  374. prdig
  375.         ld a,'0'-1
  376. prdig0
  377.         inc a
  378.         or a
  379.         sbc hl,bc
  380.         jr nc,prdig0
  381.         add hl,bc
  382.         ;push hl
  383.         ;call prchar
  384.         ;pop hl
  385.         ;ret
  386. prchar
  387. ;a=code
  388. ;de=screen
  389.         push de
  390.         push hl
  391.         call prcharin
  392.         pop hl
  393.         pop de
  394.         inc e
  395.         ret
  396.        
  397. calcscraddr
  398. ;bc=yx
  399. ;ьюцэю яюЁЄшЄ№ bc
  400.         if EGA
  401.         ex de,hl
  402.         ld a,c ;x
  403.         ld l,b ;y
  404.         ld h,0
  405.         ld b,h
  406.         ld c,l
  407.         add hl,hl
  408.         add hl,hl
  409.         add hl,bc ;*5
  410.          add hl,hl
  411.          add hl,hl
  412.          add hl,hl ;*40
  413.          add hl,hl
  414.          add hl,hl
  415.          add hl,hl
  416.         add a,l
  417.         ld l,a
  418.         ld a,h
  419.         adc a,0x80
  420.         ld h,a
  421.         ex de,hl
  422.         else
  423. ;de=#4000 + (y&#18)+((y*32)&#ff+x)
  424.         ld a,b ;y
  425.         and #18
  426.         add a,#40
  427.         ld d,a
  428.         ld a,b ;y
  429.         add a,a ;*2
  430.         add a,a ;*4
  431.         add a,a ;*8
  432.         add a,a ;*16
  433.         add a,a ;*32
  434.         add a,c ;x
  435.         ld e,a
  436.         endif
  437.         ret
  438.  
  439. calcattraddr
  440. ;bc=yx
  441. ;эхы№ч  яюЁЄшЄ№ bc
  442.         if EGA
  443. ;de=attrs + (y&#18)/4+((y*64)&#ff+x)
  444.         ld a,b
  445.         rrca
  446.         rrca
  447.         ld d,a
  448.         and 0xc0
  449.         add a,c
  450.         ld e,a
  451.         sub c
  452.         xor d
  453.         add a,attrs/256
  454.         ld d,a ;de=attraddr
  455.         else
  456. ;de=#5800 + (y&#18)/8+((y*32)&#ff+x)
  457.         ld a,b
  458.         rrca
  459.         rrca
  460.         rrca
  461.         ld d,a
  462.         and 0xe0
  463.         add a,c
  464.         ld e,a
  465.         sub c
  466.         xor d
  467.         add a,attrs/256;#58
  468.         ld d,a ;de=attraddr
  469.         endif
  470.         ret
  471.        
  472. prtilexy
  473. ;hl=tile
  474. ;bc=yx
  475.         push de
  476.         push bc
  477.         call calcscraddr
  478.         ;push de
  479.         call prcharin_go
  480.         ;pop de
  481.         pop bc
  482.         call calcattraddr;_fromscr
  483.         ld a,(curattr)
  484.         ld (de),a
  485.         pop de
  486.         ret
  487.        
  488. prcharxy
  489. ;a=code
  490. ;bc=yx
  491.         push de
  492.         push hl
  493.         push bc
  494.         push af
  495.         ;jr $
  496.         call calcscraddr
  497.         pop af
  498.         ;push de
  499.         call prcharin
  500.         ;pop de
  501.         pop bc
  502.         call calcattraddr;_fromscr
  503. curattr=$+1
  504.         ld a,0
  505.         ld (de),a
  506.         pop hl
  507.         pop de
  508.         ret
  509.        
  510. prcharin
  511.         if EGA
  512.         sub 32
  513.         ld l,a
  514.         ld h,0
  515.          add hl,hl
  516.          add hl,hl
  517.          add hl,hl
  518.          add hl,hl
  519.          add hl,hl
  520.         ;ld bc,font-(32*32)
  521.         ;add hl,bc
  522.         ld a,h
  523.         add a,font/256
  524.         ld h,a
  525. prcharin_go1
  526.         ex de,hl
  527.        
  528.         if 1==1
  529.         ld bc,40
  530.         push hl
  531.         push hl
  532.         dup 8
  533.         ld a,(de) ;font
  534.         ld (hl),a ;scr
  535.         inc de
  536.         add hl,bc
  537.         edup
  538.         pop hl
  539.         set 6,h
  540.         ;ld d,font/256
  541.         dup 8
  542.         ld a,(de) ;font
  543.         ld (hl),a ;scr
  544.         inc de
  545.         add hl,bc
  546.         edup
  547.         pop hl
  548.         set 5,h
  549.         push hl
  550.         ;ld d,font/256
  551.         dup 8
  552.         ld a,(de) ;font
  553.         ld (hl),a ;scr
  554.         inc de
  555.         add hl,bc
  556.         edup
  557.         pop hl
  558.         set 6,h
  559.         ;ld d,font/256
  560.         dup 8
  561.         ld a,(de) ;font
  562.         ld (hl),a ;scr
  563.         inc de
  564.         add hl,bc
  565.         edup
  566.        
  567.         else
  568.         ld bc,40-0x6000
  569.         dup 8
  570.         ld a,(de) ;font
  571.         inc de
  572.         ld (hl),a ;scr
  573.         set 6,h
  574.         ld a,(de) ;font
  575.         inc de
  576.         ld (hl),a ;scr
  577.         res 6,h
  578.         set 5,h
  579.         ld a,(de) ;font
  580.         inc de
  581.         ld (hl),a
  582.         set 6,h
  583.         ld a,(de) ;font
  584.         inc de
  585.         ld (hl),a ;scr
  586.         ;res 6,h
  587.         ;res 5,h
  588.         add hl,bc
  589.         edup
  590.         endif
  591.        
  592.         ret
  593.         else
  594.         ld l,a
  595.         ld h,0
  596.         add hl,hl
  597.         add hl,hl
  598.         add hl,hl
  599.         ld bc,font-256;#3c00
  600.         add hl,bc
  601.         endif
  602.  
  603.         if EGA
  604.         if 1==1
  605. prcharin_go=prcharin_go1
  606.         else
  607. prcharin_go
  608.         ex de,hl
  609.         ld bc,40
  610.         dup 8
  611.         ld a,(de) ;font
  612.         ld (hl),a ;scr
  613.         set 5,h
  614.         ld (hl),a
  615.         res 5,h
  616.         inc de
  617.         add hl,bc
  618.         edup
  619.         endif
  620.         else
  621. prcharin_go
  622.         ld b,8
  623. prchar0
  624.         ld a,(hl) ;font
  625.         ld (de),a ;scr
  626.         inc hl
  627.         inc d ;+256
  628.         djnz prchar0
  629.         endif
  630.         ret
  631.  
  632.         macro cols data
  633. _l=data/16
  634. _r=data&15
  635.         db ((_r&8)<<4) + ((_r&7)<<3) + ((_l&8)<<3) + (_l&7)
  636.         endm
  637.        
  638.         macro cols8 d0,d1,d2,d3,d4,d5,d6,d7
  639.         cols d0
  640.         cols d1
  641.         cols d2
  642.         cols d3
  643.         cols d4
  644.         cols d5
  645.         cols d6
  646.         cols d7
  647.         endm
  648.        
  649. tileempty
  650.         if EGA
  651.         ds 32
  652.         else
  653.         ds 8
  654.         endif
  655.  
  656. tilebrick
  657.         if EGA
  658.         cols8 #00,#22,#aa,#22,#00,#22,#2a,#22
  659.         cols8 #00,#20,#20,#20,#00,#22,#aa,#22
  660.         cols8 #00,#22,#2a,#22,#00,#22,#aa,#22
  661.         cols8 #00,#22,#aa,#22,#00,#20,#20,#20
  662.         else
  663.         db %00000000
  664.         db %11101111
  665.         db %00101000
  666.         db %11101111
  667.         db %00000000
  668.         db %11111110
  669.         db %10000010
  670.         db %11111110
  671.         endif
  672.        
  673. tilesnake
  674.         if EGA
  675.         cols8 #00,#00,#04,#4c,#4c,#4c,#04,#00
  676.         cols8 #00,#44,#cc,#cc,#cc,#cc,#cc,#44
  677.         cols8 #00,#40,#c4,#cc,#cc,#cc,#c4,#40
  678.         cols8 #00,#00,#00,#40,#40,#40,#00,#00
  679.         else
  680.         db %00000000
  681.         db %00111000
  682.         db %01000100
  683.         db %10000010
  684.         db %10000010
  685.         db %10000010
  686.         db %01000100
  687.         db %00111000
  688.         endif
  689.        
  690. tilesnakehead
  691.         if EGA
  692.         cols8 #00,#00,#04,#4c,#4c,#4c,#04,#00
  693.         cols8 #00,#44,#cc,#fc,#cc,#22,#cc,#44
  694.         cols8 #00,#40,#c4,#fc,#cc,#2c,#c4,#40
  695.         cols8 #00,#00,#00,#40,#40,#40,#00,#00
  696.         else
  697.         db %00000000
  698.         db %00111000
  699.         db %01000100
  700.         db %10101010
  701.         db %10000010
  702.         db %10111010
  703.         db %01000100
  704.         db %00111000
  705.         endif
  706.        
  707. tilerabbit
  708.         if EGA
  709.         cols8 #00,#77,#7f,#7f,#07,#07,#07,#00
  710.         cols8 #00,#00,#70,#70,#f7,#0f,#f2,#77
  711.         cols8 #00,#07,#7f,#7f,#f7,#07,#f7,#70
  712.         cols8 #00,#70,#70,#70,#00,#00,#00,#00
  713.         else
  714.         db %00000000
  715.         db %11000110
  716.         db %10101010
  717.         db %10101010
  718.         db %01101100
  719.         db %01010100
  720.         db %01101100
  721.         db %00111000
  722.         endif
  723.        
  724. endtext
  725.         db "GAME OVER!",0
  726.  
  727. oldtimer
  728.         dw 0
  729.  
  730.         if EGA
  731.         align 256
  732. font
  733.         incbin "fontgfx"
  734.         else
  735. font
  736.         incbin "zx.fnt"
  737.         endif
  738.  
  739. snakecoords
  740. ;y,x (уюыютр т ъюэЎх)
  741.         ;ds snakecoordssize
  742.        
  743. end
  744.  
  745.         display "End=",end
  746.         ;display "Free after end=",/d,#c000-end
  747.         display "Size ",/d,end-begin," bytes"
  748.        
  749.         savebin "snake.com",begin,end-begin
  750.        
  751.         ;LABELSLIST "..\us\user.l"
  752.