?login_element?

Subversion Repositories NedoOS

Rev

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