?login_element?

Subversion Repositories NedoOS

Rev

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

  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              ;можно add hl,bc:inc h (TODO)
  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 a,(hl);D,(HL) ;ID
  376.        RRCA
  377.        ADD A,A ;флаг зеркальности в CY ;TODO рисовать уровни так, чтобы при взгляде вверх все были незеркальные, вниз - все зеркальные (тогда и зеркальность не нужно будет хранить?)
  378.        set 7,a ;(keep CY) быстрый пересчёт ID_DOOR (открытая дверь < 128)
  379.        ld d,a
  380.        
  381.        if doublescr
  382.        bit 6,d
  383.        set 6,d
  384.        ld a,0x10
  385.        jr nz,$+4
  386.        ld a,0x10+pgtmp
  387.        call SETPG
  388.        endif
  389.        
  390.        ;cp 0xc0
  391.        ;jr c,$
  392.        ;cp 0xc0+(12*2)
  393.        ;jr nc,$
  394.         ;ld d,0xc0+(2*9)
  395.        ;IF debug
  396.        ; LD A,D
  397.        ; CP -20
  398.        ; jr NC,$+4
  399.        ; LD D,-20
  400.        ;ENDIF
  401.         INC H
  402.         LD a,(hl);E,(HL) ;texx
  403.        jr NC,$+3
  404.        CPL ;зеркальная
  405.       AND 0x3F ;
  406.       or 0x40;0x80  ;TODO уже в ray?
  407.       ld e,a
  408.         INC H
  409.         LD A,(DE)
  410.         INC D
  411.        LD C,A ;+4
  412.         LD A,(DE)
  413.        LD B,A ;+4
  414.        LD A,(BC) ;-12
  415.        LD LY,A
  416.         LD HX,B
  417.         LD LX,C
  418.         LD A,(HL) ;dist
  419.         INC L
  420.         EXX
  421.        IF 0
  422. ;#06..#2B = 38
  423. ;#2C,#2E..#56 = 22
  424. ;#58,#5C..#64 = 4
  425. ;=64 scales
  426.        CP #06 ;max=#06
  427.        jr NC,$+4
  428.        LD A,#06
  429.        CP #67
  430.        jr C,$+4
  431.        LD A,#67
  432.        CP #2C ;min=#28
  433.        jr C,$+4
  434.        AND #FE
  435.        CP #58 ;min=#50
  436.        jr C,$+4
  437.        AND #FC
  438.        ENDIF
  439.         LD L,A
  440.        IF optres
  441. foptfast=$+1
  442.         CP lowmaxscale
  443.         jr NC,DW0high
  444. DW0low ;
  445.        LD B,C
  446.        ENDIF
  447. ;d=столбец
  448. ;c=битмаска столбца
  449. ;ix=адрес графики столбца
  450. ;l=scale
  451.        ;LD A,(IX) ;(18-N)*7
  452.        ;LD LY,A
  453.         JP (IY)
  454.        IF optres
  455. DW0high ;
  456.         LD A,C
  457.         AND %10101010
  458.         jr Z,DW0low
  459.         RRCA
  460.        LD B,A
  461.         OR C
  462.         LD C,A
  463.         EXX
  464.         INC L
  465.         EXX
  466.         JP (IY)
  467.        ENDIF
  468.         DISPLAY "DWJP=",$
  469.       ;IF .$+(16*7+1)&256
  470.         align 256 ;DS .(-$)
  471.       ;ENDIF
  472. DWJP
  473. _=17
  474.        DUP 17
  475.         LD H,(IX+_) ;Y в текстуре
  476.         LD E,(HL) ;-Y*N
  477.         LD A,(DE)
  478.         XOR C ;xor!
  479.         LD (DE),A
  480. _=_-1
  481.        EDUP
  482.        IF optres
  483.        ;LD A,C ;%11000000
  484.        ;RRCA   ;%01100000
  485.        ;AND C  ;%01000000
  486.        ;JP Z,$+4
  487.        ;LD C,A
  488.        LD C,B
  489.        ENDIF
  490.         RRC C
  491.        IF lores
  492.         RRC C
  493.        ENDIF
  494.         JP NC,DW0
  495.         INC D
  496.        IF optres
  497.         LD A,D
  498.         CP scrbuf/256+scrwid
  499.        ELSE
  500.         DEC B
  501.        ENDIF
  502.         JP NZ,DW0
  503.         RET
  504.        endif ;~atm
  505.  
  506.        if atm
  507. DWCLSALL
  508.         LD D,%11111111
  509.         LD HL,#4000+36
  510.         CALL DWCLS
  511.         LD HL,#6000+36
  512.         CALL DWCLS
  513.         LD D,%11110110
  514.         LD HL,#4000+(108*40)+36
  515.         CALL DWCLS
  516.         LD HL,#6000+(108*40)+36
  517.        ;CALL DWCLS
  518. DWCLS
  519.        LD A,(timer)
  520.        PUSH HL
  521.        PUSH AF
  522.         LD (dwclsp),SP
  523.         LD BC,40
  524.        ;LD D,B ;=0
  525.         LD E,D
  526.         LD A,scrhgt/2-8
  527. DWCL0   LD SP,HL
  528.         DUP 16;20
  529.         PUSH DE
  530.         EDUP
  531.         ADD HL,BC
  532.         DEC A
  533.         JP NZ,DWCL0
  534. dwclsp=$+1
  535.         LD SP,0
  536.        POP AF
  537.        LD HL,timer
  538.        CP (HL)
  539.        POP HL
  540.        RET Z
  541. ;int detected - clear left
  542.         LD BC,-34
  543.         ADD HL,BC
  544.        LD A,D
  545.         LD DE,39
  546.         LD B,scrhgt/2-8
  547. DWCL1   LD (HL),D
  548.         INC HL
  549.         LD (HL),D
  550.         ADD HL,DE
  551.         DJNZ DWCL1
  552.        LD D,A ;keep D
  553.         RET
  554.  
  555. DRAWWALLS
  556. ;A=0..1 - номер битплана
  557.         LD (dwloopsp),SP
  558.         LD BC,40
  559.         LD IX,DWLOOP0
  560.         EXX
  561.         LD E,A ;0..1
  562.         LD H,tID/256
  563.         ;LD BC,#3FF7 ;(можно одно окно + кэш)
  564.         JP DWLOOPGO
  565. DWLOOP0
  566.         LD SP,SPOIL6BSTACK;-2 ;можно портить
  567.         EXX
  568.         LD A,E
  569.         ADD A,2 ;чтобы не включать стр. экрана каждый столбец
  570.         CP scrwid*4
  571.         jr NC,DWLOOPQ
  572.         LD E,A
  573. DWLOOPGO
  574.         LD D,distbuf/256
  575.         LD A,(DE) ;ID
  576.        RRCA
  577.        ADD A,A ;флаг зеркальности в CY ;TODO рисовать уровни так, чтобы при взгляде вверх все были незеркальные, вниз - все зеркальные (тогда и зеркальность не нужно будет хранить?)
  578.        ;set 7,a ;быстрый пересчёт ID_DOOR (открытая дверь < 128)
  579.         INC D
  580.         LD L,A
  581.         LD A,(HL)
  582.       ;ld (pg8000),a
  583.       SETPG8000 ;OUT (C),A ;pg[ID]
  584.         INC L
  585.         LD A,(DE) ;texx=#40..#7F
  586.        jr NC,$+3
  587.        CPL ;зеркальная
  588.       AND 0x3F ;
  589.       or 0x80  ;TODO уже в ray?
  590.         LD HY,A
  591.         INC D
  592.         LD A,(HL) ;laddr[ID] = #02/#42/#82/#C2
  593.         LD LY,A
  594.         LD A,(DE) ;scale = 0..0x3f
  595.         EXX
  596.         LD E,(IY-2)
  597.         LD D,(IY-1) ;INT-PROOF
  598.        ADD A,A ;
  599.        ADD A,A ;при интерполяции нельзя обработать scale внутри таблицы tlogd2sca
  600.        ;NC
  601.         LD L,A
  602.         LD H,tscaljps/256
  603.         EXX
  604.         LD A,E
  605.         rra;SRL A
  606.         SRL A ;CY=0 для +0, CY=1 для +#2000
  607.         EXX
  608.         LD SP,IY
  609.         JP (HL)
  610. DWLOOPQ
  611. dwloopsp=$+1
  612.         LD SP,0
  613.         RET
  614.        ENDIF ;atm
  615.  
  616. ;=====================
  617.        IF sprites
  618.  
  619.        IF optresspr
  620. DRAWSPRITEloresspr_hires
  621.         SLA E
  622.         RL D
  623.        LD B,H
  624.         LD C,L ;x
  625.         PUSH IX
  626.         POP HL
  627.         LD L,#FF ;texx LSB
  628.         LD LX,A ;scale
  629.         EXX
  630.          LD C,LX ;scale
  631.         EXX
  632.  
  633. ;find left visible margin of sprite
  634.         INC C
  635.        INC C
  636. DRAWLl0 DEC C ;x
  637.        DEC C
  638.         jr Z,DRAWLl0Q
  639.        LD A,(BC)
  640.        CP LX
  641.        jr NC,DRAWLlQ
  642.         ADD HL,DE ;DE>0
  643.        LD A,#FF ;texxright
  644.         CP H
  645.         JP P,DRAWLl0
  646.         JR DRAWLlQ
  647. DRAWLl0Q ;x=0
  648.        LD A,(BC)
  649.        CP LX
  650.        jr NC,DRAWLlQ
  651.         ADD HL,DE ;DE>0
  652.         DEC C ;x
  653.        DEC C
  654. DRAWLlQ ;H,C out of range
  655.  
  656. ;scan sprite to the right and keep H=texx in stack
  657.         INC C ;x in range
  658.        INC C
  659.         XOR A
  660.         SUB E
  661.         LD E,A
  662.         SBC A,D
  663.         SUB E
  664.         LD D,A
  665.         LD HX,1;B,1 ;sprite width counter
  666. DRAWRl0
  667.        LD A,(BC)
  668.        CP LX
  669.        jr NC,DRAWRlQ
  670.         ADD HL,DE ;DE<0
  671.        LD A,#7F ;texxleft-1
  672.         CP H ;texxleft
  673.         jr NC,DRAWRlQ
  674.        PUSH HL ;H in range
  675.         INC HX;B
  676.         INC C ;x
  677.        INC C
  678.         JP NZ,DRAWRl0
  679. DRAWRlQ ;H,C out of range
  680.  
  681.         DEC HX;B
  682.        RET Z ;width=0, stack is empty
  683.  
  684.         DEC C ;x in range
  685.        DEC C
  686.         LD A,C ;x
  687.         RRA
  688.         RRA
  689.         RRA
  690.         AND 31
  691.         ADD A,scrbuf/256
  692.         LD D,A
  693.         LD A,C
  694.         RRA
  695.         AND 3
  696.         INC A
  697.         LD B,A
  698.         LD A,#03
  699.         RRCA
  700.         RRCA
  701.         DJNZ $-2
  702.         LD C,A
  703.         CPL
  704.         LD B,A
  705. ;D=scrbuf/256
  706. ;B=running 0
  707. ;C=running 1
  708.  ;D'=ID
  709.  ;C'=scale
  710.         LD A,7 ;rlca
  711.         JP SDRAWPATCH ;SDRAW0
  712.        ENDIF
  713.  
  714. DRAWSPRITE
  715. ;don't spoil iy!
  716. ;a=scale# = 0..0x3f
  717. ;H=distbuf/256+2 ;ID,texx,dist
  718. ;l=x
  719. ;DE=texx step
  720. ;HX=texxmid
  721.  ;D'=ID (не atm)
  722.         if atm
  723.         push af
  724. drawspritepg=$+1
  725.        ld a,(ttexpgs+NTEXPGS) ;TODO from ID
  726.       ;ld (pg8000),a
  727.       ;SETPG8000 ;OUT (C),A ;pg[ID]
  728.       SETPGC000
  729.         pop af
  730.         endif
  731.        
  732.         if doublescr && !atm
  733.         push af
  734.         exx
  735.         ld a,d
  736.         cp 0xc0+(12*2)+(4*2)
  737.         jr c,$+4
  738.         sub 4*2 ;NC
  739.         ld d,a
  740.         exx
  741.         ;ld a,r
  742.         ;and 64
  743.         ld a,0x10
  744.         jr c,$+4
  745.         ld a,0x10+pgtmp
  746.         call SETPG
  747.         pop af
  748.         endif
  749.  
  750.        IF optresspr
  751.         CP lowmaxscale
  752.         JP NC,DRAWSPRITEloresspr_hires
  753.        ENDIF
  754.        LD B,H
  755.         LD C,L ;x
  756.         ;PUSH IX
  757.         ;POP HL
  758.         LD LX,A ;scale
  759.          ld a,hx ;texxmid
  760.          ld h,a
  761.          LD L,0xFF ;texx LSB
  762.         if atm==0
  763.         EXX
  764.          LD C,LX ;scale
  765.         EXX
  766.         endif
  767.  
  768.         if 1;atm ;FIXME почему поворачивается случайно?
  769.         XOR A
  770.         SUB E
  771.         LD E,A
  772.         SBC A,D
  773.         SUB E
  774.         LD D,A
  775.         endif
  776.  
  777. ;find left visible margin of sprite
  778. ;TODO fix пропущена колонка 0
  779. ;TODO рисовать даже при центре за левым или правым краем экрана
  780.  
  781.         INC C
  782.        IF loresspr_hires
  783.        INC C
  784.        ENDIF
  785. DRAWL0  DEC C ;x
  786.        IF loresspr_hires
  787.        DEC C
  788.        ENDIF
  789.         jr Z,DRAWL0Q
  790.        LD A,(BC)
  791.        CP LX
  792.        jr NC,DRAWLQ
  793. ;        ADD HL,DE ;DE>0
  794. ;         jr c,DRAWLQ
  795. ;       ld a,h
  796. ;drawspritetexxright=$+1
  797. ;       cp 44/2 ;0xFF ;texxright
  798. ;       JP C,DRAWL0
  799.         ADD HL,DE ;DE<0
  800.          if atm
  801.          jr NC,DRAWLQtexx0
  802.        ld a,h
  803. drawspritetexxleft=$+1
  804.        cp 0 ;texxleft
  805.         jr NC,DRAWL0
  806.          else
  807.         ld a,0xff ;texxright ;TODO
  808.         cp h
  809.         jp p,DRAWL0
  810.          endif
  811. DRAWLQtexx0
  812.         JR DRAWLQ
  813. ;         or a
  814. ;         sbc hl,de ;костыль
  815. ;        JR DRAWLQ
  816. DRAWL0Q ;x=0
  817.        LD A,(BC)
  818.        CP LX
  819.        jr NC,DRAWLQ
  820.         ADD HL,DE ;DE>0
  821.         DEC C ;x
  822.        IF loresspr_hires
  823.        DEC C
  824.        ENDIF
  825. DRAWLQ ;H,C out of range
  826.  
  827. ;scan sprite to the right and keep H=texx in stack
  828.         XOR A
  829.         SUB E
  830.         LD E,A
  831.         SBC A,D
  832.         SUB E
  833.         LD D,A
  834.        
  835.         INC C ;x in range
  836.        IF loresspr_hires
  837.        INC C
  838.        ENDIF
  839.        
  840.         LD HX,1;B,1 ;sprite width counter
  841.         if atm
  842.        LD A,(BC)
  843.        CP LX
  844.        jr NC,DRAWRQ
  845.        add hl,de ;первое сложение не проверяем!
  846.        jp DRAWR0GO
  847.         endif
  848.        
  849. DRAWR0
  850.        LD A,(BC)
  851.        CP LX
  852.        jr NC,DRAWRQ
  853. ;        ADD HL,DE ;DE<0
  854. ;         jr NC,DRAWRQ
  855. ;       ld a,h
  856. ;drawspritetexxleft=$+1
  857. ;       cp 0 ;texxleft
  858. ;        jr C,DRAWRQ
  859.         ADD HL,DE ;DE>0
  860.         if atm
  861.          jr c,DRAWRQ
  862. DRAWR0GO
  863.        ld a,h
  864. drawspritetexxright=$+1
  865.        cp 44/2 ;0xFF ;texxright
  866.         else
  867.         ld a,0x7f ;texxleft-1
  868.         cp h
  869.         endif
  870.        JP NC,DRAWRQ
  871.        PUSH HL ;H in range
  872.         INC HX;B
  873.         INC C ;x
  874.        IF loresspr_hires
  875.        INC C
  876.        ENDIF
  877.        IF lores
  878.         JP P,DRAWR0
  879.        ELSE
  880.         JP NZ,DRAWR0
  881.        ENDIF
  882. DRAWRQ ;H,C out of range
  883.  
  884.         DEC HX;B
  885.        RET Z ;width=0, stack is empty
  886.  
  887.         DEC C ;x in range
  888.        IF loresspr_hires
  889.        DEC C
  890.        ENDIF
  891.        
  892.        if atm
  893. ;de=f(scale#,x)
  894. ;scr=f(x)
  895.         push bc
  896. ;lx=scale# = 0..63
  897.  
  898.         LD hl,tscales_rev
  899.         ld a,lx
  900.         add a,a
  901.         add a,l
  902.         ld l,a
  903.         jr nc,$+3
  904.         inc h
  905.         LD C,(HL)
  906.         INC HL
  907.         LD B,(HL) ;BC=scale
  908.         ld (drawsprscalebc),bc ;шаг по текстуре(+7.8) = 64/hgt = 1/scale
  909.  
  910.         LD hl,tscales
  911.         ld a,lx
  912.         add a,a
  913.         add a,l
  914.         ld l,a
  915.         jr nc,$+3
  916.         inc h
  917.         LD C,(HL)
  918.         INC HL
  919.         LD B,(HL) ;BC=scale(+7.8) = 1/4(hgt=16) ... 4.0(hgt=256) ;hgt=64*scale
  920. ;bc=scale
  921.         call scale2ytop
  922. ;out: de=Y, lx=y
  923.  
  924.         if 1==0
  925.         srl b
  926.         rr c
  927.         srl b
  928.         rr c
  929.         ld h,d
  930.         ld l,e
  931.         add hl,bc ;ylow
  932.         ld a,h
  933.         or a
  934.         ld a,l
  935.         jr nz,prsprtoolow
  936.         cp scrhgt
  937.         jr c,$+4
  938. prsprtoolow
  939.         ld a,scrhgt
  940.         endif
  941.        
  942.         inc d
  943.         dec d
  944.         jr Z,drawsprnottoohigh
  945.         ld de,0
  946. drawsprnottoohigh
  947.  
  948.         ;sub e
  949.         ;ld (drawsprscale),a ;реальное число выводимых строк (TODO сделать нормально с зумом)
  950.        
  951.         ;LD A,D
  952.         ;OR A
  953.         ;jr NZ,drawsprTOP
  954.         ;LD A,E
  955.         ;CP Ytop
  956.         ;jr C,drawsprTOP
  957.         CALL YtoADDR
  958. ;        JR drawsprnTOP
  959. ;drawsprTOP
  960. ;        LD DE,scrtop
  961. ;drawsprnTOP
  962.  
  963.         pop bc
  964.         LD A,C ;xright!
  965.         ;RRA
  966.         RRA
  967.         rra
  968.         jr nc,$+4
  969.          set 5,d
  970.         and 31
  971.         add a,e
  972.         ld e,a
  973.         jr nc,$+3
  974.          inc d
  975.  
  976.         ld a,(getuser_scr_high_patch)
  977.         ld (SDRAW0_scrpgaddr),a
  978.         ld (SDRAW0_scrpgaddr2),a
  979.         ld (SDRAW0_scrpgaddr3),a
  980.         ld hl,(getuser_scr_low_patch)
  981.         xor l
  982.         ld (SDRAW0_scrpgaddrxor),a
  983.        
  984.         ;call getuser_scr_low
  985.         ;ld (SDRAW0_scrpg),a ;TODO from x
  986.         ;ld (SDRAW0_low),a
  987.         ;ld h,a
  988.         ;call getuser_scr_high
  989.         ;xor h
  990.         ;ld (SDRAW0_high_xor_low),a
  991.  
  992.        else
  993.         LD A,C ;x
  994.         RRA
  995.         RRA
  996.        IF lores == 0
  997.         RRA
  998.        ENDIF
  999.         AND 31
  1000.         ADD A,scrbuf/256
  1001.         LD D,A
  1002.         LD A,C
  1003.        IF loresspr_hires
  1004.         RRA
  1005.        ENDIF
  1006.        IF loresspr
  1007.         AND 3
  1008.        ELSE
  1009.         AND 7
  1010.        ENDIF
  1011.         INC A
  1012.         LD B,A
  1013.        IF loresspr == 0
  1014.         LD A,#01
  1015.        ELSE
  1016.         LD A,#03
  1017.        ENDIF
  1018. DRAWRR0 RRCA
  1019.        IF loresspr
  1020.         RRCA
  1021.        ENDIF
  1022.         DJNZ DRAWRR0
  1023.         LD C,A
  1024.         CPL
  1025.         LD B,A
  1026. ;D=scrbuf/256, B=running 0, C=running 1 (~atm)
  1027.        endif ;~atm
  1028.        
  1029.  ;D'=ID
  1030.  ;C'=scale#
  1031.        IF optresspr ;~atm
  1032.         XOR A
  1033.  
  1034. SDRAWPATCH
  1035.         LD (sdrawrlca),A
  1036.        ENDIF
  1037.  
  1038.        if atm==0
  1039. SDRAW0
  1040. ;EOR-fill the column, then draw sprite column (pop hl from the stack, H=texx)
  1041. ;D=scrbuf/256, B=running 0, C=running 1 (~atm)
  1042.         LD H,D
  1043.         LD L,scrbufflag&0xff
  1044.        BIT 7,(HL)
  1045.        JP NZ,SDRAWnX ;already filled
  1046.         LD (HL),H ;>=128: eorcopy
  1047.        EXX
  1048.        LD A,C
  1049.        EXX
  1050.        CP lowmaxscale
  1051.        jr NC,SDRAWXhigh
  1052.         LD L,lowscrbuf&0xff
  1053.         LD E,lowscrhgt/2-1
  1054.         XOR A
  1055. SDRAWXlow1 ;
  1056.        DUP 16
  1057.         XOR (HL)
  1058.         LD (HL),A
  1059.         INC L
  1060.        EDUP
  1061.         DEC E
  1062.         JP P,SDRAWXlow1
  1063.         LD A,scrhgt-lowscrhgt/2
  1064. SDRAWXlow2 ;
  1065.        DUP 8
  1066.         LD (HL),E ;-1
  1067.         INC L
  1068.        EDUP
  1069.         DEC A
  1070.         JP NZ,SDRAWXlow2
  1071.         JP SDRAWnX
  1072. SDRAWXhigh
  1073.         LD L,scrbuf&0xff
  1074.         LD E,scrhgt/2
  1075.         XOR A
  1076. SDRAWX ;
  1077.        DUP 16
  1078.         XOR (HL)
  1079.         LD (HL),A
  1080.         INC L
  1081.        EDUP
  1082.         DEC E
  1083.         JP NZ,SDRAWX
  1084. SDRAWnX ;
  1085.  
  1086. SDRAW1 ;pixel column
  1087.         EXX
  1088. ;D=ID
  1089. ;C=scale#
  1090.        POP HL
  1091.          LD L,H ;texx
  1092.        IF scale64
  1093.        SRL L
  1094.        ENDIF
  1095.         LD H,D
  1096.         LD A,(HL)
  1097.         INC H
  1098.         LD H,(HL)
  1099.         LD L,A ;HL=spr
  1100. ;D'=scrbuf/256
  1101. ;B'=running 0
  1102. ;C'=running 1
  1103.         JP SCALESPRITEGO
  1104.  
  1105.        else ;~atm
  1106. ;рисуем справа налево
  1107. SDRAW0
  1108. SDRAW0_scrpgaddr2=$+1
  1109.         ld hl,user_scr0_high ;ok
  1110.         ld a,l
  1111.         jr SDRAW0go
  1112. SDRAW0loop
  1113. ;de=screen
  1114. ;D'=ID
  1115. ;C'=scale#
  1116. SDRAW0_scrpgaddr=$+1
  1117.         ld hl,user_scr0_high ;ok
  1118.         ld a,l
  1119. SDRAW0_scrpgaddr3=$+1
  1120.         cp 0
  1121.         jr nz,SDRAW0go
  1122.         bit 5,d
  1123.         res 5,d
  1124.         jr nz,SDRAW0go
  1125.         set 5,d
  1126.         dec de
  1127. SDRAW0go
  1128. SDRAW0_scrpgaddrxor=$+1
  1129.         xor 0
  1130.         ld (SDRAW0_scrpgaddr),a
  1131.         ld a,(hl)
  1132.  
  1133.        POP HL
  1134.         SETPG4000
  1135. ;4000: screen
  1136. ;c000: texture (уже поставлено в начале DRAWSPRITE)
  1137. ;8000: scaler (TODO)
  1138.        ld a,h ;texx=#00..#FF
  1139.  
  1140.         push de
  1141.         exx
  1142.         pop hl
  1143.         push hl
  1144.         ld bc,40
  1145.         ld e,IMPOSSIBLECOLOR
  1146.         exx
  1147.  
  1148.         ld hl,0xc000
  1149.         ld e,a
  1150. drawsprscalebc=$+1
  1151.         ld bc,0        
  1152. drawspr00
  1153.         ld d,h
  1154.         ld a,(de)
  1155.         exx
  1156.         cp e;IMPOSSIBLECOLOR
  1157.         jr z,$+3
  1158.          ld (hl),a
  1159.         add hl,bc
  1160.         exx
  1161.         add hl,bc
  1162.         jp nc,drawspr00 ;/m
  1163.        
  1164.         pop de
  1165.  
  1166.         DEC HX;B ;todo E'?
  1167.         JP nz,SDRAW0loop
  1168.         ret
  1169.        endif ;atm
  1170.  
  1171.         if atm == 0
  1172.  
  1173. ;вывод спрайтов: y,yEND1,yEND0
  1174. ;y=yEND1: пропуск рисования единиц
  1175.  ;0 может также получиться на верх/ниж кромке в большом масштабе
  1176. ;y=#C0, yEND1=#FF: конец текстуры - два специальных Y,
  1177.  ;которым в таблице соответствуют константы при любом масштабе
  1178.   ;можно одну, рассчитанную из какого-то масштаба?
  1179. ;yEND0=yEND1: пропуск рисования нулей
  1180.  ;0 может также получиться на верх/ниж кромке в большом масштабе
  1181. maxlinehgt=59
  1182.         align 256 ;DS .(-$)
  1183.  
  1184. ;круглый адрес: пропуск рисовалки нулей
  1185.         JP EXXSCALESPRITE1
  1186.         DS 0xff&(-(4*maxlinehgt)-$)
  1187. SCALESPRITE0DRAW
  1188. ;рисовалка нулей (AND B)
  1189.        DUP maxlinehgt ;MAX=62(59 с SCALESPRITELOOP)
  1190.                       ;большие залитые области рубить на части
  1191.         LD A,(DE)
  1192.         AND B
  1193.         LD (DE),A
  1194.         DEC E
  1195.        EDUP
  1196.        ;ORG $-1
  1197. EXXSCALESPRITE1
  1198.         EXX
  1199. ;круглый адрес
  1200.         DISPLAY $,"=#XX00"
  1201.         INC L
  1202. SCALESPRITEGO
  1203. ;HL=spr
  1204. ;D=ID
  1205. ;C=scale
  1206. ;D'=scrbuf/256
  1207. ;(HL'=tempjp)
  1208. ;B'=running 0
  1209. ;C'=running 1
  1210.         LD B,(HL) ;Y в текстуре или #C0(читает 0)
  1211.         INC L
  1212.         LD A,(BC) ;Y*N
  1213.         EXX
  1214.         LD E,A
  1215. ;SCALESPRITE1GO
  1216.         EXX
  1217.         LD B,(HL) ;Y2 в текстуре (<=Y) или #FF(читает 1)
  1218.         INC L
  1219.         LD A,(BC) ;Y2*N
  1220.         EXX
  1221.         SUB E
  1222.         ADD A,A
  1223.         ADD A,A
  1224.         LD L,A
  1225.         LD H,SCALESPRITE1DRAW/256
  1226.         JP (HL) ;рисуем единицы или выходим
  1227.         align 256 ;DS .(-$)
  1228. ;круглый адрес: пропуск рисовалки единиц
  1229.         JP EXXSCALESPRITE0
  1230.         NOP
  1231. ;спецадрес: конец текстуры
  1232. ;как сюда попасть: #C0(читает 0),#FF(читает 1)
  1233. SDRAW0SKIPQ
  1234.         DEC HX;B ;todo E'?
  1235.         RET Z
  1236.         LD A,C
  1237.         RLCA
  1238.        IF loresspr|optresspr
  1239. sdrawrlca=$
  1240.         RLCA
  1241.        ENDIF
  1242.         LD C,A
  1243.         CPL
  1244.         LD B,A
  1245.         JP NC,SDRAW1
  1246.         DEC D
  1247.         JP SDRAW0
  1248.        DISPLAY $
  1249.         DS 0xff&(-(4*maxlinehgt)-$)
  1250.        DISPLAY "=",$
  1251. SCALESPRITE1DRAW
  1252. ;рисовалка единиц (OR C)
  1253.        DUP maxlinehgt ;MAX=63
  1254.                       ;большие залитые области рубить на части
  1255.         LD A,(DE)
  1256.         OR C
  1257.         LD (DE),A
  1258.         DEC E
  1259.        EDUP
  1260.        ;ORG $-1
  1261. EXXSCALESPRITE0
  1262.         EXX
  1263. ;круглый адрес
  1264.         LD B,(HL) ;Y3 в текстуре (<=Y2)
  1265.         LD A,(BC) ;Y3*N
  1266.         EXX
  1267.         SUB E
  1268.         ADD A,A
  1269.         ADD A,A
  1270.         LD L,A
  1271.         LD H,SCALESPRITE0DRAW/256
  1272.         JP (HL) ;рисуем нули
  1273.  
  1274.        IF 0
  1275. testsprite
  1276.         DB #F0,#EF,#E7
  1277.         DB #D2,#D0,#C4
  1278.         DB #C0,#FF
  1279.        ENDIF
  1280.  
  1281.        endif ;~atm
  1282.  
  1283.        ENDIF ;sprites