Subversion Repositories NedoOS

Rev

Rev 49 | Rev 344 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;т√тюф эр ¤ъЁрэ
  2.  
  3.         SHAPESPROC shapes_cls
  4.         ld e,a
  5.         OS_CLS
  6.         ret
  7.  
  8.         SHAPESPROC shapes_copybox
  9. ;hl=¤ъЁрээ√щ рфЁхё ыхтюую тхЁїэхую єуыр юъэр
  10. ;de=¤ъЁрээ√щ рфЁхё, ъєфр ъюяшЁютрЄ№ юъэю
  11. ;c=wid8
  12. ;b=hgt
  13.         or a
  14.         sbc hl,de
  15.         add hl,de
  16.         jr c,copyboxrightdown_topleft ;hl < de
  17. copyboxleftup
  18. ;hl=¤ъЁрээ√щ рфЁхё ыхтюую тхЁїэхую єуыр юъэр
  19. ;de=¤ъЁрээ√щ рфЁхё, ъєфр ъюяшЁютрЄ№ юъэю (т√°х шыш ыхтхх hl)
  20. ;c=wid8
  21. ;b=hgt
  22.         ld a,c
  23. copyboxleftup0
  24.         push bc
  25.         ld b,0
  26.         call ldir_a
  27.         set 5,h
  28.         set 5,d
  29.         call ldir_a
  30.         set 6,h
  31.         set 6,d
  32.         call ldir_a
  33.         res 5,h
  34.         res 5,d
  35.         call ldir_a
  36.         res 6,h
  37.         res 6,d
  38.         ld  c,40 ;b=0
  39.         ex de,hl
  40.         add hl,bc
  41.         ex de,hl
  42.         add hl,bc
  43.         pop bc
  44.         djnz copyboxleftup0
  45.         ret
  46. copyboxrightdown_topleft
  47. ;hl=¤ъЁрээ√щ рфЁхё ыхтюую тхЁїэхую єуыр юъэр
  48. ;de=¤ъЁрээ√щ рфЁхё, ъєфр ъюяшЁютрЄ№ юъэю (т√°х шыш ыхтхх hl)
  49. ;c=wid8
  50. ;b=hgt
  51.         push bc
  52.         push hl
  53.         ld a,c ;wid8
  54.         ld c,b ;hgt
  55.         ld b,0
  56.         ld h,b
  57.         ld l,c ;hgt
  58.         add hl,hl
  59.         add hl,hl
  60.         add hl,bc ;*5
  61.         add hl,hl
  62.         add hl,hl
  63.         add hl,hl ;*40
  64.         add a,l
  65.         ld c,a
  66.         adc a,h
  67.         sub c
  68.         ld b,a        
  69.         pop hl
  70.         dec bc
  71. ;bc=hgt*40 + wid8 - 1
  72.         ex de,hl
  73.         add hl,bc
  74.         ex de,hl
  75.         add hl,bc
  76.         pop bc
  77. ;hl=¤ъЁрээ√щ рфЁхё яЁртюую эшцэхую єуыр юъэр + 40
  78. ;de=¤ъЁрээ√щ рфЁхё, ъєфр ъюяшЁютрЄ№ юъэю + 40 (эшцх шыш яЁртхх hl)
  79. ;c=wid8
  80. ;b=hgt
  81.         ld a,c
  82. copyboxrightdown0
  83.         push bc
  84.         ld bc,-40
  85.         ex de,hl
  86.         add hl,bc
  87.         ex de,hl
  88.         add hl,bc
  89.         ld b,0
  90.         call lddr_a
  91.         set 5,h
  92.         set 5,d
  93.         call lddr_a
  94.         set 6,h
  95.         set 6,d
  96.         call lddr_a
  97.         res 5,h
  98.         res 5,d
  99.         call lddr_a
  100.         res 6,h
  101.         res 6,d
  102.         pop bc
  103.         djnz copyboxrightdown0
  104.         ret
  105.        
  106. ldir_a
  107.         ld c,a
  108.         push hl
  109.         push de
  110.         ldir
  111.         pop de
  112.         pop hl  
  113.         ret
  114.        
  115. lddr_a
  116.         ld c,a
  117.         push hl
  118.         push de
  119.         lddr
  120.         pop de
  121.         pop hl  
  122.         ret
  123.        
  124. prpixel
  125. ;de=x (эх яюЁЄшЄё )
  126. ;c=y (bc эх яюЁЄшЄё )
  127. ;lx=color = %33210210
  128.        ld a,b
  129.         ld l,c
  130.         ld h,0
  131.         ld b,scrbase/256/8 ;h
  132.         add hl,hl
  133.         add hl,hl
  134.         add hl,bc
  135.         add hl,hl
  136.         add hl,hl
  137.         add hl,hl ;y*40 + scrbase
  138.        ld b,a
  139. prpixel_cury
  140. ;de=x (эх яюЁЄшЄё )
  141. ;hl=addr(y)
  142. ;lx=color = %33210210
  143.         ld a,d
  144.         rra
  145.         ld a,e
  146.         rra
  147.         jr c,prpixel_r
  148.         rra
  149.         jr nc,$+4
  150.         set 6,h
  151.         rra
  152.         jr nc,$+4
  153.         set 5,h
  154.         and %00111111
  155.         add a,l
  156.         ld l,a
  157.         adc a,h
  158.         sub l
  159.         ld h,a
  160.         ld a,lx
  161.         xor (hl)
  162.         and %01000111 ;keep left pixel
  163.         xor (hl) ;right pixel from screen
  164.         ld (hl),a
  165.         ret
  166. prpixel_r
  167.         rra
  168.         jr nc,$+4
  169.         set 6,h
  170.         rra
  171.         jr nc,$+4
  172.         set 5,h
  173.         and %00111111
  174.         add a,l
  175.         ld l,a
  176.         adc a,h
  177.         sub l
  178.         ld h,a
  179.         ld a,lx
  180.         xor (hl)
  181.         and %10111000 ;keep right pixel
  182.         xor (hl) ;left pixel from screen
  183.         ld (hl),a
  184.         ret
  185.  
  186. line_invpixel
  187. ;bc=x (т яыюёъюёЄш ¤ъЁрэр юЄэюёшЄхы№эю Ёрсюўхщ чюэ√, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  188. ;de=y (т яыюёъюёЄш ¤ъЁрэр юЄэюёшЄхы№эю Ёрсюўхщ чюэ√, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  189.         ld a,c
  190.         sub 255&(workzonewid8*8)
  191.         ld a,b
  192.         sbc a,+(workzonewid8*8)/256
  193.         ret p
  194.         xor b
  195.         ret p ;x с√ыю юЄЁшЎрЄхы№эюх
  196.         ld a,e
  197.         sub 255&workzonehgt
  198.         ld a,d
  199.         sbc a,workzonehgt/256
  200.         ret p
  201.         xor d
  202.         ret p ;y с√ыю юЄЁшЎрЄхы№эюх
  203.         push bc
  204.         push de
  205.         ld a,e ;y
  206.         ld hl,workzonex8*8
  207.         add hl,bc
  208.         ex de,hl ;de=x
  209.         add a,workzoney
  210.         ld c,a ;c=y
  211.         call invpixel
  212.         pop de
  213.         pop bc
  214.         ret
  215.        
  216. invpixel
  217. ;de=x (эх яюЁЄшЄё )
  218. ;c=y (bc эх яюЁЄшЄё )
  219.        ld a,b
  220.         ld l,c
  221.         ld h,0
  222.        ld b,scrbase/256/8 ;h
  223.         add hl,hl
  224.         add hl,hl
  225.         add hl,bc
  226.         add hl,hl
  227.         add hl,hl
  228.         add hl,hl ;y*40 + scrbase
  229.        ld b,a
  230. invpixel_cury
  231. ;de=x (эх яюЁЄшЄё )
  232. ;hl=addr(y)
  233.         ld a,d
  234.         rra
  235.         ld a,e
  236.         rra
  237.         jr c,invpixel_r
  238.         rra
  239.         jr nc,$+4
  240.         set 6,h
  241.         rra
  242.         jr nc,$+4
  243.         set 5,h
  244.         and %00111111
  245.         add a,l
  246.         ld l,a
  247.         adc a,h
  248.         sub l
  249.         ld h,a
  250.         ld a,(hl)
  251.         xor %01000111 ;left pixel from screen
  252.         ld (hl),a
  253.         ret
  254. invpixel_r
  255.         rra
  256.         jr nc,$+4
  257.         set 6,h
  258.         rra
  259.         jr nc,$+4
  260.         set 5,h
  261.         and %00111111
  262.         add a,l
  263.         ld l,a
  264.         adc a,h
  265.         sub l
  266.         ld h,a
  267.         ld a,(hl)
  268.         xor %10111000 ;right pixel from screen
  269.         ld (hl),a
  270.         ret
  271.  
  272.         SHAPESPROC shapes_prpixelbox
  273. ;c=y
  274. ;de=x
  275. ;b=hgt (яюёыхфэшщ яшъёхы№ = y+hgt-1)
  276. ;hl=wid (яюёыхфэшщ яшъёхы№ = x+wid-1)
  277. ;lx=color %rlrrrlll
  278. prpixelbox0
  279.         push bc
  280.         push de
  281.         push hl ;wid
  282.         call prpixelhorline
  283.         pop hl ;wid
  284.         pop de
  285.         pop bc
  286.         inc c
  287.         djnz prpixelbox0
  288.         ret
  289.  
  290.         SHAPESPROC shapes_invpixelframe
  291. ;bc=x
  292. ;de=y
  293. ;hl=hgt (яюёыхфэшщ яшъёхы№ = y+hgt)
  294. ;ix=wid (яюёыхфэшщ яшъёхы№ = x+wid)
  295.         push bc
  296.         push de
  297.         push hl ;wid
  298.         inc bc ;x
  299.         call invpixelhorline
  300.         pop hl ;wid
  301.         pop de
  302.         pop bc
  303.         push bc
  304.         push de
  305.         push hl ;wid
  306.         push ix
  307.         add ix,de
  308.         ld d,hx
  309.         ld e,lx ;de=y+hgt
  310.         pop ix
  311.         call invpixelhorline
  312.         pop hl ;wid
  313.         pop de
  314.         pop bc
  315.         push bc
  316.         push de
  317.         add hl,bc ;x
  318.         ld b,h
  319.         ld c,l ;bc=x+wid
  320.         push ix
  321.         pop hl ;hgt
  322.         inc de ;y
  323.         push hl
  324.         call invpixelverline
  325.         pop hl ;hgt
  326.         pop de
  327.         pop bc
  328. invpixelverline
  329. ;bc=x
  330. ;de=y
  331. ;hl=hgt
  332.         ld a,h
  333.         or l
  334.         ret z
  335. invpixelverline0
  336.         push hl
  337.         bit 0,l
  338.         call nz,line_invpixel
  339.         pop hl
  340.         inc de ;y
  341.         dec hl
  342.         ld a,h
  343.         or l
  344.         jr nz,invpixelverline0
  345.         ret
  346.        
  347. invpixelhorline
  348. ;bc=x
  349. ;de=y
  350. ;hl=wid
  351.         ld a,h
  352.         or l
  353.         ret z
  354. invpixelhorline0
  355.         push hl
  356.         bit 0,l
  357.         call nz,line_invpixel
  358.         pop hl
  359.         inc bc ;x
  360.         dec hl
  361.         ld a,h
  362.         or l
  363.         jr nz,invpixelhorline0
  364.         ret
  365.  
  366.         SHAPESPROC shapes_prpixelframe
  367. ;c=y
  368. ;de=x
  369. ;b=hgt (яюёыхфэшщ яшъёхы№ = y+hgt)
  370. ;hl=wid (яюёыхфэшщ яшъёхы№ = x+wid)
  371. ;lx=color %rlrrrlll
  372.         push bc
  373.         push de
  374.         push hl ;wid
  375.         inc de ;x
  376.         call prpixelhorline
  377.         pop hl ;wid
  378.         pop de
  379.         pop bc
  380.         push bc
  381.         push de
  382.         push hl ;wid
  383.         ld a,c ;y
  384.         add a,b ;hgt
  385.         ld c,a ;c=y+hgt
  386.         call prpixelhorline
  387.         pop hl ;wid
  388.         pop de
  389.         pop bc
  390.         push bc
  391.         push de
  392.         add hl,de ;x
  393.         ex de,hl ;de=x+wid
  394.         inc c ;y
  395.         call prpixelverline
  396.         pop de
  397.         pop bc
  398. prpixelverline
  399. ;c=y
  400. ;de=x
  401. ;b=hgt
  402. ;lx=color
  403.         inc b
  404.         dec b
  405.         ret z
  406. prpixelverline0
  407. prpixelverline_patch=$+1
  408.         call prpixel
  409.         inc c
  410.         djnz prpixelverline0
  411.         ret
  412.        
  413. prpixelhorline
  414. ;c=y
  415. ;de=x
  416. ;hl=wid
  417. ;lx=color
  418.         ld a,h
  419.         or l
  420.         ret z
  421.         push hl
  422.         ld l,c
  423.         ld h,0
  424.         ld b,scrbase/256/8 ;h
  425.         add hl,hl
  426.         add hl,hl
  427.         add hl,bc
  428.         add hl,hl
  429.         add hl,hl
  430.         add hl,hl ;y*40 + scrbase
  431.         pop bc
  432.         ld a,c
  433.         dec bc
  434.         ld c,b
  435.         inc c ;c=(bc-1)/256+1
  436.         ld b,a ;b=bc&#ff
  437. prpixelhorline0
  438.         push hl ;addr(cury)
  439. prpixelhorline_patch=$+1
  440.         call prpixel_cury
  441.         pop hl ;addr(cury)
  442.         inc de ;x
  443.         djnz prpixelhorline0
  444.         dec c
  445.         jr nz,prpixelhorline0
  446.         ret
  447.        
  448.         SHAPESPROC shapes_invbox
  449. ;b=y
  450. ;c=x/8
  451. ;d=hgt
  452. ;e=wid
  453. invbox0
  454.         push de ;d = hgt, e = wid(chr)
  455.         call invhorline              
  456.         pop de ;d = hgt, e = wid(chr)
  457.         inc b ;y
  458.         dec d
  459.         jr nz,invbox0
  460.         ret
  461.  
  462. invhorline
  463. ;b=y
  464. ;c=x/8
  465. ;e=wid(chr)
  466.         push bc
  467.         call calcscr_from_xchr_y
  468.         ld b,e
  469. invhorline0
  470.         ld a,(hl)
  471.         cpl
  472.         ld (hl),a
  473.         set 5,h
  474.         ld a,(hl)
  475.         cpl
  476.         ld (hl),a
  477.         set 6,h
  478.         ld a,(hl)
  479.         cpl
  480.         ld (hl),a
  481.         res 5,h
  482.         ld a,(hl)
  483.         cpl
  484.         ld (hl),a
  485.         res 6,h
  486.         inc hl
  487.         djnz invhorline0
  488.         pop bc
  489.         ret
  490.        
  491.         SHAPESPROC shapes_colortocolormask
  492. ;a=color = %....3210
  493.         push bc
  494.         ld c,a
  495.         ld b,c
  496.         srl b
  497.         rra
  498.         srl b
  499.         rra
  500.         srl b
  501.         rra
  502. ;a=%210...
  503.         srl c
  504.         rra
  505.         srl c
  506.         rra
  507.         srl c
  508.         rra
  509. ;a=%210210...
  510.         rrc c
  511.         rra
  512.         rlc c
  513.         rra
  514.         pop bc
  515.         ret
  516.  
  517.         SHAPESPROC shapes_fillbox
  518. ;b=y
  519. ;c=x/8
  520. ;d=hgt
  521. ;e=wid8
  522. ;a=%33210210
  523. fillbox0
  524.         push de ;d = hgt, e = wid(chr)
  525.         call prhorline
  526.         pop de ;d = hgt, e = wid(chr)
  527.         inc b ;y
  528.         dec d
  529.         jr nz,fillbox0
  530.         ret
  531.        
  532.         SHAPESPROC shapes_prbox
  533. ;b=y
  534. ;c=x/8
  535. ;d=hgt
  536. ;e=wid8
  537. ;a=%33210210 (Ёрьър ў╕Ёэр )
  538.         push bc ;b = y, c = x
  539.         push de ;d = hgt, e = wid(chr)
  540.         call shapes_fillbox
  541.         pop de ;d = hgt, e = wid(chr)
  542.         pop bc ;b = y, c = x
  543.         jp shapes_prboxframe
  544.        
  545.         SHAPESPROC shapes_prboxframe
  546. ;b=y
  547. ;c=x/8
  548. ;d=hgt
  549. ;e=wid8
  550. ;(Ёрьър ў╕Ёэр )
  551.         push de ;d = hgt, e = wid(chr)
  552.         call prverline_l
  553.         pop de ;d = hgt, e = wid(chr)
  554.         push bc
  555.         ld a,c ;x/8
  556.         add a,e ;wid(chr)
  557.         dec a
  558.         ld c,a ;x/8+wid(chr)-1
  559.         push de ;d = hgt, e = wid(chr)
  560.         call prverline_r
  561.         pop de ;d = hgt, e = wid(chr)
  562.         pop bc
  563.  
  564.         xor a ;black
  565.         call prhorline                  
  566.         ld a,b ;y
  567.         add a,d ;hgt
  568.         dec a
  569.         ld b,a ;y+hgt-1
  570.         xor a ;black
  571.         ;call prhorline          
  572.         ;ret      
  573. prhorline
  574. ;b=y
  575. ;c=x/8
  576. ;e=wid(chr)
  577. ;a=%rlrrrlll
  578.         push bc
  579.         push af
  580.         call calcscr_from_xchr_y
  581.         pop af
  582.         ld b,e
  583. prhorline0
  584.         ld (hl),a
  585.         set 5,h
  586.         ld (hl),a
  587.         set 6,h
  588.         ld (hl),a
  589.         res 5,h
  590.         ld (hl),a
  591.         res 6,h
  592.         inc hl
  593.         djnz prhorline0
  594.         pop bc
  595.         ret
  596.        
  597. prverline_l
  598. ;b=y
  599. ;c=x/8
  600. ;d=hgt
  601.         push bc
  602.         call calcscr_from_xchr_y
  603.         ld a,%10111000
  604.         and (hl)
  605.         ld b,d
  606.         ld de,40
  607. prverline_l0
  608.         ld (hl),a
  609.         add hl,de
  610.         djnz prverline_l0
  611.         pop bc
  612.         ret
  613.        
  614. prverline_r
  615. ;b=y
  616. ;c=x/8
  617. ;d=hgt
  618.         push bc
  619.         call calcscr_from_xchr_y
  620.         ld a,h
  621.         add a,#60
  622.         ld h,a
  623.         ld a,%01000111
  624.         and (hl)
  625.         ld b,d
  626.         ld de,40
  627. prverline_r0
  628.         ld (hl),a
  629.         add hl,de
  630.         djnz prverline_r0
  631.         pop bc
  632.         ret
  633.        
  634.         SHAPESPROC shapes_line
  635. ;bc=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  636. ;de=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  637. ;ix=x2
  638. ;hl=y2
  639.         or a
  640.         sbc hl,de
  641.         add hl,de
  642.         jp p,shapes_line_noswap
  643.         ex de,hl ;y <-> y2
  644.         push ix
  645.         push bc
  646.         pop ix
  647.         pop bc ;x <-> x2
  648.         ;ld a,lx
  649.         ;ld lx,c
  650.         ;ld c,a
  651.         ;ld a,hx
  652.         ;ld hx,b
  653.         ;ld b,a ;x <-> x2
  654. shapes_line_noswap
  655.         or a
  656.         sbc hl,de ;dy >= 0
  657.         push hl ;dy
  658.         ;ld a,lx
  659.         ;sub c
  660.         ;ld l,a
  661.         ;ld a,hx
  662.         ;sbc a,b
  663.         ;ld h,a
  664.         push ix
  665.         pop hl
  666.         sbc hl,bc
  667.         push hl ;dx
  668.         exx
  669.         pop bc ;dx
  670.         ld a,#03 ;inc bc
  671.         jp p,shapes_line_nodec
  672.         xor a
  673.         sub c
  674.         ld c,a
  675.         sbc a,b
  676.         sub c
  677.         ld b,a ;dx >= 0
  678.         ld a,#0b ;dec bc
  679. shapes_line_nodec
  680.         pop de ;dy
  681. ;a=ъюф inc/dec bc
  682. ;bc'=x (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  683. ;de'=y (т яыюёъюёЄш ¤ъЁрэр, эю ьюцхЄ с√Є№ юЄЁшЎрЄхы№э√ь)
  684. ;bc=dx
  685. ;de=dy
  686.         ex de,hl
  687.         or a
  688.         sbc hl,bc
  689.         add hl,bc
  690.         ex de,hl
  691.         jr nc,shapes_linever ;dy>=dx
  692.         ld hy,b
  693.         ld ly,c ;counter=dx
  694.         inc iy ;inc hy ;Ёшёєхь, тъы■ўр  яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
  695.         ld h,b
  696.         ld l,c
  697.         sra h
  698.         rr l ;ym=dx div 2
  699.          ;xor a
  700.          ;sub l
  701.          ;ld l,a
  702.          ;sbc a,h
  703.          ;sub l
  704.          ;ld h,a ;mym=256-(dx div 2)
  705.         exx
  706.         ld (shapes_lineincx),a
  707. ;bc=x
  708. ;de=y
  709. ;hl'=xm
  710. ;bc'=dx
  711. ;de'=dy
  712. shapes_linehor0
  713.         call line_invpixel
  714. shapes_lineincx=$
  715.         inc bc ;x+1        
  716.         exx
  717.         ;add hl,de ;mym+dy
  718.         or a
  719.         sbc hl,de ;ym-dy
  720.         exx
  721.         jr nc,shapes_linehor1
  722.         inc de ;y+1
  723.         exx
  724.         ;or a
  725.         ;sbc hl,bc ;mym-dx
  726.         add hl,bc ;ym+dx
  727.         exx
  728. shapes_linehor1
  729.         dec iy
  730.         ld a,hy
  731.         rla
  732.         jp nc,shapes_linehor0
  733.         ret
  734. shapes_linever
  735.         ld hy,d
  736.         ld ly,e ;counter=dy
  737.         ;inc iy ;inc hy ;Ёшёєхь, тъы■ўр  яюёыхфэшщ яшъёхы№ (єўЄхэю т Ўшъых)
  738.         ld h,d
  739.         ld l,e
  740.         sra h
  741.         rr l
  742.          ;xor a
  743.          ;sub l
  744.          ;ld l,a
  745.          ;sbc a,h
  746.          ;sub l
  747.          ;ld h,a ;mxm=256-(dy div 2)
  748.         exx
  749.         ld (shapes_lineincx2),a
  750. ;bc=x
  751. ;de=y
  752. ;hl'=xm
  753. ;bc'=dx
  754. ;de'=dy
  755. shapes_linever0
  756.         call line_invpixel
  757.         inc de ;y+1
  758.         exx
  759.         ;add hl,bc ;mxm+dx
  760.         or a
  761.         sbc hl,bc ;xm-dx
  762.         exx
  763.         jr nc,shapes_linever1
  764. shapes_lineincx2=$
  765.         inc bc ;x+1
  766.         exx
  767.         ;or a
  768.         ;sbc hl,de ;mxm-dy
  769.         add hl,de ;xm+dy
  770.         exx
  771. shapes_linever1
  772.         dec iy
  773.         ld a,hy
  774.         rla
  775.         jp nc,shapes_linever0
  776.         ret
  777.