Subversion Repositories NedoOS

Rev

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