?login_element?

Subversion Repositories NedoOS

Rev

Rev 1110 | Blame | Compare with Previous | Last modification | View Log | Download

  1. ;--------------------------------------------------------------------
  2. printText2x1V:
  3.         ; HL - text address (multiply symbol)
  4.         ; DE - screen address
  5.         ld a,1
  6.         jr printText2x1_a
  7. printText2x1:
  8.         ; HL - text address (multiply symbol)
  9.         ; DE - screen address
  10.         xor a
  11. printText2x1_a
  12.         ld (textAxis),a
  13. printTextLoop:
  14.         ld a,(hl)
  15.         or a
  16.         ret z           ; 0 == end of text (TEXT_END)
  17.         inc hl
  18.         push hl
  19.         push de
  20.         call charAddr
  21.         inc hl
  22.         ld c,%01010101
  23.  
  24.         push de
  25.         call scrAddrToAttrAddr
  26.         ld a,(textColor)
  27.         ld (de),a
  28.         pop de
  29.  
  30.         ld a,(hl)
  31.         ld (de),a
  32.         inc d
  33.         inc d
  34.         inc hl
  35.         ld a,(hl)
  36.         ld (de),a
  37.         inc d
  38.         inc d
  39.  
  40.         inc hl
  41.         ld b,2
  42. .fourth:
  43.         ld a,(hl)
  44.         and c
  45.         rrc c
  46.         ld (de),a
  47.         inc d
  48.         ld a,(hl)
  49.         and c
  50.         rrc c
  51.         ld (de),a
  52.         inc d
  53.         inc hl
  54.         djnz .fourth
  55.         dec d
  56.         call nextLine
  57.         push de
  58.         call scrAddrToAttrAddr
  59.         ld a,(textColor+1)
  60.         ld (de),a
  61.         pop de
  62.         ld b,4
  63. .fourth2:
  64.         ld a,(hl)
  65.         ld (de),a
  66.         inc d
  67.         ld a,(hl)
  68.         ld (de),a
  69.         inc d
  70.         inc hl
  71.         djnz .fourth2
  72.         pop de
  73.         pop hl
  74.         inc e
  75.         ld a,(textAxis)
  76.         or a
  77.         jr z,printTextLoop
  78.         dec e
  79.         ex de,hl
  80.         call nextLine16
  81.         ex de,hl
  82.         jr printTextLoop
  83. ;--------------------------------------------------------------------
  84. charAddr:
  85.         ; calc address of char in font
  86.         ld l,a,h,0      ; a=char
  87.         add hl,hl,hl,hl,hl,hl
  88.         if MACHINE == 48 || MACHINE == 9
  89.                 ld bc,#3D00 - 256
  90.         endif
  91.         if MACHINE == 16 || MACHINE == 1024
  92.                 ld bc,cartrigeFont - 256
  93.         endif
  94.         add hl,bc       ; hl=address in font
  95.         ret
  96. ;--------------------------------------------------------------------
  97. waitAnyKey:
  98.         ; wait any key
  99.         xor a
  100.         in a,(#fe)
  101.         cpl
  102.         and #1f
  103.         jr z,$-6
  104.         ret
  105. ;--------------------------------------------------------------------
  106. clearScreen:
  107.         ld hl,#4000
  108.         ld de,#4001
  109.         ld bc,#17ff
  110.         ld (hl),l
  111.         ldir
  112.         ret
  113. clearAttributesBlack:
  114.         xor a
  115. clearAttributes:
  116.         ; A - color
  117.         ld hl,#5800
  118.         ld de,#5801
  119.         ld bc,#2FF
  120.         ld (hl),a
  121.         ldir
  122.         ret
  123. ;--------------------------------------------------------------------
  124. nextLine:
  125.         ; next screen line address
  126.         inc d
  127.         ld  a,d
  128.         and 7
  129.         ret nz
  130.         ld  a,e
  131.         add a,32
  132.         ld  e,a
  133.         ret c
  134.         ld  a,d
  135.         sub 8
  136.         ld  d,a
  137.         ret
  138. ;------------------------------------------
  139. nextLine16:
  140.         ; HL - screen address
  141.         ; return HL = screen address + 16 lines (2 symbols)
  142.         ; thanks to Sergei Smirnov
  143.         ld a,l
  144.         add #40
  145.         ld l,a
  146.         sbc a,a
  147.         and #08
  148.         add a,h
  149.         ld h,a
  150.         ret
  151. ;---------------------------------------------------------
  152. preLine24:
  153.         ; HL - screen address
  154.         ; return HL = screen address - 24 lines
  155.        if EGA
  156.        push bc
  157.        ld bc,-(24*40)
  158.        add hl,bc
  159.        pop bc
  160.         ret
  161.        else
  162.         ld a,l
  163.         sub #60
  164.         ld l,a
  165.         ret nc
  166.         ld a,h
  167.         sub #08
  168.         ld h,a
  169.         ret
  170.        endif
  171. ;---------------------------------------------------------
  172. getScrAddrByCoords:
  173.         ; L = Y; E = X (in pixels)
  174.         ; return HL > screen address
  175.        if EGA
  176.         ld a,e ;x
  177.         rra
  178.         rra
  179.         rra
  180.         and 0x1f
  181.          add a,scrbase&0xff
  182.         ld h,0
  183.         ld d,h
  184.         ld e,l
  185.         add hl,hl
  186.         add hl,hl
  187.         add hl,de ;*5
  188.          add hl,hl
  189.          add hl,hl
  190.          add hl,hl ;*40
  191.         add a,l
  192.         ld l,a
  193.         ld a,h
  194.         adc a,scrbase/256
  195.         ld h,a
  196.         ret
  197.        else
  198.         ld a,l
  199.         and 7
  200.         ld h,a
  201.         ld a,l
  202.         rrca
  203.         rrca
  204.         rrca
  205.         and %00011000
  206.         or #40
  207.         add h
  208.         ld h,a
  209.         ld a,l
  210.         rlca
  211.         rlca
  212.         and %11100000
  213.         ld l,a
  214.         ld a,e
  215.         rrca
  216.         rrca
  217.         rrca
  218.         and #1F
  219.         add l
  220.         ld l,a
  221.         ret
  222.        endif
  223. ;---------------------------------------------------------
  224. sortObjectIds:
  225.         ; Sorts an array of 10 bytes in ascending order. ~ 3500t (byte value range 0..254)
  226.         ld b,MAX_OBJECTS
  227.         ld hl,testS
  228. .main:
  229.         push bc
  230.         push hl
  231.         ; B - counter
  232.         ; HL - buffer address
  233.         ld c,#FF
  234. .nB:
  235.         ld a,(hl)
  236.         cp c
  237.         jr nc,.next
  238.         ld c,a
  239.         ld e,l
  240. .next:
  241.         inc hl
  242.         djnz .nB
  243.         ; C > value; E > low buffer address
  244.         pop hl
  245.         ld a,(hl)
  246.         ld d,h
  247.         ld (de),a
  248.         ld (hl),c
  249.         inc hl
  250.         pop bc
  251.         djnz .main
  252.         ret
  253. ;---------------------------------------------------------
  254. getDrawData:
  255.         ; Preparing the object for rendering.
  256.         ; screen address by coordinates
  257.         ; sprite address
  258.         call setRemoveSides
  259.         ld e,(ix+oData.x)
  260.         ld l,(ix+oData.y)
  261.         call getScrAddrByCoords
  262.         ld (ix+oData.scrAddrL),l
  263.         ld (ix+oData.scrAddrH),h
  264.         ld a,(ix+oData.spriteId)
  265.         call getSpriteAddr
  266.        if EGA
  267.         ld a,(ix+oData.x);e
  268.        else
  269.         ld a,e
  270.        endif
  271.         and 7
  272.         ld (ix+oData.bit),a
  273.         or a
  274.         jr z,.end2
  275.         ; A * 48 = BC
  276.         call mul48
  277.         add hl,bc
  278. .end2:
  279.         ; hl - sprite address
  280.         ld (ix+oData.sprAddrL),l
  281.         ld (ix+oData.sprAddrH),h
  282.         ret
  283. setRemoveSides:
  284. ;       ld a,(ix+oData.direction)
  285. ;       or a
  286. ;       ret z
  287.         ld a,(ix+oData.clearSide)
  288.         ld l,(ix+oData.scrAddrL)
  289.         ld h,(ix+oData.scrAddrH)
  290.         rrca
  291.         jr c,.clearRight
  292.         rrca
  293.         jr c,.clearLeft
  294.         rrca
  295.         jr c,.clearDown
  296.         rrca
  297.         jr c,.clearUp
  298.         ret
  299. .clearDown:
  300.        if EGA
  301.        push bc
  302.        push de
  303.         ld e,(ix+oData.x)
  304.         ld a,(ix+oData.y)
  305.         and 0xf8
  306.         add a,32
  307.         ld l,a
  308. ; L = Y; E = X (in pixels)
  309.         call getScrAddrByCoords ;hl=scraddr
  310.        pop de
  311.        pop bc
  312.        else
  313.         ld a,h
  314.         and #F8
  315.         ld h,a
  316.         ld a,l
  317.         add 64
  318.         ld l,a
  319.         jr nc,.clearLeft
  320.         ld a,h
  321.         add 8
  322.         ld h,a
  323.        endif
  324.         jr .clearLeft
  325.  
  326. .clearUp:
  327.        if EGA
  328.        push bc
  329.        push de
  330.         ld e,(ix+oData.x)
  331.         ld a,(ix+oData.y)
  332.         and 0xf8
  333.         ld l,a
  334. ; L = Y; E = X (in pixels)
  335.         call getScrAddrByCoords
  336.        pop de
  337.        pop bc
  338.        else
  339.         ld a,h
  340.         and #F8
  341.         ld h,a
  342.        endif
  343. .clearLeft:
  344.         ld (ix+oData.clrScrAddrL),l
  345.         ld (ix+oData.clrScrAddrH),h
  346.         ret
  347. .clearRight:
  348.         inc hl
  349.         inc hl
  350.         jr .clearLeft
  351. ;---------------------------------------------------------
  352. clear1x2:       ; width = 1 symbol, height = 2 symbols
  353.        if EGA
  354. ;чистить хвосты спрайтов
  355. ;hl=адрес на экране (Y круглый)
  356.         bit 0,l
  357.         ld de,megafloor
  358.         jr z,$+5
  359.         ld de,megafloor+(64*4)
  360.        push ix
  361.         ld bc,0x1004 ;b=hgt,c=wid (/2)
  362.         call prmegaimgega
  363.        pop ix
  364.         ret
  365.        else
  366.         xor a
  367.         ld b,2
  368. .clear:
  369.         push bc
  370.         push hl
  371.         dup 8
  372.         ld (hl),a
  373.         inc h
  374.         edup
  375.         pop hl
  376.         ld bc,32
  377.         add hl,bc
  378.         pop bc
  379.         djnz .clear
  380.         ret
  381.        endif
  382. ;---------------------------------------------------------
  383. clear2x1:       ; width = 2 symbols, height = 1 symbol
  384.        if EGA
  385. ;чистить хвосты спрайтов
  386. ;hl=адрес на экране (Y круглый)
  387.         bit 3,(ix+oData.y)
  388.         ld de,megafloor
  389.         jr z,$+5
  390.         ld de,megafloor+8
  391.        push ix
  392.         ld bc,0x0808 ;b=hgt,c=wid (/2)
  393.         call prmegaimgega
  394.        pop ix
  395.         ret
  396.        else
  397.         xor a
  398.         dup 4
  399.         ld (hl),a
  400.         inc l
  401.         ld (hl),a
  402.         inc h
  403.         ld (hl),a
  404.         dec l
  405.         ld (hl),a
  406.         inc h
  407.         edup
  408.         ret
  409.        endif
  410. ;---------------------------------------------------------
  411. setIYtoIX:
  412.         ld a,iyl
  413.         ld ixl,a
  414.         ld a,iyh
  415.         ld ixh,a
  416.         ret
  417. delta7:
  418.         ld a,(ix+oData.delta)
  419.         inc a
  420.         ld (ix+oData.delta),a
  421.         and 7
  422.         ret
  423. mul48:
  424.         ; A = multiplier
  425.        if EGA
  426.         ; return BC = A * (34*12+4) = A*412 = A*0x19C
  427.        push hl
  428.         ld l,a
  429.         ld h,0
  430.         ld c,l
  431.         ld b,h
  432.         add hl,hl ;*0x02
  433.         add hl,bc ;*0x03
  434.         add hl,hl ;*0x06
  435.         add hl,hl ;*0x0c
  436.         add hl,hl ;*0x18
  437.         add hl,bc ;*0x19
  438.         add hl,hl ;*0x32
  439.         add hl,bc ;*0x33
  440.         add hl,hl ;*0x66
  441.         add hl,bc ;*0x67
  442.         add hl,hl ;*0xce
  443.         add hl,hl ;*0x19C      
  444.         ld b,h
  445.         ld c,l
  446.        pop hl
  447.        else
  448.         ; return BC = A * 48 (9 bit)
  449.         rrca
  450.         rrca
  451.         rrca
  452.         ld c,a
  453.         rrca
  454.         add c
  455.         ld c,a
  456.         adc 0
  457.         sub c
  458.         ld b,a
  459.        endif
  460.         ret
  461. ;---------------------------------------------------------
  462. getAttrAddrByCellId:
  463.         ; C = cell ID (cells 16x16)
  464.         ; return DE = attributes address
  465.        if EGA
  466. ;=getScrAddrByCellId
  467.        else
  468.         ld a,c
  469.         and #C0
  470.         rlca
  471.         rlca
  472.         or #58
  473.         jr gsbc
  474. ;       ld d,a
  475. ;       ld a,c
  476. ;       and #F0
  477. ;       sla a
  478. ;       sla a
  479. ;       ld e,a
  480. ;       ld a,c
  481. ;       and #0f
  482. ;       add a
  483. ;       add e
  484. ;       ld e,a
  485. ;       ret
  486.        endif
  487. ;---------------------------------------------------------
  488. getScrAddrByCellId:
  489.         ; C = cell ID (cells 16x16)
  490.         ; return DE = screen address
  491.        if EGA
  492.        push hl
  493.         ld a,c
  494.         and 0x0f*16
  495.         ld l,a ;y
  496.         ld a,c
  497.         and 0x0f
  498.         add a,a
  499.          add a,scrbase&0xff
  500.         ld h,0
  501.         ld d,h
  502.         ld e,l
  503.         add hl,hl
  504.         add hl,hl
  505.         add hl,de ;*5
  506.          add hl,hl
  507.          add hl,hl
  508.          add hl,hl ;*40
  509.         add a,l
  510.         ld e,a
  511.         ld a,h
  512.         adc a,scrbase/256
  513.         ld d,a
  514.        pop hl
  515.         ret
  516.        else
  517.         ld a,c
  518.         and #C0
  519.         rrca
  520.         rrca
  521.         rrca
  522.         or #40
  523. gsbc:
  524.         ld d,a
  525.         ld a,c
  526.         and #F0
  527.         sla a
  528.         sla a
  529.         ld e,a
  530.         ld a,c
  531.         and #0f
  532.         add a
  533.         add e
  534.         ld e,a
  535.         ret
  536.        endif
  537. ;------------------------------------------------------------
  538. getCoordsByCellId:
  539.         ; C = cell ID (cells 16x16)
  540.         ; return DE = Y,X
  541.         ld a,c
  542.         and #F0
  543.         ld d,a          ; Y
  544.         ld a,c
  545.         and 15
  546.         rlca
  547.         rlca
  548.         rlca
  549.         rlca
  550.         ld e,a          ; X
  551.         ret
  552. ;------------------------------------------------------------
  553. getCellIDByCoords:
  554.         ; DE - Y,X
  555.         ; return A = cell ID
  556.         ; corrupt D
  557.         ld a,d
  558.         and #F0
  559.         ld d,a
  560.         ld a,e
  561.         rrca
  562.         rrca
  563.         rrca
  564.         rrca
  565.         and #0F
  566.         add d
  567.         ret
  568. ;------------------------------------------------------------
  569. scrAddrToAttrAddr:
  570.         ; Convert screen address to attribute address
  571.         ; DE = screen address
  572.         ; return DE = attributes address
  573.        ;if !EGA
  574.         ld a,d
  575.         and #58
  576.         rrca
  577.         rrca
  578.         rrca
  579.         or #58
  580.         ld d,a
  581.        ;endif
  582.         ret
  583. ;------------------------------------------------------------
  584.        if 0
  585. getCellIdByScrAddr:
  586.         ; HL - screen address
  587.         ; return A > cell ID (16x16 tile ID 0-191)
  588.         ld a,h
  589.         rlca
  590.         rlca
  591.         rlca
  592.         and %11000000
  593.         ld h,a
  594.  
  595.         ld a,l
  596.         rrca
  597.         rrca
  598.         and #30
  599.         add h
  600.         ld h,a
  601.  
  602.         ld a,l
  603.         rrca
  604.         and #0F
  605.         add h
  606.         ret
  607.        endif
  608. ;------------------------------------------------------------
  609. getObjDataById:
  610.         ; A - object ID
  611.         ; return IY = object data address by ID
  612.         dec a
  613.         push hl
  614.         push bc
  615.         ld h,0
  616.         ld l,a
  617.         ld bc,objectsData               ; 16,32,64.... bytes for 1 object
  618.         ; generate
  619.         if OBJECT_DATA_SIZE >= 16
  620.                 add hl,hl
  621.                 add hl,hl
  622.                 add hl,hl
  623.                 add hl,hl
  624.         endif
  625.         if OBJECT_DATA_SIZE >= 32
  626.                 add hl,hl
  627.         endif
  628.         if OBJECT_DATA_SIZE == 64
  629.                 add hl,hl
  630.         endif
  631.         ;
  632.         add hl,bc
  633.         push hl
  634.         pop iy
  635.         pop bc
  636.         pop hl
  637.         ret
  638. ;------------------------------------------------------------
  639. printSpr:
  640.         ; print sprite 2
  641.         ; HL - sprite address
  642.         ; C - cell ID
  643.         call getScrAddrByCellId
  644. printSpr_scraddrDE
  645.        if EGA
  646. ;de=scraddr
  647. ;hl=gfx
  648.        ;push hl
  649.         ex de,hl
  650.         ld bc,0x1008
  651. ;b=hgt,c=wid (/2)
  652. ;de=gfx
  653. ;hl=scr
  654.         jp primgega_onescreen
  655.        ;pop hl
  656.        ; ret
  657.        else
  658. ;de=scraddr
  659. ;hl=gfx
  660.         ld b,16
  661. sprLine:
  662.         push bc
  663.         ldi
  664.         ldi
  665.         dec de
  666.         dec de
  667.         call nextLine
  668.         pop bc
  669.         djnz sprLine
  670.         ret
  671.        endif
  672. ;-------------------------------------------------
  673. printSprite3x2:
  674.        if EGA
  675. ;hl=gfx
  676. ;de=scr
  677.        push iy
  678.         push hl
  679.         pop iy
  680.        push ix
  681. ;iy=sprite data+2 = spraddr+4
  682. ;de=scr
  683.        push de
  684.        push hl
  685.         call prbgforspr
  686.        pop hl
  687.        pop de
  688.         call prspr
  689.        pop ix
  690.        pop iy
  691.         ret
  692.        else
  693.         ld b,16
  694. .sprLine:
  695.         push bc
  696.         ldi
  697.         ldi
  698.         ldi
  699.         dec de
  700.         dec de
  701.         dec de
  702.         call nextLine
  703.         pop bc
  704.         djnz .sprLine
  705.        endif
  706.         ret
  707. ;-------------------------------------------------
  708. printSprite3x2as2x2:
  709.        if EGA
  710. ;hl=gfx
  711. ;de=scr
  712.        push iy
  713.         push hl
  714.         pop iy
  715.        push ix
  716. ;iy=sprite data+2 = spraddr+4
  717. ;de=scr
  718.        push de
  719.        push hl
  720.         call prbgforspr
  721.        pop hl
  722.        pop de
  723.         call prspr
  724.        pop ix
  725.        pop iy
  726.         ret
  727.        else
  728.         ld b,16
  729. .sprLine:
  730.         push bc
  731.         ldi
  732.         ldi
  733.         dec de
  734.         dec de
  735.         inc hl
  736.         call nextLine
  737.         pop bc
  738.         djnz .sprLine
  739.        endif
  740.         ret
  741. ;-------------------------------------------------
  742. getSpriteAddr:
  743.         ; A - sprite ID
  744.         ; return HL = sprite address
  745.         add a
  746.         add a,low SPRITE_MAP
  747.         ld l,a
  748.         adc a,high SPRITE_MAP
  749.         sub l
  750.         ld h,a
  751.         ld a,(hl)
  752.         inc hl
  753.         ld h,(hl)
  754.         ld l,a
  755.         ld bc,EMPTY_PBM
  756.         add hl,bc
  757.         ret
  758. ;-------------------------------------------------
  759. ; 16-bit xorshift pseudorandom number generator by John Metcalf
  760. ; 20 bytes, 86 cycles (excluding ret)
  761.  
  762. ; returns   hl = pseudorandom number
  763. ; corrupts   a
  764.  
  765. ; generates 16-bit pseudorandom numbers with a period of 65535
  766. ; using the xorshift method:
  767.  
  768. ; hl ^= hl << 7
  769. ; hl ^= hl >> 9
  770. ; hl ^= hl << 8
  771.  
  772. ; some alternative shift triplets which also perform well are:
  773. ; 6, 7, 13; 7, 9, 13; 9, 7, 13.
  774. rnd16:
  775.         push hl
  776.         ld hl,(globalSeed)       ; seed must not be 0
  777.         ld a,h
  778.         rra
  779.         ld a,l
  780.         rra
  781.         xor h
  782.         ld h,a
  783.         ld a,l
  784.         rra
  785.         ld a,h
  786.         rra
  787.         xor l
  788.         ld l,a
  789.         xor h
  790.         ld h,a
  791.         ld (globalSeed),hl
  792.         pop hl
  793.         ret
  794. ;------------------------------------------
  795. ; attrRect:
  796. ;       ; HL - attribute address
  797. ;       ; E - radius    (1 - 7)
  798. ;       ; D - color
  799. ;       ld d,#FF ; color
  800. ;       ld a,e
  801. ;       rrca
  802. ;       rrca
  803. ;       rrca
  804. ;       add e
  805. ;       ld c,a
  806. ;       ld b,0
  807. ;       add hl,bc
  808. ;       rlc e
  809. ;       ld bc,#10000 - 32
  810. ;       ld a,e
  811. ; .up:
  812. ;       ld (hl),d
  813. ;       add hl,bc
  814. ;       dec a
  815. ;       jr nz,.up
  816. ;       ld a,e
  817. ; .left:
  818. ;       ld (hl),d
  819. ;       dec l
  820. ;       dec a
  821. ;       jr nz,.left
  822. ;       ld bc,32
  823. ;       ld a,e
  824. ; .down:
  825. ;       ld (hl),d
  826. ;       add hl,bc
  827. ;       dec a
  828. ;       jr nz,.down
  829. ;       ld a,e
  830. ; .right:
  831. ;       ld (hl),d
  832. ;       inc l
  833. ;       dec a
  834. ;       ret z
  835. ;       jr .right
  836. ;------------------------------------------
  837. colorRotate:
  838.         ; rotate 'A' (1-7) without 0
  839.         dec a
  840.         jr nz,.rc
  841.         dec a
  842. .rc:
  843.         and 7
  844.         ret
  845. ;------------------------------------------
  846. ; blinkBrixghtness:
  847. ;       ld a,(ix+oData.color)
  848. ;       xor BRIGHTNESS
  849. ;       ld (ix+oData.color),a
  850. ;       ret
  851. ;------------------------------------------
  852. resetDelta2:
  853.         xor a
  854.         ld (delta2),a
  855.         ret
  856. ;------------------------------------------
  857. blinkArea: ;for "sale"
  858.         ; DE - Y, X
  859.         ; BC - height, wifth
  860.         ld a,(byteValue)
  861.         call colorRotate
  862.         ld (byteValue),a
  863. fillArea:
  864.         ; A - color
  865.         ; DE - Y, X
  866.         ; BC - height, width
  867.         ld l,d
  868.         ld h,0
  869.         add hl,hl
  870.         add hl,hl
  871.         add hl,hl
  872.         add hl,hl
  873.         add hl,hl
  874.         ld d,#58
  875.         add hl,de
  876.         ld de,#20
  877. .line:
  878.         push bc
  879.         push hl
  880. .symbol:
  881.         ld (hl),a
  882.         inc hl
  883.         dec c
  884.         jr nz,.symbol
  885.         pop hl
  886.         add hl,de
  887.         pop bc
  888.         djnz .line
  889.         ret
  890. ;------------------------------------------
  891. fillAttr2x2:
  892. ;for bomb
  893.        if EGA
  894. ;TODO
  895.         ret
  896.        else
  897.         ; A - color
  898.         ; HL - attribute address
  899.         ld (hl),a
  900.         inc l
  901.         ld (hl),a
  902.         ld bc,32
  903.         add hl,bc
  904.         ld (hl),a
  905.         dec l
  906.         ld (hl),a
  907.        endif
  908.         ret
  909. ;------------------------------------------
  910. fadeOutFull:
  911.         ; A - system ID after fade out
  912.         push af
  913.         call SOUND_PLAYER.SET_SOUND.mute
  914. .again:
  915.         ld hl,#5800
  916.         ld e,l
  917. .loop:
  918.         ld a,(hl)
  919.         and %00000111
  920.         jr z,.next
  921.         ld e,1
  922.         dec a
  923.         ld (hl),a
  924. .next
  925.         inc hl
  926.         ld a,h
  927.         cp #5B
  928.         jr c,.loop
  929.         halt
  930.         halt
  931.         rrc e
  932.         jr c,.again
  933.         pop af
  934.         ret
  935. ;------------------------------------------
  936. clear2x2:
  937.         ld l,(ix+oData.scrAddrL)
  938.         ld h,(ix+oData.scrAddrH)
  939.         push hl
  940.         call clear1x2
  941.         pop hl
  942.         inc l
  943.         jp clear1x2
  944. ;------------------------------------------
  945. animation2x2:
  946.         ; for sprites 2x2
  947.         ; C - total frames
  948.         ; HL - addresses of first animation sprite
  949.         ld a,(ix+oData.animationId)
  950.         inc a
  951.         cp c
  952.         jr c,.nextFrame
  953.         xor a
  954. .nextFrame:
  955.         ld (ix+oData.animationId),a
  956.        if EGA
  957. ;a=anim phase
  958. ;count *(34*8+4) = *276 = *0x114
  959.       ;push bc
  960.        push hl
  961.        ld l,a
  962.        ld h,0
  963.        ld c,l
  964.        ld b,h
  965.        add hl,hl
  966.        add hl,hl
  967.        add hl,hl
  968.        add hl,hl ;*0x10
  969.        add hl,bc ;*0x11
  970.        add hl,hl ;*0x22
  971.        add hl,hl ;*0x44
  972.        add hl,bc ;*0x45
  973.        add hl,hl ;*0x8a
  974.        add hl,hl ;*0x114      
  975.        pop bc
  976.        add hl,bc
  977.       ;pop bc
  978.        else
  979.         rrca
  980.         rrca
  981.         rrca
  982.         add a,l
  983.         ld l,a
  984.         adc a,h
  985.         sub l
  986.         ld h,a
  987.        endif
  988.         ld (ix+oData.sprAddrL),l
  989.         ld (ix+oData.sprAddrH),h
  990.         ret
  991. ;--------------------------------------
  992.         ; http://map.grauw.nl/sources/external/z80bits.html#5.1
  993.         ; 16-bit Integer to ASCII (decimal)
  994.         ; Input: HL = number to convert, DE = location of ASCII string
  995.         ; Output: ASCII string at (DE)
  996. convertCoin:
  997.         ld hl,(coins)
  998.         ld de,coinsText
  999. asciiConvert:
  1000. Num2Dec
  1001.         ld      bc,-10000
  1002.         call    Num1
  1003.         ld      bc,-1000
  1004.         call    Num1
  1005.         ld      bc,-100
  1006.         call    Num1
  1007.         ld      c,-10
  1008.         call    Num1
  1009.         ld      c,b
  1010. Num1    ld      a,'0'-1
  1011. Num2    inc     a
  1012.         add     hl,bc
  1013.         jr      c,Num2
  1014.         sbc     hl,bc
  1015.         ld      (de),a
  1016.         inc     de
  1017.         ret
  1018. ;------------------------------------------
  1019. getCurrentLevelAddress:
  1020.         ; return HL = level data address (walls)
  1021.         ld a,(currentLevel)
  1022.         rlca
  1023.         add a,low LEVELS_MAP
  1024.         ld l,a
  1025.         adc a,high LEVELS_MAP
  1026.         sub l
  1027.         ld h,a
  1028.         ld c,(hl)
  1029.         inc hl
  1030.         ld b,(hl)
  1031.         ; BC = offset of level addresses map
  1032.         ld hl,LEVELS_BEGIN
  1033.         add hl,bc
  1034.         ret
  1035. ;------------------------------------------
  1036. countObjectsSameType:
  1037.         ; count objects of the same type (sprite ID)
  1038.         ; A - sprite ID for search
  1039.         ; return A > number of objects
  1040.         ld de,OBJECT_DATA_SIZE
  1041.         ld hl,objectsData + oData.spriteId
  1042.         ld bc,MAX_OBJECTS * 256         ; C = 0 as counter
  1043. .search:
  1044.         cp (hl)
  1045.         jr nz,.next
  1046.         inc c
  1047. .next
  1048.         add hl,de
  1049.         djnz .search
  1050.         ld a,c
  1051.         ret
  1052. ;------------------------------------------
  1053. ; my paste Fill algorithm: https://pastebin.com/4X4C8e62
  1054. fillInsideLevel:
  1055.         ; HL strart cell for begin fill
  1056.         ld (fillStack),sp
  1057.         ld sp,buffer256 + 254
  1058.         ld de,MAP_WIDTH         //  line size
  1059.         jr fillProced
  1060. return
  1061.         ld sp,(fillStack)
  1062.         ret
  1063. //---------------------------------
  1064. fillProced
  1065. ;заливка площади уровня
  1066.         ld c,0
  1067.         ld b,(hl)   //  B = find ID
  1068.         push hl
  1069. again
  1070.         ld (tmpStack),sp
  1071.         ld a,(tmpStack)
  1072.         cp low buffer256 + 254
  1073.         jr z,return    //  stack is over
  1074.         pop hl
  1075.         ld a,(hl)
  1076.         cp b
  1077.         jp nz,again     //  does not need processing
  1078.         ld a,b          //  find ID
  1079.         ld (hl),c
  1080.         ex af,af
  1081.         ld a,l
  1082.         exx
  1083.         ld c,a
  1084.         ld hl,EMPTY_PBM
  1085.         call printSpr
  1086.         exx
  1087.         ex af,af
  1088. left
  1089.         dec l
  1090.         cp (hl)
  1091.         jp nz,down
  1092.         push hl
  1093. down
  1094.         inc l
  1095.         add hl,de
  1096.         cp (hl)
  1097.         jp nz,right
  1098.         push hl
  1099. right
  1100.         inc l
  1101.         or a
  1102.         sbc hl,de
  1103.         cp (hl)
  1104.         jp nz,up
  1105.         push hl
  1106. up
  1107.         dec l
  1108.         or a
  1109.         sbc hl,de
  1110.         cp (hl)
  1111.         jp nz,again
  1112.         push hl
  1113.         jp again