?login_element?

Subversion Repositories NedoOS

Rev

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