home *** CD-ROM | disk | FTP | other *** search
/ The Equalizer BBS / equalizer-bbs-collection_2004.zip / equalizer-bbs-collection / DEMOSCENE-STUFF / CRY.ZIP / CRY_SRC.ZIP / CRY.ASM < prev    next >
Assembly Source File  |  1996-01-20  |  70KB  |  2,042 lines

  1. ;
  2. ;     ▄█   █▓ ██   █▓ █████▄  █████▄  ███████ ██      ██ ▄████▄  ▄████▓ █▓
  3. ;     █▓   █▓ ██▄  █▓ ▄▄  ▀██ ▄▄  ▀██ █▓   █▓ ██      █▓   ▄██▀ ██▀     █▓
  4. ;     █▓████▓  ▀████▓ █▓   █▓ █▓   ██ █▓   █▓ ██ ██▓  █▓ ▄██▀   ██ ██▓  █▓
  5. ;     █▓   █▓      █▓ █▓ ███▓ █▓   ██ █▓   █▓ ██▄     █▓ ██     ██▄
  6. ;     █▓   █▓      █▓ █▓      █▓   ██ █▓████▓  ▀████▓ █▓ ▀████▓  ▀████▓ █▓
  7. ;                  █▓
  8. ;   ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  9. ;                       ╓─────────────────────────────╖
  10. ;        ---───────────═╡      ·P·R·E·S·E·N·T·S·      ╞═───────────---
  11. ;                       ╙─────────────────────────────╜
  12. ;
  13. ;                             ▀▀▀█▄  ▀▀▀█▄  ▀  █▄
  14. ;                             █      █  ██  █  ██
  15. ;                             █  ▄▄  █▀██   ▀▀▀██
  16. ;         4Kb Intro called    █▄▄██  █  ██  █▄▄██    by Ozir / Hypnotize
  17. ;
  18. ;∙────────────────────────────────────────────────────────────────────────────∙
  19. ;
  20. ;    Yes... Here it is ... Source to the 4Kb called 'CRY'
  21. ;                                             by Ozir / Hypnotize ...
  22. ;
  23. ;    You can of coz uses this code in your production but
  24. ;                                 remember that riping code is very Lame!
  25. ;
  26. ;┌───────────────────────────────────────────────────────────────────────────┐
  27. ;│ Equ's                                                                     │
  28. ;└───────────────────────────────────────────────────────────────────────────┘
  29. MaxObjects         equ 6                         ;how many objects
  30. MaxLevels          equ 25                        ;how many levels in object
  31. MaxRots            equ 10                        ;how many points on circle
  32. RotsAdd            equ 360/MaxRots               ;angle for circle add
  33. MaxPoints          equ MaxLevels*MaxRots         ;how many points
  34. MaxFaces           equ MaxRots*2*(MaxLevels-1)   ;how many faces
  35. ObjectSize         equ MaxLevels*2               ;obj size in bytes
  36. MaxVectorSteps     equ 30            ;(*)        ;how steps in object blend
  37. EyeDist            equ 500                       ;distance to objects
  38. CenterX            equ 160                       ;screen x center
  39. CenterY            equ 100                       ;screen y center
  40. AngleStepX         equ 6                         ;rotate about x axis
  41. AngleStepZ         equ 8                         ;rotate about z axis
  42. BlendTime          equ 60                        ;how max frames for blend
  43. ScrollTime         equ 50                        ;how long scrool screen
  44. EventTime          equ 230           ;(*)        ;time from envent to event
  45. ;∙───────────────────────────────────────────────────────────────────────────∙
  46.                    .386c
  47. ;┌───────────────────────────────────────────────────────────────────────────┐
  48. ;│ Start of program                                                          │
  49. ;└───────────────────────────────────────────────────────────────────────────┘
  50.                    assume cs:code, ds:code
  51. code               segment use16 para
  52.                    org 100h
  53.  
  54. ;∙──────────────── Init Intro ───────────────────────────────────────────────∙
  55.  
  56. start:             mov bx,sp                  ;set min of memory
  57.                    add bx,15
  58.                    shr bx,4
  59.                    mov ax,ss
  60.                    add bx,ax
  61.                    mov ax,es
  62.                    sub bx,ax
  63.                    mov ah,4Ah
  64.                    int 21h
  65.  
  66. ;∙──────────────── Make Full Sinus Table ────────────────────────────────────∙
  67.  
  68.                    mov si,offset cs:sinus
  69.                    mov di,offset cs:trg
  70.                    mov eax,010000h
  71.                    mov cs:[di+360],eax
  72.                    neg eax
  73.                    mov cs:[di+1080],eax
  74.                    mov bp,di
  75.                    add bp,360              ;4*90
  76.                    mov cx,90
  77. MakeFullSinLoop:   mov al,cs:[si]
  78.                    movzx eax,al
  79.                    shl eax,8               ;conv to 16bit quality
  80.                    mov cs:[di],eax         ;1/5
  81.                    mov cs:[di+1440],eax    ;5/5 (360*4)
  82.                    mov cs:[bp+360],eax     ;2/5 (90*4)
  83.                    mov cs:[bp+1800],eax    ;6/5
  84.                    neg eax
  85.                    mov cs:[di+720],eax     ;3/5 (180*4)
  86.                    mov cs:[bp+1080],eax    ;4/5 (270*4)
  87.                    add di,4
  88.                    inc si
  89.                    sub bp,4
  90.                    loop MakeFullSinLoop
  91.  
  92. ;∙──────────────── Init Memory ──────────────────────────────────────────────∙
  93.  
  94.                    mov bx,1024
  95.                    mov cx,512
  96.                    mov dx,4096
  97.  
  98.                    mov ax,cs
  99.                    add ax,3072 ;48kb after now
  100.                    mov cs:SegFaces,ax
  101.                    add ax,bx ;(16kb)
  102.                    mov cs:SegSort,ax
  103.                    add ax,bx ;(16kb)
  104.                    mov cs:Seg2d,ax
  105.                    add ax,bx ;(16kb)
  106.                    mov cs:SegPoints,ax      ;actual points (dw)
  107.                    add ax,cx ;(8kb)
  108.                    mov cs:SegNormals,ax     ;actual normals (dw)
  109.                    add ax,cx ;(8kb)
  110.                    mov cs:SegFacNor,ax      ;temp buffer for normals to fac's
  111.                    add ax,cx ;(8kb)
  112.                    mov cs:SegPointsDD,ax
  113.                    add ax,bx ;(16kb)
  114.                    mov cs:SegNormalsDD,ax
  115.                    add ax,bx ;(16kb)
  116.                    mov cs:SegPointsAddDD,ax
  117.                    add ax,bx ;(16kb)
  118.                    mov cs:SegNormalsAddDD,ax
  119.                    add ax,bx ;(16kb)
  120.                    mov cs:SegTexture,ax     ;texture segment
  121.                    add ax,dx ;(64kb)
  122.                    mov cs:SegScreen,ax      ;temp screen
  123.                    add ax,dx ;(64kb)
  124.                    mov cs:SegBack,ax        ;background
  125.                    add ax,dx ;(64kb)
  126.  
  127.                    mov cs:SegStart,ax       ;start of points table
  128.  
  129. ;∙──────────────── Create all Objects ───────────────────────────────────────∙
  130.  
  131.                    mov ax,cs:SegStart
  132.                    push ax
  133.  
  134. ;∙──────────────── Create Faces ─────────────────────────────────────────────∙
  135.  
  136.                    mov ax,cs:SegFaces
  137.                    mov ds,ax
  138.                    xor di,di
  139.                    mov cx,MaxLevels
  140.                    dec ecx
  141.                    xor bp,bp               ;start fac
  142.  
  143. CreateFacY:        push ecx
  144.                    mov cx,MaxRots
  145.                    dec ecx
  146.                    xor dx,dx               ;actual x
  147.  
  148. CreateFacX:        mov ax,bp
  149.                    add ax,dx
  150.                    push ax
  151.                    mov ds:[di],ax          ;start+x
  152.                    mov ds:[di+6+2],ax      ;start+x
  153.                    add ax,MaxRots
  154.                    mov ds:[di+2],ax        ;start+x+rots
  155.                    inc ax
  156.                    mov ds:[di+4],ax        ;start+x+rots+1
  157.                    mov ds:[di+6+4],ax      ;start+x+rots+1
  158.                    pop ax
  159.                    inc ax
  160.                    mov ds:[di+6],ax        ;start+x+1
  161.                    add di,12
  162.  
  163.                    inc dx
  164.                    loop CreateFacX
  165.  
  166.                    mov ax,bp
  167.                    mov ds:[di+6],ax        ;start
  168.                    add ax,MaxRots
  169.                    mov ds:[di+4],ax        ;start+rots
  170.                    mov ds:[di+6+4],ax      ;start+rots
  171.                    dec ax
  172.                    mov ds:[di],ax          ;start+rots-1
  173.                    mov ds:[di+6+2],ax      ;start+rots-1
  174.                    add ax,MaxRots
  175.                    mov ds:[di+2],ax        ;start+rots-1+rots
  176.                    add di,12
  177.  
  178.                    pop ecx
  179.                    add bp,MaxRots
  180.                    loop CreateFacY
  181.  
  182. ;∙──────────────── Create Normals and Vertexs ───────────────────────────────∙
  183.  
  184.                    mov si,offset cs:FirstObject
  185.                    mov cx,MaxObjects
  186. LoopObject:        push si ecx
  187.  
  188.                    mov ax,cs:SegPoints
  189.                    mov es,ax
  190.                    xor di,di
  191.                    call CreateVertexs
  192.                    call CreateFNormals
  193.                    call CreateNormals
  194.  
  195.                    mov ax,cs:SegStart
  196.                    mov es,ax
  197.                    mov ax,cs:SegPoints
  198.                    mov ds,ax
  199.                    xor si,si
  200.                    xor di,di
  201.                    mov cx,8192
  202.                    rep movsb
  203.                    mov ax,cs:SegStart
  204.                    add ax,512
  205.                    mov es,ax
  206.                    mov ax,cs:SegNormals
  207.                    mov ds,ax
  208.                    xor si,si
  209.                    xor di,di
  210.                    mov cx,8192
  211.                    rep movsb
  212.  
  213.                    add word ptr cs:SegStart,1024   ;(16kb)
  214.  
  215.                    pop ecx si
  216.                    add si,50
  217.                    loop LoopObject
  218.  
  219.                    pop ax
  220.                    mov cs:SegStart,ax
  221.  
  222. ;∙──────────────── Init Vga Mode ────────────────────────────────────────────∙
  223.  
  224.                    mov ax,0013h
  225.                    int 10h
  226.  
  227. ;∙──────────────── Set 'Init' Palette ───────────────────────────────────────∙
  228.  
  229.                    xor ax,ax
  230.                    xor bx,bx
  231.                    mov cx,02a00h
  232.                    mov di,offset palette1
  233.                    push di
  234.                    mov ebp,128
  235.                    push ebp
  236.                    call CreatePalette
  237.  
  238.                    pop ebp
  239.                    pop di
  240.                    add di,128*3
  241.                    xor ax,ax
  242.                    mov bx,03f2ah
  243.                    xor cx,cx
  244.                    call CreatePalette
  245.  
  246.                    mov si,offset palette1
  247.                    call setpalette
  248.  
  249. ;∙──────────────── Scroll Texture ───────────────────────────────────────────∙
  250.  
  251.                    push cs
  252.                    pop ds
  253.                    mov ax,0a000h
  254.                    mov fs,ax
  255.  
  256.                    mov cx,101+ScrollTime
  257. movetxt:           push ecx
  258.                    call writetexture
  259.                    pop ecx
  260.                    loop movetxt
  261.  
  262. ;∙──────────────── Flash ────────────────────────────────────────────────────∙
  263.  
  264.                    mov si,offset cs:palette1
  265.                    mov di,offset cs:WhitePal
  266.                    call SetFade
  267.  
  268.                    call GoFade
  269.  
  270. ;∙──────────────── Remapping Texture ────────────────────────────────────────∙
  271.  
  272.                    mov ax,0a000h
  273.                    mov ds,ax
  274.                    mov es,ax
  275.                    xor si,si
  276.                    xor di,di
  277.                    mov cx,64000
  278. RemapTexture:      lodsb
  279.                    shr al,2
  280.                    stosb
  281.                    loop RemapTexture
  282.  
  283. ;∙──────────────── Create BackGround ────────────────────────────────────────∙
  284.  
  285.                    xor si,si
  286.                    xor di,di
  287.                    mov ax,cs:SegBack
  288.                    mov es,ax
  289.                    mov cx,64000
  290.                    rep movsb
  291.  
  292. ;∙──────────────── Blend to New Palette ─────────────────────────────────────∙
  293.  
  294.                    xor ax,ax
  295.                    mov bx,03f00h
  296.                    mov cx,028h
  297.                    mov di,offset cs:palette1
  298.                    mov ebp,64
  299.                    push di
  300.                    push ebp
  301.                    call CreatePalette
  302.  
  303.                    mov ax,0283fh
  304.                    mov bx,03f00h
  305.                    mov cx,03f3fh
  306.                    pop ebp
  307.                    pop di
  308.                    add di,64*3
  309.                    call CreatePalette
  310.  
  311.                    xor ax,ax
  312.                    mov bx,02d00h
  313.                    xor cx,cx
  314.                    mov di,offset cs:palette1
  315.                    add di,128*3
  316.                    mov ebp,100
  317.                    call CreatePalette
  318.  
  319.                    mov ax,02dh
  320.                    mov bx,03f00h
  321.                    mov cx,03f3fh
  322.                    mov di,offset cs:palette1
  323.                    add di,(128+100)*3
  324.                    mov ebp,20
  325.                    call CreatePalette
  326.  
  327.                    mov ax,03f3fh
  328.                    mov bx,ax
  329.                    mov cx,ax
  330.                    mov di,offset cs:palette1
  331.                    add di,(128+100+20)*3
  332.                    mov ebp,20
  333.                    call CreatePalette
  334.  
  335.                    mov si,offset cs:WhitePal
  336.                    mov di,offset cs:palette1
  337.                    call SetFade
  338.  
  339.                    call GoFade
  340.  
  341. ;∙──────────────── Show Logo ────────────────────────────────────────────────∙
  342.  
  343.                    call ShowLogo
  344.  
  345. ;∙──────────────── Create Texture for Enviroment ────────────────────────────∙
  346.  
  347.                    mov ax,0a000h
  348.                    mov fs,ax
  349.                    mov ax,cs:SegTexture
  350.                    mov gs,ax
  351.  
  352.                    mov ebp,-100
  353.                    xor di,di          ;point
  354.                    mov cx,200
  355.  
  356. CR_LoopY:          push ecx di
  357.                    mov eax,ebp
  358.                    imul ebp
  359.                    mov esi,eax        ;esi=y^2
  360.  
  361.                    mov cx,256         ;max x
  362.                    mov ebx,-128
  363.  
  364. CR_LoopX:          push ebx ecx
  365.                    mov eax,ebx
  366.                    imul ebx
  367.                    add eax,esi
  368.                    mov ecx,eax
  369.                    call sqrt
  370.                    shr eax,9
  371.                    push ax
  372.                    mov dl,64
  373.                    sub dl,al
  374.  
  375.                    mov al,fs:[di]     ;screen
  376.                    add al,dl
  377.                    add al,128
  378.                    mov bx,cs:TempTexture
  379.                    pop dx
  380.                    add dx,offset cs:LightTable
  381.                    push bx
  382.                    mov bx,dx
  383.                    add al,cs:[bx]
  384.                    pop bx
  385.                    mov gs:[bx],al     ;textura
  386.                    inc word ptr cs:TempTexture
  387.  
  388.                    pop ecx ebx
  389.                    inc di
  390.                    inc ebx
  391.                    loop CR_LoopX
  392.  
  393.                    pop di ecx
  394.                    inc ebp
  395.                    add di,320
  396.                    loop CR_LoopY
  397.  
  398. ;∙──────────────── SetUp ────────────────────────────────────────────────────∙
  399.  
  400.                    mov eax,EventTime
  401.                    mov cs:TimeCheck,eax
  402.                    call PrepareMorphing
  403.  
  404. ;∙──────────────── Flash ────────────────────────────────────────────────────∙
  405.  
  406.                    mov si,offset cs:palette1
  407.                    mov di,offset cs:WhitePal
  408.                    call SetFade
  409.  
  410.                    call GoFade
  411.  
  412.                    call CopyBack
  413.                    call CopyData
  414.                    call Normalize
  415.                    call Perspective
  416.                    call Sort
  417.                    call DrawObject
  418.                    call ShowScreen
  419.  
  420.                    mov si,offset cs:WhitePal
  421.                    mov di,offset cs:palette1
  422.                    call SetFade
  423.  
  424.                    call GoFade
  425.  
  426. ;∙───────────────────────────────────────────────────────────────────────────∙
  427. MainLoop:          mov eax,cs:Timer
  428.                    inc eax
  429.                    mov cs:Timer,eax
  430.  
  431.                    cmp eax,cs:TimeCheck
  432.                    jne NothingNew
  433.  
  434.                    mov eax,cs:TimeCheck
  435.                    add eax,EventTime
  436.                    mov cs:TimeCheck,eax
  437.  
  438.                    mov eax,MaxVectorSteps
  439.                    mov cs:FadeTimer,eax
  440.  
  441. NothingNew:        mov eax,cs:FadeTimer
  442.                    cmp eax,0
  443.                    je NoMorphing
  444.  
  445.                    dec eax
  446.                    mov cs:FadeTimer,eax
  447.  
  448.                    call Morphing
  449.  
  450.                    mov eax,cs:FadeTimer
  451.                    cmp eax,0
  452.                    jne NoMorphing
  453.  
  454.                    call PrepareMorphing
  455.                    mov eax,cs:ObjectCount
  456.                    inc eax
  457.                    mov cs:ObjectCount,eax
  458.  
  459.                    cmp eax,MaxObjects-1
  460.                    je LastObject
  461.  
  462. NoMorphing:        call CopyBack
  463.  
  464.                    call CopyData
  465.                    call Normalize
  466.  
  467.                    call Rotate
  468.                    call Perspective
  469.                    call Sort
  470.  
  471.                    call DrawObject
  472.  
  473.                    call ShowScreen
  474.  
  475.                    in al,60h
  476.                    cmp al,1
  477.                    je ThisIsEnd
  478.                    jmp MainLoop
  479.  
  480. LastObject:        xor eax,eax
  481.  
  482. LastLoop:          push eax
  483.                    call CopyBack
  484.                    call CopyData
  485.                    call Normalize
  486.                    call Rotate
  487.                    call Perspective
  488.                    call Sort
  489.                    call DrawObject
  490.                    call ShowScreen
  491.                    pop eax
  492.                    inc eax
  493.                    cmp eax,EventTime
  494.                    jne LastLoop
  495.  
  496. ;∙──────────────── Flash ────────────────────────────────────────────────────∙
  497.  
  498. ThisIsEnd:         mov si,offset cs:palette1
  499.                    mov di,offset cs:WhitePal
  500.                    call SetFade
  501.  
  502.                    call GoFade
  503.  
  504.                    call CopyBack
  505.                    call ShowScreen
  506.  
  507.                    mov si,offset cs:WhitePal
  508.                    mov di,offset cs:palette1
  509.                    call SetFade
  510.  
  511.                    call GoFade
  512.  
  513. ;∙──────────────── Show Logo ────────────────────────────────────────────────∙
  514.  
  515.                    call ShowLogo
  516.  
  517. ;∙──────────────── Darkness Screen ──────────────────────────────────────────∙
  518.  
  519.                    mov si,offset cs:palette1
  520.                    mov di,offset cs:BlackPal
  521.                    call SetFade
  522.  
  523.                    call GoFade
  524.  
  525. ;∙──────────────── Done Vga Mode ────────────────────────────────────────────∙
  526.  
  527.                    mov ax,0003h
  528.                    int 10h
  529.  
  530. ;∙──────────────── Show Info ────────────────────────────────────────────────∙
  531.  
  532.                    mov dx,offset cs:info
  533.                    push cs
  534.                    pop ds
  535.                    mov ah,09
  536.                    int 21h
  537.  
  538. ;∙──────────────── Exit ─────────────────────────────────────────────────────∙
  539.  
  540. exit:              mov ax,4c01h
  541.                    int 21h
  542.                    ret
  543.  
  544. ;┌───────────────────────────────────────────────────────────────────────────┐
  545. ;│ Draw Object on Screen Temp                                                │
  546. ;└───────────────────────────────────────────────────────────────────────────┘
  547. DrawObject:        mov ax,cs:SegFaces
  548.                    mov gs,ax
  549.                    mov ax,cs:seg2d
  550.                    mov ds,ax
  551.  
  552.                    mov ax,cs:SegNormals
  553.                    mov es,ax
  554.                    mov cx,MaxFaces
  555.                    mov ax,cs:SegSort
  556.                    mov fs,ax
  557.                    xor si,si
  558.  
  559. DrawLoop:          mov ax,fs:[si+2]
  560.                    shl ax,1
  561.                    mov di,ax
  562.                    shl ax,1
  563.                    add di,ax           ;di=face_no*6
  564.  
  565.                    mov bx,gs:[di]
  566.                    shl bx,1
  567.                    mov bp,bx
  568.                    shl bx,1
  569.                    add bp,bx
  570.                    mov ax,ds:[bp]
  571.                    movsx eax,ax
  572.                    mov cs:env_x1,eax
  573.                    mov ax,ds:[bp+2]
  574.                    movsx eax,ax
  575.                    mov cs:env_y1,eax
  576.                    ;N1
  577.                    mov ax,es:[bp]
  578.                    movsx eax,ax
  579.                    mov cs:env_n1x,eax
  580.                    mov ax,es:[bp+2]
  581.                    movsx eax,ax
  582.                    mov cs:env_n1y,eax
  583.  
  584.                    mov bx,gs:[di+2]
  585.                    shl bx,1
  586.                    mov bp,bx
  587.                    shl bx,1
  588.                    add bp,bx
  589.                    mov ax,ds:[bp]
  590.                    movsx eax,ax
  591.                    mov cs:env_x2,eax
  592.                    mov ax,ds:[bp+2]
  593.                    movsx eax,ax
  594.                    mov cs:env_y2,eax
  595.                    ;N2
  596.                    mov ax,es:[bp]
  597.                    movsx eax,ax
  598.                    mov cs:env_n2x,eax
  599.                    mov ax,es:[bp+2]
  600.                    movsx eax,ax
  601.                    mov cs:env_n2y,eax
  602.  
  603.                    mov bx,gs:[di+4]
  604.                    shl bx,1
  605.                    mov bp,bx
  606.                    shl bx,1
  607.                    add bp,bx
  608.                    mov ax,ds:[bp]
  609.                    movsx eax,ax
  610.                    mov cs:env_x3,eax
  611.                    mov ax,ds:[bp+2]
  612.                    movsx eax,ax
  613.                    mov cs:env_y3,eax
  614.                    ;N3
  615.                    mov ax,es:[bp]
  616.                    movsx eax,ax
  617.                    mov cs:env_n3x,eax
  618.                    mov ax,es:[bp+2]
  619.                    movsx eax,ax
  620.                    mov cs:env_n3y,eax
  621.  
  622. ;∙────────────────── Visible Test ───────────────────────────────────────────∙
  623.  
  624.                    mov ebx,cs:env_y2
  625.                    sub ebx,cs:env_y3
  626.                    mov eax,cs:env_x1
  627.                    imul ebx                  ;ax=x1*(y2-y3)
  628.                    mov ebp,eax
  629.  
  630.                    mov ebx,cs:env_y3
  631.                    sub ebx,cs:env_y1
  632.                    mov eax,cs:env_x2
  633.                    imul ebx                  ;ax=x2*(y3-y1)
  634.                    add ebp,eax
  635.  
  636.                    mov ebx,cs:env_y1
  637.                    sub ebx,cs:env_y2
  638.                    mov eax,cs:env_x3
  639.                    imul ebx                  ;ax=x3*(y1-y2)
  640.                    add ebp,eax               ;cx=x1(y2-y3)+x2(y3-y1)+x3(y1-y2)
  641. ;─────────────────────────────────────────────────────────────────────────────
  642.  
  643.                    push si ecx ds fs gs es
  644.                    mov ax,cs:SegScreen
  645.                    mov es,ax
  646.                    mov ax,cs:SegTexture
  647.                    mov ds,ax
  648.                    cmp ebp,0
  649.                    jge NoVisible
  650.                    call enviroment
  651. NoVisible:         pop es gs fs ds ecx si
  652.  
  653.                    add si,4
  654.                    dec ecx
  655.                    cmp ecx,0
  656.                    je DrawStop
  657.                    jmp DrawLoop
  658. DrawStop:          ret
  659.  
  660. ;┌───────────────────────────────────────────────────────────────────────────┐
  661. ;│ Show Temporary Screen                                                     │
  662. ;└───────────────────────────────────────────────────────────────────────────┘
  663. ShowScreen:        call Raster
  664.                    mov ax,cs:SegScreen
  665.                    mov ds,ax
  666.                    mov ax,0a000h
  667.                    mov es,ax
  668.                    xor si,si
  669.                    xor di,di
  670.                    mov ecx,16000
  671.                    rep movsd
  672.  
  673. ;┌───────────────────────────────────────────────────────────────────────────┐
  674. ;│ Copy BackGround to Screen Temp                                            │
  675. ;└───────────────────────────────────────────────────────────────────────────┘
  676. CopyBack:          mov ax,cs:SegBack
  677.                    mov ds,ax
  678.                    mov ax,cs:SegScreen
  679.                    mov es,ax
  680.                    xor si,si
  681.                    xor di,di
  682.                    mov ecx,16000
  683.                    rep movsd
  684.                    ret
  685. ;┌───────────────────────────────────────────────────────────────────────────┐
  686. ;│ Show Logo                                                                 │
  687. ;└───────────────────────────────────────────────────────────────────────────┘
  688. ShowLogo:          mov ax,cs:SegBack
  689.                    mov es,ax
  690.                    mov ax,0a000h
  691.                    mov fs,ax
  692.  
  693.                    xor bx,bx
  694.                    mov cx,40
  695. PutLoop1:          push ecx bx
  696.                    call PutLogo
  697.                    call Raster
  698.                    call Raster
  699.                    call Raster
  700.                    pop bx ecx
  701.                    inc bx
  702.                    loop PutLoop1
  703.  
  704.                    mov cx,200
  705. PutLoopDelay:      push ecx
  706.                    call Raster
  707.                    pop ecx
  708.                    loop PutLoopDelay
  709.  
  710.                    mov cx,40
  711. PutLogo2:          push ecx bx
  712.                    call PutLogo
  713.                    call Raster
  714.                    call Raster
  715.                    call Raster
  716.                    pop bx ecx
  717.                    dec bx
  718.                    loop PutLogo2
  719.                    ret
  720. ;┌───────────────────────────────────────────────────────────────────────────┐
  721. ;│ Put Logo on Screen                                                        │
  722. ;└───────────────────────────────────────────────────────────────────────────┘
  723. ;es-source screen
  724. ;fs-dest screen
  725. PutLogo:           mov si,offset cs:logo
  726.                    mov bp,offset cs:logosize
  727.                    mov cx,56
  728.                    mov di,75*320
  729.  
  730. LineLoop:          push ecx di
  731.                    mov al,cs:[bp]
  732.                    movsx ecx,al
  733.                    inc bp
  734.  
  735. ElementLoop:       push ecx di
  736.  
  737.                    xor eax,eax
  738.                    mov al,cs:[si]
  739.                    add di,ax
  740.                    add di,40
  741.                    inc si
  742.                    mov al,cs:[si]
  743.                    movsx ecx,al
  744.                    inc si
  745.  
  746. PointLoop:         mov al,es:[di]
  747.                    add al,bl
  748.                    mov fs:[di],al
  749.                    inc di
  750.                    loop PointLoop
  751.  
  752.                    pop di ecx
  753.                    loop ElementLoop
  754.  
  755.                    pop di ecx
  756.                    add di,320
  757.                    loop LineLoop
  758.                    ret
  759.  
  760. ;┌───────────────────────────────────────────────────────────────────────────┐
  761. ;│ Prepare Morphing                                                          │
  762. ;└───────────────────────────────────────────────────────────────────────────┘
  763. PrepareMorphing:   mov ax,cs:SegStart
  764.                    mov ds,ax
  765.                    add ax,1024
  766.                    mov es,ax
  767.                    mov ax,cs:SegPointsDD
  768.                    mov fs,ax
  769.                    mov ax,cs:SegPointsAddDD
  770.                    mov gs,ax
  771.                    call CalcVectorFade
  772.  
  773.                    mov ax,cs:SegStart
  774.                    add ax,512
  775.                    mov ds,ax
  776.                    add ax,1024
  777.                    mov es,ax
  778.                    mov ax,cs:SegNormalsDD
  779.                    mov fs,ax
  780.                    mov ax,cs:SegNormalsAddDD
  781.                    mov gs,ax
  782.                    call CalcVectorFade
  783.  
  784.                    mov ax,cs:SegStart
  785.                    add ax,1024
  786.                    mov cs:SegStart,ax
  787.                    ret
  788.  
  789. ;┌───────────────────────────────────────────────────────────────────────────┐
  790. ;│ Morphing (one step)                                                       │
  791. ;└───────────────────────────────────────────────────────────────────────────┘
  792. Morphing:          mov ax,cs:SegPointsDD
  793.                    mov ds,ax
  794.                    mov ax,cs:SegPointsAddDD
  795.                    mov es,ax
  796.                    call VectorFade
  797.  
  798.                    mov ax,cs:SegNormalsDD
  799.                    mov ds,ax
  800.                    mov ax,cs:SegNormalsAddDD
  801.                    mov es,ax
  802.                    call VectorFade
  803.  
  804. ;┌───────────────────────────────────────────────────────────────────────────┐
  805. ;│ Copy Points & Normals from DD bufer to DW tables                          │
  806. ;└───────────────────────────────────────────────────────────────────────────┘
  807. CopyData:          mov ax,cs:SegPointsDD
  808.                    mov ds,ax
  809.                    mov ax,cs:SegPoints
  810.                    mov es,ax
  811.                    call CopyDD2DW
  812.  
  813.                    mov ax,cs:SegNormalsDD
  814.                    mov ds,ax
  815.                    mov ax,cs:SegNormals
  816.                    mov es,ax
  817.                    call CopyDD2DW
  818.                    ret
  819. ;┌───────────────────────────────────────────────────────────────────────────┐
  820. ;│ Copy DD to DW                                                             │
  821. ;└───────────────────────────────────────────────────────────────────────────┘
  822. ;ds-source with dd
  823. ;es-dest with dw
  824. CopyDD2DW:         mov cx,MaxPoints
  825.                    mov ebx,ecx
  826.                    add ecx,ebx
  827.                    add ecx,ebx
  828.  
  829.                    xor si,si
  830.                    xor di,di
  831.  
  832. CopyDD2DWLoop:     mov eax,ds:[si]
  833.                    shr eax,16
  834.                    mov es:[di],ax
  835.  
  836.                    add si,4
  837.                    add di,2
  838.                    loop CopyDD2DWLoop
  839.                    ret
  840. ;┌───────────────────────────────────────────────────────────────────────────┐
  841. ;│ Vector Fade                                                               │
  842. ;└───────────────────────────────────────────────────────────────────────────┘
  843. ;ds-vectors (dd)
  844. ;es-vectors add (dd)
  845. VectorFade:        xor si,si
  846.                    mov cx,MaxPoints
  847.                    mov ebx,ecx
  848.                    add ecx,ebx
  849.                    add ecx,ebx
  850.  
  851. VecFadeLoop:       mov eax,es:[si]
  852.                    add ds:[si],eax
  853.                    add si,4
  854.                    loop VecFadeLoop
  855.                    ret
  856. ;┌───────────────────────────────────────────────────────────────────────────┐
  857. ;│ Calculate Vector Fade from Object to Object                               │
  858. ;└───────────────────────────────────────────────────────────────────────────┘
  859. ;in: ds-start points (dw)
  860. ;    es-end points (dw)
  861. ;
  862. ;out: fs-start points (dd)
  863. ;     gs-step points (dd) (ADD)
  864.  
  865. CalcVectorFade:    mov cx,MaxPoints
  866.                    mov ebx,ecx
  867.                    add ecx,ebx
  868.                    add ecx,ebx                        ;maxpoints*3
  869.                    mov ebp,MaxVectorSteps
  870.                    xor si,si
  871.                    xor di,di
  872. CalcVecStep:       mov ax,ds:[si]
  873.                    movsx eax,ax
  874.                    shl eax,16
  875.                    mov fs:[di],eax
  876.  
  877.                    mov ax,es:[si]
  878.                    movsx eax,ax
  879.                    mov bx,ds:[si]
  880.                    movsx ebx,bx
  881.                    sub eax,ebx
  882.                    shl eax,16
  883.                    cdq
  884.                    idiv ebp
  885.                    mov gs:[di],eax  ;plus
  886.  
  887.                    add si,2
  888.                    add di,4
  889.                    loop CalcVecStep
  890.                    ret
  891.  
  892.  
  893. ;┌───────────────────────────────────────────────────────────────────────────┐
  894. ;│ Normalize len of vector to const                                          │
  895. ;└───────────────────────────────────────────────────────────────────────────┘
  896. ;ebp-len of new vector
  897. Normalize:         mov ebp,99
  898.                    mov ax,cs:SegNormals
  899.                    mov ds,ax
  900.                    mov cx,MaxPoints
  901.                    xor si,si
  902.  
  903. NorLoop:           push ecx
  904.                    mov ax,ds:[si]
  905.                    cwde
  906.                    imul eax
  907.                    mov ecx,eax
  908.                    mov ax,ds:[si+2]
  909.                    cwde
  910.                    imul eax
  911.                    add ecx,eax
  912.                    mov ax,ds:[si+4]
  913.                    cwde
  914.                    imul eax
  915.                    add ecx,eax
  916.                    call Sqrt
  917.                    shr eax,8
  918.                    mov ebx,eax
  919.  
  920.                    mov ax,ds:[si]       ;x
  921.                    cwde
  922.                    imul ebp
  923.                    idiv ebx
  924.                    mov ds:[si],ax
  925.  
  926.                    mov ax,ds:[si+2]     ;y
  927.                    cwde
  928.                    imul ebp
  929.                    idiv ebx
  930.                    mov ds:[si+2],ax
  931.  
  932.                    mov ax,ds:[si+4]     ;z
  933.                    cwde
  934.                    imul ebp
  935.                    idiv ebx
  936.                    mov ds:[si+4],ax
  937.  
  938.                    pop ecx
  939.                    add si,6
  940.                    loop NorLoop
  941.                    ret
  942.  
  943. ;┌───────────────────────────────────────────────────────────────────────────┐
  944. ;│ Create V Normals (to vertexs)                                             │
  945. ;└───────────────────────────────────────────────────────────────────────────┘
  946. CreateNormals:     mov ax,cs:SegFaces
  947.                    mov ds,ax
  948.                    mov ax,cs:SegFacNor
  949.                    mov es,ax
  950.                    mov ax,cs:SegNormals
  951.                    mov fs,ax
  952.  
  953.                    xor bp,bp
  954.  
  955. ;ds-seg to faces [si]
  956. ;es-seg to normals to faces
  957. ;fs-seg to normals to vertexs [bp]
  958.  
  959.                    mov cx,MaxPoints
  960.                    xor edx,edx        ;actual point
  961. VLoop:             push ecx
  962.  
  963.                    xor ax,ax
  964.                    mov cs:NormalX,ax
  965.                    mov cs:NormalY,ax
  966.                    mov cs:NormalZ,ax
  967.  
  968.                    mov cx,MaxFaces
  969.                    xor si,si          ;offset to faces
  970.  
  971. FLoop:             cmp dx,ds:[si]
  972.                    je YesAdd
  973.                    cmp dx,ds:[si+2]
  974.                    je YesAdd
  975.                    cmp dx,ds:[si+4]
  976.                    je YesAdd
  977.                    jmp NoAdd
  978.  
  979. YesAdd:            mov ax,es:[si]
  980.                    add cs:NormalX,ax
  981.                    mov ax,es:[si+2]
  982.                    add cs:NormalY,ax
  983.                    mov ax,es:[si+4]
  984.                    add cs:NormalZ,ax
  985.  
  986. NoAdd:             add si,6
  987.                    loop FLoop
  988.  
  989.                    mov ax,cs:NormalX
  990.                    cwde
  991.                    shr eax,2
  992.                    mov fs:[bp],ax
  993.                    mov ax,cs:NormalY
  994.                    cwde
  995.                    shr eax,2
  996.                    mov fs:[bp+2],ax
  997.                    mov ax,cs:NormalZ
  998.                    cwde
  999.                    shr eax,2
  1000.                    mov fs:[bp+4],ax
  1001.                    add bp,6
  1002.  
  1003.                    pop ecx
  1004.                    inc edx
  1005.                    dec ecx
  1006.                    cmp ecx,0
  1007.                    je CreateEnd
  1008.                    jmp VLoop
  1009. CreateEnd:         ret
  1010.  
  1011. ;┌───────────────────────────────────────────────────────────────────────────┐
  1012. ;│ Create F Normals (to faces)                                               │
  1013. ;└───────────────────────────────────────────────────────────────────────────┘
  1014. CreateFnormals:    mov ax,cs:SegFaces
  1015.                    mov ds,ax
  1016.                    mov ax,cs:SegPoints
  1017.                    mov es,ax
  1018.                    mov ax,cs:SegFacNor
  1019.                    mov fs,ax
  1020.                    mov cx,MaxFaces
  1021.                    xor di,di
  1022.                    xor si,si
  1023.  
  1024. ;ds-seg to faces [si]
  1025. ;es-seg to points
  1026. ;fs-seg to buf normals to faces (di)
  1027.  
  1028. CreateFloop:       push ecx
  1029.                    push di
  1030.  
  1031.                    mov ax,ds:[si]  ;first ver
  1032.                    shl ax,1
  1033.                    mov bx,ax
  1034.                    shl ax,1
  1035.                    add bx,ax       ;bx=off to 1 ver
  1036.  
  1037.                    mov ax,ds:[si+2] ;second ver
  1038.                    shl ax,1
  1039.                    mov bp,ax
  1040.                    shl ax,1
  1041.                    add bp,ax        ;bp=off to 2 ver
  1042.  
  1043.                    mov ax,ds:[si+4]
  1044.                    shl ax,1
  1045.                    mov di,ax
  1046.                    shl ax,1
  1047.                    add di,ax        ;di=off to 3 ver
  1048.  
  1049. ;bx ->1 | bp ->2 | di ->3
  1050.                    mov ax,es:[bp+2] ;y2
  1051.                    sub ax,es:[bx+2] ;y1
  1052.                    cwde
  1053.                    mov dx,es:[di+4] ;z3
  1054.                    sub dx,es:[bx+4] ;z1
  1055.                    movsx edx,dx
  1056.                    imul edx
  1057.                    push eax         ;eax=(y2-y1)*(z3-z1)
  1058.                    mov ax,es:[di+2] ;y3
  1059.                    sub ax,es:[bx+2] ;y1
  1060.                    cwde
  1061.                    mov dx,es:[bp+4] ;z2
  1062.                    sub dx,es:[bx+4] ;z1
  1063.                    movsx edx,dx
  1064.                    imul edx         ;eax=(y3-y1)*(z2-z1)
  1065.                    pop ecx
  1066.                    sub ecx,eax
  1067.                    push ecx         ;(*) (y2-y1)*(z3-z1)-(y3-y1)*(z2-z1) [x]
  1068.  
  1069.                    mov ax,es:[bp]   ;x2
  1070.                    sub ax,es:[bx]   ;x1
  1071.                    cwde
  1072.                    mov dx,es:[di+4] ;z3
  1073.                    sub dx,es:[bx+4] ;z1
  1074.                    movsx edx,dx
  1075.                    imul edx
  1076.                    push eax         ;eax=(x2-x1)*(z3-z1)
  1077.                    mov ax,es:[di]   ;x3
  1078.                    sub ax,es:[bx]   ;x1
  1079.                    cwde
  1080.                    mov dx,es:[bp+4] ;z2
  1081.                    sub dx,es:[bx+4] ;z1
  1082.                    movsx edx,dx
  1083.                    imul edx         ;eax=(x3-x1)*(z2-z1)
  1084.                    pop ecx
  1085.                    sub ecx,eax
  1086.                    push ecx         ;(*) (x2-x1)*(z3-z1)-(x3-x1)*(z2-z1) [y]
  1087.  
  1088.                    mov ax,es:[bp+2] ;y2
  1089.                    sub ax,es:[bx+2] ;y1
  1090.                    cwde
  1091.                    mov dx,es:[di]   ;x3
  1092.                    sub dx,es:[bx]   ;x1
  1093.                    movsx edx,dx
  1094.                    imul edx
  1095.                    push eax         ;eax=(y2-y1)*(x3-x1)
  1096.                    mov ax,es:[di+2] ;y3
  1097.                    sub ax,es:[bx+2] ;y1
  1098.                    cwde
  1099.                    mov dx,es:[bp]   ;x2
  1100.                    sub dx,es:[bx]   ;x1
  1101.                    movsx edx,dx
  1102.                    imul edx         ;eax=(y3-y1)*(x2-x1)
  1103.                    pop ecx
  1104.                    sub ecx,eax      ;(*) (y2-y1)*(x3-x1)-(y3-y1)*(x2-x1) [z]
  1105.  
  1106.                    ;eax-x
  1107.                    ;ebx-y
  1108.                    ;ecx-z
  1109.  
  1110.                    pop ebx
  1111.                    pop eax
  1112.  
  1113.                    pop di
  1114.                    mov fs:[di],ax
  1115.                    mov fs:[di+2],bx
  1116.                    mov fs:[di+4],cx
  1117.  
  1118.                    pop ecx
  1119.                    add di,6
  1120.                    add si,6
  1121.                    dec ecx
  1122.                    cmp ecx,0
  1123.                    je CreateFend
  1124.                    jmp CreateFloop
  1125. CreateFend:        ret
  1126. ;┌───────────────────────────────────────────────────────────────────────────┐
  1127. ;│ Sorting                                                                   │
  1128. ;└───────────────────────────────────────────────────────────────────────────┘
  1129. ;sorting points in SegPoints
  1130. sort:              mov ax,cs:SegPoints
  1131.                    mov ds,ax
  1132.                    mov cx,MaxFaces
  1133.                    xor bx,bx
  1134.                    xor di,di
  1135.                    xor si,si
  1136.                    mov ax,cs:SegSort
  1137.                    mov fs,ax
  1138.                    mov ax,cs:SegFaces
  1139.                    mov es,ax
  1140.  
  1141. CalcSumLoop:       mov fs:[di+2],bx
  1142.                    push bx
  1143.  
  1144.                    mov ax,es:[si]   ;first vertex
  1145.                    shl ax,1
  1146.                    mov bx,ax
  1147.                    shl ax,1
  1148.                    add bx,ax
  1149.                    mov dx,ds:[bx+4]   ;z1
  1150.  
  1151.                    mov ax,es:[si+2]   ;second vertex
  1152.                    shl ax,1
  1153.                    mov bx,ax
  1154.                    shl ax,1
  1155.                    add bx,ax
  1156.                    add dx,ds:[bx+4]  ;z2
  1157.  
  1158.                    mov ax,es:[si+4]   ;third vertex
  1159.                    shl ax,1
  1160.                    mov bx,ax
  1161.                    shl ax,1
  1162.                    add bx,ax
  1163.                    add dx,ds:[bx+4]   ;z3
  1164.  
  1165.                    add dx,1500
  1166.                    mov fs:[di],dx
  1167.  
  1168.                    add di,4
  1169.                    add si,6
  1170.                    pop bx
  1171.                    inc bx
  1172.                    loop CalcSumLoop
  1173.  
  1174. ;now it's really (fucking bubble) sorting ....
  1175.  
  1176. SortMore:          xor si,si
  1177.                    mov cx,MaxFaces
  1178.                    dec ecx
  1179.                    xor bp,bp
  1180.  
  1181. SortLoop:          mov ax,fs:[si]    ;sum1
  1182.                    cmp ax,fs:[si+4]  ;sum2
  1183.                    jbe SortNoSwap
  1184.  
  1185.                    mov eax,fs:[si]
  1186.                    mov ebx,fs:[si+4]
  1187.                    mov fs:[si],ebx
  1188.                    mov fs:[si+4],eax
  1189.                    mov bp,1
  1190.  
  1191. SortNoSwap:        add si,4
  1192.                    loop SortLoop
  1193.  
  1194.                    cmp bp,1
  1195.                    je SortMore
  1196.                    ret
  1197.  
  1198. ;┌───────────────────────────────────────────────────────────────────────────┐
  1199. ;│ Enviroment Mapping                                                        │
  1200. ;└───────────────────────────────────────────────────────────────────────────┘
  1201. ;ds-segment with texture
  1202. ;es-screen segment
  1203. Enviroment:        push ds es
  1204.  
  1205.                    mov eax,cs:env_y1
  1206.                    mov ebx,cs:env_y2
  1207.                    mov ecx,cs:env_y3
  1208.  
  1209.                    mov edx,eax
  1210.                    cmp edx,ebx
  1211.                    jl EnvMin1
  1212.                    mov edx,ebx
  1213. EnvMin1:           cmp edx,ecx
  1214.                    jl EnvMin2
  1215.                    mov edx,ecx
  1216. EnvMin2:           mov cs:Env_MinY,edx
  1217.                    mov edi,edx
  1218.                    mov ebp,edx
  1219.  
  1220.                    mov edx,eax
  1221.                    cmp edx,ebx
  1222.                    jg EnvMax1
  1223.                    mov edx,ebx
  1224. EnvMax1:           cmp edx,ecx
  1225.                    jg EnvMax2
  1226.                    mov edx,ecx
  1227. EnvMax2:           mov cs:Env_MaxY,edx
  1228.  
  1229.                    ;fill scan
  1230.                    push cs
  1231.                    pop es
  1232.                    shl edi,2
  1233.                    add di,offset cs:envScanStart
  1234.                    mov eax,16000
  1235.                    sub edx,ebp
  1236.                    mov ecx,edx
  1237.                    inc ecx
  1238.                    rep stosd
  1239.  
  1240.                    pop es ds
  1241.  
  1242.                    ;scan
  1243.                    mov si,offset cs:env_x1 ;(1)
  1244.                    mov di,offset cs:env_x2 ;(2)
  1245.                    call EnvScanLine
  1246.                    mov si,offset cs:env_x2 ;(2)
  1247.                    mov di,offset cs:env_x3 ;(3)
  1248.                    call EnvScanLine
  1249.                    mov si,offset cs:env_x3 ;(3)
  1250.                    mov di,offset cs:env_x1 ;(1)
  1251.                    call EnvScanLine
  1252.  
  1253.                    mov esi,cs:env_MinY
  1254.                    mov edx,esi
  1255.                    shl esi,2
  1256.                    add si,offset cs:envScanStart
  1257.                    mov ecx,cs:env_maxY
  1258.                    sub ecx,cs:env_minY
  1259.                    inc ecx
  1260.                    shl edx,6
  1261.                    mov edi,edx
  1262.                    shl edx,2
  1263.                    add edi,edx    ;di-off on scren
  1264.  
  1265. EnvMainLoop:       push esi edi ecx
  1266.                    call DrawLineEnv
  1267.                    pop ecx edi esi
  1268.                    add edi,320
  1269.                    add esi,4
  1270.                    loop EnvMainLoop
  1271.  
  1272.                    ret
  1273.  
  1274. DrawLineEnv:       mov eax,cs:[si]
  1275.                    mov ebx,cs:[si+800]
  1276.                    shr eax,16
  1277.                    shr ebx,16
  1278.                    mov cs:[si],eax
  1279.                    mov cs:[si+800],ebx
  1280.  
  1281.                    cmp eax,ebx
  1282.                    jb EnvLineOk
  1283.  
  1284.                    xchg eax,ebx
  1285.                    mov cs:[si],eax
  1286.                    mov cs:[si+800],ebx
  1287.  
  1288.                    mov edx,cs:[si+1600]
  1289.                    mov ebp,cs:[si+3200]
  1290.                    mov cs:[si+1600],ebp
  1291.                    mov cs:[si+3200],edx
  1292.                    mov edx,cs:[si+2400]
  1293.                    mov ebp,cs:[si+4000]
  1294.                    mov cs:[si+2400],ebp
  1295.                    mov cs:[si+4000],edx
  1296.  
  1297. EnvLineOK:         ;eax-x1
  1298.                    ;ebx-x2
  1299.  
  1300.                    add edi,eax
  1301.                    sub ebx,eax
  1302.                    cmp ebx,0
  1303.                    jne EnvLineAre
  1304.                    ret
  1305.  
  1306. EnvLineAre:        push edi
  1307.  
  1308.                    mov eax,cs:[si+3200]
  1309.                    sub eax,cs:[si+1600]
  1310.                    cdq
  1311.                    idiv ebx
  1312.                    mov cs:EnvNXinc,eax    ;store NXinc
  1313.  
  1314.                    mov eax,cs:[si+4000]
  1315.                    sub eax,cs:[si+2400]
  1316.                    cdq
  1317.                    idiv ebx
  1318.                    mov cs:EnvNYinc,eax    ;store NYinc
  1319.  
  1320.                    mov ecx,ebx            ;how pixels
  1321.  
  1322.                    mov ebx,cs:[si+1600]
  1323.                    mov edx,cs:[si+2400]
  1324.  
  1325.                    mov eax,128            ;x center
  1326.                    shl eax,16
  1327.                    add ebx,eax
  1328.  
  1329.                    mov eax,100            ;y center
  1330.                    shl eax,16
  1331.                    add edx,eax
  1332.  
  1333.                    mov ebp,cs:EnvNXinc
  1334.                    mov esi,cs:EnvNYinc
  1335.  
  1336.                    pop edi
  1337.  
  1338. EnvLineLoop:       add ebx,ebp
  1339.                    add edx,esi
  1340.  
  1341.                    push ebx edx
  1342.  
  1343.                    shr ebx,16
  1344.                    shr edx,16
  1345.  
  1346.                    mov bh,dl
  1347.  
  1348.                    mov al,ds:[bx]
  1349.                    mov es:[di],al
  1350.                    inc di
  1351.  
  1352.                    pop edx ebx
  1353.                    loop EnvLineLoop
  1354.                    ret
  1355.  
  1356. EnvScanLine:       mov ebx,cs:[di+4]   ;y2
  1357.                    cmp ebx,cs:[si+4]   ;y1
  1358.                    jge EdgeOk
  1359.  
  1360.                    xchg si,di
  1361.  
  1362. EdgeOk:            mov ebx,cs:[di+4]
  1363.                    sub ebx,cs:[si+4]   ;ebx=ylen
  1364.  
  1365.                    jnz EdgeAre
  1366.                    ret
  1367.  
  1368. EdgeAre:           mov eax,cs:[di]     ;x2
  1369.                    sub eax,cs:[si]     ;x1
  1370.                    shl eax,16
  1371.                    cdq
  1372.                    idiv ebx
  1373.                    mov cs:EnvXinc,eax  ;xinc
  1374.  
  1375.                    mov eax,cs:[di+8]   ;n2x
  1376.                    sub eax,cs:[si+8]   ;n1x
  1377.                    shl eax,16
  1378.                    cdq
  1379.                    idiv ebx
  1380.                    mov cs:EnvNXinc,eax
  1381.  
  1382.                    mov eax,cs:[di+12]  ;n2y
  1383.                    sub eax,cs:[si+12]  ;n1y
  1384.                    shl eax,16
  1385.                    cdq
  1386.                    idiv ebx
  1387.                    mov cs:EnvNYinc,eax
  1388.  
  1389.                    mov ecx,ebx         ;ecx-max points
  1390.                    mov bx,si
  1391.  
  1392.                    mov ebp,cs:[bx]     ;x1
  1393.                    shl ebp,16
  1394.                    mov esi,cs:[bx+8]   ;n1x
  1395.                    shl esi,16
  1396.                    mov edx,cs:[bx+12]  ;n1y
  1397.                    shl edx,16
  1398.  
  1399.                    mov edi,cs:[bx+4]
  1400.                    shl edi,2
  1401.                    add di,offset cs:envScanStart
  1402.  
  1403. EdgeLoop:          add ebp,cs:EnvXinc
  1404.                    add esi,cs:EnvNXinc
  1405.                    add edx,cs:EnvNYinc
  1406.  
  1407.                    mov eax,cs:[di]
  1408.                    cmp eax,16000
  1409.                    jne EdgeRight
  1410.  
  1411. EdgeLeft:          mov cs:[di],ebp
  1412.                    mov cs:[di+1600],esi
  1413.                    mov cs:[di+2400],edx
  1414.                    jmp EdgeEnd
  1415.  
  1416. EdgeRight:         mov cs:[di+800],ebp
  1417.                    mov cs:[di+3200],esi
  1418.                    mov cs:[di+4000],edx
  1419.  
  1420. EdgeEnd:           add di,4
  1421.                    loop EdgeLoop
  1422.                    ret
  1423.  
  1424. ;┌───────────────────────────────────────────────────────────────────────────┐
  1425. ;│ Fade                                                                      │
  1426. ;└───────────────────────────────────────────────────────────────────────────┘
  1427. GoFade:            mov ecx,BlendTime
  1428. GoFadeLoop:        push ecx
  1429.                    call Fade
  1430.                    pop ecx
  1431.                    loop GoFadeLoop
  1432.                    ret
  1433.  
  1434. ;┌───────────────────────────────────────────────────────────────────────────┐
  1435. ;│ Fade Palette (STEP)                                                       │
  1436. ;└───────────────────────────────────────────────────────────────────────────┘
  1437. fade:              mov cx,256
  1438.                    mov si,offset FadeBuffer
  1439.                    mov di,offset FadePalette
  1440.                    push di
  1441.                    push si
  1442. StoreFade:         mov eax,cs:[si]
  1443.                    mov ebx,cs:[si+4]
  1444.                    mov edx,cs:[si+8]
  1445.                    shr eax,16
  1446.                    shr ebx,16
  1447.                    shr edx,16
  1448.                    mov cs:[di],al
  1449.                    inc di
  1450.                    mov cs:[di],bl
  1451.                    inc di
  1452.                    mov cs:[di],dl
  1453.                    inc di
  1454.                    add si,24
  1455.                    loop StoreFade
  1456.  
  1457.                    mov cx,256
  1458.                    pop si
  1459. FadeAdd:           mov eax,cs:[si+12] ;red add
  1460.                    mov ebx,cs:[si+16] ;green add
  1461.                    mov edx,cs:[si+20] ;blue add
  1462.                    add cs:[si],eax
  1463.                    add cs:[si+4],ebx
  1464.                    add cs:[si+8],edx
  1465.  
  1466.                    add si,24
  1467.                    loop FadeAdd
  1468.  
  1469.                    pop si
  1470.                    call SetPalette
  1471.                    ret
  1472.  
  1473. ;┌───────────────────────────────────────────────────────────────────────────┐
  1474. ;│ Fade Palette (SETUP)                                                      │
  1475. ;└───────────────────────────────────────────────────────────────────────────┘
  1476. ;cs:si-offset to source palette
  1477. ;cs:di-offset to destation palette
  1478. ;ebp-how max blend's
  1479.  
  1480. SetFade:           mov ebp,BlendTime
  1481.                    mov cs:MaxFade,ebp
  1482.                    mov ax,cs
  1483.                    mov ds,ax
  1484.                    mov es,ax
  1485.                    mov ax,offset FadeBuffer
  1486.                    mov cs:FadeOffset,ax
  1487.  
  1488.                    mov cx,256
  1489.  
  1490. FadeLoop:          push ecx
  1491.  
  1492.                    mov al,cs:[si]
  1493.                    inc si
  1494.                    mov ah,cs:[si]
  1495.                    inc si
  1496.                    mov bl,cs:[si]
  1497.                    inc si
  1498.                    mov bh,cs:[di]
  1499.                    inc di
  1500.                    mov cl,cs:[di]
  1501.                    inc di
  1502.                    mov ch,cs:[di]
  1503.                    inc di
  1504.  
  1505.                    push si di
  1506.  
  1507.                    mov ebp,cs:MaxFade
  1508.                    call CalcColor
  1509.  
  1510.                    mov si,offset cs:RedStart
  1511.                    mov di,cs:FadeOffset
  1512.                    mov cx,24 ;4*6
  1513.                    cld
  1514.                    rep movsb
  1515.                    add cs:FadeOffset,24
  1516.  
  1517.                    pop di si
  1518.  
  1519.                    pop ecx
  1520.                    loop FadeLoop
  1521.                    ret
  1522.  
  1523. ;┌───────────────────────────────────────────────────────────────────────────┐
  1524. ;│ Create Palette                                                            │
  1525. ;└───────────────────────────────────────────────────────────────────────────┘
  1526. ;al,ah,bl- first color (r,g,b)
  1527. ;bh,cl,ch- last color (r,g,b)
  1528. ;ebp-length
  1529. ;cs:di- adress of palette
  1530. CreatePalette:     push ebp
  1531.                    push di
  1532.  
  1533.                    call CalcColor
  1534.  
  1535.                    mov eax,cs:RedStart
  1536.                    mov ebx,cs:GreenStart
  1537.                    mov edx,cs:BlueStart
  1538.  
  1539.                    pop di
  1540.                    pop ecx
  1541. CreatePalLoop:     push eax ebx edx
  1542.                    shr eax,16
  1543.                    shr ebx,16
  1544.                    shr edx,16
  1545.                    mov cs:[di],al
  1546.                    inc di
  1547.                    mov cs:[di],bl
  1548.                    inc di
  1549.                    mov cs:[di],dl
  1550.                    inc di
  1551.                    pop edx ebx eax
  1552.                    add eax,cs:RedAdd
  1553.                    add ebx,cs:GreenAdd
  1554.                    add edx,cs:BlueAdd
  1555.                    loop CreatePalLoop
  1556.                    ret
  1557.  
  1558. ;┌───────────────────────────────────────────────────────────────────────────┐
  1559. ;│ Calculate Start and Step Color                                            │
  1560. ;└───────────────────────────────────────────────────────────────────────────┘
  1561. ;al,ah,bl- first color (r,g,b)
  1562. ;bh,cl,ch- last color (r,g,b)
  1563. ;ebp-length
  1564.  
  1565. ;out: (cs) RedStart,RedAdd
  1566. ;          BlueStart,BlueAdd
  1567. ;          GreenStart,GreenAdd
  1568.  
  1569. CalcColor:         mov di,bx
  1570.                    mov si,ax
  1571.                    movzx eax,al
  1572.                    shl eax,16
  1573.                    mov cs:RedStart,eax
  1574.                    movzx ebx,bh
  1575.                    shl ebx,16
  1576.                    sub ebx,eax
  1577.                    mov eax,ebx
  1578.                    cdq
  1579.                    idiv ebp
  1580.                    mov cs:RedAdd,eax
  1581.  
  1582.                    mov ax,si
  1583.                    movzx eax,ah
  1584.                    shl eax,16
  1585.                    mov cs:GreenStart,eax
  1586.                    movzx ebx,cl
  1587.                    shl ebx,16
  1588.                    sub ebx,eax
  1589.                    mov eax,ebx
  1590.                    cdq
  1591.                    idiv ebp
  1592.                    mov cs:GreenAdd,eax
  1593.  
  1594.                    mov bx,di
  1595.                    movzx eax,bl
  1596.                    shl eax,16
  1597.                    mov cs:BlueStart,eax
  1598.                    movzx ebx,ch
  1599.                    shl ebx,16
  1600.                    sub ebx,eax
  1601.                    mov eax,ebx
  1602.                    cdq
  1603.                    idiv ebp
  1604.                    mov cs:BlueAdd,eax
  1605.                    ret
  1606.  
  1607. ;┌───────────────────────────────────────────────────────────────────────────┐
  1608. ;│ Create and Scroll Texture                                                 │
  1609. ;└───────────────────────────────────────────────────────────────────────────┘
  1610. writetexture:      push ds
  1611.  
  1612.                    push fs
  1613.                    push fs
  1614.                    pop es
  1615.                    pop ds
  1616.                    call raster
  1617.  
  1618.                    sub di,di
  1619.                    mov si,280h                ;second line
  1620.                    mov ecx,7e40h
  1621.                    shr ecx,1
  1622.                    rep movsd                  ;up screen
  1623.  
  1624.                    pop ds
  1625.                    mov di,0fc80h
  1626.                    mov si,280h
  1627.  
  1628. mutation:          push cs
  1629.                    pop ds
  1630.                    mov ax,TextureStart
  1631.                    mov cx,TextureRotate
  1632.                    add ax,cx
  1633.                    rol ax,cl
  1634.                    add cx,5678h
  1635.                    ror cx,1
  1636.                    mov TextureStart,ax
  1637.                    mov TextureRotate,cx
  1638.                    add ax,TextureRotate
  1639.                    dec word ptr ds:TextureRotate
  1640.  
  1641.                    sar ax,0ch
  1642.                    inc ax
  1643.                    sub dx,dx
  1644.                    sub bx,bx
  1645.                    mov dl,es:[0fec0h][di]
  1646.                    mov bl,es:[0fec1h][di]
  1647.                    add bx,dx
  1648.                    sar bx,1
  1649.                    add ax,bx
  1650.                    stosb
  1651.                    dec si
  1652.                    jnz mutation
  1653.                    ret
  1654.  
  1655. ;┌───────────────────────────────────────────────────────────────────────────┐
  1656. ;│ Rotate                                                                    │
  1657. ;└───────────────────────────────────────────────────────────────────────────┘
  1658. ;rotate a points in SegPoints
  1659. Rotate:            mov bx,cs:AngleX
  1660.                    add bx,AngleStepX
  1661.                    cmp bx,360
  1662.                    jb NoOverX
  1663.                    sub bx,360
  1664. NoOverX:           mov cs:AngleX,bx
  1665.  
  1666.                    mov bx,cs:AngleZ
  1667.                    add bx,AngleStepZ
  1668.                    cmp bx,360
  1669.                    jb NoOverZ
  1670.                    sub bx,360
  1671. NoOverZ:           mov cs:AngleZ,bx
  1672.  
  1673.                    mov ax,cs:SegPoints
  1674.                    mov ds,ax
  1675.                    xor bp,bp
  1676.                    mov cx,MaxPoints
  1677. RotateLoop1:       push ecx
  1678.                    call RotateElement
  1679.                    pop ecx
  1680.                    add bp,6
  1681.                    loop RotateLoop1
  1682.  
  1683.                    ;now rotate normals
  1684.                    mov ax,cs:AngleX
  1685.                    push ax
  1686.                    mov bx,360
  1687.                    sub bx,ax
  1688.                    mov cs:AngleX,bx
  1689.  
  1690.                    mov ax,cs:AngleZ
  1691.                    push ax
  1692.                    mov bx,360
  1693.                    sub bx,ax
  1694.                    mov cs:AngleZ,bx
  1695.  
  1696.                    mov ax,cs:SegNormals
  1697.                    mov ds,ax
  1698.                    xor bp,bp
  1699.                    mov cx,MaxPoints
  1700. RotateLoop2:       push ecx
  1701.                    call RotateElement
  1702.                    pop ecx
  1703.                    add bp,6
  1704.                    loop RotateLoop2
  1705.  
  1706.                    pop ax
  1707.                    mov cs:AngleX,ax
  1708.                    pop ax
  1709.                    mov cs:AngleZ,ax
  1710.  
  1711.                    ret
  1712.  
  1713. ;┌───────────────────────────────────────────────────────────────────────────┐
  1714. ;│ Rotate                                                                    │
  1715. ;└───────────────────────────────────────────────────────────────────────────┘
  1716. ;Rotate a point in ds:[bp] about x and z axis
  1717.  
  1718. ;∙──────────────── Rotate About X Axis ──────────────────────────────────────∙
  1719.  
  1720. RotateElement:     mov bx,cs:AngleX
  1721.                    call getsin           ;esi=sin(@x)
  1722.                    mov esi,eax
  1723.                    call getcos           ;edi=cos(@x)
  1724.                    mov edi,eax
  1725.  
  1726.                    mov ax,ds:[bp+2]
  1727.                    cwde                  ;eax=y
  1728.                    push eax
  1729.                    imul edi
  1730.                    mov ecx,eax           ;ecx=y*cos(@x)
  1731.                    pop eax
  1732.                    imul esi
  1733.                    mov ebx,eax           ;ebx=y*sin(@x)
  1734.                    mov ax,ds:[bp+4]
  1735.                    cwde                  ;eax=z
  1736.                    push eax
  1737.                    imul esi              ;eax=z*sin(@x)
  1738.                    sub ecx,eax           ;ecx=y*cos(@x)-z*sin(@x)
  1739.                    pop eax
  1740.                    imul edi              ;eax=z*cos(@x)
  1741.                    add ebx,eax           ;ebx=y*sin(@x)+z*cos(@x)
  1742.                    shr ebx,16
  1743.                    shr ecx,16
  1744.                    mov ds:[bp+4],bx      ;save z
  1745.                    mov ds:[bp+2],cx      ;save y
  1746.  
  1747. ;∙──────────────── Rotate About Z Axis ──────────────────────────────────────∙
  1748.  
  1749.                    mov bx,cs:AngleZ
  1750.                    call getsin           ;esi=sin(@z)
  1751.                    mov esi,eax
  1752.                    call getcos           ;edi=cos(@z)
  1753.                    mov edi,eax
  1754.  
  1755.                    mov ax,ds:[bp]        ;eax=x
  1756.                    cwde
  1757.                    push eax
  1758.                    imul edi
  1759.                    mov ecx,eax           ;ecx=x*cos(@z)
  1760.                    pop eax
  1761.                    imul esi
  1762.                    mov ebx,eax           ;ebx=x*sin(@z)
  1763.                    mov ax,ds:[bp+2]      ;eax=y
  1764.                    cwde
  1765.                    push eax
  1766.                    imul esi              ;edx=y*sin(@z)
  1767.                    sub ecx,eax           ;ecx=x*cos(@z)-y*sin(@z)
  1768.                    pop eax
  1769.                    imul edi              ;edx=y*cos(@z)
  1770.                    add ebx,eax           ;ebx=x*sin(@z)+y*cos(@z)
  1771.                    shr ebx,16
  1772.                    shr ecx,16
  1773.                    mov ds:[bp+2],bx
  1774.                    mov ds:[bp],cx
  1775.                    ret
  1776.  
  1777. ;┌───────────────────────────────────────────────────────────────────────────┐
  1778. ;│ Perspective                                                               │
  1779. ;└───────────────────────────────────────────────────────────────────────────┘
  1780. ;perspective 3d point in SegPoints to 2d points in Seg2d
  1781. Perspective:       mov ax,cs:SegPoints
  1782.                    mov ds,ax
  1783.                    mov ax,cs:Seg2d
  1784.                    mov es,ax
  1785.                    xor si,si
  1786.                    xor di,di
  1787.                    mov cx,MaxPoints
  1788.  
  1789. PerspLoop:         mov eax,EyeDist
  1790.                    mov ebx,eax
  1791.  
  1792.                    mov dx,ds:[si+4]
  1793.                    movsx edx,dx
  1794.                    add ebx,edx
  1795.                    xchg eax,ebx
  1796.                    shl eax,16
  1797.                    cdq
  1798.                    idiv ebx
  1799.                    mov ebp,eax          ;ebp=d/(z+d)
  1800.  
  1801.                    mov ax,ds:[si]
  1802.                    cwde
  1803.                    imul ebp
  1804.                    shr eax,16
  1805.                    add ax,CenterX
  1806.                    mov es:[di],ax       ;x
  1807.  
  1808.                    mov ax,ds:[si+2]
  1809.                    cwde
  1810.                    imul ebp
  1811.                    shr eax,16
  1812.                    add ax,CenterY
  1813.                    mov es:[di+2],ax     ;y
  1814.  
  1815.                    add si,6
  1816.                    add di,6
  1817.                    loop PerspLoop
  1818.                    ret
  1819.  
  1820. ;┌───────────────────────────────────────────────────────────────────────────┐
  1821. ;│ Create Vertex's                                                           │
  1822. ;└───────────────────────────────────────────────────────────────────────────┘
  1823. ;cs:si-offset to rotobj data (db r,y)
  1824. ;es:di-offset to vertex's table (dw x,y,z)
  1825.  
  1826. CreateVertexs:     mov cx,MaxLevels   ;e (@)
  1827.                    inc cx             ;e
  1828.  
  1829. CreateVerYLoop:    push cx
  1830.                    mov dl,cs:[si]
  1831.                    movsx edx,dl
  1832.                    mov ebp,edx   ;ebp=R
  1833.  
  1834.                    mov cx,MaxRots
  1835.                    xor bx,bx
  1836. CreateVerRLoop:    mov al,cs:[si+1]
  1837.                    cbw
  1838.                    mov es:[di+2],ax
  1839.                    call getsin
  1840.                    imul ebp
  1841.                    shr eax,16
  1842.                    mov es:[di],ax     ;x
  1843.                    call getcos
  1844.                    imul ebp
  1845.                    shr eax,16
  1846.                    mov es:[di+4],ax   ;z
  1847.                    add bx,RotsAdd
  1848.                    add di,6
  1849.                    loop CreateVerRLoop
  1850.  
  1851.                    add si,2
  1852.                    pop cx
  1853.                    loop CreateVerYLoop
  1854.                    ret
  1855.  
  1856. ;┌───────────────────────────────────────────────────────────────────────────┐
  1857. ;│ Wait for Sync                                                             │
  1858. ;└───────────────────────────────────────────────────────────────────────────┘
  1859. raster:            mov  dx,3dah
  1860. waitnotvsyncloop:  in   al,dx
  1861.                    and  al,8
  1862.                    jnz  WaitNotVSyncLoop
  1863. waitvsyncloop:     in   al,dx
  1864.                    and  al,8
  1865.                    jz   WaitVSyncLoop
  1866.                    ret
  1867.  
  1868. ;┌───────────────────────────────────────────────────────────────────────────┐
  1869. ;│ Set Palette                                                               │
  1870. ;└───────────────────────────────────────────────────────────────────────────┘
  1871. ;cs:si-first color
  1872. setpalette:        mov cx,256
  1873.                    xor ax,ax
  1874.                    mov dx,3c8h
  1875.                    out dx,al
  1876.  
  1877.                    call raster
  1878.  
  1879.                    mov dx,3c9h
  1880. storecolors:       mov al,cs:[si]   ;red
  1881.                    out dx,al
  1882.                    mov al,cs:[si+1] ;green
  1883.                    out dx,al
  1884.                    mov al,cs:[si+2] ;blue
  1885.                    out dx,al
  1886.                    add si,3
  1887.                    loop storecolors
  1888.                    ret
  1889.  
  1890. ;┌───────────────────────────────────────────────────────────────────────────┐
  1891. ;│ Sinus and Cosinus                                                         │
  1892. ;└───────────────────────────────────────────────────────────────────────────┘
  1893. getsin:            push bx
  1894.                    shl bx,2
  1895.                    add bx,offset cs:trg
  1896.                    mov eax,cs:[bx]
  1897.                    pop bx
  1898.                    ret
  1899.  
  1900. getcos:            push bx
  1901.                    add bx,90
  1902.                    shl bx,2
  1903.                    add bx,offset trg
  1904.                    mov eax,cs:[bx]
  1905.                    pop bx
  1906.                    ret
  1907.  
  1908. ;┌───────────────────────────────────────────────────────────────────────────┐
  1909. ;│ Sqrt (by F.Becker)                                                        │
  1910. ;└───────────────────────────────────────────────────────────────────────────┘
  1911. ;     in: ecx
  1912. ;    out: eax (low 8bit - precision)
  1913. ; modify: ebx,ecx,edx
  1914.  
  1915. sqrt:              xor eax,eax
  1916.                    mov ebx,40000000h
  1917. sqrtLP1:           mov edx,ecx         ;edx = val
  1918.                    sub edx,ebx         ;val - bitsqr
  1919.                    jl sqrtLP2
  1920.                    sub edx,eax         ;val - root
  1921.                    jl sqrtLP2
  1922.                    mov ecx,edx         ;val >= (root+bitsqr) -> accept subs
  1923.                    shr eax,1           ;root >> 1
  1924.                    or eax,ebx          ;root | bitsqr
  1925.                    shr ebx,2           ;bitsqr>>2
  1926.                    jnz sqrtLP1
  1927.                    shl eax,8
  1928.                    ret
  1929.  
  1930. sqrtLP2:           shr eax,1           ;val < (root+bitsqr) -> dont change val
  1931.                    shr ebx,2           ;bitsqr>>2
  1932.                    jnz sqrtLP1
  1933.                    shl eax,8
  1934.                    ret
  1935.  
  1936. ;┌───────────────────────────────────────────────────────────────────────────┐
  1937. ;│ 3d Objects                                                                │
  1938. ;└───────────────────────────────────────────────────────────────────────────┘
  1939.  
  1940. FirstObject:      include bowl.3d
  1941.                   include drop.3d
  1942.                   include torus.3d
  1943.                   include hantle.3d
  1944.                   include glass.3d
  1945.                   include bottle.3d
  1946.  
  1947. ;┌───────────────────────────────────────────────────────────────────────────┐
  1948. ;│ Datas in Code Segment                                                     │
  1949. ;└───────────────────────────────────────────────────────────────────────────┘
  1950. symbol:            db 'OZIR/HPZ'
  1951.  
  1952. info:              db 'This 4Kb Intro called CRY coded OZIR / HYPNOTIZE$',0
  1953.  
  1954. sinus:             include sinus.db               ;compress sinus data
  1955.  
  1956. logo:              include logo.db                ;logo data
  1957. logosize:          include logosize.db            ;logo lines count
  1958.  
  1959. LightTable:        db 5,5,5,5,5,4,4,3,1           ;additional light
  1960.                    db 200 dup (0)
  1961.  
  1962. trg:               dd 540+2 dup (0)               ;unpacked sin and cos
  1963. SegPoints          dw 0                           ;seg to actual points
  1964. SegTexture         dw 0                           ;seg to texture
  1965. SegFaces           dw 0                           ;seg to faces
  1966. SegSort            dw 0                           ;seg to sort buffer
  1967. Seg2d              dw 0                           ;seg to points 2d (x,y)
  1968. SegFacNor          dw 0                           ;seg to normals to faces
  1969. SegNormals         dw 0                           ;seg to normals to vertexs
  1970. SegScreen          dw 0                           ;seg to temp screen
  1971. SegBack            dw 0                           ;seg with background
  1972. SegPointsDD        dw 0                           ;seg to points DD (morf)
  1973. SegNormalsDD       dw 0                           ;seg to points add DD (m)
  1974. SegPointsAddDD     dw 0                           ;seg to normals DD (morf)
  1975. SegNormalsAddDD    dw 0                           ;seg to normals add DD (m)
  1976. SegStart           dw 0                           ;seg objects start
  1977. AngleX             dw 0                           ;actual x angle
  1978. AngleZ             dw 0                           ;actual z angle
  1979. TempTexture        dw 0                           ;temporary texture
  1980.  
  1981. Timer              dd 0                           ;timer
  1982. FadeTimer          dd 0                           ;timer for blend
  1983. TimeCheck          dd 0                           ;time point
  1984. ObjectCount        dd 0                           ;objects count
  1985.  
  1986. TextureStart       dw 0                           ;texture first
  1987. TextureIntensiv    dw 0                           ;texture add
  1988. TextureRotate      dw 0                           ;texture ror
  1989.  
  1990. RedStart           dd 0                           ;red color start
  1991. GreenStart         dd 0                           ;green color start
  1992. BlueStart          dd 0                           ;blue color start
  1993. RedAdd             dd 0                           ;red color add
  1994. GreenAdd           dd 0                           ;green color add
  1995. BlueAdd            dd 0                           ;blue color add
  1996.  
  1997. NormalX            dw 0                           ;normal x vector
  1998. NormalY            dw 0                           ;normal y vector
  1999. NormalZ            dw 0                           ;normal z vector
  2000.  
  2001. FadeOffset         dw 0                           ;fade offset
  2002. MaxFade            dd 0                           ;how many fades
  2003. FadeBuffer         dd 6*256+2 dup (0)             ;fade buf
  2004. FadePalette        db 256 dup (0,0,0)             ;fade act palette
  2005.  
  2006. env_x1             dd 0                           ;env x1
  2007. env_y1             dd 0                           ;env y1
  2008. env_N1x            dd 0                           ;env N1X
  2009. env_N1y            dd 0                           ;env N1Y
  2010. env_x2             dd 0                           ;env x2
  2011. env_y2             dd 0                           ;env y2
  2012. env_N2x            dd 0                           ;env N2X
  2013. env_N2y            dd 0                           ;env N2Y
  2014. env_x3             dd 0                           ;env x3
  2015. env_y3             dd 0                           ;env y3
  2016. env_N3x            dd 0                           ;env N3X
  2017. env_N3y            dd 0                           ;env N3Y
  2018.  
  2019. env_MinY           dd 0                           ;env min y
  2020. env_MaxY           dd 0                           ;env max y
  2021.  
  2022. envXinc            dd 0                           ;env_x add
  2023. envNXinc           dd 0                           ;env_NX add
  2024. envNYinc           dd 0                           ;env_NY add
  2025.  
  2026. envScanStart       dd 200 dup (0)                 ;start x line draw
  2027. envScanStop        dd 200 dup (0)                 ;stop x line draw
  2028. envScanLeftX       dd 200 dup (0)                 ;LNx
  2029. envScanLeftY       dd 200 dup (0)                 ;LNy
  2030. envScanRightX      dd 200 dup (0)                 ;PNx
  2031. envScanRightY      dd 200 dup (0)                 ;PNy
  2032.  
  2033. BlackPal           db 768 dup (0)                 ;black palette
  2034. palette1           db 768 dup (0)                 ;user palette
  2035. WhitePal           db 768 dup (60)                ;white palette
  2036.  
  2037. ;┌───────────────────────────────────────────────────────────────────────────┐
  2038. ;│ The End                                                                   │
  2039. ;└───────────────────────────────────────────────────────────────────────────┘
  2040. code               ends
  2041. end                start
  2042.