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