?login_element?

Subversion Repositories NedoOS

Rev

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

  1.        IF corr_coord
  2. CORR_COORD
  3.        LD A,L
  4.        OR A
  5.        jr NZ,$+3
  6.        INC L
  7.        INC A
  8.        jr NZ,$+3
  9.        DEC L
  10.        LD A,H
  11.        OR A
  12.        jr NZ,$+3
  13.        INC H
  14.        INC A
  15.        RET NZ
  16.        DEC H
  17.         RET
  18.        ENDIF
  19.  
  20. SCAN
  21.        IF optfast
  22.         LD HL,(IMcurDX)
  23.         LD A,H
  24.         OR L
  25.         LD HL,(IMcurDY)
  26.         OR H
  27.         OR L
  28.         LD A,lowmaxscale
  29.         jr Z,$+4
  30.         LD A,0;-1
  31.         LD (foptfast),A
  32.        ENDIF
  33. IMcurXx=$+1
  34.         LD HL,#0F80 ;#0580
  35.        IF corr_coord
  36.         CALL CORR_COORD
  37.        ENDIF
  38.         LD (curXx),HL
  39. IMcurYy=$+1
  40.         LD HL,#0180+(map&#FF00) ;#A580
  41.        IF corr_coord
  42.         CALL CORR_COORD
  43.        ENDIF
  44.         LD (curYy),HL
  45.         LD A,(IMavision+1)
  46.        LD (curangle),A
  47.         SUB 32
  48.         LD L,A
  49.         LD H,0
  50.         ADD HL,HL
  51.         ADD HL,HL
  52.         LD A,L
  53.         LD (avision4L),A
  54.         LD A,H
  55.         LD (avision4H),A
  56.         LD HL,(cury-1)
  57.         LD A,(curx)
  58.         LD L,A
  59.         LD (cur00yx),HL
  60.         LD (cur01yx),HL
  61.       ;LD A,L ;основное направление
  62.        CPL ;1-основное направление
  63.        LD L,A
  64.         LD (cur10yx),HL
  65.         LD (cur11yx),HL
  66.        CPL ;основное направление
  67.         LD L,H,H,A
  68.         LD (cur00xy),HL
  69.         LD (cur01xy),HL
  70.        LD A,L ;1-основное направление
  71.        CPL ;основное направление
  72.        LD L,A
  73.         LD (cur10xy),HL
  74.         LD (cur11xy),HL
  75.         LD HL,(curX)
  76.         LD A,(curY)
  77.         LD H,A
  78.        ;LD (curYX),HL
  79.         LD (ray00yx_YX),HL
  80.         LD (ray01yx_YX),HL
  81.         LD (ray10yx_YX),HL
  82.         LD (ray11yx_YX),HL
  83.         LD (ray00xy_YX),HL
  84.         LD (ray01xy_YX),HL
  85.         LD (ray10xy_YX),HL
  86.         LD (ray11xy_YX),HL
  87.         SET mapdifbit,L
  88.         LD (ray00xy_YX2),HL
  89.         LD (ray01xy_YX2),HL
  90.         LD (ray10xy_YX2),HL
  91.         LD (ray11xy_YX2),HL
  92.        IF showscans
  93.        LD A,(scans)
  94.        LD DE,#411E
  95.        LD C,10
  96.        CALL PRDIG
  97.        LD C,1
  98.        CALL PRDIG
  99.         XOR A
  100.        LD (scans),A
  101.        ENDIF
  102.  
  103.       IF interpolate == 0
  104.  
  105.        IF lores
  106.         LD L,0;2*(32-scrwid)
  107.         LD HY,scrwid*4
  108.        ELSE
  109.         LD L,0;4*(32-scrwid)
  110.         LD HY,scrwid*8
  111.        ENDIF
  112. RAY0
  113.         LD A,L
  114.         LD (cura),A
  115.         CALL RAYCAST
  116.        LD HL,(cura)
  117.         LD H,distbuf/256+2
  118.         LD (HL),C ;dist
  119.         DEC H
  120.         LD (HL),B ;texx
  121.         DEC H
  122.         RRCA ;CY=0
  123.         LD A,(DE) ;YX
  124.         LD (HL),A ;ID
  125.         INC L
  126.         DEC HY
  127.         JP NZ,RAY0
  128.  
  129.       ELSE ;interpolate
  130. main_step=interpolate;16
  131.          ;oldscan=RAYCAST(0)
  132.         XOR A
  133.         LD L,A
  134.         LD (cura),A
  135.         CALL RAYCAST
  136.         EXX
  137.          ;main_a=main_step-1
  138.         LD L,main_step-1
  139.        IF lores
  140.         LD HY,scrwid*4/main_step
  141.        ELSE
  142.         LD HY,scrwid*8/main_step
  143.        ENDIF
  144.          ;repeat {
  145. ;L=main_a
  146. ;BCDE'=oldscan
  147. ;BCDE=newscan
  148. RAY0
  149.          ;newscan=RAYCAST(main_a)
  150.         LD A,L
  151.         LD (cura),A
  152.         CALL RAYCAST
  153.        LD HL,(cura)
  154.          ;INTERPOLATE_SUB(main_a, main_step, oldscan, newscan)
  155.         LD A,main_step
  156.         LD H,distbuf/256+2
  157.         LD (HL),C ;dist
  158.         DEC H
  159.         LD (HL),B ;texx
  160.         DEC H
  161.         RRCA ;CY=0
  162.         CALL INTERPOLATE_SUB
  163.         LD A,(DE) ;YX
  164.         LD (HL),A ;ID
  165.          ;oldscan=newscan
  166.         LD A,L
  167.         EXX
  168.          ;main_a+=main_step
  169.         ADD A,main_step
  170.         LD L,A
  171.          ;} until(main_a>255)
  172.         DEC HY
  173.         JP NZ,RAY0
  174.       ENDIF ;interpolate
  175.         RET
  176.  
  177. ;((b+f)/2)^2-b^2/4-f^2/4
  178. ;a=e
  179.        MACRO MULPOS
  180.         LD H,tsqr2/256
  181.         ADD A,C
  182.         RRA
  183.         LD L,A
  184.         LD A,(HL)
  185.         INC H
  186.         LD L,C
  187.         SUB (HL)
  188.         LD L,E
  189.         SUB (HL)
  190.        ENDM
  191.  
  192.        MACRO DIVPOS
  193.         SRL C
  194.        DUP 7
  195.         ADD A,C
  196.         jr NC,$+3
  197.         SUB C
  198.         RL B
  199.         ADD A,A
  200.        EDUP
  201.         ADD A,C
  202.         LD A,B
  203.         RLA
  204.        ENDM
  205.  
  206.        MACRO DIVNEG
  207.         SRL C
  208.        DUP 7
  209.         SUB C
  210.         jr NC,$+3
  211.         ADD A,C
  212.         RL B
  213.         ADD A,A
  214.        EDUP
  215.         SUB C
  216.         LD A,B
  217.         RLA
  218.        ENDM
  219.  
  220.  
  221. ;Y растёт вверх
  222. RAYCAST
  223. ;L=(cura)=угол на экране
  224. ;портит ABCDEHLIX
  225.        IF showscans
  226. scans=$+1
  227.        LD A,0
  228.        INC A
  229.        LD (scans),A
  230.        ENDIF
  231.         LD H,tda/256
  232.         LD A,(HL)
  233. avision4L=$+1
  234.         ADD A,0
  235.         LD (rayrealangle),A
  236.         LD L,A
  237. avision4H=$+1
  238.         ADC A,0
  239.         SUB L ;a1..0 = 0..3 ~ sector 1..4
  240.        ;LD H,tctg/256 ;-pi/4..+pi/4
  241.        INC H
  242.         LD C,(HL) ;ystep or xstep
  243.         LD HX,-1 ;IX=dist*cos
  244.         ;jr $
  245.         RRA
  246.         jr NC,ray13
  247.         RRA
  248.         JP NC,ray2
  249.         JP ray4
  250. ray13   RRA
  251.         JP NC,ray1
  252.         JP ray3
  253.  
  254.         macro INCR num ;0..5 = bcdehl
  255.         db 0x04+(8*num)
  256.         endm
  257.  
  258.         macro DECR num ;0..5 = bcdehl
  259.         db 0x05+(8*num)
  260.         endm
  261.  
  262. ;RAY 1,1,H,L,D,E,y,x
  263.        MACRO RAY mainplus,secplus,maindirhlreg,secdirhlreg,maindirdereg,secdirdereg,maindir,secdir
  264. ;mainplus=\0 ;основное направление положительно
  265. ;secplus=\1 ;побочное направление положительно
  266. ;\2=основное направление для hl
  267. ;\3=побочное направление для hl
  268. ;\4=основное направление для de
  269. ;\5=побочное направление для de
  270. ;\6=основное направление
  271. ;\7=побочное направление
  272.        ;LD DE,(cur\7\6)
  273. ;cur0176=$+1
  274. ;        LD DE,0
  275.         LD A,E ;основное направление
  276.       ;IF mainplus ;основное направление положительно
  277.       ; CPL ;1-основное направление
  278.       ; LD E,A
  279.       ;ENDIF
  280.         LD LX,A ;IX=dist*cos
  281.         MULPOS
  282.        IF secplus ;побочное направление положительно
  283.         ADD A,D ;побочное направление
  284.         LD B,A
  285.        ;LD HL,(curYX)
  286. ray0176_YX=$+1
  287.         LD HL,0
  288.        IF maindir != 0 ;"\6\6"-"xx"
  289.        ;LD D,H,E,L
  290.        ;SET mapdifbit,E
  291. ray0176_YX2=$+1
  292.         LD DE,0
  293.        ELSE
  294.         LD D,H
  295.         ld E,L
  296.        ENDIF
  297.         jr NC,2f;raynshort\0\1\7\6
  298.         INCR secdirdereg;INC \5 ;e/d
  299.         LD A,(DE)
  300.         RLA
  301.         jr C,1f;raysec\0\1\7\6
  302.         INCR secdirhlreg;INC \3 ;l/h
  303. 2;raynshort\0\1\7\6
  304.        IF maindir != 1 ;"\6\6"-"yy"
  305.         SET mapdifbit,L
  306.        ENDIF
  307.        ELSE
  308.         LD L,A
  309.         LD A,D ;побочное направление
  310.         SUB L
  311.         LD B,A
  312.        ;LD HL,(curYX)
  313. ray0176_YX=$+1
  314.         LD HL,0
  315.        IF maindir != 0 ;"\6\6"-"xx"
  316.        ;LD D,H,E,L
  317.        ;SET mapdifbit,E
  318. ray0176_YX2=$+1
  319.         LD DE,0
  320.        ELSE
  321.         LD D,H
  322.         ld E,L
  323.        ENDIF
  324.         jr NC,2f;raynshort\0\1\7\6
  325.         LD A,(DE)
  326.         RLA
  327.         jr C,1f;raysec\0\1\7\6
  328.         ;DEC \3,\5 ;l/h,e/d
  329.         DECR secdirhlreg
  330.         DECR secdirdereg
  331. 2;raynshort\0\1\7\6
  332.        IF maindir != 1 ;"\6\6"-"yy"
  333.         SET mapdifbit,L
  334.        ENDIF
  335.        ENDIF
  336.  
  337. 3;raynsec=$;\0\1\7\6
  338.         INC HX
  339.        IF mainplus ;основное направление положительно
  340.         INCR maindirhlreg;INC \2 ;h/l
  341.        ENDIF
  342.         LD A,(HL)
  343.         RLA
  344.         JP C,rayhlq ;b=texx
  345.        IF mainplus ;основное направление положительно
  346.         INCR maindirdereg;INC \4 ;d/e
  347.        ELSE
  348.         ;DEC \2,\4 ;h/l,d/e
  349.         DECR maindirhlreg
  350.         DECR maindirdereg
  351.        ENDIF
  352.         LD A,B
  353.        IF secplus ;побочное направление положительно
  354.         ADD A,C
  355.        ELSE
  356.         SUB C
  357.        ENDIF
  358.         LD B,A
  359.         jr NC,3b;raynsec;\0\1\7\6
  360.        IF secplus ;побочное направление положительно
  361.         INCR secdirdereg;INC \5 ;e/d
  362.        ENDIF
  363.         LD A,(DE)
  364.         RLA
  365.         jr C,1f;raysec\0\1\7\6
  366.        IF secplus ;побочное направление положительно
  367.         INCR secdirhlreg;INC \3 ;l/h
  368.        ELSE        ;побочное направление отрицательно
  369.         ;DEC \3,\5 ;l/h,e/d
  370.         DECR secdirhlreg
  371.         DECR secdirdereg
  372.        ENDIF
  373.         JP 3b;raynsec;\0\1\7\6
  374.  
  375. 1;raysec\0\1\7\6
  376.         EXD
  377.         LD A,B
  378.        IF secplus ;побочное направление положительно
  379.         SUB C
  380.         DIVPOS
  381.        ELSE
  382.         ADD A,C
  383.         DIVNEG
  384.        ENDIF
  385.        IF mainplus ;основное направление положительно
  386.         CPL
  387.         LD B,A ;b=texx
  388.        ELSE
  389.         LD B,A ;b=texx
  390.         CPL
  391.        ENDIF
  392.         JP raydeq
  393.        ENDM
  394.  
  395. ;mainplus=\0 ;основное направление положительно
  396. ;secplus=\1 ;побочное направление положительно
  397. ;\2=основное направление для hl = 4..5
  398. ;\3=побочное направление для hl = 4..5
  399. ;\4=основное направление для de = 2..3
  400. ;\5=побочное направление для de = 2..3
  401. ;\6=основное направление
  402. ;\7=побочное направление
  403. ;сейчас l=angle
  404. ray1
  405.         BIT 7,L
  406.         JP NZ,ray1b
  407.         ;RAY 1,1,L,H,E,D,x,y ;1a
  408. cur11yx=$+1
  409.         LD DE,0
  410.         RAY 1,1,5,4,3,2,0,1;x,y ;1a
  411. ;cur11yx=cur0176
  412. ray11yx_YX=ray0176_YX
  413. ;ray11yx_YX2=ray0176_YX2
  414. ray1b
  415.         ;RAY 1,1,H,L,D,E,y,x ;1b
  416. cur11xy=$+1
  417.         LD DE,0
  418.         RAY 1,1,4,5,2,3,1,0;y,x ;1b
  419. ;cur11xy=cur0176
  420. ray11xy_YX=ray0176_YX
  421. ray11xy_YX2=ray0176_YX2
  422. ray2
  423.         BIT 7,L
  424.         JP NZ,ray2b
  425.         ;RAY 1,0,H,L,D,E,y,x ;2a
  426. cur10xy=$+1
  427.         LD DE,0
  428.         RAY 1,0,4,5,2,3,1,0;y,x ;2a
  429. ;cur10xy=cur0176
  430. ray10xy_YX=ray0176_YX
  431. ray10xy_YX2=ray0176_YX2
  432. ray2b
  433.         ;RAY 0,1,L,H,E,D,x,y ;2b
  434. cur01yx=$+1
  435.         LD DE,0
  436.         RAY 0,1,5,4,3,2,0,1;x,y ;2b
  437. ;cur01yx=cur0176
  438. ray01yx_YX=ray0176_YX
  439. ;ray01yx_YX2=ray0176_YX2
  440. ray3
  441.         BIT 7,L
  442.         JP NZ,ray3b
  443.         ;RAY 0,0,L,H,E,D,x,y ;3a
  444. cur00yx=$+1
  445.         LD DE,0
  446.         RAY 0,0,5,4,3,2,0,1;x,y ;3a
  447. ;cur00yx=cur0176
  448. ray00yx_YX=ray0176_YX
  449. ;ray00yx_YX2=ray0176_YX2
  450. ray3b
  451.         ;RAY 0,0,H,L,D,E,y,x ;3b
  452. cur00xy=$+1
  453.         LD DE,0
  454.         RAY 0,0,4,5,2,3,1,0;y,x ;3b
  455. ;cur00xy=cur0176
  456. ray00xy_YX=ray0176_YX
  457. ray00xy_YX2=ray0176_YX2
  458. ray4
  459.         BIT 7,L
  460.         JP NZ,ray4b
  461.         ;RAY 0,1,H,L,D,E,y,x ;4a
  462. cur01xy=$+1
  463.         LD DE,0
  464.         RAY 0,1,4,5,2,3,1,0;y,x ;4a
  465. ;cur01xy=cur0176
  466. ray01xy_YX=ray0176_YX
  467. ray01xy_YX2=ray0176_YX2
  468. ray4b
  469.         ;RAY 1,0,L,H,E,D,x,y ;4b
  470. cur10yx=$+1
  471.         LD DE,0
  472.         RAY 1,0,5,4,3,2,0,1;x,y ;4b
  473. ;cur10yx=cur0176
  474. ray10yx_YX=ray0176_YX
  475. ;ray10yx_YX2=ray0176_YX2
  476.  
  477. rayhlq
  478.         XOR A
  479. raydeq
  480. ;b=texx
  481. ;hl=YX
  482. ;dist*cos=ix+a
  483.  
  484.        PUSH HL
  485.         ADD A,LX
  486.         LD L,A
  487.         ADC A,HX
  488.         SUB L
  489.         LD H,A
  490. ;HL=dist*cos=128..#3fff
  491.  
  492. ;приводим к 128..255
  493.         LD DE,#000
  494.         LD A,L
  495.         jr Z,TOLOGRLQ
  496.        DUP 5;6
  497.         INC D
  498.         SRL H
  499.         RRA
  500.         jr Z,TOLOGRLE
  501.        EDUP
  502. TOLOGRLQ ;
  503.         OR A
  504.         JP M,$+5 ;>=128
  505.         LD A,128 ;<128
  506. TOLOGRLE ;
  507.         LD L,A ;128..255
  508.        ;D=0..5
  509.         LD H,tlogd/256
  510. ;2.делим на cos
  511. rayrealangle=$+1
  512.         LD A,(tlogcos) ;0..63
  513.         ADD A,(HL) ;log(dist/2^N) = 128..255 for arg>=128
  514.        IF debug
  515.        jr NC,$+3
  516.        INC D
  517.        ENDIF
  518.  
  519. ;3.умножение на corrdist(scrX) - получаем k/масштаб
  520. ;(сокращаем расстояние по краям в sqrt(2) раз)
  521. ;corrdist(scrX)=1/sqrt(1+scrX^2), где scrX=-1..+1
  522. ;из него номер таблицы масштабирования
  523. cura=$+1
  524.         LD HL,tcorrlogd ;L=scrX=0..255="-127.5..127.5"
  525.         SUB (HL) ;64..128
  526.        IF debug
  527.        jr NC,DEBBP
  528.        DEC D
  529.        JP P,DEBBP
  530.        INC D
  531.        XOR A
  532. DEBBP ;
  533.        ENDIF
  534.         LD L,A
  535.         LD H,tlogd2sca/256
  536.          SRA D
  537.          RR E ;DE=+0,+#80,..+#300
  538.         ADD HL,DE
  539.        IF debug
  540.         BIT 7,(HL)
  541.         jr NZ,$
  542.        ENDIF
  543.         LD C,(HL) ;dist=127..1
  544.                   ;todo linear scale, recalc in DRAWWALLS
  545.          SCF
  546.          RR B ;texx=0x80..0xFF
  547.        IF scale64
  548.         SRL B ;texx=0x40..0x7F
  549.        ENDIF
  550.        POP DE
  551.         RET
  552.  
  553.        IF interpolate
  554.        IF 0
  555. I_SUB_INTERt ;
  556.         POP HL  ;
  557.         PUSH HL ;de
  558.         LD A,D
  559.         SUB H
  560.         jr NZ,holeny
  561.         LD A,E
  562.         SUB L
  563.         JP Z,I_SUB_INTER ;продолжение стены
  564.         DEC A
  565.         CP 3
  566.         jr C,nhole
  567.         JP isubneq
  568. holeny ;
  569.         DEC A
  570.         CP 3
  571.         jr NC,isubneq
  572.         LD A,E
  573.         CP L
  574.         jr NZ,isubneq
  575. nhole ;
  576.        ENDIF
  577. I_SUB_INTER
  578.          ; rightscan=Middlescan
  579.         LD A,C
  580.         EXX
  581.         ADD A,C
  582.         RRA
  583.         LD C,A ;dist
  584.         EXX
  585.         LD A,B
  586.         EXX
  587.         ADD A,B
  588.         RRA
  589.         LD B,A ;texx
  590. I_SUB_SCANQ ;
  591.          ;INTERPOLATE_SUB(a-step, step, leftscan, rightscan);r=M
  592.        PUSH HL ;step,a
  593.         LD A,L
  594.         SUB H
  595.         LD L,A ;a-step
  596.         LD A,H
  597.         LD H,distbuf/256+2
  598.         LD (HL),C ;dist
  599.         DEC H
  600.         LD (HL),B ;texx
  601.         DEC H
  602.         RRCA
  603.         CALL NC,INTERPOLATE_SUB
  604.         LD A,(DE) ;YX
  605.         LD (HL),A ;ID
  606.          ;leftscan=rightscan ;=Middlescan
  607.         EXX
  608.        POP HL ;step,a
  609.          ;pop(rightscan)
  610.         POP DE
  611.         pop BC
  612.          ;INTERPOLATE_SUB(a, step, leftscan, rightscan) ;l=M,r=R
  613.          ;scan[a]=rightscan
  614.          ;if (step==1) exit
  615.         LD A,H
  616.         LD H,distbuf/256+2
  617.         LD (HL),C ;dist
  618.         DEC H
  619.         LD (HL),B ;texx
  620.         DEC H
  621.         RRCA
  622.         RET C
  623. INTERPOLATE_SUB
  624. ;L=a
  625. ;A=step/2                 ;not preserved
  626. ;BCDE'=leftscan ;(a-step) ;not preserved
  627. ;BCDE=rightscan ;(a)
  628. ;CY=0
  629.        EXA
  630.         LD A,(DE) ;YX
  631.         LD (HL),A ;ID ;texx,dist are written already
  632.        EXA
  633.          ;step=step/2
  634.         LD H,A
  635.          ;push(rightscan)
  636.         PUSH BC
  637.         push DE
  638.          ;if(rightscan.yx==leftscan.yx)
  639.      ;LD A,(DE)
  640.         EXX
  641.      ;EXD
  642.      ;XOR (HL)
  643.      ;EXD
  644.      ;JP Z,I_SUB_INTERt
  645.         POP HL  ;
  646.         PUSH HL ;de
  647.         ;OR A
  648.         SBC HL,DE ;CY=0
  649.         JP Z,I_SUB_INTER
  650. isubneq
  651.          ; rightscan=RAYCAST(a-step)
  652.         EXX
  653.         PUSH HL
  654.         LD A,L
  655.         SUB H
  656.         LD L,A ;a-step
  657.         LD (cura),A
  658.         CALL RAYCAST
  659.         POP HL
  660.         JP I_SUB_SCANQ
  661.          ;else - see above
  662.        ENDIF ;interpolate
  663.  
  664.  
  665. ;============================
  666.        IF sprites
  667. viewrange=6
  668.  
  669. SCANMONS
  670.         LD A,(curX)
  671.         SUB viewrange
  672.         LD (scmonX),A
  673.         LD A,(curY)
  674.         SUB viewrange
  675.         LD (scmonY),A
  676.        LD HL,cursprites
  677.        LD (HL),0 ;end of sprites
  678.        LD (scaneof),HL
  679.         LD HL,MONSTRS+1 ;1+начало табл.монстров/предметов
  680.        CALL SCMONS0 ;цикл скан-я видимых монстров/предметов
  681.         RET
  682.  
  683. SCMONNx
  684.         LD A,L
  685.         ADD A,8
  686.         LD L,A
  687.         JR C,SCMxIH
  688. SCMONS0
  689.         LD A,(HL)
  690.         INC A
  691.        RET Z
  692. scmonX=$+1
  693.         SUB 0
  694.         CP viewrange*2+1
  695.         JP NC,SCMONNx
  696.         INC L
  697.         inc L
  698.         LD A,(HL)
  699. scmonY=$+1
  700.         SUB 0
  701.         CP viewrange*2+1
  702.         JR C,SCMONY
  703.         LD A,L
  704.         ADD A,6
  705.         LD L,A
  706.         JP NC,SCMONS0
  707. SCMxIH  INC H
  708.         JP SCMONS0
  709. SCMONY  DEC L
  710.         dec L
  711.         dec L
  712.         LD C,(HL)
  713.         INC L
  714.         LD B,(HL) ;Xx
  715.         INC L
  716.         LD E,(HL)
  717.         INC L
  718.         LD D,(HL) ;Yy
  719.         INC L
  720.        PUSH HL
  721.         PUSH BC
  722.         display $
  723.        LD L,(HL) ;TYPE = 1..63
  724.        ;ld a,l
  725.        ;cp 6
  726.        ;jr z,$
  727.      ;ld l,0
  728.        LD B,0
  729.        ld H,B
  730.         ADD HL,HL
  731.         ADD HL,HL
  732.         ADD HL,HL
  733.         ;ADD HL,BC
  734.         ;ADD HL,HL
  735.         LD BC,MONSTAB-8
  736.         ADD HL,BC
  737.        ;LD A,(HL) ;texx
  738.        ;LD HX,A
  739.        ;INC HL
  740.        LD A,(HL) ;ID текстуры
  741.        ld lx,a
  742.         POP BC
  743. ;calculate sprite position
  744.         LD HL,(curYy)
  745.         SBC HL,DE ;Yy
  746.         EXD
  747.         LD HL,(curXx)
  748.         SBC HL,BC ;Xx
  749.         CALL OBJMUL
  750.        ;BC=dist
  751.        ;DE=xscr
  752.        IF lores
  753.         SRA D
  754.         RR E
  755.        ENDIF
  756.         LD HL,pixperchr*scrwid/2-256
  757.         SBC HL,DE
  758.         INC H
  759.        jr NZ,SCANnSPR ;X out of screen
  760.        IF lores
  761.         BIT 7,L
  762.        jr NZ,SCANnSPR ;X out of screen
  763.        ENDIF
  764. ;write data to cursprites
  765.        PUSH BC
  766.         EXX
  767.        POP BC
  768.         LD HL,cursprites+((-2)&0xff)
  769. SCANsort0
  770.         INC L
  771.         inc L
  772.         LD A,(HL)
  773.         OR A
  774.         jr Z,SCANins
  775.         INC L
  776.         LD E,(HL)
  777.         INC L
  778.         LD D,(HL)
  779.         EXD
  780.         SBC HL,BC
  781.         EXD
  782.         jr NC,SCANsort0
  783.         DEC L
  784.         dec L
  785. SCANins
  786.        PUSH BC
  787. scaneof=$+1
  788.         LD DE,0
  789.         LD A,E
  790.         SUB L
  791.         INC A ;bytes to move
  792.         LD C,A
  793.         LD B,0
  794.         LD H,D
  795.         ld L,E
  796.         LD A,E
  797.         ADD A,4
  798.         LD E,A
  799.         LD (scaneof),A
  800.         LDDR
  801.         INC HL
  802.        POP BC
  803.        LD A,lx;1
  804. ;A=ID текстуры
  805. ;BC'=dist
  806. ;L'=xscr
  807.         LD (HL),A
  808.         INC L
  809.         LD (HL),C
  810.         INC L
  811.         LD (HL),B
  812.         INC L
  813.         EXX
  814.         LD A,L
  815.         EXX
  816.         LD (HL),A ;xscr
  817.         INC L
  818.         EXX
  819. SCANnSPR ;
  820.        POP HL
  821.         INC L
  822.         inc L
  823.         inc L
  824.         inc HL
  825.        INC L
  826.         JP SCMONS0
  827.  
  828. DRAWSPRITES
  829.         LD IY,cursprites
  830. DRAWSPRITES0 ;
  831.         LD A,(IY)
  832.         OR A
  833.         RET Z
  834.         INC IY
  835.         LD C,(IY)
  836.         INC IY
  837.         LD B,(IY)
  838.         INC IY
  839. ;A=ID
  840.         if atm==0
  841.         EXX
  842.          LD D,a;#EA ;ID
  843.         EXX
  844.         endif
  845.         add a,a
  846.         add a,a
  847.         ld hl,tsprites-4
  848.         add a,l
  849.         ld l,a
  850.         jr nc,$+3
  851.         inc h
  852.         display $
  853.         ;jr $
  854.         ld a,(hl)
  855.         ld (drawspritepg),a
  856.         inc hl
  857.         ld a,(hl)
  858.        LD HX,a;#80+22;#C0 ;texx_center
  859.        ;ld hx,22/2
  860.         inc hl
  861.         ld a,(hl)
  862.         ld (drawspritetexxleft),a
  863.         inc hl
  864.         ld a,(hl)
  865.         ld (drawspritetexxright),a
  866.         LD L,(IY)
  867.         INC IY
  868. ;L=xscr
  869. ;BC=dist
  870.         INC B
  871.         DJNZ gFILLNCLOSE
  872.         LD A,108;64 ;от этого числа зависит только ширина спрайта при максимальном приближении, но не максимальная высота (она ограничена этим числом и сравнением дальше, закомментированным) ;108 чуть ниже ATM экрана, 128 запас около 8 пикс снизу
  873.         CP C
  874.          jr nc,DRAWSPRITES0 ;лампы не уменьшаем ;TODO уметь отличать врагов от ламп
  875.         jr C,$+3
  876.         LD C,A ;спрайт слишком близко!!! уменьшим
  877. gFILLNCLOSE
  878.        PUSH BC ;dist
  879. ;приводим к 128..255
  880.         LD DE,#000
  881.         INC B
  882.         DEC B
  883.         LD A,C
  884.         jr Z,MOTOLOGRLQ
  885.        DUP 5;6
  886.         INC D
  887.         SRL B
  888.         RRA
  889.         jr Z,MOTOLOGRLE
  890.        EDUP
  891. MOTOLOGRLQ ;
  892.         ;OR A
  893.         ;JP M,$+5 ;>=128
  894.         ;LD A,128 ;<128
  895.         ;;cp 96
  896.         ;;jr nc,$+4
  897.         ;;ld a,96 ;спрайт слишком близко!!! увеличим dist для уменьшения высоты
  898. MOTOLOGRLE ;
  899.         LD C,A ;128..255 ;D=0..5
  900.         LD B,tlogd/256
  901.         LD A,(BC) ;log(dist) = 128..255 for arg>=128
  902.        if atm==0
  903.        SUB 16;64                 ;0..127 for arg=64..127 ;???
  904.        endif
  905.         LD C,A                ;0 for arg<64
  906.         LD B,tlogd2sca/256
  907.          SRA D
  908.          RR E ;DE=+0,+#80,..+#300
  909.         EXD
  910.         ADD HL,BC
  911.         display "getscale#=",$
  912.         LD C,(HL) ;scale#
  913.         EXD
  914.       ;
  915.        POP DE ;dist
  916.        if atm
  917.         ld a,l
  918.         ld h,d
  919.         ld l,e
  920.         srl h
  921.         rr l
  922.         add hl,de
  923.         ex de,hl ;de = de * 1.5
  924.         ld l,a
  925.        else
  926.        IF loresspr
  927.         SLA E
  928.         RL D
  929.        ENDIF
  930.         SLA E
  931.         RL D ;DE=texx step = de * 4
  932.        endif
  933.  
  934.        IF loresspr_hires|optresspr
  935.        RES 0,L
  936.        ENDIF
  937.         LD H,distbuf/256+2 ;ID,texx,dist
  938.         LD A,C ;scale#
  939.         CP (HL)
  940.         CALL NC,DRAWSPRITE ;object center is visible ;TODO независимо от видимости центра
  941.         JP DRAWSPRITES0
  942.  
  943. OBJMULQ
  944.         POP AF ;X
  945.        LD D,#40 ;X out of screen
  946.         RET
  947. ;пересчет координат объекта (Xx=HL, Yy=DE)
  948. ;в координаты на экране (DE=xscr, BC=расстояние)
  949. OBJMUL
  950.         PUSH HL ;X
  951.        PUSH DE ;Y
  952.        PUSH HL ;X
  953.         LD HL,(curangle) ;L=центр взгляда
  954.         LD C,(HL) ;sin=шаг по Y
  955.         LD A,-64
  956.         SUB L
  957.         LD L,A
  958.         LD B,(HL) ;-COS=шаг по X
  959.    ;Bc=DXdy=COSsin
  960.         LD A,C
  961.         CPL
  962.         CALL MULT ;HL=A*DE=-sin*Y
  963.        POP DE ;X
  964.         LD A,B
  965.         CALL MULTADD ;HL=-COS*X-sin*Y=d(расстояние по объекта)
  966.        POP DE ;Y
  967.         BIT 7,H
  968.         jr NZ,OBJMULQ ;если расстояние<0,то объект за спиной=>exit
  969.         LD (_OBJd1),HL
  970.         CALL MULT;A=B=-COS, HL=-COS*Y
  971.        POP DE ;X
  972.         LD A,C
  973.         CALL MULTADD ;HL=-COS*Y+sin*X=xscr*d
  974.         EXD
  975. _OBJd1=$+1
  976.         LD BC,0 ;BC=d ;после MONDIV получим DE=xscr
  977.  
  978. ;деление
  979. ;DE=+-7.8;BC=+7.8
  980. ;DE=DE/BC=+-8.7/2
  981.     ;BC сохраняется!!!
  982. MONDIV
  983.         LD H,0
  984.         LD A,D
  985.         SLA E
  986.         RLA
  987.         JP C,MONDIVNEG ;если делимое<0
  988.         LD L,A
  989.         INC E
  990.         LD A,E
  991.        DUP 7
  992.         SBC HL,BC
  993.         JR NC,$+3
  994.         ADD HL,BC
  995.         RLA
  996.         ADC HL,HL
  997.        EDUP
  998.         CPL
  999.         LD D,A
  1000.        DUP 7
  1001.         SBC HL,BC
  1002.         JR NC,$+3
  1003.         ADD HL,BC
  1004.         RLA
  1005.         ADD HL,HL
  1006.        EDUP
  1007.         SBC HL,BC
  1008.         JR NC,$+3
  1009.         ADD HL,BC
  1010.         RLA
  1011.         CPL
  1012.         LD E,A
  1013.         RET
  1014. ;если делимое<0
  1015. MONDIVNEG
  1016.         CPL
  1017.         LD L,A
  1018.         SBC A,A
  1019.         XOR E
  1020.        DUP 7
  1021.         SBC HL,BC
  1022.         JR NC,$+3
  1023.         ADD HL,BC
  1024.         RLA
  1025.         ADC HL,HL
  1026.        EDUP
  1027.         LD D,A
  1028.        DUP 7
  1029.         SBC HL,BC
  1030.         JR NC,$+3
  1031.         ADD HL,BC
  1032.         RLA
  1033.         ADD HL,HL
  1034.        EDUP
  1035.         SBC HL,BC
  1036.         JR NC,$+3
  1037.         ADD HL,BC
  1038.         RLA
  1039.         LD E,A
  1040.         RET
  1041.  
  1042. ;умножение
  1043. ;A=+-0.7
  1044. ;HL=A*DE
  1045.     ;A сохраняется!!!
  1046. MULT
  1047.         LD HL,0
  1048. MULTADD
  1049.         RLCA
  1050.         JR NC,MULTPLU
  1051.         DUP 6
  1052.         SRA D
  1053.         RR E
  1054.         RLCA
  1055.         JR C,$+4
  1056.         SBC HL,DE
  1057.         EDUP
  1058.         RLCA
  1059.         RET C
  1060.         SRA D
  1061.         RR E
  1062.          OR A
  1063.         SBC HL,DE
  1064.         RET
  1065. MULTPLU DUP 6
  1066.         SRA D
  1067.         RR E
  1068.         RLCA
  1069.         JR NC,$+3
  1070.         ADD HL,DE
  1071.         EDUP
  1072.         RLCA
  1073.         RET NC
  1074.         SRA D
  1075.         RR E
  1076.         ADD HL,DE
  1077.         RET
  1078.  
  1079.        ENDIF ;sprites