?login_element?

Subversion Repositories NedoOS

Rev

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

  1.  
  2.        IF crosshair
  3.        MACRO XORN
  4.         LD A,(HL)
  5.         XOR \0
  6.         LD (HL),A
  7.        ENDM
  8.  
  9. CROSSHAIR
  10.         LD HL,scrbuf+(scrwid/2<8)+(scrhgtpix/2)
  11.         XORN #0F
  12.         DEC H
  13.         XORN #78
  14.         INC L
  15.         XORN #78
  16.         INC H
  17.         XORN #0F
  18.         LD L,scrbuf+(scrhgtpix/2)-7
  19.         XORN #80
  20.         LD L,scrbuf+(scrhgtpix/2)-3
  21.         XORN #80
  22.         LD L,scrbuf+(scrhgtpix/2)+4
  23.         XORN #80
  24.         LD L,scrbuf+(scrhgtpix/2)+8
  25.         XORN #80
  26.         RET
  27.        ENDIF ;crosshair
  28.  
  29. CHECKHEIGHTS
  30.         LD HL,distbuf+#200 ;dist
  31.         LD DE,scrbufflag
  32.         LD BC,scrwid<8+lowmaxscale
  33. checkheights0
  34.         LD A,C;lowmaxscale
  35. _=pixperchr
  36.        DUP pixperchr
  37. _=_-1
  38.         CP (HL)
  39.        IF debug
  40.        CALL npp
  41.        ENDIF
  42.         INC L
  43.         jr C,checkhigh-_
  44.        EDUP
  45.         XOR A
  46.         JP checklow
  47.        DUP pixperchr
  48.         INC L
  49.        EDUP
  50. checkhigh ;A<>0 <128
  51. checklow ;A=0
  52.         LD (DE),A
  53.         INC D
  54.         DJNZ checkheights0
  55.         RET
  56.  
  57.        IF debug
  58. npp
  59.        PUSH AF
  60.        PUSH HL
  61.         jr C,NNN
  62.         LD HL,nlow
  63.         INC (HL)
  64.         INC HL
  65.         jr Z,$-2
  66. NNN
  67.         LD HL,nstolb
  68.         INC (HL)
  69.         INC HL
  70.         jr Z,$-2
  71.        POP HL
  72.        POP AF
  73.         RET
  74. nlow
  75.         DS 4
  76. nstolb
  77.         DS 4
  78.        ENDIF
  79.  
  80.        if atm == 0
  81. CLSCRBUF
  82.         LD H,scrbuf/256
  83.         LD BC,scrwid*256+(0xff&scrbufflag)
  84.         XOR A
  85.         LD D,A
  86.         ld E,A
  87. clscrbuf0 ;
  88.         LD L,C;scrbufflag
  89.         CP (HL)
  90.         jr NZ,clscrhigh
  91.         LD L,0xff&(lowscrbuf+lowscrhgtpix)
  92.         LD SP,HL
  93.        IF (0xff&(scrbuf+scrhgtpix)) == 0
  94.         INC H
  95.        ENDIF
  96.         JP clscrlow
  97. clscrhigh
  98.         LD L,0xff&(scrbuf+scrhgtpix)
  99.        IF (0xff&(scrbuf+scrhgtpix)) == 0
  100.         INC H
  101.        ENDIF
  102.         LD SP,HL
  103.        DUP scrhgtpix/2
  104.         PUSH DE
  105.        EDUP
  106. clscrlow=$-(lowscrhgtpix/2)-1 ;EORFILL could corrupt a word
  107.        IF 0xff&(scrbuf+scrhgtpix)
  108.         INC H
  109.        ENDIF
  110.         DJNZ clscrbuf0
  111. clscrbufsp=$+1
  112.         LD SP,0
  113.         RET
  114.        endif
  115.  
  116.        if atm == 0
  117. EORFILL
  118.        IF doublescr
  119.         LD A,(newscr)
  120.         SUB 1
  121.         SBC A,A
  122.         AND #80
  123.         XOR scrtop/256
  124.         LD (curscrtopH),A
  125.         ADD A,+(lowscrtop/256)-(scrtop/256)
  126.         LD (curlowscrtopH),A
  127.         ADD A,+(attrtop/256)-(lowscrtop/256)
  128.         LD (curattrtopH),A
  129.         LD (curattrtopH2),A
  130.        ENDIF
  131.         LD L,scrtop&0xff
  132.         LD C,32
  133.         EXX
  134.         LD H,scrbuf/256
  135.         LD DE,+((scrbuf&0xff)*256)+(0xff&lowscrbuf)
  136.         LD BC,+(scrwid*256)+(0xff&scrbufflag)
  137. eorfill0 ;
  138.         LD L,C;scrbufflag
  139.         LD A,(HL)
  140.         OR A
  141.         JP Z,eorfilllow
  142. eorfillhigh
  143.         LD L,D;scrbuf
  144.         LD SP,HL
  145.         EXX
  146. ;EOR-fill столбца на экран:
  147. curscrtopH=$+1
  148.         LD H,scrtop/256 ;#40
  149.        JP M,eorcopy
  150.         LD A,L
  151.         AND 31
  152.        IF scrtop&#E0
  153.         ADD A,scrtop&#E0
  154.        ENDIF
  155.         LD L,A
  156.         LD B,-7 ;BC,#F920
  157.         XOR A
  158. _=scrtop/32
  159.       DUP scrhgt ;8
  160.        DUP 4
  161.         POP DE
  162.         XOR E
  163.         LD (HL),A
  164.         INC H
  165.         XOR D
  166.         LD (HL),A
  167.         INC H
  168.        EDUP
  169.         ORG $-1
  170. __=$
  171.         ADD HL,BC
  172. _=_+1
  173.        IF (_&7) == 0
  174.         ORG __
  175.         LD B,0 ;BC=#0020
  176.         ADD HL,BC
  177.         LD B,-7
  178.        ENDIF
  179.       EDUP
  180.         ORG __
  181. eorcopyQ
  182. ;attrs after pixels for no flickering
  183.         LD A,L
  184.         AND 31
  185.        IF attrtop&#E0
  186.         ADD A,attrtop&#E0
  187.        ENDIF
  188.         LD L,A
  189. curattrtopH=$+1
  190.         LD H,attrtop/256
  191.         LD A,colour
  192.         CP (HL)
  193.         jr Z,eorfillok
  194.         LD B,0 ;BC=32
  195.        DUP (scrhgt-lowscrhgt)/2
  196.         LD (HL),A
  197.         ADD HL,BC
  198.        EDUP
  199.         ORG $-1
  200.         LD DE,32*(lowscrhgt+1)
  201.         ADD HL,DE
  202.        DUP (scrhgt-lowscrhgt)/2
  203.         LD (HL),A
  204.         ADD HL,BC
  205.        EDUP
  206.         ORG $-1
  207. eorfillok ;
  208.         INC L
  209.         EXX
  210.         INC H
  211.         DEC B
  212.         JP NZ,eorfill0
  213. eorfillsp=$+1
  214.         LD SP,0
  215.         RET
  216.  
  217. eorfilllow
  218.         LD L,E;lowscrbuf
  219.         LD SP,HL
  220.         EXX
  221. ;EOR-fill низкого столбца на экран:
  222.         LD A,L
  223.         AND 31
  224.        IF attrtop&#E0
  225.         ADD A,attrtop&#E0
  226.        ENDIF
  227.         LD L,A
  228. curattrtopH2=$+1
  229.         LD H,attrtop/256
  230.         LD A,ceilingcolour
  231.         CP (HL)
  232.         jr Z,eorfilllownattr
  233.         LD B,0 ;BC=32
  234.        DUP (scrhgt-lowscrhgt)/2
  235.         LD (HL),A
  236.         ADD HL,BC
  237.        EDUP
  238.         ORG $-1
  239.         LD DE,32*(lowscrhgt+1)
  240.         ADD HL,DE
  241.         LD A,floorcolour
  242.        DUP (scrhgt-lowscrhgt)/2
  243.         LD (HL),A
  244.         ADD HL,BC
  245.        EDUP
  246.         ORG $-1
  247. eorfilllownattr ;
  248.         LD A,L
  249.         AND 31
  250.        IF lowscrtop&#E0
  251.         ADD A,lowscrtop&#E0
  252.        ENDIF
  253.         LD L,A
  254. curlowscrtopH=$+1
  255.         LD H,lowscrtop/256
  256.        ;branch to eorcopylow
  257.  
  258.        ;
  259.         LD B,-7 ;BC,#F920
  260.         XOR A
  261. _=lowscrtop/32
  262.       DUP lowscrhgt
  263.        DUP 4
  264.         POP DE
  265.         XOR E
  266.         LD (HL),A
  267.         INC H
  268.         XOR D
  269.         LD (HL),A
  270.         INC H
  271.        EDUP
  272.         ORG $-1
  273. __=$
  274.         ADD HL,BC
  275. _=_+1
  276.        IF (_&7) == 0
  277.         ORG __
  278.         LD B,0 ;BC=#0020
  279.         ADD HL,BC
  280.         LD B,-7
  281.        ENDIF
  282.       EDUP
  283.         ORG __
  284.         JP eorfillok
  285.  
  286. eorcopy
  287.         LD A,L
  288.         AND 31
  289.        IF scrtop&#E0
  290.         ADD A,scrtop&#E0
  291.        ENDIF
  292.         LD L,A
  293.         LD B,-7 ;BC,#F920
  294.         XOR A
  295. _=scrtop/32
  296.       DUP scrhgt ;8
  297.        DUP 4
  298.         POP DE
  299.         LD (HL),E
  300.         INC H
  301.         LD (HL),D
  302.         INC H
  303.        EDUP
  304.         ORG $-1
  305. __=$
  306.         ADD HL,BC
  307. _=_+1
  308.        IF (_&7) == 0
  309.         ORG __
  310.         LD B,0 ;BC=#0020
  311.         ADD HL,BC
  312.         LD B,-7
  313.        ENDIF
  314.       EDUP
  315.         ORG __
  316.         JP eorcopyQ
  317.  
  318. eorcopylow
  319.         LD B,-7 ;BC,#F920
  320.         XOR A
  321. _=lowscrtop/32
  322.       DUP lowscrhgt
  323.        DUP 4
  324.         POP DE
  325.         LD (HL),E
  326.         INC H
  327.         LD (HL),D
  328.         INC H
  329.        EDUP
  330.         ORG $-1
  331. __=$
  332.         ADD HL,BC
  333. _=_+1
  334.        IF (_&7) == 0
  335.         ORG __
  336.         LD B,0 ;BC=#0020
  337.         ADD HL,BC
  338.         LD B,-7
  339.        ENDIF
  340.       EDUP
  341.         ORG __
  342.         JP eorfillok
  343.  
  344. DHL
  345.         INC H
  346.         LD A,H
  347.         AND 7
  348.         RET NZ
  349.         LD A,L
  350.         ADD A,32
  351.         LD L,A
  352.         RET C
  353.         LD A,H
  354.         SUB 8
  355.         LD H,A
  356.         RET
  357.        endif
  358.  
  359.        IF atm == 0
  360. DRAWWALLS
  361.         LD HY,DWJP/256
  362.         LD L,0
  363.        ;LD DE,distbuf+3
  364.         EXX
  365.         LD D,scrbuf/256
  366.        IF lores == 0
  367.         LD C,#80
  368.        ELSE
  369.         LD C,#C0
  370.        ENDIF
  371.         LD B,scrwid
  372. DW0 ;
  373.         EXX
  374.         LD H,distbuf/256 ;D ;+3
  375.         LD D,(HL) ;ID
  376.        IF debug
  377.         LD A,D
  378.         CP -20
  379.         jr NC,$+4
  380.         LD D,-20
  381.        ENDIF
  382.         INC H
  383.         LD E,(HL) ;texx
  384.         INC H
  385.         LD A,(DE)
  386.         INC D
  387.        LD C,A ;+4
  388.         LD A,(DE)
  389.        LD B,A ;+4
  390.        LD A,(BC) ;-12
  391.        LD LY,A
  392.         LD HX,B
  393.         LD LX,C
  394.         LD A,(HL) ;dist
  395.         INC L
  396.         EXX
  397.        IF 0
  398. ;#06..#2B = 38
  399. ;#2C,#2E..#56 = 22
  400. ;#58,#5C..#64 = 4
  401. ;=64 scales
  402.        CP #06 ;max=#06
  403.        jr NC,$+4
  404.        LD A,#06
  405.        CP #67
  406.        jr C,$+4
  407.        LD A,#67
  408.        CP #2C ;min=#28
  409.        jr C,$+4
  410.        AND #FE
  411.        CP #58 ;min=#50
  412.        jr C,$+4
  413.        AND #FC
  414.        ENDIF
  415.         LD L,A
  416.        IF optres
  417. foptfast=$+1
  418.         CP lowmaxscale
  419.         jr NC,DW0high
  420. DW0low ;
  421.        LD B,C
  422.        ENDIF
  423. ;d=столбец
  424. ;c=битмаска столбца
  425. ;ix=адрес графики столбца
  426. ;l=scale
  427.        ;LD A,(IX) ;(18-N)*7
  428.        ;LD LY,A
  429.         JP (IY)
  430.        IF optres
  431. DW0high ;
  432.         LD A,C
  433.         AND %10101010
  434.         jr Z,DW0low
  435.         RRCA
  436.        LD B,A
  437.         OR C
  438.         LD C,A
  439.         EXX
  440.         INC L
  441.         EXX
  442.         JP (IY)
  443.        ENDIF
  444.         DISPLAY "DWJP=",$
  445.       ;IF .$+(16*7+1)&256
  446.         align 256 ;DS .(-$)
  447.       ;ENDIF
  448. DWJP
  449. _=17
  450.        DUP 17
  451.         LD H,(IX+_) ;Y в текстуре
  452.         LD E,(HL) ;-Y*N
  453.         LD A,(DE)
  454.         XOR C ;xor!
  455.         LD (DE),A
  456. _=_-1
  457.        EDUP
  458.        IF optres
  459.        ;LD A,C ;%11000000
  460.        ;RRCA   ;%01100000
  461.        ;AND C  ;%01000000
  462.        ;JP Z,$+4
  463.        ;LD C,A
  464.        LD C,B
  465.        ENDIF
  466.         RRC C
  467.        IF lores
  468.         RRC C
  469.        ENDIF
  470.         JP NC,DW0
  471.         INC D
  472.        IF optres
  473.         LD A,D
  474.         CP scrbuf/256+scrwid
  475.        ELSE
  476.         DEC B
  477.        ENDIF
  478.         JP NZ,DW0
  479.         RET
  480.        endif ;~atm
  481.  
  482.        if atm
  483. DWCLSALL
  484.         LD D,%11111111
  485.         LD HL,#4000+36
  486.         CALL DWCLS
  487.         LD HL,#6000+36
  488.         CALL DWCLS
  489.         LD D,%11110110
  490.         LD HL,#4000+(108*40)+36
  491.         CALL DWCLS
  492.         LD HL,#6000+(108*40)+36
  493.        ;CALL DWCLS
  494. DWCLS
  495.        LD A,(timer)
  496.        PUSH HL
  497.        PUSH AF
  498.         LD (dwclsp),SP
  499.         LD BC,40
  500.        ;LD D,B ;=0
  501.         LD E,D
  502.         LD A,scrhgt/2-8
  503. DWCL0   LD SP,HL
  504.         DUP 16;20
  505.         PUSH DE
  506.         EDUP
  507.         ADD HL,BC
  508.         DEC A
  509.         JP NZ,DWCL0
  510. dwclsp=$+1
  511.         LD SP,0
  512.        POP AF
  513.        LD HL,timer
  514.        CP (HL)
  515.        POP HL
  516.        RET Z
  517. ;int detected - clear left
  518.         LD BC,-34
  519.         ADD HL,BC
  520.        LD A,D
  521.         LD DE,39
  522.         LD B,scrhgt/2-8
  523. DWCL1   LD (HL),D
  524.         INC HL
  525.         LD (HL),D
  526.         ADD HL,DE
  527.         DJNZ DWCL1
  528.        LD D,A ;keep D
  529.         RET
  530.  
  531. DRAWWALLS
  532. ;A=0..1 - номер битплана
  533.         LD (dwloopsp),SP
  534.         LD BC,40
  535.         LD IX,DWLOOP0
  536.         EXX
  537.         LD E,A ;0..1
  538.         LD H,tID/256
  539.         ;LD BC,#3FF7 ;(можно одно окно + кэш)
  540.         JP DWLOOPGO
  541. DWLOOP0
  542.         LD SP,SPOIL6BSTACK;-2 ;можно портить
  543.         EXX
  544.         LD A,E
  545.         ADD A,2 ;чтобы не включать стр. экрана каждый столбец
  546.         CP scrwid*4
  547.         jr NC,DWLOOPQ
  548.         LD E,A
  549. DWLOOPGO
  550.         LD D,distbuf/256
  551.         LD A,(DE) ;ID
  552.        RRCA
  553.        ADD A,A ;флаг зеркальности в CY
  554.         INC D
  555.         LD L,A
  556.         LD A,(HL)
  557.       ;ld (pg8000),a
  558.       SETPG32KLOW ;OUT (C),A ;pg[ID]
  559.         INC L
  560.         LD A,(DE) ;texx=#40..#7F
  561.        jr NC,$+3
  562.        CPL ;зеркальная
  563.       AND 0x3F ;
  564.       or 0x80  ;TODO уже в ray?
  565.         LD HY,A
  566.         INC D
  567.         LD A,(HL) ;laddr[ID] = #02/#42/#82/#C2
  568.         LD LY,A
  569.         LD A,(DE) ;scale = 0..0x3f
  570.         EXX
  571.         LD E,(IY-2)
  572.         LD D,(IY-1) ;INT-PROOF
  573.        ADD A,A ;
  574.        ADD A,A ;при интерполяции нельзя обработать scale внутри таблицы tlogd2sca
  575.        ;NC
  576.         LD L,A
  577.         LD H,tscaljps/256
  578.         EXX
  579.         LD A,E
  580.         rra;SRL A
  581.         SRL A ;CY=0 для +0, CY=1 для +#2000
  582.         EXX
  583.         LD SP,IY
  584.         JP (HL)
  585. DWLOOPQ
  586. dwloopsp=$+1
  587.         LD SP,0
  588.         RET
  589.        ENDIF ;atm
  590.  
  591. ;=====================
  592.        IF sprites
  593.  
  594.        IF optresspr
  595. DRAWSPRITEloresspr_hires
  596.         SLA E
  597.         RL D
  598.        LD B,H
  599.         LD C,L ;x
  600.         PUSH IX
  601.         POP HL
  602.         LD L,#FF ;texx LSB
  603.         LD LX,A ;scale
  604.         EXX
  605.          LD C,LX ;scale
  606.         EXX
  607.  
  608. ;find left visible margin of sprite
  609.         INC C
  610.        INC C
  611. DRAWLl0 DEC C ;x
  612.        DEC C
  613.         jr Z,DRAWLl0Q
  614.        LD A,(BC)
  615.        CP LX
  616.        jr NC,DRAWLlQ
  617.         ADD HL,DE ;DE>0
  618.        LD A,#FF ;texxright
  619.         CP H
  620.         JP P,DRAWLl0
  621.         JR DRAWLlQ
  622. DRAWLl0Q ;x=0
  623.        LD A,(BC)
  624.        CP LX
  625.        jr NC,DRAWLlQ
  626.         ADD HL,DE ;DE>0
  627.         DEC C ;x
  628.        DEC C
  629. DRAWLlQ ;H,C out of range
  630.  
  631. ;scan sprite to the right and keep H=texx in stack
  632.         INC C ;x in range
  633.        INC C
  634.         XOR A
  635.         SUB E
  636.         LD E,A
  637.         SBC A,D
  638.         SUB E
  639.         LD D,A
  640.         LD HX,1;B,1 ;sprite width counter
  641. DRAWRl0
  642.        LD A,(BC)
  643.        CP LX
  644.        jr NC,DRAWRlQ
  645.         ADD HL,DE ;DE<0
  646.        LD A,#7F ;texxleft-1
  647.         CP H ;texxleft
  648.         jr NC,DRAWRlQ
  649.        PUSH HL ;H in range
  650.         INC HX;B
  651.         INC C ;x
  652.        INC C
  653.         JP NZ,DRAWRl0
  654. DRAWRlQ ;H,C out of range
  655.  
  656.         DEC HX;B
  657.        RET Z ;width=0, stack is empty
  658.  
  659.         DEC C ;x in range
  660.        DEC C
  661.         LD A,C ;x
  662.         RRA
  663.         RRA
  664.         RRA
  665.         AND 31
  666.         ADD A,scrbuf/256
  667.         LD D,A
  668.         LD A,C
  669.         RRA
  670.         AND 3
  671.         INC A
  672.         LD B,A
  673.         LD A,#03
  674.         RRCA
  675.         RRCA
  676.         DJNZ $-2
  677.         LD C,A
  678.         CPL
  679.         LD B,A
  680. ;D=scrbuf/256
  681. ;B=running 0
  682. ;C=running 1
  683.  ;D'=ID
  684.  ;C'=scale
  685.         LD A,7 ;rlca
  686.         JP SDRAWPATCH ;SDRAW0
  687.        ENDIF
  688.  
  689. DRAWSPRITE
  690. ;don't spoil iy!
  691. ;a=scale# = 0..0x3f
  692. ;H=distbuf/256+2 ;ID,texx,dist
  693. ;l=x
  694. ;DE=texx step
  695. ;HX=texxmid
  696.  ;D'=ID (не atm)
  697.         if atm
  698.         push af
  699. drawspritepg=$+1
  700.        ld a,(ttexpgs+NTEXPGS) ;TODO from ID
  701.       ;ld (pg8000),a
  702.       ;SETPG32KLOW ;OUT (C),A ;pg[ID]
  703.       SETPG32KHIGH
  704.         pop af
  705.         endif
  706.  
  707.        IF optresspr
  708.         CP lowmaxscale
  709.         JP NC,DRAWSPRITEloresspr_hires
  710.        ENDIF
  711.        LD B,H
  712.         LD C,L ;x
  713.         ;PUSH IX
  714.         ;POP HL
  715.         LD LX,A ;scale
  716.          ld a,hx ;texxmid
  717.          ld h,a
  718.          LD L,0xFF ;texx LSB
  719.         if atm==0
  720.         EXX
  721.          LD C,LX ;scale
  722.         EXX
  723.         endif
  724.  
  725.         XOR A
  726.         SUB E
  727.         LD E,A
  728.         SBC A,D
  729.         SUB E
  730.         LD D,A
  731.  
  732. ;find left visible margin of sprite
  733. ;TODO fix пропущена колонка 0
  734. ;TODO рисовать даже при центре за левым или правым краем экрана
  735.  
  736.         INC C
  737.        IF loresspr_hires
  738.        INC C
  739.        ENDIF
  740. DRAWL0  DEC C ;x
  741.        IF loresspr_hires
  742.        DEC C
  743.        ENDIF
  744.         jr Z,DRAWL0Q
  745.        LD A,(BC)
  746.        CP LX
  747.        jr NC,DRAWLQ
  748. ;        ADD HL,DE ;DE>0
  749. ;         jr c,DRAWLQ
  750. ;       ld a,h
  751. ;drawspritetexxright=$+1
  752. ;       cp 44/2 ;0xFF ;texxright
  753. ;       JP C,DRAWL0
  754.         ADD HL,DE ;DE<0
  755.          jr NC,DRAWLQtexx0
  756.        ld a,h
  757. drawspritetexxleft=$+1
  758.        cp 0 ;texxleft
  759.         jr NC,DRAWL0
  760. DRAWLQtexx0
  761.         JR DRAWLQ
  762. ;         or a
  763. ;         sbc hl,de ;костыль
  764. ;        JR DRAWLQ
  765. DRAWL0Q ;x=0
  766.        LD A,(BC)
  767.        CP LX
  768.        jr NC,DRAWLQ
  769.         ADD HL,DE ;DE>0
  770.         DEC C ;x
  771.        IF loresspr_hires
  772.        DEC C
  773.        ENDIF
  774. DRAWLQ ;H,C out of range
  775.  
  776. ;scan sprite to the right and keep H=texx in stack
  777.         XOR A
  778.         SUB E
  779.         LD E,A
  780.         SBC A,D
  781.         SUB E
  782.         LD D,A
  783.        
  784.         INC C ;x in range
  785.        IF loresspr_hires
  786.        INC C
  787.        ENDIF
  788.        
  789.         LD HX,1;B,1 ;sprite width counter
  790.  
  791.        LD A,(BC)
  792.        CP LX
  793.        jr NC,DRAWRQ
  794.        add hl,de ;первое сложение не проверяем!
  795.        jp DRAWR0GO
  796.        
  797. DRAWR0
  798.        LD A,(BC)
  799.        CP LX
  800.        jr NC,DRAWRQ
  801. ;        ADD HL,DE ;DE<0
  802. ;         jr NC,DRAWRQ
  803. ;       ld a,h
  804. ;drawspritetexxleft=$+1
  805. ;       cp 0 ;texxleft
  806. ;        jr C,DRAWRQ
  807.         ADD HL,DE ;DE>0
  808.          jr c,DRAWRQ
  809. DRAWR0GO
  810.        ld a,h
  811. drawspritetexxright=$+1
  812.        cp 44/2 ;0xFF ;texxright
  813.        JP NC,DRAWRQ
  814.        PUSH HL ;H in range
  815.         INC HX;B
  816.         INC C ;x
  817.        IF loresspr_hires
  818.        INC C
  819.        ENDIF
  820.        IF lores
  821.         JP P,DRAWR0
  822.        ELSE
  823.         JP NZ,DRAWR0
  824.        ENDIF
  825. DRAWRQ ;H,C out of range
  826.  
  827.         DEC HX;B
  828.        RET Z ;width=0, stack is empty
  829.  
  830.         DEC C ;x in range
  831.        IF loresspr_hires
  832.        DEC C
  833.        ENDIF
  834.        
  835.        if atm
  836. ;de=f(scale#,x)
  837. ;scr=f(x)
  838.         push bc
  839. ;lx=scale# = 0..63
  840.  
  841.         LD hl,tscales_rev
  842.         ld a,lx
  843.         add a,a
  844.         add a,l
  845.         ld l,a
  846.         jr nc,$+3
  847.         inc h
  848.         LD C,(HL)
  849.         INC HL
  850.         LD B,(HL) ;BC=scale
  851.         ld (drawsprscalebc),bc ;шаг по текстуре(+7.8) = 64/hgt = 1/scale
  852.  
  853.         LD hl,tscales
  854.         ld a,lx
  855.         add a,a
  856.         add a,l
  857.         ld l,a
  858.         jr nc,$+3
  859.         inc h
  860.         LD C,(HL)
  861.         INC HL
  862.         LD B,(HL) ;BC=scale(+7.8) = 1/4(hgt=16) ... 4.0(hgt=256) ;hgt=64*scale
  863. ;bc=scale
  864.         call scale2ytop
  865. ;out: de=Y, lx=y
  866.  
  867.         if 1==0
  868.         srl b
  869.         rr c
  870.         srl b
  871.         rr c
  872.         ld h,d
  873.         ld l,e
  874.         add hl,bc ;ylow
  875.         ld a,h
  876.         or a
  877.         ld a,l
  878.         jr nz,prsprtoolow
  879.         cp scrhgt
  880.         jr c,$+4
  881. prsprtoolow
  882.         ld a,scrhgt
  883.         endif
  884.        
  885.         inc d
  886.         dec d
  887.         jr Z,drawsprnottoohigh
  888.         ld de,0
  889. drawsprnottoohigh
  890.  
  891.         ;sub e
  892.         ;ld (drawsprscale),a ;реальное число выводимых строк (TODO сделать нормально с зумом)
  893.        
  894.         ;LD A,D
  895.         ;OR A
  896.         ;jr NZ,drawsprTOP
  897.         ;LD A,E
  898.         ;CP Ytop
  899.         ;jr C,drawsprTOP
  900.         CALL YtoADDR
  901. ;        JR drawsprnTOP
  902. ;drawsprTOP
  903. ;        LD DE,scrtop
  904. ;drawsprnTOP
  905.  
  906.         pop bc
  907.         LD A,C ;xright!
  908.         ;RRA
  909.         RRA
  910.         rra
  911.         jr nc,$+4
  912.         set 5,d
  913.         and 31
  914.         add a,e
  915.         ld e,a
  916.         jr nc,$+3
  917.         inc d
  918.  
  919.         call getuser_scr_low
  920.         ld (SDRAW0_scrpg),a ;TODO from x
  921.         ld (SDRAW0_low),a
  922.         ld h,a
  923.         call getuser_scr_high
  924.         xor h
  925.         ld (SDRAW0_high_xor_low),a
  926.  
  927.        else
  928.         LD A,C ;x
  929.         RRA
  930.         RRA
  931.        IF lores == 0
  932.         RRA
  933.        ENDIF
  934.         AND 31
  935.         ADD A,scrbuf/256
  936.         LD D,A
  937.         LD A,C
  938.        IF loresspr_hires
  939.         RRA
  940.        ENDIF
  941.        IF loresspr
  942.         AND 3
  943.        ELSE
  944.         AND 7
  945.        ENDIF
  946.         INC A
  947.         LD B,A
  948.        IF loresspr == 0
  949.         LD A,#01
  950.        ELSE
  951.         LD A,#03
  952.        ENDIF
  953. DRAWRR0 RRCA
  954.        IF loresspr
  955.         RRCA
  956.        ENDIF
  957.         DJNZ DRAWRR0
  958.         LD C,A
  959.         CPL
  960.         LD B,A
  961. ;D=scrbuf/256, B=running 0, C=running 1 (~atm)
  962.        endif ;~atm
  963.        
  964.  ;D'=ID
  965.  ;C'=scale#
  966.        IF optresspr ;~atm
  967.         XOR A
  968.  
  969. SDRAWPATCH
  970.         LD (sdrawrlca),A
  971.        ENDIF
  972.  
  973.        if atm==0
  974. SDRAW0
  975. ;EOR-fill the column, then draw sprite column (pop hl from the stack, H=texx)
  976. ;D=scrbuf/256, B=running 0, C=running 1 (~atm)
  977.         LD H,D
  978.         LD L,scrbufflag&0xff
  979.        BIT 7,(HL)
  980.        JP NZ,SDRAWnX ;already filled
  981.         LD (HL),H ;>=128: eorcopy
  982.        EXX
  983.        LD A,C
  984.        EXX
  985.        CP lowmaxscale
  986.        jr NC,SDRAWXhigh
  987.         LD L,lowscrbuf&0xff
  988.         LD E,lowscrhgt/2-1
  989.         XOR A
  990. SDRAWXlow1 ;
  991.        DUP 16
  992.         XOR (HL)
  993.         LD (HL),A
  994.         INC L
  995.        EDUP
  996.         DEC E
  997.         JP P,SDRAWXlow1
  998.         LD A,scrhgt-lowscrhgt/2
  999. SDRAWXlow2 ;
  1000.        DUP 8
  1001.         LD (HL),E ;-1
  1002.         INC L
  1003.        EDUP
  1004.         DEC A
  1005.         JP NZ,SDRAWXlow2
  1006.         JP SDRAWnX
  1007. SDRAWXhigh
  1008.         LD L,scrbuf&0xff
  1009.         LD E,scrhgt/2
  1010.         XOR A
  1011. SDRAWX ;
  1012.        DUP 16
  1013.         XOR (HL)
  1014.         LD (HL),A
  1015.         INC L
  1016.        EDUP
  1017.         DEC E
  1018.         JP NZ,SDRAWX
  1019. SDRAWnX ;
  1020.  
  1021. SDRAW1 ;pixel column
  1022.         EXX
  1023. ;D=ID
  1024. ;C=scale#
  1025.        POP HL
  1026.          LD L,H ;texx
  1027.        IF scale64
  1028.        SRL L
  1029.        ENDIF
  1030.         LD H,D
  1031.         LD A,(HL)
  1032.         INC H
  1033.         LD H,(HL)
  1034.         LD L,A ;HL=spr
  1035. ;D'=scrbuf/256
  1036. ;B'=running 0
  1037. ;C'=running 1
  1038.         JP SCALESPRITEGO
  1039.  
  1040.        else ;~atm
  1041. ;рисуем справа налево
  1042. SDRAW0
  1043. ;de=screen
  1044. ;D'=ID
  1045. ;C'=scale#
  1046.        POP HL
  1047.          ;LD L,H ;texx
  1048.        ;IF scale64
  1049.        ;SRL L
  1050.        ;ENDIF
  1051.         ;LD H,D
  1052.         ;LD A,(HL)
  1053.         ;INC H
  1054.         ;LD H,(HL)
  1055.         ;LD L,A ;HL=spr
  1056.  
  1057. SDRAW0_high_xor_low=$+1
  1058.         ld a,0
  1059. SDRAW0_scrpg=$+1
  1060.         xor 0
  1061.         ld (SDRAW0_scrpg),a
  1062.         SETPG16K
  1063. ;4000: screen
  1064. ;c000: texture (уже поставлено в начале DRAWSPRITE)
  1065. ;8000: scaler (TODO)
  1066.  
  1067.         ld a,h ;texx=#00..#FF
  1068.        ;rra
  1069.        ;AND 0x3F
  1070.       ;or 0x80
  1071.  
  1072.         push de
  1073.         exx
  1074.         pop hl
  1075.         push hl
  1076.         ld bc,40
  1077.         ld e,IMPOSSIBLECOLOR
  1078.         exx
  1079.         ;push ix
  1080.  
  1081.         ;ld ix,0xc000 ;3fff ;TODO hl'
  1082.         ld hl,0xc000
  1083.         ld e,a
  1084. drawsprscalebc=$+1
  1085.         ld bc,0
  1086.        
  1087.         ;ld (drawsprcursp),sp
  1088.         ;ld sp,40
  1089.         ;display "drawspr00=",$
  1090. drawspr00
  1091.         ld d,h
  1092.         ld a,(de)
  1093.         exx
  1094.         cp e;IMPOSSIBLECOLOR
  1095.         jr z,$+3
  1096.          ld (hl),a
  1097.         add hl,bc
  1098.         exx
  1099.         add hl,bc
  1100.         jp nc,drawspr00 ;/m
  1101.         ;dec a
  1102.         ;jr nz,drawspr00
  1103. ;drawsprcursp=$+1
  1104. ;        ld sp,0
  1105.        
  1106.         ;pop ix
  1107.         pop de
  1108.  
  1109.         DEC HX;B ;todo E'?
  1110.         RET Z
  1111.  
  1112.         ld a,(SDRAW0_scrpg)
  1113. SDRAW0_low=$+1
  1114.         cp 0
  1115.         jr nz,SDRAW0
  1116.         bit 5,d
  1117.         res 5,d
  1118.         jr nz,SDRAW0
  1119.         set 5,d
  1120.         dec de
  1121.         JP SDRAW0
  1122.        endif ;atm
  1123.  
  1124.         if atm == 0
  1125.  
  1126. ;вывод спрайтов: y,yEND1,yEND0
  1127. ;y=yEND1: пропуск рисования единиц
  1128.  ;0 может также получиться на верх/ниж кромке в большом масштабе
  1129. ;y=#C0, yEND1=#FF: конец текстуры - два специальных Y,
  1130.  ;которым в таблице соответствуют константы при любом масштабе
  1131.   ;можно одну, рассчитанную из какого-то масштаба?
  1132. ;yEND0=yEND1: пропуск рисования нулей
  1133.  ;0 может также получиться на верх/ниж кромке в большом масштабе
  1134. maxlinehgt=59
  1135.         align 256 ;DS .(-$)
  1136.  
  1137. ;круглый адрес: пропуск рисовалки нулей
  1138.         JP EXXSCALESPRITE1
  1139.         DS 0xff&(-(4*maxlinehgt)-$)
  1140. SCALESPRITE0DRAW
  1141. ;рисовалка нулей (AND B)
  1142.        DUP maxlinehgt ;MAX=62(59 с SCALESPRITELOOP)
  1143.                       ;большие залитые области рубить на части
  1144.         LD A,(DE)
  1145.         AND B
  1146.         LD (DE),A
  1147.         DEC E
  1148.        EDUP
  1149.        ;ORG $-1
  1150. EXXSCALESPRITE1
  1151.         EXX
  1152. ;круглый адрес
  1153.         DISPLAY $,"=#XX00"
  1154.         INC L
  1155. SCALESPRITEGO
  1156. ;HL=spr
  1157. ;D=ID
  1158. ;C=scale
  1159. ;D'=scrbuf/256
  1160. ;(HL'=tempjp)
  1161. ;B'=running 0
  1162. ;C'=running 1
  1163.         LD B,(HL) ;Y в текстуре или #C0(читает 0)
  1164.         INC L
  1165.         LD A,(BC) ;Y*N
  1166.         EXX
  1167.         LD E,A
  1168. ;SCALESPRITE1GO
  1169.         EXX
  1170.         LD B,(HL) ;Y2 в текстуре (<=Y) или #FF(читает 1)
  1171.         INC L
  1172.         LD A,(BC) ;Y2*N
  1173.         EXX
  1174.         SUB E
  1175.         ADD A,A
  1176.         ADD A,A
  1177.         LD L,A
  1178.         LD H,SCALESPRITE1DRAW/256
  1179.         JP (HL) ;рисуем единицы или выходим
  1180.         align 256 ;DS .(-$)
  1181. ;круглый адрес: пропуск рисовалки единиц
  1182.         JP EXXSCALESPRITE0
  1183.         NOP
  1184. ;спецадрес: конец текстуры
  1185. ;как сюда попасть: #C0(читает 0),#FF(читает 1)
  1186. SDRAW0SKIPQ
  1187.         DEC HX;B ;todo E'?
  1188.         RET Z
  1189.         LD A,C
  1190.         RLCA
  1191.        IF loresspr|optresspr
  1192. sdrawrlca=$
  1193.         RLCA
  1194.        ENDIF
  1195.         LD C,A
  1196.         CPL
  1197.         LD B,A
  1198.         JP NC,SDRAW1
  1199.         DEC D
  1200.         JP SDRAW0
  1201.        DISPLAY $
  1202.         DS 0xff&(-(4*maxlinehgt)-$)
  1203.        DISPLAY "=",$
  1204. SCALESPRITE1DRAW
  1205. ;рисовалка единиц (OR C)
  1206.        DUP maxlinehgt ;MAX=63
  1207.                       ;большие залитые области рубить на части
  1208.         LD A,(DE)
  1209.         OR C
  1210.         LD (DE),A
  1211.         DEC E
  1212.        EDUP
  1213.        ;ORG $-1
  1214. EXXSCALESPRITE0
  1215.         EXX
  1216. ;круглый адрес
  1217.         LD B,(HL) ;Y3 в текстуре (<=Y2)
  1218.         LD A,(BC) ;Y3*N
  1219.         EXX
  1220.         SUB E
  1221.         ADD A,A
  1222.         ADD A,A
  1223.         LD L,A
  1224.         LD H,SCALESPRITE0DRAW/256
  1225.         JP (HL) ;рисуем нули
  1226.  
  1227.        IF 0
  1228. testsprite
  1229.         DB #F0,#EF,#E7
  1230.         DB #D2,#D0,#C4
  1231.         DB #C0,#FF
  1232.        ENDIF
  1233.  
  1234.        endif ;~atm
  1235.  
  1236.        ENDIF ;sprites