?login_element?

Subversion Repositories NedoOS

Rev

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