?login_element?

Subversion Repositories NedoOS

Rev

Rev 564 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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