Subversion Repositories NedoOS

Rev

Rev 116 | Rev 344 | 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. STACK=0x4000
  5. MAXVERTICES=256
  6. MAXEDGES=512;256
  7. scrbase=0x8000
  8.  
  9. scrwid=320
  10. scrhgt=200
  11.  
  12. COLORS_UNCROSSED=%11100100;%11001001
  13. COLORS_CROSSED=%11010010
  14.  
  15.         org PROGSTART
  16. begin
  17.         ld sp,STACK
  18.  
  19.         ld e,0
  20.         OS_SETGFX ;e=0:EGA, e=2:MC, e=3:6912, e=6:text ;+SET FOCUS ;e=-1: disable gfx (out: e=old gfxmode)
  21.  
  22.         OS_GETSCREENPAGES
  23. ;de=ёЄЁрэшЎ√ 0-ую ¤ъЁрэр (d=ёЄрЁ°р ), hl=ёЄЁрэшЎ√ 1-ую ¤ъЁрэр (h=ёЄрЁ°р )
  24.         ld a,e
  25.         SETPG32KLOW
  26.         ld a,d
  27.         SETPG32KHIGH
  28.  
  29.         ld a,r
  30.         ld (rndseed1),a
  31.         OS_GETTIMER ;hlde=timer
  32.         ld (rndseed2),de
  33.          ld (oldupdtimer),de
  34.  
  35.         ld de,filename
  36.         OS_OPENHANDLE
  37.         ;jr $
  38.         ;ld a,-1
  39.         or a
  40.         jr nz,noloadini
  41.         push bc
  42.         ld de,SAVEDATA
  43.         ld hl,SAVEDATAsz
  44.         OS_READHANDLE
  45.         pop bc
  46.         OS_CLOSEHANDLE
  47.         jr loadiniq
  48. noloadini
  49.         ;ld a,12
  50.         xor a
  51.         ld (level),a
  52.         call countverticesneeded
  53.         ;jr $
  54.         call genmesh
  55. loadiniq
  56.         call redraw
  57.        
  58.         jr mouseloop_go
  59. mouseloop
  60. ;1. тё╕ т√тюфшь
  61. ;2. цф╕ь ёюс√Єшх
  62. ;[3. тё╕ ёЄшЁрхь]
  63. ;4. юсЁрсрЄ√трхь ёюс√Єшх (схч яхЁхЁшёютъш)
  64. ;5. тё╕ ёЄшЁрхь
  65.  
  66.         ld a,(clickstate)
  67.         or a
  68.         jr z,mouseloop_nomove
  69.         call   drawcurvertex
  70.         ;call   drawconnectedvertices
  71.         call   drawcuredges
  72.  
  73.         ;call ahl_coords
  74.         call movecurvertex
  75.  
  76.         call drawcuredges
  77.         ;call drawconnectedvertices
  78.         call drawcurvertex
  79.        
  80.         call ahl_coords
  81.         cp 8
  82.         jr nc,$+2+2+3
  83.          ld a,1
  84.          ld (invalidatetime),a
  85.        
  86. mouseloop_nomove
  87.  
  88.          call redrawifneeded ;TODO єсЁрЄ№?
  89.          
  90. ;TODO яЁютхЁшЄ№, хёЄ№ ыш Їюъєё! хёыш эхЄє, Єю эх т√ч√трЄ№ prlevelifneeded
  91.          
  92.         call prlevelifneeded
  93.  
  94. mouseloop_go
  95. ;ёхщўрё тё╕ т√тхфхэю, ъЁюьх ёЄЁхыъш
  96.         call ahl_coords
  97.         call shapes_memorizearr
  98.         call ahl_coords
  99.         call shapes_prarr8c
  100.  
  101.         ;call waitsomething ;т ¤Єю тЁхь  ёЄЁхыър тшфэр
  102. mainloop_nothing0
  103.         call updatetime
  104. ;т ¤Єю тЁхь  ёЄЁхыър тшфэр
  105.         YIELD ;halt
  106.         call control
  107.         jr nz,mainloop_something
  108.          ld a,(invalidatetime)
  109.          or a
  110.         jr z,mainloop_nothing0
  111. mainloop_something
  112. ;ўЄю-Єю шчьхэшыюё№
  113.        
  114.         call ahl_oldcoords
  115.         call shapes_rearr
  116. ;ёхщўрё тё╕ т√тхфхэю, ъЁюьх ёЄЁхыъш
  117.  
  118. key=$+1
  119.         ld a,0
  120.         cp key_esc
  121.         call z,quitifnoclickstate
  122.         cp key_redraw
  123.         call z,redraw
  124.  
  125.         ;call control_keys
  126. clickstate=$+1
  127.         ld a,0
  128.         or a
  129.         jr nz,mouseloop_wasclicked
  130.         ld a,(mousebuttons)
  131.         cpl
  132.         and 7
  133.         call nz,mouse_fire
  134.         jr mouseloop
  135. mouseloop_wasclicked
  136.         ld a,(mousebuttons)
  137.         cpl
  138.         and 7
  139.         call z,mouse_unfire
  140.         jp mouseloop
  141.  
  142.  
  143. mouse_unfire
  144.         ld a,1
  145.         ld (doredraw),a
  146.         xor a
  147.         ld (clickstate),a
  148.  
  149. ;юсэютшЄ№ ёў╕Єўшъ crossededges ъюэъЁхЄэю яю Ё╕сЁрь, ъюЄюЁ√х яхЁхёхърышё№ т эрўрых ш т ъюэЎх фтшцхэш 
  150. ;фы  ¤Єюую фы  ёЄрЁющ яючшЎшш тхЁ°шэ√ фы  ърцфюую шч ёт чрээ√ї Ё╕схЁ фхъЁхьхэЄшЁєхь тёх яхЁхёхўхэш  (є эхую ш є яхЁхёхў╕ээюую)
  151. ;р фы  эютющ яючшЎшш тхЁ°шэ√ фы  ърцфюую шч ёт чрээ√ї Ё╕схЁ шэъЁхьхэЄшЁєхь тёх яхЁхёхўхэш  (є эхую ш є яхЁхёхў╕ээюую)
  152.  
  153. ;фы  эютющ яючшЎшш тхЁ°шэ√ фы  ърцфюую шч ёт чрээ√ї Ё╕схЁ шэъЁхьхэЄшЁєхь тёх яхЁхёхўхэш  (є эхую ш є яхЁхёхў╕ээюую)
  154.         ld hl,inccrossedandself
  155.         call inccrossededges
  156. ;шыш яЁюёЄю яюёўшЄрхь ърцф√щ ё ърцф√ь
  157.         ;call countcrossededges
  158.        
  159. ;яюёых яюсхф√ єцх эх яЁютхЁ хь яюсхфє
  160.         ld a,(nextlevelon)
  161.         or a
  162.         ret nz
  163.  
  164. ;check if untangled
  165.         ;ld hl,(ncrossededges)
  166.         ld hl,edges
  167.         ld de,0 ;count*2
  168.         ld bc,(nedges)
  169. sumcrossededges0
  170.         inc hl
  171.         inc hl
  172.         ld a,(hl) ;crossed
  173.         inc hl
  174.         add a,e
  175.         ld e,a
  176.         adc a,d
  177.         sub e
  178.         ld d,a
  179.         dec bc
  180.         ld a,b
  181.         or c
  182.         jr nz,sumcrossededges0
  183. ;de=2*ncrossededges
  184.         ld a,d
  185.         or e
  186.         jr z,levelcomplete
  187.        
  188.         ret
  189.  
  190. levelcomplete
  191.         ld a,' '
  192.         ld (nextlevelon),a
  193.         ;ld a,1
  194.         ld (invalidatetime),a
  195.         ret
  196.        
  197. mouse_fire_nextlevel
  198.         call ahl_coords
  199.         cp 8
  200.         jr nc,mouse_fire_nonextlevel
  201.         ld bc,8*(nextlevelon+1-tlevel)
  202.         or a
  203.         sbc hl,bc
  204.         ld bc,8*10 ;"NEXT LEVEL"
  205.         or a
  206.         sbc hl,bc
  207.         jr nc,mouse_fire_nonextlevel
  208. ;levelcomplete_go
  209.         xor a
  210.         ld (nextlevelon),a
  211.         inc a;ld a,1
  212.         ld (invalidatetime),a
  213.         ld hl,level
  214.         inc (hl)
  215.         call countverticesneeded
  216.  
  217.         call genmesh
  218.        
  219.         ld a,1
  220.         ld (doredraw),a
  221.         ;call redraw ;хёЄ№ doredraw
  222.        
  223.         ret
  224.  
  225. mouse_fire
  226.         ld a,(nextlevelon)
  227.         or a
  228.         jr nz,mouse_fire_nextlevel
  229. mouse_fire_nonextlevel
  230.         call ahl_coords
  231.         call findvertex
  232.         ret c ;not found
  233.         ld (curvertex),a
  234.         ld a,1
  235.         ld (clickstate),a
  236. ;фы  ёЄрЁющ яючшЎшш тхЁ°шэ√ фы  ърцфюую шч ёт чрээ√ї Ё╕схЁ фхъЁхьхэЄшЁєхь тёх яхЁхёхўхэш  (є эхую ш є яхЁхёхў╕ээюую)
  237.         ld hl,deccrossedandself
  238.         call inccrossededges
  239. ;ёЄшЁрхь Єхъє∙є■ тхЁ°шэє, Єхъє∙шх Ё╕сЁр ш яхЁхЁшёют√трхь шї шэтхЁёшхщ
  240.         call undrawcurvertex
  241.         call undrawconnectedvertices
  242.         call undrawcuredges
  243.         ;call cls
  244.         call drawunconnectededges
  245.         call drawunconnectedvertices
  246.  
  247.         call prlevel
  248.        
  249.         call drawcuredges
  250.         call drawconnectedvertices
  251.         call drawcurvertex
  252.        
  253.         ret
  254.  
  255. movecurvertex
  256.         ld a,(clickstate)
  257.         or a
  258.         ret z ;unclicked
  259.         call getcurvertexaddr
  260.         push hl
  261.         call ahl_coords
  262.          cp 7
  263.          jr nc,$+4
  264.          ld a,7 ;max dy = 192 (for fast mul)
  265.         ex de,hl
  266.         pop hl
  267.         ld (hl),e
  268.         inc hl
  269.         ld (hl),d ;x
  270.         inc hl
  271.         ld (hl),a ;y
  272.         inc hl
  273.         ld (hl),0
  274.         ret
  275.  
  276. drawcurvertex
  277.         ;ld a,(clickstate)
  278.         ;or a
  279.         ;ret z ;unclicked
  280.         call getcurvertexxy_ahl
  281.         jp shapes_prarr_ring8c
  282. drawringon
  283.         bit 0,l
  284.         ld de,sprringon_l+1
  285.         jr nz,$+5+2
  286.          ld de,sprringon_r+1
  287.          dec hl
  288.          dec hl
  289.         jp prarr_cross8c_go
  290.  
  291. undrawcurvertex
  292.         ;ld a,(clickstate)
  293.         ;or a
  294.         ;ret z ;unclicked
  295.         call getcurvertexxy_ahl
  296.         ;jp shapes_prarr_ring8c
  297. drawringoff
  298.         bit 0,l
  299.         ld de,sprringoff_l+1
  300.         jr nz,$+5+2
  301.          ld de,sprringoff_r+1
  302.          dec hl
  303.          dec hl
  304.         jp prarr_cross8c_go
  305.  
  306. getcurvertexxy_ahl
  307.         call getcurvertexaddr
  308.         ld c,(hl)
  309.         inc hl
  310.         ld b,(hl) ;x
  311.         inc hl
  312.         ld e,(hl)
  313.         inc hl
  314.         ld d,(hl) ;y
  315.         ld a,e ;y
  316.         ld h,b
  317.         ld l,c ;x
  318.         ret
  319.  
  320. getcurvertexaddr
  321. curvertex=$+1
  322.         ld de,0
  323.         ld hl,vertices
  324.         add hl,de
  325.         add hl,de
  326.         add hl,de
  327.         add hl,de
  328.         ret
  329.  
  330. undrawcuredges
  331.         ld hl,prpixel
  332.         ld a,0
  333.         jr drawcuredges_go
  334. drawcuredges
  335.         ld hl,invpixel
  336.         ld a,0xff
  337. drawcuredges_go
  338.         ld (pixelprocver),hl
  339.         ld (pixelprochor),hl
  340.         ld (drawcuredges_color),a
  341.         ld a,(clickstate)
  342.         or a
  343.         ret z ;unclicked
  344. ;find all edges with current vertex (1st or 2nd), draw them
  345. ;vertex1,vertex2,crossed
  346.         ld hl,edges
  347.         ld bc,(nedges)
  348. drawcuredges0
  349.         push bc
  350.         ld e,(hl)
  351.         inc hl
  352.         ld d,(hl)
  353.         inc hl
  354.         ld a,(curvertex)
  355.         cp d
  356.         jr z,$+3
  357.         cp e
  358.         jr nz,drawcuredgesno
  359.         ld a,(hl)
  360.         push hl
  361. ;e=vertex1
  362. ;d=vertex2
  363. ;a=crossed
  364.         or a
  365.         ld a,COLORS_UNCROSSED;%11001001
  366.         jr z,$+4
  367.         ld a,COLORS_CROSSED;%11010010
  368. drawcuredges_color=$+1
  369.         and 0
  370.         call drawedge
  371.         pop hl
  372. drawcuredgesno
  373.         inc hl
  374.         pop bc
  375.         dec bc
  376.         ld a,b
  377.         or c
  378.         jr nz,drawcuredges0
  379.         ld hl,prpixel
  380.         ld (pixelprocver),hl
  381.         ld (pixelprochor),hl
  382.         ret
  383.  
  384. drawconnectedvertices
  385.         ld hl,shapes_prarr_ring8c;drawringon
  386.         jr drawconnectedvertices_go
  387. undrawconnectedvertices
  388.         ld hl,drawringoff
  389. drawconnectedvertices_go
  390.         ld (drawconnectedvertices_drawproc),hl
  391.         ld hl,edges
  392.         ld bc,(nedges)
  393. drawconnectedvertices0
  394.         push bc
  395.         ld e,(hl)
  396.         inc hl
  397.         ld d,(hl)
  398.         inc hl
  399. ;e=vertex1
  400. ;d=vertex2
  401.         ld a,(curvertex)
  402.         cp d
  403.         jr z,drawconnectedvertices_e
  404.         cp e
  405.         jr nz,drawconnectedverticesno
  406.         ld e,d
  407. drawconnectedvertices_e
  408.         push hl
  409.         ld d,0 ;e=connected vertex
  410.         ld hl,vertices
  411.         add hl,de
  412.         add hl,de
  413.         add hl,de
  414.         add hl,de
  415.         ld c,(hl)
  416.         inc hl
  417.         ld b,(hl) ;x
  418.         inc hl
  419.         ld e,(hl)
  420.         inc hl
  421.         ld d,(hl) ;y
  422.         ld a,e ;y
  423.         ld h,b
  424.         ld l,c ;x
  425. drawconnectedvertices_drawproc=$+1
  426.         call drawringon
  427.         pop hl
  428. drawconnectedverticesno
  429.         inc hl
  430.         pop bc
  431.         dec bc
  432.         ld a,b
  433.         or c
  434.         jr nz,drawconnectedvertices0
  435.         ret
  436.  
  437. drawunconnectededges
  438. ;Ёшёєхь тёх Ё╕сЁр, ъЁюьх ёт чрээ√ї ё Єхъє∙хщ тхЁ°шэющ
  439. ;find all edges with current vertex (1st or 2nd), draw others
  440. ;vertex1,vertex2,crossed
  441.         ld hl,edges
  442.         ld bc,(nedges)
  443. drawunconnectededges0
  444.         push bc
  445.         ld e,(hl)
  446.         inc hl
  447.         ld d,(hl)
  448.         inc hl
  449.         ld a,(curvertex)
  450.         cp d
  451.         jr z,$+3
  452.         cp e
  453.         jr  z,drawunconnectededgesno
  454.         ld a,(hl)
  455.         push hl
  456. ;e=vertex1
  457. ;d=vertex2
  458. ;a=crossed
  459.         or a
  460.         ld a,COLORS_UNCROSSED;%11001001
  461.         jr z,$+4
  462.         ld a,COLORS_CROSSED;%11010010
  463.         call drawedge
  464.         pop hl
  465. drawunconnectededgesno
  466.         inc hl
  467.         pop bc
  468.         dec bc
  469.         ld a,b
  470.         or c
  471.         jr nz,drawunconnectededges0
  472.         ret
  473.        
  474. drawunconnectedvertices
  475. ;Ёшёєхь тёх тхЁ°шэ√, ъЁюьх Єхъє∙хщ ш ёт чрээ√ї ё эхщ
  476. ;фы  ¤Єюую:
  477. ;ўшёЄшь ЄрсышЎє ёт чрээ√ї тхЁ°шэ
  478.         ld hl,vertlinkflags
  479.         ld de,vertlinkflags+1
  480.         ld bc,MAXVERTICES-1
  481.         ld (hl),0
  482.         ldir
  483. ;яюьхўрхь Єрь Єхъє∙є■ тхЁ°шэє
  484.         ld de,vertlinkflags
  485.         ld hl,(curvertex)
  486.         ld h,0
  487.         add hl,de
  488.         inc (hl)
  489. ;яхЁхсшЁрхь тёх Ё╕сЁр, ш∙хь Єрь ёт чрээ√х тхЁ°шэ√ ш яюьхўрхь т ЄрсышЎх ёт чрээ√ї тхЁ°шэ
  490.         ld hl,edges
  491.         ld bc,(nedges)
  492. drawunconnectedvertices0
  493.         ld e,(hl)
  494.         inc hl
  495.         ld d,(hl)
  496.         inc hl
  497. ;e=vertex1
  498. ;d=vertex2
  499.         ld a,(curvertex)
  500.         cp d
  501.         jr z,drawunconnectedvertices_e
  502.         cp e
  503.         jr nz,drawunconnectedverticesno
  504.         ld e,d
  505. drawunconnectedvertices_e
  506.         push hl
  507.         ld d,0 ;e=connected vertex
  508.         ld hl,vertlinkflags
  509.         add hl,de
  510.         inc (hl)
  511.         pop hl
  512. drawunconnectedverticesno
  513.         inc hl
  514.         dec bc
  515.         ld a,b
  516.         or c
  517.         jr nz,drawunconnectedvertices0
  518. ;яхЁхсшЁрхь тёх тхЁ°шэ√, т√тюфшь Єюы№ъю эх яюярт°шх т ЄрсышЎє
  519.         ld hl,vertlinkflags
  520.         ld a,(nvertices)
  521.         ld b,a
  522. drawunconnectedvertices1
  523.         push bc
  524.         push hl
  525.         ld a,(nvertices)
  526.         sub b
  527.         ld e,a
  528.          ld a,(hl) ;linkflag
  529.         ld d,0 ;e=connected vertex
  530.         ld hl,vertices
  531.         add hl,de
  532.         add hl,de
  533.         add hl,de
  534.         add hl,de
  535.         ld c,(hl)
  536.         inc hl
  537.         ld b,(hl) ;x
  538.         inc hl
  539.         ld e,(hl)
  540.         inc hl
  541.         ld d,(hl) ;y
  542.          or a
  543.         ld a,e ;y
  544.         ld h,b
  545.         ld l,c ;x
  546.         call z,drawringon
  547.         pop hl
  548.         inc hl
  549.         pop bc
  550.         djnz drawunconnectedvertices1
  551.         ret
  552.        
  553. countverticesneeded
  554.         ld a,6
  555.         ld (verticesneeded),a
  556.         ld a,(level)
  557.         or a
  558.         ret z
  559.         ld b,a
  560. countverticesneeded0
  561.         ld a,b
  562.         add a,3 ;a=4..
  563.         ld hl,verticesneeded
  564.         add a,(hl)
  565.         jr nc,$+3
  566.         sbc a,a
  567.         ld (hl),a
  568.         djnz countverticesneeded0
  569.         ret
  570.  
  571. ahl_coords
  572.         ld a,(arry)
  573.         ld hl,(arrx)
  574.         ret
  575. ahl_oldcoords
  576.         ld a,(oldarry)
  577.         ld hl,(oldarrx)
  578.         ret
  579.  
  580.  
  581.         if 1==0
  582. gameover
  583.         ld hl,endtext
  584.         ld bc,0x0b0f
  585.         call prtext
  586. gameoverloop
  587.         YIELD
  588.         GET_KEY
  589.         cp key_esc
  590.         jr nz,gameoverloop
  591.         endif
  592.  
  593. quitifnoclickstate
  594.         ld a,(clickstate)
  595.         or a
  596.         ret nz
  597. quit
  598.         ld de,filename
  599.         OS_CREATEHANDLE
  600.         push bc
  601.         ld de,SAVEDATA
  602.         ld hl,SAVEDATAsz
  603.         OS_WRITEHANDLE
  604.         pop bc
  605.         OS_CLOSEHANDLE
  606.         QUIT
  607.        
  608. filename
  609.         db "untangle.ini",0
  610.  
  611. redrawifneeded
  612. doredraw=$+1
  613.         ld a,0
  614.         or a
  615.         ret z
  616. redraw
  617.         xor a
  618.         ld (doredraw),a
  619.         call cls
  620.        
  621.         call drawedges
  622.         call drawvertices
  623.         jp prlevel
  624.  
  625. prlevelifneeded
  626. invalidatetime=$+1
  627.         ld a,0
  628.         or a
  629.         ret z
  630. prlevel
  631.         ld a,(level)
  632.         inc a
  633.         ld hl,tleveldig1
  634.         call dectotxt12
  635.         ;ld (tleveldig2),a
  636.         ;ld a,b
  637.         ;ld (tleveldig1),a
  638.         ld a,(cur_h)
  639.         ld hl,ttimeh1
  640.         call dectotxt12
  641.         ld a,(cur_m)
  642.         ld hl,ttimem1
  643.         call dectotxt12
  644.         ld a,(cur_s)
  645.         ld hl,ttimes1
  646.         call dectotxt12
  647.        
  648.         ld bc,0
  649.         ld hl,tlevel
  650.         call prtext
  651.          xor a
  652.          ld (invalidatetime),a
  653.         ret
  654.  
  655. dectotxt12
  656.         ld b,'0'-1
  657.         inc b
  658.         sub 10
  659.         jr nc,$-3
  660.         add a,'0'+10
  661.          ld (hl),b
  662.          inc hl
  663.          ld (hl),a
  664.         ret
  665.  
  666. updatetime
  667.         OS_GETTIMER ;hlde=timer
  668.         ld hl,(oldupdtimer)
  669.         ex de,hl
  670.         ld (oldupdtimer),hl
  671.         or a
  672.         sbc hl,de ;hl=frames
  673.         ret z
  674.         ld b,h
  675.         ld c,l
  676. updatetime0
  677.         call inctime
  678.         dec bc
  679.         ld a,b
  680.         or c
  681.         jr nz,updatetime0
  682.         ret
  683. inctime
  684.         ld hl,cur_f
  685.         inc (hl)
  686.         ld a,(hl)
  687.         sub 50
  688.         ret c
  689.         ld (hl),a
  690.          ld a,1
  691.          ld (invalidatetime),a
  692.         ld hl,cur_s
  693.         inc (hl)
  694.         ld a,(hl)
  695.         sub 60
  696.         ret c
  697.         ld (hl),a
  698.         ld hl,cur_m
  699.         inc (hl)
  700.         ld a,(hl)
  701.         sub 60
  702.         ret c
  703.         ld (hl),a
  704.         ld hl,cur_h
  705.         inc (hl)
  706.         ret
  707.  
  708.         if 1==0
  709. genvertices
  710. ;x,X,y,Y
  711.         ld hl,vertices
  712.         ld a,(nvertices)
  713.         ld b,a
  714. genvertices0
  715.         push bc
  716.         ld c,160
  717.         call rnd
  718.         add a,a
  719.         ld (hl),a
  720.         inc hl
  721.         ld (hl),0
  722.         rl (hl)
  723.         inc hl
  724.         ld c,200
  725.         call rnd
  726.         ld (hl),a
  727.         inc hl
  728.         ld (hl),0
  729.         inc hl
  730.         pop bc
  731.         djnz genvertices0
  732.         ret
  733.         endif
  734.  
  735.         if 1==0
  736. genedges
  737. ;vertex1,vertex2,crossed
  738.         ld hl,edges
  739.         ld bc,(nedges)
  740. genedges0
  741.         push bc
  742.         ld a,(nvertices)
  743.         ld c,a
  744.         call rnd
  745.         ld (hl),a
  746.         inc hl
  747.         ld a,(nvertices)
  748.         ld c,a
  749.         call rnd
  750.         ld (hl),a
  751.         inc hl
  752.         ld (hl),0 ;uncrossed
  753.         inc hl
  754.         pop bc
  755.         dec bc
  756.         ld a,b
  757.         or c
  758.         jr nz,genedges0
  759.         ret
  760.         endif
  761.  
  762. drawedges
  763. ;vertex1,vertex2,crossed
  764.         ld hl,edges
  765.         ld bc,(nedges)
  766. drawedges0
  767.         push bc
  768.         ld e,(hl)
  769.         inc hl
  770.         ld d,(hl)
  771.         inc hl
  772.         ld a,(hl)
  773.         push hl
  774. ;e=vertex1
  775. ;d=vertex2
  776. ;a=crossed
  777.         or a
  778.         ld a,COLORS_UNCROSSED;%11001001
  779.         jr z,$+4
  780.         ld a,COLORS_CROSSED;%11010010
  781.         call drawedge
  782.         pop hl
  783.         inc hl
  784.         pop bc
  785.         dec bc
  786.         ld a,b
  787.         or c
  788.         jr nz,drawedges0
  789.         ret
  790.  
  791. drawedge
  792. ;e=vertex1
  793. ;d=vertex2
  794. ;a=color
  795.         ex af,af'
  796.        ld a,d ;vertex2
  797.        ld d,0
  798.        ld hl,vertices
  799.        add hl,de
  800.        add hl,de
  801.        add hl,de
  802.        add hl,de
  803.        ld c,(hl)
  804.        inc hl
  805.        ld b,(hl) ;x
  806.        inc hl
  807.        ld e,(hl)
  808.        inc hl
  809.        ld d,(hl) ;y
  810.        push de
  811.  
  812.        ld d,0
  813.        ld e,a ;vertex2
  814.        ld hl,vertices
  815.        add hl,de
  816.        add hl,de
  817.        add hl,de
  818.        add hl,de
  819.  
  820.        pop de
  821.        ld a,(hl)
  822.        ld lx,a
  823.        inc hl
  824.        ld a,(hl) ;x2
  825.        ld hx,a
  826.        inc hl
  827.        ld a,(hl)
  828.        inc hl
  829.        ld h,(hl) ;y2
  830.        ld l,a
  831.  
  832.        ex af,af' ;color
  833. ;bc=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  834. ;de=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  835. ;ix=x2
  836. ;hl=y2
  837. ;a=color = %332103210
  838.         call shapes_line
  839.         ret
  840.  
  841. drawvertices
  842. ;x,X,y,Y
  843.         ld hl,vertices
  844.         ld a,(nvertices)
  845.         ld b,a
  846. drawvertices0
  847.         push bc
  848.         ld c,(hl)
  849.         inc hl
  850.         ld b,(hl) ;x
  851.         inc hl
  852.         ld e,(hl)
  853.         inc hl
  854.         ld d,(hl) ;y
  855.         inc hl
  856.         push hl
  857.         ld a,e ;y
  858.         ld h,b
  859.         ld l,c ;x
  860.         call drawringon;shapes_prarr_ring8c
  861.         pop hl
  862.         pop bc
  863.         djnz drawvertices0
  864.         ret
  865.  
  866. findvertex
  867. ;in: hl=arrx, a=arry
  868. ;out: CY=not found, or else a=vertex #
  869.         ex de,hl
  870.         ld c,a
  871. ;x,X,y,Y
  872.         ld hl,vertices
  873.         ld a,(nvertices)
  874.         ld b,a
  875. findvertex0
  876.         ld a,(hl)
  877.         inc hl
  878.         push hl
  879.         ld h,(hl)
  880.         ld l,a ;x
  881.         or a
  882.         sbc hl,de ;x-arrx
  883.         inc hl
  884.         inc hl
  885.         push de
  886.         ld de,5
  887.         or a
  888.         sbc hl,de ;CY = -2..+2
  889.         pop de
  890.         pop hl
  891.         inc hl
  892.         jr nc,findvertexno
  893.         push hl
  894.         ld a,(hl)
  895.         inc hl
  896.         ld h,(hl)
  897.         ld l,a ;y
  898.         push bc
  899.         xor a
  900.         ld b,a
  901.         sbc hl,bc ;y=arry
  902.         inc hl
  903.         inc hl
  904.         ld bc,5
  905.         or a
  906.         sbc hl,bc ;CY = -2..+2
  907.         pop bc
  908.         pop hl
  909.         jr c,findvertexok
  910. findvertexno
  911.         inc hl
  912.         inc hl
  913.         djnz findvertex0
  914.         scf
  915.         ret
  916. findvertexok
  917.         ld a,(nvertices)
  918.         sub b
  919.         or a
  920.         ret
  921.  
  922. rnd
  923. ;0..c-1
  924.         ;ld a,r
  925.         push de
  926.         push hl
  927.         call func_rnd
  928.         pop hl
  929.         pop de
  930. rnd0
  931.         sub c
  932.         jr nc,rnd0
  933.         add a,c
  934.         ret
  935.  
  936. func_rnd
  937. ;Patrik Rak
  938. rndseed1=$+1
  939.         ld  hl,0xA280   ; xz -> yw
  940. rndseed2=$+1
  941.         ld  de,0xC0DE   ; yw -> zt
  942.         ld  (rndseed1),de  ; x = y, z = w
  943.         ld  a,e         ; w = w ^ ( w << 3 )
  944.         add a,a
  945.         add a,a
  946.         add a,a
  947.         xor e
  948.         ld  e,a
  949.         ld  a,h         ; t = x ^ (x << 1)
  950.         add a,a
  951.         xor h
  952.         ld  d,a
  953.         rra             ; t = t ^ (t >> 1) ^ w
  954.         xor d
  955.         xor e
  956.         ld  h,l         ; y = z
  957.         ld  l,a         ; w = t
  958.         ld  (rndseed2),hl
  959.         ;ex de,hl
  960.         ;ld hl,0
  961.         ;res 7,c ;int
  962.         ret
  963.  
  964.  
  965. div4signedup
  966.         or a
  967.         jp m,$+5
  968.         add a,3
  969.         sra a
  970.         sra a
  971.         ret
  972.  
  973. cls
  974.         ld e,0
  975.         OS_CLS
  976.         ret
  977.  
  978. prtext
  979. ;bc=ъююЁфшэрЄ√
  980. ;hl=text
  981.         ld a,(hl)
  982.         or a
  983.         ret z
  984.         call prcharxy
  985.         inc hl
  986.         inc c
  987.         jr prtext
  988.  
  989. prnum
  990.         ld bc,1000
  991.         call prdig
  992.         ld bc,100
  993.         call prdig
  994.         ld bc,10
  995.         call prdig
  996.         ld bc,1
  997. prdig
  998.         ld a,'0'-1
  999. prdig0
  1000.         inc a
  1001.         or a
  1002.         sbc hl,bc
  1003.         jr nc,prdig0
  1004.         add hl,bc
  1005.         ;push hl
  1006.         ;call prchar
  1007.         ;pop hl
  1008.         ;ret
  1009. prchar
  1010. ;a=code
  1011. ;de=screen
  1012.         push de
  1013.         push hl
  1014.         call prcharin
  1015.         pop hl
  1016.         pop de
  1017.         inc e
  1018.         ret
  1019.        
  1020. calcscraddr
  1021. ;bc=yx
  1022. ;ьюцэю яюЁЄшЄ№ bc
  1023.         ex de,hl
  1024.         ld a,c ;x
  1025.         ld l,b ;y
  1026.         ld h,0
  1027.         ld b,h
  1028.         ld c,l
  1029.         add hl,hl
  1030.         add hl,hl
  1031.         add hl,bc ;*5
  1032.          add hl,hl
  1033.          add hl,hl
  1034.          add hl,hl ;*40
  1035.          add hl,hl
  1036.          add hl,hl
  1037.          add hl,hl
  1038.         add a,l
  1039.         ld l,a
  1040.         ld a,h
  1041.         adc a,0x80
  1042.         ld h,a
  1043.         ex de,hl
  1044.         ret
  1045.  
  1046. prtilexy
  1047. ;hl=tile
  1048. ;bc=yx
  1049.         push de
  1050.         push bc
  1051.         call calcscraddr
  1052.         call prcharin_go
  1053.         pop bc
  1054.         pop de
  1055.         ret
  1056.        
  1057. prcharxy
  1058. ;a=code
  1059. ;bc=yx
  1060.         push de
  1061.         push hl
  1062.         push bc
  1063.         push af
  1064.         call calcscraddr
  1065.         pop af
  1066.         call prcharin
  1067.         pop bc
  1068.         pop hl
  1069.         pop de
  1070.         ret
  1071.        
  1072. prcharin
  1073.         sub 32
  1074.         ld l,a
  1075.         ld h,0
  1076.          add hl,hl
  1077.          add hl,hl
  1078.          add hl,hl
  1079.          add hl,hl
  1080.          add hl,hl
  1081.         ;ld bc,font-(32*32)
  1082.         ;add hl,bc
  1083.         ld a,h
  1084.         add a,font/256
  1085.         ld h,a
  1086. prcharin_go
  1087.         ex de,hl
  1088.        
  1089.         ld bc,40
  1090.         push hl
  1091.         push hl
  1092.         dup 8
  1093.         ld a,(de) ;font
  1094.         ld (hl),a ;scr
  1095.         inc de
  1096.         add hl,bc
  1097.         edup
  1098.         pop hl
  1099.         set 6,h
  1100.         ;ld d,font/256
  1101.         dup 8
  1102.         ld a,(de) ;font
  1103.         ld (hl),a ;scr
  1104.         inc de
  1105.         add hl,bc
  1106.         edup
  1107.         pop hl
  1108.         set 5,h
  1109.         push hl
  1110.         ;ld d,font/256
  1111.         dup 8
  1112.         ld a,(de) ;font
  1113.         ld (hl),a ;scr
  1114.         inc de
  1115.         add hl,bc
  1116.         edup
  1117.         pop hl
  1118.         set 6,h
  1119.         ;ld d,font/256
  1120.         dup 8
  1121.         ld a,(de) ;font
  1122.         ld (hl),a ;scr
  1123.         inc de
  1124.         add hl,bc
  1125.         edup        
  1126.         ret
  1127.  
  1128. invpixel
  1129. ;bc=x (эх яюЁЄшЄё ) ;de
  1130. ;e=y (de эх яюЁЄшЄё ) ;c
  1131. ;lx=color = %33210210
  1132.        ;ld a,d;b
  1133.         ld l,e;c
  1134.         ;ld h,0
  1135.         ;ld d,scrbase/256/8 ;b
  1136.         ld h,scrbase/256/32
  1137.         add hl,hl
  1138.         add hl,hl
  1139.         add hl,de;bc
  1140.         add hl,hl
  1141.         add hl,hl
  1142.         add hl,hl ;y*40 + scrbase
  1143.        ;ld d,a;b,a
  1144. ;invpixel_cury
  1145. ;bc=x (эх яюЁЄшЄё );de
  1146. ;hl=addr(y)
  1147. ;lx=color = %33210210
  1148.         ld a,b;d
  1149.         rra
  1150.         ld a,c;e
  1151.         rra
  1152.         jr c,invpixel_r
  1153.         rra
  1154.         jr nc,$+4
  1155.         set 6,h
  1156.         rra
  1157.         jr nc,$+4
  1158.         set 5,h
  1159.         and %00111111
  1160.         add a,l
  1161.         ld l,a
  1162.         adc a,h
  1163.         sub l
  1164.         ld h,a
  1165. invpixel_color_l=$+1
  1166.         ld a,0;lx
  1167.         ;xor (hl)
  1168.         ;and %01000111 ;keep left pixel
  1169.         xor (hl) ;right pixel from screen
  1170.         ld (hl),a
  1171.         ret
  1172. invpixel_r
  1173.         rra
  1174.         jr nc,$+4
  1175.         set 6,h
  1176.         rra
  1177.         jr nc,$+4
  1178.         set 5,h
  1179.         and %00111111
  1180.         add a,l
  1181.         ld l,a
  1182.         adc a,h
  1183.         sub l
  1184.         ld h,a
  1185. invpixel_color_r=$+1
  1186.         ld a,0;lx
  1187.         ;xor (hl)
  1188.         ;and %10111000 ;keep right pixel
  1189.         xor (hl) ;left pixel from screen
  1190.         ld (hl),a
  1191.         ret
  1192.  
  1193. prpixel
  1194. ;de=x (эх яюЁЄшЄё )
  1195. ;c=y (bc эх яюЁЄшЄё )
  1196. ;[lx=color = %33210210]
  1197.        ;ld a,d;b
  1198.         ld l,e;c
  1199.         ;ld h,0
  1200.         ;ld d,scrbase/256/8 ;b
  1201.         ld h,scrbase/256/32
  1202.         add hl,hl
  1203.         add hl,hl
  1204.         add hl,de;bc
  1205.         add hl,hl
  1206.         add hl,hl
  1207.         add hl,hl ;y*40 + scrbase
  1208.        ;ld d,a;b,a
  1209. ;prpixel_cury
  1210. ;bc=x (эх яюЁЄшЄё );de
  1211. ;hl=addr(y)
  1212. ;lx=color = %33210210
  1213.         ld a,b;d
  1214.         rra
  1215.         ld a,c;e
  1216.         rra
  1217.         jr c,prpixel_r
  1218.         rra
  1219.         jr nc,$+4
  1220.         set 6,h
  1221.         rra
  1222.         jr nc,$+4
  1223.         set 5,h
  1224.         and %00111111
  1225.         add a,l
  1226.         ld l,a
  1227.         adc a,h
  1228.         sub l
  1229.         ld h,a
  1230. prpixel_color_l=$+1
  1231.         ld a,0;lx
  1232.         xor (hl)
  1233.         and %01000111 ;keep left pixel
  1234.         xor (hl) ;right pixel from screen
  1235.         ld (hl),a
  1236.         ret
  1237. prpixel_r
  1238.         rra
  1239.         jr nc,$+4
  1240.         set 6,h
  1241.         rra
  1242.         jr nc,$+4
  1243.         set 5,h
  1244.         and %00111111
  1245.         add a,l
  1246.         ld l,a
  1247.         adc a,h
  1248.         sub l
  1249.         ld h,a
  1250. prpixel_color_r=$+1
  1251.         ld a,0;lx
  1252.         xor (hl)
  1253.         and %10111000 ;keep right pixel
  1254.         xor (hl) ;left pixel from screen
  1255.         ld (hl),a
  1256.         ret
  1257.  
  1258. shapes_line
  1259. ;bc=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  1260. ;de=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  1261. ;ix=x2
  1262. ;hl=y2
  1263. ;a=color = %332103210
  1264.         ld (prpixel_color_l),a
  1265.         ld (prpixel_color_r),a
  1266.         ld ly,a
  1267.         and %01000111 ;keep left pixel
  1268.         ld (invpixel_color_l),a
  1269.         xor ly ;keep right pixel
  1270.         ld (invpixel_color_r),a
  1271.         or a
  1272.         sbc hl,de
  1273.         add hl,de
  1274.         jp p,shapes_line_noswap
  1275.         ex de,hl ;y <-> y2
  1276.         push ix
  1277.         push bc
  1278.         pop ix
  1279.         pop bc ;x <-> x2
  1280. shapes_line_noswap
  1281.         or a
  1282.         sbc hl,de ;dy >= 0
  1283.         push hl ;dy
  1284.         push ix
  1285.         pop hl
  1286.         sbc hl,bc
  1287.         push hl ;dx
  1288.         exx
  1289.         pop bc ;dx
  1290.         ld a,#03 ;inc bc
  1291.         jp p,shapes_line_nodec
  1292.         xor a
  1293.         sub c
  1294.         ld c,a
  1295.         sbc a,b
  1296.         sub c
  1297.         ld b,a ;dx >= 0
  1298.         ld a,#0b ;dec bc
  1299. shapes_line_nodec
  1300.         pop de ;dy
  1301. ;a=ъюф inc/dec bc
  1302. ;bc'=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  1303. ;de'=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  1304. ;bc=dx
  1305. ;de=dy
  1306.         ex de,hl
  1307.         or a
  1308.         sbc hl,bc
  1309.         add hl,bc
  1310.         ex de,hl
  1311.         jr nc,shapes_linever ;dy>=dx
  1312.         ld hy,b
  1313.         ld ly,c ;counter=dx
  1314.        
  1315. ;0x0000 -> 0x0101
  1316. ;0x0001 -> 0x0102
  1317. ;0x00ff -> 0x0100
  1318. ;0x0100 -> 0x0201
  1319.         inc ly
  1320.         inc hy
  1321.        
  1322.         ;inc iy ;inc hy ;Ёшёєхь, тъы■ўр  яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
  1323.         ld h,b
  1324.         ld l,c
  1325.         sra h
  1326.         rr l ;ym=dx div 2 ;TODO р хёыш dx<0?
  1327.          ;xor a
  1328.          ;sub l
  1329.          ;ld l,a
  1330.          ;sbc a,h
  1331.          ;sub l
  1332.          ;ld h,a ;mym=256-(dx div 2)
  1333.         exx
  1334.         ld (shapes_lineincx),a
  1335. ;bc=x
  1336. ;de=y
  1337. ;hl'=xm
  1338. ;bc'=dx
  1339. ;de'=dy
  1340. shapes_linehor0
  1341. pixelprochor=$+1
  1342.         call prpixel
  1343. shapes_lineincx=$
  1344.         inc bc ;x+1        
  1345.         exx
  1346.         ;add hl,de ;mym+dy
  1347.         or a
  1348.         sbc hl,de ;ym-dy
  1349.         exx
  1350.         jr nc,shapes_linehor1
  1351.         inc de ;y+1
  1352.         exx
  1353.         ;or a
  1354.         ;sbc hl,bc ;mym-dx
  1355.         add hl,bc ;ym+dx
  1356.         exx
  1357. shapes_linehor1
  1358.         dec ly
  1359.         jp nz,shapes_linehor0
  1360.         dec hy
  1361.         jp nz,shapes_linehor0
  1362.         ret
  1363. shapes_linever
  1364.         ld hy,d
  1365.         ld ly,e ;counter=dy
  1366.        
  1367. ;0x0000 -> 0x0101
  1368. ;0x0001 -> 0x0102
  1369. ;0x00ff -> 0x0100
  1370. ;0x0100 -> 0x0201
  1371.         inc ly
  1372.         inc hy
  1373.        
  1374.         ;inc iy ;inc hy ;Ёшёєхь, тъы■ўр  яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
  1375.         ld h,d
  1376.         ld l,e
  1377.         sra h
  1378.         rr l
  1379.          ;xor a
  1380.          ;sub l
  1381.          ;ld l,a
  1382.          ;sbc a,h
  1383.          ;sub l
  1384.          ;ld h,a ;mxm=256-(dy div 2)
  1385.         exx
  1386.         ld (shapes_lineincx2),a
  1387. ;bc=x
  1388. ;de=y
  1389. ;hl'=xm
  1390. ;bc'=dx
  1391. ;de'=dy
  1392. shapes_linever0
  1393. pixelprocver=$+1
  1394.         call prpixel
  1395.         inc de ;y+1
  1396.         exx
  1397.         ;add hl,bc ;mxm+dx
  1398.         or a
  1399.         sbc hl,bc ;xm-dx ;TODO р хёыш dx<0?
  1400.         exx
  1401.         jr nc,shapes_linever1
  1402. shapes_lineincx2=$
  1403.         inc bc ;x+1
  1404.         exx
  1405.         ;or a
  1406.         ;sbc hl,de ;mxm-dy
  1407.         add hl,de ;xm+dy
  1408.         exx
  1409. shapes_linever1
  1410.         dec ly
  1411.         jp nz,shapes_linever0
  1412.         dec hy
  1413.         jp nz,shapes_linever0
  1414.         ret
  1415.  
  1416.  
  1417.         macro cols data
  1418. _l=data/16
  1419. _r=data&15
  1420.         db ((_r&8)<<4) + ((_r&7)<<3) + ((_l&8)<<3) + (_l&7)
  1421.         endm
  1422.        
  1423.         macro cols8 d0,d1,d2,d3,d4,d5,d6,d7
  1424.         cols d0
  1425.         cols d1
  1426.         cols d2
  1427.         cols d3
  1428.         cols d4
  1429.         cols d5
  1430.         cols d6
  1431.         cols d7
  1432.         endm
  1433.  
  1434. endtext
  1435.         db "GAME OVER!",0
  1436.  
  1437. oldupdtimer
  1438.         dw 0
  1439.  
  1440.         align 256
  1441. font
  1442.         incbin "fontgfx"
  1443.  
  1444. genmesh
  1445.         xor a
  1446.         ld (nvertices),a
  1447.         ld (nvertices2),a
  1448.         ld (curmeshvertex),a
  1449.         ld hl,0
  1450.         ld (nedges),hl
  1451.         ;ld (ncrossededges),hl
  1452.         ld (genmeshedge_old),hl ;эхтючьюцэюх ЁхсЁю
  1453. ;ёючфрЄ№ Ё ф шч 2 Єюўхъ (шыш ыєў°х шч sqrt(verticesneeded)) ё Ё╕сЁрьш ьхцфє эшьш:
  1454.         ld (genmeshx),hl
  1455.         ld (genmeshy),hl
  1456.         call genmeshvertex ;in verlist2
  1457.         ld hl,(verticesneeded)
  1458.         ld h,0
  1459.         call sqrt
  1460.         ld b,d ;сєфхЄ юфэр ыш°э   ётхЁї sqrt
  1461. genmeshfirstrow0
  1462.         push bc
  1463.         call newedgeinlist2 ;Ўхяы хь эютюх ЁхсЁю т vertlist2
  1464.         pop bc
  1465.         djnz genmeshfirstrow0
  1466.  
  1467.         call copyvertlist2to1
  1468.        
  1469. genmeshrows0
  1470. ;эрўшэрхь ёыхфє■∙шщ Ё ф
  1471.         ld hl,(genmeshy)
  1472.         ld bc,25
  1473.         add hl,bc
  1474.         ld (genmeshy),hl
  1475.         ld hl,0
  1476.         ld (genmeshx),hl
  1477.         xor a
  1478.         ld (curopenvertinlist1),a
  1479.         ld (nvertices2),a
  1480. ;ёэрўрыр Ўхяы хь ъ яхЁтющ юЄъЁ√Єющ Єюўъх ЁхсЁю
  1481. ;.    .    .    .
  1482. ;|    ^Єхъє∙р  юЄъЁ√Єр  Єюўър
  1483. ;* Єхъє∙р  Ўхяы хьр  Єюўър
  1484.         ld a,(nvertices)
  1485.         push af
  1486.         call genmeshvertex ;in verlist2
  1487.         pop af ;эютр  Єюўър
  1488.         ld (curmeshvertex),a
  1489.         call linktoopenvertex
  1490.        
  1491. genmeshrow00
  1492.         call func_rnd
  1493.         cp 128
  1494. ;хёыш rnd>0.?, Єю ёючфр╕ь ЁхсЁю ш Ўшъышьё  чфхё№, шэрўх Ўхяы хь яюёыхфэхх ЁхсЁю чр ёыхфє■∙є■ юЄъЁ√Єє■ Єюўъє
  1495. ;TODO тхЁю ЄэюёЄ№ яюёЄртшЄ№ т ёююЄтхЄёЄтшх ё ўшёыюь nvertices2 - хёыш ёшы№эю ьхэ№°х, ўхь эрфю, Єю эрфю ухэхЁшЄ№ Ё╕сЁр
  1496. ;.   .    .    .
  1497. ;|_\/
  1498.  
  1499. ;.    .    .    .
  1500. ;|_\__|
  1501.  
  1502. ;.    .    .    .
  1503. ;|_\_.__\
  1504. ;        * Єхъє∙р  Ўхяы хьр  Єюўър
  1505. ;ш Єръ яюър эх ъюэўрЄё  юЄъЁ√Є√х Єюўъш
  1506.         jr c,genmesh_nextopenvert
  1507.         call newedgeinlist2 ;Ўхяы хь эютюх ЁхсЁю т vertlist2        
  1508.         ld a,(nvertices)
  1509.         ld hl,verticesneeded
  1510.         cp (hl)
  1511.         jr nc,genmesh_finishlastvertex;jp nc,linktoopenvertex ;ёухэхЁшыш Єюўхъ ёЄюы№ъю, ёъюы№ъю яЁюёшыш
  1512. ;ё эхъюЄюЁющ тхЁю ЄэюёЄ№■ Ўхяы хь ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх
  1513.         call func_rnd
  1514.         cp 128
  1515.         call c,linktoopenvertex
  1516.         jr genmeshrow00
  1517. genmesh_finishlastvertex
  1518. ;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх (фрцх ъю тёхь юЄъЁ√Є√ь фю ъюэЎр! шэрўх яЁш 2 Ё фрї ьюцхЄ юёЄрЄ№ё  їтюёЄ т тхЁїэхь Ё фє) ш т√їюфшь
  1519. genmesh_finishlastvertex0
  1520.         call linktoopenvertex ;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх
  1521.         ld de,curopenvertinlist1
  1522.         ld a,(de)
  1523.         inc a
  1524.         ld hl,nvertices1
  1525.         cp (hl)
  1526.         ret nc ;сюы№°х эхЄ юЄъЁ√Є√ї Єюўхъ - чрърэўштрхь
  1527.         ld (de),a
  1528.         jr genmesh_finishlastvertex0
  1529.  
  1530. genmesh_nextopenvert
  1531. ;яхЁхїюфшь ъ ёыхфє■∙хщ юЄъЁ√Єющ Єюўъх, хёыш юэр хёЄ№, ш Ўхяы хь ъ эхщ ЁхсЁю
  1532.         ld de,curopenvertinlist1
  1533.         ld a,(de)
  1534.         inc a
  1535.         ld hl,nvertices1
  1536.         cp (hl)
  1537.         jr nc,genmesh_rowend ;сюы№°х эхЄ юЄъЁ√Є√ї Єюўхъ - чрърэўштрхь Ё ф
  1538.         ld (de),a
  1539.         call linktoopenvertex ;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ юЄъЁ√Єющ Єюўъх
  1540.         jr genmeshrow00
  1541. genmesh_rowend
  1542.         call linktoopenvertex ;Ўхяы хь ЁхсЁю ъ Єхъє∙хщ (яюёыхфэхщ) юЄъЁ√Єющ Єюўъх
  1543. ;Ё ф юЄъЁ√Є√ї Єюўхъ чрьхэшЄ№ эют√ь
  1544.         call copyvertlist2to1
  1545.         jr genmeshrows0
  1546.  
  1547. newedgeinlist2
  1548. ;Ўхяы хь эютюх ЁхсЁю т vertlist2
  1549.         ld a,(nvertices)
  1550.         push af
  1551.         call genmeshvertex ;in verlist2
  1552.         ld a,(curmeshvertex)
  1553.         ld e,a ;Єхъє∙р  Ўхяы хьр  Єюўър
  1554.         pop af ;эютр  Єюўър
  1555.         ld (curmeshvertex),a
  1556.         ld d,a
  1557.         jp genmeshedge
  1558.  
  1559. linktoopenvertex
  1560. curmeshvertex=$+1
  1561.         ld d,0 ;эюьхЁ Єюўъш, ъюЄюЁє■ эрфю яЁшЎхяшЄ№
  1562. curopenvertinlist1=$+1
  1563.         ld a,0
  1564.         ld hl,vertlist1
  1565.         add a,l
  1566.         ld l,a
  1567.         adc a,h
  1568.         sub l
  1569.         ld h,a
  1570.         ld e,(hl) ;Єхъє∙р  юЄъЁ√Єр  Єюўър
  1571.         jp genmeshedge
  1572.  
  1573. genmeshvertex
  1574. ;in verlist2
  1575. genmeshx=$+1
  1576.         ld bc,0
  1577. genmeshy=$+1
  1578.         ld de,0
  1579.        
  1580.         if 1==0
  1581.         push bc
  1582.         ld c,160
  1583.         call rnd
  1584.         add a,a
  1585.         ld a,a
  1586.         ld a,0
  1587.         rl a
  1588.         ld c,200
  1589.         call rnd
  1590.         ld a,a
  1591.         ld a,0
  1592.         pop bc
  1593.         else
  1594.         ld c,160
  1595.         call rnd
  1596.         add a,a
  1597.         ld c,a
  1598.         ld b,0
  1599.         rl b
  1600.         push bc
  1601.         ld c,200-8
  1602.         call rnd
  1603.         add a,8
  1604.         ld e,a
  1605.         ld d,0
  1606.         pop bc
  1607.         endif
  1608. ;bc=x
  1609. ;de=y
  1610.         ld a,(nvertices2)
  1611.         ld hl,vertlist2
  1612.         add a,l
  1613.         ld l,a
  1614.         adc a,h
  1615.         sub l
  1616.         ld h,a
  1617.         ld a,(nvertices)
  1618.         ld (hl),a
  1619.         ld l,a
  1620.         ld h,0
  1621.         add hl,hl
  1622.         add hl,hl
  1623.         push bc
  1624.         ld bc,vertices
  1625.         add hl,bc
  1626.         pop bc
  1627.         ld (hl),c
  1628.         inc hl
  1629.         ld (hl),b ;x
  1630.         inc hl
  1631.         ld (hl),e
  1632.         inc hl
  1633.         ld (hl),d ;y
  1634.         ld hl,nvertices
  1635.         inc (hl)
  1636.         ld hl,nvertices2
  1637.         inc (hl)
  1638.         ld hl,(genmeshx)
  1639.         ld bc,24
  1640.         add hl,bc
  1641.         ld (genmeshx),hl
  1642.         ret
  1643.        
  1644. copyvertlist2to1
  1645.         ld hl,vertlist2
  1646.         ld de,vertlist1
  1647.         ld bc,MAXVERTICES
  1648.         ldir
  1649.         ld a,(nvertices2)
  1650.         ld (nvertices1),a
  1651.         ret
  1652.        
  1653. genmeshedge
  1654. ;d=vertex1
  1655. ;e=vertex2
  1656. ;яЁютхЁшь, ўЄю ь√ єцх эх яЁшЎхяшыш ¤Єю ЁхсЁю
  1657. genmeshedge_old=$+1
  1658.         ld hl,0
  1659.         or a
  1660.         sbc hl,de
  1661.         ld (genmeshedge_old),de
  1662.         ret z
  1663.         ld bc,(nedges)
  1664.         ld hl,edges
  1665.         add hl,bc
  1666.         add hl,bc
  1667.         add hl,bc
  1668.         ld (hl),d
  1669.         inc hl
  1670.         ld (hl),e
  1671.         dec hl
  1672. ;check if this edge crossed with something, mark crossing here and there
  1673.         ld bc,(nedges)
  1674.         call checkcrossedwith_oldedges
  1675.         ld hl,(nedges)
  1676.         inc hl
  1677.         ld (nedges),hl
  1678.         ret
  1679.  
  1680.         if 1==0
  1681. countcrossededges
  1682. ;яЁютхЁ хь яхЁхёхўхэшх тёхї ёю тёхьш
  1683.         ;ld hl,0
  1684.         ;ld (ncrossededges),hl
  1685.         ld hl,edges
  1686.         ld bc,(nedges)
  1687. initcrossededges0
  1688.         inc hl
  1689.         inc hl
  1690.         ld (hl),0 ;uncrossed
  1691.         inc hl
  1692.         dec bc
  1693.         ld a,b
  1694.         or c
  1695.         jr nz,initcrossededges0
  1696.        
  1697.         ld hl,edges
  1698.         ld bc,(nedges)
  1699.         ld de,0 ;counter (+1)
  1700. countcrossededges0
  1701.         push bc
  1702.         push de
  1703.         push hl
  1704.         ld b,d
  1705.         ld c,e
  1706.         call checkcrossedwith_oldedges
  1707.         pop hl
  1708.         inc hl
  1709.         inc hl
  1710.         inc hl
  1711.         pop de
  1712.         pop bc
  1713.         inc de
  1714.         dec bc
  1715.         ld a,b
  1716.         or c
  1717.         jr nz,countcrossededges0
  1718.         ret
  1719.         endif
  1720.  
  1721. inccrossededges
  1722.         ld (inccrossededges_proc),hl
  1723. ;фы  ърцфюую шч ёт чрээ√ї Ё╕схЁ шэъЁхьхэЄшЁєхь/фхъЁхьхэЄшЁєхь тёх яхЁхёхўхэш  (є эхую ш є яхЁхёхў╕ээюую)
  1724.         ld hl,edges
  1725.         ld bc,(nedges)
  1726. inccrossededges0
  1727. ;ш∙хь ёт чрээ√х Ё╕сЁр
  1728.         ld e,(hl)
  1729.         inc hl
  1730.         ld d,(hl)
  1731.         dec hl
  1732. ;e=vertex1
  1733. ;d=vertex2
  1734.         ld a,(curvertex)
  1735.         cp d
  1736.         jr z,inccrossededgesok
  1737.         cp e
  1738.         jr nz,inccrossededgesno
  1739. inccrossededgesok
  1740. ;эр°ыш ёт чрээюх ЁхсЁю, ш∙хь тёх хую яхЁхёхўхэш  (яю тёхь Ё╕сЁрь, ъЁюьх ёрьюую ёхс ) ш шї шэъЁхьхэЄшЁєхь (ш є ёхс  Єюцх)
  1741.         push bc
  1742.         push hl
  1743.         ld (inccrossededges_selfaddr),hl
  1744.         ld hl,edges
  1745.         ld bc,(nedges)
  1746. inccrossededges00
  1747. inccrossededges_selfaddr=$+1
  1748.         ld de,0
  1749.         or a
  1750.         sbc hl,de
  1751.         add hl,de
  1752.         jr z,inccrossededges00_skipself
  1753.         push bc
  1754. ;hl=edge1addr
  1755. ;de=edge2addr
  1756.         push hl
  1757.         call checkcrossed_edge ;out: CY=crossed
  1758.         pop hl
  1759. inccrossededges_proc=$+1
  1760.         call c,inccrossedandself
  1761.         pop bc
  1762. inccrossededges00_skipself
  1763.         inc hl
  1764.         inc hl
  1765.         inc hl
  1766.         dec bc
  1767.         ld a,b
  1768.         or c
  1769.         jr nz,inccrossededges00
  1770. ;ъюэхЎ юсЁрсюЄъш ёт чрээюую ЁхсЁр
  1771.         pop hl
  1772.         pop bc
  1773. inccrossededgesno
  1774.         inc hl
  1775.         inc hl
  1776.         inc hl
  1777.         dec bc
  1778.         ld a,b
  1779.         or c
  1780.         jr nz,inccrossededges0
  1781.         ret
  1782. inccrossedandself
  1783.         push hl
  1784.         inc hl
  1785.         inc hl
  1786.         inc (hl)
  1787.         ld hl,(inccrossededges_selfaddr)
  1788.         inc hl
  1789.         inc hl
  1790.         inc (hl)
  1791.         pop hl
  1792.         ret
  1793. deccrossedandself
  1794.         push hl
  1795.         inc hl
  1796.         inc hl
  1797.         dec (hl)
  1798.         ld hl,(inccrossededges_selfaddr)
  1799.         inc hl
  1800.         inc hl
  1801.         dec (hl)
  1802.         pop hl
  1803.         ret
  1804.  
  1805. checkcrossedwith_oldedges
  1806. ;hl=edge to check
  1807. ;bc=nedges before current edge
  1808.         ;inc hl
  1809.         ;inc hl
  1810.         ;ld (hl),0
  1811.         ;dec hl
  1812.         ;dec hl
  1813.         ld de,edges
  1814.         ld a,b
  1815.         or c
  1816.         ret z;jr z,genmeshedge_nocheckcrossed
  1817. ;bc=was nedges
  1818. genmeshedge_checkcrossed0
  1819.         push bc
  1820.         push de
  1821.         push hl
  1822.         call checkcrossed_edge
  1823.         pop hl
  1824.         pop de
  1825.         pop bc
  1826.         inc de
  1827.         inc de
  1828.         jr nc,genmeshedge_nocrossed
  1829.         ld a,(de)
  1830.         inc a
  1831.         ld (de),a
  1832.         inc hl
  1833.         inc hl
  1834.         inc (hl)
  1835.         dec hl
  1836.         dec hl
  1837. genmeshedge_nocrossed
  1838.         inc de
  1839.         dec bc
  1840.         ld a,b
  1841.         or c
  1842.         jr nz,genmeshedge_checkcrossed0
  1843. ;genmeshedge_nocheckcrossed
  1844.         ret
  1845.  
  1846. checkcrossed_edge
  1847. ;hl=edge1addr
  1848. ;de=edge2addr
  1849. ;out: CY=crossed
  1850. ;фы  эрф╕цэюёЄш ёфхырхь hl>=de тёхуфр (яюїюцх, ЄхёЄ эхъюььєЄрЄштэ√щ т Ёхфъшї ёыєўр ї)
  1851.         or a
  1852.         sbc hl,de
  1853.         add hl,de
  1854.         jr nc,$+3
  1855.         ex de,hl
  1856.  
  1857. ;хёыш A=C шыш A=D шыш B=C шыш B=D, Єю эхяхЁхёхўхэшх (яЁшь√ърэшх) - эрфю яЁютхЁ Є№ эх ъююЁфшэрЄ√, р эюьхЁр тхЁ°шэ!!!
  1858.         ld a,(de)
  1859.         cp (hl)
  1860.         ret z ;яЁшь√ърэшх
  1861.         inc hl
  1862.         cp (hl)
  1863.         ret z ;яЁшь√ърэшх
  1864.         inc de
  1865.         ld a,(de)
  1866.         cp (hl)
  1867.         ret z ;яЁшь√ърэшх
  1868.         dec hl
  1869.         cp (hl)
  1870.         ret z ;яЁшь√ърэшх
  1871.  
  1872.         ld c,(hl) ;edge1vertex1
  1873.         inc hl
  1874.         ld a,(hl) ;edge1vertex2
  1875.         ld b,0
  1876.         ld hl,vertices
  1877.         add hl,bc
  1878.         add hl,bc
  1879.         add hl,bc
  1880.         add hl,bc
  1881.         ld c,(hl)
  1882.         inc hl
  1883.         ld b,(hl)
  1884.         ld (checkxA),bc
  1885.         inc hl
  1886.         ld c,(hl)
  1887.         inc hl
  1888.         ld b,(hl)
  1889.         ld (checkyA),bc
  1890.         ld c,a ;edge1vertex2
  1891.         ld b,0
  1892.         ld hl,vertices
  1893.         add hl,bc
  1894.         add hl,bc
  1895.         add hl,bc
  1896.         add hl,bc
  1897.         ld c,(hl)
  1898.         inc hl
  1899.         ld b,(hl)
  1900.         ld (checkxB),bc
  1901.         inc hl
  1902.         ld c,(hl)
  1903.         inc hl
  1904.         ld b,(hl)
  1905.         ld (checkyB),bc
  1906.        
  1907.         ex de,hl
  1908.  
  1909.         ld a,(hl) ;edge2vertex2
  1910.         dec hl
  1911.         ld c,(hl) ;edge2vertex1
  1912.         ld b,0
  1913.         ld hl,vertices
  1914.         add hl,bc
  1915.         add hl,bc
  1916.         add hl,bc
  1917.         add hl,bc
  1918.         ld c,(hl)
  1919.         inc hl
  1920.         ld b,(hl)
  1921.         ld (checkxC),bc
  1922.         inc hl
  1923.         ld c,(hl)
  1924.         inc hl
  1925.         ld b,(hl)
  1926.         ld (checkyC),bc
  1927.         ld c,a ;edge2vertex2
  1928.         ld b,0
  1929.         ld hl,vertices
  1930.         add hl,bc
  1931.         add hl,bc
  1932.         add hl,bc
  1933.         add hl,bc
  1934.         ld c,(hl)
  1935.         inc hl
  1936.         ld b,(hl)
  1937.         ld (checkxD),bc
  1938.         inc hl
  1939.         ld c,(hl)
  1940.         inc hl
  1941.         ld b,(hl)
  1942.         ld (checkyD),bc
  1943.        
  1944. ;яЁютхЁър яхЁхёхўхэш  AB ш CD
  1945. ;яЁютхЁшЄ№ юфшэръютє■ ыхтюёЄ№ (чэръ тхъЄюЁэюую яЁюшчтхфхэш  фтєї ёЄюЁюэ) ЄЁхєуюы№эшъют ABC ш BCD. ┼ёыш юфшэръютр , Єю яхЁхёхўхэшх.
  1946. ;╦юцэюх ёЁрсрЄ√трэшх! ╧ю¤Єюьє хёыш ыхтюёЄ№ юфшэръютр , эрфю яЁютхЁшЄ№ х∙╕ ыхтюёЄ№ DBA - хёыш Єрър  цх, Єю яхЁхёхўхэшх.
  1947. ;ыюцэюх ёЁрсрЄ√трэшх яЁш ярыъх B,A эрф CD ;яЁютхЁ хь DCA
  1948. ;╩ръ яЁш ¤Єюь урЁрэЄшЁютрЄ№ [0..1]?
  1949. ;┼ёыш (A=C ш B=D) шыш (B=C ш A=D), Єю яхЁхёхўхэшх (ўЄюс√ эх т√шуЁ√трыш ьхЄюфюь эрыюцхэш  юЄЁхчъют)
  1950.         if 1==1
  1951.         ld hl,(checkxA)
  1952.         ld de,(checkxC)
  1953.         or a
  1954.         sbc hl,de
  1955.         jr nz,checkcrossed_noAC
  1956.         ld hl,(checkyA)
  1957.         ld de,(checkyC)
  1958.         or a
  1959.         sbc hl,de
  1960.         jr nz,checkcrossed_noAC
  1961.         ld hl,(checkxB)
  1962.         ld de,(checkxD)
  1963.         or a
  1964.         sbc hl,de
  1965.         jr nz,checkcrossed_noAC
  1966.         ld hl,(checkyB)
  1967.         ld de,(checkyD)
  1968.         or a
  1969.         sbc hl,de
  1970.         scf
  1971.         ret z ;яхЁхёхўхэшх
  1972. checkcrossed_noAC
  1973.         ld hl,(checkxB)
  1974.         ld de,(checkxC)
  1975.         or a
  1976.         sbc hl,de
  1977.         jr nz,checkcrossed_noBC
  1978.         ld hl,(checkyB)
  1979.         ld de,(checkyC)
  1980.         or a
  1981.         sbc hl,de
  1982.         jr nz,checkcrossed_noBC
  1983.         ld hl,(checkxA)
  1984.         ld de,(checkxD)
  1985.         or a
  1986.         sbc hl,de
  1987.         jr nz,checkcrossed_noBC
  1988.         ld hl,(checkyA)
  1989.         ld de,(checkyD)
  1990.         or a
  1991.         sbc hl,de
  1992.         scf
  1993.         ret z ;яхЁхёхўхэшх
  1994. checkcrossed_noBC
  1995.         endif
  1996.        
  1997. ;хёыш A=C шыш A=D шыш B=C шыш B=D, Єю эхяхЁхёхўхэшх (яЁшь√ърэшх) - эрфю яЁютхЁ Є№ эх ъююЁфшэрЄ√, р эюьхЁр тхЁ°шэ!!! яю¤Єюьє єсЁрэю ЄєЄ, ёь. т√°х
  1998.         if 1==0
  1999.         ld hl,(checkxA)
  2000.         ld de,(checkxC)
  2001.         or a
  2002.         sbc hl,de
  2003.         jr nz,checkcrossed_noACcommon
  2004.         ld hl,(checkyA)
  2005.         ld de,(checkyC)
  2006.         or a
  2007.         sbc hl,de
  2008.         ret z ;яЁшь√ърэшх
  2009. checkcrossed_noACcommon
  2010.         ld hl,(checkxA)
  2011.         ld de,(checkxD)
  2012.         or a
  2013.         sbc hl,de
  2014.         jr nz,checkcrossed_noADcommon
  2015.         ld hl,(checkyA)
  2016.         ld de,(checkyD)
  2017.         or a
  2018.         sbc hl,de
  2019.         ret z ;яЁшь√ърэшх
  2020. checkcrossed_noADcommon
  2021.         ld hl,(checkxB)
  2022.         ld de,(checkxC)
  2023.         or a
  2024.         sbc hl,de
  2025.         jr nz,checkcrossed_noBCcommon
  2026.         ld hl,(checkyB)
  2027.         ld de,(checkyC)
  2028.         or a
  2029.         sbc hl,de
  2030.         ret z ;яЁшь√ърэшх
  2031. checkcrossed_noBCcommon
  2032.         ld hl,(checkxB)
  2033.         ld de,(checkxD)
  2034.         or a
  2035.         sbc hl,de
  2036.         jr nz,checkcrossed_noBDcommon
  2037.         ld hl,(checkyB)
  2038.         ld de,(checkyD)
  2039.         or a
  2040.         sbc hl,de
  2041.         ret z ;яЁшь√ърэшх
  2042. checkcrossed_noBDcommon
  2043.         endif
  2044.         ;or a
  2045.         ;ret
  2046.        
  2047. ;шэрўх ёўшЄрхь ьрЄхьрЄшъє
  2048.         ld hl,(checkxA)
  2049.         ld (trix1),hl
  2050.         ld hl,(checkxB)
  2051.         ld (trix2),hl
  2052.         ld hl,(checkxC)
  2053.         ld (trix3),hl
  2054.         ld hl,(checkyA)
  2055.         ld (triy1),hl
  2056.         ld hl,(checkyB)
  2057.         ld (triy2),hl
  2058.         ld hl,(checkyC)
  2059.         ld (triy3),hl
  2060.         call checktriangle ;ABC
  2061.        
  2062.         if 1==1
  2063.         sbc a,a
  2064.         push hl
  2065.         push af
  2066.         ld hl,(checkxD)
  2067.         ld (trix1),hl
  2068.         ld hl,(checkyD)
  2069.         ld (triy1),hl
  2070.         call checktriangle ;DBC
  2071.         sbc a,a
  2072.         pop bc
  2073.         pop de
  2074.         xor b
  2075.         ret nz ;Ёрчэр  ыхтюёЄ№ - эхЄ яхЁхёхўхэш 
  2076.         ld a,h
  2077.         or l
  2078.         or d
  2079.         or e
  2080.         jr z,checkcrossed_collinear ;тёх 4 эр юфэющ ышэшш - юЄфхы№эр  яЁютхЁър
  2081.         push bc
  2082.         ld hl,(checkxA)
  2083.         ld (trix3),hl
  2084.         ld hl,(checkyA)
  2085.         ld (triy3),hl
  2086.         call checktriangle ;DBA
  2087.         sbc a,a
  2088.         pop bc
  2089.         xor b
  2090.         ret nz ;Ёрчэр  ыхтюёЄ№ - эхЄ яхЁхёхўхэш 
  2091. ;ыюцэюх ёЁрсрЄ√трэшх яЁш ярыъх B,A эрф CD
  2092. ;яЁютхЁ хь DCA
  2093.         push bc
  2094.         ld hl,(checkxC)
  2095.         ld (trix2),hl
  2096.         ld hl,(checkyC)
  2097.         ld (triy2),hl
  2098.         call checktriangle ;DCA
  2099.         sbc a,a
  2100.         pop bc
  2101.         xor b
  2102.         rla
  2103.         ccf
  2104.         ret ;юфшэръютр  ыхтюёЄ№ - хёЄ№ яхЁхёхўхэшх
  2105.  
  2106.         else
  2107.        
  2108.         push hl
  2109.         ld hl,(checkxD)
  2110.         ld (trix1),hl
  2111.         ld hl,(checkyD)
  2112.         ld (triy1),hl
  2113.         call checktriangle ;DBC
  2114.         pop de
  2115.         ld a,h
  2116.         xor d
  2117.         rla
  2118.         ccf
  2119.         ret nc ;Ёрчэр  ыхтюёЄ№ - эхЄ яхЁхёхўхэш 
  2120.         push hl
  2121.         ld hl,(checkxA)
  2122.         ld (trix3),hl
  2123.         ld hl,(checkyA)
  2124.         ld (triy3),hl
  2125.         call checktriangle ;DBA
  2126.         pop bc
  2127.         ld a,h
  2128.         xor b
  2129.         rla
  2130.         ccf
  2131.         ret nc ;Ёрчэр  ыхтюёЄ№ - эхЄ яхЁхёхўхэш 
  2132.         ld a,h
  2133.         or l
  2134.         or d
  2135.         or e
  2136.         jr z,checkcrossed_collinear ;яыю∙рф№ DBC = 0 - юЄфхы№эр  яЁютхЁър
  2137. ;ыюцэюх ёЁрсрЄ√трэшх яЁш ярыъх B,A эрф CD
  2138. ;яЁютхЁ хь DCA
  2139.         push hl
  2140.         ld hl,(checkxC)
  2141.         ld (trix2),hl
  2142.         ld hl,(checkyC)
  2143.         ld (triy2),hl
  2144.         call checktriangle ;DCA
  2145.         pop de
  2146.         ld a,h
  2147.         xor d
  2148.         rla
  2149.         ccf
  2150.         ret ;юфшэръютр  ыхтюёЄ№ - хёЄ№ яхЁхёхўхэшх
  2151.         endif
  2152.        
  2153. checkcrossed_collinear
  2154. ;юЄЁхчъш эр юфэющ яЁ ьющ
  2155. ;юЄфхы№эю яЁютхЁшЄ№, ўЄю юЄЁхчъш ыхцрЄ фЁєу эр фЁєух (Ёрэ№°х яыю∙рфш 0 ёўшЄрышё№ ъръ эхяхЁхёхўхэшх)
  2156. ;эрщЄш ёрьє■ сюы№°є■ юё№ (max-min)
  2157.         ld hl,(checkxA)
  2158.         ld bc,(checkxB)
  2159.         call minhl_bc_tobc
  2160.         ld (checkxminAB),bc
  2161.         push bc
  2162.         ld hl,(checkxC)
  2163.         ld bc,(checkxD)
  2164.         call minhl_bc_tobc
  2165.         ld (checkxminCD),bc
  2166.         pop hl
  2167.         call minhl_bc_tobc
  2168. ;bc=minx
  2169.         ld hl,(checkxA)
  2170.         ld de,(checkxB)
  2171.         call maxhl_de_tode
  2172.         ld (checkxmaxAB),de
  2173.         push de
  2174.         ld hl,(checkxC)
  2175.         ld de,(checkxD)
  2176.         call maxhl_de_tode
  2177.         ld (checkxmaxCD),de
  2178.         pop hl
  2179.         call maxhl_de_tode
  2180. ;de=maxx
  2181.         ex de,hl
  2182.         or a
  2183.         sbc hl,bc
  2184.         push hl ;maxx-minx
  2185.  
  2186.         ld hl,(checkyA)
  2187.         ld bc,(checkyB)
  2188.         call minhl_bc_tobc
  2189.         ld (checkyminAB),bc
  2190.         push bc
  2191.         ld hl,(checkyC)
  2192.         ld bc,(checkyD)
  2193.         call minhl_bc_tobc
  2194.         ld (checkyminCD),bc
  2195.         pop hl
  2196.         call minhl_bc_tobc
  2197. ;bc=miny
  2198.         ld hl,(checkyA)
  2199.         ld de,(checkyB)
  2200.         call maxhl_de_tode
  2201.         ld (checkymaxAB),de
  2202.         push de
  2203.         ld hl,(checkyC)
  2204.         ld de,(checkyD)
  2205.         call maxhl_de_tode
  2206.         ld (checkymaxCD),de
  2207.         pop hl
  2208.         call maxhl_de_tode
  2209. ;de=maxy
  2210.         ex de,hl
  2211.         or a
  2212.         sbc hl,bc ;maxy-miny
  2213.        
  2214.         pop de ;maxx-minx
  2215.        
  2216. ;хёыш эхЄ яхЁхёхўхэш , Єю фюыцэю с√Є№ max(A,B)<min(C,D) шыш max(C,D)<min(A,B)
  2217.         or a
  2218.         sbc hl,de ;NC: ЁрчсЁюё яю y >= ЁрчсЁюё яю x, схЁ╕ь y
  2219.         jr nc,checkcrossed_collinear_y
  2220. ;ЁрчсЁюё яю y < ЁрчсЁюё яю x, схЁ╕ь x
  2221. checkxmaxAB=$+1
  2222.         ld hl,0
  2223. checkxminCD=$+1
  2224.         ld de,0
  2225.         or a
  2226.         sbc hl,de
  2227.         ccf
  2228.         ret nc ;эхЄ яхЁхёхўхэш 
  2229. checkxmaxCD=$+1
  2230.         ld hl,0
  2231. checkxminAB=$+1
  2232.         ld de,0
  2233.         or a
  2234.         sbc hl,de
  2235.         ccf
  2236.         ret
  2237. checkcrossed_collinear_y
  2238. ;ЁрчсЁюё яю y >= ЁрчсЁюё яю x, схЁ╕ь y
  2239. checkymaxAB=$+1
  2240.         ld hl,0
  2241. checkyminCD=$+1
  2242.         ld de,0
  2243.         or a
  2244.         sbc hl,de
  2245.         ccf
  2246.         ret nc ;эхЄ яхЁхёхўхэш 
  2247. checkymaxCD=$+1
  2248.         ld hl,0
  2249. checkyminAB=$+1
  2250.         ld de,0
  2251.         or a
  2252.         sbc hl,de
  2253.         ccf
  2254.         ret
  2255.  
  2256. minhl_bc_tobc
  2257.         or a
  2258.         sbc hl,bc
  2259.         add hl,bc
  2260.         ret nc ;bc<=hl
  2261.         ld b,h
  2262.         ld c,l
  2263.         ret
  2264.  
  2265. maxhl_de_tode
  2266.         or a
  2267.         sbc hl,de
  2268.         add hl,de
  2269.         ret c ;de>hl
  2270.         ex de,hl
  2271.         ret
  2272.  
  2273. checkxA
  2274.         dw 0
  2275. checkyA
  2276.         dw 0
  2277. checkxB
  2278.         dw 0
  2279. checkyB
  2280.         dw 0
  2281. checkxC
  2282.         dw 0
  2283. checkyC
  2284.         dw 0
  2285. checkxD
  2286.         dw 0
  2287. checkyD
  2288.         dw 0
  2289.  
  2290. checktriangle
  2291. ;out: CY=ыхтюёЄ№, hl==0 т√ЁюцфхээюёЄ№
  2292. ;    x21:=vert[poly[i].v2].xscr-vert[poly[i].v1].xscr;
  2293. ;    x31:=vert[poly[i].v3].xscr-vert[poly[i].v1].xscr;
  2294. ;    y21:=vert[poly[i].v2].yscr-vert[poly[i].v1].yscr;
  2295. ;    y31:=vert[poly[i].v3].yscr-vert[poly[i].v1].yscr;
  2296.         ld bc,tsqr/2
  2297. triy2=$+1
  2298.         ld hl,0
  2299. triy1=$+1
  2300.         ld de,0
  2301.         or a
  2302.         sbc hl,de
  2303.         ld (y21),hl
  2304. triy3=$+1
  2305.         ld hl,0
  2306.         or a
  2307.         sbc hl,de
  2308.         ld (y31),hl
  2309. trix2=$+1
  2310.         ld hl,0
  2311. trix1=$+1
  2312.         ld de,0
  2313.         or a
  2314.         sbc hl,de
  2315.         add hl,bc
  2316.         ld (x21),hl
  2317. trix3=$+1
  2318.         ld hl,0
  2319.         or a
  2320.         sbc hl,de
  2321.         add hl,bc
  2322.         ;ld (x31),hl
  2323. ;    poly[i].visible := ((x21*y31 - x31*y21) > 0);
  2324. ;x31=$+1
  2325.         ;ld hl,0
  2326.         ld bc,0
  2327. y21=$-2
  2328.         call mul9 ;out: CYhl ;_MULLONG. ;out: hl(high), de(low)
  2329.          sbc a,a
  2330.         ld lx,a ;hsb
  2331.         ex de,hl
  2332. x21=$+1
  2333.         ld hl,0
  2334.         ld bc,0
  2335. y31=$-2
  2336.         call mul9 ;out: CYhl ;_MULLONG. ;out: hl(high), de(low)
  2337.          sbc a,a
  2338.         or a
  2339.         sbc hl,de ;lsw
  2340.         sbc a,lx ;hsb
  2341.         rla ;CY=Ёхчєы№ЄрЄ ёЁртэхэш  чэръют√ї (LVD)
  2342.         ret
  2343.  
  2344. mul9
  2345. ;9*9 -> 18
  2346. ;ьюцэю шёяюы№чютрЄ№ фы  +-319*+-192, Єюуфр Ёхчєы№ЄрЄ ёю чэръюь т CY
  2347. ;hl=A+(tsqr/2) (A=+-319)
  2348. ;bc=B = +-192
  2349. ;A*B = ((A+B)^2)/4 - ((A-B)^2)/4 ;ьырф°шх 2 сшЄр яхЁхф фхыхэшхь юфшэръют√х ёыхтр ш ёяЁртр, юяЁхфхы ■Єё  ў╕ЄэюёЄ№■
  2350.         push hl
  2351.         add hl,bc
  2352. ;hl=A+B
  2353.         add hl,hl
  2354. ;CY=0
  2355.         ld (mulpatchadd),hl
  2356.         pop hl
  2357.         sbc hl,bc
  2358. ;hl=A-B
  2359.         add hl,hl
  2360. ;CY=0
  2361.         ld (mulpatchsub),hl
  2362. mulpatchadd=$+1
  2363.         ld hl,(0)
  2364. mulpatchsub=$+2
  2365.         ld bc,(0)
  2366.         sbc hl,bc
  2367. ;HL = %rrrrrrrr rrrrrrrr
  2368.         ret
  2369.  
  2370.         align 2
  2371. tsqrsize=(320+200)
  2372. _=tsqrsize
  2373.         dup tsqrsize
  2374. _=_-1
  2375.         dw ((_*_)/4)&0xffff
  2376.         edup
  2377. tsqr
  2378. _=0
  2379.         dup tsqrsize
  2380.         dw ((_*_)/4)&0xffff
  2381. _=_+1
  2382.         edup
  2383.  
  2384. sqrt
  2385. ;in: hl
  2386. ;out: d
  2387.         or a
  2388.         ld a,l
  2389.         ld l,h
  2390.         ld de,64
  2391.         ld h,d
  2392.         ld b,8
  2393. sqrt0
  2394.         sbc hl,de
  2395.         jr nc,$+3
  2396.         add hl,de
  2397.         ccf
  2398.         rl d
  2399.         add a,a
  2400.         adc hl,hl
  2401.         add a,a
  2402.         adc hl,hl
  2403.         djnz sqrt0
  2404.         ret
  2405.  
  2406.  
  2407.         if 1==0
  2408. ;hl * de (signed = unsigned)
  2409. ;out: hl
  2410. _MUL.
  2411.         ld a,h
  2412.         ld c,l
  2413.         ld hl,0
  2414.         ld b,16
  2415. _MUL0.
  2416.         add hl,hl
  2417.         rl c
  2418.         rla
  2419.         jr nc,$+3
  2420.         add hl,de
  2421.         djnz _MUL0.
  2422.         ret
  2423.         endif
  2424.  
  2425.         if 1==0
  2426. ;hl, de * bc, ix
  2427. ;out: hl(high), de(low)
  2428. _MULLONG.
  2429.         ;EXPORT _MULLONG.
  2430. ;signed mul is equal to unsigned mul
  2431. ;hlde*bcix = hlde*b000 + hlde*c00 + hlde*i0 + hlde*x
  2432.         ld a,lx
  2433.         push af ;lx
  2434.         push ix ;hx
  2435.         ld a,c
  2436.         push af ;c
  2437.         ld a,b
  2438. ;bcde <= hlde:
  2439.         ld b,h
  2440.         ld c,l
  2441. ;hlix <= 0
  2442.         ld hl,0
  2443.         ;ld ix,0
  2444.         push hl
  2445.         pop ix
  2446.         call _MULLONGP. ;hlix = (hlix<<8) + "b*hlde"
  2447.         pop af ;c
  2448.         call _MULLONGP. ;hlix = (hlix<<8) + "c*hlde"
  2449.         pop af ;hx
  2450.         call _MULLONGP. ;hlix = (hlix<<8) + "hx*hlde"
  2451.         pop af ;lx
  2452.         call _MULLONGP. ;hlix = (hlix<<8) + "lx*hlde"
  2453.         push ix
  2454.         pop de
  2455.         ret
  2456. ;hlix = (hlix<<8) + a*bcde
  2457. _MULLONGP.
  2458.         exx
  2459.         ld b,8
  2460. _MULLONG0.
  2461.         exx
  2462.         add ix,ix
  2463.         adc hl,hl
  2464.         rla
  2465.         jr nc,$+2+2+2
  2466.         add ix,de
  2467.         adc hl,bc
  2468.         exx
  2469.         djnz _MULLONG0. ;ьюцэю яю a==0 (яхЁт√щ тїюф ё scf:rla, фрыхх add a,a)
  2470.         exx
  2471.         ret
  2472.         endif
  2473.  
  2474. SAVEDATA
  2475. level
  2476.         db 0
  2477. verticesneeded
  2478.         db 10
  2479. nvertices
  2480.         db 0
  2481.  
  2482. nvertices1
  2483.         db 0
  2484. nvertices2
  2485.         db 0
  2486.        
  2487. vertlinkflags
  2488. vertlist1
  2489.         ds MAXVERTICES
  2490. vertlist2
  2491.         ds MAXVERTICES
  2492.  
  2493. vertices
  2494. ;x,X,y,Y
  2495.         ds MAXVERTICES*4
  2496. edges
  2497. ;vertex1,vertex2,crossed
  2498.         ds MAXEDGES*3
  2499. nedges
  2500.         dw 0
  2501. ;ncrossededges
  2502. ;        dw 0
  2503. cur_h
  2504.         db 0
  2505. cur_m
  2506.         db 0
  2507. cur_s
  2508.         db 0
  2509. cur_f
  2510.         db 0
  2511.  
  2512. tlevel
  2513.         db "LEVEL 00"
  2514. tleveldig1=$-2
  2515. tleveldig2=$-1
  2516.         db " TIME 00:00:00"
  2517. ttimeh1=$-8
  2518. ttimeh2=$-7
  2519. ttimem1=$-5
  2520. ttimem2=$-4
  2521. ttimes1=$-2
  2522. ttimes2=$-1
  2523. nextlevelon=$ ;¤ЄюЄ Їыру эрфю ёюїЁрэ Є№
  2524.         db 0
  2525.         db "NEXT LEVEL"
  2526.         db 0
  2527.  
  2528. SAVEDATAsz=$-SAVEDATA
  2529.  
  2530.         macro SHAPESPROC name
  2531. name
  2532.         endm
  2533.  
  2534. ZONE_NO=0
  2535. ZONE_TOP=1
  2536. ZONE_LEFT=2
  2537. ZONE_RIGHT=3
  2538. ZONE_WORK=4
  2539. ZONE_PAL=5
  2540. ZONE_NAVIGATOR=6
  2541.  
  2542. TOOL_WINDOW=0
  2543. TOOL_PENCIL=1
  2544. TOOL_BRUSH=2
  2545. TOOL_LINE=3
  2546. TOOL_FILL=4
  2547. TOOL_TEXT=5
  2548. NTOOLS=6
  2549.  
  2550. prarr_zone
  2551.         db 0
  2552. curtool1
  2553.         db 0
  2554.  
  2555. sprringon_l
  2556. ;mask,pixels = #ppmm
  2557. ;%rlrrrlll
  2558.         db 4
  2559.         dw #00ff,#3847,#07b8,#07b8,#07b8,#3847,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2560.         dw #3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2561.         dw #07b8,#3847,#00ff,#00ff,#00ff,#3847,#07b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2562.         dw #00ff,#00ff,#07b8,#07b8,#07b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2563. sprringon_r
  2564. ;mask,pixels = #ppmm
  2565. ;%rlrrrlll
  2566.         db 4
  2567.         dw #00ff,#00ff,#3847,#3847,#3847,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2568.         dw #3847,#07b8,#00ff,#00ff,#00ff,#07b8,#3847,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2569.         dw #3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#3f00,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2570.         dw #00ff,#07b8,#3847,#3847,#3847,#07b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2571.  
  2572. sprringoff_l
  2573. ;mask,pixels = #ppmm
  2574. ;%rlrrrlll
  2575.         db 4
  2576.         dw #00ff,#0047,#00b8,#00b8,#00b8,#0047,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2577.         dw #0000,#00ff,#00ff,#00ff,#00ff,#00ff,#0000,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2578.         dw #00b8,#0047,#00ff,#00ff,#00ff,#0047,#00b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2579.         dw #00ff,#00ff,#00b8,#00b8,#00b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2580. sprringoff_r
  2581. ;mask,pixels = #ppmm
  2582. ;%rlrrrlll
  2583.         db 4
  2584.         dw #00ff,#00ff,#0047,#0047,#0047,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2585.         dw #0047,#00b8,#00ff,#00ff,#00ff,#00b8,#0047,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2586.         dw #0000,#00ff,#00ff,#00ff,#00ff,#00ff,#0000,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2587.         dw #00ff,#00b8,#0047,#0047,#0047,#00b8,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff,#00ff
  2588.  
  2589.  
  2590.         include "prarrow.asm"
  2591.         include "control.asm"
  2592.  
  2593. end
  2594.  
  2595.         display "End=",end
  2596.         ;display "Free after end=",/d,#c000-end
  2597.         display "Size ",/d,end-begin," bytes"
  2598.        
  2599.         savebin "untangle.com",begin,end-begin
  2600.        
  2601.         ;LABELSLIST "..\us\user.l"
  2602.