?login_element?

Subversion Repositories NedoOS

Rev

Rev 798 | Rev 1909 | 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 ;TODO рисовать уровни так, чтобы при взгляде вверх все были незеркальные, вниз - все зеркальные (тогда и зеркальность не нужно будет хранить?)
  554.        ;set 7,a ;быстрый пересчёт ID_DOOR (открытая дверь < 128)
  555.         INC D
  556.         LD L,A
  557.         LD A,(HL)
  558.       ;ld (pg8000),a
  559.       SETPG8000 ;OUT (C),A ;pg[ID]
  560.         INC L
  561.         LD A,(DE) ;texx=#40..#7F
  562.        jr NC,$+3
  563.        CPL ;зеркальная
  564.       AND 0x3F ;
  565.       or 0x80  ;TODO уже в ray?
  566.         LD HY,A
  567.         INC D
  568.         LD A,(HL) ;laddr[ID] = #02/#42/#82/#C2
  569.         LD LY,A
  570.         LD A,(DE) ;scale = 0..0x3f
  571.         EXX
  572.         LD E,(IY-2)
  573.         LD D,(IY-1) ;INT-PROOF
  574.        ADD A,A ;
  575.        ADD A,A ;при интерполяции нельзя обработать scale внутри таблицы tlogd2sca
  576.        ;NC
  577.         LD L,A
  578.         LD H,tscaljps/256
  579.         EXX
  580.         LD A,E
  581.         rra;SRL A
  582.         SRL A ;CY=0 для +0, CY=1 для +#2000
  583.         EXX
  584.         LD SP,IY
  585.         JP (HL)
  586. DWLOOPQ
  587. dwloopsp=$+1
  588.         LD SP,0
  589.         RET
  590.        ENDIF ;atm
  591.  
  592. ;=====================
  593.        IF sprites
  594.  
  595.        IF optresspr
  596. DRAWSPRITEloresspr_hires
  597.         SLA E
  598.         RL D
  599.        LD B,H
  600.         LD C,L ;x
  601.         PUSH IX
  602.         POP HL
  603.         LD L,#FF ;texx LSB
  604.         LD LX,A ;scale
  605.         EXX
  606.          LD C,LX ;scale
  607.         EXX
  608.  
  609. ;find left visible margin of sprite
  610.         INC C
  611.        INC C
  612. DRAWLl0 DEC C ;x
  613.        DEC C
  614.         jr Z,DRAWLl0Q
  615.        LD A,(BC)
  616.        CP LX
  617.        jr NC,DRAWLlQ
  618.         ADD HL,DE ;DE>0
  619.        LD A,#FF ;texxright
  620.         CP H
  621.         JP P,DRAWLl0
  622.         JR DRAWLlQ
  623. DRAWLl0Q ;x=0
  624.        LD A,(BC)
  625.        CP LX
  626.        jr NC,DRAWLlQ
  627.         ADD HL,DE ;DE>0
  628.         DEC C ;x
  629.        DEC C
  630. DRAWLlQ ;H,C out of range
  631.  
  632. ;scan sprite to the right and keep H=texx in stack
  633.         INC C ;x in range
  634.        INC C
  635.         XOR A
  636.         SUB E
  637.         LD E,A
  638.         SBC A,D
  639.         SUB E
  640.         LD D,A
  641.         LD HX,1;B,1 ;sprite width counter
  642. DRAWRl0
  643.        LD A,(BC)
  644.        CP LX
  645.        jr NC,DRAWRlQ
  646.         ADD HL,DE ;DE<0
  647.        LD A,#7F ;texxleft-1
  648.         CP H ;texxleft
  649.         jr NC,DRAWRlQ
  650.        PUSH HL ;H in range
  651.         INC HX;B
  652.         INC C ;x
  653.        INC C
  654.         JP NZ,DRAWRl0
  655. DRAWRlQ ;H,C out of range
  656.  
  657.         DEC HX;B
  658.        RET Z ;width=0, stack is empty
  659.  
  660.         DEC C ;x in range
  661.        DEC C
  662.         LD A,C ;x
  663.         RRA
  664.         RRA
  665.         RRA
  666.         AND 31
  667.         ADD A,scrbuf/256
  668.         LD D,A
  669.         LD A,C
  670.         RRA
  671.         AND 3
  672.         INC A
  673.         LD B,A
  674.         LD A,#03
  675.         RRCA
  676.         RRCA
  677.         DJNZ $-2
  678.         LD C,A
  679.         CPL
  680.         LD B,A
  681. ;D=scrbuf/256
  682. ;B=running 0
  683. ;C=running 1
  684.  ;D'=ID
  685.  ;C'=scale
  686.         LD A,7 ;rlca
  687.         JP SDRAWPATCH ;SDRAW0
  688.        ENDIF
  689.  
  690. DRAWSPRITE
  691. ;don't spoil iy!
  692. ;a=scale# = 0..0x3f
  693. ;H=distbuf/256+2 ;ID,texx,dist
  694. ;l=x
  695. ;DE=texx step
  696. ;HX=texxmid
  697.  ;D'=ID (не atm)
  698.         if atm
  699.         push af
  700. drawspritepg=$+1
  701.        ld a,(ttexpgs+NTEXPGS) ;TODO from ID
  702.       ;ld (pg8000),a
  703.       ;SETPG8000 ;OUT (C),A ;pg[ID]
  704.       SETPGC000
  705.         pop af
  706.         endif
  707.  
  708.        IF optresspr
  709.         CP lowmaxscale
  710.         JP NC,DRAWSPRITEloresspr_hires
  711.        ENDIF
  712.        LD B,H
  713.         LD C,L ;x
  714.         ;PUSH IX
  715.         ;POP HL
  716.         LD LX,A ;scale
  717.          ld a,hx ;texxmid
  718.          ld h,a
  719.          LD L,0xFF ;texx LSB
  720.         if atm==0
  721.         EXX
  722.          LD C,LX ;scale
  723.         EXX
  724.         endif
  725.  
  726.         XOR A
  727.         SUB E
  728.         LD E,A
  729.         SBC A,D
  730.         SUB E
  731.         LD D,A
  732.  
  733. ;find left visible margin of sprite
  734. ;TODO fix пропущена колонка 0
  735. ;TODO рисовать даже при центре за левым или правым краем экрана
  736.  
  737.         INC C
  738.        IF loresspr_hires
  739.        INC C
  740.        ENDIF
  741. DRAWL0  DEC C ;x
  742.        IF loresspr_hires
  743.        DEC C
  744.        ENDIF
  745.         jr Z,DRAWL0Q
  746.        LD A,(BC)
  747.        CP LX
  748.        jr NC,DRAWLQ
  749. ;        ADD HL,DE ;DE>0
  750. ;         jr c,DRAWLQ
  751. ;       ld a,h
  752. ;drawspritetexxright=$+1
  753. ;       cp 44/2 ;0xFF ;texxright
  754. ;       JP C,DRAWL0
  755.         ADD HL,DE ;DE<0
  756.          jr NC,DRAWLQtexx0
  757.        ld a,h
  758. drawspritetexxleft=$+1
  759.        cp 0 ;texxleft
  760.         jr NC,DRAWL0
  761. DRAWLQtexx0
  762.         JR DRAWLQ
  763. ;         or a
  764. ;         sbc hl,de ;костыль
  765. ;        JR DRAWLQ
  766. DRAWL0Q ;x=0
  767.        LD A,(BC)
  768.        CP LX
  769.        jr NC,DRAWLQ
  770.         ADD HL,DE ;DE>0
  771.         DEC C ;x
  772.        IF loresspr_hires
  773.        DEC C
  774.        ENDIF
  775. DRAWLQ ;H,C out of range
  776.  
  777. ;scan sprite to the right and keep H=texx in stack
  778.         XOR A
  779.         SUB E
  780.         LD E,A
  781.         SBC A,D
  782.         SUB E
  783.         LD D,A
  784.        
  785.         INC C ;x in range
  786.        IF loresspr_hires
  787.        INC C
  788.        ENDIF
  789.        
  790.         LD HX,1;B,1 ;sprite width counter
  791.  
  792.        LD A,(BC)
  793.        CP LX
  794.        jr NC,DRAWRQ
  795.        add hl,de ;первое сложение не проверяем!
  796.        jp DRAWR0GO
  797.        
  798. DRAWR0
  799.        LD A,(BC)
  800.        CP LX
  801.        jr NC,DRAWRQ
  802. ;        ADD HL,DE ;DE<0
  803. ;         jr NC,DRAWRQ
  804. ;       ld a,h
  805. ;drawspritetexxleft=$+1
  806. ;       cp 0 ;texxleft
  807. ;        jr C,DRAWRQ
  808.         ADD HL,DE ;DE>0
  809.          jr c,DRAWRQ
  810. DRAWR0GO
  811.        ld a,h
  812. drawspritetexxright=$+1
  813.        cp 44/2 ;0xFF ;texxright
  814.        JP NC,DRAWRQ
  815.        PUSH HL ;H in range
  816.         INC HX;B
  817.         INC C ;x
  818.        IF loresspr_hires
  819.        INC C
  820.        ENDIF
  821.        IF lores
  822.         JP P,DRAWR0
  823.        ELSE
  824.         JP NZ,DRAWR0
  825.        ENDIF
  826. DRAWRQ ;H,C out of range
  827.  
  828.         DEC HX;B
  829.        RET Z ;width=0, stack is empty
  830.  
  831.         DEC C ;x in range
  832.        IF loresspr_hires
  833.        DEC C
  834.        ENDIF
  835.        
  836.        if atm
  837. ;de=f(scale#,x)
  838. ;scr=f(x)
  839.         push bc
  840. ;lx=scale# = 0..63
  841.  
  842.         LD hl,tscales_rev
  843.         ld a,lx
  844.         add a,a
  845.         add a,l
  846.         ld l,a
  847.         jr nc,$+3
  848.         inc h
  849.         LD C,(HL)
  850.         INC HL
  851.         LD B,(HL) ;BC=scale
  852.         ld (drawsprscalebc),bc ;шаг по текстуре(+7.8) = 64/hgt = 1/scale
  853.  
  854.         LD hl,tscales
  855.         ld a,lx
  856.         add a,a
  857.         add a,l
  858.         ld l,a
  859.         jr nc,$+3
  860.         inc h
  861.         LD C,(HL)
  862.         INC HL
  863.         LD B,(HL) ;BC=scale(+7.8) = 1/4(hgt=16) ... 4.0(hgt=256) ;hgt=64*scale
  864. ;bc=scale
  865.         call scale2ytop
  866. ;out: de=Y, lx=y
  867.  
  868.         if 1==0
  869.         srl b
  870.         rr c
  871.         srl b
  872.         rr c
  873.         ld h,d
  874.         ld l,e
  875.         add hl,bc ;ylow
  876.         ld a,h
  877.         or a
  878.         ld a,l
  879.         jr nz,prsprtoolow
  880.         cp scrhgt
  881.         jr c,$+4
  882. prsprtoolow
  883.         ld a,scrhgt
  884.         endif
  885.        
  886.         inc d
  887.         dec d
  888.         jr Z,drawsprnottoohigh
  889.         ld de,0
  890. drawsprnottoohigh
  891.  
  892.         ;sub e
  893.         ;ld (drawsprscale),a ;реальное число выводимых строк (TODO сделать нормально с зумом)
  894.        
  895.         ;LD A,D
  896.         ;OR A
  897.         ;jr NZ,drawsprTOP
  898.         ;LD A,E
  899.         ;CP Ytop
  900.         ;jr C,drawsprTOP
  901.         CALL YtoADDR
  902. ;        JR drawsprnTOP
  903. ;drawsprTOP
  904. ;        LD DE,scrtop
  905. ;drawsprnTOP
  906.  
  907.         pop bc
  908.         LD A,C ;xright!
  909.         ;RRA
  910.         RRA
  911.         rra
  912.         jr nc,$+4
  913.          set 5,d
  914.         and 31
  915.         add a,e
  916.         ld e,a
  917.         jr nc,$+3
  918.          inc d
  919.  
  920.         ld a,(getuser_scr_high_patch)
  921.         ld (SDRAW0_scrpgaddr),a
  922.         ld (SDRAW0_scrpgaddr2),a
  923.         ld (SDRAW0_scrpgaddr3),a
  924.         ld hl,(getuser_scr_low_patch)
  925.         xor l
  926.         ld (SDRAW0_scrpgaddrxor),a
  927.        
  928.         ;call getuser_scr_low
  929.         ;ld (SDRAW0_scrpg),a ;TODO from x
  930.         ;ld (SDRAW0_low),a
  931.         ;ld h,a
  932.         ;call getuser_scr_high
  933.         ;xor h
  934.         ;ld (SDRAW0_high_xor_low),a
  935.  
  936.        else
  937.         LD A,C ;x
  938.         RRA
  939.         RRA
  940.        IF lores == 0
  941.         RRA
  942.        ENDIF
  943.         AND 31
  944.         ADD A,scrbuf/256
  945.         LD D,A
  946.         LD A,C
  947.        IF loresspr_hires
  948.         RRA
  949.        ENDIF
  950.        IF loresspr
  951.         AND 3
  952.        ELSE
  953.         AND 7
  954.        ENDIF
  955.         INC A
  956.         LD B,A
  957.        IF loresspr == 0
  958.         LD A,#01
  959.        ELSE
  960.         LD A,#03
  961.        ENDIF
  962. DRAWRR0 RRCA
  963.        IF loresspr
  964.         RRCA
  965.        ENDIF
  966.         DJNZ DRAWRR0
  967.         LD C,A
  968.         CPL
  969.         LD B,A
  970. ;D=scrbuf/256, B=running 0, C=running 1 (~atm)
  971.        endif ;~atm
  972.        
  973.  ;D'=ID
  974.  ;C'=scale#
  975.        IF optresspr ;~atm
  976.         XOR A
  977.  
  978. SDRAWPATCH
  979.         LD (sdrawrlca),A
  980.        ENDIF
  981.  
  982.        if atm==0
  983. SDRAW0
  984. ;EOR-fill the column, then draw sprite column (pop hl from the stack, H=texx)
  985. ;D=scrbuf/256, B=running 0, C=running 1 (~atm)
  986.         LD H,D
  987.         LD L,scrbufflag&0xff
  988.        BIT 7,(HL)
  989.        JP NZ,SDRAWnX ;already filled
  990.         LD (HL),H ;>=128: eorcopy
  991.        EXX
  992.        LD A,C
  993.        EXX
  994.        CP lowmaxscale
  995.        jr NC,SDRAWXhigh
  996.         LD L,lowscrbuf&0xff
  997.         LD E,lowscrhgt/2-1
  998.         XOR A
  999. SDRAWXlow1 ;
  1000.        DUP 16
  1001.         XOR (HL)
  1002.         LD (HL),A
  1003.         INC L
  1004.        EDUP
  1005.         DEC E
  1006.         JP P,SDRAWXlow1
  1007.         LD A,scrhgt-lowscrhgt/2
  1008. SDRAWXlow2 ;
  1009.        DUP 8
  1010.         LD (HL),E ;-1
  1011.         INC L
  1012.        EDUP
  1013.         DEC A
  1014.         JP NZ,SDRAWXlow2
  1015.         JP SDRAWnX
  1016. SDRAWXhigh
  1017.         LD L,scrbuf&0xff
  1018.         LD E,scrhgt/2
  1019.         XOR A
  1020. SDRAWX ;
  1021.        DUP 16
  1022.         XOR (HL)
  1023.         LD (HL),A
  1024.         INC L
  1025.        EDUP
  1026.         DEC E
  1027.         JP NZ,SDRAWX
  1028. SDRAWnX ;
  1029.  
  1030. SDRAW1 ;pixel column
  1031.         EXX
  1032. ;D=ID
  1033. ;C=scale#
  1034.        POP HL
  1035.          LD L,H ;texx
  1036.        IF scale64
  1037.        SRL L
  1038.        ENDIF
  1039.         LD H,D
  1040.         LD A,(HL)
  1041.         INC H
  1042.         LD H,(HL)
  1043.         LD L,A ;HL=spr
  1044. ;D'=scrbuf/256
  1045. ;B'=running 0
  1046. ;C'=running 1
  1047.         JP SCALESPRITEGO
  1048.  
  1049.        else ;~atm
  1050. ;рисуем справа налево
  1051. SDRAW0
  1052. SDRAW0_scrpgaddr2=$+1
  1053.         ld hl,user_scr0_high ;ok
  1054.         ld a,l
  1055.         jr SDRAW0go
  1056. SDRAW0loop
  1057. ;de=screen
  1058. ;D'=ID
  1059. ;C'=scale#
  1060. SDRAW0_scrpgaddr=$+1
  1061.         ld hl,user_scr0_high ;ok
  1062.         ld a,l
  1063. SDRAW0_scrpgaddr3=$+1
  1064.         cp 0
  1065.         jr nz,SDRAW0go
  1066.         bit 5,d
  1067.         res 5,d
  1068.         jr nz,SDRAW0go
  1069.         set 5,d
  1070.         dec de
  1071. SDRAW0go
  1072. SDRAW0_scrpgaddrxor=$+1
  1073.         xor 0
  1074.         ld (SDRAW0_scrpgaddr),a
  1075.         ld a,(hl)
  1076.  
  1077.        POP HL
  1078.         SETPG4000
  1079. ;4000: screen
  1080. ;c000: texture (уже поставлено в начале DRAWSPRITE)
  1081. ;8000: scaler (TODO)
  1082.        ld a,h ;texx=#00..#FF
  1083.  
  1084.         push de
  1085.         exx
  1086.         pop hl
  1087.         push hl
  1088.         ld bc,40
  1089.         ld e,IMPOSSIBLECOLOR
  1090.         exx
  1091.  
  1092.         ld hl,0xc000
  1093.         ld e,a
  1094. drawsprscalebc=$+1
  1095.         ld bc,0        
  1096. drawspr00
  1097.         ld d,h
  1098.         ld a,(de)
  1099.         exx
  1100.         cp e;IMPOSSIBLECOLOR
  1101.         jr z,$+3
  1102.          ld (hl),a
  1103.         add hl,bc
  1104.         exx
  1105.         add hl,bc
  1106.         jp nc,drawspr00 ;/m
  1107.        
  1108.         pop de
  1109.  
  1110.         DEC HX;B ;todo E'?
  1111.         JP nz,SDRAW0loop
  1112.         ret
  1113.        endif ;atm
  1114.  
  1115.         if atm == 0
  1116.  
  1117. ;вывод спрайтов: y,yEND1,yEND0
  1118. ;y=yEND1: пропуск рисования единиц
  1119.  ;0 может также получиться на верх/ниж кромке в большом масштабе
  1120. ;y=#C0, yEND1=#FF: конец текстуры - два специальных Y,
  1121.  ;которым в таблице соответствуют константы при любом масштабе
  1122.   ;можно одну, рассчитанную из какого-то масштаба?
  1123. ;yEND0=yEND1: пропуск рисования нулей
  1124.  ;0 может также получиться на верх/ниж кромке в большом масштабе
  1125. maxlinehgt=59
  1126.         align 256 ;DS .(-$)
  1127.  
  1128. ;круглый адрес: пропуск рисовалки нулей
  1129.         JP EXXSCALESPRITE1
  1130.         DS 0xff&(-(4*maxlinehgt)-$)
  1131. SCALESPRITE0DRAW
  1132. ;рисовалка нулей (AND B)
  1133.        DUP maxlinehgt ;MAX=62(59 с SCALESPRITELOOP)
  1134.                       ;большие залитые области рубить на части
  1135.         LD A,(DE)
  1136.         AND B
  1137.         LD (DE),A
  1138.         DEC E
  1139.        EDUP
  1140.        ;ORG $-1
  1141. EXXSCALESPRITE1
  1142.         EXX
  1143. ;круглый адрес
  1144.         DISPLAY $,"=#XX00"
  1145.         INC L
  1146. SCALESPRITEGO
  1147. ;HL=spr
  1148. ;D=ID
  1149. ;C=scale
  1150. ;D'=scrbuf/256
  1151. ;(HL'=tempjp)
  1152. ;B'=running 0
  1153. ;C'=running 1
  1154.         LD B,(HL) ;Y в текстуре или #C0(читает 0)
  1155.         INC L
  1156.         LD A,(BC) ;Y*N
  1157.         EXX
  1158.         LD E,A
  1159. ;SCALESPRITE1GO
  1160.         EXX
  1161.         LD B,(HL) ;Y2 в текстуре (<=Y) или #FF(читает 1)
  1162.         INC L
  1163.         LD A,(BC) ;Y2*N
  1164.         EXX
  1165.         SUB E
  1166.         ADD A,A
  1167.         ADD A,A
  1168.         LD L,A
  1169.         LD H,SCALESPRITE1DRAW/256
  1170.         JP (HL) ;рисуем единицы или выходим
  1171.         align 256 ;DS .(-$)
  1172. ;круглый адрес: пропуск рисовалки единиц
  1173.         JP EXXSCALESPRITE0
  1174.         NOP
  1175. ;спецадрес: конец текстуры
  1176. ;как сюда попасть: #C0(читает 0),#FF(читает 1)
  1177. SDRAW0SKIPQ
  1178.         DEC HX;B ;todo E'?
  1179.         RET Z
  1180.         LD A,C
  1181.         RLCA
  1182.        IF loresspr|optresspr
  1183. sdrawrlca=$
  1184.         RLCA
  1185.        ENDIF
  1186.         LD C,A
  1187.         CPL
  1188.         LD B,A
  1189.         JP NC,SDRAW1
  1190.         DEC D
  1191.         JP SDRAW0
  1192.        DISPLAY $
  1193.         DS 0xff&(-(4*maxlinehgt)-$)
  1194.        DISPLAY "=",$
  1195. SCALESPRITE1DRAW
  1196. ;рисовалка единиц (OR C)
  1197.        DUP maxlinehgt ;MAX=63
  1198.                       ;большие залитые области рубить на части
  1199.         LD A,(DE)
  1200.         OR C
  1201.         LD (DE),A
  1202.         DEC E
  1203.        EDUP
  1204.        ;ORG $-1
  1205. EXXSCALESPRITE0
  1206.         EXX
  1207. ;круглый адрес
  1208.         LD B,(HL) ;Y3 в текстуре (<=Y2)
  1209.         LD A,(BC) ;Y3*N
  1210.         EXX
  1211.         SUB E
  1212.         ADD A,A
  1213.         ADD A,A
  1214.         LD L,A
  1215.         LD H,SCALESPRITE0DRAW/256
  1216.         JP (HL) ;рисуем нули
  1217.  
  1218.        IF 0
  1219. testsprite
  1220.         DB #F0,#EF,#E7
  1221.         DB #D2,#D0,#C4
  1222.         DB #C0,#FF
  1223.        ENDIF
  1224.  
  1225.        endif ;~atm
  1226.  
  1227.        ENDIF ;sprites