?login_element?

Subversion Repositories NedoOS

Rev

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

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