Subversion Repositories NedoOS

Rev

Rev 116 | Rev 260 | 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. nextfigx=4
  5. nextfigy=8
  6.        
  7. fieldwid=10
  8. fieldhgt=23
  9. fieldx=16-fieldwid/2
  10. fieldy=0
  11. centerfield=fieldx+(fieldwid/2)
  12. coordsEndPlayField=(fieldx*2-1)+(256*fieldy)
  13. coordsBeginPlayField=(fieldx-1)+(256*fieldy)
  14. coordsDropFig=(coordsBeginPlayField+coordsEndPlayField)/2
  15. fieldmarginsymbol='x'
  16. dangerattr1=0x38+2 ;red
  17. dangerattr2=0x38+4 ;green
  18. dangerattr3=0x38+1 ;blue
  19. scoreattr=dangerattr3
  20. wallattr=dangerattr1
  21. emptyattr=0x38
  22.  
  23. ;fieldEx=32
  24. ;fieldEy=24
  25. centr=0x0b0b;(fieldEx/2)+(256*fieldEy/2)
  26.  
  27. dir_r=key_right;;#09
  28. dir_l=key_left;#08
  29. dir_u=key_up;#0b
  30. dir_d=key_down;#0a
  31.        
  32.         org PROGSTART
  33. begin
  34.  
  35.         ld e,3 ;6912
  36.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  37.  
  38.         OS_GETSCREENPAGES
  39. ;de=ёЄЁрэшЎ√ 0-ую ¤ъЁрэр (d=ёЄрЁ°р ), hl=ёЄЁрэшЎ√ 1-ую ¤ъЁрэр (h=ёЄрЁ°р )
  40.         ld a,d
  41.         SETPG16K
  42.  
  43.         call cls
  44.         call prfield
  45.         call newfig
  46.  
  47.         ld a,(curfalldelay)
  48.         ld (falldelaycount),a
  49.  
  50. gameloop_newfig        
  51.         call newfig
  52.    
  53.         ld bc,nextfigy*256 + nextfigx
  54.         ld de,prfig_pixel_cleanout ;de=рфЁхё яЁюЎхфєЁ√
  55.         ld hl,nextfig
  56.         ld a,(nextfigcolor)
  57.         call prfig_hl_a
  58.        
  59.         call collide ;nz=collision
  60.         jr nz,gameover
  61.        
  62. gameloop
  63.         ld bc,(curxy) ;bc=yx
  64.         ld de,prfig_pixel ;de=рфЁхё яЁюЎхфєЁ√
  65.         call prfig
  66.         call prscore
  67.  
  68.         YIELD ;call delay
  69.  
  70.         ld bc,(curxy) ;bc=yx
  71.         ld de,prfig_clearpixel ;de=рфЁхё яЁюЎхфєЁ√
  72.         call prfig
  73.        
  74.         call storeposition
  75.         GET_KEY
  76.          cp key_esc
  77.          jr z,quit
  78.         call controlkey
  79.         call collide
  80.         call nz,restoreposition
  81.        
  82.         call storeposition
  83.         call movedown
  84.         call collide
  85.         jr z,gameloop
  86.         call stopfig
  87.         jr gameloop_newfig
  88. gameover
  89.         ld hl,endtext
  90.         ld bc,centr
  91.         call prtext
  92. gameoverloop
  93.         YIELD
  94.         GET_KEY
  95.         cp key_esc
  96.         jr nz,gameoverloop
  97. quit
  98.         QUIT
  99.  
  100. storeposition
  101.         ld bc, 4
  102.         ld hl, curfig
  103.         ld de, oldcurfig
  104.         ldir
  105.         ld hl,(curxy)
  106.         ld (oldcurxy),hl
  107.         ret
  108.  
  109. restoreposition
  110.         ld hl,(oldcurxy)
  111.         ld (curxy),hl
  112.         ld bc, 4
  113.         ld de, curfig
  114.         ld hl, oldcurfig
  115.         ldir
  116.         ret
  117.  
  118. collide
  119. ;nz=collision
  120.         ld bc,(curxy) ;bc=yx
  121.         ld de,prfig_checkpixel ;de=рфЁхё яЁюЎхфєЁ√
  122.         call prfig
  123.         ld a,hx
  124.         or a
  125.         ret
  126.        
  127. stopfig
  128.         ld bc,(oldcurxy) ;bc=yx
  129.         ld de,prfig_pixel ;de=рфЁхё яЁюЎхфєЁ√
  130.         call prfig
  131.        
  132.         ld hl,dellineslist
  133.         ld bc,fieldx+(256*fieldy)
  134.         ld ix,fieldhgt ;hx=0
  135. finddellines0
  136.         push bc
  137.         ld (hl),b
  138.         call calcattraddr
  139.         call checkfilledline ;nz чэрўшЄ ёцхў№
  140.         jr z,finddellines_nofire
  141.         inc hl
  142.         inc hx
  143. finddellines_nofire
  144.         pop bc
  145.         inc b ;y
  146.         dec lx
  147.         jr nz,finddellines0
  148.         ld (hl),#ff
  149.        
  150.         ld c,hx
  151.         ld b,0
  152.         ld hl,scoreadds
  153.         add hl,bc
  154.         add hl,bc
  155.         ld c,(hl)
  156.         inc hl
  157.         ld b,(hl)
  158.         ld hl,(curscore)
  159.         add hl,bc
  160.         ld (curscore),hl
  161.        
  162.         ld hl,dellineslist
  163. firelines0
  164.         ld a,(hl)
  165.         cp #ff
  166.         jr z,firelinesq
  167.         inc hl
  168.         ld b,a ;y
  169.         ld c,fieldx
  170.         ld a,emptyattr
  171.         ld (curattr),a
  172.         ld e,fieldwid
  173. firelines1
  174.         ld a,' '
  175.         call prcharxy
  176.         inc c
  177.         dec e
  178.         jr nz,firelines1
  179.         ld c,fieldx
  180.         ld a,b ;y
  181.         dec a
  182.         push hl
  183.         call shiftblock ;bc=ыхт√щ эшцэшщ єуюы, a=ъюышўхёЄтю ёфтшурхь√ї ёЄЁюъ
  184.         pop hl
  185.         jr firelines0
  186. firelinesq
  187.         ret
  188.  
  189. newfig  
  190.         ld hl,nextfig
  191.         ld de,curfig
  192.         ld bc,4
  193.         ldir
  194.         ld a,(nextfigcolor)
  195.         ld (curfigcolor),a
  196.        
  197.         ld c,nfigs
  198.         call rnd
  199.         add a,a
  200.         add a,a
  201.         ld c,a
  202.         ld b,0
  203.         ld hl,figs
  204.         add hl,bc
  205.         ld de,nextfig
  206.         ld  c,4
  207.         ldir
  208.         ld c,4
  209.         call rnd
  210.         add a,2 ;red...
  211.         add a,a
  212.         add a,a
  213.         add a,a
  214.         ld (nextfigcolor),a
  215.        
  216.         ld hl,coordsDropFig
  217.         ld (curxy),hl
  218.         ret
  219.  
  220. shiftblock
  221. ;bc=ыхт√щ эшцэшщ єуюы, a=ъюышўхёЄтю ёфтшурхь√ї ёЄЁюъ
  222. shiftblockline
  223.         push af
  224.         call calcscraddr
  225.         ex de,hl ;hl=рфЁхё Єхъє∙хщ ёЄЁюъш
  226.         dec b ;y
  227.         call calcscraddr ;de=рфЁхё яЁхф√фє∙хщ ёЄЁюъш
  228.         ex de,hl ;de=рфЁхё Єхъє∙хщ ёЄЁюъш, hl=рфЁхё яЁхф√фє∙хщ ёЄЁюъш
  229.         push bc
  230.         ld a,8
  231. shiftblockline0
  232.         ld bc,fieldwid
  233.         push de
  234.         push hl
  235.         ldir
  236.         pop hl
  237.         pop de
  238.         inc h
  239.         inc d
  240.         dec a
  241.         jr nz,shiftblockline0
  242.         dec h
  243.         dec d
  244.         call calcattraddr_fromscr
  245.         ex de,hl
  246.         call calcattraddr_fromscr
  247.         ex de,hl
  248.         ld bc,fieldwid
  249.         ldir
  250.         pop bc
  251.         pop af
  252.         dec a
  253.         jr nz,shiftblockline
  254.         ret
  255.  
  256. checkfilledline
  257. ;de=attraddr
  258.         ld b,fieldwid
  259. checkfilledline0
  260.         ld a,(de)
  261.         inc de
  262.         cp emptyattr
  263.         ret z
  264.         djnz checkfilledline0
  265.         ret ;nz
  266.  
  267. movedown
  268.         ld a,(falldelaycount)
  269.         dec a
  270.         jr nz, falldelaycount_q ;хёыш эх 0 Єю юсїюфшь
  271.         ld a,(curfalldelay)
  272.         ld bc,(curxy)
  273.         inc b
  274.         ld (curxy),bc
  275. falldelaycount_q
  276.         ld (falldelaycount),a  
  277.         ret
  278.  
  279. controlkey
  280.         cp dir_u
  281.         jr z,rotfig
  282.         ld bc,(curxy)
  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. moveq
  296.         ld (curxy),bc      
  297.         ret    
  298.        
  299. rotfig
  300.         ld bc,(curfig)
  301.         ld de,(curfig+2)
  302.         ld hl,curfig
  303.         ld lx,4
  304. rotfig_lines
  305.         xor a
  306.         rr c
  307.         rla
  308.         rr b
  309.         rla
  310.         rr e
  311.         rla
  312.         rr d
  313.         rla
  314.         ld (hl),a
  315.         inc hl
  316.         dec lx  
  317.         jr nz, rotfig_lines
  318.         ret
  319.  
  320. rnd
  321. ;0..c-1
  322.         ld a,r
  323. rnd0
  324.         sub c
  325.         jr nc,rnd0
  326.         add a,c
  327.         ret
  328.  
  329. cls
  330.         ld hl,#4000
  331.         ld de,#4001
  332.         ld bc,#17ff
  333.         ld (hl),0;#ff
  334.         ldir
  335.         ld hl,#5800
  336.         ld de,#5801
  337.         ld (hl),emptyattr
  338.         ld bc,767
  339.         ldir
  340.         ret
  341.        
  342. prfield
  343.         ld a,wallattr
  344.         ld (curattr),a
  345.         ld bc,fieldx-1+256*(fieldy+fieldhgt) ;bottom
  346.         ld e,fieldwid+2
  347. prfieldhor0
  348.         ld a,fieldmarginsymbol
  349.         call prcharxy
  350.         inc c
  351.         dec e
  352.         jr nz,prfieldhor0
  353.         ld bc,coordsBeginPlayField ;left
  354.         call prfieldver
  355.         ld bc,coordsEndPlayField ;right
  356. prfieldver
  357.         ld e,fieldhgt
  358. prfieldver0
  359.         ld a,fieldmarginsymbol
  360.         call prcharxy
  361.         inc b
  362.         dec e
  363.         jr nz,prfieldver0
  364.         ret
  365.      
  366. prtext
  367. ;bc=ъююЁфшэрЄ√
  368. ;hl=text
  369.         ld a,emptyattr
  370.         ld (curattr),a
  371.         ld a,(hl)
  372.         or a
  373.         ret z
  374.         call prcharxy
  375.         inc hl
  376.         inc c
  377.         jr prtext
  378.  
  379. prscore
  380.         ld hl,(curscore)
  381.         ld de,#4000
  382. prnum
  383.         ld bc,1000
  384.         call prdig
  385.         ld bc,100
  386.         call prdig
  387.         ld bc,10
  388.         call prdig
  389.         ld bc,1
  390. prdig
  391.         ld a,'0'-1
  392. prdig0
  393.         inc a
  394.         or a
  395.         sbc hl,bc
  396.         jr nc,prdig0
  397.         add hl,bc
  398.         ;push hl
  399.         ;call prchar
  400.         ;pop hl
  401.         ;ret
  402.        
  403. prchar
  404. ;a=code
  405. ;de=screen
  406.         push de
  407.         push hl
  408.         call prcharin
  409.         pop hl
  410.         pop de
  411.         inc e
  412.         ret
  413.        
  414. calcscraddr
  415. ;de=#4000 + (y&#18)+((y*32)&#ff+x)
  416.         ld a,b ;y
  417.         and #18
  418.         add a,#40
  419.         ld d,a
  420.         ld a,b ;y
  421.         add a,a ;*2
  422.         add a,a ;*4
  423.         add a,a ;*8
  424.         add a,a ;*16
  425.         add a,a ;*32
  426.         add a,c ;x
  427.         ld e,a
  428.         ret
  429.        
  430. calcattraddr
  431.         call calcscraddr
  432.         ;call calcattraddr_fromscr
  433. calcattraddr_fromscr
  434. ;de=#5800 + (y&#18)/8+((y*32)&#ff+x)
  435.         ld a,d
  436.         ;sub #40
  437.         rra
  438.         rra
  439.         rra
  440.         and 3
  441.         add a,#58
  442.         ld d,a ;de=attraddr
  443.         ret
  444.  
  445. prcharxy
  446. ;a=code
  447. ;bc=yx
  448.         push bc
  449.         push de
  450.         push hl
  451.         push af
  452.         call calcscraddr
  453.         pop af
  454.         push de
  455.         call prcharin
  456.         pop de
  457.         call calcattraddr_fromscr
  458. curattr=$+1
  459.         ld a,0
  460.         ld (de),a
  461.         pop hl
  462.         pop de
  463.         pop bc
  464.         ret
  465.        
  466. prcharin
  467.         ld l,a
  468.         ld h,0
  469.         add hl,hl
  470.         add hl,hl
  471.         add hl,hl
  472.         ld bc,font-256;#3c00
  473.         add hl,bc
  474.         ld b,8
  475. prchar0
  476.         ld a,(hl) ;font
  477.         ld (de),a ;scr
  478.         inc hl
  479.         inc d ;+256
  480.         djnz prchar0
  481.         ret
  482.  
  483. ;text
  484. ;        db "Hello world!",0
  485. endtext
  486.         db "Game over!",0
  487. curxy
  488.         dw 0
  489. oldcurxy
  490.         dw 0
  491.    
  492.        
  493. prfig
  494. ;bc=yx
  495.         ld hl,curfig ;hl=єърчрЄхы№ эр ЇшуєЁє
  496. curfigcolor=$+1
  497.         ld a,6
  498. prfig_hl_a
  499. ;hl=єърчрЄхы№ эр ЇшуєЁє
  500. ;de=рфЁхё яЁюЎхфєЁ√
  501.         ld lx,a
  502.         ld hx,0 ;lx=рЄЁшсєЄ, hx=0
  503.         ld (prfig_calladdr),de
  504.         ld e,4
  505. prfig_lines
  506.         push de
  507.         ld d,(hl) ;%0000????
  508.         inc hl
  509.         rlc d
  510.         rlc d
  511.         rlc d
  512.         rlc d ;%????0000
  513.         push bc
  514.         ld e,4
  515. prfig_pixels
  516.         rl d
  517. prfig_calladdr=$+1
  518.         call prfig_pixel
  519.         inc c ;x
  520.         dec e
  521.         jr nz,prfig_pixels
  522.         pop bc
  523.         inc b ;y
  524.         pop de
  525.         dec e
  526.         jr nz,prfig_lines
  527.         ret
  528.        
  529. ;bc=yx
  530. prfig_pixel
  531.         ret nc
  532.         push bc
  533.         push de
  534.         push hl
  535.         ld a,lx
  536.         ld (curattr),a
  537.         ld a,'X'
  538.         call prcharxy
  539.         pop hl
  540.         pop de
  541.         pop bc
  542.         ret
  543. prfig_pixel_cleanout
  544.         push bc
  545.         push de
  546.         push hl
  547.         ld a,emptyattr
  548.         ld (curattr),a
  549.         ld a,' '
  550.         jr nc,prfig_pixel_cleanout_ok
  551.         ld a,lx
  552.         ld (curattr),a
  553.         ld a,'X'
  554. prfig_pixel_cleanout_ok
  555.         call prcharxy
  556.         pop hl
  557.         pop de
  558.         pop bc
  559.         ret
  560. prfig_checkpixel
  561.         ret nc
  562.         push bc
  563.         push de
  564.         push hl
  565.         call calcattraddr
  566.         ld a,(de)
  567.         cp emptyattr
  568.         jr z,checkpixelempty
  569.         inc hx
  570. checkpixelempty  
  571.         pop hl
  572.         pop de
  573.         pop bc
  574.         ret
  575. prfig_clearpixel
  576. ;bc=yx
  577.         ret nc
  578.         push bc
  579.         push de
  580.         push hl
  581.         ld a,emptyattr
  582.         ld (curattr),a
  583.         ld a,' '
  584.         call prcharxy
  585.         pop hl
  586.         pop de
  587.         pop bc
  588.         ret
  589.        
  590. figs
  591. ;ътрфЁрЄ
  592.         db %0000
  593.         db %0110
  594.         db %0110
  595.         db %0000
  596. ;ярыър
  597.         db %0100
  598.         db %0100
  599.         db %0100
  600.         db %0100
  601. ;ёряюу яЁрт√щ
  602.         db %0100
  603.         db %0100
  604.         db %0110
  605.         db %0000
  606. ;ёряюу ыхт√щ
  607.         db %0010
  608.         db %0010
  609.         db %0110
  610.         db %0000
  611. ;чшучру1
  612.         db %0000
  613.         db %0011
  614.         db %0110
  615.         db %0000
  616. ;чшучру2
  617.         db %0000
  618.         db %1100
  619.         db %0110
  620.         db %0000
  621. ;T
  622.         db %0000
  623.         db %1110
  624.         db %0100
  625.         db %0000
  626. nfigs=($-figs)/4
  627. curfig
  628.         ds 4
  629. oldcurfig
  630.         ds 4        
  631. nextfig
  632.         ds 4
  633.  
  634. scoreadds
  635.         dw 0
  636.         dw 10 ;1 line
  637.         dw 30 ;2 lines
  638.         dw 50 ;3 lines
  639.         dw 100 ;4 lines
  640.  
  641. falldelaycount
  642.         db 0
  643. curfalldelay
  644.         db 16
  645. curscore
  646.         dw 0
  647. nextfigcolor
  648.         db 0
  649.  
  650.  
  651. dellineslist
  652.         ds 4+1 ;max 4 ышэшш + #ff
  653.  
  654. oldtimer
  655.         dw 0
  656.  
  657.         ;align 256
  658. font
  659.         incbin "zx.fnt"
  660.  
  661. end
  662.  
  663.         display "End=",end
  664.         ;display "Free after end=",/d,#c000-end
  665.         display "Size ",/d,end-begin," bytes"
  666.        
  667.         savebin "tetris.com",begin,end-begin
  668.        
  669.         ;LABELSLIST "..\us\user.l"
  670.